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 1ueu21-00GW15-CF for pgsql-hackers@arkaria.postgresql.org; Thu, 24 Jul 2025 11:22:38 +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 1ueu20-007ZLu-Hy for pgsql-hackers@arkaria.postgresql.org; Thu, 24 Jul 2025 11:22:36 +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 1uetyo-007UxP-QY for pgsql-hackers@lists.postgresql.org; Thu, 24 Jul 2025 11:19:19 +0000 Received: from relay3-d.mail.gandi.net ([217.70.183.195]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1uetyk-000ai7-0q for pgsql-hackers@lists.postgresql.org; Thu, 24 Jul 2025 11:19:17 +0000 Received: by mail.gandi.net (Postfix) with ESMTPSA id C3BD01F68D; Thu, 24 Jul 2025 11:19:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vondra.me; s=gm1; t=1753355953; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=VMLrC+PXUFCxrzPEOGA/NrWO5238duIoRIwHfndXL8c=; b=Mn8Rx1X/fAOI1x36bOxTCCVBhE8/+XYSmTEgv3bFcdO4JNamEyAX08MfuBi34uPerTHPkC HJ541PZcM3O7Taw+422AIbl0CPlftwKcJKWXJBLtf1aQxSKfYsjxMKKyIjmp15CLK8FRli 21/uO4Y+3q8DLUPv1Y2KoICWKl10nHJiAh5AfQbn4jHCxbbFAvWEbS2kKVPJ6NGcxHayyZ 0eQej1t2XSj8k4vgabVmi1lQngOyHrshe79235geU6rheOwXF1gRkGPo9pLVbIhyBQCRmm ogy2tM7HG4y/PRQo3p5S8ebKUWQtMYxLae3uUjEZLF3OdRLyjVJRsDFkNYoa8w== Content-Type: multipart/mixed; boundary="------------DQM6WaH47kP73smoiWlX7208" Message-ID: <38b865bd-2ae9-4a94-a788-6e3dc99ccd70@vondra.me> Date: Thu, 24 Jul 2025 13:19:07 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: index prefetching From: Tomas Vondra To: Peter Geoghegan Cc: Nazir Bilal Yavuz , Thomas Munro , Andres Freund , Robert Haas , Melanie Plageman , PostgreSQL Hackers , Georgios , Konstantin Knizhnik , Dilip Kumar References: <64c8b824-6203-46a3-b045-5e95b796feee@vondra.me> <03dcc1a9-c5d0-4965-889c-684dc0a7580c@vondra.me> <23f490f4-8325-408c-91a0-a6757ab2441c@vondra.me> <1bebfd1b-aea5-4d41-80a6-eae64b8f9eaf@vondra.me> <8ed1d326-5c6e-476e-b3fd-30d3da210546@vondra.me> Content-Language: en-US In-Reply-To: <8ed1d326-5c6e-476e-b3fd-30d3da210546@vondra.me> X-GND-State: clean X-GND-Score: -100 X-GND-Cause: gggruggvucftvghtrhhoucdtuddrgeeffedrtdefgdektdehudcutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfitefpfffkpdcuggftfghnshhusghstghrihgsvgenuceurghilhhouhhtmecufedtudenucesvcftvggtihhpihgvnhhtshculddquddttddmnecujfgurheptgfkffggfgfuhffvvehfjgesmhdtreertddvjeenucfhrhhomhepvfhomhgrshcugghonhgurhgruceothhomhgrshesvhhonhgurhgrrdhmvgeqnecuggftrfgrthhtvghrnhepteehgedugeeigedviedtgeekteeitdehleevffeggffguedvudeuffeluedvveeunecukfhppeekiedrgeelrddvfedtrddvtdeinecuvehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehinhgvthepkeeirdegledrvdeftddrvddtiedphhgvlhhopegluddtrddufeejrddtrddvngdpmhgrihhlfhhrohhmpehtohhmrghssehvohhnughrrgdrmhgvpdhnsggprhgtphhtthhopedutddprhgtphhtthhopehpghessghofihtrdhivgdprhgtphhtthhopegshigrvhhuiiekudesghhmrghilhdrtghomhdprhgtphhtthhopehthhhomhgrshdrmhhunhhrohesghhmrghilhdrtghomhdprhgtphhtthhopegrnhgurhgvshesrghnrghrrgiivghlrdguvgdprhgtphhtthhopehrohgsvghrthhmhhgrrghssehgmhgrihhlrdgtohhmpdhrtghpthhtohepmhgvlhgrnhhivghplhgrghgvmhgrnhesghhmrghilhdrtghomhdprhgtphhtthhop ehpghhsqhhlqdhhrggtkhgvrhhssehlihhsthhsrdhpohhsthhgrhgvshhqlhdrohhrghdprhgtphhtthhopehgkhhokhholhgrthhoshesphhrohhtohhnmhgrihhlrdgtohhm X-GND-Sasl: tomas@vondra.me List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------DQM6WaH47kP73smoiWlX7208 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 7/23/25 02:37, Tomas Vondra wrote: > ... > >>> Thanks. I wonder how difficult would it be to add something like this to >>> pgstattuple. I mean, it shouldn't be difficult to look at leaf pages and >>> count distinct blocks, right? Seems quite useful. >> >> I agree that that would be quite useful. >> > > Good first patch for someone ;-) > I got a bit bored yesterday, so I gave this a try and whipped up a patch that adds two pgstattuple functins that I think could be useful for analyzing index metrics that matter for prefetching. The patch adds two functions, that are meant to provide data for additional analysis rather than computing something final. Each function splits the index into a sequence of block ranges (of given length), and calculates some metrics on that. pgstatindex_nheap - number of leafs in the range - number of block numbers - number of distinct block numbers - number of runs (of the same block) pgstatindex_runs - number of leafs in the range - run length - number of runs with the length It's trivial to summarize this into a per-index statistic (of course, there may be some inaccuracies when the run spans multiple ranges), but it also seems useful to be able to look at parts of the index. This is meant as a quick experimental patch, to help with generating better datasets for the evaluation. And I think it works for that, and I don't have immediate plans to work on this outside that context. There are a couple things we'd need to address before actually merging this, I think. Two that I can think of right now: First, the "range length" determines memory usage. Right now it's a bit naive, and just extracts all blocks (for the range) into an array. That might be an issue for larger ranges, I'm sure there are strategies to mitigate that - doing some of the processing when reading block numbers, using hyperloglog to estimate distincts, etc. Second, the index is walked sequentially in physical order, from block 0 to the last block. But that's not really what the index prefetch sees. To make it "more accurate" it'd be better to just scan the leaf pages as if during a "full index scan". Also, I haven't updated the docs. That'd also need to be done. regards -- Tomas Vondra --------------DQM6WaH47kP73smoiWlX7208 Content-Type: text/x-patch; charset=UTF-8; name="v1-0001-pgstattuple-analyze-TIDs-on-btree-leaf-pages.patch" Content-Disposition: attachment; filename*0="v1-0001-pgstattuple-analyze-TIDs-on-btree-leaf-pages.patch" Content-Transfer-Encoding: base64 RnJvbSBkZDM2ZjIxOTQ5ODZlNTM2NmUxZjA4MDBlZmY2YjhhNjE2MTFkZDBmIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBUb21hcyBWb25kcmEgPHRvbWFzQHZvbmRyYS5tZT4K RGF0ZTogVGh1LCAyNCBKdWwgMjAyNSAxMzowMDoyNCArMDIwMApTdWJqZWN0OiBbUEFUQ0gg djFdIHBnc3RhdHR1cGxlOiBhbmFseXplIFRJRHMgb24gYnRyZWUgbGVhZiBwYWdlcwoKLS0t CiBjb250cmliL3Bnc3RhdHR1cGxlL01ha2VmaWxlICAgICAgICAgICAgICAgICAgfCAgIDMg Ky0KIGNvbnRyaWIvcGdzdGF0dHVwbGUvcGdzdGF0aW5kZXguYyAgICAgICAgICAgICB8IDQ0 NyArKysrKysrKysrKysrKysrKysKIGNvbnRyaWIvcGdzdGF0dHVwbGUvcGdzdGF0dHVwbGUt LTEuNS0tMS42LnNxbCB8ICAzMCArKwogY29udHJpYi9wZ3N0YXR0dXBsZS9wZ3N0YXR0dXBs ZS5jb250cm9sICAgICAgIHwgICAyICstCiA0IGZpbGVzIGNoYW5nZWQsIDQ4MCBpbnNlcnRp b25zKCspLCAyIGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGNvbnRyaWIvcGdz dGF0dHVwbGUvcGdzdGF0dHVwbGUtLTEuNS0tMS42LnNxbAoKZGlmZiAtLWdpdCBhL2NvbnRy aWIvcGdzdGF0dHVwbGUvTWFrZWZpbGUgYi9jb250cmliL3Bnc3RhdHR1cGxlL01ha2VmaWxl CmluZGV4IGM1YjE3ZmM3MDNlLi5kNWM2MmJhMzZmOSAxMDA2NDQKLS0tIGEvY29udHJpYi9w Z3N0YXR0dXBsZS9NYWtlZmlsZQorKysgYi9jb250cmliL3Bnc3RhdHR1cGxlL01ha2VmaWxl CkBAIC0xMCw3ICsxMCw4IEBAIE9CSlMgPSBcCiBFWFRFTlNJT04gPSBwZ3N0YXR0dXBsZQog REFUQSA9IHBnc3RhdHR1cGxlLS0xLjQuc3FsIHBnc3RhdHR1cGxlLS0xLjQtLTEuNS5zcWwg XAogCXBnc3RhdHR1cGxlLS0xLjMtLTEuNC5zcWwgcGdzdGF0dHVwbGUtLTEuMi0tMS4zLnNx bCBcCi0JcGdzdGF0dHVwbGUtLTEuMS0tMS4yLnNxbCBwZ3N0YXR0dXBsZS0tMS4wLS0xLjEu c3FsCisJcGdzdGF0dHVwbGUtLTEuMS0tMS4yLnNxbCBwZ3N0YXR0dXBsZS0tMS4wLS0xLjEu c3FsIFwKKwlwZ3N0YXR0dXBsZS0tMS41LS0xLjYuc3FsCiBQR0ZJTEVERVNDID0gInBnc3Rh dHR1cGxlIC0gdHVwbGUtbGV2ZWwgc3RhdGlzdGljcyIKIAogUkVHUkVTUyA9IHBnc3RhdHR1 cGxlCmRpZmYgLS1naXQgYS9jb250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdGluZGV4LmMgYi9j b250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdGluZGV4LmMKaW5kZXggNGI5ZDc2ZWM0ZTQuLmFh NDQzMTA3NWIwIDEwMDY0NAotLS0gYS9jb250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdGluZGV4 LmMKKysrIGIvY29udHJpYi9wZ3N0YXR0dXBsZS9wZ3N0YXRpbmRleC5jCkBAIC02Miw2ICs2 Miw5IEBAIFBHX0ZVTkNUSU9OX0lORk9fVjEocGdfcmVscGFnZXNfdjFfNSk7CiBQR19GVU5D VElPTl9JTkZPX1YxKHBnX3JlbHBhZ2VzYnlpZF92MV81KTsKIFBHX0ZVTkNUSU9OX0lORk9f VjEocGdzdGF0Z2luaW5kZXhfdjFfNSk7CiAKK1BHX0ZVTkNUSU9OX0lORk9fVjEocGdzdGF0 aW5kZXhfbmhlYXBfdjFfNik7CitQR19GVU5DVElPTl9JTkZPX1YxKHBnc3RhdGluZGV4X3J1 bnNfdjFfNik7CisKIERhdHVtCQlwZ3N0YXRnaW5pbmRleF9pbnRlcm5hbChPaWQgcmVsaWQs IEZ1bmN0aW9uQ2FsbEluZm8gZmNpbmZvKTsKIAogI2RlZmluZSBJU19JTkRFWChyKSAoKHIp LT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVMS0lORF9JTkRFWCkKQEAgLTEyOCw2ICsxMzEsOSBA QCBzdGF0aWMgRGF0dW0gcGdzdGF0aW5kZXhfaW1wbChSZWxhdGlvbiByZWwsIEZ1bmN0aW9u Q2FsbEluZm8gZmNpbmZvKTsKIHN0YXRpYyBpbnQ2NCBwZ19yZWxwYWdlc19pbXBsKFJlbGF0 aW9uIHJlbCk7CiBzdGF0aWMgdm9pZCBHZXRIYXNoUGFnZVN0YXRzKFBhZ2UgcGFnZSwgSGFz aEluZGV4U3RhdCAqc3RhdHMpOwogCitzdGF0aWMgRGF0dW0gcGdzdGF0aW5kZXhfbmhlYXBf aW1wbChSZWxhdGlvbiByZWwsIGludDY0IG5ibG9ja3MsIEZ1bmN0aW9uQ2FsbEluZm8gZmNp bmZvKTsKK3N0YXRpYyBEYXR1bSBwZ3N0YXRpbmRleF9ydW5zX2ltcGwoUmVsYXRpb24gcmVs LCBpbnQ2NCBuYmxvY2tzLCBGdW5jdGlvbkNhbGxJbmZvIGZjaW5mbyk7CisKIC8qIC0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICog cGdzdGF0aW5kZXgoKQogICoKQEAgLTc1NiwzICs3NjIsNDQ0IEBAIEdldEhhc2hQYWdlU3Rh dHMoUGFnZSBwYWdlLCBIYXNoSW5kZXhTdGF0ICpzdGF0cykKIAl9CiAJc3RhdHMtPmZyZWVf c3BhY2UgKz0gUGFnZUdldEV4YWN0RnJlZVNwYWNlKHBhZ2UpOwogfQorCisvKgorICovCitE YXR1bQorcGdzdGF0aW5kZXhfbmhlYXBfdjFfNihQR19GVU5DVElPTl9BUkdTKQoreworCXRl eHQJICAgKnJlbG5hbWUgPSBQR19HRVRBUkdfVEVYVF9QUCgwKTsKKwlpbnQ2NAkJbmJsb2Nr cyA9IFBHX0dFVEFSR19JTlQ2NCgxKTsKKwlSZWxhdGlvbglyZWw7CisJUmFuZ2VWYXIgICAq cmVscnY7CisKKwlyZWxydiA9IG1ha2VSYW5nZVZhckZyb21OYW1lTGlzdCh0ZXh0VG9RdWFs aWZpZWROYW1lTGlzdChyZWxuYW1lKSk7CisJcmVsID0gcmVsYXRpb25fb3BlbnJ2KHJlbHJ2 LCBBY2Nlc3NTaGFyZUxvY2spOworCisJUEdfUkVUVVJOX0RBVFVNKHBnc3RhdGluZGV4X25o ZWFwX2ltcGwocmVsLCBuYmxvY2tzLCBmY2luZm8pKTsKK30KKworLyoKKyAqLworRGF0dW0K K3Bnc3RhdGluZGV4X3J1bnNfdjFfNihQR19GVU5DVElPTl9BUkdTKQoreworCXRleHQJICAg KnJlbG5hbWUgPSBQR19HRVRBUkdfVEVYVF9QUCgwKTsKKwlpbnQ2NAkJbmJsb2NrcyA9IFBH X0dFVEFSR19JTlQ2NCgxKTsKKwlSZWxhdGlvbglyZWw7CisJUmFuZ2VWYXIgICAqcmVscnY7 CisKKwlyZWxydiA9IG1ha2VSYW5nZVZhckZyb21OYW1lTGlzdCh0ZXh0VG9RdWFsaWZpZWRO YW1lTGlzdChyZWxuYW1lKSk7CisJcmVsID0gcmVsYXRpb25fb3BlbnJ2KHJlbHJ2LCBBY2Nl c3NTaGFyZUxvY2spOworCisJUEdfUkVUVVJOX0RBVFVNKHBnc3RhdGluZGV4X3J1bnNfaW1w bChyZWwsIG5ibG9ja3MsIGZjaW5mbykpOworfQorCitzdGF0aWMgaW50Citjb3VudF9ibG9j a19ydW5zKGludCByYW5nZV9uYmxvY2tzLCBCbG9ja051bWJlciAqcmFuZ2VfYmxvY2tzKQor eworCWludAkJCW5ydW5zID0gMTsKKworCWZvciAoaW50IGkgPSAxOyBpIDwgcmFuZ2VfbmJs b2NrczsgaSsrKQorCXsKKwkJaWYgKHJhbmdlX2Jsb2Nrc1tpXSAhPSByYW5nZV9ibG9ja3Nb aS0xXSkKKwkJCW5ydW5zKys7CisJfQorCisJcmV0dXJuIG5ydW5zOworfQorCitzdGF0aWMg aW50CitibG9ja251bV9jbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwly ZXR1cm4gbWVtY21wKGEsIGIsIHNpemVvZihCbG9ja051bWJlcikpOworfQorCitzdGF0aWMg aW50Citjb3VudF9ibG9ja3NfZGlzdGluY3QoaW50IHJhbmdlX25ibG9ja3MsIEJsb2NrTnVt YmVyICpyYW5nZV9ibG9ja3MpCit7CisJcGdfcXNvcnQocmFuZ2VfYmxvY2tzLCByYW5nZV9u YmxvY2tzLCBzaXplb2YoQmxvY2tOdW1iZXIpLCBibG9ja251bV9jbXApOworCisJcmV0dXJu IGNvdW50X2Jsb2NrX3J1bnMocmFuZ2VfbmJsb2NrcywgcmFuZ2VfYmxvY2tzKTsKK30KKwor c3RhdGljIERhdHVtCitwZ3N0YXRpbmRleF9uaGVhcF9pbXBsKFJlbGF0aW9uIHJlbCwgaW50 NjQgcmFuZ2VfbGVuLCBGdW5jdGlvbkNhbGxJbmZvIGZjaW5mbykKK3sKKwlSZXR1cm5TZXRJ bmZvICpyc2luZm8gPSAoUmV0dXJuU2V0SW5mbyAqKSBmY2luZm8tPnJlc3VsdGluZm87CisJ QmxvY2tOdW1iZXIgbmJsb2NrczsKKwlCbG9ja051bWJlciBibGtubzsKKwlCdWZmZXJBY2Nl c3NTdHJhdGVneSBic3RyYXRlZ3kgPSBHZXRBY2Nlc3NTdHJhdGVneShCQVNfQlVMS1JFQUQp OworCisJQmxvY2tOdW1iZXIgcmFuZ2Vfc3RhcnQgPSAwOworCUJsb2NrTnVtYmVyCSpyYW5n ZV9ibG9ja3MgPSBOVUxMOworCWludAkJCXJhbmdlX25ibG9ja3M7CisJaW50CQkJcmFuZ2Vf bGVhZnM7CisJVHVwbGVEZXNjCXR1cGRlc2M7CisJVHVwbGVzdG9yZXN0YXRlICp0dXBzdG9y ZTsKKworCURhdHVtCQl2YWx1ZXNbNV07CisJYm9vbAkJbnVsbHNbNV07CisKKwkvKiBubyBO VUxMcyAqLworCW1lbXNldChudWxscywgMCwgc2l6ZW9mKG51bGxzKSk7CisKKwlpZiAoIUlT X0lOREVYKHJlbCkgfHwgIUlTX0JUUkVFKHJlbCkpCisJCWVyZXBvcnQoRVJST1IsCisJCQkJ KGVycmNvZGUoRVJSQ09ERV9XUk9OR19PQkpFQ1RfVFlQRSksCisJCQkJIGVycm1zZygicmVs YXRpb24gXCIlc1wiIGlzIG5vdCBhIGJ0cmVlIGluZGV4IiwKKwkJCQkJCVJlbGF0aW9uR2V0 UmVsYXRpb25OYW1lKHJlbCkpKSk7CisKKwkvKgorCSAqIFJlamVjdCBhdHRlbXB0cyB0byBy ZWFkIG5vbi1sb2NhbCB0ZW1wb3JhcnkgcmVsYXRpb25zOyB3ZSB3b3VsZCBiZQorCSAqIGxp a2VseSB0byBnZXQgd3JvbmcgZGF0YSBzaW5jZSB3ZSBoYXZlIG5vIHZpc2liaWxpdHkgaW50 byB0aGUgb3duaW5nCisJICogc2Vzc2lvbidzIGxvY2FsIGJ1ZmZlcnMuCisJICovCisJaWYg KFJFTEFUSU9OX0lTX09USEVSX1RFTVAocmVsKSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQko ZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCisJCQkJIGVycm1zZygi Y2Fubm90IGFjY2VzcyB0ZW1wb3JhcnkgdGFibGVzIG9mIG90aGVyIHNlc3Npb25zIikpKTsK KworCS8qCisJICogQSAhaW5kaXNyZWFkeSBpbmRleCBjb3VsZCBsZWFkIHRvIEVSUkNPREVf REFUQV9DT1JSVVBURUQgbGF0ZXIsIHNvIGV4aXQKKwkgKiBlYXJseS4gIFdlJ3JlIGNhcGFi bGUgb2YgYXNzZXNzaW5nIGFuIGluZGlzcmVhZHkmJiFpbmRpc3ZhbGlkIGluZGV4LAorCSAq IGJ1dCB0aGUgcmVzdWx0cyBjb3VsZCBiZSBjb25mdXNpbmcuICBGb3IgZXhhbXBsZSwgdGhl IGluZGV4J3Mgc2l6ZQorCSAqIGNvdWxkIGJlIHRvbyBsb3cgZm9yIGEgdmFsaWQgaW5kZXgg b2YgdGhlIHRhYmxlLgorCSAqLworCWlmICghcmVsLT5yZF9pbmRleC0+aW5kaXN2YWxpZCkK KwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX09CSkVDVF9OT1RfSU5f UFJFUkVRVUlTSVRFX1NUQVRFKSwKKwkJCQkgZXJybXNnKCJpbmRleCBcIiVzXCIgaXMgbm90 IHZhbGlkIiwKKwkJCQkJCVJlbGF0aW9uR2V0UmVsYXRpb25OYW1lKHJlbCkpKSk7CisKKwlJ bml0TWF0ZXJpYWxpemVkU1JGKGZjaW5mbywgMCk7CisJdHVwZGVzYyA9IHJzaW5mby0+c2V0 RGVzYzsKKwl0dXBzdG9yZSA9IHJzaW5mby0+c2V0UmVzdWx0OworCisJLyogcHJlLWFsbG9j YXRlIHNwYWNlIGZvciB0aGUgbWF4aW11bSBudW1iZXIgb2YgVElEcyB3ZSBtaWdodCBzZWUK KwkgKiBvbiByYW5nZV9sZW4gcGFnZXMgKi8KKwlyYW5nZV9uYmxvY2tzID0gMDsKKwlyYW5n ZV9ibG9ja3MgPSBwYWxsb2NfYXJyYXkoQmxvY2tOdW1iZXIsIHJhbmdlX2xlbiAqIE1heFRJ RHNQZXJCVHJlZVBhZ2UpOworCisJLyoKKwkgKiBTY2FuIGFsbCBibG9ja3MgZXhjZXB0IHRo ZSBtZXRhcGFnZQorCSAqLworCW5ibG9ja3MgPSBSZWxhdGlvbkdldE51bWJlck9mQmxvY2tz KHJlbCk7CisKKwlmb3IgKGJsa25vID0gMTsgYmxrbm8gPCBuYmxvY2tzOyBibGtubysrKQor CXsKKwkJQnVmZmVyCQlidWZmZXI7CisJCVBhZ2UJCXBhZ2U7CisJCUJUUGFnZU9wYXF1ZSBv cGFxdWU7CisKKwkJQ0hFQ0tfRk9SX0lOVEVSUlVQVFMoKTsKKworCQkvKgorCQkgKiBJZiB3 ZSBzdGFydGVkIGEgbmV3IHJhbmdlLCBjb3VudCB0aGUgZGlzdGluY3QgYmxvY2tzIGFuZCBh ZGQKKwkJICogYSB0dXBsZSBpbnRvIHRoZSByZXN1bHQgc2V0IChpZiB0aGVyZSBhcmUgYW55 IFRJRHMpLgorCQkgKi8KKwkJaWYgKHJhbmdlX3N0YXJ0ICsgcmFuZ2VfbGVuIDw9IGJsa25v KQorCQl7CisJCQlpZiAocmFuZ2VfbmJsb2NrcyA+IDApCisJCQl7CisJCQkJSGVhcFR1cGxl CXR1cGxlOworCQkJCWludAkJCW5kaXN0aW5jdDsKKwkJCQlpbnQJCQlucnVuczsKKworCQkJ CW5ydW5zID0gY291bnRfYmxvY2tfcnVucyhyYW5nZV9uYmxvY2tzLCByYW5nZV9ibG9ja3Mp OworCisJCQkJLyogdGhpcyBtb2RpZmllcyB0aGUgYXJyYXksIHNvIGRvIG9uY2UgKi8KKwkJ CQluZGlzdGluY3QgPSBjb3VudF9ibG9ja3NfZGlzdGluY3QocmFuZ2VfbmJsb2NrcywgcmFu Z2VfYmxvY2tzKTsKKworCQkJCXZhbHVlc1swXSA9IEludDY0R2V0RGF0dW0ocmFuZ2Vfc3Rh cnQpOworCQkJCXZhbHVlc1sxXSA9IEludDY0R2V0RGF0dW0ocmFuZ2VfbGVhZnMpOworCQkJ CXZhbHVlc1syXSA9IEludDY0R2V0RGF0dW0ocmFuZ2VfbmJsb2Nrcyk7CisJCQkJdmFsdWVz WzNdID0gSW50NjRHZXREYXR1bShuZGlzdGluY3QpOworCQkJCXZhbHVlc1s0XSA9IEludDY0 R2V0RGF0dW0obnJ1bnMpOworCisJCQkJLyogQnVpbGQgYW5kIHJldHVybiB0aGUgcmVzdWx0 IHR1cGxlICovCisJCQkJdHVwbGUgPSBoZWFwX2Zvcm1fdHVwbGUodHVwZGVzYywgdmFsdWVz LCBudWxscyk7CisKKwkJCQl0dXBsZXN0b3JlX3B1dHR1cGxlKHR1cHN0b3JlLCB0dXBsZSk7 CisKKwkJCQlyYW5nZV9uYmxvY2tzID0gMDsKKwkJCQlyYW5nZV9sZWFmcyA9IDA7CisJCQl9 CisKKwkJCXdoaWxlIChyYW5nZV9zdGFydCArIHJhbmdlX2xlbiA8PSBibGtubykKKwkJCQly YW5nZV9zdGFydCArPSByYW5nZV9sZW47CisJCX0KKworCQkvKiBSZWFkIGFuZCBsb2NrIGJ1 ZmZlciAqLworCQlidWZmZXIgPSBSZWFkQnVmZmVyRXh0ZW5kZWQocmVsLCBNQUlOX0ZPUktO VU0sIGJsa25vLCBSQk1fTk9STUFMLCBic3RyYXRlZ3kpOworCQlMb2NrQnVmZmVyKGJ1ZmZl ciwgQlVGRkVSX0xPQ0tfU0hBUkUpOworCisJCXBhZ2UgPSBCdWZmZXJHZXRQYWdlKGJ1ZmZl cik7CisJCW9wYXF1ZSA9IEJUUGFnZUdldE9wYXF1ZShwYWdlKTsKKworCQkvKgorCQkgKiBJ Z25vcmUgZGVsZXRlZC9kZWFkIHBhZ2VzLCBhbmQgaW50ZXJuYWwgKG5vbi1sZWFmKSBwYWdl cy4KKwkJICovCisJCWlmICghUF9JU0RFTEVURUQob3BhcXVlKSAmJiAhUF9JR05PUkUob3Bh cXVlKSAmJiBQX0lTTEVBRihvcGFxdWUpKQorCQl7CisJCQlPZmZzZXROdW1iZXIJb2Zmc2V0 ID0gRmlyc3RPZmZzZXROdW1iZXI7CisJCQlPZmZzZXROdW1iZXIJbWF4b2Zmc2V0ID0gUGFn ZUdldE1heE9mZnNldE51bWJlcihwYWdlKTsKKwkJCWJvb2wJCQlyaWdodG1vc3QgPSBQX1JJ R0hUTU9TVChvcGFxdWUpOworCisJCQl3aGlsZSAob2Zmc2V0IDwgbWF4b2Zmc2V0KQorCQkJ eworCQkJCUl0ZW1JZAkJaWQgPSBQYWdlR2V0SXRlbUlkKHBhZ2UsIG9mZnNldCk7CisJCQkJ SW5kZXhUdXBsZQlpdHVwID0gKEluZGV4VHVwbGUpIFBhZ2VHZXRJdGVtKHBhZ2UsIGlkKTsK KwkJCQlCbG9ja051bWJlcglibG9jayA9IEl0ZW1Qb2ludGVyR2V0QmxvY2tOdW1iZXIoJml0 dXAtPnRfdGlkKTsKKwkJCQlib29sCQlpc3Bpdm90ID0gKCFyaWdodG1vc3QgJiYgb2Zmc2V0 ID09IFBfSElLRVkpOworCisJCQkJQXNzZXJ0KHJhbmdlX25ibG9ja3MgPj0gMCk7CisJCQkJ QXNzZXJ0KHJhbmdlX25ibG9ja3MgPCByYW5nZV9sZW4gKiBNYXhUSURzUGVyQlRyZWVQYWdl KTsKKworCQkJCS8qIGlnbm9yZSBwaXZvdCB0dXBsZXMgKi8KKwkJCQlpZiAoIWlzcGl2b3Qp CisJCQkJCXJhbmdlX2Jsb2Nrc1tyYW5nZV9uYmxvY2tzKytdID0gYmxvY2s7CisKKwkJCQlv ZmZzZXQrKzsKKwkJCX0KKworCQkJcmFuZ2VfbGVhZnMrKzsKKwkJfQorCisJCS8qIFVubG9j ayBhbmQgcmVsZWFzZSBidWZmZXIgKi8KKwkJTG9ja0J1ZmZlcihidWZmZXIsIEJVRkZFUl9M T0NLX1VOTE9DSyk7CisJCVJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKKwl9CisKKwkvKiBvdXRw dXQgdGhlIGxhc3QgcmFuZ2UgKi8KKwlpZiAocmFuZ2VfbmJsb2NrcyA+IDApCisJeworCQlI ZWFwVHVwbGUJdHVwbGU7CisJCWludAkJCW5kaXN0aW5jdDsKKwkJaW50CQkJbnJ1bnM7CisJ CisJCW5ydW5zID0gY291bnRfYmxvY2tfcnVucyhyYW5nZV9uYmxvY2tzLCByYW5nZV9ibG9j a3MpOworCQorCQkvKiB0aGlzIG1vZGlmaWVzIHRoZSBhcnJheSwgc28gZG8gb25jZSAqLwor CQluZGlzdGluY3QgPSBjb3VudF9ibG9ja3NfZGlzdGluY3QocmFuZ2VfbmJsb2NrcywgcmFu Z2VfYmxvY2tzKTsKKwkKKwkJdmFsdWVzWzBdID0gSW50NjRHZXREYXR1bShyYW5nZV9zdGFy dCk7CisJCXZhbHVlc1sxXSA9IEludDY0R2V0RGF0dW0ocmFuZ2VfbGVhZnMpOworCQl2YWx1 ZXNbMl0gPSBJbnQ2NEdldERhdHVtKHJhbmdlX25ibG9ja3MpOworCQl2YWx1ZXNbM10gPSBJ bnQ2NEdldERhdHVtKG5kaXN0aW5jdCk7CisJCXZhbHVlc1s0XSA9IEludDY0R2V0RGF0dW0o bnJ1bnMpOworCQorCQkvKiBCdWlsZCBhbmQgcmV0dXJuIHRoZSByZXN1bHQgdHVwbGUgKi8K KwkJdHVwbGUgPSBoZWFwX2Zvcm1fdHVwbGUodHVwZGVzYywgdmFsdWVzLCBudWxscyk7CisJ CisJCXR1cGxlc3RvcmVfcHV0dHVwbGUodHVwc3RvcmUsIHR1cGxlKTsKKwkKKwkJcmFuZ2Vf bmJsb2NrcyA9IDA7CisJCXJhbmdlX2xlYWZzID0gMDsKKwl9CisKKwlyZWxhdGlvbl9jbG9z ZShyZWwsIEFjY2Vzc1NoYXJlTG9jayk7CisKKwlQR19SRVRVUk5fTlVMTCgpOworfQorCitz dGF0aWMgdm9pZAorY291bnRfcnVuX2xlbmd0aHMoaW50IHJhbmdlX25ibG9ja3MsIEJsb2Nr TnVtYmVyICpyYW5nZV9ibG9ja3MsIGludCAqbGVuZ3RocykKK3sKKwlpbnQJCQlsZW4gPSAx OworCUJsb2NrTnVtYmVyCWN1cnIgPSByYW5nZV9ibG9ja3NbMF07CisKKwlmb3IgKGludCBp ID0gMDsgaSA8IHJhbmdlX25ibG9ja3M7IGkrKykKKwl7CisJCWlmIChyYW5nZV9ibG9ja3Nb aV0gIT0gY3VycikKKwkJeworCQkJbGVuZ3Roc1tsZW5dKys7CisJCQlsZW4gPSAxOworCQkJ Y3VyciA9IHJhbmdlX2Jsb2Nrc1tpXTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJbGVuKys7 CisJfQorCisJbGVuZ3Roc1tsZW5dKys7Cit9CisKK3N0YXRpYyBEYXR1bQorcGdzdGF0aW5k ZXhfcnVuc19pbXBsKFJlbGF0aW9uIHJlbCwgaW50NjQgcmFuZ2VfbGVuLCBGdW5jdGlvbkNh bGxJbmZvIGZjaW5mbykKK3sKKwlSZXR1cm5TZXRJbmZvICpyc2luZm8gPSAoUmV0dXJuU2V0 SW5mbyAqKSBmY2luZm8tPnJlc3VsdGluZm87CisJQmxvY2tOdW1iZXIgbmJsb2NrczsKKwlC bG9ja051bWJlciBibGtubzsKKwlCdWZmZXJBY2Nlc3NTdHJhdGVneSBic3RyYXRlZ3kgPSBH ZXRBY2Nlc3NTdHJhdGVneShCQVNfQlVMS1JFQUQpOworCisJQmxvY2tOdW1iZXIgcmFuZ2Vf c3RhcnQgPSAwOworCUJsb2NrTnVtYmVyCSpyYW5nZV9ibG9ja3MgPSBOVUxMOworCWludAkJ CSpydW5fbGVuZ3RocyA9IE5VTEw7CisJaW50CQkJcmFuZ2VfbmJsb2NrczsKKwlUdXBsZURl c2MJdHVwZGVzYzsKKwlUdXBsZXN0b3Jlc3RhdGUgKnR1cHN0b3JlOworCisJRGF0dW0JCXZh bHVlc1szXTsKKwlib29sCQludWxsc1szXTsKKworCS8qIG5vIE5VTExzICovCisJbWVtc2V0 KG51bGxzLCAwLCBzaXplb2YobnVsbHMpKTsKKworCWlmICghSVNfSU5ERVgocmVsKSB8fCAh SVNfQlRSRUUocmVsKSkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RF X1dST05HX09CSkVDVF9UWVBFKSwKKwkJCQkgZXJybXNnKCJyZWxhdGlvbiBcIiVzXCIgaXMg bm90IGEgYnRyZWUgaW5kZXgiLAorCQkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVs KSkpKTsKKworCS8qCisJICogUmVqZWN0IGF0dGVtcHRzIHRvIHJlYWQgbm9uLWxvY2FsIHRl bXBvcmFyeSByZWxhdGlvbnM7IHdlIHdvdWxkIGJlCisJICogbGlrZWx5IHRvIGdldCB3cm9u ZyBkYXRhIHNpbmNlIHdlIGhhdmUgbm8gdmlzaWJpbGl0eSBpbnRvIHRoZSBvd25pbmcKKwkg KiBzZXNzaW9uJ3MgbG9jYWwgYnVmZmVycy4KKwkgKi8KKwlpZiAoUkVMQVRJT05fSVNfT1RI RVJfVEVNUChyZWwpKQorCQllcmVwb3J0KEVSUk9SLAorCQkJCShlcnJjb2RlKEVSUkNPREVf RkVBVFVSRV9OT1RfU1VQUE9SVEVEKSwKKwkJCQkgZXJybXNnKCJjYW5ub3QgYWNjZXNzIHRl bXBvcmFyeSB0YWJsZXMgb2Ygb3RoZXIgc2Vzc2lvbnMiKSkpOworCisJLyoKKwkgKiBBICFp bmRpc3JlYWR5IGluZGV4IGNvdWxkIGxlYWQgdG8gRVJSQ09ERV9EQVRBX0NPUlJVUFRFRCBs YXRlciwgc28gZXhpdAorCSAqIGVhcmx5LiAgV2UncmUgY2FwYWJsZSBvZiBhc3Nlc3Npbmcg YW4gaW5kaXNyZWFkeSYmIWluZGlzdmFsaWQgaW5kZXgsCisJICogYnV0IHRoZSByZXN1bHRz IGNvdWxkIGJlIGNvbmZ1c2luZy4gIEZvciBleGFtcGxlLCB0aGUgaW5kZXgncyBzaXplCisJ ICogY291bGQgYmUgdG9vIGxvdyBmb3IgYSB2YWxpZCBpbmRleCBvZiB0aGUgdGFibGUuCisJ ICovCisJaWYgKCFyZWwtPnJkX2luZGV4LT5pbmRpc3ZhbGlkKQorCQllcmVwb3J0KEVSUk9S LAorCQkJCShlcnJjb2RlKEVSUkNPREVfT0JKRUNUX05PVF9JTl9QUkVSRVFVSVNJVEVfU1RB VEUpLAorCQkJCSBlcnJtc2coImluZGV4IFwiJXNcIiBpcyBub3QgdmFsaWQiLAorCQkJCQkJ UmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSkpKTsKKworCUluaXRNYXRlcmlhbGl6ZWRT UkYoZmNpbmZvLCAwKTsKKwl0dXBkZXNjID0gcnNpbmZvLT5zZXREZXNjOworCXR1cHN0b3Jl ID0gcnNpbmZvLT5zZXRSZXN1bHQ7CisKKwkvKiBwcmUtYWxsb2NhdGUgc3BhY2UgZm9yIHRo ZSBtYXhpbXVtIG51bWJlciBvZiBUSURzIHdlIG1pZ2h0IHNlZQorCSAqIG9uIHJhbmdlX2xl biBwYWdlcyAqLworCXJhbmdlX25ibG9ja3MgPSAwOworCXJhbmdlX2Jsb2NrcyA9IHBhbGxv Y19hcnJheShCbG9ja051bWJlciwgcmFuZ2VfbGVuICogTWF4VElEc1BlckJUcmVlUGFnZSk7 CisKKwkvKiBsZW5ndGhzIG9mIHJ1bnMgKHRoZSByYW5nZSBjb3VsZCBiZSBvbmUgbG9uZyBy dW4pICovCisJcnVuX2xlbmd0aHMgPSBwYWxsb2NfYXJyYXkoaW50LCAocmFuZ2VfbGVuICog TWF4VElEc1BlckJUcmVlUGFnZSArIDEpKTsKKworCS8qCisJICogU2NhbiBhbGwgYmxvY2tz IGV4Y2VwdCB0aGUgbWV0YXBhZ2UKKwkgKi8KKwluYmxvY2tzID0gUmVsYXRpb25HZXROdW1i ZXJPZkJsb2NrcyhyZWwpOworCisJZm9yIChibGtubyA9IDE7IGJsa25vIDwgbmJsb2Nrczsg Ymxrbm8rKykKKwl7CisJCUJ1ZmZlcgkJYnVmZmVyOworCQlQYWdlCQlwYWdlOworCQlCVFBh Z2VPcGFxdWUgb3BhcXVlOworCisJCUNIRUNLX0ZPUl9JTlRFUlJVUFRTKCk7CisKKwkJLyoK KwkJICogSWYgd2Ugc3RhcnRlZCBhIG5ldyByYW5nZSwgY291bnQgdGhlIGRpc3RpbmN0IGJs b2NrcyBhbmQgYWRkCisJCSAqIGEgdHVwbGUgaW50byB0aGUgcmVzdWx0IHNldCAoaWYgdGhl cmUgYXJlIGFueSBUSURzKS4KKwkJICovCisJCWlmIChyYW5nZV9zdGFydCArIHJhbmdlX2xl biA8PSBibGtubykKKwkJeworCQkJaWYgKHJhbmdlX25ibG9ja3MgPiAwKQorCQkJeworCQkJ CUhlYXBUdXBsZQl0dXBsZTsKKworCQkJCW1lbXNldChydW5fbGVuZ3RocywgMCwgc2l6ZW9m KGludCkgKiAocmFuZ2VfbGVuICogTWF4VElEc1BlckJUcmVlUGFnZSArIDEpKTsKKwkJCQlj b3VudF9ydW5fbGVuZ3RocyhyYW5nZV9uYmxvY2tzLCByYW5nZV9ibG9ja3MsIHJ1bl9sZW5n dGhzKTsKKworCQkJCWZvciAoaW50IGkgPSAxOyBpIDw9IChyYW5nZV9sZW4gKiBNYXhUSURz UGVyQlRyZWVQYWdlKTsgaSsrKQorCQkJCXsKKwkJCQkJaWYgKHJ1bl9sZW5ndGhzW2ldID4g MCkKKwkJCQkJeworCQkJCQkJdmFsdWVzWzBdID0gSW50NjRHZXREYXR1bShyYW5nZV9zdGFy dCk7CisJCQkJCQl2YWx1ZXNbMV0gPSBJbnQzMkdldERhdHVtKGkpOworCQkJCQkJdmFsdWVz WzJdID0gSW50MzJHZXREYXR1bShydW5fbGVuZ3Roc1tpXSk7CisKKwkJCQkJCS8qIEJ1aWxk IGFuZCByZXR1cm4gdGhlIHJlc3VsdCB0dXBsZSAqLworCQkJCQkJdHVwbGUgPSBoZWFwX2Zv cm1fdHVwbGUodHVwZGVzYywgdmFsdWVzLCBudWxscyk7CisKKwkJCQkJCXR1cGxlc3RvcmVf cHV0dHVwbGUodHVwc3RvcmUsIHR1cGxlKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXJhbmdl X25ibG9ja3MgPSAwOworCQkJfQorCisJCQl3aGlsZSAocmFuZ2Vfc3RhcnQgKyByYW5nZV9s ZW4gPD0gYmxrbm8pCisJCQkJcmFuZ2Vfc3RhcnQgKz0gcmFuZ2VfbGVuOworCQl9CisKKwkJ LyogUmVhZCBhbmQgbG9jayBidWZmZXIgKi8KKwkJYnVmZmVyID0gUmVhZEJ1ZmZlckV4dGVu ZGVkKHJlbCwgTUFJTl9GT1JLTlVNLCBibGtubywgUkJNX05PUk1BTCwgYnN0cmF0ZWd5KTsK KwkJTG9ja0J1ZmZlcihidWZmZXIsIEJVRkZFUl9MT0NLX1NIQVJFKTsKKworCQlwYWdlID0g QnVmZmVyR2V0UGFnZShidWZmZXIpOworCQlvcGFxdWUgPSBCVFBhZ2VHZXRPcGFxdWUocGFn ZSk7CisKKwkJLyoKKwkJICogSWdub3JlIGRlbGV0ZWQvZGVhZCBwYWdlcywgYW5kIGludGVy bmFsIChub24tbGVhZikgcGFnZXMuCisJCSAqLworCQlpZiAoIVBfSVNERUxFVEVEKG9wYXF1 ZSkgJiYgIVBfSUdOT1JFKG9wYXF1ZSkgJiYgUF9JU0xFQUYob3BhcXVlKSkKKwkJeworCQkJ T2Zmc2V0TnVtYmVyCW9mZnNldCA9IEZpcnN0T2Zmc2V0TnVtYmVyOworCQkJT2Zmc2V0TnVt YmVyCW1heG9mZnNldCA9IFBhZ2VHZXRNYXhPZmZzZXROdW1iZXIocGFnZSk7CisJCQlib29s CQkJcmlnaHRtb3N0ID0gUF9SSUdIVE1PU1Qob3BhcXVlKTsKKworCQkJd2hpbGUgKG9mZnNl dCA8IG1heG9mZnNldCkKKwkJCXsKKwkJCQlJdGVtSWQJCWlkID0gUGFnZUdldEl0ZW1JZChw YWdlLCBvZmZzZXQpOworCQkJCUluZGV4VHVwbGUJaXR1cCA9IChJbmRleFR1cGxlKSBQYWdl R2V0SXRlbShwYWdlLCBpZCk7CisJCQkJQmxvY2tOdW1iZXIJYmxvY2sgPSBJdGVtUG9pbnRl ckdldEJsb2NrTnVtYmVyKCZpdHVwLT50X3RpZCk7CisJCQkJYm9vbAkJaXNwaXZvdCA9ICgh cmlnaHRtb3N0ICYmIG9mZnNldCA9PSBQX0hJS0VZKTsKKworCQkJCUFzc2VydChyYW5nZV9u YmxvY2tzID49IDApOworCQkJCUFzc2VydChyYW5nZV9uYmxvY2tzIDwgcmFuZ2VfbGVuICog TWF4VElEc1BlckJUcmVlUGFnZSk7CisKKwkJCQkvKiBpZ25vcmUgcGl2b3QgdHVwbGVzICov CisJCQkJaWYgKCFpc3Bpdm90KQorCQkJCQlyYW5nZV9ibG9ja3NbcmFuZ2VfbmJsb2Nrcysr XSA9IGJsb2NrOworCisJCQkJb2Zmc2V0Kys7CisJCQl9CisJCX0KKworCQkvKiBVbmxvY2sg YW5kIHJlbGVhc2UgYnVmZmVyICovCisJCUxvY2tCdWZmZXIoYnVmZmVyLCBCVUZGRVJfTE9D S19VTkxPQ0spOworCQlSZWxlYXNlQnVmZmVyKGJ1ZmZlcik7CisJfQorCisJLyogb3V0cHV0 IHRoZSBsYXN0IHJhbmdlICovCisJaWYgKHJhbmdlX25ibG9ja3MgPiAwKQorCXsKKwkJSGVh cFR1cGxlCXR1cGxlOworCisJCW1lbXNldChydW5fbGVuZ3RocywgMCwgc2l6ZW9mKGludCkg KiAocmFuZ2VfbGVuICogTWF4VElEc1BlckJUcmVlUGFnZSArIDEpKTsKKwkJY291bnRfcnVu X2xlbmd0aHMocmFuZ2VfbmJsb2NrcywgcmFuZ2VfYmxvY2tzLCBydW5fbGVuZ3Rocyk7CisK KwkJZm9yIChpbnQgaSA9IDE7IGkgPD0gKHJhbmdlX2xlbiAqIE1heFRJRHNQZXJCVHJlZVBh Z2UpOyBpKyspCisJCXsKKwkJCWlmIChydW5fbGVuZ3Roc1tpXSA+IDApCisJCQl7CisJCQkJ dmFsdWVzWzBdID0gSW50NjRHZXREYXR1bShyYW5nZV9zdGFydCk7CisJCQkJdmFsdWVzWzFd ID0gSW50MzJHZXREYXR1bShpKTsKKwkJCQl2YWx1ZXNbMl0gPSBJbnQzMkdldERhdHVtKHJ1 bl9sZW5ndGhzW2ldKTsKKworCQkJCS8qIEJ1aWxkIGFuZCByZXR1cm4gdGhlIHJlc3VsdCB0 dXBsZSAqLworCQkJCXR1cGxlID0gaGVhcF9mb3JtX3R1cGxlKHR1cGRlc2MsIHZhbHVlcywg bnVsbHMpOworCisJCQkJdHVwbGVzdG9yZV9wdXR0dXBsZSh0dXBzdG9yZSwgdHVwbGUpOwor CQkJfQorCQl9CisKKwkJcmFuZ2VfbmJsb2NrcyA9IDA7CisJfQorCisJcmVsYXRpb25fY2xv c2UocmVsLCBBY2Nlc3NTaGFyZUxvY2spOworCisJUEdfUkVUVVJOX05VTEwoKTsKK30KZGlm ZiAtLWdpdCBhL2NvbnRyaWIvcGdzdGF0dHVwbGUvcGdzdGF0dHVwbGUtLTEuNS0tMS42LnNx bCBiL2NvbnRyaWIvcGdzdGF0dHVwbGUvcGdzdGF0dHVwbGUtLTEuNS0tMS42LnNxbApuZXcg ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uYzZhNDUwYTMwMWIKLS0tIC9k ZXYvbnVsbAorKysgYi9jb250cmliL3Bnc3RhdHR1cGxlL3Bnc3RhdHR1cGxlLS0xLjUtLTEu Ni5zcWwKQEAgLTAsMCArMSwzMCBAQAorLyogY29udHJpYi9wZ3N0YXR0dXBsZS9wZ3N0YXR0 dXBsZS0tMS41LS0xLjYuc3FsICovCisKKy0tIGNvbXBsYWluIGlmIHNjcmlwdCBpcyBzb3Vy Y2VkIGluIHBzcWwsIHJhdGhlciB0aGFuIHZpYSBBTFRFUiBFWFRFTlNJT04KK1xlY2hvIFVz ZSAiQUxURVIgRVhURU5TSU9OIHBnc3RhdHR1cGxlIFVQREFURSBUTyAnMS42JyIgdG8gbG9h ZCB0aGlzIGZpbGUuIFxxdWl0CisKK0NSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIHBnc3Rh dGluZGV4X25oZWFwKElOIHJlbG5hbWUgdGV4dCwKKyAgICBJTiBibG9ja3MgQklHSU5ULAkJ CS0tIGxlbmd0aCBvZiByYW5nZXMgdG8gYW5hbHl6ZQorICAgIE9VVCBibG9jayBCSUdJTlQs CQkJLS0gZmlyc3QgYmxvY2sgb2YgYSByYW5nZQorICAgIE9VVCBudW1fbGVhZnMgQklHSU5U LAkJLS0gbnVtYmVyIG9mIGxlYWYgcGFnZXMKKyAgICBPVVQgbnVtX2l0ZW1zIEJJR0lOVCwJ CS0tIG51bWJlciBvZiBoZWFwIFRJRHMKKyAgICBPVVQgbnVtX2Jsb2NrcyBCSUdJTlQsCQkt LSBudW1iZXIgb2YgZGlzdGluY3QgYmxvY2tzCisgICAgT1VUIG51bV9ydW5zIEJJR0lOVCkJ CS0tIG51bWJlciBvZiBjb250aW51b3VzIHJ1bnMKK1JFVFVSTlMgU0VUT0YgcmVjb3JkCitB UyAnTU9EVUxFX1BBVEhOQU1FJywgJ3Bnc3RhdGluZGV4X25oZWFwX3YxXzYnCitMQU5HVUFH RSBDIFNUUklDVCBQQVJBTExFTCBTQUZFOworCitSRVZPS0UgRVhFQ1VURSBPTiBGVU5DVElP TiBwZ3N0YXRpbmRleF9uaGVhcCh0ZXh0LCBiaWdpbnQpIEZST00gUFVCTElDOworR1JBTlQg RVhFQ1VURSBPTiBGVU5DVElPTiBwZ3N0YXRpbmRleF9uaGVhcCh0ZXh0LCBiaWdpbnQpIFRP IHBnX3N0YXRfc2Nhbl90YWJsZXM7CisKK0NSRUFURSBPUiBSRVBMQUNFIEZVTkNUSU9OIHBn c3RhdGluZGV4X3J1bnMoSU4gcmVsbmFtZSB0ZXh0LAorICAgIElOIGJsb2NrcyBCSUdJTlQs CQkJLS0gbGVuZ3RoIG9mIHJhbmdlcyB0byBhbmFseXplCisgICAgT1VUIGJsb2NrIEJJR0lO VCwJCQktLSBmaXJzdCBibG9jayBvZiBhIHJhbmdlCisgICAgT1VUIHJ1bl9sZW5ndGggSU5U LAkJCS0tIG51bWJlciBvZiBsZWFmIHBhZ2VzCisgICAgT1VUIHJ1bl9jb3VudCBJTlQpCQkt LSBudW1iZXIgb2YgaGVhcCBUSURzCitSRVRVUk5TIFNFVE9GIHJlY29yZAorQVMgJ01PRFVM RV9QQVRITkFNRScsICdwZ3N0YXRpbmRleF9ydW5zX3YxXzYnCitMQU5HVUFHRSBDIFNUUklD VCBQQVJBTExFTCBTQUZFOworCitSRVZPS0UgRVhFQ1VURSBPTiBGVU5DVElPTiBwZ3N0YXRp bmRleF9ydW5zKHRleHQsIGJpZ2ludCkgRlJPTSBQVUJMSUM7CitHUkFOVCBFWEVDVVRFIE9O IEZVTkNUSU9OIHBnc3RhdGluZGV4X3J1bnModGV4dCwgYmlnaW50KSBUTyBwZ19zdGF0X3Nj YW5fdGFibGVzOwpkaWZmIC0tZ2l0IGEvY29udHJpYi9wZ3N0YXR0dXBsZS9wZ3N0YXR0dXBs ZS5jb250cm9sIGIvY29udHJpYi9wZ3N0YXR0dXBsZS9wZ3N0YXR0dXBsZS5jb250cm9sCmlu ZGV4IDZhZjQwNzU3YjI3Li44MGQwNjk1OGU5MCAxMDA2NDQKLS0tIGEvY29udHJpYi9wZ3N0 YXR0dXBsZS9wZ3N0YXR0dXBsZS5jb250cm9sCisrKyBiL2NvbnRyaWIvcGdzdGF0dHVwbGUv cGdzdGF0dHVwbGUuY29udHJvbApAQCAtMSw1ICsxLDUgQEAKICMgcGdzdGF0dHVwbGUgZXh0 ZW5zaW9uCiBjb21tZW50ID0gJ3Nob3cgdHVwbGUtbGV2ZWwgc3RhdGlzdGljcycKLWRlZmF1 bHRfdmVyc2lvbiA9ICcxLjUnCitkZWZhdWx0X3ZlcnNpb24gPSAnMS42JwogbW9kdWxlX3Bh dGhuYW1lID0gJyRsaWJkaXIvcGdzdGF0dHVwbGUnCiByZWxvY2F0YWJsZSA9IHRydWUKLS0g CjIuNTAuMQoK --------------DQM6WaH47kP73smoiWlX7208--