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 1rSRUZ-00Dn6X-Jp for pgsql-hackers@arkaria.postgresql.org; Wed, 24 Jan 2024 00:51:48 +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 1rSRUY-000azA-Ak for pgsql-hackers@arkaria.postgresql.org; Wed, 24 Jan 2024 00:51:46 +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 1rSRUX-000az1-Sc for pgsql-hackers@lists.postgresql.org; Wed, 24 Jan 2024 00:51:46 +0000 Received: from mail-oi1-x229.google.com ([2607:f8b0:4864:20::229]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1rSRUQ-003O0o-JP for pgsql-hackers@lists.postgresql.org; Wed, 24 Jan 2024 00:51:44 +0000 Received: by mail-oi1-x229.google.com with SMTP id 5614622812f47-3bba50cd318so4800519b6e.0 for ; Tue, 23 Jan 2024 16:51:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1706057496; x=1706662296; 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=N6C4bNddwYwZwPD0gKTaR+aZT9cxI1LajLq0xZHdHLU=; b=XYBXcCxH1ulwp2ctlyGuXARikKy3/mcgcCUs7kkH/hay65wa8Tvp9WsNJu1mIzcEjV zCV0SQ+UoEQw/A1aLK5aDxOYRHIs3cE9TTPKJ14ZY3TyvMlJFcOf30k5YrxWWpxatTWI yY9XAEzfSfbBdxxz7FTbjEwMEzG9G9aS3lF40yZsL9Kp1JW0w4U8xfhkyaHsZPV4x3H+ EUU3kfvQenGLwkzUd4JqCvnF0PhmEZzaAXsIRbGd812ryhL5gTBFwGJqQOuijA4dykd3 D2GCwbm9a2OnzLXyQMtjVOV7mF37F5k5PRXpqu/lDNtVyPVTbxIswd4CO14Otkj920u+ g0YQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1706057496; x=1706662296; 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=N6C4bNddwYwZwPD0gKTaR+aZT9cxI1LajLq0xZHdHLU=; b=XuEepduDeBL+Hr4UoL7+EMkM1MGOQvtOwM7bKMOLT6G2cbR3hauCRcrl+i4MQRy7sh t7xS50ZS6QCnjzX95FKvVy+aAItmhMJ2twxRwXhGm2l1amxWJgnnAA69NIa7hu8MA4hH gg0kBYAQhlrrOWxWIVa+qCAiuoF0gmGPj/qp0yOatyVYUWzYpfB0/OjwFzCq0BFd0rvS XUpQ1rSfoq04Wz2AAJn6o5jdUZQINXamdAvsqUqxO+5nohpwn8Ci94VeWs6PHYkaA7in VqLBSMCeom5gKv4aif4V6zhZbmxUtZifX86kMcUnZ8Hb68R7kjItt8u/xrDkdbZX63hx Cwaw== X-Gm-Message-State: AOJu0Yx8vNmccghswYQdkjG/bXlLuCMawPwlGStxPcfWJD/0epyimusL /hFuOmrQ0AUNZen10xuexaguXvXoHqxhlcfti+thSIujFWk6H1f/BMkjxq/EsVfg6tasDOyIySq oUBq62u/fb0MBvyIBa+P0JsQeB6o= X-Google-Smtp-Source: AGHT+IHxtCxIxxJauEvvi8nwLhKqFlJGrlsk+IqtthoXB9vxZmF+kZ5l9IDCnG6BGV6zZw3/xIcjctEFeSKdBmHmHko= X-Received: by 2002:a05:6808:1406:b0:3bd:3a12:1be4 with SMTP id w6-20020a056808140600b003bd3a121be4mr953142oiv.119.1706057496456; Tue, 23 Jan 2024 16:51:36 -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> <56176b8d-956c-487e-ab09-310db4581c07@enterprisedb.com> In-Reply-To: <56176b8d-956c-487e-ab09-310db4581c07@enterprisedb.com> From: Melanie Plageman Date: Tue, 23 Jan 2024 19:51:24 -0500 Message-ID: Subject: Re: index prefetching To: Tomas Vondra Cc: Robert Haas , Andres Freund , PostgreSQL Hackers , Georgios Content-Type: multipart/mixed; boundary="0000000000000bc4a7060fa6776b" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000000bc4a7060fa6776b Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Tue, Jan 23, 2024 at 12:43=E2=80=AFPM Tomas Vondra wrote: > > On 1/19/24 22:43, Melanie Plageman wrote: > > > 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. > > So in a way there are two queues in IndexFetchTableData. One (blk_queue) > is being filled from IndexNext, and then the queue in StreamingRead. I've changed the name from blk_queue to tid_queue to fix the issue you mention in your later remarks. I suppose there are two queues. The tid_queue is just to pass the block requests to the streaming read API. The prefetch distance will be the smaller of the two sizes. > > 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. > > Hmm, not sure when can the callback return InvalidBlockNumber before > reaching the end. Perhaps for the first index_fetch_heap call? Any > reason not to fill the blk_queue before calling index_fetch_heap? The callback will return InvalidBlockNumber whenever the queue is empty. Let's say your queue size is 5 and your effective prefetch distance is 10 (some combination of the PgStreamingReadRange sizes and PgStreamingRead->max_ios). The first time you call index_fetch_heap(), the callback returns InvalidBlockNumber. Then the tid_queue is filled with 5 tids. Then index_fetch_heap() is called. pg_streaming_read_look_ahead() will prefetch all 5 of these TID's blocks, emptying the queue. Once all 5 have been dequeued, the callback will return InvalidBlockNumber. pg_streaming_read_buffer_get_next() will return one of the 5 blocks in a buffer and save the associated TID in the per_buffer_data. Before index_fetch_heap() is called again, we will see that the queue is not full and fill it up again with 5 TIDs. So, the callback will return InvalidBlockNumber 3 times in this scenario. > > 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. > > And is that a good/desirable change? I'm not saying it's not, but maybe > we should not be filling either queue in one go - we don't want to > overload the prefetching. We can focus on the prefetch distance algorithm maintained in the streaming read API and then make sure that the tid_queue is larger than the desired prefetch distance maintained by the streaming read API. > > 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. > > I don't understand how this passes the TID to the index_fetch_heap. > Isn't it working only by accident, due to blk_queue only having a single > entry? Shouldn't the first queue (blk_queue) store TIDs instead? Oh dear! Fixed in the attached v2. I've replaced the single BlockNumber with a single ItemPointerData. I will work on implementing an actual queue next week. > > 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? > > It seems workable, yes. I'm not sure it's much simpler than my patch > (considering a lot of the code is in the optimizations, which are > missing from this patch). > > I think the question is where should the optimizations happen. I suppose > some of them might/should happen in the StreamingRead API itself - like > the detection of sequential patterns, recently prefetched blocks, ... So, the streaming read API does detection of sequential patterns and not prefetching things that are in shared buffers. It doesn't handle avoiding prefetching recently prefetched blocks yet AFAIK. But I daresay this would be relevant for other streaming read users and could certainly be implemented there. > But I'm not sure what to do about optimizations that are more specific > to the access path. Consider for example the index-only scans. We don't > want to prefetch all the pages, we need to inspect the VM and prefetch > just the not-all-visible ones. And then pass the info to the index scan, > so that it does not need to check the VM again. It's not clear to me how > to do this with this approach. Yea, this is an issue I'll need to think about. To really spell out the problem: the callback dequeues a TID from the tid_queue and looks up its block in the VM. It's all visible. So, it shouldn't return that block to the streaming read API to fetch from the heap because it doesn't need to be read. But, where does the callback put the TID so that the caller can get it? I'm going to think more about this. As for passing around the all visible status so as to not reread the VM block -- that feels solvable but I haven't looked into it. - Melanie --0000000000000bc4a7060fa6776b Content-Type: application/octet-stream; name="v2-0002-use-streaming-reads-in-index-scan.nocfbot" Content-Disposition: attachment; filename="v2-0002-use-streaming-reads-in-index-scan.nocfbot" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lrr2j9pd1 RnJvbSBkZTA5OWI4ZTdmNWU3NDY5Y2ExOTllMDAxYTFkOTY1ZmYzODhjN2RjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBNZWxhbmllIFBsYWdlbWFuIDxtZWxhbmllcGxhZ2VtYW5AZ21h aWwuY29tPgpEYXRlOiBGcmksIDE5IEphbiAyMDI0IDE2OjEwOjMwIC0wNTAwClN1YmplY3Q6IFtQ QVRDSCB2MiAyLzJdIHVzZSBzdHJlYW1pbmcgcmVhZHMgaW4gaW5kZXggc2NhbgoKY2ktb3Mtb25s eToKLS0tCiBzcmMvYmFja2VuZC9hY2Nlc3MvaGVhcC9oZWFwYW1faGFuZGxlci5jIHwgMTQgKysr LQogc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0uYyAgICAgICB8ICAzICsKIHNyYy9i YWNrZW5kL2V4ZWN1dG9yL25vZGVJbmRleHNjYW4uYyAgICAgfCA5MiArKysrKysrKysrKysrKysr KysrKy0tLS0KIHNyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL3N0cmVhbWluZ19yZWFkLmMgfCAxMCAr Ky0KIHNyYy9pbmNsdWRlL2FjY2Vzcy9yZWxzY2FuLmggICAgICAgICAgICAgfCAgNiArKwogc3Jj L2luY2x1ZGUvc3RvcmFnZS9zdHJlYW1pbmdfcmVhZC5oICAgICB8ICAyICsKIDYgZmlsZXMgY2hh bmdlZCwgMTExIGluc2VydGlvbnMoKyksIDE2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBhbV9oYW5kbGVyLmMgYi9zcmMvYmFja2VuZC9hY2Nl c3MvaGVhcC9oZWFwYW1faGFuZGxlci5jCmluZGV4IGQxNWEwMmIyYmUuLjI0M2JiMTk4MDMgMTAw NjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy9oZWFwL2hlYXBhbV9oYW5kbGVyLmMKKysrIGIv c3JjL2JhY2tlbmQvYWNjZXNzL2hlYXAvaGVhcGFtX2hhbmRsZXIuYwpAQCAtMTI3LDkgKzEyNywx NyBAQCBoZWFwYW1faW5kZXhfZmV0Y2hfdHVwbGUoc3RydWN0IEluZGV4RmV0Y2hUYWJsZURhdGEg KnNjYW4sCiAJCS8qIFN3aXRjaCB0byBjb3JyZWN0IGJ1ZmZlciBpZiB3ZSBkb24ndCBoYXZlIGl0 IGFscmVhZHkgKi8KIAkJQnVmZmVyCQlwcmV2X2J1ZiA9IGhzY2FuLT54c19jYnVmOwogCi0JCWhz Y2FuLT54c19jYnVmID0gUmVsZWFzZUFuZFJlYWRCdWZmZXIoaHNjYW4tPnhzX2NidWYsCi0JCQkJ CQkJCQkJCSAgaHNjYW4tPnhzX2Jhc2UucmVsLAotCQkJCQkJCQkJCQkgIEl0ZW1Qb2ludGVyR2V0 QmxvY2tOdW1iZXIodGlkKSk7CisJCWlmIChzY2FuLT5wZ3NyKQorCQl7CisJCQloc2Nhbi0+eHNf Y2J1ZiA9IHBnX3N0cmVhbWluZ19yZWFkX2J1ZmZlcl9nZXRfbmV4dChzY2FuLT5wZ3NyLCAodm9p ZCAqKikgJnRpZCk7CisJCQlpZiAoIUJ1ZmZlcklzVmFsaWQoaHNjYW4tPnhzX2NidWYpKQorCQkJ CXJldHVybiBmYWxzZTsKKwkJfQorCQllbHNlCisJCQloc2Nhbi0+eHNfY2J1ZiA9IFJlbGVhc2VB bmRSZWFkQnVmZmVyKGhzY2FuLT54c19jYnVmLAorCQkJCQkJCQkJCQkJCWhzY2FuLT54c19iYXNl LnJlbCwKKwkJCQkJCQkJCQkJCQlJdGVtUG9pbnRlckdldEJsb2NrTnVtYmVyKHRpZCkpOworCiAK IAkJLyoKIAkJICogUHJ1bmUgcGFnZSwgYnV0IG9ubHkgaWYgd2Ugd2VyZW4ndCBhbHJlYWR5IG9u IHRoaXMgcGFnZQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0u YyBiL3NyYy9iYWNrZW5kL2FjY2Vzcy9pbmRleC9pbmRleGFtLmMKaW5kZXggNjNkZmYxMDFlMi4u YTMwZTY0ZjhmYSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvYWNjZXNzL2luZGV4L2luZGV4YW0u YworKysgYi9zcmMvYmFja2VuZC9hY2Nlc3MvaW5kZXgvaW5kZXhhbS5jCkBAIC0yMzYsNyArMjM2 LDEwIEBAIGluZGV4X2JlZ2luc2NhbihSZWxhdGlvbiBoZWFwUmVsYXRpb24sCiAJc2Nhbi0+eHNf c25hcHNob3QgPSBzbmFwc2hvdDsKIAogCS8qIHByZXBhcmUgdG8gZmV0Y2ggaW5kZXggbWF0Y2hl cyBmcm9tIHRhYmxlICovCisJc2Nhbi0+aW5kZXhfZG9uZSA9IGZhbHNlOwogCXNjYW4tPnhzX2hl YXBmZXRjaCA9IHRhYmxlX2luZGV4X2ZldGNoX2JlZ2luKGhlYXBSZWxhdGlvbik7CisJSXRlbVBv aW50ZXJTZXQoJnNjYW4tPnhzX2hlYXBmZXRjaC0+dGlkX3F1ZXVlLCBJbnZhbGlkQmxvY2tOdW1i ZXIsCisJCQlJbnZhbGlkT2Zmc2V0TnVtYmVyKTsKIAogCXJldHVybiBzY2FuOwogfQpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9kZUluZGV4c2Nhbi5jIGIvc3JjL2JhY2tlbmQv ZXhlY3V0b3Ivbm9kZUluZGV4c2Nhbi5jCmluZGV4IDAzMTQyYjRhOTQuLmMzYTJmYWJkMDEgMTAw NjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVJbmRleHNjYW4uYworKysgYi9zcmMv YmFja2VuZC9leGVjdXRvci9ub2RlSW5kZXhzY2FuLmMKQEAgLTc3LDYgKzc3LDQyIEBAIHN0YXRp YyBIZWFwVHVwbGUgcmVvcmRlcnF1ZXVlX3BvcChJbmRleFNjYW5TdGF0ZSAqbm9kZSk7CiAgKgkJ dXNpbmcgdGhlIGluZGV4IHNwZWNpZmllZCBpbiB0aGUgSW5kZXhTY2FuU3RhdGUgaW5mb3JtYXRp b24uCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCiAgKi8KKworI2RlZmluZSBRVUVVRV9GVUxMKHRpZF9xdWV1ZSkgKEl0 ZW1Qb2ludGVySXNWYWxpZCh0aWRfcXVldWUpKQorCitzdGF0aWMgdm9pZAordGlkX2VucXVldWUo SXRlbVBvaW50ZXIgdGlkLCBJdGVtUG9pbnRlciB0aWRfcXVldWUpCit7CisJQXNzZXJ0KCFJdGVt UG9pbnRlcklzVmFsaWQodGlkX3F1ZXVlKSk7CisKKwlJdGVtUG9pbnRlclNldCh0aWRfcXVldWUs IEl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIodGlkKSwKKwkJCUl0ZW1Qb2ludGVyR2V0T2Zmc2V0 TnVtYmVyKHRpZCkpOworfQorCitzdGF0aWMgSXRlbVBvaW50ZXJEYXRhCit0aWRfZGVxdWV1ZShJ dGVtUG9pbnRlciB0aWRfcXVldWUpCit7CisJSXRlbVBvaW50ZXJEYXRhIHJlc3VsdCA9ICp0aWRf cXVldWU7CisJSXRlbVBvaW50ZXJTZXQodGlkX3F1ZXVlLCBJbnZhbGlkQmxvY2tOdW1iZXIsIElu dmFsaWRPZmZzZXROdW1iZXIpOworCXJldHVybiByZXN1bHQ7Cit9CisKKworc3RhdGljIEJsb2Nr TnVtYmVyCitpbmRleF9wZ3NyX25leHRfc2luZ2xlKFBnU3RyZWFtaW5nUmVhZCAqcGdzciwgdm9p ZCAqcGdzcl9wcml2YXRlLCB2b2lkICpwZXJfYnVmZmVyX2RhdGEpCit7CisJSW5kZXhGZXRjaFRh YmxlRGF0YSAqc2NhbiA9IChJbmRleEZldGNoVGFibGVEYXRhICopIHBnc3JfcHJpdmF0ZTsKKwlJ dGVtUG9pbnRlckRhdGEgZGF0YSA9IHRpZF9kZXF1ZXVlKCZzY2FuLT50aWRfcXVldWUpOworCisJ SXRlbVBvaW50ZXIgZGVzdCA9IHBlcl9idWZmZXJfZGF0YTsKKwkqZGVzdCA9IGRhdGE7CisKKwlp ZiAoIUl0ZW1Qb2ludGVySXNWYWxpZCgmZGF0YSkpCisJCXJldHVybiBJbnZhbGlkQmxvY2tOdW1i ZXI7CisJcmV0dXJuIEl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIoJmRhdGEpOworfQorCisKIHN0 YXRpYyBUdXBsZVRhYmxlU2xvdCAqCiBJbmRleE5leHQoSW5kZXhTY2FuU3RhdGUgKm5vZGUpCiB7 CkBAIC0xMjMsMzEgKzE1OSw2MyBAQCBJbmRleE5leHQoSW5kZXhTY2FuU3RhdGUgKm5vZGUpCiAJ CQlpbmRleF9yZXNjYW4oc2NhbmRlc2MsCiAJCQkJCQkgbm9kZS0+aXNzX1NjYW5LZXlzLCBub2Rl LT5pc3NfTnVtU2NhbktleXMsCiAJCQkJCQkgbm9kZS0+aXNzX09yZGVyQnlLZXlzLCBub2RlLT5p c3NfTnVtT3JkZXJCeUtleXMpOworCisJCS8vIFRPRE86IGNhbid0IHB1dCB0aGlzIGhlcmUgYmMg bm90IEFNIGFnbm9zdGljCisJCXNjYW5kZXNjLT54c19oZWFwZmV0Y2gtPnBnc3IgPSBwZ19zdHJl YW1pbmdfcmVhZF9idWZmZXJfYWxsb2MoUEdTUl9GTEFHX0RFRkFVTFQsCisJCQkJCQkJCQkJCQkJ c2NhbmRlc2MtPnhzX2hlYXBmZXRjaCwKKwkJCQkJCQkJCQkJCQlzaXplb2YoSXRlbVBvaW50ZXJE YXRhKSwKKwkJCQkJCQkJCQkJCQlOVUxMLAorCQkJCQkJCQkJCQkJCUJNUl9SRUwoc2NhbmRlc2Mt PmhlYXBSZWxhdGlvbiksCisJCQkJCQkJCQkJCQkJTUFJTl9GT1JLTlVNLAorCQkJCQkJCQkJCQkJ CWluZGV4X3Bnc3JfbmV4dF9zaW5nbGUpOworCisJCXBnX3N0cmVhbWluZ19yZWFkX3NldF9yZXN1 bWFibGUoc2NhbmRlc2MtPnhzX2hlYXBmZXRjaC0+cGdzcik7CiAJfQogCiAJLyoKIAkgKiBvaywg bm93IHRoYXQgd2UgaGF2ZSB3aGF0IHdlIG5lZWQsIGZldGNoIHRoZSBuZXh0IHR1cGxlLgogCSAq LwotCXdoaWxlIChpbmRleF9nZXRuZXh0X3Nsb3Qoc2NhbmRlc2MsIGRpcmVjdGlvbiwgc2xvdCkp CisKKwl3aGlsZSAodHJ1ZSkKIAl7CiAJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CiAKLQkJLyoK LQkJICogSWYgdGhlIGluZGV4IHdhcyBsb3NzeSwgd2UgaGF2ZSB0byByZWNoZWNrIHRoZSBpbmRl eCBxdWFscyB1c2luZwotCQkgKiB0aGUgZmV0Y2hlZCB0dXBsZS4KLQkJICovCi0JCWlmIChzY2Fu ZGVzYy0+eHNfcmVjaGVjaykKKwkJaWYgKGluZGV4X2ZldGNoX2hlYXAoc2NhbmRlc2MsIHNsb3Qp KQogCQl7Ci0JCQllY29udGV4dC0+ZWN4dF9zY2FudHVwbGUgPSBzbG90OwotCQkJaWYgKCFFeGVj UXVhbEFuZFJlc2V0KG5vZGUtPmluZGV4cXVhbG9yaWcsIGVjb250ZXh0KSkKKwkJCS8qCisJCQkq IElmIHRoZSBpbmRleCB3YXMgbG9zc3ksIHdlIGhhdmUgdG8gcmVjaGVjayB0aGUgaW5kZXggcXVh bHMgdXNpbmcKKwkJCSogdGhlIGZldGNoZWQgdHVwbGUuCisJCQkqLworCQkJaWYgKHNjYW5kZXNj LT54c19yZWNoZWNrKQogCQkJewotCQkJCS8qIEZhaWxzIHJlY2hlY2ssIHNvIGRyb3AgaXQgYW5k IGxvb3AgYmFjayBmb3IgYW5vdGhlciAqLwotCQkJCUluc3RyQ291bnRGaWx0ZXJlZDIobm9kZSwg MSk7Ci0JCQkJY29udGludWU7CisJCQkJZWNvbnRleHQtPmVjeHRfc2NhbnR1cGxlID0gc2xvdDsK KwkJCQlpZiAoIUV4ZWNRdWFsQW5kUmVzZXQobm9kZS0+aW5kZXhxdWFsb3JpZywgZWNvbnRleHQp KQorCQkJCXsKKwkJCQkJLyogRmFpbHMgcmVjaGVjaywgc28gZHJvcCBpdCBhbmQgbG9vcCBiYWNr IGZvciBhbm90aGVyICovCisJCQkJCUluc3RyQ291bnRGaWx0ZXJlZDIobm9kZSwgMSk7CisJCQkJ CWNvbnRpbnVlOworCQkJCX0KIAkJCX0KKworCQkJcmV0dXJuIHNsb3Q7CiAJCX0KIAotCQlyZXR1 cm4gc2xvdDsKKwkJaWYgKHNjYW5kZXNjLT5pbmRleF9kb25lKQorCQkJYnJlYWs7CisKKwkJQXNz ZXJ0KCFRVUVVRV9GVUxMKCZzY2FuZGVzYy0+eHNfaGVhcGZldGNoLT50aWRfcXVldWUpKTsKKwkJ ZG8KKwkJeworCQkJSXRlbVBvaW50ZXIgdGlkID0gaW5kZXhfZ2V0bmV4dF90aWQoc2NhbmRlc2Ms IGRpcmVjdGlvbik7CisKKwkJCWlmICghdGlkKQorCQkJeworCQkJCXNjYW5kZXNjLT5pbmRleF9k b25lID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJdGlkX2VucXVldWUodGlkLCAmc2Nh bmRlc2MtPnhzX2hlYXBmZXRjaC0+dGlkX3F1ZXVlKTsKKwkJfSB3aGlsZSAoIVFVRVVFX0ZVTEwo JnNjYW5kZXNjLT54c19oZWFwZmV0Y2gtPnRpZF9xdWV1ZSkpOwogCX0KIAogCS8qCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9zdHJlYW1pbmdfcmVhZC5jIGIvc3JjL2JhY2tl bmQvc3RvcmFnZS9haW8vc3RyZWFtaW5nX3JlYWQuYwppbmRleCAxOTYwNTA5MGZlLi42NDY1OTYz ZjgzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9zdHJlYW1pbmdfcmVhZC5j CisrKyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL3N0cmVhbWluZ19yZWFkLmMKQEAgLTM0LDYg KzM0LDcgQEAgc3RydWN0IFBnU3RyZWFtaW5nUmVhZAogCWludAkJCXBpbm5lZF9idWZmZXJzX3Ry aWdnZXI7CiAJaW50CQkJbmV4dF90YWlsX2J1ZmZlcjsKIAlib29sCQlmaW5pc2hlZDsKKwlib29s CQlyZXN1bWFibGU7CiAJdm9pZAkgICAqcGdzcl9wcml2YXRlOwogCVBnU3RyZWFtaW5nUmVhZEJ1 ZmZlckNCIGNhbGxiYWNrOwogCUJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5OwpAQCAtMjky LDcgKzI5Myw4IEBAIHBnX3N0cmVhbWluZ19yZWFkX2xvb2tfYWhlYWQoUGdTdHJlYW1pbmdSZWFk ICpwZ3NyKQogCQlibG9ja251bSA9IHBnc3ItPmNhbGxiYWNrKHBnc3IsIHBnc3ItPnBnc3JfcHJp dmF0ZSwgcGVyX2J1ZmZlcl9kYXRhKTsKIAkJaWYgKGJsb2NrbnVtID09IEludmFsaWRCbG9ja051 bWJlcikKIAkJewotCQkJcGdzci0+ZmluaXNoZWQgPSB0cnVlOworCQkJaWYgKCFwZ3NyLT5yZXN1 bWFibGUpCisJCQkJcGdzci0+ZmluaXNoZWQgPSB0cnVlOwogCQkJYnJlYWs7CiAJCX0KIAkJYm1y ID0gcGdzci0+Ym1yOwpAQCAtNDMzLDMgKzQzNSw5IEBAIHBnX3N0cmVhbWluZ19yZWFkX2ZyZWUo UGdTdHJlYW1pbmdSZWFkICpwZ3NyKQogCQlwZnJlZShwZ3NyLT5wZXJfYnVmZmVyX2RhdGEpOwog CXBmcmVlKHBnc3IpOwogfQorCit2b2lkCitwZ19zdHJlYW1pbmdfcmVhZF9zZXRfcmVzdW1hYmxl KFBnU3RyZWFtaW5nUmVhZCAqcGdzcikKK3sKKwlwZ3NyLT5yZXN1bWFibGUgPSB0cnVlOworfQpk aWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvYWNjZXNzL3JlbHNjYW4uaCBiL3NyYy9pbmNsdWRlL2Fj Y2Vzcy9yZWxzY2FuLmgKaW5kZXggNTIxMDQzMzA0YS4uMzY0ZmYzODFhNyAxMDA2NDQKLS0tIGEv c3JjL2luY2x1ZGUvYWNjZXNzL3JlbHNjYW4uaAorKysgYi9zcmMvaW5jbHVkZS9hY2Nlc3MvcmVs c2Nhbi5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAiYWNjZXNzL2l0dXAuaCIKICNpbmNs dWRlICJwb3J0L2F0b21pY3MuaCIKICNpbmNsdWRlICJzdG9yYWdlL2J1Zi5oIgorI2luY2x1ZGUg InN0b3JhZ2Uvc3RyZWFtaW5nX3JlYWQuaCIKICNpbmNsdWRlICJzdG9yYWdlL3NwaW4uaCIKICNp bmNsdWRlICJ1dGlscy9yZWxjYWNoZS5oIgogCkBAIC0xMDQsNiArMTA1LDggQEAgdHlwZWRlZiBz dHJ1Y3QgUGFyYWxsZWxCbG9ja1RhYmxlU2NhbldvcmtlckRhdGEgKlBhcmFsbGVsQmxvY2tUYWJs ZVNjYW5Xb3JrZXI7CiB0eXBlZGVmIHN0cnVjdCBJbmRleEZldGNoVGFibGVEYXRhCiB7CiAJUmVs YXRpb24JcmVsOworCVBnU3RyZWFtaW5nUmVhZCAqcGdzcjsKKwlJdGVtUG9pbnRlckRhdGEgdGlk X3F1ZXVlOwogfSBJbmRleEZldGNoVGFibGVEYXRhOwogCiAvKgpAQCAtMTYyLDYgKzE2NSw5IEBA IHR5cGVkZWYgc3RydWN0IEluZGV4U2NhbkRlc2NEYXRhCiAJYm9vbAkgICAqeHNfb3JkZXJieW51 bGxzOwogCWJvb2wJCXhzX3JlY2hlY2tvcmRlcmJ5OwogCisJYm9vbAlpbmRleF9kb25lOworCisK IAkvKiBwYXJhbGxlbCBpbmRleCBzY2FuIGluZm9ybWF0aW9uLCBpbiBzaGFyZWQgbWVtb3J5ICov CiAJc3RydWN0IFBhcmFsbGVsSW5kZXhTY2FuRGVzY0RhdGEgKnBhcmFsbGVsX3NjYW47CiB9CQkJ SW5kZXhTY2FuRGVzY0RhdGE7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9yYWdlL3N0cmVh bWluZ19yZWFkLmggYi9zcmMvaW5jbHVkZS9zdG9yYWdlL3N0cmVhbWluZ19yZWFkLmgKaW5kZXgg NDBjMzQwOGM1NC4uMjI4OGI3YjVlYiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9z dHJlYW1pbmdfcmVhZC5oCisrKyBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc3RyZWFtaW5nX3JlYWQu aApAQCAtNDIsNCArNDIsNiBAQCBleHRlcm4gdm9pZCBwZ19zdHJlYW1pbmdfcmVhZF9wcmVmZXRj aChQZ1N0cmVhbWluZ1JlYWQgKnBnc3IpOwogZXh0ZXJuIEJ1ZmZlciBwZ19zdHJlYW1pbmdfcmVh ZF9idWZmZXJfZ2V0X25leHQoUGdTdHJlYW1pbmdSZWFkICpwZ3NyLCB2b2lkICoqcGVyX2J1ZmZl cl9wcml2YXRlKTsKIGV4dGVybiB2b2lkIHBnX3N0cmVhbWluZ19yZWFkX2ZyZWUoUGdTdHJlYW1p bmdSZWFkICpwZ3NyKTsKIAorZXh0ZXJuIHZvaWQgcGdfc3RyZWFtaW5nX3JlYWRfc2V0X3Jlc3Vt YWJsZShQZ1N0cmVhbWluZ1JlYWQgKnBnc3IpOworCiAjZW5kaWYKLS0gCjIuMzcuMgoK --0000000000000bc4a7060fa6776b Content-Type: application/octet-stream; name="v2-0001-Streaming-Read-API.nocfbot" Content-Disposition: attachment; filename="v2-0001-Streaming-Read-API.nocfbot" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lrr2j9pa0 RnJvbSBmNmNiNTkxYmE1MjAzNTFhYjdmMGU3Y2JmOWQ2ZGYzZGFjZGE2YjQ0IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBUaG9tYXMgTXVucm8gPHRob21hcy5tdW5yb0BnbWFpbC5jb20+ CkRhdGU6IFNhdCwgMjIgSnVsIDIwMjMgMTc6MzE6NTQgKzEyMDAKU3ViamVjdDogW1BBVENIIHYy IDEvMl0gU3RyZWFtaW5nIFJlYWQgQVBJCgotLS0KIGNvbnRyaWIvcGdfcHJld2FybS9wZ19wcmV3 YXJtLmMgICAgICAgICAgfCAgNDAgKy0KIHNyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2d1 dGlscy5jICAgfCAgIDIgKy0KIHNyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvYmd3cml0ZXIuYyAgICAg ICAgfCAgIDggKy0KIHNyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvY2hlY2twb2ludGVyLmMgICAgfCAg MTUgKy0KIHNyYy9iYWNrZW5kL3N0b3JhZ2UvTWFrZWZpbGUgICAgICAgICAgICAgfCAgIDIgKy0K IHNyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL01ha2VmaWxlICAgICAgICAgfCAgMTQgKwogc3JjL2Jh Y2tlbmQvc3RvcmFnZS9haW8vbWVzb24uYnVpbGQgICAgICB8ICAgNSArCiBzcmMvYmFja2VuZC9z dG9yYWdlL2Fpby9zdHJlYW1pbmdfcmVhZC5jIHwgNDM1ICsrKysrKysrKysrKysrKysrKwogc3Jj L2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmbWdyLmMgICAgICB8IDU2MCArKysrKysrKysrKysr KystLS0tLS0tLQogc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvbG9jYWxidWYuYyAgICB8ICAx NCArLQogc3JjL2JhY2tlbmQvc3RvcmFnZS9tZXNvbi5idWlsZCAgICAgICAgICB8ICAgMSArCiBz cmMvYmFja2VuZC9zdG9yYWdlL3NtZ3Ivc21nci5jICAgICAgICAgIHwgIDQ5ICstCiBzcmMvaW5j bHVkZS9zdG9yYWdlL2J1Zm1nci5oICAgICAgICAgICAgIHwgIDIyICsKIHNyYy9pbmNsdWRlL3N0 b3JhZ2Uvc21nci5oICAgICAgICAgICAgICAgfCAgIDQgKy0KIHNyYy9pbmNsdWRlL3N0b3JhZ2Uv c3RyZWFtaW5nX3JlYWQuaCAgICAgfCAgNDUgKysKIHNyYy9pbmNsdWRlL3V0aWxzL3JlbC5oICAg ICAgICAgICAgICAgICAgfCAgIDYgLQogc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZzLmxpc3Qg ICAgICAgICB8ICAgMiArCiAxNyBmaWxlcyBjaGFuZ2VkLCA5ODYgaW5zZXJ0aW9ucygrKSwgMjM4 IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9iYWNrZW5kL3N0b3JhZ2UvYWlv L01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2JhY2tlbmQvc3RvcmFnZS9haW8vbWVz b24uYnVpbGQKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9zdHJl YW1pbmdfcmVhZC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2luY2x1ZGUvc3RvcmFnZS9zdHJl YW1pbmdfcmVhZC5oCgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wZ19wcmV3YXJtL3BnX3ByZXdhcm0u YyBiL2NvbnRyaWIvcGdfcHJld2FybS9wZ19wcmV3YXJtLmMKaW5kZXggODU0MWU0ZDZlNC4uOTYx N2JmMTMwYiAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ19wcmV3YXJtL3BnX3ByZXdhcm0uYworKysg Yi9jb250cmliL3BnX3ByZXdhcm0vcGdfcHJld2FybS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5j bHVkZSAibWlzY2FkbWluLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9idWZtZ3IuaCIKICNpbmNsdWRl ICJzdG9yYWdlL3NtZ3IuaCIKKyNpbmNsdWRlICJzdG9yYWdlL3N0cmVhbWluZ19yZWFkLmgiCiAj aW5jbHVkZSAidXRpbHMvYWNsLmgiCiAjaW5jbHVkZSAidXRpbHMvYnVpbHRpbnMuaCIKICNpbmNs dWRlICJ1dGlscy9sc3lzY2FjaGUuaCIKQEAgLTM4LDYgKzM5LDI1IEBAIHR5cGVkZWYgZW51bQog CiBzdGF0aWMgUEdJT0FsaWduZWRCbG9jayBibG9ja2J1ZmZlcjsKIAorc3RydWN0IHBnX3ByZXdh cm1fc3RyZWFtaW5nX3JlYWRfcHJpdmF0ZQoreworCUJsb2NrTnVtYmVyIGJsb2NrbnVtOworCWlu dDY0CQlsYXN0X2Jsb2NrOworfTsKKworc3RhdGljIEJsb2NrTnVtYmVyCitwZ19wcmV3YXJtX3N0 cmVhbWluZ19yZWFkX25leHQoUGdTdHJlYW1pbmdSZWFkICpwZ3NyLAorCQkJCQkJCSAgIHZvaWQg KnBnc3JfcHJpdmF0ZSwKKwkJCQkJCQkgICB2b2lkICpwZXJfYnVmZmVyX2RhdGEpCit7CisJc3Ry dWN0IHBnX3ByZXdhcm1fc3RyZWFtaW5nX3JlYWRfcHJpdmF0ZSAqcCA9IHBnc3JfcHJpdmF0ZTsK KworCWlmIChwLT5ibG9ja251bSA8PSBwLT5sYXN0X2Jsb2NrKQorCQlyZXR1cm4gcC0+YmxvY2tu dW0rKzsKKworCXJldHVybiBJbnZhbGlkQmxvY2tOdW1iZXI7Cit9CisKIC8qCiAgKiBwZ19wcmV3 YXJtKHJlZ2NsYXNzLCBtb2RlIHRleHQsIGZvcmsgdGV4dCwKICAqCQkJICBmaXJzdF9ibG9jayBp bnQ4LCBsYXN0X2Jsb2NrIGludDgpCkBAIC0xODMsMTggKzIwMywzNiBAQCBwZ19wcmV3YXJtKFBH X0ZVTkNUSU9OX0FSR1MpCiAJfQogCWVsc2UgaWYgKHB0eXBlID09IFBSRVdBUk1fQlVGRkVSKQog CXsKKwkJc3RydWN0IHBnX3ByZXdhcm1fc3RyZWFtaW5nX3JlYWRfcHJpdmF0ZSBwOworCQlQZ1N0 cmVhbWluZ1JlYWQgKnBnc3I7CisKIAkJLyoKIAkJICogSW4gYnVmZmVyIG1vZGUsIHdlIGFjdHVh bGx5IHB1bGwgdGhlIGRhdGEgaW50byBzaGFyZWRfYnVmZmVycy4KIAkJICovCisKKwkJLyogU2V0 IHVwIHRoZSBwcml2YXRlIHN0YXRlIGZvciBvdXIgc3RyZWFtaW5nIGJ1ZmZlciByZWFkIGNhbGxi YWNrLiAqLworCQlwLmJsb2NrbnVtID0gZmlyc3RfYmxvY2s7CisJCXAubGFzdF9ibG9jayA9IGxh c3RfYmxvY2s7CisKKwkJcGdzciA9IHBnX3N0cmVhbWluZ19yZWFkX2J1ZmZlcl9hbGxvYyhQR1NS X0ZMQUdfREVGQVVMVCwKKwkJCQkJCQkJCQkJICAmcCwKKwkJCQkJCQkJCQkJICAwLAorCQkJCQkJ CQkJCQkgIE5VTEwsCisJCQkJCQkJCQkJCSAgQk1SX1JFTChyZWwpLAorCQkJCQkJCQkJCQkgIGZv cmtOdW1iZXIsCisJCQkJCQkJCQkJCSAgcGdfcHJld2FybV9zdHJlYW1pbmdfcmVhZF9uZXh0KTsK KwogCQlmb3IgKGJsb2NrID0gZmlyc3RfYmxvY2s7IGJsb2NrIDw9IGxhc3RfYmxvY2s7ICsrYmxv Y2spCiAJCXsKIAkJCUJ1ZmZlcgkJYnVmOwogCiAJCQlDSEVDS19GT1JfSU5URVJSVVBUUygpOwot CQkJYnVmID0gUmVhZEJ1ZmZlckV4dGVuZGVkKHJlbCwgZm9ya051bWJlciwgYmxvY2ssIFJCTV9O T1JNQUwsIE5VTEwpOworCQkJYnVmID0gcGdfc3RyZWFtaW5nX3JlYWRfYnVmZmVyX2dldF9uZXh0 KHBnc3IsIE5VTEwpOwogCQkJUmVsZWFzZUJ1ZmZlcihidWYpOwogCQkJKytibG9ja3NfZG9uZTsK IAkJfQorCQlBc3NlcnQocGdfc3RyZWFtaW5nX3JlYWRfYnVmZmVyX2dldF9uZXh0KHBnc3IsIE5V TEwpID09IEludmFsaWRCdWZmZXIpOworCQlwZ19zdHJlYW1pbmdfcmVhZF9mcmVlKHBnc3IpOwog CX0KIAogCS8qIENsb3NlIHJlbGF0aW9uLCByZWxlYXNlIGxvY2suICovCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9hY2Nlc3MvdHJhbnNhbS94bG9ndXRpbHMuYyBiL3NyYy9iYWNrZW5kL2FjY2Vz cy90cmFuc2FtL3hsb2d1dGlscy5jCmluZGV4IGFhODY2N2FiZDEuLjg3NzViNTc4OWIgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2d1dGlscy5jCisrKyBiL3NyYy9i YWNrZW5kL2FjY2Vzcy90cmFuc2FtL3hsb2d1dGlscy5jCkBAIC02NTcsNyArNjU3LDcgQEAgWExv Z0Ryb3BEYXRhYmFzZShPaWQgZGJpZCkKIAkgKiBUaGlzIGlzIHVubmVjZXNzYXJpbHkgaGVhdnkt aGFuZGVkLCBhcyBpdCB3aWxsIGNsb3NlIFNNZ3JSZWxhdGlvbgogCSAqIG9iamVjdHMgZm9yIG90 aGVyIGRhdGFiYXNlcyBhcyB3ZWxsLiBEUk9QIERBVEFCQVNFIG9jY3VycyBzZWxkb20gZW5vdWdo CiAJICogdGhhdCBpdCdzIG5vdCB3b3J0aCBpbnRyb2R1Y2luZyBhIHZhcmlhbnQgb2Ygc21ncmNs b3NlIGZvciBqdXN0IHRoaXMKLQkgKiBwdXJwb3NlLiBYWFg6IE9yIHNob3VsZCB3ZSByYXRoZXIg bGVhdmUgdGhlIHNtZ3IgZW50cmllcyBkYW5nbGluZz8KKwkgKiBwdXJwb3NlLgogCSAqLwogCXNt Z3JjbG9zZWFsbCgpOwogCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL2Jnd3Jp dGVyLmMgYi9zcmMvYmFja2VuZC9wb3N0bWFzdGVyL2Jnd3JpdGVyLmMKaW5kZXggZDdkNmNjMGNk Ny4uMTNlNTM3NjYxOSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvcG9zdG1hc3Rlci9iZ3dyaXRl ci5jCisrKyBiL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvYmd3cml0ZXIuYwpAQCAtMjQ2LDEwICsy NDYsMTIgQEAgQmFja2dyb3VuZFdyaXRlck1haW4odm9pZCkKIAkJaWYgKEZpcnN0Q2FsbFNpbmNl TGFzdENoZWNrcG9pbnQoKSkKIAkJewogCQkJLyoKLQkJCSAqIEFmdGVyIGFueSBjaGVja3BvaW50 LCBjbG9zZSBhbGwgc21nciBmaWxlcy4gIFRoaXMgaXMgc28gd2UKLQkJCSAqIHdvbid0IGhhbmcg b250byBzbWdyIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBmaWxlcyBpbmRlZmluaXRlbHkuCisJCQkg KiBBZnRlciBhbnkgY2hlY2twb2ludCwgZnJlZSBhbGwgc21nciBvYmplY3RzLiAgT3RoZXJ3aXNl IHdlCisJCQkgKiB3b3VsZCBuZXZlciBkbyBzbyBmb3IgZHJvcHBlZCByZWxhdGlvbnMsIGFzIHRo ZSBiZ3dyaXRlciBkb2VzCisJCQkgKiBub3QgcHJvY2VzcyBzaGFyZWQgaW52YWxpZGF0aW9uIG1l c3NhZ2VzIG9yIGNhbGwKKwkJCSAqIEF0RU9YYWN0X1NNZ3IoKS4KIAkJCSAqLwotCQkJc21ncmNs b3NlYWxsKCk7CisJCQlzbWdyZGVzdHJveWFsbCgpOwogCQl9CiAKIAkJLyoKZGlmZiAtLWdpdCBh L3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvY2hlY2twb2ludGVyLmMgYi9zcmMvYmFja2VuZC9wb3N0 bWFzdGVyL2NoZWNrcG9pbnRlci5jCmluZGV4IDVlOTQ5ZmM4ODUuLjVkODQzYjYxNDIgMTAwNjQ0 Ci0tLSBhL3NyYy9iYWNrZW5kL3Bvc3RtYXN0ZXIvY2hlY2twb2ludGVyLmMKKysrIGIvc3JjL2Jh Y2tlbmQvcG9zdG1hc3Rlci9jaGVja3BvaW50ZXIuYwpAQCAtNDY5LDEwICs0NjksMTIgQEAgQ2hl Y2twb2ludGVyTWFpbih2b2lkKQogCQkJCWNrcHRfcGVyZm9ybWVkID0gQ3JlYXRlUmVzdGFydFBv aW50KGZsYWdzKTsKIAogCQkJLyoKLQkJCSAqIEFmdGVyIGFueSBjaGVja3BvaW50LCBjbG9zZSBh bGwgc21nciBmaWxlcy4gIFRoaXMgaXMgc28gd2UKLQkJCSAqIHdvbid0IGhhbmcgb250byBzbWdy IHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBmaWxlcyBpbmRlZmluaXRlbHkuCisJCQkgKiBBZnRlciBh bnkgY2hlY2twb2ludCwgZnJlZSBhbGwgc21nciBvYmplY3RzLiAgT3RoZXJ3aXNlIHdlCisJCQkg KiB3b3VsZCBuZXZlciBkbyBzbyBmb3IgZHJvcHBlZCByZWxhdGlvbnMsIGFzIHRoZSBjaGVja3Bv aW50ZXIKKwkJCSAqIGRvZXMgbm90IHByb2Nlc3Mgc2hhcmVkIGludmFsaWRhdGlvbiBtZXNzYWdl cyBvciBjYWxsCisJCQkgKiBBdEVPWGFjdF9TTWdyKCkuCiAJCQkgKi8KLQkJCXNtZ3JjbG9zZWFs bCgpOworCQkJc21ncmRlc3Ryb3lhbGwoKTsKIAogCQkJLyoKIAkJCSAqIEluZGljYXRlIGNoZWNr cG9pbnQgY29tcGxldGlvbiB0byBhbnkgd2FpdGluZyBiYWNrZW5kcy4KQEAgLTk1OCwxMSArOTYw LDggQEAgUmVxdWVzdENoZWNrcG9pbnQoaW50IGZsYWdzKQogCQkgKi8KIAkJQ3JlYXRlQ2hlY2tQ b2ludChmbGFncyB8IENIRUNLUE9JTlRfSU1NRURJQVRFKTsKIAotCQkvKgotCQkgKiBBZnRlciBh bnkgY2hlY2twb2ludCwgY2xvc2UgYWxsIHNtZ3IgZmlsZXMuICBUaGlzIGlzIHNvIHdlIHdvbid0 Ci0JCSAqIGhhbmcgb250byBzbWdyIHJlZmVyZW5jZXMgdG8gZGVsZXRlZCBmaWxlcyBpbmRlZmlu aXRlbHkuCi0JCSAqLwotCQlzbWdyY2xvc2VhbGwoKTsKKwkJLyogRnJlZSBhbGwgc21nciBvYmpl Y3RzLCBhcyBDaGVja3BvaW50ZXJNYWluKCkgbm9ybWFsbHkgd291bGQuICovCisJCXNtZ3JkZXN0 cm95YWxsKCk7CiAKIAkJcmV0dXJuOwogCX0KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3Jh Z2UvTWFrZWZpbGUgYi9zcmMvYmFja2VuZC9zdG9yYWdlL01ha2VmaWxlCmluZGV4IDgzNzZjZGZj YTIuLmVlYzAzZjZmMmIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvTWFrZWZpbGUK KysrIGIvc3JjL2JhY2tlbmQvc3RvcmFnZS9NYWtlZmlsZQpAQCAtOCw2ICs4LDYgQEAgc3ViZGly ID0gc3JjL2JhY2tlbmQvc3RvcmFnZQogdG9wX2J1aWxkZGlyID0gLi4vLi4vLi4KIGluY2x1ZGUg JCh0b3BfYnVpbGRkaXIpL3NyYy9NYWtlZmlsZS5nbG9iYWwKIAotU1VCRElSUyAgICAgPSBidWZm ZXIgZmlsZSBmcmVlc3BhY2UgaXBjIGxhcmdlX29iamVjdCBsbWdyIHBhZ2Ugc21nciBzeW5jCitT VUJESVJTICAgICA9IGFpbyBidWZmZXIgZmlsZSBmcmVlc3BhY2UgaXBjIGxhcmdlX29iamVjdCBs bWdyIHBhZ2Ugc21nciBzeW5jCiAKIGluY2x1ZGUgJCh0b3Bfc3JjZGlyKS9zcmMvYmFja2VuZC9j b21tb24ubWsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL01ha2VmaWxlIGIv c3JjL2JhY2tlbmQvc3RvcmFnZS9haW8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMC4uYmNhYjQ0YzgwMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iYWNrZW5k L3N0b3JhZ2UvYWlvL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgTWFrZWZpbGUgZm9y IHN0b3JhZ2UvYWlvCisjCisjIHNyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvL01ha2VmaWxlCisjCisK K3N1YmRpciA9IHNyYy9iYWNrZW5kL3N0b3JhZ2UvYWlvCit0b3BfYnVpbGRkaXIgPSAuLi8uLi8u Li8uLgoraW5jbHVkZSAkKHRvcF9idWlsZGRpcikvc3JjL01ha2VmaWxlLmdsb2JhbAorCitPQkpT ID0gXAorCXN0cmVhbWluZ19yZWFkLm8KKworaW5jbHVkZSAkKHRvcF9zcmNkaXIpL3NyYy9iYWNr ZW5kL2NvbW1vbi5tawpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9haW8vbWVzb24u YnVpbGQgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9tZXNvbi5idWlsZApuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi4zOWFlZjJhODRhCi0tLSAvZGV2L251bGwKKysrIGIv c3JjL2JhY2tlbmQvc3RvcmFnZS9haW8vbWVzb24uYnVpbGQKQEAgLTAsMCArMSw1IEBACisjIENv cHlyaWdodCAoYykgMjAyNCwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKwor YmFja2VuZF9zb3VyY2VzICs9IGZpbGVzKAorICAnc3RyZWFtaW5nX3JlYWQuYycsCispCmRpZmYg LS1naXQgYS9zcmMvYmFja2VuZC9zdG9yYWdlL2Fpby9zdHJlYW1pbmdfcmVhZC5jIGIvc3JjL2Jh Y2tlbmQvc3RvcmFnZS9haW8vc3RyZWFtaW5nX3JlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwLi4xOTYwNTA5MGZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2JhY2tl bmQvc3RvcmFnZS9haW8vc3RyZWFtaW5nX3JlYWQuYwpAQCAtMCwwICsxLDQzNSBAQAorI2luY2x1 ZGUgInBvc3RncmVzLmgiCisKKyNpbmNsdWRlICJzdG9yYWdlL3N0cmVhbWluZ19yZWFkLmgiCisj aW5jbHVkZSAidXRpbHMvcmVsLmgiCisKKy8qCisgKiBFbGVtZW50IHR5cGUgZm9yIFBnU3RyZWFt aW5nUmVhZCdzIGNpcmN1bGFyIGFycmF5IG9mIGJsb2NrIHJhbmdlcy4KKyAqCisgKiBGb3IgaGl0 cywgbmVlZF90b19jb21wbGV0ZSBpcyBmYWxzZSBhbmQgdGhlcmUgaXMganVzdCBvbmUgYmxvY2sg cGVyCisgKiByYW5nZSwgYWxyZWFkeSBwaW5uZWQgYW5kIHJlYWR5IGZvciB1c2UuCisgKgorICog Rm9yIG1pc3NlcywgbmVlZF90b19jb21wbGV0ZSBpcyB0cnVlIGFuZCBidWZmZXJzW10gaG9sZHMg YSByYW5nZSBvZgorICogYmxvY2tzIHRoYXQgYXJlIGNvbnRpZ3VvdXMgaW4gc3RvcmFnZSAodGhv dWdoIHRoZSBidWZmZXJzIG1heSBub3QgYmUKKyAqIGNvbnRpZ3VvdXMgaW4gbWVtb3J5KSwgc28g d2UgY2FuIGNvbXBsZXRlIHRoZW0gd2l0aCBhIHNpbmdsZSBjYWxsIHRvCisgKiBDb21wbGV0ZVJl YWRCdWZmZXJzKCkuCisgKi8KK3R5cGVkZWYgc3RydWN0IFBnU3RyZWFtaW5nUmVhZFJhbmdlCit7 CisJYm9vbAkJYWR2aWNlX2lzc3VlZDsKKwlib29sCQluZWVkX2NvbXBsZXRlOworCUJsb2NrTnVt YmVyIGJsb2NrbnVtOworCWludAkJCW5ibG9ja3M7CisJaW50CQkJcGVyX2J1ZmZlcl9kYXRhX2lu ZGV4W01BWF9CVUZGRVJTX1BFUl9UUkFOU0ZFUl07CisJQnVmZmVyCQlidWZmZXJzW01BWF9CVUZG RVJTX1BFUl9UUkFOU0ZFUl07Cit9IFBnU3RyZWFtaW5nUmVhZFJhbmdlOworCitzdHJ1Y3QgUGdT dHJlYW1pbmdSZWFkCit7CisJaW50CQkJbWF4X2lvczsKKwlpbnQJCQlpb3NfaW5fcHJvZ3Jlc3M7 CisJaW50CQkJaW9zX2luX3Byb2dyZXNzX3RyaWdnZXI7CisJaW50CQkJbWF4X3Bpbm5lZF9idWZm ZXJzOworCWludAkJCXBpbm5lZF9idWZmZXJzOworCWludAkJCXBpbm5lZF9idWZmZXJzX3RyaWdn ZXI7CisJaW50CQkJbmV4dF90YWlsX2J1ZmZlcjsKKwlib29sCQlmaW5pc2hlZDsKKwl2b2lkCSAg ICpwZ3NyX3ByaXZhdGU7CisJUGdTdHJlYW1pbmdSZWFkQnVmZmVyQ0IgY2FsbGJhY2s7CisJQnVm ZmVyQWNjZXNzU3RyYXRlZ3kgc3RyYXRlZ3k7CisJQnVmZmVyTWFuYWdlclJlbGF0aW9uIGJtcjsK KwlGb3JrTnVtYmVyCWZvcmtudW07CisKKwlib29sCQlhZHZpY2VfZW5hYmxlZDsKKworCS8qIE5l eHQgZXhwZWN0ZWQgYmxvY2ssIGZvciBkZXRlY3Rpbmcgc2VxdWVudGlhbCBhY2Nlc3MuICovCisJ QmxvY2tOdW1iZXIgc2VxX2Jsb2NrbnVtOworCisJLyogU3BhY2UgZm9yIG9wdGlvbmFsIHBlci1i dWZmZXIgcHJpdmF0ZSBkYXRhLiAqLworCXNpemVfdAkJcGVyX2J1ZmZlcl9kYXRhX3NpemU7CisJ dm9pZAkgICAqcGVyX2J1ZmZlcl9kYXRhOworCWludAkJCXBlcl9idWZmZXJfZGF0YV9uZXh0Owor CisJLyogQ2lyY3VsYXIgYnVmZmVyIG9mIHJhbmdlcy4gKi8KKwlpbnQJCQlzaXplOworCWludAkJ CWhlYWQ7CisJaW50CQkJdGFpbDsKKwlQZ1N0cmVhbWluZ1JlYWRSYW5nZSByYW5nZXNbRkxFWElC TEVfQVJSQVlfTUVNQkVSXTsKK307CisKK3N0YXRpYyBQZ1N0cmVhbWluZ1JlYWQgKgorcGdfc3Ry ZWFtaW5nX3JlYWRfYnVmZmVyX2FsbG9jX2ludGVybmFsKGludCBmbGFncywKKwkJCQkJCQkJCQl2 b2lkICpwZ3NyX3ByaXZhdGUsCisJCQkJCQkJCQkJc2l6ZV90IHBlcl9idWZmZXJfZGF0YV9zaXpl LAorCQkJCQkJCQkJCUJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5KQoreworCVBnU3RyZWFt aW5nUmVhZCAqcGdzcjsKKwlpbnQJCQlzaXplOworCWludAkJCW1heF9pb3M7CisJdWludDMyCQlt YXhfcGlubmVkX2J1ZmZlcnM7CisKKworCS8qCisJICogRGVjaWRlIGhvdyBtYW55IGFzc3VtZWQg SS9PcyB3ZSB3aWxsIGFsbG93IHRvIHJ1biBjb25jdXJyZW50bHkuICBUaGF0CisJICogaXMsIGFk dmljZSB0byB0aGUga2VybmVsIHRvIHRlbGwgaXQgdGhhdCB3ZSB3aWxsIHNvb24gcmVhZC4gIFRo aXMKKwkgKiBudW1iZXIgYWxzbyBhZmZlY3RzIGhvdyBmYXIgd2UgbG9vayBhaGVhZCBmb3Igb3Bw b3J0dW5pdGllcyB0byBzdGFydAorCSAqIG1vcmUgSS9Pcy4KKwkgKi8KKwlpZiAoZmxhZ3MgJiBQ R1NSX0ZMQUdfTUFJTlRFTkFOQ0UpCisJCW1heF9pb3MgPSBtYWludGVuYW5jZV9pb19jb25jdXJy ZW5jeTsKKwllbHNlCisJCW1heF9pb3MgPSBlZmZlY3RpdmVfaW9fY29uY3VycmVuY3k7CisKKwkv KgorCSAqIFRoZSBkZXNpcmVkIGxldmVsIG9mIEkvTyBjb25jdXJyZW5jeSBjb250cm9scyBob3cg ZmFyIGFoZWFkIHdlIGFyZQorCSAqIHdpbGxpbmcgdG8gbG9vayBhaGVhZC4gIFdlIGFsc28gY2xh bXAgaXQgdG8gYXQgbGVhc3QKKwkgKiBNQVhfQlVGRkVSX1BFUl9UUkFORkVSIHNvIHRoYXQgd2Ug Y2FuIGhhdmUgYSBjaGFuY2UgdG8gYnVpbGQgdXAgYSBmdWxsCisJICogc2l6ZWQgcmVhZCwgZXZl biB3aGVuIG1heF9pb3MgaXMgemVyby4KKwkgKi8KKwltYXhfcGlubmVkX2J1ZmZlcnMgPSBNYXgo bWF4X2lvcyAqIDQsIE1BWF9CVUZGRVJTX1BFUl9UUkFOU0ZFUik7CisKKwkvKgorCSAqIFRoZSAq X2lvX2NvbmN1cnJlbmN5IEdVQ3MsIHdlIG1pZ2h0IGhhdmUgMC4gIFdlIHdhbnQgdG8gYWxsb3cg YXQgbGVhc3QKKwkgKiBvbmUsIHRvIGtlZXAgb3VyIGdhdGluZyBsb2dpYyBzaW1wbGUuCisJICov CisJbWF4X2lvcyA9IE1heChtYXhfaW9zLCAxKTsKKworCS8qCisJICogRG9uJ3QgYWxsb3cgdGhp cyBiYWNrZW5kIHRvIHBpbiB0b28gbWFueSBidWZmZXJzLiAgRm9yIG5vdyB3ZSdsbCBhcHBseQor CSAqIHRoZSBsaW1pdCBmb3IgdGhlIHNoYXJlZCBidWZmZXIgcG9vbCBhbmQgdGhlIGxvY2FsIGJ1 ZmZlciBwb29sLCB3aXRob3V0CisJICogd29ycnlpbmcgd2hpY2ggaXQgaXMuCisJICovCisJTGlt aXRBZGRpdGlvbmFsUGlucygmbWF4X3Bpbm5lZF9idWZmZXJzKTsKKwlMaW1pdEFkZGl0aW9uYWxM b2NhbFBpbnMoJm1heF9waW5uZWRfYnVmZmVycyk7CisJQXNzZXJ0KG1heF9waW5uZWRfYnVmZmVy cyA+IDApOworCisJLyoKKwkgKiBwZ3NyLT5yYW5nZXMgaXMgYSBjaXJjdWxhciBidWZmZXIuICBX aGVuIGl0IGlzIGVtcHR5LCBoZWFkID09IHRhaWwuCisJICogV2hlbiBpdCBpcyBmdWxsLCB0aGVy ZSBpcyBhbiBlbXB0eSBlbGVtZW50IGJldHdlZW4gaGVhZCBhbmQgdGFpbC4gIEhlYWQKKwkgKiBj YW4gYWxzbyBiZSBlbXB0eSAobmJsb2NrcyA9PSAwKSwgdGhlcmVmb3JlIHdlIG5lZWQgdHdvIGV4 dHJhIGVsZW1lbnRzCisJICogZm9yIG5vbi1vY2N1cGllZCByYW5nZXMsIG9uIHRvcCBvZiBtYXhf cGlubmVkX2J1ZmZlcnMgdG8gYWxsb3cgZm9yIHRoZQorCSAqIG1heG1pbXVtIHBvc3NpYmxlIG51 bWJlciBvZiBvY2N1cGllZCByYW5nZXMgb2YgdGhlIHNtYWxsZXN0IHBvc3NpYmxlCisJICogc2l6 ZSBvZiBvbmUuCisJICovCisJc2l6ZSA9IG1heF9waW5uZWRfYnVmZmVycyArIDI7CisKKwlwZ3Ny ID0gKFBnU3RyZWFtaW5nUmVhZCAqKQorCQlwYWxsb2MwKG9mZnNldG9mKFBnU3RyZWFtaW5nUmVh ZCwgcmFuZ2VzKSArCisJCQkJc2l6ZW9mKHBnc3ItPnJhbmdlc1swXSkgKiBzaXplKTsKKworCXBn c3ItPm1heF9pb3MgPSBtYXhfaW9zOworCXBnc3ItPnBlcl9idWZmZXJfZGF0YV9zaXplID0gcGVy X2J1ZmZlcl9kYXRhX3NpemU7CisJcGdzci0+bWF4X3Bpbm5lZF9idWZmZXJzID0gbWF4X3Bpbm5l ZF9idWZmZXJzOworCXBnc3ItPnBnc3JfcHJpdmF0ZSA9IHBnc3JfcHJpdmF0ZTsKKwlwZ3NyLT5z dHJhdGVneSA9IHN0cmF0ZWd5OworCXBnc3ItPnNpemUgPSBzaXplOworCisjaWZkZWYgVVNFX1BS RUZFVENICisKKwkvKgorCSAqIFRoaXMgc3lzdGVtIHN1cHBvcnRzIHByZWZldGNoaW5nIGFkdmlj ZS4gIEFzIGxvbmcgYXMgZGlyZWN0IEkvTyBpc24ndAorCSAqIGVuYWJsZWQsIGFuZCB0aGUgY2Fs bGVyIGhhc24ndCBwcm9taXNlZCBzZXF1ZW50aWFsIGFjY2Vzcywgd2UgY2FuIHVzZQorCSAqIGl0 LgorCSAqLworCWlmICgoaW9fZGlyZWN0X2ZsYWdzICYgSU9fRElSRUNUX0RBVEEpID09IDAgJiYK KwkJKGZsYWdzICYgUEdTUl9GTEFHX1NFUVVFTlRJQUwpID09IDApCisJCXBnc3ItPmFkdmljZV9l bmFibGVkID0gdHJ1ZTsKKyNlbmRpZgorCisJLyoKKwkgKiBXZSB3YW50IHRvIGF2b2lkIGNyZWF0 aW5nIHJhbmdlcyB0aGF0IGFyZSBzbWFsbGVyIHRoYW4gdGhleSBjb3VsZCBiZQorCSAqIGp1c3Qg YmVjYXVzZSB3ZSBoaXQgbWF4X3Bpbm5lZF9idWZmZXJzLiAgV2Ugb25seSBsb29rIGFoZWFkIHdo ZW4gdGhlCisJICogbnVtYmVyIG9mIHBpbm5lZCBidWZmZXJzIGZhbGxzIGJlbG93IHRoaXMgdHJp Z2dlciBudW1iZXIsIG9yIHB1dAorCSAqIGFub3RoZXIgd2F5LCB3ZSBzdG9wIGxvb2tpbmcgYWhl YWQgd2hlbiB3ZSB3b3VsZG4ndCBiZSBhYmxlIHRvIGJ1aWxkIGEKKwkgKiAiZnVsbCBzaXplZCIg cmFuZ2UuCisJICovCisJcGdzci0+cGlubmVkX2J1ZmZlcnNfdHJpZ2dlciA9CisJCU1heCgxLCAo aW50KSBtYXhfcGlubmVkX2J1ZmZlcnMgLSBNQVhfQlVGRkVSU19QRVJfVFJBTlNGRVIpOworCisJ LyogU3BhY2UgdGhlIGNhbGxiYWNrIHRvIHN0b3JlIGV4dHJhIGRhdGEgYWxvbmcgd2l0aCBlYWNo IGJsb2NrLiAqLworCWlmIChwZXJfYnVmZmVyX2RhdGFfc2l6ZSkKKwkJcGdzci0+cGVyX2J1ZmZl cl9kYXRhID0gcGFsbG9jKHBlcl9idWZmZXJfZGF0YV9zaXplICogbWF4X3Bpbm5lZF9idWZmZXJz KTsKKworCXJldHVybiBwZ3NyOworfQorCisvKgorICogQ3JlYXRlIGEgbmV3IHN0cmVhbWluZyBy ZWFkIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gdGhlCisgKiBlcXVpdmFsZW50 IG9mIGEgc2VyaWVzIG9mIFJlYWRCdWZmZXIoKSBjYWxscyBmb3Igb25lIGZvcmsgb2Ygb25lIHJl bGF0aW9uLgorICogSW50ZXJuYWxseSwgaXQgZ2VuZXJhdGVzIGxhcmdlciB2ZWN0b3JlZCByZWFk cyB3aGVyZSBwb3NzaWJsZSBieSBsb29raW5nCisgKiBhaGVhZC4KKyAqLworUGdTdHJlYW1pbmdS ZWFkICoKK3BnX3N0cmVhbWluZ19yZWFkX2J1ZmZlcl9hbGxvYyhpbnQgZmxhZ3MsCisJCQkJCQkJ ICAgdm9pZCAqcGdzcl9wcml2YXRlLAorCQkJCQkJCSAgIHNpemVfdCBwZXJfYnVmZmVyX2RhdGFf c2l6ZSwKKwkJCQkJCQkgICBCdWZmZXJBY2Nlc3NTdHJhdGVneSBzdHJhdGVneSwKKwkJCQkJCQkg ICBCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1yLAorCQkJCQkJCSAgIEZvcmtOdW1iZXIgZm9ya251 bSwKKwkJCQkJCQkgICBQZ1N0cmVhbWluZ1JlYWRCdWZmZXJDQiBuZXh0X2Jsb2NrX2NiKQorewor CVBnU3RyZWFtaW5nUmVhZCAqcmVzdWx0OworCisJcmVzdWx0ID0gcGdfc3RyZWFtaW5nX3JlYWRf YnVmZmVyX2FsbG9jX2ludGVybmFsKGZsYWdzLAorCQkJCQkJCQkJCQkJCSBwZ3NyX3ByaXZhdGUs CisJCQkJCQkJCQkJCQkJIHBlcl9idWZmZXJfZGF0YV9zaXplLAorCQkJCQkJCQkJCQkJCSBzdHJh dGVneSk7CisJcmVzdWx0LT5jYWxsYmFjayA9IG5leHRfYmxvY2tfY2I7CisJcmVzdWx0LT5ibXIg PSBibXI7CisJcmVzdWx0LT5mb3JrbnVtID0gZm9ya251bTsKKworCXJldHVybiByZXN1bHQ7Cit9 CisKKy8qCisgKiBTdGFydCBidWlsZGluZyBhIG5ldyByYW5nZS4gIFRoaXMgaXMgY2FsbGVkIGFm dGVyIHRoZSBwcmV2aW91cyBvbmUKKyAqIHJlYWNoZWQgbWF4aW11bSBzaXplLCBvciB0aGUgY2Fs bGJhY2sncyBuZXh0IGJsb2NrIGNhbid0IGJlIG1lcmdlZCB3aXRoIGl0LgorICoKKyAqIFNpbmNl IHRoZSBwcmV2aW91cyBoZWFkIHJhbmdlIGhhcyBub3cgcmVhY2hlZCBpdHMgZnVsbCBwb3RlbnRp YWwgc2l6ZSwgdGhpcworICogaXMgYWxzbyBhIGdvb2QgdGltZSB0byBpc3N1ZSAncHJlZmV0Y2gn IGFkdmljZSwgYmVjYXVzZSB3ZSBrbm93IHRoYXQnbGwKKyAqIHNvb24gYmUgcmVhZGluZy4gIElu IGZ1dHVyZSwgd2UgY291bGQgc3RhcnQgYW4gYWN0dWFsIEkvTyBoZXJlLgorICovCitzdGF0aWMg UGdTdHJlYW1pbmdSZWFkUmFuZ2UgKgorcGdfc3RyZWFtaW5nX3JlYWRfbmV3X3JhbmdlKFBnU3Ry ZWFtaW5nUmVhZCAqcGdzcikKK3sKKwlQZ1N0cmVhbWluZ1JlYWRSYW5nZSAqaGVhZF9yYW5nZTsK KworCWhlYWRfcmFuZ2UgPSAmcGdzci0+cmFuZ2VzW3Bnc3ItPmhlYWRdOworCUFzc2VydChoZWFk X3JhbmdlLT5uYmxvY2tzID4gMCk7CisKKwkvKgorCSAqIElmIGEgY2FsbCB0byBDb21wbGV0ZVJl YWRCdWZmZXJzKCkgd2lsbCBiZSBuZWVkZWQsIGFuZCB3ZSBjYW4gaXNzdWUKKwkgKiBhZHZpY2Ug dG8gdGhlIGtlcm5lbCB0byBnZXQgdGhlIHJlYWQgc3RhcnRlZC4gIFdlIHN1cHByZXNzIGl0IGlm IHRoZQorCSAqIGFjY2VzcyBwYXR0ZXJuIGFwcGVhcnMgdG8gYmUgY29tcGxldGVseSBzZXF1ZW50 aWFsLCB0aG91Z2gsIGJlY2F1c2Ugb24KKwkgKiBzb21lIHN5c3RlbXMgdGhhdCBpbnRlcmZlcnMg d2l0aCB0aGUga2VybmVsJ3Mgb3duIHNlcXVlbnRpYWwgcmVhZCBhaGVhZAorCSAqIGhldXJzdGlj cyBhbmQgaHVydHMgcGVyZm9ybWFuY2UuCisJICovCisJaWYgKHBnc3ItPmFkdmljZV9lbmFibGVk KQorCXsKKwkJQmxvY2tOdW1iZXIgYmxvY2tudW0gPSBoZWFkX3JhbmdlLT5ibG9ja251bTsKKwkJ aW50CQkJbmJsb2NrcyA9IGhlYWRfcmFuZ2UtPm5ibG9ja3M7CisKKwkJaWYgKGhlYWRfcmFuZ2Ut Pm5lZWRfY29tcGxldGUgJiYgYmxvY2tudW0gIT0gcGdzci0+c2VxX2Jsb2NrbnVtKQorCQl7CisJ CQlTTWdyUmVsYXRpb24gc21nciA9CisJCQkJcGdzci0+Ym1yLnNtZ3IgPyBwZ3NyLT5ibXIuc21n ciA6CisJCQkJUmVsYXRpb25HZXRTbWdyKHBnc3ItPmJtci5yZWwpOworCisJCQlBc3NlcnQoIWhl YWRfcmFuZ2UtPmFkdmljZV9pc3N1ZWQpOworCisJCQlzbWdycHJlZmV0Y2goc21nciwgcGdzci0+ Zm9ya251bSwgYmxvY2tudW0sIG5ibG9ja3MpOworCisJCQkvKgorCQkJICogQ291bnQgdGhpcyBh cyBhbiBJL08gdGhhdCBpcyBjb25jdXJyZW50bHkgaW4gcHJvZ3Jlc3MsIHRob3VnaAorCQkJICog d2UgZG9uJ3QgcmVhbGx5IGtub3cgaWYgdGhlIGtlcm5lbCBnZW5lcmF0ZXMgYSBwaHlzaWNhbCBJ L08uCisJCQkgKi8KKwkJCWhlYWRfcmFuZ2UtPmFkdmljZV9pc3N1ZWQgPSB0cnVlOworCQkJcGdz ci0+aW9zX2luX3Byb2dyZXNzKys7CisJCX0KKworCQkvKiBSZW1lbWJlciB0aGUgYmxvY2sgYWZ0 ZXIgdGhpcyByYW5nZSwgZm9yIHNlcXVlbmNlIGRldGVjdGlvbi4gKi8KKwkJcGdzci0+c2VxX2Js b2NrbnVtID0gYmxvY2tudW0gKyBuYmxvY2tzOworCX0KKworCS8qIENyZWF0ZSBhIG5ldyBoZWFk IHJhbmdlLiAgVGhlcmUgbXVzdCBiZSBzcGFjZS4gKi8KKwlBc3NlcnQocGdzci0+c2l6ZSA+IHBn c3ItPm1heF9waW5uZWRfYnVmZmVycyk7CisJQXNzZXJ0KChwZ3NyLT5oZWFkICsgMSkgJSBwZ3Ny LT5zaXplICE9IHBnc3ItPnRhaWwpOworCWlmICgrK3Bnc3ItPmhlYWQgPT0gcGdzci0+c2l6ZSkK KwkJcGdzci0+aGVhZCA9IDA7CisJaGVhZF9yYW5nZSA9ICZwZ3NyLT5yYW5nZXNbcGdzci0+aGVh ZF07CisJaGVhZF9yYW5nZS0+bmJsb2NrcyA9IDA7CisKKwlyZXR1cm4gaGVhZF9yYW5nZTsKK30K Kworc3RhdGljIHZvaWQKK3BnX3N0cmVhbWluZ19yZWFkX2xvb2tfYWhlYWQoUGdTdHJlYW1pbmdS ZWFkICpwZ3NyKQoreworCS8qCisJICogSWYgd2UncmUgZmluaXNoZWQgb3IgY2FuJ3Qgc3RhcnQg bW9yZSBJL08sIHRoZW4gZG9uJ3QgbG9vayBhaGVhZC4KKwkgKi8KKwlpZiAocGdzci0+ZmluaXNo ZWQgfHwgcGdzci0+aW9zX2luX3Byb2dyZXNzID09IHBnc3ItPm1heF9pb3MpCisJCXJldHVybjsK KworCS8qCisJICogV2UnbGwgYWxzbyB3YWl0IHVudGlsIHRoZSBudW1iZXIgb2YgcGlubmVkIGJ1 ZmZlcnMgZmFsbHMgYmVsb3cgb3VyCisJICogdHJpZ2dlciBsZXZlbCwgc28gdGhhdCB3ZSBoYXZl IHRoZSBjaGFuY2UgdG8gY3JlYXRlIGEgZnVsbCByYW5nZS4KKwkgKi8KKwlpZiAocGdzci0+cGlu bmVkX2J1ZmZlcnMgPj0gcGdzci0+cGlubmVkX2J1ZmZlcnNfdHJpZ2dlcikKKwkJcmV0dXJuOwor CisJZG8KKwl7CisJCUJ1ZmZlck1hbmFnZXJSZWxhdGlvbiBibXI7CisJCUZvcmtOdW1iZXIJZm9y a251bTsKKwkJQmxvY2tOdW1iZXIgYmxvY2tudW07CisJCUJ1ZmZlcgkJYnVmZmVyOworCQlib29s CQlmb3VuZDsKKwkJYm9vbAkJbmVlZF9jb21wbGV0ZTsKKwkJUGdTdHJlYW1pbmdSZWFkUmFuZ2Ug KmhlYWRfcmFuZ2U7CisJCXZvaWQJICAgKnBlcl9idWZmZXJfZGF0YTsKKworCQkvKiBEbyB3ZSBo YXZlIGEgZnVsbC1zaXplZCByYW5nZT8gKi8KKwkJaGVhZF9yYW5nZSA9ICZwZ3NyLT5yYW5nZXNb cGdzci0+aGVhZF07CisJCWlmIChoZWFkX3JhbmdlLT5uYmxvY2tzID09IGxlbmd0aG9mKGhlYWRf cmFuZ2UtPmJ1ZmZlcnMpKQorCQl7CisJCQlBc3NlcnQoaGVhZF9yYW5nZS0+bmVlZF9jb21wbGV0 ZSk7CisJCQloZWFkX3JhbmdlID0gcGdfc3RyZWFtaW5nX3JlYWRfbmV3X3JhbmdlKHBnc3IpOwor CisJCQkvKgorCQkJICogR2l2ZSB1cCBub3cgaWYgSS9PIGlzIHNhdHVyYXRlZCwgb3Igd2Ugd291 bGRuJ3QgYmUgYWJsZSBmb3JtCisJCQkgKiBhbm90aGVyIGZ1bGwgcmFuZ2UgYWZ0ZXIgdGhpcyBk dWUgdG8gdGhlIHBpbiBsaW1pdC4KKwkJCSAqLworCQkJaWYgKHBnc3ItPnBpbm5lZF9idWZmZXJz ID49IHBnc3ItPnBpbm5lZF9idWZmZXJzX3RyaWdnZXIgfHwKKwkJCQlwZ3NyLT5pb3NfaW5fcHJv Z3Jlc3MgPT0gcGdzci0+bWF4X2lvcykKKwkJCQlicmVhazsKKwkJfQorCisJCXBlcl9idWZmZXJf ZGF0YSA9IChjaGFyICopIHBnc3ItPnBlcl9idWZmZXJfZGF0YSArCisJCQlwZ3NyLT5wZXJfYnVm ZmVyX2RhdGFfc2l6ZSAqIHBnc3ItPnBlcl9idWZmZXJfZGF0YV9uZXh0OworCisJCS8qIEZpbmQg b3V0IHdoaWNoIGJsb2NrIHRoZSBjYWxsYmFjayB3YW50cyB0byByZWFkIG5leHQuICovCisJCWJs b2NrbnVtID0gcGdzci0+Y2FsbGJhY2socGdzciwgcGdzci0+cGdzcl9wcml2YXRlLCBwZXJfYnVm ZmVyX2RhdGEpOworCQlpZiAoYmxvY2tudW0gPT0gSW52YWxpZEJsb2NrTnVtYmVyKQorCQl7CisJ CQlwZ3NyLT5maW5pc2hlZCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQlibXIgPSBwZ3NyLT5i bXI7CisJCWZvcmtudW0gPSBwZ3NyLT5mb3JrbnVtOworCisJCUFzc2VydChwZ3NyLT5waW5uZWRf YnVmZmVycyA8IHBnc3ItPm1heF9waW5uZWRfYnVmZmVycyk7CisKKwkJYnVmZmVyID0gUHJlcGFy ZVJlYWRCdWZmZXIoYm1yLAorCQkJCQkJCQkgICBmb3JrbnVtLAorCQkJCQkJCQkgICBibG9ja251 bSwKKwkJCQkJCQkJICAgcGdzci0+c3RyYXRlZ3ksCisJCQkJCQkJCSAgICZmb3VuZCk7CisJCXBn c3ItPnBpbm5lZF9idWZmZXJzKys7CisKKwkJbmVlZF9jb21wbGV0ZSA9ICFmb3VuZDsKKworCQkv KiBJcyB0aGVyZSBhIGhlYWQgcmFuZ2UgdGhhdCB3ZSBjYW4ndCBleHRlbmQ/ICovCisJCWhlYWRf cmFuZ2UgPSAmcGdzci0+cmFuZ2VzW3Bnc3ItPmhlYWRdOworCQlpZiAoaGVhZF9yYW5nZS0+bmJs b2NrcyA+IDAgJiYKKwkJCSghbmVlZF9jb21wbGV0ZSB8fAorCQkJICFoZWFkX3JhbmdlLT5uZWVk X2NvbXBsZXRlIHx8CisJCQkgaGVhZF9yYW5nZS0+YmxvY2tudW0gKyBoZWFkX3JhbmdlLT5uYmxv Y2tzICE9IGJsb2NrbnVtKSkKKwkJeworCQkJLyogWWVzLCB0aW1lIHRvIHN0YXJ0IGJ1aWxkaW5n IGEgbmV3IG9uZS4gKi8KKwkJCWhlYWRfcmFuZ2UgPSBwZ19zdHJlYW1pbmdfcmVhZF9uZXdfcmFu Z2UocGdzcik7CisJCQlBc3NlcnQoaGVhZF9yYW5nZS0+bmJsb2NrcyA9PSAwKTsKKwkJfQorCisJ CWlmIChoZWFkX3JhbmdlLT5uYmxvY2tzID09IDApCisJCXsKKwkJCS8qIEluaXRpYWxpemUgYSBu ZXcgcmFuZ2UgYmVnaW5uaW5nIGF0IHRoaXMgYmxvY2suICovCisJCQloZWFkX3JhbmdlLT5ibG9j a251bSA9IGJsb2NrbnVtOworCQkJaGVhZF9yYW5nZS0+bmVlZF9jb21wbGV0ZSA9IG5lZWRfY29t cGxldGU7CisJCQloZWFkX3JhbmdlLT5hZHZpY2VfaXNzdWVkID0gZmFsc2U7CisJCX0KKwkJZWxz ZQorCQl7CisJCQkvKiBXZSBjYW4gZXh0ZW5kIGFuIGV4aXN0aW5nIHJhbmdlIGJ5IG9uZSBibG9j ay4gKi8KKwkJCUFzc2VydChoZWFkX3JhbmdlLT5ibG9ja251bSArIGhlYWRfcmFuZ2UtPm5ibG9j a3MgPT0gYmxvY2tudW0pOworCQkJQXNzZXJ0KGhlYWRfcmFuZ2UtPm5lZWRfY29tcGxldGUpOwor CQl9CisKKwkJaGVhZF9yYW5nZS0+cGVyX2J1ZmZlcl9kYXRhX2luZGV4W2hlYWRfcmFuZ2UtPm5i bG9ja3NdID0gcGdzci0+cGVyX2J1ZmZlcl9kYXRhX25leHQrKzsKKwkJaGVhZF9yYW5nZS0+YnVm ZmVyc1toZWFkX3JhbmdlLT5uYmxvY2tzXSA9IGJ1ZmZlcjsKKwkJaGVhZF9yYW5nZS0+bmJsb2Nr cysrOworCisJCWlmIChwZ3NyLT5wZXJfYnVmZmVyX2RhdGFfbmV4dCA9PSBwZ3NyLT5tYXhfcGlu bmVkX2J1ZmZlcnMpCisJCQlwZ3NyLT5wZXJfYnVmZmVyX2RhdGFfbmV4dCA9IDA7CisKKwl9IHdo aWxlIChwZ3NyLT5waW5uZWRfYnVmZmVycyA8IHBnc3ItPm1heF9waW5uZWRfYnVmZmVycyAmJgor CQkJIHBnc3ItPmlvc19pbl9wcm9ncmVzcyA8IHBnc3ItPm1heF9pb3MpOworCisJaWYgKHBnc3It PnJhbmdlc1twZ3NyLT5oZWFkXS5uYmxvY2tzID4gMCkKKwkJcGdfc3RyZWFtaW5nX3JlYWRfbmV3 X3JhbmdlKHBnc3IpOworfQorCitCdWZmZXIKK3BnX3N0cmVhbWluZ19yZWFkX2J1ZmZlcl9nZXRf bmV4dChQZ1N0cmVhbWluZ1JlYWQgKnBnc3IsIHZvaWQgKipwZXJfYnVmZmVyX2RhdGEpCit7CisJ cGdfc3RyZWFtaW5nX3JlYWRfbG9va19haGVhZChwZ3NyKTsKKworCS8qIFNlZSBpZiB3ZSBoYXZl IG9uZSBidWZmZXIgdG8gcmV0dXJuLiAqLworCXdoaWxlIChwZ3NyLT50YWlsICE9IHBnc3ItPmhl YWQpCisJeworCQlQZ1N0cmVhbWluZ1JlYWRSYW5nZSAqdGFpbF9yYW5nZTsKKworCQl0YWlsX3Jh bmdlID0gJnBnc3ItPnJhbmdlc1twZ3NyLT50YWlsXTsKKworCQkvKgorCQkgKiBEbyB3ZSBuZWVk IHRvIHBlcmZvcm0gYW4gSS9PIGJlZm9yZSByZXR1cm5pbmcgdGhlIGJ1ZmZlcnMgZnJvbSB0aGlz CisJCSAqIHJhbmdlPworCQkgKi8KKwkJaWYgKHRhaWxfcmFuZ2UtPm5lZWRfY29tcGxldGUpCisJ CXsKKwkJCUNvbXBsZXRlUmVhZEJ1ZmZlcnMocGdzci0+Ym1yLAorCQkJCQkJCQl0YWlsX3Jhbmdl LT5idWZmZXJzLAorCQkJCQkJCQlwZ3NyLT5mb3JrbnVtLAorCQkJCQkJCQl0YWlsX3JhbmdlLT5i bG9ja251bSwKKwkJCQkJCQkJdGFpbF9yYW5nZS0+bmJsb2NrcywKKwkJCQkJCQkJZmFsc2UsCisJ CQkJCQkJCXBnc3ItPnN0cmF0ZWd5KTsKKwkJCXRhaWxfcmFuZ2UtPm5lZWRfY29tcGxldGUgPSBm YWxzZTsKKworCQkJLyoKKwkJCSAqIFdlIGRvbid0IHJlYWxseSBrbm93IGlmIHRoZSBrZXJuZWwg Z2VuZXJhdGVkIGFuIHBoeXNpY2FsIEkvTworCQkJICogd2hlbiB3ZSBpc3N1ZWQgYWR2aWNlLCBs ZXQgYWxvbmUgd2hlbiBpdCBmaW5pc2hlZCwgYnV0IGl0IGhhcworCQkJICogY2VydGFpbmx5IGZp bmlzaGVkIGFmdGVyIGEgcmVhZCBjYWxsIHJldHVybnMuCisJCQkgKi8KKwkJCWlmICh0YWlsX3Jh bmdlLT5hZHZpY2VfaXNzdWVkKQorCQkJCXBnc3ItPmlvc19pbl9wcm9ncmVzcy0tOworCQl9CisK KwkJLyogQXJlIHRoZXJlIG1vcmUgYnVmZmVycyBhdmFpbGFibGUgaW4gdGhpcyByYW5nZT8gKi8K KwkJaWYgKHBnc3ItPm5leHRfdGFpbF9idWZmZXIgPCB0YWlsX3JhbmdlLT5uYmxvY2tzKQorCQl7 CisJCQlpbnQJCQlidWZmZXJfaW5kZXg7CisJCQlCdWZmZXIJCWJ1ZmZlcjsKKworCQkJYnVmZmVy X2luZGV4ID0gcGdzci0+bmV4dF90YWlsX2J1ZmZlcisrOworCQkJYnVmZmVyID0gdGFpbF9yYW5n ZS0+YnVmZmVyc1tidWZmZXJfaW5kZXhdOworCisJCQlBc3NlcnQoQnVmZmVySXNWYWxpZChidWZm ZXIpKTsKKworCQkJLyogV2UgYXJlIGdpdmluZyBhd2F5IG93bmVyc2hpcCBvZiB0aGlzIHBpbm5l ZCBidWZmZXIuICovCisJCQlBc3NlcnQocGdzci0+cGlubmVkX2J1ZmZlcnMgPiAwKTsKKwkJCXBn c3ItPnBpbm5lZF9idWZmZXJzLS07CisKKwkJCWlmIChwZXJfYnVmZmVyX2RhdGEpCisJCQkJKnBl cl9idWZmZXJfZGF0YSA9IChjaGFyICopIHBnc3ItPnBlcl9idWZmZXJfZGF0YSArCisJCQkJCXRh aWxfcmFuZ2UtPnBlcl9idWZmZXJfZGF0YV9pbmRleFtidWZmZXJfaW5kZXhdICoKKwkJCQkJcGdz ci0+cGVyX2J1ZmZlcl9kYXRhX3NpemU7CisKKwkJCXJldHVybiBidWZmZXI7CisJCX0KKworCQkv KiBBZHZhbmNlIHRhaWwgdG8gbmV4dCByYW5nZSwgaWYgdGhlcmUgaXMgb25lLiAqLworCQlpZiAo KytwZ3NyLT50YWlsID09IHBnc3ItPnNpemUpCisJCQlwZ3NyLT50YWlsID0gMDsKKwkJcGdzci0+ bmV4dF90YWlsX2J1ZmZlciA9IDA7CisJfQorCisJQXNzZXJ0KHBnc3ItPnBpbm5lZF9idWZmZXJz ID09IDApOworCisJcmV0dXJuIEludmFsaWRCdWZmZXI7Cit9CisKK3ZvaWQKK3BnX3N0cmVhbWlu Z19yZWFkX2ZyZWUoUGdTdHJlYW1pbmdSZWFkICpwZ3NyKQoreworCUJ1ZmZlcgkJYnVmZmVyOwor CisJLyogU3RvcCBsb29raW5nIGFoZWFkLCBhbmQgdW5waW4gYW55dGhpbmcgdGhhdCB3YXNuJ3Qg Y29uc3VtZWQuICovCisJcGdzci0+ZmluaXNoZWQgPSB0cnVlOworCXdoaWxlICgoYnVmZmVyID0g cGdfc3RyZWFtaW5nX3JlYWRfYnVmZmVyX2dldF9uZXh0KHBnc3IsIE5VTEwpKSAhPSBJbnZhbGlk QnVmZmVyKQorCQlSZWxlYXNlQnVmZmVyKGJ1ZmZlcik7CisKKwlpZiAocGdzci0+cGVyX2J1ZmZl cl9kYXRhKQorCQlwZnJlZShwZ3NyLT5wZXJfYnVmZmVyX2RhdGEpOworCXBmcmVlKHBnc3IpOwor fQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvYnVmbWdyLmMgYi9zcmMv YmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYwppbmRleCA3ZDYwMWJlZjZkLi4yMTU3YTk3 Yjk3IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYworKysg Yi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9idWZtZ3IuYwpAQCAtNDcyLDcgKzQ3Miw3IEBA IEZvcmdldFByaXZhdGVSZWZDb3VudEVudHJ5KFByaXZhdGVSZWZDb3VudEVudHJ5ICpyZWYpCiAp CiAKIAotc3RhdGljIEJ1ZmZlciBSZWFkQnVmZmVyX2NvbW1vbihTTWdyUmVsYXRpb24gc21nciwg Y2hhciByZWxwZXJzaXN0ZW5jZSwKK3N0YXRpYyBCdWZmZXIgUmVhZEJ1ZmZlcl9jb21tb24oQnVm ZmVyTWFuYWdlclJlbGF0aW9uIGJtciwKIAkJCQkJCQkJRm9ya051bWJlciBmb3JrTnVtLCBCbG9j a051bWJlciBibG9ja051bSwKIAkJCQkJCQkJUmVhZEJ1ZmZlck1vZGUgbW9kZSwgQnVmZmVyQWNj ZXNzU3RyYXRlZ3kgc3RyYXRlZ3ksCiAJCQkJCQkJCWJvb2wgKmhpdCk7CkBAIC01MDEsNyArNTAx LDcgQEAgc3RhdGljIHVpbnQzMiBXYWl0QnVmSGRyVW5sb2NrZWQoQnVmZmVyRGVzYyAqYnVmKTsK IHN0YXRpYyBpbnQJU3luY09uZUJ1ZmZlcihpbnQgYnVmX2lkLCBib29sIHNraXBfcmVjZW50bHlf dXNlZCwKIAkJCQkJCSAgV3JpdGViYWNrQ29udGV4dCAqd2JfY29udGV4dCk7CiBzdGF0aWMgdm9p ZCBXYWl0SU8oQnVmZmVyRGVzYyAqYnVmKTsKLXN0YXRpYyBib29sIFN0YXJ0QnVmZmVySU8oQnVm ZmVyRGVzYyAqYnVmLCBib29sIGZvcklucHV0KTsKK3N0YXRpYyBib29sIFN0YXJ0QnVmZmVySU8o QnVmZmVyRGVzYyAqYnVmLCBib29sIGZvcklucHV0LCBib29sIG5vd2FpdCk7CiBzdGF0aWMgdm9p ZCBUZXJtaW5hdGVCdWZmZXJJTyhCdWZmZXJEZXNjICpidWYsIGJvb2wgY2xlYXJfZGlydHksCiAJ CQkJCQkJICB1aW50MzIgc2V0X2ZsYWdfYml0cywgYm9vbCBmb3JnZXRfb3duZXIpOwogc3RhdGlj IHZvaWQgQWJvcnRCdWZmZXJJTyhCdWZmZXIgYnVmZmVyKTsKQEAgLTc5NSwxNSArNzk1LDkgQEAg UmVhZEJ1ZmZlckV4dGVuZGVkKFJlbGF0aW9uIHJlbG4sIEZvcmtOdW1iZXIgZm9ya051bSwgQmxv Y2tOdW1iZXIgYmxvY2tOdW0sCiAJCQkJKGVycmNvZGUoRVJSQ09ERV9GRUFUVVJFX05PVF9TVVBQ T1JURUQpLAogCQkJCSBlcnJtc2coImNhbm5vdCBhY2Nlc3MgdGVtcG9yYXJ5IHRhYmxlcyBvZiBv dGhlciBzZXNzaW9ucyIpKSk7CiAKLQkvKgotCSAqIFJlYWQgdGhlIGJ1ZmZlciwgYW5kIHVwZGF0 ZSBwZ3N0YXQgY291bnRlcnMgdG8gcmVmbGVjdCBhIGNhY2hlIGhpdCBvcgotCSAqIG1pc3MuCi0J ICovCi0JcGdzdGF0X2NvdW50X2J1ZmZlcl9yZWFkKHJlbG4pOwotCWJ1ZiA9IFJlYWRCdWZmZXJf Y29tbW9uKFJlbGF0aW9uR2V0U21ncihyZWxuKSwgcmVsbi0+cmRfcmVsLT5yZWxwZXJzaXN0ZW5j ZSwKKwlidWYgPSBSZWFkQnVmZmVyX2NvbW1vbihCTVJfUkVMKHJlbG4pLAogCQkJCQkJCWZvcmtO dW0sIGJsb2NrTnVtLCBtb2RlLCBzdHJhdGVneSwgJmhpdCk7Ci0JaWYgKGhpdCkKLQkJcGdzdGF0 X2NvdW50X2J1ZmZlcl9oaXQocmVsbik7CisKIAlyZXR1cm4gYnVmOwogfQogCkBAIC04MjcsOCAr ODIxLDkgQEAgUmVhZEJ1ZmZlcldpdGhvdXRSZWxjYWNoZShSZWxGaWxlTG9jYXRvciBybG9jYXRv ciwgRm9ya051bWJlciBmb3JrTnVtLAogCiAJU01nclJlbGF0aW9uIHNtZ3IgPSBzbWdyb3Blbihy bG9jYXRvciwgSW52YWxpZEJhY2tlbmRJZCk7CiAKLQlyZXR1cm4gUmVhZEJ1ZmZlcl9jb21tb24o c21nciwgcGVybWFuZW50ID8gUkVMUEVSU0lTVEVOQ0VfUEVSTUFORU5UIDoKLQkJCQkJCQkgUkVM UEVSU0lTVEVOQ0VfVU5MT0dHRUQsIGZvcmtOdW0sIGJsb2NrTnVtLAorCXJldHVybiBSZWFkQnVm ZmVyX2NvbW1vbihCTVJfU01HUihzbWdyLCBwZXJtYW5lbnQgPyBSRUxQRVJTSVNURU5DRV9QRVJN QU5FTlQgOgorCQkJCQkJCQkJICBSRUxQRVJTSVNURU5DRV9VTkxPR0dFRCksCisJCQkJCQkJIGZv cmtOdW0sIGJsb2NrTnVtLAogCQkJCQkJCSBtb2RlLCBzdHJhdGVneSwgJmhpdCk7CiB9CiAKQEAg LTEwMDIsNyArOTk3LDcgQEAgRXh0ZW5kQnVmZmVyZWRSZWxUbyhCdWZmZXJNYW5hZ2VyUmVsYXRp b24gYm1yLAogCQlib29sCQloaXQ7CiAKIAkJQXNzZXJ0KGV4dGVuZGVkX2J5ID09IDApOwotCQli dWZmZXIgPSBSZWFkQnVmZmVyX2NvbW1vbihibXIuc21nciwgYm1yLnJlbHBlcnNpc3RlbmNlLAor CQlidWZmZXIgPSBSZWFkQnVmZmVyX2NvbW1vbihibXIsCiAJCQkJCQkJCSAgIGZvcmssIGV4dGVu ZF90byAtIDEsIG1vZGUsIHN0cmF0ZWd5LAogCQkJCQkJCQkgICAmaGl0KTsKIAl9CkBAIC0xMDE2 LDE4ICsxMDExLDExIEBAIEV4dGVuZEJ1ZmZlcmVkUmVsVG8oQnVmZmVyTWFuYWdlclJlbGF0aW9u IGJtciwKICAqICpoaXQgaXMgc2V0IHRvIHRydWUgaWYgdGhlIHJlcXVlc3Qgd2FzIHNhdGlzZmll ZCBmcm9tIHNoYXJlZCBidWZmZXIgY2FjaGUuCiAgKi8KIHN0YXRpYyBCdWZmZXIKLVJlYWRCdWZm ZXJfY29tbW9uKFNNZ3JSZWxhdGlvbiBzbWdyLCBjaGFyIHJlbHBlcnNpc3RlbmNlLCBGb3JrTnVt YmVyIGZvcmtOdW0sCitSZWFkQnVmZmVyX2NvbW1vbihCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1y LCBGb3JrTnVtYmVyIGZvcmtOdW0sCiAJCQkJICBCbG9ja051bWJlciBibG9ja051bSwgUmVhZEJ1 ZmZlck1vZGUgbW9kZSwKIAkJCQkgIEJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5LCBib29s ICpoaXQpCiB7Ci0JQnVmZmVyRGVzYyAqYnVmSGRyOwotCUJsb2NrCQlidWZCbG9jazsKLQlib29s CQlmb3VuZDsKLQlJT0NvbnRleHQJaW9fY29udGV4dDsKLQlJT09iamVjdAlpb19vYmplY3Q7Ci0J Ym9vbAkJaXNMb2NhbEJ1ZiA9IFNtZ3JJc1RlbXAoc21ncik7Ci0KLQkqaGl0ID0gZmFsc2U7CisJ QnVmZmVyCQlidWZmZXI7CiAKIAkvKgogCSAqIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgcGF0aCwg bW9zdCBjb2RlIHNob3VsZCB1c2UgRXh0ZW5kQnVmZmVyZWRSZWwoKQpAQCAtMTA0NiwxNzUgKzEw MzQsMzM5IEBAIFJlYWRCdWZmZXJfY29tbW9uKFNNZ3JSZWxhdGlvbiBzbWdyLCBjaGFyIHJlbHBl cnNpc3RlbmNlLCBGb3JrTnVtYmVyIGZvcmtOdW0sCiAJCWlmIChtb2RlID09IFJCTV9aRVJPX0FO RF9MT0NLIHx8IG1vZGUgPT0gUkJNX1pFUk9fQU5EX0NMRUFOVVBfTE9DSykKIAkJCWZsYWdzIHw9 IEVCX0xPQ0tfRklSU1Q7CiAKLQkJcmV0dXJuIEV4dGVuZEJ1ZmZlcmVkUmVsKEJNUl9TTUdSKHNt Z3IsIHJlbHBlcnNpc3RlbmNlKSwKLQkJCQkJCQkJIGZvcmtOdW0sIHN0cmF0ZWd5LCBmbGFncyk7 CisJCSpoaXQgPSBmYWxzZTsKKworCQlyZXR1cm4gRXh0ZW5kQnVmZmVyZWRSZWwoYm1yLCBmb3Jr TnVtLCBzdHJhdGVneSwgZmxhZ3MpOwogCX0KIAotCVRSQUNFX1BPU1RHUkVTUUxfQlVGRkVSX1JF QURfU1RBUlQoZm9ya051bSwgYmxvY2tOdW0sCi0JCQkJCQkJCQkgICBzbWdyLT5zbWdyX3Jsb2Nh dG9yLmxvY2F0b3Iuc3BjT2lkLAotCQkJCQkJCQkJICAgc21nci0+c21ncl9ybG9jYXRvci5sb2Nh dG9yLmRiT2lkLAotCQkJCQkJCQkJICAgc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLnJlbE51 bWJlciwKLQkJCQkJCQkJCSAgIHNtZ3ItPnNtZ3JfcmxvY2F0b3IuYmFja2VuZCk7CisJYnVmZmVy ID0gUHJlcGFyZVJlYWRCdWZmZXIoYm1yLAorCQkJCQkJCSAgIGZvcmtOdW0sCisJCQkJCQkJICAg YmxvY2tOdW0sCisJCQkJCQkJICAgc3RyYXRlZ3ksCisJCQkJCQkJICAgaGl0KTsKKworCS8qIEF0 IHRoaXMgcG9pbnQgd2UgZG8gTk9UIGhvbGQgYW55IGxvY2tzLiAqLwogCisJaWYgKG1vZGUgPT0g UkJNX1pFUk9fQU5EX0NMRUFOVVBfTE9DSyB8fCBtb2RlID09IFJCTV9aRVJPX0FORF9MT0NLKQor CXsKKwkJLyogaWYgd2UganVzdCB3YW50IHplcm9lcyBhbmQgYSBsb2NrLCB3ZSdyZSBkb25lICov CisJCVplcm9CdWZmZXIoYnVmZmVyLCBtb2RlKTsKKwl9CisJZWxzZSBpZiAoISpoaXQpCisJewor CQkvKiB3ZSBtaWdodCBuZWVkIHRvIHBlcmZvcm0gSS9PICovCisJCUNvbXBsZXRlUmVhZEJ1ZmZl cnMoYm1yLAorCQkJCQkJCSZidWZmZXIsCisJCQkJCQkJZm9ya051bSwKKwkJCQkJCQlibG9ja051 bSwKKwkJCQkJCQkxLAorCQkJCQkJCW1vZGUgPT0gUkJNX1pFUk9fT05fRVJST1IsCisJCQkJCQkJ c3RyYXRlZ3kpOworCX0KKworCXJldHVybiBidWZmZXI7Cit9CisKKy8qCisgKiBQcmVwYXJlIHRv IHJlYWQgYSBibG9jay4gIFRoZSBidWZmZXIgaXMgcGlubmVkLiAgSWYgdGhpcyBpcyBhICdoaXQn LCB0aGVuCisgKiB0aGUgcmV0dXJuZWQgYnVmZmVyIGNhbiBiZSB1c2VkIGltbWVkaWF0ZWx5LiAg T3RoZXJ3aXNlLCBhIHBoeXNpY2FsIHJlYWQKKyAqIHNob3VsZCBiZSBjb21wbGV0ZWQgd2l0aCBD b21wbGV0ZVJlYWRCdWZmZXJzKCksIG9yIHRoZSBidWZmZXIgc2hvdWxkIGJlCisgKiB6ZXJvZWQg d2l0aCBaZXJvQnVmZmVyKCkuICBQcmVwYXJlUmVhZEJ1ZmZlcigpIGZvbGxvd2VkIGJ5CisgKiBD b21wbGV0ZVJlYWRCdWZmZXJzKCkgb3IgWmVyb0J1ZmZlcigpIGlzIGVxdWl2YWxlbnQgdG8gUmVh ZEJ1ZmZlcigpLCBidXQKKyAqIHRoZSBjYWxsZXIgaGFzIHRoZSBvcHBvcnR1bml0eSB0byBjb21i aW5lIHJlYWRzIG9mIG11bHRpcGxlIG5laWdoYm9yaW5nCisgKiBibG9ja3MgaW50byBvbmUgQ29t cGxldGVSZWFkQnVmZmVycygpIGNhbGwuCisgKgorICogKmZvdW5kUHRyIGlzIHNldCB0byB0cnVl IGZvciBhIGhpdCwgYW5kIGZhbHNlIGZvciBhIG1pc3MuCisgKi8KK0J1ZmZlcgorUHJlcGFyZVJl YWRCdWZmZXIoQnVmZmVyTWFuYWdlclJlbGF0aW9uIGJtciwKKwkJCQkgIEZvcmtOdW1iZXIgZm9y a051bSwKKwkJCQkgIEJsb2NrTnVtYmVyIGJsb2NrTnVtLAorCQkJCSAgQnVmZmVyQWNjZXNzU3Ry YXRlZ3kgc3RyYXRlZ3ksCisJCQkJICBib29sICpmb3VuZFB0cikKK3sKKwlCdWZmZXJEZXNjICpi dWZIZHI7CisJYm9vbAkJaXNMb2NhbEJ1ZjsKKwlJT0NvbnRleHQJaW9fY29udGV4dDsKKwlJT09i amVjdAlpb19vYmplY3Q7CisKKwlBc3NlcnQoYmxvY2tOdW0gIT0gUF9ORVcpOworCisJaWYgKGJt ci5yZWwpCisJeworCQlibXIuc21nciA9IFJlbGF0aW9uR2V0U21ncihibXIucmVsKTsKKwkJYm1y LnJlbHBlcnNpc3RlbmNlID0gYm1yLnJlbC0+cmRfcmVsLT5yZWxwZXJzaXN0ZW5jZTsKKwl9CisK Kwlpc0xvY2FsQnVmID0gU21ncklzVGVtcChibXIuc21ncik7CiAJaWYgKGlzTG9jYWxCdWYpCiAJ ewotCQkvKgotCQkgKiBXZSBkbyBub3QgdXNlIGEgQnVmZmVyQWNjZXNzU3RyYXRlZ3kgZm9yIEkv TyBvZiB0ZW1wb3JhcnkgdGFibGVzLgotCQkgKiBIb3dldmVyLCBpbiBzb21lIGNhc2VzLCB0aGUg InN0cmF0ZWd5IiBtYXkgbm90IGJlIE5VTEwsIHNvIHdlIGNhbid0Ci0JCSAqIHJlbHkgb24gSU9D b250ZXh0Rm9yU3RyYXRlZ3koKSB0byBzZXQgdGhlIHJpZ2h0IElPQ29udGV4dCBmb3IgdXMuCi0J CSAqIFRoaXMgbWF5IGhhcHBlbiBpbiBjYXNlcyBsaWtlIENSRUFURSBURU1QT1JBUlkgVEFCTEUg QVMuLi4KLQkJICovCiAJCWlvX2NvbnRleHQgPSBJT0NPTlRFWFRfTk9STUFMOwogCQlpb19vYmpl Y3QgPSBJT09CSkVDVF9URU1QX1JFTEFUSU9OOwotCQlidWZIZHIgPSBMb2NhbEJ1ZmZlckFsbG9j KHNtZ3IsIGZvcmtOdW0sIGJsb2NrTnVtLCAmZm91bmQpOwotCQlpZiAoZm91bmQpCi0JCQlwZ0J1 ZmZlclVzYWdlLmxvY2FsX2Jsa3NfaGl0Kys7Ci0JCWVsc2UgaWYgKG1vZGUgPT0gUkJNX05PUk1B TCB8fCBtb2RlID09IFJCTV9OT1JNQUxfTk9fTE9HIHx8Ci0JCQkJIG1vZGUgPT0gUkJNX1pFUk9f T05fRVJST1IpCi0JCQlwZ0J1ZmZlclVzYWdlLmxvY2FsX2Jsa3NfcmVhZCsrOwogCX0KIAllbHNl CiAJewotCQkvKgotCQkgKiBsb29rdXAgdGhlIGJ1ZmZlci4gIElPX0lOX1BST0dSRVNTIGlzIHNl dCBpZiB0aGUgcmVxdWVzdGVkIGJsb2NrIGlzCi0JCSAqIG5vdCBjdXJyZW50bHkgaW4gbWVtb3J5 LgotCQkgKi8KIAkJaW9fY29udGV4dCA9IElPQ29udGV4dEZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsK IAkJaW9fb2JqZWN0ID0gSU9PQkpFQ1RfUkVMQVRJT047Ci0JCWJ1ZkhkciA9IEJ1ZmZlckFsbG9j KHNtZ3IsIHJlbHBlcnNpc3RlbmNlLCBmb3JrTnVtLCBibG9ja051bSwKLQkJCQkJCQkgc3RyYXRl Z3ksICZmb3VuZCwgaW9fY29udGV4dCk7Ci0JCWlmIChmb3VuZCkKLQkJCXBnQnVmZmVyVXNhZ2Uu c2hhcmVkX2Jsa3NfaGl0Kys7Ci0JCWVsc2UgaWYgKG1vZGUgPT0gUkJNX05PUk1BTCB8fCBtb2Rl ID09IFJCTV9OT1JNQUxfTk9fTE9HIHx8Ci0JCQkJIG1vZGUgPT0gUkJNX1pFUk9fT05fRVJST1Ip Ci0JCQlwZ0J1ZmZlclVzYWdlLnNoYXJlZF9ibGtzX3JlYWQrKzsKIAl9CiAKLQkvKiBBdCB0aGlz IHBvaW50IHdlIGRvIE5PVCBob2xkIGFueSBsb2Nrcy4gKi8KKwlUUkFDRV9QT1NUR1JFU1FMX0JV RkZFUl9SRUFEX1NUQVJUKGZvcmtOdW0sIGJsb2NrTnVtLAorCQkJCQkJCQkJICAgYm1yLnNtZ3It PnNtZ3JfcmxvY2F0b3IubG9jYXRvci5zcGNPaWQsCisJCQkJCQkJCQkgICBibXIuc21nci0+c21n cl9ybG9jYXRvci5sb2NhdG9yLmRiT2lkLAorCQkJCQkJCQkJICAgYm1yLnNtZ3ItPnNtZ3Jfcmxv Y2F0b3IubG9jYXRvci5yZWxOdW1iZXIsCisJCQkJCQkJCQkgICBibXIuc21nci0+c21ncl9ybG9j YXRvci5iYWNrZW5kKTsKIAotCS8qIGlmIGl0IHdhcyBhbHJlYWR5IGluIHRoZSBidWZmZXIgcG9v bCwgd2UncmUgZG9uZSAqLwotCWlmIChmb3VuZCkKKwlSZXNvdXJjZU93bmVyRW5sYXJnZShDdXJy ZW50UmVzb3VyY2VPd25lcik7CisJaWYgKGlzTG9jYWxCdWYpCisJeworCQlidWZIZHIgPSBMb2Nh bEJ1ZmZlckFsbG9jKGJtci5zbWdyLCBmb3JrTnVtLCBibG9ja051bSwgZm91bmRQdHIpOworCQlp ZiAoKmZvdW5kUHRyKQorCQkJcGdCdWZmZXJVc2FnZS5sb2NhbF9ibGtzX2hpdCsrOworCX0KKwll bHNlCisJeworCQlidWZIZHIgPSBCdWZmZXJBbGxvYyhibXIuc21nciwgYm1yLnJlbHBlcnNpc3Rl bmNlLCBmb3JrTnVtLCBibG9ja051bSwKKwkJCQkJCQkgc3RyYXRlZ3ksIGZvdW5kUHRyLCBpb19j b250ZXh0KTsKKwkJaWYgKCpmb3VuZFB0cikKKwkJCXBnQnVmZmVyVXNhZ2Uuc2hhcmVkX2Jsa3Nf aGl0Kys7CisJfQorCWlmIChibXIucmVsKQorCXsKKwkJLyoKKwkJICogV2hpbGUgcGdCdWZmZXJV c2FnZSdzICJyZWFkIiBjb3VudGVyIGlzbid0IGJ1bXBlZCB1bmxlc3Mgd2UgcmVhY2gKKwkJICog Q29tcGxldGVSZWFkQnVmZmVycygpIChzbywgbm90IGZvciBoaXRzLCBhbmQgbm90IGZvciBidWZm ZXJzIHRoYXQKKwkJICogYXJlIHplcm9lZCBpbnN0ZWFkKSwgdGhlIHBlci1yZWxhdGlvbiBzdGF0 cyBhbHdheXMgY291bnQgdGhlbS4KKwkJICovCisJCXBnc3RhdF9jb3VudF9idWZmZXJfcmVhZChi bXIucmVsKTsKKwkJaWYgKCpmb3VuZFB0cikKKwkJCXBnc3RhdF9jb3VudF9idWZmZXJfaGl0KGJt ci5yZWwpOworCX0KKwlpZiAoKmZvdW5kUHRyKQogCXsKLQkJLyogSnVzdCBuZWVkIHRvIHVwZGF0 ZSBzdGF0cyBiZWZvcmUgd2UgZXhpdCAqLwotCQkqaGl0ID0gdHJ1ZTsKIAkJVmFjdXVtUGFnZUhp dCsrOwogCQlwZ3N0YXRfY291bnRfaW9fb3AoaW9fb2JqZWN0LCBpb19jb250ZXh0LCBJT09QX0hJ VCk7Ci0KIAkJaWYgKFZhY3V1bUNvc3RBY3RpdmUpCiAJCQlWYWN1dW1Db3N0QmFsYW5jZSArPSBW YWN1dW1Db3N0UGFnZUhpdDsKIAogCQlUUkFDRV9QT1NUR1JFU1FMX0JVRkZFUl9SRUFEX0RPTkUo Zm9ya051bSwgYmxvY2tOdW0sCi0JCQkJCQkJCQkJICBzbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0 b3Iuc3BjT2lkLAotCQkJCQkJCQkJCSAgc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLmRiT2lk LAotCQkJCQkJCQkJCSAgc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLnJlbE51bWJlciwKLQkJ CQkJCQkJCQkgIHNtZ3ItPnNtZ3JfcmxvY2F0b3IuYmFja2VuZCwKLQkJCQkJCQkJCQkgIGZvdW5k KTsKKwkJCQkJCQkJCQkgIGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3Iuc3BjT2lkLAor CQkJCQkJCQkJCSAgYm1yLnNtZ3ItPnNtZ3JfcmxvY2F0b3IubG9jYXRvci5kYk9pZCwKKwkJCQkJ CQkJCQkgIGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3IucmVsTnVtYmVyLAorCQkJCQkJ CQkJCSAgYm1yLnNtZ3ItPnNtZ3JfcmxvY2F0b3IuYmFja2VuZCwKKwkJCQkJCQkJCQkgIHRydWUp OworCX0KIAotCQkvKgotCQkgKiBJbiBSQk1fWkVST19BTkRfTE9DSyBtb2RlIHRoZSBjYWxsZXIg ZXhwZWN0cyB0aGUgcGFnZSB0byBiZSBsb2NrZWQKLQkJICogb24gcmV0dXJuLgotCQkgKi8KLQkJ aWYgKCFpc0xvY2FsQnVmKQotCQl7Ci0JCQlpZiAobW9kZSA9PSBSQk1fWkVST19BTkRfTE9DSykK LQkJCQlMV0xvY2tBY3F1aXJlKEJ1ZmZlckRlc2NyaXB0b3JHZXRDb250ZW50TG9jayhidWZIZHIp LAotCQkJCQkJCSAgTFdfRVhDTFVTSVZFKTsKLQkJCWVsc2UgaWYgKG1vZGUgPT0gUkJNX1pFUk9f QU5EX0NMRUFOVVBfTE9DSykKLQkJCQlMb2NrQnVmZmVyRm9yQ2xlYW51cChCdWZmZXJEZXNjcmlw dG9yR2V0QnVmZmVyKGJ1ZkhkcikpOwotCQl9CisJcmV0dXJuIEJ1ZmZlckRlc2NyaXB0b3JHZXRC dWZmZXIoYnVmSGRyKTsKK30KIAotCQlyZXR1cm4gQnVmZmVyRGVzY3JpcHRvckdldEJ1ZmZlcihi dWZIZHIpOworc3RhdGljIGlubGluZSBib29sCitDb21wbGV0ZVJlYWRCdWZmZXJzQ2FuU3RhcnRJ TyhCdWZmZXIgYnVmZmVyLCBib29sIG5vd2FpdCkKK3sKKwlpZiAoQnVmZmVySXNMb2NhbChidWZm ZXIpKQorCXsKKwkJQnVmZmVyRGVzYyAqYnVmSGRyID0gR2V0TG9jYWxCdWZmZXJEZXNjcmlwdG9y KC1idWZmZXIgLSAxKTsKKworCQlyZXR1cm4gKHBnX2F0b21pY19yZWFkX3UzMigmYnVmSGRyLT5z dGF0ZSkgJiBCTV9WQUxJRCkgPT0gMDsKIAl9CisJZWxzZQorCQlyZXR1cm4gU3RhcnRCdWZmZXJJ TyhHZXRCdWZmZXJEZXNjcmlwdG9yKGJ1ZmZlciAtIDEpLCB0cnVlLCBub3dhaXQpOworfQogCi0J LyoKLQkgKiBpZiB3ZSBoYXZlIGdvdHRlbiB0byB0aGlzIHBvaW50LCB3ZSBoYXZlIGFsbG9jYXRl ZCBhIGJ1ZmZlciBmb3IgdGhlCi0JICogcGFnZSBidXQgaXRzIGNvbnRlbnRzIGFyZSBub3QgeWV0 IHZhbGlkLiAgSU9fSU5fUFJPR1JFU1MgaXMgc2V0IGZvciBpdCwKLQkgKiBpZiBpdCdzIGEgc2hh cmVkIGJ1ZmZlci4KLQkgKi8KLQlBc3NlcnQoIShwZ19hdG9taWNfcmVhZF91MzIoJmJ1Zkhkci0+ c3RhdGUpICYgQk1fVkFMSUQpKTsJLyogc3BpbmxvY2sgbm90IG5lZWRlZCAqLworLyoKKyAqIENv bXBsZXRlIGEgc2V0IHJlYWRzIHByZXBhcmVkIHdpdGggUHJlcGFyZVJlYWRCdWZmZXJzKCkuICBU aGUgYnVmZmVycyBtdXN0CisgKiBjb3ZlciBhIGNsdXN0ZXIgb2YgbmVpZ2hib3JpbmcgYmxvY2sg bnVtYmVycy4KKyAqCisgKiBUeXBpY2FsbHkgdGhpcyBwZXJmb3JtcyBvbmUgcGh5c2ljYWwgdmVj dG9yIHJlYWQgY292ZXJpbmcgdGhlIGJsb2NrIHJhbmdlLAorICogYnV0IGlmIHNvbWUgb2YgdGhl IGJ1ZmZlcnMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZCBpbiB0aGUgbWVhbnRpbWUgYnkgYW55Cisg KiBiYWNrZW5kLCB6ZXJvIG9yIG11bHRpcGxlIHJlYWRzIG1heSBiZSBwZXJmb3JtZWQuCisgKi8K K3ZvaWQKK0NvbXBsZXRlUmVhZEJ1ZmZlcnMoQnVmZmVyTWFuYWdlclJlbGF0aW9uIGJtciwKKwkJ CQkJQnVmZmVyICpidWZmZXJzLAorCQkJCQlGb3JrTnVtYmVyIGZvcmtudW0sCisJCQkJCUJsb2Nr TnVtYmVyIGJsb2NrbnVtLAorCQkJCQlpbnQgbmJsb2NrcywKKwkJCQkJYm9vbCB6ZXJvX29uX2Vy cm9yLAorCQkJCQlCdWZmZXJBY2Nlc3NTdHJhdGVneSBzdHJhdGVneSkKK3sKKwlib29sCQlpc0xv Y2FsQnVmOworCUlPQ29udGV4dAlpb19jb250ZXh0OworCUlPT2JqZWN0CWlvX29iamVjdDsKIAot CWJ1ZkJsb2NrID0gaXNMb2NhbEJ1ZiA/IExvY2FsQnVmSGRyR2V0QmxvY2soYnVmSGRyKSA6IEJ1 ZkhkckdldEJsb2NrKGJ1Zkhkcik7CisJaWYgKGJtci5yZWwpCisJeworCQlibXIuc21nciA9IFJl bGF0aW9uR2V0U21ncihibXIucmVsKTsKKwkJYm1yLnJlbHBlcnNpc3RlbmNlID0gYm1yLnJlbC0+ cmRfcmVsLT5yZWxwZXJzaXN0ZW5jZTsKKwl9CisKKwlpc0xvY2FsQnVmID0gU21ncklzVGVtcChi bXIuc21ncik7CisJaWYgKGlzTG9jYWxCdWYpCisJeworCQlpb19jb250ZXh0ID0gSU9DT05URVhU X05PUk1BTDsKKwkJaW9fb2JqZWN0ID0gSU9PQkpFQ1RfVEVNUF9SRUxBVElPTjsKKwl9CisJZWxz ZQorCXsKKwkJaW9fY29udGV4dCA9IElPQ29udGV4dEZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKKwkJ aW9fb2JqZWN0ID0gSU9PQkpFQ1RfUkVMQVRJT047CisJfQogCiAJLyoKLQkgKiBSZWFkIGluIHRo ZSBwYWdlLCB1bmxlc3MgdGhlIGNhbGxlciBpbnRlbmRzIHRvIG92ZXJ3cml0ZSBpdCBhbmQganVz dAotCSAqIHdhbnRzIHVzIHRvIGFsbG9jYXRlIGEgYnVmZmVyLgorCSAqIFdlIGNvdW50IGFsbCB0 aGVzZSBibG9ja3MgYXMgcmVhZCBieSB0aGlzIGJhY2tlbmQuICBUaGlzIGlzIHRyYWRpdGlvbmFs CisJICogYmVoYXZpb3IsIGJ1dCBtaWdodCB0dXJuIG91dCB0byBiZSBub3QgdHJ1ZSBpZiB3ZSBm aW5kIHRoYXQgc29tZW9uZQorCSAqIGVsc2UgaGFzIGJlYXRlbiB1cyBhbmQgY29tcGxldGVkIHRo ZSByZWFkIG9mIHNvbWUgb2YgdGhlc2UgYmxvY2tzLiAgSW4KKwkgKiB0aGF0IGNhc2UgdGhlIHN5 c3RlbSBnbG9iYWxseSBkb3VibGUtY291bnRzLCBidXQgd2UgdHJhZGl0aW9uYWxseSBkb24ndAor CSAqIGNvdW50IHRoaXMgYXMgYSAiaGl0IiwgYW5kIHdlIGRvbid0IGhhdmUgYSBzZXBhcmF0ZSBj b3VudGVyIGZvciAibWlzcywKKwkgKiBidXQgYW5vdGhlciBiYWNrZW5kIGNvbXBsZXRlZCB0aGUg cmVhZCIuCiAJICovCi0JaWYgKG1vZGUgPT0gUkJNX1pFUk9fQU5EX0xPQ0sgfHwgbW9kZSA9PSBS Qk1fWkVST19BTkRfQ0xFQU5VUF9MT0NLKQotCQlNZW1TZXQoKGNoYXIgKikgYnVmQmxvY2ssIDAs IEJMQ0tTWik7CisJaWYgKGlzTG9jYWxCdWYpCisJCXBnQnVmZmVyVXNhZ2UubG9jYWxfYmxrc19y ZWFkICs9IG5ibG9ja3M7CiAJZWxzZQorCQlwZ0J1ZmZlclVzYWdlLnNoYXJlZF9ibGtzX3JlYWQg Kz0gbmJsb2NrczsKKworCWZvciAoaW50IGkgPSAwOyBpIDwgbmJsb2NrczsgKytpKQogCXsKLQkJ aW5zdHJfdGltZQlpb19zdGFydCA9IHBnc3RhdF9wcmVwYXJlX2lvX3RpbWUodHJhY2tfaW9fdGlt aW5nKTsKKwkJaW50CQkJaW9fYnVmZmVyc19sZW47CisJCUJ1ZmZlcgkJaW9fYnVmZmVyc1tNQVhf QlVGRkVSU19QRVJfVFJBTlNGRVJdOworCQl2b2lkCSAgICppb19wYWdlc1tNQVhfQlVGRkVSU19Q RVJfVFJBTlNGRVJdOworCQlpbnN0cl90aW1lCWlvX3N0YXJ0OworCQlCbG9ja051bWJlciBpb19m aXJzdF9ibG9jazsKIAotCQlzbWdycmVhZChzbWdyLCBmb3JrTnVtLCBibG9ja051bSwgYnVmQmxv Y2spOworI2lmZGVmIFVTRV9BU1NFUlRfQ0hFQ0tJTkcKIAotCQlwZ3N0YXRfY291bnRfaW9fb3Bf dGltZShpb19vYmplY3QsIGlvX2NvbnRleHQsCi0JCQkJCQkJCUlPT1BfUkVBRCwgaW9fc3RhcnQs IDEpOworCQkvKgorCQkgKiBXZSBjb3VsZCBnZXQgYWxsIHRoZSBpbmZvcm1hdGlvbiBmcm9tIGJ1 ZmZlciBoZWFkZXJzLCBidXQgaXQgY2FuIGJlCisJCSAqIGV4cGVuc2l2ZSB0byBhY2Nlc3MgYnVm ZmVyIGhlYWRlciBjYWNoZSBsaW5lcyBzbyB3ZSBtYWtlIHRoZSBjYWxsZXIKKwkJICogcHJvdmlk ZSBhbGwgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQsIGFuZCBhc3NlcnQgdGhhdCBpdCBpcworCQkg KiBjb25zaXN0ZW50LgorCQkgKi8KKwkJeworCQkJUmVsRmlsZUxvY2F0b3IgeGxvY2F0b3I7CisJ CQlGb3JrTnVtYmVyCXhmb3JrbnVtOworCQkJQmxvY2tOdW1iZXIgeGJsb2NrbnVtOworCisJCQlC dWZmZXJHZXRUYWcoYnVmZmVyc1tpXSwgJnhsb2NhdG9yLCAmeGZvcmtudW0sICZ4YmxvY2tudW0p OworCQkJQXNzZXJ0KFJlbEZpbGVMb2NhdG9yRXF1YWxzKGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9y LmxvY2F0b3IsIHhsb2NhdG9yKSk7CisJCQlBc3NlcnQoeGZvcmtudW0gPT0gZm9ya251bSk7CisJ CQlBc3NlcnQoeGJsb2NrbnVtID09IGJsb2NrbnVtICsgaSk7CisJCX0KKyNlbmRpZgorCisJCS8q CisJCSAqIFNraXAgdGhpcyBibG9jayBpZiBzb21lb25lIGVsc2UgaGFzIGFscmVhZHkgY29tcGxl dGVkIGl0LiAgSWYgYW4KKwkJICogSS9PIGlzIGFscmVhZHkgaW4gcHJvZ3Jlc3MgaW4gYW5vdGhl ciBiYWNrZW5kLCB0aGlzIHdpbGwgd2FpdCBmb3IKKwkJICogdGhlIG91dGNvbWU6IGVpdGhlciBk b25lLCBvciBzb21ldGhpbmcgd2VudCB3cm9uZyBhbmQgd2Ugd2lsbAorCQkgKiByZXRyeS4KKwkJ ICovCisJCWlmICghQ29tcGxldGVSZWFkQnVmZmVyc0NhblN0YXJ0SU8oYnVmZmVyc1tpXSwgZmFs c2UpKQorCQl7CisJCQkvKgorCQkJICogUmVwb3J0IHRoaXMgYXMgYSAnaGl0JyBmb3IgdGhpcyBi YWNrZW5kLCBldmVuIHRob3VnaCBpdCBtdXN0CisJCQkgKiBoYXZlIHN0YXJ0ZWQgb3V0IGFzIGEg bWlzcyBpbiBQcmVwYXJlUmVhZEJ1ZmZlcigpLgorCQkJICovCisJCQlUUkFDRV9QT1NUR1JFU1FM X0JVRkZFUl9SRUFEX0RPTkUoZm9ya251bSwgYmxvY2tudW0gKyBpLAorCQkJCQkJCQkJCQkgIGJt ci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3Iuc3BjT2lkLAorCQkJCQkJCQkJCQkgIGJtci5z bWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3IuZGJPaWQsCisJCQkJCQkJCQkJCSAgYm1yLnNtZ3It PnNtZ3JfcmxvY2F0b3IubG9jYXRvci5yZWxOdW1iZXIsCisJCQkJCQkJCQkJCSAgYm1yLnNtZ3It PnNtZ3JfcmxvY2F0b3IuYmFja2VuZCwKKwkJCQkJCQkJCQkJICB0cnVlKTsKKwkJCWNvbnRpbnVl OworCQl9CisKKwkJLyogV2UgZm91bmQgYSBidWZmZXIgdGhhdCB3ZSBuZWVkIHRvIHJlYWQgaW4u ICovCisJCWlvX2J1ZmZlcnNbMF0gPSBidWZmZXJzW2ldOworCQlpb19wYWdlc1swXSA9IEJ1ZmZl ckdldEJsb2NrKGJ1ZmZlcnNbaV0pOworCQlpb19maXJzdF9ibG9jayA9IGJsb2NrbnVtICsgaTsK KwkJaW9fYnVmZmVyc19sZW4gPSAxOwogCi0JCS8qIGNoZWNrIGZvciBnYXJiYWdlIGRhdGEgKi8K LQkJaWYgKCFQYWdlSXNWZXJpZmllZEV4dGVuZGVkKChQYWdlKSBidWZCbG9jaywgYmxvY2tOdW0s Ci0JCQkJCQkJCQlQSVZfTE9HX1dBUk5JTkcgfCBQSVZfUkVQT1JUX1NUQVQpKQorCQkvKgorCQkg KiBIb3cgbWFueSBuZWlnaGJvcmluZy1vbi1kaXNrIGJsb2NrcyBjYW4gd2UgY2FuIHNjYXR0ZXIt cmVhZCBpbnRvCisJCSAqIG90aGVyIGJ1ZmZlcnMgYXQgdGhlIHNhbWUgdGltZT8gIEluIHRoaXMg Y2FzZSB3ZSBkb24ndCB3YWl0IGlmIHdlCisJCSAqIHNlZSBhbiBJL08gYWxyZWFkeSBpbiBwcm9n cmVzcy4gIFdlIGFscmVhZHkgaG9sZCBCTV9JT19JTl9QUk9HUkVTUworCQkgKiBmb3IgdGhlIGhl YWQgYmxvY2ssIHNvIHdlIHNob3VsZCBnZXQgb24gd2l0aCB0aGF0IEkvTyBhcyBzb29uIGFzCisJ CSAqIHBvc3NpYmxlLiAgV2UnbGwgY29tZSBiYWNrIHRvIHRoaXMgYmxvY2sgYWdhaW4sIGFib3Zl LgorCQkgKi8KKwkJd2hpbGUgKChpICsgMSkgPCBuYmxvY2tzICYmCisJCQkgICBDb21wbGV0ZVJl YWRCdWZmZXJzQ2FuU3RhcnRJTyhidWZmZXJzW2kgKyAxXSwgdHJ1ZSkpCisJCXsKKwkJCS8qIE11 c3QgYmUgY29uc2VjdXRpdmUgYmxvY2sgbnVtYmVycy4gKi8KKwkJCUFzc2VydChCdWZmZXJHZXRC bG9ja051bWJlcihidWZmZXJzW2kgKyAxXSkgPT0KKwkJCQkgICBCdWZmZXJHZXRCbG9ja051bWJl cihidWZmZXJzW2ldKSArIDEpOworCisJCQlpb19idWZmZXJzW2lvX2J1ZmZlcnNfbGVuXSA9IGJ1 ZmZlcnNbKytpXTsKKwkJCWlvX3BhZ2VzW2lvX2J1ZmZlcnNfbGVuKytdID0gQnVmZmVyR2V0Qmxv Y2soYnVmZmVyc1tpXSk7CisJCX0KKworCQlpb19zdGFydCA9IHBnc3RhdF9wcmVwYXJlX2lvX3Rp bWUodHJhY2tfaW9fdGltaW5nKTsKKwkJc21ncnJlYWR2KGJtci5zbWdyLCBmb3JrbnVtLCBpb19m aXJzdF9ibG9jaywgaW9fcGFnZXMsIGlvX2J1ZmZlcnNfbGVuKTsKKwkJcGdzdGF0X2NvdW50X2lv X29wX3RpbWUoaW9fb2JqZWN0LCBpb19jb250ZXh0LCBJT09QX1JFQUQsIGlvX3N0YXJ0LAorCQkJ CQkJCQlpb19idWZmZXJzX2xlbik7CisKKwkJLyogVmVyaWZ5IGVhY2ggYmxvY2sgd2UgcmVhZCwg YW5kIHRlcm1pbmF0ZSB0aGUgSS9PLiAqLworCQlmb3IgKGludCBqID0gMDsgaiA8IGlvX2J1ZmZl cnNfbGVuOyArK2opCiAJCXsKLQkJCWlmIChtb2RlID09IFJCTV9aRVJPX09OX0VSUk9SIHx8IHpl cm9fZGFtYWdlZF9wYWdlcykKKwkJCUJ1ZmZlckRlc2MgKmJ1ZkhkcjsKKwkJCUJsb2NrCQlidWZC bG9jazsKKworCQkJaWYgKGlzTG9jYWxCdWYpCiAJCQl7Ci0JCQkJZXJlcG9ydChXQVJOSU5HLAot CQkJCQkJKGVycmNvZGUoRVJSQ09ERV9EQVRBX0NPUlJVUFRFRCksCi0JCQkJCQkgZXJybXNnKCJp bnZhbGlkIHBhZ2UgaW4gYmxvY2sgJXUgb2YgcmVsYXRpb24gJXM7IHplcm9pbmcgb3V0IHBhZ2Ui LAotCQkJCQkJCQlibG9ja051bSwKLQkJCQkJCQkJcmVscGF0aChzbWdyLT5zbWdyX3Jsb2NhdG9y LCBmb3JrTnVtKSkpKTsKLQkJCQlNZW1TZXQoKGNoYXIgKikgYnVmQmxvY2ssIDAsIEJMQ0tTWik7 CisJCQkJYnVmSGRyID0gR2V0TG9jYWxCdWZmZXJEZXNjcmlwdG9yKC1pb19idWZmZXJzW2pdIC0g MSk7CisJCQkJYnVmQmxvY2sgPSBMb2NhbEJ1ZkhkckdldEJsb2NrKGJ1Zkhkcik7CiAJCQl9CiAJ CQllbHNlCi0JCQkJZXJlcG9ydChFUlJPUiwKLQkJCQkJCShlcnJjb2RlKEVSUkNPREVfREFUQV9D T1JSVVBURUQpLAotCQkJCQkJIGVycm1zZygiaW52YWxpZCBwYWdlIGluIGJsb2NrICV1IG9mIHJl bGF0aW9uICVzIiwKLQkJCQkJCQkJYmxvY2tOdW0sCi0JCQkJCQkJCXJlbHBhdGgoc21nci0+c21n cl9ybG9jYXRvciwgZm9ya051bSkpKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEluIFJCTV9aRVJP X0FORF9MT0NLIC8gUkJNX1pFUk9fQU5EX0NMRUFOVVBfTE9DSyBtb2RlLCBncmFiIHRoZSBidWZm ZXIKLQkgKiBjb250ZW50IGxvY2sgYmVmb3JlIG1hcmtpbmcgdGhlIHBhZ2UgYXMgdmFsaWQsIHRv IG1ha2Ugc3VyZSB0aGF0IG5vCi0JICogb3RoZXIgYmFja2VuZCBzZWVzIHRoZSB6ZXJvZWQgcGFn ZSBiZWZvcmUgdGhlIGNhbGxlciBoYXMgaGFkIGEgY2hhbmNlCi0JICogdG8gaW5pdGlhbGl6ZSBp dC4KLQkgKgotCSAqIFNpbmNlIG5vLW9uZSBlbHNlIGNhbiBiZSBsb29raW5nIGF0IHRoZSBwYWdl IGNvbnRlbnRzIHlldCwgdGhlcmUgaXMgbm8KLQkgKiBkaWZmZXJlbmNlIGJldHdlZW4gYW4gZXhj bHVzaXZlIGxvY2sgYW5kIGEgY2xlYW51cC1zdHJlbmd0aCBsb2NrLiAoTm90ZQotCSAqIHRoYXQg d2UgY2Fubm90IHVzZSBMb2NrQnVmZmVyKCkgb3IgTG9ja0J1ZmZlckZvckNsZWFudXAoKSBoZXJl LCBiZWNhdXNlCi0JICogdGhleSBhc3NlcnQgdGhhdCB0aGUgYnVmZmVyIGlzIGFscmVhZHkgdmFs aWQuKQotCSAqLwotCWlmICgobW9kZSA9PSBSQk1fWkVST19BTkRfTE9DSyB8fCBtb2RlID09IFJC TV9aRVJPX0FORF9DTEVBTlVQX0xPQ0spICYmCi0JCSFpc0xvY2FsQnVmKQotCXsKLQkJTFdMb2Nr QWNxdWlyZShCdWZmZXJEZXNjcmlwdG9yR2V0Q29udGVudExvY2soYnVmSGRyKSwgTFdfRVhDTFVT SVZFKTsKLQl9CisJCQl7CisJCQkJYnVmSGRyID0gR2V0QnVmZmVyRGVzY3JpcHRvcihpb19idWZm ZXJzW2pdIC0gMSk7CisJCQkJYnVmQmxvY2sgPSBCdWZIZHJHZXRCbG9jayhidWZIZHIpOworCQkJ fQogCi0JaWYgKGlzTG9jYWxCdWYpCi0JewotCQkvKiBPbmx5IG5lZWQgdG8gYWRqdXN0IGZsYWdz ICovCi0JCXVpbnQzMgkJYnVmX3N0YXRlID0gcGdfYXRvbWljX3JlYWRfdTMyKCZidWZIZHItPnN0 YXRlKTsKKwkJCS8qIGNoZWNrIGZvciBnYXJiYWdlIGRhdGEgKi8KKwkJCWlmICghUGFnZUlzVmVy aWZpZWRFeHRlbmRlZCgoUGFnZSkgYnVmQmxvY2ssIGlvX2ZpcnN0X2Jsb2NrICsgaiwKKwkJCQkJ CQkJCQlQSVZfTE9HX1dBUk5JTkcgfCBQSVZfUkVQT1JUX1NUQVQpKQorCQkJeworCQkJCWlmICh6 ZXJvX29uX2Vycm9yIHx8IHplcm9fZGFtYWdlZF9wYWdlcykKKwkJCQl7CisJCQkJCWVyZXBvcnQo V0FSTklORywKKwkJCQkJCQkoZXJyY29kZShFUlJDT0RFX0RBVEFfQ09SUlVQVEVEKSwKKwkJCQkJ CQkgZXJybXNnKCJpbnZhbGlkIHBhZ2UgaW4gYmxvY2sgJXUgb2YgcmVsYXRpb24gJXM7IHplcm9p bmcgb3V0IHBhZ2UiLAorCQkJCQkJCQkJaW9fZmlyc3RfYmxvY2sgKyBqLAorCQkJCQkJCQkJcmVs cGF0aChibXIuc21nci0+c21ncl9ybG9jYXRvciwgZm9ya251bSkpKSk7CisJCQkJCW1lbXNldChi dWZCbG9jaywgMCwgQkxDS1NaKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQllcmVwb3J0KEVSUk9S LAorCQkJCQkJCShlcnJjb2RlKEVSUkNPREVfREFUQV9DT1JSVVBURUQpLAorCQkJCQkJCSBlcnJt c2coImludmFsaWQgcGFnZSBpbiBibG9jayAldSBvZiByZWxhdGlvbiAlcyIsCisJCQkJCQkJCQlp b19maXJzdF9ibG9jayArIGosCisJCQkJCQkJCQlyZWxwYXRoKGJtci5zbWdyLT5zbWdyX3Jsb2Nh dG9yLCBmb3JrbnVtKSkpKTsKKwkJCX0KIAotCQlidWZfc3RhdGUgfD0gQk1fVkFMSUQ7Ci0JCXBn X2F0b21pY191bmxvY2tlZF93cml0ZV91MzIoJmJ1Zkhkci0+c3RhdGUsIGJ1Zl9zdGF0ZSk7Ci0J fQotCWVsc2UKLQl7Ci0JCS8qIFNldCBCTV9WQUxJRCwgdGVybWluYXRlIElPLCBhbmQgd2FrZSB1 cCBhbnkgd2FpdGVycyAqLwotCQlUZXJtaW5hdGVCdWZmZXJJTyhidWZIZHIsIGZhbHNlLCBCTV9W QUxJRCwgdHJ1ZSk7Ci0JfQorCQkJLyogVGVybWluYXRlIEkvTyBhbmQgc2V0IEJNX1ZBTElELiAq LworCQkJaWYgKGlzTG9jYWxCdWYpCisJCQl7CisJCQkJdWludDMyCQlidWZfc3RhdGUgPSBwZ19h dG9taWNfcmVhZF91MzIoJmJ1Zkhkci0+c3RhdGUpOwogCi0JVmFjdXVtUGFnZU1pc3MrKzsKLQlp ZiAoVmFjdXVtQ29zdEFjdGl2ZSkKLQkJVmFjdXVtQ29zdEJhbGFuY2UgKz0gVmFjdXVtQ29zdFBh Z2VNaXNzOworCQkJCWJ1Zl9zdGF0ZSB8PSBCTV9WQUxJRDsKKwkJCQlwZ19hdG9taWNfdW5sb2Nr ZWRfd3JpdGVfdTMyKCZidWZIZHItPnN0YXRlLCBidWZfc3RhdGUpOworCQkJfQorCQkJZWxzZQor CQkJeworCQkJCS8qIFNldCBCTV9WQUxJRCwgdGVybWluYXRlIElPLCBhbmQgd2FrZSB1cCBhbnkg d2FpdGVycyAqLworCQkJCVRlcm1pbmF0ZUJ1ZmZlcklPKGJ1ZkhkciwgZmFsc2UsIEJNX1ZBTElE LCB0cnVlKTsKKwkJCX0KIAotCVRSQUNFX1BPU1RHUkVTUUxfQlVGRkVSX1JFQURfRE9ORShmb3Jr TnVtLCBibG9ja051bSwKLQkJCQkJCQkJCSAgc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLnNw Y09pZCwKLQkJCQkJCQkJCSAgc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLmRiT2lkLAotCQkJ CQkJCQkJICBzbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3IucmVsTnVtYmVyLAotCQkJCQkJCQkJ ICBzbWdyLT5zbWdyX3Jsb2NhdG9yLmJhY2tlbmQsCi0JCQkJCQkJCQkgIGZvdW5kKTsKKwkJCS8q IFJlcG9ydCBJL09zIGFzIGNvbXBsZXRpbmcgaW5kaXZpZHVhbGx5LiAqLworCQkJVFJBQ0VfUE9T VEdSRVNRTF9CVUZGRVJfUkVBRF9ET05FKGZvcmtudW0sIGlvX2ZpcnN0X2Jsb2NrICsgaiwKKwkJ CQkJCQkJCQkJICBibXIuc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLnNwY09pZCwKKwkJCQkJ CQkJCQkJICBibXIuc21nci0+c21ncl9ybG9jYXRvci5sb2NhdG9yLmRiT2lkLAorCQkJCQkJCQkJ CQkgIGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmxvY2F0b3IucmVsTnVtYmVyLAorCQkJCQkJCQkJ CQkgIGJtci5zbWdyLT5zbWdyX3Jsb2NhdG9yLmJhY2tlbmQsCisJCQkJCQkJCQkJCSAgZmFsc2Up OworCQl9CiAKLQlyZXR1cm4gQnVmZmVyRGVzY3JpcHRvckdldEJ1ZmZlcihidWZIZHIpOworCQlW YWN1dW1QYWdlTWlzcyArPSBpb19idWZmZXJzX2xlbjsKKwkJaWYgKFZhY3V1bUNvc3RBY3RpdmUp CisJCQlWYWN1dW1Db3N0QmFsYW5jZSArPSBWYWN1dW1Db3N0UGFnZU1pc3MgKiBpb19idWZmZXJz X2xlbjsKKwl9CiB9CiAKIC8qCkBAIC0xMjI4LDExICsxMzgwLDggQEAgUmVhZEJ1ZmZlcl9jb21t b24oU01nclJlbGF0aW9uIHNtZ3IsIGNoYXIgcmVscGVyc2lzdGVuY2UsIEZvcmtOdW1iZXIgZm9y a051bSwKICAqCiAgKiBUaGUgcmV0dXJuZWQgYnVmZmVyIGlzIHBpbm5lZCBhbmQgaXMgYWxyZWFk eSBtYXJrZWQgYXMgaG9sZGluZyB0aGUKICAqIGRlc2lyZWQgcGFnZS4gIElmIGl0IGFscmVhZHkg ZGlkIGhhdmUgdGhlIGRlc2lyZWQgcGFnZSwgKmZvdW5kUHRyIGlzCi0gKiBzZXQgdHJ1ZS4gIE90 aGVyd2lzZSwgKmZvdW5kUHRyIGlzIHNldCBmYWxzZSBhbmQgdGhlIGJ1ZmZlciBpcyBtYXJrZWQK LSAqIGFzIElPX0lOX1BST0dSRVNTOyBSZWFkQnVmZmVyIHdpbGwgbm93IG5lZWQgdG8gZG8gSS9P IHRvIGZpbGwgaXQuCi0gKgotICogKmZvdW5kUHRyIGlzIGFjdHVhbGx5IHJlZHVuZGFudCB3aXRo IHRoZSBidWZmZXIncyBCTV9WQUxJRCBmbGFnLCBidXQKLSAqIHdlIGtlZXAgaXQgZm9yIHNpbXBs aWNpdHkgaW4gUmVhZEJ1ZmZlci4KKyAqIHNldCB0cnVlLiAgT3RoZXJ3aXNlLCAqZm91bmRQdHIg aXMgc2V0IGZhbHNlLiAgQSByZWFkIHNob3VsZCBiZQorICogcGVyZm9ybWVkIHdpdGggQ29tcGxl dGVSZWFkQnVmZmVycygpLgogICoKICAqIGlvX2NvbnRleHQgaXMgcGFzc2VkIGFzIGFuIG91dHB1 dCBwYXJhbWV0ZXIgdG8gYXZvaWQgY2FsbGluZwogICogSU9Db250ZXh0Rm9yU3RyYXRlZ3koKSB3 aGVuIHRoZXJlIGlzIGEgc2hhcmVkIGJ1ZmZlcnMgaGl0IGFuZCBubyBJTwpAQCAtMTI5MSwxOSAr MTQ0MCwxMCBAQCBCdWZmZXJBbGxvYyhTTWdyUmVsYXRpb24gc21nciwgY2hhciByZWxwZXJzaXN0 ZW5jZSwgRm9ya051bWJlciBmb3JrTnVtLAogCQl7CiAJCQkvKgogCQkJICogV2UgY2FuIG9ubHkg Z2V0IGhlcmUgaWYgKGEpIHNvbWVvbmUgZWxzZSBpcyBzdGlsbCByZWFkaW5nIGluCi0JCQkgKiB0 aGUgcGFnZSwgb3IgKGIpIGEgcHJldmlvdXMgcmVhZCBhdHRlbXB0IGZhaWxlZC4gIFdlIGhhdmUg dG8KLQkJCSAqIHdhaXQgZm9yIGFueSBhY3RpdmUgcmVhZCBhdHRlbXB0IHRvIGZpbmlzaCwgYW5k IHRoZW4gc2V0IHVwIG91cgotCQkJICogb3duIHJlYWQgYXR0ZW1wdCBpZiB0aGUgcGFnZSBpcyBz dGlsbCBub3QgQk1fVkFMSUQuCi0JCQkgKiBTdGFydEJ1ZmZlcklPIGRvZXMgaXQgYWxsLgorCQkJ ICogdGhlIHBhZ2UsIChiKSBhIHByZXZpb3VzIHJlYWQgYXR0ZW1wdCBmYWlsZWQsIG9yIChjKSBz b21lb25lCisJCQkgKiBjYWxsZWQgUHJlcGFyZVJlYWRCdWZmZXIoKSBidXQgbm90IHlldCBDb21w bGV0ZVJlYWRCdWZmZXJzKCkuCiAJCQkgKi8KLQkJCWlmIChTdGFydEJ1ZmZlcklPKGJ1ZiwgdHJ1 ZSkpCi0JCQl7Ci0JCQkJLyoKLQkJCQkgKiBJZiB3ZSBnZXQgaGVyZSwgcHJldmlvdXMgYXR0ZW1w dHMgdG8gcmVhZCB0aGUgYnVmZmVyIG11c3QKLQkJCQkgKiBoYXZlIGZhaWxlZCAuLi4gYnV0IHdl IHNoYWxsIGJyYXZlbHkgdHJ5IGFnYWluLgotCQkJCSAqLwotCQkJCSpmb3VuZFB0ciA9IGZhbHNl OwotCQkJfQorCQkJKmZvdW5kUHRyID0gZmFsc2U7CiAJCX0KIAogCQlyZXR1cm4gYnVmOwpAQCAt MTM2OCwxOSArMTUwOCwxMCBAQCBCdWZmZXJBbGxvYyhTTWdyUmVsYXRpb24gc21nciwgY2hhciBy ZWxwZXJzaXN0ZW5jZSwgRm9ya051bWJlciBmb3JrTnVtLAogCQl7CiAJCQkvKgogCQkJICogV2Ug Y2FuIG9ubHkgZ2V0IGhlcmUgaWYgKGEpIHNvbWVvbmUgZWxzZSBpcyBzdGlsbCByZWFkaW5nIGlu Ci0JCQkgKiB0aGUgcGFnZSwgb3IgKGIpIGEgcHJldmlvdXMgcmVhZCBhdHRlbXB0IGZhaWxlZC4g IFdlIGhhdmUgdG8KLQkJCSAqIHdhaXQgZm9yIGFueSBhY3RpdmUgcmVhZCBhdHRlbXB0IHRvIGZp bmlzaCwgYW5kIHRoZW4gc2V0IHVwIG91cgotCQkJICogb3duIHJlYWQgYXR0ZW1wdCBpZiB0aGUg cGFnZSBpcyBzdGlsbCBub3QgQk1fVkFMSUQuCi0JCQkgKiBTdGFydEJ1ZmZlcklPIGRvZXMgaXQg YWxsLgorCQkJICogdGhlIHBhZ2UsIChiKSBhIHByZXZpb3VzIHJlYWQgYXR0ZW1wdCBmYWlsZWQs IG9yIChjKSBzb21lb25lCisJCQkgKiBjYWxsZWQgUHJlcGFyZVJlYWRCdWZmZXIoKSBidXQgbm90 IHlldCBDb21wbGV0ZVJlYWRCdWZmZXJzKCkuCiAJCQkgKi8KLQkJCWlmIChTdGFydEJ1ZmZlcklP KGV4aXN0aW5nX2J1Zl9oZHIsIHRydWUpKQotCQkJewotCQkJCS8qCi0JCQkJICogSWYgd2UgZ2V0 IGhlcmUsIHByZXZpb3VzIGF0dGVtcHRzIHRvIHJlYWQgdGhlIGJ1ZmZlciBtdXN0Ci0JCQkJICog aGF2ZSBmYWlsZWQgLi4uIGJ1dCB3ZSBzaGFsbCBicmF2ZWx5IHRyeSBhZ2Fpbi4KLQkJCQkgKi8K LQkJCQkqZm91bmRQdHIgPSBmYWxzZTsKLQkJCX0KKwkJCSpmb3VuZFB0ciA9IGZhbHNlOwogCQl9 CiAKIAkJcmV0dXJuIGV4aXN0aW5nX2J1Zl9oZHI7CkBAIC0xNDEyLDE1ICsxNTQzLDkgQEAgQnVm ZmVyQWxsb2MoU01nclJlbGF0aW9uIHNtZ3IsIGNoYXIgcmVscGVyc2lzdGVuY2UsIEZvcmtOdW1i ZXIgZm9ya051bSwKIAlMV0xvY2tSZWxlYXNlKG5ld1BhcnRpdGlvbkxvY2spOwogCiAJLyoKLQkg KiBCdWZmZXIgY29udGVudHMgYXJlIGN1cnJlbnRseSBpbnZhbGlkLiAgVHJ5IHRvIG9idGFpbiB0 aGUgcmlnaHQgdG8KLQkgKiBzdGFydCBJL08uICBJZiBTdGFydEJ1ZmZlcklPIHJldHVybnMgZmFs c2UsIHRoZW4gc29tZW9uZSBlbHNlIG1hbmFnZWQKLQkgKiB0byByZWFkIGl0IGJlZm9yZSB3ZSBk aWQsIHNvIHRoZXJlJ3Mgbm90aGluZyBsZWZ0IGZvciBCdWZmZXJBbGxvYygpIHRvCi0JICogZG8u CisJICogQnVmZmVyIGNvbnRlbnRzIGFyZSBjdXJyZW50bHkgaW52YWxpZC4KIAkgKi8KLQlpZiAo U3RhcnRCdWZmZXJJTyh2aWN0aW1fYnVmX2hkciwgdHJ1ZSkpCi0JCSpmb3VuZFB0ciA9IGZhbHNl OwotCWVsc2UKLQkJKmZvdW5kUHRyID0gdHJ1ZTsKKwkqZm91bmRQdHIgPSBmYWxzZTsKIAogCXJl dHVybiB2aWN0aW1fYnVmX2hkcjsKIH0KQEAgLTE3NzQsNyArMTg5OSw3IEBAIGFnYWluOgogICog cGVzc2ltaXN0aWMsIGJ1dCBvdXRzaWRlIG9mIHRveS1zaXplZCBzaGFyZWRfYnVmZmVycyBpdCBz aG91bGQgYWxsb3cKICAqIHN1ZmZpY2llbnQgcGlucy4KICAqLwotc3RhdGljIHZvaWQKK3ZvaWQK IExpbWl0QWRkaXRpb25hbFBpbnModWludDMyICphZGRpdGlvbmFsX3BpbnMpCiB7CiAJdWludDMy CQltYXhfYmFja2VuZHM7CkBAIC0yMDQzLDcgKzIxNjgsNyBAQCBFeHRlbmRCdWZmZXJlZFJlbFNo YXJlZChCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1yLAogCiAJCQkJYnVmX3N0YXRlICY9IH5CTV9W QUxJRDsKIAkJCQlVbmxvY2tCdWZIZHIoZXhpc3RpbmdfaGRyLCBidWZfc3RhdGUpOwotCQkJfSB3 aGlsZSAoIVN0YXJ0QnVmZmVySU8oZXhpc3RpbmdfaGRyLCB0cnVlKSk7CisJCQl9IHdoaWxlICgh U3RhcnRCdWZmZXJJTyhleGlzdGluZ19oZHIsIHRydWUsIGZhbHNlKSk7CiAJCX0KIAkJZWxzZQog CQl7CkBAIC0yMDY2LDcgKzIxOTEsNyBAQCBFeHRlbmRCdWZmZXJlZFJlbFNoYXJlZChCdWZmZXJN YW5hZ2VyUmVsYXRpb24gYm1yLAogCQkJTFdMb2NrUmVsZWFzZShwYXJ0aXRpb25fbG9jayk7CiAK IAkJCS8qIFhYWDogY291bGQgY29tYmluZSB0aGUgbG9ja2VkIG9wZXJhdGlvbnMgaW4gaXQgd2l0 aCB0aGUgYWJvdmUgKi8KLQkJCVN0YXJ0QnVmZmVySU8odmljdGltX2J1Zl9oZHIsIHRydWUpOwor CQkJU3RhcnRCdWZmZXJJTyh2aWN0aW1fYnVmX2hkciwgdHJ1ZSwgZmFsc2UpOwogCQl9CiAJfQog CkBAIC0yMzgxLDcgKzI1MDYsMTIgQEAgUGluQnVmZmVyKEJ1ZmZlckRlc2MgKmJ1ZiwgQnVmZmVy QWNjZXNzU3RyYXRlZ3kgc3RyYXRlZ3kpCiAJZWxzZQogCXsKIAkJLyoKLQkJICogSWYgd2UgcHJl dmlvdXNseSBwaW5uZWQgdGhlIGJ1ZmZlciwgaXQgbXVzdCBzdXJlbHkgYmUgdmFsaWQuCisJCSAq IElmIHdlIHByZXZpb3VzbHkgcGlubmVkIHRoZSBidWZmZXIsIGl0IGlzIGxpa2VseSB0byBiZSB2 YWxpZCwgYnV0CisJCSAqIGl0IG1heSBub3QgYmUgaWYgUHJlcGFyZVJlYWRCdWZmZXIoKSB3YXMg Y2FsbGVkIGFuZAorCQkgKiBDb21wbGV0ZVJlYWRCdWZmZXJzKCkgaGFzbid0IGJlZW4gY2FsbGVk IHlldC4gIFdlJ2xsIGNoZWNrIGJ5CisJCSAqIGxvYWRpbmcgdGhlIGZsYWdzIHdpdGhvdXQgbG9j a2luZy4gIFRoaXMgaXMgcmFjeSwgYnV0IGl0J3MgT0sgdG8KKwkJICogcmV0dXJuIGZhbHNlIHNw dXJpb3VzbHk6IHdoZW4gQ29tcGxldGVSZWFkQnVmZmVycygpIGNhbGxzCisJCSAqIFN0YXJ0QnVm ZmVySU8oKSwgaXQnbGwgc2VlIHRoYXQgaXQncyBub3cgdmFsaWQuCiAJCSAqCiAJCSAqIE5vdGU6 IFdlIGRlbGliZXJhdGVseSBhdm9pZCBhIFZhbGdyaW5kIGNsaWVudCByZXF1ZXN0IGhlcmUuCiAJ CSAqIEluZGl2aWR1YWwgYWNjZXNzIG1ldGhvZHMgY2FuIG9wdGlvbmFsbHkgc3VwZXJpbXBvc2Ug YnVmZmVyIHBhZ2UKQEAgLTIzOTAsNyArMjUyMCw3IEBAIFBpbkJ1ZmZlcihCdWZmZXJEZXNjICpi dWYsIEJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5KQogCQkgKiB0aGF0IHRoZSBidWZmZXIg cGFnZSBpcyBsZWdpdGltYXRlbHkgbm9uLWFjY2Vzc2libGUgaGVyZS4gIFdlCiAJCSAqIGNhbm5v dCBtZWRkbGUgd2l0aCB0aGF0LgogCQkgKi8KLQkJcmVzdWx0ID0gdHJ1ZTsKKwkJcmVzdWx0ID0g KHBnX2F0b21pY19yZWFkX3UzMigmYnVmLT5zdGF0ZSkgJiBCTV9WQUxJRCkgIT0gMDsKIAl9CiAK IAlyZWYtPnJlZmNvdW50Kys7CkBAIC0zNDU4LDcgKzM1ODgsNyBAQCBGbHVzaEJ1ZmZlcihCdWZm ZXJEZXNjICpidWYsIFNNZ3JSZWxhdGlvbiByZWxuLCBJT09iamVjdCBpb19vYmplY3QsCiAJICog c29tZW9uZSBlbHNlIGZsdXNoZWQgdGhlIGJ1ZmZlciBiZWZvcmUgd2UgY291bGQsIHNvIHdlIG5l ZWQgbm90IGRvCiAJICogYW55dGhpbmcuCiAJICovCi0JaWYgKCFTdGFydEJ1ZmZlcklPKGJ1Ziwg ZmFsc2UpKQorCWlmICghU3RhcnRCdWZmZXJJTyhidWYsIGZhbHNlLCBmYWxzZSkpCiAJCXJldHVy bjsKIAogCS8qIFNldHVwIGVycm9yIHRyYWNlYmFjayBzdXBwb3J0IGZvciBlcmVwb3J0KCkgKi8K QEAgLTQ4NDUsNiArNDk3NSw0NiBAQCBDb25kaXRpb25hbExvY2tCdWZmZXIoQnVmZmVyIGJ1ZmZl cikKIAkJCQkJCQkJCUxXX0VYQ0xVU0lWRSk7CiB9CiAKKy8qCisgKiBaZXJvIGEgYnVmZmVyLCBh bmQgbG9jayBpdCBhcyBSQk1fWkVST19BTkRfTE9DSyBvcgorICogUkJNX1pFUk9fQU5EX0NMRUFO VVBfTE9DSyB3b3VsZC4gIFRoZSBidWZmZXIgbXVzdCBiZSBhbHJlYWR5IHBpbm5lZC4gIEl0Cisg KiBkb2VzIG5vdCBoYXZlIHRvIGJlIHZhbGlkLCBidXQgaXQgaXMgdmFsaWQgYW5kIGxvY2tlZCBv biByZXR1cm4uCisgKi8KK3ZvaWQKK1plcm9CdWZmZXIoQnVmZmVyIGJ1ZmZlciwgUmVhZEJ1ZmZl ck1vZGUgbW9kZSkKK3sKKwlCdWZmZXJEZXNjICpidWZIZHI7CisJdWludDMyCQlidWZfc3RhdGU7 CisKKwlBc3NlcnQobW9kZSA9PSBSQk1fWkVST19BTkRfTE9DSyB8fCBtb2RlID09IFJCTV9aRVJP X0FORF9DTEVBTlVQX0xPQ0spOworCisJaWYgKEJ1ZmZlcklzTG9jYWwoYnVmZmVyKSkKKwkJYnVm SGRyID0gR2V0TG9jYWxCdWZmZXJEZXNjcmlwdG9yKC1idWZmZXIgLSAxKTsKKwllbHNlCisJewor CQlidWZIZHIgPSBHZXRCdWZmZXJEZXNjcmlwdG9yKGJ1ZmZlciAtIDEpOworCQlpZiAobW9kZSA9 PSBSQk1fWkVST19BTkRfTE9DSykKKwkJCUxvY2tCdWZmZXIoYnVmZmVyLCBCVUZGRVJfTE9DS19F WENMVVNJVkUpOworCQllbHNlCisJCQlMb2NrQnVmZmVyRm9yQ2xlYW51cChidWZmZXIpOworCX0K KworCW1lbXNldChCdWZmZXJHZXRQYWdlKGJ1ZmZlciksIDAsIEJMQ0tTWik7CisKKwlpZiAoQnVm ZmVySXNMb2NhbChidWZmZXIpKQorCXsKKwkJYnVmX3N0YXRlID0gcGdfYXRvbWljX3JlYWRfdTMy KCZidWZIZHItPnN0YXRlKTsKKwkJYnVmX3N0YXRlIHw9IEJNX1ZBTElEOworCQlwZ19hdG9taWNf dW5sb2NrZWRfd3JpdGVfdTMyKCZidWZIZHItPnN0YXRlLCBidWZfc3RhdGUpOworCX0KKwllbHNl CisJeworCQlidWZfc3RhdGUgPSBMb2NrQnVmSGRyKGJ1Zkhkcik7CisJCWJ1Zl9zdGF0ZSB8PSBC TV9WQUxJRDsKKwkJVW5sb2NrQnVmSGRyKGJ1ZkhkciwgYnVmX3N0YXRlKTsKKwl9Cit9CisKIC8q CiAgKiBWZXJpZnkgdGhhdCB0aGlzIGJhY2tlbmQgaXMgcGlubmluZyB0aGUgYnVmZmVyIGV4YWN0 bHkgb25jZS4KICAqCkBAIC01MTk3LDkgKzUzNjcsMTUgQEAgV2FpdElPKEJ1ZmZlckRlc2MgKmJ1 ZikKICAqCiAgKiBSZXR1cm5zIHRydWUgaWYgd2Ugc3VjY2Vzc2Z1bGx5IG1hcmtlZCB0aGUgYnVm ZmVyIGFzIEkvTyBidXN5LAogICogZmFsc2UgaWYgc29tZW9uZSBlbHNlIGFscmVhZHkgZGlkIHRo ZSB3b3JrLgorICoKKyAqIElmIG5vd2FpdCBpcyB0cnVlLCB0aGVuIHdlIGRvbid0IHdhaXQgZm9y IGFuIEkvTyB0byBiZSBmaW5pc2hlZCBieSBhbm90aGVyCisgKiBiYWNrZW5kLiAgSW4gdGhhdCBj YXNlLCBmYWxzZSBpbmRpY2F0ZXMgZWl0aGVyIHRoYXQgdGhlIEkvTyB3YXMgYWxyZWFkeQorICog ZmluaXNoZWQsIG9yIGlzIHN0aWxsIGluIHByb2dyZXNzLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNh bGxlcnMgdGhhdCB3YW50IHRvCisgKiBmaW5kIG91dCBpZiB0aGV5IGNhbiBwZXJmb3JtIHRoZSBJ L08gYXMgcGFydCBvZiBhIGxhcmdlciBvcGVyYXRpb24sIHdpdGhvdXQKKyAqIHdhaXRpbmcgZm9y IHRoZSBhbnN3ZXIgb3IgZGlzdGluZ3Vpc2hpbmcgdGhlIHJlYXNvbnMgd2h5IG5vdC4KICAqLwog c3RhdGljIGJvb2wKLVN0YXJ0QnVmZmVySU8oQnVmZmVyRGVzYyAqYnVmLCBib29sIGZvcklucHV0 KQorU3RhcnRCdWZmZXJJTyhCdWZmZXJEZXNjICpidWYsIGJvb2wgZm9ySW5wdXQsIGJvb2wgbm93 YWl0KQogewogCXVpbnQzMgkJYnVmX3N0YXRlOwogCkBAIC01MjEyLDYgKzUzODgsOCBAQCBTdGFy dEJ1ZmZlcklPKEJ1ZmZlckRlc2MgKmJ1ZiwgYm9vbCBmb3JJbnB1dCkKIAkJaWYgKCEoYnVmX3N0 YXRlICYgQk1fSU9fSU5fUFJPR1JFU1MpKQogCQkJYnJlYWs7CiAJCVVubG9ja0J1ZkhkcihidWYs IGJ1Zl9zdGF0ZSk7CisJCWlmIChub3dhaXQpCisJCQlyZXR1cm4gZmFsc2U7CiAJCVdhaXRJTyhi dWYpOwogCX0KIApkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIvbG9jYWxi dWYuYyBiL3NyYy9iYWNrZW5kL3N0b3JhZ2UvYnVmZmVyL2xvY2FsYnVmLmMKaW5kZXggMWJlNGY0 ZjhkYS4uNzE3YjhmNThkYSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9idWZmZXIv bG9jYWxidWYuYworKysgYi9zcmMvYmFja2VuZC9zdG9yYWdlL2J1ZmZlci9sb2NhbGJ1Zi5jCkBA IC0xMDksMTAgKzEwOSw5IEBAIFByZWZldGNoTG9jYWxCdWZmZXIoU01nclJlbGF0aW9uIHNtZ3Is IEZvcmtOdW1iZXIgZm9ya051bSwKICAqIExvY2FsQnVmZmVyQWxsb2MgLQogICoJICBGaW5kIG9y IGNyZWF0ZSBhIGxvY2FsIGJ1ZmZlciBmb3IgdGhlIGdpdmVuIHBhZ2Ugb2YgdGhlIGdpdmVuIHJl bGF0aW9uLgogICoKLSAqIEFQSSBpcyBzaW1pbGFyIHRvIGJ1Zm1nci5jJ3MgQnVmZmVyQWxsb2Ms IGV4Y2VwdCB0aGF0IHdlIGRvIG5vdCBuZWVkCi0gKiB0byBkbyBhbnkgbG9ja2luZyBzaW5jZSB0 aGlzIGlzIGFsbCBsb2NhbC4gICBBbHNvLCBJT19JTl9QUk9HUkVTUwotICogZG9lcyBub3QgZ2V0 IHNldC4gIExhc3RseSwgd2Ugc3VwcG9ydCBvbmx5IGRlZmF1bHQgYWNjZXNzIHN0cmF0ZWd5Ci0g KiAoaGVuY2UsIHVzYWdlX2NvdW50IGlzIGFsd2F5cyBhZHZhbmNlZCkuCisgKiBBUEkgaXMgc2lt aWxhciB0byBidWZtZ3IuYydzIEJ1ZmZlckFsbG9jLCBleGNlcHQgdGhhdCB3ZSBkbyBub3QgbmVl ZCB0byBkbworICogYW55IGxvY2tpbmcgc2luY2UgdGhpcyBpcyBhbGwgbG9jYWwuICBXZSBzdXBw b3J0IG9ubHkgZGVmYXVsdCBhY2Nlc3MKKyAqIHN0cmF0ZWd5IChoZW5jZSwgdXNhZ2VfY291bnQg aXMgYWx3YXlzIGFkdmFuY2VkKS4KICAqLwogQnVmZmVyRGVzYyAqCiBMb2NhbEJ1ZmZlckFsbG9j KFNNZ3JSZWxhdGlvbiBzbWdyLCBGb3JrTnVtYmVyIGZvcmtOdW0sIEJsb2NrTnVtYmVyIGJsb2Nr TnVtLApAQCAtMjg4LDcgKzI4Nyw3IEBAIEdldExvY2FsVmljdGltQnVmZmVyKHZvaWQpCiB9CiAK IC8qIHNlZSBMaW1pdEFkZGl0aW9uYWxQaW5zKCkgKi8KLXN0YXRpYyB2b2lkCit2b2lkCiBMaW1p dEFkZGl0aW9uYWxMb2NhbFBpbnModWludDMyICphZGRpdGlvbmFsX3BpbnMpCiB7CiAJdWludDMy CQltYXhfcGluczsKQEAgLTI5OCw5ICsyOTcsMTAgQEAgTGltaXRBZGRpdGlvbmFsTG9jYWxQaW5z KHVpbnQzMiAqYWRkaXRpb25hbF9waW5zKQogCiAJLyoKIAkgKiBJbiBjb250cmFzdCB0byBMaW1p dEFkZGl0aW9uYWxQaW5zKCkgb3RoZXIgYmFja2VuZHMgZG9uJ3QgcGxheSBhIHJvbGUKLQkgKiBo ZXJlLiBXZSBjYW4gYWxsb3cgdXAgdG8gTkxvY0J1ZmZlciBwaW5zIGluIHRvdGFsLgorCSAqIGhl cmUuIFdlIGNhbiBhbGxvdyB1cCB0byBOTG9jQnVmZmVyIHBpbnMgaW4gdG90YWwsIGJ1dCBpdCBt aWdodCBub3QgYmUKKwkgKiBpbml0aWFsaXplZCB5ZXQgc28gcmVhZCBudW1fdGVtcF9idWZmZXJz LgogCSAqLwotCW1heF9waW5zID0gKE5Mb2NCdWZmZXIgLSBOTG9jYWxQaW5uZWRCdWZmZXJzKTsK KwltYXhfcGlucyA9IChudW1fdGVtcF9idWZmZXJzIC0gTkxvY2FsUGlubmVkQnVmZmVycyk7CiAK IAlpZiAoKmFkZGl0aW9uYWxfcGlucyA+PSBtYXhfcGlucykKIAkJKmFkZGl0aW9uYWxfcGlucyA9 IG1heF9waW5zOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9tZXNvbi5idWlsZCBi L3NyYy9iYWNrZW5kL3N0b3JhZ2UvbWVzb24uYnVpbGQKaW5kZXggNDAzNDViZGNhMi4uNzM5ZDEz MjkzZiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvc3RvcmFnZS9tZXNvbi5idWlsZAorKysgYi9z cmMvYmFja2VuZC9zdG9yYWdlL21lc29uLmJ1aWxkCkBAIC0xLDUgKzEsNiBAQAogIyBDb3B5cmln aHQgKGMpIDIwMjItMjAyNCwgUG9zdGdyZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKIAor c3ViZGlyKCdhaW8nKQogc3ViZGlyKCdidWZmZXInKQogc3ViZGlyKCdmaWxlJykKIHN1YmRpcign ZnJlZXNwYWNlJykKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9zbWdyLmMg Yi9zcmMvYmFja2VuZC9zdG9yYWdlL3NtZ3Ivc21nci5jCmluZGV4IDU2M2EwYmU1YzcuLjBkNzI3 MmU3OTYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3N0b3JhZ2Uvc21nci9zbWdyLmMKKysrIGIv c3JjL2JhY2tlbmQvc3RvcmFnZS9zbWdyL3NtZ3IuYwpAQCAtMTQ3LDcgKzE0Nyw5IEBAIHNtZ3Jz aHV0ZG93bihpbnQgY29kZSwgRGF0dW0gYXJnKQogLyoKICAqIHNtZ3JvcGVuKCkgLS0gUmV0dXJu IGFuIFNNZ3JSZWxhdGlvbiBvYmplY3QsIGNyZWF0aW5nIGl0IGlmIG5lZWQgYmUuCiAgKgotICog VGhpcyBkb2VzIG5vdCBhdHRlbXB0IHRvIGFjdHVhbGx5IG9wZW4gdGhlIHVuZGVybHlpbmcgZmls ZS4KKyAqIFRoaXMgZG9lcyBub3QgYXR0ZW1wdCB0byBhY3R1YWxseSBvcGVuIHRoZSB1bmRlcmx5 aW5nIGZpbGVzLiAgVGhlIHJldHVybmVkCisgKiBvYmplY3QgcmVtYWlucyB2YWxpZCBhdCBsZWFz dCB1bnRpbCBBdEVPWGFjdF9TTWdyKCkgaXMgY2FsbGVkLCBvciB1bnRpbAorICogc21ncmRlc3Ry b3koKSBpcyBjYWxsZWQgaW4gbm9uLXRyYW5zYWN0aW9uIGJhY2tlbmRzLgogICovCiBTTWdyUmVs YXRpb24KIHNtZ3JvcGVuKFJlbEZpbGVMb2NhdG9yIHJsb2NhdG9yLCBCYWNrZW5kSWQgYmFja2Vu ZCkKQEAgLTI1OSwxMCArMjYxLDEwIEBAIHNtZ3JleGlzdHMoU01nclJlbGF0aW9uIHJlbG4sIEZv cmtOdW1iZXIgZm9ya251bSkKIH0KIAogLyoKLSAqIHNtZ3JjbG9zZSgpIC0tIENsb3NlIGFuZCBk ZWxldGUgYW4gU01nclJlbGF0aW9uIG9iamVjdC4KKyAqIHNtZ3JkZXN0cm95KCkgLS0gRGVsZXRl IGFuIFNNZ3JSZWxhdGlvbiBvYmplY3QuCiAgKi8KIHZvaWQKLXNtZ3JjbG9zZShTTWdyUmVsYXRp b24gcmVsbikKK3NtZ3JkZXN0cm95KFNNZ3JSZWxhdGlvbiByZWxuKQogewogCVNNZ3JSZWxhdGlv biAqb3duZXI7CiAJRm9ya051bWJlcglmb3JrbnVtOwpAQCAtMjg5LDEyICsyOTEsMTQgQEAgc21n cmNsb3NlKFNNZ3JSZWxhdGlvbiByZWxuKQogfQogCiAvKgotICogc21ncnJlbGVhc2UoKSAtLSBS ZWxlYXNlIGFsbCByZXNvdXJjZXMgdXNlZCBieSB0aGlzIG9iamVjdC4KKyAqIHNtZ3JjbG9zZSgp IC0tIFJlbGVhc2UgYWxsIHJlc291cmNlcyB1c2VkIGJ5IHRoaXMgb2JqZWN0LgogICoKLSAqIFRo ZSBvYmplY3QgcmVtYWlucyB2YWxpZC4KKyAqIFRoZSBvYmplY3QgcmVtYWlucyB2YWxpZCwgYnV0 IGlzIG1vdmVkIHRvIHRoZSB1bmtub3duIGxpc3Qgd2hlcmUgaXQgd2lsbAorICogYmUgZGVzdHJv eWVkIGJ5IEF0RU9YYWN0X1NNZ3IoKS4gIEl0IG1heSBiZSByZS1vd25lZCBpZiBpdCBpcyBhY2Nl c3NlZCBieSBhCisgKiByZWxhdGlvbiBiZWZvcmUgdGhlbi4KICAqLwogdm9pZAotc21ncnJlbGVh c2UoU01nclJlbGF0aW9uIHJlbG4pCitzbWdyY2xvc2UoU01nclJlbGF0aW9uIHJlbG4pCiB7CiAJ Zm9yIChGb3JrTnVtYmVyIGZvcmtudW0gPSAwOyBmb3JrbnVtIDw9IE1BWF9GT1JLTlVNOyBmb3Jr bnVtKyspCiAJewpAQCAtMzAyLDE1ICszMDYsMjAgQEAgc21ncnJlbGVhc2UoU01nclJlbGF0aW9u IHJlbG4pCiAJCXJlbG4tPnNtZ3JfY2FjaGVkX25ibG9ja3NbZm9ya251bV0gPSBJbnZhbGlkQmxv Y2tOdW1iZXI7CiAJfQogCXJlbG4tPnNtZ3JfdGFyZ2Jsb2NrID0gSW52YWxpZEJsb2NrTnVtYmVy OworCisJaWYgKHJlbG4tPnNtZ3Jfb3duZXIpCisJeworCQkqcmVsbi0+c21ncl9vd25lciA9IE5V TEw7CisJCXJlbG4tPnNtZ3Jfb3duZXIgPSBOVUxMOworCQlkbGlzdF9wdXNoX3RhaWwoJnVub3du ZWRfcmVsbnMsICZyZWxuLT5ub2RlKTsKKwl9CiB9CiAKIC8qCi0gKiBzbWdycmVsZWFzZWFsbCgp IC0tIFJlbGVhc2UgcmVzb3VyY2VzIHVzZWQgYnkgYWxsIG9iamVjdHMuCi0gKgotICogVGhpcyBp cyBjYWxsZWQgZm9yIFBST0NTSUdOQUxfQkFSUklFUl9TTUdSUkVMRUFTRS4KKyAqIHNtZ3JjbG9z ZWFsbCgpIC0tIENsb3NlIGFsbCBvYmplY3RzLgogICovCiB2b2lkCi1zbWdycmVsZWFzZWFsbCh2 b2lkKQorc21ncmNsb3NlYWxsKHZvaWQpCiB7CiAJSEFTSF9TRVFfU1RBVFVTIHN0YXR1czsKIAlT TWdyUmVsYXRpb24gcmVsbjsKQEAgLTMyMiwxNCArMzMxLDE3IEBAIHNtZ3JyZWxlYXNlYWxsKHZv aWQpCiAJaGFzaF9zZXFfaW5pdCgmc3RhdHVzLCBTTWdyUmVsYXRpb25IYXNoKTsKIAogCXdoaWxl ICgocmVsbiA9IChTTWdyUmVsYXRpb24pIGhhc2hfc2VxX3NlYXJjaCgmc3RhdHVzKSkgIT0gTlVM TCkKLQkJc21ncnJlbGVhc2UocmVsbik7CisJCXNtZ3JjbG9zZShyZWxuKTsKIH0KIAogLyoKLSAq IHNtZ3JjbG9zZWFsbCgpIC0tIENsb3NlIGFsbCBleGlzdGluZyBTTWdyUmVsYXRpb24gb2JqZWN0 cy4KKyAqIHNtZ3JkZXN0cm95YWxsKCkgLS0gRGVzdHJveSBhbGwgU01nclJlbGF0aW9uIG9iamVj dHMuCisgKgorICogSXQgbXVzdCBiZSBrbm93biB0aGF0IHRoZXJlIGFyZSBubyBwb2ludGVycyB0 byBTTWdyUmVsYXRpb25zLCBvdGhlciB0aGFuCisgKiB0aG9zZSByZWdpc3RlcmVkIHdpdGggc21n cnNldG93bmVyKCkuCiAgKi8KIHZvaWQKLXNtZ3JjbG9zZWFsbCh2b2lkKQorc21ncmRlc3Ryb3lh bGwodm9pZCkKIHsKIAlIQVNIX1NFUV9TVEFUVVMgc3RhdHVzOwogCVNNZ3JSZWxhdGlvbiByZWxu OwpAQCAtMzQxLDcgKzM1Myw3IEBAIHNtZ3JjbG9zZWFsbCh2b2lkKQogCWhhc2hfc2VxX2luaXQo JnN0YXR1cywgU01nclJlbGF0aW9uSGFzaCk7CiAKIAl3aGlsZSAoKHJlbG4gPSAoU01nclJlbGF0 aW9uKSBoYXNoX3NlcV9zZWFyY2goJnN0YXR1cykpICE9IE5VTEwpCi0JCXNtZ3JjbG9zZShyZWxu KTsKKwkJc21ncmRlc3Ryb3kocmVsbik7CiB9CiAKIC8qCkBAIC03MzMsNyArNzQ1LDggQEAgc21n cmltbWVkc3luYyhTTWdyUmVsYXRpb24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtKQogICogQXRF T1hhY3RfU01ncgogICoKICAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgZHVyaW5nIHRyYW5zYWN0 aW9uIGNvbW1pdCBvciBhYm9ydCAoaXQgZG9lc24ndAotICogcGFydGljdWxhcmx5IGNhcmUgd2hp Y2gpLiAgQWxsIHRyYW5zaWVudCBTTWdyUmVsYXRpb24gb2JqZWN0cyBhcmUgY2xvc2VkLgorICog cGFydGljdWxhcmx5IGNhcmUgd2hpY2gpLiAgQWxsIHRyYW5zaWVudCBTTWdyUmVsYXRpb24gb2Jq ZWN0cyBhcmUKKyAqIGRlc3Ryb3llZC4KICAqCiAgKiBXZSBkbyB0aGlzIGFzIGEgY29tcHJvbWlz ZSBiZXR3ZWVuIHdhbnRpbmcgdHJhbnNpZW50IFNNZ3JSZWxhdGlvbnMgdG8KICAqIGxpdmUgYXdo aWxlICh0byBhbW9ydGl6ZSB0aGUgY29zdHMgb2YgYmxpbmQgd3JpdGVzIG9mIG11bHRpcGxlIGJs b2NrcykKQEAgLTc0Nyw3ICs3NjAsNyBAQCBBdEVPWGFjdF9TTWdyKHZvaWQpCiAJZGxpc3RfbXV0 YWJsZV9pdGVyIGl0ZXI7CiAKIAkvKgotCSAqIFphcCBhbGwgdW5vd25lZCBTTWdyUmVsYXRpb25z LiAgV2UgcmVseSBvbiBzbWdyY2xvc2UoKSB0byByZW1vdmUgZWFjaAorCSAqIFphcCBhbGwgdW5v d25lZCBTTWdyUmVsYXRpb25zLiAgV2UgcmVseSBvbiBzbWdyZGVzdHJveSgpIHRvIHJlbW92ZSBl YWNoCiAJICogb25lIGZyb20gdGhlIGxpc3QuCiAJICovCiAJZGxpc3RfZm9yZWFjaF9tb2RpZnko aXRlciwgJnVub3duZWRfcmVsbnMpCkBAIC03NTcsNyArNzcwLDcgQEAgQXRFT1hhY3RfU01ncih2 b2lkKQogCiAJCUFzc2VydChyZWwtPnNtZ3Jfb3duZXIgPT0gTlVMTCk7CiAKLQkJc21ncmNsb3Nl KHJlbCk7CisJCXNtZ3JkZXN0cm95KHJlbCk7CiAJfQogfQogCkBAIC03NjgsNiArNzgxLDYgQEAg QXRFT1hhY3RfU01ncih2b2lkKQogYm9vbAogUHJvY2Vzc0JhcnJpZXJTbWdyUmVsZWFzZSh2b2lk KQogewotCXNtZ3JyZWxlYXNlYWxsKCk7CisJc21ncmNsb3NlYWxsKCk7CiAJcmV0dXJuIHRydWU7 CiB9CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9zdG9yYWdlL2J1Zm1nci5oIGIvc3JjL2luY2x1 ZGUvc3RvcmFnZS9idWZtZ3IuaAppbmRleCBkNTFkNDZkMzM1Li5hMzhmMWFjYjM3IDEwMDY0NAot LS0gYS9zcmMvaW5jbHVkZS9zdG9yYWdlL2J1Zm1nci5oCisrKyBiL3NyYy9pbmNsdWRlL3N0b3Jh Z2UvYnVmbWdyLmgKQEAgLTE0LDYgKzE0LDcgQEAKICNpZm5kZWYgQlVGTUdSX0gKICNkZWZpbmUg QlVGTUdSX0gKIAorI2luY2x1ZGUgInBvcnQvcGdfaW92ZWMuaCIKICNpbmNsdWRlICJzdG9yYWdl L2Jsb2NrLmgiCiAjaW5jbHVkZSAic3RvcmFnZS9idWYuaCIKICNpbmNsdWRlICJzdG9yYWdlL2J1 ZnBhZ2UuaCIKQEAgLTE1OCw2ICsxNTksMTEgQEAgZXh0ZXJuIFBHRExMSU1QT1JUIGludDMyICpM b2NhbFJlZkNvdW50OwogI2RlZmluZSBCVUZGRVJfTE9DS19TSEFSRQkJMQogI2RlZmluZSBCVUZG RVJfTE9DS19FWENMVVNJVkUJMgogCisvKgorICogTWF4aW11bSBudW1iZXIgb2YgYnVmZmVycyBm b3IgbXVsdGktYnVmZmVyIEkvTyBmdW5jdGlvbnMuICBUaGlzIGlzIHNldCB0bworICogYWxsb3cg MTI4a0IgdHJhbnNmZXJzLCB1bmxlc3MgQkxDS1NaIGFuZCBJT1ZfTUFYIGltcGx5IGEgYSBzbWFs bGVyIG1heGltdW0uCisgKi8KKyNkZWZpbmUgTUFYX0JVRkZFUlNfUEVSX1RSQU5TRkVSIE1pbihQ R19JT1ZfTUFYLCAoMTI4ICogMTAyNCkgLyBCTENLU1opCiAKIC8qCiAgKiBwcm90b3R5cGVzIGZv ciBmdW5jdGlvbnMgaW4gYnVmbWdyLmMKQEAgLTE3Nyw2ICsxODMsMTggQEAgZXh0ZXJuIEJ1ZmZl ciBSZWFkQnVmZmVyV2l0aG91dFJlbGNhY2hlKFJlbEZpbGVMb2NhdG9yIHJsb2NhdG9yLAogCQkJ CQkJCQkJCUZvcmtOdW1iZXIgZm9ya051bSwgQmxvY2tOdW1iZXIgYmxvY2tOdW0sCiAJCQkJCQkJ CQkJUmVhZEJ1ZmZlck1vZGUgbW9kZSwgQnVmZmVyQWNjZXNzU3RyYXRlZ3kgc3RyYXRlZ3ksCiAJ CQkJCQkJCQkJYm9vbCBwZXJtYW5lbnQpOworZXh0ZXJuIEJ1ZmZlciBQcmVwYXJlUmVhZEJ1ZmZl cihCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1yLAorCQkJCQkJCQlGb3JrTnVtYmVyIGZvcmtOdW0s CisJCQkJCQkJCUJsb2NrTnVtYmVyIGJsb2NrTnVtLAorCQkJCQkJCQlCdWZmZXJBY2Nlc3NTdHJh dGVneSBzdHJhdGVneSwKKwkJCQkJCQkJYm9vbCAqZm91bmRQdHIpOworZXh0ZXJuIHZvaWQgQ29t cGxldGVSZWFkQnVmZmVycyhCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1yLAorCQkJCQkJCQlCdWZm ZXIgKmJ1ZmZlcnMsCisJCQkJCQkJCUZvcmtOdW1iZXIgZm9ya251bSwKKwkJCQkJCQkJQmxvY2tO dW1iZXIgYmxvY2tudW0sCisJCQkJCQkJCWludCBuYmxvY2tzLAorCQkJCQkJCQlib29sIHplcm9f b25fZXJyb3IsCisJCQkJCQkJCUJ1ZmZlckFjY2Vzc1N0cmF0ZWd5IHN0cmF0ZWd5KTsKIGV4dGVy biB2b2lkIFJlbGVhc2VCdWZmZXIoQnVmZmVyIGJ1ZmZlcik7CiBleHRlcm4gdm9pZCBVbmxvY2tS ZWxlYXNlQnVmZmVyKEJ1ZmZlciBidWZmZXIpOwogZXh0ZXJuIGJvb2wgQnVmZmVySXNFeGNsdXNp dmVMb2NrZWQoQnVmZmVyIGJ1ZmZlcik7CkBAIC0yNDcsOSArMjY1LDEzIEBAIGV4dGVybiB2b2lk IExvY2tCdWZmZXJGb3JDbGVhbnVwKEJ1ZmZlciBidWZmZXIpOwogZXh0ZXJuIGJvb2wgQ29uZGl0 aW9uYWxMb2NrQnVmZmVyRm9yQ2xlYW51cChCdWZmZXIgYnVmZmVyKTsKIGV4dGVybiBib29sIElz QnVmZmVyQ2xlYW51cE9LKEJ1ZmZlciBidWZmZXIpOwogZXh0ZXJuIGJvb2wgSG9sZGluZ0J1ZmZl clBpblRoYXREZWxheXNSZWNvdmVyeSh2b2lkKTsKK2V4dGVybiB2b2lkIFplcm9CdWZmZXIoQnVm ZmVyIGJ1ZmZlciwgUmVhZEJ1ZmZlck1vZGUgbW9kZSk7CiAKIGV4dGVybiBib29sIEJnQnVmZmVy U3luYyhzdHJ1Y3QgV3JpdGViYWNrQ29udGV4dCAqd2JfY29udGV4dCk7CiAKK2V4dGVybiB2b2lk IExpbWl0QWRkaXRpb25hbFBpbnModWludDMyICphZGRpdGlvbmFsX3BpbnMpOworZXh0ZXJuIHZv aWQgTGltaXRBZGRpdGlvbmFsTG9jYWxQaW5zKHVpbnQzMiAqYWRkaXRpb25hbF9waW5zKTsKKwog LyogaW4gYnVmX2luaXQuYyAqLwogZXh0ZXJuIHZvaWQgSW5pdEJ1ZmZlclBvb2wodm9pZCk7CiBl eHRlcm4gU2l6ZSBCdWZmZXJTaG1lbVNpemUodm9pZCk7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVk ZS9zdG9yYWdlL3NtZ3IuaCBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc21nci5oCmluZGV4IDUyN2Nk MmEwNTYuLmQ4ZmZlMzk3ZmEgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc21nci5o CisrKyBiL3NyYy9pbmNsdWRlL3N0b3JhZ2Uvc21nci5oCkBAIC04NSw4ICs4NSw4IEBAIGV4dGVy biB2b2lkIHNtZ3JjbGVhcm93bmVyKFNNZ3JSZWxhdGlvbiAqb3duZXIsIFNNZ3JSZWxhdGlvbiBy ZWxuKTsKIGV4dGVybiB2b2lkIHNtZ3JjbG9zZShTTWdyUmVsYXRpb24gcmVsbik7CiBleHRlcm4g dm9pZCBzbWdyY2xvc2VhbGwodm9pZCk7CiBleHRlcm4gdm9pZCBzbWdyY2xvc2VyZWxsb2NhdG9y KFJlbEZpbGVMb2NhdG9yQmFja2VuZCBybG9jYXRvcik7Ci1leHRlcm4gdm9pZCBzbWdycmVsZWFz ZShTTWdyUmVsYXRpb24gcmVsbik7Ci1leHRlcm4gdm9pZCBzbWdycmVsZWFzZWFsbCh2b2lkKTsK K2V4dGVybiB2b2lkIHNtZ3JkZXN0cm95KFNNZ3JSZWxhdGlvbiByZWxuKTsKK2V4dGVybiB2b2lk IHNtZ3JkZXN0cm95YWxsKHZvaWQpOwogZXh0ZXJuIHZvaWQgc21ncmNyZWF0ZShTTWdyUmVsYXRp b24gcmVsbiwgRm9ya051bWJlciBmb3JrbnVtLCBib29sIGlzUmVkbyk7CiBleHRlcm4gdm9pZCBz bWdyZG9zeW5jYWxsKFNNZ3JSZWxhdGlvbiAqcmVscywgaW50IG5yZWxzKTsKIGV4dGVybiB2b2lk IHNtZ3Jkb3VubGlua2FsbChTTWdyUmVsYXRpb24gKnJlbHMsIGludCBucmVscywgYm9vbCBpc1Jl ZG8pOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvc3RvcmFnZS9zdHJlYW1pbmdfcmVhZC5oIGIv c3JjL2luY2x1ZGUvc3RvcmFnZS9zdHJlYW1pbmdfcmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAuLjQwYzM0MDhjNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvaW5j bHVkZS9zdG9yYWdlL3N0cmVhbWluZ19yZWFkLmgKQEAgLTAsMCArMSw0NSBAQAorI2lmbmRlZiBT VFJFQU1JTkdfUkVBRF9ICisjZGVmaW5lIFNUUkVBTUlOR19SRUFEX0gKKworI2luY2x1ZGUgInN0 b3JhZ2UvYnVmbWdyLmgiCisjaW5jbHVkZSAic3RvcmFnZS9mZC5oIgorI2luY2x1ZGUgInN0b3Jh Z2Uvc21nci5oIgorCisvKiBEZWZhdWx0IHR1bmluZywgcmVhc29uYWJsZSBmb3IgbWFueSB1c2Vy cy4gKi8KKyNkZWZpbmUgUEdTUl9GTEFHX0RFRkFVTFQgMHgwMAorCisvKgorICogSS9PIHN0cmVh bXMgdGhhdCBhcmUgcGVyZm9ybWluZyBtYWludGVuYW5jZSB3b3JrIG9uIGJlaGFsZiBvZiBwb3Rl bnRpYWxseQorICogbWFueSB1c2Vycy4KKyAqLworI2RlZmluZSBQR1NSX0ZMQUdfTUFJTlRFTkFO Q0UgMHgwMQorCisvKgorICogV2UgdXN1YWxseSBhdm9pZCBpc3N1aW5nIHByZWZldGNoIGFkdmlj ZSBhdXRvbWF0aWNhbGx5IHdoZW4gc2VxdWVudGlhbAorICogYWNjZXNzIGlzIGRldGVjdGVkLCBi dXQgdGhpcyBmbGFnIGV4cGxpY2l0bHkgZGlzYWJsZXMgaXQsIGZvciBjYXNlcyB0aGF0CisgKiBt aWdodCBub3QgYmUgY29ycmVjdGx5IGRldGVjdGVkLiAgRXhwbGljaXQgYWR2aWNlIGlzIGtub3du IHRvIHBlcmZvcm0gd29yc2UKKyAqIHRoYW4gbGV0dGluZyB0aGUga2VybmVsIChhdCBsZWFzdCBM aW51eCkgZGV0ZWN0IHNlcXVlbnRpYWwgYWNjZXNzLgorICovCisjZGVmaW5lIFBHU1JfRkxBR19T RVFVRU5USUFMIDB4MDIKKworc3RydWN0IFBnU3RyZWFtaW5nUmVhZDsKK3R5cGVkZWYgc3RydWN0 IFBnU3RyZWFtaW5nUmVhZCBQZ1N0cmVhbWluZ1JlYWQ7CisKKy8qIENhbGxiYWNrIHRoYXQgcmV0 dXJucyB0aGUgbmV4dCBibG9jayBudW1iZXIgdG8gcmVhZC4gKi8KK3R5cGVkZWYgQmxvY2tOdW1i ZXIgKCpQZ1N0cmVhbWluZ1JlYWRCdWZmZXJDQikgKFBnU3RyZWFtaW5nUmVhZCAqcGdzciwKKwkJ CQkJCQkJCQkJCXZvaWQgKnBnc3JfcHJpdmF0ZSwKKwkJCQkJCQkJCQkJCXZvaWQgKnBlcl9idWZm ZXJfcHJpdmF0ZSk7CisKK2V4dGVybiBQZ1N0cmVhbWluZ1JlYWQgKnBnX3N0cmVhbWluZ19yZWFk X2J1ZmZlcl9hbGxvYyhpbnQgZmxhZ3MsCisJCQkJCQkJCQkJCQkJICAgdm9pZCAqcGdzcl9wcml2 YXRlLAorCQkJCQkJCQkJCQkJCSAgIHNpemVfdCBwZXJfYnVmZmVyX3ByaXZhdGVfc2l6ZSwKKwkJ CQkJCQkJCQkJCQkgICBCdWZmZXJBY2Nlc3NTdHJhdGVneSBzdHJhdGVneSwKKwkJCQkJCQkJCQkJ CQkgICBCdWZmZXJNYW5hZ2VyUmVsYXRpb24gYm1yLAorCQkJCQkJCQkJCQkJCSAgIEZvcmtOdW1i ZXIgZm9ya251bSwKKwkJCQkJCQkJCQkJCQkgICBQZ1N0cmVhbWluZ1JlYWRCdWZmZXJDQiBuZXh0 X2Jsb2NrX2NiKTsKKworZXh0ZXJuIHZvaWQgcGdfc3RyZWFtaW5nX3JlYWRfcHJlZmV0Y2goUGdT dHJlYW1pbmdSZWFkICpwZ3NyKTsKK2V4dGVybiBCdWZmZXIgcGdfc3RyZWFtaW5nX3JlYWRfYnVm ZmVyX2dldF9uZXh0KFBnU3RyZWFtaW5nUmVhZCAqcGdzciwgdm9pZCAqKnBlcl9idWZmZXJfcHJp dmF0ZSk7CitleHRlcm4gdm9pZCBwZ19zdHJlYW1pbmdfcmVhZF9mcmVlKFBnU3RyZWFtaW5nUmVh ZCAqcGdzcik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvdXRpbHMvcmVsLmgg Yi9zcmMvaW5jbHVkZS91dGlscy9yZWwuaAppbmRleCBhNTg0YjFkZGZmLi42NjM2Y2M4MmMwIDEw MDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy9yZWwuaAorKysgYi9zcmMvaW5jbHVkZS91dGls cy9yZWwuaApAQCAtNTYxLDEyICs1NjEsNiBAQCB0eXBlZGVmIHN0cnVjdCBWaWV3T3B0aW9ucwog ICoKICAqIFZlcnkgbGl0dGxlIGNvZGUgaXMgYXV0aG9yaXplZCB0byB0b3VjaCByZWwtPnJkX3Nt Z3IgZGlyZWN0bHkuICBJbnN0ZWFkCiAgKiB1c2UgdGhpcyBmdW5jdGlvbiB0byBmZXRjaCBpdHMg dmFsdWUuCi0gKgotICogTm90ZTogc2luY2UgYSByZWxjYWNoZSBmbHVzaCBjYW4gY2F1c2UgdGhl IGZpbGUgaGFuZGxlIHRvIGJlIGNsb3NlZCBhZ2FpbiwKLSAqIGl0J3MgdW53aXNlIHRvIGhvbGQg b250byB0aGUgcG9pbnRlciByZXR1cm5lZCBieSB0aGlzIGZ1bmN0aW9uIGZvciBhbnkKLSAqIGxv bmcgcGVyaW9kLiAgUmVjb21tZW5kZWQgcHJhY3RpY2UgaXMgdG8ganVzdCByZS1leGVjdXRlIFJl bGF0aW9uR2V0U21ncgotICogZWFjaCB0aW1lIHlvdSBuZWVkIHRvIGFjY2VzcyB0aGUgU01nclJl bGF0aW9uLiAgSXQncyBxdWl0ZSBjaGVhcCBpbgotICogY29tcGFyaXNvbiB0byB3aGF0ZXZlciBh biBzbWdyIGZ1bmN0aW9uIGlzIGdvaW5nIHRvIGRvLgogICovCiBzdGF0aWMgaW5saW5lIFNNZ3JS ZWxhdGlvbgogUmVsYXRpb25HZXRTbWdyKFJlbGF0aW9uIHJlbCkKZGlmZiAtLWdpdCBhL3NyYy90 b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0IGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZz Lmxpc3QKaW5kZXggMjlmZDFjYWU2NC4uMDE4ZWJiY2JhYSAxMDA2NDQKLS0tIGEvc3JjL3Rvb2xz L3BnaW5kZW50L3R5cGVkZWZzLmxpc3QKKysrIGIvc3JjL3Rvb2xzL3BnaW5kZW50L3R5cGVkZWZz Lmxpc3QKQEAgLTIwODksNiArMjA4OSw4IEBAIFBnU3RhdF9UYWJsZUNvdW50cwogUGdTdGF0X1Rh YmxlU3RhdHVzCiBQZ1N0YXRfVGFibGVYYWN0U3RhdHVzCiBQZ1N0YXRfV2FsU3RhdHMKK1BnU3Ry ZWFtaW5nUmVhZAorUGdTdHJlYW1pbmdSZWFkUmFuZ2UKIFBnWG1sRXJyb3JDb250ZXh0CiBQZ1ht bFN0cmljdG5lc3MKIFBnX2ZpbmZvX3JlY29yZAotLSAKMi4zNy4yCgo= --0000000000000bc4a7060fa6776b--