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 1vt0EK-00EBW5-0A for pgsql-hackers@arkaria.postgresql.org; Thu, 19 Feb 2026 09:21:52 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vt0EI-002yqM-0G for pgsql-hackers@arkaria.postgresql.org; Thu, 19 Feb 2026 09:21:50 +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 1vt0EH-002yqD-2C for pgsql-hackers@lists.postgresql.org; Thu, 19 Feb 2026 09:21:49 +0000 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vt0EE-000000007Ju-0pfW for pgsql-hackers@postgresql.org; Thu, 19 Feb 2026 09:21:49 +0000 Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-2ad22a5e245so5356795ad.2 for ; Thu, 19 Feb 2026 01:21:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1771492904; cv=none; d=google.com; s=arc-20240605; b=OsPcB6pty+7z99lUK7jEM74FtssA4+uGPqheXw6docradPVxOgGM/6vimDTyY8VM2E GrnHMpvF/E/H+wnqvNqfzmZ9l65I6FBg0NprAM/jMcWMsjF+QRfsTk4p3NynovAw3BRV IZ1rQ0vsAlPOFVxnqkOEUDE0hleeWEDpcoAxcLOy9sqI61DYoblyUESeT8irOzCJEzV1 Lx6pG1vnDC4pbTr84OY51/VA3n1z5PRp4MQR/G2+knQEXjrRX3NfscKuANnapuXxm+Su og38pf2iUxgG4EQN+JO2AKKWQjJrEH/nVXO9Av+ydqrA+B7a6cq/Rut0UYN7ieABtMgo YPlA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=W2B/L3naegIS+IimbJQwGSqOel46bsxYWyYTXT2yv3k=; fh=306nlTjwMsc2VcZ2tujbHbHAtQA7wpuqTmL2lfazbnU=; b=Wkd8AxDceNnAQi+RzJA9sSazgFVfVR0NZqrhmCjnANExEc89X5ynkaJIoahpAcE70A fafP3VQa95HJzEzDu4didqDyUhXMHR9TPFw6J4bTdKi8Ynut3qe45TiNx0qoURGg2fPv +bxGujrMoBGpZrW39bYcEGt7xQ2r499HU1s/sIqWsS9vfO7HYPPLgHsd1wfMr64May/f dNQFHIog5olZX5l78T6B79XbQlzS4zSZzG0CvLCHZRTIm/++FV1E7fvgKXLg6Du7b9eJ k+242uVCBUsmJPFOEnF1FkNJEal3zfOqB6KA5bBhosq1QtE14gvVND8+1u6/6F7R6CzE nZ1A==; 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=20230601; t=1771492904; x=1772097704; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=W2B/L3naegIS+IimbJQwGSqOel46bsxYWyYTXT2yv3k=; b=drc4RmlugbxgoHB4t6wVZe0flrEM+5FhtUX1kTu27oEcR56lA6g0i0Y+Vawnq3Bxla a5HuKPX0RcMomD8SM8Nf7G180D2JqwXauJ4sh6GBK0uz2ktd0mPDd0Rky/Y3PrCcGAoD d0bjDClB+IRtfIFw9xVwIIZDiJYc+BDhiGE0sUq6Dqwk0MOvvNIWsQTsn/cttwgHDuUD UhXS3WlmmRMleA6WCwt8zqDr3eWHNJXMc6EseeHuDtHzONou7EPG92vhiJd1nmlp4CU0 wKwKh898A5AfowO1aHstyKAJ/OzGFO/59uA6Ja2UtfAech6UhNVtvf1f4JWKQnQKLBaM JRLg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771492904; x=1772097704; h=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; bh=W2B/L3naegIS+IimbJQwGSqOel46bsxYWyYTXT2yv3k=; b=n87UwCvlBifPEyfsUojVYP0ZD8rk1CNjU4xf89WSM19P5NEAbJ+1vQEo3oqOsW8eQS sz6upor+LO1PJj9Qe0z3S87f2vMVNPWRngMvcWbOLLoyBtDL5Dkt5S/T0fkh/UPKvnKg qJC2lcDe68WAay1wVnfJHpZpup5KuZcx79h70VWrxXO16kmGatN6lMqVrhCYqLsC8Yx1 JNNgRI+rixQl1F5lrZuCGl+7IyQ6/XGdqVE3DhaIOnZwlcrzVKmjW3CKnyVx983wLOSV HwytJJhw9rm/POjjJ9h32kOdbqsX68xDaopiGbfm5IlodvZRERkwk/pDbMPPUtvbtrSG 2w0Q== X-Forwarded-Encrypted: i=1; AJvYcCUBIZpIKSKXn4mS9Qgs+Ug2zn/y8HOmF8P8aZwgWGs+pt29IYYMHJGAsJO2y3sfPKFt0ihBcpRoEifzsNBv@postgresql.org X-Gm-Message-State: AOJu0Yy9H+kLcenUJAjrqNR4iQZufWoppMfwaZwLTOzZ2GmBGu6ibRpR CqB5C4JFTy+NgAiHl59ekq/lzUjr0MBL4kEAd8InR1/Uo7QNwQb6zIH8U2iQLwjRPYfEj9fK556 GfieYJ91J0ZLMduSwLC+rjYYiDnMhKJEh6gwW X-Gm-Gg: AZuq6aJXX9W8oHWXX+jt3xOl3gr8DiNolpJwedRCM4jQxPwfe8r/LQL6UOXpAuJCBOp 1VGw4MWLE94JrBMYyBzCGRCUsuhfxbNJCyvHxrUSBKFIEnTU7JUWJCJur2t65xqd2EhlT0KKChV RNyUoITpBFI/RgnRypgMhA1KkxtdF4fG0Xg1XAPtUoRO5/oj58zXgkJkrieIZlpTKstyQqTohEI GeKuMx/3Ots0YSU4gcPSdn4bNgmR5NPrSxtjvG8n1c37xpp6ifBmR/DGyhaezmJ6udDszGNyEr9 4tE4Mc0L X-Received: by 2002:a17:903:41c7:b0:2a0:9eed:5182 with SMTP id d9443c01a7336-2ad50ec6743mr44950795ad.20.1771492904213; Thu, 19 Feb 2026 01:21:44 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Amit Langote Date: Thu, 19 Feb 2026 18:21:27 +0900 X-Gm-Features: AaiRm52cJCDg5YQWfl4PuqLzn2C94obCl8jekSUBF5LvxxoZkS-18ERU93gOEHI Message-ID: Subject: Re: Eliminating SPI / SQL from some RI triggers - take 3 To: Junwang Zhao Cc: Pavel Stehule , PostgreSQL-development Content-Type: multipart/mixed; boundary="000000000000473637064b29d5f5" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000473637064b29d5f5 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Junwang, On Mon, Dec 1, 2025 at 3:09=E2=80=AFPM Junwang Zhao wro= te: > As Amit has already stated, we are approaching a hybrid "fast-path + fall= back" > design. > > 0001 adds a fast path optimization for foreign key constraint checks > that bypasses the SPI executor, the fast path applies when the referenced > table is not partitioned, and the constraint does not involve temporal > semantics. > > With the following test: > > create table pk (a numeric primary key); > create table fk (a bigint references pk); > insert into pk select generate_series(1, 2000000); > > head: > > [local] zhjwpku@postgres:5432-90419=3D# insert into fk select > generate_series(1, 2000000, 2); > INSERT 0 1000000 > Time: 13516.177 ms (00:13.516) > > [local] zhjwpku@postgres:5432-90419=3D# update fk set a =3D a + 1; > UPDATE 1000000 > Time: 15057.638 ms (00:15.058) > > patched: > > [local] zhjwpku@postgres:5432-98673=3D# insert into fk select > generate_series(1, 2000000, 2); > INSERT 0 1000000 > Time: 8248.777 ms (00:08.249) > > [local] zhjwpku@postgres:5432-98673=3D# update fk set a =3D a + 1; > UPDATE 1000000 > Time: 10117.002 ms (00:10.117) > > 0002 cache fast-path metadata used by the index probe, at the current > time only comparison operator hash entries, operator function OIDs > and strategy numbers and subtypes for index scans. But this cache > doesn't buy any performance improvement. > > Caching additional metadata should improve performance for foreign key ch= ecks. > > Amit suggested introducing a mechanism for ri_triggers.c to register a > cleanup callback in the EState, which AfterTriggerEndQuery() could then > invoke to release per-statement cached metadata (such as the IndexScanDes= c). > However, I haven't been able to implement this mechanism yet. Thanks for working on this. I've taken your patches as a starting point and reworked the series into two patches (attached): 1st is your 0001+0002 as the core patch that adds a gated fast-path alternative to SPI and 2nd where I added per-statement resource caching. Doing the latter turned out to be not so hard thanks to the structure you chose to build the core fast path. Good call on adding the RLS and ACL test cases, btw. So, 0001 is a functionally complete fast path: concurrency handling, REPEATABLE READ crosscheck, cross-type operators, security context, and metadata caching. 0002 implements the per-statement resource caching we discussed, though instead of sharing the EState between trigger.c and ri_triggers.c it uses a new AfterTriggerBatchCallback mechanism that fires at the end of each trigger-firing cycle (per-statement for immediate constraints, or until COMMIT for deferred ones). It layers resource caching on top so that the PK relation, index, scan descriptor, and snapshot stay open across all FK trigger invocations within a single trigger-firing cycle rather than being opened and closed per row. Note that phe previous 0002 (metadata caching) is folded into 0001, and most of the new fast-path logic added in 0001 now lives in ri_FastPathCheck() rather than inline in RI_FKey_check(), so the RI_FKey_check diff is just the gating call and SPI fallback. I re-ran the benchmarks (same test as yours, different machine): create table pk (a numeric primary key); create table fk (a bigint references pk); insert into pk select generate_series(1, 2000000); insert into fk select generate_series(1, 2000000, 2); master: 2444 ms (median of 3 runs) 0001: 1382 ms (43% faster) 0001+0002: 1202 ms (51% faster, 13% over 0001 alone) Also, with int PK / int FK (1M rows): create table pk (a int primary key); create table fk (a int references pk); insert into pk select generate_series(1, 1000000); insert into fk select generate_series(1, 1000000); master: 1000 ms 0001: 520 ms (48% faster) 0001+0002: 432 ms (57% faster, 17% over 0001 alone) The incremental gain from 0002 comes from eliminating per-row relation open/close, scan begin/end, slot alloc/free, and replacing per-row GetSnapshotData() with only curcid adjustment on the registered snapshot copy in the cache. The two current limitations are partitioned referenced tables and temporal foreign keys. Partitioned PKs are relatively uncommon in practice, so the non-partitioned case should cover most FK workloads, so I'm not sure it's worth the added complexity to support them. Temporal FKs are inherently multi-row, so they're a poor fit for a single-probe fast path. David Rowley mentioned off-list that it might be worth batching multiple FK values into a single index probe, leveraging the ScalarArrayOp btree improvements from PostgreSQL 17. The idea would be to buffer FK values across trigger invocations in the per-constraint cache (0002 already has the right structure for this), build a SK_SEARCHARRAY scan key, and let the btree AM walk the matching leaf pages in one sorted traversal instead of one tree descent per row. The locking and recheck would still be per-tuple, but the index traversal cost drops significantly. Single-column FKs are the obvious starting point. That seems worth exploring but can be done as a separate patch on top of this. I think the series is in reasonable shape but would appreciate extra eyeballs, especially on the concurrency handling in ri_LockPKTuple() in 0001 and the snapshot lifecycle in 0002. Or anything else that catches one's eye. -- Thanks, Amit Langote --000000000000473637064b29d5f5 Content-Type: application/octet-stream; name="v3-0001-Add-fast-path-for-foreign-key-constraint-checks.patch" Content-Disposition: attachment; filename="v3-0001-Add-fast-path-for-foreign-key-constraint-checks.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mlt9156x0 RnJvbSAwMzU5YjJhMGRiN2ExOTVlNzk3ODUxYjU2YzM4MGE2MWFjNTQ5ZWNjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKdW53YW5nIFpoYW8gPHpoandwa3VAZ21haWwuY29tPgpEYXRl OiBUaHUsIDE5IEZlYiAyMDI2IDE4OjA2OjM0ICswOTAwClN1YmplY3Q6IFtQQVRDSCB2MyAxLzJd IEFkZCBmYXN0IHBhdGggZm9yIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgY2hlY2tzCgpBZGQgYSBm YXN0LXBhdGggb3B0aW1pemF0aW9uIGZvciBmb3JlaWduIGtleSBjaGVja3MgdGhhdCBieXBhc3Nl cyBTUEkKYnkgZGlyZWN0bHkgcHJvYmluZyB0aGUgdW5pcXVlIGluZGV4IG9uIHRoZSByZWZlcmVu Y2VkIHRhYmxlLgoKVGhlIGZhc3QgcGF0aCBhcHBsaWVzIHdoZW4gdGhlIHJlZmVyZW5jZWQgdGFi bGUgaXMgbm90IHBhcnRpdGlvbmVkIGFuZAp0aGUgY29uc3RyYWludCBkb2VzIG5vdCBpbnZvbHZl IHRlbXBvcmFsIHNlbWFudGljcy4gIHJpX0Zhc3RQYXRoQ2hlY2soKQpleHRyYWN0cyB0aGUgRksg dmFsdWVzLCBidWlsZHMgc2NhbiBrZXlzLCBwZXJmb3JtcyBhbiBpbmRleCBzY2FuLCBhbmQKbG9j a3MgdGhlIG1hdGNoaW5nIHR1cGxlIHdpdGggTG9ja1R1cGxlS2V5U2hhcmUgdmlhIHJpX0xvY2tQ S1R1cGxlKCksCndoaWNoIGhhbmRsZXMgdGhlIFJJLXNwZWNpZmljIHN1YnNldCBvZiB0YWJsZV90 dXBsZV9sb2NrKCkgcmVzdWx0cy4KCklmIHRoZSBsb2NrZWQgdHVwbGUgd2FzIHJlYWNoZWQgYnkg Y2hhc2luZyBhbiB1cGRhdGUgY2hhaW4KKHRtZmQudHJhdmVyc2VkKSwgcmVjaGVja19tYXRjaGVk X3BrX3R1cGxlKCkgdmVyaWZpZXMgdGhhdCB0aGUga2V5CmlzIHN0aWxsIHRoZSBzYW1lLCBlbXVs YXRpbmcgRXZhbFBsYW5RdWFsLgoKRm9yIFJFUEVBVEFCTEUgUkVBRCAvIFNFUklBTElaQUJMRSwg YSBzZWNvbmQgaW5kZXggcHJvYmUgd2l0aApHZXRUcmFuc2FjdGlvblNuYXBzaG90KCkgcmVwbGlj YXRlcyB0aGUgU1BJIHBhdGgncyBjcm9zc2NoZWNrX3NuYXBzaG90CmJlaGF2aW9yOiBhIFBLIHJv dyB2aXNpYmxlIHRvIHRoZSBsYXRlc3Qgc25hcHNob3QgYnV0IG5vdCB0byB0aGUKdHJhbnNhY3Rp b24gc25hcHNob3QgaXMgcmVqZWN0ZWQuCgpUaGUgcmlfQ2hlY2tQZXJtaXNzaW9ucygpIGZ1bmN0 aW9uIHBlcmZvcm1zIHNjaGVtYSBVU0FHRSBhbmQgdGFibGUKU0VMRUNUIGNoZWNrcywgbWF0Y2hp bmcgd2hhdCB0aGUgU1BJIHBhdGggZG9lcyBpbXBsaWNpdGx5LgoKcmlfSGFzaENvbXBhcmVPcCgp IGlzIGFkanVzdGVkIHRvIGhhbmRsZSBjcm9zcy10eXBlIGVxdWFsaXR5IG9wZXJhdG9ycwooZS5n LiBpbnQ0OGVxIGZvciBpbnQ0IFBLIC8gaW50OCBGSykgd2hpY2ggY2FuIGFwcGVhciBpbiBjb25w ZmVxb3AuClRoZSBvcmlnaW5hbCBjb2RlIGFzc2VydGVkIHNhbWUtdHlwZSBvcGVyYXRvcnMgb25s eS4KClBlci1rZXkgbWV0YWRhdGEgKGNvbXBhcmUgZW50cmllcywgb3BlcmF0b3IgcHJvY2VkdXJl cywgc3RyYXRlZ3kKbnVtYmVycykgaXMgY2FjaGVkIGluIFJJX0NvbnN0cmFpbnRJbmZvIHZpYQpy aV9wb3B1bGF0ZV9mYXN0cGF0aF9tZXRhZGF0YSgpIG9uIGZpcnN0IHVzZSwgZWxpbWluYXRpbmcg cmVwZWF0ZWQKY2FsbHMgdG8gcmlfSGFzaENvbXBhcmVPcCgpIGFuZCBnZXRfb3Bfb3BmYW1pbHlf cHJvcGVydGllcygpLgpjb25pbmRpZCBhbmQgcGtfaXNfcGFydGl0aW9uZWQgYXJlIGFsc28gY2Fj aGVkIGF0IGNvbnN0cmFpbnQgbG9hZAp0aW1lLCBhdm9pZGluZyBwZXItaW52b2NhdGlvbiBzeXNj YWNoZSBsb29rdXBzIGFuZCB0aGUgbmVlZCB0byBvcGVuCnBrX3JlbCBiZWZvcmUgZGVjaWRpbmcg d2hldGhlciB0aGUgZmFzdCBwYXRoIGFwcGxpZXMuCgpBdXRob3I6IEp1bndhbmcgWmhhbyA8emhq d3BrdUBnbWFpbC5jb20+CkF1dGhvcjogQW1pdCBMYW5nb3RlIDxhbWl0bGFuZ290ZTA5QGdtYWls LmNvbT4KRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS8KLS0tCiBzcmMvYmFja2VuZC91 dGlscy9hZHQvcmlfdHJpZ2dlcnMuYyAgICAgICAgICAgfCA0NjUgKysrKysrKysrKysrKysrKyst CiAuLi4vZXhwZWN0ZWQvZmstY29uY3VycmVudC1way11cGQub3V0ICAgICAgICAgfCAgNTggKysr CiBzcmMvdGVzdC9pc29sYXRpb24vaXNvbGF0aW9uX3NjaGVkdWxlICAgICAgICAgfCAgIDEgKwog Li4uL2lzb2xhdGlvbi9zcGVjcy9may1jb25jdXJyZW50LXBrLXVwZC5zcGVjIHwgIDQyICsrCiBz cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2ZvcmVpZ25fa2V5Lm91dCAgICAgfCAgNDcgKysKIHNy Yy90ZXN0L3JlZ3Jlc3Mvc3FsL2ZvcmVpZ25fa2V5LnNxbCAgICAgICAgICB8ICA2NCArKysKIDYg ZmlsZXMgY2hhbmdlZCwgNjY1IGluc2VydGlvbnMoKyksIDEyIGRlbGV0aW9ucygtKQogY3JlYXRl IG1vZGUgMTAwNjQ0IHNyYy90ZXN0L2lzb2xhdGlvbi9leHBlY3RlZC9may1jb25jdXJyZW50LXBr LXVwZC5vdXQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9pc29sYXRpb24vc3BlY3MvZmst Y29uY3VycmVudC1way11cGQuc3BlYwoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2Fk dC9yaV90cmlnZ2Vycy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3JpX3RyaWdnZXJzLmMKaW5k ZXggZDIyYjhlZjdmM2MuLjQ1Y2M3NDJmYTE5IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGls cy9hZHQvcmlfdHJpZ2dlcnMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcmlfdHJpZ2dl cnMuYwpAQCAtMjQsMTIgKzI0LDE1IEBACiAjaW5jbHVkZSAicG9zdGdyZXMuaCIKIAogI2luY2x1 ZGUgImFjY2Vzcy9odHVwX2RldGFpbHMuaCIKKyNpbmNsdWRlICJhY2Nlc3Mvc2tleS5oIgogI2lu Y2x1ZGUgImFjY2Vzcy9zeXNhdHRyLmgiCiAjaW5jbHVkZSAiYWNjZXNzL3RhYmxlLmgiCiAjaW5j bHVkZSAiYWNjZXNzL3RhYmxlYW0uaCIKICNpbmNsdWRlICJhY2Nlc3MveGFjdC5oIgorI2luY2x1 ZGUgImNhdGFsb2cvaW5kZXguaCIKICNpbmNsdWRlICJjYXRhbG9nL3BnX2NvbGxhdGlvbi5oIgog I2luY2x1ZGUgImNhdGFsb2cvcGdfY29uc3RyYWludC5oIgorI2luY2x1ZGUgImNhdGFsb2cvcGdf bmFtZXNwYWNlLmgiCiAjaW5jbHVkZSAiY29tbWFuZHMvdHJpZ2dlci5oIgogI2luY2x1ZGUgImV4 ZWN1dG9yL2V4ZWN1dG9yLmgiCiAjaW5jbHVkZSAiZXhlY3V0b3Ivc3BpLmgiCkBAIC05MSw2ICs5 NCw3IEBACiAjZGVmaW5lIFJJX1RSSUdUWVBFX1VQREFURSAyCiAjZGVmaW5lIFJJX1RSSUdUWVBF X0RFTEVURSAzCiAKK3N0cnVjdCBSSV9Db21wYXJlSGFzaEVudHJ5OwogCiAvKgogICogUklfQ29u c3RyYWludEluZm8KQEAgLTEzMiw2ICsxMzYsMTYgQEAgdHlwZWRlZiBzdHJ1Y3QgUklfQ29uc3Ry YWludEluZm8KIAlPaWQJCQlwZXJpb2RfaW50ZXJzZWN0X29wZXI7CS8qIGFueXJhbmdlICogYW55 cmFuZ2UgKG9yCiAJCQkJCQkJCQkJICogbXVsdGlyYW5nZXMpICovCiAJZGxpc3Rfbm9kZQl2YWxp ZF9saW5rOwkJLyogTGluayBpbiBsaXN0IG9mIHZhbGlkIGVudHJpZXMgKi8KKworCU9pZAkJCWNv bmluZGlkOworCWJvb2wJCXBrX2lzX3BhcnRpdGlvbmVkOworCisJLyogRmFzdC1wYXRoIG1ldGFk YXRhIGZvciBSSSBjaGVja3Mgb24gZm9yZWlnbiB0YWJsZXMgKi8KKwlib29sCQlmcG1ldGFfdmFs aWQ7CS8qIGlzIGZhc3QtcGF0aCBtZXRhZGF0YSB2YWxpZD8gKi8KKwlzdHJ1Y3QgUklfQ29tcGFy ZUhhc2hFbnRyeSAqY29tcGFyZV9lbnRyaWVzW1JJX01BWF9OVU1LRVlTXTsKKwlSZWdQcm9jZWR1 cmUgcmVnb3BzW1JJX01BWF9OVU1LRVlTXTsKKwlPaWQJCQlzdWJ0eXBlc1tSSV9NQVhfTlVNS0VZ U107CisJaW50CQkJc3RyYXRzW1JJX01BWF9OVU1LRVlTXTsKIH0gUklfQ29uc3RyYWludEluZm87 CiAKIC8qCkBAIC0yMzMsNiArMjQ3LDE5IEBAIHN0YXRpYyBib29sIHJpX1BlcmZvcm1DaGVjayhj b25zdCBSSV9Db25zdHJhaW50SW5mbyAqcmlpbmZvLAogCQkJCQkJCVR1cGxlVGFibGVTbG90ICpv bGRzbG90LCBUdXBsZVRhYmxlU2xvdCAqbmV3c2xvdCwKIAkJCQkJCQlib29sIGlzX3Jlc3RyaWN0 LAogCQkJCQkJCWJvb2wgZGV0ZWN0TmV3Um93cywgaW50IGV4cGVjdF9PSyk7CitzdGF0aWMgYm9v bCByaV9GYXN0UGF0aENoZWNrKGNvbnN0IFJJX0NvbnN0cmFpbnRJbmZvICpyaWluZm8sCisJCQkJ CQkJIFJlbGF0aW9uIGZrX3JlbCwgVHVwbGVUYWJsZVNsb3QgKm5ld3Nsb3QpOworc3RhdGljIGJv b2wgcmlfTG9ja1BLVHVwbGUoUmVsYXRpb24gcGtfcmVsLCBUdXBsZVRhYmxlU2xvdCAqc2xvdCwg U25hcHNob3Qgc25hcCwKKwkJCQkJCSAgIGJvb2wgKmNvbmN1cnJlbnRseV91cGRhdGVkKTsKK3N0 YXRpYyBib29sIHJpX2Zhc3RwYXRoX2lzX2FwcGxpY2FibGUoY29uc3QgUklfQ29uc3RyYWludElu Zm8gKnJpaW5mbyk7CitzdGF0aWMgdm9pZCByaV9DaGVja1Blcm1pc3Npb25zKFJlbGF0aW9uIHF1 ZXJ5X3JlbCk7CitzdGF0aWMgYm9vbCByZWNoZWNrX21hdGNoZWRfcGtfdHVwbGUoUmVsYXRpb24g aWR4cmVsLCBTY2FuS2V5RGF0YSAqc2tleXMsCisJCQkJCQkJCQkgVHVwbGVUYWJsZVNsb3QgKm5l d19zbG90KTsKK3N0YXRpYyB2b2lkIGJ1aWxkX2luZGV4X3NjYW5rZXlzKGNvbnN0IFJJX0NvbnN0 cmFpbnRJbmZvICpyaWluZm8sCisJCQkJCQkJCSBSZWxhdGlvbiBpZHhfcmVsLCBEYXR1bSAqcGtf dmFscywKKwkJCQkJCQkJIGNoYXIgKnBrX251bGxzLCBTY2FuS2V5IHNrZXlzKTsKK3N0YXRpYyB2 b2lkIHJpX3BvcHVsYXRlX2Zhc3RwYXRoX21ldGFkYXRhKFJJX0NvbnN0cmFpbnRJbmZvICpyaWlu Zm8sCisJCQkJCQkJCQkJICBSZWxhdGlvbiBma19yZWwsIFJlbGF0aW9uIGlkeF9yZWwpOwogc3Rh dGljIHZvaWQgcmlfRXh0cmFjdFZhbHVlcyhSZWxhdGlvbiByZWwsIFR1cGxlVGFibGVTbG90ICpz bG90LAogCQkJCQkJCSBjb25zdCBSSV9Db25zdHJhaW50SW5mbyAqcmlpbmZvLCBib29sIHJlbF9p c19waywKIAkJCQkJCQkgRGF0dW0gKnZhbHMsIGNoYXIgKm51bGxzKTsKQEAgLTI3NiwxNCArMzAz LDcgQEAgUklfRktleV9jaGVjayhUcmlnZ2VyRGF0YSAqdHJpZ2RhdGEpCiAJaWYgKCF0YWJsZV90 dXBsZV9zYXRpc2ZpZXNfc25hcHNob3QodHJpZ2RhdGEtPnRnX3JlbGF0aW9uLCBuZXdzbG90LCBT bmFwc2hvdFNlbGYpKQogCQlyZXR1cm4gUG9pbnRlckdldERhdHVtKE5VTEwpOwogCi0JLyoKLQkg KiBHZXQgdGhlIHJlbGF0aW9uIGRlc2NyaXB0b3JzIG9mIHRoZSBGSyBhbmQgUEsgdGFibGVzLgot CSAqCi0JICogcGtfcmVsIGlzIG9wZW5lZCBpbiBSb3dTaGFyZUxvY2sgbW9kZSBzaW5jZSB0aGF0 J3Mgd2hhdCBvdXIgZXZlbnR1YWwKLQkgKiBTRUxFQ1QgRk9SIEtFWSBTSEFSRSB3aWxsIGdldCBv biBpdC4KLQkgKi8KIAlma19yZWwgPSB0cmlnZGF0YS0+dGdfcmVsYXRpb247Ci0JcGtfcmVsID0g dGFibGVfb3BlbihyaWluZm8tPnBrX3JlbGlkLCBSb3dTaGFyZUxvY2spOwogCiAJc3dpdGNoIChy aV9OdWxsQ2hlY2soUmVsYXRpb25HZXREZXNjcihma19yZWwpLCBuZXdzbG90LCByaWluZm8sIGZh bHNlKSkKIAl7CkBAIC0yOTMsNyArMzEzLDYgQEAgUklfRktleV9jaGVjayhUcmlnZ2VyRGF0YSAq dHJpZ2RhdGEpCiAJCQkgKiBObyBmdXJ0aGVyIGNoZWNrIG5lZWRlZCAtIGFuIGFsbC1OVUxMIGtl eSBwYXNzZXMgZXZlcnkgdHlwZSBvZgogCQkJICogZm9yZWlnbiBrZXkgY29uc3RyYWludC4KIAkJ CSAqLwotCQkJdGFibGVfY2xvc2UocGtfcmVsLCBSb3dTaGFyZUxvY2spOwogCQkJcmV0dXJuIFBv aW50ZXJHZXREYXR1bShOVUxMKTsKIAogCQljYXNlIFJJX0tFWVNfU09NRV9OVUxMOgpAQCAtMzE4 LDcgKzMzNyw2IEBAIFJJX0ZLZXlfY2hlY2soVHJpZ2dlckRhdGEgKnRyaWdkYXRhKQogCQkJCQkJ CSBlcnJkZXRhaWwoIk1BVENIIEZVTEwgZG9lcyBub3QgYWxsb3cgbWl4aW5nIG9mIG51bGwgYW5k IG5vbm51bGwga2V5IHZhbHVlcy4iKSwKIAkJCQkJCQkgZXJydGFibGVjb25zdHJhaW50KGZrX3Jl bCwKIAkJCQkJCQkJCQkJCU5hbWVTdHIocmlpbmZvLT5jb25uYW1lKSkpKTsKLQkJCQkJdGFibGVf Y2xvc2UocGtfcmVsLCBSb3dTaGFyZUxvY2spOwogCQkJCQlyZXR1cm4gUG9pbnRlckdldERhdHVt KE5VTEwpOwogCiAJCQkJY2FzZSBGS0NPTlNUUl9NQVRDSF9TSU1QTEU6CkBAIC0zMjcsNyArMzQ1 LDYgQEAgUklfRktleV9jaGVjayhUcmlnZ2VyRGF0YSAqdHJpZ2RhdGEpCiAJCQkJCSAqIE1BVENI IFNJTVBMRSAtIGlmIEFOWSBjb2x1bW4gaXMgbnVsbCwgdGhlIGtleSBwYXNzZXMKIAkJCQkJICog dGhlIGNvbnN0cmFpbnQuCiAJCQkJCSAqLwotCQkJCQl0YWJsZV9jbG9zZShwa19yZWwsIFJvd1No YXJlTG9jayk7CiAJCQkJCXJldHVybiBQb2ludGVyR2V0RGF0dW0oTlVMTCk7CiAKICNpZmRlZiBO T1RfVVNFRApAQCAtMzUyLDggKzM2OSw0MiBAQCBSSV9GS2V5X2NoZWNrKFRyaWdnZXJEYXRhICp0 cmlnZGF0YSkKIAkJCWJyZWFrOwogCX0KIAorCS8qCisJICogRmFzdCBwYXRoOiBwcm9iZSB0aGUg UEsgdW5pcXVlIGluZGV4IGRpcmVjdGx5LCBieXBhc3NpbmcgU1BJLgorCSAqCisJICogTm90ZTog cGtfcmVsIGlzIE5PVCBvcGVuZWQgYWJvdmUuICByaV9mYXN0cGF0aF9pc19hcHBsaWNhYmxlKCkg dXNlcworCSAqIGNhY2hlZCBtZXRhZGF0YSAocGtfaXNfcGFydGl0aW9uZWQpIHJhdGhlciB0aGFu IGFuIG9wZW4gUmVsYXRpb24sIGFuZAorCSAqIHJpX0Zhc3RQYXRoQ2hlY2soKSBvcGVucyBpdCBp bnRlcm5hbGx5LgorCSAqLworCWlmIChyaV9mYXN0cGF0aF9pc19hcHBsaWNhYmxlKHJpaW5mbykp CisJeworCQlib29sCQlmb3VuZCA9IHJpX0Zhc3RQYXRoQ2hlY2socmlpbmZvLCBma19yZWwsIG5l d3Nsb3QpOworCisJCWlmIChmb3VuZCkKKwkJCXJldHVybiBQb2ludGVyR2V0RGF0dW0oTlVMTCk7 CisKKwkJLyoKKwkJICogcmlfRmFzdFBhdGhDaGVjayBvcGVucyBwa19yZWwgaW50ZXJuYWxseTsg d2UgbmVlZCBpdCBmb3IKKwkJICogcmlfUmVwb3J0VmlvbGF0aW9uLiAgUmUtb3BlbiBicmllZmx5 LgorCQkgKi8KKwkJcGtfcmVsID0gdGFibGVfb3BlbihyaWluZm8tPnBrX3JlbGlkLCBSb3dTaGFy ZUxvY2spOworCQlyaV9SZXBvcnRWaW9sYXRpb24ocmlpbmZvLCBwa19yZWwsIGZrX3JlbCwKKwkJ CQkJCSAgIG5ld3Nsb3QsIE5VTEwsCisJCQkJCQkgICBSSV9QTEFOX0NIRUNLX0xPT0tVUFBLLCBm YWxzZSwgZmFsc2UpOworCX0KKworCS8qIEZhbGwgYmFjayB0byBTUEkgKi8KKwllbG9nKERFQlVH MSwgIlJJIGZhc3RwYXRoOiBjb25zdHJhaW50IFwiJXNcIiBmYWxsaW5nIGJhY2sgdG8gU1BJIiwK KwkJIE5hbWVTdHIocmlpbmZvLT5jb25uYW1lKSk7CisKIAlTUElfY29ubmVjdCgpOwogCisJLyoK KwkgKiBwa19yZWwgaXMgb3BlbmVkIGluIFJvd1NoYXJlTG9jayBtb2RlIHNpbmNlIHRoYXQncyB3 aGF0IG91ciBldmVudHVhbAorCSAqIFNFTEVDVCBGT1IgS0VZIFNIQVJFIHdpbGwgZ2V0IG9uIGl0 LgorCSAqLworCXBrX3JlbCA9IHRhYmxlX29wZW4ocmlpbmZvLT5wa19yZWxpZCwgUm93U2hhcmVM b2NrKTsKKwogCS8qIEZldGNoIG9yIHByZXBhcmUgYSBzYXZlZCBwbGFuIGZvciB0aGUgcmVhbCBj aGVjayAqLwogCXJpX0J1aWxkUXVlcnlLZXkoJnFrZXksIHJpaW5mbywgUklfUExBTl9DSEVDS19M T09LVVBQSyk7CiAKQEAgLTIzNTUsNiArMjQwNiwxMSBAQCByaV9Mb2FkQ29uc3RyYWludEluZm8o T2lkIGNvbnN0cmFpbnRPaWQpCiAJZGNsaXN0X3B1c2hfdGFpbCgmcmlfY29uc3RyYWludF9jYWNo ZV92YWxpZF9saXN0LCAmcmlpbmZvLT52YWxpZF9saW5rKTsKIAogCXJpaW5mby0+dmFsaWQgPSB0 cnVlOworCXJpaW5mby0+ZnBtZXRhX3ZhbGlkID0gZmFsc2U7CisKKwlyaWluZm8tPmNvbmluZGlk ID0gY29uRm9ybS0+Y29uaW5kaWQ7CisJcmlpbmZvLT5wa19pc19wYXJ0aXRpb25lZCA9CisJCShn ZXRfcmVsX3JlbGtpbmQocmlpbmZvLT5wa19yZWxpZCkgPT0gUkVMS0lORF9QQVJUSVRJT05FRF9U QUJMRSk7CiAKIAlyZXR1cm4gcmlpbmZvOwogfQpAQCAtMjYxNyw2ICsyNjczLDM4MyBAQCByaV9Q ZXJmb3JtQ2hlY2soY29uc3QgUklfQ29uc3RyYWludEluZm8gKnJpaW5mbywKIAlyZXR1cm4gU1BJ X3Byb2Nlc3NlZCAhPSAwOwogfQogCisvKgorICogcmlfRmFzdFBhdGhDaGVjaworICoJCVBlcmZv cm0gRksgZXhpc3RlbmNlIGNoZWNrIHZpYSBkaXJlY3QgaW5kZXggcHJvYmUsIGJ5cGFzc2luZyBT UEkuCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBQSyByb3cgd2FzIGZvdW5kIChjb25zdHJh aW50IHNhdGlzZmllZCkuCisgKiBSZXR1cm5zIGZhbHNlIGlmIG5vIG1hdGNoaW5nIFBLIHJvdyBl eGlzdHM7IGNhbGxlciBzaG91bGQgY2FsbAorICogcmlfUmVwb3J0VmlvbGF0aW9uKCkuCisgKi8K K3N0YXRpYyBib29sCityaV9GYXN0UGF0aENoZWNrKGNvbnN0IFJJX0NvbnN0cmFpbnRJbmZvICpy aWluZm8sCisJCQkJIFJlbGF0aW9uIGZrX3JlbCwgVHVwbGVUYWJsZVNsb3QgKm5ld3Nsb3QpCit7 CisJUmVsYXRpb24JcGtfcmVsOworCVJlbGF0aW9uCWlkeF9yZWw7CisJSW5kZXhTY2FuRGVzYyBz Y2FuZGVzYzsKKwlUdXBsZVRhYmxlU2xvdCAqc2xvdDsKKwlEYXR1bQkJcGtfdmFsc1tJTkRFWF9N QVhfS0VZU107CisJY2hhcgkJcGtfbnVsbHNbSU5ERVhfTUFYX0tFWVNdOworCVNjYW5LZXlEYXRh IHNrZXlbSU5ERVhfTUFYX0tFWVNdOworCWJvb2wJCWZvdW5kID0gZmFsc2U7CisJT2lkCQkJc2F2 ZWRfdXNlcmlkOworCWludAkJCXNhdmVkX3NlY19jb250ZXh0OworCVNuYXBzaG90CXNuYXBzaG90 OworCisJLyoKKwkgKiBBZHZhbmNlIHRoZSBjb21tYW5kIGNvdW50ZXIgc28gdGhlIHNuYXBzaG90 IHNlZXMgdGhlIGVmZmVjdHMgb2YgcHJpb3IKKwkgKiB0cmlnZ2VycyBpbiB0aGlzIHN0YXRlbWVu dC4gIE1pcnJvcnMgd2hhdCB0aGUgU1BJIHBhdGggZG9lcyBpbgorCSAqIHJpX1BlcmZvcm1DaGVj aygpLgorCSAqLworCUNvbW1hbmRDb3VudGVySW5jcmVtZW50KCk7CisJc25hcHNob3QgPSBSZWdp c3RlclNuYXBzaG90KEdldExhdGVzdFNuYXBzaG90KCkpOworCisJcGtfcmVsID0gdGFibGVfb3Bl bihyaWluZm8tPnBrX3JlbGlkLCBSb3dTaGFyZUxvY2spOworCWlkeF9yZWwgPSBpbmRleF9vcGVu KHJpaW5mby0+Y29uaW5kaWQsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlzbG90ID0gdGFibGVfc2xv dF9jcmVhdGUocGtfcmVsLCBOVUxMKTsKKwlzY2FuZGVzYyA9IGluZGV4X2JlZ2luc2Nhbihwa19y ZWwsIGlkeF9yZWwsCisJCQkJCQkJICAgc25hcHNob3QsIE5VTEwsCisJCQkJCQkJICAgcmlpbmZv LT5ua2V5cywgMCk7CisKKwlpZiAoIXJpaW5mby0+ZnBtZXRhX3ZhbGlkKQorCQlyaV9wb3B1bGF0 ZV9mYXN0cGF0aF9tZXRhZGF0YSgoUklfQ29uc3RyYWludEluZm8gKikgcmlpbmZvLAorCQkJCQkJ CQkJICBma19yZWwsIGlkeF9yZWwpOworCUFzc2VydChyaWluZm8tPmZwbWV0YV92YWxpZCk7CisK KwlHZXRVc2VySWRBbmRTZWNDb250ZXh0KCZzYXZlZF91c2VyaWQsICZzYXZlZF9zZWNfY29udGV4 dCk7CisJU2V0VXNlcklkQW5kU2VjQ29udGV4dChSZWxhdGlvbkdldEZvcm0ocGtfcmVsKS0+cmVs b3duZXIsCisJCQkJCQkgICBzYXZlZF9zZWNfY29udGV4dCB8CisJCQkJCQkgICBTRUNVUklUWV9M T0NBTF9VU0VSSURfQ0hBTkdFIHwKKwkJCQkJCSAgIFNFQ1VSSVRZX05PRk9SQ0VfUkxTKTsKKwly aV9DaGVja1Blcm1pc3Npb25zKHBrX3JlbCk7CisKKwlyaV9FeHRyYWN0VmFsdWVzKGZrX3JlbCwg bmV3c2xvdCwgcmlpbmZvLCBmYWxzZSwgcGtfdmFscywgcGtfbnVsbHMpOworCWJ1aWxkX2luZGV4 X3NjYW5rZXlzKHJpaW5mbywgaWR4X3JlbCwgcGtfdmFscywgcGtfbnVsbHMsIHNrZXkpOworCisJ aW5kZXhfcmVzY2FuKHNjYW5kZXNjLCBza2V5LCByaWluZm8tPm5rZXlzLCBOVUxMLCAwKTsKKwor CWlmIChpbmRleF9nZXRuZXh0X3Nsb3Qoc2NhbmRlc2MsIEZvcndhcmRTY2FuRGlyZWN0aW9uLCBz bG90KSkKKwl7CisJCWJvb2wJCWNvbmN1cnJlbnRseV91cGRhdGVkOworCisJCWlmIChyaV9Mb2Nr UEtUdXBsZShwa19yZWwsIHNsb3QsIHNuYXBzaG90LAorCQkJCQkJICAgJmNvbmN1cnJlbnRseV91 cGRhdGVkKSkKKwkJeworCQkJaWYgKGNvbmN1cnJlbnRseV91cGRhdGVkKQorCQkJCWZvdW5kID0g cmVjaGVja19tYXRjaGVkX3BrX3R1cGxlKGlkeF9yZWwsIHNrZXksIHNsb3QpOworCQkJZWxzZQor CQkJCWZvdW5kID0gdHJ1ZTsKKwkJfQorCX0KKworCS8qLS0tLS0tLS0KKwkgKiBDcm9zc2NoZWNr IGZvciBSRVBFQVRBQkxFIFJFQUQgLyBTRVJJQUxJWkFCTEU6CisJICoKKwkgKiBUaGUgbGF0ZXN0 IHNuYXBzaG90IGNhbiBzZWUgUEsgcm93cyBjb21taXR0ZWQgYWZ0ZXIgb3VyIHRyYW5zYWN0aW9u CisJICogc3RhcnRlZC4gQnV0IHRoZSBGSyBjaGVjayBtdXN0IG9ubHkgc3VjY2VlZCBpZiB0aGUg a2V5IGFsc28gZXhpc3RzIGluIGEKKwkgKiB2ZXJzaW9uIHZpc2libGUgdG8gb3VyIHRyYW5zYWN0 aW9uIHNuYXBzaG90LiBXZSBjYW4ndCBqdXN0IGRvCisJICogdGFibGVfdHVwbGVfc2F0aXNmaWVz X3NuYXBzaG90IG9uIHRoZSBsb2NrZWQgdHVwbGUsIGJlY2F1c2UgYSBub24ta2V5CisJICogdXBk YXRlIGNyZWF0ZXMgYSBuZXcgdmVyc2lvbiBpbnZpc2libGUgdG8gb3VyIHNuYXBzaG90IGV2ZW4g dGhvdWdoIHRoZQorCSAqIGtleSBoYXNuJ3QgY2hhbmdlZC4KKwkgKgorCSAqIEluc3RlYWQsIGRv IGEgc2Vjb25kIGluZGV4IHByb2JlIHdpdGggdGhlIHRyYW5zYWN0aW9uIHNuYXBzaG90LiBUaGlz CisJICogY29ycmVjdGx5IGhhbmRsZXMgYm90aCBjYXNlczoKKwkgKgktIE5ld2x5IGluc2VydGVk IFBLIHJvdzogbm90IGZvdW5kIC0+IHJlamVjdAorCSAqCS0gTm9uLWtleSB1cGRhdGUgb2YgZXhp c3Rpbmcgcm93OiBvbGQgdmVyc2lvbiBmb3VuZCAtPiBhY2NlcHQKKwkgKgorCSAqIFRoaXMgbWF0 Y2hlcyB0aGUgY3Jvc3NjaGVja19zbmFwc2hvdCBiZWhhdmlvciBpbiB0aGUgU1BJIHBhdGgncwor CSAqIHJpX1BlcmZvcm1DaGVjaygpLgorCSAqLworCWlmIChmb3VuZCAmJiBJc29sYXRpb25Vc2Vz WGFjdFNuYXBzaG90KCkpCisJeworCQlJbmRleFNjYW5EZXNjIHhhY3Rfc2NhbjsKKwkJVHVwbGVU YWJsZVNsb3QgKnhhY3Rfc2xvdDsKKwkJU25hcHNob3QJeGFjdF9zbmFwID0gR2V0VHJhbnNhY3Rp b25TbmFwc2hvdCgpOworCisJCXhhY3Rfc2xvdCA9IHRhYmxlX3Nsb3RfY3JlYXRlKHBrX3JlbCwg TlVMTCk7CisJCXhhY3Rfc2NhbiA9IGluZGV4X2JlZ2luc2Nhbihwa19yZWwsCisJCQkJCQkJCQlp ZHhfcmVsLAorCQkJCQkJCQkJeGFjdF9zbmFwLCBOVUxMLAorCQkJCQkJCQkJcmlpbmZvLT5ua2V5 cywgMCk7CisJCWluZGV4X3Jlc2Nhbih4YWN0X3NjYW4sIHNrZXksIHJpaW5mby0+bmtleXMsIE5V TEwsIDApOworCisJCWlmICghaW5kZXhfZ2V0bmV4dF9zbG90KHhhY3Rfc2NhbiwgRm9yd2FyZFNj YW5EaXJlY3Rpb24sIHhhY3Rfc2xvdCkpCisJCQlmb3VuZCA9IGZhbHNlOworCisJCWluZGV4X2Vu ZHNjYW4oeGFjdF9zY2FuKTsKKwkJRXhlY0Ryb3BTaW5nbGVUdXBsZVRhYmxlU2xvdCh4YWN0X3Ns b3QpOworCX0KKworCWluZGV4X2VuZHNjYW4oc2NhbmRlc2MpOworCWluZGV4X2Nsb3NlKGlkeF9y ZWwsIE5vTG9jayk7CisJdGFibGVfY2xvc2UocGtfcmVsLCBOb0xvY2spOworCUV4ZWNEcm9wU2lu Z2xlVHVwbGVUYWJsZVNsb3Qoc2xvdCk7CisKKwlVbnJlZ2lzdGVyU25hcHNob3Qoc25hcHNob3Qp OworCisJU2V0VXNlcklkQW5kU2VjQ29udGV4dChzYXZlZF91c2VyaWQsIHNhdmVkX3NlY19jb250 ZXh0KTsKKworCXJldHVybiBmb3VuZDsKK30KKworLyoKKyAqIHJpX0xvY2tQS1R1cGxlCisgKgkJ TG9jayBhIFBLIHR1cGxlIGZvdW5kIGJ5IHRoZSBmYXN0LXBhdGggaW5kZXggc2Nhbi4KKyAqCisg KiBDYWxscyB0YWJsZV90dXBsZV9sb2NrKCkgZGlyZWN0bHkgd2l0aCBoYW5kbGluZyBzcGVjaWZp YyB0byBSSSBjaGVja3MuCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR1cGxlIHdhcyBzdWNjZXNz ZnVsbHkgbG9ja2VkLgorICoKKyAqIFNldHMgKmNvbmN1cnJlbnRseV91cGRhdGVkIHRvIHRydWUg aWYgdGhlIGxvY2tlZCB0dXBsZSB3YXMgcmVhY2hlZAorICogYnkgZm9sbG93aW5nIGFuIHVwZGF0 ZSBjaGFpbiAodG1mZC50cmF2ZXJzZWQpLCBpbmRpY2F0aW5nIHRoZSBjYWxsZXIKKyAqIHNob3Vs ZCByZWNoZWNrIHRoZSBrZXkuCisgKi8KK3N0YXRpYyBib29sCityaV9Mb2NrUEtUdXBsZShSZWxh dGlvbiBwa19yZWwsIFR1cGxlVGFibGVTbG90ICpzbG90LCBTbmFwc2hvdCBzbmFwLAorCQkJICAg Ym9vbCAqY29uY3VycmVudGx5X3VwZGF0ZWQpCit7CisJVE1fRmFpbHVyZURhdGEgdG1mZDsKKwlU TV9SZXN1bHQJcmVzdWx0OworCWludAkJCWxvY2tmbGFncyA9IFRVUExFX0xPQ0tfRkxBR19MT0NL X1VQREFURV9JTl9QUk9HUkVTUzsKKworCSpjb25jdXJyZW50bHlfdXBkYXRlZCA9IGZhbHNlOwor CisJaWYgKCFJc29sYXRpb25Vc2VzWGFjdFNuYXBzaG90KCkpCisJCWxvY2tmbGFncyB8PSBUVVBM RV9MT0NLX0ZMQUdfRklORF9MQVNUX1ZFUlNJT047CisKKwlyZXN1bHQgPSB0YWJsZV90dXBsZV9s b2NrKHBrX3JlbCwgJnNsb3QtPnR0c190aWQsIHNuYXAsCisJCQkJCQkJICBzbG90LCBHZXRDdXJy ZW50Q29tbWFuZElkKGZhbHNlKSwKKwkJCQkJCQkgIExvY2tUdXBsZUtleVNoYXJlLCBMb2NrV2Fp dEJsb2NrLAorCQkJCQkJCSAgbG9ja2ZsYWdzLCAmdG1mZCk7CisKKwlzd2l0Y2ggKHJlc3VsdCkK Kwl7CisJCWNhc2UgVE1fT2s6CisJCQlpZiAodG1mZC50cmF2ZXJzZWQpCisJCQkJKmNvbmN1cnJl bnRseV91cGRhdGVkID0gdHJ1ZTsKKwkJCXJldHVybiB0cnVlOworCisJCWNhc2UgVE1fRGVsZXRl ZDoKKwkJCWlmIChJc29sYXRpb25Vc2VzWGFjdFNuYXBzaG90KCkpCisJCQkJZXJlcG9ydChFUlJP UiwKKwkJCQkJCShlcnJjb2RlKEVSUkNPREVfVF9SX1NFUklBTElaQVRJT05fRkFJTFVSRSksCisJ CQkJCQkgZXJybXNnKCJjb3VsZCBub3Qgc2VyaWFsaXplIGFjY2VzcyBkdWUgdG8gY29uY3VycmVu dCB1cGRhdGUiKSkpOworCQkJcmV0dXJuIGZhbHNlOworCisJCWNhc2UgVE1fVXBkYXRlZDoKKwkJ CWlmIChJc29sYXRpb25Vc2VzWGFjdFNuYXBzaG90KCkpCisJCQkJZXJlcG9ydChFUlJPUiwKKwkJ CQkJCShlcnJjb2RlKEVSUkNPREVfVF9SX1NFUklBTElaQVRJT05fRkFJTFVSRSksCisJCQkJCQkg ZXJybXNnKCJjb3VsZCBub3Qgc2VyaWFsaXplIGFjY2VzcyBkdWUgdG8gY29uY3VycmVudCB1cGRh dGUiKSkpOworCisJCQkvKgorCQkJICogSW4gUkVBRCBDT01NSVRURUQsIEZJTkRfTEFTVF9WRVJT SU9OIHNob3VsZCBoYXZlIGNoYXNlZCB0aGUKKwkJCSAqIGNoYWluIGFuZCByZXR1cm5lZCBUTV9P ay4gIEdldHRpbmcgaGVyZSBtZWFucyBzb21ldGhpbmcKKwkJCSAqIHVuZXhwZWN0ZWQgLS0gZmFs bCB0aHJvdWdoIHRvIGVycm9yLgorCQkJICovCisJCQllbG9nKEVSUk9SLCAidW5leHBlY3RlZCB0 YWJsZV90dXBsZV9sb2NrIHN0YXR1czogJXUiLCByZXN1bHQpOworCQkJYnJlYWs7CisKKwkJY2Fz ZSBUTV9TZWxmTW9kaWZpZWQ6CisKKwkJCS8qCisJCQkgKiBUaGUgY3VycmVudCBjb21tYW5kIG9y IGEgbGF0ZXIgY29tbWFuZCBpbiB0aGlzIHRyYW5zYWN0aW9uCisJCQkgKiBtb2RpZmllZCB0aGUg UEsgcm93LiAgVGhpcyBzaG91bGRuJ3Qgbm9ybWFsbHkgaGFwcGVuIGR1cmluZyBhbgorCQkJICog RksgY2hlY2sgKHdlJ3JlIG5vdCBtb2RpZnlpbmcgcGtfcmVsKSwgYnV0IGhhbmRsZSBpdCBzYWZl bHkgYnkKKwkJCSAqIHRyZWF0aW5nIHRoZSB0dXBsZSBhcyBub3QgZm91bmQuCisJCQkgKi8KKwkJ CXJldHVybiBmYWxzZTsKKworCQljYXNlIFRNX0ludmlzaWJsZToKKwkJCWVsb2coRVJST1IsICJh dHRlbXB0ZWQgdG8gbG9jayBpbnZpc2libGUgdHVwbGUiKTsKKwkJCWJyZWFrOworCisJCWRlZmF1 bHQ6CisJCQllbG9nKEVSUk9SLCAidW5yZWNvZ25pemVkIHRhYmxlX3R1cGxlX2xvY2sgc3RhdHVz OiAldSIsIHJlc3VsdCk7CisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZmFsc2U7CQkJCS8qIGtl ZXAgY29tcGlsZXIgcXVpZXQgKi8KK30KKworc3RhdGljIGJvb2wKK3JpX2Zhc3RwYXRoX2lzX2Fw cGxpY2FibGUoY29uc3QgUklfQ29uc3RyYWludEluZm8gKnJpaW5mbykKK3sKKwkvKgorCSAqIFBh cnRpdGlvbmVkIHJlZmVyZW5jZWQgdGFibGVzIGFyZSBza2lwcGVkIGZvciBzaW1wbGljaXR5LCBz aW5jZSB0aGV5CisJICogcmVxdWlyZSByb3V0aW5nIHRoZSBwcm9iZSB0aHJvdWdoIHRoZSBjb3Jy ZWN0IHBhcnRpdGlvbiB1c2luZworCSAqIFBhcnRpdGlvbkRpcmVjdG9yeS4KKwkgKi8KKwlpZiAo cmlpbmZvLT5wa19pc19wYXJ0aXRpb25lZCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBU ZW1wb3JhbCBmb3JlaWduIGtleXMgdXNlIHJhbmdlIG92ZXJsYXAgYW5kIGNvbnRhaW5tZW50IHNl bWFudGljcyAoJiYsCisJICogPEAsIHJhbmdlX2FnZygpKSB0aGF0IGluaGVyZW50bHkgaW52b2x2 ZSBhZ2dyZWdhdGlvbiBhbmQgbXVsdGlwbGUtcm93CisJICogcmVhc29uaW5nLCBzbyB0aGV5IHN0 YXkgb24gdGhlIFNQSSBwYXRoLgorCSAqLworCWlmIChyaWluZm8tPmhhc3BlcmlvZCkKKwkJcmV0 dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiByaV9DaGVja1Blcm1pc3Np b25zCisgKiAgIENoZWNrIHRoYXQgdGhlIG5ldyB1c2VyIGhhcyBwZXJtaXNzaW9ucyB0byBsb29r IGludG8gdGhlIHNjaGVtYSBvZgorICogICBhbmQgU0VMRUNUIGZyb20gJ3F1ZXJ5X3JlbCcKKyAq CisgKiBQcm92aWRlZCBmb3Igbm9uLVNRTCBpbXBsZW1lbnRvcnMgb2YgYW4gUklfUGxhbi4KKyAq Lworc3RhdGljIHZvaWQKK3JpX0NoZWNrUGVybWlzc2lvbnMoUmVsYXRpb24gcXVlcnlfcmVsKQor eworCUFjbFJlc3VsdAlhY2xyZXN1bHQ7CisKKwkvKiBVU0FHRSBvbiBzY2hlbWEuICovCisJYWNs cmVzdWx0ID0gb2JqZWN0X2FjbGNoZWNrKE5hbWVzcGFjZVJlbGF0aW9uSWQsCisJCQkJCQkJCVJl bGF0aW9uR2V0TmFtZXNwYWNlKHF1ZXJ5X3JlbCksCisJCQkJCQkJCUdldFVzZXJJZCgpLCBBQ0xf VVNBR0UpOworCWlmIChhY2xyZXN1bHQgIT0gQUNMQ0hFQ0tfT0spCisJCWFjbGNoZWNrX2Vycm9y KGFjbHJlc3VsdCwgT0JKRUNUX1NDSEVNQSwKKwkJCQkJICAgZ2V0X25hbWVzcGFjZV9uYW1lKFJl bGF0aW9uR2V0TmFtZXNwYWNlKHF1ZXJ5X3JlbCkpKTsKKworCS8qIFNFTEVDVCBvbiByZWxhdGlv bi4gKi8KKwlhY2xyZXN1bHQgPSBwZ19jbGFzc19hY2xjaGVjayhSZWxhdGlvbkdldFJlbGlkKHF1 ZXJ5X3JlbCksIEdldFVzZXJJZCgpLAorCQkJCQkJCQkgIEFDTF9TRUxFQ1QpOworCWlmIChhY2xy ZXN1bHQgIT0gQUNMQ0hFQ0tfT0spCisJCWFjbGNoZWNrX2Vycm9yKGFjbHJlc3VsdCwgT0JKRUNU X1RBQkxFLAorCQkJCQkgICBSZWxhdGlvbkdldFJlbGF0aW9uTmFtZShxdWVyeV9yZWwpKTsKK30K KworLyoKKyAqIFRoaXMgY2hlY2tzIHRoYXQgdGhlIGluZGV4IGtleSBvZiB0aGUgdHVwbGUgc3Bl Y2lmaWVkIGluICduZXdfc2xvdCcgbWF0Y2hlcworICogdGhlIGtleSB0aGF0IGhhcyBhbHJlYWR5 IGJlZW4gZm91bmQgaW4gdGhlIFBLIGluZGV4IHJlbGF0aW9uICdpZHhyZWwnLgorICoKKyAqIFJl dHVybnMgdHJ1ZSBpZiB0aGUgaW5kZXgga2V5IG9mIHRoZSB0dXBsZSBtYXRjaGVzIHRoZSBleGlz dGluZyBpbmRleAorICoga2V5LCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBib29sCity ZWNoZWNrX21hdGNoZWRfcGtfdHVwbGUoUmVsYXRpb24gaWR4cmVsLCBTY2FuS2V5RGF0YSAqc2tl eXMsCisJCQkJCQkgVHVwbGVUYWJsZVNsb3QgKm5ld19zbG90KQoreworCUluZGV4SW5mbyAgKmlu ZGV4SW5mbyA9IEJ1aWxkSW5kZXhJbmZvKGlkeHJlbCk7CisJRGF0dW0JCXZhbHVlc1tJTkRFWF9N QVhfS0VZU107CisJYm9vbAkJaXNudWxsW0lOREVYX01BWF9LRVlTXTsKKwlib29sCQltYXRjaGVk ID0gdHJ1ZTsKKworCS8qIFBLIGluZGV4ZXMgbmV2ZXIgaGF2ZSB0aGVzZS4gKi8KKwlBc3NlcnQo aW5kZXhJbmZvLT5paV9FeHByZXNzaW9ucyA9PSBOSUwgJiYKKwkJICAgaW5kZXhJbmZvLT5paV9F eGNsdXNpb25PcHMgPT0gTlVMTCk7CisKKwkvKiBGb3JtIHRoZSBpbmRleCB2YWx1ZXMgYW5kIGlz bnVsbCBmbGFncyBnaXZlbiB0aGUgdGFibGUgdHVwbGUuICovCisJRm9ybUluZGV4RGF0dW0oaW5k ZXhJbmZvLCBuZXdfc2xvdCwgTlVMTCwgdmFsdWVzLCBpc251bGwpOworCWZvciAoaW50IGkgPSAw OyBpIDwgaW5kZXhJbmZvLT5paV9OdW1JbmRleEtleUF0dHJzOyBpKyspCisJeworCQlTY2FuS2V5 RGF0YSAqc2tleSA9ICZza2V5c1tpXTsKKworCQkvKiBBIFBLIGNvbHVtbiBjYW4gbmV2ZXIgYmUg c2V0IHRvIE5VTEwuICovCisJCUFzc2VydCghaXNudWxsW2ldKTsKKwkJaWYgKCFEYXR1bUdldEJv b2woRnVuY3Rpb25DYWxsMkNvbGwoJnNrZXktPnNrX2Z1bmMsCisJCQkJCQkJCQkJCXNrZXktPnNr X2NvbGxhdGlvbiwKKwkJCQkJCQkJCQkJdmFsdWVzW2ldLAorCQkJCQkJCQkJCQlza2V5LT5za19h cmd1bWVudCkpKQorCQl7CisJCQltYXRjaGVkID0gZmFsc2U7CisJCQlicmVhazsKKwkJfQorCX0K KworCXJldHVybiBtYXRjaGVkOworfQorCisvKgorICogYnVpbGRfaW5kZXhfc2NhbmtleXMKKyAq CQlCdWlsZCBTY2FuS2V5cyBmb3IgYSBkaXJlY3QgaW5kZXggcHJvYmUgb2YgdGhlIFBLJ3MgdW5p cXVlIGluZGV4LgorICoKKyAqIFVzZXMgY2FjaGVkIGNvbXBhcmUgZW50cmllcywgb3BlcmF0b3Ig cHJvY2VkdXJlcywgYW5kIHN0cmF0ZWd5IG51bWJlcnMKKyAqIGZyb20gcmlfcG9wdWxhdGVfZmFz dHBhdGhfbWV0YWRhdGEoKSByYXRoZXIgdGhhbiBsb29raW5nIHRoZW0gdXAgb24KKyAqIGVhY2gg aW52b2NhdGlvbi4gIENhc3RzIEZLIHZhbHVlcyB0byB0aGUgb3BlcmF0b3IncyBleHBlY3RlZCBp bnB1dAorICogdHlwZSBpZiBuZWVkZWQuCisgKi8KK3N0YXRpYyB2b2lkCitidWlsZF9pbmRleF9z Y2Fua2V5cyhjb25zdCBSSV9Db25zdHJhaW50SW5mbyAqcmlpbmZvLAorCQkJCQkgUmVsYXRpb24g aWR4X3JlbCwgRGF0dW0gKnBrX3ZhbHMsCisJCQkJCSBjaGFyICpwa19udWxscywgU2NhbktleSBz a2V5cykKK3sKKwkvKgorCSAqIE1heSBuZWVkIHRvIGNhc3QgZWFjaCBvZiB0aGUgaW5kaXZpZHVh bCB2YWx1ZXMgb2YgdGhlIGZvcmVpZ24ga2V5IHRvCisJICogdGhlIGNvcnJlc3BvbmRpbmcgUEsg Y29sdW1uJ3MgdHlwZSBpZiB0aGUgZXF1YWxpdHkgb3BlcmF0b3IgZGVtYW5kcyBpdC4KKwkgKi8K Kwlmb3IgKGludCBpID0gMDsgaSA8IHJpaW5mby0+bmtleXM7IGkrKykKKwl7CisJCWlmIChwa19u dWxsc1tpXSAhPSAnbicpCisJCXsKKwkJCVJJX0NvbXBhcmVIYXNoRW50cnkgKmVudHJ5ID0gcmlp bmZvLT5jb21wYXJlX2VudHJpZXNbaV07CisKKwkJCWlmIChPaWRJc1ZhbGlkKGVudHJ5LT5jYXN0 X2Z1bmNfZmluZm8uZm5fb2lkKSkKKwkJCQlwa192YWxzW2ldID0gRnVuY3Rpb25DYWxsMygmZW50 cnktPmNhc3RfZnVuY19maW5mbywKKwkJCQkJCQkJCQkgICBwa192YWxzW2ldLAorCQkJCQkJCQkJ CSAgIEludDMyR2V0RGF0dW0oLTEpLAkvKiB0eXBtb2QgKi8KKwkJCQkJCQkJCQkgICBCb29sR2V0 RGF0dW0oZmFsc2UpKTsJLyogaW1wbGljaXQgY29lcmNpb24gKi8KKwkJfQorCQllbHNlCisJCXsK KwkJCUFzc2VydChmYWxzZSk7CisJCX0KKwl9CisKKwkvKgorCSAqIFNldCB1cCBTY2FuS2V5cyBm b3IgdGhlIGluZGV4IHNjYW4uIFRoaXMgaXMgZXNzZW50aWFsbHkgaG93CisJICogRXhlY0luZGV4 QnVpbGRTY2FuS2V5cygpIHNldHMgdGhlbSB1cC4KKwkgKi8KKwlmb3IgKGludCBpID0gMDsgaSA8 IHJpaW5mby0+bmtleXM7IGkrKykKKwl7CisJCWludAkJCXBrYXR0cm5vID0gaSArIDE7CisKKwkJ U2NhbktleUVudHJ5SW5pdGlhbGl6ZSgmc2tleXNbaV0sIDAsIHBrYXR0cm5vLAorCQkJCQkJCSAg IHJpaW5mby0+c3RyYXRzW2ldLCByaWluZm8tPnN1YnR5cGVzW2ldLAorCQkJCQkJCSAgIGlkeF9y ZWwtPnJkX2luZGNvbGxhdGlvbltpXSwgcmlpbmZvLT5yZWdvcHNbaV0sCisJCQkJCQkJICAgcGtf dmFsc1tpXSk7CisJfQorfQorCisvKgorICogcmlfcG9wdWxhdGVfZmFzdHBhdGhfbWV0YWRhdGEK KyAqCQlDYWNoZSBwZXIta2V5IG1ldGFkYXRhIG5lZWRlZCBieSBidWlsZF9pbmRleF9zY2Fua2V5 cygpLgorICoKKyAqIExvb2tzIHVwIHRoZSBjb21wYXJlIGhhc2ggZW50cnksIG9wZXJhdG9yIHBy b2NlZHVyZSBPSUQsIGFuZCBpbmRleAorICogc3RyYXRlZ3kvc3VidHlwZSBmb3IgZWFjaCBrZXkg Y29sdW1uLiAgQ2FsbGVkIGxhemlseSBvbiBmaXJzdCB1c2UKKyAqIGFuZCBwZXJzaXN0cyBmb3Ig dGhlIGxpZmV0aW1lIG9mIHRoZSBSSV9Db25zdHJhaW50SW5mbyBlbnRyeS4KKyAqLworc3RhdGlj IHZvaWQKK3JpX3BvcHVsYXRlX2Zhc3RwYXRoX21ldGFkYXRhKFJJX0NvbnN0cmFpbnRJbmZvICpy aWluZm8sCisJCQkJCQkJICBSZWxhdGlvbiBma19yZWwsIFJlbGF0aW9uIGlkeF9yZWwpCit7CisJ QXNzZXJ0KHJpaW5mbyAhPSBOVUxMICYmIHJpaW5mby0+dmFsaWQpOworCisJZm9yIChpbnQgaSA9 IDA7IGkgPCByaWluZm8tPm5rZXlzOyBpKyspCisJeworCQlPaWQJCQllcV9vcHIgPSByaWluZm8t PnBmX2VxX29wcnNbaV07CisJCU9pZAkJCXR5cGVpZCA9IFJJQXR0VHlwZShma19yZWwsIHJpaW5m by0+ZmtfYXR0bnVtc1tpXSk7CisJCU9pZAkJCWxlZnR0eXBlOworCQlSSV9Db21wYXJlSGFzaEVu dHJ5ICplbnRyeSA9IHJpX0hhc2hDb21wYXJlT3AoZXFfb3ByLCB0eXBlaWQpOworCisJCXJpaW5m by0+Y29tcGFyZV9lbnRyaWVzW2ldID0gZW50cnk7CisJCXJpaW5mby0+cmVnb3BzW2ldID0gZ2V0 X29wY29kZShlcV9vcHIpOworCisJCWdldF9vcF9vcGZhbWlseV9wcm9wZXJ0aWVzKGVxX29wciwK KwkJCQkJCQkJICAgaWR4X3JlbC0+cmRfb3BmYW1pbHlbaV0sCisJCQkJCQkJCSAgIGZhbHNlLAor CQkJCQkJCQkgICAmcmlpbmZvLT5zdHJhdHNbaV0sCisJCQkJCQkJCSAgICZsZWZ0dHlwZSwKKwkJ CQkJCQkJICAgJnJpaW5mby0+c3VidHlwZXNbaV0pOworCX0KKworCXJpaW5mby0+ZnBtZXRhX3Zh bGlkID0gdHJ1ZTsKK30KKwogLyoKICAqIEV4dHJhY3QgZmllbGRzIGZyb20gYSB0dXBsZSBpbnRv IERhdHVtL251bGxzIGFycmF5cwogICovCkBAIC0zMTY5LDggKzM2MDIsMTYgQEAgcmlfSGFzaENv bXBhcmVPcChPaWQgZXFfb3ByLCBPaWQgdHlwZWlkKQogCQkgKiBtb21lbnQgc2luY2UgdGhhdCB3 aWxsIG5ldmVyIGJlIGdlbmVyYXRlZCBmb3IgaW1wbGljaXQgY29lcmNpb25zLgogCQkgKi8KIAkJ b3BfaW5wdXRfdHlwZXMoZXFfb3ByLCAmbGVmdHR5cGUsICZyaWdodHR5cGUpOwotCQlBc3NlcnQo bGVmdHR5cGUgPT0gcmlnaHR0eXBlKTsKLQkJaWYgKHR5cGVpZCA9PSBsZWZ0dHlwZSkKKworCQkv KgorCQkgKiBEb24ndCBuZWVkIHRvIGNhc3QgaWYgdGhlIEZLIGNvbHVtbiB0eXBlIGFscmVhZHkg bWF0Y2hlcyB3aGF0IHRoZQorCQkgKiBvcGVyYXRvciBleHBlY3RzLiAgRm9yIHNhbWUtdHlwZSBv cGVyYXRvcnMsIHRoYXQncyB0aGUgY29tbW9uIHR5cGUuCisJCSAqIEZvciBjcm9zcy10eXBlIG9w ZXJhdG9ycyAoZS5nLiBpbnQ0OGVxIGZvciBpbnQ0IFBLIC8gaW50OCBGSyksIHRoZQorCQkgKiBG SyB2YWx1ZSBpcyB0aGUgcmlnaHQgb3BlcmFuZCwgc28gc2tpcCB0aGUgY2FzdCBpZiB0eXBlaWQg bWF0Y2hlcworCQkgKiByaWdodHR5cGUuCisJCSAqLworCQlpZiAoKGxlZnR0eXBlID09IHJpZ2h0 dHlwZSAmJiB0eXBlaWQgPT0gbGVmdHR5cGUpIHx8CisJCQkobGVmdHR5cGUgIT0gcmlnaHR0eXBl ICYmIHR5cGVpZCA9PSByaWdodHR5cGUpKQogCQkJY2FzdGZ1bmMgPSBJbnZhbGlkT2lkOwkvKiBz aW1wbGVzdCBjYXNlICovCiAJCWVsc2UKIAkJewpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvaXNvbGF0 aW9uL2V4cGVjdGVkL2ZrLWNvbmN1cnJlbnQtcGstdXBkLm91dCBiL3NyYy90ZXN0L2lzb2xhdGlv bi9leHBlY3RlZC9may1jb25jdXJyZW50LXBrLXVwZC5vdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMDAuLjliYmVjNjM4YWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rl c3QvaXNvbGF0aW9uL2V4cGVjdGVkL2ZrLWNvbmN1cnJlbnQtcGstdXBkLm91dApAQCAtMCwwICsx LDU4IEBACitQYXJzZWQgdGVzdCBzcGVjIHdpdGggMiBzZXNzaW9ucworCitzdGFydGluZyBwZXJt dXRhdGlvbjogczJ1a2V5IHMxaSBzMmMgczFjIHMycyBzMXMKK3N0ZXAgczJ1a2V5OiBVUERBVEUg cGFyZW50IFNFVCBwYXJlbnRfa2V5ID0gMiBXSEVSRSBwYXJlbnRfa2V5ID0gMTsKK3N0ZXAgczFp OiBJTlNFUlQgSU5UTyBjaGlsZCBWQUxVRVMgKDEsIDEpOyA8d2FpdGluZyAuLi4+CitzdGVwIHMy YzogQ09NTUlUOworc3RlcCBzMWk6IDwuLi4gY29tcGxldGVkPgorRVJST1I6ICBpbnNlcnQgb3Ig dXBkYXRlIG9uIHRhYmxlICJjaGlsZCIgdmlvbGF0ZXMgZm9yZWlnbiBrZXkgY29uc3RyYWludCAi Y2hpbGRfcGFyZW50X2tleV9ma2V5Igorc3RlcCBzMWM6IENPTU1JVDsKK3N0ZXAgczJzOiBTRUxF Q1QgKiBGUk9NIHBhcmVudDsKK3BhcmVudF9rZXl8YXV4CistLS0tLS0tLS0tKy0tLQorICAgICAg ICAgMnxmb28KKygxIHJvdykKKworc3RlcCBzMXM6IFNFTEVDVCAqIEZST00gY2hpbGQ7CitjaGls ZF9rZXl8cGFyZW50X2tleQorLS0tLS0tLS0tKy0tLS0tLS0tLS0KKygwIHJvd3MpCisKKworc3Rh cnRpbmcgcGVybXV0YXRpb246IHMydWF1eCBzMWkgczJjIHMxYyBzMnMgczFzCitzdGVwIHMydWF1 eDogVVBEQVRFIHBhcmVudCBTRVQgYXV4ID0gJ2JhcicgV0hFUkUgcGFyZW50X2tleSA9IDE7Citz dGVwIHMxaTogSU5TRVJUIElOVE8gY2hpbGQgVkFMVUVTICgxLCAxKTsKK3N0ZXAgczJjOiBDT01N SVQ7CitzdGVwIHMxYzogQ09NTUlUOworc3RlcCBzMnM6IFNFTEVDVCAqIEZST00gcGFyZW50Owor cGFyZW50X2tleXxhdXgKKy0tLS0tLS0tLS0rLS0tCisgICAgICAgICAxfGJhcgorKDEgcm93KQor CitzdGVwIHMxczogU0VMRUNUICogRlJPTSBjaGlsZDsKK2NoaWxkX2tleXxwYXJlbnRfa2V5Cist LS0tLS0tLS0rLS0tLS0tLS0tLQorICAgICAgICAxfCAgICAgICAgIDEKKygxIHJvdykKKworCitz dGFydGluZyBwZXJtdXRhdGlvbjogczJ1a2V5IHMxaSBzMnVrZXkyIHMyYyBzMWMgczJzIHMxcwor c3RlcCBzMnVrZXk6IFVQREFURSBwYXJlbnQgU0VUIHBhcmVudF9rZXkgPSAyIFdIRVJFIHBhcmVu dF9rZXkgPSAxOworc3RlcCBzMWk6IElOU0VSVCBJTlRPIGNoaWxkIFZBTFVFUyAoMSwgMSk7IDx3 YWl0aW5nIC4uLj4KK3N0ZXAgczJ1a2V5MjogVVBEQVRFIHBhcmVudCBTRVQgcGFyZW50X2tleSA9 IDEgV0hFUkUgcGFyZW50X2tleSA9IDI7CitzdGVwIHMyYzogQ09NTUlUOworc3RlcCBzMWk6IDwu Li4gY29tcGxldGVkPgorc3RlcCBzMWM6IENPTU1JVDsKK3N0ZXAgczJzOiBTRUxFQ1QgKiBGUk9N IHBhcmVudDsKK3BhcmVudF9rZXl8YXV4CistLS0tLS0tLS0tKy0tLQorICAgICAgICAgMXxmb28K KygxIHJvdykKKworc3RlcCBzMXM6IFNFTEVDVCAqIEZST00gY2hpbGQ7CitjaGlsZF9rZXl8cGFy ZW50X2tleQorLS0tLS0tLS0tKy0tLS0tLS0tLS0KKyAgICAgICAgMXwgICAgICAgICAxCisoMSBy b3cpCisKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2lzb2xhdGlvbi9pc29sYXRpb25fc2NoZWR1bGUg Yi9zcmMvdGVzdC9pc29sYXRpb24vaXNvbGF0aW9uX3NjaGVkdWxlCmluZGV4IDRlNDY2NTgwY2Q0 Li5jMWE5OTliZjFkMiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvaXNvbGF0aW9uL2lzb2xhdGlvbl9z Y2hlZHVsZQorKysgYi9zcmMvdGVzdC9pc29sYXRpb24vaXNvbGF0aW9uX3NjaGVkdWxlCkBAIC0z Nyw2ICszNyw3IEBAIHRlc3Q6IGZrLXBhcnRpdGlvbmVkLTIKIHRlc3Q6IGZrLXNuYXBzaG90CiB0 ZXN0OiBmay1zbmFwc2hvdC0yCiB0ZXN0OiBmay1zbmFwc2hvdC0zCit0ZXN0OiBmay1jb25jdXJy ZW50LXBrLXVwZAogdGVzdDogc3VieGlkLW92ZXJmbG93CiB0ZXN0OiBldmFsLXBsYW4tcXVhbAog dGVzdDogZXZhbC1wbGFuLXF1YWwtdHJpZ2dlcgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvaXNvbGF0 aW9uL3NwZWNzL2ZrLWNvbmN1cnJlbnQtcGstdXBkLnNwZWMgYi9zcmMvdGVzdC9pc29sYXRpb24v c3BlY3MvZmstY29uY3VycmVudC1way11cGQuc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMC4uZDU5YTE0ZDRkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGVzdC9p c29sYXRpb24vc3BlY3MvZmstY29uY3VycmVudC1way11cGQuc3BlYwpAQCAtMCwwICsxLDQyIEBA CisjIFRlc3RzIHRoYXQgYW4gSU5TRVJUIG9uIHJlZmVyZW5jaW5nIHRhYmxlIGNvcnJlY3RseSBm YWlscyB3aGVuCisjIHRoZSByZWZlcmVuY2VkIHZhbHVlIGRpc2FwcGVhcnMgZHVlIHRvIGEgY29u Y3VycmVudCB1cGRhdGUKK3NldHVwCit7CisgIENSRUFURSBUQUJMRSBwYXJlbnQgKAorICAgIHBh cmVudF9rZXkgaW50IFBSSU1BUlkgS0VZLAorICAgIGF1eCAgIHRleHQgTk9UIE5VTEwKKyAgKTsK KworICBDUkVBVEUgVEFCTEUgY2hpbGQgKAorICAgIGNoaWxkX2tleSBpbnQgUFJJTUFSWSBLRVks CisgICAgcGFyZW50X2tleSBpbnQ4IE5PVCBOVUxMIFJFRkVSRU5DRVMgcGFyZW50CisgICk7CisK KyAgSU5TRVJUIElOVE8gcGFyZW50IFZBTFVFUyAoMSwgJ2ZvbycpOworfQorCit0ZWFyZG93bgor eworICBEUk9QIFRBQkxFIHBhcmVudCwgY2hpbGQ7Cit9CisKK3Nlc3Npb24gczEKK3NldHVwICB7 IEJFR0lOOyB9CitzdGVwIHMxaSB7IElOU0VSVCBJTlRPIGNoaWxkIFZBTFVFUyAoMSwgMSk7IH0K K3N0ZXAgczFjIHsgQ09NTUlUOyB9CitzdGVwIHMxcyB7IFNFTEVDVCAqIEZST00gY2hpbGQ7IH0K Kworc2Vzc2lvbiBzMgorc2V0dXAgIHsgQkVHSU47IH0KK3N0ZXAgczJ1a2V5IHsgVVBEQVRFIHBh cmVudCBTRVQgcGFyZW50X2tleSA9IDIgV0hFUkUgcGFyZW50X2tleSA9IDE7IH0KK3N0ZXAgczJ1 YXV4IHsgVVBEQVRFIHBhcmVudCBTRVQgYXV4ID0gJ2JhcicgV0hFUkUgcGFyZW50X2tleSA9IDE7 IH0KK3N0ZXAgczJ1a2V5MiB7IFVQREFURSBwYXJlbnQgU0VUIHBhcmVudF9rZXkgPSAxIFdIRVJF IHBhcmVudF9rZXkgPSAyOyB9CitzdGVwIHMyYyB7IENPTU1JVDsgfQorc3RlcCBzMnMgeyBTRUxF Q1QgKiBGUk9NIHBhcmVudDsgfQorCisjIGZhaWwKK3Blcm11dGF0aW9uIHMydWtleSBzMWkgczJj IHMxYyBzMnMgczFzCisjIG9rCitwZXJtdXRhdGlvbiBzMnVhdXggczFpIHMyYyBzMWMgczJzIHMx cworIyBvaworcGVybXV0YXRpb24gczJ1a2V5IHMxaSBzMnVrZXkyIHMyYyBzMWMgczJzIHMxcwpk aWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9mb3JlaWduX2tleS5vdXQgYi9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2ZvcmVpZ25fa2V5Lm91dAppbmRleCA5YWU0ZGJmMWIw YS4uMDgyNmY1MTgwMDQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZm9y ZWlnbl9rZXkub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZm9yZWlnbl9rZXku b3V0CkBAIC0zNzAsNiArMzcwLDUzIEBAIFNFTEVDVCAqIEZST00gUEtUQUJMRTsKIERST1AgVEFC TEUgRktUQUJMRTsKIERST1AgVEFCTEUgUEtUQUJMRTsKIC0tCistLSBDaGVjayBSTFMKKy0tCitD UkVBVEUgVEFCTEUgUEtUQUJMRSAoIHB0ZXN0MSBpbnQgUFJJTUFSWSBLRVksIHB0ZXN0MiB0ZXh0 ICk7CitDUkVBVEUgVEFCTEUgRktUQUJMRSAoIGZ0ZXN0MSBpbnQgUkVGRVJFTkNFUyBQS1RBQkxF LCBmdGVzdDIgaW50ICk7CistLSBJbnNlcnQgdGVzdCBkYXRhIGludG8gUEtUQUJMRQorSU5TRVJU IElOVE8gUEtUQUJMRSBWQUxVRVMgKDEsICdUZXN0MScpOworSU5TRVJUIElOVE8gUEtUQUJMRSBW QUxVRVMgKDIsICdUZXN0MicpOworSU5TRVJUIElOVE8gUEtUQUJMRSBWQUxVRVMgKDMsICdUZXN0 MycpOworLS0gR3JhbnQgcHJpdmlsZWdlcyBvbiBQS1RBQkxFL0ZLVEFCTEUgdG8gdXNlciByZWdy ZXNzX2ZvcmVpZ25fa2V5X3VzZXIKK0NSRUFURSBVU0VSIHJlZ3Jlc3NfZm9yZWlnbl9rZXlfdXNl ciBOT0xPR0lOOworR1JBTlQgU0VMRUNUIE9OIFBLVEFCTEUgVE8gcmVncmVzc19mb3JlaWduX2tl eV91c2VyOworR1JBTlQgU0VMRUNULCBJTlNFUlQgT04gRktUQUJMRSBUTyByZWdyZXNzX2ZvcmVp Z25fa2V5X3VzZXI7CistLSBFbmFibGUgUkxTIG9uIFBLVEFCTEUgYW5kIENyZWF0ZSBwb2xpY2ll cworQUxURVIgVEFCTEUgUEtUQUJMRSBFTkFCTEUgUk9XIExFVkVMIFNFQ1VSSVRZOworQ1JFQVRF IFBPTElDWSBwa3RhYmxlX3ZpZXdfb2RkX3BvbGljeSBPTiBQS1RBQkxFIFRPIHJlZ3Jlc3NfZm9y ZWlnbl9rZXlfdXNlciBVU0lORyAocHRlc3QxICUgMiA9IDEpOworQUxURVIgVEFCTEUgUEtUQUJM RSBPV05FUiB0byByZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXI7CitTRVQgUk9MRSByZWdyZXNzX2Zv cmVpZ25fa2V5X3VzZXI7CitJTlNFUlQgSU5UTyBGS1RBQkxFIFZBTFVFUyAoMywgNSk7CitJTlNF UlQgSU5UTyBGS1RBQkxFIFZBTFVFUyAoMiwgNSk7IC0tIHN1Y2Nlc3MsIFJFRkVSRU5DRVMgYXJl IG5vdCBzdWJqZWN0IHRvIHJvdyBzZWN1cml0eQorUkVTRVQgUk9MRTsKK0RST1AgVEFCTEUgRktU QUJMRTsKK0RST1AgVEFCTEUgUEtUQUJMRTsKK0RST1AgVVNFUiByZWdyZXNzX2ZvcmVpZ25fa2V5 X3VzZXI7CistLQorLS0gQ2hlY2sgQUNMCistLQorQ1JFQVRFIFRBQkxFIFBLVEFCTEUgKCBwdGVz dDEgaW50IFBSSU1BUlkgS0VZLCBwdGVzdDIgdGV4dCApOworQ1JFQVRFIFRBQkxFIEZLVEFCTEUg KCBmdGVzdDEgaW50IFJFRkVSRU5DRVMgUEtUQUJMRSwgZnRlc3QyIGludCApOworLS0gSW5zZXJ0 IHRlc3QgZGF0YSBpbnRvIFBLVEFCTEUKK0lOU0VSVCBJTlRPIFBLVEFCTEUgVkFMVUVTICgxLCAn VGVzdDEnKTsKK0lOU0VSVCBJTlRPIFBLVEFCTEUgVkFMVUVTICgyLCAnVGVzdDInKTsKK0lOU0VS VCBJTlRPIFBLVEFCTEUgVkFMVUVTICgzLCAnVGVzdDMnKTsKKy0tIEdyYW50IHVzYWdlIG9uIFBL VEFCTEUgdG8gdXNlciByZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXIKK0NSRUFURSBVU0VSIHJlZ3Jl c3NfZm9yZWlnbl9rZXlfdXNlciBOT0xPR0lOOworR1JBTlQgU0VMRUNUIE9OIFBLVEFCTEUgVE8g cmVncmVzc19mb3JlaWduX2tleV91c2VyOworQUxURVIgVEFCTEUgUEtUQUJMRSBPV05FUiB0byBy ZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXI7CistLSBJbnNlcnRpbmcgaW50byBGS1RBQkxFIHNob3Vs ZCB3b3JrCitJTlNFUlQgSU5UTyBGS1RBQkxFIFZBTFVFUyAoMywgNSk7CistLSBSZXZva2UgdXNh Z2Ugb24gUEtUQUJMRSBmcm9tIHVzZXIgcmVncmVzc19mb3JlaWduX2tleV91c2VyCitSRVZPS0Ug U0VMRUNUIE9OIFBLVEFCTEUgRlJPTSByZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXI7CistLSBJbnNl cnRpbmcgaW50byBGS1RBQkxFIHNob3VsZCBmYWlsCitJTlNFUlQgSU5UTyBGS1RBQkxFIFZBTFVF UyAoMiwgNik7CitFUlJPUjogIHBlcm1pc3Npb24gZGVuaWVkIGZvciB0YWJsZSBwa3RhYmxlCitE Uk9QIFRBQkxFIEZLVEFCTEU7CitEUk9QIFRBQkxFIFBLVEFCTEU7CitEUk9QIFVTRVIgcmVncmVz c19mb3JlaWduX2tleV91c2VyOworLS0KIC0tIENoZWNrIGluaXRpYWwgY2hlY2sgdXBvbiBBTFRF UiBUQUJMRQogLS0KIENSRUFURSBUQUJMRSBQS1RBQkxFICggcHRlc3QxIGludCwgcHRlc3QyIGlu dCwgUFJJTUFSWSBLRVkocHRlc3QxLCBwdGVzdDIpICk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9y ZWdyZXNzL3NxbC9mb3JlaWduX2tleS5zcWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9mb3JlaWdu X2tleS5zcWwKaW5kZXggM2I4Yzk1YmY4OTMuLmU5ZWUyOTMzMWNiIDEwMDY0NAotLS0gYS9zcmMv dGVzdC9yZWdyZXNzL3NxbC9mb3JlaWduX2tleS5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9z cWwvZm9yZWlnbl9rZXkuc3FsCkBAIC0yNDIsNiArMjQyLDcwIEBAIFNFTEVDVCAqIEZST00gUEtU QUJMRTsKIERST1AgVEFCTEUgRktUQUJMRTsKIERST1AgVEFCTEUgUEtUQUJMRTsKIAorLS0KKy0t IENoZWNrIFJMUworLS0KK0NSRUFURSBUQUJMRSBQS1RBQkxFICggcHRlc3QxIGludCBQUklNQVJZ IEtFWSwgcHRlc3QyIHRleHQgKTsKK0NSRUFURSBUQUJMRSBGS1RBQkxFICggZnRlc3QxIGludCBS RUZFUkVOQ0VTIFBLVEFCTEUsIGZ0ZXN0MiBpbnQgKTsKKworLS0gSW5zZXJ0IHRlc3QgZGF0YSBp bnRvIFBLVEFCTEUKK0lOU0VSVCBJTlRPIFBLVEFCTEUgVkFMVUVTICgxLCAnVGVzdDEnKTsKK0lO U0VSVCBJTlRPIFBLVEFCTEUgVkFMVUVTICgyLCAnVGVzdDInKTsKK0lOU0VSVCBJTlRPIFBLVEFC TEUgVkFMVUVTICgzLCAnVGVzdDMnKTsKKworLS0gR3JhbnQgcHJpdmlsZWdlcyBvbiBQS1RBQkxF L0ZLVEFCTEUgdG8gdXNlciByZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXIKK0NSRUFURSBVU0VSIHJl Z3Jlc3NfZm9yZWlnbl9rZXlfdXNlciBOT0xPR0lOOworR1JBTlQgU0VMRUNUIE9OIFBLVEFCTEUg VE8gcmVncmVzc19mb3JlaWduX2tleV91c2VyOworR1JBTlQgU0VMRUNULCBJTlNFUlQgT04gRktU QUJMRSBUTyByZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXI7CisKKy0tIEVuYWJsZSBSTFMgb24gUEtU QUJMRSBhbmQgQ3JlYXRlIHBvbGljaWVzCitBTFRFUiBUQUJMRSBQS1RBQkxFIEVOQUJMRSBST1cg TEVWRUwgU0VDVVJJVFk7CitDUkVBVEUgUE9MSUNZIHBrdGFibGVfdmlld19vZGRfcG9saWN5IE9O IFBLVEFCTEUgVE8gcmVncmVzc19mb3JlaWduX2tleV91c2VyIFVTSU5HIChwdGVzdDEgJSAyID0g MSk7CisKK0FMVEVSIFRBQkxFIFBLVEFCTEUgT1dORVIgdG8gcmVncmVzc19mb3JlaWduX2tleV91 c2VyOworCitTRVQgUk9MRSByZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXI7CisKK0lOU0VSVCBJTlRP IEZLVEFCTEUgVkFMVUVTICgzLCA1KTsKK0lOU0VSVCBJTlRPIEZLVEFCTEUgVkFMVUVTICgyLCA1 KTsgLS0gc3VjY2VzcywgUkVGRVJFTkNFUyBhcmUgbm90IHN1YmplY3QgdG8gcm93IHNlY3VyaXR5 CisKK1JFU0VUIFJPTEU7CisKK0RST1AgVEFCTEUgRktUQUJMRTsKK0RST1AgVEFCTEUgUEtUQUJM RTsKK0RST1AgVVNFUiByZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXI7CisKKy0tCistLSBDaGVjayBB Q0wKKy0tCitDUkVBVEUgVEFCTEUgUEtUQUJMRSAoIHB0ZXN0MSBpbnQgUFJJTUFSWSBLRVksIHB0 ZXN0MiB0ZXh0ICk7CitDUkVBVEUgVEFCTEUgRktUQUJMRSAoIGZ0ZXN0MSBpbnQgUkVGRVJFTkNF UyBQS1RBQkxFLCBmdGVzdDIgaW50ICk7CisKKy0tIEluc2VydCB0ZXN0IGRhdGEgaW50byBQS1RB QkxFCitJTlNFUlQgSU5UTyBQS1RBQkxFIFZBTFVFUyAoMSwgJ1Rlc3QxJyk7CitJTlNFUlQgSU5U TyBQS1RBQkxFIFZBTFVFUyAoMiwgJ1Rlc3QyJyk7CitJTlNFUlQgSU5UTyBQS1RBQkxFIFZBTFVF UyAoMywgJ1Rlc3QzJyk7CisKKy0tIEdyYW50IHVzYWdlIG9uIFBLVEFCTEUgdG8gdXNlciByZWdy ZXNzX2ZvcmVpZ25fa2V5X3VzZXIKK0NSRUFURSBVU0VSIHJlZ3Jlc3NfZm9yZWlnbl9rZXlfdXNl ciBOT0xPR0lOOworR1JBTlQgU0VMRUNUIE9OIFBLVEFCTEUgVE8gcmVncmVzc19mb3JlaWduX2tl eV91c2VyOworCitBTFRFUiBUQUJMRSBQS1RBQkxFIE9XTkVSIHRvIHJlZ3Jlc3NfZm9yZWlnbl9r ZXlfdXNlcjsKKworLS0gSW5zZXJ0aW5nIGludG8gRktUQUJMRSBzaG91bGQgd29yaworSU5TRVJU IElOVE8gRktUQUJMRSBWQUxVRVMgKDMsIDUpOworCistLSBSZXZva2UgdXNhZ2Ugb24gUEtUQUJM RSBmcm9tIHVzZXIgcmVncmVzc19mb3JlaWduX2tleV91c2VyCitSRVZPS0UgU0VMRUNUIE9OIFBL VEFCTEUgRlJPTSByZWdyZXNzX2ZvcmVpZ25fa2V5X3VzZXI7CisKKy0tIEluc2VydGluZyBpbnRv IEZLVEFCTEUgc2hvdWxkIGZhaWwKK0lOU0VSVCBJTlRPIEZLVEFCTEUgVkFMVUVTICgyLCA2KTsK KworRFJPUCBUQUJMRSBGS1RBQkxFOworRFJPUCBUQUJMRSBQS1RBQkxFOworCitEUk9QIFVTRVIg cmVncmVzc19mb3JlaWduX2tleV91c2VyOworCiAtLQogLS0gQ2hlY2sgaW5pdGlhbCBjaGVjayB1 cG9uIEFMVEVSIFRBQkxFCiAtLQotLSAKMi40Ny4zCgo= --000000000000473637064b29d5f5 Content-Type: application/octet-stream; name="v3-0002-Cache-per-batch-resources-for-fast-path-foreign-k.patch" Content-Disposition: attachment; filename="v3-0002-Cache-per-batch-resources-for-fast-path-foreign-k.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mlt915741 RnJvbSA2Y2I2YzQwMmQ4OTRjZGJlNDQ3MDFkOTdjZDY0NGU0YTRmZDJjZjc1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbWl0IExhbmdvdGUgPGFtaXRsYW5AcG9zdGdyZXNxbC5vcmc+ CkRhdGU6IFdlZCwgMTggRmViIDIwMjYgMjM6Mzc6MTkgKzA5MDAKU3ViamVjdDogW1BBVENIIHYz IDIvMl0gQ2FjaGUgcGVyLWJhdGNoIHJlc291cmNlcyBmb3IgZmFzdC1wYXRoIGZvcmVpZ24ga2V5 CiBjaGVja3MKClRoZSBmYXN0LXBhdGggRksgY2hlY2sgaW50cm9kdWNlZCBpbiB0aGUgcHJldmlv dXMgY29tbWl0cyBvcGVucyBhbmQKY2xvc2VzIHRoZSBQSyByZWxhdGlvbiwgaW5kZXgsIHNjYW4g ZGVzY3JpcHRvciwgYW5kIHR1cGxlIHNsb3Qgb24KZXZlcnkgdHJpZ2dlciBpbnZvY2F0aW9uLiAg Rm9yIGJ1bGsgb3BlcmF0aW9ucyB0aGF0IGZpcmUgdGhvdXNhbmRzIG9mCkZLIHRyaWdnZXJzIGlu IGEgc2luZ2xlIHN0YXRlbWVudCwgdGhpcyByZXBlYXRlZCBzZXR1cC90ZWFyZG93bgpkb21pbmF0 ZXMgdGhlIGNvc3QuCgpJbnRyb2R1Y2UgUklfRmFzdFBhdGhFbnRyeSwgYSBwZXItY29uc3RyYWlu dCBoYXNoIHRhYmxlIHRoYXQgY2FjaGVzCnRoZSBvcGVuIFJlbGF0aW9uIChwa19yZWwsIGlkeF9y ZWwpLCBJbmRleFNjYW5EZXNjLCBUdXBsZVRhYmxlU2xvdCwKYW5kIGEgcmVnaXN0ZXJlZCBTbmFw c2hvdCBhY3Jvc3MgYWxsIHRyaWdnZXIgaW52b2NhdGlvbnMgd2l0aGluIGEKc2luZ2xlIHRyaWdn ZXItZmlyaW5nIGJhdGNoLiAgRW50cmllcyBhcmUgY3JlYXRlZCBsYXppbHkgb24gZmlyc3QgdXNl CnZpYSByaV9GYXN0UGF0aEdldEVudHJ5KCkgYW5kIHBlcnNpc3QgdW50aWwgdGhlIGJhdGNoIGVu ZHMuCgpUaGUgc25hcHNob3QgaXMgcmVnaXN0ZXJlZCBvbmNlIGF0IGVudHJ5IGNyZWF0aW9uLiAg T24gc3Vic2VxdWVudApyb3dzLCBvbmx5IENvbW1hbmRDb3VudGVySW5jcmVtZW50KCkgKyBhIGRp cmVjdCBjdXJjaWQgcGF0Y2ggb24gdGhlCnJlZ2lzdGVyZWQgY29weSBpcyBuZWVkZWQsIGF2b2lk aW5nIHRoZSBwZXItcm93IEdldFNuYXBzaG90RGF0YSgpCmNvc3QgKHdoaWNoIHRha2VzIFByb2NB cnJheUxvY2sgYW5kIGl0ZXJhdGVzIGFsbCBiYWNrZW5kIHNsb3RzKS4KU25hcHNob3RTZXRDb21t YW5kSWQoKSBvbmx5IHBhdGNoZXMgdGhlIHByb2Nlc3MtZ2xvYmFsIHN0YXRpY3MsIG5vdApyZWdp c3RlcmVkIGNvcGllcywgc28gd2UgcGF0Y2ggZW50cnktPnNuYXBzaG90LT5jdXJjaWQgb3Vyc2Vs dmVzLgoKTGlmZWN5Y2xlIG1hbmFnZW1lbnQ6CgogIC0gQWZ0ZXJUcmlnZ2VyQmF0Y2hDYWxsYmFj azogQSBuZXcgZ2VuZXJhbC1wdXJwb3NlIGNhbGxiYWNrCiAgICBtZWNoYW5pc20gaW4gdHJpZ2dl ci5jLiAgQ2FsbGJhY2tzIHJlZ2lzdGVyZWQgdmlhCiAgICBSZWdpc3RlckFmdGVyVHJpZ2dlckJh dGNoQ2FsbGJhY2soKSBmaXJlIGF0IHRoZSBlbmQgb2YgZWFjaAogICAgdHJpZ2dlci1maXJpbmcg YmF0Y2ggKEFmdGVyVHJpZ2dlckVuZFF1ZXJ5IGZvciBpbW1lZGlhdGUKICAgIGNvbnN0cmFpbnRz LCBBZnRlclRyaWdnZXJGaXJlRGVmZXJyZWQgYXQgQ09NTUlULCBhbmQKICAgIEFmdGVyVHJpZ2dl clNldFN0YXRlIGZvciBTRVQgQ09OU1RSQUlOVFMgSU1NRURJQVRFKS4gIFRoZSBSSSBjb2RlCiAg ICByZWdpc3RlcnMgcmlfRmFzdFBhdGhDbGVhbnVwIGFzIGEgYmF0Y2ggY2FsbGJhY2ssIHdoaWNo IGRvZXMKICAgIG9yZGVybHkgdGVhcmRvd246IGluZGV4X2VuZHNjYW4sIGluZGV4X2Nsb3NlLCB0 YWJsZV9jbG9zZSwKICAgIEV4ZWNEcm9wU2luZ2xlVHVwbGVUYWJsZVNsb3QsIFVucmVnaXN0ZXJT bmFwc2hvdC4KCiAgLSBYYWN0Q2FsbGJhY2s6IHJpX0Zhc3RQYXRoWGFjdENhbGxiYWNrIE5VTExz IHRoZSBzdGF0aWMgY2FjaGUKICAgIHBvaW50ZXIgYXQgdHJhbnNhY3Rpb24gZW5kLiAgT24gdGhl IG5vcm1hbCBwYXRoLCBjbGVhbnVwIGFscmVhZHkKICAgIHJhbiB2aWEgdGhlIGJhdGNoIGNhbGxi YWNrOyB0aGlzIGhhbmRsZXMgdGhlIGFib3J0IHBhdGggd2hlcmUKICAgIFRvcFRyYW5zYWN0aW9u Q29udGV4dCBkZXN0cnVjdGlvbiBmcmVlcyB0aGUgbWVtb3J5IGJ1dAogICAgUmVzb3VyY2VPd25l ciBoYW5kbGVzIHRoZSBhY3R1YWwgcmVzb3VyY2UgY2xlYW51cC4KCiAgLSBTdWJYYWN0Q2FsbGJh Y2s6IHJpX0Zhc3RQYXRoU3ViWGFjdENhbGxiYWNrIE5VTExzIHRoZSBzdGF0aWMKICAgIGNhY2hl IHBvaW50ZXIgb24gc3VidHJhbnNhY3Rpb24gYWJvcnQuICBSZXNvdXJjZU93bmVyIGFscmVhZHkK ICAgIGNsZWFuZWQgdXAgdGhlIHJlc291cmNlczsgdGhpcyBwcmV2ZW50cyB0aGUgYmF0Y2ggY2Fs bGJhY2sgZnJvbQogICAgdHJ5aW5nIHRvIGRvdWJsZS1jbG9zZSB0aGVtLgoKICAtIEFmdGVyVHJp Z2dlckJhdGNoSXNBY3RpdmUoKTogRXhwb3J0ZWQgYWNjZXNzb3IgdGhhdCByZXR1cm5zIHRydWUK ICAgIHdoZW4gYWZ0ZXJUcmlnZ2Vycy5xdWVyeV9kZXB0aCA+PSAwLiAgRHVyaW5nIEFMVEVSIFRB QkxFIC4uLiBBREQKICAgIEZPUkVJR04gS0VZIHZhbGlkYXRpb24sIFJJIHRyaWdnZXJzIGFyZSBj YWxsZWQgZGlyZWN0bHkgb3V0c2lkZQogICAgdGhlIGFmdGVyLXRyaWdnZXIgZnJhbWV3b3JrLCBz byBiYXRjaCBjYWxsYmFja3Mgd291bGQgbmV2ZXIgZmlyZS4KICAgIFRoZSBmYXN0LXBhdGggY29k ZSB1c2VzIHRoaXMgdG8gZmFsbCBiYWNrIHRvIGEgbm9uLWNhY2hlZAogICAgcGVyLWludm9jYXRp b24gcGF0aCAob3Blbi9zY2FuL2Nsb3NlIGVhY2ggY2FsbCkgaW4gdGhhdCBjb250ZXh0LgotLS0K IHNyYy9iYWNrZW5kL2NvbW1hbmRzL3RyaWdnZXIuYyAgICAgICAgICAgIHwgIDg0ICsrKysrKysK IHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9yaV90cmlnZ2Vycy5jICAgICAgIHwgMjUzICsrKysrKysr KysrKysrKysrKysrLS0KIHNyYy9pbmNsdWRlL2NvbW1hbmRzL3RyaWdnZXIuaCAgICAgICAgICAg IHwgIDE4ICsrCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2ZvcmVpZ25fa2V5Lm91dCB8ICA0 NyArKysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9mb3JlaWduX2tleS5zcWwgICAgICB8ICA0NCAr KysrCiBzcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCAgICAgICAgICB8ICAgMyArCiA2 IGZpbGVzIGNoYW5nZWQsIDQzNSBpbnNlcnRpb25zKCspLCAxNCBkZWxldGlvbnMoLSkKCmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy90cmlnZ2VyLmMgYi9zcmMvYmFja2VuZC9jb21t YW5kcy90cmlnZ2VyLmMKaW5kZXggOGRmOTE1ZjYzZmIuLjdhZGVhZTVjN2U1IDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9jb21tYW5kcy90cmlnZ2VyLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFu ZHMvdHJpZ2dlci5jCkBAIC0zODkxLDYgKzM4OTEsOCBAQCB0eXBlZGVmIHN0cnVjdCBBZnRlclRy aWdnZXJzRGF0YQogCS8qIHBlci1zdWJ0cmFuc2FjdGlvbi1sZXZlbCBkYXRhOiAqLwogCUFmdGVy VHJpZ2dlcnNUcmFuc0RhdGEgKnRyYW5zX3N0YWNrOwkvKiBhcnJheSBvZiBzdHJ1Y3RzIHNob3du IGJlbG93ICovCiAJaW50CQkJbWF4dHJhbnNkZXB0aDsJLyogYWxsb2NhdGVkIGxlbiBvZiBhYm92 ZSBhcnJheSAqLworCisJTGlzdAkgICAqYmF0Y2hfY2FsbGJhY2tzOwkvKiBMaXN0IG9mIEFmdGVy VHJpZ2dlckNhbGxiYWNrSXRlbSAqLwogfSBBZnRlclRyaWdnZXJzRGF0YTsKIAogc3RydWN0IEFm dGVyVHJpZ2dlcnNRdWVyeURhdGEKQEAgLTM5MjcsNiArMzkyOSwxMyBAQCBzdHJ1Y3QgQWZ0ZXJU cmlnZ2Vyc1RhYmxlRGF0YQogCVR1cGxlVGFibGVTbG90ICpzdG9yZXNsb3Q7CS8qIGZvciBjb252 ZXJ0aW5nIHRvIHR1cGxlc3RvcmUncyBmb3JtYXQgKi8KIH07CiAKKy8qIEVudHJ5IGluIGFmdGVy VHJpZ2dlcnMuYmF0Y2hfY2FsbGJhY2tzICovCit0eXBlZGVmIHN0cnVjdCBBZnRlclRyaWdnZXJD YWxsYmFja0l0ZW0KK3sKKwlBZnRlclRyaWdnZXJCYXRjaENhbGxiYWNrIGNhbGxiYWNrOworCXZv aWQJICAgKmFyZzsKK30gQWZ0ZXJUcmlnZ2VyQ2FsbGJhY2tJdGVtOworCiBzdGF0aWMgQWZ0ZXJU cmlnZ2Vyc0RhdGEgYWZ0ZXJUcmlnZ2VyczsKIAogc3RhdGljIHZvaWQgQWZ0ZXJUcmlnZ2VyRXhl Y3V0ZShFU3RhdGUgKmVzdGF0ZSwKQEAgLTM5NjIsNiArMzk3MSw3IEBAIHN0YXRpYyBTZXRDb25z dHJhaW50U3RhdGUgU2V0Q29uc3RyYWludFN0YXRlQWRkSXRlbShTZXRDb25zdHJhaW50U3RhdGUg c3RhdGUsCiAJCQkJCQkJCQkJCQkJT2lkIHRnb2lkLCBib29sIHRnaXNkZWZlcnJlZCk7CiBzdGF0 aWMgdm9pZCBjYW5jZWxfcHJpb3Jfc3RtdF90cmlnZ2VycyhPaWQgcmVsaWQsIENtZFR5cGUgY21k VHlwZSwgaW50IHRnZXZlbnQpOwogCitzdGF0aWMgdm9pZCBGaXJlQWZ0ZXJUcmlnZ2VyQmF0Y2hD YWxsYmFja3Modm9pZCk7CiAKIC8qCiAgKiBHZXQgdGhlIEZEVyB0dXBsZXN0b3JlIGZvciB0aGUg Y3VycmVudCB0cmlnZ2VyIHF1ZXJ5IGxldmVsLCBjcmVhdGluZyBpdApAQCAtNTA4Nyw2ICs1MDk3 LDcgQEAgQWZ0ZXJUcmlnZ2VyQmVnaW5YYWN0KHZvaWQpCiAJICovCiAJYWZ0ZXJUcmlnZ2Vycy5m aXJpbmdfY291bnRlciA9IChDb21tYW5kSWQpIDE7CS8qIG11c3RuJ3QgYmUgMCAqLwogCWFmdGVy VHJpZ2dlcnMucXVlcnlfZGVwdGggPSAtMTsKKwlhZnRlclRyaWdnZXJzLmJhdGNoX2NhbGxiYWNr cyA9IE5JTDsKIAogCS8qCiAJICogVmVyaWZ5IHRoYXQgdGhlcmUgaXMgbm8gbGVmdG92ZXIgc3Rh dGUgcmVtYWluaW5nLiAgSWYgdGhlc2UgYXNzZXJ0aW9ucwpAQCAtNTIwOCw2ICs1MjE5LDggQEAg QWZ0ZXJUcmlnZ2VyRW5kUXVlcnkoRVN0YXRlICplc3RhdGUpCiAJCQlicmVhazsKIAl9CiAKKwlG aXJlQWZ0ZXJUcmlnZ2VyQmF0Y2hDYWxsYmFja3MoKTsKKwogCS8qIFJlbGVhc2UgcXVlcnktbGV2 ZWwtbG9jYWwgc3RvcmFnZSwgaW5jbHVkaW5nIHR1cGxlc3RvcmVzIGlmIGFueSAqLwogCUFmdGVy VHJpZ2dlckZyZWVRdWVyeSgmYWZ0ZXJUcmlnZ2Vycy5xdWVyeV9zdGFja1thZnRlclRyaWdnZXJz LnF1ZXJ5X2RlcHRoXSk7CiAKQEAgLTUzMTUsNiArNTMyOCw4IEBAIEFmdGVyVHJpZ2dlckZpcmVE ZWZlcnJlZCh2b2lkKQogCQkJYnJlYWs7CQkJCS8qIGFsbCBmaXJlZCAqLwogCX0KIAorCUZpcmVB ZnRlclRyaWdnZXJCYXRjaENhbGxiYWNrcygpOworCiAJLyoKIAkgKiBXZSBkb24ndCBib3RoZXIg ZnJlZWluZyB0aGUgZXZlbnQgbGlzdCwgc2luY2UgaXQgd2lsbCBnbyBhd2F5IGFueXdheQogCSAq IChhbmQgbW9yZSBlZmZpY2llbnRseSB0aGFuIHZpYSBwZnJlZSkgaW4gQWZ0ZXJUcmlnZ2VyRW5k WGFjdC4KQEAgLTYwNTcsNiArNjA3Miw4IEBAIEFmdGVyVHJpZ2dlclNldFN0YXRlKENvbnN0cmFp bnRzU2V0U3RtdCAqc3RtdCkKIAkJCQlicmVhazsJCQkvKiBhbGwgZmlyZWQgKi8KIAkJfQogCisJ CUZpcmVBZnRlclRyaWdnZXJCYXRjaENhbGxiYWNrcygpOworCiAJCWlmIChzbmFwc2hvdF9zZXQp CiAJCQlQb3BBY3RpdmVTbmFwc2hvdCgpOwogCX0KQEAgLTY3NTMsMyArNjc3MCw3MCBAQCBjaGVj a19tb2RpZmllZF92aXJ0dWFsX2dlbmVyYXRlZChUdXBsZURlc2MgdHVwZGVzYywgSGVhcFR1cGxl IHR1cGxlKQogCiAJcmV0dXJuIHR1cGxlOwogfQorCisvKgorICogUmVnaXN0ZXJBZnRlclRyaWdn ZXJCYXRjaENhbGxiYWNrCisgKgkJUmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hl biB0aGUgY3VycmVudCB0cmlnZ2VyLWZpcmluZworICoJCWJhdGNoIGNvbXBsZXRlcy4KKyAqCisg KiBNdXN0IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIHRyaWdnZXIgZnVuY3Rpb24ncyBleGVjdXRp b24gY29udGV4dAorICogKGkuZS4sIHdoaWxlIGFmdGVyVHJpZ2dlcnMgc3RhdGUgaXMgYWN0aXZl KS4KKyAqCisgKiBUaGUgY2FsbGJhY2sgbGlzdCBpcyBjbGVhcmVkIGFmdGVyIGludm9jYXRpb24s IHNvIHRoZSBjYWxsZXIgbXVzdAorICogcmUtcmVnaXN0ZXIgZm9yIGVhY2ggbmV3IGJhdGNoIGlm IG5lZWRlZC4KKyAqLwordm9pZAorUmVnaXN0ZXJBZnRlclRyaWdnZXJCYXRjaENhbGxiYWNrKEFm dGVyVHJpZ2dlckJhdGNoQ2FsbGJhY2sgY2FsbGJhY2ssCisJCQkJCQkJCSAgdm9pZCAqYXJnKQor eworCUFmdGVyVHJpZ2dlckNhbGxiYWNrSXRlbSAqaXRlbTsKKwlNZW1vcnlDb250ZXh0IG9sZGN4 dDsKKworCS8qCisJICogQWxsb2NhdGUgaW4gVG9wVHJhbnNhY3Rpb25Db250ZXh0IHNvIHRoZSBp dGVtIHN1cnZpdmVzIGZvciB0aGUgZHVyYXRpb24KKwkgKiBvZiB0aGUgYmF0Y2gsIHdoaWNoIG1h eSBzcGFuIG11bHRpcGxlIHRyaWdnZXIgaW52b2NhdGlvbnMuCisJICovCisJb2xkY3h0ID0gTWVt b3J5Q29udGV4dFN3aXRjaFRvKFRvcFRyYW5zYWN0aW9uQ29udGV4dCk7CisJaXRlbSA9IHBhbGxv YyhzaXplb2YoQWZ0ZXJUcmlnZ2VyQ2FsbGJhY2tJdGVtKSk7CisJaXRlbS0+Y2FsbGJhY2sgPSBj YWxsYmFjazsKKwlpdGVtLT5hcmcgPSBhcmc7CisJYWZ0ZXJUcmlnZ2Vycy5iYXRjaF9jYWxsYmFj a3MgPQorCQlsYXBwZW5kKGFmdGVyVHJpZ2dlcnMuYmF0Y2hfY2FsbGJhY2tzLCBpdGVtKTsKKwlN ZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY3h0KTsKK30KKworLyoKKyAqIEZpcmVBZnRlclRyaWdn ZXJCYXRjaENhbGxiYWNrcworICoJCUludm9rZSBhbmQgY2xlYXIgYWxsIHJlZ2lzdGVyZWQgYmF0 Y2ggY2FsbGJhY2tzLgorICoKKyAqIENhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggdHJpZ2dlci1m aXJpbmcgYmF0Y2guCisgKi8KK3N0YXRpYyB2b2lkCitGaXJlQWZ0ZXJUcmlnZ2VyQmF0Y2hDYWxs YmFja3Modm9pZCkKK3sKKwlMaXN0Q2VsbCAgICpsYzsKKworCWZvcmVhY2gobGMsIGFmdGVyVHJp Z2dlcnMuYmF0Y2hfY2FsbGJhY2tzKQorCXsKKwkJQWZ0ZXJUcmlnZ2VyQ2FsbGJhY2tJdGVtICpp dGVtID0gbGZpcnN0KGxjKTsKKworCQlpdGVtLT5jYWxsYmFjayhpdGVtLT5hcmcpOworCX0KKwor CWxpc3RfZnJlZV9kZWVwKGFmdGVyVHJpZ2dlcnMuYmF0Y2hfY2FsbGJhY2tzKTsKKwlhZnRlclRy aWdnZXJzLmJhdGNoX2NhbGxiYWNrcyA9IE5JTDsKK30KKworLyoKKyAqIEFmdGVyVHJpZ2dlckJh dGNoSXNBY3RpdmUKKyAqCQlSZXR1cm5zIHRydWUgaWYgd2UncmUgaW5zaWRlIGEgcXVlcnktbGV2 ZWwgdHJpZ2dlciBiYXRjaCB3aGVyZQorICoJCXJlZ2lzdGVyZWQgYmF0Y2ggY2FsbGJhY2tzIHdp bGwgYWN0dWFsbHkgYmUgaW52b2tlZC4KKyAqCisgKiBUaGlzIGlzIGZhbHNlIGR1cmluZyB2YWxp ZGF0ZUZvcmVpZ25LZXlDb25zdHJhaW50KCksIHdoaWNoIGNhbGxzCisgKiBSSSB0cmlnZ2VyIGZ1 bmN0aW9ucyBkaXJlY3RseSBvdXRzaWRlIHRoZSBhZnRlci10cmlnZ2VyIGZyYW1ld29yay4KKyAq LworYm9vbAorQWZ0ZXJUcmlnZ2VyQmF0Y2hJc0FjdGl2ZSh2b2lkKQoreworCXJldHVybiBhZnRl clRyaWdnZXJzLnF1ZXJ5X2RlcHRoID49IDA7Cit9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91 dGlscy9hZHQvcmlfdHJpZ2dlcnMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9yaV90cmlnZ2Vy cy5jCmluZGV4IDQ1Y2M3NDJmYTE5Li4yZGJiMzNmNDM2ZCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tl bmQvdXRpbHMvYWR0L3JpX3RyaWdnZXJzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0L3Jp X3RyaWdnZXJzLmMKQEAgLTE5MCw2ICsxOTAsMjMgQEAgdHlwZWRlZiBzdHJ1Y3QgUklfQ29tcGFy ZUhhc2hFbnRyeQogCUZtZ3JJbmZvCWNhc3RfZnVuY19maW5mbzsJLyogaW4gY2FzZSB3ZSBtdXN0 IGNvZXJjZSBpbnB1dCAqLwogfSBSSV9Db21wYXJlSGFzaEVudHJ5OwogCisvKgorICogUklfRmFz dFBhdGhFbnRyeQorICoJCVBlci1jb25zdHJhaW50IGNhY2hlIG9mIHJlc291cmNlcyBuZWVkZWQg YnkgcmlfRmFzdFBhdGhDaGVjaygpLgorICoKKyAqIE9uZSBlbnRyeSBwZXIgY29uc3RyYWludCwg a2V5ZWQgYnkgcGdfY29uc3RyYWludCBPSUQuICBDcmVhdGVkIGxhemlseQorICogYnkgcmlfRmFz dFBhdGhHZXRFbnRyeSgpIG9uIGZpcnN0IHVzZSB3aXRoaW4gYSB0cmlnZ2VyLWZpcmluZyBiYXRj aAorICogYW5kIHRvcm4gZG93biBieSByaV9GYXN0UGF0aENsZWFudXAoKSBhdCBiYXRjaCBlbmQu CisgKi8KK3R5cGVkZWYgc3RydWN0IFJJX0Zhc3RQYXRoRW50cnkKK3sKKwlPaWQJCQljb25vaWQ7 CQkJLyogaGFzaCBrZXk6IHBnX2NvbnN0cmFpbnQgT0lEICovCisJUmVsYXRpb24JcGtfcmVsOwor CVJlbGF0aW9uCWlkeF9yZWw7CisJSW5kZXhTY2FuRGVzYyBzY2FuZGVzYzsKKwlUdXBsZVRhYmxl U2xvdCAqc2xvdDsKKwlTbmFwc2hvdAlzbmFwc2hvdDsJCS8qIHJlZ2lzdGVyZWQgc25hcHNob3Qg Zm9yIHRoZSBzY2FuICovCit9IFJJX0Zhc3RQYXRoRW50cnk7CiAKIC8qCiAgKiBMb2NhbCBkYXRh CkBAIC0xOTksNiArMjE2LDggQEAgc3RhdGljIEhUQUIgKnJpX3F1ZXJ5X2NhY2hlID0gTlVMTDsK IHN0YXRpYyBIVEFCICpyaV9jb21wYXJlX2NhY2hlID0gTlVMTDsKIHN0YXRpYyBkY2xpc3RfaGVh ZCByaV9jb25zdHJhaW50X2NhY2hlX3ZhbGlkX2xpc3Q7CiAKK3N0YXRpYyBIVEFCICpyaV9mYXN0 cGF0aF9jYWNoZSA9IE5VTEw7CitzdGF0aWMgYm9vbCByaV9mYXN0cGF0aF9jYWxsYmFja19yZWdp c3RlcmVkID0gZmFsc2U7CiAKIC8qCiAgKiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCkBAIC0y NjcsNiArMjg2LDggQEAgcGdfbm9yZXR1cm4gc3RhdGljIHZvaWQgcmlfUmVwb3J0VmlvbGF0aW9u KGNvbnN0IFJJX0NvbnN0cmFpbnRJbmZvICpyaWluZm8sCiAJCQkJCQkJCQkJICAgUmVsYXRpb24g cGtfcmVsLCBSZWxhdGlvbiBma19yZWwsCiAJCQkJCQkJCQkJICAgVHVwbGVUYWJsZVNsb3QgKnZp b2xhdG9yc2xvdCwgVHVwbGVEZXNjIHR1cGRlc2MsCiAJCQkJCQkJCQkJICAgaW50IHF1ZXJ5bm8s IGJvb2wgaXNfcmVzdHJpY3QsIGJvb2wgcGFydGdvbmUpOworc3RhdGljIFJJX0Zhc3RQYXRoRW50 cnkgKnJpX0Zhc3RQYXRoR2V0RW50cnkoY29uc3QgUklfQ29uc3RyYWludEluZm8gKnJpaW5mbyk7 CitzdGF0aWMgdm9pZCByaV9GYXN0UGF0aENsZWFudXAodm9pZCAqYXJnKTsKIAogCiAvKgpAQCAt MjY5Niw2ICsyNzE3LDE5IEBAIHJpX0Zhc3RQYXRoQ2hlY2soY29uc3QgUklfQ29uc3RyYWludElu Zm8gKnJpaW5mbywKIAlPaWQJCQlzYXZlZF91c2VyaWQ7CiAJaW50CQkJc2F2ZWRfc2VjX2NvbnRl eHQ7CiAJU25hcHNob3QJc25hcHNob3Q7CisJYm9vbAkJdXNlX2NhY2hlOworCVJJX0Zhc3RQYXRo RW50cnkgKmZwZW50cnkgPSBOVUxMOworCisJLyoKKwkgKiBVc2UgdGhlIHBlci1iYXRjaCBjYWNo ZSBvbmx5IGlmIHdlJ3JlIGluc2lkZSB0aGUgYWZ0ZXItdHJpZ2dlcgorCSAqIGZyYW1ld29yaywg d2hlcmUgb3VyIGNsZWFudXAgY2FsbGJhY2sgd2lsbCBmaXJlLiAgRHVyaW5nIEFMVEVSIFRBQkxF CisJICogLi4uIEFERCBGT1JFSUdOIEtFWSB2YWxpZGF0aW9uLCB0cmlnZ2VycyBhcmUgY2FsbGVk IGRpcmVjdGx5IGFuZCB0aGUKKwkgKiBjYWxsYmFjayB3b3VsZCBuZXZlciBydW4sIGxlYWtpbmcg cmVzb3VyY2VzLgorCSAqLworCXVzZV9jYWNoZSA9IEFmdGVyVHJpZ2dlckJhdGNoSXNBY3RpdmUo KTsKKworCWlmICh1c2VfY2FjaGUpCisJCWZwZW50cnkgPSByaV9GYXN0UGF0aEdldEVudHJ5KHJp aW5mbyk7CiAKIAkvKgogCSAqIEFkdmFuY2UgdGhlIGNvbW1hbmQgY291bnRlciBzbyB0aGUgc25h cHNob3Qgc2VlcyB0aGUgZWZmZWN0cyBvZiBwcmlvcgpAQCAtMjcwMywxNSArMjczNyw0MCBAQCBy aV9GYXN0UGF0aENoZWNrKGNvbnN0IFJJX0NvbnN0cmFpbnRJbmZvICpyaWluZm8sCiAJICogcmlf UGVyZm9ybUNoZWNrKCkuCiAJICovCiAJQ29tbWFuZENvdW50ZXJJbmNyZW1lbnQoKTsKLQlzbmFw c2hvdCA9IFJlZ2lzdGVyU25hcHNob3QoR2V0TGF0ZXN0U25hcHNob3QoKSk7Ci0KLQlwa19yZWwg PSB0YWJsZV9vcGVuKHJpaW5mby0+cGtfcmVsaWQsIFJvd1NoYXJlTG9jayk7Ci0JaWR4X3JlbCA9 IGluZGV4X29wZW4ocmlpbmZvLT5jb25pbmRpZCwgQWNjZXNzU2hhcmVMb2NrKTsKKwlpZiAodXNl X2NhY2hlKQorCXsKKwkJLyoKKwkJICogVGhlIHNuYXBzaG90IHdhcyByZWdpc3RlcmVkIG9uY2Ug d2hlbiB0aGUgY2FjaGUgZW50cnkgd2FzIGNyZWF0ZWQuCisJCSAqIFdlIGp1c3QgcGF0Y2ggY3Vy Y2lkIHRvIHJlZmxlY3QgdGhlIG5ldyBjb21tYW5kIGNvdW50ZXIuCisJCSAqIFNuYXBzaG90U2V0 Q29tbWFuZElkKCkgb25seSBwYXRjaGVzIHByb2Nlc3MtZ2xvYmFsIHN0YXRpY3MsIG5vdAorCQkg KiByZWdpc3RlcmVkIGNvcGllcywgc28gd2UgZG8gaXQgZGlyZWN0bHkuCisJCSAqCisJCSAqIFRo ZSB4bWluL3htYXgveGlwIGZpZWxkcyBkb24ndCBuZWVkIHJlZnJlc2hpbmc6IHdpdGhpbiBhIHNp bmdsZQorCQkgKiBzdGF0ZW1lbnQgYmF0Y2gsIG9ubHkgY3VyY2lkIGNoYW5nZXMgYmV0d2VlbiBy b3dzLgorCQkgKi8KKwkJQXNzZXJ0KGZwZW50cnkgJiYgZnBlbnRyeS0+c25hcHNob3QgIT0gTlVM TCk7CisJCXNuYXBzaG90ID0gZnBlbnRyeS0+c25hcHNob3Q7CisJCXNuYXBzaG90LT5jdXJjaWQg PSBHZXRDdXJyZW50Q29tbWFuZElkKGZhbHNlKTsKKwl9CisJZWxzZQorCQlzbmFwc2hvdCA9IFJl Z2lzdGVyU25hcHNob3QoR2V0TGF0ZXN0U25hcHNob3QoKSk7CiAKLQlzbG90ID0gdGFibGVfc2xv dF9jcmVhdGUocGtfcmVsLCBOVUxMKTsKLQlzY2FuZGVzYyA9IGluZGV4X2JlZ2luc2Nhbihwa19y ZWwsIGlkeF9yZWwsCi0JCQkJCQkJICAgc25hcHNob3QsIE5VTEwsCi0JCQkJCQkJICAgcmlpbmZv LT5ua2V5cywgMCk7CisJaWYgKHVzZV9jYWNoZSkKKwl7CisJCXBrX3JlbCA9IGZwZW50cnktPnBr X3JlbDsKKwkJaWR4X3JlbCA9IGZwZW50cnktPmlkeF9yZWw7CisJCXNjYW5kZXNjID0gZnBlbnRy eS0+c2NhbmRlc2M7CisJCXNsb3QgPSBmcGVudHJ5LT5zbG90OworCX0KKwllbHNlCisJeworCQlw a19yZWwgPSB0YWJsZV9vcGVuKHJpaW5mby0+cGtfcmVsaWQsIFJvd1NoYXJlTG9jayk7CisJCWlk eF9yZWwgPSBpbmRleF9vcGVuKHJpaW5mby0+Y29uaW5kaWQsIEFjY2Vzc1NoYXJlTG9jayk7CisJ CXNjYW5kZXNjID0gaW5kZXhfYmVnaW5zY2FuKHBrX3JlbCwgaWR4X3JlbCwKKwkJCQkJCQkJICAg c25hcHNob3QsIE5VTEwsCisJCQkJCQkJCSAgIHJpaW5mby0+bmtleXMsIDApOworCQlzbG90ID0g dGFibGVfc2xvdF9jcmVhdGUocGtfcmVsLCBOVUxMKTsKKwl9CiAKIAlpZiAoIXJpaW5mby0+ZnBt ZXRhX3ZhbGlkKQogCQlyaV9wb3B1bGF0ZV9mYXN0cGF0aF9tZXRhZGF0YSgoUklfQ29uc3RyYWlu dEluZm8gKikgcmlpbmZvLApAQCAtMjc4MiwxMiArMjg0MSwxNSBAQCByaV9GYXN0UGF0aENoZWNr KGNvbnN0IFJJX0NvbnN0cmFpbnRJbmZvICpyaWluZm8sCiAJCUV4ZWNEcm9wU2luZ2xlVHVwbGVU YWJsZVNsb3QoeGFjdF9zbG90KTsKIAl9CiAKLQlpbmRleF9lbmRzY2FuKHNjYW5kZXNjKTsKLQlp bmRleF9jbG9zZShpZHhfcmVsLCBOb0xvY2spOwotCXRhYmxlX2Nsb3NlKHBrX3JlbCwgTm9Mb2Nr KTsKLQlFeGVjRHJvcFNpbmdsZVR1cGxlVGFibGVTbG90KHNsb3QpOwotCi0JVW5yZWdpc3RlclNu YXBzaG90KHNuYXBzaG90KTsKKwkvKiBOb24tY2FjaGVkIHBhdGg6IGNsZWFuIHVwIHBlci1pbnZv Y2F0aW9uIHJlc291cmNlcyAqLworCWlmICghdXNlX2NhY2hlKQorCXsKKwkJaW5kZXhfZW5kc2Nh bihzY2FuZGVzYyk7CisJCWluZGV4X2Nsb3NlKGlkeF9yZWwsIE5vTG9jayk7CisJCXRhYmxlX2Ns b3NlKHBrX3JlbCwgTm9Mb2NrKTsKKwkJRXhlY0Ryb3BTaW5nbGVUdXBsZVRhYmxlU2xvdChzbG90 KTsKKwkJVW5yZWdpc3RlclNuYXBzaG90KHNuYXBzaG90KTsKKwl9CiAKIAlTZXRVc2VySWRBbmRT ZWNDb250ZXh0KHNhdmVkX3VzZXJpZCwgc2F2ZWRfc2VjX2NvbnRleHQpOwogCkBAIC0zNjczLDMg KzM3MzUsMTY2IEBAIFJJX0ZLZXlfdHJpZ2dlcl90eXBlKE9pZCB0Z2ZvaWQpCiAKIAlyZXR1cm4g UklfVFJJR0dFUl9OT05FOwogfQorCisvKgorICogcmlfRmFzdFBhdGhDbGVhbnVwCisgKgkJVGVh ciBkb3duIGFsbCBjYWNoZWQgZmFzdC1wYXRoIHN0YXRlLgorICoKKyAqIENhbGxlZCBhcyBhbiBB ZnRlclRyaWdnZXJCYXRjaENhbGxiYWNrIGF0IGVuZCBvZiBiYXRjaC4KKyAqLworc3RhdGljIHZv aWQKK3JpX0Zhc3RQYXRoQ2xlYW51cCh2b2lkICphcmcpCit7CisJSEFTSF9TRVFfU1RBVFVTIHN0 YXR1czsKKwlSSV9GYXN0UGF0aEVudHJ5ICplbnRyeTsKKworCWlmIChyaV9mYXN0cGF0aF9jYWNo ZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwloYXNoX3NlcV9pbml0KCZzdGF0dXMsIHJpX2Zhc3Rw YXRoX2NhY2hlKTsKKwl3aGlsZSAoKGVudHJ5ID0gaGFzaF9zZXFfc2VhcmNoKCZzdGF0dXMpKSAh PSBOVUxMKQorCXsKKwkJaWYgKGVudHJ5LT5zY2FuZGVzYykKKwkJCWluZGV4X2VuZHNjYW4oZW50 cnktPnNjYW5kZXNjKTsKKwkJaWYgKGVudHJ5LT5pZHhfcmVsKQorCQkJaW5kZXhfY2xvc2UoZW50 cnktPmlkeF9yZWwsIE5vTG9jayk7CisJCWlmIChlbnRyeS0+cGtfcmVsKQorCQkJdGFibGVfY2xv c2UoZW50cnktPnBrX3JlbCwgTm9Mb2NrKTsKKwkJaWYgKGVudHJ5LT5zbG90KQorCQkJRXhlY0Ry b3BTaW5nbGVUdXBsZVRhYmxlU2xvdChlbnRyeS0+c2xvdCk7CisJCWlmIChlbnRyeS0+c25hcHNo b3QpCisJCQlVbnJlZ2lzdGVyU25hcHNob3QoZW50cnktPnNuYXBzaG90KTsKKwl9CisKKwloYXNo X2Rlc3Ryb3kocmlfZmFzdHBhdGhfY2FjaGUpOworCXJpX2Zhc3RwYXRoX2NhY2hlID0gTlVMTDsK KwlyaV9mYXN0cGF0aF9jYWxsYmFja19yZWdpc3RlcmVkID0gZmFsc2U7Cit9CisKK3N0YXRpYyBi b29sIHJpX2Zhc3RwYXRoX3hhY3RfY2FsbGJhY2tfcmVnaXN0ZXJlZCA9IGZhbHNlOworCitzdGF0 aWMgdm9pZAorcmlfRmFzdFBhdGhYYWN0Q2FsbGJhY2soWGFjdEV2ZW50IGV2ZW50LCB2b2lkICph cmcpCit7CisJLyoKKwkgKiBUb3BUcmFuc2FjdGlvbkNvbnRleHQgaXMgZGVzdHJveWVkIGF0IGVu ZCBvZiB0cmFuc2FjdGlvbiwgdGFraW5nIHRoZQorCSAqIGhhc2ggdGFibGUgYW5kIGFsbCBjYWNo ZWQgcmVzb3VyY2VzIHdpdGggaXQuICBKdXN0IHJlc2V0IG91ciBzdGF0aWMKKwkgKiBwb2ludGVy cyBzbyB3ZSBkb24ndCBkZXJlZmVyZW5jZSBmcmVlZCBtZW1vcnkuCisJICoKKwkgKiBJbiB0aGUg bm9ybWFsIChub24tZXJyb3IpIHBhdGgsIHJpX0Zhc3RQYXRoQ2xlYW51cCBhbHJlYWR5IHJhbiB2 aWEgdGhlCisJICogYmF0Y2ggY2FsbGJhY2sgYW5kIGRpZCBvcmRlcmx5IHRlYXJkb3duLiAgSGVy ZSB3ZSdyZSBqdXN0IGhhbmRsaW5nIHRoZQorCSAqIGFib3J0IHBhdGggd2hlcmUgdGhhdCBjYWxs YmFjayBuZXZlciBmaXJlZC4KKwkgKi8KKwlyaV9mYXN0cGF0aF9jYWNoZSA9IE5VTEw7CisJcmlf ZmFzdHBhdGhfY2FsbGJhY2tfcmVnaXN0ZXJlZCA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZAor cmlfRmFzdFBhdGhTdWJYYWN0Q2FsbGJhY2soU3ViWGFjdEV2ZW50IGV2ZW50LCBTdWJUcmFuc2Fj dGlvbklkIG15U3ViaWQsCisJCQkJCQkgICBTdWJUcmFuc2FjdGlvbklkIHBhcmVudFN1YmlkLCB2 b2lkICphcmcpCit7CisJaWYgKGV2ZW50ID09IFNVQlhBQ1RfRVZFTlRfQUJPUlRfU1VCKQorCXsK KwkJLyoKKwkJICogUmVzb3VyY2VPd25lciBhbHJlYWR5IGNsZWFuZWQgdXAgcmVsYXRpb25zLCBz Y2FucywgYW5kIHNuYXBzaG90cy4KKwkJICogSnVzdCBOVUxMIG91ciBwb2ludGVycyBzbyB0aGUg c3RpbGwtcmVnaXN0ZXJlZCBiYXRjaCBjYWxsYmFjaworCQkgKiBiZWNvbWVzIGEgbm8tb3AuICBU aGUgaGFzaCB0YWJsZSBtZW1vcnkgaW4gVG9wVHJhbnNhY3Rpb25Db250ZXh0CisJCSAqIHdpbGwg YmUgZnJlZWQgYXQgdHJhbnNhY3Rpb24gZW5kLgorCQkgKi8KKwkJcmlfZmFzdHBhdGhfY2FjaGUg PSBOVUxMOworCQlyaV9mYXN0cGF0aF9jYWxsYmFja19yZWdpc3RlcmVkID0gZmFsc2U7CisJfQor fQorCisvKgorICogcmlfRmFzdFBhdGhHZXRFbnRyeQorICoJCUxvb2sgdXAgb3IgY3JlYXRlIGEg cGVyLWJhdGNoIGNhY2hlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gY29uc3RyYWludC4KKyAqCisgKiBP biBmaXJzdCBjYWxsIGZvciBhIGNvbnN0cmFpbnQgd2l0aGluIGEgYmF0Y2g6IG9wZW5zIHBrX3Jl bCBhbmQgdGhlCisgKiBpbmRleCwgYmVnaW5zIGFuIGluZGV4IHNjYW4sIGFsbG9jYXRlcyBhIHJl c3VsdCBzbG90LCBhbmQgcmVnaXN0ZXJzCisgKiB0aGUgY2xlYW51cCBjYWxsYmFjay4KKyAqCisg KiBPbiBzdWJzZXF1ZW50IGNhbGxzOiByZXR1cm5zIHRoZSBleGlzdGluZyBlbnRyeS4gIENhbGxl ciB1c2VzCisgKiBpbmRleF9yZXNjYW4oKSB3aXRoIG5ldyBrZXlzLgorICovCitzdGF0aWMgUklf RmFzdFBhdGhFbnRyeSAqCityaV9GYXN0UGF0aEdldEVudHJ5KGNvbnN0IFJJX0NvbnN0cmFpbnRJ bmZvICpyaWluZm8pCit7CisJUklfRmFzdFBhdGhFbnRyeSAqZW50cnk7CisJYm9vbAkJZm91bmQ7 CisKKwkvKiBDcmVhdGUgaGFzaCB0YWJsZSBvbiBmaXJzdCB1c2UgaW4gdGhpcyBiYXRjaCAqLwor CWlmIChyaV9mYXN0cGF0aF9jYWNoZSA9PSBOVUxMKQorCXsKKwkJSEFTSENUTAkJY3RsOworCisJ CWlmICghcmlfZmFzdHBhdGhfeGFjdF9jYWxsYmFja19yZWdpc3RlcmVkKQorCQl7CisJCQlSZWdp c3RlclhhY3RDYWxsYmFjayhyaV9GYXN0UGF0aFhhY3RDYWxsYmFjaywgTlVMTCk7CisJCQlSZWdp c3RlclN1YlhhY3RDYWxsYmFjayhyaV9GYXN0UGF0aFN1YlhhY3RDYWxsYmFjaywgTlVMTCk7CisJ CQlyaV9mYXN0cGF0aF94YWN0X2NhbGxiYWNrX3JlZ2lzdGVyZWQgPSB0cnVlOworCQl9CisKKwkJ Y3RsLmtleXNpemUgPSBzaXplb2YoT2lkKTsKKwkJY3RsLmVudHJ5c2l6ZSA9IHNpemVvZihSSV9G YXN0UGF0aEVudHJ5KTsKKwkJY3RsLmhjeHQgPSBUb3BUcmFuc2FjdGlvbkNvbnRleHQ7CisJCXJp X2Zhc3RwYXRoX2NhY2hlID0gaGFzaF9jcmVhdGUoIlJJIGZhc3QtcGF0aCBjYWNoZSIsCisJCQkJ CQkJCQkJMTYsCisJCQkJCQkJCQkJJmN0bCwKKwkJCQkJCQkJCQlIQVNIX0VMRU0gfCBIQVNIX0JM T0JTIHwgSEFTSF9DT05URVhUKTsKKwl9CisKKwllbnRyeSA9IGhhc2hfc2VhcmNoKHJpX2Zhc3Rw YXRoX2NhY2hlLCAmcmlpbmZvLT5jb25zdHJhaW50X2lkLAorCQkJCQkJSEFTSF9FTlRFUiwgJmZv dW5kKTsKKworCWlmICghZm91bmQpCisJeworCQlNZW1vcnlDb250ZXh0IG9sZGN4dDsKKworCQkv KgorCQkgKiBaZXJvIG91dCBub24ta2V5IGZpZWxkcyBzbyByaV9GYXN0UGF0aENsZWFudXAgaXMg c2FmZSBpZiB3ZSBlcnJvcgorCQkgKiBvdXQgZHVyaW5nIHBhcnRpYWwgaW5pdGlhbGl6YXRpb24g YmVsb3cuCisJCSAqLworCQltZW1zZXQoKChjaGFyICopIGVudHJ5KSArIHNpemVvZihPaWQpLCAw LAorCQkJICAgc2l6ZW9mKFJJX0Zhc3RQYXRoRW50cnkpIC0gc2l6ZW9mKE9pZCkpOworCisJCW9s ZGN4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhUb3BUcmFuc2FjdGlvbkNvbnRleHQpOworCisJ CS8qCisJCSAqIE9wZW4gUEsgdGFibGUgYW5kIGl0cyB1bmlxdWUgaW5kZXguCisJCSAqCisJCSAq IFJvd1NoYXJlTG9jayBvbiBwa19yZWwgbWF0Y2hlcyB3aGF0IHRoZSBTUEkgcGF0aCdzIFNFTEVD VCAuLi4gRk9SCisJCSAqIEtFWSBTSEFSRSB3b3VsZCBhY3F1aXJlIGFzIGEgcmVsYXRpb24tbGV2 ZWwgbG9jay4gQWNjZXNzU2hhcmVMb2NrCisJCSAqIG9uIHRoZSBpbmRleCBpcyBzdGFuZGFyZCBm b3IgaW5kZXggc2NhbnMuCisJCSAqCisJCSAqIFdlIGRvbid0IHJlbGVhc2UgdGhlc2UgbG9ja3Mg dW50aWwgZW5kIG9mIHRyYW5zYWN0aW9uLCBtYXRjaGluZyBTUEkKKwkJICogYmVoYXZpb3IuCisJ CSAqLworCQllbnRyeS0+cGtfcmVsID0gdGFibGVfb3BlbihyaWluZm8tPnBrX3JlbGlkLCBSb3dT aGFyZUxvY2spOworCQllbnRyeS0+aWR4X3JlbCA9IGluZGV4X29wZW4ocmlpbmZvLT5jb25pbmRp ZCwgQWNjZXNzU2hhcmVMb2NrKTsKKworCQkvKgorCQkgKiBSZWdpc3RlciBhbiBpbml0aWFsIHNu YXBzaG90LiAgSXRzIGN1cmNpZCB3aWxsIGJlIHBhdGNoZWQgaW4gcGxhY2UKKwkJICogb24gZWFj aCBzdWJzZXF1ZW50IHJvdyAoc2VlIHJpX0Zhc3RQYXRoQ2hlY2soKSksIGF2b2lkaW5nIHBlci1y b3cKKwkJICogR2V0U25hcHNob3REYXRhKCkgb3ZlcmhlYWQuCisJCSAqLworCQllbnRyeS0+c25h cHNob3QgPSBSZWdpc3RlclNuYXBzaG90KEdldExhdGVzdFNuYXBzaG90KCkpOworCisJCWVudHJ5 LT5zbG90ID0gdGFibGVfc2xvdF9jcmVhdGUoZW50cnktPnBrX3JlbCwgTlVMTCk7CisKKwkJZW50 cnktPnNjYW5kZXNjID0gaW5kZXhfYmVnaW5zY2FuKGVudHJ5LT5wa19yZWwsIGVudHJ5LT5pZHhf cmVsLAorCQkJCQkJCQkJCSAgZW50cnktPnNuYXBzaG90LCBOVUxMLAorCQkJCQkJCQkJCSAgcmlp bmZvLT5ua2V5cywgMCk7CisKKwkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZGN4dCk7CisKKwkJ LyogRW5zdXJlIGNsZWFudXAgYXQgZW5kIG9mIHRoaXMgdHJpZ2dlci1maXJpbmcgYmF0Y2ggKi8K KwkJaWYgKCFyaV9mYXN0cGF0aF9jYWxsYmFja19yZWdpc3RlcmVkKQorCQl7CisJCQlSZWdpc3Rl ckFmdGVyVHJpZ2dlckJhdGNoQ2FsbGJhY2socmlfRmFzdFBhdGhDbGVhbnVwLCBOVUxMKTsKKwkJ CXJpX2Zhc3RwYXRoX2NhbGxiYWNrX3JlZ2lzdGVyZWQgPSB0cnVlOworCQl9CisJfQorCisJcmV0 dXJuIGVudHJ5OworfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvY29tbWFuZHMvdHJpZ2dlci5o IGIvc3JjL2luY2x1ZGUvY29tbWFuZHMvdHJpZ2dlci5oCmluZGV4IDU1NmM4NmJmNWUxLi40MzA0 YWJmZmM4ZCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY29tbWFuZHMvdHJpZ2dlci5oCisrKyBi L3NyYy9pbmNsdWRlL2NvbW1hbmRzL3RyaWdnZXIuaApAQCAtMjg5LDQgKzI4OSwyMiBAQCBleHRl cm4gdm9pZCBSSV9QYXJ0aXRpb25SZW1vdmVfQ2hlY2soVHJpZ2dlciAqdHJpZ2dlciwgUmVsYXRp b24gZmtfcmVsLAogCiBleHRlcm4gaW50CVJJX0ZLZXlfdHJpZ2dlcl90eXBlKE9pZCB0Z2ZvaWQp OwogCisvKgorICogQ2FsbGJhY2sgdHlwZSBmb3IgZW5kLW9mLXRyaWdnZXItYmF0Y2ggbm90aWZp Y2F0aW9ucy4KKyAqCisgKiBSZWdpc3RlcmVkIHZpYSBSZWdpc3RlckFmdGVyVHJpZ2dlckJhdGNo Q2FsbGJhY2soKS4gIEludm9rZWQgd2hlbgorICogYSBiYXRjaCBvZiBhZnRlci10cmlnZ2VyIHBy b2Nlc3NpbmcgY29tcGxldGVzOgorICoJLSBBZnRlclRyaWdnZXJFbmRRdWVyeSgpICAgICAgKGlt bWVkaWF0ZSBjb25zdHJhaW50cykKKyAqCS0gQWZ0ZXJUcmlnZ2VyRmlyZURlZmVycmVkKCkgIChk ZWZlcnJlZCBjb25zdHJhaW50cyBhdCBDT01NSVQpCisgKgktIEFmdGVyVHJpZ2dlclNldFN0YXRl KCkgICAgICAoU0VUIENPTlNUUkFJTlRTIElNTUVESUFURSkKKyAqCisgKiBUaGUgY2FsbGJhY2sg bGlzdCBpcyBjbGVhcmVkIGFmdGVyIGVhY2ggYmF0Y2guICBDYWxsZXJzIG11c3QKKyAqIHJlLXJl Z2lzdGVyIGlmIHRoZXkgbmVlZCB0byBiZSBjYWxsZWQgYWdhaW4gaW4gYSBzdWJzZXF1ZW50IGJh dGNoLgorICovCit0eXBlZGVmIHZvaWQgKCpBZnRlclRyaWdnZXJCYXRjaENhbGxiYWNrKSAodm9p ZCAqYXJnKTsKKworZXh0ZXJuIHZvaWQgUmVnaXN0ZXJBZnRlclRyaWdnZXJCYXRjaENhbGxiYWNr KEFmdGVyVHJpZ2dlckJhdGNoQ2FsbGJhY2sgY2FsbGJhY2ssCisJCQkJCQkJCQkJCSAgdm9pZCAq YXJnKTsKK2V4dGVybiBib29sIEFmdGVyVHJpZ2dlckJhdGNoSXNBY3RpdmUodm9pZCk7CisKICNl bmRpZgkJCQkJCQkvKiBUUklHR0VSX0ggKi8KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvZm9yZWlnbl9rZXkub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9mb3Jl aWduX2tleS5vdXQKaW5kZXggMDgyNmY1MTgwMDQuLmRiODMxZGRmYzVjIDEwMDY0NAotLS0gYS9z cmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2ZvcmVpZ25fa2V5Lm91dAorKysgYi9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL2ZvcmVpZ25fa2V5Lm91dApAQCAtMzUwNCwzICszNTA0LDUwIEBAIERF VEFJTDogIGRyb3AgY2FzY2FkZXMgdG8gdGFibGUgZmtwYXJ0MTNfdDEKIGRyb3AgY2FzY2FkZXMg dG8gdGFibGUgZmtwYXJ0MTNfdDIKIGRyb3AgY2FzY2FkZXMgdG8gdGFibGUgZmtwYXJ0MTNfdDMK IFJFU0VUIHNlYXJjaF9wYXRoOworLS0gVGVzdHMgZm9yZWlnbiBrZXkgY2hlY2sgZmFzdC1wYXRo IG5vLWNhY2hlIHBhdGguCitDUkVBVEUgVEFCTEUgZnBfcGtfYWx0ZXIgKGEgaW50IFBSSU1BUlkg S0VZKTsKK0lOU0VSVCBJTlRPIGZwX3BrX2FsdGVyIFNFTEVDVCBnZW5lcmF0ZV9zZXJpZXMoMSwg MTAwKTsKK0NSRUFURSBUQUJMRSBmcF9ma19hbHRlciAoYSBpbnQpOworSU5TRVJUIElOVE8gZnBf ZmtfYWx0ZXIgU0VMRUNUIGdlbmVyYXRlX3NlcmllcygxLCAxMDApOworLS0gVmFsaWRhdGlvbiBw YXRoOiBzaG91bGQgc3VjY2VlZAorQUxURVIgVEFCTEUgZnBfZmtfYWx0ZXIgQUREIEZPUkVJR04g S0VZIChhKSBSRUZFUkVOQ0VTIGZwX3BrX2FsdGVyOworSU5TRVJUIElOVE8gZnBfZmtfYWx0ZXIg VkFMVUVTICgxMDEpOyAgLS0gc2hvdWxkIGZhaWwgKGNvbnN0cmFpbnQgYWN0aXZlKQorRVJST1I6 ICBpbnNlcnQgb3IgdXBkYXRlIG9uIHRhYmxlICJmcF9ma19hbHRlciIgdmlvbGF0ZXMgZm9yZWln biBrZXkgY29uc3RyYWludCAiZnBfZmtfYWx0ZXJfYV9ma2V5IgorREVUQUlMOiAgS2V5IChhKT0o MTAxKSBpcyBub3QgcHJlc2VudCBpbiB0YWJsZSAiZnBfcGtfYWx0ZXIiLgorRFJPUCBUQUJMRSBm cF9ma19hbHRlciwgZnBfcGtfYWx0ZXI7CistLSBTZXBhcmF0ZSB0ZXN0OiB2YWxpZGF0aW9uIGNh dGNoZXMgZXhpc3RpbmcgdmlvbGF0aW9uCitDUkVBVEUgVEFCTEUgZnBfcGtfYWx0ZXIyIChhIGlu dCBQUklNQVJZIEtFWSk7CitJTlNFUlQgSU5UTyBmcF9wa19hbHRlcjIgVkFMVUVTICgxKTsKK0NS RUFURSBUQUJMRSBmcF9ma19hbHRlcjIgKGEgaW50KTsKK0lOU0VSVCBJTlRPIGZwX2ZrX2FsdGVy MiBWQUxVRVMgKDEpLCAoMjAwKTsgIC0tIDIwMCBoYXMgbm8gUEsgbWF0Y2gKK0FMVEVSIFRBQkxF IGZwX2ZrX2FsdGVyMiBBREQgRk9SRUlHTiBLRVkgKGEpIFJFRkVSRU5DRVMgZnBfcGtfYWx0ZXIy OyAgLS0gc2hvdWxkIGZhaWwKK0VSUk9SOiAgaW5zZXJ0IG9yIHVwZGF0ZSBvbiB0YWJsZSAiZnBf ZmtfYWx0ZXIyIiB2aW9sYXRlcyBmb3JlaWduIGtleSBjb25zdHJhaW50ICJmcF9ma19hbHRlcjJf YV9ma2V5IgorREVUQUlMOiAgS2V5IChhKT0oMjAwKSBpcyBub3QgcHJlc2VudCBpbiB0YWJsZSAi ZnBfcGtfYWx0ZXIyIi4KK0RST1AgVEFCTEUgZnBfZmtfYWx0ZXIyLCBmcF9wa19hbHRlcjI7Cist LSBUZXN0cyB0aGF0IHRoZSBmYXN0LXBhdGggaGFuZGxlcyBjYWNoaW5nIGZvciBtdWx0aXBsZSBj b25zdHJhaW50cworQ1JFQVRFIFRBQkxFIGZwX3BrMSAoYSBpbnQgUFJJTUFSWSBLRVkpOworQ1JF QVRFIFRBQkxFIGZwX3BrMiAoYiBpbnQgUFJJTUFSWSBLRVkpOworSU5TRVJUIElOVE8gZnBfcGsx IFZBTFVFUyAoMSk7CitJTlNFUlQgSU5UTyBmcF9wazIgVkFMVUVTICgxKTsKK0NSRUFURSBUQUJM RSBmcF9tdWx0aV9mayAoCisgICAgYSBpbnQgUkVGRVJFTkNFUyBmcF9wazEsCisgICAgYiBpbnQg UkVGRVJFTkNFUyBmcF9wazIKKyk7CitJTlNFUlQgSU5UTyBmcF9tdWx0aV9mayBWQUxVRVMgKDEs IDEpOyAgLS0gdHdvIGNvbnN0cmFpbnRzLCBvbmUgYmF0Y2gKK0lOU0VSVCBJTlRPIGZwX211bHRp X2ZrIFZBTFVFUyAoMSwgMik7ICAtLSBzZWNvbmQgY29uc3RyYWludCBmYWlscworRVJST1I6ICBp bnNlcnQgb3IgdXBkYXRlIG9uIHRhYmxlICJmcF9tdWx0aV9mayIgdmlvbGF0ZXMgZm9yZWlnbiBr ZXkgY29uc3RyYWludCAiZnBfbXVsdGlfZmtfYl9ma2V5IgorREVUQUlMOiAgS2V5IChiKT0oMikg aXMgbm90IHByZXNlbnQgaW4gdGFibGUgImZwX3BrMiIuCitEUk9QIFRBQkxFIGZwX211bHRpX2Zr LCBmcF9wazEsIGZwX3BrMjsKKy0tIFRlc3QgdGhhdCBmYXN0LXBhdGggY2FjaGUgaGFuZGxlcyBk ZWZlcnJlZCBjb25zdHJhaW50cyBhbmQgU0VUIENPTlNUUkFJTlRTIElNTUVESUFURQorQ1JFQVRF IFRBQkxFIGZwX3BrX2RlZmVyIChhIGludCBQUklNQVJZIEtFWSk7CitDUkVBVEUgVEFCTEUgZnBf ZmtfZGVmZXIgKGEgaW50IFJFRkVSRU5DRVMgZnBfcGtfZGVmZXIgREVGRVJSQUJMRSBJTklUSUFM TFkgREVGRVJSRUQpOworSU5TRVJUIElOVE8gZnBfcGtfZGVmZXIgVkFMVUVTICgxKSwgKDIpOwor QkVHSU47CitJTlNFUlQgSU5UTyBmcF9ma19kZWZlciBWQUxVRVMgKDEpOworSU5TRVJUIElOVE8g ZnBfZmtfZGVmZXIgVkFMVUVTICgyKTsKK1NFVCBDT05TVFJBSU5UUyBBTEwgSU1NRURJQVRFOyAg LS0gZmlyZXMgYmF0Y2ggY2FsbGJhY2sgaGVyZQorSU5TRVJUIElOVE8gZnBfZmtfZGVmZXIgVkFM VUVTICgzKTsgIC0tIHNob3VsZCBmYWlsLCBhbHNvIHRlc3RzIHRoYXQgY2FjaGUgd2FzIGNsZWFu ZWQgdXAKK0VSUk9SOiAgaW5zZXJ0IG9yIHVwZGF0ZSBvbiB0YWJsZSAiZnBfZmtfZGVmZXIiIHZp b2xhdGVzIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgImZwX2ZrX2RlZmVyX2FfZmtleSIKK0RFVEFJ TDogIEtleSAoYSk9KDMpIGlzIG5vdCBwcmVzZW50IGluIHRhYmxlICJmcF9wa19kZWZlciIuCitD T01NSVQ7CitEUk9QIFRBQkxFIGZwX3BrX2RlZmVyLCBmcF9ma19kZWZlcjsKZGlmZiAtLWdpdCBh L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2ZvcmVpZ25fa2V5LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mv c3FsL2ZvcmVpZ25fa2V5LnNxbAppbmRleCBlOWVlMjkzMzFjYi4uMDc2MmNhYTM2ODIgMTAwNjQ0 Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2ZvcmVpZ25fa2V5LnNxbAorKysgYi9zcmMvdGVz dC9yZWdyZXNzL3NxbC9mb3JlaWduX2tleS5zcWwKQEAgLTI0OTgsMyArMjQ5OCw0NyBAQCBXSVRI IGN0ZSBBUyAoCiAKIERST1AgU0NIRU1BIGZrcGFydDEzIENBU0NBREU7CiBSRVNFVCBzZWFyY2hf cGF0aDsKKworLS0gVGVzdHMgZm9yZWlnbiBrZXkgY2hlY2sgZmFzdC1wYXRoIG5vLWNhY2hlIHBh dGguCitDUkVBVEUgVEFCTEUgZnBfcGtfYWx0ZXIgKGEgaW50IFBSSU1BUlkgS0VZKTsKK0lOU0VS VCBJTlRPIGZwX3BrX2FsdGVyIFNFTEVDVCBnZW5lcmF0ZV9zZXJpZXMoMSwgMTAwKTsKK0NSRUFU RSBUQUJMRSBmcF9ma19hbHRlciAoYSBpbnQpOworSU5TRVJUIElOVE8gZnBfZmtfYWx0ZXIgU0VM RUNUIGdlbmVyYXRlX3NlcmllcygxLCAxMDApOworLS0gVmFsaWRhdGlvbiBwYXRoOiBzaG91bGQg c3VjY2VlZAorQUxURVIgVEFCTEUgZnBfZmtfYWx0ZXIgQUREIEZPUkVJR04gS0VZIChhKSBSRUZF UkVOQ0VTIGZwX3BrX2FsdGVyOworSU5TRVJUIElOVE8gZnBfZmtfYWx0ZXIgVkFMVUVTICgxMDEp OyAgLS0gc2hvdWxkIGZhaWwgKGNvbnN0cmFpbnQgYWN0aXZlKQorRFJPUCBUQUJMRSBmcF9ma19h bHRlciwgZnBfcGtfYWx0ZXI7CisKKy0tIFNlcGFyYXRlIHRlc3Q6IHZhbGlkYXRpb24gY2F0Y2hl cyBleGlzdGluZyB2aW9sYXRpb24KK0NSRUFURSBUQUJMRSBmcF9wa19hbHRlcjIgKGEgaW50IFBS SU1BUlkgS0VZKTsKK0lOU0VSVCBJTlRPIGZwX3BrX2FsdGVyMiBWQUxVRVMgKDEpOworQ1JFQVRF IFRBQkxFIGZwX2ZrX2FsdGVyMiAoYSBpbnQpOworSU5TRVJUIElOVE8gZnBfZmtfYWx0ZXIyIFZB TFVFUyAoMSksICgyMDApOyAgLS0gMjAwIGhhcyBubyBQSyBtYXRjaAorQUxURVIgVEFCTEUgZnBf ZmtfYWx0ZXIyIEFERCBGT1JFSUdOIEtFWSAoYSkgUkVGRVJFTkNFUyBmcF9wa19hbHRlcjI7ICAt LSBzaG91bGQgZmFpbAorRFJPUCBUQUJMRSBmcF9ma19hbHRlcjIsIGZwX3BrX2FsdGVyMjsKKwor LS0gVGVzdHMgdGhhdCB0aGUgZmFzdC1wYXRoIGhhbmRsZXMgY2FjaGluZyBmb3IgbXVsdGlwbGUg Y29uc3RyYWludHMKK0NSRUFURSBUQUJMRSBmcF9wazEgKGEgaW50IFBSSU1BUlkgS0VZKTsKK0NS RUFURSBUQUJMRSBmcF9wazIgKGIgaW50IFBSSU1BUlkgS0VZKTsKK0lOU0VSVCBJTlRPIGZwX3Br MSBWQUxVRVMgKDEpOworSU5TRVJUIElOVE8gZnBfcGsyIFZBTFVFUyAoMSk7CitDUkVBVEUgVEFC TEUgZnBfbXVsdGlfZmsgKAorICAgIGEgaW50IFJFRkVSRU5DRVMgZnBfcGsxLAorICAgIGIgaW50 IFJFRkVSRU5DRVMgZnBfcGsyCispOworSU5TRVJUIElOVE8gZnBfbXVsdGlfZmsgVkFMVUVTICgx LCAxKTsgIC0tIHR3byBjb25zdHJhaW50cywgb25lIGJhdGNoCitJTlNFUlQgSU5UTyBmcF9tdWx0 aV9mayBWQUxVRVMgKDEsIDIpOyAgLS0gc2Vjb25kIGNvbnN0cmFpbnQgZmFpbHMKK0RST1AgVEFC TEUgZnBfbXVsdGlfZmssIGZwX3BrMSwgZnBfcGsyOworCistLSBUZXN0IHRoYXQgZmFzdC1wYXRo IGNhY2hlIGhhbmRsZXMgZGVmZXJyZWQgY29uc3RyYWludHMgYW5kIFNFVCBDT05TVFJBSU5UUyBJ TU1FRElBVEUKK0NSRUFURSBUQUJMRSBmcF9wa19kZWZlciAoYSBpbnQgUFJJTUFSWSBLRVkpOwor Q1JFQVRFIFRBQkxFIGZwX2ZrX2RlZmVyIChhIGludCBSRUZFUkVOQ0VTIGZwX3BrX2RlZmVyIERF RkVSUkFCTEUgSU5JVElBTExZIERFRkVSUkVEKTsKK0lOU0VSVCBJTlRPIGZwX3BrX2RlZmVyIFZB TFVFUyAoMSksICgyKTsKKworQkVHSU47CitJTlNFUlQgSU5UTyBmcF9ma19kZWZlciBWQUxVRVMg KDEpOworSU5TRVJUIElOVE8gZnBfZmtfZGVmZXIgVkFMVUVTICgyKTsKK1NFVCBDT05TVFJBSU5U UyBBTEwgSU1NRURJQVRFOyAgLS0gZmlyZXMgYmF0Y2ggY2FsbGJhY2sgaGVyZQorSU5TRVJUIElO VE8gZnBfZmtfZGVmZXIgVkFMVUVTICgzKTsgIC0tIHNob3VsZCBmYWlsLCBhbHNvIHRlc3RzIHRo YXQgY2FjaGUgd2FzIGNsZWFuZWQgdXAKK0NPTU1JVDsKK0RST1AgVEFCTEUgZnBfcGtfZGVmZXIs IGZwX2ZrX2RlZmVyOwpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxp c3QgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdAppbmRleCAyNDE5NDU3MzRlYy4u YzgzODhlYTMzZDMgMTAwNjQ0Ci0tLSBhL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0 CisrKyBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CkBAIC0zMCw2ICszMCw4IEBA IEFkZEZvcmVpZ25VcGRhdGVUYXJnZXRzX2Z1bmN0aW9uCiBBZGRySW5mbwogQWZmaXhOb2RlCiBB ZmZpeE5vZGVEYXRhCitBZnRlclRyaWdnZXJCYXRjaENhbGxiYWNrCitBZnRlclRyaWdnZXJDYWxs YmFja0l0ZW0KIEFmdGVyVHJpZ2dlckV2ZW50CiBBZnRlclRyaWdnZXJFdmVudENodW5rCiBBZnRl clRyaWdnZXJFdmVudERhdGEKQEAgLTI0NDYsNiArMjQ0OCw3IEBAIFJJWAogUklfQ29tcGFyZUhh c2hFbnRyeQogUklfQ29tcGFyZUtleQogUklfQ29uc3RyYWludEluZm8KK1JJX0Zhc3RQYXRoRW50 cnkKIFJJX1F1ZXJ5SGFzaEVudHJ5CiBSSV9RdWVyeUtleQogUlRFS2luZAotLSAKMi40Ny4zCgo= --000000000000473637064b29d5f5--