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.94.2) (envelope-from ) id 1ucJIB-00BSTX-F6 for pgsql-hackers@arkaria.postgresql.org; Thu, 17 Jul 2025 07:44:36 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1ucJI9-00HXG6-8j for pgsql-hackers@arkaria.postgresql.org; Thu, 17 Jul 2025 07:44:33 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ucJI8-00HXFy-2E for pgsql-hackers@lists.postgresql.org; Thu, 17 Jul 2025 07:44:33 +0000 Received: from fhigh-b3-smtp.messagingengine.com ([202.12.124.154]) by makus.postgresql.org with smtp (Exim 4.96) (envelope-from ) id 1ucJI6-007isI-1V for pgsql-hackers@postgresql.org; Thu, 17 Jul 2025 07:44:31 +0000 Received: from phl-compute-04.internal (phl-compute-04.phl.internal [10.202.2.44]) by mailfhigh.stl.internal (Postfix) with ESMTP id 6AA807A0190; Thu, 17 Jul 2025 03:44:29 -0400 (EDT) Received: from phl-imap-03 ([10.202.2.93]) by phl-compute-04.internal (MEProxy); Thu, 17 Jul 2025 03:44:29 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=compiler.org; h= cc:cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm2; t=1752738269; x=1752824669; bh=r+qJ9eqk/L ldQxDL/lCNn+Avhow5rI6c2nhyPnh9hP8=; b=prD5ACydTu5uJ/M9VH3V+l88qS EgF+C4IAec+dc48C+w025BVP8UnCDGkWPDUL8XOCddpw4+IQVkC+fLVXwBpZQlIZ u/YPsERS5oiDWns6iaUr/IT3+odCE5ggXXxD3VjDulw+gGIAwu0c9ipmhHVB989S z3Az8gF4+4+2nOgBbn4LE8jia8uIMdHZCXmP6nCNOnlJoHg75keJQ1ug/mhOLOWJ VyqBKdnC/gSKhr3AFSHwoogqXlJBH41uV9oGyIn/STsHUA1T24BnQ0Bes/LIRdH+ hsubUEWtP+2QrmGdYtXlPuyDAlGHP6mmz1URm1Q1rM/8GSCzcVudRuyW9dig== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm2; t= 1752738269; x=1752824669; bh=r+qJ9eqk/LldQxDL/lCNn+Avhow5rI6c2nh yPnh9hP8=; b=dAOZbs7WZ9A9PjvkLntP3s5Zf/9xj4egggsjDWIKTj6q7A3NSgP DIbb2OrCLzMmucLiVR1bJg1MZB6uSEk7BnFbt/AK0uLRqeMmpuzjqYd19NK6tvmG WMZbwL75j0NJewsqh5FudkdG2D21EM4oopAvCfD93jIBBr6HqV75znh636DNr2EZ WdKXYZ3se+jhdy8PXd71frGhA+rHVw+G0P8dqXY+P3hRUiVSkVgIaUnOuhsxNFNA GlYDwKteAU6RcKP9zcBRo0tnlXEpIPbpWNo1l/CfVRv0TZOi/gsmR5eq3/+y+KM3 V7AgLkEHSd0HHcdcMvcLcB98bPYjN3Xxlvw== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdeitddtvdcutefuodetggdotefrod ftvfcurfhrohhfihhlvgemucfhrghsthforghilhdpuffrtefokffrpgfnqfghnecuuegr ihhlohhuthemuceftddtnecunecujfgurhepofggfffhvfevkfgjfhfutgesmhdtreerre dttdenucfhrhhomhepfdflohgvlhculfgrtghosghsohhnfdcuoehjohgvlhestghomhhp ihhlvghrrdhorhhgqeenucggtffrrghtthgvrhhnpeeuhfejtddvgfdtgfelhfelheeuff fhjeehjedukeffuedvfeevkeetudelgfeihfenucffohhmrghinhepghhithhhuhgsrdgt ohhmnecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepjh hovghlsegtohhmphhilhgvrhdrohhrghdpnhgspghrtghpthhtohepvddpmhhouggvpehs mhhtphhouhhtpdhrtghpthhtoheprhhishhhuhdrphhoshhtghhrvghssehgmhgrihhlrd gtohhmpdhrtghpthhtohepphhgshhqlhdqhhgrtghkvghrshesphhoshhtghhrvghsqhhl rdhorhhg X-ME-Proxy: Feedback-ID: ic6394509:Fastmail Received: by mailuser.phl.internal (Postfix, from userid 501) id BF08F18E0063; Thu, 17 Jul 2025 03:44:28 -0400 (EDT) X-Mailer: MessagingEngine.com Webmail Interface MIME-Version: 1.0 X-ThreadId: T90889ce1c5a9472e Date: Thu, 17 Jul 2025 09:43:20 +0200 From: "Joel Jacobson" To: "Rishu Bagga" Cc: pgsql-hackers Message-Id: <96f00bf1-cc9d-4520-9d02-9e14e7767c88@app.fastmail.com> In-Reply-To: References: <6899c044-4a82-49be-8117-e6f669765f7e@app.fastmail.com> <165530.1752362320@sss.pgh.pa.us> <02a7cd37-e2fc-4212-8b19-f8c239c95fb8@app.fastmail.com> Subject: Re: Optimize LISTEN/NOTIFY Content-Type: multipart/mixed; boundary=9d1d57ec0f5b491b9cf3acfb887aee29 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --9d1d57ec0f5b491b9cf3acfb887aee29 Content-Type: text/plain Content-Transfer-Encoding: 7bit On Wed, Jul 16, 2025, at 02:20, Rishu Bagga wrote: > If we are doing this optimization, why not maintain a list of backends > for each channel, and only wake up those channels? Thanks for a contributing a great idea, it actually turned out to work really well in practice! The attached new v4 of the patch implements your multicast idea: --- Improve NOTIFY scalability with multicast signaling Previously, NOTIFY would signal all listening backends in a database for any channel with more than one listener. This broadcast approach scales poorly for workloads that rely on targeted notifications to small groups of backends, as every NOTIFY could wake up many unrelated processes. This commit introduces a multicast signaling optimization to improve scalability for such use-cases. A new GUC, `notify_multicast_threshold`, is added to control the maximum number of listeners to track per channel. When a NOTIFY is issued, if the number of listeners is at or below this threshold, only those specific backends are signaled. If the limit is exceeded, the system falls back to the original broadcast behavior. The default for this threshold is set to 16. Benchmarks show this provides a good balance, with significant performance gains for small to medium-sized listener groups and diminishing returns for higher values. Setting the threshold to 0 disables multicast signaling, forcing a fallback to the broadcast path for all notifications. To implement this, a new partitioned hash table is introduced in shared memory to track listeners. Locking is managed with an optimistic read-then-upgrade pattern. This allows concurrent LISTEN/UNLISTEN operations on *different* channels to proceed in parallel, as they will only acquire locks on their respective partitions. For correctness and to prevent deadlocks, a strict lock ordering hierarchy (NotifyQueueLock before any partition lock) is observed. The signaling path in NOTIFY must acquire the global NotifyQueueLock first before consulting the partitioned hash table, which serializes concurrent NOTIFYs. The primary concurrency win is for LISTEN/UNLISTEN operations, which are now much more scalable. The "wake only tail" optimization, which signals backends that are far behind in the queue, is also included to ensure the global queue tail can always advance. Thanks to Rishu Bagga for the multicast idea. --- BENCHMARK To find the optimal default notify_multicast_threshold value, I created a new benchmark tool that spawns one "ping" worker that sends notifications to a channel, and multiple "pong" workers that listen on channels and all immediately reply back to the "ping" worker, and when all replies have been received, the cycle repeats. By measuring how many complete round-trips can be performed per second, it evaluates the impact of different multicast threshold settings. The results below show the effect of setting the notify_multicast_threshold just below, or exactly at the N backends per channel, to compare broadcast vs multicast, for different sizes of multicast groups (where 1 would be the old targeted mode, optimized for specifically earlier). K = notify_multicast_threshold With 2 backends per channel (32 channels total): patch-v4 (K=1): 8,477 TPS patch-v4 (K=2): 27,748 TPS (3.3x improvement) With 4 backends per channel (16 channels total): patch-v4 (K=1): 7,367 TPS patch-v4 (K=4): 18,777 TPS (2.6x improvement) With 8 backends per channel (8 channels total): patch-v4 (K=1): 5,892 TPS patch-v4 (K=8): 8,620 TPS (1.5x improvement) With 16 backends per channel (4 channels total): patch-v4 (K=1): 4,202 TPS patch-v4 (K=16): 4,750 TPS (1.1x improvement) I also reran the old ping-pong as well as the pgbench benchmarks, and I couldn't detect any negative impact, testing with notify_multicast_threshold {1, 8, 16}. Ping-pong benchmark: Extra Connections: 0 -------------------------------------------------------------------------------- Version Max TPS vs Master All Values (sorted) ------------------------------------------------------------------------------------- master 9119 baseline {9088, 9095, 9119} patch-v4 (t=1) 9116 -0.0% {9082, 9090, 9116} patch-v4 (t=8) 9106 -0.2% {9086, 9102, 9106} patch-v4 (t=16) 9134 +0.2% {9082, 9116, 9134} Extra Connections: 10 -------------------------------------------------------------------------------- Version Max TPS vs Master All Values (sorted) ------------------------------------------------------------------------------------- master 6237 baseline {6224, 6227, 6237} patch-v4 (t=1) 9358 +50.0% {9302, 9345, 9358} patch-v4 (t=8) 9348 +49.9% {9266, 9312, 9348} patch-v4 (t=16) 9408 +50.8% {9339, 9407, 9408} Extra Connections: 100 -------------------------------------------------------------------------------- Version Max TPS vs Master All Values (sorted) ------------------------------------------------------------------------------------- master 2028 baseline {2026, 2027, 2028} patch-v4 (t=1) 9278 +357.3% {9222, 9235, 9278} patch-v4 (t=8) 9227 +354.8% {9184, 9207, 9227} patch-v4 (t=16) 9250 +355.9% {9180, 9243, 9250} Extra Connections: 1000 -------------------------------------------------------------------------------- Version Max TPS vs Master All Values (sorted) ------------------------------------------------------------------------------------- master 239 baseline {239, 239, 239} patch-v4 (t=1) 8841 +3594.1% {8819, 8840, 8841} patch-v4 (t=8) 8835 +3591.7% {8802, 8826, 8835} patch-v4 (t=16) 8855 +3599.8% {8787, 8843, 8855} Among my pgbench benchmarks, results seems unaffected in these benchmarks: listen_unique.sql listen_common.sql listen_unlisten_unique.sql listen_unlisten_common.sql The listen_notify_unique.sql benchmark shows similar improvements for all notify_multicast_threshold values tested, which is expected, since this benchmark uses unique channels, so a higher notify_multicast_threshold shouldn't affect the results, which it didn't: # TEST `listen_notify_unique.sql` ```sql LISTEN channel_:client_id; NOTIFY channel_:client_id; ``` ## 1 Connection, 1 Job - **master**: 63696 TPS (baseline) - **optimize_listen_notify_v4 (t=1.0)**: 63377 TPS (-0.5%) - **optimize_listen_notify_v4 (t=8.0)**: 62890 TPS (-1.3%) - **optimize_listen_notify_v4 (t=16.0)**: 63114 TPS (-0.9%) ## 2 Connections, 2 Jobs - **master**: 90967 TPS (baseline) - **optimize_listen_notify_v4 (t=1.0)**: 109423 TPS (+20.3%) - **optimize_listen_notify_v4 (t=8.0)**: 109107 TPS (+19.9%) - **optimize_listen_notify_v4 (t=16.0)**: 109608 TPS (+20.5%) ## 4 Connections, 4 Jobs - **master**: 114333 TPS (baseline) - **optimize_listen_notify_v4 (t=1.0)**: 140986 TPS (+23.3%) - **optimize_listen_notify_v4 (t=8.0)**: 141263 TPS (+23.6%) - **optimize_listen_notify_v4 (t=16.0)**: 141327 TPS (+23.6%) ## 8 Connections, 8 Jobs - **master**: 64429 TPS (baseline) - **optimize_listen_notify_v4 (t=1.0)**: 93787 TPS (+45.6%) - **optimize_listen_notify_v4 (t=8.0)**: 93828 TPS (+45.6%) - **optimize_listen_notify_v4 (t=16.0)**: 93875 TPS (+45.7%) ## 16 Connections, 16 Jobs - **master**: 41704 TPS (baseline) - **optimize_listen_notify_v4 (t=1.0)**: 84791 TPS (+103.3%) - **optimize_listen_notify_v4 (t=8.0)**: 88330 TPS (+111.8%) - **optimize_listen_notify_v4 (t=16.0)**: 84827 TPS (+103.4%) ## 32 Connections, 32 Jobs - **master**: 25988 TPS (baseline) - **optimize_listen_notify_v4 (t=1.0)**: 83197 TPS (+220.1%) - **optimize_listen_notify_v4 (t=8.0)**: 83453 TPS (+221.1%) - **optimize_listen_notify_v4 (t=16.0)**: 83576 TPS (+221.6%) ## 1000 Connections, 1 Job - **master**: 105 TPS (baseline) - **optimize_listen_notify_v4 (t=1.0)**: 3097 TPS (+2852.1%) - **optimize_listen_notify_v4 (t=8.0)**: 3079 TPS (+2835.1%) - **optimize_listen_notify_v4 (t=16.0)**: 3080 TPS (+2835.9%) ## 1000 Connections, 2 Jobs - **master**: 108 TPS (baseline) - **optimize_listen_notify_v4 (t=1.0)**: 2981 TPS (+2671.7%) - **optimize_listen_notify_v4 (t=8.0)**: 3091 TPS (+2774.4%) - **optimize_listen_notify_v4 (t=16.0)**: 3097 TPS (+2779.6%) ## 1000 Connections, 4 Jobs - **master**: 105 TPS (baseline) - **optimize_listen_notify_v4 (t=1.0)**: 2947 TPS (+2705.5%) - **optimize_listen_notify_v4 (t=8.0)**: 2994 TPS (+2751.0%) - **optimize_listen_notify_v4 (t=16.0)**: 2992 TPS (+2748.7%) ## 1000 Connections, 8 Jobs - **master**: 107 TPS (baseline) - **optimize_listen_notify_v4 (t=1.0)**: 3064 TPS (+2777.0%) - **optimize_listen_notify_v4 (t=8.0)**: 2981 TPS (+2698.5%) - **optimize_listen_notify_v4 (t=16.0)**: 2979 TPS (+2696.8%) ## 1000 Connections, 16 Jobs - **master**: 101 TPS (baseline) - **optimize_listen_notify_v4 (t=1.0)**: 3068 TPS (+2923.2%) - **optimize_listen_notify_v4 (t=8.0)**: 2950 TPS (+2806.4%) - **optimize_listen_notify_v4 (t=16.0)**: 2940 TPS (+2796.8%) ## 1000 Connections, 32 Jobs - **master**: 102 TPS (baseline) - **optimize_listen_notify_v4 (t=1.0)**: 2980 TPS (+2815.0%) - **optimize_listen_notify_v4 (t=8.0)**: 3034 TPS (+2867.9%) - **optimize_listen_notify_v4 (t=16.0)**: 2962 TPS (+2798.0%) Here are some plots that includes the above results: https://github.com/joelonsql/pg-bench-listen-notify/raw/master/plot-v4.png https://github.com/joelonsql/pg-bench-listen-notify/raw/master/performance_overview_connections_equal_jobs-v4.png https://github.com/joelonsql/pg-bench-listen-notify/raw/master/performance_overview_fixed_connections-v4.png /Joel --9d1d57ec0f5b491b9cf3acfb887aee29 Content-Disposition: attachment; filename*0="0001-optimize_listen_notify-v4.patch" Content-Type: application/octet-stream; name="=?UTF-8?Q?0001-optimize=5Flisten=5Fnotify-v4.patch?=" Content-Transfer-Encoding: base64 RnJvbSAzMmYyYjY4MTgxNjkzODFmMjc5NWU3YzMyNjRiYjM3MTBlOWY2ZWFlIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKb2VsIEphY29ic29uIDxqb2VsQGNvbXBpbGVyLm9y Zz4KRGF0ZTogU3VuLCAxNSBKdW4gMjAyNSAwMDowOTo0MyArMDIwMApTdWJqZWN0OiBbUEFU Q0hdIEltcHJvdmUgTk9USUZZIHNjYWxhYmlsaXR5IHdpdGggbXVsdGljYXN0IHNpZ25hbGlu ZwoKUHJldmlvdXNseSwgTk9USUZZIHdvdWxkIHNpZ25hbCBhbGwgbGlzdGVuaW5nIGJhY2tl bmRzIGluIGEgZGF0YWJhc2UgZm9yCmFueSBjaGFubmVsIHdpdGggbW9yZSB0aGFuIG9uZSBs aXN0ZW5lci4gVGhpcyBicm9hZGNhc3QgYXBwcm9hY2ggc2NhbGVzCnBvb3JseSBmb3Igd29y a2xvYWRzIHRoYXQgcmVseSBvbiB0YXJnZXRlZCBub3RpZmljYXRpb25zIHRvIHNtYWxsIGdy b3VwcwpvZiBiYWNrZW5kcywgYXMgZXZlcnkgTk9USUZZIGNvdWxkIHdha2UgdXAgbWFueSB1 bnJlbGF0ZWQgcHJvY2Vzc2VzLgoKVGhpcyBjb21taXQgaW50cm9kdWNlcyBhIG11bHRpY2Fz dCBzaWduYWxpbmcgb3B0aW1pemF0aW9uIHRvIGltcHJvdmUKc2NhbGFiaWxpdHkgZm9yIHN1 Y2ggdXNlLWNhc2VzLiBBIG5ldyBHVUMsIGBub3RpZnlfbXVsdGljYXN0X3RocmVzaG9sZGAs CmlzIGFkZGVkIHRvIGNvbnRyb2wgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpc3RlbmVycyB0 byB0cmFjayBwZXIKY2hhbm5lbC4gV2hlbiBhIE5PVElGWSBpcyBpc3N1ZWQsIGlmIHRoZSBu dW1iZXIgb2YgbGlzdGVuZXJzIGlzIGF0IG9yCmJlbG93IHRoaXMgdGhyZXNob2xkLCBvbmx5 IHRob3NlIHNwZWNpZmljIGJhY2tlbmRzIGFyZSBzaWduYWxlZC4gSWYgdGhlCmxpbWl0IGlz IGV4Y2VlZGVkLCB0aGUgc3lzdGVtIGZhbGxzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGJyb2Fk Y2FzdApiZWhhdmlvci4KClRoZSBkZWZhdWx0IGZvciB0aGlzIHRocmVzaG9sZCBpcyBzZXQg dG8gMTYuIEJlbmNobWFya3Mgc2hvdyB0aGlzCnByb3ZpZGVzIGEgZ29vZCBiYWxhbmNlLCB3 aXRoIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGdhaW5zIGZvciBzbWFsbCB0bwptZWRpdW0t c2l6ZWQgbGlzdGVuZXIgZ3JvdXBzIGFuZCBkaW1pbmlzaGluZyByZXR1cm5zIGZvciBoaWdo ZXIgdmFsdWVzLgpTZXR0aW5nIHRoZSB0aHJlc2hvbGQgdG8gMCBkaXNhYmxlcyBtdWx0aWNh c3Qgc2lnbmFsaW5nLCBmb3JjaW5nIGEKZmFsbGJhY2sgdG8gdGhlIGJyb2FkY2FzdCBwYXRo IGZvciBhbGwgbm90aWZpY2F0aW9ucy4KClRvIGltcGxlbWVudCB0aGlzLCBhIG5ldyBwYXJ0 aXRpb25lZCBoYXNoIHRhYmxlIGlzIGludHJvZHVjZWQgaW4gc2hhcmVkCm1lbW9yeSB0byB0 cmFjayBsaXN0ZW5lcnMuIExvY2tpbmcgaXMgbWFuYWdlZCB3aXRoIGFuIG9wdGltaXN0aWMK cmVhZC10aGVuLXVwZ3JhZGUgcGF0dGVybi4gVGhpcyBhbGxvd3MgY29uY3VycmVudCBMSVNU RU4vVU5MSVNURU4Kb3BlcmF0aW9ucyBvbiAqZGlmZmVyZW50KiBjaGFubmVscyB0byBwcm9j ZWVkIGluIHBhcmFsbGVsLCBhcyB0aGV5IHdpbGwKb25seSBhY3F1aXJlIGxvY2tzIG9uIHRo ZWlyIHJlc3BlY3RpdmUgcGFydGl0aW9ucy4KCkZvciBjb3JyZWN0bmVzcyBhbmQgdG8gcHJl dmVudCBkZWFkbG9ja3MsIGEgc3RyaWN0IGxvY2sgb3JkZXJpbmcKaGllcmFyY2h5IChOb3Rp ZnlRdWV1ZUxvY2sgYmVmb3JlIGFueSBwYXJ0aXRpb24gbG9jaykgaXMgb2JzZXJ2ZWQuIFRo ZQpzaWduYWxpbmcgcGF0aCBpbiBOT1RJRlkgbXVzdCBhY3F1aXJlIHRoZSBnbG9iYWwgTm90 aWZ5UXVldWVMb2NrIGZpcnN0CmJlZm9yZSBjb25zdWx0aW5nIHRoZSBwYXJ0aXRpb25lZCBo YXNoIHRhYmxlLCB3aGljaCBzZXJpYWxpemVzCmNvbmN1cnJlbnQgTk9USUZZcy4gVGhlIHBy aW1hcnkgY29uY3VycmVuY3kgd2luIGlzIGZvciBMSVNURU4vVU5MSVNURU4Kb3BlcmF0aW9u cywgd2hpY2ggYXJlIG5vdyBtdWNoIG1vcmUgc2NhbGFibGUuCgpUaGUgIndha2Ugb25seSB0 YWlsIiBvcHRpbWl6YXRpb24sIHdoaWNoIHNpZ25hbHMgYmFja2VuZHMgdGhhdCBhcmUgZmFy CmJlaGluZCBpbiB0aGUgcXVldWUsIGlzIGFsc28gaW5jbHVkZWQgdG8gZW5zdXJlIHRoZSBn bG9iYWwgcXVldWUgdGFpbApjYW4gYWx3YXlzIGFkdmFuY2UuCgpUaGFua3MgdG8gUmlzaHUg QmFnZ2EgZm9yIHRoZSBtdWx0aWNhc3QgaWRlYS4KLS0tCiBzcmMvYmFja2VuZC9jb21tYW5k cy9hc3luYy5jICAgICAgICB8IDgyNSArKysrKysrKysrKysrKysrKysrKysrKysrKy0tCiBz cmMvYmFja2VuZC91dGlscy9pbml0L2dsb2JhbHMuYyAgICB8ICAgMSArCiBzcmMvYmFja2Vu ZC91dGlscy9taXNjL2d1Y190YWJsZXMuYyB8ICAxMyArCiBzcmMvaW5jbHVkZS9taXNjYWRt aW4uaCAgICAgICAgICAgICB8ICAgMSArCiBzcmMvaW5jbHVkZS91dGlscy9ndWNfaG9va3Mu aCAgICAgICB8ICAgMSArCiA1IGZpbGVzIGNoYW5nZWQsIDgwOCBpbnNlcnRpb25zKCspLCAz MyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9hc3lu Yy5jIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvYXN5bmMuYwppbmRleCA0YmQzN2Q1YmViNS4u NTZhNzRiNzA3ZmMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2FzeW5jLmMK KysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvYXN5bmMuYwpAQCAtMjQsOCArMjQsMTMgQEAK ICAqCSAgQWxsIG5vdGlmaWNhdGlvbiBtZXNzYWdlcyBhcmUgcGxhY2VkIGluIHRoZSBxdWV1 ZSBhbmQgbGF0ZXIgcmVhZCBvdXQKICAqCSAgYnkgbGlzdGVuaW5nIGJhY2tlbmRzLgogICoK LSAqCSAgVGhlcmUgaXMgbm8gY2VudHJhbCBrbm93bGVkZ2Ugb2Ygd2hpY2ggYmFja2VuZCBs aXN0ZW5zIG9uIHdoaWNoIGNoYW5uZWw7Ci0gKgkgIGV2ZXJ5IGJhY2tlbmQgaGFzIGl0cyBv d24gbGlzdCBvZiBpbnRlcmVzdGluZyBjaGFubmVscy4KKyAqCSAgSW4gYWRkaXRpb24gdG8g ZWFjaCBiYWNrZW5kIG1haW50YWluaW5nIGl0cyBvd24gbGlzdCBvZiBjaGFubmVscywgd2Ug YWxzbworICoJICBtYWludGFpbiBhIGNlbnRyYWwgaGFzaCB0YWJsZSB0aGF0IHRyYWNrcyBs aXN0ZW5lcnMgZm9yIGVhY2ggY2hhbm5lbCwgdXAKKyAqCSAgdG8gYSBjb25maWd1cmFibGUg dGhyZXNob2xkICgnbm90aWZ5X211bHRpY2FzdF90aHJlc2hvbGQnKS4gV2hlbiB0aGUKKyAq CSAgbnVtYmVyIG9mIGxpc3RlbmVycyBpcyB3aXRoaW4gdGhpcyB0aHJlc2hvbGQsIHdlIGNh biBwZXJmb3JtIGEgdGFyZ2V0ZWQKKyAqCSAgIm11bHRpY2FzdCIgYnkgc2lnbmFsaW5nIG9u bHkgdGhvc2Ugc3BlY2lmaWMgYmFja2VuZHMuIElmIHRoZSBudW1iZXIgb2YKKyAqCSAgbGlz dGVuZXJzIGV4Y2VlZHMgdGhlIHRocmVzaG9sZCwgd2UgZmFsbCBiYWNrIHRvIHRoZSBvcmln aW5hbCBicm9hZGNhc3QKKyAqCSAgYmVoYXZpb3Igb2Ygc2lnbmFsaW5nIGFsbCBsaXN0ZW5p bmcgYmFja2VuZHMgaW4gdGhlIGRhdGFiYXNlLgogICoKICAqCSAgQWx0aG91Z2ggdGhlcmUg aXMgb25seSBvbmUgcXVldWUsIG5vdGlmaWNhdGlvbnMgYXJlIHRyZWF0ZWQgYXMgYmVpbmcK ICAqCSAgZGF0YWJhc2UtbG9jYWw7IHRoaXMgaXMgZG9uZSBieSBpbmNsdWRpbmcgdGhlIHNl bmRlcidzIGRhdGFiYXNlIE9JRApAQCAtNzEsMTMgKzc2LDE3IEBACiAgKgkgIG1ha2UgYW55 IGFjdHVhbCB1cGRhdGVzIHRvIHRoZSBlZmZlY3RpdmUgbGlzdGVuIHN0YXRlIChsaXN0ZW5D aGFubmVscykuCiAgKgkgIFRoZW4gd2Ugc2lnbmFsIGFueSBiYWNrZW5kcyB0aGF0IG1heSBi ZSBpbnRlcmVzdGVkIGluIG91ciBtZXNzYWdlcwogICoJICAoaW5jbHVkaW5nIG91ciBvd24g YmFja2VuZCwgaWYgbGlzdGVuaW5nKS4gIFRoaXMgaXMgZG9uZSBieQotICoJICBTaWduYWxC YWNrZW5kcygpLCB3aGljaCBzY2FucyB0aGUgbGlzdCBvZiBsaXN0ZW5pbmcgYmFja2VuZHMg YW5kIHNlbmRzIGEKLSAqCSAgUFJPQ1NJR19OT1RJRllfSU5URVJSVVBUIHNpZ25hbCB0byBl dmVyeSBsaXN0ZW5pbmcgYmFja2VuZCAod2UgZG9uJ3QKLSAqCSAga25vdyB3aGljaCBiYWNr ZW5kIGlzIGxpc3RlbmluZyBvbiB3aGljaCBjaGFubmVsIHNvIHdlIG11c3Qgc2lnbmFsIHRo ZW0KLSAqCSAgYWxsKS4gIFdlIGNhbiBleGNsdWRlIGJhY2tlbmRzIHRoYXQgYXJlIGFscmVh ZHkgdXAgdG8gZGF0ZSwgdGhvdWdoLCBhbmQKLSAqCSAgd2UgY2FuIGFsc28gZXhjbHVkZSBi YWNrZW5kcyB0aGF0IGFyZSBpbiBvdGhlciBkYXRhYmFzZXMgKHVubGVzcyB0aGV5Ci0gKgkg IGFyZSB3YXkgYmVoaW5kIGFuZCBzaG91bGQgYmUga2lja2VkIHRvIG1ha2UgdGhlbSBhZHZh bmNlIHRoZWlyCi0gKgkgIHBvaW50ZXJzKS4KKyAqCSAgU2lnbmFsQmFja2VuZHMoKSwgd2hp Y2ggaGFzIHR3byBtb2RlcyBvZiBvcGVyYXRpb246CisgKgkgIGEpIE11bHRpY2FzdCBtb2Rl OiBGb3IgY2hhbm5lbHMgd2l0aCBhIG51bWJlciBvZiBsaXN0ZW5lcnMgbm90IGV4Y2VlZGlu ZworICoJICAnbm90aWZ5X211bHRpY2FzdF90aHJlc2hvbGQnLCBzaWduYWxzIGFyZSBzZW50 IG9ubHkgdG8gdGhvc2Ugc3BlY2lmaWMKKyAqCSAgYmFja2VuZHMuCisgKgkgIGIpIEJyb2Fk Y2FzdCBtb2RlOiBJZiBhbnkgY2hhbm5lbCBiZWluZyBub3RpZmllZCBoYXMgbW9yZSBsaXN0 ZW5lcnMgdGhhbgorICoJICB0aGUgdGhyZXNob2xkLCB3ZSByZXZlcnQgdG8gdGhlIG9yaWdp bmFsIGJlaGF2aW9yIGFuZCBzZW5kIGEKKyAqCSAgUFJPQ1NJR19OT1RJRllfSU5URVJSVVBU IHNpZ25hbCB0byBldmVyeSBsaXN0ZW5pbmcgYmFja2VuZCBpbiB0aGUgZGF0YWJhc2UuCisg KgkgIEFkZGl0aW9uYWxseSwgd2UgdXNlIGEgIndha2Ugb25seSB0YWlsIiBvcHRpbWl6YXRp b246IHdlIGFsd2F5cyBzaWduYWwKKyAqCSAgdGhlIGJhY2tlbmQgZnVydGhlc3QgYmVoaW5k IGluIHRoZSBxdWV1ZSB0byBoZWxwIHByZXZlbnQgYmFja2VuZHMgZnJvbQorICoJICBnZXR0 aW5nIGZhciBiZWhpbmQgYW5kIGNyZWF0ZSBhIGNoYWluIHJlYWN0aW9uIG9mIHdha2UtdXBz LgorICoJICBXZSBjYW4gZXhjbHVkZSBiYWNrZW5kcyB0aGF0IGFyZSBhbHJlYWR5IHVwIHRv IGRhdGUsIHRob3VnaC4KICAqCiAgKgkgIEZpbmFsbHksIGFmdGVyIHdlIGFyZSBvdXQgb2Yg dGhlIHRyYW5zYWN0aW9uIGFsdG9nZXRoZXIgYW5kIGFib3V0IHRvIGdvCiAgKgkgIGlkbGUs IHdlIHNjYW4gdGhlIHF1ZXVlIGZvciBtZXNzYWdlcyB0aGF0IG5lZWQgdG8gYmUgc2VudCB0 byBvdXIKQEAgLTEyOCw2ICsxMzcsNyBAQAogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1 ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZy5o PgogCiAjaW5jbHVkZSAiYWNjZXNzL3BhcmFsbGVsLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3Ns cnUuaCIKQEAgLTE0Niw2ICsxNTYsNyBAQAogI2luY2x1ZGUgInRjb3AvdGNvcHByb3QuaCIK ICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogI2luY2x1ZGUgInV0aWxzL2d1Y19ob29r cy5oIgorI2luY2x1ZGUgInV0aWxzL2hzZWFyY2guaCIKICNpbmNsdWRlICJ1dGlscy9tZW11 dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL3BzX3N0YXR1cy5oIgogI2luY2x1ZGUgInV0aWxz L3NuYXBtZ3IuaCIKQEAgLTE2Miw2ICsxNzMsNzEgQEAKICAqLwogI2RlZmluZSBOT1RJRllf UEFZTE9BRF9NQVhfTEVOR1RICShCTENLU1ogLSBOQU1FREFUQUxFTiAtIDEyOCkKIAorLyoK KyAqIE51bWJlciBvZiBwYXJ0aXRpb25zIGZvciB0aGUgY2hhbm5lbCBoYXNoIHRhYmxlJ3Mg bG9ja3MuCisgKiBUaGlzIG11c3QgYmUgYSBwb3dlciBvZiB0d28uCisgKi8KKyNkZWZpbmUg TlVNX05PVElGWV9QQVJUSVRJT05TIDEyOAorCisvKgorICogQ2hhbm5lbCBoYXNoIHRhYmxl IGRlZmluaXRpb25zCisgKgorICogVGhpcyBoYXNoIHRhYmxlIHByb3ZpZGVzIGFuIG9wdGlt aXphdGlvbiBieSB0cmFja2luZyB3aGljaCBiYWNrZW5kcyBhcmUKKyAqIGxpc3RlbmluZyBv biBlYWNoIGNoYW5uZWwsIHVwIHRvIGEgY2VydGFpbiB0aHJlc2hvbGQuIENoYW5uZWxzIGFy ZQorICogaWRlbnRpZmllZCBieSBkYXRhYmFzZSBPSUQgYW5kIGNoYW5uZWwgbmFtZSwgbWFr aW5nIHRoZW0KKyAqIGRhdGFiYXNlLXNwZWNpZmljLgorICoKKyAqIFRvIGltcHJvdmUgc2Nh bGFiaWxpdHkgb2YgY29uY3VycmVudCBMSVNURU4vVU5MSVNURU4gb3BlcmF0aW9ucywgdGhl IGhhc2gKKyAqIHRhYmxlIGlzIHBhcnRpdGlvbmVkLCB3aXRoIGVhY2ggcGFydGl0aW9uIHBy b3RlY3RlZCBieSBpdHMgb3duIExXTG9jay4KKyAqIFRoaXMgYXZvaWRzIHNlcmlhbGl6aW5n IGFsbCBvcGVyYXRpb25zIG9uIGEgc2luZ2xlIGdsb2JhbCBsb2NrLgorICoKKyAqIFdoZW4g dGhlIG51bWJlciBvZiBiYWNrZW5kcyBsaXN0ZW5pbmcgb24gYSBjaGFubmVsIGlzIGF0IG9y IGJlbG93CisgKiAnbm90aWZ5X211bHRpY2FzdF90aHJlc2hvbGQnLCB3ZSBzdG9yZSB0aGVp ciBQcm9jTnVtYmVycyBhbmQgc2lnbmFsIHRoZW0KKyAqIGRpcmVjdGx5IChtdWx0aWNhc3Qp LgorICoKKyAqIFdlIGZhbGwgYmFjayB0byBicm9hZGNhc3QgbW9kZSBhbmQgc2lnbmFsIGFs bCBsaXN0ZW5pbmcgYmFja2VuZHMgd2hlbjoKKyAqIDEpIE1vcmUgYmFja2VuZHMgbGlzdGVu IG9uIHRoZSBzYW1lIGNoYW5uZWwgdGhhbiB0aGUgdGhyZXNob2xkIGFsbG93cywgT1IKKyAq IDIpIFRoZSBoYXNoIHRhYmxlIHJ1bnMgb3V0IG9mIHNoYXJlZCBtZW1vcnkgZm9yIG5ldyBl bnRyaWVzCisgKgorICogTm90ZSB0aGF0IENIQU5ORUxfSEFTSF9NQVhfU0laRSBpcyBub3Qg YSBoYXJkIGxpbWl0IC0gdGhlIGhhc2ggdGFibGUgY2FuCisgKiBzdG9yZSBtb3JlIGVudHJp ZXMgdGhhbiB0aGlzLCBidXQgcGVyZm9ybWFuY2Ugd2lsbCBkZWdyYWRlIGR1ZSB0byBidWNr ZXQKKyAqIG92ZXJmbG93LiBUaGUgYWN0dWFsIGZhbGxiYWNrIHRvIGJyb2FkY2FzdCBtb2Rl IG9jY3VycyBvbmx5IHdoZW4gc2hhcmVkCisgKiBtZW1vcnkgaXMgZXhoYXVzdGVkIGFuZCB3 ZSBjYW5ub3QgYWxsb2NhdGUgbmV3IGhhc2ggZW50cmllcy4KKyAqCisgKiBUaGUgbWF4aW11 bSBzaXplIChDSEFOTkVMX0hBU0hfTUFYX1NJWkUpIGlzIGJhc2VkIG9uIHRoZSB0eXBpY2Fs IE9TIHBvcnQKKyAqIHJhbmdlLiBUaGlzIHByb3ZpZGVzIGEgcmVhc29uYWJsZSB1cHBlciBi b3VuZCBmb3Igc3lzdGVtcyB0aGF0IHVzZQorICogcGVyLWNvbm5lY3Rpb24gY2hhbm5lbHMu CisgKgorICovCisjZGVmaW5lIENIQU5ORUxfSEFTSF9JTklUX1NJWkUJCTI1NgorI2RlZmlu ZSBDSEFOTkVMX0hBU0hfTUFYX1NJWkUJCTY1NTM1CisKKy8qCisgKiBLZXkgc3RydWN0dXJl IGZvciB0aGUgY2hhbm5lbCBoYXNoIHRhYmxlLgorICogQ2hhbm5lbHMgYXJlIGRhdGFiYXNl LXNwZWNpZmljLCBzbyB3ZSBuZWVkIGJvdGggdGhlIGRhdGFiYXNlIE9JRAorICogYW5kIHRo ZSBjaGFubmVsIG5hbWUgdG8gdW5pcXVlbHkgaWRlbnRpZnkgYSBjaGFubmVsLgorICovCit0 eXBlZGVmIHN0cnVjdCBDaGFubmVsSGFzaEtleQoreworCU9pZAkJCWRib2lkOworCWNoYXIJ CWNoYW5uZWxbTkFNRURBVEFMRU5dOworfQkJCUNoYW5uZWxIYXNoS2V5OworCisvKgorICog RWFjaCBlbnRyeSBjb250YWlucyBhIGNoYW5uZWwga2V5IChkYXRhYmFzZSBPSUQgKyBjaGFu bmVsIG5hbWUpIGFuZCBhbiBhcnJheQorICogb2YgbGlzdGVuaW5nIGJhY2tlbmQgUHJvY051 bWJlcnMsIHVwIHRvIG5vdGlmeV9tdWx0aWNhc3RfdGhyZXNob2xkLiBJZiB0aGUKKyAqIG51 bWJlciBvZiBsaXN0ZW5lcnMgZXhjZWVkcyB0aGUgdGhyZXNob2xkLCB3ZSBtYXJrIHRoZSBj aGFubmVsIGZvcgorICogYnJvYWRjYXN0IGFuZCBzdG9wIHRyYWNraW5nIGluZGl2aWR1YWwg bGlzdGVuZXJzLgorICovCit0eXBlZGVmIHN0cnVjdCBDaGFubmVsRW50cnkKK3sKKwlDaGFu bmVsSGFzaEtleSBrZXk7CisJYm9vbAkJaXNfYnJvYWRjYXN0OwkvKiBUcnVlIGlmIG51bV9s aXN0ZW5lcnMgPiB0aHJlc2hvbGQgKi8KKwl1aW50OAkJbnVtX2xpc3RlbmVyczsJLyogTnVt YmVyIG9mIGxpc3RlbmVycyBjdXJyZW50bHkgc3RvcmVkICovCisJLyogTGlzdGVuZXJzIGFy cmF5IGZvbGxvd3MsIG9mIHNpemUgbm90aWZ5X211bHRpY2FzdF90aHJlc2hvbGQgKi8KKwlQ cm9jTnVtYmVyCWxpc3RlbmVyc1tGTEVYSUJMRV9BUlJBWV9NRU1CRVJdOworfQkJCUNoYW5u ZWxFbnRyeTsKKwogLyoKICAqIFN0cnVjdCByZXByZXNlbnRpbmcgYW4gZW50cnkgaW4gdGhl IGdsb2JhbCBub3RpZnkgcXVldWUKICAqCkBAIC0yNjksNiArMzQ1LDExIEBAIHR5cGVkZWYg c3RydWN0IFF1ZXVlQmFja2VuZFN0YXR1cwogICogSW4gb3JkZXIgdG8gYXZvaWQgZGVhZGxv Y2tzLCB3aGVuZXZlciB3ZSBuZWVkIG11bHRpcGxlIGxvY2tzLCB3ZSBmaXJzdCBnZXQKICAq IE5vdGlmeVF1ZXVlVGFpbExvY2ssIHRoZW4gTm90aWZ5UXVldWVMb2NrLCBhbmQgbGFzdGx5 IFNMUlUgYmFuayBsb2NrLgogICoKKyAqIFRoZSBjaGFubmVsIGhhc2ggdGFibGUgaXMgcHJv dGVjdGVkIGJ5IGEgc2VwYXJhdGUgc2V0IG9mIHBhcnRpdGlvbmVkCisgKiBsb2Nrcy4gVG8g cHJldmVudCBkZWFkbG9ja3MgYmV0d2VlbiB0aGVzZSBhbmQgTm90aWZ5UXVldWVMb2NrLCB0 aGUgZ2xvYmFsCisgKiBsb2NrLW9yZGVyaW5nIHJ1bGUgaXM6IGFsd2F5cyBhY3F1aXJlIE5v dGlmeVF1ZXVlTG9jayAqYmVmb3JlKiBhY3F1aXJpbmcKKyAqIGFueSBjaGFubmVsIGhhc2gg cGFydGl0aW9uIGxvY2suCisgKgogICogRWFjaCBiYWNrZW5kIHVzZXMgdGhlIGJhY2tlbmRb XSBhcnJheSBlbnRyeSB3aXRoIGluZGV4IGVxdWFsIHRvIGl0cwogICogUHJvY051bWJlci4g IFdlIHJlbHkgb24gdGhpcyB0byBtYWtlIFNlbmRQcm9jU2lnbmFsIGZhc3QuCiAgKgpAQCAt MjkzLDYgKzM3NCw2OSBAQCB0eXBlZGVmIHN0cnVjdCBBc3luY1F1ZXVlQ29udHJvbAogCiBz dGF0aWMgQXN5bmNRdWV1ZUNvbnRyb2wgKmFzeW5jUXVldWVDb250cm9sOwogCisvKiBMb2Nr cyBmb3IgcGFydGl0aW9uZWQgY2hhbm5lbCBoYXNoIHRhYmxlICovCitzdGF0aWMgTFdMb2Nr ICpjaGFubmVsSGFzaExvY2tzOworc3RhdGljIGludAljaGFubmVsSGFzaFRyYW5jaGVJZCA9 IDA7CisKKy8qIFN0cnVjdHVyZSB0byBob2xkIGNoYW5uZWwgaGFzaCBsb2NrcyBhbmQgdHJh bmNoZSBJRCBpbiBzaGFyZWQgbWVtb3J5ICovCit0eXBlZGVmIHN0cnVjdCBDaGFubmVsSGFz aExvY2tEYXRhCit7CisJaW50CQkJdHJhbmNoZUlkOworCUxXTG9jawkJbG9ja3NbRkxFWElC TEVfQVJSQVlfTUVNQkVSXTsKK30JCQlDaGFubmVsSGFzaExvY2tEYXRhOworCitzdGF0aWMg Q2hhbm5lbEhhc2hMb2NrRGF0YSAqIGNoYW5uZWxIYXNoTG9ja0RhdGE7CisKKy8qIENoYW5u ZWwgaGFzaCB0YWJsZSBmb3IgbXVsdGljYXN0IHNpZ25hbGxpbmcgKi8KK3N0YXRpYyBIVEFC ICpjaGFubmVsSGFzaCA9IE5VTEw7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gbmVlZGVk IGJ5IEdldENoYW5uZWxIYXNoICovCitzdGF0aWMgdWludDMyIGNoYW5uZWxfaGFzaF9mdW5j KGNvbnN0IHZvaWQgKmtleSwgU2l6ZSBrZXlzaXplKTsKKworLyoKKyAqIEdldENoYW5uZWxI YXNoCisgKgkJR2V0IHRoZSBjaGFubmVsIGhhc2ggdGFibGUsIGluaXRpYWxpemluZyBvdXIg YmFja2VuZCdzIHBvaW50ZXIgaWYgbmVlZGVkLgorICoKKyAqIFRoaXMgbXVzdCBiZSBjYWxs ZWQgYmVmb3JlIGFueSBhY2Nlc3MgdG8gdGhlIGNoYW5uZWwgaGFzaCB0YWJsZS4KKyAqIFRo ZSBoYXNoIHRhYmxlIGl0c2VsZiBpcyBjcmVhdGVkIGluIHNoYXJlZCBtZW1vcnkgZHVyaW5n IEFzeW5jU2htZW1Jbml0LAorICogYnV0IGVhY2ggYmFja2VuZCBuZWVkcyB0byBnZXQgaXRz IG93biBwb2ludGVyIHRvIGl0LgorICovCitzdGF0aWMgSFRBQiAqCitHZXRDaGFubmVsSGFz aCh2b2lkKQoreworCWlmIChjaGFubmVsSGFzaCA9PSBOVUxMKQorCXsKKwkJSEFTSENUTAkJ aGFzaF9jdGw7CisJCVNpemUJCWVudHJ5c2l6ZTsKKworCQkvKgorCQkgKiBTZXQgdXAgdG8g YXR0YWNoIHRvIHRoZSBleGlzdGluZyBzaGFyZWQgaGFzaCB0YWJsZS4gVGhlIGhhc2gKKwkJ ICogY29udHJvbCBwYXJhbWV0ZXJzIG11c3QgbWF0Y2ggdGhvc2UgdXNlZCBpbiBBc3luY1No bWVtSW5pdC4KKwkJICovCisJCU1lbVNldCgmaGFzaF9jdGwsIDAsIHNpemVvZihoYXNoX2N0 bCkpOworCQloYXNoX2N0bC5rZXlzaXplID0gc2l6ZW9mKENoYW5uZWxIYXNoS2V5KTsKKwor CQkvKgorCQkgKiBUaGUgc2l6ZSBvZiBhIGNoYW5uZWwgZW50cnkgaXMgZmxleGlibGUuIFdl IG11c3QgaGF2ZSBlbm91Z2ggc3BhY2UKKwkJICogZm9yIHRoZSBtYXhpbXVtIG51bWJlciBv ZiBsaXN0ZW5lcnMgc3BlY2lmaWVkIGJ5IHRoZSB0aHJlc2hvbGQuCisJCSAqLworCQllbnRy eXNpemUgPSBhZGRfc2l6ZShvZmZzZXRvZihDaGFubmVsRW50cnksIGxpc3RlbmVycyksCisJ CQkJCQkJIG11bF9zaXplKG5vdGlmeV9tdWx0aWNhc3RfdGhyZXNob2xkLCBzaXplb2YoUHJv Y051bWJlcikpKTsKKwkJaGFzaF9jdGwuZW50cnlzaXplID0gZW50cnlzaXplOworCisJCWhh c2hfY3RsLmhhc2ggPSBjaGFubmVsX2hhc2hfZnVuYzsKKwkJaGFzaF9jdGwubnVtX3BhcnRp dGlvbnMgPSBOVU1fTk9USUZZX1BBUlRJVElPTlM7CisKKwkJY2hhbm5lbEhhc2ggPSBTaG1l bUluaXRIYXNoKCJDaGFubmVsIEhhc2giLAorCQkJCQkJCQkJQ0hBTk5FTF9IQVNIX0lOSVRf U0laRSwKKwkJCQkJCQkJCUNIQU5ORUxfSEFTSF9NQVhfU0laRSwKKwkJCQkJCQkJCSZoYXNo X2N0bCwKKwkJCQkJCQkJCUhBU0hfRUxFTSB8IEhBU0hfRlVOQ1RJT04gfCBIQVNIX1BBUlRJ VElPTik7CisJfQorCisJcmV0dXJuIGNoYW5uZWxIYXNoOworfQorCiAjZGVmaW5lIFFVRVVF X0hFQUQJCQkJCShhc3luY1F1ZXVlQ29udHJvbC0+aGVhZCkKICNkZWZpbmUgUVVFVUVfVEFJ TAkJCQkJKGFzeW5jUXVldWVDb250cm9sLT50YWlsKQogI2RlZmluZSBRVUVVRV9TVE9QX1BB R0UJCQkJKGFzeW5jUXVldWVDb250cm9sLT5zdG9wUGFnZSkKQEAgLTQ1OCw2ICs2MDIsMTQg QEAgc3RhdGljIHVpbnQzMiBub3RpZmljYXRpb25faGFzaChjb25zdCB2b2lkICprZXksIFNp emUga2V5c2l6ZSk7CiBzdGF0aWMgaW50CW5vdGlmaWNhdGlvbl9tYXRjaChjb25zdCB2b2lk ICprZXkxLCBjb25zdCB2b2lkICprZXkyLCBTaXplIGtleXNpemUpOwogc3RhdGljIHZvaWQg Q2xlYXJQZW5kaW5nQWN0aW9uc0FuZE5vdGlmaWVzKHZvaWQpOwogCisvKiBDaGFubmVsIGhh c2ggdGFibGUgbWFuYWdlbWVudCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBMV0xvY2sgKkdldENo YW5uZWxIYXNoTG9jayhjb25zdCBjaGFyICpjaGFubmVsKTsKK3N0YXRpYyBpbmxpbmUgdm9p ZCBDaGFubmVsSGFzaFByZXBhcmVLZXkoQ2hhbm5lbEhhc2hLZXkgKiBrZXksIE9pZCBkYm9p ZCwgY29uc3QgY2hhciAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZCBDaGFubmVsSGFzaEFkZExp c3RlbmVyKGNvbnN0IGNoYXIgKmNoYW5uZWwsIFByb2NOdW1iZXIgcHJvY25vKTsKK3N0YXRp YyB2b2lkIENoYW5uZWxIYXNoUmVtb3ZlTGlzdGVuZXIoY29uc3QgY2hhciAqY2hhbm5lbCwg UHJvY051bWJlciBwcm9jbm8pOworc3RhdGljIENoYW5uZWxFbnRyeSAqIENoYW5uZWxIYXNo TG9va3VwKGNvbnN0IGNoYXIgKmNoYW5uZWwpOworc3RhdGljIExpc3QgKkdldFBlbmRpbmdO b3RpZnlDaGFubmVscyh2b2lkKTsKKwogLyoKICAqIENvbXB1dGUgdGhlIGRpZmZlcmVuY2Ug YmV0d2VlbiB0d28gcXVldWUgcGFnZSBudW1iZXJzLgogICogUHJldmlvdXNseSB0aGlzIGZ1 bmN0aW9uIGFjY291bnRlZCBmb3IgYSB3cmFwYXJvdW5kLgpAQCAtNDg1LDYgKzYzNyw3IEBA IFNpemUKIEFzeW5jU2htZW1TaXplKHZvaWQpCiB7CiAJU2l6ZQkJc2l6ZTsKKwlTaXplCQll bnRyeXNpemU7CiAKIAkvKiBUaGlzIGhhZCBiZXR0ZXIgbWF0Y2ggQXN5bmNTaG1lbUluaXQg Ki8KIAlzaXplID0gbXVsX3NpemUoTWF4QmFja2VuZHMsIHNpemVvZihRdWV1ZUJhY2tlbmRT dGF0dXMpKTsKQEAgLTQ5Miw2ICs2NDUsMTggQEAgQXN5bmNTaG1lbVNpemUodm9pZCkKIAog CXNpemUgPSBhZGRfc2l6ZShzaXplLCBTaW1wbGVMcnVTaG1lbVNpemUobm90aWZ5X2J1ZmZl cnMsIDApKTsKIAorCS8qCisJICogVGhlIHNpemUgb2YgYSBjaGFubmVsIGVudHJ5IGlzIGZs ZXhpYmxlLiBXZSBtdXN0IGFsbG9jYXRlIGVub3VnaCBzcGFjZQorCSAqIGZvciB0aGUgbWF4 aW11bSBudW1iZXIgb2YgbGlzdGVuZXJzIHNwZWNpZmllZCBieSB0aGUgdGhyZXNob2xkLgor CSAqLworCWVudHJ5c2l6ZSA9IGFkZF9zaXplKG9mZnNldG9mKENoYW5uZWxFbnRyeSwgbGlz dGVuZXJzKSwKKwkJCQkJCSBtdWxfc2l6ZShub3RpZnlfbXVsdGljYXN0X3RocmVzaG9sZCwg c2l6ZW9mKFByb2NOdW1iZXIpKSk7CisJc2l6ZSA9IGFkZF9zaXplKHNpemUsIGhhc2hfZXN0 aW1hdGVfc2l6ZShDSEFOTkVMX0hBU0hfTUFYX1NJWkUsCisJCQkJCQkJCQkJCSBlbnRyeXNp emUpKTsKKworCXNpemUgPSBhZGRfc2l6ZShzaXplLCBvZmZzZXRvZihDaGFubmVsSGFzaExv Y2tEYXRhLCBsb2NrcykgKworCQkJCQltdWxfc2l6ZShOVU1fTk9USUZZX1BBUlRJVElPTlMs IHNpemVvZihMV0xvY2spKSk7CisKIAlyZXR1cm4gc2l6ZTsKIH0KIApAQCAtNTQ2LDYgKzcx MSw1OCBAQCBBc3luY1NobWVtSW5pdCh2b2lkKQogCQkgKi8KIAkJKHZvaWQpIFNscnVTY2Fu RGlyZWN0b3J5KE5vdGlmeUN0bCwgU2xydVNjYW5EaXJDYkRlbGV0ZUFsbCwgTlVMTCk7CiAJ fQorCisJLyoKKwkgKiBDcmVhdGUgb3IgYXR0YWNoIHRvIHRoZSBjaGFubmVsIGhhc2ggdGFi bGUuCisJICovCisJeworCQlIQVNIQ1RMCQloYXNoX2N0bDsKKwkJU2l6ZQkJZW50cnlzaXpl OworCisJCU1lbVNldCgmaGFzaF9jdGwsIDAsIHNpemVvZihoYXNoX2N0bCkpOworCQloYXNo X2N0bC5rZXlzaXplID0gc2l6ZW9mKENoYW5uZWxIYXNoS2V5KTsKKworCQkvKgorCQkgKiBU aGUgc2l6ZSBvZiBhIGNoYW5uZWwgZW50cnkgaXMgZmxleGlibGUuIFdlIG11c3QgaGF2ZSBl bm91Z2ggc3BhY2UKKwkJICogZm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaXN0ZW5lcnMg c3BlY2lmaWVkIGJ5IHRoZSB0aHJlc2hvbGQuCisJCSAqLworCQllbnRyeXNpemUgPSBhZGRf c2l6ZShvZmZzZXRvZihDaGFubmVsRW50cnksIGxpc3RlbmVycyksCisJCQkJCQkJIG11bF9z aXplKG5vdGlmeV9tdWx0aWNhc3RfdGhyZXNob2xkLCBzaXplb2YoUHJvY051bWJlcikpKTsK KwkJaGFzaF9jdGwuZW50cnlzaXplID0gZW50cnlzaXplOworCisJCWhhc2hfY3RsLmhhc2gg PSBjaGFubmVsX2hhc2hfZnVuYzsKKwkJaGFzaF9jdGwubnVtX3BhcnRpdGlvbnMgPSBOVU1f Tk9USUZZX1BBUlRJVElPTlM7CisKKwkJY2hhbm5lbEhhc2ggPSBTaG1lbUluaXRIYXNoKCJD aGFubmVsIEhhc2giLAorCQkJCQkJCQkJQ0hBTk5FTF9IQVNIX0lOSVRfU0laRSwKKwkJCQkJ CQkJCUNIQU5ORUxfSEFTSF9NQVhfU0laRSwKKwkJCQkJCQkJCSZoYXNoX2N0bCwKKwkJCQkJ CQkJCUhBU0hfRUxFTSB8IEhBU0hfRlVOQ1RJT04gfCBIQVNIX1BBUlRJVElPTik7CisJfQor CisJLyogSW5pdGlhbGl6ZSBsb2NrcyBmb3IgdGhlIHBhcnRpdGlvbmVkIGhhc2ggdGFibGUg Ki8KKwlzaXplID0gb2Zmc2V0b2YoQ2hhbm5lbEhhc2hMb2NrRGF0YSwgbG9ja3MpICsKKwkJ bXVsX3NpemUoTlVNX05PVElGWV9QQVJUSVRJT05TLCBzaXplb2YoTFdMb2NrKSk7CisJY2hh bm5lbEhhc2hMb2NrRGF0YSA9IChDaGFubmVsSGFzaExvY2tEYXRhICopCisJCVNobWVtSW5p dFN0cnVjdCgiQ2hhbm5lbCBIYXNoIExvY2sgRGF0YSIsIHNpemUsICZmb3VuZCk7CisJaWYg KCFmb3VuZCkKKwl7CisJCS8qIEZpcnN0IHRpbWUgdGhyb3VnaDogaW5pdGlhbGl6ZSB0aGUg bG9ja3MgYW5kIHRyYW5jaGUgSUQgKi8KKwkJY2hhbm5lbEhhc2hMb2NrRGF0YS0+dHJhbmNo ZUlkID0gTFdMb2NrTmV3VHJhbmNoZUlkKCk7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgTlVN X05PVElGWV9QQVJUSVRJT05TOyBpKyspCisJCXsKKwkJCUxXTG9ja0luaXRpYWxpemUoJmNo YW5uZWxIYXNoTG9ja0RhdGEtPmxvY2tzW2ldLAorCQkJCQkJCSBjaGFubmVsSGFzaExvY2tE YXRhLT50cmFuY2hlSWQpOworCQl9CisJfQorCisJLyoKKwkgKiBTZXQgdXAgbG9jYWwgcG9p bnRlcnMgZm9yIGNvbnZlbmllbmNlLiBXZSBtdXN0IGFsc28gcmVnaXN0ZXIgdGhlCisJICog dHJhbmNoZSBJRCBpbiBldmVyeSBiYWNrZW5kIHRoYXQgd2lsbCB1c2UgdGhlc2UgbG9ja3Mu CisJICovCisJY2hhbm5lbEhhc2hMb2NrcyA9IGNoYW5uZWxIYXNoTG9ja0RhdGEtPmxvY2tz OworCWNoYW5uZWxIYXNoVHJhbmNoZUlkID0gY2hhbm5lbEhhc2hMb2NrRGF0YS0+dHJhbmNo ZUlkOworCUxXTG9ja1JlZ2lzdGVyVHJhbmNoZShjaGFubmVsSGFzaFRyYW5jaGVJZCwgIkNo YW5uZWxIYXNoUGFydGl0aW9uIik7CiB9CiAKIApAQCAtMTExMCw2ICsxMzI3LDcgQEAgRXhl Y19MaXN0ZW5QcmVDb21taXQodm9pZCkKIAkJUVVFVUVfTkVYVF9MSVNURU5FUihNeVByb2NO dW1iZXIpID0gUVVFVUVfRklSU1RfTElTVEVORVI7CiAJCVFVRVVFX0ZJUlNUX0xJU1RFTkVS ID0gTXlQcm9jTnVtYmVyOwogCX0KKwogCUxXTG9ja1JlbGVhc2UoTm90aWZ5UXVldWVMb2Nr KTsKIAogCS8qIE5vdyB3ZSBhcmUgbGlzdGVkIGluIHRoZSBnbG9iYWwgYXJyYXksIHNvIHJl bWVtYmVyIHdlJ3JlIGxpc3RlbmluZyAqLwpAQCAtMTE1Miw2ICsxMzcwLDggQEAgRXhlY19M aXN0ZW5Db21taXQoY29uc3QgY2hhciAqY2hhbm5lbCkKIAlvbGRjb250ZXh0ID0gTWVtb3J5 Q29udGV4dFN3aXRjaFRvKFRvcE1lbW9yeUNvbnRleHQpOwogCWxpc3RlbkNoYW5uZWxzID0g bGFwcGVuZChsaXN0ZW5DaGFubmVscywgcHN0cmR1cChjaGFubmVsKSk7CiAJTWVtb3J5Q29u dGV4dFN3aXRjaFRvKG9sZGNvbnRleHQpOworCisJQ2hhbm5lbEhhc2hBZGRMaXN0ZW5lcihj aGFubmVsLCBNeVByb2NOdW1iZXIpOwogfQogCiAvKgpAQCAtMTE3NSw2ICsxMzk1LDcgQEAg RXhlY19Vbmxpc3RlbkNvbW1pdChjb25zdCBjaGFyICpjaGFubmVsKQogCQl7CiAJCQlsaXN0 ZW5DaGFubmVscyA9IGZvcmVhY2hfZGVsZXRlX2N1cnJlbnQobGlzdGVuQ2hhbm5lbHMsIHEp OwogCQkJcGZyZWUobGNoYW4pOworCQkJQ2hhbm5lbEhhc2hSZW1vdmVMaXN0ZW5lcihjaGFu bmVsLCBNeVByb2NOdW1iZXIpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xMTkzLDkgKzE0 MTQsMjIgQEAgRXhlY19Vbmxpc3RlbkNvbW1pdChjb25zdCBjaGFyICpjaGFubmVsKQogc3Rh dGljIHZvaWQKIEV4ZWNfVW5saXN0ZW5BbGxDb21taXQodm9pZCkKIHsKKwlMaXN0Q2VsbCAg ICpwOworCiAJaWYgKFRyYWNlX25vdGlmeSkKIAkJZWxvZyhERUJVRzEsICJFeGVjX1VubGlz dGVuQWxsQ29tbWl0KCVkKSIsIE15UHJvY1BpZCk7CiAKKwkvKgorCSAqIEJlZm9yZSBmcmVl aW5nIHRoZSBsb2NhbCBsaXN0LCBpdGVyYXRlIHRocm91Z2ggaXQgYW5kIHBlcmZvcm0gYQor CSAqIHRhcmdldGVkIHJlbW92YWwgZm9yIGVhY2ggb2Ygb3VyIGNoYW5uZWxzIGZyb20gdGhl IHNoYXJlZCBoYXNoIHRhYmxlLgorCSAqLworCWZvcmVhY2gocCwgbGlzdGVuQ2hhbm5lbHMp CisJeworCQljaGFyCSAgICpjaGFubmVsID0gKGNoYXIgKikgbGZpcnN0KHApOworCisJCUNo YW5uZWxIYXNoUmVtb3ZlTGlzdGVuZXIoY2hhbm5lbCwgTXlQcm9jTnVtYmVyKTsKKwl9CisK IAlsaXN0X2ZyZWVfZGVlcChsaXN0ZW5DaGFubmVscyk7CiAJbGlzdGVuQ2hhbm5lbHMgPSBO SUw7CiB9CkBAIC0xMjM5LDYgKzE0NzMsNyBAQCBhc3luY1F1ZXVlVW5yZWdpc3Rlcih2b2lk KQogCSAqIE5lZWQgZXhjbHVzaXZlIGxvY2sgaGVyZSB0byBtYW5pcHVsYXRlIGxpc3QgbGlu a3MuCiAJICovCiAJTFdMb2NrQWNxdWlyZShOb3RpZnlRdWV1ZUxvY2ssIExXX0VYQ0xVU0lW RSk7CisKIAkvKiBNYXJrIG91ciBlbnRyeSBhcyBpbnZhbGlkICovCiAJUVVFVUVfQkFDS0VO RF9QSUQoTXlQcm9jTnVtYmVyKSA9IEludmFsaWRQaWQ7CiAJUVVFVUVfQkFDS0VORF9EQk9J RChNeVByb2NOdW1iZXIpID0gSW52YWxpZE9pZDsKQEAgLTE1NjUsMTIgKzE4MDAsMTggQEAg YXN5bmNRdWV1ZUZpbGxXYXJuaW5nKHZvaWQpCiAvKgogICogU2VuZCBzaWduYWxzIHRvIGxp c3RlbmluZyBiYWNrZW5kcy4KICAqCi0gKiBOb3JtYWxseSB3ZSBzaWduYWwgb25seSBiYWNr ZW5kcyBpbiBvdXIgb3duIGRhdGFiYXNlLCBzaW5jZSBvbmx5IHRob3NlCi0gKiBiYWNrZW5k cyBjb3VsZCBiZSBpbnRlcmVzdGVkIGluIG5vdGlmaWVzIHdlIHNlbmQuICBIb3dldmVyLCBp ZiB0aGVyZSdzCi0gKiBub3RpZnkgdHJhZmZpYyBpbiBvdXIgZGF0YWJhc2UgYnV0IG5vIHRy YWZmaWMgaW4gYW5vdGhlciBkYXRhYmFzZSB0aGF0Ci0gKiBkb2VzIGhhdmUgbGlzdGVuZXIo cyksIHRob3NlIGxpc3RlbmVycyB3aWxsIGZhbGwgZnVydGhlciBhbmQgZnVydGhlcgotICog YmVoaW5kLiAgV2FrZW4gdGhlbSBhbnl3YXkgaWYgdGhleSdyZSBmYXIgZW5vdWdoIGJlaGlu ZCwgc28gdGhhdCB0aGV5J2xsCi0gKiBhZHZhbmNlIHRoZWlyIHF1ZXVlIHBvc2l0aW9uIHBv aW50ZXJzLCBhbGxvd2luZyB0aGUgZ2xvYmFsIHRhaWwgdG8gYWR2YW5jZS4KKyAqIFRoaXMg ZnVuY3Rpb24gb3BlcmF0ZXMgaW4gdHdvIG1vZGVzOgorICogMS4gTXVsdGljYXN0IG1vZGU6 IElmIGFsbCBwZW5kaW5nIG5vdGlmaWNhdGlvbiBjaGFubmVscyBoYXZlIGEgbnVtYmVyIG9m CisgKiAgICBsaXN0ZW5lcnMgYXQgb3IgYmVsb3cgdGhlICdub3RpZnlfbXVsdGljYXN0X3Ro cmVzaG9sZCcsIHdlIHNpZ25hbCBvbmx5CisgKiAgICB0aG9zZSBzcGVjaWZpYyBiYWNrZW5k cy4KKyAqIDIuIEJyb2FkY2FzdCBtb2RlOiBJZiBhbnkgY2hhbm5lbCBoYXMgbW9yZSBsaXN0 ZW5lcnMgdGhhbiB0aGUgdGhyZXNob2xkIChvcgorICogICAgd2UgcmFuIG91dCBvZiBzaGFy ZWQgbWVtb3J5IGZvciB0aGUgY2hhbm5lbCBoYXNoIHRhYmxlKSwgd2Ugc2lnbmFsIGFsbAor ICogICAgbGlzdGVuaW5nIGJhY2tlbmRzIGluIG91ciBkYXRhYmFzZS4KKyAqCisgKiBJbiBh ZGRpdGlvbiB0byB0aGUgY2hhbm5lbC1zcGVjaWZpYyBzaWduYWxpbmcsIHdlIGFsc28gaW1w bGVtZW50IGEgIndha2UKKyAqIG9ubHkgdGFpbCIgb3B0aW1pemF0aW9uOiB3ZSBzaWduYWwg dGhlIGJhY2tlbmQgdGhhdCBpcyBmdXJ0aGVzdCBiZWhpbmQKKyAqIGluIHRoZSBxdWV1ZSB0 byBoZWxwIHByZXZlbnQgYmFja2VuZHMgZnJvbSBnZXR0aW5nIGZhciBiZWhpbmQgYW5kIGNy ZWF0ZQorICogYSBjaGFpbiByZWFjdGlvbiBvZiB3YWtlLXVwcy4gVGhpcyBhdm9pZHMgdGh1 bmRlcmluZyBoZXJkIHByb2JsZW1zLgogICoKICAqIFNpbmNlIHdlIGtub3cgdGhlIFByb2NO dW1iZXIgYW5kIHRoZSBQaWQgdGhlIHNpZ25hbGluZyBpcyBxdWl0ZSBjaGVhcC4KICAqCkBA IC0xNTgzLDYgKzE4MjQsMTEgQEAgU2lnbmFsQmFja2VuZHModm9pZCkKIAlpbnQzMgkgICAq cGlkczsKIAlQcm9jTnVtYmVyICpwcm9jbm9zOwogCWludAkJCWNvdW50OworCUxpc3QJICAg KmNoYW5uZWxzOworCUxpc3RDZWxsICAgKnA7CisJYm9vbAkgICAqc2lnbmFsZWQ7CisJYm9v bAkJYnJvYWRjYXN0X21vZGUgPSBmYWxzZTsKKwlib29sCQl0YWlsX3dva2VuID0gZmFsc2U7 CiAKIAkvKgogCSAqIElkZW50aWZ5IGJhY2tlbmRzIHRoYXQgd2UgbmVlZCB0byBzaWduYWwu ICBXZSBkb24ndCB3YW50IHRvIHNlbmQKQEAgLTE1OTQsNDAgKzE4NDAsMTczIEBAIFNpZ25h bEJhY2tlbmRzKHZvaWQpCiAJICovCiAJcGlkcyA9IChpbnQzMiAqKSBwYWxsb2MoTWF4QmFj a2VuZHMgKiBzaXplb2YoaW50MzIpKTsKIAlwcm9jbm9zID0gKFByb2NOdW1iZXIgKikgcGFs bG9jKE1heEJhY2tlbmRzICogc2l6ZW9mKFByb2NOdW1iZXIpKTsKKwlzaWduYWxlZCA9IChi b29sICopIHBhbGxvYzAoTWF4QmFja2VuZHMgKiBzaXplb2YoYm9vbCkpOwogCWNvdW50ID0g MDsKIAorCS8qIEdldCBsaXN0IG9mIGNoYW5uZWxzIHRoYXQgaGF2ZSBwZW5kaW5nIG5vdGlm aWNhdGlvbnMgKi8KKwljaGFubmVscyA9IEdldFBlbmRpbmdOb3RpZnlDaGFubmVscygpOwor CisJLyoKKwkgKiBUbyBwcmV2ZW50IGRlYWRsb2Nrcywgd2UgbXVzdCBhbHdheXMgYWNxdWly ZSBsb2NrcyBpbiB0aGUgc2FtZSBvcmRlcjoKKwkgKiBnbG9iYWwgTm90aWZ5UXVldWVMb2Nr IGZpcnN0LCB0aGVuIGluZGl2aWR1YWwgcGFydGl0aW9uIGxvY2tzLgorCSAqLwogCUxXTG9j a0FjcXVpcmUoTm90aWZ5UXVldWVMb2NrLCBMV19FWENMVVNJVkUpOwotCWZvciAoUHJvY051 bWJlciBpID0gUVVFVUVfRklSU1RfTElTVEVORVI7IGkgIT0gSU5WQUxJRF9QUk9DX05VTUJF UjsgaSA9IFFVRVVFX05FWFRfTElTVEVORVIoaSkpCisKKwkvKgorCSAqIERldGVybWluZSBp ZiB3ZSBjYW4gdXNlIHRhcmdldGVkIHNpZ25hbGluZyBvciBtdXN0IGJyb2FkY2FzdC4gVGhp cworCSAqIGNoZWNrIG11c3QgYmUgZG9uZSB3aGlsZSBob2xkaW5nIE5vdGlmeVF1ZXVlTG9j ayB0byBwcmV2ZW50IGRlYWRsb2NrcworCSAqIGFnYWluc3Qgb3RoZXIgYmFja2VuZHMgdGhh dCBtaWdodCBiZSBtb2RpZnlpbmcgdGhlIGxpc3RlbmVyIGxpc3QgYW5kCisJICogaGFzaCB0 YWJsZSBzaW11bHRhbmVvdXNseSAoZS5nLiwgYXN5bmNRdWV1ZVVucmVnaXN0ZXIpLgorCSAq LworCWZvcmVhY2gocCwgY2hhbm5lbHMpCiAJewotCQlpbnQzMgkJcGlkID0gUVVFVUVfQkFD S0VORF9QSUQoaSk7Ci0JCVF1ZXVlUG9zaXRpb24gcG9zOworCQljaGFyCSAgICpjaGFubmVs ID0gKGNoYXIgKikgbGZpcnN0KHApOworCQlDaGFubmVsRW50cnkgKmVudHJ5OworCQlMV0xv Y2sJICAgKmxvY2sgPSBHZXRDaGFubmVsSGFzaExvY2soY2hhbm5lbCk7CisKKwkJTFdMb2Nr QWNxdWlyZShsb2NrLCBMV19TSEFSRUQpOworCQllbnRyeSA9IENoYW5uZWxIYXNoTG9va3Vw KGNoYW5uZWwpOworCisJCS8qCisJCSAqIElmIHRoZXJlIGlzIG5vIGVudHJ5LCBpdCBjb3Vs ZCBtZWFuIHdlIHJhbiBvdXQgb2Ygc2hhcmVkIG1lbW9yeQorCQkgKiB3aGVuIHRyeWluZyB0 byBhZGQgdGhpcyBjaGFubmVsIHRvIHRoZSBoYXNoIHRhYmxlLiBJZiB0aGUgZW50cnkgaXMK KwkJICogbWFya2VkIGZvciBicm9hZGNhc3QsIHdlIG11c3QgdXNlIGJyb2FkY2FzdCBtb2Rl LgorCQkgKi8KKwkJaWYgKCFlbnRyeSB8fCBlbnRyeS0+aXNfYnJvYWRjYXN0KQorCQl7CisJ CQlicm9hZGNhc3RfbW9kZSA9IHRydWU7CisJCQlMV0xvY2tSZWxlYXNlKGxvY2spOworCQkJ YnJlYWs7CisJCX0KKwkJTFdMb2NrUmVsZWFzZShsb2NrKTsKKwl9CiAKLQkJQXNzZXJ0KHBp ZCAhPSBJbnZhbGlkUGlkKTsKLQkJcG9zID0gUVVFVUVfQkFDS0VORF9QT1MoaSk7Ci0JCWlm IChRVUVVRV9CQUNLRU5EX0RCT0lEKGkpID09IE15RGF0YWJhc2VJZCkKKwlpZiAoYnJvYWRj YXN0X21vZGUpCisJeworCQkvKgorCQkgKiBJbiBicm9hZGNhc3QgbW9kZSwgd2UgaXRlcmF0 ZSBvdmVyIGFsbCBsaXN0ZW5pbmcgYmFja2VuZHMgYW5kCisJCSAqIHNpZ25hbCB0aGUgb25l cyBpbiBvdXIgZGF0YWJhc2UgdGhhdCBhcmUgbm90IGFscmVhZHkgY2F1Z2h0IHVwLgorCQkg Ki8KKwkJZm9yIChQcm9jTnVtYmVyIGkgPSBRVUVVRV9GSVJTVF9MSVNURU5FUjsgaSAhPSBJ TlZBTElEX1BST0NfTlVNQkVSOyBpID0gUVVFVUVfTkVYVF9MSVNURU5FUihpKSkKIAkJewor CQkJaW50MzIJCXBpZDsKKwkJCVF1ZXVlUG9zaXRpb24gcG9zOworCisJCQlpZiAoUVVFVUVf QkFDS0VORF9EQk9JRChpKSAhPSBNeURhdGFiYXNlSWQpCisJCQkJY29udGludWU7CisKKwkJ CXBvcyA9IFFVRVVFX0JBQ0tFTkRfUE9TKGkpOworCiAJCQkvKgogCQkJICogQWx3YXlzIHNp Z25hbCBsaXN0ZW5lcnMgaW4gb3VyIG93biBkYXRhYmFzZSwgdW5sZXNzIHRoZXkncmUKLQkJ CSAqIGFscmVhZHkgY2F1Z2h0IHVwICh1bmxpa2VseSwgYnV0IHBvc3NpYmxlKS4KKwkJCSAq IGFscmVhZHkgY2F1Z2h0IHVwLgogCQkJICovCiAJCQlpZiAoUVVFVUVfUE9TX0VRVUFMKHBv cywgUVVFVUVfSEVBRCkpCiAJCQkJY29udGludWU7CisKKwkJCXBpZCA9IFFVRVVFX0JBQ0tF TkRfUElEKGkpOworCQkJQXNzZXJ0KHBpZCAhPSBJbnZhbGlkUGlkKTsKKworCQkJLyogT0ss IG5lZWQgdG8gc2lnbmFsIHRoaXMgb25lICovCisJCQlwaWRzW2NvdW50XSA9IHBpZDsKKwkJ CXByb2Nub3NbY291bnRdID0gaTsKKwkJCXNpZ25hbGVkW2ldID0gdHJ1ZTsKKwkJCWNvdW50 Kys7CiAJCX0KLQkJZWxzZQorCX0KKwllbHNlCisJeworCQkvKgorCQkgKiBJbiBtdWx0aWNh c3QgbW9kZSwgc2lnbmFsIHNwZWNpZmljIGxpc3RlbmluZyBiYWNrZW5kcy4gV2UgbXVzdAor CQkgKiByZS1jaGVjayB0aGUgaGFzaCBlbnRyaWVzIGhlcmUgaW5zaWRlIHRoZSBsb2NrIHRv IGF2b2lkIHJhY2VzLgorCQkgKi8KKwkJZm9yZWFjaChwLCBjaGFubmVscykKIAkJewotCQkJ LyoKLQkJCSAqIExpc3RlbmVycyBpbiBvdGhlciBkYXRhYmFzZXMgc2hvdWxkIGJlIHNpZ25h bGVkIG9ubHkgaWYgdGhleQotCQkJICogYXJlIGZhciBiZWhpbmQuCi0JCQkgKi8KLQkJCWlm IChhc3luY1F1ZXVlUGFnZURpZmYoUVVFVUVfUE9TX1BBR0UoUVVFVUVfSEVBRCksCi0JCQkJ CQkJCSAgIFFVRVVFX1BPU19QQUdFKHBvcykpIDwgUVVFVUVfQ0xFQU5VUF9ERUxBWSkKLQkJ CQljb250aW51ZTsKKwkJCWNoYXIJICAgKmNoYW5uZWwgPSAoY2hhciAqKSBsZmlyc3QocCk7 CisJCQlDaGFubmVsRW50cnkgKmVudHJ5OworCQkJTFdMb2NrCSAgICpsb2NrID0gR2V0Q2hh bm5lbEhhc2hMb2NrKGNoYW5uZWwpOworCisJCQlMV0xvY2tBY3F1aXJlKGxvY2ssIExXX1NI QVJFRCk7CisJCQllbnRyeSA9IENoYW5uZWxIYXNoTG9va3VwKGNoYW5uZWwpOworCisJCQlp ZiAoZW50cnkgJiYgIWVudHJ5LT5pc19icm9hZGNhc3QpCisJCQl7CisJCQkJZm9yIChpbnQg aiA9IDA7IGogPCBlbnRyeS0+bnVtX2xpc3RlbmVyczsgaisrKQorCQkJCXsKKwkJCQkJUHJv Y051bWJlcglpID0gZW50cnktPmxpc3RlbmVyc1tqXTsKKwkJCQkJaW50MzIJCXBpZDsKKwkJ CQkJUXVldWVQb3NpdGlvbiBwb3M7CisKKwkJCQkJaWYgKHNpZ25hbGVkW2ldKQorCQkJCQkJ Y29udGludWU7CisKKwkJCQkJcG9zID0gUVVFVUVfQkFDS0VORF9QT1MoaSk7CisKKwkJCQkJ aWYgKFFVRVVFX1BPU19FUVVBTChwb3MsIFFVRVVFX0hFQUQpKQorCQkJCQkJY29udGludWU7 CisKKwkJCQkJaWYgKFFVRVVFX0JBQ0tFTkRfREJPSUQoaSkgIT0gTXlEYXRhYmFzZUlkKQor CQkJCQkJY29udGludWU7CisKKwkJCQkJcGlkID0gUVVFVUVfQkFDS0VORF9QSUQoaSk7CisJ CQkJCUFzc2VydChwaWQgIT0gSW52YWxpZFBpZCk7CisKKwkJCQkJcGlkc1tjb3VudF0gPSBw aWQ7CisJCQkJCXByb2Nub3NbY291bnRdID0gaTsKKwkJCQkJc2lnbmFsZWRbaV0gPSB0cnVl OworCQkJCQljb3VudCsrOworCQkJCX0KKwkJCX0KKwkJCUxXTG9ja1JlbGVhc2UobG9jayk7 CiAJCX0KKwl9CisKKwkvKgorCSAqIEFsc28gY2hlY2sgZm9yIGFueSBiYWNrZW5kcyB0aGF0 IGFyZSBmYXIgYmVoaW5kLiBUaGlzIGVuc3VyZXMgdGhlCisJICogZ2xvYmFsIHRhaWwgY2Fu IGFkdmFuY2UgZXZlbiBpZiB0aGV5J3JlIG5vdCBhY3RpdmVseSByZWNlaXZpbmcKKwkgKiBu b3RpZmljYXRpb25zIG9uIHRoZWlyIGNoYW5uZWxzLgorCSAqLworCWZvciAoUHJvY051bWJl ciBpID0gUVVFVUVfRklSU1RfTElTVEVORVI7IGkgIT0gSU5WQUxJRF9QUk9DX05VTUJFUjsg aSA9IFFVRVVFX05FWFRfTElTVEVORVIoaSkpCisJeworCQlpbnQzMgkJcGlkOworCQlRdWV1 ZVBvc2l0aW9uIHBvczsKKworCQkvKgorCQkgKiBTa2lwIGlmIHdlJ3ZlIGFscmVhZHkgZGVj aWRlZCB0byBzaWduYWwgdGhpcyBvbmUuCisJCSAqLworCQlpZiAoc2lnbmFsZWRbaV0pCisJ CQljb250aW51ZTsKKworCQlwb3MgPSBRVUVVRV9CQUNLRU5EX1BPUyhpKTsKKworCQkvKgor CQkgKiBTa2lwIHNpZ25hbGluZyBsaXN0ZW5lcnMgaWYgdGhleSBhbHJlYWR5IGNhdWdodCB1 cC4KKwkJICovCisJCWlmIChRVUVVRV9QT1NfRVFVQUwocG9zLCBRVUVVRV9IRUFEKSkKKwkJ CWNvbnRpbnVlOworCisJCS8qCisJCSAqIFdha2Ugb25seSB0YWlsIG9wdGltaXphdGlvbjog U2lnbmFsIHRoZSBiYWNrZW5kIHRoYXQgaXMgZnVydGhlc3QKKwkJICogYmVoaW5kIHRvIGhl bHAgcHJldmVudCBiYWNrZW5kcyBmcm9tIGdldHRpbmcgZmFyIGJlaGluZCBpbiB0aGUKKwkJ ICogZmlyc3QgcGxhY2UuIFRoaXMgZmluZHMgdGhlIGJhY2tlbmQocykgb24gdGhlIHNhbWUg cGFnZSBhcyB0aGUKKwkJICogZ2xvYmFsIHRhaWwsIHdoaWNoIGFyZSB0aGUgb25lcyBob2xk aW5nIHVwIHRydW5jYXRpb24uIFRoaXMgY3JlYXRlcworCQkgKiBhIGNoYWluIHJlYWN0aW9u IHdoZXJlIGVhY2ggYmFja2VuZCBldmVudHVhbGx5IHdha2VzIHVwIHRoZSBuZXh0CisJCSAq IG9uZSBhcyBub3RpZmljYXRpb25zIGFyZSBwcm9jZXNzZWQsIGF2b2lkaW5nIHRodW5kZXJp bmcgaGVyZC4KKwkJICovCisJCWlmICghdGFpbF93b2tlbiAmJiBhc3luY1F1ZXVlUGFnZURp ZmYoUVVFVUVfUE9TX1BBR0UoUVVFVUVfVEFJTCksCisJCQkJCQkJCQkJCSAgUVVFVUVfUE9T X1BBR0UocG9zKSkgPT0gMCkKKwkJCXRhaWxfd29rZW4gPSB0cnVlOworCQllbHNlCisJCQlj b250aW51ZTsKKworCQlwaWQgPSBRVUVVRV9CQUNLRU5EX1BJRChpKTsKKwkJQXNzZXJ0KHBp ZCAhPSBJbnZhbGlkUGlkKTsKIAkJLyogT0ssIG5lZWQgdG8gc2lnbmFsIHRoaXMgb25lICov CiAJCXBpZHNbY291bnRdID0gcGlkOwogCQlwcm9jbm9zW2NvdW50XSA9IGk7CiAJCWNvdW50 Kys7CiAJfQorCiAJTFdMb2NrUmVsZWFzZShOb3RpZnlRdWV1ZUxvY2spOwogCiAJLyogTm93 IHNlbmQgc2lnbmFscyAqLwpAQCAtMTY0Nyw5ICsyMDI2LDkgQEAgU2lnbmFsQmFja2VuZHMo dm9pZCkKIAogCQkvKgogCQkgKiBOb3RlOiBhc3N1bWluZyB0aGluZ3MgYXJlbid0IGJyb2tl biwgYSBzaWduYWwgZmFpbHVyZSBoZXJlIGNvdWxkCi0JCSAqIG9ubHkgb2NjdXIgaWYgdGhl IHRhcmdldCBiYWNrZW5kIGV4aXRlZCBzaW5jZSB3ZSByZWxlYXNlZAotCQkgKiBOb3RpZnlR dWV1ZUxvY2s7IHdoaWNoIGlzIHVubGlrZWx5IGJ1dCBjZXJ0YWlubHkgcG9zc2libGUuIFNv IHdlCi0JCSAqIGp1c3QgbG9nIGEgbG93LWxldmVsIGRlYnVnIG1lc3NhZ2UgaWYgaXQgaGFw cGVucy4KKwkJICogb25seSBvY2N1ciBpZiB0aGUgdGFyZ2V0IGJhY2tlbmQgZXhpdGVkIHNp bmNlIHdlIHJlbGVhc2VkIHRoZSBsb2NrOworCQkgKiB3aGljaCBpcyB1bmxpa2VseSBidXQg Y2VydGFpbmx5IHBvc3NpYmxlLiBTbyB3ZSBqdXN0IGxvZyBhCisJCSAqIGxvdy1sZXZlbCBk ZWJ1ZyBtZXNzYWdlIGlmIGl0IGhhcHBlbnMuCiAJCSAqLwogCQlpZiAoU2VuZFByb2NTaWdu YWwocGlkLCBQUk9DU0lHX05PVElGWV9JTlRFUlJVUFQsIHByb2Nub3NbaV0pIDwgMCkKIAkJ CWVsb2coREVCVUczLCAiY291bGQgbm90IHNpZ25hbCBiYWNrZW5kIHdpdGggUElEICVkOiAl bSIsIHBpZCk7CkBAIC0xNjU3LDYgKzIwMzYsNyBAQCBTaWduYWxCYWNrZW5kcyh2b2lkKQog CiAJcGZyZWUocGlkcyk7CiAJcGZyZWUocHJvY25vcyk7CisJcGZyZWUoc2lnbmFsZWQpOwog fQogCiAvKgpAQCAtMjM5NSwzICsyNzc1LDM4MiBAQCBjaGVja19ub3RpZnlfYnVmZmVycyhp bnQgKm5ld3ZhbCwgdm9pZCAqKmV4dHJhLCBHdWNTb3VyY2Ugc291cmNlKQogewogCXJldHVy biBjaGVja19zbHJ1X2J1ZmZlcnMoIm5vdGlmeV9idWZmZXJzIiwgbmV3dmFsKTsKIH0KKwor LyoKKyAqIEdVQyBjaGVja19ob29rIGZvciBub3RpZnlfbXVsdGljYXN0X3RocmVzaG9sZAor ICovCitib29sCitjaGVja19ub3RpZnlfbXVsdGljYXN0X3RocmVzaG9sZChpbnQgKm5ld3Zh bCwgdm9pZCAqKmV4dHJhLCBHdWNTb3VyY2Ugc291cmNlKQoreworCS8qCisJICogV2UgZG9u J3QgYWxsb3cgdmFsdWVzIGxlc3MgdGhhbiAwLiAgQSB2YWx1ZSBvZiAwIGlzIHNwZWNpYWwg YW5kIG1lYW5zCisJICogdGhlIG11bHRpY2FzdCBvcHRpbWl6YXRpb24gaXMgZGlzYWJsZWQg ZW50aXJlbHkuCisJICovCisJaWYgKCpuZXd2YWwgPCAwKQorCXsKKwkJR1VDX2NoZWNrX2Vy cmRldGFpbCgibm90aWZ5X211bHRpY2FzdF90aHJlc2hvbGQgbXVzdCBiZSBub24tbmVnYXRp dmUuIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoK KyAqIENoYW5uZWwgaGFzaCB0YWJsZSBtYW5hZ2VtZW50IGZ1bmN0aW9ucworICovCisKKy8q CisgKiBjaGFubmVsX2hhc2hfZnVuYworICogICAgIEN1c3RvbSBoYXNoIGZ1bmN0aW9uIGZv ciB0aGUgY2hhbm5lbCBoYXNoIHRhYmxlLiBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMKKyAqICAg ICB0aGF0IHRoZSBsb3ctb3JkZXIgYml0cyBvZiB0aGUgaGFzaCBhcmUgd2VsbC1kaXN0cmli dXRlZCwgd2hpY2ggaXMKKyAqICAgICBjcml0aWNhbCBmb3IgcGFydGl0aW9uZWQgaGFzaCB0 YWJsZXMuCisgKi8KK3N0YXRpYyB1aW50MzIKK2NoYW5uZWxfaGFzaF9mdW5jKGNvbnN0IHZv aWQgKmtleSwgU2l6ZSBrZXlzaXplKQoreworCWNvbnN0CQlDaGFubmVsSGFzaEtleSAqayA9 IChjb25zdCBDaGFubmVsSGFzaEtleSAqKSBrZXk7CisJdWludDMyCQloOworCisJLyoKKwkg KiBNaXggdGhlIGRib2lkIGFuZCB0aGUgY2hhbm5lbCBuYW1lIHRvIHByb2R1Y2UgYSBnb29k IGhhc2guIGhhc2hfYW55KCkKKwkgKiBpcyBhIGhpZ2gtcXVhbGl0eSBwb3J0YWJsZSBoYXNo IGZ1bmN0aW9uLiBUaGlzIHByZXZlbnRzIGNoYW5uZWxzIHdpdGgKKwkgKiB0aGUgc2FtZSBu YW1lIGluIGRpZmZlcmVudCBkYXRhYmFzZXMgZnJvbSBhbHdheXMgbWFwcGluZyB0byB0aGUg c2FtZQorCSAqIHBhcnRpdGlvbi4KKwkgKi8KKwloID0gRGF0dW1HZXRVSW50MzIoaGFzaF91 aW50MzIoay0+ZGJvaWQpKTsKKwloIF49IERhdHVtR2V0VUludDMyKGhhc2hfYW55KChjb25z dCB1bnNpZ25lZCBjaGFyICopIGstPmNoYW5uZWwsCisJCQkJCQkJCSBzdHJubGVuKGstPmNo YW5uZWwsIE5BTUVEQVRBTEVOKSkpOworCisJcmV0dXJuIGg7Cit9CisKKy8qCisgKiBHZXRD aGFubmVsSGFzaExvY2sKKyAqICAgICBSZXR1cm4gdGhlIExXTG9jayB0aGF0IHByb3RlY3Rz IHRoZSBwYXJ0aXRpb24gZm9yIHRoZSBnaXZlbiBjaGFubmVsIG5hbWUuCisgKi8KK3N0YXRp YyBMV0xvY2sgKgorR2V0Q2hhbm5lbEhhc2hMb2NrKGNvbnN0IGNoYXIgKmNoYW5uZWwpCit7 CisJQ2hhbm5lbEhhc2hLZXkga2V5OworCXVpbnQzMgkJaGFzaDsKKworCUNoYW5uZWxIYXNo UHJlcGFyZUtleSgma2V5LCBNeURhdGFiYXNlSWQsIGNoYW5uZWwpOworCWhhc2ggPSBnZXRf aGFzaF92YWx1ZShHZXRDaGFubmVsSGFzaCgpLCAma2V5KTsKKworCXJldHVybiAmY2hhbm5l bEhhc2hMb2Nrc1toYXNoICUgTlVNX05PVElGWV9QQVJUSVRJT05TXTsKK30KKworLyoKKyAq IENoYW5uZWxIYXNoUHJlcGFyZUtleQorICoJCVByZXBhcmUgYSBjaGFubmVsIGtleSAoZGF0 YWJhc2UgT0lEICsgY2hhbm5lbCBuYW1lKSBmb3IgdXNlIGFzIGEgaGFzaCBrZXkuCisgKi8K K3N0YXRpYyBpbmxpbmUgdm9pZAorQ2hhbm5lbEhhc2hQcmVwYXJlS2V5KENoYW5uZWxIYXNo S2V5ICoga2V5LCBPaWQgZGJvaWQsIGNvbnN0IGNoYXIgKmNoYW5uZWwpCit7CisJbWVtc2V0 KGtleSwgMCwgc2l6ZW9mKENoYW5uZWxIYXNoS2V5KSk7CisJa2V5LT5kYm9pZCA9IGRib2lk OworCXN0cmxjcHkoa2V5LT5jaGFubmVsLCBjaGFubmVsLCBOQU1FREFUQUxFTik7Cit9CisK Ky8qCisgKiBDaGFubmVsSGFzaEFkZExpc3RlbmVyCisgKiAgICAgUmVnaXN0ZXIgdGhlIGdp dmVuIGJhY2tlbmQgYXMgYSBsaXN0ZW5lciBmb3IgdGhlIHNwZWNpZmllZCBjaGFubmVsLgor ICoKKyAqIFRoaXMgZnVuY3Rpb24gdXNlcyBhbiBvcHRpbWlzdGljIHJlYWQtbG9ja2luZyBz dHJhdGVneSB0byBtYXhpbWl6ZQorICogY29uY3VycmVuY3kuIEFuIGV4Y2x1c2l2ZSBsb2Nr IGlzIG9ubHkgdGFrZW4gd2hlbiBtdXRhdGluZyB0aGUgbGlzdGVuZXIKKyAqIGxpc3QuCisg KgorICogMS4gSXQgZmlyc3QgdGFrZXMgYSBzaGFyZWQgbG9jay4gSWYgdGhlIGNoYW5uZWwg aXMgYWxyZWFkeSBpbiBicm9hZGNhc3QKKyAqICAgIG1vZGUsIG9yIGlmIHRoZSBjdXJyZW50 IGJhY2tlbmQgaXMgYWxyZWFkeSBpbiB0aGUgbGlzdGVuZXIgbGlzdCwgbm8gd3JpdGUKKyAq ICAgIGlzIG5lZWRlZCBhbmQgd2UgY2FuIHJldHVybiBpbW1lZGlhdGVseS4KKyAqCisgKiAy LiBJZiBhIHdyaXRlIGlzIG5lZWRlZCwgaXQgcmVsZWFzZXMgdGhlIHNoYXJlZCBsb2NrIGFu ZCBhY3F1aXJlcyBhbgorICogICAgZXhjbHVzaXZlIGxvY2suCisgKgorICogMy4gQ1JVQ0lB TExZLCBhZnRlciBhY3F1aXJpbmcgdGhlIGV4Y2x1c2l2ZSBsb2NrLCBpdCBtdXN0IHJlLWNo ZWNrIHRoZQorICogICAgc3RhdGUsIGFzIGFub3RoZXIgYmFja2VuZCBtYXkgaGF2ZSBtb2Rp ZmllZCB0aGUgZW50cnkgaW4gdGhlIGludGVyaW0uCisgKgorICogNC4gSWYgdGhlIG51bWJl ciBvZiBsaXN0ZW5lcnMgaXMgYmVsb3cgJ25vdGlmeV9tdWx0aWNhc3RfdGhyZXNob2xkJywg dGhlCisgKiAgICBuZXcgbGlzdGVuZXIgaXMgYWRkZWQuIElmIHRoZSB0aHJlc2hvbGQgaXMg cmVhY2hlZCwgdGhlIGNoYW5uZWwgaXMKKyAqICAgIGNvbnZlcnRlZCB0byBicm9hZGNhc3Qg bW9kZS4KKyAqLworc3RhdGljIHZvaWQKK0NoYW5uZWxIYXNoQWRkTGlzdGVuZXIoY29uc3Qg Y2hhciAqY2hhbm5lbCwgUHJvY051bWJlciBwcm9jbm8pCit7CisJQ2hhbm5lbEVudHJ5ICpl bnRyeTsKKwlib29sCQlmb3VuZDsKKwlDaGFubmVsSGFzaEtleSBrZXk7CisJTFdMb2NrCSAg ICpsb2NrID0gR2V0Q2hhbm5lbEhhc2hMb2NrKGNoYW5uZWwpOworCisJLyoKKwkgKiBJZiB0 aGUgdGhyZXNob2xkIGlzIHplcm8sIHRoaXMgb3B0aW1pemF0aW9uIGlzIGRpc2FibGVkLiBB bGwgY2hhbm5lbHMKKwkgKiBpbW1lZGlhdGVseSB1c2UgYnJvYWRjYXN0LCBzbyB3ZSBkb24n dCBuZWVkIHRvIHRyYWNrIHRoZW0uCisJICovCisJaWYgKG5vdGlmeV9tdWx0aWNhc3RfdGhy ZXNob2xkIDw9IDApCisJCXJldHVybjsKKworCUNoYW5uZWxIYXNoUHJlcGFyZUtleSgma2V5 LCBNeURhdGFiYXNlSWQsIGNoYW5uZWwpOworCisJLyoKKwkgKiBGQVNUIFBBVEg6IE9wdGlt aXN0aWNhbGx5IHRha2UgYSBzaGFyZWQgbG9jay4gSWYgdGhlIGNoYW5uZWwgaXMgYWxyZWFk eQorCSAqIGluIGJyb2FkY2FzdCBtb2RlLCBvciBpZiB3ZSBhcmUgYWxyZWFkeSBsaXN0ZWQs IHdlIGFyZSBkb25lLgorCSAqLworCUxXTG9ja0FjcXVpcmUobG9jaywgTFdfU0hBUkVEKTsK KwllbnRyeSA9IChDaGFubmVsRW50cnkgKikgaGFzaF9zZWFyY2goR2V0Q2hhbm5lbEhhc2go KSwgJmtleSwgSEFTSF9GSU5ELCBOVUxMKTsKKwlpZiAoZW50cnkpCisJeworCQlpZiAoZW50 cnktPmlzX2Jyb2FkY2FzdCkKKwkJeworCQkJTFdMb2NrUmVsZWFzZShsb2NrKTsKKwkJCXJl dHVybjsKKwkJfQorCQkvKiBDaGVjayBpZiB3ZSBhcmUgYWxyZWFkeSBpbiB0aGUgbGlzdCAq LworCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJ5LT5udW1fbGlzdGVuZXJzOyBpKyspCisJ CXsKKwkJCWlmIChlbnRyeS0+bGlzdGVuZXJzW2ldID09IHByb2NubykKKwkJCXsKKwkJCQlM V0xvY2tSZWxlYXNlKGxvY2spOworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0KKwlMV0xv Y2tSZWxlYXNlKGxvY2spOworCisJLyoKKwkgKiBTTE9XIFBBVEg6IFdlIG5lZWQgdG8gd3Jp dGUuIEFjcXVpcmUgZXhjbHVzaXZlIGxvY2suCisJICovCisJTFdMb2NrQWNxdWlyZShsb2Nr LCBMV19FWENMVVNJVkUpOworCisJLyoKKwkgKiBSZS1jaGVjayBzdGF0ZSBhZnRlciBhY3F1 aXJpbmcgZXhjbHVzaXZlIGxvY2ssIGFzIGl0IG1heSBoYXZlIGNoYW5nZWQuCisJICovCisJ ZW50cnkgPSAoQ2hhbm5lbEVudHJ5ICopIGhhc2hfc2VhcmNoKEdldENoYW5uZWxIYXNoKCks ICZrZXksIEhBU0hfRU5URVJfTlVMTCwgJmZvdW5kKTsKKworCWlmIChlbnRyeSA9PSBOVUxM KQorCXsKKwkJLyogT3V0IG9mIG1lbW9yeSBpbiB0aGUgaGFzaCBwYXJ0aXRpb24uICovCisJ CWVyZXBvcnQoREVCVUcxLCAoZXJybXNnKCJ0b28gbWFueSBub3RpZmljYXRpb24gY2hhbm5l bHMgYXJlIGFscmVhZHkgYmVpbmcgdHJhY2tlZCIpKSk7CisJCUxXTG9ja1JlbGVhc2UobG9j ayk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWZvdW5kKQorCXsKKwkJLyogRmlyc3QgbGlz dGVuZXIgZm9yIHRoaXMgY2hhbm5lbC4gKi8KKwkJZW50cnktPmlzX2Jyb2FkY2FzdCA9IGZh bHNlOworCQllbnRyeS0+bnVtX2xpc3RlbmVycyA9IDE7CisJCWVudHJ5LT5saXN0ZW5lcnNb MF0gPSBwcm9jbm87CisJfQorCWVsc2UKKwl7CisJCS8qIEVudHJ5IGFscmVhZHkgZXhpc3Rz LCByZS1jaGVjayBldmVyeXRoaW5nLiAqLworCQlib29sCQlhbHJlYWR5X3ByZXNlbnQgPSBm YWxzZTsKKworCQlpZiAoZW50cnktPmlzX2Jyb2FkY2FzdCkKKwkJeworCQkJLyogQW5vdGhl ciBiYWNrZW5kIHNldCBpdCB0byBicm9hZGNhc3QgbW9kZS4gV2UncmUgZG9uZS4gKi8KKwkJ CUxXTG9ja1JlbGVhc2UobG9jayk7CisJCQlyZXR1cm47CisJCX0KKworCQlmb3IgKGludCBp ID0gMDsgaSA8IGVudHJ5LT5udW1fbGlzdGVuZXJzOyBpKyspCisJCXsKKwkJCWlmIChlbnRy eS0+bGlzdGVuZXJzW2ldID09IHByb2NubykKKwkJCXsKKwkJCQlhbHJlYWR5X3ByZXNlbnQg PSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFhbHJlYWR5X3ByZXNl bnQpCisJCXsKKwkJCWlmIChlbnRyeS0+bnVtX2xpc3RlbmVycyA8IG5vdGlmeV9tdWx0aWNh c3RfdGhyZXNob2xkKQorCQkJeworCQkJCS8qIEFkZCBvdXJzZWx2ZXMgdG8gdGhlIGxpc3Qg b2YgbGlzdGVuZXJzLiAqLworCQkJCWVudHJ5LT5saXN0ZW5lcnNbZW50cnktPm51bV9saXN0 ZW5lcnNdID0gcHJvY25vOworCQkJCWVudHJ5LT5udW1fbGlzdGVuZXJzKys7CisJCQl9CisJ CQllbHNlCisJCQl7CisJCQkJLyogV2UgYXJlIHRoZSBsaXN0ZW5lciB0aGF0IGV4Y2VlZHMg dGhlIHRocmVzaG9sZC4gKi8KKwkJCQllbnRyeS0+aXNfYnJvYWRjYXN0ID0gdHJ1ZTsKKwkJ CQllbnRyeS0+bnVtX2xpc3RlbmVycyA9IDA7CS8qIENsZWFyIHRoZSBsaXN0ICovCisJCQl9 CisJCX0KKwl9CisJTFdMb2NrUmVsZWFzZShsb2NrKTsKK30KKworLyoKKyAqIENoYW5uZWxI YXNoUmVtb3ZlTGlzdGVuZXIKKyAqCQlVcGRhdGUgdGhlIGNoYW5uZWwgaGFzaCB3aGVuIGEg YmFja2VuZCBzdG9wcyBsaXN0ZW5pbmcgb24gYSBjaGFubmVsLgorICoKKyAqIFRoaXMgZnVu Y3Rpb24gdXNlcyBhbiBvcHRpbWlzdGljIHJlYWQtbG9jayBzdHJhdGVneS4gQW4gZXhjbHVz aXZlIGxvY2sgaXMKKyAqIG9ubHkgdGFrZW4gaWYgd2UgYXJlIGluIHRoZSBsaXN0ZW5lciBs aXN0IGZvciBhIGNoYW5uZWwgYW5kIG5lZWQgdG8gcmVtb3ZlCisgKiBvdXJzZWx2ZXMuIElm IGEgY2hhbm5lbCBpcyBpbiBicm9hZGNhc3QgbW9kZSwgd2UgY2Fubm90IHNhZmVseSBtb2Rp ZnkgaXQsCisgKiBhcyB3ZSBjYW4ndCBrbm93IHdoaWNoIGJhY2tlbmRzIGFyZSBsaXN0ZW5p bmcuCisgKi8KK3N0YXRpYyB2b2lkCitDaGFubmVsSGFzaFJlbW92ZUxpc3RlbmVyKGNvbnN0 IGNoYXIgKmNoYW5uZWwsIFByb2NOdW1iZXIgcHJvY25vKQoreworCUNoYW5uZWxFbnRyeSAq ZW50cnk7CisJQ2hhbm5lbEhhc2hLZXkga2V5OworCUxXTG9jawkgICAqbG9jayA9IEdldENo YW5uZWxIYXNoTG9jayhjaGFubmVsKTsKKwlib29sCQlwcmVzZW50ID0gZmFsc2U7CisKKwlD aGFubmVsSGFzaFByZXBhcmVLZXkoJmtleSwgTXlEYXRhYmFzZUlkLCBjaGFubmVsKTsKKwor CS8qCisJICogVGFrZSBhIHNoYXJlZCBsb2NrIGZpcnN0IHRvIHNlZSBpZiBhIHJlbW92YWwg aXMgZXZlbiBwb3NzaWJsZS4gSWYgdGhlCisJICogZW50cnkgZG9lc24ndCBleGlzdCwgaXMg aW4gYnJvYWRjYXN0IG1vZGUsIG9yIHdlJ3JlIG5vdCBpbiBpdHMgbGlzdCwgd2UKKwkgKiBo YXZlIG5vdGhpbmcgdG8gZG8uIFRoaXMgaXMgdGhlIGZhc3QgcGF0aC4KKwkgKi8KKwlMV0xv Y2tBY3F1aXJlKGxvY2ssIExXX1NIQVJFRCk7CisJZW50cnkgPSAoQ2hhbm5lbEVudHJ5ICop IGhhc2hfc2VhcmNoKEdldENoYW5uZWxIYXNoKCksICZrZXksIEhBU0hfRklORCwgTlVMTCk7 CisJaWYgKCFlbnRyeSB8fCBlbnRyeS0+aXNfYnJvYWRjYXN0KQorCXsKKwkJTFdMb2NrUmVs ZWFzZShsb2NrKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENoZWNrIGlmIHdlIGFyZSBpbiB0 aGUgbGlzdCAqLworCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cnktPm51bV9saXN0ZW5lcnM7 IGkrKykKKwl7CisJCWlmIChlbnRyeS0+bGlzdGVuZXJzW2ldID09IHByb2NubykKKwkJewor CQkJcHJlc2VudCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIXByZXNlbnQp CisJeworCQlMV0xvY2tSZWxlYXNlKGxvY2spOworCQlyZXR1cm47CisJfQorCUxXTG9ja1Jl bGVhc2UobG9jayk7CisKKwkvKiBBIHJlbW92YWwgaXMgbGlrZWx5IG5lZWRlZC4gQWNxdWly ZSBhbiBleGNsdXNpdmUgbG9jay4gKi8KKwlMV0xvY2tBY3F1aXJlKGxvY2ssIExXX0VYQ0xV U0lWRSk7CisKKwkvKgorCSAqIFJlLWNoZWNrIHRoZSBzdGF0ZS4gQW5vdGhlciBiYWNrZW5k IG1pZ2h0IGhhdmUgY2hhbmdlZCBpdCAoZS5nLiwgdG8KKwkgKiBicm9hZGNhc3QgbW9kZSku CisJICovCisJZW50cnkgPSAoQ2hhbm5lbEVudHJ5ICopIGhhc2hfc2VhcmNoKEdldENoYW5u ZWxIYXNoKCksICZrZXksIEhBU0hfRklORCwgTlVMTCk7CisJaWYgKGVudHJ5ICYmICFlbnRy eS0+aXNfYnJvYWRjYXN0KQorCXsKKwkJaW50CQkJaTsKKworCQlmb3IgKGkgPSAwOyBpIDwg ZW50cnktPm51bV9saXN0ZW5lcnM7IGkrKykKKwkJeworCQkJaWYgKGVudHJ5LT5saXN0ZW5l cnNbaV0gPT0gcHJvY25vKQorCQkJeworCQkJCS8qCisJCQkJICogRm91bmQgb3VyIHByb2Nu by4gUmVtb3ZlIGl0IGZyb20gdGhlIGxpc3RlbmVyIGFycmF5LgorCQkJCSAqCisJCQkJICog SWYgdGhpcyBpcyB0aGUgbGFzdCBsaXN0ZW5lciwgd2UgcmVtb3ZlIHRoZSBlbnRpcmUgaGFz aAorCQkJCSAqIGVudHJ5IGZvciB0aGUgY2hhbm5lbC4KKwkJCQkgKi8KKwkJCQlpZiAoZW50 cnktPm51bV9saXN0ZW5lcnMgPT0gMSkKKwkJCQl7CisJCQkJCSh2b2lkKSBoYXNoX3NlYXJj aChHZXRDaGFubmVsSGFzaCgpLCAma2V5LCBIQVNIX1JFTU9WRSwgTlVMTCk7CisJCQkJfQor CQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qCisJCQkJCSAqIFRvIHJlbW92ZSBhbiBlbGVtZW50 IGZyb20gdGhlIGFycmF5IHdoaWxlIGtlZXBpbmcgaXQKKwkJCQkJICogY29udGlndW91cywg d2UgZmlyc3QgZGVjcmVtZW50IHRoZSBsaXN0ZW5lciBjb3VudC4KKwkJCQkJICogVGhlbiwg d2Ugc2hpZnQgYWxsIHN1YnNlcXVlbnQgZWxlbWVudHMgb25lIHBvc2l0aW9uIHRvCisJCQkJ CSAqIHRoZSBsZWZ0LCBvdmVyd3JpdGluZyB0aGUgZWxlbWVudCB3ZSB3YW50IHRvIHJlbW92 ZS4KKwkJCQkJICoKKwkJCQkJICogVGhlIGBpZiAoaSA8IGVudHJ5LT5udW1fbGlzdGVuZXJz KWAgY29uZGl0aW9uCisJCQkJCSAqIGV4cGxpY2l0bHkgaGFuZGxlcyB0aGUgY2FzZSB3aGVy ZSB0aGUgbGFzdCBlbGVtZW50IGluCisJCQkJCSAqIHRoZSBhcnJheSBpcyBiZWluZyByZW1v dmVkLiBJbiB0aGF0IHNjZW5hcmlvLCBgaWAKKwkJCQkJICogZXF1YWxzIHRoZSBuZXcgYG51 bV9saXN0ZW5lcnNgLCBzbyBubyBtZW1vcnkgbW92ZW1lbnQKKwkJCQkJICogaXMgbmVjZXNz YXJ5LCBhbmQgdGhlIGBtZW1tb3ZlYCBpcyBjb3JyZWN0bHkgc2tpcHBlZC4KKwkJCQkJICov CisJCQkJCWVudHJ5LT5udW1fbGlzdGVuZXJzLS07CisJCQkJCWlmIChpIDwgZW50cnktPm51 bV9saXN0ZW5lcnMpCisJCQkJCXsKKwkJCQkJCVNpemUJCXNpemVfdG9fbW92ZTsKKworCQkJ CQkJc2l6ZV90b19tb3ZlID0gbXVsX3NpemUoZW50cnktPm51bV9saXN0ZW5lcnMgLSBpLAor CQkJCQkJCQkJCQkJc2l6ZW9mKFByb2NOdW1iZXIpKTsKKwkJCQkJCW1lbW1vdmUoJmVudHJ5 LT5saXN0ZW5lcnNbaV0sCisJCQkJCQkJCSZlbnRyeS0+bGlzdGVuZXJzW2kgKyAxXSwKKwkJ CQkJCQkJc2l6ZV90b19tb3ZlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsJCQkvKiBG b3VuZCBhbmQgcmVtb3ZlZCwgZXhpdCBsb29wLiAqLworCQkJfQorCQl9CisJfQorCUxXTG9j a1JlbGVhc2UobG9jayk7Cit9CisKKy8qCisgKiBDaGFubmVsSGFzaExvb2t1cAorICoJCUxv b2sgdXAgdGhlIGNoYW5uZWwgaGFzaCBlbnRyeSBmb3IgdGhlIGdpdmVuIGNoYW5uZWwgbmFt ZSBpbiB0aGUKKyAqCQljdXJyZW50IGRhdGFiYXNlLgorICoKKyAqIFJldHVybnMgTlVMTCBp ZiB0aGUgY2hhbm5lbCBpcyBub3QgYmVpbmcgdHJhY2tlZCAobm8gbGlzdGVuZXJzLCBvciBj aGFubmVsCisgKiBmZWxsIGJhY2sgdG8gYnJvYWRjYXN0IG1vZGUgYmVjYXVzZSB3ZSByYW4g b3V0IG9mIHNoYXJlZCBtZW1vcnkgd2hlbiB0cnlpbmcKKyAqIHRvIGFkZCBlbnRyaWVzIHRv IHRoZSBoYXNoIHRhYmxlKS4KKyAqCisgKiBDYWxsZXIgbXVzdCBob2xkIHRoZSBhcHByb3By aWF0ZSBwYXJ0aXRpb24gbG9jayAoc2hhcmVkIGlzIHN1ZmZpY2llbnQpLgorICovCitzdGF0 aWMgQ2hhbm5lbEVudHJ5ICoKK0NoYW5uZWxIYXNoTG9va3VwKGNvbnN0IGNoYXIgKmNoYW5u ZWwpCit7CisJQ2hhbm5lbEhhc2hLZXkga2V5OworCisJQXNzZXJ0KExXTG9ja0hlbGRCeU1l KEdldENoYW5uZWxIYXNoTG9jayhjaGFubmVsKSkpOworCisJQ2hhbm5lbEhhc2hQcmVwYXJl S2V5KCZrZXksIE15RGF0YWJhc2VJZCwgY2hhbm5lbCk7CisKKwlyZXR1cm4gKENoYW5uZWxF bnRyeSAqKSBoYXNoX3NlYXJjaChHZXRDaGFubmVsSGFzaCgpLAorCQkJCQkJCQkJCSZrZXks CisJCQkJCQkJCQkJSEFTSF9GSU5ELAorCQkJCQkJCQkJCU5VTEwpOworfQorCisvKgorICog R2V0UGVuZGluZ05vdGlmeUNoYW5uZWxzCisgKgkJR2V0IGxpc3Qgb2YgdW5pcXVlIGNoYW5u ZWwgbmFtZXMgZnJvbSBwZW5kaW5nIG5vdGlmaWNhdGlvbnMuCisgKi8KK3N0YXRpYyBMaXN0 ICoKK0dldFBlbmRpbmdOb3RpZnlDaGFubmVscyh2b2lkKQoreworCUxpc3QJICAgKmNoYW5u ZWxzID0gTklMOworCUxpc3RDZWxsICAgKnA7CisJTGlzdENlbGwgICAqcTsKKwlib29sCQlm b3VuZDsKKworCWlmICghcGVuZGluZ05vdGlmaWVzKQorCQlyZXR1cm4gTklMOworCisJLyog Q29sbGVjdCB1bmlxdWUgY2hhbm5lbCBuYW1lcyBmcm9tIHBlbmRpbmcgbm90aWZpY2F0aW9u cyAqLworCWZvcmVhY2gocCwgcGVuZGluZ05vdGlmaWVzLT5ldmVudHMpCisJeworCQlOb3Rp ZmljYXRpb24gKm4gPSAoTm90aWZpY2F0aW9uICopIGxmaXJzdChwKTsKKwkJY2hhcgkgICAq Y2hhbm5lbCA9IG4tPmRhdGE7CisKKwkJLyogQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIHRo aXMgY2hhbm5lbCBpbiBvdXIgbGlzdCAqLworCQlmb3VuZCA9IGZhbHNlOworCQlmb3JlYWNo KHEsIGNoYW5uZWxzKQorCQl7CisJCQljaGFyCSAgICpleGlzdGluZyA9IChjaGFyICopIGxm aXJzdChxKTsKKworCQkJaWYgKHN0cmNtcChleGlzdGluZywgY2hhbm5lbCkgPT0gMCkKKwkJ CXsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAo IWZvdW5kKQorCQkJY2hhbm5lbHMgPSBsYXBwZW5kKGNoYW5uZWxzLCBjaGFubmVsKTsKKwl9 CisKKwlyZXR1cm4gY2hhbm5lbHM7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGls cy9pbml0L2dsb2JhbHMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2luaXQvZ2xvYmFscy5jCmlu ZGV4IGQzMWNiNDVhMDU4Li4yNTE5NmUzMjQ2YiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv dXRpbHMvaW5pdC9nbG9iYWxzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvaW5pdC9nbG9i YWxzLmMKQEAgLTE2Miw2ICsxNjIsNyBAQCBpbnQJCQljb21taXRfdGltZXN0YW1wX2J1ZmZl cnMgPSAwOwogaW50CQkJbXVsdGl4YWN0X21lbWJlcl9idWZmZXJzID0gMzI7CiBpbnQJCQlt dWx0aXhhY3Rfb2Zmc2V0X2J1ZmZlcnMgPSAxNjsKIGludAkJCW5vdGlmeV9idWZmZXJzID0g MTY7CitpbnQJCQlub3RpZnlfbXVsdGljYXN0X3RocmVzaG9sZCA9IDE2OwogaW50CQkJc2Vy aWFsaXphYmxlX2J1ZmZlcnMgPSAzMjsKIGludAkJCXN1YnRyYW5zYWN0aW9uX2J1ZmZlcnMg PSAwOwogaW50CQkJdHJhbnNhY3Rpb25fYnVmZmVycyA9IDA7CmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL21p c2MvZ3VjX3RhYmxlcy5jCmluZGV4IGQxNGIxNjc4ZTdmLi4xZTY0MmY5ZjY5ZSAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMKKysrIGIvc3JjL2Jh Y2tlbmQvdXRpbHMvbWlzYy9ndWNfdGFibGVzLmMKQEAgLTI0NjQsNiArMjQ2NCwxOSBAQCBz dHJ1Y3QgY29uZmlnX2ludCBDb25maWd1cmVOYW1lc0ludFtdID0KIAkJY2hlY2tfbm90aWZ5 X2J1ZmZlcnMsIE5VTEwsIE5VTEwKIAl9LAogCisJeworCQl7Im5vdGlmeV9tdWx0aWNhc3Rf dGhyZXNob2xkIiwgUEdDX1BPU1RNQVNURVIsIFJFU09VUkNFU19NRU0sCisJCQlnZXR0ZXh0 X25vb3AoIlNldHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpc3RlbmVycyB0byB0cmFjayBw ZXIgY2hhbm5lbCBmb3IgbXVsdGljYXN0IHNpZ25hbGluZy4iKSwKKwkJCWdldHRleHRfbm9v cCgiV2hlbiB0aGUgbnVtYmVyIG9mIGxpc3RlbmVycyBvbiBhIGNoYW5uZWwgZXhjZWVkcyB0 aGlzIHRocmVzaG9sZCwgIgorCQkJCQkJICJOT1RJRlkgd2lsbCBzaWduYWwgYWxsIGxpc3Rl bmluZyBiYWNrZW5kcyByYXRoZXIgdGhhbiBqdXN0IHRob3NlICIKKwkJCQkJCSAibGlzdGVu aW5nIG9uIHRoZSBzcGVjaWZpYyBjaGFubmVsLiBTZXR0aW5nIHRvIDAgZGlzYWJsZXMgbXVs dGljYXN0ICIKKwkJCQkJCSAic2lnbmFsaW5nIGVudGlyZWx5LiIpLAorCQl9LAorCQkmbm90 aWZ5X211bHRpY2FzdF90aHJlc2hvbGQsCisJCTE2LCAwLCBNQVhfQkFDS0VORFMsCisJCWNo ZWNrX25vdGlmeV9tdWx0aWNhc3RfdGhyZXNob2xkLCBOVUxMLCBOVUxMCisJfSwKKwogCXsK IAkJeyJzZXJpYWxpemFibGVfYnVmZmVycyIsIFBHQ19QT1NUTUFTVEVSLCBSRVNPVVJDRVNf TUVNLAogCQkJZ2V0dGV4dF9ub29wKCJTZXRzIHRoZSBzaXplIG9mIHRoZSBkZWRpY2F0ZWQg YnVmZmVyIHBvb2wgdXNlZCBmb3IgdGhlIHNlcmlhbGl6YWJsZSB0cmFuc2FjdGlvbiBjYWNo ZS4iKSwKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL21pc2NhZG1pbi5oIGIvc3JjL2luY2x1 ZGUvbWlzY2FkbWluLmgKaW5kZXggMWJlZjk4NDcxYzMuLmIyMzQ5MjY1M2YzIDEwMDY0NAot LS0gYS9zcmMvaW5jbHVkZS9taXNjYWRtaW4uaAorKysgYi9zcmMvaW5jbHVkZS9taXNjYWRt aW4uaApAQCAtMTgyLDYgKzE4Miw3IEBAIGV4dGVybiBQR0RMTElNUE9SVCBpbnQgY29tbWl0 X3RpbWVzdGFtcF9idWZmZXJzOwogZXh0ZXJuIFBHRExMSU1QT1JUIGludCBtdWx0aXhhY3Rf bWVtYmVyX2J1ZmZlcnM7CiBleHRlcm4gUEdETExJTVBPUlQgaW50IG11bHRpeGFjdF9vZmZz ZXRfYnVmZmVyczsKIGV4dGVybiBQR0RMTElNUE9SVCBpbnQgbm90aWZ5X2J1ZmZlcnM7Citl eHRlcm4gUEdETExJTVBPUlQgaW50IG5vdGlmeV9tdWx0aWNhc3RfdGhyZXNob2xkOwogZXh0 ZXJuIFBHRExMSU1QT1JUIGludCBzZXJpYWxpemFibGVfYnVmZmVyczsKIGV4dGVybiBQR0RM TElNUE9SVCBpbnQgc3VidHJhbnNhY3Rpb25fYnVmZmVyczsKIGV4dGVybiBQR0RMTElNUE9S VCBpbnQgdHJhbnNhY3Rpb25fYnVmZmVyczsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0 aWxzL2d1Y19ob29rcy5oIGIvc3JjL2luY2x1ZGUvdXRpbHMvZ3VjX2hvb2tzLmgKaW5kZXgg ODJhYzg2NDZhOGQuLmVkM2EwMGJiN2U0IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGls cy9ndWNfaG9va3MuaAorKysgYi9zcmMvaW5jbHVkZS91dGlscy9ndWNfaG9va3MuaApAQCAt OTIsNiArOTIsNyBAQCBleHRlcm4gYm9vbCBjaGVja19tdWx0aXhhY3RfbWVtYmVyX2J1ZmZl cnMoaW50ICpuZXd2YWwsIHZvaWQgKipleHRyYSwKIGV4dGVybiBib29sIGNoZWNrX211bHRp eGFjdF9vZmZzZXRfYnVmZmVycyhpbnQgKm5ld3ZhbCwgdm9pZCAqKmV4dHJhLAogCQkJCQkJ CQkJCSAgIEd1Y1NvdXJjZSBzb3VyY2UpOwogZXh0ZXJuIGJvb2wgY2hlY2tfbm90aWZ5X2J1 ZmZlcnMoaW50ICpuZXd2YWwsIHZvaWQgKipleHRyYSwgR3VjU291cmNlIHNvdXJjZSk7Citl eHRlcm4gYm9vbCBjaGVja19ub3RpZnlfbXVsdGljYXN0X3RocmVzaG9sZChpbnQgKm5ld3Zh bCwgdm9pZCAqKmV4dHJhLCBHdWNTb3VyY2Ugc291cmNlKTsKIGV4dGVybiBib29sIGNoZWNr X3ByaW1hcnlfc2xvdF9uYW1lKGNoYXIgKipuZXd2YWwsIHZvaWQgKipleHRyYSwKIAkJCQkJ CQkJCUd1Y1NvdXJjZSBzb3VyY2UpOwogZXh0ZXJuIGJvb2wgY2hlY2tfcmFuZG9tX3NlZWQo ZG91YmxlICpuZXd2YWwsIHZvaWQgKipleHRyYSwgR3VjU291cmNlIHNvdXJjZSk7Ci0tIAoy LjQ3LjEKCg== --9d1d57ec0f5b491b9cf3acfb887aee29--