Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w7lH8-005fY8-20 for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Apr 2026 02:25:47 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1w7lH7-00EJXo-0H for pgsql-hackers@arkaria.postgresql.org; Wed, 01 Apr 2026 02:25:45 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w7lH6-00EJXg-2K for pgsql-hackers@lists.postgresql.org; Wed, 01 Apr 2026 02:25:45 +0000 Received: from mail-qt1-x82a.google.com ([2607:f8b0:4864:20::82a]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1w7lH4-00000002HME-2R8H for pgsql-hackers@lists.postgresql.org; Wed, 01 Apr 2026 02:25:44 +0000 Received: by mail-qt1-x82a.google.com with SMTP id d75a77b69052e-509061dab77so54514931cf.2 for ; Tue, 31 Mar 2026 19:25:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775010341; cv=none; d=google.com; s=arc-20240605; b=Tywp+swce/xFe5FDnDENDpPjK0rhTh1enKjC3WyWyN4PKqTW73ynERVSFSOCQpLgaY vVu/KCwHdv853UGfE+iXek+rmlTPfrxnk7HcQYIyc/MEVOFuSbtoF0Fmd1ZXwSPSaeVr +0rpg7gE8ZW8d6DlFLwecSeLdbG7ykKLqy2zOh9jkgbH3oXdILDnHqEi+hxaKgayG8I4 Ur6tSDZDgyClHVPdSQt40ylVLW8AJKHoZMeU5TUhA8T/HBQlntDJpYAD1WI6FPGrdczw 39bnRj00IXn2IIDzy3CxVjkN+Zzlql5TFGAZdCd83Jxtqi/bzMniIa8t36CgC40QaGVO WPjw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=mC6M6SFJVXgyKYnaTHVo4GQVbUdeXWhMMclNxOIOjj8=; fh=GFqfUblxcdgC4ZYgXtSxJAWK9/b9Rl60PswNUbS+uFg=; b=YAThsIcaKt4yY/Jl/57rEE/FXy7cO/P0iSqdALurOavreTwCu0//B0agp89W4wt/Gb AlzYt/8AIYyih/dh4IizHUscQ0fTNY/F5xPBGtYb0Rntz0syqhU+GtOlGkyZrLHCKTCW LlJ0Xj7tYT1Fk1fA2sBrDs0ARDrCnKnPm7rkqnqwTsRtcVqAujsmB8jIIF+URCxtgowR ez22/jgTnNVdCJm81o6KFh9W+gI94ZALj6QaNGbXmB4jezi4JQOCEBl/x0BYY9Mdv91Q BsnsI1i3PownLz/o98aSiqqg4pnAOr0CrtFlqOQuLAo1ajrlba0w73nCyBG2CRy2ON1o tqDw==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fittl.com; s=google; t=1775010341; x=1775615141; 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=mC6M6SFJVXgyKYnaTHVo4GQVbUdeXWhMMclNxOIOjj8=; b=VWMD8VrfNG6r39A5Oxb4xr74AMLJVINX+7LkZ8cwci4uGDOQpaKu/q9QE9jNz6HMs2 gpqkQ4GmQXnKYh23ChN1h3nQUDNxmWRzNdJXSlVuZPLgJklyc95nHjIxXEqSP7D95HgX KtnQ5scqc8pmPuv1VZ4q5muQoxdHytkt9Xxi4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775010341; x=1775615141; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=mC6M6SFJVXgyKYnaTHVo4GQVbUdeXWhMMclNxOIOjj8=; b=CQF7Xa0/mmGyqRPZ9VdzCbqVe6Rxvo7NY4liZOnVDdAh3dYqcGBEeD97PrkaTe1ytT sdD44AMqTdcHrMOs+H+c2UJjRumYhokm/Z/BRxYAT4vgPfPP1YAtWcdCYHSe+ZVLY/wh DBIl0vvA/vDSA3JK2VJbJM6d4DSUpDkp7dzz+9C0lLteuSon0VmuEQYmb3UIirr6JLe7 p5ssujN1Z/o/M2ADEoYcKFOLxwkLCwYSN2lx+zkKbHQ+RyzPjNKsVfuI/6/1LvnQbLSk WrTf1ZfCk+DrPvr5KGcrRfowhMq9e65TwOgE5NqEiIOhZaTpo8TuMgwJXyjBZ9VUWwRg tsDg== X-Forwarded-Encrypted: i=1; AJvYcCUxf9tlZa26RpFz2tP8/LumzzK3k+Uo/T9O8nrdR/vNwPdM7Ch7YWgsgIppchewLp42n+ssTVXR6yMn0vW1@lists.postgresql.org X-Gm-Message-State: AOJu0YzPswk85qzrsmqNWwpwO5noLET33LrQm9Uvmh8bX6FurcZSjmqS MppSlDZ3nnjdqEU5mxFd2tIwkxxZbMa+gw8drJc7yVumhizthUqVC8kjSx1AEF9zEFYQ/JlPRxN 1+Td/vNgFgXkScOP9G2wXlmHwl6SxI/1P1v1MlRgZ X-Gm-Gg: ATEYQzxGchhjAU7Ap1dZUvGXO1tb86UqFRVRGZpg/H7Ng8m9YVz+7H+e2ahbenpnu5q i/MhpZM4TU9E+2jwjhgo4xsAIwZyMSVDH8+10NVIBhP77eTkGHrBFW4zPJ8w/1rg5umcxTNl91d WN4qfqrxZa5DxOCYmhU3rg3S2U2JwK7GoiPp/jz4fqkq11oKnEc7eNpB9CSvZGl81dwH4zaVp4p 2PA/Dw8vNuLf+ZvPLh7j2ZjelCUPS6KVqaHv7fwtAiTgYwuxim704wJj6mmDGWNyR6zqi+W/vrE XMB1JffP6Xg69R1aU/PItpcuCVcHrIGkA3UfIEZhQJC/bqOMOhxHpNfqPxsOer4cFtzuRvf7 X-Received: by 2002:ac8:5ccd:0:b0:50b:2640:22e3 with SMTP id d75a77b69052e-50d3bc2ed53mr27610511cf.11.1775010340831; Tue, 31 Mar 2026 19:25:40 -0700 (PDT) MIME-Version: 1.0 References: <1136161.1769654478@sss.pgh.pa.us> <1299934.1773938807@sss.pgh.pa.us> In-Reply-To: From: Lukas Fittl Date: Tue, 31 Mar 2026 19:25:04 -0700 X-Gm-Features: AQROBzBagIgHkuonB7_jf9ykpKE3giEeKyOl200ZOgLuXx7-bun7Acsz6xr_UTE Message-ID: Subject: Re: pg_plan_advice To: Robert Haas Cc: Jakub Wartak , Tom Lane , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000d75b89064e5cccbd" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000d75b89064e5cccbd Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Mar 30, 2026 at 7:53=E2=80=AFAM Robert Haas = wrote: > > Hi, > > Thanks for taking the time to respond. My reading of your comments is > that we are in overall agreement on the design, with the possible > exception of persisting data cross restarts. I will write more about > that topic below; but I think if that's the only design disagreement > we have, it makes sense to go forward with committing the patch that I > have, and we can continue to discuss whether we want to add something > related to persistence. The only reason not to do that would be if > there were a consensus that the lack of a persistence framework was > such a critical defect that we shouldn't ship this at all without > that, but I don't agree with that idea and I think it would be a > pretty strong position for someone to take. Yeah, I think my position is that having a solution to persistence would be very good, but if that's not doable for this release, I think we have a potential way forward in future releases, at least when it comes to being restart-safe. That said, I still think it'll make a big difference in practice to be restart safe right away, if we can make it happen. > > On Sun, Mar 29, 2026 at 2:59=E2=80=AFPM Lukas Fittl wro= te: > > I think a simple disk file is the way to go, similar to how > > autoprewarm works with its "autoprewarm.blocks" file. Its a bit > > awkward that that just sits in the main data directory, but since > > pg_prewarm already does it today, I think its okay to have another > > contrib module do the same. As noted I'm mainly worried about restarts > > that the user didn't control, causing advice that was set to be lost. > > > > I've attached a patch of how that could look like on top of your v23, > > that copies the modified stash information to a > > "pg_stash_advice.entries" file, and loads it after restarts. > > I'll be honest: I don't like this design much at all, but I do see the > practical advantages of it, and we have done similar things elsewhere, > in particular in autoprewarm. Before I get to the specifics of your > patch, let me complain about some things that I don't like at the > design level. We lose a lot by directing data through a bespoke > mechanism rather than handling it as table data. There are no > checksums, so we have less protection against corruption. There is no > write-ahead logging, so data does not make it to standbys, which is > more of a potential issue for pg_stash_advice than it is for > autoprewarm. All the code to read and write the file is specific to > this contrib module, so it can have its own bugs separate from every > similar module's bugs. The data can't easily be examined and > manipulated from SQL as table data can. It's just a messy one-off that > solves a practical problem but is otherwise not very nice. Of course, > sometimes such messy one-offs are the right answer. I think if we wanted a table, we should make it a table - but I think the fact that we want this to be low-overhead for running queries to examine whether there is anything for them to apply, would require some kind of cache in front of it, and that gets complicated pretty quickly. For the file-based direction, just for reference, I'm attaching an updated version of that (on top of Robert's earlier v23), that utilizes a background worker to write out the dump file as needed, at most every 60 seconds. It also reworks some of the output logic to do better memory management, and uses a TSV file format that can be easily read again. To be clear, I think its okay to go ahead with merging pg_stash_advice without that and make it a best effort to get the file saving in too - but I think with the current design in this patch represents a reasonable solution to what we can do in terms of persistence across restarts in either 19 or 20. > > > Because the number of entries here is controlled by the user (i.e. its > > not a function of the workload, but a function of how much advice you > > as a user have set), I'm much less worried about memory usage, as long > > as we document it clearly how to measure the amount of memory used. > > The module doesn't have a built-in way to do that right now. Are you > thinking we would document that pg_get_dsm_registry_allocations() can > be used? Yeah, for example. Alternatively we could provide a function/view that lists all advice across all stashes, so you can more easily see the result size of that and estimate what the in-memory use is. But pointing to pg_get_dsm_registry_allocations seems easier. > > In practice for a good amount of our user base these days the question > > will be "Does my cloud provider give me access to create stash > > entries", so its maybe worth thinking about if we could also allow > > pg_maintain to manage entries by default? > > Wouldn't it make more sense for the cloud provider to grant execute > permissions on these functions to pg_maintain if they are so inclined? > This is a brand-new facility, so I think we had better be conservative > in terms of default permissions. I guess. I'm always worried that providers get that wrong and forget to give end users the permissions - but I suppose end users can complain to their providers if that's the case. I've done another look over pg_set_stashed_advice and I think its in good shape. The only trailing thought I have is that we could consider running a fuzzer against the pg_set_advice function in particular, just to see if anything pops up (beyond having the ability to make a very large memory allocation through a large advice string, which is maybe a problem?). Thanks, Lukas --=20 Lukas Fittl --000000000000d75b89064e5cccbd Content-Type: application/octet-stream; name="vnocfbot-2-0001-Make-pg_stash_advice-dump-advice-to-disk-.patch" Content-Disposition: attachment; filename="vnocfbot-2-0001-Make-pg_stash_advice-dump-advice-to-disk-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnffa12m0 RnJvbSBiNzM5Y2EwMDRjY2RlZGUyNjBjNTQxYmE4YzhkYzFhYTRlM2VhMTVkIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBMdWthcyBGaXR0bCA8bHVrYXNAZml0dGwuY29tPgpEYXRlOiBT dW4sIDI5IE1hciAyMDI2IDExOjQ3OjI3IC0wNzAwClN1YmplY3Q6IFtQQVRDSCB2bm9jZmJvdC0y XSBNYWtlIHBnX3N0YXNoX2FkdmljZSBkdW1wIGFkdmljZSB0byBkaXNrIHdoZW4KIGNoYW5nZWQs IGxvYWQgYWZ0ZXIgcmVzdGFydAoKLS0tCiBjb250cmliL3BnX3N0YXNoX2FkdmljZS9wZ19zdGFz aF9hZHZpY2UuYyB8IDUzMyArKysrKysrKysrKysrKysrKysrKystCiBkb2Mvc3JjL3NnbWwvcGdz dGFzaGFkdmljZS5zZ21sICAgICAgICAgICB8ICAzMSArLQogMiBmaWxlcyBjaGFuZ2VkLCA1NTkg aW5zZXJ0aW9ucygrKSwgNSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9jb250cmliL3BnX3N0 YXNoX2FkdmljZS9wZ19zdGFzaF9hZHZpY2UuYyBiL2NvbnRyaWIvcGdfc3Rhc2hfYWR2aWNlL3Bn X3N0YXNoX2FkdmljZS5jCmluZGV4IDIyMTIyMjM2Njk0Li42MWZiMTJhMTg4OCAxMDA2NDQKLS0t IGEvY29udHJpYi9wZ19zdGFzaF9hZHZpY2UvcGdfc3Rhc2hfYWR2aWNlLmMKKysrIGIvY29udHJp Yi9wZ19zdGFzaF9hZHZpY2UvcGdfc3Rhc2hfYWR2aWNlLmMKQEAgLTE4LDIyICsxOCwzNyBAQAog ICovCiAjaW5jbHVkZSAicG9zdGdyZXMuaCIKIAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCiAjaW5j bHVkZSAiY29tbW9uL2hhc2hmbi5oIgogI2luY2x1ZGUgImNvbW1vbi9zdHJpbmcuaCIKICNpbmNs dWRlICJmbWdyLmgiCiAjaW5jbHVkZSAiZnVuY2FwaS5oIgorI2luY2x1ZGUgIm1pc2NhZG1pbi5o IgogI2luY2x1ZGUgImxpYi9kc2hhc2guaCIKICNpbmNsdWRlICJub2Rlcy9xdWVyeWp1bWJsZS5o IgogI2luY2x1ZGUgInBnX3BsYW5fYWR2aWNlLmgiCisjaW5jbHVkZSAicG9zdG1hc3Rlci9iZ3dv cmtlci5oIgorI2luY2x1ZGUgInBvc3RtYXN0ZXIvaW50ZXJydXB0LmgiCiAjaW5jbHVkZSAic3Rv cmFnZS9kc21fcmVnaXN0cnkuaCIKKyNpbmNsdWRlICJzdG9yYWdlL2ZkLmgiCisjaW5jbHVkZSAi c3RvcmFnZS9pcGMuaCIKKyNpbmNsdWRlICJzdG9yYWdlL2xhdGNoLmgiCiAjaW5jbHVkZSAic3Rv cmFnZS9sd2xvY2suaCIKKyNpbmNsdWRlICJzdG9yYWdlL3Byb2MuaCIKKyNpbmNsdWRlICJzdG9y YWdlL3Byb2NzaWduYWwuaCIKKyNpbmNsdWRlICJ1dGlscy9iYWNrZW5kX3N0YXR1cy5oIgogI2lu Y2x1ZGUgInV0aWxzL2J1aWx0aW5zLmgiCiAjaW5jbHVkZSAidXRpbHMvZ3VjLmgiCiAjaW5jbHVk ZSAidXRpbHMvbWVtdXRpbHMuaCIKICNpbmNsdWRlICJ1dGlscy90dXBsZXN0b3JlLmgiCiAKKyNk ZWZpbmUgUEdTQV9EVU1QX0ZJTEUJCSJwZ19zdGFzaF9hZHZpY2UudHN2IgorCiBQR19NT0RVTEVf TUFHSUM7CiAKK1BHRExMRVhQT1JUIHZvaWQgcGdzYV9zdGFzaF9hZHZpY2VfbWFpbihEYXR1bSBt YWluX2FyZyk7CisKIFBHX0ZVTkNUSU9OX0lORk9fVjEocGdfY3JlYXRlX2FkdmljZV9zdGFzaCk7 CiBQR19GVU5DVElPTl9JTkZPX1YxKHBnX2Ryb3BfYWR2aWNlX3N0YXNoKTsKIFBHX0ZVTkNUSU9O X0lORk9fVjEocGdfZ2V0X2FkdmljZV9zdGFzaF9jb250ZW50cyk7CkBAIC01MCw2ICs2NSw4IEBA IHR5cGVkZWYgc3RydWN0IHBnc2Ffc2hhcmVkX3N0YXRlCiAJZHNhX2hhbmRsZQlhcmVhOwogCWRz aGFzaF90YWJsZV9oYW5kbGUgc3Rhc2hfaGFzaDsKIAlkc2hhc2hfdGFibGVfaGFuZGxlIGVudHJ5 X2hhc2g7CisJUHJvY051bWJlcgliZ3dvcmtlcl9wcm9jOworCWJvb2wJCWR1bXBfcmVxdWVzdGVk OwogfSBwZ3NhX3NoYXJlZF9zdGF0ZTsKIAogdHlwZWRlZiBzdHJ1Y3QgcGdzYV9zdGFzaApAQCAt MTMxLDggKzE0OCw5IEBAIHN0YXRpYyBkc2hhc2hfcGFyYW1ldGVycyBwZ3NhX2VudHJ5X2RzaGFz aF9wYXJhbWV0ZXJzID0gewogCUxXVFJBTkNIRV9JTlZBTElECQkJLyogZ2V0cyBzZXQgYXQgcnVu dGltZSAqLwogfTsKIAotLyogR1VDIHZhcmlhYmxlICovCisvKiBHVUMgdmFyaWFibGVzICovCiBz dGF0aWMgY2hhciAqcGdfc3Rhc2hfYWR2aWNlX3N0YXNoX25hbWUgPSAiIjsKK3N0YXRpYyBib29s IHBnX3N0YXNoX2FkdmljZV9zYXZlID0gdHJ1ZTsKIAogLyogT3RoZXIgZ2xvYmFsIHZhcmlhYmxl cyAqLwogc3RhdGljIE1lbW9yeUNvbnRleHQgcGdfc3Rhc2hfYWR2aWNlX21jeHQ7CkBAIC0xNTQs NiArMTcyLDEzIEBAIHN0YXRpYyB2b2lkIHBnc2FfaW5pdF9zaGFyZWRfc3RhdGUodm9pZCAqcHRy LCB2b2lkICphcmcpOwogc3RhdGljIHVpbnQ2NCBwZ3NhX2xvb2t1cF9zdGFzaF9pZChjaGFyICpz dGFzaF9uYW1lKTsKIHN0YXRpYyB2b2lkIHBnc2Ffc2V0X2FkdmljZV9zdHJpbmcoY2hhciAqc3Rh c2hfbmFtZSwgaW50NjQgcXVlcnlJZCwKIAkJCQkJCQkJICAgY2hhciAqYWR2aWNlX3N0cmluZyk7 CitzdGF0aWMgdm9pZCBwZ3NhX2R1bXBfdG9fZmlsZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHBnc2Ff bG9hZF9mcm9tX2ZpbGUodm9pZCk7CitzdGF0aWMgdm9pZCBwZ3NhX3JlcXVlc3RfZHVtcCh2b2lk KTsKK3N0YXRpYyB2b2lkIHBnc2FfZGV0YWNoX3NobWVtKGludCBjb2RlLCBEYXR1bSBhcmcpOwor c3RhdGljIHZvaWQgcGdzYV9zdGFydF9iZ3dvcmtlcih2b2lkKTsKK3N0YXRpYyBjaGFyICpwZ3Nh X2VzY2FwZV9zdHJpbmcoY2hhciAqc3RyKTsKK3N0YXRpYyBjaGFyICpwZ3NhX3JlYWRfbmV4dF9m aWVsZChjaGFyICoqcHApOwogCiAvKgogICogSW5pdGlhbGl6ZSB0aGlzIG1vZHVsZS4KQEAgLTE3 OCw2ICsyMDMsMjggQEAgX1BHX2luaXQodm9pZCkKIAkJCQkJCQkgICBOVUxMLAogCQkJCQkJCSAg IE5VTEwpOwogCisJaWYgKHByb2Nlc3Nfc2hhcmVkX3ByZWxvYWRfbGlicmFyaWVzX2luX3Byb2dy ZXNzKQorCXsKKwkJLyogY2FuJ3QgZGVmaW5lIFBHQ19QT1NUTUFTVEVSIHZhcmlhYmxlIGFmdGVy IHN0YXJ0dXAgKi8KKwkJRGVmaW5lQ3VzdG9tQm9vbFZhcmlhYmxlKCJwZ19zdGFzaF9hZHZpY2Uu c2F2ZSIsCisJCQkJCQkJCSAiU2F2ZSBhbmQgcmVzdG9yZSBhZHZpY2Ugc3Rhc2ggY29udGVudHMg YWNyb3NzIHJlc3RhcnRzLiIsCisJCQkJCQkJCSBOVUxMLAorCQkJCQkJCQkgJnBnX3N0YXNoX2Fk dmljZV9zYXZlLAorCQkJCQkJCQkgdHJ1ZSwKKwkJCQkJCQkJIFBHQ19QT1NUTUFTVEVSLAorCQkJ CQkJCQkgMCwKKwkJCQkJCQkJIE5VTEwsCisJCQkJCQkJCSBOVUxMLAorCQkJCQkJCQkgTlVMTCk7 CisKKwkJLyoKKwkJICogUmVnaXN0ZXIgYmFja2dyb3VuZCB3b3JrZXIgZm9yIGR1bXBpbmcgZW50 cmllcyB0byByZWNvdmVyIG9uCisJCSAqIHJlc3RhcnQsIGlmIGVuYWJsZWQuCisJCSAqLworCQlp ZiAocGdfc3Rhc2hfYWR2aWNlX3NhdmUpCisJCQlwZ3NhX3N0YXJ0X2Jnd29ya2VyKCk7CisJfQor CiAJTWFya0dVQ1ByZWZpeFJlc2VydmVkKCJwZ19zdGFzaF9hZHZpY2UiKTsKIAogCS8qIFRlbGwg cGdfcGxhbl9hZHZpY2UgdGhhdCB3ZSB3YW50IHRvIHByb3ZpZGUgYWR2aWNlIHN0cmluZ3MuICov CkBAIC0yMDEsNiArMjQ4LDcgQEAgcGdfY3JlYXRlX2FkdmljZV9zdGFzaChQR19GVU5DVElPTl9B UkdTKQogCUxXTG9ja0FjcXVpcmUoJnBnc2Ffc3RhdGUtPmxvY2ssIExXX0VYQ0xVU0lWRSk7CiAJ cGdzYV9jcmVhdGVfc3Rhc2goc3Rhc2hfbmFtZSk7CiAJTFdMb2NrUmVsZWFzZSgmcGdzYV9zdGF0 ZS0+bG9jayk7CisJcGdzYV9yZXF1ZXN0X2R1bXAoKTsKIAlQR19SRVRVUk5fVk9JRCgpOwogfQog CkBAIC0yMTgsNiArMjY2LDcgQEAgcGdfZHJvcF9hZHZpY2Vfc3Rhc2goUEdfRlVOQ1RJT05fQVJH UykKIAlMV0xvY2tBY3F1aXJlKCZwZ3NhX3N0YXRlLT5sb2NrLCBMV19FWENMVVNJVkUpOwogCXBn c2FfZHJvcF9zdGFzaChzdGFzaF9uYW1lKTsKIAlMV0xvY2tSZWxlYXNlKCZwZ3NhX3N0YXRlLT5s b2NrKTsKKwlwZ3NhX3JlcXVlc3RfZHVtcCgpOwogCVBHX1JFVFVSTl9WT0lEKCk7CiB9CiAKQEAg LTQ0MSw2ICs0OTAsNyBAQCBwZ19zZXRfc3Rhc2hlZF9hZHZpY2UoUEdfRlVOQ1RJT05fQVJHUykK IAkJcGdzYV9zZXRfYWR2aWNlX3N0cmluZyhzdGFzaF9uYW1lLCBxdWVyeUlkLCBhZHZpY2Vfc3Ry aW5nKTsKIAl9CiAKKwlwZ3NhX3JlcXVlc3RfZHVtcCgpOwogCVBHX1JFVFVSTl9WT0lEKCk7CiB9 CiAKQEAgLTc5Niw2ICs4NDYsOCBAQCBwZ3NhX2luaXRfc2hhcmVkX3N0YXRlKHZvaWQgKnB0ciwg dm9pZCAqYXJnKQogCXN0YXRlLT5hcmVhID0gRFNBX0hBTkRMRV9JTlZBTElEOwogCXN0YXRlLT5z dGFzaF9oYXNoID0gRFNIQVNIX0hBTkRMRV9JTlZBTElEOwogCXN0YXRlLT5lbnRyeV9oYXNoID0g RFNIQVNIX0hBTkRMRV9JTlZBTElEOworCXN0YXRlLT5iZ3dvcmtlcl9wcm9jID0gSU5WQUxJRF9Q Uk9DX05VTUJFUjsKKwlzdGF0ZS0+ZHVtcF9yZXF1ZXN0ZWQgPSBmYWxzZTsKIH0KIAogLyoKQEAg LTg5OCwzICs5NTAsNDgyIEBAIHBnc2Ffc2V0X2FkdmljZV9zdHJpbmcoY2hhciAqc3Rhc2hfbmFt ZSwgaW50NjQgcXVlcnlJZCwgY2hhciAqYWR2aWNlX3N0cmluZykKIAkJZHNhX2ZyZWUocGdzYV9k c2FfYXJlYSwgb2xkX2RwKTsKIAlMV0xvY2tSZWxlYXNlKCZwZ3NhX3N0YXRlLT5sb2NrKTsKIH0K KworLyoKKyAqIEJhY2tncm91bmQgd29ya2VyIGVudHJ5IHBvaW50LgorICoKKyAqIFRoaXMgd29y a2VyIGxvYWRzIHRoZSBkdW1wIGZpbGUgb24gc3RhcnR1cCwgdGhlbiB3YWl0cyBmb3IgZHVtcCBy ZXF1ZXN0cworICogZnJvbSBiYWNrZW5kcy4gIE9uIHNodXRkb3duLCBpdCBwZXJmb3JtcyBhIGZp bmFsIGR1bXAuCisgKi8KK3ZvaWQKK3Bnc2Ffc3Rhc2hfYWR2aWNlX21haW4oRGF0dW0gbWFpbl9h cmcpCit7CisJLyogRXN0YWJsaXNoIHNpZ25hbCBoYW5kbGVyczsgb25jZSB0aGF0J3MgZG9uZSwg dW5ibG9jayBzaWduYWxzLiAqLworCXBxc2lnbmFsKFNJR1RFUk0sIFNpZ25hbEhhbmRsZXJGb3JT aHV0ZG93blJlcXVlc3QpOworCXBxc2lnbmFsKFNJR0hVUCwgU2lnbmFsSGFuZGxlckZvckNvbmZp Z1JlbG9hZCk7CisJcHFzaWduYWwoU0lHVVNSMSwgcHJvY3NpZ25hbF9zaWd1c3IxX2hhbmRsZXIp OworCUJhY2tncm91bmRXb3JrZXJVbmJsb2NrU2lnbmFscygpOworCisJLyogU2V0IHVwIGEgc2Vz c2lvbiB1c2VyIHNvIHBnc3RhdF9iZXN0YXJ0X2ZpbmFsKCkgY2FuIHJlcG9ydCBpdC4gKi8KKwlJ bml0aWFsaXplU2Vzc2lvblVzZXJJZFN0YW5kYWxvbmUoKTsKKworCS8qIFJlcG9ydCB0aGlzIHdv cmtlciBpbiBwZ19zdGF0X2FjdGl2aXR5LiAqLworCXBnc3RhdF9iZWluaXQoKTsKKwlwZ3N0YXRf YmVzdGFydF9pbml0aWFsKCk7CisJcGdzdGF0X2Jlc3RhcnRfZmluYWwoKTsKKworCS8qIEF0dGFj aCB0byBzaGFyZWQgbWVtb3J5IHN0cnVjdHVyZXMuICovCisJcGdzYV9hdHRhY2goKTsKKworCS8q CisJICogU2V0IG9uLWRldGFjaCBob29rIHNvIHRoYXQgb3VyIFBJRCB3aWxsIGJlIGNsZWFyZWQg b24gZXhpdC4KKwkgKgorCSAqIE5COiBwZ19zdGFzaF9hZHZpY2UncyBzdGF0ZSBpcyBzdG9yZWQg aW4gYSBEU00gc2VnbWVudCwgYW5kIERTTQorCSAqIHNlZ21lbnRzIGFyZSBkZXRhY2hlZCBiZWZv cmUgY2FsbGluZyB0aGUgb25fc2htZW1fZXhpdCBjYWxsYmFja3MsIHNvIHdlCisJICogbXVzdCBw dXQgcGdzYV9kZXRhY2hfc2htZW0gaW4gdGhlIGJlZm9yZV9zaG1lbV9leGl0IGNhbGxiYWNrIGxp c3QuCisJICovCisJYmVmb3JlX3NobWVtX2V4aXQocGdzYV9kZXRhY2hfc2htZW0sIDApOworCisJ LyoKKwkgKiBTdG9yZSBvdXIgUElEIGluIHNoYXJlZCBtZW1vcnksIHVubGVzcyB0aGVyZSdzIGFs cmVhZHkgYW5vdGhlciB3b3JrZXIKKwkgKiBydW5uaW5nLgorCSAqLworCUxXTG9ja0FjcXVpcmUo JnBnc2Ffc3RhdGUtPmxvY2ssIExXX0VYQ0xVU0lWRSk7CisJaWYgKHBnc2Ffc3RhdGUtPmJnd29y a2VyX3Byb2MgIT0gSU5WQUxJRF9QUk9DX05VTUJFUikKKwl7CisJCUxXTG9ja1JlbGVhc2UoJnBn c2Ffc3RhdGUtPmxvY2spOworCQllcmVwb3J0KExPRywKKwkJCQkoZXJybXNnKCJwZ19zdGFzaF9h ZHZpY2Ugd29ya2VyIGlzIGFscmVhZHkgcnVubmluZyB1bmRlciBQSUQgJWQiLAorCQkJCQkJKGlu dCkgR2V0UEdQcm9jQnlOdW1iZXIocGdzYV9zdGF0ZS0+Ymd3b3JrZXJfcHJvYyktPnBpZCkpKTsK KwkJcmV0dXJuOworCX0KKwlwZ3NhX3N0YXRlLT5iZ3dvcmtlcl9wcm9jID0gTXlQcm9jTnVtYmVy OworCUxXTG9ja1JlbGVhc2UoJnBnc2Ffc3RhdGUtPmxvY2spOworCisJLyogTG9hZCBwcmV2aW91 c2x5IHNhdmVkIHN0YXNoIGRhdGEgZnJvbSBkaXNrLiAqLworCXBnc2FfbG9hZF9mcm9tX2ZpbGUo KTsKKworCS8qIER1bXAgd2hlbiByZXF1ZXN0ZWQsIHVudGlsIHNodXRkb3duLiAqLworCXdoaWxl ICghU2h1dGRvd25SZXF1ZXN0UGVuZGluZykKKwl7CisJCWJvb2wJCWR1bXBfcmVxdWVzdGVkID0g ZmFsc2U7CisKKwkJLyogSW4gY2FzZSBvZiBhIFNJR0hVUCwganVzdCByZWxvYWQgdGhlIGNvbmZp Z3VyYXRpb24uICovCisJCWlmIChDb25maWdSZWxvYWRQZW5kaW5nKQorCQl7CisJCQlDb25maWdS ZWxvYWRQZW5kaW5nID0gZmFsc2U7CisJCQlQcm9jZXNzQ29uZmlnRmlsZShQR0NfU0lHSFVQKTsK KwkJfQorCisJCS8qIENoZWNrIHdoZXRoZXIgYSBkdW1wIGhhcyBiZWVuIHJlcXVlc3RlZC4gKi8K KwkJTFdMb2NrQWNxdWlyZSgmcGdzYV9zdGF0ZS0+bG9jaywgTFdfRVhDTFVTSVZFKTsKKwkJaWYg KHBnc2Ffc3RhdGUtPmR1bXBfcmVxdWVzdGVkKQorCQl7CisJCQlwZ3NhX3N0YXRlLT5kdW1wX3Jl cXVlc3RlZCA9IGZhbHNlOworCQkJZHVtcF9yZXF1ZXN0ZWQgPSB0cnVlOworCQl9CisJCUxXTG9j a1JlbGVhc2UoJnBnc2Ffc3RhdGUtPmxvY2spOworCisJCWlmIChkdW1wX3JlcXVlc3RlZCkKKwkJ CXBnc2FfZHVtcF90b19maWxlKCk7CisKKwkJLyoKKwkJICogU2xlZXAgZm9yIHVwIHRvIDYwIHNl Y29uZHMgYmVmb3JlIGNoZWNraW5nIGFnYWluLiAgVGhpcyBlbnN1cmVzIHdlCisJCSAqIGNvYWxl c2NlIG11bHRpcGxlIHJhcGlkIGNoYW5nZXMgaW50byBhIHNpbmdsZSBkdW1wLgorCQkgKi8KKwkJ KHZvaWQpIFdhaXRMYXRjaChNeUxhdGNoLAorCQkJCQkJIFdMX0xBVENIX1NFVCB8IFdMX1RJTUVP VVQgfCBXTF9FWElUX09OX1BNX0RFQVRILAorCQkJCQkJIDYwMDAwTCwKKwkJCQkJCSBQR19XQUlU X0VYVEVOU0lPTik7CisKKwkJUmVzZXRMYXRjaChNeUxhdGNoKTsKKwl9CisKKwkvKiBQZXJmb3Jt IGEgZmluYWwgZHVtcCBiZWZvcmUgZXhpdGluZy4gKi8KKwlwZ3NhX2R1bXBfdG9fZmlsZSgpOwor fQorCisvKgorICogU2lnbmFsIHRoZSBiYWNrZ3JvdW5kIHdvcmtlciB0byBkdW1wIHN0YXNoIGRh dGEgdG8gZGlzay4KKyAqLworc3RhdGljIHZvaWQKK3Bnc2FfcmVxdWVzdF9kdW1wKHZvaWQpCit7 CisJTFdMb2NrQWNxdWlyZSgmcGdzYV9zdGF0ZS0+bG9jaywgTFdfRVhDTFVTSVZFKTsKKwlwZ3Nh X3N0YXRlLT5kdW1wX3JlcXVlc3RlZCA9IHRydWU7CisJTFdMb2NrUmVsZWFzZSgmcGdzYV9zdGF0 ZS0+bG9jayk7Cit9CisKKy8qCisgKiBDbGVhciBvdXIgUElEIGZyb20gc2hhcmVkIG1lbW9yeSBv biBleGl0LgorICovCitzdGF0aWMgdm9pZAorcGdzYV9kZXRhY2hfc2htZW0oaW50IGNvZGUsIERh dHVtIGFyZykKK3sKKwlMV0xvY2tBY3F1aXJlKCZwZ3NhX3N0YXRlLT5sb2NrLCBMV19FWENMVVNJ VkUpOworCWlmIChwZ3NhX3N0YXRlLT5iZ3dvcmtlcl9wcm9jID09IE15UHJvY051bWJlcikKKwkJ cGdzYV9zdGF0ZS0+Ymd3b3JrZXJfcHJvYyA9IElOVkFMSURfUFJPQ19OVU1CRVI7CisJTFdMb2Nr UmVsZWFzZSgmcGdzYV9zdGF0ZS0+bG9jayk7Cit9CisKKy8qCisgKiBSZWdpc3RlciB0aGUgYmFj a2dyb3VuZCB3b3JrZXIuCisgKi8KK3N0YXRpYyB2b2lkCitwZ3NhX3N0YXJ0X2Jnd29ya2VyKHZv aWQpCit7CisJQmFja2dyb3VuZFdvcmtlciB3b3JrZXIgPSB7MH07CisKKwl3b3JrZXIuYmd3X2Zs YWdzID0gQkdXT1JLRVJfU0hNRU1fQUNDRVNTOworCXdvcmtlci5iZ3dfc3RhcnRfdGltZSA9IEJn V29ya2VyU3RhcnRfQ29uc2lzdGVudFN0YXRlOworCXN0cmNweSh3b3JrZXIuYmd3X2xpYnJhcnlf bmFtZSwgInBnX3N0YXNoX2FkdmljZSIpOworCXN0cmNweSh3b3JrZXIuYmd3X2Z1bmN0aW9uX25h bWUsICJwZ3NhX3N0YXNoX2FkdmljZV9tYWluIik7CisJc3RyY3B5KHdvcmtlci5iZ3dfbmFtZSwg InBnX3N0YXNoX2FkdmljZSB3b3JrZXIiKTsKKwlzdHJjcHkod29ya2VyLmJnd190eXBlLCAicGdf c3Rhc2hfYWR2aWNlIHdvcmtlciIpOworCisJUmVnaXN0ZXJCYWNrZ3JvdW5kV29ya2VyKCZ3b3Jr ZXIpOworfQorCisvKgorICogRHVtcCBhbGwgYWR2aWNlIHN0YXNoIGRhdGEgdG8gYSBmaWxlLgor ICoKKyAqIFRoZSBmaWxlIGZvcm1hdCBpcyBhIHNpbXBsZSBUU1Ygd2l0aCBhIGxpbmUtdHlwZSBw cmVmaXg6CisgKiAgIHN0YXNoXHRzdGFzaF9uYW1lCisgKiAgIGVudHJ5XHRzdGFzaF9uYW1lXHRx dWVyeV9pZFx0YWR2aWNlX3N0cmluZworICoKKyAqIFN0YXNoIG5hbWVzIGFuZCBhZHZpY2Ugc3Ry aW5ncyBhcmUgYmFja3NsYXNoLWVzY2FwZWQgd2hlcmUgbmVlZGVkLgorICovCitzdGF0aWMgdm9p ZAorcGdzYV9kdW1wX3RvX2ZpbGUodm9pZCkKK3sKKwlGSUxFCSAgICpmaWxlOworCWNoYXIJCXRy YW5zaWVudF9kdW1wX2ZpbGVfcGF0aFtNQVhQR1BBVEhdOworCWRzaGFzaF9zZXFfc3RhdHVzIGl0 ZXI7CisJcGdzYV9zdGFzaCAqc3Rhc2g7CisJcGdzYV9lbnRyeSAqZW50cnk7CisJcGdzYV9zdGFz aF9uYW1lX3RhYmxlX2hhc2ggKm5oYXNoOworCWludAkJCXJldCA9IDA7CisJTWVtb3J5Q29udGV4 dCB0bXBjeHQ7CisJTWVtb3J5Q29udGV4dCBvbGRjeHQ7CisKKwlBc3NlcnQocGdzYV9lbnRyeV9k c2hhc2ggIT0gTlVMTCk7CisKKwkvKiBVc2UgYSB0ZW1wb3JhcnkgY29udGV4dCBzbyBhbGwgYWxs b2NhdGlvbnMgYXJlIGZyZWVkIGF0IHRoZSBlbmQuICovCisJdG1wY3h0ID0gQWxsb2NTZXRDb250 ZXh0Q3JlYXRlKEN1cnJlbnRNZW1vcnlDb250ZXh0LAorCQkJCQkJCQkgICAicGdfc3Rhc2hfYWR2 aWNlIGR1bXAiLAorCQkJCQkJCQkgICBBTExPQ1NFVF9ERUZBVUxUX1NJWkVTKTsKKwlvbGRjeHQg PSBNZW1vcnlDb250ZXh0U3dpdGNoVG8odG1wY3h0KTsKKworCS8qIE9wZW4gYSB0ZW1wb3Jhcnkg ZmlsZSBmb3Igd3JpdGluZy4gKi8KKwlzbnByaW50Zih0cmFuc2llbnRfZHVtcF9maWxlX3BhdGgs IE1BWFBHUEFUSCwgIiVzLnRtcCIsIFBHU0FfRFVNUF9GSUxFKTsKKwlmaWxlID0gQWxsb2NhdGVG aWxlKHRyYW5zaWVudF9kdW1wX2ZpbGVfcGF0aCwgInciKTsKKwlpZiAoIWZpbGUpCisJCWVyZXBv cnQoRVJST1IsCisJCQkJKGVycmNvZGVfZm9yX2ZpbGVfYWNjZXNzKCksCisJCQkJIGVycm1zZygi Y291bGQgbm90IG9wZW4gZmlsZSBcIiVzXCI6ICVtIiwKKwkJCQkJCXRyYW5zaWVudF9kdW1wX2Zp bGVfcGF0aCkpKTsKKworCS8qIEJ1aWxkIGFuIElELT5uYW1lIGxvb2t1cCB0YWJsZSBmb3Igd3Jp dGluZyBlbnRyeSBsaW5lcy4gKi8KKwluaGFzaCA9IHBnc2Ffc3Rhc2hfbmFtZV90YWJsZV9jcmVh dGUodG1wY3h0LCA2NCwgTlVMTCk7CisKKwkvKiBXcml0ZSBzdGFzaCBsaW5lcy4gKi8KKwlkc2hh c2hfc2VxX2luaXQoJml0ZXIsIHBnc2Ffc3Rhc2hfZHNoYXNoLCB0cnVlKTsKKwl3aGlsZSAoKHN0 YXNoID0gZHNoYXNoX3NlcV9uZXh0KCZpdGVyKSkgIT0gTlVMTCkKKwl7CisJCXBnc2Ffc3Rhc2hf bmFtZSAqbjsKKwkJYm9vbAkJZm91bmQ7CisKKwkJbiA9IHBnc2Ffc3Rhc2hfbmFtZV90YWJsZV9p bnNlcnQobmhhc2gsIHN0YXNoLT5wZ3NhX3N0YXNoX2lkLCAmZm91bmQpOworCQlBc3NlcnQoIWZv dW5kKTsKKwkJbi0+bmFtZSA9IHBzdHJkdXAoc3Rhc2gtPm5hbWUpOworCQlyZXQgPSBmcHJpbnRm KGZpbGUsICJzdGFzaFx0JXNcbiIsIHBnc2FfZXNjYXBlX3N0cmluZyhuLT5uYW1lKSk7CisJCWlm IChyZXQgPCAwKQorCQkJYnJlYWs7CisJfQorCWRzaGFzaF9zZXFfdGVybSgmaXRlcik7CisKKwkv KiBXcml0ZSBlbnRyeSBsaW5lcy4gKi8KKwlpZiAocmV0ID49IDApCisJeworCQlkc2hhc2hfc2Vx X2luaXQoJml0ZXIsIHBnc2FfZW50cnlfZHNoYXNoLCB0cnVlKTsKKwkJd2hpbGUgKChlbnRyeSA9 IGRzaGFzaF9zZXFfbmV4dCgmaXRlcikpICE9IE5VTEwpCisJCXsKKwkJCXBnc2Ffc3Rhc2hfbmFt ZSAqbjsKKwkJCWNoYXIJICAgKmFkdmljZV9zdHJpbmc7CisKKwkJCWlmIChlbnRyeS0+YWR2aWNl X3N0cmluZyA9PSBJbnZhbGlkRHNhUG9pbnRlcikKKwkJCQljb250aW51ZTsKKworCQkJbiA9IHBn c2Ffc3Rhc2hfbmFtZV90YWJsZV9sb29rdXAobmhhc2gsIGVudHJ5LT5rZXkucGdzYV9zdGFzaF9p ZCk7CisJCQlpZiAobiA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOwkJLyogb3JwaGFuIGVudHJ5LCBz a2lwICovCisKKwkJCWFkdmljZV9zdHJpbmcgPSBkc2FfZ2V0X2FkZHJlc3MocGdzYV9kc2FfYXJl YSwKKwkJCQkJCQkJCQkJZW50cnktPmFkdmljZV9zdHJpbmcpOworCQkJcmV0ID0gZnByaW50Zihm aWxlLCAiZW50cnlcdCVzXHQlIiBQUklkNjQgIlx0JXNcbiIsCisJCQkJCQkgIHBnc2FfZXNjYXBl X3N0cmluZyhuLT5uYW1lKSwKKwkJCQkJCSAgZW50cnktPmtleS5xdWVyeUlkLAorCQkJCQkJICBw Z3NhX2VzY2FwZV9zdHJpbmcoYWR2aWNlX3N0cmluZykpOworCQkJaWYgKHJldCA8IDApCisJCQkJ YnJlYWs7CisJCX0KKwkJZHNoYXNoX3NlcV90ZXJtKCZpdGVyKTsKKwl9CisKKwkvKiBIYW5kbGUg YW55IHdyaXRlIGVycm9yLiAqLworCWlmIChyZXQgPCAwKQorCXsKKwkJaW50CQkJc2F2ZV9lcnJu byA9IGVycm5vOworCisJCUZyZWVGaWxlKGZpbGUpOworCQl1bmxpbmsodHJhbnNpZW50X2R1bXBf ZmlsZV9wYXRoKTsKKwkJZXJybm8gPSBzYXZlX2Vycm5vOworCQllcmVwb3J0KEVSUk9SLAorCQkJ CShlcnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorCQkJCSBlcnJtc2coImNvdWxkIG5vdCB3cml0 ZSB0byBmaWxlIFwiJXNcIjogJW0iLAorCQkJCQkJdHJhbnNpZW50X2R1bXBfZmlsZV9wYXRoKSkp OworCX0KKworCS8qIENsb3NlIHRoZSBmaWxlIGFuZCByZW5hbWUgaXQgaW50byBwbGFjZSBhdG9t aWNhbGx5LiAqLworCXJldCA9IEZyZWVGaWxlKGZpbGUpOworCWlmIChyZXQgIT0gMCkKKwl7CisJ CWludAkJCXNhdmVfZXJybm8gPSBlcnJubzsKKworCQl1bmxpbmsodHJhbnNpZW50X2R1bXBfZmls ZV9wYXRoKTsKKwkJZXJybm8gPSBzYXZlX2Vycm5vOworCQllcmVwb3J0KEVSUk9SLAorCQkJCShl cnJjb2RlX2Zvcl9maWxlX2FjY2VzcygpLAorCQkJCSBlcnJtc2coImNvdWxkIG5vdCBjbG9zZSBm aWxlIFwiJXNcIjogJW0iLAorCQkJCQkJdHJhbnNpZW50X2R1bXBfZmlsZV9wYXRoKSkpOworCX0K KworCSh2b2lkKSBkdXJhYmxlX3JlbmFtZSh0cmFuc2llbnRfZHVtcF9maWxlX3BhdGgsIFBHU0Ff RFVNUF9GSUxFLCBFUlJPUik7CisKKwlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkY3h0KTsKKwlN ZW1vcnlDb250ZXh0RGVsZXRlKHRtcGN4dCk7Cit9CisKKy8qCisgKiBMb2FkIGFkdmljZSBzdGFz aCBkYXRhIGZyb20gdGhlIGR1bXAgZmlsZS4KKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBvbmNlIHdo ZW4gdGhlIHNoYXJlZCBtZW1vcnkgc3RhdGUgaXMgZmlyc3QgaW5pdGlhbGl6ZWQKKyAqIChpLmUu IGFmdGVyIGEgc2VydmVyIHJlc3RhcnQgb3IgY3Jhc2ggcmVjb3ZlcnkpLCB0byByZXN0b3JlIHRo ZSBwcmV2aW91c2x5CisgKiBzYXZlZCBzdGFzaCBjb250ZW50cy4KKyAqCisgKiBFcnJvcnMgZHVy aW5nIGxvYWRpbmcgYXJlIHJlcG9ydGVkIGFzIHdhcm5pbmdzIHNvIHRoYXQgYSBjb3JydXB0IGR1 bXAgZmlsZQorICogZG9lcyBub3QgcHJldmVudCB0aGUgc2VydmVyIGZyb20gc3RhcnRpbmcuCisg Ki8KK3N0YXRpYyB2b2lkCitwZ3NhX2xvYWRfZnJvbV9maWxlKHZvaWQpCit7CisJRklMRQkgICAq ZmlsZTsKKwlpbnQJCQludW1fc3Rhc2hlcyA9IDA7CisJaW50CQkJbnVtX2VudHJpZXMgPSAwOwor CWludAkJCW51bV9tYWxmb3JtZWQgPSAwOworCWNoYXIJICAgKmxpbmU7CisKKwlmaWxlID0gQWxs b2NhdGVGaWxlKFBHU0FfRFVNUF9GSUxFLCAiciIpOworCWlmICghZmlsZSkKKwl7CisJCWlmIChl cnJubyA9PSBFTk9FTlQpCisJCQlyZXR1cm47CQkJCS8qIG5vIGR1bXAgZmlsZSwgbm90aGluZyB0 byBsb2FkICovCisJCWVyZXBvcnQoV0FSTklORywKKwkJCQkoZXJyY29kZV9mb3JfZmlsZV9hY2Nl c3MoKSwKKwkJCQkgZXJybXNnKCJjb3VsZCBub3Qgb3BlbiBmaWxlIFwiJXNcIjogJW0iLCBQR1NB X0RVTVBfRklMRSkpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFJlYWQgbGluZXMgdW50aWwgRU9G LiAqLworCXdoaWxlICgobGluZSA9IHBnX2dldF9saW5lKGZpbGUsIE5VTEwpKSAhPSBOVUxMKQor CXsKKwkJY2hhcgkgICAqcCA9IGxpbmU7CisJCWNoYXIJICAgKmxpbmVfdHlwZTsKKworCQkvKiBT dHJpcCB0aGUgdHJhaWxpbmcgbmV3bGluZS4gKi8KKwkJcGdfc3RyaXBfY3JsZihsaW5lKTsKKwor CQkvKiBTcGxpdCBvZmYgdGhlIGxpbmUgdHlwZSBwcmVmaXggKHVuZXNjYXBlZCwgcGxhaW4ga2V5 d29yZCkuICovCisJCWxpbmVfdHlwZSA9IHBnc2FfcmVhZF9uZXh0X2ZpZWxkKCZwKTsKKwkJaWYg KGxpbmVfdHlwZSA9PSBOVUxMKQorCQl7CisJCQludW1fbWFsZm9ybWVkKys7CisJCQlwZnJlZShs aW5lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN0cmNtcChsaW5lX3R5cGUsICJzdGFz aCIpID09IDApCisJCXsKKwkJCWNoYXIJICAgKm5hbWUgPSBwZ3NhX3JlYWRfbmV4dF9maWVsZCgm cCk7CisKKwkJCWlmIChuYW1lICE9IE5VTEwpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBTa2lwIGR1 cGxpY2F0ZXMgcmF0aGVyIHRoYW4gRVJST1JpbmcgbGlrZQorCQkJCSAqIHBnc2FfY3JlYXRlX3N0 YXNoLgorCQkJCSAqLworCQkJCWlmIChwZ3NhX2xvb2t1cF9zdGFzaF9pZChuYW1lKSA9PSAwKQor CQkJCXsKKwkJCQkJTFdMb2NrQWNxdWlyZSgmcGdzYV9zdGF0ZS0+bG9jaywgTFdfRVhDTFVTSVZF KTsKKwkJCQkJcGdzYV9jcmVhdGVfc3Rhc2gobmFtZSk7CisJCQkJCUxXTG9ja1JlbGVhc2UoJnBn c2Ffc3RhdGUtPmxvY2spOworCQkJCX0KKwkJCQludW1fc3Rhc2hlcysrOworCQkJCXBmcmVlKG5h bWUpOworCQkJfQorCQkJZWxzZQorCQkJCW51bV9tYWxmb3JtZWQrKzsKKwkJfQorCQllbHNlIGlm IChzdHJjbXAobGluZV90eXBlLCAiZW50cnkiKSA9PSAwKQorCQl7CisJCQljaGFyCSAgICpzdGFz aF9uYW1lOworCQkJY2hhcgkgICAqcXVlcnlpZF9zdHI7CisJCQljaGFyCSAgICphZHZpY2Vfc3Ry aW5nOworCQkJaW50NjQJCXF1ZXJ5SWQ7CisJCQlFcnJvclNhdmVDb250ZXh0IGVzY29udGV4dCA9 IHtUX0Vycm9yU2F2ZUNvbnRleHR9OworCisJCQlzdGFzaF9uYW1lID0gcGdzYV9yZWFkX25leHRf ZmllbGQoJnApOworCQkJcXVlcnlpZF9zdHIgPSBwZ3NhX3JlYWRfbmV4dF9maWVsZCgmcCk7CisJ CQlhZHZpY2Vfc3RyaW5nID0gcGdzYV9yZWFkX25leHRfZmllbGQoJnApOworCisJCQlpZiAoc3Rh c2hfbmFtZSA9PSBOVUxMIHx8IHF1ZXJ5aWRfc3RyID09IE5VTEwgfHwKKwkJCQlhZHZpY2Vfc3Ry aW5nID09IE5VTEwpCisJCQl7CisJCQkJbnVtX21hbGZvcm1lZCsrOworCQkJCWlmIChzdGFzaF9u YW1lKQorCQkJCQlwZnJlZShzdGFzaF9uYW1lKTsKKwkJCQlpZiAocXVlcnlpZF9zdHIpCisJCQkJ CXBmcmVlKHF1ZXJ5aWRfc3RyKTsKKwkJCQlpZiAoYWR2aWNlX3N0cmluZykKKwkJCQkJcGZyZWUo YWR2aWNlX3N0cmluZyk7CisJCQkJcGZyZWUobGluZV90eXBlKTsKKwkJCQlwZnJlZShsaW5lKTsK KwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJcXVlcnlJZCA9IHBnX3N0cnRvaW50NjRfc2FmZShx dWVyeWlkX3N0ciwgKE5vZGUgKikgJmVzY29udGV4dCk7CisJCQlpZiAoIVNPRlRfRVJST1JfT0ND VVJSRUQoJmVzY29udGV4dCkpCisJCQl7CisJCQkJcGdzYV9zZXRfYWR2aWNlX3N0cmluZyhzdGFz aF9uYW1lLCBxdWVyeUlkLCBhZHZpY2Vfc3RyaW5nKTsKKwkJCQludW1fZW50cmllcysrOworCQkJ fQorCQkJZWxzZQorCQkJCW51bV9tYWxmb3JtZWQrKzsKKworCQkJcGZyZWUoc3Rhc2hfbmFtZSk7 CisJCQlwZnJlZShxdWVyeWlkX3N0cik7CisJCQlwZnJlZShhZHZpY2Vfc3RyaW5nKTsKKwkJfQor CQllbHNlCisJCXsKKwkJCW51bV9tYWxmb3JtZWQrKzsKKwkJfQorCQlwZnJlZShsaW5lX3R5cGUp OworCQlwZnJlZShsaW5lKTsKKwl9CisKKwlGcmVlRmlsZShmaWxlKTsKKworCWlmIChudW1fbWFs Zm9ybWVkID4gMCkKKwkJZXJlcG9ydChXQVJOSU5HLAorCQkJCWVycm1zZygic2tpcHBlZCAlZCBt YWxmb3JtZWQgYWR2aWNlIGxpbmVzIG9uIGxvYWQiLAorCQkJCQkgICBudW1fbWFsZm9ybWVkKSk7 CisKKwllcmVwb3J0KExPRywKKwkJCWVycm1zZygibG9hZGVkICVkIGFkdmljZSBzdGFzaGVzIHdp dGggJWQgZW50cmllcyIsCisJCQkJICAgbnVtX3N0YXNoZXMsIG51bV9lbnRyaWVzKSk7Cit9CisK Ky8qCisgKiBCYWNrc2xhc2gtZXNjYXBlIHRoZSBzdHJpbmcgc28gaXQgY2FuIGJlIHdyaXR0ZW4g dG8gYSB0YWItc2VwYXJhdGVkIGZpbGUuCisgKgorICogVGhlIGVzY2FwZWQgY2hhcmFjdGVycyBh cmUgYmFja3NsYXNoLCB0YWIsIGFuZCBuZXdsaW5lLgorICovCitzdGF0aWMgY2hhciAqCitwZ3Nh X2VzY2FwZV9zdHJpbmcoY2hhciAqc3RyKQoreworCVN0cmluZ0luZm9EYXRhIGJ1ZjsKKworCWlm ICghc3RycGJyayhzdHIsICJcXFx0XG4iKSkKKwkJcmV0dXJuIHN0cjsKKworCWluaXRTdHJpbmdJ bmZvKCZidWYpOworCWZvciAoY29uc3QgY2hhciAqcCA9IHN0cjsgKnA7IHArKykKKwl7CisJCXN3 aXRjaCAoKnApCisJCXsKKwkJCWNhc2UgJ1xcJzoKKwkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5n KCZidWYsICJcXFxcIik7CisJCQkJYnJlYWs7CisJCQljYXNlICdcdCc6CisJCQkJYXBwZW5kU3Ry aW5nSW5mb1N0cmluZygmYnVmLCAiXFx0Iik7CisJCQkJYnJlYWs7CisJCQljYXNlICdcbic6CisJ CQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmYnVmLCAiXFxuIik7CisJCQkJYnJlYWs7CisJCQlj YXNlICdccic6CisJCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZygmYnVmLCAiXFxyIik7CisJCQkJ YnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKCZidWYsICpwKTsK KwkJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBidWYuZGF0YTsKK30KKworLyoKKyAqIFJl YWQgdGhlIG5leHQgdGFiLWRlbGltaXRlZCBmaWVsZCBmcm9tICpwcCwgdW5lc2NhcGluZyBiYWNr c2xhc2ggc2VxdWVuY2VzCisgKiBhcyB3ZSBnby4gIEFkdmFuY2VzICpwcCBwYXN0IHRoZSB0YWIg ZGVsaW1pdGVyIChvciB0byBlbmQgb2Ygc3RyaW5nKS4KKyAqCisgKiBSZXR1cm5zIGEgcGFsbG9j J2Qgc3RyaW5nIHdpdGggdGhlIHVuZXNjYXBlZCBmaWVsZCB2YWx1ZSwgb3IgTlVMTCBpZiB0aGVy ZQorICogYXJlIG5vIG1vcmUgZmllbGRzIChpLmUuICpwcCBhbHJlYWR5IHBvaW50cyB0byAnXDAn KS4KKyAqLworc3RhdGljIGNoYXIgKgorcGdzYV9yZWFkX25leHRfZmllbGQoY2hhciAqKnBwKQor eworCVN0cmluZ0luZm9EYXRhIGJ1ZjsKKwljb25zdCBjaGFyICpwID0gKnBwOworCisJaWYgKCpw ID09ICdcMCcpCisJCXJldHVybiBOVUxMOworCisJaW5pdFN0cmluZ0luZm8oJmJ1Zik7CisJd2hp bGUgKCpwICE9ICdcMCcgJiYgKnAgIT0gJ1x0JykKKwl7CisJCWlmICgqcCA9PSAnXFwnICYmIHBb MV0gIT0gJ1wwJykKKwkJeworCQkJcCsrOworCQkJc3dpdGNoICgqcCkKKwkJCXsKKwkJCQljYXNl ICdcXCc6CisJCQkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKCZidWYsICdcXCcpOworCQkJCQlicmVh azsKKwkJCQljYXNlICd0JzoKKwkJCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoJmJ1ZiwgJ1x0Jyk7 CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ24nOgorCQkJCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcigm YnVmLCAnXG4nKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAncic6CisJCQkJCWFwcGVuZFN0cmlu Z0luZm9DaGFyKCZidWYsICdccicpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQkv KiBVbnJlY29nbml6ZWQgZXNjYXBlOyBrZWVwIGFzLWlzLiAqLworCQkJCQlhcHBlbmRTdHJpbmdJ bmZvQ2hhcigmYnVmLCAqcCk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UKKwkJCWFw cGVuZFN0cmluZ0luZm9DaGFyKCZidWYsICpwKTsKKwkJcCsrOworCX0KKworCS8qIFNraXAgdGhl IHRhYiBkZWxpbWl0ZXIgaWYgcHJlc2VudC4gKi8KKwlpZiAoKnAgPT0gJ1x0JykKKwkJcCsrOwor CisJKnBwID0gKGNoYXIgKikgcDsKKwlyZXR1cm4gYnVmLmRhdGE7Cit9CmRpZmYgLS1naXQgYS9k b2Mvc3JjL3NnbWwvcGdzdGFzaGFkdmljZS5zZ21sIGIvZG9jL3NyYy9zZ21sL3Bnc3Rhc2hhZHZp Y2Uuc2dtbAppbmRleCAwODlmYzY2NDQ2Zi4uOTM3ZDMxZTU1N2IgMTAwNjQ0Ci0tLSBhL2RvYy9z cmMvc2dtbC9wZ3N0YXNoYWR2aWNlLnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL3Bnc3Rhc2hhZHZp Y2Uuc2dtbApAQCAtMTUsMTAgKzE1LDEyIEBACiAgIDxsaW5rIGxpbmtlbmQ9Imd1Yy1jb21wdXRl LXF1ZXJ5LWlkIj5xdWVyeSBpZGVudGlmaWVyczwvbGluaz4gdG8gcGxhbiBhZHZpY2UKICAgc3Ry aW5ncy4gV2hlbmV2ZXIgYSBzZXNzaW9uIGlzIGFza2VkIHRvIHBsYW4gYSBxdWVyeSB3aG9zZSBx dWVyeSBJRCBhcHBlYXJzCiAgIGluIHRoZSByZWxldmFudCBhZHZpY2Ugc3Rhc2gsIHRoZSBwbGFu IGFkdmljZSBzdHJpbmcgaXMgYXV0b21hdGljYWxseSBhcHBsaWVkCi0gIHRvIGd1aWRlIHBsYW5u aW5nLiBOb3RlIHRoYXQgYWR2aWNlIHN0YXNoZXMgZXhpc3QgcHVyZWx5IGluIG1lbW9yeS4gVGhp cwotICBtZWFucyBib3RoIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGJlIG1pbmRmdWwgb2YgbWVt b3J5IGNvbnN1bXB0aW9uIHdoZW4KLSAgZGVjaWRpbmcgaG93IG11Y2ggcGxhbiBhZHZpY2UgdG8g c3Rhc2gsIGFuZCBhbHNvIHRoYXQgYWR2aWNlIHN0YXNoZXMgbXVzdAotICBiZSByZWNyZWF0ZWQg YW5kIHJlcG9wdWxhdGVkIHdoZW5ldmVyIHRoZSBzZXJ2ZXIgaXMgcmVzdGFydGVkLgorICB0byBn dWlkZSBwbGFubmluZy4gQWR2aWNlIHN0YXNoZXMgYXJlIGhlbGQgaW4gbWVtb3J5LCBzbyBpdCBp cyBpbXBvcnRhbnQKKyAgdG8gYmUgbWluZGZ1bCBvZiBtZW1vcnkgY29uc3VtcHRpb24gd2hlbiBk ZWNpZGluZyBob3cgbXVjaCBwbGFuIGFkdmljZSB0bworICBzdGFzaC4gVGhlIGNvbnRlbnRzIGFy ZSBhdXRvbWF0aWNhbGx5IHNhdmVkIHRvIGEgZmlsZSBjYWxsZWQKKyAgPGZpbGVuYW1lPnBnX3N0 YXNoX2FkdmljZS50c3Y8L2ZpbGVuYW1lPiB3aGVuZXZlciB0aGV5IGFyZSBtb2RpZmllZCwKKyAg YW5kIHJlc3RvcmVkIHdoZW4gdGhlIGZpcnN0IHNlc3Npb24gYXR0YWNoZXMgYWZ0ZXIgYSBzZXJ2 ZXIgcmVzdGFydAorICAoaW5jbHVkaW5nIGFmdGVyIGEgY3Jhc2gpLgogIDwvcGFyYT4KIAogIDxw YXJhPgpAQCAtMjAzLDYgKzIwNSwyNyBAQAogICAgIDwvbGlzdGl0ZW0+CiAgICA8L3Zhcmxpc3Rl bnRyeT4KIAorICAgPHZhcmxpc3RlbnRyeT4KKyAgICA8dGVybT4KKyAgICAgPHZhcm5hbWU+cGdf c3Rhc2hfYWR2aWNlLnNhdmU8L3Zhcm5hbWU+ICg8dHlwZT5ib29sZWFuPC90eXBlPikKKyAgICAg PGluZGV4dGVybT4KKyAgICAgIDxwcmltYXJ5Pjx2YXJuYW1lPnBnX3N0YXNoX2FkdmljZS5zYXZl PC92YXJuYW1lPiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcjwvcHJpbWFyeT4KKyAgICAgPC9pbmRl eHRlcm0+CisgICAgPC90ZXJtPgorCisgICAgPGxpc3RpdGVtPgorICAgICA8cGFyYT4KKyAgICAg IFNwZWNpZmllcyB3aGV0aGVyIHRvIHNhdmUgYWR2aWNlIHN0YXNoIGNvbnRlbnRzIHRvIGRpc2sg c28gdGhhdCB0aGV5CisgICAgICBjYW4gYmUgcmVzdG9yZWQgYWZ0ZXIgYSBzZXJ2ZXIgcmVzdGFy dCAoaW5jbHVkaW5nIGFmdGVyIGEgY3Jhc2gpLgorICAgICAgV2hlbiBlbmFibGVkLCBhIGJhY2tn cm91bmQgd29ya2VyIGNoZWNrcyBldmVyeSA2MCBzZWNvbmRzIGZvciBjaGFuZ2VzCisgICAgICBh bmQgd3JpdGVzIHN0YXNoIGNvbnRlbnRzIHRvIGEgZmlsZSBjYWxsZWQKKyAgICAgIDxmaWxlbmFt ZT5wZ19zdGFzaF9hZHZpY2UudHN2PC9maWxlbmFtZT4gaW4gdGhlIGRhdGEgZGlyZWN0b3J5Lgor ICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGxpdGVyYWw+b248L2xpdGVyYWw+LiAgVGhpcyBw YXJhbWV0ZXIgY2FuIG9ubHkKKyAgICAgIGJlIHNldCBhdCBzZXJ2ZXIgc3RhcnQuCisgICAgIDwv cGFyYT4KKyAgICA8L2xpc3RpdGVtPgorICAgPC92YXJsaXN0ZW50cnk+CisKICAgPC92YXJpYWJs ZWxpc3Q+CiAKICA8L3NlY3QyPgotLSAKMi40Ny4xCgo= --000000000000d75b89064e5cccbd--