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 1rQweb-004OxA-JC for pgsql-hackers@arkaria.postgresql.org; Fri, 19 Jan 2024 21:43:58 +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 1rQwea-00BH5q-C1 for pgsql-hackers@arkaria.postgresql.org; Fri, 19 Jan 2024 21:43:56 +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.94.2) (envelope-from ) id 1rQweZ-00BH5h-Tm for pgsql-hackers@lists.postgresql.org; Fri, 19 Jan 2024 21:43:56 +0000 Received: from mail-pj1-x1035.google.com ([2607:f8b0:4864:20::1035]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rQweV-002hhH-Fg for pgsql-hackers@lists.postgresql.org; Fri, 19 Jan 2024 21:43:55 +0000 Received: by mail-pj1-x1035.google.com with SMTP id 98e67ed59e1d1-29051f5d5e8so686501a91.0 for ; Fri, 19 Jan 2024 13:43:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1705700629; x=1706305429; darn=lists.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=ZlkiYgPHn931KKmok/or8GZyNy8ZpKVswAtvzeAV5TE=; b=i91f2/WhHla3uAgVkNqUjG5IUZP0LQhhXhZvXDcA+AUqZzmNInUmdQwFr0iJy/dxRm QY5/4Wx1nGnO4cl5YqwSHgNggofPjYfNEKuDmOuuQJ22Sxoxwo0BG3O+hAtIpJ3FKkdG QUgb32Mmm4LGf2Uihhud8iMq976lvQWYl/brW8j1x0XmKFGaXmn6C6b40DqdRarfN6Mn j0nGqijEWwSjlUxM+gIXO+oz2Suag6vtywgYH6oyS4aadVSHPYPs+RgcSobrPZZES6QW S9AiD2jltIg5POu9VTVilsCfN1DdH9y2TsJXYftTSbmRfN/gwcI7PB12w3HaOXBXR1W9 SoYg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1705700629; x=1706305429; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=ZlkiYgPHn931KKmok/or8GZyNy8ZpKVswAtvzeAV5TE=; b=R20zYS0MOrPRkkeac0Xc6JiyXjdzaM5C/qj4bGvkMR+wUiUvR1ZKL+38YjKKChoFKs ASZOogFJd/lbkDbbOi8x6Z1UcKlsOH/4vs4UMMEK+w3UFUwRc8osNTIfWXeE2Eqt4GJX v9A2agtFeeUXTegxPgXJQAZkowMFwydNnX9RQWgxa/GzMOwdany220U5Ww8fn5X5MIss 25bPXtIxROcgNecYBoM5If916NW4Sw29Igv/rfW4XvFuA7TXW6kHRAa5xM4ReTg9XcsD nsW/z14U2VF2nYO9nSHI/kJxylba9jXKMV0lWcOkWJ/hoXEw3EWT7oftmj5oJnN0I6aN Pk4A== X-Gm-Message-State: AOJu0YwDdtnFVNOesE3kb/r4MbQ5CoTUK/1/3TiBXY9ecvOtbSHnjl0J LPpOdfMfR0aW512RVT4wcE5XGeLljEuKNXrG4wHiZEs7ZZ6nfnHq3lTicds0vrMpKtP32sf1BvZ uCEHG6+ixwNCCeX0uqgrwZv9WT4E= X-Google-Smtp-Source: AGHT+IFey9pfQV1JRQ3EcB0X83VwgLVqCtqI19NWN/m9yjuht1UL7n50XsYEEYqrFRT3B3ww4dWsH+DjNo1mJsfLLxw= X-Received: by 2002:a17:90b:2347:b0:28f:f229:b438 with SMTP id ms7-20020a17090b234700b0028ff229b438mr380130pjb.8.1705700629100; Fri, 19 Jan 2024 13:43:49 -0800 (PST) MIME-Version: 1.0 References: <8ec36f51-b863-60e3-20e2-b9c981c5ce5e@enterprisedb.com> <06bb7d02-2c44-3062-731e-a735ba13da7e@enterprisedb.com> <367160ea-b1ed-4481-e804-bca509128878@enterprisedb.com> <280dc83c-a16f-4424-1319-95e7e3f798bd@enterprisedb.com> <98ba4b25-fae8-c1f4-1597-8093375a1986@enterprisedb.com> <20231221134314.wf2rs62d37u62j7t@alap3.anarazel.de> <20231221154352.ijtg6wloa3nowivh@alap3.anarazel.de> <482ec3ff-52ad-415d-96fd-f3832a894023@enterprisedb.com> In-Reply-To: <482ec3ff-52ad-415d-96fd-f3832a894023@enterprisedb.com> From: Melanie Plageman Date: Fri, 19 Jan 2024 16:43:37 -0500 Message-ID: Subject: Re: index prefetching To: Tomas Vondra Cc: Robert Haas , Andres Freund , PostgreSQL Hackers , Georgios Content-Type: multipart/mixed; boundary="00000000000017546f060f53609e" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --00000000000017546f060f53609e Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Fri, Jan 12, 2024 at 11:42=E2=80=AFAM Tomas Vondra wrote: > > On 1/9/24 21:31, Robert Haas wrote: > > On Thu, Jan 4, 2024 at 9:55=E2=80=AFAM Tomas Vondra > > wrote: > >> Here's a somewhat reworked version of the patch. My initial goal was t= o > >> see if it could adopt the StreamingRead API proposed in [1], but that > >> turned out to be less straight-forward than I hoped, for two reasons: > > > > I guess we need Thomas or Andres or maybe Melanie to comment on this. > > > > Yeah. Or maybe Thomas if he has thoughts on how to combine this with the > streaming I/O stuff. I've been studying your patch with the intent of finding a way to change it and or the streaming read API to work together. I've attached a very rough sketch of how I think it could work. We fill a queue with blocks from TIDs that we fetched from the index. The queue is saved in a scan descriptor that is made available to the streaming read callback. Once the queue is full, we invoke the table AM specific index_fetch_tuple() function which calls pg_streaming_read_buffer_get_next(). When the streaming read API invokes the callback we registered, it simply dequeues a block number for prefetching. The only change to the streaming read API is that now, even if the callback returns InvalidBlockNumber, we may not be finished, so make it resumable. Structurally, this changes the timing of when the heap blocks are prefetched. Your code would get a tid from the index and then prefetch the heap block -- doing this until it filled a queue that had the actual tids saved in it. With my approach and the streaming read API, you fetch tids from the index until you've filled up a queue of block numbers. Then the streaming read API will prefetch those heap blocks. I didn't actually implement the block queue -- I just saved a single block number and pretended it was a block queue. I was imagining we replace this with something like your IndexPrefetch->blockItems -- which has light deduplication. We'd probably have to flesh it out more than that. There are also table AM layering violations in my sketch which would have to be worked out (not to mention some resource leakage I didn't bother investigating [which causes it to fail tests]). 0001 is all of Thomas' streaming read API code that isn't yet in master and 0002 is my rough sketch of index prefetching using the streaming read API There are also numerous optimizations that your index prefetching patch set does that would need to be added in some way. I haven't thought much about it yet. I wanted to see what you thought of this approach first. Basically, is it workable? - Melanie --00000000000017546f060f53609e Content-Type: text/plain; charset="US-ASCII"; name="0002-use-streaming-reads-in-index-scan.txt" Content-Disposition: attachment; filename="0002-use-streaming-reads-in-index-scan.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lrl5z5m41 RnJvbSAzMWEwYjgyOWIzYWNhMzE1NDJkYzMyMzZiNDA4ZjFlODYxMzNhZWE3IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNZWxhbmllIFBsYWdlbWFuIDxtZWxhbmllcGxhZ2VtYW5AZ21h aWwuY29tPgpEYXRlOiBGcmksIDE5IEphbiAyMDI0IDE2OjEwOjMwIC0wNTAwClN1YmplY3Q6IFtQ QVRDSCB2MSAyLzJdIHVzZSBzdHJlYW1pbmcgcmVhZHMgaW4gaW5kZXggc2NhbgoKLS0tCiBzcmMv YmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFuZGxlci5jIHwgMTQgKysrLQogc3JjL2JhY2tl bmQvYWNjZXNzL2luZGV4L2luZGV4YW0uYyAgICAgICB8ICAyICsKIHNyYy9iYWNrZW5kL2V4ZWN1 dG9yL25vZGVJbmRleHNjYW4uYyAgICAgfCA4MyArKysrKysrKysrKysrKysrKysrKy0tLS0KIHNy Yy9iYWNrZW5kL3N0b3JhZ2UvYWlvL3N0cmVhbWluZ19yZWFkLmMgfCAxMCArKy0KIHNyYy9pbmNs dWRlL2FjY2Vzcy9yZWxzY2FuLmggICAgICAgICAgICAgfCAgNiArKwogc3JjL2luY2x1ZGUvc3Rv cmFnZS9zdHJlYW1pbmdfcmVhZC5oICAgICB8ICAyICsKIDYgZmlsZXMgY2hhbmdlZCwgMTAxIGlu c2VydGlvbnMoKyksIDE2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2Fj Y2Vzcy9oZWFwL2hlYXBhbV9oYW5kbGVyLmMgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFw YW1faGFuZGxlci5jCmluZGV4IGQxNWEwMmIyYmU3Li4wZWY1ZjgyNDU0NiAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX2hhbmRsZXIuYworKysgYi9zcmMvYmFja2Vu ZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFuZGxlci5jCkBAIC0xMjcsOSArMTI3LDE3IEBAIGhlYXBh bV9pbmRleF9mZXRjaF90dXBsZShzdHJ1Y3QgSW5kZXhGZXRjaFRhYmxlRGF0YSAqc2NhbiwKIAkJ LyogU3dpdGNoIHRvIGNvcnJlY3QgYnVmZmVyIGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeSAq LwogCQlCdWZmZXIJCXByZXZfYnVmID0gaHNjYW4tPnhzX2NidWY7CiAKLQkJaHNjYW4tPnhzX2Ni dWYgPSBSZWxlYXNlQW5kUmVhZEJ1ZmZlcihoc2Nhbi0+eHNfY2J1ZiwKLQkJCQkJCQkJCQkJICBo c2Nhbi0+eHNfYmFzZS5yZWwsCi0JCQkJCQkJCQkJCSAgSXRlbVBvaW50ZXJHZXRCbG9ja051bWJl cih0aWQpKTsKKwkJaWYgKHNjYW4tPnBnc3IpCisJCXsKKwkJCWhzY2FuLT54c19jYnVmID0gcGdf c3RyZWFtaW5nX3JlYWRfYnVmZmVyX2dldF9uZXh0KHNjYW4tPnBnc3IsIE5VTEwpOworCQkJaWYg KCFCdWZmZXJJc1ZhbGlkKGhzY2FuLT54c19jYnVmKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0K KwkJZWxzZQorCQkJaHNjYW4tPnhzX2NidWYgPSBSZWxlYXNlQW5kUmVhZEJ1ZmZlcihoc2Nhbi0+ eHNfY2J1ZiwKKwkJCQkJCQkJCQkJCQloc2Nhbi0+eHNfYmFzZS5yZWwsCisJCQkJCQkJCQkJCQkJ SXRlbVBvaW50ZXJHZXRCbG9ja051bWJlcih0aWQpKTsKKwogCiAJCS8qCiAJCSAqIFBydW5lIHBh Z2UsIGJ1dCBvbmx5IGlmIHdlIHdlcmVuJ3QgYWxyZWFkeSBvbiB0aGlzIHBhZ2UKZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9pbmRleC9pbmRleGFtLmMgYi9zcmMvYmFja2VuZC9hY2Nl c3MvaW5kZXgvaW5kZXhhbS5jCmluZGV4IDYzZGZmMTAxZTI5Li5jMTE4Y2MzODYxZiAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0uYworKysgYi9zcmMvYmFja2Vu ZC9hY2Nlc3MvaW5kZXgvaW5kZXhhbS5jCkBAIC0yMzcsNiArMjM3LDggQEAgaW5kZXhfYmVnaW5z Y2FuKFJlbGF0aW9uIGhlYXBSZWxhdGlvbiwKIAogCS8qIHByZXBhcmUgdG8gZmV0Y2ggaW5kZXgg bWF0Y2hlcyBmcm9tIHRhYmxlICovCiAJc2Nhbi0+eHNfaGVhcGZldGNoID0gdGFibGVfaW5kZXhf ZmV0Y2hfYmVnaW4oaGVhcFJlbGF0aW9uKTsKKwlzY2FuLT5pbmRleF9kb25lID0gZmFsc2U7CisJ c2Nhbi0+eHNfaGVhcGZldGNoLT5ibGtfcXVldWUgPSBJbnZhbGlkQmxvY2tOdW1iZXI7CiAKIAly ZXR1cm4gc2NhbjsKIH0KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVJbmRl eHNjYW4uYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVJbmRleHNjYW4uYwppbmRleCAwMzE0 MmI0YTk0Ni4uNDE0MzdmYWZmMDYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25v ZGVJbmRleHNjYW4uYworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlSW5kZXhzY2FuLmMK QEAgLTc3LDYgKzc3LDMzIEBAIHN0YXRpYyBIZWFwVHVwbGUgcmVvcmRlcnF1ZXVlX3BvcChJbmRl eFNjYW5TdGF0ZSAqbm9kZSk7CiAgKgkJdXNpbmcgdGhlIGluZGV4IHNwZWNpZmllZCBpbiB0aGUg SW5kZXhTY2FuU3RhdGUgaW5mb3JtYXRpb24uCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKi8KKworI2RlZmluZSBR VUVVRV9GVUxMKHEpICgocSkgIT0gSW52YWxpZEJsb2NrTnVtYmVyKQorCitzdGF0aWMgdm9pZAor YmxrX2VucXVldWUoQmxvY2tOdW1iZXIgYmxrbm8sIEJsb2NrTnVtYmVyICpibGtfcXVldWUpCit7 CisJQXNzZXJ0KCpibGtfcXVldWUgPT0gSW52YWxpZEJsb2NrTnVtYmVyKTsKKwkqYmxrX3F1ZXVl ID0gYmxrbm87Cit9CisKK3N0YXRpYyBCbG9ja051bWJlcgorYmxrX2RlcXVldWUoQmxvY2tOdW1i ZXIgKmJsa19xdWV1ZSkKK3sKKwlCbG9ja051bWJlciByZXN1bHQgPSAqYmxrX3F1ZXVlOworCSpi bGtfcXVldWUgPSBJbnZhbGlkQmxvY2tOdW1iZXI7CisJcmV0dXJuIHJlc3VsdDsKK30KKworCitz dGF0aWMgQmxvY2tOdW1iZXIKK2luZGV4X3Bnc3JfbmV4dF9zaW5nbGUoUGdTdHJlYW1pbmdSZWFk ICpwZ3NyLCB2b2lkICpwZ3NyX3ByaXZhdGUsIHZvaWQgKnBlcl9idWZmZXJfZGF0YSkKK3sKKwlJ bmRleEZldGNoVGFibGVEYXRhICpzY2FuID0gKEluZGV4RmV0Y2hUYWJsZURhdGEgKikgcGdzcl9w cml2YXRlOworCXJldHVybiBibGtfZGVxdWV1ZSgmc2Nhbi0+YmxrX3F1ZXVlKTsKK30KKworCiBz dGF0aWMgVHVwbGVUYWJsZVNsb3QgKgogSW5kZXhOZXh0KEluZGV4U2NhblN0YXRlICpub2RlKQog ewpAQCAtMTIzLDMxICsxNTAsNjMgQEAgSW5kZXhOZXh0KEluZGV4U2NhblN0YXRlICpub2RlKQog CQkJaW5kZXhfcmVzY2FuKHNjYW5kZXNjLAogCQkJCQkJIG5vZGUtPmlzc19TY2FuS2V5cywgbm9k ZS0+aXNzX051bVNjYW5LZXlzLAogCQkJCQkJIG5vZGUtPmlzc19PcmRlckJ5S2V5cywgbm9kZS0+ aXNzX051bU9yZGVyQnlLZXlzKTsKKworCQkvLyBUT0RPOiBjYW4ndCBwdXQgdGhpcyBoZXJlIGJj IG5vdCBBTSBhZ25vc3RpYworCQlzY2FuZGVzYy0+eHNfaGVhcGZldGNoLT5wZ3NyID0gcGdfc3Ry ZWFtaW5nX3JlYWRfYnVmZmVyX2FsbG9jKFBHU1JfRkxBR19ERUZBVUxULAorCQkJCQkJCQkJCQkJ CXNjYW5kZXNjLT54c19oZWFwZmV0Y2gsCisJCQkJCQkJCQkJCQkJMCwKKwkJCQkJCQkJCQkJCQlO VUxMLAorCQkJCQkJCQkJCQkJCUJNUl9SRUwoc2NhbmRlc2MtPmhlYXBSZWxhdGlvbiksCisJCQkJ CQkJCQkJCQkJTUFJTl9GT1JLTlVNLAorCQkJCQkJCQkJCQkJCWluZGV4X3Bnc3JfbmV4dF9zaW5n bGUpOworCisJCXBnX3N0cmVhbWluZ19yZWFkX3NldF9yZXN1bWFibGUoc2NhbmRlc2MtPnhzX2hl YXBmZXRjaC0+cGdzcik7CiAJfQogCiAJLyoKIAkgKiBvaywgbm93IHRoYXQgd2UgaGF2ZSB3aGF0 IHdlIG5lZWQsIGZldGNoIHRoZSBuZXh0IHR1cGxlLgogCSAqLwotCXdoaWxlIChpbmRleF9nZXRu ZXh0X3Nsb3Qoc2NhbmRlc2MsIGRpcmVjdGlvbiwgc2xvdCkpCisKKwl3aGlsZSAodHJ1ZSkKIAl7 CiAJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CiAKLQkJLyoKLQkJICogSWYgdGhlIGluZGV4IHdh cyBsb3NzeSwgd2UgaGF2ZSB0byByZWNoZWNrIHRoZSBpbmRleCBxdWFscyB1c2luZwotCQkgKiB0 aGUgZmV0Y2hlZCB0dXBsZS4KLQkJICovCi0JCWlmIChzY2FuZGVzYy0+eHNfcmVjaGVjaykKKwkJ aWYgKGluZGV4X2ZldGNoX2hlYXAoc2NhbmRlc2MsIHNsb3QpKQogCQl7Ci0JCQllY29udGV4dC0+ ZWN4dF9zY2FudHVwbGUgPSBzbG90OwotCQkJaWYgKCFFeGVjUXVhbEFuZFJlc2V0KG5vZGUtPmlu ZGV4cXVhbG9yaWcsIGVjb250ZXh0KSkKKwkJCS8qCisJCQkqIElmIHRoZSBpbmRleCB3YXMgbG9z c3ksIHdlIGhhdmUgdG8gcmVjaGVjayB0aGUgaW5kZXggcXVhbHMgdXNpbmcKKwkJCSogdGhlIGZl dGNoZWQgdHVwbGUuCisJCQkqLworCQkJaWYgKHNjYW5kZXNjLT54c19yZWNoZWNrKQogCQkJewot CQkJCS8qIEZhaWxzIHJlY2hlY2ssIHNvIGRyb3AgaXQgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhl ciAqLwotCQkJCUluc3RyQ291bnRGaWx0ZXJlZDIobm9kZSwgMSk7Ci0JCQkJY29udGludWU7CisJ CQkJZWNvbnRleHQtPmVjeHRfc2NhbnR1cGxlID0gc2xvdDsKKwkJCQlpZiAoIUV4ZWNRdWFsQW5k UmVzZXQobm9kZS0+aW5kZXhxdWFsb3JpZywgZWNvbnRleHQpKQorCQkJCXsKKwkJCQkJLyogRmFp bHMgcmVjaGVjaywgc28gZHJvcCBpdCBhbmQgbG9vcCBiYWNrIGZvciBhbm90aGVyICovCisJCQkJ CUluc3RyQ291bnRGaWx0ZXJlZDIobm9kZSwgMSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KIAkJ CX0KKworCQkJcmV0dXJuIHNsb3Q7CiAJCX0KIAotCQlyZXR1cm4gc2xvdDsKKwkJaWYgKHNjYW5k ZXNjLT5pbmRleF9kb25lKQorCQkJYnJlYWs7CisKKwkJQXNzZXJ0KCFRVUVVRV9GVUxMKHNjYW5k ZXNjLT54c19oZWFwZmV0Y2gtPmJsa19xdWV1ZSkpOworCQlkbworCQl7CisJCQlJdGVtUG9pbnRl ciB0aWQgPSBpbmRleF9nZXRuZXh0X3RpZChzY2FuZGVzYywgZGlyZWN0aW9uKTsKKworCQkJaWYg KCF0aWQpCisJCQl7CisJCQkJc2NhbmRlc2MtPmluZGV4X2RvbmUgPSB0cnVlOworCQkJCWJyZWFr OworCQkJfQorCisJCQlibGtfZW5xdWV1ZShJdGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKHRpZCks ICZzY2FuZGVzYy0+eHNfaGVhcGZldGNoLT5ibGtfcXVldWUpOworCQl9IHdoaWxlICghUVVFVUVf RlVMTChzY2FuZGVzYy0+eHNfaGVhcGZldGNoLT5ibGtfcXVldWUpKTsKIAl9CiAKIAkvKgpkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9haW8vc3RyZWFtaW5nX3JlYWQuYyBiL3NyYy9i YWNrZW5kL3N0b3JhZ2UvYWlvL3N0cmVhbWluZ19yZWFkLmMKaW5kZXggMTk2MDUwOTBmZWEuLjY0 NjU5NjNmODM3IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9zdHJlYW1pbmdf cmVhZC5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL3N0cmVhbWluZ19yZWFkLmMKQEAg LTM0LDYgKzM0LDcgQEAgc3RydWN0IFBnU3RyZWFtaW5nUmVhZAogCWludAkJCXBpbm5lZF9idWZm ZXJzX3RyaWdnZXI7CiAJaW50CQkJbmV4dF90YWlsX2J1ZmZlcjsKIAlib29sCQlmaW5pc2hlZDsK Kwlib29sCQlyZXN1bWFibGU7CiAJdm9pZAkgICAqcGdzcl9wcml2YXRlOwogCVBnU3RyZWFtaW5n UmVhZEJ1ZmZlckNCIGNhbGxiYWNrOwogCUJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5OwpA QCAtMjkyLDcgKzI5Myw4IEBAIHBnX3N0cmVhbWluZ19yZWFkX2xvb2tfYWhlYWQoUGdTdHJlYW1p bmdSZWFkICpwZ3NyKQogCQlibG9ja251bSA9IHBnc3ItPmNhbGxiYWNrKHBnc3IsIHBnc3ItPnBn c3JfcHJpdmF0ZSwgcGVyX2J1ZmZlcl9kYXRhKTsKIAkJaWYgKGJsb2NrbnVtID09IEludmFsaWRC bG9ja051bWJlcikKIAkJewotCQkJcGdzci0+ZmluaXNoZWQgPSB0cnVlOworCQkJaWYgKCFwZ3Ny LT5yZXN1bWFibGUpCisJCQkJcGdzci0+ZmluaXNoZWQgPSB0cnVlOwogCQkJYnJlYWs7CiAJCX0K IAkJYm1yID0gcGdzci0+Ym1yOwpAQCAtNDMzLDMgKzQzNSw5IEBAIHBnX3N0cmVhbWluZ19yZWFk X2ZyZWUoUGdTdHJlYW1pbmdSZWFkICpwZ3NyKQogCQlwZnJlZShwZ3NyLT5wZXJfYnVmZmVyX2Rh dGEpOwogCXBmcmVlKHBnc3IpOwogfQorCit2b2lkCitwZ19zdHJlYW1pbmdfcmVhZF9zZXRfcmVz dW1hYmxlKFBnU3RyZWFtaW5nUmVhZCAqcGdzcikKK3sKKwlwZ3NyLT5yZXN1bWFibGUgPSB0cnVl OworfQpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL3JlbHNjYW4uaCBiL3NyYy9pbmNs dWRlL2FjY2Vzcy9yZWxzY2FuLmgKaW5kZXggNTIxMDQzMzA0YWIuLmQ0NzZjYjIwNmQ1IDEwMDY0 NAotLS0gYS9zcmMvaW5jbHVkZS9hY2Nlc3MvcmVsc2Nhbi5oCisrKyBiL3NyYy9pbmNsdWRlL2Fj Y2Vzcy9yZWxzY2FuLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlICJhY2Nlc3MvaXR1cC5o IgogI2luY2x1ZGUgInBvcnQvYXRvbWljcy5oIgogI2luY2x1ZGUgInN0b3JhZ2UvYnVmLmgiCisj aW5jbHVkZSAic3RvcmFnZS9zdHJlYW1pbmdfcmVhZC5oIgogI2luY2x1ZGUgInN0b3JhZ2Uvc3Bp bi5oIgogI2luY2x1ZGUgInV0aWxzL3JlbGNhY2hlLmgiCiAKQEAgLTEwNCw2ICsxMDUsOCBAQCB0 eXBlZGVmIHN0cnVjdCBQYXJhbGxlbEJsb2NrVGFibGVTY2FuV29ya2VyRGF0YSAqUGFyYWxsZWxC bG9ja1RhYmxlU2NhbldvcmtlcjsKIHR5cGVkZWYgc3RydWN0IEluZGV4RmV0Y2hUYWJsZURhdGEK IHsKIAlSZWxhdGlvbglyZWw7CisJUGdTdHJlYW1pbmdSZWFkICpwZ3NyOworCUJsb2NrTnVtYmVy IGJsa19xdWV1ZTsKIH0gSW5kZXhGZXRjaFRhYmxlRGF0YTsKIAogLyoKQEAgLTE2Miw2ICsxNjUs OSBAQCB0eXBlZGVmIHN0cnVjdCBJbmRleFNjYW5EZXNjRGF0YQogCWJvb2wJICAgKnhzX29yZGVy YnludWxsczsKIAlib29sCQl4c19yZWNoZWNrb3JkZXJieTsKIAorCWJvb2wJaW5kZXhfZG9uZTsK KworCiAJLyogcGFyYWxsZWwgaW5kZXggc2NhbiBpbmZvcm1hdGlvbiwgaW4gc2hhcmVkIG1lbW9y eSAqLwogCXN0cnVjdCBQYXJhbGxlbEluZGV4U2NhbkRlc2NEYXRhICpwYXJhbGxlbF9zY2FuOwog fQkJCUluZGV4U2NhbkRlc2NEYXRhOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9z dHJlYW1pbmdfcmVhZC5oIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9zdHJlYW1pbmdfcmVhZC5oCmlu ZGV4IDQwYzM0MDhjNTQxLi4yMjg4YjdiNWViMCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3Rv cmFnZS9zdHJlYW1pbmdfcmVhZC5oCisrKyBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc3RyZWFtaW5n X3JlYWQuaApAQCAtNDIsNCArNDIsNiBAQCBleHRlcm4gdm9pZCBwZ19zdHJlYW1pbmdfcmVhZF9w cmVmZXRjaChQZ1N0cmVhbWluZ1JlYWQgKnBnc3IpOwogZXh0ZXJuIEJ1ZmZlciBwZ19zdHJlYW1p bmdfcmVhZF9idWZmZXJfZ2V0X25leHQoUGdTdHJlYW1pbmdSZWFkICpwZ3NyLCB2b2lkICoqcGVy X2J1ZmZlcl9wcml2YXRlKTsKIGV4dGVybiB2b2lkIHBnX3N0cmVhbWluZ19yZWFkX2ZyZWUoUGdT dHJlYW1pbmdSZWFkICpwZ3NyKTsKIAorZXh0ZXJuIHZvaWQgcGdfc3RyZWFtaW5nX3JlYWRfc2V0 X3Jlc3VtYWJsZShQZ1N0cmVhbWluZ1JlYWQgKnBnc3IpOworCiAjZW5kaWYKLS0gCjIuMzcuMgoK --00000000000017546f060f53609e Content-Type: text/plain; charset="US-ASCII"; name="0001-Streaming-Read-API.txt" Content-Disposition: attachment; filename="0001-Streaming-Read-API.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lrl5z5lw0 RnJvbSBmNmNiNTkxYmE1MjAzNTFhYjdmMGU3Y2JmOWQ2ZGYzZGFjZGE2YjQ0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBUaG9tYXMgTXVucm8gPHRob21hcy5tdW5yb0BnbWFpbC5jb20+ CkRhdGU6IFNhdCwgMjIgSnVsIDIwMjMgMTc6MzE6NTQgKzEyMDAKU3ViamVjdDogW1BBVENIIHYx IDEvMl0gU3RyZWFtaW5nIFJlYWQgQVBJCgotLS0KIGNvbnRyaWIvcGdfcHJld2FybS9wZ19wcmV3 YXJtLmMgICAgICAgICAgfCAgNDAgKy0KIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2d1 dGlscy5jICAgfCAgIDIgKy0KIHNyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvYmd3cml0ZXIuYyAgICAg ICAgfCAgIDggKy0KIHNyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvY2hlY2twb2ludGVyLmMgICAgfCAg MTUgKy0KIHNyYy9iYWNrZW5kL3N0b3JhZ2UvTWFrZWZpbGUgICAgICAgICAgICAgfCAgIDIgKy0K IHNyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL01ha2VmaWxlICAgICAgICAgfCAgMTQgKwogc3JjL2Jh Y2tlbmQvc3RvcmFnZS9haW8vbWVzb24uYnVpbGQgICAgICB8ICAgNSArCiBzcmMvYmFja2VuZC9z dG9yYWdlL2Fpby9zdHJlYW1pbmdfcmVhZC5jIHwgNDM1ICsrKysrKysrKysrKysrKysrKwogc3Jj L2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmbWdyLmMgICAgICB8IDU2MCArKysrKysrKysrKysr KystLS0tLS0tLQogc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvbG9jYWxidWYuYyAgICB8ICAx NCArLQogc3JjL2JhY2tlbmQvc3RvcmFnZS9tZXNvbi5idWlsZCAgICAgICAgICB8ICAgMSArCiBz cmMvYmFja2VuZC9zdG9yYWdlL3NtZ3Ivc21nci5jICAgICAgICAgIHwgIDQ5ICstCiBzcmMvaW5j bHVkZS9zdG9yYWdlL2J1Zm1nci5oICAgICAgICAgICAgIHwgIDIyICsKIHNyYy9pbmNsdWRlL3N0 b3JhZ2Uvc21nci5oICAgICAgICAgICAgICAgfCAgIDQgKy0KIHNyYy9pbmNsdWRlL3N0b3JhZ2Uv c3RyZWFtaW5nX3JlYWQuaCAgICAgfCAgNDUgKysKIHNyYy9pbmNsdWRlL3V0aWxzL3JlbC5oICAg ICAgICAgICAgICAgICAgfCAgIDYgLQogc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3Qg ICAgICAgICB8ICAgMiArCiAxNyBmaWxlcyBjaGFuZ2VkLCA5ODYgaW5zZXJ0aW9ucygrKSwgMjM4 IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9iYWNrZW5kL3N0b3JhZ2UvYWlv L01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2JhY2tlbmQvc3RvcmFnZS9haW8vbWVz b24uYnVpbGQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9zdHJl YW1pbmdfcmVhZC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2luY2x1ZGUvc3RvcmFnZS9zdHJl YW1pbmdfcmVhZC5oCgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wZ19wcmV3YXJtL3BnX3ByZXdhcm0u YyBiL2NvbnRyaWIvcGdfcHJld2FybS9wZ19wcmV3YXJtLmMKaW5kZXggODU0MWU0ZDZlNDYuLjk2 MTdiZjEzMGJkIDEwMDY0NAotLS0gYS9jb250cmliL3BnX3ByZXdhcm0vcGdfcHJld2FybS5jCisr KyBiL2NvbnRyaWIvcGdfcHJld2FybS9wZ19wcmV3YXJtLmMKQEAgLTIwLDYgKzIwLDcgQEAKICNp bmNsdWRlICJtaXNjYWRtaW4uaCIKICNpbmNsdWRlICJzdG9yYWdlL2J1Zm1nci5oIgogI2luY2x1 ZGUgInN0b3JhZ2Uvc21nci5oIgorI2luY2x1ZGUgInN0b3JhZ2Uvc3RyZWFtaW5nX3JlYWQuaCIK ICNpbmNsdWRlICJ1dGlscy9hY2wuaCIKICNpbmNsdWRlICJ1dGlscy9idWlsdGlucy5oIgogI2lu Y2x1ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgpAQCAtMzgsNiArMzksMjUgQEAgdHlwZWRlZiBlbnVt CiAKIHN0YXRpYyBQR0lPQWxpZ25lZEJsb2NrIGJsb2NrYnVmZmVyOwogCitzdHJ1Y3QgcGdfcHJl d2FybV9zdHJlYW1pbmdfcmVhZF9wcml2YXRlCit7CisJQmxvY2tOdW1iZXIgYmxvY2tudW07CisJ aW50NjQJCWxhc3RfYmxvY2s7Cit9OworCitzdGF0aWMgQmxvY2tOdW1iZXIKK3BnX3ByZXdhcm1f c3RyZWFtaW5nX3JlYWRfbmV4dChQZ1N0cmVhbWluZ1JlYWQgKnBnc3IsCisJCQkJCQkJICAgdm9p ZCAqcGdzcl9wcml2YXRlLAorCQkJCQkJCSAgIHZvaWQgKnBlcl9idWZmZXJfZGF0YSkKK3sKKwlz dHJ1Y3QgcGdfcHJld2FybV9zdHJlYW1pbmdfcmVhZF9wcml2YXRlICpwID0gcGdzcl9wcml2YXRl OworCisJaWYgKHAtPmJsb2NrbnVtIDw9IHAtPmxhc3RfYmxvY2spCisJCXJldHVybiBwLT5ibG9j a251bSsrOworCisJcmV0dXJuIEludmFsaWRCbG9ja051bWJlcjsKK30KKwogLyoKICAqIHBnX3By ZXdhcm0ocmVnY2xhc3MsIG1vZGUgdGV4dCwgZm9yayB0ZXh0LAogICoJCQkgIGZpcnN0X2Jsb2Nr IGludDgsIGxhc3RfYmxvY2sgaW50OCkKQEAgLTE4MywxOCArMjAzLDM2IEBAIHBnX3ByZXdhcm0o UEdfRlVOQ1RJT05fQVJHUykKIAl9CiAJZWxzZSBpZiAocHR5cGUgPT0gUFJFV0FSTV9CVUZGRVIp CiAJeworCQlzdHJ1Y3QgcGdfcHJld2FybV9zdHJlYW1pbmdfcmVhZF9wcml2YXRlIHA7CisJCVBn U3RyZWFtaW5nUmVhZCAqcGdzcjsKKwogCQkvKgogCQkgKiBJbiBidWZmZXIgbW9kZSwgd2UgYWN0 dWFsbHkgcHVsbCB0aGUgZGF0YSBpbnRvIHNoYXJlZF9idWZmZXJzLgogCQkgKi8KKworCQkvKiBT ZXQgdXAgdGhlIHByaXZhdGUgc3RhdGUgZm9yIG91ciBzdHJlYW1pbmcgYnVmZmVyIHJlYWQgY2Fs bGJhY2suICovCisJCXAuYmxvY2tudW0gPSBmaXJzdF9ibG9jazsKKwkJcC5sYXN0X2Jsb2NrID0g bGFzdF9ibG9jazsKKworCQlwZ3NyID0gcGdfc3RyZWFtaW5nX3JlYWRfYnVmZmVyX2FsbG9jKFBH U1JfRkxBR19ERUZBVUxULAorCQkJCQkJCQkJCQkgICZwLAorCQkJCQkJCQkJCQkgIDAsCisJCQkJ CQkJCQkJCSAgTlVMTCwKKwkJCQkJCQkJCQkJICBCTVJfUkVMKHJlbCksCisJCQkJCQkJCQkJCSAg Zm9ya051bWJlciwKKwkJCQkJCQkJCQkJICBwZ19wcmV3YXJtX3N0cmVhbWluZ19yZWFkX25leHQp OworCiAJCWZvciAoYmxvY2sgPSBmaXJzdF9ibG9jazsgYmxvY2sgPD0gbGFzdF9ibG9jazsgKyti bG9jaykKIAkJewogCQkJQnVmZmVyCQlidWY7CiAKIAkJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7 Ci0JCQlidWYgPSBSZWFkQnVmZmVyRXh0ZW5kZWQocmVsLCBmb3JrTnVtYmVyLCBibG9jaywgUkJN X05PUk1BTCwgTlVMTCk7CisJCQlidWYgPSBwZ19zdHJlYW1pbmdfcmVhZF9idWZmZXJfZ2V0X25l eHQocGdzciwgTlVMTCk7CiAJCQlSZWxlYXNlQnVmZmVyKGJ1Zik7CiAJCQkrK2Jsb2Nrc19kb25l OwogCQl9CisJCUFzc2VydChwZ19zdHJlYW1pbmdfcmVhZF9idWZmZXJfZ2V0X25leHQocGdzciwg TlVMTCkgPT0gSW52YWxpZEJ1ZmZlcik7CisJCXBnX3N0cmVhbWluZ19yZWFkX2ZyZWUocGdzcik7 CiAJfQogCiAJLyogQ2xvc2UgcmVsYXRpb24sIHJlbGVhc2UgbG9jay4gKi8KZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2d1dGlscy5jIGIvc3JjL2JhY2tlbmQvYWNj ZXNzL3RyYW5zYW0veGxvZ3V0aWxzLmMKaW5kZXggYWE4NjY3YWJkMTAuLjg3NzViNTc4OWJlIDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ndXRpbHMuYworKysgYi9z cmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ndXRpbHMuYwpAQCAtNjU3LDcgKzY1Nyw3IEBA IFhMb2dEcm9wRGF0YWJhc2UoT2lkIGRiaWQpCiAJICogVGhpcyBpcyB1bm5lY2Vzc2FyaWx5IGhl YXZ5LWhhbmRlZCwgYXMgaXQgd2lsbCBjbG9zZSBTTWdyUmVsYXRpb24KIAkgKiBvYmplY3RzIGZv ciBvdGhlciBkYXRhYmFzZXMgYXMgd2VsbC4gRFJPUCBEQVRBQkFTRSBvY2N1cnMgc2VsZG9tIGVu b3VnaAogCSAqIHRoYXQgaXQncyBub3Qgd29ydGggaW50cm9kdWNpbmcgYSB2YXJpYW50IG9mIHNt Z3JjbG9zZSBmb3IganVzdCB0aGlzCi0JICogcHVycG9zZS4gWFhYOiBPciBzaG91bGQgd2UgcmF0 aGVyIGxlYXZlIHRoZSBzbWdyIGVudHJpZXMgZGFuZ2xpbmc/CisJICogcHVycG9zZS4KIAkgKi8K IAlzbWdyY2xvc2VhbGwoKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9i Z3dyaXRlci5jIGIvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9iZ3dyaXRlci5jCmluZGV4IGQ3ZDZj YzBjZDdiLi4xM2U1Mzc2NjE5ZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9i Z3dyaXRlci5jCisrKyBiL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvYmd3cml0ZXIuYwpAQCAtMjQ2 LDEwICsyNDYsMTIgQEAgQmFja2dyb3VuZFdyaXRlck1haW4odm9pZCkKIAkJaWYgKEZpcnN0Q2Fs bFNpbmNlTGFzdENoZWNrcG9pbnQoKSkKIAkJewogCQkJLyoKLQkJCSAqIEFmdGVyIGFueSBjaGVj a3BvaW50LCBjbG9zZSBhbGwgc21nciBmaWxlcy4gIFRoaXMgaXMgc28gd2UKLQkJCSAqIHdvbid0 IGhhbmcgb250byBzbWdyIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBmaWxlcyBpbmRlZmluaXRlbHku CisJCQkgKiBBZnRlciBhbnkgY2hlY2twb2ludCwgZnJlZSBhbGwgc21nciBvYmplY3RzLiAgT3Ro ZXJ3aXNlIHdlCisJCQkgKiB3b3VsZCBuZXZlciBkbyBzbyBmb3IgZHJvcHBlZCByZWxhdGlvbnMs IGFzIHRoZSBiZ3dyaXRlciBkb2VzCisJCQkgKiBub3QgcHJvY2VzcyBzaGFyZWQgaW52YWxpZGF0 aW9uIG1lc3NhZ2VzIG9yIGNhbGwKKwkJCSAqIEF0RU9YYWN0X1NNZ3IoKS4KIAkJCSAqLwotCQkJ c21ncmNsb3NlYWxsKCk7CisJCQlzbWdyZGVzdHJveWFsbCgpOwogCQl9CiAKIAkJLyoKZGlmZiAt LWdpdCBhL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvY2hlY2twb2ludGVyLmMgYi9zcmMvYmFja2Vu ZC9wb3N0bWFzdGVyL2NoZWNrcG9pbnRlci5jCmluZGV4IDVlOTQ5ZmM4ODViLi41ZDg0M2I2MTQy NiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9jaGVja3BvaW50ZXIuYworKysg Yi9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL2NoZWNrcG9pbnRlci5jCkBAIC00NjksMTAgKzQ2OSwx MiBAQCBDaGVja3BvaW50ZXJNYWluKHZvaWQpCiAJCQkJY2twdF9wZXJmb3JtZWQgPSBDcmVhdGVS ZXN0YXJ0UG9pbnQoZmxhZ3MpOwogCiAJCQkvKgotCQkJICogQWZ0ZXIgYW55IGNoZWNrcG9pbnQs IGNsb3NlIGFsbCBzbWdyIGZpbGVzLiAgVGhpcyBpcyBzbyB3ZQotCQkJICogd29uJ3QgaGFuZyBv bnRvIHNtZ3IgcmVmZXJlbmNlcyB0byBkZWxldGVkIGZpbGVzIGluZGVmaW5pdGVseS4KKwkJCSAq IEFmdGVyIGFueSBjaGVja3BvaW50LCBmcmVlIGFsbCBzbWdyIG9iamVjdHMuICBPdGhlcndpc2Ug d2UKKwkJCSAqIHdvdWxkIG5ldmVyIGRvIHNvIGZvciBkcm9wcGVkIHJlbGF0aW9ucywgYXMgdGhl IGNoZWNrcG9pbnRlcgorCQkJICogZG9lcyBub3QgcHJvY2VzcyBzaGFyZWQgaW52YWxpZGF0aW9u IG1lc3NhZ2VzIG9yIGNhbGwKKwkJCSAqIEF0RU9YYWN0X1NNZ3IoKS4KIAkJCSAqLwotCQkJc21n cmNsb3NlYWxsKCk7CisJCQlzbWdyZGVzdHJveWFsbCgpOwogCiAJCQkvKgogCQkJICogSW5kaWNh dGUgY2hlY2twb2ludCBjb21wbGV0aW9uIHRvIGFueSB3YWl0aW5nIGJhY2tlbmRzLgpAQCAtOTU4 LDExICs5NjAsOCBAQCBSZXF1ZXN0Q2hlY2twb2ludChpbnQgZmxhZ3MpCiAJCSAqLwogCQlDcmVh dGVDaGVja1BvaW50KGZsYWdzIHwgQ0hFQ0tQT0lOVF9JTU1FRElBVEUpOwogCi0JCS8qCi0JCSAq IEFmdGVyIGFueSBjaGVja3BvaW50LCBjbG9zZSBhbGwgc21nciBmaWxlcy4gIFRoaXMgaXMgc28g d2Ugd29uJ3QKLQkJICogaGFuZyBvbnRvIHNtZ3IgcmVmZXJlbmNlcyB0byBkZWxldGVkIGZpbGVz IGluZGVmaW5pdGVseS4KLQkJICovCi0JCXNtZ3JjbG9zZWFsbCgpOworCQkvKiBGcmVlIGFsbCBz bWdyIG9iamVjdHMsIGFzIENoZWNrcG9pbnRlck1haW4oKSBub3JtYWxseSB3b3VsZC4gKi8KKwkJ c21ncmRlc3Ryb3lhbGwoKTsKIAogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tl bmQvc3RvcmFnZS9NYWtlZmlsZSBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvTWFrZWZpbGUKaW5kZXgg ODM3NmNkZmNhMjAuLmVlYzAzZjZmMmI0IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdl L01ha2VmaWxlCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvTWFrZWZpbGUKQEAgLTgsNiArOCw2 IEBAIHN1YmRpciA9IHNyYy9iYWNrZW5kL3N0b3JhZ2UKIHRvcF9idWlsZGRpciA9IC4uLy4uLy4u CiBpbmNsdWRlICQodG9wX2J1aWxkZGlyKS9zcmMvTWFrZWZpbGUuZ2xvYmFsCiAKLVNVQkRJUlMg ICAgID0gYnVmZmVyIGZpbGUgZnJlZXNwYWNlIGlwYyBsYXJnZV9vYmplY3QgbG1nciBwYWdlIHNt Z3Igc3luYworU1VCRElSUyAgICAgPSBhaW8gYnVmZmVyIGZpbGUgZnJlZXNwYWNlIGlwYyBsYXJn ZV9vYmplY3QgbG1nciBwYWdlIHNtZ3Igc3luYwogCiBpbmNsdWRlICQodG9wX3NyY2Rpcikvc3Jj L2JhY2tlbmQvY29tbW9uLm1rCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9N YWtlZmlsZSBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi5iY2FiNDRjODAyZgotLS0gL2Rldi9udWxsCisrKyBi L3NyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMg TWFrZWZpbGUgZm9yIHN0b3JhZ2UvYWlvCisjCisjIHNyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL01h a2VmaWxlCisjCisKK3N1YmRpciA9IHNyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvCit0b3BfYnVpbGRk aXIgPSAuLi8uLi8uLi8uLgoraW5jbHVkZSAkKHRvcF9idWlsZGRpcikvc3JjL01ha2VmaWxlLmds b2JhbAorCitPQkpTID0gXAorCXN0cmVhbWluZ19yZWFkLm8KKworaW5jbHVkZSAkKHRvcF9zcmNk aXIpL3NyYy9iYWNrZW5kL2NvbW1vbi5tawpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFn ZS9haW8vbWVzb24uYnVpbGQgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9tZXNvbi5idWlsZApu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uMzlhZWYyYTg0YTIKLS0tIC9k ZXYvbnVsbAorKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9tZXNvbi5idWlsZApAQCAtMCww ICsxLDUgQEAKKyMgQ29weXJpZ2h0IChjKSAyMDI0LCBQb3N0Z3JlU1FMIEdsb2JhbCBEZXZlbG9w bWVudCBHcm91cAorCitiYWNrZW5kX3NvdXJjZXMgKz0gZmlsZXMoCisgICdzdHJlYW1pbmdfcmVh ZC5jJywKKykKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL3N0cmVhbWluZ19y ZWFkLmMgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9zdHJlYW1pbmdfcmVhZC5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi4xOTYwNTA5MGZlYQotLS0gL2Rldi9udWxs CisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL3N0cmVhbWluZ19yZWFkLmMKQEAgLTAsMCAr MSw0MzUgQEAKKyNpbmNsdWRlICJwb3N0Z3Jlcy5oIgorCisjaW5jbHVkZSAic3RvcmFnZS9zdHJl YW1pbmdfcmVhZC5oIgorI2luY2x1ZGUgInV0aWxzL3JlbC5oIgorCisvKgorICogRWxlbWVudCB0 eXBlIGZvciBQZ1N0cmVhbWluZ1JlYWQncyBjaXJjdWxhciBhcnJheSBvZiBibG9jayByYW5nZXMu CisgKgorICogRm9yIGhpdHMsIG5lZWRfdG9fY29tcGxldGUgaXMgZmFsc2UgYW5kIHRoZXJlIGlz IGp1c3Qgb25lIGJsb2NrIHBlcgorICogcmFuZ2UsIGFscmVhZHkgcGlubmVkIGFuZCByZWFkeSBm b3IgdXNlLgorICoKKyAqIEZvciBtaXNzZXMsIG5lZWRfdG9fY29tcGxldGUgaXMgdHJ1ZSBhbmQg YnVmZmVyc1tdIGhvbGRzIGEgcmFuZ2Ugb2YKKyAqIGJsb2NrcyB0aGF0IGFyZSBjb250aWd1b3Vz IGluIHN0b3JhZ2UgKHRob3VnaCB0aGUgYnVmZmVycyBtYXkgbm90IGJlCisgKiBjb250aWd1b3Vz IGluIG1lbW9yeSksIHNvIHdlIGNhbiBjb21wbGV0ZSB0aGVtIHdpdGggYSBzaW5nbGUgY2FsbCB0 bworICogQ29tcGxldGVSZWFkQnVmZmVycygpLgorICovCit0eXBlZGVmIHN0cnVjdCBQZ1N0cmVh bWluZ1JlYWRSYW5nZQoreworCWJvb2wJCWFkdmljZV9pc3N1ZWQ7CisJYm9vbAkJbmVlZF9jb21w bGV0ZTsKKwlCbG9ja051bWJlciBibG9ja251bTsKKwlpbnQJCQluYmxvY2tzOworCWludAkJCXBl cl9idWZmZXJfZGF0YV9pbmRleFtNQVhfQlVGRkVSU19QRVJfVFJBTlNGRVJdOworCUJ1ZmZlcgkJ YnVmZmVyc1tNQVhfQlVGRkVSU19QRVJfVFJBTlNGRVJdOworfSBQZ1N0cmVhbWluZ1JlYWRSYW5n ZTsKKworc3RydWN0IFBnU3RyZWFtaW5nUmVhZAoreworCWludAkJCW1heF9pb3M7CisJaW50CQkJ aW9zX2luX3Byb2dyZXNzOworCWludAkJCWlvc19pbl9wcm9ncmVzc190cmlnZ2VyOworCWludAkJ CW1heF9waW5uZWRfYnVmZmVyczsKKwlpbnQJCQlwaW5uZWRfYnVmZmVyczsKKwlpbnQJCQlwaW5u ZWRfYnVmZmVyc190cmlnZ2VyOworCWludAkJCW5leHRfdGFpbF9idWZmZXI7CisJYm9vbAkJZmlu aXNoZWQ7CisJdm9pZAkgICAqcGdzcl9wcml2YXRlOworCVBnU3RyZWFtaW5nUmVhZEJ1ZmZlckNC IGNhbGxiYWNrOworCUJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5OworCUJ1ZmZlck1hbmFn ZXJSZWxhdGlvbiBibXI7CisJRm9ya051bWJlcglmb3JrbnVtOworCisJYm9vbAkJYWR2aWNlX2Vu YWJsZWQ7CisKKwkvKiBOZXh0IGV4cGVjdGVkIGJsb2NrLCBmb3IgZGV0ZWN0aW5nIHNlcXVlbnRp YWwgYWNjZXNzLiAqLworCUJsb2NrTnVtYmVyIHNlcV9ibG9ja251bTsKKworCS8qIFNwYWNlIGZv ciBvcHRpb25hbCBwZXItYnVmZmVyIHByaXZhdGUgZGF0YS4gKi8KKwlzaXplX3QJCXBlcl9idWZm ZXJfZGF0YV9zaXplOworCXZvaWQJICAgKnBlcl9idWZmZXJfZGF0YTsKKwlpbnQJCQlwZXJfYnVm ZmVyX2RhdGFfbmV4dDsKKworCS8qIENpcmN1bGFyIGJ1ZmZlciBvZiByYW5nZXMuICovCisJaW50 CQkJc2l6ZTsKKwlpbnQJCQloZWFkOworCWludAkJCXRhaWw7CisJUGdTdHJlYW1pbmdSZWFkUmFu Z2UgcmFuZ2VzW0ZMRVhJQkxFX0FSUkFZX01FTUJFUl07Cit9OworCitzdGF0aWMgUGdTdHJlYW1p bmdSZWFkICoKK3BnX3N0cmVhbWluZ19yZWFkX2J1ZmZlcl9hbGxvY19pbnRlcm5hbChpbnQgZmxh Z3MsCisJCQkJCQkJCQkJdm9pZCAqcGdzcl9wcml2YXRlLAorCQkJCQkJCQkJCXNpemVfdCBwZXJf YnVmZmVyX2RhdGFfc2l6ZSwKKwkJCQkJCQkJCQlCdWZmZXJBY2Nlc3NTdHJhdGVneSBzdHJhdGVn eSkKK3sKKwlQZ1N0cmVhbWluZ1JlYWQgKnBnc3I7CisJaW50CQkJc2l6ZTsKKwlpbnQJCQltYXhf aW9zOworCXVpbnQzMgkJbWF4X3Bpbm5lZF9idWZmZXJzOworCisKKwkvKgorCSAqIERlY2lkZSBo b3cgbWFueSBhc3N1bWVkIEkvT3Mgd2Ugd2lsbCBhbGxvdyB0byBydW4gY29uY3VycmVudGx5LiAg VGhhdAorCSAqIGlzLCBhZHZpY2UgdG8gdGhlIGtlcm5lbCB0byB0ZWxsIGl0IHRoYXQgd2Ugd2ls bCBzb29uIHJlYWQuICBUaGlzCisJICogbnVtYmVyIGFsc28gYWZmZWN0cyBob3cgZmFyIHdlIGxv b2sgYWhlYWQgZm9yIG9wcG9ydHVuaXRpZXMgdG8gc3RhcnQKKwkgKiBtb3JlIEkvT3MuCisJICov CisJaWYgKGZsYWdzICYgUEdTUl9GTEFHX01BSU5URU5BTkNFKQorCQltYXhfaW9zID0gbWFpbnRl bmFuY2VfaW9fY29uY3VycmVuY3k7CisJZWxzZQorCQltYXhfaW9zID0gZWZmZWN0aXZlX2lvX2Nv bmN1cnJlbmN5OworCisJLyoKKwkgKiBUaGUgZGVzaXJlZCBsZXZlbCBvZiBJL08gY29uY3VycmVu Y3kgY29udHJvbHMgaG93IGZhciBhaGVhZCB3ZSBhcmUKKwkgKiB3aWxsaW5nIHRvIGxvb2sgYWhl YWQuICBXZSBhbHNvIGNsYW1wIGl0IHRvIGF0IGxlYXN0CisJICogTUFYX0JVRkZFUl9QRVJfVFJB TkZFUiBzbyB0aGF0IHdlIGNhbiBoYXZlIGEgY2hhbmNlIHRvIGJ1aWxkIHVwIGEgZnVsbAorCSAq IHNpemVkIHJlYWQsIGV2ZW4gd2hlbiBtYXhfaW9zIGlzIHplcm8uCisJICovCisJbWF4X3Bpbm5l ZF9idWZmZXJzID0gTWF4KG1heF9pb3MgKiA0LCBNQVhfQlVGRkVSU19QRVJfVFJBTlNGRVIpOwor CisJLyoKKwkgKiBUaGUgKl9pb19jb25jdXJyZW5jeSBHVUNzLCB3ZSBtaWdodCBoYXZlIDAuICBX ZSB3YW50IHRvIGFsbG93IGF0IGxlYXN0CisJICogb25lLCB0byBrZWVwIG91ciBnYXRpbmcgbG9n aWMgc2ltcGxlLgorCSAqLworCW1heF9pb3MgPSBNYXgobWF4X2lvcywgMSk7CisKKwkvKgorCSAq IERvbid0IGFsbG93IHRoaXMgYmFja2VuZCB0byBwaW4gdG9vIG1hbnkgYnVmZmVycy4gIEZvciBu b3cgd2UnbGwgYXBwbHkKKwkgKiB0aGUgbGltaXQgZm9yIHRoZSBzaGFyZWQgYnVmZmVyIHBvb2wg YW5kIHRoZSBsb2NhbCBidWZmZXIgcG9vbCwgd2l0aG91dAorCSAqIHdvcnJ5aW5nIHdoaWNoIGl0 IGlzLgorCSAqLworCUxpbWl0QWRkaXRpb25hbFBpbnMoJm1heF9waW5uZWRfYnVmZmVycyk7CisJ TGltaXRBZGRpdGlvbmFsTG9jYWxQaW5zKCZtYXhfcGlubmVkX2J1ZmZlcnMpOworCUFzc2VydCht YXhfcGlubmVkX2J1ZmZlcnMgPiAwKTsKKworCS8qCisJICogcGdzci0+cmFuZ2VzIGlzIGEgY2ly Y3VsYXIgYnVmZmVyLiAgV2hlbiBpdCBpcyBlbXB0eSwgaGVhZCA9PSB0YWlsLgorCSAqIFdoZW4g aXQgaXMgZnVsbCwgdGhlcmUgaXMgYW4gZW1wdHkgZWxlbWVudCBiZXR3ZWVuIGhlYWQgYW5kIHRh aWwuICBIZWFkCisJICogY2FuIGFsc28gYmUgZW1wdHkgKG5ibG9ja3MgPT0gMCksIHRoZXJlZm9y ZSB3ZSBuZWVkIHR3byBleHRyYSBlbGVtZW50cworCSAqIGZvciBub24tb2NjdXBpZWQgcmFuZ2Vz LCBvbiB0b3Agb2YgbWF4X3Bpbm5lZF9idWZmZXJzIHRvIGFsbG93IGZvciB0aGUKKwkgKiBtYXht aW11bSBwb3NzaWJsZSBudW1iZXIgb2Ygb2NjdXBpZWQgcmFuZ2VzIG9mIHRoZSBzbWFsbGVzdCBw b3NzaWJsZQorCSAqIHNpemUgb2Ygb25lLgorCSAqLworCXNpemUgPSBtYXhfcGlubmVkX2J1ZmZl cnMgKyAyOworCisJcGdzciA9IChQZ1N0cmVhbWluZ1JlYWQgKikKKwkJcGFsbG9jMChvZmZzZXRv ZihQZ1N0cmVhbWluZ1JlYWQsIHJhbmdlcykgKworCQkJCXNpemVvZihwZ3NyLT5yYW5nZXNbMF0p ICogc2l6ZSk7CisKKwlwZ3NyLT5tYXhfaW9zID0gbWF4X2lvczsKKwlwZ3NyLT5wZXJfYnVmZmVy X2RhdGFfc2l6ZSA9IHBlcl9idWZmZXJfZGF0YV9zaXplOworCXBnc3ItPm1heF9waW5uZWRfYnVm ZmVycyA9IG1heF9waW5uZWRfYnVmZmVyczsKKwlwZ3NyLT5wZ3NyX3ByaXZhdGUgPSBwZ3NyX3By aXZhdGU7CisJcGdzci0+c3RyYXRlZ3kgPSBzdHJhdGVneTsKKwlwZ3NyLT5zaXplID0gc2l6ZTsK KworI2lmZGVmIFVTRV9QUkVGRVRDSAorCisJLyoKKwkgKiBUaGlzIHN5c3RlbSBzdXBwb3J0cyBw cmVmZXRjaGluZyBhZHZpY2UuICBBcyBsb25nIGFzIGRpcmVjdCBJL08gaXNuJ3QKKwkgKiBlbmFi bGVkLCBhbmQgdGhlIGNhbGxlciBoYXNuJ3QgcHJvbWlzZWQgc2VxdWVudGlhbCBhY2Nlc3MsIHdl IGNhbiB1c2UKKwkgKiBpdC4KKwkgKi8KKwlpZiAoKGlvX2RpcmVjdF9mbGFncyAmIElPX0RJUkVD VF9EQVRBKSA9PSAwICYmCisJCShmbGFncyAmIFBHU1JfRkxBR19TRVFVRU5USUFMKSA9PSAwKQor CQlwZ3NyLT5hZHZpY2VfZW5hYmxlZCA9IHRydWU7CisjZW5kaWYKKworCS8qCisJICogV2Ugd2Fu dCB0byBhdm9pZCBjcmVhdGluZyByYW5nZXMgdGhhdCBhcmUgc21hbGxlciB0aGFuIHRoZXkgY291 bGQgYmUKKwkgKiBqdXN0IGJlY2F1c2Ugd2UgaGl0IG1heF9waW5uZWRfYnVmZmVycy4gIFdlIG9u bHkgbG9vayBhaGVhZCB3aGVuIHRoZQorCSAqIG51bWJlciBvZiBwaW5uZWQgYnVmZmVycyBmYWxs cyBiZWxvdyB0aGlzIHRyaWdnZXIgbnVtYmVyLCBvciBwdXQKKwkgKiBhbm90aGVyIHdheSwgd2Ug c3RvcCBsb29raW5nIGFoZWFkIHdoZW4gd2Ugd291bGRuJ3QgYmUgYWJsZSB0byBidWlsZCBhCisJ ICogImZ1bGwgc2l6ZWQiIHJhbmdlLgorCSAqLworCXBnc3ItPnBpbm5lZF9idWZmZXJzX3RyaWdn ZXIgPQorCQlNYXgoMSwgKGludCkgbWF4X3Bpbm5lZF9idWZmZXJzIC0gTUFYX0JVRkZFUlNfUEVS X1RSQU5TRkVSKTsKKworCS8qIFNwYWNlIHRoZSBjYWxsYmFjayB0byBzdG9yZSBleHRyYSBkYXRh IGFsb25nIHdpdGggZWFjaCBibG9jay4gKi8KKwlpZiAocGVyX2J1ZmZlcl9kYXRhX3NpemUpCisJ CXBnc3ItPnBlcl9idWZmZXJfZGF0YSA9IHBhbGxvYyhwZXJfYnVmZmVyX2RhdGFfc2l6ZSAqIG1h eF9waW5uZWRfYnVmZmVycyk7CisKKwlyZXR1cm4gcGdzcjsKK30KKworLyoKKyAqIENyZWF0ZSBh IG5ldyBzdHJlYW1pbmcgcmVhZCBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHRo ZQorICogZXF1aXZhbGVudCBvZiBhIHNlcmllcyBvZiBSZWFkQnVmZmVyKCkgY2FsbHMgZm9yIG9u ZSBmb3JrIG9mIG9uZSByZWxhdGlvbi4KKyAqIEludGVybmFsbHksIGl0IGdlbmVyYXRlcyBsYXJn ZXIgdmVjdG9yZWQgcmVhZHMgd2hlcmUgcG9zc2libGUgYnkgbG9va2luZworICogYWhlYWQuCisg Ki8KK1BnU3RyZWFtaW5nUmVhZCAqCitwZ19zdHJlYW1pbmdfcmVhZF9idWZmZXJfYWxsb2MoaW50 IGZsYWdzLAorCQkJCQkJCSAgIHZvaWQgKnBnc3JfcHJpdmF0ZSwKKwkJCQkJCQkgICBzaXplX3Qg cGVyX2J1ZmZlcl9kYXRhX3NpemUsCisJCQkJCQkJICAgQnVmZmVyQWNjZXNzU3RyYXRlZ3kgc3Ry YXRlZ3ksCisJCQkJCQkJICAgQnVmZmVyTWFuYWdlclJlbGF0aW9uIGJtciwKKwkJCQkJCQkgICBG b3JrTnVtYmVyIGZvcmtudW0sCisJCQkJCQkJICAgUGdTdHJlYW1pbmdSZWFkQnVmZmVyQ0IgbmV4 dF9ibG9ja19jYikKK3sKKwlQZ1N0cmVhbWluZ1JlYWQgKnJlc3VsdDsKKworCXJlc3VsdCA9IHBn X3N0cmVhbWluZ19yZWFkX2J1ZmZlcl9hbGxvY19pbnRlcm5hbChmbGFncywKKwkJCQkJCQkJCQkJ CQkgcGdzcl9wcml2YXRlLAorCQkJCQkJCQkJCQkJCSBwZXJfYnVmZmVyX2RhdGFfc2l6ZSwKKwkJ CQkJCQkJCQkJCQkgc3RyYXRlZ3kpOworCXJlc3VsdC0+Y2FsbGJhY2sgPSBuZXh0X2Jsb2NrX2Ni OworCXJlc3VsdC0+Ym1yID0gYm1yOworCXJlc3VsdC0+Zm9ya251bSA9IGZvcmtudW07CisKKwly ZXR1cm4gcmVzdWx0OworfQorCisvKgorICogU3RhcnQgYnVpbGRpbmcgYSBuZXcgcmFuZ2UuICBU aGlzIGlzIGNhbGxlZCBhZnRlciB0aGUgcHJldmlvdXMgb25lCisgKiByZWFjaGVkIG1heGltdW0g c2l6ZSwgb3IgdGhlIGNhbGxiYWNrJ3MgbmV4dCBibG9jayBjYW4ndCBiZSBtZXJnZWQgd2l0aCBp dC4KKyAqCisgKiBTaW5jZSB0aGUgcHJldmlvdXMgaGVhZCByYW5nZSBoYXMgbm93IHJlYWNoZWQg aXRzIGZ1bGwgcG90ZW50aWFsIHNpemUsIHRoaXMKKyAqIGlzIGFsc28gYSBnb29kIHRpbWUgdG8g aXNzdWUgJ3ByZWZldGNoJyBhZHZpY2UsIGJlY2F1c2Ugd2Uga25vdyB0aGF0J2xsCisgKiBzb29u IGJlIHJlYWRpbmcuICBJbiBmdXR1cmUsIHdlIGNvdWxkIHN0YXJ0IGFuIGFjdHVhbCBJL08gaGVy ZS4KKyAqLworc3RhdGljIFBnU3RyZWFtaW5nUmVhZFJhbmdlICoKK3BnX3N0cmVhbWluZ19yZWFk X25ld19yYW5nZShQZ1N0cmVhbWluZ1JlYWQgKnBnc3IpCit7CisJUGdTdHJlYW1pbmdSZWFkUmFu Z2UgKmhlYWRfcmFuZ2U7CisKKwloZWFkX3JhbmdlID0gJnBnc3ItPnJhbmdlc1twZ3NyLT5oZWFk XTsKKwlBc3NlcnQoaGVhZF9yYW5nZS0+bmJsb2NrcyA+IDApOworCisJLyoKKwkgKiBJZiBhIGNh bGwgdG8gQ29tcGxldGVSZWFkQnVmZmVycygpIHdpbGwgYmUgbmVlZGVkLCBhbmQgd2UgY2FuIGlz c3VlCisJICogYWR2aWNlIHRvIHRoZSBrZXJuZWwgdG8gZ2V0IHRoZSByZWFkIHN0YXJ0ZWQuICBX ZSBzdXBwcmVzcyBpdCBpZiB0aGUKKwkgKiBhY2Nlc3MgcGF0dGVybiBhcHBlYXJzIHRvIGJlIGNv bXBsZXRlbHkgc2VxdWVudGlhbCwgdGhvdWdoLCBiZWNhdXNlIG9uCisJICogc29tZSBzeXN0ZW1z IHRoYXQgaW50ZXJmZXJzIHdpdGggdGhlIGtlcm5lbCdzIG93biBzZXF1ZW50aWFsIHJlYWQgYWhl YWQKKwkgKiBoZXVyc3RpY3MgYW5kIGh1cnRzIHBlcmZvcm1hbmNlLgorCSAqLworCWlmIChwZ3Ny LT5hZHZpY2VfZW5hYmxlZCkKKwl7CisJCUJsb2NrTnVtYmVyIGJsb2NrbnVtID0gaGVhZF9yYW5n ZS0+YmxvY2tudW07CisJCWludAkJCW5ibG9ja3MgPSBoZWFkX3JhbmdlLT5uYmxvY2tzOworCisJ CWlmIChoZWFkX3JhbmdlLT5uZWVkX2NvbXBsZXRlICYmIGJsb2NrbnVtICE9IHBnc3ItPnNlcV9i bG9ja251bSkKKwkJeworCQkJU01nclJlbGF0aW9uIHNtZ3IgPQorCQkJCXBnc3ItPmJtci5zbWdy ID8gcGdzci0+Ym1yLnNtZ3IgOgorCQkJCVJlbGF0aW9uR2V0U21ncihwZ3NyLT5ibXIucmVsKTsK KworCQkJQXNzZXJ0KCFoZWFkX3JhbmdlLT5hZHZpY2VfaXNzdWVkKTsKKworCQkJc21ncnByZWZl dGNoKHNtZ3IsIHBnc3ItPmZvcmtudW0sIGJsb2NrbnVtLCBuYmxvY2tzKTsKKworCQkJLyoKKwkJ CSAqIENvdW50IHRoaXMgYXMgYW4gSS9PIHRoYXQgaXMgY29uY3VycmVudGx5IGluIHByb2dyZXNz LCB0aG91Z2gKKwkJCSAqIHdlIGRvbid0IHJlYWxseSBrbm93IGlmIHRoZSBrZXJuZWwgZ2VuZXJh dGVzIGEgcGh5c2ljYWwgSS9PLgorCQkJICovCisJCQloZWFkX3JhbmdlLT5hZHZpY2VfaXNzdWVk ID0gdHJ1ZTsKKwkJCXBnc3ItPmlvc19pbl9wcm9ncmVzcysrOworCQl9CisKKwkJLyogUmVtZW1i ZXIgdGhlIGJsb2NrIGFmdGVyIHRoaXMgcmFuZ2UsIGZvciBzZXF1ZW5jZSBkZXRlY3Rpb24uICov CisJCXBnc3ItPnNlcV9ibG9ja251bSA9IGJsb2NrbnVtICsgbmJsb2NrczsKKwl9CisKKwkvKiBD cmVhdGUgYSBuZXcgaGVhZCByYW5nZS4gIFRoZXJlIG11c3QgYmUgc3BhY2UuICovCisJQXNzZXJ0 KHBnc3ItPnNpemUgPiBwZ3NyLT5tYXhfcGlubmVkX2J1ZmZlcnMpOworCUFzc2VydCgocGdzci0+ aGVhZCArIDEpICUgcGdzci0+c2l6ZSAhPSBwZ3NyLT50YWlsKTsKKwlpZiAoKytwZ3NyLT5oZWFk ID09IHBnc3ItPnNpemUpCisJCXBnc3ItPmhlYWQgPSAwOworCWhlYWRfcmFuZ2UgPSAmcGdzci0+ cmFuZ2VzW3Bnc3ItPmhlYWRdOworCWhlYWRfcmFuZ2UtPm5ibG9ja3MgPSAwOworCisJcmV0dXJu IGhlYWRfcmFuZ2U7Cit9CisKK3N0YXRpYyB2b2lkCitwZ19zdHJlYW1pbmdfcmVhZF9sb29rX2Fo ZWFkKFBnU3RyZWFtaW5nUmVhZCAqcGdzcikKK3sKKwkvKgorCSAqIElmIHdlJ3JlIGZpbmlzaGVk IG9yIGNhbid0IHN0YXJ0IG1vcmUgSS9PLCB0aGVuIGRvbid0IGxvb2sgYWhlYWQuCisJICovCisJ aWYgKHBnc3ItPmZpbmlzaGVkIHx8IHBnc3ItPmlvc19pbl9wcm9ncmVzcyA9PSBwZ3NyLT5tYXhf aW9zKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFdlJ2xsIGFsc28gd2FpdCB1bnRpbCB0aGUgbnVt YmVyIG9mIHBpbm5lZCBidWZmZXJzIGZhbGxzIGJlbG93IG91cgorCSAqIHRyaWdnZXIgbGV2ZWws IHNvIHRoYXQgd2UgaGF2ZSB0aGUgY2hhbmNlIHRvIGNyZWF0ZSBhIGZ1bGwgcmFuZ2UuCisJICov CisJaWYgKHBnc3ItPnBpbm5lZF9idWZmZXJzID49IHBnc3ItPnBpbm5lZF9idWZmZXJzX3RyaWdn ZXIpCisJCXJldHVybjsKKworCWRvCisJeworCQlCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1yOwor CQlGb3JrTnVtYmVyCWZvcmtudW07CisJCUJsb2NrTnVtYmVyIGJsb2NrbnVtOworCQlCdWZmZXIJ CWJ1ZmZlcjsKKwkJYm9vbAkJZm91bmQ7CisJCWJvb2wJCW5lZWRfY29tcGxldGU7CisJCVBnU3Ry ZWFtaW5nUmVhZFJhbmdlICpoZWFkX3JhbmdlOworCQl2b2lkCSAgICpwZXJfYnVmZmVyX2RhdGE7 CisKKwkJLyogRG8gd2UgaGF2ZSBhIGZ1bGwtc2l6ZWQgcmFuZ2U/ICovCisJCWhlYWRfcmFuZ2Ug PSAmcGdzci0+cmFuZ2VzW3Bnc3ItPmhlYWRdOworCQlpZiAoaGVhZF9yYW5nZS0+bmJsb2NrcyA9 PSBsZW5ndGhvZihoZWFkX3JhbmdlLT5idWZmZXJzKSkKKwkJeworCQkJQXNzZXJ0KGhlYWRfcmFu Z2UtPm5lZWRfY29tcGxldGUpOworCQkJaGVhZF9yYW5nZSA9IHBnX3N0cmVhbWluZ19yZWFkX25l d19yYW5nZShwZ3NyKTsKKworCQkJLyoKKwkJCSAqIEdpdmUgdXAgbm93IGlmIEkvTyBpcyBzYXR1 cmF0ZWQsIG9yIHdlIHdvdWxkbid0IGJlIGFibGUgZm9ybQorCQkJICogYW5vdGhlciBmdWxsIHJh bmdlIGFmdGVyIHRoaXMgZHVlIHRvIHRoZSBwaW4gbGltaXQuCisJCQkgKi8KKwkJCWlmIChwZ3Ny LT5waW5uZWRfYnVmZmVycyA+PSBwZ3NyLT5waW5uZWRfYnVmZmVyc190cmlnZ2VyIHx8CisJCQkJ cGdzci0+aW9zX2luX3Byb2dyZXNzID09IHBnc3ItPm1heF9pb3MpCisJCQkJYnJlYWs7CisJCX0K KworCQlwZXJfYnVmZmVyX2RhdGEgPSAoY2hhciAqKSBwZ3NyLT5wZXJfYnVmZmVyX2RhdGEgKwor CQkJcGdzci0+cGVyX2J1ZmZlcl9kYXRhX3NpemUgKiBwZ3NyLT5wZXJfYnVmZmVyX2RhdGFfbmV4 dDsKKworCQkvKiBGaW5kIG91dCB3aGljaCBibG9jayB0aGUgY2FsbGJhY2sgd2FudHMgdG8gcmVh ZCBuZXh0LiAqLworCQlibG9ja251bSA9IHBnc3ItPmNhbGxiYWNrKHBnc3IsIHBnc3ItPnBnc3Jf cHJpdmF0ZSwgcGVyX2J1ZmZlcl9kYXRhKTsKKwkJaWYgKGJsb2NrbnVtID09IEludmFsaWRCbG9j a051bWJlcikKKwkJeworCQkJcGdzci0+ZmluaXNoZWQgPSB0cnVlOworCQkJYnJlYWs7CisJCX0K KwkJYm1yID0gcGdzci0+Ym1yOworCQlmb3JrbnVtID0gcGdzci0+Zm9ya251bTsKKworCQlBc3Nl cnQocGdzci0+cGlubmVkX2J1ZmZlcnMgPCBwZ3NyLT5tYXhfcGlubmVkX2J1ZmZlcnMpOworCisJ CWJ1ZmZlciA9IFByZXBhcmVSZWFkQnVmZmVyKGJtciwKKwkJCQkJCQkJICAgZm9ya251bSwKKwkJ CQkJCQkJICAgYmxvY2tudW0sCisJCQkJCQkJCSAgIHBnc3ItPnN0cmF0ZWd5LAorCQkJCQkJCQkg ICAmZm91bmQpOworCQlwZ3NyLT5waW5uZWRfYnVmZmVycysrOworCisJCW5lZWRfY29tcGxldGUg PSAhZm91bmQ7CisKKwkJLyogSXMgdGhlcmUgYSBoZWFkIHJhbmdlIHRoYXQgd2UgY2FuJ3QgZXh0 ZW5kPyAqLworCQloZWFkX3JhbmdlID0gJnBnc3ItPnJhbmdlc1twZ3NyLT5oZWFkXTsKKwkJaWYg KGhlYWRfcmFuZ2UtPm5ibG9ja3MgPiAwICYmCisJCQkoIW5lZWRfY29tcGxldGUgfHwKKwkJCSAh aGVhZF9yYW5nZS0+bmVlZF9jb21wbGV0ZSB8fAorCQkJIGhlYWRfcmFuZ2UtPmJsb2NrbnVtICsg aGVhZF9yYW5nZS0+bmJsb2NrcyAhPSBibG9ja251bSkpCisJCXsKKwkJCS8qIFllcywgdGltZSB0 byBzdGFydCBidWlsZGluZyBhIG5ldyBvbmUuICovCisJCQloZWFkX3JhbmdlID0gcGdfc3RyZWFt aW5nX3JlYWRfbmV3X3JhbmdlKHBnc3IpOworCQkJQXNzZXJ0KGhlYWRfcmFuZ2UtPm5ibG9ja3Mg PT0gMCk7CisJCX0KKworCQlpZiAoaGVhZF9yYW5nZS0+bmJsb2NrcyA9PSAwKQorCQl7CisJCQkv KiBJbml0aWFsaXplIGEgbmV3IHJhbmdlIGJlZ2lubmluZyBhdCB0aGlzIGJsb2NrLiAqLworCQkJ aGVhZF9yYW5nZS0+YmxvY2tudW0gPSBibG9ja251bTsKKwkJCWhlYWRfcmFuZ2UtPm5lZWRfY29t cGxldGUgPSBuZWVkX2NvbXBsZXRlOworCQkJaGVhZF9yYW5nZS0+YWR2aWNlX2lzc3VlZCA9IGZh bHNlOworCQl9CisJCWVsc2UKKwkJeworCQkJLyogV2UgY2FuIGV4dGVuZCBhbiBleGlzdGluZyBy YW5nZSBieSBvbmUgYmxvY2suICovCisJCQlBc3NlcnQoaGVhZF9yYW5nZS0+YmxvY2tudW0gKyBo ZWFkX3JhbmdlLT5uYmxvY2tzID09IGJsb2NrbnVtKTsKKwkJCUFzc2VydChoZWFkX3JhbmdlLT5u ZWVkX2NvbXBsZXRlKTsKKwkJfQorCisJCWhlYWRfcmFuZ2UtPnBlcl9idWZmZXJfZGF0YV9pbmRl eFtoZWFkX3JhbmdlLT5uYmxvY2tzXSA9IHBnc3ItPnBlcl9idWZmZXJfZGF0YV9uZXh0Kys7CisJ CWhlYWRfcmFuZ2UtPmJ1ZmZlcnNbaGVhZF9yYW5nZS0+bmJsb2Nrc10gPSBidWZmZXI7CisJCWhl YWRfcmFuZ2UtPm5ibG9ja3MrKzsKKworCQlpZiAocGdzci0+cGVyX2J1ZmZlcl9kYXRhX25leHQg PT0gcGdzci0+bWF4X3Bpbm5lZF9idWZmZXJzKQorCQkJcGdzci0+cGVyX2J1ZmZlcl9kYXRhX25l eHQgPSAwOworCisJfSB3aGlsZSAocGdzci0+cGlubmVkX2J1ZmZlcnMgPCBwZ3NyLT5tYXhfcGlu bmVkX2J1ZmZlcnMgJiYKKwkJCSBwZ3NyLT5pb3NfaW5fcHJvZ3Jlc3MgPCBwZ3NyLT5tYXhfaW9z KTsKKworCWlmIChwZ3NyLT5yYW5nZXNbcGdzci0+aGVhZF0ubmJsb2NrcyA+IDApCisJCXBnX3N0 cmVhbWluZ19yZWFkX25ld19yYW5nZShwZ3NyKTsKK30KKworQnVmZmVyCitwZ19zdHJlYW1pbmdf cmVhZF9idWZmZXJfZ2V0X25leHQoUGdTdHJlYW1pbmdSZWFkICpwZ3NyLCB2b2lkICoqcGVyX2J1 ZmZlcl9kYXRhKQoreworCXBnX3N0cmVhbWluZ19yZWFkX2xvb2tfYWhlYWQocGdzcik7CisKKwkv KiBTZWUgaWYgd2UgaGF2ZSBvbmUgYnVmZmVyIHRvIHJldHVybi4gKi8KKwl3aGlsZSAocGdzci0+ dGFpbCAhPSBwZ3NyLT5oZWFkKQorCXsKKwkJUGdTdHJlYW1pbmdSZWFkUmFuZ2UgKnRhaWxfcmFu Z2U7CisKKwkJdGFpbF9yYW5nZSA9ICZwZ3NyLT5yYW5nZXNbcGdzci0+dGFpbF07CisKKwkJLyoK KwkJICogRG8gd2UgbmVlZCB0byBwZXJmb3JtIGFuIEkvTyBiZWZvcmUgcmV0dXJuaW5nIHRoZSBi dWZmZXJzIGZyb20gdGhpcworCQkgKiByYW5nZT8KKwkJICovCisJCWlmICh0YWlsX3JhbmdlLT5u ZWVkX2NvbXBsZXRlKQorCQl7CisJCQlDb21wbGV0ZVJlYWRCdWZmZXJzKHBnc3ItPmJtciwKKwkJ CQkJCQkJdGFpbF9yYW5nZS0+YnVmZmVycywKKwkJCQkJCQkJcGdzci0+Zm9ya251bSwKKwkJCQkJ CQkJdGFpbF9yYW5nZS0+YmxvY2tudW0sCisJCQkJCQkJCXRhaWxfcmFuZ2UtPm5ibG9ja3MsCisJ CQkJCQkJCWZhbHNlLAorCQkJCQkJCQlwZ3NyLT5zdHJhdGVneSk7CisJCQl0YWlsX3JhbmdlLT5u ZWVkX2NvbXBsZXRlID0gZmFsc2U7CisKKwkJCS8qCisJCQkgKiBXZSBkb24ndCByZWFsbHkga25v dyBpZiB0aGUga2VybmVsIGdlbmVyYXRlZCBhbiBwaHlzaWNhbCBJL08KKwkJCSAqIHdoZW4gd2Ug aXNzdWVkIGFkdmljZSwgbGV0IGFsb25lIHdoZW4gaXQgZmluaXNoZWQsIGJ1dCBpdCBoYXMKKwkJ CSAqIGNlcnRhaW5seSBmaW5pc2hlZCBhZnRlciBhIHJlYWQgY2FsbCByZXR1cm5zLgorCQkJICov CisJCQlpZiAodGFpbF9yYW5nZS0+YWR2aWNlX2lzc3VlZCkKKwkJCQlwZ3NyLT5pb3NfaW5fcHJv Z3Jlc3MtLTsKKwkJfQorCisJCS8qIEFyZSB0aGVyZSBtb3JlIGJ1ZmZlcnMgYXZhaWxhYmxlIGlu IHRoaXMgcmFuZ2U/ICovCisJCWlmIChwZ3NyLT5uZXh0X3RhaWxfYnVmZmVyIDwgdGFpbF9yYW5n ZS0+bmJsb2NrcykKKwkJeworCQkJaW50CQkJYnVmZmVyX2luZGV4OworCQkJQnVmZmVyCQlidWZm ZXI7CisKKwkJCWJ1ZmZlcl9pbmRleCA9IHBnc3ItPm5leHRfdGFpbF9idWZmZXIrKzsKKwkJCWJ1 ZmZlciA9IHRhaWxfcmFuZ2UtPmJ1ZmZlcnNbYnVmZmVyX2luZGV4XTsKKworCQkJQXNzZXJ0KEJ1 ZmZlcklzVmFsaWQoYnVmZmVyKSk7CisKKwkJCS8qIFdlIGFyZSBnaXZpbmcgYXdheSBvd25lcnNo aXAgb2YgdGhpcyBwaW5uZWQgYnVmZmVyLiAqLworCQkJQXNzZXJ0KHBnc3ItPnBpbm5lZF9idWZm ZXJzID4gMCk7CisJCQlwZ3NyLT5waW5uZWRfYnVmZmVycy0tOworCisJCQlpZiAocGVyX2J1ZmZl cl9kYXRhKQorCQkJCSpwZXJfYnVmZmVyX2RhdGEgPSAoY2hhciAqKSBwZ3NyLT5wZXJfYnVmZmVy X2RhdGEgKworCQkJCQl0YWlsX3JhbmdlLT5wZXJfYnVmZmVyX2RhdGFfaW5kZXhbYnVmZmVyX2lu ZGV4XSAqCisJCQkJCXBnc3ItPnBlcl9idWZmZXJfZGF0YV9zaXplOworCisJCQlyZXR1cm4gYnVm ZmVyOworCQl9CisKKwkJLyogQWR2YW5jZSB0YWlsIHRvIG5leHQgcmFuZ2UsIGlmIHRoZXJlIGlz IG9uZS4gKi8KKwkJaWYgKCsrcGdzci0+dGFpbCA9PSBwZ3NyLT5zaXplKQorCQkJcGdzci0+dGFp bCA9IDA7CisJCXBnc3ItPm5leHRfdGFpbF9idWZmZXIgPSAwOworCX0KKworCUFzc2VydChwZ3Ny LT5waW5uZWRfYnVmZmVycyA9PSAwKTsKKworCXJldHVybiBJbnZhbGlkQnVmZmVyOworfQorCit2 b2lkCitwZ19zdHJlYW1pbmdfcmVhZF9mcmVlKFBnU3RyZWFtaW5nUmVhZCAqcGdzcikKK3sKKwlC dWZmZXIJCWJ1ZmZlcjsKKworCS8qIFN0b3AgbG9va2luZyBhaGVhZCwgYW5kIHVucGluIGFueXRo aW5nIHRoYXQgd2Fzbid0IGNvbnN1bWVkLiAqLworCXBnc3ItPmZpbmlzaGVkID0gdHJ1ZTsKKwl3 aGlsZSAoKGJ1ZmZlciA9IHBnX3N0cmVhbWluZ19yZWFkX2J1ZmZlcl9nZXRfbmV4dChwZ3NyLCBO VUxMKSkgIT0gSW52YWxpZEJ1ZmZlcikKKwkJUmVsZWFzZUJ1ZmZlcihidWZmZXIpOworCisJaWYg KHBnc3ItPnBlcl9idWZmZXJfZGF0YSkKKwkJcGZyZWUocGdzci0+cGVyX2J1ZmZlcl9kYXRhKTsK KwlwZnJlZShwZ3NyKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVy L2J1Zm1nci5jIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmbWdyLmMKaW5kZXggN2Q2 MDFiZWY2ZGQuLjIxNTdhOTdiOTczIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2J1 ZmZlci9idWZtZ3IuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYwpA QCAtNDcyLDcgKzQ3Miw3IEBAIEZvcmdldFByaXZhdGVSZWZDb3VudEVudHJ5KFByaXZhdGVSZWZD b3VudEVudHJ5ICpyZWYpCiApCiAKIAotc3RhdGljIEJ1ZmZlciBSZWFkQnVmZmVyX2NvbW1vbihT TWdyUmVsYXRpb24gc21nciwgY2hhciByZWxwZXJzaXN0ZW5jZSwKK3N0YXRpYyBCdWZmZXIgUmVh ZEJ1ZmZlcl9jb21tb24oQnVmZmVyTWFuYWdlclJlbGF0aW9uIGJtciwKIAkJCQkJCQkJRm9ya051 bWJlciBmb3JrTnVtLCBCbG9ja051bWJlciBibG9ja051bSwKIAkJCQkJCQkJUmVhZEJ1ZmZlck1v ZGUgbW9kZSwgQnVmZmVyQWNjZXNzU3RyYXRlZ3kgc3RyYXRlZ3ksCiAJCQkJCQkJCWJvb2wgKmhp dCk7CkBAIC01MDEsNyArNTAxLDcgQEAgc3RhdGljIHVpbnQzMiBXYWl0QnVmSGRyVW5sb2NrZWQo QnVmZmVyRGVzYyAqYnVmKTsKIHN0YXRpYyBpbnQJU3luY09uZUJ1ZmZlcihpbnQgYnVmX2lkLCBi b29sIHNraXBfcmVjZW50bHlfdXNlZCwKIAkJCQkJCSAgV3JpdGViYWNrQ29udGV4dCAqd2JfY29u dGV4dCk7CiBzdGF0aWMgdm9pZCBXYWl0SU8oQnVmZmVyRGVzYyAqYnVmKTsKLXN0YXRpYyBib29s IFN0YXJ0QnVmZmVySU8oQnVmZmVyRGVzYyAqYnVmLCBib29sIGZvcklucHV0KTsKK3N0YXRpYyBi b29sIFN0YXJ0QnVmZmVySU8oQnVmZmVyRGVzYyAqYnVmLCBib29sIGZvcklucHV0LCBib29sIG5v d2FpdCk7CiBzdGF0aWMgdm9pZCBUZXJtaW5hdGVCdWZmZXJJTyhCdWZmZXJEZXNjICpidWYsIGJv b2wgY2xlYXJfZGlydHksCiAJCQkJCQkJICB1aW50MzIgc2V0X2ZsYWdfYml0cywgYm9vbCBmb3Jn ZXRfb3duZXIpOwogc3RhdGljIHZvaWQgQWJvcnRCdWZmZXJJTyhCdWZmZXIgYnVmZmVyKTsKQEAg LTc5NSwxNSArNzk1LDkgQEAgUmVhZEJ1ZmZlckV4dGVuZGVkKFJlbGF0aW9uIHJlbG4sIEZvcmtO dW1iZXIgZm9ya051bSwgQmxvY2tOdW1iZXIgYmxvY2tOdW0sCiAJCQkJKGVycmNvZGUoRVJSQ09E RV9GRUFUVVJFX05PVF9TVVBQT1JURUQpLAogCQkJCSBlcnJtc2coImNhbm5vdCBhY2Nlc3MgdGVt cG9yYXJ5IHRhYmxlcyBvZiBvdGhlciBzZXNzaW9ucyIpKSk7CiAKLQkvKgotCSAqIFJlYWQgdGhl IGJ1ZmZlciwgYW5kIHVwZGF0ZSBwZ3N0YXQgY291bnRlcnMgdG8gcmVmbGVjdCBhIGNhY2hlIGhp dCBvcgotCSAqIG1pc3MuCi0JICovCi0JcGdzdGF0X2NvdW50X2J1ZmZlcl9yZWFkKHJlbG4pOwot CWJ1ZiA9IFJlYWRCdWZmZXJfY29tbW9uKFJlbGF0aW9uR2V0U21ncihyZWxuKSwgcmVsbi0+cmRf cmVsLT5yZWxwZXJzaXN0ZW5jZSwKKwlidWYgPSBSZWFkQnVmZmVyX2NvbW1vbihCTVJfUkVMKHJl bG4pLAogCQkJCQkJCWZvcmtOdW0sIGJsb2NrTnVtLCBtb2RlLCBzdHJhdGVneSwgJmhpdCk7Ci0J aWYgKGhpdCkKLQkJcGdzdGF0X2NvdW50X2J1ZmZlcl9oaXQocmVsbik7CisKIAlyZXR1cm4gYnVm OwogfQogCkBAIC04MjcsOCArODIxLDkgQEAgUmVhZEJ1ZmZlcldpdGhvdXRSZWxjYWNoZShSZWxG aWxlTG9jYXRvciBybG9jYXRvciwgRm9ya051bWJlciBmb3JrTnVtLAogCiAJU01nclJlbGF0aW9u IHNtZ3IgPSBzbWdyb3BlbihybG9jYXRvciwgSW52YWxpZEJhY2tlbmRJZCk7CiAKLQlyZXR1cm4g UmVhZEJ1ZmZlcl9jb21tb24oc21nciwgcGVybWFuZW50ID8gUkVMUEVSU0lTVEVOQ0VfUEVSTUFO RU5UIDoKLQkJCQkJCQkgUkVMUEVSU0lTVEVOQ0VfVU5MT0dHRUQsIGZvcmtOdW0sIGJsb2NrTnVt LAorCXJldHVybiBSZWFkQnVmZmVyX2NvbW1vbihCTVJfU01HUihzbWdyLCBwZXJtYW5lbnQgPyBS RUxQRVJTSVNURU5DRV9QRVJNQU5FTlQgOgorCQkJCQkJCQkJICBSRUxQRVJTSVNURU5DRV9VTkxP R0dFRCksCisJCQkJCQkJIGZvcmtOdW0sIGJsb2NrTnVtLAogCQkJCQkJCSBtb2RlLCBzdHJhdGVn eSwgJmhpdCk7CiB9CiAKQEAgLTEwMDIsNyArOTk3LDcgQEAgRXh0ZW5kQnVmZmVyZWRSZWxUbyhC dWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1yLAogCQlib29sCQloaXQ7CiAKIAkJQXNzZXJ0KGV4dGVu ZGVkX2J5ID09IDApOwotCQlidWZmZXIgPSBSZWFkQnVmZmVyX2NvbW1vbihibXIuc21nciwgYm1y LnJlbHBlcnNpc3RlbmNlLAorCQlidWZmZXIgPSBSZWFkQnVmZmVyX2NvbW1vbihibXIsCiAJCQkJ CQkJCSAgIGZvcmssIGV4dGVuZF90byAtIDEsIG1vZGUsIHN0cmF0ZWd5LAogCQkJCQkJCQkgICAm aGl0KTsKIAl9CkBAIC0xMDE2LDE4ICsxMDExLDExIEBAIEV4dGVuZEJ1ZmZlcmVkUmVsVG8oQnVm ZmVyTWFuYWdlclJlbGF0aW9uIGJtciwKICAqICpoaXQgaXMgc2V0IHRvIHRydWUgaWYgdGhlIHJl cXVlc3Qgd2FzIHNhdGlzZmllZCBmcm9tIHNoYXJlZCBidWZmZXIgY2FjaGUuCiAgKi8KIHN0YXRp YyBCdWZmZXIKLVJlYWRCdWZmZXJfY29tbW9uKFNNZ3JSZWxhdGlvbiBzbWdyLCBjaGFyIHJlbHBl cnNpc3RlbmNlLCBGb3JrTnVtYmVyIGZvcmtOdW0sCitSZWFkQnVmZmVyX2NvbW1vbihCdWZmZXJN YW5hZ2VyUmVsYXRpb24gYm1yLCBGb3JrTnVtYmVyIGZvcmtOdW0sCiAJCQkJICBCbG9ja051bWJl ciBibG9ja051bSwgUmVhZEJ1ZmZlck1vZGUgbW9kZSwKIAkJCQkgIEJ1ZmZlckFjY2Vzc1N0cmF0 ZWd5IHN0cmF0ZWd5LCBib29sICpoaXQpCiB7Ci0JQnVmZmVyRGVzYyAqYnVmSGRyOwotCUJsb2Nr CQlidWZCbG9jazsKLQlib29sCQlmb3VuZDsKLQlJT0NvbnRleHQJaW9fY29udGV4dDsKLQlJT09i amVjdAlpb19vYmplY3Q7Ci0JYm9vbAkJaXNMb2NhbEJ1ZiA9IFNtZ3JJc1RlbXAoc21ncik7Ci0K LQkqaGl0ID0gZmFsc2U7CisJQnVmZmVyCQlidWZmZXI7CiAKIAkvKgogCSAqIEJhY2t3YXJkIGNv bXBhdGliaWxpdHkgcGF0aCwgbW9zdCBjb2RlIHNob3VsZCB1c2UgRXh0ZW5kQnVmZmVyZWRSZWwo KQpAQCAtMTA0NiwxNzUgKzEwMzQsMzM5IEBAIFJlYWRCdWZmZXJfY29tbW9uKFNNZ3JSZWxhdGlv biBzbWdyLCBjaGFyIHJlbHBlcnNpc3RlbmNlLCBGb3JrTnVtYmVyIGZvcmtOdW0sCiAJCWlmICht b2RlID09IFJCTV9aRVJPX0FORF9MT0NLIHx8IG1vZGUgPT0gUkJNX1pFUk9fQU5EX0NMRUFOVVBf TE9DSykKIAkJCWZsYWdzIHw9IEVCX0xPQ0tfRklSU1Q7CiAKLQkJcmV0dXJuIEV4dGVuZEJ1ZmZl cmVkUmVsKEJNUl9TTUdSKHNtZ3IsIHJlbHBlcnNpc3RlbmNlKSwKLQkJCQkJCQkJIGZvcmtOdW0s IHN0cmF0ZWd5LCBmbGFncyk7CisJCSpoaXQgPSBmYWxzZTsKKworCQlyZXR1cm4gRXh0ZW5kQnVm ZmVyZWRSZWwoYm1yLCBmb3JrTnVtLCBzdHJhdGVneSwgZmxhZ3MpOwogCX0KIAotCVRSQUNFX1BP U1RHUkVTUUxfQlVGRkVSX1JFQURfU1RBUlQoZm9ya051bSwgYmxvY2tOdW0sCi0JCQkJCQkJCQkg ICBzbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3Iuc3BjT2lkLAotCQkJCQkJCQkJICAgc21nci0+ c21ncl9ybG9jYXRvci5sb2NhdG9yLmRiT2lkLAotCQkJCQkJCQkJICAgc21nci0+c21ncl9ybG9j YXRvci5sb2NhdG9yLnJlbE51bWJlciwKLQkJCQkJCQkJCSAgIHNtZ3ItPnNtZ3JfcmxvY2F0b3Iu YmFja2VuZCk7CisJYnVmZmVyID0gUHJlcGFyZVJlYWRCdWZmZXIoYm1yLAorCQkJCQkJCSAgIGZv cmtOdW0sCisJCQkJCQkJICAgYmxvY2tOdW0sCisJCQkJCQkJICAgc3RyYXRlZ3ksCisJCQkJCQkJ ICAgaGl0KTsKKworCS8qIEF0IHRoaXMgcG9pbnQgd2UgZG8gTk9UIGhvbGQgYW55IGxvY2tzLiAq LwogCisJaWYgKG1vZGUgPT0gUkJNX1pFUk9fQU5EX0NMRUFOVVBfTE9DSyB8fCBtb2RlID09IFJC TV9aRVJPX0FORF9MT0NLKQorCXsKKwkJLyogaWYgd2UganVzdCB3YW50IHplcm9lcyBhbmQgYSBs b2NrLCB3ZSdyZSBkb25lICovCisJCVplcm9CdWZmZXIoYnVmZmVyLCBtb2RlKTsKKwl9CisJZWxz ZSBpZiAoISpoaXQpCisJeworCQkvKiB3ZSBtaWdodCBuZWVkIHRvIHBlcmZvcm0gSS9PICovCisJ CUNvbXBsZXRlUmVhZEJ1ZmZlcnMoYm1yLAorCQkJCQkJCSZidWZmZXIsCisJCQkJCQkJZm9ya051 bSwKKwkJCQkJCQlibG9ja051bSwKKwkJCQkJCQkxLAorCQkJCQkJCW1vZGUgPT0gUkJNX1pFUk9f T05fRVJST1IsCisJCQkJCQkJc3RyYXRlZ3kpOworCX0KKworCXJldHVybiBidWZmZXI7Cit9CisK Ky8qCisgKiBQcmVwYXJlIHRvIHJlYWQgYSBibG9jay4gIFRoZSBidWZmZXIgaXMgcGlubmVkLiAg SWYgdGhpcyBpcyBhICdoaXQnLCB0aGVuCisgKiB0aGUgcmV0dXJuZWQgYnVmZmVyIGNhbiBiZSB1 c2VkIGltbWVkaWF0ZWx5LiAgT3RoZXJ3aXNlLCBhIHBoeXNpY2FsIHJlYWQKKyAqIHNob3VsZCBi ZSBjb21wbGV0ZWQgd2l0aCBDb21wbGV0ZVJlYWRCdWZmZXJzKCksIG9yIHRoZSBidWZmZXIgc2hv dWxkIGJlCisgKiB6ZXJvZWQgd2l0aCBaZXJvQnVmZmVyKCkuICBQcmVwYXJlUmVhZEJ1ZmZlcigp IGZvbGxvd2VkIGJ5CisgKiBDb21wbGV0ZVJlYWRCdWZmZXJzKCkgb3IgWmVyb0J1ZmZlcigpIGlz IGVxdWl2YWxlbnQgdG8gUmVhZEJ1ZmZlcigpLCBidXQKKyAqIHRoZSBjYWxsZXIgaGFzIHRoZSBv cHBvcnR1bml0eSB0byBjb21iaW5lIHJlYWRzIG9mIG11bHRpcGxlIG5laWdoYm9yaW5nCisgKiBi bG9ja3MgaW50byBvbmUgQ29tcGxldGVSZWFkQnVmZmVycygpIGNhbGwuCisgKgorICogKmZvdW5k UHRyIGlzIHNldCB0byB0cnVlIGZvciBhIGhpdCwgYW5kIGZhbHNlIGZvciBhIG1pc3MuCisgKi8K K0J1ZmZlcgorUHJlcGFyZVJlYWRCdWZmZXIoQnVmZmVyTWFuYWdlclJlbGF0aW9uIGJtciwKKwkJ CQkgIEZvcmtOdW1iZXIgZm9ya051bSwKKwkJCQkgIEJsb2NrTnVtYmVyIGJsb2NrTnVtLAorCQkJ CSAgQnVmZmVyQWNjZXNzU3RyYXRlZ3kgc3RyYXRlZ3ksCisJCQkJICBib29sICpmb3VuZFB0cikK K3sKKwlCdWZmZXJEZXNjICpidWZIZHI7CisJYm9vbAkJaXNMb2NhbEJ1ZjsKKwlJT0NvbnRleHQJ aW9fY29udGV4dDsKKwlJT09iamVjdAlpb19vYmplY3Q7CisKKwlBc3NlcnQoYmxvY2tOdW0gIT0g UF9ORVcpOworCisJaWYgKGJtci5yZWwpCisJeworCQlibXIuc21nciA9IFJlbGF0aW9uR2V0U21n cihibXIucmVsKTsKKwkJYm1yLnJlbHBlcnNpc3RlbmNlID0gYm1yLnJlbC0+cmRfcmVsLT5yZWxw ZXJzaXN0ZW5jZTsKKwl9CisKKwlpc0xvY2FsQnVmID0gU21ncklzVGVtcChibXIuc21ncik7CiAJ aWYgKGlzTG9jYWxCdWYpCiAJewotCQkvKgotCQkgKiBXZSBkbyBub3QgdXNlIGEgQnVmZmVyQWNj ZXNzU3RyYXRlZ3kgZm9yIEkvTyBvZiB0ZW1wb3JhcnkgdGFibGVzLgotCQkgKiBIb3dldmVyLCBp biBzb21lIGNhc2VzLCB0aGUgInN0cmF0ZWd5IiBtYXkgbm90IGJlIE5VTEwsIHNvIHdlIGNhbid0 Ci0JCSAqIHJlbHkgb24gSU9Db250ZXh0Rm9yU3RyYXRlZ3koKSB0byBzZXQgdGhlIHJpZ2h0IElP Q29udGV4dCBmb3IgdXMuCi0JCSAqIFRoaXMgbWF5IGhhcHBlbiBpbiBjYXNlcyBsaWtlIENSRUFU RSBURU1QT1JBUlkgVEFCTEUgQVMuLi4KLQkJICovCiAJCWlvX2NvbnRleHQgPSBJT0NPTlRFWFRf Tk9STUFMOwogCQlpb19vYmplY3QgPSBJT09CSkVDVF9URU1QX1JFTEFUSU9OOwotCQlidWZIZHIg PSBMb2NhbEJ1ZmZlckFsbG9jKHNtZ3IsIGZvcmtOdW0sIGJsb2NrTnVtLCAmZm91bmQpOwotCQlp ZiAoZm91bmQpCi0JCQlwZ0J1ZmZlclVzYWdlLmxvY2FsX2Jsa3NfaGl0Kys7Ci0JCWVsc2UgaWYg KG1vZGUgPT0gUkJNX05PUk1BTCB8fCBtb2RlID09IFJCTV9OT1JNQUxfTk9fTE9HIHx8Ci0JCQkJ IG1vZGUgPT0gUkJNX1pFUk9fT05fRVJST1IpCi0JCQlwZ0J1ZmZlclVzYWdlLmxvY2FsX2Jsa3Nf cmVhZCsrOwogCX0KIAllbHNlCiAJewotCQkvKgotCQkgKiBsb29rdXAgdGhlIGJ1ZmZlci4gIElP X0lOX1BST0dSRVNTIGlzIHNldCBpZiB0aGUgcmVxdWVzdGVkIGJsb2NrIGlzCi0JCSAqIG5vdCBj dXJyZW50bHkgaW4gbWVtb3J5LgotCQkgKi8KIAkJaW9fY29udGV4dCA9IElPQ29udGV4dEZvclN0 cmF0ZWd5KHN0cmF0ZWd5KTsKIAkJaW9fb2JqZWN0ID0gSU9PQkpFQ1RfUkVMQVRJT047Ci0JCWJ1 ZkhkciA9IEJ1ZmZlckFsbG9jKHNtZ3IsIHJlbHBlcnNpc3RlbmNlLCBmb3JrTnVtLCBibG9ja051 bSwKLQkJCQkJCQkgc3RyYXRlZ3ksICZmb3VuZCwgaW9fY29udGV4dCk7Ci0JCWlmIChmb3VuZCkK LQkJCXBnQnVmZmVyVXNhZ2Uuc2hhcmVkX2Jsa3NfaGl0Kys7Ci0JCWVsc2UgaWYgKG1vZGUgPT0g UkJNX05PUk1BTCB8fCBtb2RlID09IFJCTV9OT1JNQUxfTk9fTE9HIHx8Ci0JCQkJIG1vZGUgPT0g UkJNX1pFUk9fT05fRVJST1IpCi0JCQlwZ0J1ZmZlclVzYWdlLnNoYXJlZF9ibGtzX3JlYWQrKzsK IAl9CiAKLQkvKiBBdCB0aGlzIHBvaW50IHdlIGRvIE5PVCBob2xkIGFueSBsb2Nrcy4gKi8KKwlU UkFDRV9QT1NUR1JFU1FMX0JVRkZFUl9SRUFEX1NUQVJUKGZvcmtOdW0sIGJsb2NrTnVtLAorCQkJ CQkJCQkJICAgYm1yLnNtZ3ItPnNtZ3JfcmxvY2F0b3IubG9jYXRvci5zcGNPaWQsCisJCQkJCQkJ CQkgICBibXIuc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLmRiT2lkLAorCQkJCQkJCQkJICAg Ym1yLnNtZ3ItPnNtZ3JfcmxvY2F0b3IubG9jYXRvci5yZWxOdW1iZXIsCisJCQkJCQkJCQkgICBi bXIuc21nci0+c21ncl9ybG9jYXRvci5iYWNrZW5kKTsKIAotCS8qIGlmIGl0IHdhcyBhbHJlYWR5 IGluIHRoZSBidWZmZXIgcG9vbCwgd2UncmUgZG9uZSAqLwotCWlmIChmb3VuZCkKKwlSZXNvdXJj ZU93bmVyRW5sYXJnZShDdXJyZW50UmVzb3VyY2VPd25lcik7CisJaWYgKGlzTG9jYWxCdWYpCisJ eworCQlidWZIZHIgPSBMb2NhbEJ1ZmZlckFsbG9jKGJtci5zbWdyLCBmb3JrTnVtLCBibG9ja051 bSwgZm91bmRQdHIpOworCQlpZiAoKmZvdW5kUHRyKQorCQkJcGdCdWZmZXJVc2FnZS5sb2NhbF9i bGtzX2hpdCsrOworCX0KKwllbHNlCisJeworCQlidWZIZHIgPSBCdWZmZXJBbGxvYyhibXIuc21n ciwgYm1yLnJlbHBlcnNpc3RlbmNlLCBmb3JrTnVtLCBibG9ja051bSwKKwkJCQkJCQkgc3RyYXRl Z3ksIGZvdW5kUHRyLCBpb19jb250ZXh0KTsKKwkJaWYgKCpmb3VuZFB0cikKKwkJCXBnQnVmZmVy VXNhZ2Uuc2hhcmVkX2Jsa3NfaGl0Kys7CisJfQorCWlmIChibXIucmVsKQorCXsKKwkJLyoKKwkJ ICogV2hpbGUgcGdCdWZmZXJVc2FnZSdzICJyZWFkIiBjb3VudGVyIGlzbid0IGJ1bXBlZCB1bmxl c3Mgd2UgcmVhY2gKKwkJICogQ29tcGxldGVSZWFkQnVmZmVycygpIChzbywgbm90IGZvciBoaXRz LCBhbmQgbm90IGZvciBidWZmZXJzIHRoYXQKKwkJICogYXJlIHplcm9lZCBpbnN0ZWFkKSwgdGhl IHBlci1yZWxhdGlvbiBzdGF0cyBhbHdheXMgY291bnQgdGhlbS4KKwkJICovCisJCXBnc3RhdF9j b3VudF9idWZmZXJfcmVhZChibXIucmVsKTsKKwkJaWYgKCpmb3VuZFB0cikKKwkJCXBnc3RhdF9j b3VudF9idWZmZXJfaGl0KGJtci5yZWwpOworCX0KKwlpZiAoKmZvdW5kUHRyKQogCXsKLQkJLyog SnVzdCBuZWVkIHRvIHVwZGF0ZSBzdGF0cyBiZWZvcmUgd2UgZXhpdCAqLwotCQkqaGl0ID0gdHJ1 ZTsKIAkJVmFjdXVtUGFnZUhpdCsrOwogCQlwZ3N0YXRfY291bnRfaW9fb3AoaW9fb2JqZWN0LCBp b19jb250ZXh0LCBJT09QX0hJVCk7Ci0KIAkJaWYgKFZhY3V1bUNvc3RBY3RpdmUpCiAJCQlWYWN1 dW1Db3N0QmFsYW5jZSArPSBWYWN1dW1Db3N0UGFnZUhpdDsKIAogCQlUUkFDRV9QT1NUR1JFU1FM X0JVRkZFUl9SRUFEX0RPTkUoZm9ya051bSwgYmxvY2tOdW0sCi0JCQkJCQkJCQkJICBzbWdyLT5z bWdyX3Jsb2NhdG9yLmxvY2F0b3Iuc3BjT2lkLAotCQkJCQkJCQkJCSAgc21nci0+c21ncl9ybG9j YXRvci5sb2NhdG9yLmRiT2lkLAotCQkJCQkJCQkJCSAgc21nci0+c21ncl9ybG9jYXRvci5sb2Nh dG9yLnJlbE51bWJlciwKLQkJCQkJCQkJCQkgIHNtZ3ItPnNtZ3JfcmxvY2F0b3IuYmFja2VuZCwK LQkJCQkJCQkJCQkgIGZvdW5kKTsKKwkJCQkJCQkJCQkgIGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9y LmxvY2F0b3Iuc3BjT2lkLAorCQkJCQkJCQkJCSAgYm1yLnNtZ3ItPnNtZ3JfcmxvY2F0b3IubG9j YXRvci5kYk9pZCwKKwkJCQkJCQkJCQkgIGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3Iu cmVsTnVtYmVyLAorCQkJCQkJCQkJCSAgYm1yLnNtZ3ItPnNtZ3JfcmxvY2F0b3IuYmFja2VuZCwK KwkJCQkJCQkJCQkgIHRydWUpOworCX0KIAotCQkvKgotCQkgKiBJbiBSQk1fWkVST19BTkRfTE9D SyBtb2RlIHRoZSBjYWxsZXIgZXhwZWN0cyB0aGUgcGFnZSB0byBiZSBsb2NrZWQKLQkJICogb24g cmV0dXJuLgotCQkgKi8KLQkJaWYgKCFpc0xvY2FsQnVmKQotCQl7Ci0JCQlpZiAobW9kZSA9PSBS Qk1fWkVST19BTkRfTE9DSykKLQkJCQlMV0xvY2tBY3F1aXJlKEJ1ZmZlckRlc2NyaXB0b3JHZXRD b250ZW50TG9jayhidWZIZHIpLAotCQkJCQkJCSAgTFdfRVhDTFVTSVZFKTsKLQkJCWVsc2UgaWYg KG1vZGUgPT0gUkJNX1pFUk9fQU5EX0NMRUFOVVBfTE9DSykKLQkJCQlMb2NrQnVmZmVyRm9yQ2xl YW51cChCdWZmZXJEZXNjcmlwdG9yR2V0QnVmZmVyKGJ1ZkhkcikpOwotCQl9CisJcmV0dXJuIEJ1 ZmZlckRlc2NyaXB0b3JHZXRCdWZmZXIoYnVmSGRyKTsKK30KIAotCQlyZXR1cm4gQnVmZmVyRGVz Y3JpcHRvckdldEJ1ZmZlcihidWZIZHIpOworc3RhdGljIGlubGluZSBib29sCitDb21wbGV0ZVJl YWRCdWZmZXJzQ2FuU3RhcnRJTyhCdWZmZXIgYnVmZmVyLCBib29sIG5vd2FpdCkKK3sKKwlpZiAo QnVmZmVySXNMb2NhbChidWZmZXIpKQorCXsKKwkJQnVmZmVyRGVzYyAqYnVmSGRyID0gR2V0TG9j YWxCdWZmZXJEZXNjcmlwdG9yKC1idWZmZXIgLSAxKTsKKworCQlyZXR1cm4gKHBnX2F0b21pY19y ZWFkX3UzMigmYnVmSGRyLT5zdGF0ZSkgJiBCTV9WQUxJRCkgPT0gMDsKIAl9CisJZWxzZQorCQly ZXR1cm4gU3RhcnRCdWZmZXJJTyhHZXRCdWZmZXJEZXNjcmlwdG9yKGJ1ZmZlciAtIDEpLCB0cnVl LCBub3dhaXQpOworfQogCi0JLyoKLQkgKiBpZiB3ZSBoYXZlIGdvdHRlbiB0byB0aGlzIHBvaW50 LCB3ZSBoYXZlIGFsbG9jYXRlZCBhIGJ1ZmZlciBmb3IgdGhlCi0JICogcGFnZSBidXQgaXRzIGNv bnRlbnRzIGFyZSBub3QgeWV0IHZhbGlkLiAgSU9fSU5fUFJPR1JFU1MgaXMgc2V0IGZvciBpdCwK LQkgKiBpZiBpdCdzIGEgc2hhcmVkIGJ1ZmZlci4KLQkgKi8KLQlBc3NlcnQoIShwZ19hdG9taWNf cmVhZF91MzIoJmJ1Zkhkci0+c3RhdGUpICYgQk1fVkFMSUQpKTsJLyogc3BpbmxvY2sgbm90IG5l ZWRlZCAqLworLyoKKyAqIENvbXBsZXRlIGEgc2V0IHJlYWRzIHByZXBhcmVkIHdpdGggUHJlcGFy ZVJlYWRCdWZmZXJzKCkuICBUaGUgYnVmZmVycyBtdXN0CisgKiBjb3ZlciBhIGNsdXN0ZXIgb2Yg bmVpZ2hib3JpbmcgYmxvY2sgbnVtYmVycy4KKyAqCisgKiBUeXBpY2FsbHkgdGhpcyBwZXJmb3Jt cyBvbmUgcGh5c2ljYWwgdmVjdG9yIHJlYWQgY292ZXJpbmcgdGhlIGJsb2NrIHJhbmdlLAorICog YnV0IGlmIHNvbWUgb2YgdGhlIGJ1ZmZlcnMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCBpbiB0aGUg bWVhbnRpbWUgYnkgYW55CisgKiBiYWNrZW5kLCB6ZXJvIG9yIG11bHRpcGxlIHJlYWRzIG1heSBi ZSBwZXJmb3JtZWQuCisgKi8KK3ZvaWQKK0NvbXBsZXRlUmVhZEJ1ZmZlcnMoQnVmZmVyTWFuYWdl clJlbGF0aW9uIGJtciwKKwkJCQkJQnVmZmVyICpidWZmZXJzLAorCQkJCQlGb3JrTnVtYmVyIGZv cmtudW0sCisJCQkJCUJsb2NrTnVtYmVyIGJsb2NrbnVtLAorCQkJCQlpbnQgbmJsb2NrcywKKwkJ CQkJYm9vbCB6ZXJvX29uX2Vycm9yLAorCQkJCQlCdWZmZXJBY2Nlc3NTdHJhdGVneSBzdHJhdGVn eSkKK3sKKwlib29sCQlpc0xvY2FsQnVmOworCUlPQ29udGV4dAlpb19jb250ZXh0OworCUlPT2Jq ZWN0CWlvX29iamVjdDsKIAotCWJ1ZkJsb2NrID0gaXNMb2NhbEJ1ZiA/IExvY2FsQnVmSGRyR2V0 QmxvY2soYnVmSGRyKSA6IEJ1ZkhkckdldEJsb2NrKGJ1Zkhkcik7CisJaWYgKGJtci5yZWwpCisJ eworCQlibXIuc21nciA9IFJlbGF0aW9uR2V0U21ncihibXIucmVsKTsKKwkJYm1yLnJlbHBlcnNp c3RlbmNlID0gYm1yLnJlbC0+cmRfcmVsLT5yZWxwZXJzaXN0ZW5jZTsKKwl9CisKKwlpc0xvY2Fs QnVmID0gU21ncklzVGVtcChibXIuc21ncik7CisJaWYgKGlzTG9jYWxCdWYpCisJeworCQlpb19j b250ZXh0ID0gSU9DT05URVhUX05PUk1BTDsKKwkJaW9fb2JqZWN0ID0gSU9PQkpFQ1RfVEVNUF9S RUxBVElPTjsKKwl9CisJZWxzZQorCXsKKwkJaW9fY29udGV4dCA9IElPQ29udGV4dEZvclN0cmF0 ZWd5KHN0cmF0ZWd5KTsKKwkJaW9fb2JqZWN0ID0gSU9PQkpFQ1RfUkVMQVRJT047CisJfQogCiAJ LyoKLQkgKiBSZWFkIGluIHRoZSBwYWdlLCB1bmxlc3MgdGhlIGNhbGxlciBpbnRlbmRzIHRvIG92 ZXJ3cml0ZSBpdCBhbmQganVzdAotCSAqIHdhbnRzIHVzIHRvIGFsbG9jYXRlIGEgYnVmZmVyLgor CSAqIFdlIGNvdW50IGFsbCB0aGVzZSBibG9ja3MgYXMgcmVhZCBieSB0aGlzIGJhY2tlbmQuICBU aGlzIGlzIHRyYWRpdGlvbmFsCisJICogYmVoYXZpb3IsIGJ1dCBtaWdodCB0dXJuIG91dCB0byBi ZSBub3QgdHJ1ZSBpZiB3ZSBmaW5kIHRoYXQgc29tZW9uZQorCSAqIGVsc2UgaGFzIGJlYXRlbiB1 cyBhbmQgY29tcGxldGVkIHRoZSByZWFkIG9mIHNvbWUgb2YgdGhlc2UgYmxvY2tzLiAgSW4KKwkg KiB0aGF0IGNhc2UgdGhlIHN5c3RlbSBnbG9iYWxseSBkb3VibGUtY291bnRzLCBidXQgd2UgdHJh ZGl0aW9uYWxseSBkb24ndAorCSAqIGNvdW50IHRoaXMgYXMgYSAiaGl0IiwgYW5kIHdlIGRvbid0 IGhhdmUgYSBzZXBhcmF0ZSBjb3VudGVyIGZvciAibWlzcywKKwkgKiBidXQgYW5vdGhlciBiYWNr ZW5kIGNvbXBsZXRlZCB0aGUgcmVhZCIuCiAJICovCi0JaWYgKG1vZGUgPT0gUkJNX1pFUk9fQU5E X0xPQ0sgfHwgbW9kZSA9PSBSQk1fWkVST19BTkRfQ0xFQU5VUF9MT0NLKQotCQlNZW1TZXQoKGNo YXIgKikgYnVmQmxvY2ssIDAsIEJMQ0tTWik7CisJaWYgKGlzTG9jYWxCdWYpCisJCXBnQnVmZmVy VXNhZ2UubG9jYWxfYmxrc19yZWFkICs9IG5ibG9ja3M7CiAJZWxzZQorCQlwZ0J1ZmZlclVzYWdl LnNoYXJlZF9ibGtzX3JlYWQgKz0gbmJsb2NrczsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgbmJs b2NrczsgKytpKQogCXsKLQkJaW5zdHJfdGltZQlpb19zdGFydCA9IHBnc3RhdF9wcmVwYXJlX2lv X3RpbWUodHJhY2tfaW9fdGltaW5nKTsKKwkJaW50CQkJaW9fYnVmZmVyc19sZW47CisJCUJ1ZmZl cgkJaW9fYnVmZmVyc1tNQVhfQlVGRkVSU19QRVJfVFJBTlNGRVJdOworCQl2b2lkCSAgICppb19w YWdlc1tNQVhfQlVGRkVSU19QRVJfVFJBTlNGRVJdOworCQlpbnN0cl90aW1lCWlvX3N0YXJ0Owor CQlCbG9ja051bWJlciBpb19maXJzdF9ibG9jazsKIAotCQlzbWdycmVhZChzbWdyLCBmb3JrTnVt LCBibG9ja051bSwgYnVmQmxvY2spOworI2lmZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJTkcKIAotCQlw Z3N0YXRfY291bnRfaW9fb3BfdGltZShpb19vYmplY3QsIGlvX2NvbnRleHQsCi0JCQkJCQkJCUlP T1BfUkVBRCwgaW9fc3RhcnQsIDEpOworCQkvKgorCQkgKiBXZSBjb3VsZCBnZXQgYWxsIHRoZSBp bmZvcm1hdGlvbiBmcm9tIGJ1ZmZlciBoZWFkZXJzLCBidXQgaXQgY2FuIGJlCisJCSAqIGV4cGVu c2l2ZSB0byBhY2Nlc3MgYnVmZmVyIGhlYWRlciBjYWNoZSBsaW5lcyBzbyB3ZSBtYWtlIHRoZSBj YWxsZXIKKwkJICogcHJvdmlkZSBhbGwgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQsIGFuZCBhc3Nl cnQgdGhhdCBpdCBpcworCQkgKiBjb25zaXN0ZW50LgorCQkgKi8KKwkJeworCQkJUmVsRmlsZUxv Y2F0b3IgeGxvY2F0b3I7CisJCQlGb3JrTnVtYmVyCXhmb3JrbnVtOworCQkJQmxvY2tOdW1iZXIg eGJsb2NrbnVtOworCisJCQlCdWZmZXJHZXRUYWcoYnVmZmVyc1tpXSwgJnhsb2NhdG9yLCAmeGZv cmtudW0sICZ4YmxvY2tudW0pOworCQkJQXNzZXJ0KFJlbEZpbGVMb2NhdG9yRXF1YWxzKGJtci5z bWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3IsIHhsb2NhdG9yKSk7CisJCQlBc3NlcnQoeGZvcmtu dW0gPT0gZm9ya251bSk7CisJCQlBc3NlcnQoeGJsb2NrbnVtID09IGJsb2NrbnVtICsgaSk7CisJ CX0KKyNlbmRpZgorCisJCS8qCisJCSAqIFNraXAgdGhpcyBibG9jayBpZiBzb21lb25lIGVsc2Ug aGFzIGFscmVhZHkgY29tcGxldGVkIGl0LiAgSWYgYW4KKwkJICogSS9PIGlzIGFscmVhZHkgaW4g cHJvZ3Jlc3MgaW4gYW5vdGhlciBiYWNrZW5kLCB0aGlzIHdpbGwgd2FpdCBmb3IKKwkJICogdGhl IG91dGNvbWU6IGVpdGhlciBkb25lLCBvciBzb21ldGhpbmcgd2VudCB3cm9uZyBhbmQgd2Ugd2ls bAorCQkgKiByZXRyeS4KKwkJICovCisJCWlmICghQ29tcGxldGVSZWFkQnVmZmVyc0NhblN0YXJ0 SU8oYnVmZmVyc1tpXSwgZmFsc2UpKQorCQl7CisJCQkvKgorCQkJICogUmVwb3J0IHRoaXMgYXMg YSAnaGl0JyBmb3IgdGhpcyBiYWNrZW5kLCBldmVuIHRob3VnaCBpdCBtdXN0CisJCQkgKiBoYXZl IHN0YXJ0ZWQgb3V0IGFzIGEgbWlzcyBpbiBQcmVwYXJlUmVhZEJ1ZmZlcigpLgorCQkJICovCisJ CQlUUkFDRV9QT1NUR1JFU1FMX0JVRkZFUl9SRUFEX0RPTkUoZm9ya251bSwgYmxvY2tudW0gKyBp LAorCQkJCQkJCQkJCQkgIGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3Iuc3BjT2lkLAor CQkJCQkJCQkJCQkgIGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3IuZGJPaWQsCisJCQkJ CQkJCQkJCSAgYm1yLnNtZ3ItPnNtZ3JfcmxvY2F0b3IubG9jYXRvci5yZWxOdW1iZXIsCisJCQkJ CQkJCQkJCSAgYm1yLnNtZ3ItPnNtZ3JfcmxvY2F0b3IuYmFja2VuZCwKKwkJCQkJCQkJCQkJICB0 cnVlKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogV2UgZm91bmQgYSBidWZmZXIgdGhhdCB3 ZSBuZWVkIHRvIHJlYWQgaW4uICovCisJCWlvX2J1ZmZlcnNbMF0gPSBidWZmZXJzW2ldOworCQlp b19wYWdlc1swXSA9IEJ1ZmZlckdldEJsb2NrKGJ1ZmZlcnNbaV0pOworCQlpb19maXJzdF9ibG9j ayA9IGJsb2NrbnVtICsgaTsKKwkJaW9fYnVmZmVyc19sZW4gPSAxOwogCi0JCS8qIGNoZWNrIGZv ciBnYXJiYWdlIGRhdGEgKi8KLQkJaWYgKCFQYWdlSXNWZXJpZmllZEV4dGVuZGVkKChQYWdlKSBi dWZCbG9jaywgYmxvY2tOdW0sCi0JCQkJCQkJCQlQSVZfTE9HX1dBUk5JTkcgfCBQSVZfUkVQT1JU X1NUQVQpKQorCQkvKgorCQkgKiBIb3cgbWFueSBuZWlnaGJvcmluZy1vbi1kaXNrIGJsb2NrcyBj YW4gd2UgY2FuIHNjYXR0ZXItcmVhZCBpbnRvCisJCSAqIG90aGVyIGJ1ZmZlcnMgYXQgdGhlIHNh bWUgdGltZT8gIEluIHRoaXMgY2FzZSB3ZSBkb24ndCB3YWl0IGlmIHdlCisJCSAqIHNlZSBhbiBJ L08gYWxyZWFkeSBpbiBwcm9ncmVzcy4gIFdlIGFscmVhZHkgaG9sZCBCTV9JT19JTl9QUk9HUkVT UworCQkgKiBmb3IgdGhlIGhlYWQgYmxvY2ssIHNvIHdlIHNob3VsZCBnZXQgb24gd2l0aCB0aGF0 IEkvTyBhcyBzb29uIGFzCisJCSAqIHBvc3NpYmxlLiAgV2UnbGwgY29tZSBiYWNrIHRvIHRoaXMg YmxvY2sgYWdhaW4sIGFib3ZlLgorCQkgKi8KKwkJd2hpbGUgKChpICsgMSkgPCBuYmxvY2tzICYm CisJCQkgICBDb21wbGV0ZVJlYWRCdWZmZXJzQ2FuU3RhcnRJTyhidWZmZXJzW2kgKyAxXSwgdHJ1 ZSkpCisJCXsKKwkJCS8qIE11c3QgYmUgY29uc2VjdXRpdmUgYmxvY2sgbnVtYmVycy4gKi8KKwkJ CUFzc2VydChCdWZmZXJHZXRCbG9ja051bWJlcihidWZmZXJzW2kgKyAxXSkgPT0KKwkJCQkgICBC dWZmZXJHZXRCbG9ja051bWJlcihidWZmZXJzW2ldKSArIDEpOworCisJCQlpb19idWZmZXJzW2lv X2J1ZmZlcnNfbGVuXSA9IGJ1ZmZlcnNbKytpXTsKKwkJCWlvX3BhZ2VzW2lvX2J1ZmZlcnNfbGVu KytdID0gQnVmZmVyR2V0QmxvY2soYnVmZmVyc1tpXSk7CisJCX0KKworCQlpb19zdGFydCA9IHBn c3RhdF9wcmVwYXJlX2lvX3RpbWUodHJhY2tfaW9fdGltaW5nKTsKKwkJc21ncnJlYWR2KGJtci5z bWdyLCBmb3JrbnVtLCBpb19maXJzdF9ibG9jaywgaW9fcGFnZXMsIGlvX2J1ZmZlcnNfbGVuKTsK KwkJcGdzdGF0X2NvdW50X2lvX29wX3RpbWUoaW9fb2JqZWN0LCBpb19jb250ZXh0LCBJT09QX1JF QUQsIGlvX3N0YXJ0LAorCQkJCQkJCQlpb19idWZmZXJzX2xlbik7CisKKwkJLyogVmVyaWZ5IGVh Y2ggYmxvY2sgd2UgcmVhZCwgYW5kIHRlcm1pbmF0ZSB0aGUgSS9PLiAqLworCQlmb3IgKGludCBq ID0gMDsgaiA8IGlvX2J1ZmZlcnNfbGVuOyArK2opCiAJCXsKLQkJCWlmIChtb2RlID09IFJCTV9a RVJPX09OX0VSUk9SIHx8IHplcm9fZGFtYWdlZF9wYWdlcykKKwkJCUJ1ZmZlckRlc2MgKmJ1Zkhk cjsKKwkJCUJsb2NrCQlidWZCbG9jazsKKworCQkJaWYgKGlzTG9jYWxCdWYpCiAJCQl7Ci0JCQkJ ZXJlcG9ydChXQVJOSU5HLAotCQkJCQkJKGVycmNvZGUoRVJSQ09ERV9EQVRBX0NPUlJVUFRFRCks Ci0JCQkJCQkgZXJybXNnKCJpbnZhbGlkIHBhZ2UgaW4gYmxvY2sgJXUgb2YgcmVsYXRpb24gJXM7 IHplcm9pbmcgb3V0IHBhZ2UiLAotCQkJCQkJCQlibG9ja051bSwKLQkJCQkJCQkJcmVscGF0aChz bWdyLT5zbWdyX3Jsb2NhdG9yLCBmb3JrTnVtKSkpKTsKLQkJCQlNZW1TZXQoKGNoYXIgKikgYnVm QmxvY2ssIDAsIEJMQ0tTWik7CisJCQkJYnVmSGRyID0gR2V0TG9jYWxCdWZmZXJEZXNjcmlwdG9y KC1pb19idWZmZXJzW2pdIC0gMSk7CisJCQkJYnVmQmxvY2sgPSBMb2NhbEJ1ZkhkckdldEJsb2Nr KGJ1Zkhkcik7CiAJCQl9CiAJCQllbHNlCi0JCQkJZXJlcG9ydChFUlJPUiwKLQkJCQkJCShlcnJj b2RlKEVSUkNPREVfREFUQV9DT1JSVVBURUQpLAotCQkJCQkJIGVycm1zZygiaW52YWxpZCBwYWdl IGluIGJsb2NrICV1IG9mIHJlbGF0aW9uICVzIiwKLQkJCQkJCQkJYmxvY2tOdW0sCi0JCQkJCQkJ CXJlbHBhdGgoc21nci0+c21ncl9ybG9jYXRvciwgZm9ya051bSkpKSk7Ci0JCX0KLQl9Ci0KLQkv KgotCSAqIEluIFJCTV9aRVJPX0FORF9MT0NLIC8gUkJNX1pFUk9fQU5EX0NMRUFOVVBfTE9DSyBt b2RlLCBncmFiIHRoZSBidWZmZXIKLQkgKiBjb250ZW50IGxvY2sgYmVmb3JlIG1hcmtpbmcgdGhl IHBhZ2UgYXMgdmFsaWQsIHRvIG1ha2Ugc3VyZSB0aGF0IG5vCi0JICogb3RoZXIgYmFja2VuZCBz ZWVzIHRoZSB6ZXJvZWQgcGFnZSBiZWZvcmUgdGhlIGNhbGxlciBoYXMgaGFkIGEgY2hhbmNlCi0J ICogdG8gaW5pdGlhbGl6ZSBpdC4KLQkgKgotCSAqIFNpbmNlIG5vLW9uZSBlbHNlIGNhbiBiZSBs b29raW5nIGF0IHRoZSBwYWdlIGNvbnRlbnRzIHlldCwgdGhlcmUgaXMgbm8KLQkgKiBkaWZmZXJl bmNlIGJldHdlZW4gYW4gZXhjbHVzaXZlIGxvY2sgYW5kIGEgY2xlYW51cC1zdHJlbmd0aCBsb2Nr LiAoTm90ZQotCSAqIHRoYXQgd2UgY2Fubm90IHVzZSBMb2NrQnVmZmVyKCkgb3IgTG9ja0J1ZmZl ckZvckNsZWFudXAoKSBoZXJlLCBiZWNhdXNlCi0JICogdGhleSBhc3NlcnQgdGhhdCB0aGUgYnVm ZmVyIGlzIGFscmVhZHkgdmFsaWQuKQotCSAqLwotCWlmICgobW9kZSA9PSBSQk1fWkVST19BTkRf TE9DSyB8fCBtb2RlID09IFJCTV9aRVJPX0FORF9DTEVBTlVQX0xPQ0spICYmCi0JCSFpc0xvY2Fs QnVmKQotCXsKLQkJTFdMb2NrQWNxdWlyZShCdWZmZXJEZXNjcmlwdG9yR2V0Q29udGVudExvY2so YnVmSGRyKSwgTFdfRVhDTFVTSVZFKTsKLQl9CisJCQl7CisJCQkJYnVmSGRyID0gR2V0QnVmZmVy RGVzY3JpcHRvcihpb19idWZmZXJzW2pdIC0gMSk7CisJCQkJYnVmQmxvY2sgPSBCdWZIZHJHZXRC bG9jayhidWZIZHIpOworCQkJfQogCi0JaWYgKGlzTG9jYWxCdWYpCi0JewotCQkvKiBPbmx5IG5l ZWQgdG8gYWRqdXN0IGZsYWdzICovCi0JCXVpbnQzMgkJYnVmX3N0YXRlID0gcGdfYXRvbWljX3Jl YWRfdTMyKCZidWZIZHItPnN0YXRlKTsKKwkJCS8qIGNoZWNrIGZvciBnYXJiYWdlIGRhdGEgKi8K KwkJCWlmICghUGFnZUlzVmVyaWZpZWRFeHRlbmRlZCgoUGFnZSkgYnVmQmxvY2ssIGlvX2ZpcnN0 X2Jsb2NrICsgaiwKKwkJCQkJCQkJCQlQSVZfTE9HX1dBUk5JTkcgfCBQSVZfUkVQT1JUX1NUQVQp KQorCQkJeworCQkJCWlmICh6ZXJvX29uX2Vycm9yIHx8IHplcm9fZGFtYWdlZF9wYWdlcykKKwkJ CQl7CisJCQkJCWVyZXBvcnQoV0FSTklORywKKwkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0RBVEFf Q09SUlVQVEVEKSwKKwkJCQkJCQkgZXJybXNnKCJpbnZhbGlkIHBhZ2UgaW4gYmxvY2sgJXUgb2Yg cmVsYXRpb24gJXM7IHplcm9pbmcgb3V0IHBhZ2UiLAorCQkJCQkJCQkJaW9fZmlyc3RfYmxvY2sg KyBqLAorCQkJCQkJCQkJcmVscGF0aChibXIuc21nci0+c21ncl9ybG9jYXRvciwgZm9ya251bSkp KSk7CisJCQkJCW1lbXNldChidWZCbG9jaywgMCwgQkxDS1NaKTsKKwkJCQl9CisJCQkJZWxzZQor CQkJCQllcmVwb3J0KEVSUk9SLAorCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfREFUQV9DT1JSVVBU RUQpLAorCQkJCQkJCSBlcnJtc2coImludmFsaWQgcGFnZSBpbiBibG9jayAldSBvZiByZWxhdGlv biAlcyIsCisJCQkJCQkJCQlpb19maXJzdF9ibG9jayArIGosCisJCQkJCQkJCQlyZWxwYXRoKGJt ci5zbWdyLT5zbWdyX3Jsb2NhdG9yLCBmb3JrbnVtKSkpKTsKKwkJCX0KIAotCQlidWZfc3RhdGUg fD0gQk1fVkFMSUQ7Ci0JCXBnX2F0b21pY191bmxvY2tlZF93cml0ZV91MzIoJmJ1Zkhkci0+c3Rh dGUsIGJ1Zl9zdGF0ZSk7Ci0JfQotCWVsc2UKLQl7Ci0JCS8qIFNldCBCTV9WQUxJRCwgdGVybWlu YXRlIElPLCBhbmQgd2FrZSB1cCBhbnkgd2FpdGVycyAqLwotCQlUZXJtaW5hdGVCdWZmZXJJTyhi dWZIZHIsIGZhbHNlLCBCTV9WQUxJRCwgdHJ1ZSk7Ci0JfQorCQkJLyogVGVybWluYXRlIEkvTyBh bmQgc2V0IEJNX1ZBTElELiAqLworCQkJaWYgKGlzTG9jYWxCdWYpCisJCQl7CisJCQkJdWludDMy CQlidWZfc3RhdGUgPSBwZ19hdG9taWNfcmVhZF91MzIoJmJ1Zkhkci0+c3RhdGUpOwogCi0JVmFj dXVtUGFnZU1pc3MrKzsKLQlpZiAoVmFjdXVtQ29zdEFjdGl2ZSkKLQkJVmFjdXVtQ29zdEJhbGFu Y2UgKz0gVmFjdXVtQ29zdFBhZ2VNaXNzOworCQkJCWJ1Zl9zdGF0ZSB8PSBCTV9WQUxJRDsKKwkJ CQlwZ19hdG9taWNfdW5sb2NrZWRfd3JpdGVfdTMyKCZidWZIZHItPnN0YXRlLCBidWZfc3RhdGUp OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCS8qIFNldCBCTV9WQUxJRCwgdGVybWluYXRlIElP LCBhbmQgd2FrZSB1cCBhbnkgd2FpdGVycyAqLworCQkJCVRlcm1pbmF0ZUJ1ZmZlcklPKGJ1Zkhk ciwgZmFsc2UsIEJNX1ZBTElELCB0cnVlKTsKKwkJCX0KIAotCVRSQUNFX1BPU1RHUkVTUUxfQlVG RkVSX1JFQURfRE9ORShmb3JrTnVtLCBibG9ja051bSwKLQkJCQkJCQkJCSAgc21nci0+c21ncl9y bG9jYXRvci5sb2NhdG9yLnNwY09pZCwKLQkJCQkJCQkJCSAgc21nci0+c21ncl9ybG9jYXRvci5s b2NhdG9yLmRiT2lkLAotCQkJCQkJCQkJICBzbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3IucmVs TnVtYmVyLAotCQkJCQkJCQkJICBzbWdyLT5zbWdyX3Jsb2NhdG9yLmJhY2tlbmQsCi0JCQkJCQkJ CQkgIGZvdW5kKTsKKwkJCS8qIFJlcG9ydCBJL09zIGFzIGNvbXBsZXRpbmcgaW5kaXZpZHVhbGx5 LiAqLworCQkJVFJBQ0VfUE9TVEdSRVNRTF9CVUZGRVJfUkVBRF9ET05FKGZvcmtudW0sIGlvX2Zp cnN0X2Jsb2NrICsgaiwKKwkJCQkJCQkJCQkJICBibXIuc21nci0+c21ncl9ybG9jYXRvci5sb2Nh dG9yLnNwY09pZCwKKwkJCQkJCQkJCQkJICBibXIuc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9y LmRiT2lkLAorCQkJCQkJCQkJCQkgIGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3IucmVs TnVtYmVyLAorCQkJCQkJCQkJCQkgIGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmJhY2tlbmQsCisJ CQkJCQkJCQkJCSAgZmFsc2UpOworCQl9CiAKLQlyZXR1cm4gQnVmZmVyRGVzY3JpcHRvckdldEJ1 ZmZlcihidWZIZHIpOworCQlWYWN1dW1QYWdlTWlzcyArPSBpb19idWZmZXJzX2xlbjsKKwkJaWYg KFZhY3V1bUNvc3RBY3RpdmUpCisJCQlWYWN1dW1Db3N0QmFsYW5jZSArPSBWYWN1dW1Db3N0UGFn ZU1pc3MgKiBpb19idWZmZXJzX2xlbjsKKwl9CiB9CiAKIC8qCkBAIC0xMjI4LDExICsxMzgwLDgg QEAgUmVhZEJ1ZmZlcl9jb21tb24oU01nclJlbGF0aW9uIHNtZ3IsIGNoYXIgcmVscGVyc2lzdGVu Y2UsIEZvcmtOdW1iZXIgZm9ya051bSwKICAqCiAgKiBUaGUgcmV0dXJuZWQgYnVmZmVyIGlzIHBp bm5lZCBhbmQgaXMgYWxyZWFkeSBtYXJrZWQgYXMgaG9sZGluZyB0aGUKICAqIGRlc2lyZWQgcGFn ZS4gIElmIGl0IGFscmVhZHkgZGlkIGhhdmUgdGhlIGRlc2lyZWQgcGFnZSwgKmZvdW5kUHRyIGlz Ci0gKiBzZXQgdHJ1ZS4gIE90aGVyd2lzZSwgKmZvdW5kUHRyIGlzIHNldCBmYWxzZSBhbmQgdGhl IGJ1ZmZlciBpcyBtYXJrZWQKLSAqIGFzIElPX0lOX1BST0dSRVNTOyBSZWFkQnVmZmVyIHdpbGwg bm93IG5lZWQgdG8gZG8gSS9PIHRvIGZpbGwgaXQuCi0gKgotICogKmZvdW5kUHRyIGlzIGFjdHVh bGx5IHJlZHVuZGFudCB3aXRoIHRoZSBidWZmZXIncyBCTV9WQUxJRCBmbGFnLCBidXQKLSAqIHdl IGtlZXAgaXQgZm9yIHNpbXBsaWNpdHkgaW4gUmVhZEJ1ZmZlci4KKyAqIHNldCB0cnVlLiAgT3Ro ZXJ3aXNlLCAqZm91bmRQdHIgaXMgc2V0IGZhbHNlLiAgQSByZWFkIHNob3VsZCBiZQorICogcGVy Zm9ybWVkIHdpdGggQ29tcGxldGVSZWFkQnVmZmVycygpLgogICoKICAqIGlvX2NvbnRleHQgaXMg cGFzc2VkIGFzIGFuIG91dHB1dCBwYXJhbWV0ZXIgdG8gYXZvaWQgY2FsbGluZwogICogSU9Db250 ZXh0Rm9yU3RyYXRlZ3koKSB3aGVuIHRoZXJlIGlzIGEgc2hhcmVkIGJ1ZmZlcnMgaGl0IGFuZCBu byBJTwpAQCAtMTI5MSwxOSArMTQ0MCwxMCBAQCBCdWZmZXJBbGxvYyhTTWdyUmVsYXRpb24gc21n ciwgY2hhciByZWxwZXJzaXN0ZW5jZSwgRm9ya051bWJlciBmb3JrTnVtLAogCQl7CiAJCQkvKgog CQkJICogV2UgY2FuIG9ubHkgZ2V0IGhlcmUgaWYgKGEpIHNvbWVvbmUgZWxzZSBpcyBzdGlsbCBy ZWFkaW5nIGluCi0JCQkgKiB0aGUgcGFnZSwgb3IgKGIpIGEgcHJldmlvdXMgcmVhZCBhdHRlbXB0 IGZhaWxlZC4gIFdlIGhhdmUgdG8KLQkJCSAqIHdhaXQgZm9yIGFueSBhY3RpdmUgcmVhZCBhdHRl bXB0IHRvIGZpbmlzaCwgYW5kIHRoZW4gc2V0IHVwIG91cgotCQkJICogb3duIHJlYWQgYXR0ZW1w dCBpZiB0aGUgcGFnZSBpcyBzdGlsbCBub3QgQk1fVkFMSUQuCi0JCQkgKiBTdGFydEJ1ZmZlcklP IGRvZXMgaXQgYWxsLgorCQkJICogdGhlIHBhZ2UsIChiKSBhIHByZXZpb3VzIHJlYWQgYXR0ZW1w dCBmYWlsZWQsIG9yIChjKSBzb21lb25lCisJCQkgKiBjYWxsZWQgUHJlcGFyZVJlYWRCdWZmZXIo KSBidXQgbm90IHlldCBDb21wbGV0ZVJlYWRCdWZmZXJzKCkuCiAJCQkgKi8KLQkJCWlmIChTdGFy dEJ1ZmZlcklPKGJ1ZiwgdHJ1ZSkpCi0JCQl7Ci0JCQkJLyoKLQkJCQkgKiBJZiB3ZSBnZXQgaGVy ZSwgcHJldmlvdXMgYXR0ZW1wdHMgdG8gcmVhZCB0aGUgYnVmZmVyIG11c3QKLQkJCQkgKiBoYXZl IGZhaWxlZCAuLi4gYnV0IHdlIHNoYWxsIGJyYXZlbHkgdHJ5IGFnYWluLgotCQkJCSAqLwotCQkJ CSpmb3VuZFB0ciA9IGZhbHNlOwotCQkJfQorCQkJKmZvdW5kUHRyID0gZmFsc2U7CiAJCX0KIAog CQlyZXR1cm4gYnVmOwpAQCAtMTM2OCwxOSArMTUwOCwxMCBAQCBCdWZmZXJBbGxvYyhTTWdyUmVs YXRpb24gc21nciwgY2hhciByZWxwZXJzaXN0ZW5jZSwgRm9ya051bWJlciBmb3JrTnVtLAogCQl7 CiAJCQkvKgogCQkJICogV2UgY2FuIG9ubHkgZ2V0IGhlcmUgaWYgKGEpIHNvbWVvbmUgZWxzZSBp cyBzdGlsbCByZWFkaW5nIGluCi0JCQkgKiB0aGUgcGFnZSwgb3IgKGIpIGEgcHJldmlvdXMgcmVh ZCBhdHRlbXB0IGZhaWxlZC4gIFdlIGhhdmUgdG8KLQkJCSAqIHdhaXQgZm9yIGFueSBhY3RpdmUg cmVhZCBhdHRlbXB0IHRvIGZpbmlzaCwgYW5kIHRoZW4gc2V0IHVwIG91cgotCQkJICogb3duIHJl YWQgYXR0ZW1wdCBpZiB0aGUgcGFnZSBpcyBzdGlsbCBub3QgQk1fVkFMSUQuCi0JCQkgKiBTdGFy dEJ1ZmZlcklPIGRvZXMgaXQgYWxsLgorCQkJICogdGhlIHBhZ2UsIChiKSBhIHByZXZpb3VzIHJl YWQgYXR0ZW1wdCBmYWlsZWQsIG9yIChjKSBzb21lb25lCisJCQkgKiBjYWxsZWQgUHJlcGFyZVJl YWRCdWZmZXIoKSBidXQgbm90IHlldCBDb21wbGV0ZVJlYWRCdWZmZXJzKCkuCiAJCQkgKi8KLQkJ CWlmIChTdGFydEJ1ZmZlcklPKGV4aXN0aW5nX2J1Zl9oZHIsIHRydWUpKQotCQkJewotCQkJCS8q Ci0JCQkJICogSWYgd2UgZ2V0IGhlcmUsIHByZXZpb3VzIGF0dGVtcHRzIHRvIHJlYWQgdGhlIGJ1 ZmZlciBtdXN0Ci0JCQkJICogaGF2ZSBmYWlsZWQgLi4uIGJ1dCB3ZSBzaGFsbCBicmF2ZWx5IHRy eSBhZ2Fpbi4KLQkJCQkgKi8KLQkJCQkqZm91bmRQdHIgPSBmYWxzZTsKLQkJCX0KKwkJCSpmb3Vu ZFB0ciA9IGZhbHNlOwogCQl9CiAKIAkJcmV0dXJuIGV4aXN0aW5nX2J1Zl9oZHI7CkBAIC0xNDEy LDE1ICsxNTQzLDkgQEAgQnVmZmVyQWxsb2MoU01nclJlbGF0aW9uIHNtZ3IsIGNoYXIgcmVscGVy c2lzdGVuY2UsIEZvcmtOdW1iZXIgZm9ya051bSwKIAlMV0xvY2tSZWxlYXNlKG5ld1BhcnRpdGlv bkxvY2spOwogCiAJLyoKLQkgKiBCdWZmZXIgY29udGVudHMgYXJlIGN1cnJlbnRseSBpbnZhbGlk LiAgVHJ5IHRvIG9idGFpbiB0aGUgcmlnaHQgdG8KLQkgKiBzdGFydCBJL08uICBJZiBTdGFydEJ1 ZmZlcklPIHJldHVybnMgZmFsc2UsIHRoZW4gc29tZW9uZSBlbHNlIG1hbmFnZWQKLQkgKiB0byBy ZWFkIGl0IGJlZm9yZSB3ZSBkaWQsIHNvIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IGZvciBCdWZmZXJB bGxvYygpIHRvCi0JICogZG8uCisJICogQnVmZmVyIGNvbnRlbnRzIGFyZSBjdXJyZW50bHkgaW52 YWxpZC4KIAkgKi8KLQlpZiAoU3RhcnRCdWZmZXJJTyh2aWN0aW1fYnVmX2hkciwgdHJ1ZSkpCi0J CSpmb3VuZFB0ciA9IGZhbHNlOwotCWVsc2UKLQkJKmZvdW5kUHRyID0gdHJ1ZTsKKwkqZm91bmRQ dHIgPSBmYWxzZTsKIAogCXJldHVybiB2aWN0aW1fYnVmX2hkcjsKIH0KQEAgLTE3NzQsNyArMTg5 OSw3IEBAIGFnYWluOgogICogcGVzc2ltaXN0aWMsIGJ1dCBvdXRzaWRlIG9mIHRveS1zaXplZCBz aGFyZWRfYnVmZmVycyBpdCBzaG91bGQgYWxsb3cKICAqIHN1ZmZpY2llbnQgcGlucy4KICAqLwot c3RhdGljIHZvaWQKK3ZvaWQKIExpbWl0QWRkaXRpb25hbFBpbnModWludDMyICphZGRpdGlvbmFs X3BpbnMpCiB7CiAJdWludDMyCQltYXhfYmFja2VuZHM7CkBAIC0yMDQzLDcgKzIxNjgsNyBAQCBF eHRlbmRCdWZmZXJlZFJlbFNoYXJlZChCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1yLAogCiAJCQkJ YnVmX3N0YXRlICY9IH5CTV9WQUxJRDsKIAkJCQlVbmxvY2tCdWZIZHIoZXhpc3RpbmdfaGRyLCBi dWZfc3RhdGUpOwotCQkJfSB3aGlsZSAoIVN0YXJ0QnVmZmVySU8oZXhpc3RpbmdfaGRyLCB0cnVl KSk7CisJCQl9IHdoaWxlICghU3RhcnRCdWZmZXJJTyhleGlzdGluZ19oZHIsIHRydWUsIGZhbHNl KSk7CiAJCX0KIAkJZWxzZQogCQl7CkBAIC0yMDY2LDcgKzIxOTEsNyBAQCBFeHRlbmRCdWZmZXJl ZFJlbFNoYXJlZChCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1yLAogCQkJTFdMb2NrUmVsZWFzZShw YXJ0aXRpb25fbG9jayk7CiAKIAkJCS8qIFhYWDogY291bGQgY29tYmluZSB0aGUgbG9ja2VkIG9w ZXJhdGlvbnMgaW4gaXQgd2l0aCB0aGUgYWJvdmUgKi8KLQkJCVN0YXJ0QnVmZmVySU8odmljdGlt X2J1Zl9oZHIsIHRydWUpOworCQkJU3RhcnRCdWZmZXJJTyh2aWN0aW1fYnVmX2hkciwgdHJ1ZSwg ZmFsc2UpOwogCQl9CiAJfQogCkBAIC0yMzgxLDcgKzI1MDYsMTIgQEAgUGluQnVmZmVyKEJ1ZmZl ckRlc2MgKmJ1ZiwgQnVmZmVyQWNjZXNzU3RyYXRlZ3kgc3RyYXRlZ3kpCiAJZWxzZQogCXsKIAkJ LyoKLQkJICogSWYgd2UgcHJldmlvdXNseSBwaW5uZWQgdGhlIGJ1ZmZlciwgaXQgbXVzdCBzdXJl bHkgYmUgdmFsaWQuCisJCSAqIElmIHdlIHByZXZpb3VzbHkgcGlubmVkIHRoZSBidWZmZXIsIGl0 IGlzIGxpa2VseSB0byBiZSB2YWxpZCwgYnV0CisJCSAqIGl0IG1heSBub3QgYmUgaWYgUHJlcGFy ZVJlYWRCdWZmZXIoKSB3YXMgY2FsbGVkIGFuZAorCQkgKiBDb21wbGV0ZVJlYWRCdWZmZXJzKCkg aGFzbid0IGJlZW4gY2FsbGVkIHlldC4gIFdlJ2xsIGNoZWNrIGJ5CisJCSAqIGxvYWRpbmcgdGhl IGZsYWdzIHdpdGhvdXQgbG9ja2luZy4gIFRoaXMgaXMgcmFjeSwgYnV0IGl0J3MgT0sgdG8KKwkJ ICogcmV0dXJuIGZhbHNlIHNwdXJpb3VzbHk6IHdoZW4gQ29tcGxldGVSZWFkQnVmZmVycygpIGNh bGxzCisJCSAqIFN0YXJ0QnVmZmVySU8oKSwgaXQnbGwgc2VlIHRoYXQgaXQncyBub3cgdmFsaWQu CiAJCSAqCiAJCSAqIE5vdGU6IFdlIGRlbGliZXJhdGVseSBhdm9pZCBhIFZhbGdyaW5kIGNsaWVu dCByZXF1ZXN0IGhlcmUuCiAJCSAqIEluZGl2aWR1YWwgYWNjZXNzIG1ldGhvZHMgY2FuIG9wdGlv bmFsbHkgc3VwZXJpbXBvc2UgYnVmZmVyIHBhZ2UKQEAgLTIzOTAsNyArMjUyMCw3IEBAIFBpbkJ1 ZmZlcihCdWZmZXJEZXNjICpidWYsIEJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5KQogCQkg KiB0aGF0IHRoZSBidWZmZXIgcGFnZSBpcyBsZWdpdGltYXRlbHkgbm9uLWFjY2Vzc2libGUgaGVy ZS4gIFdlCiAJCSAqIGNhbm5vdCBtZWRkbGUgd2l0aCB0aGF0LgogCQkgKi8KLQkJcmVzdWx0ID0g dHJ1ZTsKKwkJcmVzdWx0ID0gKHBnX2F0b21pY19yZWFkX3UzMigmYnVmLT5zdGF0ZSkgJiBCTV9W QUxJRCkgIT0gMDsKIAl9CiAKIAlyZWYtPnJlZmNvdW50Kys7CkBAIC0zNDU4LDcgKzM1ODgsNyBA QCBGbHVzaEJ1ZmZlcihCdWZmZXJEZXNjICpidWYsIFNNZ3JSZWxhdGlvbiByZWxuLCBJT09iamVj dCBpb19vYmplY3QsCiAJICogc29tZW9uZSBlbHNlIGZsdXNoZWQgdGhlIGJ1ZmZlciBiZWZvcmUg d2UgY291bGQsIHNvIHdlIG5lZWQgbm90IGRvCiAJICogYW55dGhpbmcuCiAJICovCi0JaWYgKCFT dGFydEJ1ZmZlcklPKGJ1ZiwgZmFsc2UpKQorCWlmICghU3RhcnRCdWZmZXJJTyhidWYsIGZhbHNl LCBmYWxzZSkpCiAJCXJldHVybjsKIAogCS8qIFNldHVwIGVycm9yIHRyYWNlYmFjayBzdXBwb3J0 IGZvciBlcmVwb3J0KCkgKi8KQEAgLTQ4NDUsNiArNDk3NSw0NiBAQCBDb25kaXRpb25hbExvY2tC dWZmZXIoQnVmZmVyIGJ1ZmZlcikKIAkJCQkJCQkJCUxXX0VYQ0xVU0lWRSk7CiB9CiAKKy8qCisg KiBaZXJvIGEgYnVmZmVyLCBhbmQgbG9jayBpdCBhcyBSQk1fWkVST19BTkRfTE9DSyBvcgorICog UkJNX1pFUk9fQU5EX0NMRUFOVVBfTE9DSyB3b3VsZC4gIFRoZSBidWZmZXIgbXVzdCBiZSBhbHJl YWR5IHBpbm5lZC4gIEl0CisgKiBkb2VzIG5vdCBoYXZlIHRvIGJlIHZhbGlkLCBidXQgaXQgaXMg dmFsaWQgYW5kIGxvY2tlZCBvbiByZXR1cm4uCisgKi8KK3ZvaWQKK1plcm9CdWZmZXIoQnVmZmVy IGJ1ZmZlciwgUmVhZEJ1ZmZlck1vZGUgbW9kZSkKK3sKKwlCdWZmZXJEZXNjICpidWZIZHI7CisJ dWludDMyCQlidWZfc3RhdGU7CisKKwlBc3NlcnQobW9kZSA9PSBSQk1fWkVST19BTkRfTE9DSyB8 fCBtb2RlID09IFJCTV9aRVJPX0FORF9DTEVBTlVQX0xPQ0spOworCisJaWYgKEJ1ZmZlcklzTG9j YWwoYnVmZmVyKSkKKwkJYnVmSGRyID0gR2V0TG9jYWxCdWZmZXJEZXNjcmlwdG9yKC1idWZmZXIg LSAxKTsKKwllbHNlCisJeworCQlidWZIZHIgPSBHZXRCdWZmZXJEZXNjcmlwdG9yKGJ1ZmZlciAt IDEpOworCQlpZiAobW9kZSA9PSBSQk1fWkVST19BTkRfTE9DSykKKwkJCUxvY2tCdWZmZXIoYnVm ZmVyLCBCVUZGRVJfTE9DS19FWENMVVNJVkUpOworCQllbHNlCisJCQlMb2NrQnVmZmVyRm9yQ2xl YW51cChidWZmZXIpOworCX0KKworCW1lbXNldChCdWZmZXJHZXRQYWdlKGJ1ZmZlciksIDAsIEJM Q0tTWik7CisKKwlpZiAoQnVmZmVySXNMb2NhbChidWZmZXIpKQorCXsKKwkJYnVmX3N0YXRlID0g cGdfYXRvbWljX3JlYWRfdTMyKCZidWZIZHItPnN0YXRlKTsKKwkJYnVmX3N0YXRlIHw9IEJNX1ZB TElEOworCQlwZ19hdG9taWNfdW5sb2NrZWRfd3JpdGVfdTMyKCZidWZIZHItPnN0YXRlLCBidWZf c3RhdGUpOworCX0KKwllbHNlCisJeworCQlidWZfc3RhdGUgPSBMb2NrQnVmSGRyKGJ1Zkhkcik7 CisJCWJ1Zl9zdGF0ZSB8PSBCTV9WQUxJRDsKKwkJVW5sb2NrQnVmSGRyKGJ1ZkhkciwgYnVmX3N0 YXRlKTsKKwl9Cit9CisKIC8qCiAgKiBWZXJpZnkgdGhhdCB0aGlzIGJhY2tlbmQgaXMgcGlubmlu ZyB0aGUgYnVmZmVyIGV4YWN0bHkgb25jZS4KICAqCkBAIC01MTk3LDkgKzUzNjcsMTUgQEAgV2Fp dElPKEJ1ZmZlckRlc2MgKmJ1ZikKICAqCiAgKiBSZXR1cm5zIHRydWUgaWYgd2Ugc3VjY2Vzc2Z1 bGx5IG1hcmtlZCB0aGUgYnVmZmVyIGFzIEkvTyBidXN5LAogICogZmFsc2UgaWYgc29tZW9uZSBl bHNlIGFscmVhZHkgZGlkIHRoZSB3b3JrLgorICoKKyAqIElmIG5vd2FpdCBpcyB0cnVlLCB0aGVu IHdlIGRvbid0IHdhaXQgZm9yIGFuIEkvTyB0byBiZSBmaW5pc2hlZCBieSBhbm90aGVyCisgKiBi YWNrZW5kLiAgSW4gdGhhdCBjYXNlLCBmYWxzZSBpbmRpY2F0ZXMgZWl0aGVyIHRoYXQgdGhlIEkv TyB3YXMgYWxyZWFkeQorICogZmluaXNoZWQsIG9yIGlzIHN0aWxsIGluIHByb2dyZXNzLiAgVGhp cyBpcyB1c2VmdWwgZm9yIGNhbGxlcnMgdGhhdCB3YW50IHRvCisgKiBmaW5kIG91dCBpZiB0aGV5 IGNhbiBwZXJmb3JtIHRoZSBJL08gYXMgcGFydCBvZiBhIGxhcmdlciBvcGVyYXRpb24sIHdpdGhv dXQKKyAqIHdhaXRpbmcgZm9yIHRoZSBhbnN3ZXIgb3IgZGlzdGluZ3Vpc2hpbmcgdGhlIHJlYXNv bnMgd2h5IG5vdC4KICAqLwogc3RhdGljIGJvb2wKLVN0YXJ0QnVmZmVySU8oQnVmZmVyRGVzYyAq YnVmLCBib29sIGZvcklucHV0KQorU3RhcnRCdWZmZXJJTyhCdWZmZXJEZXNjICpidWYsIGJvb2wg Zm9ySW5wdXQsIGJvb2wgbm93YWl0KQogewogCXVpbnQzMgkJYnVmX3N0YXRlOwogCkBAIC01MjEy LDYgKzUzODgsOCBAQCBTdGFydEJ1ZmZlcklPKEJ1ZmZlckRlc2MgKmJ1ZiwgYm9vbCBmb3JJbnB1 dCkKIAkJaWYgKCEoYnVmX3N0YXRlICYgQk1fSU9fSU5fUFJPR1JFU1MpKQogCQkJYnJlYWs7CiAJ CVVubG9ja0J1ZkhkcihidWYsIGJ1Zl9zdGF0ZSk7CisJCWlmIChub3dhaXQpCisJCQlyZXR1cm4g ZmFsc2U7CiAJCVdhaXRJTyhidWYpOwogCX0KIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3Rv cmFnZS9idWZmZXIvbG9jYWxidWYuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2xvY2Fs YnVmLmMKaW5kZXggMWJlNGY0ZjhkYWYuLjcxN2I4ZjU4ZGFmIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9zdG9yYWdlL2J1ZmZlci9sb2NhbGJ1Zi5jCisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2Uv YnVmZmVyL2xvY2FsYnVmLmMKQEAgLTEwOSwxMCArMTA5LDkgQEAgUHJlZmV0Y2hMb2NhbEJ1ZmZl cihTTWdyUmVsYXRpb24gc21nciwgRm9ya051bWJlciBmb3JrTnVtLAogICogTG9jYWxCdWZmZXJB bGxvYyAtCiAgKgkgIEZpbmQgb3IgY3JlYXRlIGEgbG9jYWwgYnVmZmVyIGZvciB0aGUgZ2l2ZW4g cGFnZSBvZiB0aGUgZ2l2ZW4gcmVsYXRpb24uCiAgKgotICogQVBJIGlzIHNpbWlsYXIgdG8gYnVm bWdyLmMncyBCdWZmZXJBbGxvYywgZXhjZXB0IHRoYXQgd2UgZG8gbm90IG5lZWQKLSAqIHRvIGRv IGFueSBsb2NraW5nIHNpbmNlIHRoaXMgaXMgYWxsIGxvY2FsLiAgIEFsc28sIElPX0lOX1BST0dS RVNTCi0gKiBkb2VzIG5vdCBnZXQgc2V0LiAgTGFzdGx5LCB3ZSBzdXBwb3J0IG9ubHkgZGVmYXVs dCBhY2Nlc3Mgc3RyYXRlZ3kKLSAqIChoZW5jZSwgdXNhZ2VfY291bnQgaXMgYWx3YXlzIGFkdmFu Y2VkKS4KKyAqIEFQSSBpcyBzaW1pbGFyIHRvIGJ1Zm1nci5jJ3MgQnVmZmVyQWxsb2MsIGV4Y2Vw dCB0aGF0IHdlIGRvIG5vdCBuZWVkIHRvIGRvCisgKiBhbnkgbG9ja2luZyBzaW5jZSB0aGlzIGlz IGFsbCBsb2NhbC4gIFdlIHN1cHBvcnQgb25seSBkZWZhdWx0IGFjY2VzcworICogc3RyYXRlZ3kg KGhlbmNlLCB1c2FnZV9jb3VudCBpcyBhbHdheXMgYWR2YW5jZWQpLgogICovCiBCdWZmZXJEZXNj ICoKIExvY2FsQnVmZmVyQWxsb2MoU01nclJlbGF0aW9uIHNtZ3IsIEZvcmtOdW1iZXIgZm9ya051 bSwgQmxvY2tOdW1iZXIgYmxvY2tOdW0sCkBAIC0yODgsNyArMjg3LDcgQEAgR2V0TG9jYWxWaWN0 aW1CdWZmZXIodm9pZCkKIH0KIAogLyogc2VlIExpbWl0QWRkaXRpb25hbFBpbnMoKSAqLwotc3Rh dGljIHZvaWQKK3ZvaWQKIExpbWl0QWRkaXRpb25hbExvY2FsUGlucyh1aW50MzIgKmFkZGl0aW9u YWxfcGlucykKIHsKIAl1aW50MzIJCW1heF9waW5zOwpAQCAtMjk4LDkgKzI5NywxMCBAQCBMaW1p dEFkZGl0aW9uYWxMb2NhbFBpbnModWludDMyICphZGRpdGlvbmFsX3BpbnMpCiAKIAkvKgogCSAq IEluIGNvbnRyYXN0IHRvIExpbWl0QWRkaXRpb25hbFBpbnMoKSBvdGhlciBiYWNrZW5kcyBkb24n dCBwbGF5IGEgcm9sZQotCSAqIGhlcmUuIFdlIGNhbiBhbGxvdyB1cCB0byBOTG9jQnVmZmVyIHBp bnMgaW4gdG90YWwuCisJICogaGVyZS4gV2UgY2FuIGFsbG93IHVwIHRvIE5Mb2NCdWZmZXIgcGlu cyBpbiB0b3RhbCwgYnV0IGl0IG1pZ2h0IG5vdCBiZQorCSAqIGluaXRpYWxpemVkIHlldCBzbyBy ZWFkIG51bV90ZW1wX2J1ZmZlcnMuCiAJICovCi0JbWF4X3BpbnMgPSAoTkxvY0J1ZmZlciAtIE5M b2NhbFBpbm5lZEJ1ZmZlcnMpOworCW1heF9waW5zID0gKG51bV90ZW1wX2J1ZmZlcnMgLSBOTG9j YWxQaW5uZWRCdWZmZXJzKTsKIAogCWlmICgqYWRkaXRpb25hbF9waW5zID49IG1heF9waW5zKQog CQkqYWRkaXRpb25hbF9waW5zID0gbWF4X3BpbnM7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9z dG9yYWdlL21lc29uLmJ1aWxkIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9tZXNvbi5idWlsZAppbmRl eCA0MDM0NWJkY2EyNy4uNzM5ZDEzMjkzZmIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3Jh Z2UvbWVzb24uYnVpbGQKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9tZXNvbi5idWlsZApAQCAt MSw1ICsxLDYgQEAKICMgQ29weXJpZ2h0IChjKSAyMDIyLTIwMjQsIFBvc3RncmVTUUwgR2xvYmFs IERldmVsb3BtZW50IEdyb3VwCiAKK3N1YmRpcignYWlvJykKIHN1YmRpcignYnVmZmVyJykKIHN1 YmRpcignZmlsZScpCiBzdWJkaXIoJ2ZyZWVzcGFjZScpCmRpZmYgLS1naXQgYS9zcmMvYmFja2Vu ZC9zdG9yYWdlL3NtZ3Ivc21nci5jIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9zbWdyL3NtZ3IuYwpp bmRleCA1NjNhMGJlNWM3NC4uMGQ3MjcyZTc5NmUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0 b3JhZ2Uvc21nci9zbWdyLmMKKysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9zbWdyL3NtZ3IuYwpA QCAtMTQ3LDcgKzE0Nyw5IEBAIHNtZ3JzaHV0ZG93bihpbnQgY29kZSwgRGF0dW0gYXJnKQogLyoK ICAqIHNtZ3JvcGVuKCkgLS0gUmV0dXJuIGFuIFNNZ3JSZWxhdGlvbiBvYmplY3QsIGNyZWF0aW5n IGl0IGlmIG5lZWQgYmUuCiAgKgotICogVGhpcyBkb2VzIG5vdCBhdHRlbXB0IHRvIGFjdHVhbGx5 IG9wZW4gdGhlIHVuZGVybHlpbmcgZmlsZS4KKyAqIFRoaXMgZG9lcyBub3QgYXR0ZW1wdCB0byBh Y3R1YWxseSBvcGVuIHRoZSB1bmRlcmx5aW5nIGZpbGVzLiAgVGhlIHJldHVybmVkCisgKiBvYmpl Y3QgcmVtYWlucyB2YWxpZCBhdCBsZWFzdCB1bnRpbCBBdEVPWGFjdF9TTWdyKCkgaXMgY2FsbGVk LCBvciB1bnRpbAorICogc21ncmRlc3Ryb3koKSBpcyBjYWxsZWQgaW4gbm9uLXRyYW5zYWN0aW9u IGJhY2tlbmRzLgogICovCiBTTWdyUmVsYXRpb24KIHNtZ3JvcGVuKFJlbEZpbGVMb2NhdG9yIHJs b2NhdG9yLCBCYWNrZW5kSWQgYmFja2VuZCkKQEAgLTI1OSwxMCArMjYxLDEwIEBAIHNtZ3JleGlz dHMoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSkKIH0KIAogLyoKLSAqIHNt Z3JjbG9zZSgpIC0tIENsb3NlIGFuZCBkZWxldGUgYW4gU01nclJlbGF0aW9uIG9iamVjdC4KKyAq IHNtZ3JkZXN0cm95KCkgLS0gRGVsZXRlIGFuIFNNZ3JSZWxhdGlvbiBvYmplY3QuCiAgKi8KIHZv aWQKLXNtZ3JjbG9zZShTTWdyUmVsYXRpb24gcmVsbikKK3NtZ3JkZXN0cm95KFNNZ3JSZWxhdGlv biByZWxuKQogewogCVNNZ3JSZWxhdGlvbiAqb3duZXI7CiAJRm9ya051bWJlcglmb3JrbnVtOwpA QCAtMjg5LDEyICsyOTEsMTQgQEAgc21ncmNsb3NlKFNNZ3JSZWxhdGlvbiByZWxuKQogfQogCiAv KgotICogc21ncnJlbGVhc2UoKSAtLSBSZWxlYXNlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGlz IG9iamVjdC4KKyAqIHNtZ3JjbG9zZSgpIC0tIFJlbGVhc2UgYWxsIHJlc291cmNlcyB1c2VkIGJ5 IHRoaXMgb2JqZWN0LgogICoKLSAqIFRoZSBvYmplY3QgcmVtYWlucyB2YWxpZC4KKyAqIFRoZSBv YmplY3QgcmVtYWlucyB2YWxpZCwgYnV0IGlzIG1vdmVkIHRvIHRoZSB1bmtub3duIGxpc3Qgd2hl cmUgaXQgd2lsbAorICogYmUgZGVzdHJveWVkIGJ5IEF0RU9YYWN0X1NNZ3IoKS4gIEl0IG1heSBi ZSByZS1vd25lZCBpZiBpdCBpcyBhY2Nlc3NlZCBieSBhCisgKiByZWxhdGlvbiBiZWZvcmUgdGhl bi4KICAqLwogdm9pZAotc21ncnJlbGVhc2UoU01nclJlbGF0aW9uIHJlbG4pCitzbWdyY2xvc2Uo U01nclJlbGF0aW9uIHJlbG4pCiB7CiAJZm9yIChGb3JrTnVtYmVyIGZvcmtudW0gPSAwOyBmb3Jr bnVtIDw9IE1BWF9GT1JLTlVNOyBmb3JrbnVtKyspCiAJewpAQCAtMzAyLDE1ICszMDYsMjAgQEAg c21ncnJlbGVhc2UoU01nclJlbGF0aW9uIHJlbG4pCiAJCXJlbG4tPnNtZ3JfY2FjaGVkX25ibG9j a3NbZm9ya251bV0gPSBJbnZhbGlkQmxvY2tOdW1iZXI7CiAJfQogCXJlbG4tPnNtZ3JfdGFyZ2Js b2NrID0gSW52YWxpZEJsb2NrTnVtYmVyOworCisJaWYgKHJlbG4tPnNtZ3Jfb3duZXIpCisJewor CQkqcmVsbi0+c21ncl9vd25lciA9IE5VTEw7CisJCXJlbG4tPnNtZ3Jfb3duZXIgPSBOVUxMOwor CQlkbGlzdF9wdXNoX3RhaWwoJnVub3duZWRfcmVsbnMsICZyZWxuLT5ub2RlKTsKKwl9CiB9CiAK IC8qCi0gKiBzbWdycmVsZWFzZWFsbCgpIC0tIFJlbGVhc2UgcmVzb3VyY2VzIHVzZWQgYnkgYWxs IG9iamVjdHMuCi0gKgotICogVGhpcyBpcyBjYWxsZWQgZm9yIFBST0NTSUdOQUxfQkFSUklFUl9T TUdSUkVMRUFTRS4KKyAqIHNtZ3JjbG9zZWFsbCgpIC0tIENsb3NlIGFsbCBvYmplY3RzLgogICov CiB2b2lkCi1zbWdycmVsZWFzZWFsbCh2b2lkKQorc21ncmNsb3NlYWxsKHZvaWQpCiB7CiAJSEFT SF9TRVFfU1RBVFVTIHN0YXR1czsKIAlTTWdyUmVsYXRpb24gcmVsbjsKQEAgLTMyMiwxNCArMzMx LDE3IEBAIHNtZ3JyZWxlYXNlYWxsKHZvaWQpCiAJaGFzaF9zZXFfaW5pdCgmc3RhdHVzLCBTTWdy UmVsYXRpb25IYXNoKTsKIAogCXdoaWxlICgocmVsbiA9IChTTWdyUmVsYXRpb24pIGhhc2hfc2Vx X3NlYXJjaCgmc3RhdHVzKSkgIT0gTlVMTCkKLQkJc21ncnJlbGVhc2UocmVsbik7CisJCXNtZ3Jj bG9zZShyZWxuKTsKIH0KIAogLyoKLSAqIHNtZ3JjbG9zZWFsbCgpIC0tIENsb3NlIGFsbCBleGlz dGluZyBTTWdyUmVsYXRpb24gb2JqZWN0cy4KKyAqIHNtZ3JkZXN0cm95YWxsKCkgLS0gRGVzdHJv eSBhbGwgU01nclJlbGF0aW9uIG9iamVjdHMuCisgKgorICogSXQgbXVzdCBiZSBrbm93biB0aGF0 IHRoZXJlIGFyZSBubyBwb2ludGVycyB0byBTTWdyUmVsYXRpb25zLCBvdGhlciB0aGFuCisgKiB0 aG9zZSByZWdpc3RlcmVkIHdpdGggc21ncnNldG93bmVyKCkuCiAgKi8KIHZvaWQKLXNtZ3JjbG9z ZWFsbCh2b2lkKQorc21ncmRlc3Ryb3lhbGwodm9pZCkKIHsKIAlIQVNIX1NFUV9TVEFUVVMgc3Rh dHVzOwogCVNNZ3JSZWxhdGlvbiByZWxuOwpAQCAtMzQxLDcgKzM1Myw3IEBAIHNtZ3JjbG9zZWFs bCh2b2lkKQogCWhhc2hfc2VxX2luaXQoJnN0YXR1cywgU01nclJlbGF0aW9uSGFzaCk7CiAKIAl3 aGlsZSAoKHJlbG4gPSAoU01nclJlbGF0aW9uKSBoYXNoX3NlcV9zZWFyY2goJnN0YXR1cykpICE9 IE5VTEwpCi0JCXNtZ3JjbG9zZShyZWxuKTsKKwkJc21ncmRlc3Ryb3kocmVsbik7CiB9CiAKIC8q CkBAIC03MzMsNyArNzQ1LDggQEAgc21ncmltbWVkc3luYyhTTWdyUmVsYXRpb24gcmVsbiwgRm9y a051bWJlciBmb3JrbnVtKQogICogQXRFT1hhY3RfU01ncgogICoKICAqIFRoaXMgcm91dGluZSBp cyBjYWxsZWQgZHVyaW5nIHRyYW5zYWN0aW9uIGNvbW1pdCBvciBhYm9ydCAoaXQgZG9lc24ndAot ICogcGFydGljdWxhcmx5IGNhcmUgd2hpY2gpLiAgQWxsIHRyYW5zaWVudCBTTWdyUmVsYXRpb24g b2JqZWN0cyBhcmUgY2xvc2VkLgorICogcGFydGljdWxhcmx5IGNhcmUgd2hpY2gpLiAgQWxsIHRy YW5zaWVudCBTTWdyUmVsYXRpb24gb2JqZWN0cyBhcmUKKyAqIGRlc3Ryb3llZC4KICAqCiAgKiBX ZSBkbyB0aGlzIGFzIGEgY29tcHJvbWlzZSBiZXR3ZWVuIHdhbnRpbmcgdHJhbnNpZW50IFNNZ3JS ZWxhdGlvbnMgdG8KICAqIGxpdmUgYXdoaWxlICh0byBhbW9ydGl6ZSB0aGUgY29zdHMgb2YgYmxp bmQgd3JpdGVzIG9mIG11bHRpcGxlIGJsb2NrcykKQEAgLTc0Nyw3ICs3NjAsNyBAQCBBdEVPWGFj dF9TTWdyKHZvaWQpCiAJZGxpc3RfbXV0YWJsZV9pdGVyIGl0ZXI7CiAKIAkvKgotCSAqIFphcCBh bGwgdW5vd25lZCBTTWdyUmVsYXRpb25zLiAgV2UgcmVseSBvbiBzbWdyY2xvc2UoKSB0byByZW1v dmUgZWFjaAorCSAqIFphcCBhbGwgdW5vd25lZCBTTWdyUmVsYXRpb25zLiAgV2UgcmVseSBvbiBz bWdyZGVzdHJveSgpIHRvIHJlbW92ZSBlYWNoCiAJICogb25lIGZyb20gdGhlIGxpc3QuCiAJICov CiAJZGxpc3RfZm9yZWFjaF9tb2RpZnkoaXRlciwgJnVub3duZWRfcmVsbnMpCkBAIC03NTcsNyAr NzcwLDcgQEAgQXRFT1hhY3RfU01ncih2b2lkKQogCiAJCUFzc2VydChyZWwtPnNtZ3Jfb3duZXIg PT0gTlVMTCk7CiAKLQkJc21ncmNsb3NlKHJlbCk7CisJCXNtZ3JkZXN0cm95KHJlbCk7CiAJfQog fQogCkBAIC03NjgsNiArNzgxLDYgQEAgQXRFT1hhY3RfU01ncih2b2lkKQogYm9vbAogUHJvY2Vz c0JhcnJpZXJTbWdyUmVsZWFzZSh2b2lkKQogewotCXNtZ3JyZWxlYXNlYWxsKCk7CisJc21ncmNs b3NlYWxsKCk7CiAJcmV0dXJuIHRydWU7CiB9CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9y YWdlL2J1Zm1nci5oIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZtZ3IuaAppbmRleCBkNTFkNDZk MzM1My4uYTM4ZjFhY2IzN2EgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3N0b3JhZ2UvYnVmbWdy LmgKKysrIGIvc3JjL2luY2x1ZGUvc3RvcmFnZS9idWZtZ3IuaApAQCAtMTQsNiArMTQsNyBAQAog I2lmbmRlZiBCVUZNR1JfSAogI2RlZmluZSBCVUZNR1JfSAogCisjaW5jbHVkZSAicG9ydC9wZ19p b3ZlYy5oIgogI2luY2x1ZGUgInN0b3JhZ2UvYmxvY2suaCIKICNpbmNsdWRlICJzdG9yYWdlL2J1 Zi5oIgogI2luY2x1ZGUgInN0b3JhZ2UvYnVmcGFnZS5oIgpAQCAtMTU4LDYgKzE1OSwxMSBAQCBl eHRlcm4gUEdETExJTVBPUlQgaW50MzIgKkxvY2FsUmVmQ291bnQ7CiAjZGVmaW5lIEJVRkZFUl9M T0NLX1NIQVJFCQkxCiAjZGVmaW5lIEJVRkZFUl9MT0NLX0VYQ0xVU0lWRQkyCiAKKy8qCisgKiBN YXhpbXVtIG51bWJlciBvZiBidWZmZXJzIGZvciBtdWx0aS1idWZmZXIgSS9PIGZ1bmN0aW9ucy4g IFRoaXMgaXMgc2V0IHRvCisgKiBhbGxvdyAxMjhrQiB0cmFuc2ZlcnMsIHVubGVzcyBCTENLU1og YW5kIElPVl9NQVggaW1wbHkgYSBhIHNtYWxsZXIgbWF4aW11bS4KKyAqLworI2RlZmluZSBNQVhf QlVGRkVSU19QRVJfVFJBTlNGRVIgTWluKFBHX0lPVl9NQVgsICgxMjggKiAxMDI0KSAvIEJMQ0tT WikKIAogLyoKICAqIHByb3RvdHlwZXMgZm9yIGZ1bmN0aW9ucyBpbiBidWZtZ3IuYwpAQCAtMTc3 LDYgKzE4MywxOCBAQCBleHRlcm4gQnVmZmVyIFJlYWRCdWZmZXJXaXRob3V0UmVsY2FjaGUoUmVs RmlsZUxvY2F0b3IgcmxvY2F0b3IsCiAJCQkJCQkJCQkJRm9ya051bWJlciBmb3JrTnVtLCBCbG9j a051bWJlciBibG9ja051bSwKIAkJCQkJCQkJCQlSZWFkQnVmZmVyTW9kZSBtb2RlLCBCdWZmZXJB Y2Nlc3NTdHJhdGVneSBzdHJhdGVneSwKIAkJCQkJCQkJCQlib29sIHBlcm1hbmVudCk7CitleHRl cm4gQnVmZmVyIFByZXBhcmVSZWFkQnVmZmVyKEJ1ZmZlck1hbmFnZXJSZWxhdGlvbiBibXIsCisJ CQkJCQkJCUZvcmtOdW1iZXIgZm9ya051bSwKKwkJCQkJCQkJQmxvY2tOdW1iZXIgYmxvY2tOdW0s CisJCQkJCQkJCUJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5LAorCQkJCQkJCQlib29sICpm b3VuZFB0cik7CitleHRlcm4gdm9pZCBDb21wbGV0ZVJlYWRCdWZmZXJzKEJ1ZmZlck1hbmFnZXJS ZWxhdGlvbiBibXIsCisJCQkJCQkJCUJ1ZmZlciAqYnVmZmVycywKKwkJCQkJCQkJRm9ya051bWJl ciBmb3JrbnVtLAorCQkJCQkJCQlCbG9ja051bWJlciBibG9ja251bSwKKwkJCQkJCQkJaW50IG5i bG9ja3MsCisJCQkJCQkJCWJvb2wgemVyb19vbl9lcnJvciwKKwkJCQkJCQkJQnVmZmVyQWNjZXNz U3RyYXRlZ3kgc3RyYXRlZ3kpOwogZXh0ZXJuIHZvaWQgUmVsZWFzZUJ1ZmZlcihCdWZmZXIgYnVm ZmVyKTsKIGV4dGVybiB2b2lkIFVubG9ja1JlbGVhc2VCdWZmZXIoQnVmZmVyIGJ1ZmZlcik7CiBl eHRlcm4gYm9vbCBCdWZmZXJJc0V4Y2x1c2l2ZUxvY2tlZChCdWZmZXIgYnVmZmVyKTsKQEAgLTI0 Nyw5ICsyNjUsMTMgQEAgZXh0ZXJuIHZvaWQgTG9ja0J1ZmZlckZvckNsZWFudXAoQnVmZmVyIGJ1 ZmZlcik7CiBleHRlcm4gYm9vbCBDb25kaXRpb25hbExvY2tCdWZmZXJGb3JDbGVhbnVwKEJ1ZmZl ciBidWZmZXIpOwogZXh0ZXJuIGJvb2wgSXNCdWZmZXJDbGVhbnVwT0soQnVmZmVyIGJ1ZmZlcik7 CiBleHRlcm4gYm9vbCBIb2xkaW5nQnVmZmVyUGluVGhhdERlbGF5c1JlY292ZXJ5KHZvaWQpOwor ZXh0ZXJuIHZvaWQgWmVyb0J1ZmZlcihCdWZmZXIgYnVmZmVyLCBSZWFkQnVmZmVyTW9kZSBtb2Rl KTsKIAogZXh0ZXJuIGJvb2wgQmdCdWZmZXJTeW5jKHN0cnVjdCBXcml0ZWJhY2tDb250ZXh0ICp3 Yl9jb250ZXh0KTsKIAorZXh0ZXJuIHZvaWQgTGltaXRBZGRpdGlvbmFsUGlucyh1aW50MzIgKmFk ZGl0aW9uYWxfcGlucyk7CitleHRlcm4gdm9pZCBMaW1pdEFkZGl0aW9uYWxMb2NhbFBpbnModWlu dDMyICphZGRpdGlvbmFsX3BpbnMpOworCiAvKiBpbiBidWZfaW5pdC5jICovCiBleHRlcm4gdm9p ZCBJbml0QnVmZmVyUG9vbCh2b2lkKTsKIGV4dGVybiBTaXplIEJ1ZmZlclNobWVtU2l6ZSh2b2lk KTsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc21nci5oIGIvc3JjL2luY2x1ZGUv c3RvcmFnZS9zbWdyLmgKaW5kZXggNTI3Y2QyYTA1NjguLmQ4ZmZlMzk3ZmFmIDEwMDY0NAotLS0g YS9zcmMvaW5jbHVkZS9zdG9yYWdlL3NtZ3IuaAorKysgYi9zcmMvaW5jbHVkZS9zdG9yYWdlL3Nt Z3IuaApAQCAtODUsOCArODUsOCBAQCBleHRlcm4gdm9pZCBzbWdyY2xlYXJvd25lcihTTWdyUmVs YXRpb24gKm93bmVyLCBTTWdyUmVsYXRpb24gcmVsbik7CiBleHRlcm4gdm9pZCBzbWdyY2xvc2Uo U01nclJlbGF0aW9uIHJlbG4pOwogZXh0ZXJuIHZvaWQgc21ncmNsb3NlYWxsKHZvaWQpOwogZXh0 ZXJuIHZvaWQgc21ncmNsb3NlcmVsbG9jYXRvcihSZWxGaWxlTG9jYXRvckJhY2tlbmQgcmxvY2F0 b3IpOwotZXh0ZXJuIHZvaWQgc21ncnJlbGVhc2UoU01nclJlbGF0aW9uIHJlbG4pOwotZXh0ZXJu IHZvaWQgc21ncnJlbGVhc2VhbGwodm9pZCk7CitleHRlcm4gdm9pZCBzbWdyZGVzdHJveShTTWdy UmVsYXRpb24gcmVsbik7CitleHRlcm4gdm9pZCBzbWdyZGVzdHJveWFsbCh2b2lkKTsKIGV4dGVy biB2b2lkIHNtZ3JjcmVhdGUoU01nclJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya251bSwg Ym9vbCBpc1JlZG8pOwogZXh0ZXJuIHZvaWQgc21ncmRvc3luY2FsbChTTWdyUmVsYXRpb24gKnJl bHMsIGludCBucmVscyk7CiBleHRlcm4gdm9pZCBzbWdyZG91bmxpbmthbGwoU01nclJlbGF0aW9u ICpyZWxzLCBpbnQgbnJlbHMsIGJvb2wgaXNSZWRvKTsKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRl L3N0b3JhZ2Uvc3RyZWFtaW5nX3JlYWQuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc3RyZWFtaW5n X3JlYWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNDBjMzQwOGM1 NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaW5jbHVkZS9zdG9yYWdlL3N0cmVhbWluZ19yZWFk LmgKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBTVFJFQU1JTkdfUkVBRF9ICisjZGVmaW5lIFNU UkVBTUlOR19SRUFEX0gKKworI2luY2x1ZGUgInN0b3JhZ2UvYnVmbWdyLmgiCisjaW5jbHVkZSAi c3RvcmFnZS9mZC5oIgorI2luY2x1ZGUgInN0b3JhZ2Uvc21nci5oIgorCisvKiBEZWZhdWx0IHR1 bmluZywgcmVhc29uYWJsZSBmb3IgbWFueSB1c2Vycy4gKi8KKyNkZWZpbmUgUEdTUl9GTEFHX0RF RkFVTFQgMHgwMAorCisvKgorICogSS9PIHN0cmVhbXMgdGhhdCBhcmUgcGVyZm9ybWluZyBtYWlu dGVuYW5jZSB3b3JrIG9uIGJlaGFsZiBvZiBwb3RlbnRpYWxseQorICogbWFueSB1c2Vycy4KKyAq LworI2RlZmluZSBQR1NSX0ZMQUdfTUFJTlRFTkFOQ0UgMHgwMQorCisvKgorICogV2UgdXN1YWxs eSBhdm9pZCBpc3N1aW5nIHByZWZldGNoIGFkdmljZSBhdXRvbWF0aWNhbGx5IHdoZW4gc2VxdWVu dGlhbAorICogYWNjZXNzIGlzIGRldGVjdGVkLCBidXQgdGhpcyBmbGFnIGV4cGxpY2l0bHkgZGlz YWJsZXMgaXQsIGZvciBjYXNlcyB0aGF0CisgKiBtaWdodCBub3QgYmUgY29ycmVjdGx5IGRldGVj dGVkLiAgRXhwbGljaXQgYWR2aWNlIGlzIGtub3duIHRvIHBlcmZvcm0gd29yc2UKKyAqIHRoYW4g bGV0dGluZyB0aGUga2VybmVsIChhdCBsZWFzdCBMaW51eCkgZGV0ZWN0IHNlcXVlbnRpYWwgYWNj ZXNzLgorICovCisjZGVmaW5lIFBHU1JfRkxBR19TRVFVRU5USUFMIDB4MDIKKworc3RydWN0IFBn U3RyZWFtaW5nUmVhZDsKK3R5cGVkZWYgc3RydWN0IFBnU3RyZWFtaW5nUmVhZCBQZ1N0cmVhbWlu Z1JlYWQ7CisKKy8qIENhbGxiYWNrIHRoYXQgcmV0dXJucyB0aGUgbmV4dCBibG9jayBudW1iZXIg dG8gcmVhZC4gKi8KK3R5cGVkZWYgQmxvY2tOdW1iZXIgKCpQZ1N0cmVhbWluZ1JlYWRCdWZmZXJD QikgKFBnU3RyZWFtaW5nUmVhZCAqcGdzciwKKwkJCQkJCQkJCQkJCXZvaWQgKnBnc3JfcHJpdmF0 ZSwKKwkJCQkJCQkJCQkJCXZvaWQgKnBlcl9idWZmZXJfcHJpdmF0ZSk7CisKK2V4dGVybiBQZ1N0 cmVhbWluZ1JlYWQgKnBnX3N0cmVhbWluZ19yZWFkX2J1ZmZlcl9hbGxvYyhpbnQgZmxhZ3MsCisJ CQkJCQkJCQkJCQkJICAgdm9pZCAqcGdzcl9wcml2YXRlLAorCQkJCQkJCQkJCQkJCSAgIHNpemVf dCBwZXJfYnVmZmVyX3ByaXZhdGVfc2l6ZSwKKwkJCQkJCQkJCQkJCQkgICBCdWZmZXJBY2Nlc3NT dHJhdGVneSBzdHJhdGVneSwKKwkJCQkJCQkJCQkJCQkgICBCdWZmZXJNYW5hZ2VyUmVsYXRpb24g Ym1yLAorCQkJCQkJCQkJCQkJCSAgIEZvcmtOdW1iZXIgZm9ya251bSwKKwkJCQkJCQkJCQkJCQkg ICBQZ1N0cmVhbWluZ1JlYWRCdWZmZXJDQiBuZXh0X2Jsb2NrX2NiKTsKKworZXh0ZXJuIHZvaWQg cGdfc3RyZWFtaW5nX3JlYWRfcHJlZmV0Y2goUGdTdHJlYW1pbmdSZWFkICpwZ3NyKTsKK2V4dGVy biBCdWZmZXIgcGdfc3RyZWFtaW5nX3JlYWRfYnVmZmVyX2dldF9uZXh0KFBnU3RyZWFtaW5nUmVh ZCAqcGdzciwgdm9pZCAqKnBlcl9idWZmZXJfcHJpdmF0ZSk7CitleHRlcm4gdm9pZCBwZ19zdHJl YW1pbmdfcmVhZF9mcmVlKFBnU3RyZWFtaW5nUmVhZCAqcGdzcik7CisKKyNlbmRpZgpkaWZmIC0t Z2l0IGEvc3JjL2luY2x1ZGUvdXRpbHMvcmVsLmggYi9zcmMvaW5jbHVkZS91dGlscy9yZWwuaApp bmRleCBhNTg0YjFkZGZmMy4uNjYzNmNjODJjMDkgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3V0 aWxzL3JlbC5oCisrKyBiL3NyYy9pbmNsdWRlL3V0aWxzL3JlbC5oCkBAIC01NjEsMTIgKzU2MSw2 IEBAIHR5cGVkZWYgc3RydWN0IFZpZXdPcHRpb25zCiAgKgogICogVmVyeSBsaXR0bGUgY29kZSBp cyBhdXRob3JpemVkIHRvIHRvdWNoIHJlbC0+cmRfc21nciBkaXJlY3RseS4gIEluc3RlYWQKICAq IHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGZldGNoIGl0cyB2YWx1ZS4KLSAqCi0gKiBOb3RlOiBzaW5j ZSBhIHJlbGNhY2hlIGZsdXNoIGNhbiBjYXVzZSB0aGUgZmlsZSBoYW5kbGUgdG8gYmUgY2xvc2Vk IGFnYWluLAotICogaXQncyB1bndpc2UgdG8gaG9sZCBvbnRvIHRoZSBwb2ludGVyIHJldHVybmVk IGJ5IHRoaXMgZnVuY3Rpb24gZm9yIGFueQotICogbG9uZyBwZXJpb2QuICBSZWNvbW1lbmRlZCBw cmFjdGljZSBpcyB0byBqdXN0IHJlLWV4ZWN1dGUgUmVsYXRpb25HZXRTbWdyCi0gKiBlYWNoIHRp bWUgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSBTTWdyUmVsYXRpb24uICBJdCdzIHF1aXRlIGNoZWFw IGluCi0gKiBjb21wYXJpc29uIHRvIHdoYXRldmVyIGFuIHNtZ3IgZnVuY3Rpb24gaXMgZ29pbmcg dG8gZG8uCiAgKi8KIHN0YXRpYyBpbmxpbmUgU01nclJlbGF0aW9uCiBSZWxhdGlvbkdldFNtZ3Io UmVsYXRpb24gcmVsKQpkaWZmIC0tZ2l0IGEvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxp c3QgYi9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdAppbmRleCAyOWZkMWNhZTY0MS4u MDE4ZWJiY2JhYWUgMTAwNjQ0Ci0tLSBhL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0 CisrKyBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CkBAIC0yMDg5LDYgKzIwODks OCBAQCBQZ1N0YXRfVGFibGVDb3VudHMKIFBnU3RhdF9UYWJsZVN0YXR1cwogUGdTdGF0X1RhYmxl WGFjdFN0YXR1cwogUGdTdGF0X1dhbFN0YXRzCitQZ1N0cmVhbWluZ1JlYWQKK1BnU3RyZWFtaW5n UmVhZFJhbmdlCiBQZ1htbEVycm9yQ29udGV4dAogUGdYbWxTdHJpY3RuZXNzCiBQZ19maW5mb19y ZWNvcmQKLS0gCjIuMzcuMgoK --00000000000017546f060f53609e--