From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5A001C2D0A8 for ; Mon, 28 Sep 2020 17:41:45 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id CE19B208D5 for ; Mon, 28 Sep 2020 17:41:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=quicinc.com header.i=@quicinc.com header.b="XJDxXoBG" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org CE19B208D5 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=quicinc.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:38020 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kMx9j-0001LB-Nk for qemu-devel@archiver.kernel.org; Mon, 28 Sep 2020 13:41:43 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:48882) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kMwxt-0002y8-LO for qemu-devel@nongnu.org; Mon, 28 Sep 2020 13:29:30 -0400 Received: from alexa-out-sd-01.qualcomm.com ([199.106.114.38]:53857) by eggs.gnu.org with esmtps (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1kMwxi-0007uy-VW for qemu-devel@nongnu.org; Mon, 28 Sep 2020 13:29:28 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=quicinc.com; i=@quicinc.com; q=dns/txt; s=qcdkim; t=1601314158; x=1632850158; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=UkEaCKg+5a5sv+Z7O2T6yfDNLQtsGeu+9E2RNDYXRac=; b=XJDxXoBG09TdQE35Rcko96gXq2kW5wEMqOynDIoc7sDNmST80npkXCcK MH1iN7Hgi0TOQJi2VYIKDPt1oKlg7x2X4hFrvtWSd2qGFSiha4qE76us6 t4qXPDZDAPg6ndLB8+Lq4xLVjqktlljayVSN1wOfUcpiQS18O5eG+viGO A=; Received: from unknown (HELO ironmsg03-sd.qualcomm.com) ([10.53.140.143]) by alexa-out-sd-01.qualcomm.com with ESMTP; 28 Sep 2020 10:29:04 -0700 X-QCInternal: smtphost Received: from vu-tsimpson-aus.qualcomm.com (HELO vu-tsimpson1-aus.qualcomm.com) ([10.222.150.1]) by ironmsg03-sd.qualcomm.com with ESMTP; 28 Sep 2020 10:29:03 -0700 Received: by vu-tsimpson1-aus.qualcomm.com (Postfix, from userid 47164) id 4CB7B1A59; Mon, 28 Sep 2020 12:29:03 -0500 (CDT) From: Taylor Simpson To: qemu-devel@nongnu.org Subject: [RFC PATCH v4 15/29] Hexagon (target/hexagon) utility functions Date: Mon, 28 Sep 2020 12:28:44 -0500 Message-Id: <1601314138-9930-16-git-send-email-tsimpson@quicinc.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1601314138-9930-1-git-send-email-tsimpson@quicinc.com> References: <1601314138-9930-1-git-send-email-tsimpson@quicinc.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Received-SPF: pass client-ip=199.106.114.38; envelope-from=tsimpson@qualcomm.com; helo=alexa-out-sd-01.qualcomm.com X-detected-operating-system: by eggs.gnu.org: First seen = 2020/09/28 13:29:03 X-ACL-Warn: Detected OS = FreeBSD 9.x or newer [fuzzy] X-Spam_score_int: -40 X-Spam_score: -4.1 X-Spam_bar: ---- X-Spam_report: (-4.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.199, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: ale@rev.ng, riku.voipio@iki.fi, richard.henderson@linaro.org, laurent@vivier.eu, tsimpson@quicinc.com, philmd@redhat.com, aleksandar.m.mail@gmail.com Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" VXRpbGl0eSBmdW5jdGlvbnMgY2FsbGVkIGJ5IHZhcmlvdXMgaW5zdHJ1Y3Rpb25zCgpTaWduZWQt b2ZmLWJ5OiBUYXlsb3IgU2ltcHNvbiA8dHNpbXBzb25AcXVpY2luYy5jb20+Ci0tLQogdGFyZ2V0 L2hleGFnb24vYXJjaC5oICAgICB8ICA0MiArKysKIHRhcmdldC9oZXhhZ29uL2NvbnZfZW11Lmgg fCAgNTAgKysrCiB0YXJnZXQvaGV4YWdvbi9mbWFfZW11LmggIHwgIDI3ICsrCiB0YXJnZXQvaGV4 YWdvbi9hcmNoLmMgICAgIHwgMzU0ICsrKysrKysrKysrKysrKysrKysrKwogdGFyZ2V0L2hleGFn b24vY29udl9lbXUuYyB8IDM2OSArKysrKysrKysrKysrKysrKysrKysrCiB0YXJnZXQvaGV4YWdv bi9mbWFfZW11LmMgIHwgNzc3ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysKIDYgZmlsZXMgY2hhbmdlZCwgMTYxOSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9k ZSAxMDA2NDQgdGFyZ2V0L2hleGFnb24vYXJjaC5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgdGFyZ2V0 L2hleGFnb24vY29udl9lbXUuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IHRhcmdldC9oZXhhZ29uL2Zt YV9lbXUuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IHRhcmdldC9oZXhhZ29uL2FyY2guYwogY3JlYXRl IG1vZGUgMTAwNjQ0IHRhcmdldC9oZXhhZ29uL2NvbnZfZW11LmMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCB0YXJnZXQvaGV4YWdvbi9mbWFfZW11LmMKCmRpZmYgLS1naXQgYS90YXJnZXQvaGV4YWdvbi9h cmNoLmggYi90YXJnZXQvaGV4YWdvbi9hcmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMC4uODI2NDRhYwotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9oZXhhZ29uL2FyY2gu aApAQCAtMCwwICsxLDQyIEBACisvKgorICogIENvcHlyaWdodChjKSAyMDE5LTIwMjAgUXVhbGNv bW0gSW5ub3ZhdGlvbiBDZW50ZXIsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAg VGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIg b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhP VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq ICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT ZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K KyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBz ZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgSEVYQUdP Tl9BUkNIX0gKKyNkZWZpbmUgSEVYQUdPTl9BUkNIX0gKKworI2luY2x1ZGUgImNwdS5oIgorI2lu Y2x1ZGUgImhleF9hcmNoX3R5cGVzLmgiCisKK2V4dGVybiB1aW50NjRfdCBpbnRlcmxlYXZlKHVp bnQzMl90IG9kZCwgdWludDMyX3QgZXZlbik7CitleHRlcm4gdWludDY0X3QgZGVpbnRlcmxlYXZl KHVpbnQ2NF90IHNyYyk7CitleHRlcm4gdWludDMyX3QgY2FycnlfZnJvbV9hZGQ2NCh1aW50NjRf dCBhLCB1aW50NjRfdCBiLCB1aW50MzJfdCBjKTsKK2V4dGVybiBpbnQzMl90IGNvbnZfcm91bmQo aW50MzJfdCBhLCBpbnQgbik7CitleHRlcm4gc2l6ZTE2c190IGNhc3Q4c190b18xNnMoaW50NjRf dCBhKTsKK2V4dGVybiBpbnQ2NF90IGNhc3QxNnNfdG9fOHMoc2l6ZTE2c190IGEpOworZXh0ZXJu IHNpemUxNnNfdCBhZGQxMjgoc2l6ZTE2c190IGEsIHNpemUxNnNfdCBiKTsKK2V4dGVybiBzaXpl MTZzX3Qgc3ViMTI4KHNpemUxNnNfdCBhLCBzaXplMTZzX3QgYik7CitleHRlcm4gc2l6ZTE2c190 IHNoaWZ0cjEyOChzaXplMTZzX3QgYSwgdWludDMyX3Qgbik7CitleHRlcm4gc2l6ZTE2c190IHNo aWZ0bDEyOChzaXplMTZzX3QgYSwgdWludDMyX3Qgbik7CitleHRlcm4gc2l6ZTE2c190IGFuZDEy OChzaXplMTZzX3QgYSwgc2l6ZTE2c190IGIpOworZXh0ZXJuIHZvaWQgYXJjaF9mcG9wX3N0YXJ0 KENQVUhleGFnb25TdGF0ZSAqZW52KTsKK2V4dGVybiB2b2lkIGFyY2hfZnBvcF9lbmQoQ1BVSGV4 YWdvblN0YXRlICplbnYpOworZXh0ZXJuIHZvaWQgYXJjaF9yYWlzZV9mcGZsYWcodW5zaWduZWQg aW50IGZsYWdzKTsKK2V4dGVybiBpbnQgYXJjaF9zZl9yZWNpcF9jb21tb24oaW50MzJfdCAqUnMs IGludDMyX3QgKlJ0LCBpbnQzMl90ICpSZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgaW50ICphZGp1c3QpOworZXh0ZXJuIGludCBhcmNoX3NmX2ludnNxcnRfY29tbW9uKGludDMy X3QgKlJzLCBpbnQzMl90ICpSZCwgaW50ICphZGp1c3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBh L3RhcmdldC9oZXhhZ29uL2NvbnZfZW11LmggYi90YXJnZXQvaGV4YWdvbi9jb252X2VtdS5oCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MTNhMTIKLS0tIC9kZXYvbnVsbAor KysgYi90YXJnZXQvaGV4YWdvbi9jb252X2VtdS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiAg Q29weXJpZ2h0KGMpIDIwMTktMjAyMCBRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwgSW5jLiBB bGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0 aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor ICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3 aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVj ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25n IHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vu c2VzLz4uCisgKi8KKworI2lmbmRlZiBIRVhBR09OX0NPTlZfRU1VX0gKKyNkZWZpbmUgSEVYQUdP Tl9DT05WX0VNVV9ICisKKyNpbmNsdWRlICJoZXhfYXJjaF90eXBlcy5oIgorCitleHRlcm4gdWlu dDY0X3QgY29udl9zZl90b184dShmbG9hdCBpbik7CitleHRlcm4gdWludDMyX3QgY29udl9zZl90 b180dShmbG9hdCBpbik7CitleHRlcm4gaW50NjRfdCBjb252X3NmX3RvXzhzKGZsb2F0IGluKTsK K2V4dGVybiBpbnQzMl90IGNvbnZfc2ZfdG9fNHMoZmxvYXQgaW4pOworCitleHRlcm4gdWludDY0 X3QgY29udl9kZl90b184dShkb3VibGUgaW4pOworZXh0ZXJuIHVpbnQzMl90IGNvbnZfZGZfdG9f NHUoZG91YmxlIGluKTsKK2V4dGVybiBpbnQ2NF90IGNvbnZfZGZfdG9fOHMoZG91YmxlIGluKTsK K2V4dGVybiBpbnQzMl90IGNvbnZfZGZfdG9fNHMoZG91YmxlIGluKTsKKworZXh0ZXJuIGRvdWJs ZSBjb252Xzh1X3RvX2RmKHVpbnQ2NF90IGluKTsKK2V4dGVybiBkb3VibGUgY29udl80dV90b19k Zih1aW50MzJfdCBpbik7CitleHRlcm4gZG91YmxlIGNvbnZfOHNfdG9fZGYoaW50NjRfdCBpbik7 CitleHRlcm4gZG91YmxlIGNvbnZfNHNfdG9fZGYoaW50MzJfdCBpbik7CisKK2V4dGVybiBmbG9h dCBjb252Xzh1X3RvX3NmKHVpbnQ2NF90IGluKTsKK2V4dGVybiBmbG9hdCBjb252XzR1X3RvX3Nm KHVpbnQzMl90IGluKTsKK2V4dGVybiBmbG9hdCBjb252XzhzX3RvX3NmKGludDY0X3QgaW4pOwor ZXh0ZXJuIGZsb2F0IGNvbnZfNHNfdG9fc2YoaW50MzJfdCBpbik7CisKK2V4dGVybiBmbG9hdCBj b252X2RmX3RvX3NmKGRvdWJsZSBpbik7CisKK3N0YXRpYyBpbmxpbmUgZG91YmxlIGNvbnZfc2Zf dG9fZGYoZmxvYXQgaW4pCit7CisgICAgcmV0dXJuIGluOworfQorCisjZW5kaWYKZGlmZiAtLWdp dCBhL3RhcmdldC9oZXhhZ29uL2ZtYV9lbXUuaCBiL3RhcmdldC9oZXhhZ29uL2ZtYV9lbXUuaApu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODFiMWY2Ci0tLSAvZGV2L251bGwK KysrIGIvdGFyZ2V0L2hleGFnb24vZm1hX2VtdS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiAg Q29weXJpZ2h0KGMpIDIwMTktMjAyMCBRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwgSW5jLiBB bGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0 aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor ICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3 aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVj ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25n IHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vu c2VzLz4uCisgKi8KKworI2lmbmRlZiBIRVhBR09OX0ZNQV9FTVVfSAorI2RlZmluZSBIRVhBR09O X0ZNQV9FTVVfSAorCitleHRlcm4gZmxvYXQgaW50ZXJuYWxfZm1hZngoZmxvYXQgYV9pbiwgZmxv YXQgYl9pbiwgZmxvYXQgY19pbiwgaW50IHNjYWxlKTsKK2V4dGVybiBmbG9hdCBpbnRlcm5hbF9m bWFmKGZsb2F0IGFfaW4sIGZsb2F0IGJfaW4sIGZsb2F0IGNfaW4pOworZXh0ZXJuIGZsb2F0IGlu dGVybmFsX21weWYoZmxvYXQgYV9pbiwgZmxvYXQgYl9pbik7CitleHRlcm4gZG91YmxlIGludGVy bmFsX21weWhoKGRvdWJsZSBhX2luLCBkb3VibGUgYl9pbiwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGludCBhY2N1bXVsYXRlZCk7CisKKyNlbmRpZgpk aWZmIC0tZ2l0IGEvdGFyZ2V0L2hleGFnb24vYXJjaC5jIGIvdGFyZ2V0L2hleGFnb24vYXJjaC5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Zjg2NGQKLS0tIC9kZXYvbnVs bAorKysgYi90YXJnZXQvaGV4YWdvbi9hcmNoLmMKQEAgLTAsMCArMSwzNTQgQEAKKy8qCisgKiAg Q29weXJpZ2h0KGMpIDIwMTktMjAyMCBRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwgSW5jLiBB bGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2Fy ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0 aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor ICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3 aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVj ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25n IHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vu c2VzLz4uCisgKi8KKworI2luY2x1ZGUgInFlbXUvb3NkZXAuaCIKKyNpbmNsdWRlIDxtYXRoLmg+ CisjaW5jbHVkZSAiZm1hX2VtdS5oIgorI2luY2x1ZGUgImFyY2guaCIKKyNpbmNsdWRlICJtYWNy b3MuaCIKKworI2RlZmluZSBCSVRTX01BU0tfOCAweDU1NTU1NTU1NTU1NTU1NTVVTEwKKyNkZWZp bmUgUEFJUl9NQVNLXzggMHgzMzMzMzMzMzMzMzMzMzMzVUxMCisjZGVmaW5lIE5ZQkxfTUFTS184 IDB4MGYwZjBmMGYwZjBmMGYwZlVMTAorI2RlZmluZSBCWVRFX01BU0tfOCAweDAwZmYwMGZmMDBm ZjAwZmZVTEwKKyNkZWZpbmUgSEFMRl9NQVNLXzggMHgwMDAwZmZmZjAwMDBmZmZmVUxMCisjZGVm aW5lIFdPUkRfTUFTS184IDB4MDAwMDAwMDBmZmZmZmZmZlVMTAorCit1aW50NjRfdCBpbnRlcmxl YXZlKHVpbnQzMl90IG9kZCwgdWludDMyX3QgZXZlbikKK3sKKyAgICAvKiBDb252ZXJ0IHRvIGxv bmcgbG9uZyAqLworICAgIHVpbnQ2NF90IG15b2RkID0gb2RkOworICAgIHVpbnQ2NF90IG15ZXZl biA9IGV2ZW47CisgICAgLyogRmlyc3QsIHNwcmVhZCBiaXRzIG91dCAqLworICAgIG15b2RkID0g KG15b2RkIHwgKG15b2RkIDw8IDE2KSkgJiBIQUxGX01BU0tfODsKKyAgICBteWV2ZW4gPSAobXll dmVuIHwgKG15ZXZlbiA8PCAxNikpICYgSEFMRl9NQVNLXzg7CisgICAgbXlvZGQgPSAobXlvZGQg fCAobXlvZGQgPDwgOCkpICYgQllURV9NQVNLXzg7CisgICAgbXlldmVuID0gKG15ZXZlbiB8ICht eWV2ZW4gPDwgOCkpICYgQllURV9NQVNLXzg7CisgICAgbXlvZGQgPSAobXlvZGQgfCAobXlvZGQg PDwgNCkpICYgTllCTF9NQVNLXzg7CisgICAgbXlldmVuID0gKG15ZXZlbiB8IChteWV2ZW4gPDwg NCkpICYgTllCTF9NQVNLXzg7CisgICAgbXlvZGQgPSAobXlvZGQgfCAobXlvZGQgPDwgMikpICYg UEFJUl9NQVNLXzg7CisgICAgbXlldmVuID0gKG15ZXZlbiB8IChteWV2ZW4gPDwgMikpICYgUEFJ Ul9NQVNLXzg7CisgICAgbXlvZGQgPSAobXlvZGQgfCAobXlvZGQgPDwgMSkpICYgQklUU19NQVNL Xzg7CisgICAgbXlldmVuID0gKG15ZXZlbiB8IChteWV2ZW4gPDwgMSkpICYgQklUU19NQVNLXzg7 CisgICAgLyogTm93IE9SIHRvZ2V0aGVyICovCisgICAgcmV0dXJuIG15ZXZlbiB8IChteW9kZCA8 PCAxKTsKK30KKwordWludDY0X3QgZGVpbnRlcmxlYXZlKHVpbnQ2NF90IHNyYykKK3sKKyAgICAv KiBHZXQgb2RkIGFuZCBldmVuIGJpdHMgKi8KKyAgICB1aW50NjRfdCBteW9kZCA9ICgoc3JjID4+ IDEpICYgQklUU19NQVNLXzgpOworICAgIHVpbnQ2NF90IG15ZXZlbiA9IChzcmMgJiBCSVRTX01B U0tfOCk7CisKKyAgICAvKiBVbnNwcmVhZCBiaXRzICovCisgICAgbXlldmVuID0gKG15ZXZlbiB8 IChteWV2ZW4gPj4gMSkpICYgUEFJUl9NQVNLXzg7CisgICAgbXlvZGQgPSAobXlvZGQgfCAobXlv ZGQgPj4gMSkpICYgUEFJUl9NQVNLXzg7CisgICAgbXlldmVuID0gKG15ZXZlbiB8IChteWV2ZW4g Pj4gMikpICYgTllCTF9NQVNLXzg7CisgICAgbXlvZGQgPSAobXlvZGQgfCAobXlvZGQgPj4gMikp ICYgTllCTF9NQVNLXzg7CisgICAgbXlldmVuID0gKG15ZXZlbiB8IChteWV2ZW4gPj4gNCkpICYg QllURV9NQVNLXzg7CisgICAgbXlvZGQgPSAobXlvZGQgfCAobXlvZGQgPj4gNCkpICYgQllURV9N QVNLXzg7CisgICAgbXlldmVuID0gKG15ZXZlbiB8IChteWV2ZW4gPj4gOCkpICYgSEFMRl9NQVNL Xzg7CisgICAgbXlvZGQgPSAobXlvZGQgfCAobXlvZGQgPj4gOCkpICYgSEFMRl9NQVNLXzg7Cisg ICAgbXlldmVuID0gKG15ZXZlbiB8IChteWV2ZW4gPj4gMTYpKSAmIFdPUkRfTUFTS184OworICAg IG15b2RkID0gKG15b2RkIHwgKG15b2RkID4+IDE2KSkgJiBXT1JEX01BU0tfODsKKworICAgIC8q IFJldHVybiBvZGQgYml0cyBpbiB1cHBlciBoYWxmICovCisgICAgcmV0dXJuIG15ZXZlbiB8ICht eW9kZCA8PCAzMik7Cit9CisKK3VpbnQzMl90IGNhcnJ5X2Zyb21fYWRkNjQodWludDY0X3QgYSwg dWludDY0X3QgYiwgdWludDMyX3QgYykKK3sKKyAgICB1aW50NjRfdCB0bXBhLCB0bXBiLCB0bXBj OworICAgIHRtcGEgPSBmR0VUVVdPUkQoMCwgYSk7CisgICAgdG1wYiA9IGZHRVRVV09SRCgwLCBi KTsKKyAgICB0bXBjID0gdG1wYSArIHRtcGIgKyBjOworICAgIHRtcGEgPSBmR0VUVVdPUkQoMSwg YSk7CisgICAgdG1wYiA9IGZHRVRVV09SRCgxLCBiKTsKKyAgICB0bXBjID0gdG1wYSArIHRtcGIg KyBmR0VUVVdPUkQoMSwgdG1wYyk7CisgICAgdG1wYyA9IGZHRVRVV09SRCgxLCB0bXBjKTsKKyAg ICByZXR1cm4gdG1wYzsKK30KKworaW50MzJfdCBjb252X3JvdW5kKGludDMyX3QgYSwgaW50IG4p Cit7CisgICAgaW50NjRfdCB2YWw7CisKKyAgICBpZiAobiA9PSAwKSB7CisgICAgICAgIHZhbCA9 IGE7CisgICAgfSBlbHNlIGlmICgoYSAmICgoMSA8PCAobiAtIDEpKSAtIDEpKSA9PSAwKSB7ICAg IC8qIE4tMS4uMCBhbGwgemVybz8gKi8KKyAgICAgICAgLyogQWRkIExTQiBmcm9tIGludCBwYXJ0 ICovCisgICAgICAgIHZhbCA9ICgoZlNFMzJfNjQoYSkpICsgKGludDY0X3QpICgoKHVpbnQzMl90 KSAoKDEgPDwgbikgJiBhKSkgPj4gMSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHZhbCA9ICgo ZlNFMzJfNjQoYSkpICsgKDEgPDwgKG4gLSAxKSkpOworICAgIH0KKworICAgIHZhbCA9IHZhbCA+ PiBuOworICAgIHJldHVybiAoaW50MzJfdCl2YWw7Cit9CisKK3NpemUxNnNfdCBjYXN0OHNfdG9f MTZzKGludDY0X3QgYSkKK3sKKyAgICBzaXplMTZzX3QgcmVzdWx0ID0gey5oaSA9IDAsIC5sbyA9 IDB9OworICAgIHJlc3VsdC5sbyA9IGE7CisgICAgaWYgKGEgPCAwKSB7CisgICAgICAgIHJlc3Vs dC5oaSA9IC0xOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQ2NF90IGNhc3Qx NnNfdG9fOHMoc2l6ZTE2c190IGEpCit7CisgICAgcmV0dXJuIGEubG87Cit9CisKK3NpemUxNnNf dCBhZGQxMjgoc2l6ZTE2c190IGEsIHNpemUxNnNfdCBiKQoreworICAgIHNpemUxNnNfdCByZXN1 bHQgPSB7LmhpID0gMCwgLmxvID0gMH07CisgICAgcmVzdWx0LmxvID0gYS5sbyArIGIubG87Cisg ICAgcmVzdWx0LmhpID0gYS5oaSArIGIuaGk7CisKKyAgICBpZiAocmVzdWx0LmxvIDwgYi5sbykg eworICAgICAgICByZXN1bHQuaGkrKzsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQor CitzaXplMTZzX3Qgc3ViMTI4KHNpemUxNnNfdCBhLCBzaXplMTZzX3QgYikKK3sKKyAgICBzaXpl MTZzX3QgcmVzdWx0ID0gey5oaSA9IDAsIC5sbyA9IDB9OworICAgIHJlc3VsdC5sbyA9IGEubG8g LSBiLmxvOworICAgIHJlc3VsdC5oaSA9IGEuaGkgLSBiLmhpOworICAgIGlmIChyZXN1bHQubG8g PiBhLmxvKSB7CisgICAgICAgIHJlc3VsdC5oaS0tOworICAgIH0KKworICAgIHJldHVybiByZXN1 bHQ7Cit9CisKK3NpemUxNnNfdCBzaGlmdHIxMjgoc2l6ZTE2c190IGEsIHVpbnQzMl90IG4pCit7 CisgICAgc2l6ZTE2c190IHJlc3VsdDsKKyAgICByZXN1bHQubG8gPSAoYS5sbyA+PiBuKSB8IChh LmhpIDw8ICg2NCAtIG4pKTsKKyAgICByZXN1bHQuaGkgPSBhLmhpID4+IG47CisgICAgcmV0dXJu IHJlc3VsdDsKK30KKworc2l6ZTE2c190IHNoaWZ0bDEyOChzaXplMTZzX3QgYSwgdWludDMyX3Qg bikKK3sKKyAgICBzaXplMTZzX3QgcmVzdWx0OworICAgIHJlc3VsdC5sbyA9IGEubG8gPDwgbjsK KyAgICByZXN1bHQuaGkgPSAoYS5oaSA8PCBuKSB8IChhLmxvID4+ICg2NCAtIG4pKTsKKyAgICBy ZXR1cm4gcmVzdWx0OworfQorCitzaXplMTZzX3QgYW5kMTI4KHNpemUxNnNfdCBhLCBzaXplMTZz X3QgYikKK3sKKyAgICBzaXplMTZzX3QgcmVzdWx0OworICAgIHJlc3VsdC5sbyA9IGEubG8gJiBi LmxvOworICAgIHJlc3VsdC5oaSA9IGEuaGkgJiBiLmhpOworICAgIHJldHVybiByZXN1bHQ7Cit9 CisKKy8qIEZsb2F0aW5nIFBvaW50IFN0dWZmICovCisKK3N0YXRpYyBjb25zdCBpbnQgcm91bmRp bmdtb2Rlc1tdID0geworICAgIEZFX1RPTkVBUkVTVCwKKyAgICBGRV9UT1dBUkRaRVJPLAorICAg IEZFX0RPV05XQVJELAorICAgIEZFX1VQV0FSRAorfTsKKwordm9pZCBhcmNoX2Zwb3Bfc3RhcnQo Q1BVSGV4YWdvblN0YXRlICplbnYpCit7CisgICAgZmVnZXRlbnYoJmVudi0+ZmVudik7CisgICAg ZmVjbGVhcmV4Y2VwdChGRV9BTExfRVhDRVBUKTsKKyAgICBmZXNldHJvdW5kKHJvdW5kaW5nbW9k ZXNbZlJFQURfUkVHX0ZJRUxEKFVTUiwgVVNSX0ZQUk5EKV0pOworfQorCisjZGVmaW5lIE5PVEhJ TkcgICAgICAgICAgICAgLyogRG9uJ3QgZG8gYW55dGhpbmcgKi8KKworI2RlZmluZSBURVNUX0ZM QUcoTElCQ0YsIE1ZRiwgTVlFKSBcCisgICAgZG8geyBcCisgICAgICAgIGlmIChmZXRlc3RleGNl cHQoTElCQ0YpKSB7IFwKKyAgICAgICAgICAgIGlmIChHRVRfVVNSX0ZJRUxEKFVTUl8jI01ZRikg PT0gMCkgeyBcCisgICAgICAgICAgICAgICAgU0VUX1VTUl9GSUVMRChVU1JfIyNNWUYsIDEpOyBc CisgICAgICAgICAgICAgICAgaWYgKEdFVF9VU1JfRklFTEQoVVNSXyMjTVlFKSkgeyBcCisgICAg ICAgICAgICAgICAgICAgIE5PVEhJTkcgXAorICAgICAgICAgICAgICAgIH0gXAorICAgICAgICAg ICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUgKDApCisKK3ZvaWQgYXJjaF9mcG9wX2Vu ZChDUFVIZXhhZ29uU3RhdGUgKmVudikKK3sKKyAgICBpZiAoZmV0ZXN0ZXhjZXB0KEZFX0FMTF9F WENFUFQpKSB7CisgICAgICAgIFRFU1RfRkxBRyhGRV9JTkVYQUNULCBGUElOUEYsIEZQSU5QRSk7 CisgICAgICAgIFRFU1RfRkxBRyhGRV9ESVZCWVpFUk8sIEZQREJaRiwgRlBEQlpFKTsKKyAgICAg ICAgVEVTVF9GTEFHKEZFX0lOVkFMSUQsIEZQSU5WRiwgRlBJTlZFKTsKKyAgICAgICAgVEVTVF9G TEFHKEZFX09WRVJGTE9XLCBGUE9WRkYsIEZQT1ZGRSk7CisgICAgICAgIFRFU1RfRkxBRyhGRV9V TkRFUkZMT1csIEZQVU5GRiwgRlBVTkZFKTsKKyAgICB9CisgICAgZmVzZXRlbnYoJmVudi0+ZmVu dik7Cit9CisKKyN1bmRlZiBURVNUX0ZMQUcKKworCit2b2lkIGFyY2hfcmFpc2VfZnBmbGFnKHVu c2lnbmVkIGludCBmbGFncykKK3sKKyAgICBmZXJhaXNlZXhjZXB0KGZsYWdzKTsKK30KKworaW50 IGFyY2hfc2ZfcmVjaXBfY29tbW9uKGludDMyX3QgKlJzLCBpbnQzMl90ICpSdCwgaW50MzJfdCAq UmQsIGludCAqYWRqdXN0KQoreworICAgIGludCBuX2NsYXNzOworICAgIGludCBkX2NsYXNzOwor ICAgIGludCBuX2V4cDsKKyAgICBpbnQgZF9leHA7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50 MzJfdCBSc1YsIFJ0ViwgUmRWOworICAgIGludCBQZVYgPSAwOworICAgIFJzViA9ICpSczsKKyAg ICBSdFYgPSAqUnQ7CisgICAgbl9jbGFzcyA9IGZwY2xhc3NpZnkoZkZMT0FUKFJzVikpOworICAg IGRfY2xhc3MgPSBmcGNsYXNzaWZ5KGZGTE9BVChSdFYpKTsKKyAgICBpZiAoKG5fY2xhc3MgPT0g RlBfTkFOKSAmJiAoZF9jbGFzcyA9PSBGUF9OQU4pKSB7CisgICAgICAgIGlmIChmR0VUQklUKDIy LCBSc1YgJiBSdFYpID09IDApIHsKKyAgICAgICAgICAgIGZSQUlTRUZMQUdTKEZFX0lOVkFMSUQp OworICAgICAgICB9CisgICAgICAgIFJkViA9IFJzViA9IFJ0ViA9IGZTRk5BTlZBTCgpOworICAg IH0gZWxzZSBpZiAobl9jbGFzcyA9PSBGUF9OQU4pIHsKKyAgICAgICAgaWYgKGZHRVRCSVQoMjIs IFJzVikgPT0gMCkgeworICAgICAgICAgICAgZlJBSVNFRkxBR1MoRkVfSU5WQUxJRCk7CisgICAg ICAgIH0KKyAgICAgICAgUmRWID0gUnNWID0gUnRWID0gZlNGTkFOVkFMKCk7CisgICAgfSBlbHNl IGlmIChkX2NsYXNzID09IEZQX05BTikgeworICAgICAgICAvKiBvciBwdXQgTmFOIGluIG51bS9k ZW4gZml4dXA/ICovCisgICAgICAgIGlmIChmR0VUQklUKDIyLCBSdFYpID09IDApIHsKKyAgICAg ICAgICAgIGZSQUlTRUZMQUdTKEZFX0lOVkFMSUQpOworICAgICAgICB9CisgICAgICAgIFJkViA9 IFJzViA9IFJ0ViA9IGZTRk5BTlZBTCgpOworICAgIH0gZWxzZSBpZiAoKG5fY2xhc3MgPT0gRlBf SU5GSU5JVEUpICYmIChkX2NsYXNzID09IEZQX0lORklOSVRFKSkgeworICAgICAgICAvKiBvciBw dXQgSW5mIGluIG51bSBmaXh1cD8gKi8KKyAgICAgICAgUmRWID0gUnNWID0gUnRWID0gZlNGTkFO VkFMKCk7CisgICAgICAgIGZSQUlTRUZMQUdTKEZFX0lOVkFMSUQpOworICAgIH0gZWxzZSBpZiAo KG5fY2xhc3MgPT0gRlBfWkVSTykgJiYgKGRfY2xhc3MgPT0gRlBfWkVSTykpIHsKKyAgICAgICAg Lyogb3IgcHV0IHplcm8gaW4gbnVtIGZpeHVwPyAqLworICAgICAgICBSZFYgPSBSc1YgPSBSdFYg PSBmU0ZOQU5WQUwoKTsKKyAgICAgICAgZlJBSVNFRkxBR1MoRkVfSU5WQUxJRCk7CisgICAgfSBl bHNlIGlmIChkX2NsYXNzID09IEZQX1pFUk8pIHsKKyAgICAgICAgLyogb3IgcHV0IEluZiBpbiBu dW0gZml4dXA/ICovCisgICAgICAgIFJzViA9IGZTRklORlZBTChSc1YgXiBSdFYpOworICAgICAg ICBSdFYgPSBmU0ZPTkVWQUwoMCk7CisgICAgICAgIFJkViA9IGZTRk9ORVZBTCgwKTsKKyAgICAg ICAgaWYgKG5fY2xhc3MgIT0gRlBfSU5GSU5JVEUpIHsKKyAgICAgICAgICAgIGZSQUlTRUZMQUdT KEZFX0RJVkJZWkVSTyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGRfY2xhc3MgPT0gRlBf SU5GSU5JVEUpIHsKKyAgICAgICAgUnNWID0gMHg4MDAwMDAwMCAmIChSc1YgXiBSdFYpOworICAg ICAgICBSdFYgPSBmU0ZPTkVWQUwoMCk7CisgICAgICAgIFJkViA9IGZTRk9ORVZBTCgwKTsKKyAg ICB9IGVsc2UgaWYgKG5fY2xhc3MgPT0gRlBfWkVSTykgeworICAgICAgICAvKiBEb2VzIHRoaXMg anVzdCB3b3JrIGl0c2VsZiBvdXQ/ICovCisgICAgICAgIC8qIE5vLCAwL0luZiBjYXVzZXMgcHJv YmxlbXMuICovCisgICAgICAgIFJzViA9IDB4ODAwMDAwMDAgJiAoUnNWIF4gUnRWKTsKKyAgICAg ICAgUnRWID0gZlNGT05FVkFMKDApOworICAgICAgICBSZFYgPSBmU0ZPTkVWQUwoMCk7CisgICAg fSBlbHNlIGlmIChuX2NsYXNzID09IEZQX0lORklOSVRFKSB7CisgICAgICAgIC8qIERvZXMgdGhp cyBqdXN0IHdvcmsgaXRzZWxmIG91dD8gKi8KKyAgICAgICAgUnNWID0gZlNGSU5GVkFMKFJzViBe IFJ0Vik7CisgICAgICAgIFJ0ViA9IGZTRk9ORVZBTCgwKTsKKyAgICAgICAgUmRWID0gZlNGT05F VkFMKDApOworICAgIH0gZWxzZSB7CisgICAgICAgIFBlViA9IDB4MDA7CisgICAgICAgIC8qIEJh c2ljIGNoZWNrcyBwYXNzZWQgKi8KKyAgICAgICAgbl9leHAgPSBmU0ZfR0VURVhQKFJzVik7Cisg ICAgICAgIGRfZXhwID0gZlNGX0dFVEVYUChSdFYpOworICAgICAgICBpZiAoKG5fZXhwIC0gZF9l eHAgKyBmU0ZfQklBUygpKSA8PSBmU0ZfTUFOVEJJVFMoKSkgeworICAgICAgICAgICAgLyogTmVh ciBxdW90aWVudCB1bmRlcmZsb3cgLyBpbmV4YWN0IFEgKi8KKyAgICAgICAgICAgIFBlViA9IDB4 ODA7CisgICAgICAgICAgICBSdFYgPSBmU0ZfTVVMX1BPVzIoUnRWLCAtNjQpOworICAgICAgICAg ICAgUnNWID0gZlNGX01VTF9QT1cyKFJzViwgNjQpOworICAgICAgICB9IGVsc2UgaWYgKChuX2V4 cCAtIGRfZXhwICsgZlNGX0JJQVMoKSkgPiAoZlNGX01BWEVYUCgpIC0gMjQpKSB7CisgICAgICAg ICAgICAvKiBOZWFyIHF1b3RpZW50IG92ZXJmbG93ICovCisgICAgICAgICAgICBQZVYgPSAweDQw OworICAgICAgICAgICAgUnRWID0gZlNGX01VTF9QT1cyKFJ0ViwgMzIpOworICAgICAgICAgICAg UnNWID0gZlNGX01VTF9QT1cyKFJzViwgLTMyKTsKKyAgICAgICAgfSBlbHNlIGlmIChuX2V4cCA8 PSBmU0ZfTUFOVEJJVFMoKSArIDIpIHsKKyAgICAgICAgICAgIFJ0ViA9IGZTRl9NVUxfUE9XMihS dFYsIDY0KTsKKyAgICAgICAgICAgIFJzViA9IGZTRl9NVUxfUE9XMihSc1YsIDY0KTsKKyAgICAg ICAgfSBlbHNlIGlmIChkX2V4cCA8PSAxKSB7CisgICAgICAgICAgICBSdFYgPSBmU0ZfTVVMX1BP VzIoUnRWLCAzMik7CisgICAgICAgICAgICBSc1YgPSBmU0ZfTVVMX1BPVzIoUnNWLCAzMik7Cisg ICAgICAgIH0gZWxzZSBpZiAoZF9leHAgPiAyNTIpIHsKKyAgICAgICAgICAgIFJ0ViA9IGZTRl9N VUxfUE9XMihSdFYsIC0zMik7CisgICAgICAgICAgICBSc1YgPSBmU0ZfTVVMX1BPVzIoUnNWLCAt MzIpOworICAgICAgICB9CisgICAgICAgIFJkViA9IDA7CisgICAgICAgIHJldCA9IDE7CisgICAg fQorICAgICpScyA9IFJzVjsKKyAgICAqUnQgPSBSdFY7CisgICAgKlJkID0gUmRWOworICAgICph ZGp1c3QgPSBQZVY7CisgICAgcmV0dXJuIHJldDsKK30KKworaW50IGFyY2hfc2ZfaW52c3FydF9j b21tb24oaW50MzJfdCAqUnMsIGludDMyX3QgKlJkLCBpbnQgKmFkanVzdCkKK3sKKyAgICBpbnQg cl9jbGFzczsKKyAgICBpbnQzMl90IFJzViwgUmRWOworICAgIGludCBQZVYgPSAwOworICAgIGlu dCByX2V4cDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBSc1YgPSAqUnM7CisgICAgcl9jbGFzcyA9 IGZwY2xhc3NpZnkoZkZMT0FUKFJzVikpOworICAgIGlmIChyX2NsYXNzID09IEZQX05BTikgewor ICAgICAgICBpZiAoZkdFVEJJVCgyMiwgUnNWKSA9PSAwKSB7CisgICAgICAgICAgICBmUkFJU0VG TEFHUyhGRV9JTlZBTElEKTsKKyAgICAgICAgfQorICAgICAgICBSZFYgPSBSc1YgPSBmU0ZOQU5W QUwoKTsKKyAgICB9IGVsc2UgaWYgKGZGTE9BVChSc1YpIDwgMC4wKSB7CisgICAgICAgIC8qIE5l Z2F0aXZlIG5vbnplcm8gdmFsdWVzIGFyZSBOYU4gKi8KKyAgICAgICAgZlJBSVNFRkxBR1MoRkVf SU5WQUxJRCk7CisgICAgICAgIFJzViA9IGZTRk5BTlZBTCgpOworICAgICAgICBSZFYgPSBmU0ZO QU5WQUwoKTsKKyAgICB9IGVsc2UgaWYgKHJfY2xhc3MgPT0gRlBfSU5GSU5JVEUpIHsKKyAgICAg ICAgLyogb3IgcHV0IEluZiBpbiBudW0gZml4dXA/ICovCisgICAgICAgIFJzViA9IGZTRklORlZB TCgtMSk7CisgICAgICAgIFJkViA9IGZTRklORlZBTCgtMSk7CisgICAgfSBlbHNlIGlmIChyX2Ns YXNzID09IEZQX1pFUk8pIHsKKyAgICAgICAgLyogb3IgcHV0IHplcm8gaW4gbnVtIGZpeHVwPyAq LworICAgICAgICBSZFYgPSBmU0ZPTkVWQUwoMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUGVW ID0gMHgwMDsKKyAgICAgICAgLyogQmFzaWMgY2hlY2tzIHBhc3NlZCAqLworICAgICAgICByX2V4 cCA9IGZTRl9HRVRFWFAoUnNWKTsKKyAgICAgICAgaWYgKHJfZXhwIDw9IDI0KSB7CisgICAgICAg ICAgICBSc1YgPSBmU0ZfTVVMX1BPVzIoUnNWLCA2NCk7CisgICAgICAgICAgICBQZVYgPSAweGUw OworICAgICAgICB9CisgICAgICAgIFJkViA9IDA7CisgICAgICAgIHJldCA9IDE7CisgICAgfQor ICAgICpScyA9IFJzVjsKKyAgICAqUmQgPSBSZFY7CisgICAgKmFkanVzdCA9IFBlVjsKKyAgICBy ZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS90YXJnZXQvaGV4YWdvbi9jb252X2VtdS5jIGIv dGFyZ2V0L2hleGFnb24vY29udl9lbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwLi4yMmZjNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2hleGFnb24vY29udl9lbXUu YwpAQCAtMCwwICsxLDM2OSBAQAorLyoKKyAqICBDb3B5cmlnaHQoYykgMjAxOS0yMDIwIFF1YWxj b21tIElubm92YXRpb24gQ2VudGVyLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICog IFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh bmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3Vy IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0 cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRI T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg KiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg U2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu CisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwg c2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8bWF0 aC5oPgorI2luY2x1ZGUgInFlbXUvb3NkZXAuaCIKKyNpbmNsdWRlICJoZXhfYXJjaF90eXBlcy5o IgorI2luY2x1ZGUgIm1hY3Jvcy5oIgorI2luY2x1ZGUgImNvbnZfZW11LmgiCisKKyNkZWZpbmUg aXN6KFgpIChmcGNsYXNzaWZ5KFgpID09IEZQX1pFUk8pCisjZGVmaW5lIERGX0JJQVMgMTAyMwor I2RlZmluZSBTRl9CSUFTIDEyNworCisjZGVmaW5lIExMX01BWF9QT1MgMHg3ZmZmZmZmZmZmZmZm ZmZmVUxMCisjZGVmaW5lIE1BWF9QT1MgMHg3ZmZmZmZmZlUKKworI2lmZGVmIFZDUFAKKy8qCisg KiBWaXN1YWwgQyBpc24ndCBHTlUgQyBhbmQgZG9lc24ndCBoYXZlIF9fYnVpbHRpbl9jbHpsbAor ICovCisKK3N0YXRpYyBpbnQgX19idWlsdGluX2NsemxsKHVuc2lnbmVkIGxvbmcgbG9uZyBpbnQg aW5wdXQpCit7CisgICAgaW50IHRvdGFsID0gMDsKKyAgICBpZiAoaW5wdXQgPT0gMCkgeworICAg ICAgICByZXR1cm4gNjQ7CisgICAgfQorICAgIHRvdGFsICs9ICgoaW5wdXQgPj4gKHRvdGFsICsg MzIpKSAhPSAwKSA/IDMyIDogMDsKKyAgICB0b3RhbCArPSAoKGlucHV0ID4+ICh0b3RhbCArIDE2 KSkgIT0gMCkgPyAxNiA6IDA7CisgICAgdG90YWwgKz0gKChpbnB1dCA+PiAodG90YWwgKyAgOCkp ICE9IDApID8gIDggOiAwOworICAgIHRvdGFsICs9ICgoaW5wdXQgPj4gKHRvdGFsICsgIDQpKSAh PSAwKSA/ICA0IDogMDsKKyAgICB0b3RhbCArPSAoKGlucHV0ID4+ICh0b3RhbCArICAyKSkgIT0g MCkgPyAgMiA6IDA7CisgICAgdG90YWwgKz0gKChpbnB1dCA+PiAodG90YWwgKyAgMSkpICE9IDAp ID8gIDEgOiAwOworICAgIHJldHVybiA2MyAtIHRvdGFsOworfQorI2VuZGlmCisKK3R5cGVkZWYg dW5pb24geworICAgIGRvdWJsZSBmOworICAgIHVpbnQ2NF90IGk7CisgICAgc3RydWN0IHsKKyAg ICAgICAgdWludDY0X3QgbWFudDo1MjsKKyAgICAgICAgdWludDY0X3QgZXhwOjExOworICAgICAg ICB1aW50NjRfdCBzaWduOjE7CisgICAgfSB4OworfSBkZl90OworCisKK3R5cGVkZWYgdW5pb24g eworICAgIGZsb2F0IGY7CisgICAgdWludDMyX3QgaTsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1 aW50MzJfdCBtYW50OjIzOworICAgICAgICB1aW50MzJfdCBleHA6ODsKKyAgICAgICAgdWludDMy X3Qgc2lnbjoxOworICAgIH0geDsKK30gc2ZfdDsKKworCisjZGVmaW5lIE1BS0VfQ09OVl84VV9U T19YRl9OKEZMT0FUSUQsIEJJR0ZMT0FUSUQsIFJFVFRZUEUpIFwKK3N0YXRpYyBSRVRUWVBFIGNv bnZfOHVfdG9fIyNGTE9BVElEIyNfbih1aW50NjRfdCBpbiwgaW50IG5lZ2F0ZSkgXAoreyBcCisg ICAgRkxPQVRJRCMjX3QgeDsgXAorICAgIHVpbnQ2NF90IHRtcCwgdHJ1bmNiaXRzLCBzaGFtdDsg XAorICAgIGludCBsZWFkaW5nX3plcm9zOyBcCisgICAgaWYgKGluID09IDApIHsgXAorICAgICAg ICByZXR1cm4gMC4wOyBcCisgICAgfSBcCisgICAgbGVhZGluZ196ZXJvcyA9IF9fYnVpbHRpbl9j bHpsbChpbik7IFwKKyAgICB0bXAgPSBpbiA8PCAobGVhZGluZ196ZXJvcyk7IFwKKyAgICB0bXAg PDw9IDE7IFwKKyAgICBzaGFtdCA9IDY0IC0gZiMjQklHRkxPQVRJRCMjX01BTlRCSVRTKCk7IFwK KyAgICB0cnVuY2JpdHMgPSB0bXAgJiAoKDFVTEwgPDwgKHNoYW10KSkgLSAxKTsgXAorICAgIHRt cCA+Pj0gc2hhbXQ7IFwKKyAgICBpZiAodHJ1bmNiaXRzICE9IDApIHsgXAorICAgICAgICBmZXJh aXNlZXhjZXB0KEZFX0lORVhBQ1QpOyBcCisgICAgICAgIHN3aXRjaCAoZmVnZXRyb3VuZCgpKSB7 IFwKKyAgICAgICAgY2FzZSBGRV9UT1dBUkRaRVJPOiBcCisgICAgICAgICAgICBicmVhazsgXAor ICAgICAgICBjYXNlIEZFX0RPV05XQVJEOiBcCisgICAgICAgICAgICBpZiAobmVnYXRlKSB7IFwK KyAgICAgICAgICAgICAgICB0bXAgKz0gMTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAg ICBicmVhazsgXAorICAgICAgICBjYXNlIEZFX1VQV0FSRDogXAorICAgICAgICAgICAgaWYgKCFu ZWdhdGUpIHsgXAorICAgICAgICAgICAgICAgIHRtcCArPSAxOyBcCisgICAgICAgICAgICB9IFwK KyAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgIGRlZmF1bHQ6IFwKKyAgICAgICAgICAgIGlm ICgodHJ1bmNiaXRzICYgKCgxVUxMIDw8IChzaGFtdCAtIDEpKSAtIDEpKSA9PSAwKSB7IFwKKyAg ICAgICAgICAgICAgICB0bXAgKz0gKHRtcCAmIDEpOyBcCisgICAgICAgICAgICB9IGVsc2UgeyBc CisgICAgICAgICAgICAgICAgdG1wICs9ICgodHJ1bmNiaXRzID4+IChzaGFtdCAtIDEpKSAmIDEp OyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgIH0gXAor ICAgIH0gXAorICAgIGlmICgoKHRtcCA8PCBzaGFtdCkgPj4gc2hhbXQpICE9IHRtcCkgeyBcCisg ICAgICAgIGxlYWRpbmdfemVyb3MtLTsgXAorICAgIH0gXAorICAgIHgueC5tYW50ID0gdG1wOyBc CisgICAgeC54LmV4cCA9IEJJR0ZMT0FUSUQjI19CSUFTICsgZiMjQklHRkxPQVRJRCMjX01BTlRC SVRTKCkgLSBcCisgICAgICAgICAgICAgIGxlYWRpbmdfemVyb3MgKyBzaGFtdCAtIDE7IFwKKyAg ICB4Lnguc2lnbiA9IG5lZ2F0ZTsgXAorICAgIHJldHVybiB4LmY7IFwKK30KKworTUFLRV9DT05W XzhVX1RPX1hGX04oZGYsIERGLCBkb3VibGUpCitNQUtFX0NPTlZfOFVfVE9fWEZfTihzZiwgU0Ys IGZsb2F0KQorCitkb3VibGUgY29udl84dV90b19kZih1aW50NjRfdCBpbikKK3sKKyAgICByZXR1 cm4gY29udl84dV90b19kZl9uKGluLCAwKTsKK30KKworZG91YmxlIGNvbnZfOHNfdG9fZGYoaW50 NjRfdCBpbikKK3sKKyAgICBpZiAoaW4gPT0gMHg4MDAwMDAwMDAwMDAwMDAwKSB7CisgICAgICAg IHJldHVybiAtMHgxcDYzOworICAgIH0KKyAgICBpZiAoaW4gPCAwKSB7CisgICAgICAgIHJldHVy biBjb252Xzh1X3RvX2RmX24oLWluLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4g Y29udl84dV90b19kZl9uKGluLCAwKTsKKyAgICB9Cit9CisKK2RvdWJsZSBjb252XzR1X3RvX2Rm KHVpbnQzMl90IGluKQoreworICAgIHJldHVybiBjb252Xzh1X3RvX2RmKCh1aW50NjRfdCkgaW4p OworfQorCitkb3VibGUgY29udl80c190b19kZihpbnQzMl90IGluKQoreworICAgIHJldHVybiBj b252XzhzX3RvX2RmKGluKTsKK30KKworZmxvYXQgY29udl84dV90b19zZih1aW50NjRfdCBpbikK K3sKKyAgICByZXR1cm4gY29udl84dV90b19zZl9uKGluLCAwKTsKK30KKworZmxvYXQgY29udl84 c190b19zZihpbnQ2NF90IGluKQoreworICAgIGlmIChpbiA9PSAweDgwMDAwMDAwMDAwMDAwMDAp IHsKKyAgICAgICAgcmV0dXJuIC0weDFwNjM7CisgICAgfQorICAgIGlmIChpbiA8IDApIHsKKyAg ICAgICAgcmV0dXJuIGNvbnZfOHVfdG9fc2ZfbigtaW4sIDEpOworICAgIH0gZWxzZSB7CisgICAg ICAgIHJldHVybiBjb252Xzh1X3RvX3NmX24oaW4sIDApOworICAgIH0KK30KKworZmxvYXQgY29u dl80dV90b19zZih1aW50MzJfdCBpbikKK3sKKyAgICByZXR1cm4gY29udl84dV90b19zZihpbik7 Cit9CisKK2Zsb2F0IGNvbnZfNHNfdG9fc2YoaW50MzJfdCBpbikKK3sKKyAgICByZXR1cm4gY29u dl84c190b19zZihpbik7Cit9CisKKworc3RhdGljIHVpbnQ2NF90IGNvbnZfZGZfdG9fOHVfbihk b3VibGUgaW4sIGludCB3aWxsX25lZ2F0ZSkKK3sKKyAgICBkZl90IHg7CisgICAgaW50IGZyYWNz aGlmdCwgZW5kc2hpZnQ7CisgICAgdWludDY0X3QgdG1wLCB0cnVuY2JpdHM7CisgICAgeC5mID0g aW47CisgICAgaWYgKGlzaW5mKGluKSkgeworICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lOVkFM SUQpOworICAgICAgICBpZiAoaW4gPiAwLjApIHsKKyAgICAgICAgICAgIHJldHVybiB+MFVMTDsK KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwVUxMOworICAgICAgICB9Cisg ICAgfQorICAgIGlmIChpc25hbihpbikpIHsKKyAgICAgICAgZmVyYWlzZWV4Y2VwdChGRV9JTlZB TElEKTsKKyAgICAgICAgcmV0dXJuIH4wVUxMOworICAgIH0KKyAgICBpZiAoaXN6KGluKSkgewor ICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHgueC5zaWduKSB7CisgICAgICAgIGZl cmFpc2VleGNlcHQoRkVfSU5WQUxJRCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBp ZiAoaW4gPCAwLjUpIHsKKyAgICAgICAgLyogTmVhciB6ZXJvLCBjYXB0dXJlcyBsYXJnZSBmcmFj c2hpZnRzLCBkZW5vcm1zLCBldGMgKi8KKyAgICAgICAgZmVyYWlzZWV4Y2VwdChGRV9JTkVYQUNU KTsKKyAgICAgICAgc3dpdGNoIChmZWdldHJvdW5kKCkpIHsKKyAgICAgICAgY2FzZSBGRV9ET1dO V0FSRDoKKyAgICAgICAgICAgIGlmICh3aWxsX25lZ2F0ZSkgeworICAgICAgICAgICAgICAgIHJl dHVybiAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsK KyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBGRV9VUFdBUkQ6CisgICAgICAgICAgICBpZiAo IXdpbGxfbmVnYXRlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9 IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAg ICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDA7ICAgIC8qIG5lYXJlc3Qgb3IgdG93YXJk cyB6ZXJvICovCisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCh4LnguZXhwIC0gREZfQklBUykg Pj0gNjQpIHsKKyAgICAgICAgLyogd2F5IHRvbyBiaWcgKi8KKyAgICAgICAgZmVyYWlzZWV4Y2Vw dChGRV9JTlZBTElEKTsKKyAgICAgICAgcmV0dXJuIH4wVUxMOworICAgIH0KKyAgICBmcmFjc2hp ZnQgPSBmTUFYKDAsIChmREZfTUFOVEJJVFMoKSAtICh4LnguZXhwIC0gREZfQklBUykpKTsKKyAg ICBlbmRzaGlmdCA9IGZNQVgoMCwgKCh4LnguZXhwIC0gREZfQklBUyAtIGZERl9NQU5UQklUUygp KSkpOworICAgIHRtcCA9IHgueC5tYW50IHwgKDFVTEwgPDwgZkRGX01BTlRCSVRTKCkpOworICAg IHRydW5jYml0cyA9IHRtcCAmICgoMVVMTCA8PCBmcmFjc2hpZnQpIC0gMSk7CisgICAgdG1wID4+ PSBmcmFjc2hpZnQ7CisgICAgaWYgKHRydW5jYml0cykgeworICAgICAgICAvKiBBcHBseSBSb3Vu ZGluZyAqLworICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lORVhBQ1QpOworICAgICAgICBzd2l0 Y2ggKGZlZ2V0cm91bmQoKSkgeworICAgICAgICBjYXNlIEZFX1RPV0FSRFpFUk86CisgICAgICAg ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGRV9ET1dOV0FSRDoKKyAgICAgICAgICAgIGlmICh3 aWxsX25lZ2F0ZSkgeworICAgICAgICAgICAgICAgIHRtcCArPSAxOworICAgICAgICAgICAgfQor ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRkVfVVBXQVJEOgorICAgICAgICAgICAg aWYgKCF3aWxsX25lZ2F0ZSkgeworICAgICAgICAgICAgICAgIHRtcCArPSAxOworICAgICAgICAg ICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBp ZiAoKHRydW5jYml0cyAmICgoMVVMTCA8PCAoZnJhY3NoaWZ0IC0gMSkpIC0gMSkpID09IDApIHsK KyAgICAgICAgICAgICAgICAvKiBFeGFjdGx5IC41ICovCisgICAgICAgICAgICAgICAgdG1wICs9 ICh0bXAgJiAxKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG1wICs9 ICgodHJ1bmNiaXRzID4+IChmcmFjc2hpZnQgLSAxKSkgJiAxKTsKKyAgICAgICAgICAgIH0KKyAg ICAgICAgfQorICAgIH0KKyAgICAvKgorICAgICAqIElmIHdlIGFkZGVkIG9uZSBhbmQgaXQgY2Fy cmllZCBhbGwgdGhlIHdheSBvdXQsCisgICAgICogY2hlY2sgdG8gc2VlIGlmIG92ZXJmbG93Cisg ICAgICovCisgICAgaWYgKCh0bXAgJiAoKDFVTEwgPDwgKGZERl9NQU5UQklUUygpICsgMSkpIC0g MSkpID09IDApIHsKKyAgICAgICAgaWYgKCh4LnguZXhwIC0gREZfQklBUykgPT0gNjMpIHsKKyAg ICAgICAgICAgIGZlY2xlYXJleGNlcHQoRkVfSU5FWEFDVCk7CisgICAgICAgICAgICBmZXJhaXNl ZXhjZXB0KEZFX0lOVkFMSUQpOworICAgICAgICAgICAgcmV0dXJuIH4wVUxMOworICAgICAgICB9 CisgICAgfQorICAgIHRtcCA8PD0gZW5kc2hpZnQ7CisgICAgcmV0dXJuIHRtcDsKK30KKworc3Rh dGljIHVpbnQzMl90IGNvbnZfZGZfdG9fNHVfbihkb3VibGUgaW4sIGludCB3aWxsX25lZ2F0ZSkK K3sKKyAgICB1aW50NjRfdCB0bXA7CisgICAgdG1wID0gY29udl9kZl90b184dV9uKGluLCB3aWxs X25lZ2F0ZSk7CisgICAgaWYgKHRtcCA+IDB4MDAwMDAwMDBmZmZmZmZmZlVMTCkgeworICAgICAg ICBmZWNsZWFyZXhjZXB0KEZFX0lORVhBQ1QpOworICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lO VkFMSUQpOworICAgICAgICByZXR1cm4gfjBVOworICAgIH0KKyAgICByZXR1cm4gKHVpbnQzMl90 KXRtcDsKK30KKwordWludDY0X3QgY29udl9kZl90b184dShkb3VibGUgaW4pCit7CisgICAgcmV0 dXJuIGNvbnZfZGZfdG9fOHVfbihpbiwgMCk7Cit9CisKK3VpbnQzMl90IGNvbnZfZGZfdG9fNHUo ZG91YmxlIGluKQoreworICAgIHJldHVybiBjb252X2RmX3RvXzR1X24oaW4sIDApOworfQorCitp bnQ2NF90IGNvbnZfZGZfdG9fOHMoZG91YmxlIGluKQoreworICAgIHVpbnQ2NF90IHRtcDsKKyAg ICBkZl90IHg7CisgICAgeC5mID0gaW47CisgICAgaWYgKGlzbmFuKGluKSkgeworICAgICAgICBm ZXJhaXNlZXhjZXB0KEZFX0lOVkFMSUQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAg IGlmICh4Lnguc2lnbikgeworICAgICAgICB0bXAgPSBjb252X2RmX3RvXzh1X24oLWluLCAxKTsK KyAgICB9IGVsc2UgeworICAgICAgICB0bXAgPSBjb252X2RmX3RvXzh1X24oaW4sIDApOworICAg IH0KKyAgICBpZiAodG1wID4gKExMX01BWF9QT1MgKyB4Lnguc2lnbikpIHsKKyAgICAgICAgZmVj bGVhcmV4Y2VwdChGRV9JTkVYQUNUKTsKKyAgICAgICAgZmVyYWlzZWV4Y2VwdChGRV9JTlZBTElE KTsKKyAgICAgICAgdG1wID0gKExMX01BWF9QT1MgKyB4Lnguc2lnbik7CisgICAgfQorICAgIGlm ICh4Lnguc2lnbikgeworICAgICAgICByZXR1cm4gLXRtcDsKKyAgICB9IGVsc2UgeworICAgICAg ICByZXR1cm4gdG1wOworICAgIH0KK30KKworaW50MzJfdCBjb252X2RmX3RvXzRzKGRvdWJsZSBp bikKK3sKKyAgICB1aW50NjRfdCB0bXA7CisgICAgZGZfdCB4OworICAgIHguZiA9IGluOworICAg IGlmIChpc25hbihpbikpIHsKKyAgICAgICAgZmVyYWlzZWV4Y2VwdChGRV9JTlZBTElEKTsKKyAg ICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoeC54LnNpZ24pIHsKKyAgICAgICAgdG1w ID0gY29udl9kZl90b184dV9uKC1pbiwgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wID0g Y29udl9kZl90b184dV9uKGluLCAwKTsKKyAgICB9CisgICAgaWYgKHRtcCA+IChNQVhfUE9TICsg eC54LnNpZ24pKSB7CisgICAgICAgIGZlY2xlYXJleGNlcHQoRkVfSU5FWEFDVCk7CisgICAgICAg IGZlcmFpc2VleGNlcHQoRkVfSU5WQUxJRCk7CisgICAgICAgIHRtcCA9IChNQVhfUE9TICsgeC54 LnNpZ24pOworICAgIH0KKyAgICBpZiAoeC54LnNpZ24pIHsKKyAgICAgICAgcmV0dXJuIC10bXA7 CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9Cit9CisKK3VpbnQ2NF90 IGNvbnZfc2ZfdG9fOHUoZmxvYXQgaW4pCit7CisgICAgcmV0dXJuIGNvbnZfZGZfdG9fOHUoaW4p OworfQorCit1aW50MzJfdCBjb252X3NmX3RvXzR1KGZsb2F0IGluKQoreworICAgIHJldHVybiBj b252X2RmX3RvXzR1KGluKTsKK30KKworaW50NjRfdCBjb252X3NmX3RvXzhzKGZsb2F0IGluKQor eworICAgIHJldHVybiBjb252X2RmX3RvXzhzKGluKTsKK30KKworaW50MzJfdCBjb252X3NmX3Rv XzRzKGZsb2F0IGluKQoreworICAgIHJldHVybiBjb252X2RmX3RvXzRzKGluKTsKK30KKwpkaWZm IC0tZ2l0IGEvdGFyZ2V0L2hleGFnb24vZm1hX2VtdS5jIGIvdGFyZ2V0L2hleGFnb24vZm1hX2Vt dS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNGQ0ZTEKLS0tIC9kZXYv bnVsbAorKysgYi90YXJnZXQvaGV4YWdvbi9mbWFfZW11LmMKQEAgLTAsMCArMSw3NzcgQEAKKy8q CisgKiAgQ29weXJpZ2h0KGMpIDIwMTktMjAyMCBRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwg SW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24g MiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhh dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICog IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3Jn L2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJxZW11L29z ZGVwLmgiCisjaW5jbHVkZSAibWFjcm9zLmgiCisjaW5jbHVkZSAiY29udl9lbXUuaCIKKyNpbmNs dWRlICJmbWFfZW11LmgiCisKKyNkZWZpbmUgREZfSU5GX0VYUCAweDdmZgorI2RlZmluZSBERl9C SUFTIDEwMjMKKworI2RlZmluZSBTRl9JTkZfRVhQIDB4ZmYKKyNkZWZpbmUgU0ZfQklBUyAxMjcK KworI2RlZmluZSBIRl9JTkZfRVhQIDB4MWYKKyNkZWZpbmUgSEZfQklBUyAxNQorCisjZGVmaW5l IFdBWV9CSUdfRVhQIDQwOTYKKworI2RlZmluZSBpc3ooWCkgKGZwY2xhc3NpZnkoWCkgPT0gRlBf WkVSTykKKwordHlwZWRlZiB1bmlvbiB7CisgICAgZG91YmxlIGY7CisgICAgdWludDY0X3QgaTsK KyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50NjRfdCBtYW50OjUyOworICAgICAgICB1aW50NjRf dCBleHA6MTE7CisgICAgICAgIHVpbnQ2NF90IHNpZ246MTsKKyAgICB9IHg7Cit9IGRmX3Q7CisK K3R5cGVkZWYgdW5pb24geworICAgIGZsb2F0IGY7CisgICAgdWludDMyX3QgaTsKKyAgICBzdHJ1 Y3QgeworICAgICAgICB1aW50MzJfdCBtYW50OjIzOworICAgICAgICB1aW50MzJfdCBleHA6ODsK KyAgICAgICAgdWludDMyX3Qgc2lnbjoxOworICAgIH0geDsKK30gc2ZfdDsKKwordHlwZWRlZiBz dHJ1Y3QgeworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDY0X3QgbG93OworICAgICAgICBzdHJ1 Y3QgeworICAgICAgICAgICAgdWludDMyX3QgdzA7CisgICAgICAgICAgICB1aW50MzJfdCB3MTsK KyAgICAgICAgfTsKKyAgICB9OworICAgIHVuaW9uIHsKKyAgICAgICAgdWludDY0X3QgaGlnaDsK KyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IHczOworICAgICAgICAgICAg dWludDMyX3QgdzI7CisgICAgICAgIH07CisgICAgfTsKK30gaW50MTI4X3Q7Cit0eXBlZGVmIHN0 cnVjdCB7CisgICAgaW50MTI4X3QgbWFudDsKKyAgICBpbnQzMl90IGV4cDsKKyAgICB1aW50OF90 IHNpZ247CisgICAgdWludDhfdCBndWFyZDsKKyAgICB1aW50OF90IHJvdW5kOworICAgIHVpbnQ4 X3Qgc3RpY2t5OworfSB4Zl90OworCitzdGF0aWMgaW5saW5lIHZvaWQgeGZfaW5pdCh4Zl90ICpw KQoreworICAgIHAtPm1hbnQubG93ID0gMDsKKyAgICBwLT5tYW50LmhpZ2ggPSAwOworICAgIHAt PmV4cCA9IDA7CisgICAgcC0+c2lnbiA9IDA7CisgICAgcC0+Z3VhcmQgPSAwOworICAgIHAtPnJv dW5kID0gMDsKKyAgICBwLT5zdGlja3kgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90 IGRmX2dldG1hbnQoZGZfdCBhKQoreworICAgIGludCBjbGFzcyA9IGZwY2xhc3NpZnkoYS5mKTsK KyAgICBzd2l0Y2ggKGNsYXNzKSB7CisgICAgY2FzZSBGUF9OT1JNQUw6CisgICAgcmV0dXJuIGEu eC5tYW50IHwgMVVMTCA8PCA1MjsKKyAgICBjYXNlIEZQX1pFUk86CisgICAgICAgIHJldHVybiAw OworICAgIGNhc2UgRlBfU1VCTk9STUFMOgorICAgICAgICByZXR1cm4gYS54Lm1hbnQ7CisgICAg ZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH07Cit9CisKK3N0YXRpYyBpbmxpbmUg aW50MzJfdCBkZl9nZXRleHAoZGZfdCBhKQoreworICAgIGludCBjbGFzcyA9IGZwY2xhc3NpZnko YS5mKTsKKyAgICBzd2l0Y2ggKGNsYXNzKSB7CisgICAgY2FzZSBGUF9OT1JNQUw6CisgICAgICAg IHJldHVybiBhLnguZXhwOworICAgIGNhc2UgRlBfU1VCTk9STUFMOgorICAgICAgICByZXR1cm4g YS54LmV4cCArIDE7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH07Cit9 CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3Qgc2ZfZ2V0bWFudChzZl90IGEpCit7CisgICAgaW50 IGNsYXNzID0gZnBjbGFzc2lmeShhLmYpOworICAgIHN3aXRjaCAoY2xhc3MpIHsKKyAgICBjYXNl IEZQX05PUk1BTDoKKyAgICAgICAgcmV0dXJuIGEueC5tYW50IHwgMVVMTCA8PCAyMzsKKyAgICBj YXNlIEZQX1pFUk86CisgICAgICAgIHJldHVybiAwOworICAgIGNhc2UgRlBfU1VCTk9STUFMOgor ICAgICAgICByZXR1cm4gYS54Lm1hbnQgfCAwVUxMOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJl dHVybiAtMTsKKyAgICB9OworfQorCitzdGF0aWMgaW5saW5lIGludDMyX3Qgc2ZfZ2V0ZXhwKHNm X3QgYSkKK3sKKyAgICBpbnQgY2xhc3MgPSBmcGNsYXNzaWZ5KGEuZik7CisgICAgc3dpdGNoIChj bGFzcykgeworICAgIGNhc2UgRlBfTk9STUFMOgorICAgICAgICByZXR1cm4gYS54LmV4cDsKKyAg ICBjYXNlIEZQX1NVQk5PUk1BTDoKKyAgICAgICAgcmV0dXJuIGEueC5leHAgKyAxOworICAgIGRl ZmF1bHQ6CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9OworfQorCitzdGF0aWMgaW5saW5lIGlu dDEyOF90IGludDEyOF9tdWxfNjQ2NCh1aW50NjRfdCBhaSwgdWludDY0X3QgYmkpCit7CisgICAg aW50MTI4X3QgcmV0OworICAgIGludDEyOF90IGEsIGI7CisgICAgdWludDY0X3QgcHAwLCBwcDFh LCBwcDFiLCBwcDFzLCBwcDI7CisKKyAgICBhLmhpZ2ggPSBiLmhpZ2ggPSAwOworICAgIGEubG93 ID0gYWk7CisgICAgYi5sb3cgPSBiaTsKKyAgICBwcDAgPSAodWludDY0X3QpYS53MCAqICh1aW50 NjRfdCliLncwOworICAgIHBwMWEgPSAodWludDY0X3QpYS53MSAqICh1aW50NjRfdCliLncwOwor ICAgIHBwMWIgPSAodWludDY0X3QpYi53MSAqICh1aW50NjRfdClhLncwOworICAgIHBwMiA9ICh1 aW50NjRfdClhLncxICogKHVpbnQ2NF90KWIudzE7CisKKyAgICBwcDFzID0gcHAxYSArIHBwMWI7 CisgICAgaWYgKChwcDFzIDwgcHAxYSkgfHwgKHBwMXMgPCBwcDFiKSkgeworICAgICAgICBwcDIg Kz0gKDFVTEwgPDwgMzIpOworICAgIH0KKyAgICByZXQubG93ID0gcHAwICsgKHBwMXMgPDwgMzIp OworICAgIGlmICgocmV0LmxvdyA8IHBwMCkgfHwgKHJldC5sb3cgPCAocHAxcyA8PCAzMikpKSB7 CisgICAgICAgIHBwMiArPSAxOworICAgIH0KKyAgICByZXQuaGlnaCA9IHBwMiArIChwcDFzID4+ IDMyKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MTI4X3QgaW50 MTI4X3NobChpbnQxMjhfdCBhLCB1aW50MzJfdCBhbXQpCit7CisgICAgaW50MTI4X3QgcmV0Owor ICAgIGlmIChhbXQgPT0gMCkgeworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgaWYgKGFt dCA+IDEyOCkgeworICAgICAgICByZXQuaGlnaCA9IDA7CisgICAgICAgIHJldC5sb3cgPSAwOwor ICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoYW10ID49IDY0KSB7CisgICAgICAg IGFtdCAtPSA2NDsKKyAgICAgICAgYS5oaWdoID0gYS5sb3c7CisgICAgICAgIGEubG93ID0gMDsK KyAgICB9CisgICAgcmV0LmhpZ2ggPSBhLmhpZ2ggPDwgYW10OworICAgIHJldC5oaWdoIHw9IChh LmxvdyA+PiAoNjQgLSBhbXQpKTsKKyAgICByZXQubG93ID0gYS5sb3cgPDwgYW10OworICAgIHJl dHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MTI4X3QgaW50MTI4X3NocihpbnQxMjhf dCBhLCB1aW50MzJfdCBhbXQpCit7CisgICAgaW50MTI4X3QgcmV0OworICAgIGlmIChhbXQgPT0g MCkgeworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgaWYgKGFtdCA+IDEyOCkgeworICAg ICAgICByZXQuaGlnaCA9IDA7CisgICAgICAgIHJldC5sb3cgPSAwOworICAgICAgICByZXR1cm4g cmV0OworICAgIH0KKyAgICBpZiAoYW10ID49IDY0KSB7CisgICAgICAgIGFtdCAtPSA2NDsKKyAg ICAgICAgYS5sb3cgPSBhLmhpZ2g7CisgICAgICAgIGEuaGlnaCA9IDA7CisgICAgfQorICAgIHJl dC5sb3cgPSBhLmxvdyA+PiBhbXQ7CisgICAgcmV0LmxvdyB8PSAoYS5oaWdoIDw8ICg2NCAtIGFt dCkpOworICAgIHJldC5oaWdoID0gYS5oaWdoID4+IGFtdDsKKyAgICByZXR1cm4gcmV0OworfQor CitzdGF0aWMgaW5saW5lIGludDEyOF90IGludDEyOF9hZGQoaW50MTI4X3QgYSwgaW50MTI4X3Qg YikKK3sKKyAgICBpbnQxMjhfdCByZXQ7CisgICAgcmV0LmxvdyA9IGEubG93ICsgYi5sb3c7Cisg ICAgaWYgKChyZXQubG93IDwgYS5sb3cpIHx8IChyZXQubG93IDwgYi5sb3cpKSB7CisgICAgICAg IC8qIGNhcnJ5IGludG8gaGlnaCBwYXJ0ICovCisgICAgICAgIGEuaGlnaCArPSAxOworICAgIH0K KyAgICByZXQuaGlnaCA9IGEuaGlnaCArIGIuaGlnaDsKKyAgICByZXR1cm4gcmV0OworfQorCitz dGF0aWMgaW5saW5lIGludDEyOF90IGludDEyOF9zdWIoaW50MTI4X3QgYSwgaW50MTI4X3QgYiwg aW50IGJvcnJvdykKK3sKKyAgICBpbnQxMjhfdCByZXQ7CisgICAgcmV0LmxvdyA9IGEubG93IC0g Yi5sb3c7CisgICAgaWYgKHJldC5sb3cgPiBhLmxvdykgeworICAgICAgICAvKiBib3Jyb3cgaW50 byBoaWdoIHBhcnQgKi8KKyAgICAgICAgYS5oaWdoIC09IDE7CisgICAgfQorICAgIHJldC5oaWdo ID0gYS5oaWdoIC0gYi5oaWdoOworICAgIGlmIChib3Jyb3cgPT0gMCkgeworICAgICAgICByZXR1 cm4gcmV0OworICAgIH0gZWxzZSB7CisgICAgICAgIGEuaGlnaCA9IDA7CisgICAgICAgIGEubG93 ID0gMTsKKyAgICAgICAgcmV0dXJuIGludDEyOF9zdWIocmV0LCBhLCAwKTsKKyAgICB9Cit9CisK K3N0YXRpYyBpbmxpbmUgaW50IGludDEyOF9ndChpbnQxMjhfdCBhLCBpbnQxMjhfdCBiKQorewor ICAgIGlmIChhLmhpZ2ggPT0gYi5oaWdoKSB7CisgICAgICAgIHJldHVybiBhLmxvdyA+IGIubG93 OworICAgIH0KKyAgICByZXR1cm4gYS5oaWdoID4gYi5oaWdoOworfQorCitzdGF0aWMgaW5saW5l IHhmX3QgeGZfbm9ybV9sZWZ0KHhmX3QgYSkKK3sKKyAgICBhLmV4cC0tOworICAgIGEubWFudCA9 IGludDEyOF9zaGwoYS5tYW50LCAxKTsKKyAgICBhLm1hbnQubG93IHw9IGEuZ3VhcmQ7CisgICAg YS5ndWFyZCA9IGEucm91bmQ7CisgICAgYS5yb3VuZCA9IGEuc3RpY2t5OworICAgIHJldHVybiBh OworfQorCitzdGF0aWMgaW5saW5lIHhmX3QgeGZfbm9ybV9yaWdodCh4Zl90IGEsIGludCBhbXQp Cit7CisgICAgaWYgKGFtdCA+IDEzMCkgeworICAgICAgICBhLnN0aWNreSB8PQorICAgICAgICAg ICAgYS5yb3VuZCB8IGEuZ3VhcmQgfCAoYS5tYW50LmxvdyAhPSAwKSB8IChhLm1hbnQuaGlnaCAh PSAwKTsKKyAgICAgICAgYS5ndWFyZCA9IGEucm91bmQgPSBhLm1hbnQuaGlnaCA9IGEubWFudC5s b3cgPSAwOworICAgICAgICBhLmV4cCArPSBhbXQ7CisgICAgICAgIHJldHVybiBhOworCisgICAg fQorICAgIHdoaWxlIChhbXQgPj0gNjQpIHsKKyAgICAgICAgYS5zdGlja3kgfD0gYS5yb3VuZCB8 IGEuZ3VhcmQgfCAoYS5tYW50LmxvdyAhPSAwKTsKKyAgICAgICAgYS5ndWFyZCA9IChhLm1hbnQu bG93ID4+IDYzKSAmIDE7CisgICAgICAgIGEucm91bmQgPSAoYS5tYW50LmxvdyA+PiA2MikgJiAx OworICAgICAgICBhLm1hbnQubG93ID0gYS5tYW50LmhpZ2g7CisgICAgICAgIGEubWFudC5oaWdo ID0gMDsKKyAgICAgICAgYS5leHAgKz0gNjQ7CisgICAgICAgIGFtdCAtPSA2NDsKKyAgICB9Cisg ICAgd2hpbGUgKGFtdCA+IDApIHsKKyAgICAgICAgYS5leHArKzsKKyAgICAgICAgYS5zdGlja3kg fD0gYS5yb3VuZDsKKyAgICAgICAgYS5yb3VuZCA9IGEuZ3VhcmQ7CisgICAgICAgIGEuZ3VhcmQg PSBhLm1hbnQubG93ICYgMTsKKyAgICAgICAgYS5tYW50ID0gaW50MTI4X3NocihhLm1hbnQsIDEp OworICAgICAgICBhbXQtLTsKKyAgICB9CisgICAgcmV0dXJuIGE7Cit9CisKKworLyoKKyAqIE9u IHRoZSBhZGQvc3ViLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gc2hpZnQgb3V0IGxvdHMgb2YgYml0 cywgYnV0IG5lZWQgYQorICogc3RpY2t5IGJpdCBmb3Igd2hhdCB3YXMgc2hpZnRlZCBvdXQsIEkg dGhpbmsuCisgKi8KK3N0YXRpYyB4Zl90IHhmX2FkZCh4Zl90IGEsIHhmX3QgYik7CisKK3N0YXRp YyBpbmxpbmUgeGZfdCB4Zl9zdWIoeGZfdCBhLCB4Zl90IGIsIGludCBuZWdhdGUpCit7CisgICAg eGZfdCByZXQ7CisgICAgeGZfaW5pdCgmcmV0KTsKKyAgICBpbnQgYm9ycm93OworCisgICAgaWYg KGEuc2lnbiAhPSBiLnNpZ24pIHsKKyAgICAgICAgYi5zaWduID0gIWIuc2lnbjsKKyAgICAgICAg cmV0dXJuIHhmX2FkZChhLCBiKTsKKyAgICB9CisgICAgaWYgKGIuZXhwID4gYS5leHApIHsKKyAg ICAgICAgLyogc21hbGwgLSBiaWcgPT0gLSAoYmlnIC0gc21hbGwpICovCisgICAgICAgIHJldHVy biB4Zl9zdWIoYiwgYSwgIW5lZ2F0ZSk7CisgICAgfQorICAgIGlmICgoYi5leHAgPT0gYS5leHAp ICYmIChpbnQxMjhfZ3QoYi5tYW50LCBhLm1hbnQpKSkgeworICAgICAgICAvKiBzbWFsbCAtIGJp ZyA9PSAtIChiaWcgLSBzbWFsbCkgKi8KKyAgICAgICAgcmV0dXJuIHhmX3N1YihiLCBhLCAhbmVn YXRlKTsKKyAgICB9CisKKyAgICB3aGlsZSAoYS5leHAgPiBiLmV4cCkgeworICAgICAgICAvKiBU cnkgdG8gbm9ybWFsaXplIGV4cG9uZW50czogc2hyaW5rIGEgZXhwb25lbnQgYW5kIGdyb3cgbWFu dGlzc2EgKi8KKyAgICAgICAgaWYgKGEubWFudC5oaWdoICYgKDFVTEwgPDwgNjIpKSB7CisgICAg ICAgICAgICAvKiBDYW4ndCBncm93IGEgYW55IG1vcmUgKi8KKyAgICAgICAgICAgIGJyZWFrOwor ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYSA9IHhmX25vcm1fbGVmdChhKTsKKyAgICAg ICAgfQorICAgIH0KKworICAgIHdoaWxlIChhLmV4cCA+IGIuZXhwKSB7CisgICAgICAgIC8qIFRy eSB0byBub3JtYWxpemUgZXhwb25lbnRzOiBncm93IGIgZXhwb25lbnQgYW5kIHNocmluayBtYW50 aXNzYSAqLworICAgICAgICAvKiBLZWVwIGFyb3VuZCBzaGlmdGVkIG91dCBiaXRzLi4uIHdlIG1p Z2h0IG5lZWQgdGhvc2UgbGF0ZXIgKi8KKyAgICAgICAgYiA9IHhmX25vcm1fcmlnaHQoYiwgYS5l eHAgLSBiLmV4cCk7CisgICAgfQorCisgICAgaWYgKChpbnQxMjhfZ3QoYi5tYW50LCBhLm1hbnQp KSkgeworICAgICAgICByZXR1cm4geGZfc3ViKGIsIGEsICFuZWdhdGUpOworICAgIH0KKworICAg IC8qIE9LLCBub3cgdGhpbmdzIHNob3VsZCBiZSBub3JtYWxpemVkISAqLworICAgIHJldC5zaWdu ID0gYS5zaWduOworICAgIHJldC5leHAgPSBhLmV4cDsKKyAgICBhc3NlcnQoIWludDEyOF9ndChi Lm1hbnQsIGEubWFudCkpOworICAgIGJvcnJvdyA9IChiLnJvdW5kIDw8IDIpIHwgKGIuZ3VhcmQg PDwgMSkgfCBiLnN0aWNreTsKKyAgICByZXQubWFudCA9IGludDEyOF9zdWIoYS5tYW50LCBiLm1h bnQsIChib3Jyb3cgIT0gMCkpOworICAgIGJvcnJvdyA9IDAgLSBib3Jyb3c7CisgICAgcmV0Lmd1 YXJkID0gKGJvcnJvdyA+PiAyKSAmIDE7CisgICAgcmV0LnJvdW5kID0gKGJvcnJvdyA+PiAxKSAm IDE7CisgICAgcmV0LnN0aWNreSA9IChib3Jyb3cgPj4gMCkgJiAxOworICAgIGlmIChuZWdhdGUp IHsKKyAgICAgICAgcmV0LnNpZ24gPSAhcmV0LnNpZ247CisgICAgfQorICAgIHJldHVybiByZXQ7 Cit9CisKK3N0YXRpYyB4Zl90IHhmX2FkZCh4Zl90IGEsIHhmX3QgYikKK3sKKyAgICB4Zl90IHJl dDsKKyAgICB4Zl9pbml0KCZyZXQpOworICAgIGlmIChhLnNpZ24gIT0gYi5zaWduKSB7CisgICAg ICAgIGIuc2lnbiA9ICFiLnNpZ247CisgICAgICAgIHJldHVybiB4Zl9zdWIoYSwgYiwgMCk7Cisg ICAgfQorICAgIGlmIChiLmV4cCA+IGEuZXhwKSB7CisgICAgICAgIC8qIHNtYWxsICsgYmlnID09 ICAoYmlnICsgc21hbGwpICovCisgICAgICAgIHJldHVybiB4Zl9hZGQoYiwgYSk7CisgICAgfQor ICAgIGlmICgoYi5leHAgPT0gYS5leHApICYmIGludDEyOF9ndChiLm1hbnQsIGEubWFudCkpIHsK KyAgICAgICAgLyogc21hbGwgKyBiaWcgPT0gIChiaWcgKyBzbWFsbCkgKi8KKyAgICAgICAgcmV0 dXJuIHhmX2FkZChiLCBhKTsKKyAgICB9CisKKyAgICB3aGlsZSAoYS5leHAgPiBiLmV4cCkgewor ICAgICAgICAvKiBUcnkgdG8gbm9ybWFsaXplIGV4cG9uZW50czogc2hyaW5rIGEgZXhwb25lbnQg YW5kIGdyb3cgbWFudGlzc2EgKi8KKyAgICAgICAgaWYgKGEubWFudC5oaWdoICYgKDFVTEwgPDwg NjIpKSB7CisgICAgICAgICAgICAvKiBDYW4ndCBncm93IGEgYW55IG1vcmUgKi8KKyAgICAgICAg ICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYSA9IHhmX25vcm1fbGVm dChhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChhLmV4cCA+IGIuZXhwKSB7Cisg ICAgICAgIC8qIFRyeSB0byBub3JtYWxpemUgZXhwb25lbnRzOiBncm93IGIgZXhwb25lbnQgYW5k IHNocmluayBtYW50aXNzYSAqLworICAgICAgICAvKiBLZWVwIGFyb3VuZCBzaGlmdGVkIG91dCBi aXRzLi4uIHdlIG1pZ2h0IG5lZWQgdGhvc2UgbGF0ZXIgKi8KKyAgICAgICAgYiA9IHhmX25vcm1f cmlnaHQoYiwgYS5leHAgLSBiLmV4cCk7CisgICAgfQorCisgICAgLyogT0ssIG5vdyB0aGluZ3Mg c2hvdWxkIGJlIG5vcm1hbGl6ZWQhICovCisgICAgaWYgKGludDEyOF9ndChiLm1hbnQsIGEubWFu dCkpIHsKKyAgICAgICAgcmV0dXJuIHhmX2FkZChiLCBhKTsKKyAgICB9OworICAgIHJldC5zaWdu ID0gYS5zaWduOworICAgIHJldC5leHAgPSBhLmV4cDsKKyAgICBhc3NlcnQoIWludDEyOF9ndChi Lm1hbnQsIGEubWFudCkpOworICAgIHJldC5tYW50ID0gaW50MTI4X2FkZChhLm1hbnQsIGIubWFu dCk7CisgICAgcmV0Lmd1YXJkID0gYi5ndWFyZDsKKyAgICByZXQucm91bmQgPSBiLnJvdW5kOwor ICAgIHJldC5zdGlja3kgPSBiLnN0aWNreTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBSZXR1 cm4gYW4gaW5maW5pdHkgd2l0aCB0aGUgc2FtZSBzaWduIGFzIGEgKi8KK3N0YXRpYyBpbmxpbmUg ZGZfdCBpbmZpbml0ZV9kZl90KHhmX3QgYSkKK3sKKyAgICBkZl90IHJldDsKKyAgICByZXQueC5z aWduID0gYS5zaWduOworICAgIHJldC54LmV4cCA9IERGX0lORl9FWFA7CisgICAgcmV0LngubWFu dCA9IDBVTEw7CisgICAgcmV0dXJuIHJldDsKK30KKworLyogUmV0dXJuIGEgbWF4aW11bSBmaW5p dGUgdmFsdWUgd2l0aCB0aGUgc2FtZSBzaWduIGFzIGEgKi8KK3N0YXRpYyBpbmxpbmUgZGZfdCBt YXhmaW5pdGVfZGZfdCh4Zl90IGEpCit7CisgICAgZGZfdCByZXQ7CisgICAgcmV0Lnguc2lnbiA9 IGEuc2lnbjsKKyAgICByZXQueC5leHAgPSBERl9JTkZfRVhQIC0gMTsKKyAgICByZXQueC5tYW50 ID0gMHgwMDBmZmZmZmZmZmZmZmZmVUxMOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBp bmxpbmUgZGZfdCBmMmRmX3QoZG91YmxlIGluKQoreworICAgIGRmX3QgcmV0OworICAgIHJldC5m ID0gaW47CisgICAgcmV0dXJuIHJldDsKK30KKworLyogUmV0dXJuIGFuIGluZmluaXR5IHdpdGgg dGhlIHNhbWUgc2lnbiBhcyBhICovCitzdGF0aWMgaW5saW5lIHNmX3QgaW5maW5pdGVfc2ZfdCh4 Zl90IGEpCit7CisgICAgc2ZfdCByZXQ7CisgICAgcmV0Lnguc2lnbiA9IGEuc2lnbjsKKyAgICBy ZXQueC5leHAgPSBTRl9JTkZfRVhQOworICAgIHJldC54Lm1hbnQgPSAwVUxMOworICAgIHJldHVy biByZXQ7Cit9CisKKy8qIFJldHVybiBhIG1heGltdW0gZmluaXRlIHZhbHVlIHdpdGggdGhlIHNh bWUgc2lnbiBhcyBhICovCitzdGF0aWMgaW5saW5lIHNmX3QgbWF4ZmluaXRlX3NmX3QoeGZfdCBh KQoreworICAgIHNmX3QgcmV0OworICAgIHJldC54LnNpZ24gPSBhLnNpZ247CisgICAgcmV0Lngu ZXhwID0gU0ZfSU5GX0VYUCAtIDE7CisgICAgcmV0LngubWFudCA9IDB4MDA3ZmZmZmZVTDsKKyAg ICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHNmX3QgZjJzZl90KGZsb2F0IGluKQor eworICAgIHNmX3QgcmV0OworICAgIHJldC5mID0gaW47CisgICAgcmV0dXJuIHJldDsKK30KKwor I2RlZmluZSBHRU5fWEZfUk9VTkQoVFlQRSwgTUFOVEJJVFMsIElORl9FWFApIFwKK3N0YXRpYyBp bmxpbmUgVFlQRSB4Zl9yb3VuZF8jI1RZUEUoeGZfdCBhKSBcCit7IFwKKyAgICBUWVBFIHJldDsg XAorICAgIHJldC5pID0gMDsgXAorICAgIHJldC54LnNpZ24gPSBhLnNpZ247IFwKKyAgICBpZiAo KGEubWFudC5oaWdoID09IDApICYmIChhLm1hbnQubG93ID09IDApIFwKKyAgICAgICAgJiYgKChh Lmd1YXJkIHwgYS5yb3VuZCB8IGEuc3RpY2t5KSA9PSAwKSkgeyBcCisgICAgICAgIC8qIHJlc3Vs dCB6ZXJvICovIFwKKyAgICAgICAgc3dpdGNoIChmZWdldHJvdW5kKCkpIHsgXAorICAgICAgICBj YXNlIEZFX0RPV05XQVJEOiBcCisgICAgICAgICAgICByZXR1cm4gZjIjI1RZUEUoLTAuMCk7IFwK KyAgICAgICAgZGVmYXVsdDogXAorICAgICAgICAgICAgcmV0dXJuIGYyIyNUWVBFKDAuMCk7IFwK KyAgICAgICAgfSBcCisgICAgfSBcCisgICAgLyogTm9ybWFsaXplIHJpZ2h0ICovIFwKKyAgICAv KiBXZSB3YW50IE1BTlRCSVRTIGJpdHMgb2YgbWFudGlzc2EgcGx1cyB0aGUgbGVhZGluZyBvbmUu ICovIFwKKyAgICAvKiBUaGF0IG1lYW5zIHRoYXQgd2Ugd2FudCBNQU5UQklUUysxIGJpdHMsIG9y IDB4MDAwMDAwMDAwMDAwRkZfRkZGRiAqLyBcCisgICAgLyogU28gd2UgbmVlZCB0byBub3JtYWxp emUgcmlnaHQgd2hpbGUgdGhlIGhpZ2ggd29yZCBpcyBub24temVybyBhbmQgXAorICAgICogd2hp bGUgdGhlIGxvdyB3b3JkIGlzIG5vbnplcm8gd2hlbiBtYXNrZWQgd2l0aCAweGZmZTBfMDAwMF8w MDAwXzAwMDAgKi8gXAorICAgIHdoaWxlICgoYS5tYW50LmhpZ2ggIT0gMCkgfHwgKChhLm1hbnQu bG93ID4+IChNQU5UQklUUyArIDEpKSAhPSAwKSkgeyBcCisgICAgICAgIGEgPSB4Zl9ub3JtX3Jp Z2h0KGEsIDEpOyBcCisgICAgfSBcCisgICAgLyogXAorICAgICAqIE9LLCBub3cgbm9ybWFsaXpl IGxlZnQgXAorICAgICAqIFdlIHdhbnQgdG8gbm9ybWFsaXplIGxlZnQgdW50aWwgd2UgaGF2ZSBh IGxlYWRpbmcgb25lIGluIGJpdCAyNCBcCisgICAgICogVGhlb3JldGljYWxseSwgd2Ugb25seSBu ZWVkIHRvIHNoaWZ0IGEgbWF4aW11bSBvZiBvbmUgdG8gdGhlIGxlZnQgaWYgd2UgXAorICAgICAq IHNoaWZ0ZWQgb3V0IGxvdHMgb2YgYml0cyBmcm9tIEIsIG9yIGlmIHdlIGhhZCBubyBzaGlmdCAv IDEgc2hpZnQgc3RpY2t5IFwKKyAgICAgKiBzaG91ZGwgYmUgMCAgXAorICAgICAqLyBcCisgICAg d2hpbGUgKChhLm1hbnQubG93ICYgKDFVTEwgPDwgTUFOVEJJVFMpKSA9PSAwKSB7IFwKKyAgICAg ICAgYSA9IHhmX25vcm1fbGVmdChhKTsgXAorICAgIH0gXAorICAgIC8qIFwKKyAgICAgKiBPSywg bm93IHdlIG1pZ2h0IG5lZWQgdG8gZGVub3JtYWxpemUgYmVjYXVzZSBvZiBwb3RlbnRpYWwgdW5k ZXJmbG93LiBcCisgICAgICogV2UgbmVlZCB0byBkbyB0aGlzIGJlZm9yZSByb3VuZGluZywgYW5k IHJvdW5kaW5nIG1pZ2h0IG1ha2UgdXMgbm9ybWFsIFwKKyAgICAgKiBhZ2FpbiBcCisgICAgICov IFwKKyAgICB3aGlsZSAoYS5leHAgPD0gMCkgeyBcCisgICAgICAgIGEgPSB4Zl9ub3JtX3JpZ2h0 KGEsIDEgLSBhLmV4cCk7IFwKKyAgICAgICAgLyogXAorICAgICAgICAgKiBEbyB3ZSBoYXZlIHVu ZGVyZmxvdz8gXAorICAgICAgICAgKiBUaGF0J3Mgd2hlbiB3ZSBnZXQgYW4gaW5leGFjdCBhbnN3 ZXIgYmVjYXVzZSB3ZSByYW4gb3V0IG9mIGJpdHMgXAorICAgICAgICAgKiBpbiBhIGRlbm9ybWFs LiBcCisgICAgICAgICAqLyBcCisgICAgICAgIGlmIChhLmd1YXJkIHx8IGEucm91bmQgfHwgYS5z dGlja3kpIHsgXAorICAgICAgICAgICAgZmVyYWlzZWV4Y2VwdChGRV9VTkRFUkZMT1cpOyBcCisg ICAgICAgIH0gXAorICAgIH0gXAorICAgIC8qIE9LLCB3ZSdyZSByZWxhdGl2ZWx5IGNhbm9uaWNh bC4uLiBub3cgd2UgbmVlZCB0byByb3VuZCAqLyBcCisgICAgaWYgKGEuZ3VhcmQgfHwgYS5yb3Vu ZCB8fCBhLnN0aWNreSkgeyBcCisgICAgICAgIGZlcmFpc2VleGNlcHQoRkVfSU5FWEFDVCk7IFwK KyAgICAgICAgc3dpdGNoIChmZWdldHJvdW5kKCkpIHsgXAorICAgICAgICBjYXNlIEZFX1RPV0FS RFpFUk86IFwKKyAgICAgICAgICAgIC8qIENob3AgYW5kIHdlJ3JlIGRvbmUgKi8gXAorICAgICAg ICAgICAgYnJlYWs7IFwKKyAgICAgICAgY2FzZSBGRV9VUFdBUkQ6IFwKKyAgICAgICAgICAgIGlm IChhLnNpZ24gPT0gMCkgeyBcCisgICAgICAgICAgICAgICAgYS5tYW50LmxvdyArPSAxOyBcCisg ICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgIGNhc2UgRkVfRE9X TldBUkQ6IFwKKyAgICAgICAgICAgIGlmIChhLnNpZ24gIT0gMCkgeyBcCisgICAgICAgICAgICAg ICAgYS5tYW50LmxvdyArPSAxOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGJyZWFr OyBcCisgICAgICAgIGRlZmF1bHQ6IFwKKyAgICAgICAgICAgIGlmIChhLnJvdW5kIHx8IGEuc3Rp Y2t5KSB7IFwKKyAgICAgICAgICAgICAgICAvKiByb3VuZCB1cCBpZiBndWFyZCBpcyAxLCBkb3du IGlmIGd1YXJkIGlzIHplcm8gKi8gXAorICAgICAgICAgICAgICAgIGEubWFudC5sb3cgKz0gYS5n dWFyZDsgXAorICAgICAgICAgICAgfSBlbHNlIGlmIChhLmd1YXJkKSB7IFwKKyAgICAgICAgICAg ICAgICAvKiBleGFjdGx5IC41LCByb3VuZCB1cCBpZiBvZGQgKi8gXAorICAgICAgICAgICAgICAg IGEubWFudC5sb3cgKz0gKGEubWFudC5sb3cgJiAxKTsgXAorICAgICAgICAgICAgfSBcCisgICAg ICAgICAgICBicmVhazsgXAorICAgICAgICB9IFwKKyAgICB9IFwKKyAgICAvKiBcCisgICAgICog T0ssIG5vdyB3ZSBtaWdodCBoYXZlIGNhcnJpZWQgYWxsIHRoZSB3YXkgdXAuIFwKKyAgICAgKiBT byB3ZSBtaWdodCBuZWVkIHRvIHNociBvbmNlIFwKKyAgICAgKiBhdCBsZWFzdCB3ZSBrbm93IHRo YXQgdGhlIGxzYiBzaG91bGQgYmUgemVybyBpZiB3ZSByb3VuZGVkIGFuZCBcCisgICAgICogZ290 IGEgY2Fycnkgb3V0Li4uIFwKKyAgICAgKi8gXAorICAgIGlmICgoYS5tYW50LmxvdyA+PiAoTUFO VEJJVFMgKyAxKSkgIT0gMCkgeyBcCisgICAgICAgIGEgPSB4Zl9ub3JtX3JpZ2h0KGEsIDEpOyBc CisgICAgfSBcCisgICAgLyogT3ZlcmZsb3c/ICovIFwKKyAgICBpZiAoYS5leHAgPj0gSU5GX0VY UCkgeyBcCisgICAgICAgIC8qIFllcCwgaW5mIHJlc3VsdCAqLyBcCisgICAgICAgIGZlcmFpc2Vl eGNlcHQoRkVfT1ZFUkZMT1cpOyBcCisgICAgICAgIGZlcmFpc2VleGNlcHQoRkVfSU5FWEFDVCk7 IFwKKyAgICAgICAgc3dpdGNoIChmZWdldHJvdW5kKCkpIHsgXAorICAgICAgICBjYXNlIEZFX1RP V0FSRFpFUk86IFwKKyAgICAgICAgICAgIHJldHVybiBtYXhmaW5pdGVfIyNUWVBFKGEpOyBcCisg ICAgICAgIGNhc2UgRkVfVVBXQVJEOiBcCisgICAgICAgICAgICBpZiAoYS5zaWduID09IDApIHsg XAorICAgICAgICAgICAgICAgIHJldHVybiBpbmZpbml0ZV8jI1RZUEUoYSk7IFwKKyAgICAgICAg ICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF4ZmluaXRlXyMjVFlQRShh KTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIGNhc2UgRkVfRE9XTldBUkQ6IFwKKyAgICAg ICAgICAgIGlmIChhLnNpZ24gIT0gMCkgeyBcCisgICAgICAgICAgICAgICAgcmV0dXJuIGluZmlu aXRlXyMjVFlQRShhKTsgXAorICAgICAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgICAg IHJldHVybiBtYXhmaW5pdGVfIyNUWVBFKGEpOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAg ZGVmYXVsdDogXAorICAgICAgICAgICAgcmV0dXJuIGluZmluaXRlXyMjVFlQRShhKTsgXAorICAg ICAgICB9IFwKKyAgICB9IFwKKyAgICAvKiBVbmRlcmZsb3c/ICovIFwKKyAgICBpZiAoYS5tYW50 LmxvdyAmICgxVUxMIDw8IE1BTlRCSVRTKSkgeyBcCisgICAgICAgIC8qIExlYWRpbmcgb25lIG1l YW5zOiBObywgd2UncmUgbm9ybWFsLiBTbywgd2Ugc2hvdWxkIGJlIGRvbmUuLi4gKi8gXAorICAg ICAgICByZXQueC5leHAgPSBhLmV4cDsgXAorICAgICAgICByZXQueC5tYW50ID0gYS5tYW50Lmxv dzsgXAorICAgICAgICByZXR1cm4gcmV0OyBcCisgICAgfSBcCisgICAgaWYgKGEuZXhwICE9IDEp IHsgXAorICAgICAgICBwcmludGYoImEuZXhwID09ICVkXG4iLCBhLmV4cCk7IFwKKyAgICB9IFwK KyAgICBhc3NlcnQoYS5leHAgPT0gMSk7IFwKKyAgICByZXQueC5leHAgPSAwOyBcCisgICAgcmV0 LngubWFudCA9IGEubWFudC5sb3c7IFwKKyAgICByZXR1cm4gcmV0OyBcCit9CisKK0dFTl9YRl9S T1VORChkZl90LCBmREZfTUFOVEJJVFMoKSwgREZfSU5GX0VYUCkKK0dFTl9YRl9ST1VORChzZl90 LCBmU0ZfTUFOVEJJVFMoKSwgU0ZfSU5GX0VYUCkKKworc3RhdGljIGlubGluZSBkb3VibGUgc3Bl Y2lhbF9mbWEoZGZfdCBhLCBkZl90IGIsIGRmX3QgYykKK3sKKyAgICBkZl90IHJldDsKKyAgICBy ZXQuaSA9IDA7CisKKyAgICAvKgorICAgICAqIElmIEEgbXVsdGlwbGllZCBieSBCIGlzIGFuIGV4 YWN0IGluZmluaXR5IGFuZCBDIGlzIGFsc28gYW4gaW5maW5pdHkKKyAgICAgKiBidXQgd2l0aCB0 aGUgb3Bwb3NpdGUgc2lnbiwgRk1BIHJldHVybnMgTmFOIGFuZCByYWlzZXMgaW52YWxpZC4KKyAg ICAgKi8KKyAgICBpZiAoZklTSU5GUFJPRChhLmYsIGIuZikgJiYgaXNpbmYoYy5mKSkgeworICAg ICAgICBpZiAoKGEueC5zaWduIF4gYi54LnNpZ24pICE9IGMueC5zaWduKSB7CisgICAgICAgICAg ICByZXQuaSA9IGZERk5BTlZBTCgpOworICAgICAgICAgICAgZmVyYWlzZWV4Y2VwdChGRV9JTlZB TElEKTsKKyAgICAgICAgICAgIHJldHVybiByZXQuZjsKKyAgICAgICAgfQorICAgIH0KKyAgICBp ZiAoKGlzaW5mKGEuZikgJiYgaXN6KGIuZikpIHx8IChpc3ooYS5mKSAmJiBpc2luZihiLmYpKSkg eworICAgICAgICByZXQuaSA9IGZERk5BTlZBTCgpOworICAgICAgICBmZXJhaXNlZXhjZXB0KEZF X0lOVkFMSUQpOworICAgICAgICByZXR1cm4gcmV0LmY7CisgICAgfQorICAgIC8qCisgICAgICog SWYgbm9uZSBvZiB0aGUgYWJvdmUgY2hlY2tzIGFyZSB0cnVlIGFuZCBDIGlzIGEgTmFOLAorICAg ICAqIGEgTmFOIHNoYWxsIGJlIHJldHVybmVkCisgICAgICogSWYgQSBvciBCIGFyZSBOYU4sIGEg TkFOIHNoYWxsIGJlIHJldHVybmVkLgorICAgICAqLworICAgIGlmIChpc25hbihhLmYpIHx8IGlz bmFuKGIuZikgfHwgKGlzbmFuKGMuZikpKSB7CisgICAgICAgIGlmIChpc25hbihhLmYpICYmIChm R0VUQklUKDUxLCBhLmkpID09IDApKSB7CisgICAgICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lO VkFMSUQpOworICAgICAgICB9CisgICAgICAgIGlmIChpc25hbihiLmYpICYmIChmR0VUQklUKDUx LCBiLmkpID09IDApKSB7CisgICAgICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lOVkFMSUQpOwor ICAgICAgICB9CisgICAgICAgIGlmIChpc25hbihjLmYpICYmIChmR0VUQklUKDUxLCBjLmkpID09 IDApKSB7CisgICAgICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lOVkFMSUQpOworICAgICAgICB9 CisgICAgICAgIHJldC5pID0gZkRGTkFOVkFMKCk7CisgICAgICAgIHJldHVybiByZXQuZjsKKyAg ICB9CisgICAgLyoKKyAgICAgKiBXZSBoYXZlIGNoZWNrZWQgZm9yIGFkZGluZyBvcHBvc2l0ZS1z aWduZWQgaW5maW5pdGllcy4KKyAgICAgKiBPdGhlciBpbmZpbml0aWVzIHJldHVybiBpbmZpbml0 eSB3aXRoIHRoZSBjb3JyZWN0IHNpZ24KKyAgICAgKi8KKyAgICBpZiAoaXNpbmYoYy5mKSkgewor ICAgICAgICByZXQueC5leHAgPSBERl9JTkZfRVhQOworICAgICAgICByZXQueC5tYW50ID0gMDsK KyAgICAgICAgcmV0Lnguc2lnbiA9IGMueC5zaWduOworICAgICAgICByZXR1cm4gcmV0LmY7Cisg ICAgfQorICAgIGlmIChpc2luZihhLmYpIHx8IGlzaW5mKGIuZikpIHsKKyAgICAgICAgcmV0Lngu ZXhwID0gREZfSU5GX0VYUDsKKyAgICAgICAgcmV0LngubWFudCA9IDA7CisgICAgICAgIHJldC54 LnNpZ24gPSAoYS54LnNpZ24gXiBiLnguc2lnbik7CisgICAgICAgIHJldHVybiByZXQuZjsKKyAg ICB9CisgICAgZ19hc3NlcnRfbm90X3JlYWNoZWQoKTsKK30KKworc3RhdGljIGlubGluZSBmbG9h dCBzcGVjaWFsX2ZtYWYoc2ZfdCBhLCBzZl90IGIsIHNmX3QgYykKK3sKKyAgICBkZl90IGFhLCBi YiwgY2M7CisgICAgYWEuZiA9IGEuZjsKKyAgICBiYi5mID0gYi5mOworICAgIGNjLmYgPSBjLmY7 CisgICAgcmV0dXJuIHNwZWNpYWxfZm1hKGFhLCBiYiwgY2MpOworfQorCitmbG9hdCBpbnRlcm5h bF9mbWFmeChmbG9hdCBhX2luLCBmbG9hdCBiX2luLCBmbG9hdCBjX2luLCBpbnQgc2NhbGUpCit7 CisgICAgc2ZfdCBhLCBiLCBjOworICAgIHhmX3QgcHJvZDsKKyAgICB4Zl90IGFjYzsKKyAgICB4 Zl90IHJlc3VsdDsKKyAgICB4Zl9pbml0KCZwcm9kKTsKKyAgICB4Zl9pbml0KCZhY2MpOworICAg IHhmX2luaXQoJnJlc3VsdCk7CisgICAgYS5mID0gYV9pbjsKKyAgICBiLmYgPSBiX2luOworICAg IGMuZiA9IGNfaW47CisKKyAgICBpZiAoaXNpbmYoYS5mKSB8fCBpc2luZihiLmYpIHx8IGlzaW5m KGMuZikpIHsKKyAgICAgICAgcmV0dXJuIHNwZWNpYWxfZm1hZihhLCBiLCBjKTsKKyAgICB9Cisg ICAgaWYgKGlzbmFuKGEuZikgfHwgaXNuYW4oYi5mKSB8fCBpc25hbihjLmYpKSB7CisgICAgICAg IHJldHVybiBzcGVjaWFsX2ZtYWYoYSwgYiwgYyk7CisgICAgfQorICAgIGlmICgoc2NhbGUgPT0g MCkgJiYgKGlzeihhLmYpIHx8IGlzeihiLmYpKSkgeworICAgICAgICByZXR1cm4gYS5mICogYi5m ICsgYy5mOworICAgIH0KKworICAgIC8qIChhICogMioqYikgKiAoYyAqIDIqKmQpID09IGEqYyAq IDIqKihiK2QpICovCisgICAgcHJvZC5tYW50ID0gaW50MTI4X211bF82NDY0KHNmX2dldG1hbnQo YSksIHNmX2dldG1hbnQoYikpOworCisgICAgLyoKKyAgICAgKiBOb3RlOiBleHRyYWN0aW5nIHRo ZSBtYW50aXNzYSBpbnRvIGFuIGludCBpcyBtdWx0aXBseWluZyBieQorICAgICAqIDIqKjIzLCBz byBhZGp1c3QgaGVyZQorICAgICAqLworICAgIHByb2QuZXhwID0gc2ZfZ2V0ZXhwKGEpICsgc2Zf Z2V0ZXhwKGIpIC0gU0ZfQklBUyAtIDIzOworICAgIHByb2Quc2lnbiA9IGEueC5zaWduIF4gYi54 LnNpZ247CisgICAgaWYgKGlzeihhLmYpIHx8IGlzeihiLmYpKSB7CisgICAgICAgIHByb2QuZXhw ID0gLTIgKiBXQVlfQklHX0VYUDsKKyAgICB9CisgICAgaWYgKChzY2FsZSA+IDApICYmIChmcGNs YXNzaWZ5KGMuZikgPT0gRlBfU1VCTk9STUFMKSkgeworICAgICAgICBhY2MubWFudCA9IGludDEy OF9tdWxfNjQ2NCgwLCAwKTsKKyAgICAgICAgYWNjLmV4cCA9IC1XQVlfQklHX0VYUDsKKyAgICAg ICAgYWNjLnNpZ24gPSBjLnguc2lnbjsKKyAgICAgICAgYWNjLnN0aWNreSA9IDE7CisgICAgICAg IHJlc3VsdCA9IHhmX2FkZChwcm9kLCBhY2MpOworICAgIH0gZWxzZSBpZiAoIWlzeihjLmYpKSB7 CisgICAgICAgIGFjYy5tYW50ID0gaW50MTI4X211bF82NDY0KHNmX2dldG1hbnQoYyksIDEpOwor ICAgICAgICBhY2MuZXhwID0gc2ZfZ2V0ZXhwKGMpOworICAgICAgICBhY2Muc2lnbiA9IGMueC5z aWduOworICAgICAgICByZXN1bHQgPSB4Zl9hZGQocHJvZCwgYWNjKTsKKyAgICB9IGVsc2Ugewor ICAgICAgICByZXN1bHQgPSBwcm9kOworICAgIH0KKyAgICByZXN1bHQuZXhwICs9IHNjYWxlOwor ICAgIHJldHVybiB4Zl9yb3VuZF9zZl90KHJlc3VsdCkuZjsKK30KKworCitmbG9hdCBpbnRlcm5h bF9mbWFmKGZsb2F0IGFfaW4sIGZsb2F0IGJfaW4sIGZsb2F0IGNfaW4pCit7CisgICAgcmV0dXJu IGludGVybmFsX2ZtYWZ4KGFfaW4sIGJfaW4sIGNfaW4sIDApOworfQorCitmbG9hdCBpbnRlcm5h bF9tcHlmKGZsb2F0IGFfaW4sIGZsb2F0IGJfaW4pCit7CisgICAgaWYgKGlzeihhX2luKSB8fCBp c3ooYl9pbikpIHsKKyAgICAgICAgcmV0dXJuIGFfaW4gKiBiX2luOworICAgIH0KKyAgICByZXR1 cm4gaW50ZXJuYWxfZm1hZngoYV9pbiwgYl9pbiwgMC4wLCAwKTsKK30KKworc3RhdGljIGlubGlu ZSBkb3VibGUgaW50ZXJuYWxfbXB5aGhfc3BlY2lhbChkb3VibGUgYSwgZG91YmxlIGIpCit7Cisg ICAgcmV0dXJuIGEgKiBiOworfQorCitkb3VibGUgaW50ZXJuYWxfbXB5aGgoZG91YmxlIGFfaW4s IGRvdWJsZSBiX2luLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBp bnQgYWNjdW11bGF0ZWQpCit7CisgICAgZGZfdCBhLCBiOworICAgIHhmX3QgeDsKKyAgICB1bnNp Z25lZCBsb25nIGxvbmcgaW50IHByb2Q7CisgICAgdW5zaWduZWQgaW50IHN0aWNreTsKKworICAg IGEuZiA9IGFfaW47CisgICAgYi5mID0gYl9pbjsKKyAgICBzdGlja3kgPSBhY2N1bXVsYXRlZCAm IDE7CisgICAgYWNjdW11bGF0ZWQgPj49IDE7CisgICAgeGZfaW5pdCgmeCk7CisgICAgaWYgKGlz eihhX2luKSB8fCBpc25hbihhX2luKSB8fCBpc2luZihhX2luKSkgeworICAgICAgICByZXR1cm4g aW50ZXJuYWxfbXB5aGhfc3BlY2lhbChhX2luLCBiX2luKTsKKyAgICB9CisgICAgaWYgKGlzeihi X2luKSB8fCBpc25hbihiX2luKSB8fCBpc2luZihiX2luKSkgeworICAgICAgICByZXR1cm4gaW50 ZXJuYWxfbXB5aGhfc3BlY2lhbChhX2luLCBiX2luKTsKKyAgICB9CisgICAgeC5tYW50ID0gaW50 MTI4X211bF82NDY0KGFjY3VtdWxhdGVkLCAxKTsKKyAgICB4LnN0aWNreSA9IHN0aWNreTsKKyAg ICBwcm9kID0gZkdFVFVXT1JEKDEsIGRmX2dldG1hbnQoYSkpICogZkdFVFVXT1JEKDEsIGRmX2dl dG1hbnQoYikpOworICAgIHgubWFudCA9IGludDEyOF9hZGQoeC5tYW50LCBpbnQxMjhfbXVsXzY0 NjQocHJvZCwgMHgxMDAwMDAwMDBVTEwpKTsKKyAgICB4LmV4cCA9IGRmX2dldGV4cChhKSArIGRm X2dldGV4cChiKSAtIERGX0JJQVMgLSAyMDsKKyAgICBpZiAoIWlzbm9ybWFsKGFfaW4pIHx8ICFp c25vcm1hbChiX2luKSkgeworICAgICAgICAvKiBjcnVzaCB0byBpbmV4YWN0IHplcm8gKi8KKyAg ICAgICAgeC5zdGlja3kgPSAxOworICAgICAgICB4LmV4cCA9IC00MDk2OworICAgIH0KKyAgICB4 LnNpZ24gPSBhLnguc2lnbiBeIGIueC5zaWduOworICAgIHJldHVybiB4Zl9yb3VuZF9kZl90KHgp LmY7Cit9CisKK2Zsb2F0IGNvbnZfZGZfdG9fc2YoZG91YmxlIGluX2YpCit7CisgICAgeGZfdCB4 OworICAgIGRmX3QgaW47CisgICAgaWYgKGlzeihpbl9mKSB8fCBpc25hbihpbl9mKSB8fCBpc2lu Zihpbl9mKSkgeworICAgICAgICByZXR1cm4gaW5fZjsKKyAgICB9CisgICAgeGZfaW5pdCgmeCk7 CisgICAgaW4uZiA9IGluX2Y7CisgICAgeC5tYW50ID0gaW50MTI4X211bF82NDY0KGRmX2dldG1h bnQoaW4pLCAxKTsKKyAgICB4LmV4cCA9IGRmX2dldGV4cChpbikgLSBERl9CSUFTICsgU0ZfQklB UyAtIDUyICsgMjM7CisgICAgeC5zaWduID0gaW4ueC5zaWduOworICAgIHJldHVybiB4Zl9yb3Vu ZF9zZl90KHgpLmY7Cit9CisKLS0gCjIuNy40Cgo=