Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wetlk-00575m-1n for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Jul 2026 12:10:20 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wetli-00DX3T-0R for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Jul 2026 12:10:18 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wetlh-00DX3L-2M for pgsql-hackers@lists.postgresql.org; Wed, 01 Jul 2026 12:10:17 +0000 Received: from mail-dy1-x1335.google.com ([2607:f8b0:4864:20::1335]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wetlf-00000001BrT-1Zj0 for pgsql-hackers@postgresql.org; Wed, 01 Jul 2026 12:10:17 +0000 Received: by mail-dy1-x1335.google.com with SMTP id 5a478bee46e88-30bc871ecdfso967975eec.1 for ; Wed, 01 Jul 2026 05:10:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1782907813; cv=none; d=google.com; s=arc-20260327; b=K7FKhM2XHM0lHOiSRVHVIqAxOYyOQPOB2w8s9l4tBNz5WV9EMPTGW0ILk+0DGVCktt k4QiUnuGKLIam3uVIRs5IZpF8CqzGhpL4p029ONf9F5BD8kn7oOHzm2pHSgE6WgMTWl9 x0Rh2OrmlJKw9h3pYNjwPfKFbaBANq/xAdGI/EVpWJ0uQheb1e3F0k7dtXP+ESk2uw6t 6zhNVWsEC3Ie/iz7DEGMTmS+ASO64d7X4dqCqndgj8tYO0joG8irWBScb7qguTVxxGZP VoNNVSwaEDOXoAI27g0l3RoElqxhHZsCoT5IZQBVxvIexHr4p3ROCgL5XgicGauGDQ5d Fd/g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20260327; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=F+sHRzoBLSofb8ZcrK0bxPILxiXXfGxUbDSsN0wLaqM=; fh=moX0oS0RKT8ZJ73qtSkb6Lk25HnG448Xa7qga9zJh1g=; b=eFDs6uqaBtn8hoj74ttGrxfZfM0w4kPHBrEk0QLnVP5X9EzPl4QEkqe5ossSKVawbn NzdfFvMWO647k7EY11hzVEhJ7ZmTogjKpB35egWoyqScL/05zotZwmqxJ6rpOKHmsmKg vnV6dk3EpGjewH6b0TsHViZf2nG/CU584+iAsD075BdRHRE9w2j+XV5p+/fiLcKj1B8C A0uAIBWp+9QNTnquyBBT4/zSrHbkyBZRCl2G4cdVu08SOBdGTxHxPI7tdbTBrc7g/i80 xwNdoSCX3W89Ic9E+KetkkoNHYOiZ3wEzjG2EVxoKXlQzmcoOrmy3ZfWxciaUce06I9s U8ew==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1782907813; x=1783512613; darn=postgresql.org; h=content-type:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:from:to:cc:subject:date:message-id:reply-to :content-type; bh=F+sHRzoBLSofb8ZcrK0bxPILxiXXfGxUbDSsN0wLaqM=; b=kGW53O1Jrp/CaWFpVy5KsmsLpUzku1zcDTaY0L5m6JiZq/EfykGeNDZaVr+/sxn3sJ Y2+oAMFpx4lNCAkSHBH8gRcYugEa9z0OAEKfKpLmfIjuO+fPyZhE3fBUAYrAtxr9PYge jsa+AP1vItOVbgzr3Ez9F21MYLgHuQ1Ap72pD5PN6CA0/I/gZ/XwYaDiS7Fbnxn/GtwB SX6E9E+CWzxdTdbztL6Zd+YwnH9ycWMSQCYQ08K8874UxMmEVvJAVKKh3hvwuf/CoWtc hBwfP5bksJ8wYGTXpjqL1ZDXugImIM0gAIlrInO/b37Wp+JLA8l4vRMkHuictzvLUwLg 6jGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1782907813; x=1783512613; h=content-type:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to:content-type; bh=F+sHRzoBLSofb8ZcrK0bxPILxiXXfGxUbDSsN0wLaqM=; b=JYeNWalI3t38TeUqxxwsM9xRtqilgCm52t5jQl+VGeROALwmDFLqBziggxh3KD9t/Q HVFA2SFXLwpDhYcSQlXHvrYvS1btj3B53nBL8F5EcQyKic38buC7bPCEw4WY6msWe+co AIvjVwxrRqO7FENiD22nHeMzKCzQ9ixpgVSlU5FB3JdlVdiovz4eICBETqiCvqSCev40 j8GyCqGPdHk/OK3CttAiQRxJBDPzgEFu2ms52lBQQ1UDEXaxUK7HFUmfo2hifwvRyDPT LMYsXNHpCihaT4ZgEQjwhByHZVHwgbs5vp2JGBpzk+aR6990/HL+0OxcYtu2GVYImX3P AtaQ== X-Forwarded-Encrypted: i=1; AHgh+RoCWORqTvGDup8PmatfM0K0Y8DEcj41DxbBz3H7pjZh/yY1uEUBsrewcV/X3CW/UAGncdqZVqEhRFkOFTRz@postgresql.org X-Gm-Message-State: AOJu0YxUp5oD2vI4iag+bADp3LW5Sn/zFTsra9CkZm9czcrJBXKpVSPO CvsUfVu33FHIcbfQd9ayEZMOXbsbqaP0BlaX5gICDSKBI3fO1LyzwHJVGkTY6lNyONQ/88o9cH/ klO3vckD/UDNTP+LqB1QpTwAXUMffo5c= X-Gm-Gg: AfdE7clyq0punAWjBLiZoqk/PpBEVHZ8guNrPIzrDRhKgedyRJD7aCoxrNlSptkdX3z 12r/w/qVpPDsw/kXBOyG2Q9axVuAX6B6Exk+RqZDGlhK+G99S+FkRIoX1yh07OTorsR+tp7kUNt YHsaXboIGaq3HE6cGc/29MG3LEMA06Lsfgpq82V/76/hABxPLhF3Zy1iItZ36luNSPr5GsTqpmY 18cCoBsDBOOy9BtPtvVgFbF0i5hSZNAoXNVp6Y06+3KcUYel5589F3PYi521mk7a3KZjszVtCDP WiUwy6UQkpsHN2Hz4vTjSK856HlBqG3NgRgAV3bn+nsmZyFGfoGFddm9/JYUJyPMbFN9ux7jaT9 Fr6IQUs23SFpXSBxwf59TVZ+j39SpmA== X-Received: by 2002:a05:7300:d511:b0:30c:ab4d:3828 with SMTP id 5a478bee46e88-30f0548e987mr477695eec.42.1782907812368; Wed, 01 Jul 2026 05:10:12 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Etsuro Fujita Date: Wed, 1 Jul 2026 21:09:58 +0900 X-Gm-Features: AVVi8CfsprXIi1pxER1xuqQpnq6Rd-BsBNAE3kLrpFmT1IpKLpFjfuOzxxY7VqM Message-ID: Subject: Re: use of SPI by postgresImportForeignStatistics To: Corey Huinker Cc: Robert Haas , "pgsql-hackers@postgresql.org" Content-Type: multipart/mixed; boundary="000000000000d356e006558b926c" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000d356e006558b926c Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Wed, Jul 1, 2026 at 12:55=E2=80=AFAM Corey Huinker wrote: > On Tue, Jun 30, 2026 at 7:30=E2=80=AFAM Etsuro Fujita wrote: >> As postgresImportForeignStatistics() is provided for FDWs that want to >> calculate statistics remotely, so I'm assuming that they have enough >> knowledge about the stats-data structures. CORRECTION: s/postgresImportForeignStatistics()/ImportForeignStatistics()/ Sorry for that. >> In relation to this change, I moved helper functions set_XXX_arg() >> that you added to relation_stats.c and attribute_stats.c to >> postgres_fdw.c. The helper functions had soft error handling, but in >> the postgres_fdw use, there is no need for that, so I removed that >> handling as well. > > My inclination would be to move the set_*_arg functions could be moved to= some common utility file in v20, as other FDWs will find themselves with t= he same need. Seems like a good idea. I moved the set_*_arg functions to stat_utils.c, and renamed them to stats_set_*_arg. Attached is a new version of the patch. > As for removing the error-handling, it might still be handy because it wo= uld allow us to give a more context-aware error message, rather than the ve= ry narrow "this_string is an invalid this_type", for string that the user m= ost certainly never saw. Having said that, it's something we could easily c= hange back to error-safe if we wanted to. Ok, I think we could do so later if needed. >> What do you think? If there is no problem with this change, we >> wouldn't need to worry about the stability of postgres_fdw (and other >> FDWs) in v20. > > If you're fine with the names import_relation_statistics and import_attri= bute_statistics, then yes. Those names made sense to me in the narrow case = of being called from an FDW handler and handing the function a bunch of str= ings, but in a more general case with properly typed datums, the name feels= less appropriate, but it's just a name and I wouldn't let it get in the wa= y of the overall patch. I like the names, but I'm open to suggestions. I modified the patch further. To support these differences: "There are important differences in the parameters needed by the different types of functions. The pg_restore_*() SQL function calls need to identify the schema+relname of the relation being modified, and already have all of the values as typed Datums, whereas the internal API calls already have an identified and locked open Relation, but all of the statistical parameters are just cstrings." I incorporated your v2-0010 and v2-0012 into the patch: 1) separate the guts of relation_statistics_update() and attribute_statistics_update() into new functions relation_statistics_update_internal() and attribute_statistics_update_internal(), and 2) modify import_relation_statistics() and import_attribute_statistics() to call these new functions instead. Also, I changed the stats-data argument-type in import_relation_statistics() and import_attribute_statistics() from NullableDatum * to const NullableDatum *. Best regards, Etsuro Fujita --000000000000d356e006558b926c Content-Type: application/octet-stream; name="v2-Remove-SPI-from-stat-import-in-postgres-fdw-efujita.patch" Content-Disposition: attachment; filename="v2-Remove-SPI-from-stat-import-in-postgres-fdw-efujita.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mr219i9c0 ZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5v dXQgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0CmluZGV4 IGU5MDI4OWU0YWIxLi41MWQwOWIyNzI2NyAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19m ZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dAorKysgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9l eHBlY3RlZC9wb3N0Z3Jlc19mZHcub3V0CkBAIC0xMjkyNyw2ICsxMjkyNyw0MyBAQCBBTkFMWVpF IGR0ZXN0X3RhYmxlOwogQU5BTFlaRSBWRVJCT1NFIGR0ZXN0X2Z0YWJsZTsgICAgICAgICAgICAg LS0gc2hvdWxkIHdvcmsKIElORk86ICBpbXBvcnRpbmcgc3RhdGlzdGljcyBmb3IgZm9yZWlnbiB0 YWJsZSAicHVibGljLmR0ZXN0X2Z0YWJsZSIKIElORk86ICBmaW5pc2hlZCBpbXBvcnRpbmcgc3Rh dGlzdGljcyBmb3IgZm9yZWlnbiB0YWJsZSAicHVibGljLmR0ZXN0X2Z0YWJsZSIKKy0tIGR0ZXN0 X2Z0YWJsZSdzIHN0YXRzIHNob3VsZCBub3cgZXhhY3RseSBtYXRjaCBkdGVzdF90YWJsZSdzCist LSBjb21wYXJlIHZhbHVlcywgc2hvdWxkIG1hdGNoCitTRUxFQ1QgcmVscGFnZXMsIHJlbHR1cGxl cyBGUk9NIHBnX2NsYXNzCitXSEVSRSBvaWQgPSAncHVibGljLmR0ZXN0X3RhYmxlJzo6cmVnY2xh c3MKK0VYQ0VQVAorU0VMRUNUIHJlbHBhZ2VzLCByZWx0dXBsZXMgRlJPTSBwZ19jbGFzcworV0hF UkUgb2lkID0gJ3B1YmxpYy5kdGVzdF9mdGFibGUnOjpyZWdjbGFzczsKKyByZWxwYWdlcyB8IHJl bHR1cGxlcyAKKy0tLS0tLS0tLS0rLS0tLS0tLS0tLS0KKygwIHJvd3MpCisKKy0tIGNvbXBhcmUg dGhlIHJvd2NvdW50cywgc2hvdWxkIGdldCAwIHJvd3MgYmFjaworU0VMRUNUIENPVU5UKCopIEZS T00gcGdfc3RhdHMKK1dIRVJFIHNjaGVtYW5hbWUgPSAncHVibGljJyBBTkQgdGFibGVuYW1lID0g J2R0ZXN0X3RhYmxlJworRVhDRVBUCitTRUxFQ1QgQ09VTlQoKikgRlJPTSBwZ19zdGF0cworV0hF UkUgc2NoZW1hbmFtZSA9ICdwdWJsaWMnIEFORCB0YWJsZW5hbWUgPSAnZHRlc3RfZnRhYmxlJzsK KyBjb3VudCAKKy0tLS0tLS0KKygwIHJvd3MpCisKKy0tIHRlc3Qgb25seSBhIGZldyBzdGF0cyBj b2x1bW5zIGNvbW1vbiB0byBpbnRlZ2VyIHR5cGVzCitTRUxFQ1QgYXR0bmFtZSwgaW5oZXJpdGVk LCBudWxsX2ZyYWMsIGF2Z193aWR0aCwgbl9kaXN0aW5jdCwKKyAgbW9zdF9jb21tb25fdmFsczo6 dGV4dCBhcyBtY3YsIG1vc3RfY29tbW9uX2ZyZXFzLAorICBoaXN0b2dyYW1fYm91bmRzOjp0ZXh0 IGFzIGhiLCBjb3JyZWxhdGlvbgorRlJPTSBwZ19zdGF0cworV0hFUkUgc2NoZW1hbmFtZSA9ICdw dWJsaWMnIEFORCB0YWJsZW5hbWUgPSAnZHRlc3RfdGFibGUnCitFWENFUFQKK1NFTEVDVCBhdHRu YW1lLCBpbmhlcml0ZWQsIG51bGxfZnJhYywgYXZnX3dpZHRoLCBuX2Rpc3RpbmN0LAorICBtb3N0 X2NvbW1vbl92YWxzOjp0ZXh0IGFzIG1jdiwgbW9zdF9jb21tb25fZnJlcXMsCisgIGhpc3RvZ3Jh bV9ib3VuZHM6OnRleHQgYXMgaGIsIGNvcnJlbGF0aW9uCitGUk9NIHBnX3N0YXRzCitXSEVSRSBz Y2hlbWFuYW1lID0gJ3B1YmxpYycgQU5EIHRhYmxlbmFtZSA9ICdkdGVzdF9mdGFibGUnOworIGF0 dG5hbWUgfCBpbmhlcml0ZWQgfCBudWxsX2ZyYWMgfCBhdmdfd2lkdGggfCBuX2Rpc3RpbmN0IHwg bWN2IHwgbW9zdF9jb21tb25fZnJlcXMgfCBoYiB8IGNvcnJlbGF0aW9uIAorLS0tLS0tLS0tKy0t LS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLSstLS0t LS0tLS0tLS0tLS0tLS0tKy0tLS0rLS0tLS0tLS0tLS0tLQorKDAgcm93cykKKwogLS0gY2xlYW51 cAogRFJPUCBGT1JFSUdOIFRBQkxFIHNpbXBvcnRfZnRhYmxlOwogRFJPUCBGT1JFSUdOIFRBQkxF IHNpbXBvcnRfZnZpZXc7CmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jl c19mZHcuYyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCmluZGV4IDZkYmFl NTgzZWNjLi5iMTQzZTczNjljMCAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9z dGdyZXNfZmR3LmMKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMKQEAg LTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlICJjb21tYW5kcy92YWN1dW0uaCIKICNpbmNsdWRlICJl eGVjdXRvci9leGVjQXN5bmMuaCIKICNpbmNsdWRlICJleGVjdXRvci9pbnN0cnVtZW50LmgiCi0j aW5jbHVkZSAiZXhlY3V0b3Ivc3BpLmgiCiAjaW5jbHVkZSAiZm9yZWlnbi9mZHdhcGkuaCIKICNp bmNsdWRlICJmdW5jYXBpLmgiCiAjaW5jbHVkZSAibWlzY2FkbWluLmgiCkBAIC00Myw2ICs0Miw3 IEBACiAjaW5jbHVkZSAicGFyc2VyL3BhcnNldHJlZS5oIgogI2luY2x1ZGUgInBvc3RncmVzX2Zk dy5oIgogI2luY2x1ZGUgInN0YXRpc3RpY3Mvc3RhdGlzdGljcy5oIgorI2luY2x1ZGUgInN0YXRp c3RpY3Mvc3RhdF91dGlscy5oIgogI2luY2x1ZGUgInN0b3JhZ2UvbGF0Y2guaCIKICNpbmNsdWRl ICJ1dGlscy9idWlsdGlucy5oIgogI2luY2x1ZGUgInV0aWxzL2Zsb2F0LmgiCkBAIC0zMzUsNyAr MzM1LDYgQEAgdHlwZWRlZiBzdHJ1Y3QKIHsKIAlQR3Jlc3VsdCAgICpyZWw7CiAJUEdyZXN1bHQg ICAqYXR0OwotCWludAkJCXNlcnZlcl92ZXJzaW9uX251bTsKIH0gUmVtb3RlU3RhdHNSZXN1bHRz OwogCiAvKiBDb2x1bW4gb3JkZXIgaW4gcmVsYXRpb24gc3RhdHMgcXVlcnkgKi8KQEAgLTM2Nywx MzYgKzM2Niw2IEBAIGVudW0gQXR0U3RhdHNDb2x1bW5zCiAJQVRUU1RBVFNfTlVNX0ZJRUxEUywK IH07CiAKLS8qIFJlbGF0aW9uIHN0YXRzIGltcG9ydCBxdWVyeSAqLwotc3RhdGljIGNvbnN0IGNo YXIgKnJlbGltcG9ydF9zcWwgPQotIlNFTEVDVCBwZ19jYXRhbG9nLnBnX3Jlc3RvcmVfcmVsYXRp b25fc3RhdHMoXG4iCi0iXHQndmVyc2lvbicsICQxLFxuIgotIlx0J3NjaGVtYW5hbWUnLCAkMixc biIKLSJcdCdyZWxuYW1lJywgJDMsXG4iCi0iXHQncmVscGFnZXMnLCAkNDo6aW50ZWdlcixcbiIK LSJcdCdyZWx0dXBsZXMnLCAkNTo6cmVhbCkiOwotCi0vKiBBcmd1bWVudCBvcmRlciBpbiByZWxh dGlvbiBzdGF0cyBpbXBvcnQgcXVlcnkgKi8KLWVudW0gUmVsSW1wb3J0U3FsQXJncwotewotCVJF TElNUE9SVF9TUUxfVkVSU0lPTiA9IDAsCi0JUkVMSU1QT1JUX1NRTF9TQ0hFTUFOQU1FLAotCVJF TElNUE9SVF9TUUxfUkVMTkFNRSwKLQlSRUxJTVBPUlRfU1FMX1JFTFBBR0VTLAotCVJFTElNUE9S VF9TUUxfUkVMVFVQTEVTLAotCVJFTElNUE9SVF9TUUxfTlVNX0ZJRUxEUwotfTsKLQotLyogQXJn dW1lbnQgdHlwZXMgaW4gcmVsYXRpb24gc3RhdHMgaW1wb3J0IHF1ZXJ5ICovCi1zdGF0aWMgY29u c3QgT2lkIHJlbGltcG9ydF9hcmd0eXBlc1tSRUxJTVBPUlRfU1FMX05VTV9GSUVMRFNdID0KLXsK LQlJTlQ0T0lELCBURVhUT0lELCBURVhUT0lELCBURVhUT0lELAotCVRFWFRPSUQsCi19OwotCi0v KiBBdHRyaWJ1dGUgc3RhdHMgaW1wb3J0IHF1ZXJ5ICovCi1zdGF0aWMgY29uc3QgY2hhciAqYXR0 aW1wb3J0X3NxbCA9Ci0iU0VMRUNUIHBnX2NhdGFsb2cucGdfcmVzdG9yZV9hdHRyaWJ1dGVfc3Rh dHMoXG4iCi0iXHQndmVyc2lvbicsICQxLFxuIgotIlx0J3NjaGVtYW5hbWUnLCAkMixcbiIKLSJc dCdyZWxuYW1lJywgJDMsXG4iCi0iXHQnYXR0bnVtJywgJDQsXG4iCi0iXHQnaW5oZXJpdGVkJywg ZmFsc2U6OmJvb2xlYW4sXG4iCi0iXHQnbnVsbF9mcmFjJywgJDU6OnJlYWwsXG4iCi0iXHQnYXZn X3dpZHRoJywgJDY6OmludGVnZXIsXG4iCi0iXHQnbl9kaXN0aW5jdCcsICQ3OjpyZWFsLFxuIgot Ilx0J21vc3RfY29tbW9uX3ZhbHMnLCAkOCxcbiIKLSJcdCdtb3N0X2NvbW1vbl9mcmVxcycsICQ5 OjpyZWFsW10sXG4iCi0iXHQnaGlzdG9ncmFtX2JvdW5kcycsICQxMCxcbiIKLSJcdCdjb3JyZWxh dGlvbicsICQxMTo6cmVhbCxcbiIKLSJcdCdtb3N0X2NvbW1vbl9lbGVtcycsICQxMixcbiIKLSJc dCdtb3N0X2NvbW1vbl9lbGVtX2ZyZXFzJywgJDEzOjpyZWFsW10sXG4iCi0iXHQnZWxlbV9jb3Vu dF9oaXN0b2dyYW0nLCAkMTQ6OnJlYWxbXSxcbiIKLSJcdCdyYW5nZV9sZW5ndGhfaGlzdG9ncmFt JywgJDE1LFxuIgotIlx0J3JhbmdlX2VtcHR5X2ZyYWMnLCAkMTY6OnJlYWwsXG4iCi0iXHQncmFu Z2VfYm91bmRzX2hpc3RvZ3JhbScsICQxNykiOwotCi0vKiBBcmd1bWVudCBvcmRlciBpbiBhdHRy aWJ1dGUgc3RhdHMgaW1wb3J0IHF1ZXJ5ICovCi1lbnVtIEF0dEltcG9ydFNxbEFyZ3MKLXsKLQlB VFRJTVBPUlRfU1FMX1ZFUlNJT04gPSAwLAotCUFUVElNUE9SVF9TUUxfU0NIRU1BTkFNRSwKLQlB VFRJTVBPUlRfU1FMX1JFTE5BTUUsCi0JQVRUSU1QT1JUX1NRTF9BVFROVU0sCi0JQVRUSU1QT1JU X1NRTF9OVUxMX0ZSQUMsCi0JQVRUSU1QT1JUX1NRTF9BVkdfV0lEVEgsCi0JQVRUSU1QT1JUX1NR TF9OX0RJU1RJTkNULAotCUFUVElNUE9SVF9TUUxfTU9TVF9DT01NT05fVkFMUywKLQlBVFRJTVBP UlRfU1FMX01PU1RfQ09NTU9OX0ZSRVFTLAotCUFUVElNUE9SVF9TUUxfSElTVE9HUkFNX0JPVU5E UywKLQlBVFRJTVBPUlRfU1FMX0NPUlJFTEFUSU9OLAotCUFUVElNUE9SVF9TUUxfTU9TVF9DT01N T05fRUxFTVMsCi0JQVRUSU1QT1JUX1NRTF9NT1NUX0NPTU1PTl9FTEVNX0ZSRVFTLAotCUFUVElN UE9SVF9TUUxfRUxFTV9DT1VOVF9ISVNUT0dSQU0sCi0JQVRUSU1QT1JUX1NRTF9SQU5HRV9MRU5H VEhfSElTVE9HUkFNLAotCUFUVElNUE9SVF9TUUxfUkFOR0VfRU1QVFlfRlJBQywKLQlBVFRJTVBP UlRfU1FMX1JBTkdFX0JPVU5EU19ISVNUT0dSQU0sCi0JQVRUSU1QT1JUX1NRTF9OVU1fRklFTERT Ci19OwotCi0vKiBBcmd1bWVudCB0eXBlcyBpbiBhdHRyaWJ1dGUgc3RhdHMgaW1wb3J0IHF1ZXJ5 ICovCi1zdGF0aWMgY29uc3QgT2lkIGF0dGltcG9ydF9hcmd0eXBlc1tBVFRJTVBPUlRfU1FMX05V TV9GSUVMRFNdID0KLXsKLQlJTlQ0T0lELCBURVhUT0lELCBURVhUT0lELCBJTlQyT0lELAotCVRF WFRPSUQsIFRFWFRPSUQsIFRFWFRPSUQsIFRFWFRPSUQsCi0JVEVYVE9JRCwgVEVYVE9JRCwgVEVY VE9JRCwgVEVYVE9JRCwKLQlURVhUT0lELCBURVhUT0lELCBURVhUT0lELCBURVhUT0lELAotCVRF WFRPSUQsCi19OwotCi0vKgotICogVGhlIG1hcHBpbmcgb2YgYXR0cmlidXRlIHN0YXRzIHF1ZXJ5 IGNvbHVtbnMgdG8gdGhlIHBvc2l0aW9uYWwgYXJndW1lbnRzIGluCi0gKiB0aGUgcHJlcGFyZWQg cGdfcmVzdG9yZV9hdHRyaWJ1dGVfc3RhdHMoKSBzdGF0ZW1lbnQuCi0gKi8KLXR5cGVkZWYgc3Ry dWN0Ci17Ci0JZW51bSBBdHRTdGF0c0NvbHVtbnMgcmVzX2ZpZWxkOwotCWVudW0gQXR0SW1wb3J0 U3FsQXJncyBhcmdfbnVtOwotfSBBdHRyUmVzdWx0QXJnTWFwOwotCi0jZGVmaW5lIE5VTV9NQVBQ RURfQVRUSU1QT1JUX0FSR1MgMTMKLQotc3RhdGljIGNvbnN0IEF0dHJSZXN1bHRBcmdNYXAgYXR0 cl9yZXN1bHRfYXJnX21hcFtOVU1fTUFQUEVEX0FUVElNUE9SVF9BUkdTXSA9Ci17Ci0Je0FUVFNU QVRTX05VTExfRlJBQywgQVRUSU1QT1JUX1NRTF9OVUxMX0ZSQUN9LAotCXtBVFRTVEFUU19BVkdf V0lEVEgsIEFUVElNUE9SVF9TUUxfQVZHX1dJRFRIfSwKLQl7QVRUU1RBVFNfTl9ESVNUSU5DVCwg QVRUSU1QT1JUX1NRTF9OX0RJU1RJTkNUfSwKLQl7QVRUU1RBVFNfTU9TVF9DT01NT05fVkFMUywg QVRUSU1QT1JUX1NRTF9NT1NUX0NPTU1PTl9WQUxTfSwKLQl7QVRUU1RBVFNfTU9TVF9DT01NT05f RlJFUVMsIEFUVElNUE9SVF9TUUxfTU9TVF9DT01NT05fRlJFUVN9LAotCXtBVFRTVEFUU19ISVNU T0dSQU1fQk9VTkRTLCBBVFRJTVBPUlRfU1FMX0hJU1RPR1JBTV9CT1VORFN9LAotCXtBVFRTVEFU U19DT1JSRUxBVElPTiwgQVRUSU1QT1JUX1NRTF9DT1JSRUxBVElPTn0sCi0Je0FUVFNUQVRTX01P U1RfQ09NTU9OX0VMRU1TLCBBVFRJTVBPUlRfU1FMX01PU1RfQ09NTU9OX0VMRU1TfSwKLQl7QVRU U1RBVFNfTU9TVF9DT01NT05fRUxFTV9GUkVRUywgQVRUSU1QT1JUX1NRTF9NT1NUX0NPTU1PTl9F TEVNX0ZSRVFTfSwKLQl7QVRUU1RBVFNfRUxFTV9DT1VOVF9ISVNUT0dSQU0sIEFUVElNUE9SVF9T UUxfRUxFTV9DT1VOVF9ISVNUT0dSQU19LAotCXtBVFRTVEFUU19SQU5HRV9MRU5HVEhfSElTVE9H UkFNLCBBVFRJTVBPUlRfU1FMX1JBTkdFX0xFTkdUSF9ISVNUT0dSQU19LAotCXtBVFRTVEFUU19S QU5HRV9FTVBUWV9GUkFDLCBBVFRJTVBPUlRfU1FMX1JBTkdFX0VNUFRZX0ZSQUN9LAotCXtBVFRT VEFUU19SQU5HRV9CT1VORFNfSElTVE9HUkFNLCBBVFRJTVBPUlRfU1FMX1JBTkdFX0JPVU5EU19I SVNUT0dSQU19LAotfTsKLQotLyogQXR0cmlidXRlIHN0YXRzIGNsZWFyIHF1ZXJ5ICovCi1zdGF0 aWMgY29uc3QgY2hhciAqYXR0Y2xlYXJfc3FsID0KLSJTRUxFQ1QgcGdfY2F0YWxvZy5wZ19jbGVh cl9hdHRyaWJ1dGVfc3RhdHMoJDEsICQyLCAkMywgZmFsc2UpIjsKLQotLyogQXJndW1lbnQgb3Jk ZXIgaW4gYXR0cmlidXRlIHN0YXRzIGNsZWFyIHF1ZXJ5ICovCi1lbnVtIEF0dENsZWFyU3FsQXJn cwotewotCUFUVENMRUFSX1NRTF9TQ0hFTUFOQU1FID0gMCwKLQlBVFRDTEVBUl9TUUxfUkVMTkFN RSwKLQlBVFRDTEVBUl9TUUxfQVRUTkFNRSwKLQlBVFRDTEVBUl9TUUxfTlVNX0ZJRUxEUwotfTsK LQotLyogQXJndW1lbnQgdHlwZXMgaW4gYXR0cmlidXRlIHN0YXRzIGNsZWFyIHF1ZXJ5ICovCi1z dGF0aWMgY29uc3QgT2lkIGF0dGNsZWFyX2FyZ3R5cGVzW0FUVENMRUFSX1NRTF9OVU1fRklFTERT XSA9Ci17Ci0JVEVYVE9JRCwgVEVYVE9JRCwgVEVYVE9JRCwKLX07Ci0KIC8qCiAgKiBTUUwgZnVu Y3Rpb25zCiAgKi8KQEAgLTcxNCwxNCArNTgzLDEzIEBAIHN0YXRpYyBib29sIG1hdGNoX2F0dHJt YXAoUEdyZXN1bHQgKnJlcywKIAkJCQkJCSAgY29uc3QgY2hhciAqcmVtb3RlX3JlbG5hbWUsCiAJ CQkJCQkgIGludCBhdHRyY250LAogCQkJCQkJICBSZW1vdGVBdHRyaWJ1dGVNYXBwaW5nICpyZW1h dHRybWFwKTsKLXN0YXRpYyBib29sIGltcG9ydF9mZXRjaGVkX3N0YXRpc3RpY3MoY29uc3QgY2hh ciAqc2NoZW1hbmFtZSwKK3N0YXRpYyBib29sIGltcG9ydF9mZXRjaGVkX3N0YXRpc3RpY3MoUmVs YXRpb24gcmVsYXRpb24sCisJCQkJCQkJCQkgIGNvbnN0IGNoYXIgKnNjaGVtYW5hbWUsCiAJCQkJ CQkJCQkgIGNvbnN0IGNoYXIgKnJlbG5hbWUsCiAJCQkJCQkJCQkgIGludCBhdHRyY250LAogCQkJ CQkJCQkJICBjb25zdCBSZW1vdGVBdHRyaWJ1dGVNYXBwaW5nICpyZW1hdHRybWFwLAogCQkJCQkJ CQkJICBSZW1vdGVTdGF0c1Jlc3VsdHMgKnJlbXN0YXRzKTsKLXN0YXRpYyB2b2lkIG1hcF9maWVs ZF90b19hcmcoUEdyZXN1bHQgKnJlcywgaW50IHJvdywgaW50IGZpZWxkLAotCQkJCQkJCSBpbnQg YXJnLCBEYXR1bSAqdmFsdWVzLCBjaGFyICpudWxscyk7Ci1zdGF0aWMgYm9vbCBpbXBvcnRfc3Bp X3F1ZXJ5X29rKHZvaWQpOworc3RhdGljIGNoYXIgKmdldF9vcHRfdmFsdWUoUEdyZXN1bHQgKnJl cywgaW50IHJvdywgaW50IGNvbCk7CiBzdGF0aWMgdm9pZCBwcm9kdWNlX3R1cGxlX2FzeW5jaHJv bm91c2x5KEFzeW5jUmVxdWVzdCAqYXJlcSwgYm9vbCBmZXRjaCk7CiBzdGF0aWMgdm9pZCBmZXRj aF9tb3JlX2RhdGFfYmVnaW4oQXN5bmNSZXF1ZXN0ICphcmVxKTsKIHN0YXRpYyB2b2lkIGNvbXBs ZXRlX3BlbmRpbmdfcmVxdWVzdChBc3luY1JlcXVlc3QgKmFyZXEpOwpAQCAtNTY2MSw3ICs1NTI5 LDcgQEAgcG9zdGdyZXNJbXBvcnRGb3JlaWduU3RhdGlzdGljcyhSZWxhdGlvbiByZWxhdGlvbiwg TGlzdCAqdmFfY29scywgaW50IGVsZXZlbCkKIAkJCQkJCQkJICZhdHRyY250LCAmcmVtYXR0cm1h cCwgJnJlbXN0YXRzKTsKIAogCWlmIChvaykKLQkJb2sgPSBpbXBvcnRfZmV0Y2hlZF9zdGF0aXN0 aWNzKHNjaGVtYW5hbWUsIHJlbG5hbWUsCisJCW9rID0gaW1wb3J0X2ZldGNoZWRfc3RhdGlzdGlj cyhyZWxhdGlvbiwgc2NoZW1hbmFtZSwgcmVsbmFtZSwKIAkJCQkJCQkJCSAgIGF0dHJjbnQsIHJl bWF0dHJtYXAsICZyZW1zdGF0cyk7CiAKIAlpZiAob2spCkBAIC01NzI1LDcgKzU1OTMsNyBAQCBm ZXRjaF9yZW1vdGVfc3RhdGlzdGljcyhSZWxhdGlvbiByZWxhdGlvbiwKIAkgKi8KIAl1c2VyID0g R2V0VXNlck1hcHBpbmcoR2V0VXNlcklkKCksIHRhYmxlLT5zZXJ2ZXJpZCk7CiAJY29ubiA9IEdl dENvbm5lY3Rpb24odXNlciwgZmFsc2UsIE5VTEwpOwotCXJlbXN0YXRzLT5zZXJ2ZXJfdmVyc2lv bl9udW0gPSBzZXJ2ZXJfdmVyc2lvbl9udW0gPSBQUXNlcnZlclZlcnNpb24oY29ubik7CisJc2Vy dmVyX3ZlcnNpb25fbnVtID0gUFFzZXJ2ZXJWZXJzaW9uKGNvbm4pOwogCiAJLyogRmV0Y2ggcmVs YXRpb24gc3RhdHMuICovCiAJcmVtc3RhdHMtPnJlbCA9IHJlbHN0YXRzID0gZmV0Y2hfcmVsc3Rh dHMoY29ubiwgcmVsYXRpb24pOwpAQCAtNjEyOCw1OCArNTk5NiwzMSBAQCBtYXRjaF9hdHRybWFw KFBHcmVzdWx0ICpyZXMsCiAgKiBJbXBvcnQgZmV0Y2hlZCBzdGF0aXN0aWNzIGludG8gdGhlIGxv Y2FsIHN0YXRpc3RpY3MgdGFibGVzLgogICovCiBzdGF0aWMgYm9vbAotaW1wb3J0X2ZldGNoZWRf c3RhdGlzdGljcyhjb25zdCBjaGFyICpzY2hlbWFuYW1lLAoraW1wb3J0X2ZldGNoZWRfc3RhdGlz dGljcyhSZWxhdGlvbiByZWxhdGlvbiwKKwkJCQkJCSAgY29uc3QgY2hhciAqc2NoZW1hbmFtZSwK IAkJCQkJCSAgY29uc3QgY2hhciAqcmVsbmFtZSwKIAkJCQkJCSAgaW50IGF0dHJjbnQsCiAJCQkJ CQkgIGNvbnN0IFJlbW90ZUF0dHJpYnV0ZU1hcHBpbmcgKnJlbWF0dHJtYXAsCiAJCQkJCQkgIFJl bW90ZVN0YXRzUmVzdWx0cyAqcmVtc3RhdHMpCiB7Ci0JU1BJUGxhblB0cglhdHRpbXBvcnRfcGxh biA9IE5VTEw7Ci0JU1BJUGxhblB0cglhdHRjbGVhcl9wbGFuID0gTlVMTDsKLQlEYXR1bQkJdmFs dWVzW0FUVElNUE9SVF9TUUxfTlVNX0ZJRUxEU107Ci0JY2hhcgkJbnVsbHNbQVRUSU1QT1JUX1NR TF9OVU1fRklFTERTXTsKLQlpbnQJCQlzcGlyYzsKLQlib29sCQlvayA9IGZhbHNlOwotCi0JLyog QXNzaWduIGFsbCB0aGUgaW52YXJpYW50IHBhcmFtZXRlcnMgY29tbW9uIHRvIHJlbGF0aW9uL2F0 dHJpYnV0ZSBzdGF0cyAqLwotCXZhbHVlc1tBVFRJTVBPUlRfU1FMX1ZFUlNJT05dID0gSW50MzJH ZXREYXR1bShyZW1zdGF0cy0+c2VydmVyX3ZlcnNpb25fbnVtKTsKLQludWxsc1tBVFRJTVBPUlRf U1FMX1ZFUlNJT05dID0gJyAnOwotCi0JdmFsdWVzW0FUVElNUE9SVF9TUUxfU0NIRU1BTkFNRV0g PSBDU3RyaW5nR2V0VGV4dERhdHVtKHNjaGVtYW5hbWUpOwotCW51bGxzW0FUVElNUE9SVF9TUUxf U0NIRU1BTkFNRV0gPSAnICc7Ci0KLQl2YWx1ZXNbQVRUSU1QT1JUX1NRTF9SRUxOQU1FXSA9IENT dHJpbmdHZXRUZXh0RGF0dW0ocmVsbmFtZSk7Ci0JbnVsbHNbQVRUSU1QT1JUX1NRTF9SRUxOQU1F XSA9ICcgJzsKLQotCVNQSV9jb25uZWN0KCk7CisJUEdyZXN1bHQgICAqcmVzOworCU51bGxhYmxl RGF0dW0gYXJnc1tBVFRTVEFUU19OVU1fRklFTERTIC0gMV07CiAKIAkvKgogCSAqIFdlIGltcG9y dCBhdHRyaWJ1dGUgc3RhdGlzdGljcyBmaXJzdCwgaWYgYW55LCBiZWNhdXNlIHRob3NlIGFyZSBt b3JlCiAJICogcHJvbmUgdG8gZXJyb3JzLiAgVGhpcyBhdm9pZHMgbWFraW5nIGEgbW9kaWZpY2F0 aW9uIG9mIHBnX2NsYXNzIHRoYXQKIAkgKiB3aWxsIGp1c3QgZ2V0IHJvbGxlZCBiYWNrIGJ5IGEg ZmFpbGVkIGF0dHJpYnV0ZSBpbXBvcnQuCiAJICovCi0JaWYgKHJlbXN0YXRzLT5hdHQgIT0gTlVM TCkKKwlyZXMgPSByZW1zdGF0cy0+YXR0OworCWlmIChyZXMgIT0gTlVMTCkKIAl7Ci0JCUFzc2Vy dChQUW5maWVsZHMocmVtc3RhdHMtPmF0dCkgPT0gQVRUU1RBVFNfTlVNX0ZJRUxEUyk7Ci0JCUFz c2VydChQUW50dXBsZXMocmVtc3RhdHMtPmF0dCkgPj0gMSk7Ci0KLQkJYXR0aW1wb3J0X3BsYW4g PSBTUElfcHJlcGFyZShhdHRpbXBvcnRfc3FsLCBBVFRJTVBPUlRfU1FMX05VTV9GSUVMRFMsCi0J CQkJCQkJCQkgKE9pZCAqKSBhdHRpbXBvcnRfYXJndHlwZXMpOwotCQlpZiAoYXR0aW1wb3J0X3Bs YW4gPT0gTlVMTCkKLQkJCWVsb2coRVJST1IsICJmYWlsZWQgdG8gcHJlcGFyZSBhdHRpbXBvcnRf c3FsIHF1ZXJ5Iik7Ci0KLQkJYXR0Y2xlYXJfcGxhbiA9IFNQSV9wcmVwYXJlKGF0dGNsZWFyX3Nx bCwgQVRUQ0xFQVJfU1FMX05VTV9GSUVMRFMsCi0JCQkJCQkJCQkoT2lkICopIGF0dGNsZWFyX2Fy Z3R5cGVzKTsKLQkJaWYgKGF0dGNsZWFyX3BsYW4gPT0gTlVMTCkKLQkJCWVsb2coRVJST1IsICJm YWlsZWQgdG8gcHJlcGFyZSBhdHRjbGVhcl9zcWwgcXVlcnkiKTsKLQotCQludWxsc1tBVFRJTVBP UlRfU1FMX0FUVE5VTV0gPSAnICc7CisJCUFzc2VydChQUW5maWVsZHMocmVzKSA9PSBBVFRTVEFU U19OVU1fRklFTERTKTsKKwkJQXNzZXJ0KFBRbnR1cGxlcyhyZXMpID49IDEpOwogCiAJCWZvciAo aW50IG1hcGlkeCA9IDA7IG1hcGlkeCA8IGF0dHJjbnQ7IG1hcGlkeCsrKQogCQl7CiAJCQlpbnQJ CQlyb3cgPSByZW1hdHRybWFwW21hcGlkeF0ucmVzX2luZGV4OwotCQkJRGF0dW0JICAgKnZhbHVl czIgPSB2YWx1ZXMgKyAxOwotCQkJY2hhcgkgICAqbnVsbHMyID0gbnVsbHMgKyAxOworCQkJQXR0 ck51bWJlcglhdHRudW0gPSByZW1hdHRybWFwW21hcGlkeF0ubG9jYWxfYXR0bnVtOwogCiAJCQkv KiBBbGwgbWFwcGluZ3Mgc2hvdWxkIGhhdmUgYmVlbiBhc3NpZ25lZCBhIHJlc3VsdCBzZXQgcm93 LiAqLwogCQkJQXNzZXJ0KHJvdyA+PSAwKTsKQEAgLTYxOTEsMTI4ICs2MDMyLDkwIEBAIGltcG9y dF9mZXRjaGVkX3N0YXRpc3RpY3MoY29uc3QgY2hhciAqc2NoZW1hbmFtZSwKIAogCQkJLyoKIAkJ CSAqIEZpcnN0LCBjbGVhciBleGlzdGluZyBhdHRyaWJ1dGUgc3RhdHMuCi0JCQkgKgotCQkJICog V2UgY2FuIHJlLXVzZSB0aGUgdmFsdWVzL251bGxzIGJlY2F1c2UgdGhlIG51bWJlciBvZiBwYXJh bWV0ZXJzCi0JCQkgKiBpcyBsZXNzIGFuZCB0aGUgZmlyc3QgdHdvIHBhcmFtcyBhcmUgdGhlIHNh bWUgYXMgdGhlIHNlY29uZCBhbmQKLQkJCSAqIHRoaXJkIG9uZXMgaW4gYXR0aW1wb3J0X3NxbC4K IAkJCSAqLwotCQkJdmFsdWVzMltBVFRDTEVBUl9TUUxfQVRUTkFNRV0gPQotCQkJCUNTdHJpbmdH ZXRUZXh0RGF0dW0ocmVtYXR0cm1hcFttYXBpZHhdLmxvY2FsX2F0dG5hbWUpOwotCi0JCQlzcGly YyA9IFNQSV9leGVjdXRlX3BsYW4oYXR0Y2xlYXJfcGxhbiwgdmFsdWVzMiwgbnVsbHMyLCBmYWxz ZSwgMSk7Ci0JCQlpZiAoc3BpcmMgIT0gU1BJX09LX1NFTEVDVCkKLQkJCQllbG9nKEVSUk9SLCAi ZmFpbGVkIHRvIGV4ZWN1dGUgYXR0Y2xlYXJfc3FsIHF1ZXJ5IGZvciBjb2x1bW4gXCIlc1wiIG9m IGZvcmVpZ24gdGFibGUgXCIlcy4lc1wiIiwKLQkJCQkJIHJlbWF0dHJtYXBbbWFwaWR4XS5sb2Nh bF9hdHRuYW1lLCBzY2hlbWFuYW1lLCByZWxuYW1lKTsKLQotCQkJdmFsdWVzW0FUVElNUE9SVF9T UUxfQVRUTlVNXSA9Ci0JCQkJSW50MTZHZXREYXR1bShyZW1hdHRybWFwW21hcGlkeF0ubG9jYWxf YXR0bnVtKTsKLQotCQkJLyogTG9vcCB0aHJvdWdoIGFsbCBtYXBwYWJsZSBjb2x1bW5zIHRvIHNl dCByZW1haW5pbmcgYXJndW1lbnRzICovCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IE5VTV9NQVBQ RURfQVRUSU1QT1JUX0FSR1M7IGkrKykKLQkJCQltYXBfZmllbGRfdG9fYXJnKHJlbXN0YXRzLT5h dHQsIHJvdywKLQkJCQkJCQkJIGF0dHJfcmVzdWx0X2FyZ19tYXBbaV0ucmVzX2ZpZWxkLAotCQkJ CQkJCQkgYXR0cl9yZXN1bHRfYXJnX21hcFtpXS5hcmdfbnVtLAotCQkJCQkJCQkgdmFsdWVzLCBu dWxscyk7Ci0KLQkJCXNwaXJjID0gU1BJX2V4ZWN1dGVfcGxhbihhdHRpbXBvcnRfcGxhbiwgdmFs dWVzLCBudWxscywgZmFsc2UsIDEpOwotCQkJaWYgKHNwaXJjICE9IFNQSV9PS19TRUxFQ1QpCi0J CQkJZWxvZyhFUlJPUiwgImZhaWxlZCB0byBleGVjdXRlIGF0dGltcG9ydF9zcWwgcXVlcnkgZm9y IGNvbHVtbiBcIiVzXCIgb2YgZm9yZWlnbiB0YWJsZSBcIiVzLiVzXCIiLAotCQkJCQkgcmVtYXR0 cm1hcFttYXBpZHhdLmxvY2FsX2F0dG5hbWUsIHNjaGVtYW5hbWUsIHJlbG5hbWUpOwotCi0JCQlp ZiAoIWltcG9ydF9zcGlfcXVlcnlfb2soKSkKKwkJCWRlbGV0ZV9hdHRyaWJ1dGVfc3RhdGlzdGlj cyhyZWxhdGlvbiwgYXR0bnVtLCBmYWxzZSk7CisKKwkJCXN0YXRzX3NldF9mbG9hdF9hcmcoJmFy Z3NbMF0sCisJCQkJCQkJCWdldF9vcHRfdmFsdWUocmVzLCByb3csIEFUVFNUQVRTX05VTExfRlJB QykpOworCQkJc3RhdHNfc2V0X2ludDMyX2FyZygmYXJnc1sxXSwKKwkJCQkJCQkJZ2V0X29wdF92 YWx1ZShyZXMsIHJvdywgQVRUU1RBVFNfQVZHX1dJRFRIKSk7CisJCQlzdGF0c19zZXRfZmxvYXRf YXJnKCZhcmdzWzJdLAorCQkJCQkJCQlnZXRfb3B0X3ZhbHVlKHJlcywgcm93LCBBVFRTVEFUU19O X0RJU1RJTkNUKSk7CisJCQlzdGF0c19zZXRfdGV4dF9hcmcoJmFyZ3NbM10sCisJCQkJCQkJICAg Z2V0X29wdF92YWx1ZShyZXMsIHJvdywgQVRUU1RBVFNfTU9TVF9DT01NT05fVkFMUykpOworCQkJ c3RhdHNfc2V0X2Zsb2F0YXJyX2FyZygmYXJnc1s0XSwKKwkJCQkJCQkJICAgZ2V0X29wdF92YWx1 ZShyZXMsIHJvdywgQVRUU1RBVFNfTU9TVF9DT01NT05fRlJFUVMpKTsKKwkJCXN0YXRzX3NldF90 ZXh0X2FyZygmYXJnc1s1XSwKKwkJCQkJCQkgICBnZXRfb3B0X3ZhbHVlKHJlcywgcm93LCBBVFRT VEFUU19ISVNUT0dSQU1fQk9VTkRTKSk7CisJCQlzdGF0c19zZXRfZmxvYXRfYXJnKCZhcmdzWzZd LAorCQkJCQkJCQlnZXRfb3B0X3ZhbHVlKHJlcywgcm93LCBBVFRTVEFUU19DT1JSRUxBVElPTikp OworCQkJc3RhdHNfc2V0X3RleHRfYXJnKCZhcmdzWzddLAorCQkJCQkJCSAgIGdldF9vcHRfdmFs dWUocmVzLCByb3csIEFUVFNUQVRTX01PU1RfQ09NTU9OX0VMRU1TKSk7CisJCQlzdGF0c19zZXRf ZmxvYXRhcnJfYXJnKCZhcmdzWzhdLAorCQkJCQkJCQkgICBnZXRfb3B0X3ZhbHVlKHJlcywgcm93 LCBBVFRTVEFUU19NT1NUX0NPTU1PTl9FTEVNX0ZSRVFTKSk7CisJCQlzdGF0c19zZXRfZmxvYXRh cnJfYXJnKCZhcmdzWzldLAorCQkJCQkJCQkgICBnZXRfb3B0X3ZhbHVlKHJlcywgcm93LCBBVFRT VEFUU19FTEVNX0NPVU5UX0hJU1RPR1JBTSkpOworCQkJc3RhdHNfc2V0X3RleHRfYXJnKCZhcmdz WzEwXSwKKwkJCQkJCQkgICBnZXRfb3B0X3ZhbHVlKHJlcywgcm93LCBBVFRTVEFUU19SQU5HRV9M RU5HVEhfSElTVE9HUkFNKSk7CisJCQlzdGF0c19zZXRfZmxvYXRfYXJnKCZhcmdzWzExXSwKKwkJ CQkJCQkJZ2V0X29wdF92YWx1ZShyZXMsIHJvdywgQVRUU1RBVFNfUkFOR0VfRU1QVFlfRlJBQykp OworCQkJc3RhdHNfc2V0X3RleHRfYXJnKCZhcmdzWzEyXSwKKwkJCQkJCQkgICBnZXRfb3B0X3Zh bHVlKHJlcywgcm93LCBBVFRTVEFUU19SQU5HRV9CT1VORFNfSElTVE9HUkFNKSk7CisKKwkJCWlm ICghaW1wb3J0X2F0dHJpYnV0ZV9zdGF0aXN0aWNzKHJlbGF0aW9uLCBhdHRudW0sIGZhbHNlLAor CQkJCQkJCQkJCQkgJmFyZ3NbMF0sICZhcmdzWzFdLCAmYXJnc1syXSwKKwkJCQkJCQkJCQkJICZh cmdzWzNdLCAmYXJnc1s0XSwgJmFyZ3NbNV0sCisJCQkJCQkJCQkJCSAmYXJnc1s2XSwgJmFyZ3Nb N10sICZhcmdzWzhdLAorCQkJCQkJCQkJCQkgJmFyZ3NbOV0sICZhcmdzWzEwXSwgJmFyZ3NbMTFd LAorCQkJCQkJCQkJCQkgJmFyZ3NbMTJdKSkKIAkJCXsKIAkJCQllcmVwb3J0KFdBUk5JTkcsCiAJ CQkJCQllcnJtc2coImNvdWxkIG5vdCBpbXBvcnQgc3RhdGlzdGljcyBmb3IgZm9yZWlnbiB0YWJs ZSBcIiVzLiVzXCIgLS0tIGF0dHJpYnV0ZSBzdGF0aXN0aWNzIGltcG9ydCBmYWlsZWQgZm9yIGNv bHVtbiBcIiVzXCIgb2YgdGhpcyBmb3JlaWduIHRhYmxlIiwKIAkJCQkJCQkgICBzY2hlbWFuYW1l LCByZWxuYW1lLAogCQkJCQkJCSAgIHJlbWF0dHJtYXBbbWFwaWR4XS5sb2NhbF9hdHRuYW1lKSk7 Ci0JCQkJZ290byBpbXBvcnRfY2xlYW51cDsKKwkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CiAJCX0K IAl9CiAKIAkvKgotCSAqIEltcG9ydCByZWxhdGlvbiBzdGF0cy4gIFdlIG9ubHkgcGVyZm9ybSB0 aGlzIG9uY2UsIHNvIHRoZXJlIGlzIG5vIHBvaW50Ci0JICogaW4gcHJlcGFyaW5nIHRoZSBzdGF0 ZW1lbnQuCi0JICoKLQkgKiBXZSBjYW4gcmUtdXNlIHRoZSB2YWx1ZXMvbnVsbHMgYmVjYXVzZSB0 aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaXMgbGVzcwotCSAqIGFuZCB0aGUgZmlyc3QgdGhyZWUg cGFyYW1zIGFyZSB0aGUgc2FtZSBhcyBhdHRpbXBvcnRfc3FsLgotCSAqLwotCUFzc2VydChyZW1z dGF0cy0+cmVsICE9IE5VTEwpOwotCUFzc2VydChQUW5maWVsZHMocmVtc3RhdHMtPnJlbCkgPT0g UkVMU1RBVFNfTlVNX0ZJRUxEUyk7Ci0JQXNzZXJ0KFBRbnR1cGxlcyhyZW1zdGF0cy0+cmVsKSA9 PSAxKTsKLQltYXBfZmllbGRfdG9fYXJnKHJlbXN0YXRzLT5yZWwsIDAsIFJFTFNUQVRTX1JFTFBB R0VTLAotCQkJCQkgUkVMSU1QT1JUX1NRTF9SRUxQQUdFUywgdmFsdWVzLCBudWxscyk7Ci0JbWFw X2ZpZWxkX3RvX2FyZyhyZW1zdGF0cy0+cmVsLCAwLCBSRUxTVEFUU19SRUxUVVBMRVMsCi0JCQkJ CSBSRUxJTVBPUlRfU1FMX1JFTFRVUExFUywgdmFsdWVzLCBudWxscyk7Ci0KLQlzcGlyYyA9IFNQ SV9leGVjdXRlX3dpdGhfYXJncyhyZWxpbXBvcnRfc3FsLAotCQkJCQkJCQkgIFJFTElNUE9SVF9T UUxfTlVNX0ZJRUxEUywKLQkJCQkJCQkJICAoT2lkICopIHJlbGltcG9ydF9hcmd0eXBlcywKLQkJ CQkJCQkJICB2YWx1ZXMsIG51bGxzLCBmYWxzZSwgMSk7Ci0JaWYgKHNwaXJjICE9IFNQSV9PS19T RUxFQ1QpCi0JCWVsb2coRVJST1IsICJmYWlsZWQgdG8gZXhlY3V0ZSByZWxpbXBvcnRfc3FsIHF1 ZXJ5IGZvciBmb3JlaWduIHRhYmxlIFwiJXMuJXNcIiIsCi0JCQkgc2NoZW1hbmFtZSwgcmVsbmFt ZSk7Ci0KLQlpZiAoIWltcG9ydF9zcGlfcXVlcnlfb2soKSkKKwkgKiBJbXBvcnQgcmVsYXRpb24g c3RhdHMuCisJICovCisJcmVzID0gcmVtc3RhdHMtPnJlbDsKKwlBc3NlcnQocmVzICE9IE5VTEwp OworCUFzc2VydChQUW5maWVsZHMocmVzKSA9PSBSRUxTVEFUU19OVU1fRklFTERTKTsKKwlBc3Nl cnQoUFFudHVwbGVzKHJlcykgPT0gMSk7CisKKwlzdGF0c19zZXRfdWludDMyX2FyZygmYXJnc1sw XSwgZ2V0X29wdF92YWx1ZShyZXMsIDAsIFJFTFNUQVRTX1JFTFBBR0VTKSk7CisJQXNzZXJ0KCFh cmdzWzBdLmlzbnVsbCk7CisJc3RhdHNfc2V0X2Zsb2F0X2FyZygmYXJnc1sxXSwgZ2V0X29wdF92 YWx1ZShyZXMsIDAsIFJFTFNUQVRTX1JFTFRVUExFUykpOworCUFzc2VydCghYXJnc1sxXS5pc251 bGwpOworCWFyZ3NbMl0udmFsdWUgPSAoRGF0dW0pIDA7CisJYXJnc1syXS5pc251bGwgPSB0cnVl OworCWFyZ3NbM10udmFsdWUgPSAoRGF0dW0pIDA7CisJYXJnc1szXS5pc251bGwgPSB0cnVlOwor CisJaWYgKCFpbXBvcnRfcmVsYXRpb25fc3RhdGlzdGljcyhyZWxhdGlvbiwKKwkJCQkJCQkJCSZh cmdzWzBdLCAmYXJnc1sxXSwgJmFyZ3NbMl0sICZhcmdzWzNdKSkKIAl7CiAJCWVyZXBvcnQoV0FS TklORywKIAkJCQllcnJtc2coImNvdWxkIG5vdCBpbXBvcnQgc3RhdGlzdGljcyBmb3IgZm9yZWln biB0YWJsZSBcIiVzLiVzXCIgLS0tIHJlbGF0aW9uIHN0YXRpc3RpY3MgaW1wb3J0IGZhaWxlZCBm b3IgdGhpcyBmb3JlaWduIHRhYmxlIiwKIAkJCQkJICAgc2NoZW1hbmFtZSwgcmVsbmFtZSkpOwot CQlnb3RvIGltcG9ydF9jbGVhbnVwOwotCX0KLQotCW9rID0gdHJ1ZTsKLQotaW1wb3J0X2NsZWFu dXA6Ci0JaWYgKGF0dGltcG9ydF9wbGFuKQotCQlTUElfZnJlZXBsYW4oYXR0aW1wb3J0X3BsYW4p OwotCWlmIChhdHRjbGVhcl9wbGFuKQotCQlTUElfZnJlZXBsYW4oYXR0Y2xlYXJfcGxhbik7Ci0J U1BJX2ZpbmlzaCgpOwotCXJldHVybiBvazsKLX0KLQotLyoKLSAqIE1vdmUgYSBzdHJpbmcgdmFs dWUgZnJvbSBhIHJlc3VsdCBzZXQgdG8gYSBUZXh0IHZhbHVlIG9mIGEgRGF0dW0gYXJyYXkuCi0g Ki8KLXN0YXRpYyB2b2lkCi1tYXBfZmllbGRfdG9fYXJnKFBHcmVzdWx0ICpyZXMsIGludCByb3cs IGludCBmaWVsZCwKLQkJCQkgaW50IGFyZywgRGF0dW0gKnZhbHVlcywgY2hhciAqbnVsbHMpCi17 Ci0JaWYgKFBRZ2V0aXNudWxsKHJlcywgcm93LCBmaWVsZCkpCi0JewotCQl2YWx1ZXNbYXJnXSA9 IChEYXR1bSkgMDsKLQkJbnVsbHNbYXJnXSA9ICduJzsKKwkJcmV0dXJuIGZhbHNlOwogCX0KLQll bHNlCi0JewotCQljb25zdCBjaGFyICpzID0gUFFnZXR2YWx1ZShyZXMsIHJvdywgZmllbGQpOwog Ci0JCXZhbHVlc1thcmddID0gQ1N0cmluZ0dldFRleHREYXR1bShzKTsKLQkJbnVsbHNbYXJnXSA9 ICcgJzsKLQl9CisJcmV0dXJuIHRydWU7CiB9CiAKIC8qCi0gKiBDaGVjayB0aGUgMXgxIHJlc3Vs dCBzZXQgb2YgYSBwZ19yZXN0b3JlXypfc3RhdHMoKSBjb21tYW5kIGZvciBzdWNjZXNzLgorICog Q29uZW5pZW5jZSByb3V0aW5lIHRvIGZldGNoCiAgKi8KLXN0YXRpYyBib29sCi1pbXBvcnRfc3Bp X3F1ZXJ5X29rKHZvaWQpCitzdGF0aWMgY2hhciAqCitnZXRfb3B0X3ZhbHVlKFBHcmVzdWx0ICpy ZXMsIGludCByb3csIGludCBjb2wpCiB7Ci0JVHVwbGVEZXNjCXR1cGRlc2M7Ci0JRGF0dW0JCWRh dDsKLQlib29sCQlpc251bGw7Ci0KLQlBc3NlcnQoU1BJX3R1cHRhYmxlICE9IE5VTEwpOwotCUFz c2VydChTUElfcHJvY2Vzc2VkID09IDEpOwotCi0JdHVwZGVzYyA9IFNQSV90dXB0YWJsZS0+dHVw ZGVzYzsKLQlBc3NlcnQodHVwZGVzYy0+bmF0dHMgPT0gMSk7Ci0JQXNzZXJ0KFR1cGxlRGVzY0F0 dHIodHVwZGVzYywgMCktPmF0dHR5cGlkID09IEJPT0xPSUQpOwotCWRhdCA9IFNQSV9nZXRiaW52 YWwoU1BJX3R1cHRhYmxlLT52YWxzWzBdLCB0dXBkZXNjLCAxLCAmaXNudWxsKTsKLQlBc3NlcnQo IWlzbnVsbCk7Ci0KLQlyZXR1cm4gRGF0dW1HZXRCb29sKGRhdCk7CisJaWYgKFBRZ2V0aXNudWxs KHJlcywgcm93LCBjb2wpKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gUFFnZXR2YWx1ZShyZXMs IHJvdywgY29sKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Nx bC9wb3N0Z3Jlc19mZHcuc3FsIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zk dy5zcWwKaW5kZXggZGZjNThiZWIwZDIuLjBkMDYyMmIzMWNlIDEwMDY0NAotLS0gYS9jb250cmli L3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbAorKysgYi9jb250cmliL3Bvc3RncmVz X2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbApAQCAtNDU4NCw2ICs0NTg0LDM0IEBAIEFOQUxZWkUg ZHRlc3RfdGFibGU7CiAKIEFOQUxZWkUgVkVSQk9TRSBkdGVzdF9mdGFibGU7ICAgICAgICAgICAg IC0tIHNob3VsZCB3b3JrCiAKKy0tIGR0ZXN0X2Z0YWJsZSdzIHN0YXRzIHNob3VsZCBub3cgZXhh Y3RseSBtYXRjaCBkdGVzdF90YWJsZSdzCistLSBjb21wYXJlIHZhbHVlcywgc2hvdWxkIG1hdGNo CitTRUxFQ1QgcmVscGFnZXMsIHJlbHR1cGxlcyBGUk9NIHBnX2NsYXNzCitXSEVSRSBvaWQgPSAn cHVibGljLmR0ZXN0X3RhYmxlJzo6cmVnY2xhc3MKK0VYQ0VQVAorU0VMRUNUIHJlbHBhZ2VzLCBy ZWx0dXBsZXMgRlJPTSBwZ19jbGFzcworV0hFUkUgb2lkID0gJ3B1YmxpYy5kdGVzdF9mdGFibGUn OjpyZWdjbGFzczsKKworLS0gY29tcGFyZSB0aGUgcm93Y291bnRzLCBzaG91bGQgZ2V0IDAgcm93 cyBiYWNrCitTRUxFQ1QgQ09VTlQoKikgRlJPTSBwZ19zdGF0cworV0hFUkUgc2NoZW1hbmFtZSA9 ICdwdWJsaWMnIEFORCB0YWJsZW5hbWUgPSAnZHRlc3RfdGFibGUnCitFWENFUFQKK1NFTEVDVCBD T1VOVCgqKSBGUk9NIHBnX3N0YXRzCitXSEVSRSBzY2hlbWFuYW1lID0gJ3B1YmxpYycgQU5EIHRh YmxlbmFtZSA9ICdkdGVzdF9mdGFibGUnOworCistLSB0ZXN0IG9ubHkgYSBmZXcgc3RhdHMgY29s dW1ucyBjb21tb24gdG8gaW50ZWdlciB0eXBlcworU0VMRUNUIGF0dG5hbWUsIGluaGVyaXRlZCwg bnVsbF9mcmFjLCBhdmdfd2lkdGgsIG5fZGlzdGluY3QsCisgIG1vc3RfY29tbW9uX3ZhbHM6OnRl eHQgYXMgbWN2LCBtb3N0X2NvbW1vbl9mcmVxcywKKyAgaGlzdG9ncmFtX2JvdW5kczo6dGV4dCBh cyBoYiwgY29ycmVsYXRpb24KK0ZST00gcGdfc3RhdHMKK1dIRVJFIHNjaGVtYW5hbWUgPSAncHVi bGljJyBBTkQgdGFibGVuYW1lID0gJ2R0ZXN0X3RhYmxlJworRVhDRVBUCitTRUxFQ1QgYXR0bmFt ZSwgaW5oZXJpdGVkLCBudWxsX2ZyYWMsIGF2Z193aWR0aCwgbl9kaXN0aW5jdCwKKyAgbW9zdF9j b21tb25fdmFsczo6dGV4dCBhcyBtY3YsIG1vc3RfY29tbW9uX2ZyZXFzLAorICBoaXN0b2dyYW1f Ym91bmRzOjp0ZXh0IGFzIGhiLCBjb3JyZWxhdGlvbgorRlJPTSBwZ19zdGF0cworV0hFUkUgc2No ZW1hbmFtZSA9ICdwdWJsaWMnIEFORCB0YWJsZW5hbWUgPSAnZHRlc3RfZnRhYmxlJzsKKwogLS0g Y2xlYW51cAogRFJPUCBGT1JFSUdOIFRBQkxFIHNpbXBvcnRfZnRhYmxlOwogRFJPUCBGT1JFSUdO IFRBQkxFIHNpbXBvcnRfZnZpZXc7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdGF0aXN0aWNz L2F0dHJpYnV0ZV9zdGF0cy5jIGIvc3JjL2JhY2tlbmQvc3RhdGlzdGljcy9hdHRyaWJ1dGVfc3Rh dHMuYwppbmRleCAxY2M0ZDY1NzIzMS4uN2MzMjU5ODYxZWUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL3N0YXRpc3RpY3MvYXR0cmlidXRlX3N0YXRzLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RhdGlz dGljcy9hdHRyaWJ1dGVfc3RhdHMuYwpAQCAtMTA1LDYgKzEwNSwxMSBAQCBzdGF0aWMgc3RydWN0 IFN0YXRzQXJnSW5mbyBjbGVhcmFyZ2luZm9bXSA9CiB9OwogCiBzdGF0aWMgYm9vbCBhdHRyaWJ1 dGVfc3RhdGlzdGljc191cGRhdGUoRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8pOworc3RhdGljIGJv b2wgYXR0cmlidXRlX3N0YXRpc3RpY3NfdXBkYXRlX2ludGVybmFsKE9pZCByZWxvaWQsCisJCQkJ CQkJCQkJCQkgY29uc3QgY2hhciAqYXR0bmFtZSwKKwkJCQkJCQkJCQkJCSBBdHRyTnVtYmVyIGF0 dG51bSwKKwkJCQkJCQkJCQkJCSBib29sIGluaGVyaXRlZCwKKwkJCQkJCQkJCQkJCSBGdW5jdGlv bkNhbGxJbmZvIGZjaW5mbyk7CiBzdGF0aWMgdm9pZCB1cHNlcnRfcGdfc3RhdGlzdGljKFJlbGF0 aW9uIHN0YXJlbCwgSGVhcFR1cGxlIG9sZHR1cCwKIAkJCQkJCQkJY29uc3QgRGF0dW0gKnZhbHVl cywgY29uc3QgYm9vbCAqbnVsbHMsIGNvbnN0IGJvb2wgKnJlcGxhY2VzKTsKIHN0YXRpYyBib29s IGRlbGV0ZV9wZ19zdGF0aXN0aWMoT2lkIHJlbG9pZCwgQXR0ck51bWJlciBhdHRudW0sIGJvb2wg c3RhaW5oZXJpdCk7CkBAIC0xMzYsMzggKzE0MSw2IEBAIGF0dHJpYnV0ZV9zdGF0aXN0aWNzX3Vw ZGF0ZShGdW5jdGlvbkNhbGxJbmZvIGZjaW5mbykKIAlib29sCQlpbmhlcml0ZWQ7CiAJT2lkCQkJ bG9ja2VkX3RhYmxlID0gSW52YWxpZE9pZDsKIAotCVJlbGF0aW9uCXN0YXJlbDsKLQlIZWFwVHVw bGUJc3RhdHVwOwotCi0JT2lkCQkJYXR0dHlwaWQgPSBJbnZhbGlkT2lkOwotCWludDMyCQlhdHR0 eXBtb2Q7Ci0JY2hhcgkJYXR0dHlwdHlwZTsKLQlPaWQJCQlhdHR0eXBjb2xsID0gSW52YWxpZE9p ZDsKLQlPaWQJCQllcV9vcHIgPSBJbnZhbGlkT2lkOwotCU9pZAkJCWx0X29wciA9IEludmFsaWRP aWQ7Ci0KLQlPaWQJCQllbGVtdHlwaWQgPSBJbnZhbGlkT2lkOwotCU9pZAkJCWVsZW1fZXFfb3By ID0gSW52YWxpZE9pZDsKLQotCUZtZ3JJbmZvCWFycmF5X2luX2ZuOwotCi0JYm9vbAkJZG9fbWN2 ID0gIVBHX0FSR0lTTlVMTChNT1NUX0NPTU1PTl9GUkVRU19BUkcpICYmCi0JCSFQR19BUkdJU05V TEwoTU9TVF9DT01NT05fVkFMU19BUkcpOwotCWJvb2wJCWRvX2hpc3RvZ3JhbSA9ICFQR19BUkdJ U05VTEwoSElTVE9HUkFNX0JPVU5EU19BUkcpOwotCWJvb2wJCWRvX2NvcnJlbGF0aW9uID0gIVBH X0FSR0lTTlVMTChDT1JSRUxBVElPTl9BUkcpOwotCWJvb2wJCWRvX21jZWxlbSA9ICFQR19BUkdJ U05VTEwoTU9TVF9DT01NT05fRUxFTVNfQVJHKSAmJgotCQkhUEdfQVJHSVNOVUxMKE1PU1RfQ09N TU9OX0VMRU1fRlJFUVNfQVJHKTsKLQlib29sCQlkb19kZWNoaXN0ID0gIVBHX0FSR0lTTlVMTChF TEVNX0NPVU5UX0hJU1RPR1JBTV9BUkcpOwotCWJvb2wJCWRvX2JvdW5kc19oaXN0b2dyYW0gPSAh UEdfQVJHSVNOVUxMKFJBTkdFX0JPVU5EU19ISVNUT0dSQU1fQVJHKTsKLQlib29sCQlkb19yYW5n ZV9sZW5ndGhfaGlzdG9ncmFtID0gIVBHX0FSR0lTTlVMTChSQU5HRV9MRU5HVEhfSElTVE9HUkFN X0FSRykgJiYKLQkJIVBHX0FSR0lTTlVMTChSQU5HRV9FTVBUWV9GUkFDX0FSRyk7Ci0KLQlEYXR1 bQkJdmFsdWVzW05hdHRzX3BnX3N0YXRpc3RpY10gPSB7MH07Ci0JYm9vbAkJbnVsbHNbTmF0dHNf cGdfc3RhdGlzdGljXSA9IHswfTsKLQlib29sCQlyZXBsYWNlc1tOYXR0c19wZ19zdGF0aXN0aWNd ID0gezB9OwotCi0JYm9vbAkJcmVzdWx0ID0gdHJ1ZTsKLQogCXN0YXRzX2NoZWNrX3JlcXVpcmVk X2FyZyhmY2luZm8sIGF0dGFyZ2luZm8sIEFUVFJFTFNDSEVNQV9BUkcpOwogCXN0YXRzX2NoZWNr X3JlcXVpcmVkX2FyZyhmY2luZm8sIGF0dGFyZ2luZm8sIEFUVFJFTE5BTUVfQVJHKTsKIApAQCAt MjMxLDYgKzIwNCw0NyBAQCBhdHRyaWJ1dGVfc3RhdGlzdGljc191cGRhdGUoRnVuY3Rpb25DYWxs SW5mbyBmY2luZm8pCiAJc3RhdHNfY2hlY2tfcmVxdWlyZWRfYXJnKGZjaW5mbywgYXR0YXJnaW5m bywgSU5IRVJJVEVEX0FSRyk7CiAJaW5oZXJpdGVkID0gUEdfR0VUQVJHX0JPT0woSU5IRVJJVEVE X0FSRyk7CiAKKwlyZXR1cm4gYXR0cmlidXRlX3N0YXRpc3RpY3NfdXBkYXRlX2ludGVybmFsKHJl bG9pZCwgYXR0bmFtZSwgYXR0bnVtLAorCQkJCQkJCQkJCQkJaW5oZXJpdGVkLCBmY2luZm8pOwor fQorCitzdGF0aWMgYm9vbAorYXR0cmlidXRlX3N0YXRpc3RpY3NfdXBkYXRlX2ludGVybmFsKE9p ZCByZWxvaWQsCisJCQkJCQkJCQkgY29uc3QgY2hhciAqYXR0bmFtZSwgQXR0ck51bWJlciBhdHRu dW0sCisJCQkJCQkJCQkgYm9vbCBpbmhlcml0ZWQsIEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvKQor eworCVJlbGF0aW9uCXN0YXJlbDsKKwlIZWFwVHVwbGUJc3RhdHVwOworCisJT2lkCQkJYXR0dHlw aWQgPSBJbnZhbGlkT2lkOworCWludDMyCQlhdHR0eXBtb2Q7CisJY2hhcgkJYXR0dHlwdHlwZTsK KwlPaWQJCQlhdHR0eXBjb2xsID0gSW52YWxpZE9pZDsKKwlPaWQJCQllcV9vcHIgPSBJbnZhbGlk T2lkOworCU9pZAkJCWx0X29wciA9IEludmFsaWRPaWQ7CisKKwlPaWQJCQllbGVtdHlwaWQgPSBJ bnZhbGlkT2lkOworCU9pZAkJCWVsZW1fZXFfb3ByID0gSW52YWxpZE9pZDsKKworCUZtZ3JJbmZv CWFycmF5X2luX2ZuOworCisJYm9vbAkJZG9fbWN2ID0gIVBHX0FSR0lTTlVMTChNT1NUX0NPTU1P Tl9GUkVRU19BUkcpICYmCisJCSFQR19BUkdJU05VTEwoTU9TVF9DT01NT05fVkFMU19BUkcpOwor CWJvb2wJCWRvX2hpc3RvZ3JhbSA9ICFQR19BUkdJU05VTEwoSElTVE9HUkFNX0JPVU5EU19BUkcp OworCWJvb2wJCWRvX2NvcnJlbGF0aW9uID0gIVBHX0FSR0lTTlVMTChDT1JSRUxBVElPTl9BUkcp OworCWJvb2wJCWRvX21jZWxlbSA9ICFQR19BUkdJU05VTEwoTU9TVF9DT01NT05fRUxFTVNfQVJH KSAmJgorCQkhUEdfQVJHSVNOVUxMKE1PU1RfQ09NTU9OX0VMRU1fRlJFUVNfQVJHKTsKKwlib29s CQlkb19kZWNoaXN0ID0gIVBHX0FSR0lTTlVMTChFTEVNX0NPVU5UX0hJU1RPR1JBTV9BUkcpOwor CWJvb2wJCWRvX2JvdW5kc19oaXN0b2dyYW0gPSAhUEdfQVJHSVNOVUxMKFJBTkdFX0JPVU5EU19I SVNUT0dSQU1fQVJHKTsKKwlib29sCQlkb19yYW5nZV9sZW5ndGhfaGlzdG9ncmFtID0gIVBHX0FS R0lTTlVMTChSQU5HRV9MRU5HVEhfSElTVE9HUkFNX0FSRykgJiYKKwkJIVBHX0FSR0lTTlVMTChS QU5HRV9FTVBUWV9GUkFDX0FSRyk7CisKKwlEYXR1bQkJdmFsdWVzW05hdHRzX3BnX3N0YXRpc3Rp Y10gPSB7MH07CisJYm9vbAkJbnVsbHNbTmF0dHNfcGdfc3RhdGlzdGljXSA9IHswfTsKKwlib29s CQlyZXBsYWNlc1tOYXR0c19wZ19zdGF0aXN0aWNdID0gezB9OworCisJYm9vbAkJcmVzdWx0ID0g dHJ1ZTsKKwogCS8qCiAJICogQ2hlY2sgYXJndW1lbnQgc2FuaXR5LiBJZiBzb21lIGFyZ3VtZW50 cyBhcmUgdW51c2FibGUsIGVtaXQgYSBXQVJOSU5HCiAJICogYW5kIHNldCB0aGUgY29ycmVzcG9u ZGluZyBhcmd1bWVudCB0byBOVUxMIGluIGZjaW5mby4KQEAgLTY4OCwzICs3MDIsNzkgQEAgcGdf cmVzdG9yZV9hdHRyaWJ1dGVfc3RhdHMoUEdfRlVOQ1RJT05fQVJHUykKIAogCVBHX1JFVFVSTl9C T09MKHJlc3VsdCk7CiB9CisKKy8qCisgKiBJbXBvcnQgYXR0cmlidXRlIHN0YXRpc3RpY3MgZnJv bSBOdWxsYWJsZURhdHVtIGlucHV0cyBmb3IgYWxsIHN0YXRpdGljYWwKKyAqIHZhbHVlcy4KKyAq LworYm9vbAoraW1wb3J0X2F0dHJpYnV0ZV9zdGF0aXN0aWNzKFJlbGF0aW9uIHJlbCwgQXR0ck51 bWJlciBhdHRudW0sIGJvb2wgaW5oZXJpdGVkLAorCQkJCQkJCWNvbnN0IE51bGxhYmxlRGF0dW0g Km51bGxfZnJhYywKKwkJCQkJCQljb25zdCBOdWxsYWJsZURhdHVtICphdmdfd2lkdGgsCisJCQkJ CQkJY29uc3QgTnVsbGFibGVEYXR1bSAqbl9kaXN0aW5jdCwKKwkJCQkJCQljb25zdCBOdWxsYWJs ZURhdHVtICptb3N0X2NvbW1vbl92YWxzLAorCQkJCQkJCWNvbnN0IE51bGxhYmxlRGF0dW0gKm1v c3RfY29tbW9uX2ZyZXFzLAorCQkJCQkJCWNvbnN0IE51bGxhYmxlRGF0dW0gKmhpc3RvZ3JhbV9i b3VuZHMsCisJCQkJCQkJY29uc3QgTnVsbGFibGVEYXR1bSAqY29ycmVsYXRpb24sCisJCQkJCQkJ Y29uc3QgTnVsbGFibGVEYXR1bSAqbW9zdF9jb21tb25fZWxlbXMsCisJCQkJCQkJY29uc3QgTnVs bGFibGVEYXR1bSAqbW9zdF9jb21tb25fZWxlbV9mcmVxcywKKwkJCQkJCQljb25zdCBOdWxsYWJs ZURhdHVtICplbGVtX2NvdW50X2hpc3RvZ3JhbSwKKwkJCQkJCQljb25zdCBOdWxsYWJsZURhdHVt ICpyYW5nZV9sZW5ndGhfaGlzdG9ncmFtLAorCQkJCQkJCWNvbnN0IE51bGxhYmxlRGF0dW0gKnJh bmdlX2VtcHR5X2ZyYWMsCisJCQkJCQkJY29uc3QgTnVsbGFibGVEYXR1bSAqcmFuZ2VfYm91bmRz X2hpc3RvZ3JhbSkKK3sKKwlMT0NBTF9GQ0lORk8obmV3ZmNpbmZvLCBOVU1fQVRUUklCVVRFX1NU QVRTX0FSR1MpOworCU9pZAkJCXJlbG9pZCA9IFJlbGF0aW9uR2V0UmVsaWQocmVsKTsKKwljaGFy CSAgICpyZWxuYW1lID0gUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKTsKKwljaGFyCSAgICph dHRuYW1lICA9IGdldF9hdHRuYW1lKHJlbG9pZCwgYXR0bnVtLCB0cnVlKTsKKworCUluaXRGdW5j dGlvbkNhbGxJbmZvRGF0YSgqbmV3ZmNpbmZvLCBOVUxMLCBOVU1fQVRUUklCVVRFX1NUQVRTX0FS R1MsCisJCQkJCQkJIEludmFsaWRPaWQsIE5VTEwsIE5VTEwpOworCisJbmV3ZmNpbmZvLT5hcmdz W0FUVFJFTFNDSEVNQV9BUkddLnZhbHVlID0KKwkJQ1N0cmluZ0dldFRleHREYXR1bShnZXRfbmFt ZXNwYWNlX25hbWUoUmVsYXRpb25HZXROYW1lc3BhY2UocmVsKSkpOworCW5ld2ZjaW5mby0+YXJn c1tBVFRSRUxTQ0hFTUFfQVJHXS5pc251bGwgPSBmYWxzZTsKKwluZXdmY2luZm8tPmFyZ3NbQVRU UkVMTkFNRV9BUkddLnZhbHVlID0gQ1N0cmluZ0dldFRleHREYXR1bShyZWxuYW1lKTsKKwluZXdm Y2luZm8tPmFyZ3NbQVRUUkVMTkFNRV9BUkddLmlzbnVsbCA9IGZhbHNlOworCisJLyogYW5ub3lp bmdseSwgZ2V0X2F0dG5hbWUgZG9lc24ndCBjaGVjayBhdHRpc2Ryb3BwZWQgKi8KKwlpZiAoYXR0 bmFtZSA9PSBOVUxMIHx8CisJCSFTZWFyY2hTeXNDYWNoZUV4aXN0c0F0dE5hbWUocmVsb2lkLCBh dHRuYW1lKSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX1VOREVGSU5F RF9DT0xVTU4pLAorCQkJCSBlcnJtc2coImNvbHVtbiAlZCBvZiByZWxhdGlvbiBcIiVzXCIgZG9l cyBub3QgZXhpc3QiLAorCQkJCQkJYXR0bnVtLCByZWxuYW1lKSkpOworCisJbmV3ZmNpbmZvLT5h cmdzW0FUVE5BTUVfQVJHXS52YWx1ZSA9IENTdHJpbmdHZXRUZXh0RGF0dW0oYXR0bmFtZSk7CisJ bmV3ZmNpbmZvLT5hcmdzW0FUVE5BTUVfQVJHXS5pc251bGwgPSBmYWxzZTsKKwluZXdmY2luZm8t PmFyZ3NbQVRUTlVNX0FSR10udmFsdWUgPSBJbnQxNkdldERhdHVtKGF0dG51bSk7CisJbmV3ZmNp bmZvLT5hcmdzW0FUVE5VTV9BUkddLmlzbnVsbCA9IGZhbHNlOworCW5ld2ZjaW5mby0+YXJnc1tJ TkhFUklURURfQVJHXS52YWx1ZSA9IEJvb2xHZXREYXR1bShpbmhlcml0ZWQpOworCW5ld2ZjaW5m by0+YXJnc1tJTkhFUklURURfQVJHXS5pc251bGwgPSBmYWxzZTsKKworCW5ld2ZjaW5mby0+YXJn c1tOVUxMX0ZSQUNfQVJHXSA9ICpudWxsX2ZyYWM7CisJbmV3ZmNpbmZvLT5hcmdzW0FWR19XSURU SF9BUkddID0gKmF2Z193aWR0aDsKKwluZXdmY2luZm8tPmFyZ3NbTl9ESVNUSU5DVF9BUkddID0g Km5fZGlzdGluY3Q7CisJbmV3ZmNpbmZvLT5hcmdzW01PU1RfQ09NTU9OX1ZBTFNfQVJHXSA9ICpt b3N0X2NvbW1vbl92YWxzOworCW5ld2ZjaW5mby0+YXJnc1tNT1NUX0NPTU1PTl9GUkVRU19BUkdd ID0gKm1vc3RfY29tbW9uX2ZyZXFzOworCW5ld2ZjaW5mby0+YXJnc1tISVNUT0dSQU1fQk9VTkRT X0FSR10gPSAqaGlzdG9ncmFtX2JvdW5kczsKKwluZXdmY2luZm8tPmFyZ3NbQ09SUkVMQVRJT05f QVJHXSA9ICpjb3JyZWxhdGlvbjsKKwluZXdmY2luZm8tPmFyZ3NbTU9TVF9DT01NT05fRUxFTVNf QVJHXSA9ICptb3N0X2NvbW1vbl9lbGVtczsKKwluZXdmY2luZm8tPmFyZ3NbTU9TVF9DT01NT05f RUxFTV9GUkVRU19BUkddID0gKm1vc3RfY29tbW9uX2VsZW1fZnJlcXM7CisJbmV3ZmNpbmZvLT5h cmdzW0VMRU1fQ09VTlRfSElTVE9HUkFNX0FSR10gPSAqZWxlbV9jb3VudF9oaXN0b2dyYW07CisJ bmV3ZmNpbmZvLT5hcmdzW1JBTkdFX0xFTkdUSF9ISVNUT0dSQU1fQVJHXSA9ICpyYW5nZV9sZW5n dGhfaGlzdG9ncmFtOworCW5ld2ZjaW5mby0+YXJnc1tSQU5HRV9FTVBUWV9GUkFDX0FSR10gPSAq cmFuZ2VfZW1wdHlfZnJhYzsKKwluZXdmY2luZm8tPmFyZ3NbUkFOR0VfQk9VTkRTX0hJU1RPR1JB TV9BUkddID0gKnJhbmdlX2JvdW5kc19oaXN0b2dyYW07CisKKwlyZXR1cm4gYXR0cmlidXRlX3N0 YXRpc3RpY3NfdXBkYXRlX2ludGVybmFsKHJlbG9pZCwgYXR0bmFtZSwgYXR0bnVtLAorCQkJCQkJ CQkJCQkJaW5oZXJpdGVkLCBuZXdmY2luZm8pOworfQorCisvKgorICogRGVsZXRlIGF0dHJpYnV0 ZSBzdGF0aXN0aWNzLgorICovCitib29sCitkZWxldGVfYXR0cmlidXRlX3N0YXRpc3RpY3MoUmVs YXRpb24gcmVsLCBBdHRyTnVtYmVyIGF0dG51bSwgYm9vbCBpbmhlcml0ZWQpCit7CisJcmV0dXJu IGRlbGV0ZV9wZ19zdGF0aXN0aWMoUmVsYXRpb25HZXRSZWxpZChyZWwpLCBhdHRudW0sIGluaGVy aXRlZCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL3JlbGF0aW9uX3N0 YXRzLmMgYi9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL3JlbGF0aW9uX3N0YXRzLmMKaW5kZXggZDY2 MzFlOWE5YTQuLjE0NDJmZGZjNTg5IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdGF0aXN0aWNz L3JlbGF0aW9uX3N0YXRzLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RhdGlzdGljcy9yZWxhdGlvbl9z dGF0cy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAiY2F0YWxvZy9pbmRleGluZy5oIgog I2luY2x1ZGUgImNhdGFsb2cvbmFtZXNwYWNlLmgiCiAjaW5jbHVkZSAibm9kZXMvbWFrZWZ1bmNz LmgiCisjaW5jbHVkZSAic3RhdGlzdGljcy9zdGF0aXN0aWNzLmgiCiAjaW5jbHVkZSAic3RhdGlz dGljcy9zdGF0X3V0aWxzLmgiCiAjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKICNpbmNsdWRl ICJ1dGlscy9mbWdyb2lkcy5oIgpAQCAtNTcsNiArNTgsOCBAQCBzdGF0aWMgc3RydWN0IFN0YXRz QXJnSW5mbyByZWxhcmdpbmZvW10gPQogfTsKIAogc3RhdGljIGJvb2wgcmVsYXRpb25fc3RhdGlz dGljc191cGRhdGUoRnVuY3Rpb25DYWxsSW5mbyBmY2luZm8pOworc3RhdGljIGJvb2wgcmVsYXRp b25fc3RhdGlzdGljc191cGRhdGVfaW50ZXJuYWwoT2lkIHJlbG9pZCwKKwkJCQkJCQkJCQkJCUZ1 bmN0aW9uQ2FsbEluZm8gZmNpbmZvKTsKIAogLyoKICAqIEludGVybmFsIGZ1bmN0aW9uIGZvciBt b2RpZnlpbmcgc3RhdGlzdGljcyBmb3IgYSByZWxhdGlvbi4KQEAgLTY0LDI1ICs2Nyw5IEBAIHN0 YXRpYyBib29sIHJlbGF0aW9uX3N0YXRpc3RpY3NfdXBkYXRlKEZ1bmN0aW9uQ2FsbEluZm8gZmNp bmZvKTsKIHN0YXRpYyBib29sCiByZWxhdGlvbl9zdGF0aXN0aWNzX3VwZGF0ZShGdW5jdGlvbkNh bGxJbmZvIGZjaW5mbykKIHsKLQlib29sCQlyZXN1bHQgPSB0cnVlOwogCWNoYXIJICAgKm5zcG5h bWU7CiAJY2hhcgkgICAqcmVsbmFtZTsKIAlPaWQJCQlyZWxvaWQ7Ci0JUmVsYXRpb24JY3JlbDsK LQlCbG9ja051bWJlciByZWxwYWdlcyA9IDA7Ci0JYm9vbAkJdXBkYXRlX3JlbHBhZ2VzID0gZmFs c2U7Ci0JZmxvYXQJCXJlbHR1cGxlcyA9IDA7Ci0JYm9vbAkJdXBkYXRlX3JlbHR1cGxlcyA9IGZh bHNlOwotCUJsb2NrTnVtYmVyIHJlbGFsbHZpc2libGUgPSAwOwotCWJvb2wJCXVwZGF0ZV9yZWxh bGx2aXNpYmxlID0gZmFsc2U7Ci0JQmxvY2tOdW1iZXIgcmVsYWxsZnJvemVuID0gMDsKLQlib29s CQl1cGRhdGVfcmVsYWxsZnJvemVuID0gZmFsc2U7Ci0JSGVhcFR1cGxlCWN0dXA7Ci0JRm9ybV9w Z19jbGFzcyBwZ2Nmb3JtOwotCWludAkJCXJlcGxhY2VzWzRdID0gezB9OwotCURhdHVtCQl2YWx1 ZXNbNF0gPSB7MH07Ci0JYm9vbAkJbnVsbHNbNF0gPSB7MH07Ci0JaW50CQkJbnJlcGxhY2VzID0g MDsKIAlPaWQJCQlsb2NrZWRfdGFibGUgPSBJbnZhbGlkT2lkOwogCiAJc3RhdHNfY2hlY2tfcmVx dWlyZWRfYXJnKGZjaW5mbywgcmVsYXJnaW5mbywgUkVMU0NIRU1BX0FSRyk7CkBAIC0xMDEsNiAr ODgsMjkgQEAgcmVsYXRpb25fc3RhdGlzdGljc191cGRhdGUoRnVuY3Rpb25DYWxsSW5mbyBmY2lu Zm8pCiAJCQkJCQkJCQkgIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jaywgMCwKIAkJCQkJCQkJCSAg UmFuZ2VWYXJDYWxsYmFja0ZvclN0YXRzLCAmbG9ja2VkX3RhYmxlKTsKIAorCXJldHVybiByZWxh dGlvbl9zdGF0aXN0aWNzX3VwZGF0ZV9pbnRlcm5hbChyZWxvaWQsIGZjaW5mbyk7Cit9CisKK3N0 YXRpYyBib29sCityZWxhdGlvbl9zdGF0aXN0aWNzX3VwZGF0ZV9pbnRlcm5hbChPaWQgcmVsb2lk LCBGdW5jdGlvbkNhbGxJbmZvIGZjaW5mbykKK3sKKwlCbG9ja051bWJlciByZWxwYWdlcyA9IDA7 CisJYm9vbAkJdXBkYXRlX3JlbHBhZ2VzID0gZmFsc2U7CisJZmxvYXQJCXJlbHR1cGxlcyA9IDA7 CisJYm9vbAkJdXBkYXRlX3JlbHR1cGxlcyA9IGZhbHNlOworCUJsb2NrTnVtYmVyIHJlbGFsbHZp c2libGUgPSAwOworCWJvb2wJCXVwZGF0ZV9yZWxhbGx2aXNpYmxlID0gZmFsc2U7CisJQmxvY2tO dW1iZXIgcmVsYWxsZnJvemVuID0gMDsKKwlib29sCQl1cGRhdGVfcmVsYWxsZnJvemVuID0gZmFs c2U7CisJUmVsYXRpb24JY3JlbDsKKwlIZWFwVHVwbGUJY3R1cDsKKwlGb3JtX3BnX2NsYXNzIHBn Y2Zvcm07CisJaW50CQkJcmVwbGFjZXNbNF0gPSB7MH07CisJRGF0dW0JCXZhbHVlc1s0XSA9IHsw fTsKKwlib29sCQludWxsc1s0XSA9IHswfTsKKwlpbnQJCQlucmVwbGFjZXMgPSAwOworCWJvb2wJ CXJlc3VsdCA9IHRydWU7CisKIAlpZiAoIVBHX0FSR0lTTlVMTChSRUxQQUdFU19BUkcpKQogCXsK IAkJcmVscGFnZXMgPSBQR19HRVRBUkdfVUlOVDMyKFJFTFBBR0VTX0FSRyk7CkBAIC0yNDEsMyAr MjUxLDM1IEBAIHBnX3Jlc3RvcmVfcmVsYXRpb25fc3RhdHMoUEdfRlVOQ1RJT05fQVJHUykKIAog CVBHX1JFVFVSTl9CT09MKHJlc3VsdCk7CiB9CisKKy8qCisgKiBJbXBvcnQgcmVsYXRpb24gc3Rh dGlzdGljcyBmcm9tIE51bGxhYmxlRGF0dW0gaW5wdXRzIGZvciBhbGwgc3RhdGl0aWNhbAorICog dmFsdWVzLgorICovCitib29sCitpbXBvcnRfcmVsYXRpb25fc3RhdGlzdGljcyhSZWxhdGlvbiBy ZWwsCisJCQkJCQkgICBjb25zdCBOdWxsYWJsZURhdHVtICpyZWxwYWdlcywKKwkJCQkJCSAgIGNv bnN0IE51bGxhYmxlRGF0dW0gKnJlbHR1cGxlcywKKwkJCQkJCSAgIGNvbnN0IE51bGxhYmxlRGF0 dW0gKnJlbGFsbHZpc2libGUsCisJCQkJCQkgICBjb25zdCBOdWxsYWJsZURhdHVtICpyZWxhbGxm cm96ZW4pCit7CisJTE9DQUxfRkNJTkZPKG5ld2ZjaW5mbywgTlVNX1JFTEFUSU9OX1NUQVRTX0FS R1MpOworCisJSW5pdEZ1bmN0aW9uQ2FsbEluZm9EYXRhKCpuZXdmY2luZm8sIE5VTEwsIE5VTV9S RUxBVElPTl9TVEFUU19BUkdTLAorCQkJCQkJCSBJbnZhbGlkT2lkLCBOVUxMLCBOVUxMKTsKKwor CW5ld2ZjaW5mby0+YXJnc1tSRUxTQ0hFTUFfQVJHXS52YWx1ZSA9CisJCUNTdHJpbmdHZXRUZXh0 RGF0dW0oZ2V0X25hbWVzcGFjZV9uYW1lKFJlbGF0aW9uR2V0TmFtZXNwYWNlKHJlbCkpKTsKKwlu ZXdmY2luZm8tPmFyZ3NbUkVMU0NIRU1BX0FSR10uaXNudWxsID0gZmFsc2U7CisJbmV3ZmNpbmZv LT5hcmdzW1JFTE5BTUVfQVJHXS52YWx1ZSA9CisJCUNTdHJpbmdHZXRUZXh0RGF0dW0oUmVsYXRp b25HZXRSZWxhdGlvbk5hbWUocmVsKSk7CisJbmV3ZmNpbmZvLT5hcmdzW1JFTE5BTUVfQVJHXS5p c251bGwgPSBmYWxzZTsKKworCW5ld2ZjaW5mby0+YXJnc1tSRUxQQUdFU19BUkddID0gKnJlbHBh Z2VzOworCW5ld2ZjaW5mby0+YXJnc1tSRUxUVVBMRVNfQVJHXSA9ICpyZWx0dXBsZXM7CisJbmV3 ZmNpbmZvLT5hcmdzW1JFTEFMTFZJU0lCTEVfQVJHXSA9ICpyZWxhbGx2aXNpYmxlOworCW5ld2Zj aW5mby0+YXJnc1tSRUxBTExGUk9aRU5fQVJHXSA9ICpyZWxhbGxmcm96ZW47CisKKwlyZXR1cm4g cmVsYXRpb25fc3RhdGlzdGljc191cGRhdGVfaW50ZXJuYWwoUmVsYXRpb25HZXRSZWxpZChyZWwp LAorCQkJCQkJCQkJCQkgICBuZXdmY2luZm8pOworfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv c3RhdGlzdGljcy9zdGF0X3V0aWxzLmMgYi9zcmMvYmFja2VuZC9zdGF0aXN0aWNzL3N0YXRfdXRp bHMuYwppbmRleCBhNjczZTNjNzA0Yi4uMGQ5MDZmNWZhNzYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL3N0YXRpc3RpY3Mvc3RhdF91dGlscy5jCisrKyBiL3NyYy9iYWNrZW5kL3N0YXRpc3RpY3Mv c3RhdF91dGlscy5jCkBAIC0zMiw2ICszMiw4IEBACiAjaW5jbHVkZSAidXRpbHMvYWNsLmgiCiAj aW5jbHVkZSAidXRpbHMvYXJyYXkuaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgorI2lu Y2x1ZGUgInV0aWxzL2Zsb2F0LmgiCisjaW5jbHVkZSAidXRpbHMvZm1ncm9pZHMuaCIKICNpbmNs dWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKICNpbmNsdWRlICJ1dGlscy9yZWwuaCIKICNpbmNsdWRl ICJ1dGlscy9zeXNjYWNoZS5oIgpAQCAtNzUzLDMgKzc1NSwxMDUgQEAgc3RhdGF0dF9pbml0X2Vt cHR5X3R1cGxlKE9pZCByZWxvaWQsIGludDE2IGF0dG51bSwgYm9vbCBpbmhlcml0ZWQsCiAJCW51 bGxzW0FudW1fcGdfc3RhdGlzdGljX3N0YWNvbGwxICsgc2xvdG51bSAtIDFdID0gZmFsc2U7CiAJ fQogfQorCisvKgorICogQ29udmVuaWVuY2Ugcm91dGluZSBmb3Igc2V0dGluZyBvcHRpb25hbCB0 ZXh0IGFyZ3VtZW50cworICovCit2b2lkCitzdGF0c19zZXRfdGV4dF9hcmcoTnVsbGFibGVEYXR1 bSAqYXJnLCBjb25zdCBjaGFyICpzKQoreworCWlmIChzKQorCXsKKwkJYXJnLT52YWx1ZSA9IENT dHJpbmdHZXRUZXh0RGF0dW0ocyk7CisJCWFyZy0+aXNudWxsID0gZmFsc2U7CisJfQorCWVsc2UK Kwl7CisJCWFyZy0+dmFsdWUgPSAoRGF0dW0pIDA7CisJCWFyZy0+aXNudWxsID0gdHJ1ZTsKKwl9 Cit9CisKKy8qCisgKiBDb252ZW5pZW5jZSByb3V0aW5lIGZvciBzZXR0aW5nIG9wdGlvbmFsIGlu dDMyIGFyZ3VtZW50cworICovCit2b2lkCitzdGF0c19zZXRfaW50MzJfYXJnKE51bGxhYmxlRGF0 dW0gKmFyZywgY29uc3QgY2hhciAqcykKK3sKKwlpZiAocykKKwl7CisJCWludDMyCQl2YWwgPSBw Z19zdHJ0b2ludDMyKHMpOworCisJCWFyZy0+dmFsdWUgPSBJbnQzMkdldERhdHVtKHZhbCk7CisJ CWFyZy0+aXNudWxsID0gZmFsc2U7CisJfQorCWVsc2UKKwl7CisJCWFyZy0+dmFsdWUgPSAoRGF0 dW0pIDA7CisJCWFyZy0+aXNudWxsID0gdHJ1ZTsKKwl9Cit9CisKKy8qCisgKiBDb252ZW5pZW5j ZSByb3V0aW5lIGZvciBzZXR0aW5nIG9wdGlvbmFsIHVpbnQzMiBhcmd1bWVudHMKKyAqLwordm9p ZAorc3RhdHNfc2V0X3VpbnQzMl9hcmcoTnVsbGFibGVEYXR1bSAqYXJnLCBjb25zdCBjaGFyICpz KQoreworCWlmIChzKQorCXsKKwkJdWludDMyCQl2YWwgPSB1aW50MzJpbl9zdWJyKHMsIE5VTEws ICJ1aW50MzIiLCBOVUxMKTsKKworCQlhcmctPnZhbHVlID0gVUludDMyR2V0RGF0dW0odmFsKTsK KwkJYXJnLT5pc251bGwgPSBmYWxzZTsKKwl9CisJZWxzZQorCXsKKwkJYXJnLT52YWx1ZSA9IChE YXR1bSkgMDsKKwkJYXJnLT5pc251bGwgPSB0cnVlOworCX0KK30KKworLyoKKyAqIENvbnZlbmll bmNlIHJvdXRpbmUgZm9yIHNldHRpbmcgb3B0aW9uYWwgZmxvYXQgYXJndW1lbnRzCisgKi8KK3Zv aWQKK3N0YXRzX3NldF9mbG9hdF9hcmcoTnVsbGFibGVEYXR1bSAqYXJnLCBjb25zdCBjaGFyICpz KQoreworCWlmIChzKQorCXsKKwkJZmxvYXQ0CQl2YWwgPSBmbG9hdDRpbl9pbnRlcm5hbCgoY2hh ciAqKSBzLCBOVUxMLCAiZmxvYXQiLCBzLCBOVUxMKTsKKworCQlhcmctPnZhbHVlID0gRmxvYXQ0 R2V0RGF0dW0odmFsKTsKKwkJYXJnLT5pc251bGwgPSBmYWxzZTsKKwl9CisJZWxzZQorCXsKKwkJ YXJnLT52YWx1ZSA9IChEYXR1bSkgMDsKKwkJYXJnLT5pc251bGwgPSB0cnVlOworCX0KK30KKwor LyoKKyAqIENvbnZlbmllbmNlIHJvdXRpbmUgZm9yIHNldHRpbmcgb3B0aW9uYWwgZmxvYXRbXSBh cmd1bWVudHMKKyAqLwordm9pZAorc3RhdHNfc2V0X2Zsb2F0YXJyX2FyZyhOdWxsYWJsZURhdHVt ICphcmcsIGNvbnN0IGNoYXIgKnMpCit7CisJaWYgKHMpCisJeworCQlGbWdySW5mbwlmbGluZm87 CisJCURhdHVtCQl2YWw7CisKKwkJZm1ncl9pbmZvKEZfQVJSQVlfSU4sICZmbGluZm8pOworCQl2 YWwgPSBJbnB1dEZ1bmN0aW9uQ2FsbCgmZmxpbmZvLCAoY2hhciAqKSBzLCBGTE9BVDRPSUQsIC0x KTsKKworCQlhcmctPnZhbHVlID0gdmFsOworCQlhcmctPmlzbnVsbCA9IGZhbHNlOworCX0KKwll bHNlCisJeworCQlhcmctPnZhbHVlID0gKERhdHVtKSAwOworCQlhcmctPmlzbnVsbCA9IHRydWU7 CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RhdGlzdGljcy9zdGF0X3V0aWxzLmgg Yi9zcmMvaW5jbHVkZS9zdGF0aXN0aWNzL3N0YXRfdXRpbHMuaAppbmRleCA3NGRhNzc5MDU3OS4u MTdjYTlmMThjNTMgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3N0YXRpc3RpY3Mvc3RhdF91dGls cy5oCisrKyBiL3NyYy9pbmNsdWRlL3N0YXRpc3RpY3Mvc3RhdF91dGlscy5oCkBAIC01OCw0ICs1 OCwxMCBAQCBleHRlcm4gRGF0dW0gc3RhdGF0dF9idWlsZF9zdGF2YWx1ZXMoY29uc3QgY2hhciAq c3RhbmFtZSwgRm1nckluZm8gKmFycmF5X2luLCBEYQogZXh0ZXJuIGJvb2wgc3RhdGF0dF9nZXRf ZWxlbV90eXBlKE9pZCBhdHR0eXBpZCwgY2hhciBhdHR0eXB0eXBlLAogCQkJCQkJCQkgIE9pZCAq ZWxlbXR5cGlkLCBPaWQgKmVsZW1fZXFfb3ByKTsKIAorZXh0ZXJuIHZvaWQgc3RhdHNfc2V0X3Rl eHRfYXJnKE51bGxhYmxlRGF0dW0gKmFyZywgY29uc3QgY2hhciAqcyk7CitleHRlcm4gdm9pZCBz dGF0c19zZXRfaW50MzJfYXJnKE51bGxhYmxlRGF0dW0gKmFyZywgY29uc3QgY2hhciAqcyk7Citl eHRlcm4gdm9pZCBzdGF0c19zZXRfdWludDMyX2FyZyhOdWxsYWJsZURhdHVtICphcmcsIGNvbnN0 IGNoYXIgKnMpOworZXh0ZXJuIHZvaWQgc3RhdHNfc2V0X2Zsb2F0X2FyZyhOdWxsYWJsZURhdHVt ICphcmcsIGNvbnN0IGNoYXIgKnMpOworZXh0ZXJuIHZvaWQgc3RhdHNfc2V0X2Zsb2F0YXJyX2Fy ZyhOdWxsYWJsZURhdHVtICphcmcsIGNvbnN0IGNoYXIgKnMpOworCiAjZW5kaWYJCQkJCQkJLyog U1RBVFNfVVRJTFNfSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RhdGlzdGljcy9zdGF0 aXN0aWNzLmggYi9zcmMvaW5jbHVkZS9zdGF0aXN0aWNzL3N0YXRpc3RpY3MuaAppbmRleCA4Zjli OWQyMzdmZC4uNzIyNGU3YTRlMzIgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3N0YXRpc3RpY3Mv c3RhdGlzdGljcy5oCisrKyBiL3NyYy9pbmNsdWRlL3N0YXRpc3RpY3Mvc3RhdGlzdGljcy5oCkBA IC0xMjgsNCArMTI4LDI3IEBAIGV4dGVybiBTdGF0aXN0aWNFeHRJbmZvICpjaG9vc2VfYmVzdF9z dGF0aXN0aWNzKExpc3QgKnN0YXRzLCBjaGFyIHJlcXVpcmVka2luZCwKIAkJCQkJCQkJCQkJCWlu dCBuY2xhdXNlcyk7CiBleHRlcm4gSGVhcFR1cGxlIHN0YXRleHRfZXhwcmVzc2lvbnNfbG9hZChP aWQgc3R4b2lkLCBib29sIGluaCwgaW50IGlkeCk7CiAKK2V4dGVybiBib29sIGltcG9ydF9yZWxh dGlvbl9zdGF0aXN0aWNzKFJlbGF0aW9uIHJlbCwKKwkJCQkJCQkJCSAgIGNvbnN0IE51bGxhYmxl RGF0dW0gKnJlbHBhZ2VzLAorCQkJCQkJCQkJICAgY29uc3QgTnVsbGFibGVEYXR1bSAqcmVsdHVw bGVzLAorCQkJCQkJCQkJICAgY29uc3QgTnVsbGFibGVEYXR1bSAqcmVsYWxsdmlzaWJsZSwKKwkJ CQkJCQkJCSAgIGNvbnN0IE51bGxhYmxlRGF0dW0gKnJlbGFsbGZyb3plbik7CitleHRlcm4gYm9v bCBpbXBvcnRfYXR0cmlidXRlX3N0YXRpc3RpY3MoUmVsYXRpb24gcmVsLAorCQkJCQkJCQkJCUF0 dHJOdW1iZXIgYXR0bnVtLCBib29sIGluaGVyaXRlZCwKKwkJCQkJCQkJCQljb25zdCBOdWxsYWJs ZURhdHVtICpudWxsX2ZyYWMsCisJCQkJCQkJCQkJY29uc3QgTnVsbGFibGVEYXR1bSAqYXZnX3dp ZHRoLAorCQkJCQkJCQkJCWNvbnN0IE51bGxhYmxlRGF0dW0gKm5fZGlzdGluY3QsCisJCQkJCQkJ CQkJY29uc3QgTnVsbGFibGVEYXR1bSAqbW9zdF9jb21tb25fdmFscywKKwkJCQkJCQkJCQljb25z dCBOdWxsYWJsZURhdHVtICptb3N0X2NvbW1vbl9mcmVxcywKKwkJCQkJCQkJCQljb25zdCBOdWxs YWJsZURhdHVtICpoaXN0b2dyYW1fYm91bmRzLAorCQkJCQkJCQkJCWNvbnN0IE51bGxhYmxlRGF0 dW0gKmNvcnJlbGF0aW9uLAorCQkJCQkJCQkJCWNvbnN0IE51bGxhYmxlRGF0dW0gKm1vc3RfY29t bW9uX2VsZW1zLAorCQkJCQkJCQkJCWNvbnN0IE51bGxhYmxlRGF0dW0gKm1vc3RfY29tbW9uX2Vs ZW1fZnJlcXMsCisJCQkJCQkJCQkJY29uc3QgTnVsbGFibGVEYXR1bSAqZWxlbV9jb3VudF9oaXN0 b2dyYW0sCisJCQkJCQkJCQkJY29uc3QgTnVsbGFibGVEYXR1bSAqcmFuZ2VfbGVuZ3RoX2hpc3Rv Z3JhbSwKKwkJCQkJCQkJCQljb25zdCBOdWxsYWJsZURhdHVtICpyYW5nZV9lbXB0eV9mcmFjLAor CQkJCQkJCQkJCWNvbnN0IE51bGxhYmxlRGF0dW0gKnJhbmdlX2JvdW5kc19oaXN0b2dyYW0pOwor ZXh0ZXJuIGJvb2wgZGVsZXRlX2F0dHJpYnV0ZV9zdGF0aXN0aWNzKFJlbGF0aW9uIHJlbCwKKwkJ CQkJCQkJCQlBdHRyTnVtYmVyIGF0dG51bSwgYm9vbCBpbmhlcml0ZWQpOworCiAjZW5kaWYJCQkJ CQkJLyogU1RBVElTVElDU19IICovCg== --000000000000d356e006558b926c--