Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nXFvO-0006iB-Am for pgsql-hackers@arkaria.postgresql.org; Thu, 24 Mar 2022 05:22:21 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nXFvN-0000St-2v for pgsql-hackers@arkaria.postgresql.org; Thu, 24 Mar 2022 05:22:17 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nXFvM-0000Rz-Fa for pgsql-hackers@lists.postgresql.org; Thu, 24 Mar 2022 05:22:16 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nXFvH-0003sQ-Mk for pgsql-hackers@lists.postgresql.org; Thu, 24 Mar 2022 05:22:16 +0000 Received: from [192.168.129.212] (unknown [91.205.25.104]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) by mail.postgrespro.ru (Postfix) with ESMTPSA id 4046C21CB5A7; Thu, 24 Mar 2022 08:22:10 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mail; t=1648099330; bh=cUollCliWTS/p4tQsFSkVFpeQ7NAlN7twtrirjEb+Ss=; h=Date:Subject:To:Cc:References:From:In-Reply-To; b=LjPKJJjQekeoaPBqlKk4jYneuMOeb1tXFj6xjkNCo1vdU3mlQ0eaFcypaZekc4vFQ MIVmYzwcGSmASjm/DK4W7nlR2wJreYlaJz/UhjkV/Wtafh7s5PhBuinXj5MNSHI4uo utSnkHsIQ4sty1Za/WbgSJVgM2MitywpzKY1OSLU= Content-Type: multipart/mixed; boundary="------------YgnYS1yUkKKddgkSwfXo2mBC" Message-ID: Date: Thu, 24 Mar 2022 10:21:54 +0500 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 Subject: Re: Removing unneeded self joins Content-Language: en-US To: Andres Freund Cc: Greg Stark , Ronan Dunklau , Laurenz Albe , Hywel Carver , PostgreSQL Hackers , Konstantin Knizhnik References: <64486b0b-0404-e39e-322d-0801154901f3@postgrespro.ru> <2a6e540a-4c9f-9402-2e02-71e35fcd4dd1@postgrespro.ru> <4911774.fQZKmtWmdp@aivenronan> <13a0026b-46eb-cbfa-6dbb-4bc2ce210c27@postgrespro.ru> <20220322005839.hmb34acerhmcc3ky@alap3.anarazel.de> From: "Andrey V. Lepikhov" Organization: Postgres Professional In-Reply-To: <20220322005839.hmb34acerhmcc3ky@alap3.anarazel.de> 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. --------------YgnYS1yUkKKddgkSwfXo2mBC Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 3/22/22 05:58, Andres Freund wrote: > Hi, > > On 2022-03-04 15:47:47 +0500, Andrey Lepikhov wrote: >> Also, in new version of the patch I fixed one stupid bug: checking a >> self-join candidate expression operator - we can remove only expressions >> like F(arg1) = G(arg2). > > This CF entry currently fails tests: https://cirrus-ci.com/task/4632127944785920?logs=test_world#L1938 > > Looks like you're missing an adjustment of postgresql.conf.sample > > Marked as waiting-on-author. Thanks, I fixed it. -- regards, Andrey Lepikhov Postgres Professional --------------YgnYS1yUkKKddgkSwfXo2mBC Content-Type: text/x-patch; charset=UTF-8; name="v31-0001-Remove-self-joins.patch" Content-Disposition: attachment; filename="v31-0001-Remove-self-joins.patch" Content-Transfer-Encoding: base64 RnJvbSA2MjBkZWEzMWNlMTk5NjViZWVmZTU0NWYwOGRjYzVjOGIzMTljNDM0IE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmV5IFYuIExlcGlraG92IiA8YS5sZXBpa2hv dkBwb3N0Z3Jlc3Byby5ydT4KRGF0ZTogVGh1LCAxNSBKdWwgMjAyMSAxNToyNjoxMyArMDMw MApTdWJqZWN0OiBbUEFUQ0hdIFJlbW92ZSBzZWxmLWpvaW5zLgoKUmVtb3ZlIGlubmVyIGpv aW5zIG9mIGEgcmVsYXRpb24gdG8gaXRzZWxmIGlmIGNvdWxkIHByb3ZlIHRoYXQgdGhlIGpv aW4KY2FuIGJlIHJlcGxhY2VkIHdpdGggYSBzY2FuLiBXZSBjYW4gcHJvdmUgdGhlIHVuaXF1 ZW5lc3MKdXNpbmcgdGhlIGV4aXN0aW5nIGlubmVycmVsX2lzX3VuaXF1ZSBtYWNoaW5lcnku CgpXZSBjYW4gcmVtb3ZlIGEgc2VsZi1qb2luIHdoZW4gZm9yIGVhY2ggb3V0ZXIgcm93Ogox LiBBdCBtb3N0IG9uZSBpbm5lciByb3cgbWF0Y2hlcyB0aGUgam9pbiBjbGF1c2VzLgoyLiBJ ZiB0aGUgam9pbiB0YXJnZXQgbGlzdCBjb250YWlucyBhbnkgaW5uZXIgdmFycywgYW4gaW5u ZXIgcm93Cm11c3QgYmUgKHBoeXNpY2FsbHkpIHRoZSBzYW1lIHJvdyBhcyB0aGUgb3V0ZXIg b25lLgoKSW4gdGhpcyBwYXRjaCB3ZSB1c2UgUm93bGV5J3MgWzFdIGFwcHJvYWNoIHRvIGlk ZW50aWZ5IGEgc2VsZi1qb2luOgoxLiBDb2xsZWN0IGFsbCBtZXJnZWpvaW5hYmxlIGpvaW4g cXVhbHMgd2hpY2ggbG9vayBsaWtlIGEueCA9IGIueAoyLiBDaGVjayBpbm5lcnJlbF9pc191 bmlxdWUoKSBmb3IgdGhlIHF1YWwgbGlzdCBmcm9tICgxKS4gSWYgaXQKcmV0dXJucyB0cnVl LCB0aGVuIG91dGVyIHJvdyBtYXRjaGVzIG9ubHkgdGhlIHNhbWUgcm93IGZyb20gdGhlIGlu bmVyCnJlbGF0aW9uLiBTbyBwcm92ZWQsIHRoYXQgdGhpcyBqb2luIGlzIHNlbGYtam9pbiBh bmQgY2FuIGJlIHJlcGxhY2VkIGJ5CmEgc2Nhbi4KClNvbWUgcmVncmVzc2lvbiB0ZXN0cyBj aGFuZ2VkIGR1ZSB0byBzZWxmLWpvaW4gcmVtb3ZhbCBsb2dpYy4KClsxXSBodHRwczovL3d3 dy5wb3N0Z3Jlc3FsLm9yZy9tZXNzYWdlLWlkL3Jhdy9DQUFwSER2cGdnbkZNQzR5UC1qVU83 UEtOJTNEZlhlRXJXNWJPeGlzdkowSHZrSFFFWSUzRFd3JTQwbWFpbC5nbWFpbC5jb20KLS0t CiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9hbmFseXplam9pbnMuYyB8IDg4OCArKysr KysrKysrKysrKysrKysrKystCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9wbGFubWFp bi5jICAgICB8ICAgNSArCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9qb2luaW5mby5j ICAgICB8ICAgMyArCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9yZWxub2RlLmMgICAg ICB8ICAyNiArLQogc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWMuYyAgICAgICAgICAgICAg fCAgMTAgKwogc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhub2RlLmggICAgICAgICAgfCAg IDQgKwogc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BsYW5tYWluLmggICAgICAgICAgfCAgIDIg Kwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dCAgfCAgMzIgKwog c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dCAgICAgICAgfCA0MjYgKysrKysr KysrKysKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0ICAgIHwgICAz ICstCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNsYXNzLnNxbCAgICAgICB8ICAxNiAr CiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbCAgICAgICAgICAgICB8IDE5NyArKysr KwogMTIgZmlsZXMgY2hhbmdlZCwgMTU4MyBpbnNlcnRpb25zKCspLCAyOSBkZWxldGlvbnMo LSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9hbmFseXplam9p bnMuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVqb2lucy5jCmluZGV4 IDMzN2Y0NzBkNTguLmM1YWM4ZTJiZDQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGlt aXplci9wbGFuL2FuYWx5emVqb2lucy5jCisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9w bGFuL2FuYWx5emVqb2lucy5jCkBAIC0yMiw2ICsyMiw3IEBACiAgKi8KICNpbmNsdWRlICJw b3N0Z3Jlcy5oIgogCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19jbGFzcy5oIgogI2luY2x1ZGUg Im5vZGVzL25vZGVGdW5jcy5oIgogI2luY2x1ZGUgIm9wdGltaXplci9jbGF1c2VzLmgiCiAj aW5jbHVkZSAib3B0aW1pemVyL2pvaW5pbmZvLmgiCkBAIC0zMiwxMCArMzMsMTIgQEAKICNp bmNsdWRlICJvcHRpbWl6ZXIvdGxpc3QuaCIKICNpbmNsdWRlICJ1dGlscy9sc3lzY2FjaGUu aCIKIAorYm9vbCBlbmFibGVfc2VsZl9qb2luX3JlbW92YWw7CisKIC8qIGxvY2FsIGZ1bmN0 aW9ucyAqLwogc3RhdGljIGJvb2wgam9pbl9pc19yZW1vdmFibGUoUGxhbm5lckluZm8gKnJv b3QsIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKTsKIHN0YXRpYyB2b2lkIHJlbW92ZV9yZWxf ZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLAotCQkJCQkJCQkgIFJl bGlkcyBqb2lucmVsaWRzKTsKKwkJCQkJCQkJICBSZWxpZHMgam9pbnJlbGlkcywgaW50IHN1 YnN0X3JlbGlkKTsKIHN0YXRpYyBMaXN0ICpyZW1vdmVfcmVsX2Zyb21fam9pbmxpc3QoTGlz dCAqam9pbmxpc3QsIGludCByZWxpZCwgaW50ICpucmVtb3ZlZCk7CiBzdGF0aWMgYm9vbCBy ZWxfc3VwcG9ydHNfZGlzdGluY3RuZXNzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZv ICpyZWwpOwogc3RhdGljIGJvb2wgcmVsX2lzX2Rpc3RpbmN0X2ZvcihQbGFubmVySW5mbyAq cm9vdCwgUmVsT3B0SW5mbyAqcmVsLApAQCAtNDcsNiArNTAsOSBAQCBzdGF0aWMgYm9vbCBp c19pbm5lcnJlbF91bmlxdWVfZm9yKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkgICBS ZWxPcHRJbmZvICppbm5lcnJlbCwKIAkJCQkJCQkJICAgSm9pblR5cGUgam9pbnR5cGUsCiAJ CQkJCQkJCSAgIExpc3QgKnJlc3RyaWN0bGlzdCk7CitzdGF0aWMgdm9pZCBjaGFuZ2Vfcmlu Zm8oUmVzdHJpY3RJbmZvKiByaW5mbywgSW5kZXggZnJvbSwgSW5kZXggdG8pOworc3RhdGlj IEJpdG1hcHNldCogY2hhbmdlX3JlbGlkKFJlbGlkcyByZWxpZHMsIEluZGV4IG9sZElkLCBJ bmRleCBuZXdJZCk7CitzdGF0aWMgdm9pZCBjaGFuZ2VfdmFybm8oRXhwciAqZXhwciwgSW5k ZXggb2xkUmVsaWQsIEluZGV4IG5ld1JlbGlkKTsKIAogCiAvKgpAQCAtODYsNyArOTIsNyBA QCByZXN0YXJ0OgogCiAJCXJlbW92ZV9yZWxfZnJvbV9xdWVyeShyb290LCBpbm5lcnJlbGlk LAogCQkJCQkJCSAgYm1zX3VuaW9uKHNqaW5mby0+bWluX2xlZnRoYW5kLAotCQkJCQkJCQkJ CXNqaW5mby0+bWluX3JpZ2h0aGFuZCkpOworCQkJCQkJCQkJCXNqaW5mby0+bWluX3JpZ2h0 aGFuZCksIDApOwogCiAJCS8qIFdlIHZlcmlmeSB0aGF0IGV4YWN0bHkgb25lIHJlZmVyZW5j ZSBnZXRzIHJlbW92ZWQgZnJvbSBqb2lubGlzdCAqLwogCQlucmVtb3ZlZCA9IDA7CkBAIC0z MDAsNyArMzA2LDEwIEBAIGpvaW5faXNfcmVtb3ZhYmxlKFBsYW5uZXJJbmZvICpyb290LCBT cGVjaWFsSm9pbkluZm8gKnNqaW5mbykKIAogLyoKICAqIFJlbW92ZSB0aGUgdGFyZ2V0IHJl bGlkIGZyb20gdGhlIHBsYW5uZXIncyBkYXRhIHN0cnVjdHVyZXMsIGhhdmluZwotICogZGV0 ZXJtaW5lZCB0aGF0IHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jbHVkZSBpdCBpbiB0aGUgcXVl cnkuCisgKiBkZXRlcm1pbmVkIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNsdWRlIGl0 IGluIHRoZSBxdWVyeS4gT3IgcmVwbGFjZQorICogd2l0aCBhbm90aGVyIHJlbGlkLgorICog VG8gcmV1c2FiaWxpdHksIHRoaXMgcm91dGluZSBjYW4gd29yayBpbiB0d28gbW9kZXM6IGRl bGV0ZSByZWxpZCBmcm9tIGEgcGxhbgorICogb3IgcmVwbGFjZSBpdC4gSXQgaXMgdXNlZCBp biByZXBsYWNlIG1vZGUgaW4gYSBzZWxmLWpvaW4gcmVtb3ZpbmcgcHJvY2Vzcy4KICAqCiAg KiBXZSBhcmUgbm90IHRlcnJpYmx5IHRob3JvdWdoIGhlcmUuICBXZSBtdXN0IG1ha2Ugc3Vy ZSB0aGF0IHRoZSByZWwgaXMKICAqIG5vIGxvbmdlciB0cmVhdGVkIGFzIGEgYmFzZXJlbCwg YW5kIHRoYXQgYXR0cmlidXRlcyBvZiBvdGhlciBiYXNlcmVscwpAQCAtMzA5LDEzICszMTgs MTYgQEAgam9pbl9pc19yZW1vdmFibGUoUGxhbm5lckluZm8gKnJvb3QsIFNwZWNpYWxKb2lu SW5mbyAqc2ppbmZvKQogICogbGlzdHMsIGJ1dCBvbmx5IGlmIHRoZXkgYmVsb25nIHRvIHRo ZSBvdXRlciBqb2luIGlkZW50aWZpZWQgYnkgam9pbnJlbGlkcy4KICAqLwogc3RhdGljIHZv aWQKLXJlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlk LCBSZWxpZHMgam9pbnJlbGlkcykKK3JlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5m byAqcm9vdCwgaW50IHJlbGlkLCBSZWxpZHMgam9pbnJlbGlkcywKKwkJCQkJICBpbnQgc3Vi c3RfcmVsaWQpCiB7CiAJUmVsT3B0SW5mbyAqcmVsID0gZmluZF9iYXNlX3JlbChyb290LCBy ZWxpZCk7CiAJTGlzdAkgICAqam9pbmluZm9zOwogCUluZGV4CQlydGk7CiAJTGlzdENlbGwg ICAqbDsKIAorCUFzc2VydChzdWJzdF9yZWxpZCA9PSAwIHx8IHJlbGlkICE9IHN1YnN0X3Jl bGlkKTsKKwogCS8qCiAJICogTWFyayB0aGUgcmVsIGFzICJkZWFkIiB0byBzaG93IGl0IGlz IG5vIGxvbmdlciBwYXJ0IG9mIHRoZSBqb2luIHRyZWUuCiAJICogKFJlbW92aW5nIGl0IGZy b20gdGhlIGJhc2VyZWwgYXJyYXkgYWx0b2dldGhlciBzZWVtcyB0b28gcmlza3kuKQpAQCAt MzQ1LDggKzM1NywxMSBAQCByZW1vdmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJv b3QsIGludCByZWxpZCwgUmVsaWRzIGpvaW5yZWxpZHMpCiAJCQkgYXR0cm9mZi0tKQogCQl7 CiAJCQlvdGhlcnJlbC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0gPQotCQkJCWJtc19kZWxfbWVt YmVyKG90aGVycmVsLT5hdHRyX25lZWRlZFthdHRyb2ZmXSwgcmVsaWQpOworCQkJCWNoYW5n ZV9yZWxpZChvdGhlcnJlbC0+YXR0cl9uZWVkZWRbYXR0cm9mZl0sIHJlbGlkLCBzdWJzdF9y ZWxpZCk7CiAJCX0KKworCQkvKiBVcGRhdGUgbGF0ZXJhbCByZWZlcmVuY2VzLiAqLworCQlj aGFuZ2VfdmFybm8oKEV4cHIqKW90aGVycmVsLT5sYXRlcmFsX3ZhcnMsIHJlbGlkLCBzdWJz dF9yZWxpZCk7CiAJfQogCiAJLyoKQEAgLTM2MSwxMCArMzc2LDEyIEBAIHJlbW92ZV9yZWxf ZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLCBSZWxpZHMgam9pbnJl bGlkcykKIAl7CiAJCVNwZWNpYWxKb2luSW5mbyAqc2ppbmZvID0gKFNwZWNpYWxKb2luSW5m byAqKSBsZmlyc3QobCk7CiAKLQkJc2ppbmZvLT5taW5fbGVmdGhhbmQgPSBibXNfZGVsX21l bWJlcihzamluZm8tPm1pbl9sZWZ0aGFuZCwgcmVsaWQpOwotCQlzamluZm8tPm1pbl9yaWdo dGhhbmQgPSBibXNfZGVsX21lbWJlcihzamluZm8tPm1pbl9yaWdodGhhbmQsIHJlbGlkKTsK LQkJc2ppbmZvLT5zeW5fbGVmdGhhbmQgPSBibXNfZGVsX21lbWJlcihzamluZm8tPnN5bl9s ZWZ0aGFuZCwgcmVsaWQpOwotCQlzamluZm8tPnN5bl9yaWdodGhhbmQgPSBibXNfZGVsX21l bWJlcihzamluZm8tPnN5bl9yaWdodGhhbmQsIHJlbGlkKTsKKwkJc2ppbmZvLT5taW5fbGVm dGhhbmQgPSBjaGFuZ2VfcmVsaWQoc2ppbmZvLT5taW5fbGVmdGhhbmQsIHJlbGlkLCBzdWJz dF9yZWxpZCk7CisJCXNqaW5mby0+bWluX3JpZ2h0aGFuZCA9IGNoYW5nZV9yZWxpZChzamlu Zm8tPm1pbl9yaWdodGhhbmQsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CisJCXNqaW5mby0+c3lu X2xlZnRoYW5kID0gY2hhbmdlX3JlbGlkKHNqaW5mby0+c3luX2xlZnRoYW5kLCByZWxpZCwg c3Vic3RfcmVsaWQpOworCQlzamluZm8tPnN5bl9yaWdodGhhbmQgPSBjaGFuZ2VfcmVsaWQo c2ppbmZvLT5zeW5fcmlnaHRoYW5kLCByZWxpZCwgc3Vic3RfcmVsaWQpOworCisJCWNoYW5n ZV92YXJubygoRXhwciopc2ppbmZvLT5zZW1pX3Joc19leHBycywgcmVsaWQsIHN1YnN0X3Jl bGlkKTsKIAl9CiAKIAkvKgpAQCAtMzg1LDE2ICs0MDIsMjkgQEAgcmVtb3ZlX3JlbF9mcm9t X3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJlbGlkcyBqb2lucmVsaWRz KQogCXsKIAkJUGxhY2VIb2xkZXJJbmZvICpwaGluZm8gPSAoUGxhY2VIb2xkZXJJbmZvICop IGxmaXJzdChsKTsKIAotCQlBc3NlcnQoIWJtc19pc19tZW1iZXIocmVsaWQsIHBoaW5mby0+ cGhfbGF0ZXJhbCkpOwotCQlpZiAoYm1zX2lzX3N1YnNldChwaGluZm8tPnBoX25lZWRlZCwg am9pbnJlbGlkcykgJiYKKwkJaWYgKHN1YnN0X3JlbGlkID09IDAgJiYgYm1zX2lzX3N1YnNl dChwaGluZm8tPnBoX25lZWRlZCwgam9pbnJlbGlkcykgJiYKIAkJCWJtc19pc19tZW1iZXIo cmVsaWQsIHBoaW5mby0+cGhfZXZhbF9hdCkpCiAJCQlyb290LT5wbGFjZWhvbGRlcl9saXN0 ID0gZm9yZWFjaF9kZWxldGVfY3VycmVudChyb290LT5wbGFjZWhvbGRlcl9saXN0LAogCQkJ CQkJCQkJCQkJCQkJbCk7CiAJCWVsc2UKIAkJewotCQkJcGhpbmZvLT5waF9ldmFsX2F0ID0g Ym1zX2RlbF9tZW1iZXIocGhpbmZvLT5waF9ldmFsX2F0LCByZWxpZCk7CisJCQlwaGluZm8t PnBoX2V2YWxfYXQgPSBjaGFuZ2VfcmVsaWQocGhpbmZvLT5waF9ldmFsX2F0LCByZWxpZCwg c3Vic3RfcmVsaWQpOwogCQkJQXNzZXJ0KCFibXNfaXNfZW1wdHkocGhpbmZvLT5waF9ldmFs X2F0KSk7Ci0JCQlwaGluZm8tPnBoX25lZWRlZCA9IGJtc19kZWxfbWVtYmVyKHBoaW5mby0+ cGhfbmVlZGVkLCByZWxpZCk7CisJCQlwaGluZm8tPnBoX25lZWRlZCA9IGNoYW5nZV9yZWxp ZChwaGluZm8tPnBoX25lZWRlZCwgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKwkJCUFzc2VydChz dWJzdF9yZWxpZCAhPSAwIHx8ICFibXNfaXNfbWVtYmVyKHJlbGlkLCBwaGluZm8tPnBoX2xh dGVyYWwpKTsKKwkJCXBoaW5mby0+cGhfbGF0ZXJhbCA9IGNoYW5nZV9yZWxpZChwaGluZm8t PnBoX2xhdGVyYWwsIHJlbGlkLCBzdWJzdF9yZWxpZCk7CisJCQlwaGluZm8tPnBoX3Zhci0+ cGhyZWxzID0gY2hhbmdlX3JlbGlkKHBoaW5mby0+cGhfdmFyLT5waHJlbHMsIHJlbGlkLCBz dWJzdF9yZWxpZCk7CisJCX0KKwl9CisKKwlpZiAoc3Vic3RfcmVsaWQgIT0gMCkKKwl7CisJ CWZvcmVhY2gobCwgcmVsLT5iYXNlcmVzdHJpY3RpbmZvKQorCQl7CisJCQlSZXN0cmljdElu Zm8gKnJpbmZvID0gKFJlc3RyaWN0SW5mbyAqKSBsZmlyc3QobCk7CisKKwkJCWNoYW5nZV9y aW5mbyhyaW5mbywgcmVsaWQsIHN1YnN0X3JlbGlkKTsKKwkJCWRpc3RyaWJ1dGVfcmVzdHJp Y3RpbmZvX3RvX3JlbHMocm9vdCwgcmluZm8pOwogCQl9CiAJfQogCkBAIC00MTgsNiArNDQ4 LDcgQEAgcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVs aWQsIFJlbGlkcyBqb2lucmVsaWRzKQogCQlSZXN0cmljdEluZm8gKnJpbmZvID0gKFJlc3Ry aWN0SW5mbyAqKSBsZmlyc3QobCk7CiAKIAkJcmVtb3ZlX2pvaW5fY2xhdXNlX2Zyb21fcmVs cyhyb290LCByaW5mbywgcmluZm8tPnJlcXVpcmVkX3JlbGlkcyk7CisJCWNoYW5nZV9yaW5m byhyaW5mbywgcmVsaWQsIHN1YnN0X3JlbGlkKTsKIAogCQlpZiAoUklORk9fSVNfUFVTSEVE X0RPV04ocmluZm8sIGpvaW5yZWxpZHMpKQogCQl7CkBAIC00MzMsNiArNDY0LDggQEAgcmVt b3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQsIFJlbGlk cyBqb2lucmVsaWRzKQogCQkJCQkJCQkJCQkJCXJlbGlkKTsKIAkJCWRpc3RyaWJ1dGVfcmVz dHJpY3RpbmZvX3RvX3JlbHMocm9vdCwgcmluZm8pOwogCQl9CisJCWVsc2UgaWYgKHN1YnN0 X3JlbGlkICE9IDApCisJCQlkaXN0cmlidXRlX3Jlc3RyaWN0aW5mb190b19yZWxzKHJvb3Qs IHJpbmZvKTsKIAl9CiAKIAkvKgpAQCAtMTExOCwzICsxMTUxLDgzMiBAQCBpc19pbm5lcnJl bF91bmlxdWVfZm9yKFBsYW5uZXJJbmZvICpyb290LAogCS8qIExldCByZWxfaXNfZGlzdGlu Y3RfZm9yKCkgZG8gdGhlIGhhcmQgd29yayAqLwogCXJldHVybiByZWxfaXNfZGlzdGluY3Rf Zm9yKHJvb3QsIGlubmVycmVsLCBjbGF1c2VfbGlzdCk7CiB9CisKK3R5cGVkZWYgc3RydWN0 IENoYW5nZVZhcm5vQ29udGV4dAoreworCUluZGV4IG9sZFJlbGlkOworCUluZGV4IG5ld1Jl bGlkOworfSBDaGFuZ2VWYXJub0NvbnRleHQ7CisKKworc3RhdGljIGJvb2wKK2NoYW5nZV92 YXJub193YWxrZXIoTm9kZSAqbm9kZSwgQ2hhbmdlVmFybm9Db250ZXh0ICpjb250ZXh0KQor eworCWlmIChub2RlID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChJc0Eobm9k ZSwgVmFyKSkKKwl7CisJCVZhciogdmFyID0gKFZhciopbm9kZTsKKwkJaWYgKHZhci0+dmFy bm8gPT0gY29udGV4dC0+b2xkUmVsaWQpCisJCXsKKwkJCXZhci0+dmFybm8gPSBjb250ZXh0 LT5uZXdSZWxpZDsKKwkJCXZhci0+dmFybm9zeW4gPSBjb250ZXh0LT5uZXdSZWxpZDsKKwkJ CXZhci0+bG9jYXRpb24gPSAtMTsKKwkJfQorCQllbHNlIGlmICh2YXItPnZhcm5vID09IGNv bnRleHQtPm5ld1JlbGlkKQorCQkJdmFyLT5sb2NhdGlvbiA9IC0xOworCisJCXJldHVybiBm YWxzZTsKKwl9CisJaWYgKElzQShub2RlLCBSZXN0cmljdEluZm8pKQorCXsKKwkJY2hhbmdl X3JpbmZvKChSZXN0cmljdEluZm8qKW5vZGUsIGNvbnRleHQtPm9sZFJlbGlkLCBjb250ZXh0 LT5uZXdSZWxpZCk7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIGV4cHJlc3Npb25f dHJlZV93YWxrZXIobm9kZSwgY2hhbmdlX3Zhcm5vX3dhbGtlciwgY29udGV4dCk7Cit9CisK Ky8qCisgKiBGb3IgYWxsIFZhcnMgaW4gdGhlIGV4cHJlc3Npb24gdGhhdCBoYXZlIHZhcm5v ID0gb2xkUmVsaWQsIHNldAorICogdmFybm8gPSBuZXdSZWxpZC4KKyAqLworc3RhdGljIHZv aWQKK2NoYW5nZV92YXJubyhFeHByICpleHByLCBJbmRleCBvbGRSZWxpZCwgSW5kZXggbmV3 UmVsaWQpCit7CisJQ2hhbmdlVmFybm9Db250ZXh0IGNvbnRleHQ7CisKKwlpZiAobmV3UmVs aWQgPT0gMCkKKwkJcmV0dXJuOworCisJY29udGV4dC5vbGRSZWxpZCA9IG9sZFJlbGlkOwor CWNvbnRleHQubmV3UmVsaWQgPSBuZXdSZWxpZDsKKwljaGFuZ2VfdmFybm9fd2Fsa2VyKChO b2RlICopIGV4cHIsICZjb250ZXh0KTsKK30KKworLyoKKyAqIFN1YnN0aXR1dGUgbmV3SWQg Zm9yIG9sZElkIGluIHJlbGlkcy4KKyAqLworc3RhdGljIEJpdG1hcHNldCoKK2NoYW5nZV9y ZWxpZChSZWxpZHMgcmVsaWRzLCBJbmRleCBvbGRJZCwgSW5kZXggbmV3SWQpCit7CisJaWYg KG5ld0lkID09IDApCisJCS8qIERlbGV0ZSByZWxpZCB3aXRob3V0IHN1YnN0aXR1dGlvbi4g Ki8KKwkJcmV0dXJuIGJtc19kZWxfbWVtYmVyKHJlbGlkcywgb2xkSWQpOworCisJaWYgKGJt c19pc19tZW1iZXIob2xkSWQsIHJlbGlkcykpCisJCXJldHVybiBibXNfYWRkX21lbWJlcihi bXNfZGVsX21lbWJlcihibXNfY29weShyZWxpZHMpLCBvbGRJZCksIG5ld0lkKTsKKworCXJl dHVybiByZWxpZHM7Cit9CisKK3N0YXRpYyB2b2lkCitjaGFuZ2VfcmluZm8oUmVzdHJpY3RJ bmZvKiByaW5mbywgSW5kZXggZnJvbSwgSW5kZXggdG8pCit7CisJYm9vbCBpc19yZXFfZXF1 YWw7CisKKwlpZiAodG8gPT0gMCkKKwkJcmV0dXJuOworCisJaXNfcmVxX2VxdWFsID0KKwkJ KHJpbmZvLT5yZXF1aXJlZF9yZWxpZHMgPT0gcmluZm8tPmNsYXVzZV9yZWxpZHMpID8gdHJ1 ZSA6IGZhbHNlOworCisJY2hhbmdlX3Zhcm5vKHJpbmZvLT5jbGF1c2UsIGZyb20sIHRvKTsK KwljaGFuZ2VfdmFybm8ocmluZm8tPm9yY2xhdXNlLCBmcm9tLCB0byk7CisJcmluZm8tPmNs YXVzZV9yZWxpZHMgPSBjaGFuZ2VfcmVsaWQocmluZm8tPmNsYXVzZV9yZWxpZHMsIGZyb20s IHRvKTsKKwlpZiAoaXNfcmVxX2VxdWFsKQorCQlyaW5mby0+cmVxdWlyZWRfcmVsaWRzID0g cmluZm8tPmNsYXVzZV9yZWxpZHM7CisJZWxzZQorCQlyaW5mby0+cmVxdWlyZWRfcmVsaWRz ID0gY2hhbmdlX3JlbGlkKHJpbmZvLT5yZXF1aXJlZF9yZWxpZHMsIGZyb20sIHRvKTsKKwly aW5mby0+bGVmdF9yZWxpZHMgPSBjaGFuZ2VfcmVsaWQocmluZm8tPmxlZnRfcmVsaWRzLCBm cm9tLCB0byk7CisJcmluZm8tPnJpZ2h0X3JlbGlkcyA9IGNoYW5nZV9yZWxpZChyaW5mby0+ cmlnaHRfcmVsaWRzLCBmcm9tLCB0byk7CisJcmluZm8tPm91dGVyX3JlbGlkcyA9IGNoYW5n ZV9yZWxpZChyaW5mby0+b3V0ZXJfcmVsaWRzLCBmcm9tLCB0byk7CisJcmluZm8tPm51bGxh YmxlX3JlbGlkcyA9IGNoYW5nZV9yZWxpZChyaW5mby0+bnVsbGFibGVfcmVsaWRzLCBmcm9t LCB0byk7Cit9CisKKy8qCisgKiBVcGRhdGUgRUMgbWVtYmVycyB0byBwb2ludCB0byB0aGUg cmVtYWluaW5nIHJlbGF0aW9uIGluc3RlYWQgb2YgdGhlIHJlbW92ZWQKKyAqIG9uZSwgcmVt b3ZpbmcgZHVwbGljYXRlcy4KKyAqLworc3RhdGljIHZvaWQKK3VwZGF0ZV9lY19tZW1iZXJz KEVxdWl2YWxlbmNlQ2xhc3MgKmVjLCBJbmRleCB0b1JlbW92ZSwgSW5kZXggdG9LZWVwKQor eworCWludAkJCWNvdW50ZXI7CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbGlz dF9sZW5ndGgoZWMtPmVjX21lbWJlcnMpOyApCisJeworCQlMaXN0Q2VsbAkJCSpjZWxsID0g bGlzdF9udGhfY2VsbChlYy0+ZWNfbWVtYmVycywgY291bnRlcik7CisJCUVxdWl2YWxlbmNl TWVtYmVyCSplbSA9IGxmaXJzdChjZWxsKTsKKwkJaW50CQkJCQljb3VudGVyMTsKKworCQlp ZiAoIWJtc19pc19tZW1iZXIodG9SZW1vdmUsIGVtLT5lbV9yZWxpZHMpKQorCQl7CisJCQlj b3VudGVyKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWVtLT5lbV9yZWxpZHMgPSBjaGFu Z2VfcmVsaWQoZW0tPmVtX3JlbGlkcywgdG9SZW1vdmUsIHRvS2VlcCk7CisJCS8qIFdlIG9u bHkgcHJvY2VzcyBpbm5lciBqb2lucyAqLworCQljaGFuZ2VfdmFybm8oZW0tPmVtX2V4cHIs IHRvUmVtb3ZlLCB0b0tlZXApOworCisJCS8qCisJCSAqIEFmdGVyIHdlIHN3aXRjaGVkIHRo ZSBlcXVpdmFsZW5jZSBtZW1iZXIgdG8gdGhlIHJlbWFpbmluZyByZWxhdGlvbiwKKwkJICog Y2hlY2sgdGhhdCBpdCBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIGV4aXN0aW5nIG1lbWJlciwg YW5kIGlmIGl0CisJCSAqIGlzLCBkZWxldGUgaXQuCisJCSAqLworCQlmb3IgKGNvdW50ZXIx ID0gMDsgY291bnRlcjEgPCBsaXN0X2xlbmd0aChlYy0+ZWNfbWVtYmVycyk7IGNvdW50ZXIx KyspCisJCXsKKwkJCUVxdWl2YWxlbmNlTWVtYmVyCSpvdGhlcjsKKworCQkJaWYgKGNvdW50 ZXIxID09IGNvdW50ZXIpCisJCQkJY29udGludWU7CisKKwkJCW90aGVyID0gY2FzdE5vZGUo RXF1aXZhbGVuY2VNZW1iZXIsIGxpc3RfbnRoKGVjLT5lY19tZW1iZXJzLCBjb3VudGVyMSkp OworCisJCQlpZiAoZXF1YWwob3RoZXItPmVtX2V4cHIsIGVtLT5lbV9leHByKSkKKwkJCQli cmVhazsKKwkJfQorCisJCWlmIChjb3VudGVyMSA8IGxpc3RfbGVuZ3RoKGVjLT5lY19tZW1i ZXJzKSkKKwkJCWVjLT5lY19tZW1iZXJzID0gbGlzdF9kZWxldGVfY2VsbChlYy0+ZWNfbWVt YmVycywgY2VsbCk7CisJCWVsc2UKKwkJCWNvdW50ZXIrKzsKKwl9Cit9CisKKy8qCisgKiBV cGRhdGUgRUMgc291cmNlcyB0byBwb2ludCB0byB0aGUgcmVtYWluaW5nIHJlbGF0aW9uIGlu c3RlYWQgb2YgdGhlCisgKiByZW1vdmVkIG9uZS4KKyAqLworc3RhdGljIHZvaWQKK3VwZGF0 ZV9lY19zb3VyY2VzKExpc3QgKipzb3VyY2VzLCBJbmRleCB0b1JlbW92ZSwgSW5kZXggdG9L ZWVwKQoreworCWludAkJCWNvdW50ZXI7CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVy IDwgbGlzdF9sZW5ndGgoKnNvdXJjZXMpOyApCisJeworCQlMaXN0Q2VsbAkJKmNlbGwgPSBs aXN0X250aF9jZWxsKCpzb3VyY2VzLCBjb3VudGVyKTsKKwkJUmVzdHJpY3RJbmZvCSpyaW5m byA9IGNhc3ROb2RlKFJlc3RyaWN0SW5mbywgbGZpcnN0KGNlbGwpKTsKKwkJaW50CQkJCWNv dW50ZXIxOworCisJCWlmICghYm1zX2lzX21lbWJlcih0b1JlbW92ZSwgcmluZm8tPnJlcXVp cmVkX3JlbGlkcykpCisJCXsKKwkJCWNvdW50ZXIrKzsKKwkJCWNvbnRpbnVlOworCQl9CisK KwkJY2hhbmdlX3Zhcm5vKHJpbmZvLT5jbGF1c2UsIHRvUmVtb3ZlLCB0b0tlZXApOworCisJ CS8qCisJCSAqIEFmdGVyIHN3aXRjaGluZyB0aGUgY2xhdXNlIHRvIHRoZSByZW1haW5pbmcg cmVsYXRpb24sIGNoZWNrIGl0IGZvcgorCQkgKiByZWR1bmRhbmN5IHdpdGggZXhpc3Rpbmcg b25lcy4gV2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBmb3IKKwkJICogcmVkdW5kYW5jeSB3aXRo IGRlcml2ZWQgY2xhdXNlcywgYmVjYXVzZSB3ZSd2ZSBqdXN0IGRlbGV0ZWQgdGhlbS4KKwkJ ICovCisJCWZvciAoY291bnRlcjEgPSAwOyBjb3VudGVyMSA8IGxpc3RfbGVuZ3RoKCpzb3Vy Y2VzKTsgY291bnRlcjErKykKKwkJeworCQkJUmVzdHJpY3RJbmZvICpvdGhlcjsKKworCQkJ aWYgKGNvdW50ZXIxID09IGNvdW50ZXIpCisJCQkJY29udGludWU7CisKKwkJCW90aGVyID0g Y2FzdE5vZGUoUmVzdHJpY3RJbmZvLCBsaXN0X250aCgqc291cmNlcywgY291bnRlcjEpKTsK KwkJCWlmIChlcXVhbChyaW5mby0+Y2xhdXNlLCBvdGhlci0+Y2xhdXNlKSkKKwkJCQlicmVh azsKKwkJfQorCisJCWlmIChjb3VudGVyMSA8IGxpc3RfbGVuZ3RoKCpzb3VyY2VzKSkKKwkJ CSpzb3VyY2VzID0gbGlzdF9kZWxldGVfY2VsbCgqc291cmNlcywgY2VsbCk7CisJCWVsc2UK KwkJeworCQkJY291bnRlcisrOworCisJCQkvKiBXZSB3aWxsIGtlZXAgdGhpcyBSZXN0cmlj dEluZm8sIGNvcnJlY3QgaXRzIHJlbGlkcy4gKi8KKwkJCWNoYW5nZV9yaW5mbyhyaW5mbywg dG9SZW1vdmUsIHRvS2VlcCk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBSZW1vdmUgYSByZWxh dGlvbiBhZnRlciB3ZSBoYXZlIHByb3ZlbiB0aGF0IGl0IHBhcnRpY2lwYXRlcyBvbmx5IGlu IGFuCisgKiB1bm5lZWRlZCB1bmlxdWUgc2VsZiBqb2luLgorICoKKyAqIFRoZSBqb2luY2xh dXNlcyBsaXN0IGlzIGRlc3RydWN0aXZlbHkgY2hhbmdlZC4KKyAqLworc3RhdGljIHZvaWQK K3JlbW92ZV9zZWxmX2pvaW5fcmVsKFBsYW5uZXJJbmZvICpyb290LCBQbGFuUm93TWFyayAq a21hcmssIFBsYW5Sb3dNYXJrICpybWFyaywKKwkJCQkJIFJlbE9wdEluZm8gKnRvS2VlcCwg UmVsT3B0SW5mbyAqdG9SZW1vdmUpCit7CisJTGlzdENlbGwgKmNlbGw7CisJaW50IGk7CisJ TGlzdCAqdGFyZ2V0ID0gTklMOworCisJLyoKKwkgKiBJbmNsdWRlIGFsbCBlY2xhc3MgbWVu dGlvbnMgb2YgcmVtb3ZlZCByZWxhdGlvbiBpbnRvIHRoZSBlY2xhc3MgbWVudGlvbnMKKwkg KiBvZiBrZXB0IHJlbGF0aW9uLgorCSAqLworCXRvS2VlcC0+ZWNsYXNzX2luZGV4ZXMgPSBi bXNfYWRkX21lbWJlcnModG9SZW1vdmUtPmVjbGFzc19pbmRleGVzLAorCQkJCQkJCQkJCQkJ CQl0b0tlZXAtPmVjbGFzc19pbmRleGVzKTsKKworCS8qCisJICogTm93LCBiYXNlcmVzdHJp Y3RpbmZvIHJlcGxlbmlzaGVkIHdpdGggcmVzdHJpY3Rpb25zIGZyb20gcmVtb3ZpbmcKKwkg KiByZWxhdGlvbi4gSXQgaXMgbmVlZGVkIHRvIHJlbW92ZSBkdXBsaWNhdGVzIGFuZCByZXBs YWNlIGRlZ2VuZXJhdGVkCisJICogY2xhdXNlcyB3aXRoIGEgTnVsbFRlc3QuCisJICovCisJ Zm9yZWFjaChjZWxsLCB0b0tlZXAtPmJhc2VyZXN0cmljdGluZm8pCisJeworCQlSZXN0cmlj dEluZm8gKnJpbmZvID0gbGZpcnN0X25vZGUoUmVzdHJpY3RJbmZvLCBjZWxsKTsKKwkJTGlz dENlbGwgKm90aGVyQ2VsbDsKKworCQlBc3NlcnQoIWJtc19pc19tZW1iZXIodG9SZW1vdmUt PnJlbGlkLCByaW5mby0+Y2xhdXNlX3JlbGlkcykpOworCisJCS8qCisJCSAqIElmIHRoaXMg Y2xhdXNlIGlzIGEgbWVyZ2Vqb2luYWJsZSBlcXVhbGl0eSBjbGF1c2UgdGhhdCBjb21wYXJl cyBhCisJCSAqIHZhcmlhYmxlIHRvIGl0c2VsZiwgaS5lLiwgaGFzIHRoZSBmb3JtIG9mICJY PVgiLCByZXBsYWNlIGl0IHdpdGgKKwkJICogbnVsbCB0ZXN0LgorCQkgKi8KKwkJaWYgKHJp bmZvLT5tZXJnZW9wZmFtaWxpZXMgJiYgSXNBKHJpbmZvLT5jbGF1c2UsIE9wRXhwcikpCisJ CXsKKwkJCUV4cHIgKmxlZnRPcDsKKwkJCUV4cHIgKnJpZ2h0T3A7CisKKwkJCWxlZnRPcCA9 IChFeHByICopIGdldF9sZWZ0b3AocmluZm8tPmNsYXVzZSk7CisJCQlyaWdodE9wID0gKEV4 cHIgKikgZ2V0X3JpZ2h0b3AocmluZm8tPmNsYXVzZSk7CisKKwkJCWlmIChsZWZ0T3AgIT0g TlVMTCAmJiBlcXVhbChsZWZ0T3AsIHJpZ2h0T3ApKQorCQkJeworCQkJCU51bGxUZXN0ICpu dWxsVGVzdCA9IG1ha2VOb2RlKE51bGxUZXN0KTsKKwkJCQludWxsVGVzdC0+YXJnID0gbGVm dE9wOworCQkJCW51bGxUZXN0LT5udWxsdGVzdHR5cGUgPSBJU19OT1RfTlVMTDsKKwkJCQlu dWxsVGVzdC0+YXJnaXNyb3cgPSBmYWxzZTsKKwkJCQludWxsVGVzdC0+bG9jYXRpb24gPSAt MTsKKwkJCQlyaW5mby0+Y2xhdXNlID0gKEV4cHIgKikgbnVsbFRlc3Q7CisJCQl9CisJCX0K KworCQkvKiBTZWFyY2ggZm9yIGR1cGxpY2F0ZXMuICovCisJCWZvcmVhY2gob3RoZXJDZWxs LCB0YXJnZXQpCisJCXsKKwkJCVJlc3RyaWN0SW5mbyAqb3RoZXIgPSBsZmlyc3Rfbm9kZShS ZXN0cmljdEluZm8sIG90aGVyQ2VsbCk7CisKKwkJCWlmIChvdGhlciA9PSByaW5mbyB8fAor CQkJCShyaW5mby0+cGFyZW50X2VjICE9IE5VTEwKKwkJCQkgJiYgb3RoZXItPnBhcmVudF9l YyA9PSByaW5mby0+cGFyZW50X2VjKQorCQkJCSB8fCBlcXVhbChyaW5mby0+Y2xhdXNlLCBv dGhlci0+Y2xhdXNlKSkKKwkJCXsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChv dGhlckNlbGwgIT0gTlVMTCkKKwkJCS8qIER1cGxpY2F0ZSBmb3VuZCAqLworCQkJY29udGlu dWU7CisKKwkJdGFyZ2V0ID0gbGFwcGVuZCh0YXJnZXQsIHJpbmZvKTsKKwl9CisKKwlsaXN0 X2ZyZWUodG9LZWVwLT5iYXNlcmVzdHJpY3RpbmZvKTsKKwl0b0tlZXAtPmJhc2VyZXN0cmlj dGluZm8gPSB0YXJnZXQ7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgZXF1aXZhbGVuY2UgY2xh c3NlcyB0aGF0IHJlZmVyZW5jZSB0aGUgcmVtb3ZlZCByZWxhdGlvbnMuCisJICovCisJZm9y ZWFjaChjZWxsLCByb290LT5lcV9jbGFzc2VzKQorCXsKKwkJRXF1aXZhbGVuY2VDbGFzcyAq ZWMgPSBsZmlyc3QoY2VsbCk7CisKKwkJaWYgKCFibXNfaXNfbWVtYmVyKHRvUmVtb3ZlLT5y ZWxpZCwgZWMtPmVjX3JlbGlkcykpCisJCXsKKwkJCS8qCisJCQkgKiBUaGlzIEVDIGRvZXNu J3QgcmVmZXJlbmNlIHRoZSByZW1vdmVkIHJlbGF0aW9uLCBub3RoaW5nIHRvIGJlCisJCQkg KiBkb25lIGZvciBpdC4KKwkJCSAqLworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkg KiBVcGRhdGUgdGhlIEVDIG1lbWJlcnMgdG8gcmVmZXJlbmNlIHRoZSByZW1haW5pbmcgcmVs YXRpb24gaW5zdGVhZAorCQkgKiBvZiB0aGUgcmVtb3ZlZCBvbmUuCisJCSAqLworCQl1cGRh dGVfZWNfbWVtYmVycyhlYywgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJ ZWMtPmVjX3JlbGlkcyA9IGNoYW5nZV9yZWxpZChlYy0+ZWNfcmVsaWRzLCB0b1JlbW92ZS0+ cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCisJCS8qCisJCSAqIFdlIHdpbGwgbm93IHVwZGF0 ZSBzb3VyY2UgYW5kIGRlcml2ZWQgY2xhdXNlcyBvZiB0aGUgRUMuCisJCSAqCisJCSAqIFJl c3RyaWN0aW9uIGNsYXVzZXMgZm9yIGJhc2UgcmVsYXRpb25zIGFyZSBhbHJlYWR5IGRpc3Ry aWJ1dGVkIHRvCisJCSAqIHRoZSByZXNwZWN0aXZlIGJhc2VyZXN0cmljdGluZm8gbGlzdHMg KHNlZQorCQkgKiBnZW5lcmF0ZV9pbXBsaWVkX2VxdWFsaXRpZXMpLiBUaGUgYWJvdmUgY29k ZSBoYXMgYWxyZWFkeSBwcm9jZXNzZWQKKwkJICogdGhpcyBsaXN0LCBhbmQgdXBkYXRlZCB0 aGVzZSBjbGF1c2VzIHRvIHJlZmVyZW5jZSB0aGUgcmVtYWluaW5nCisJCSAqIHJlbGF0aW9u LCBzbyB3ZSBjYW4gc2tpcCB0aGVtIGhlcmUgYmFzZWQgb24gdGhlaXIgcmVsaWRzLgorCQkg KgorCQkgKiBMaWtld2lzZSwgd2UgaGF2ZSBhbHJlYWR5IHByb2Nlc3NlZCB0aGUgam9pbiBj bGF1c2VzIHRoYXQgam9pbiB0aGUKKwkJICogcmVtb3ZlZCByZWxhdGlvbiB0byB0aGUgcmVt YWluaW5nIG9uZS4KKwkJICoKKwkJICogRmluYWxseSwgdGhlcmUgYXJlIGpvaW4gY2xhdXNl cyB0aGF0IGpvaW4gdGhlIHJlbW92ZWQgcmVsYXRpb24gdG8KKwkJICogc29tZSB0aGlyZCBy ZWxhdGlvbi4gV2UgY2FuJ3QganVzdCBkZWxldGUgdGhlIHNvdXJjZSBjbGF1c2VzIGFuZAor CQkgKiByZWdlbmVyYXRlIHRoZW0gZnJvbSB0aGUgRUMsIGJlY2F1c2UgdGhlIGNvcnJlc3Bv bmRpbmcgZXF1YWxpdHkKKwkJICogb3BlcmF0b3JzIG1pZ2h0IGJlIG1pc3NpbmcgKHNlZSB0 aGUgaGFuZGxpbmcgb2YgZWNfYnJva2VuKS4KKwkJICogVGhlcmVmb3JlLCB3ZSB3aWxsIHVw ZGF0ZSB0aGUgcmVmZXJlbmNlcyBpbiB0aGUgc291cmNlIGNsYXVzZXMuCisJCSAqCisJCSAq IERlcml2ZWQgY2xhdXNlcyBjYW4gYmUgZ2VuZXJhdGVkIGFnYWluLCBzbyBpdCBpcyBzaW1w bGVyIHRvIGp1c3QKKwkJICogZGVsZXRlIHRoZW0uCisJCSAqLworCQlsaXN0X2ZyZWUoZWMt PmVjX2Rlcml2ZXMpOworCQllYy0+ZWNfZGVyaXZlcyA9IE5VTEw7CisJCXVwZGF0ZV9lY19z b3VyY2VzKCZlYy0+ZWNfc291cmNlcywgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlk KTsKKwl9CisKKwkvKgorCSAqIFRyYW5zZmVyIHRoZSB0YXJnZXRsaXN0IGFuZCBhdHRyX25l ZWRlZCBmbGFncy4KKwkgKi8KKwlBc3NlcnQodG9SZW1vdmUtPnJlbHRhcmdldC0+c29ydGdy b3VwcmVmcyA9PSAwKTsKKworCWZvcmVhY2ggKGNlbGwsIHRvUmVtb3ZlLT5yZWx0YXJnZXQt PmV4cHJzKQorCXsKKwkJRXhwciAqbm9kZSA9IGxmaXJzdChjZWxsKTsKKwkJY2hhbmdlX3Zh cm5vKG5vZGUsIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCWlmICghbGlz dF9tZW1iZXIodG9LZWVwLT5yZWx0YXJnZXQtPmV4cHJzLCBub2RlKSkKKwkJCXRvS2VlcC0+ cmVsdGFyZ2V0LT5leHBycyA9IGxhcHBlbmQodG9LZWVwLT5yZWx0YXJnZXQtPmV4cHJzLCBu b2RlKTsKKwl9CisKKwlmb3IgKGkgPSB0b0tlZXAtPm1pbl9hdHRyOyBpIDw9IHRvS2VlcC0+ bWF4X2F0dHI7IGkrKykKKwl7CisJCWludCBhdHRubyA9IGkgLSB0b0tlZXAtPm1pbl9hdHRy OworCQl0b0tlZXAtPmF0dHJfbmVlZGVkW2F0dG5vXSA9IGJtc19hZGRfbWVtYmVycyh0b0tl ZXAtPmF0dHJfbmVlZGVkW2F0dG5vXSwKKwkJCQkJCQkJCQkJCQkgdG9SZW1vdmUtPmF0dHJf bmVlZGVkW2F0dG5vXSk7CisJfQorCisJLyoKKwkgKiBJZiB0aGUgcmVtb3ZlZCByZWxhdGlv biBoYXMgYSByb3cgbWFyaywgdHJhbnNmZXIgaXQgdG8gdGhlIHJlbWFpbmluZworCSAqIG9u ZS4KKwkgKgorCSAqIElmIGJvdGggcmVscyBoYXZlIHJvdyBtYXJrcywganVzdCBrZWVwIHRo ZSBvbmUgY29ycmVzcG9uZGluZyB0byB0aGUKKwkgKiByZW1haW5pbmcgcmVsYXRpb24sIGJl Y2F1c2Ugd2UgdmVyaWZpZWQgZWFybGllciB0aGF0IHRoZXkgaGF2ZSB0aGUgc2FtZQorCSAq IHN0cmVuZ3RoLgorCSAqCisJICogQWxzbyBtYWtlIHN1cmUgdGhhdCB0aGUgc2NyYXRjaC0+ cm93X21hcmtzIGNhY2hlIGlzIHVwIHRvIGRhdGUsIGJlY2F1c2UKKwkgKiB3ZSBhcmUgZ29p bmcgdG8gdXNlIGl0IGZvciBmdXJ0aGVyIGpvaW4gcmVtb3ZhbHMuCisJICovCisJaWYgKHJt YXJrKQorCXsKKwkJaWYgKGttYXJrKQorCQl7CisJCQlBc3NlcnQoa21hcmstPm1hcmtUeXBl ID09IHJtYXJrLT5tYXJrVHlwZSk7CisKKwkJCXJvb3QtPnJvd01hcmtzID0gbGlzdF9kZWxl dGVfcHRyKHJvb3QtPnJvd01hcmtzLCBrbWFyayk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkv KiBTaG91bGRuJ3QgaGF2ZSBpbmhlcml0YW5jZSBjaGlsZHJlbiBoZXJlLiAqLworCQkJQXNz ZXJ0KGttYXJrLT5ydGkgPT0ga21hcmstPnBydGkpOworCisJCQlybWFyay0+cnRpID0gdG9L ZWVwLT5yZWxpZDsKKwkJCXJtYXJrLT5wcnRpID0gdG9LZWVwLT5yZWxpZDsKKwkJfQorCX0K KworCS8qCisJICogQ2hhbmdlIHZhcm5vIGluIHNvbWUgc3BlY2lhbCBjYXNlcyB3aXRoIG5v bi10cml2aWFsIFJhbmdlVGJsRW50cnkKKwkgKi8KKwlmb3JlYWNoKGNlbGwsIHJvb3QtPnBh cnNlLT5ydGFibGUpCisJeworCQlSYW5nZVRibEVudHJ5ICpydGUJPSBsZmlyc3QoY2VsbCk7 CisKKwkJc3dpdGNoKHJ0ZS0+cnRla2luZCkKKwkJeworCQkJY2FzZSBSVEVfRlVOQ1RJT046 CisJCQkJY2hhbmdlX3Zhcm5vKChFeHByKilydGUtPmZ1bmN0aW9ucywgdG9SZW1vdmUtPnJl bGlkLCB0b0tlZXAtPnJlbGlkKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUlRFX1RBQkxFRlVO QzoKKwkJCQljaGFuZ2VfdmFybm8oKEV4cHIqKXJ0ZS0+dGFibGVmdW5jLCB0b1JlbW92ZS0+ cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCQkJCWJyZWFrOworCQkJY2FzZSBSVEVfVkFMVUVT OgorCQkJCWNoYW5nZV92YXJubygoRXhwciopcnRlLT52YWx1ZXNfbGlzdHMsIHRvUmVtb3Zl LT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJ CS8qIG5vIG9wICovCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIFJlcGxhY2Ug dmFybm8gaW4gcm9vdCB0YXJnZXRsaXN0IGFuZCBIQVZJTkcgY2xhdXNlLgorCSAqLworCWNo YW5nZV92YXJubygoRXhwciAqKSByb290LT5wcm9jZXNzZWRfdGxpc3QsIHRvUmVtb3ZlLT5y ZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJY2hhbmdlX3Zhcm5vKChFeHByICopIHJvb3QtPnBh cnNlLT5oYXZpbmdRdWFsLCB0b1JlbW92ZS0+cmVsaWQsIHRvS2VlcC0+cmVsaWQpOworCisJ LyoKKwkgKiBUcmFuc2ZlciBqb2luIGFuZCByZXN0cmljdGlvbiBjbGF1c2VzIGZyb20gdGhl IHJlbW92ZWQgcmVsYXRpb24gdG8gdGhlCisJICogcmVtYWluaW5nIG9uZS4gV2UgY2hhbmdl IHRoZSBWYXJzIG9mIHRoZSBjbGF1c2UgdG8gcG9pbnQgdG8gdGhlCisJICogcmVtYWluaW5n IHJlbGF0aW9uIGluc3RlYWQgb2YgdGhlIHJlbW92ZWQgb25lLiBUaGUgY2xhdXNlcyB0aGF0 IHJlcXVpcmUKKwkgKiBhIHN1YnNldCBvZiBqb2lucmVsaWRzIGJlY29tZSByZXN0cmljdGlv biBjbGF1c2VzIG9mIHRoZSByZW1haW5pbmcKKwkgKiByZWxhdGlvbiwgYW5kIG90aGVycyBy ZW1haW4gam9pbiBjbGF1c2VzLiBXZSBhcHBlbmQgdGhlbSB0bworCSAqIGJhc2VyZXN0cmlj dGluZm8gYW5kIGpvaW5pbmZvIHJlc3BlY3RpdmVseSwgdHJ5aW5nIG5vdCB0byBpbnRyb2R1 Y2UKKwkgKiBkdXBsaWNhdGVzLgorCSAqCisJICogV2UgYWxzbyBoYXZlIHRvIHByb2Nlc3Mg dGhlICdqb2luY2xhdXNlcycgbGlzdCBoZXJlLCBiZWNhdXNlIGl0CisJICogY29udGFpbnMg RUMtZGVyaXZlZCBqb2luIGNsYXVzZXMgd2hpY2ggbXVzdCBiZWNvbWUgZmlsdGVyIGNsYXVz ZXMuIEl0CisJICogaXMgbm90IGVub3VnaCB0byBqdXN0IGNvcnJlY3QgdGhlIEVDcywgYmVj YXVzZSB0aGUgRUMtZGVyaXZlZAorCSAqIHJlc3RyaWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJl Zm9yZSBqb2luIHJlbW92YWwgKHNlZQorCSAqIGdlbmVyYXRlX2Jhc2VfaW1wbGllZF9lcXVh bGl0aWVzKS4KKwkgKi8KK30KKworLyoKKyAqIHNwbGl0X3NlbGZqb2luX3F1YWxzCisgKgkJ UHJvY2Vzc2VzICdqb2lucXVhbHMnIGJ1aWxkaW5nIHR3byBsaXN0cywgb25lIHdpdGggYSBs aXN0IG9mIHF1YWxzCisgKgkJd2hlcmUgdGhlIGNvbHVtbnMvZXhwcnMgb24gZWl0aGVyIHNp ZGUgb2YgdGhlIGpvaW4gbWF0Y2ggYW5kIGFub3RoZXIKKyAqCQlsaXN0IGNvbnRhaW5pbmcg dGhlIHJlbWFpbmluZyBxdWFscy4KKyAqCisgKiAnam9pbnF1YWxzJyBtdXN0IG9ubHkgY29u dGFpbiBxdWFscyBmb3IgYSBSVEVfUkVMQVRJT04gYmVpbmcgam9pbmVkIHRvCisgKiBpdHNl bGYuCisgKi8KK3N0YXRpYyB2b2lkCitzcGxpdF9zZWxmam9pbl9xdWFscyhQbGFubmVySW5m byAqcm9vdCwgTGlzdCAqam9pbnF1YWxzLCBMaXN0ICoqc2VsZmpvaW5xdWFscywKKwkJCQkJ IExpc3QgKipvdGhlcmpvaW5xdWFscykKK3sKKwlMaXN0Q2VsbCAqbGM7CisJTGlzdAkgKnNq b2lucXVhbHMgPSBOSUw7CisJTGlzdAkgKm9qb2lucXVhbHMgPSBOSUw7CisKKwlmb3JlYWNo KGxjLCBqb2lucXVhbHMpCisJeworCQlSZXN0cmljdEluZm8JKnJpbmZvID0gbGZpcnN0X25v ZGUoUmVzdHJpY3RJbmZvLCBsYyk7CisJCU9wRXhwcgkJCSpleHByOworCQlFeHByCQkJKmxl ZnRleHByOworCQlFeHByCQkJKnJpZ2h0ZXhwcjsKKworCQkvKiBJbiBnZW5lcmFsLCBjbGF1 c2UgbG9va3MgbGlrZSBGKGFyZzEpID0gRyhhcmcyKSA/ICovCisJCWlmICghcmluZm8tPm1l cmdlb3BmYW1pbGllcyB8fAorCQkJYm1zX251bV9tZW1iZXJzKHJpbmZvLT5jbGF1c2VfcmVs aWRzKSAhPSAyIHx8CisJCQlibXNfbnVtX21lbWJlcnMocmluZm8tPmxlZnRfcmVsaWRzKSAh PSAxIHx8CisJCQlibXNfbnVtX21lbWJlcnMocmluZm8tPnJpZ2h0X3JlbGlkcykgIT0gMSkK KwkJeworCQkJb2pvaW5xdWFscyA9IGxhcHBlbmQob2pvaW5xdWFscywgcmluZm8pOworCQkJ Y29udGludWU7CisJCX0KKworCQlleHByID0gKE9wRXhwciAqKSByaW5mby0+Y2xhdXNlOwor CisJCWlmICghSXNBKGV4cHIsIE9wRXhwcikgfHwgbGlzdF9sZW5ndGgoZXhwci0+YXJncykg IT0gMikKKwkJeworCQkJb2pvaW5xdWFscyA9IGxhcHBlbmQob2pvaW5xdWFscywgcmluZm8p OworCQkJY29udGludWU7CisJCX0KKworCQlsZWZ0ZXhwciA9IChFeHByICopIGNvcHlPYmpl Y3QoZ2V0X2xlZnRvcChyaW5mby0+Y2xhdXNlKSk7CisJCXJpZ2h0ZXhwciA9IChFeHByICop IGNvcHlPYmplY3QoZ2V0X3JpZ2h0b3AocmluZm8tPmNsYXVzZSkpOworCisJCS8qIENhbid0 IG1hdGNoIG9mIHRoZSBleHBycyBhcmUgbm90IG9mIHRoZSBzYW1lIHR5cGUgKi8KKwkJaWYg KGxlZnRleHByLT50eXBlICE9IHJpZ2h0ZXhwci0+dHlwZSkKKwkJeworCQkJb2pvaW5xdWFs cyA9IGxhcHBlbmQob2pvaW5xdWFscywgcmluZm8pOworCQkJY29udGludWU7CisJCX0KKwor CQljaGFuZ2VfdmFybm8ocmlnaHRleHByLAorCQkJCQkgYm1zX25leHRfbWVtYmVyKHJpbmZv LT5yaWdodF9yZWxpZHMsIC0xKSwKKwkJCQkJIGJtc19uZXh0X21lbWJlcihyaW5mby0+bGVm dF9yZWxpZHMsIC0xKSk7CisKKwkJaWYgKGVxdWFsKGxlZnRleHByLCByaWdodGV4cHIpKQor CQkJc2pvaW5xdWFscyA9IGxhcHBlbmQoc2pvaW5xdWFscywgcmluZm8pOworCQllbHNlCisJ CQlvam9pbnF1YWxzID0gbGFwcGVuZChvam9pbnF1YWxzLCByaW5mbyk7CisJfQorCisJKnNl bGZqb2lucXVhbHMgPSBzam9pbnF1YWxzOworCSpvdGhlcmpvaW5xdWFscyA9IG9qb2lucXVh bHM7Cit9CisKKy8qCisgKiBGaW5kIGFuZCByZW1vdmUgdW5pcXVlIHNlbGYgam9pbnMgaW4g YSBncm91cCBvZiBiYXNlIHJlbGF0aW9ucyB0aGF0IGhhdmUKKyAqIHRoZSBzYW1lIE9pZC4K KyAqCisgKiBSZXR1cm5zIGEgc2V0IG9mIHJlbGlkcyB0aGF0IHdlcmUgcmVtb3ZlZC4KKyAq Lworc3RhdGljIFJlbGlkcworcmVtb3ZlX3NlbGZfam9pbnNfb25lX2dyb3VwKFBsYW5uZXJJ bmZvICpyb290LCBSZWxpZHMgcmVsaWRzKQoreworCVJlbGlkcyBqb2lucmVsaWRzID0gTlVM TDsKKwlSZWxpZHMgcmVzdWx0ID0gTlVMTDsKKwlpbnQgazsgLyogSW5kZXggb2Yga2VwdCBy ZWxhdGlvbiAqLworCWludCByID0gLTE7IC8qIEluZGV4IG9mIHJlbW92ZWQgcmVsYXRpb24g Ki8KKworCWlmIChibXNfbnVtX21lbWJlcnMocmVsaWRzKSA8IDIpCisJCXJldHVybiBOVUxM OworCisJd2hpbGUgKChyID0gYm1zX25leHRfbWVtYmVyKHJlbGlkcywgcikpID4gMCkKKwl7 CisJCVJlbE9wdEluZm8gKm91dGVyID0gcm9vdC0+c2ltcGxlX3JlbF9hcnJheVtyXTsKKwkJ ayA9IHI7CisKKwkJd2hpbGUgKChrID0gYm1zX25leHRfbWVtYmVyKHJlbGlkcywgaykpID4g MCkKKwkJeworCQkJUmVsT3B0SW5mbwkqaW5uZXIgPSByb290LT5zaW1wbGVfcmVsX2FycmF5 W2tdOworCQkJTGlzdAkgICAqcmVzdHJpY3RsaXN0OworCQkJTGlzdAkgICAqc2VsZmpvaW5x dWFsczsKKwkJCUxpc3QJICAgKm90aGVyam9pbnF1YWxzOworCQkJTGlzdENlbGwJKmxjOwor CQkJYm9vbAkJamluZm9fY2hlY2sgPSB0cnVlOworCQkJUGxhblJvd01hcmsJKm9tYXJrID0g TlVMTDsKKwkJCVBsYW5Sb3dNYXJrCSppbWFyayA9IE5VTEw7CisKKwkJCS8qIEEgc2FuaXR5 IGNoZWNrOiB0aGUgcmVsYXRpb25zIGhhdmUgdGhlIHNhbWUgT2lkLiAqLworCQkJQXNzZXJ0 KHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlba10tPnJlbGlkID09CisJCQkJICAgcm9vdC0+c2lt cGxlX3J0ZV9hcnJheVtyXS0+cmVsaWQpOworCisJCQkvKgorCQkJICogSXQgaXMgaW1wb3Nz aWJsZSB0byBvcHRpbWl6ZSB0d28gcmVsYXRpb25zIGlmIHRoZXkgYmVsb25nIHRvCisJCQkg KiBkaWZmZXJlbnQgcnVsZXMgb2Ygb3JkZXIgcmVzdHJpY3Rpb24uIE90aGVyd2lzZSBwbGFu bmVyIGNhbid0CisJCQkgKiBiZSBhYmxlIHRvIGZpbmQgYW55IHZhcmlhbnRzIG9mIGNvcnJl Y3QgcXVlcnkgcGxhbi4KKwkJCSAqLworCQkJZm9yZWFjaChsYywgcm9vdC0+am9pbl9pbmZv X2xpc3QpCisJCQl7CisJCQkJU3BlY2lhbEpvaW5JbmZvICppbmZvID0gKFNwZWNpYWxKb2lu SW5mbyAqKSBsZmlyc3QobGMpOworCisJCQkJaWYgKGJtc19pc19tZW1iZXIoaywgaW5mby0+ c3luX2xlZnRoYW5kKSAmJgorCQkJCQkhYm1zX2lzX21lbWJlcihyLCBpbmZvLT5zeW5fbGVm dGhhbmQpKQorCQkJCQlqaW5mb19jaGVjayA9IGZhbHNlOworCQkJCWVsc2UgaWYgKGJtc19p c19tZW1iZXIoaywgaW5mby0+c3luX3JpZ2h0aGFuZCkgJiYKKwkJCQkJIWJtc19pc19tZW1i ZXIociwgaW5mby0+c3luX3JpZ2h0aGFuZCkpCisJCQkJCWppbmZvX2NoZWNrID0gZmFsc2U7 CisJCQkJZWxzZSBpZiAoYm1zX2lzX21lbWJlcihyLCBpbmZvLT5zeW5fbGVmdGhhbmQpICYm CisJCQkJCSFibXNfaXNfbWVtYmVyKGssIGluZm8tPnN5bl9sZWZ0aGFuZCkpCisJCQkJCWpp bmZvX2NoZWNrID0gZmFsc2U7CisJCQkJZWxzZSBpZiAoYm1zX2lzX21lbWJlcihyLCBpbmZv LT5zeW5fcmlnaHRoYW5kKSAmJgorCQkJCQkhYm1zX2lzX21lbWJlcihrLCBpbmZvLT5zeW5f cmlnaHRoYW5kKSkKKwkJCQkJamluZm9fY2hlY2sgPSBmYWxzZTsKKworCQkJCWlmICghamlu Zm9fY2hlY2spCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoIWppbmZvX2NoZWNrKQor CQkJCWNvbnRpbnVlOworCisJCQkvKiBSZXVzZSBqb2lucmVsaWRzIGJpdHNldCB0byBhdm9p ZCByZWFsbG9jYXRpb24uICovCisJCQlqb2lucmVsaWRzID0gYm1zX2RlbF9tZW1iZXJzKGpv aW5yZWxpZHMsIGpvaW5yZWxpZHMpOworCisJCQkvKgorCQkJICogV2Ugb25seSBkZWFsIHdp dGggYmFzZSByZWxzIGhlcmUsIHNvIHRoZWlyIHJlbGlkcyBiaXRzZXQKKwkJCSAqIGNvbnRh aW5zIG9ubHkgb25lIG1lbWJlciAtLSB0aGVpciByZWxpZC4KKwkJCSAqLworCQkJam9pbnJl bGlkcyA9IGJtc19hZGRfbWVtYmVyKGpvaW5yZWxpZHMsIHIpOworCQkJam9pbnJlbGlkcyA9 IGJtc19hZGRfbWVtYmVyKGpvaW5yZWxpZHMsIGspOworCisJCQkvKiBJcyBpdCBhIHVuaXF1 ZSBzZWxmIGpvaW4/ICovCisJCQlyZXN0cmljdGxpc3QgPSBidWlsZF9qb2lucmVsX3Jlc3Ry aWN0bGlzdChyb290LCBqb2lucmVsaWRzLCBvdXRlciwKKwkJCQkJCQkJCQkJCQkgIGlubmVy KTsKKworCQkJLyoKKwkJCSAqIFByb2Nlc3MgcmVzdHJpY3RsaXN0IHRvIHNlcGVyYXRlIG91 dCB0aGUgc2VsZiBqb2luIHF1YWxzIGZyb20KKwkJCSAqIHRoZSBvdGhlciBxdWFscy4gZS5n IHggPSB4IGdvZXMgdG8gc2VsZmpvaW5xdWFscyBhbmQgYSA9IGIgdG8KKwkJCSAqIG90aGVy am9pbnF1YWxzLgorCQkJICovCisJCQlzcGxpdF9zZWxmam9pbl9xdWFscyhyb290LCByZXN0 cmljdGxpc3QsICZzZWxmam9pbnF1YWxzLAorCQkJCQkJCQkgJm90aGVyam9pbnF1YWxzKTsK KworCQkJaWYgKGxpc3RfbGVuZ3RoKHNlbGZqb2lucXVhbHMpID09IDApCisJCQl7CisJCQkJ LyoKKwkJCQkgKiBYWFg6CisJCQkJICogd2Ugd291bGQgZGV0ZWN0IHNlbGYtam9pbiB3aXRo b3V0IHF1YWxzIGxpa2UgJ3g9PXgnIGlmIHdlIGhhZAorCQkJCSAqIGFuIGZvcmVpZ24ga2V5 IGNvbnN0cmFpbnQgb24gc29tZSBvZiBvdGhlciBxdWFscyBhbmQgdGhpcyBqb2luCisJCQkJ ICogaGF2ZW4ndCBhbnkgY29sdW1ucyBmcm9tIHRoZSBvdXRlciBpbiB0aGUgdGFyZ2V0IGxp c3QuCisJCQkJICogQnV0IGl0IGlzIHN0aWxsIGNvbXBsZXggdGFzay4KKwkJCQkgKi8KKwkJ CQljb250aW51ZTsKKwkJCX0KKworCQkJLyoKKwkJCSAqIERldGVybWluZSBpZiB0aGUgaW5u ZXIgdGFibGUgY2FuIGR1cGxpY2F0ZSBvdXRlciByb3dzLiAgV2UgbXVzdAorCQkJICogYnlw YXNzIHRoZSB1bmlxdWUgcmVsIGNhY2hlIGhlcmUgc2luY2Ugd2UncmUgcG9zc2libHkgdXNp bmcgYQorCQkJICogc3Vic2V0IG9mIGpvaW4gcXVhbHMuIFdlIGNhbiB1c2UgJ2ZvcmNlX2Nh Y2hlJyA9IHRydWUgd2hlbiBhbGwKKwkJCSAqIGpvaW4gcXVhbHMgYXJlIHNlbGZqb2luIHF1 YWxzLiAgT3RoZXJ3aXNlIHdlIGNvdWxkIGVuZCB1cAorCQkJICogcHV0dGluZyBmYWxzZSBu ZWdhdGl2ZXMgaW4gdGhlIGNhY2hlLgorCQkJICovCisJCQlpZiAoIWlubmVycmVsX2lzX3Vu aXF1ZShyb290LCBqb2lucmVsaWRzLCBvdXRlci0+cmVsaWRzLAorCQkJCQkJCQkJaW5uZXIs IEpPSU5fSU5ORVIsIHNlbGZqb2lucXVhbHMsCisJCQkJCQkJCQlsaXN0X2xlbmd0aChvdGhl cmpvaW5xdWFscykgPT0gMCkpCisJCQkJY29udGludWU7CisKKwkJCS8qIFNlZSBmb3Igcm93 IG1hcmtzLiAqLworCQkJZm9yZWFjaCAobGMsIHJvb3QtPnJvd01hcmtzKQorCQkJeworCQkJ CVBsYW5Sb3dNYXJrICpyb3dNYXJrID0gKFBsYW5Sb3dNYXJrICopIGxmaXJzdChsYyk7CisK KwkJCQlpZiAocm93TWFyay0+cnRpID09IGspCisJCQkJeworCQkJCQlBc3NlcnQoaW1hcmsg PT0gTlVMTCk7CisJCQkJCWltYXJrID0gcm93TWFyazsKKwkJCQl9CisJCQkJZWxzZSBpZiAo cm93TWFyay0+cnRpID09IHIpCisJCQkJeworCQkJCQlBc3NlcnQob21hcmsgPT0gTlVMTCk7 CisJCQkJCW9tYXJrID0gcm93TWFyazsKKwkJCQl9CisKKwkJCQlpZiAob21hcmsgJiYgaW1h cmspCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogV2UgY2FuJ3QgcmVtb3Zl IHRoZSBqb2luIGlmIHRoZSByZWxhdGlvbnMgaGF2ZSByb3cgbWFya3Mgb2YKKwkJCSAqIGRp ZmZlcmVudCBzdHJlbmd0aCAoZS5nLiBvbmUgaXMgbG9ja2VkIEZPUiBVUERBVEUgYW5kIGFu b3RoZXIKKwkJCSAqIGp1c3QgaGFzIFJPV19NQVJLX1JFRkVSRU5DRSBmb3IgRXZhbFBsYW5R dWFsIHJlY2hlY2tpbmcpLgorCQkJICovCisJCQlpZiAob21hcmsgJiYgaW1hcmsgJiYgb21h cmstPm1hcmtUeXBlICE9IGltYXJrLT5tYXJrVHlwZSkKKwkJCQljb250aW51ZTsKKworCQkJ LyoKKwkJCSAqIEJlIHNhZmUgdG8gZG8gbm90IHJlbW92ZSB0YWJsZSBwYXJ0aWNpcGF0ZWQg aW4gY29tcGxpY2F0ZWQgUEgKKwkJCSAqLworCQkJZm9yZWFjaChsYywgcm9vdC0+cGxhY2Vo b2xkZXJfbGlzdCkKKwkJCXsKKwkJCQlQbGFjZUhvbGRlckluZm8gKnBoaW5mbyA9IChQbGFj ZUhvbGRlckluZm8gKikgbGZpcnN0KGxjKTsKKworCQkJCS8qIHRoZXJlIGlzbid0IGFueSBv dGhlciBwbGFjZSB0byBldmFsIFBIViAqLworCQkJCWlmIChibXNfaXNfc3Vic2V0KHBoaW5m by0+cGhfZXZhbF9hdCwgam9pbnJlbGlkcykgfHwKKwkJCQkJYm1zX2lzX3N1YnNldChwaGlu Zm8tPnBoX25lZWRlZCwgam9pbnJlbGlkcykpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlp ZiAobGMpCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBXZSBjYW4gcmVtb3ZlIGVp dGhlciByZWxhdGlvbiwgc28gcmVtb3ZlIHRoZSBvdXRlciBvbmUsIHRvCisJCQkgKiBzaW1w bGlmeSB0aGlzIGxvb3AuCisJCQkgKi8KKworCQkJLyoKKwkJCSAqIEFkZCBqb2luIHJlc3Ry aWN0aW9ucyB0byBqb2luaW5mbyBvZiByZW1vdmluZyByZWxhdGlvbiB0byBzaW1wbGlmeQor CQkJICogdGhlIHJlbGlkcyByZXBsYWNpbmcgcHJvY2VkdXJlLgorCQkJICovCisJCQlvdXRl ci0+am9pbmluZm8gPSBsaXN0X2NvbmNhdChvdXRlci0+am9pbmluZm8sIHJlc3RyaWN0bGlz dCk7CisKKwkJCS8qIEZpcnN0bHksIHJlcGxhY2UgaW5kZXggb2YgZXhjbHVkaW5nIHJlbGF0 aW9uIHdpdGgga2VlcGluZy4gKi8KKwkJCXJlbW92ZV9yZWxfZnJvbV9xdWVyeShyb290LCBv dXRlci0+cmVsaWQsIGpvaW5yZWxpZHMsIGlubmVyLT5yZWxpZCk7CisKKwkJCS8qIFNlY29u ZGx5LCBmaXggcmVzdHJpY3Rpb25zIG9mIGtlZXBpbmcgcmVsYXRpb24gKi8KKwkJCXJlbW92 ZV9zZWxmX2pvaW5fcmVsKHJvb3QsIGltYXJrLCBvbWFyaywgaW5uZXIsIG91dGVyKTsKKwkJ CXJlc3VsdCA9IGJtc19hZGRfbWVtYmVyKHJlc3VsdCwgcik7CisKKwkJCS8qIFdlIHJlbW92 ZWQgdGhlIG91dGVyIHJlbGF0aW9uLCB0cnkgdGhlIG5leHQgb25lLiAqLworCQkJYnJlYWs7 CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogSXRlcmF0aXZlbHkg Zm9ybSBhIGdyb3VwIG9mIHJlbGF0aW9uIGluZGV4ZXMgd2l0aCB0aGUgc2FtZSBvaWQgYW5k IGxhdW5jaAorICogdGhlIHJvdXRpbmUgdGhhdCBkZXRlY3RzIHNlbGYtam9pbnMgaW4gdGhp cyBncm91cCBhbmQgcmVtb3ZlcyBleGNlc3NpdmUKKyAqIHJhbmdlIHRhYmxlIGVudHJpZXMu CisgKgorICogQXQgdGhlIGVuZCBvZiBpdGVyYXRpb24sIGV4Y2x1ZGUgdGhlIGdyb3VwIGZy b20gdGhlIG92ZXJhbGwgcmVsaWRzIGxpc3QuCisgKiBTbyBlYWNoIG5leHQgaXRlcmF0aW9u IG9mIHRoZSBjeWNsZSB3aWxsIGludm9sdmUgbGVzcyBhbmQgbGVzcyB2YWx1ZSBvZgorICog cmVsaWRzLgorICovCitzdGF0aWMgUmVsaWRzCityZW1vdmVfc2VsZl9qb2luc19vbmVfbGV2 ZWwoUGxhbm5lckluZm8gKnJvb3QsIFJlbGlkcyByZWxpZHMsIFJlbGlkcyBUb1JlbW92ZSkK K3sKKwl3aGlsZSAoIWJtc19pc19lbXB0eShyZWxpZHMpKQorCXsKKwkJUmVsaWRzIGdyb3Vw ID0gTlVMTDsKKwkJT2lkIGdyb3VwT2lkOworCQlpbnQgaTsKKworCQlpID0gYm1zX2ZpcnN0 X21lbWJlcihyZWxpZHMpOworCQlncm91cE9pZCA9IHJvb3QtPnNpbXBsZV9ydGVfYXJyYXlb aV0tPnJlbGlkOworCQlBc3NlcnQoT2lkSXNWYWxpZChncm91cE9pZCkpOworCQlncm91cCA9 IGJtc19hZGRfbWVtYmVyKGdyb3VwLCBpKTsKKworCQkvKiBDcmVhdGUgZ3JvdXAgb2YgcmVs YXRpb24gaW5kZXhlcyB3aXRoIHRoZSBzYW1lIG9pZC4gKi8KKwkJd2hpbGUgKChpID0gYm1z X25leHRfbWVtYmVyKHJlbGlkcywgaSkpID4gMCkKKwkJeworCQkJUmFuZ2VUYmxFbnRyeSAq cnRlID0gcm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtpXTsKKworCQkJQXNzZXJ0KE9pZElzVmFs aWQocnRlLT5yZWxpZCkpOworCisJCQlpZiAocnRlLT5yZWxpZCA9PSBncm91cE9pZCkKKwkJ CQlncm91cCA9IGJtc19hZGRfbWVtYmVyKGdyb3VwLCBpKTsKKwkJfQorCisJCXJlbGlkcyA9 IGJtc19kZWxfbWVtYmVycyhyZWxpZHMsIGdyb3VwKTsKKwkJVG9SZW1vdmUgPSBibXNfYWRk X21lbWJlcnMoVG9SZW1vdmUsCisJCQkJCQkJCSAgIHJlbW92ZV9zZWxmX2pvaW5zX29uZV9n cm91cChyb290LCBncm91cCkpOworCQlibXNfZnJlZShncm91cCk7CisJfQorCXJldHVybiBU b1JlbW92ZTsKK30KKworLyoKKyAqIEZvciBlYWNoIGxldmVsIG9mIGpvaW5saXN0IGZvcm0g YSBzZXQgb2YgYmFzZSByZWxhdGlvbnMgYW5kIGxhdW5jaCB0aGUKKyAqIHJvdXRpbmUgb2Yg dGhlIHNlbGYtam9pbiByZW1vdmFsIG9wdGltaXphdGlvbi4gUmVjdXJzZSBpbnRvIHN1Yi1q b2lubGlzdHMgdG8KKyAqIGhhbmRsZSBkZWVwZXIgbGV2ZWxzLgorICovCitzdGF0aWMgUmVs aWRzCityZW1vdmVfc2VsZl9qb2luc19yZWN1cnNlKFBsYW5uZXJJbmZvICpyb290LCBMaXN0 ICpqb2lubGlzdCwgUmVsaWRzIFRvUmVtb3ZlKQoreworCUxpc3RDZWxsICpsYzsKKwlSZWxp ZHMgcmVsaWRzID0gTlVMTDsKKworCS8qIENvbGxlY3QgdGhlIGlkcyBvZiBiYXNlIHJlbGF0 aW9ucyBhdCBvbmUgbGV2ZWwgb2YgdGhlIGpvaW4gdHJlZS4gKi8KKwlmb3JlYWNoIChsYywg am9pbmxpc3QpCisJeworCQlzd2l0Y2ggKCgoTm9kZSAqKSBsZmlyc3QobGMpKS0+dHlwZSkK KwkJeworCQkJY2FzZSBUX0xpc3Q6CisJCQkJLyogUmVjdXJzaXZlbHkgZ28gaW5zaWRlIHRo ZSBzdWItam9pbmxpc3QgKi8KKwkJCQlUb1JlbW92ZSA9IHJlbW92ZV9zZWxmX2pvaW5zX3Jl Y3Vyc2Uocm9vdCwKKwkJCQkJCQkJCQkJCQkgKExpc3QgKikgbGZpcnN0KGxjKSwKKwkJCQkJ CQkJCQkJCQkgVG9SZW1vdmUpOworCQkJCWJyZWFrOworCQkJY2FzZSBUX1JhbmdlVGJsUmVm OgorCQkJeworCQkJCVJhbmdlVGJsUmVmICpyZWYgPSAoUmFuZ2VUYmxSZWYgKikgbGZpcnN0 KGxjKTsKKwkJCQlSYW5nZVRibEVudHJ5ICpydGUgPSByb290LT5zaW1wbGVfcnRlX2FycmF5 W3JlZi0+cnRpbmRleF07CisKKwkJCQkvKgorCQkJCSAqIFdlIG9ubHkgY2FyZSBhYm91dCBi YXNlIHJlbGF0aW9ucyBmcm9tIHdoaWNoIHdlIHNlbGVjdAorCQkJCSAqIHNvbWV0aGluZy4K KwkJCQkgKi8KKwkJCQlpZiAocnRlLT5ydGVraW5kICE9IFJURV9SRUxBVElPTiB8fAorCQkJ CQlydGUtPnJlbGtpbmQgIT0gUkVMS0lORF9SRUxBVElPTiB8fAorCQkJCQlyb290LT5zaW1w bGVfcmVsX2FycmF5W3JlZi0+cnRpbmRleF0gPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisKKwkJ CQlBc3NlcnQoIWJtc19pc19tZW1iZXIocmVmLT5ydGluZGV4LCByZWxpZHMpKTsKKwkJCQly ZWxpZHMgPSBibXNfYWRkX21lbWJlcihyZWxpZHMsIHJlZi0+cnRpbmRleCk7CisKKwkJCQkv KgorCQkJCSAqIExpbWl0IHRoZSBudW1iZXIgb2Ygam9pbnMgd2UgcHJvY2VzcyB0byBjb250 cm9sIHRoZSBxdWFkcmF0aWMKKwkJCQkgKiBiZWhhdmlvci4KKwkJCQkgKi8KKwkJCQlpZiAo Ym1zX251bV9tZW1iZXJzKHJlbGlkcykgPiBqb2luX2NvbGxhcHNlX2xpbWl0KQorCQkJCQli cmVhazsKKwkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQXNzZXJ0KGZhbHNl KTsKKwkJfQorCX0KKworCWlmIChibXNfbnVtX21lbWJlcnMocmVsaWRzKSA+PSAyKQorCQlU b1JlbW92ZSA9IHJlbW92ZV9zZWxmX2pvaW5zX29uZV9sZXZlbChyb290LCByZWxpZHMsIFRv UmVtb3ZlKTsKKworCWJtc19mcmVlKHJlbGlkcyk7CisJcmV0dXJuIFRvUmVtb3ZlOworfQor CisvKgorICogRmluZCBhbmQgcmVtb3ZlIHVzZWxlc3Mgc2VsZiBqb2lucy4KKyAqCisgKiBX ZSBzZWFyY2ggZm9yIGpvaW5zIHdoZXJlIHRoZSBzYW1lIHJlbGF0aW9uIGlzIGpvaW5lZCB0 byBpdHNlbGYgb24gYWxsCisgKiBjb2x1bW5zIG9mIHNvbWUgdW5pcXVlIGluZGV4LiBJZiB0 aGlzIGNvbmRpdGlvbiBob2xkcywgdGhlbiwgZm9yCisgKiBlYWNoIG91dGVyIHJvdywgb25s eSBvbmUgaW5uZXIgcm93IG1hdGNoZXMsIGFuZCBpdCBpcyB0aGUgc2FtZSByb3cKKyAqIG9m IHRoZSBzYW1lIHJlbGF0aW9uLiBUaGlzIGFsbG93cyB1cyB0byByZW1vdmUgdGhlIGpvaW4g YW5kIHJlcGxhY2UKKyAqIGl0IHdpdGggYSBzY2FuIHRoYXQgY29tYmluZXMgV0hFUkUgY2xh dXNlcyBmcm9tIGJvdGggc2lkZXMuIFRoZSBqb2luCisgKiBjbGF1c2VzIHRoZW1zZWx2ZXMg YXNzdW1lIHRoZSBmb3JtIG9mIFggPSBYIGFuZCBjYW4gYmUgcmVwbGFjZWQgd2l0aAorICog Tk9UIE5VTEwgY2xhdXNlcy4KKyAqCisgKiBGb3IgdGhlIHNha2Ugb2Ygc2ltcGxpY2l0eSwg d2UgZG9uJ3QgYXBwbHkgdGhpcyBvcHRpbWl6YXRpb24gdG8gc3BlY2lhbAorICogam9pbnMu IEhlcmUgaXMgYSBsaXN0IG9mIHdoYXQgd2UgY291bGQgZG8gaW4gc29tZSBwYXJ0aWN1bGFy IGNhc2VzOgorICogJ2EgYTEgc2VtaSBqb2luIGEgYTInOiBpcyByZWR1Y2VkIHRvIGlubmVy IGJ5IHJlZHVjZV91bmlxdWVfc2VtaWpvaW5zLAorICogYW5kIHRoZW4gcmVtb3ZlZCBub3Jt YWxseS4KKyAqICdhIGExIGFudGkgam9pbiBhIGEyJzogY291bGQgc2ltcGxpZnkgdG8gYSBz Y2FuIHdpdGggJ291dGVyIHF1YWxzIEFORAorICogKElTIE5VTEwgb24gam9pbiBjb2x1bW5z IE9SIE5PVCBpbm5lciBxdWFscyknLgorICogJ2EgYTEgbGVmdCBqb2luIGEgYTInOiBjb3Vs ZCBzaW1wbGlmeSB0byBhIHNjYW4gbGlrZSBpbm5lciwgYnV0IHdpdGhvdXQKKyAqIE5PVCBO VUxMIGNvbmRpdGlvbnMgb24gam9pbiBjb2x1bW5zLgorICogJ2EgYTEgbGVmdCBqb2luIChh IGEyIGpvaW4gYiknOiBjYW4ndCBzaW1wbGlmeSB0aGlzLCBiZWNhdXNlIGpvaW4gdG8gYgor ICogY2FuIGJvdGggcmVtb3ZlIHJvd3MgYW5kIGludHJvZHVjZSBkdXBsaWNhdGVzLgorICoK KyAqIFRvIHNlYXJjaCBmb3IgcmVtb3ZhYmxlIGpvaW5zLCB3ZSBvcmRlciBhbGwgdGhlIHJl bGF0aW9ucyBvbiB0aGVpciBPaWQsCisgKiBnbyBvdmVyIGVhY2ggc2V0IHdpdGggdGhlIHNh bWUgT2lkLCBhbmQgY29uc2lkZXIgZWFjaCBwYWlyIG9mIHJlbGF0aW9ucworICogaW4gdGhp cyBzZXQuIFdlIGNoZWNrIHRoYXQgYm90aCByZWxhdGlvbiBhcmUgbWFkZSB1bmlxdWUgYnkg dGhlIHNhbWUKKyAqIHVuaXF1ZSBpbmRleCB3aXRoIHRoZSBzYW1lIGNsYXVzZXMuCisgKgor ICogVG8gcmVtb3ZlIHRoZSBqb2luLCB3ZSBtYXJrIG9uZSBvZiB0aGUgcGFydGljaXBhdGlu ZyByZWxhdGlvbnMgYXMKKyAqIGRlYWQsIGFuZCByZXdyaXRlIGFsbCByZWZlcmVuY2VzIHRv IGl0IHRvIHBvaW50IHRvIHRoZSByZW1haW5pbmcKKyAqIHJlbGF0aW9uLiBUaGlzIGluY2x1 ZGVzIG1vZGlmeWluZyBSZXN0cmljdEluZm9zLCBFcXVpdmFsZW5jZUNsYXNzZXMgYW5kCisg KiBFcXVpdmFsZW5jZU1lbWJlcnMuIFdlIGFsc28gaGF2ZSB0byBtb2RpZnkgdGhlIHJvdyBt YXJrcy4gVGhlIGpvaW4gY2xhdXNlcworICogb2YgdGhlIHJlbW92ZWQgcmVsYXRpb24gYmVj b21lIGVpdGhlciByZXN0cmljdGlvbiBvciBqb2luIGNsYXVzZXMsIGJhc2VkIG9uCisgKiB3 aGV0aGVyIHRoZXkgcmVmZXJlbmNlIGFueSByZWxhdGlvbnMgbm90IHBhcnRpY2lwYXRpbmcg aW4gdGhlIHJlbW92ZWQgam9pbi4KKyAqCisgKiAndGFyZ2V0bGlzdCcgaXMgdGhlIHRvcC1s ZXZlbCB0YXJnZXRsaXN0IG9mIHF1ZXJ5LiBJZiBpdCBoYXMgYW55IHJlZmVyZW5jZXMKKyAq IHRvIHRoZSByZW1vdmVkIHJlbGF0aW9ucywgd2UgdXBkYXRlIHRoZW0gdG8gcG9pbnQgdG8g dGhlIHJlbWFpbmluZyBvbmVzLgorICovCitMaXN0ICoKK3JlbW92ZV91c2VsZXNzX3NlbGZf am9pbnMoUGxhbm5lckluZm8gKnJvb3QsIExpc3QgKmpvaW5saXN0KQoreworCVJlbGlkcyBU b1JlbW92ZSA9IE5VTEw7CisJaW50IHJlbGlkID0gLTE7CisKKwlpZiAoIWVuYWJsZV9zZWxm X2pvaW5fcmVtb3ZhbCkKKwkJcmV0dXJuIGpvaW5saXN0OworCisJLyoKKwkgKiBNZXJnZSBw YWlycyBvZiByZWxhdGlvbnMgcGFydGljaXBhdGVkIGluIHNlbGYtam9pbi4gUmVtb3ZlCisJ ICogdW5uZWNlc3NhcnkgcmFuZ2UgdGFibGUgZW50cmllcy4KKwkgKi8KKwlUb1JlbW92ZSA9 IHJlbW92ZV9zZWxmX2pvaW5zX3JlY3Vyc2Uocm9vdCwgam9pbmxpc3QsIFRvUmVtb3ZlKTsK Kwl3aGlsZSAoKHJlbGlkID0gYm1zX25leHRfbWVtYmVyKFRvUmVtb3ZlLCByZWxpZCkpID49 IDApCisJeworCQlpbnQgbnJlbW92ZWQgPSAwOworCQlqb2lubGlzdCA9IHJlbW92ZV9yZWxf ZnJvbV9qb2lubGlzdChqb2lubGlzdCwgcmVsaWQsICZucmVtb3ZlZCk7CisJfQorCisJcmV0 dXJuIGpvaW5saXN0OworfQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3Bs YW4vcGxhbm1haW4uYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL3BsYW5tYWluLmMK aW5kZXggYzkyZGRkMjdlZC4uOGY2ZDVlNTYzOSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQv b3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv cGxhbi9wbGFubWFpbi5jCkBAIC0yMjYsNiArMjI2LDExIEBAIHF1ZXJ5X3BsYW5uZXIoUGxh bm5lckluZm8gKnJvb3QsCiAJICovCiAJcmVkdWNlX3VuaXF1ZV9zZW1pam9pbnMocm9vdCk7 CiAKKwkvKgorCSAqIFJlbW92ZSBzZWxmIGpvaW5zIG9uIGEgdW5pcXVlIGNvbHVtbi4KKwkg Ki8KKwlqb2lubGlzdCA9IHJlbW92ZV91c2VsZXNzX3NlbGZfam9pbnMocm9vdCwgam9pbmxp c3QpOworCiAJLyoKIAkgKiBOb3cgZGlzdHJpYnV0ZSAicGxhY2Vob2xkZXJzIiB0byBiYXNl IHJlbHMgYXMgbmVlZGVkLiAgVGhpcyBoYXMgdG8gYmUKIAkgKiBkb25lIGFmdGVyIGpvaW4g cmVtb3ZhbCBiZWNhdXNlIHJlbW92YWwgY291bGQgY2hhbmdlIHdoZXRoZXIgYQpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvam9pbmluZm8uYyBiL3NyYy9iYWNr ZW5kL29wdGltaXplci91dGlsL2pvaW5pbmZvLmMKaW5kZXggZDRjZmZkYjE5OC4uZGQzZTMy M2YyMSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvam9pbmluZm8u YworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9qb2luaW5mby5jCkBAIC0xMzAs NiArMTMwLDkgQEAgcmVtb3ZlX2pvaW5fY2xhdXNlX2Zyb21fcmVscyhQbGFubmVySW5mbyAq cm9vdCwKIAl7CiAJCVJlbE9wdEluZm8gKnJlbCA9IGZpbmRfYmFzZV9yZWwocm9vdCwgY3Vy X3JlbGlkKTsKIAorCQlpZiAoIWxpc3RfbWVtYmVyX3B0cihyZWwtPmpvaW5pbmZvLCByZXN0 cmljdGluZm8pKQorCQkJY29udGludWU7CisKIAkJLyoKIAkJICogUmVtb3ZlIHRoZSByZXN0 cmljdGluZm8gZnJvbSB0aGUgbGlzdC4gIFBvaW50ZXIgY29tcGFyaXNvbiBpcwogCQkgKiBz dWZmaWNpZW50LgpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVs bm9kZS5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVsbm9kZS5jCmluZGV4IDUy MDQwOWY0YmEuLjJlNzNjYWNjMGQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXpl ci91dGlsL3JlbG5vZGUuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9yZWxu b2RlLmMKQEAgLTQwLDE0ICs0MCwxMCBAQCB0eXBlZGVmIHN0cnVjdCBKb2luSGFzaEVudHJ5 CiAKIHN0YXRpYyB2b2lkIGJ1aWxkX2pvaW5yZWxfdGxpc3QoUGxhbm5lckluZm8gKnJvb3Qs IFJlbE9wdEluZm8gKmpvaW5yZWwsCiAJCQkJCQkJCVJlbE9wdEluZm8gKmlucHV0X3JlbCk7 Ci1zdGF0aWMgTGlzdCAqYnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3QoUGxhbm5lckluZm8g KnJvb3QsCi0JCQkJCQkJCQkJUmVsT3B0SW5mbyAqam9pbnJlbCwKLQkJCQkJCQkJCQlSZWxP cHRJbmZvICpvdXRlcl9yZWwsCi0JCQkJCQkJCQkJUmVsT3B0SW5mbyAqaW5uZXJfcmVsKTsK IHN0YXRpYyB2b2lkIGJ1aWxkX2pvaW5yZWxfam9pbmxpc3QoUmVsT3B0SW5mbyAqam9pbnJl bCwKIAkJCQkJCQkJICAgUmVsT3B0SW5mbyAqb3V0ZXJfcmVsLAogCQkJCQkJCQkgICBSZWxP cHRJbmZvICppbm5lcl9yZWwpOwotc3RhdGljIExpc3QgKnN1YmJ1aWxkX2pvaW5yZWxfcmVz dHJpY3RsaXN0KFJlbE9wdEluZm8gKmpvaW5yZWwsCitzdGF0aWMgTGlzdCAqc3ViYnVpbGRf am9pbnJlbF9yZXN0cmljdGxpc3QoUmVsaWRzIGpvaW5yZWxpZHMsCiAJCQkJCQkJCQkJICAg TGlzdCAqam9pbmluZm9fbGlzdCwKIAkJCQkJCQkJCQkgICBMaXN0ICpuZXdfcmVzdHJpY3Rs aXN0KTsKIHN0YXRpYyBMaXN0ICpzdWJidWlsZF9qb2lucmVsX2pvaW5saXN0KFJlbE9wdElu Zm8gKmpvaW5yZWwsCkBAIC02MDAsNyArNTk2LDcgQEAgYnVpbGRfam9pbl9yZWwoUGxhbm5l ckluZm8gKnJvb3QsCiAJCSAqLwogCQlpZiAocmVzdHJpY3RsaXN0X3B0cikKIAkJCSpyZXN0 cmljdGxpc3RfcHRyID0gYnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3Qocm9vdCwKLQkJCQkJ CQkJCQkJCQkJICAgam9pbnJlbCwKKwkJCQkJCQkJCQkJCQkJICAgam9pbnJlbC0+cmVsaWRz LAogCQkJCQkJCQkJCQkJCQkgICBvdXRlcl9yZWwsCiAJCQkJCQkJCQkJCQkJCSAgIGlubmVy X3JlbCk7CiAJCXJldHVybiBqb2lucmVsOwpAQCAtNzA3LDcgKzcwMyw3IEBAIGJ1aWxkX2pv aW5fcmVsKFBsYW5uZXJJbmZvICpyb290LAogCSAqIGNhbGxlciBtaWdodCBvciBtaWdodCBu b3QgbmVlZCB0aGUgcmVzdHJpY3RsaXN0LCBidXQgSSBuZWVkIGl0IGFueXdheQogCSAqIGZv ciBzZXRfam9pbnJlbF9zaXplX2VzdGltYXRlcygpLikKIAkgKi8KLQlyZXN0cmljdGxpc3Qg PSBidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChyb290LCBqb2lucmVsLAorCXJlc3RyaWN0 bGlzdCA9IGJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KHJvb3QsIGpvaW5yZWwtPnJlbGlk cywKIAkJCQkJCQkJCQkJICBvdXRlcl9yZWwsIGlubmVyX3JlbCk7CiAJaWYgKHJlc3RyaWN0 bGlzdF9wdHIpCiAJCSpyZXN0cmljdGxpc3RfcHRyID0gcmVzdHJpY3RsaXN0OwpAQCAtMTA1 OSw3ICsxMDU1LDcgQEAgYnVpbGRfam9pbnJlbF90bGlzdChQbGFubmVySW5mbyAqcm9vdCwg UmVsT3B0SW5mbyAqam9pbnJlbCwKICAqCSAgdGhlIHZhcmlvdXMgam9pbmxpc3QgZW50cmll cyB1bHRpbWF0ZWx5IHJlZmVyIHRvIFJlc3RyaWN0SW5mb3MKICAqCSAgcHVzaGVkIGludG8g dGhlbSBieSBkaXN0cmlidXRlX3Jlc3RyaWN0aW5mb190b19yZWxzKCkuCiAgKgotICogJ2pv aW5yZWwnIGlzIGEgam9pbiByZWxhdGlvbiBub2RlCisgKiAnam9pbnJlbGlkcycgaXMgYSBq b2luIHJlbGF0aW9uIGlkIHNldAogICogJ291dGVyX3JlbCcgYW5kICdpbm5lcl9yZWwnIGFy ZSBhIHBhaXIgb2YgcmVsYXRpb25zIHRoYXQgY2FuIGJlIGpvaW5lZAogICoJCXRvIGZvcm0g am9pbnJlbC4KICAqCkBAIC0xMDcyLDkgKzEwNjgsOSBAQCBidWlsZF9qb2lucmVsX3RsaXN0 KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpqb2lucmVsLAogICogUmVzdHJpY3RJ bmZvIG5vZGVzIGFyZSBubyBsb25nZXIgY29udGV4dC1kZXBlbmRlbnQuICBJbnN0ZWFkLCBq dXN0IGluY2x1ZGUKICAqIHRoZSBvcmlnaW5hbCBub2RlcyBpbiB0aGUgbGlzdHMgbWFkZSBm b3IgdGhlIGpvaW4gcmVsYXRpb24uCiAgKi8KLXN0YXRpYyBMaXN0ICoKK0xpc3QgKgogYnVp bGRfam9pbnJlbF9yZXN0cmljdGxpc3QoUGxhbm5lckluZm8gKnJvb3QsCi0JCQkJCQkgICBS ZWxPcHRJbmZvICpqb2lucmVsLAorCQkJCQkJICAgUmVsaWRzIGpvaW5yZWxpZHMsCiAJCQkJ CQkgICBSZWxPcHRJbmZvICpvdXRlcl9yZWwsCiAJCQkJCQkgICBSZWxPcHRJbmZvICppbm5l cl9yZWwpCiB7CkBAIC0xMDg1LDggKzEwODEsOCBAQCBidWlsZF9qb2lucmVsX3Jlc3RyaWN0 bGlzdChQbGFubmVySW5mbyAqcm9vdCwKIAkgKiBlbGltaW5hdGluZyBhbnkgZHVwbGljYXRl cyAoaW1wb3J0YW50IHNpbmNlIHdlIHdpbGwgc2VlIG1hbnkgb2YgdGhlCiAJICogc2FtZSBj bGF1c2VzIGFycml2aW5nIGZyb20gYm90aCBpbnB1dCByZWxhdGlvbnMpLgogCSAqLwotCXJl c3VsdCA9IHN1YmJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0KGpvaW5yZWwsIG91dGVyX3Jl bC0+am9pbmluZm8sIE5JTCk7Ci0JcmVzdWx0ID0gc3ViYnVpbGRfam9pbnJlbF9yZXN0cmlj dGxpc3Qoam9pbnJlbCwgaW5uZXJfcmVsLT5qb2luaW5mbywgcmVzdWx0KTsKKwlyZXN1bHQg PSBzdWJidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChqb2lucmVsaWRzLCBvdXRlcl9yZWwt PmpvaW5pbmZvLCBOSUwpOworCXJlc3VsdCA9IHN1YmJ1aWxkX2pvaW5yZWxfcmVzdHJpY3Rs aXN0KGpvaW5yZWxpZHMsIGlubmVyX3JlbC0+am9pbmluZm8sIHJlc3VsdCk7CiAKIAkvKgog CSAqIEFkZCBvbiBhbnkgY2xhdXNlcyBkZXJpdmVkIGZyb20gRXF1aXZhbGVuY2VDbGFzc2Vz LiAgVGhlc2UgY2Fubm90IGJlCkBAIC0xMDk1LDcgKzEwOTEsNyBAQCBidWlsZF9qb2lucmVs X3Jlc3RyaWN0bGlzdChQbGFubmVySW5mbyAqcm9vdCwKIAkgKi8KIAlyZXN1bHQgPSBsaXN0 X2NvbmNhdChyZXN1bHQsCiAJCQkJCQkgZ2VuZXJhdGVfam9pbl9pbXBsaWVkX2VxdWFsaXRp ZXMocm9vdCwKLQkJCQkJCQkJCQkJCQkJICBqb2lucmVsLT5yZWxpZHMsCisJCQkJCQkJCQkJ CQkJCSAgam9pbnJlbGlkcywKIAkJCQkJCQkJCQkJCQkJICBvdXRlcl9yZWwtPnJlbGlkcywK IAkJCQkJCQkJCQkJCQkJICBpbm5lcl9yZWwpKTsKIApAQCAtMTEyMSw3ICsxMTE3LDcgQEAg YnVpbGRfam9pbnJlbF9qb2lubGlzdChSZWxPcHRJbmZvICpqb2lucmVsLAogfQogCiBzdGF0 aWMgTGlzdCAqCi1zdWJidWlsZF9qb2lucmVsX3Jlc3RyaWN0bGlzdChSZWxPcHRJbmZvICpq b2lucmVsLAorc3ViYnVpbGRfam9pbnJlbF9yZXN0cmljdGxpc3QoUmVsaWRzIGpvaW5yZWxp ZHMsCiAJCQkJCQkJICBMaXN0ICpqb2luaW5mb19saXN0LAogCQkJCQkJCSAgTGlzdCAqbmV3 X3Jlc3RyaWN0bGlzdCkKIHsKQEAgLTExMzEsNyArMTEyNyw3IEBAIHN1YmJ1aWxkX2pvaW5y ZWxfcmVzdHJpY3RsaXN0KFJlbE9wdEluZm8gKmpvaW5yZWwsCiAJewogCQlSZXN0cmljdElu Zm8gKnJpbmZvID0gKFJlc3RyaWN0SW5mbyAqKSBsZmlyc3QobCk7CiAKLQkJaWYgKGJtc19p c19zdWJzZXQocmluZm8tPnJlcXVpcmVkX3JlbGlkcywgam9pbnJlbC0+cmVsaWRzKSkKKwkJ aWYgKGJtc19pc19zdWJzZXQocmluZm8tPnJlcXVpcmVkX3JlbGlkcywgam9pbnJlbGlkcykp CiAJCXsKIAkJCS8qCiAJCQkgKiBUaGlzIGNsYXVzZSBiZWNvbWVzIGEgcmVzdHJpY3Rpb24g Y2xhdXNlIGZvciB0aGUgam9pbnJlbCwgc2luY2UKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5k L3V0aWxzL21pc2MvZ3VjLmMgYi9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Yy5jCmluZGV4 IGY3MGY3ZjVjMDEuLmIxZWQ5ZWJlYmYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxz L21pc2MvZ3VjLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvbWlzYy9ndWMuYwpAQCAtMTE4 Miw2ICsxMTgyLDE2IEBAIHN0YXRpYyBzdHJ1Y3QgY29uZmlnX2Jvb2wgQ29uZmlndXJlTmFt ZXNCb29sW10gPQogCQl0cnVlLAogCQlOVUxMLCBOVUxMLCBOVUxMCiAJfSwKKwl7CisJCXsi ZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsIiwgUEdDX1VTRVJTRVQsIFFVRVJZX1RVTklOR19N RVRIT0QsCisJCQlnZXR0ZXh0X25vb3AoIkVuYWJsZSByZW1vdmFsIG9mIHVuaXF1ZSBzZWxm LWpvaW5zLiIpLAorCQkJTlVMTCwKKwkJCUdVQ19FWFBMQUlOIHwgR1VDX05PVF9JTl9TQU1Q TEUKKwkJfSwKKwkJJmVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbCwKKwkJdHJ1ZSwKKwkJTlVM TCwgTlVMTCwgTlVMTAorCX0sCiAJewogCQl7ImdlcW8iLCBQR0NfVVNFUlNFVCwgUVVFUllf VFVOSU5HX0dFUU8sCiAJCQlnZXR0ZXh0X25vb3AoIkVuYWJsZXMgZ2VuZXRpYyBxdWVyeSBv cHRpbWl6YXRpb24uIiksCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0 aG5vZGUuaCBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRobm9kZS5oCmluZGV4IDYyMGVl ZGEyZDYuLjFlZmZhOTcyMWEgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wdGltaXplci9w YXRobm9kZS5oCisrKyBiL3NyYy9pbmNsdWRlL29wdGltaXplci9wYXRobm9kZS5oCkBAIC0z MDcsNiArMzA3LDEwIEBAIGV4dGVybiBSZWxPcHRJbmZvICpidWlsZF9qb2luX3JlbChQbGFu bmVySW5mbyAqcm9vdCwKIAkJCQkJCQkJICBSZWxPcHRJbmZvICppbm5lcl9yZWwsCiAJCQkJ CQkJCSAgU3BlY2lhbEpvaW5JbmZvICpzamluZm8sCiAJCQkJCQkJCSAgTGlzdCAqKnJlc3Ry aWN0bGlzdF9wdHIpOworZXh0ZXJuIExpc3QgKmJ1aWxkX2pvaW5yZWxfcmVzdHJpY3RsaXN0 KFBsYW5uZXJJbmZvICpyb290LAorCQkJCQkJICAgUmVsaWRzIGpvaW5yZWxpZHMsCisJCQkJ CQkgICBSZWxPcHRJbmZvICpvdXRlcl9yZWwsCisJCQkJCQkgICBSZWxPcHRJbmZvICppbm5l cl9yZWwpOwogZXh0ZXJuIFJlbGlkcyBtaW5fam9pbl9wYXJhbWV0ZXJpemF0aW9uKFBsYW5u ZXJJbmZvICpyb290LAogCQkJCQkJCQkJCVJlbGlkcyBqb2lucmVsaWRzLAogCQkJCQkJCQkJ CVJlbE9wdEluZm8gKm91dGVyX3JlbCwKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wdGlt aXplci9wbGFubWFpbi5oIGIvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BsYW5tYWluLmgKaW5k ZXggNTRhMGQ0YzE4OC4uMDU0Yjc3ZTA4NyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3B0 aW1pemVyL3BsYW5tYWluLmgKKysrIGIvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BsYW5tYWlu LmgKQEAgLTIwLDYgKzIwLDcgQEAKIC8qIEdVQyBwYXJhbWV0ZXJzICovCiAjZGVmaW5lIERF RkFVTFRfQ1VSU09SX1RVUExFX0ZSQUNUSU9OIDAuMQogZXh0ZXJuIGRvdWJsZSBjdXJzb3Jf dHVwbGVfZnJhY3Rpb247CitleHRlcm4gYm9vbCBlbmFibGVfc2VsZl9qb2luX3JlbW92YWw7 CiAKIC8qIHF1ZXJ5X3BsYW5uZXIgY2FsbGJhY2sgdG8gY29tcHV0ZSBxdWVyeV9wYXRoa2V5 cyAqLwogdHlwZWRlZiB2b2lkICgqcXVlcnlfcGF0aGtleXNfY2FsbGJhY2spIChQbGFubmVy SW5mbyAqcm9vdCwgdm9pZCAqZXh0cmEpOwpAQCAtMTA3LDYgKzEwOCw3IEBAIGV4dGVybiBi b29sIHF1ZXJ5X2lzX2Rpc3RpbmN0X2ZvcihRdWVyeSAqcXVlcnksIExpc3QgKmNvbG5vcywg TGlzdCAqb3BpZHMpOwogZXh0ZXJuIGJvb2wgaW5uZXJyZWxfaXNfdW5pcXVlKFBsYW5uZXJJ bmZvICpyb290LAogCQkJCQkJCSAgIFJlbGlkcyBqb2lucmVsaWRzLCBSZWxpZHMgb3V0ZXJy ZWxpZHMsIFJlbE9wdEluZm8gKmlubmVycmVsLAogCQkJCQkJCSAgIEpvaW5UeXBlIGpvaW50 eXBlLCBMaXN0ICpyZXN0cmljdGxpc3QsIGJvb2wgZm9yY2VfY2FjaGUpOworZXh0ZXJuIExp c3QgKiByZW1vdmVfdXNlbGVzc19zZWxmX2pvaW5zKFBsYW5uZXJJbmZvICpyb290LCBMaXN0 ICpqb2ludHJlZSk7CiAKIC8qCiAgKiBwcm90b3R5cGVzIGZvciBwbGFuL3NldHJlZnMuYwpk aWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dCBi L3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvZXF1aXZjbGFzcy5vdXQKaW5kZXggMTI2Zjcw NDdmZS4uZGU3MTQ0MTA1MiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9lcXVpdmNsYXNzLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2 Y2xhc3Mub3V0CkBAIC00MzAsNiArNDMwLDM4IEBAIGV4cGxhaW4gKGNvc3RzIG9mZikKICAg IEZpbHRlcjogKCh1bmlxdWUxIElTIE5PVCBOVUxMKSBBTkQgKHVuaXF1ZTIgSVMgTk9UIE5V TEwpKQogKDIgcm93cykKIAorLS0gVGVzdCB0aGF0IGJyb2tlbiBFQ3MgYXJlIHByb2Nlc3Nl ZCBjb3JyZWN0bHkgZHVyaW5nIHNlbGYgam9pbiByZW1vdmFsLgorLS0gRGlzYWJsZSBtZXJn ZSBqb2lucyBzbyB0aGF0IHdlIGRvbid0IGdldCBhbiBlcnJvciBhYm91dCBtaXNzaW5nIGNv bW11dGF0b3IuCistLSBUZXN0IGJvdGggb3JpZW50YXRpb25zIG9mIHRoZSBqb2luIGNsYXVz ZSwgYmVjYXVzZSBvbmx5IG9uZSBvZiB0aGVtIGJyZWFrcworLS0gdGhlIEVDLgorc2V0IGVu YWJsZV9tZXJnZWpvaW4gdG8gb2ZmOworZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxlY3Qg KiBmcm9tIGVjMCBtIGpvaW4gZWMwIG4gb24gbS5mZiA9IG4uZmYKKyAgam9pbiBlYzEgcCBv biBtLmZmICsgbi5mZiA9IHAuZjE7CisgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg TmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoKG4uZmYgKyBuLmZmKSA9IHAuZjEpCisg ICAtPiAgU2VxIFNjYW4gb24gZWMxIHAKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAg LT4gIFNlcSBTY2FuIG9uIGVjMCBuCisgICAgICAgICAgICAgICBGaWx0ZXI6IChmZiBJUyBO T1QgTlVMTCkKKyg2IHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikKKyAgc2VsZWN0ICog ZnJvbSBlYzAgbSBqb2luIGVjMCBuIG9uIG0uZmYgPSBuLmZmCisgIGpvaW4gZWMxIHAgb24g cC5mMTo6aW50OCA9IChtLmZmICsgbi5mZik6OmludDhhbGlhczE7CisgICAgICAgICAgICAg ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKChwLmYxKTo6YmlnaW50 ID0gKChuLmZmICsgbi5mZikpOjppbnQ4YWxpYXMxKQorICAgLT4gIFNlcSBTY2FuIG9uIGVj MSBwCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlYzAg bgorICAgICAgICAgICAgICAgRmlsdGVyOiAoZmYgSVMgTk9UIE5VTEwpCisoNiByb3dzKQor CityZXNldCBlbmFibGVfbWVyZ2Vqb2luOwogLS0gdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQs IGJ1dCBpc24ndCBhdCBwcmVzZW50CiBleHBsYWluIChjb3N0cyBvZmYpCiAgIHNlbGVjdCAq IGZyb20gdGVuazEgd2hlcmUgdW5pcXVlMSA9IHVuaXF1ZTEgb3IgdW5pcXVlMiA9IHVuaXF1 ZTI7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0IGIv c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dAppbmRleCAxOWNhZWJhYmQwLi40 ZTlmZDIzNjdjIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4u b3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKQEAgLTQ5MjIs NiArNDkyMiw0MzIgQEAgc2VsZWN0ICogZnJvbQogLS0tLSstLS0tKy0tLS0rLS0tLQogKDAg cm93cykKIAorLS0KKy0tIHRlc3QgdGhhdCBzZW1pLSBvciBpbm5lciBzZWxmLWpvaW5zIG9u IGEgdW5pcXVlIGNvbHVtbiBhcmUgcmVtb3ZlZAorLS0KKy0tIGVuYWJsZSBvbmx5IG5lc3Rs b29wIHRvIGdldCBtb3JlIHByZWRpY3RhYmxlIHBsYW5zCitzZXQgZW5hYmxlX2hhc2hqb2lu IHRvIG9mZjsKK3NldCBlbmFibGVfbWVyZ2Vqb2luIHRvIG9mZjsKK2NyZWF0ZSB0YWJsZSBz aiAoYSBpbnQgdW5pcXVlLCBiIGludCwgYyBpbnQgdW5pcXVlKTsKK2luc2VydCBpbnRvIHNq IHZhbHVlcyAoMSwgbnVsbCwgMiksIChudWxsLCAyLCBudWxsKSwgKDIsIDEsIDEpOworYW5h bHl6ZSBzajsKKy0tIFRyaXZpYWwgc2VsZi1qb2luIGNhc2UuCitleHBsYWluIChjb3N0cyBv ZmYpCitzZWxlY3QgcC4qIGZyb20gc2ogcCwgc2ogcSB3aGVyZSBxLmEgPSBwLmEgYW5kIHEu YiA9IHEuYSAtIDE7CisgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBTZXEgU2NhbiBvbiBzaiBxCisgICBGaWx0ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5E IChiID0gKGEgLSAxKSkpCisoMiByb3dzKQorCitzZWxlY3QgcC4qIGZyb20gc2ogcCwgc2og cSB3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA9IHEuYSAtIDE7CisgYSB8IGIgfCBjIAorLS0t Ky0tLSstLS0KKyAyIHwgMSB8IDEKKygxIHJvdykKKworLS0gU2VsZi1qb2luIHJlbW92YWwg cGVyZm9ybXMgYWZ0ZXIgYSBzdWJxdWVyeSBwdWxsLXVwIHByb2Nlc3MgYW5kIGNvdWxkIHJl bW92ZQorLS0gc3VjaCBraW5kIG9mIHNlbGYtam9pbiB0b28uIENoZWNrIHRoaXMgb3B0aW9u LgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiBwCit3aGVyZSBleGlz dHMgKHNlbGVjdCAqIGZyb20gc2ogcQorCQkJCXdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iIDwg MTApOworICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgCistLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBz aiBxCisgICBGaWx0ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5EIChiIDwgMTApKQorKDIgcm93 cykKKworc2VsZWN0ICogZnJvbSBzaiBwIHdoZXJlIGV4aXN0cyAoc2VsZWN0ICogZnJvbSBz aiBxIHdoZXJlIHEuYSA9IHAuYSBhbmQgcS5iIDwgMTApOworIGEgfCBiIHwgYyAKKy0tLSst LS0rLS0tCisgMiB8IDEgfCAxCisoMSByb3cpCisKKy0tIERvbid0IHJlbW92ZSBzZWxmLWpv aW4gZm9yIHRoZSBjYXNlIG9mIGVxdWFsaXR5IG9mIHR3byBkaWZmZXJlbnQgdW5pcXVlIGNv bHVtbnMuCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBzaiB0 MiB3aGVyZSB0MS5hID0gdDIuYyBhbmQgdDEuYiBpcyBub3QgbnVsbDsKKyAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAodDEuYSA9 IHQyLmMpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogdDIKKyAgIC0+ICBNYXRlcmlhbGl6ZQor ICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQxCisgICAgICAgICAgICAgICBGaWx0ZXI6 IChiIElTIE5PVCBOVUxMKQorKDYgcm93cykKKworLS0gRGVnZW5lcmF0ZWQgY2FzZS4KK2V4 cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20KKwkoc2VsZWN0IGEgYXMgeCBmcm9t IHNqIHdoZXJlIGZhbHNlKSBhcyBxMSwKKwkoc2VsZWN0IGEgYXMgeSBmcm9tIHNqIHdoZXJl IGZhbHNlKSBhcyBxMgord2hlcmUgcTEueCA9IHEyLnk7CisgICAgICAgICAgIFFVRVJZIFBM QU4gICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFJl c3VsdAorICAgT25lLVRpbWUgRmlsdGVyOiBmYWxzZQorICAgLT4gIFNlcSBTY2FuIG9uIHNq CisgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorKDQgcm93cykKKworLS0gV2Ug Y2FuJ3QgdXNlIGEgY3Jvc3MtRUMgZ2VuZXJhdGVkIHNlbGYgam9pbiBxdWFsIGJlY2F1c2Ug b2YgY3VycmVudCBsb2dpYyBvZgorLS0gdGhlIGdlbmVyYXRlX2pvaW5faW1wbGllZF9lcXVh bGl0aWVzIHJvdXRpbmUuCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNq IHQxLCBzaiB0MiB3aGVyZSB0MS5hID0gdDEuYiBhbmQgdDEuYiA9IHQyLmIgYW5kIHQyLmIg PSB0Mi5hOworICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICh0MS5h ID0gdDIuYikKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0MQorICAgICAgICAgRmlsdGVyOiAo YSA9IGIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogdDIKKyAgICAgICAgIEZpbHRlcjogKGIg PSBhKQorKDYgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBz aiB0MSwgc2ogdDIsIHNqIHQzCit3aGVyZSB0MS5hID0gdDEuYiBhbmQgdDEuYiA9IHQyLmIg YW5kIHQyLmIgPSB0Mi5hCisJYW5kIHQxLmIgPSB0My5iIGFuZCB0My5iID0gdDMuYTsKKyAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAodDEu YSA9IHQzLmIpCisgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgIEpvaW4gRmlsdGVyOiAo dDEuYSA9IHQyLmIpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogdDEKKyAgICAgICAg ICAgICAgIEZpbHRlcjogKGEgPSBiKQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQy CisgICAgICAgICAgICAgICBGaWx0ZXI6IChiID0gYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBz aiB0MworICAgICAgICAgRmlsdGVyOiAoYiA9IGEpCisoMTAgcm93cykKKworLS0gRG91Ymxl IHNlbGYtam9pbiByZW1vdmFsLgorLS0gVXNlIGEgY29uZGl0aW9uIG9uICJiICsgMSIsIG5v dCBvbiAiYiIsIGZvciB0aGUgc2Vjb25kIGpvaW4sIHNvIHRoYXQKKy0tIHRoZSBlcXVpdmFs ZW5jZSBjbGFzcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZmlyc3Qgb25lLCBhbmQgd2UgY2Fu CistLSB0ZXN0IHRoZSBub24tZWMgY29kZSBwYXRoLgorZXhwbGFpbiAoY29zdHMgb2ZmKQor c2VsZWN0ICogZnJvbSBzaiB0MSBqb2luIHNqIHQyIG9uIHQxLmEgPSB0Mi5hIGFuZCB0MS5i ID0gdDIuYgorCWpvaW4gc2ogdDMgb24gdDIuYSA9IHQzLmEgYW5kIHQyLmIgKyAxID0gdDMu YiArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IFNlcSBTY2FuIG9uIHNqIHQzCisgICBGaWx0ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5EIChi IElTIE5PVCBOVUxMKSBBTkQgKChiICsgMSkgSVMgTk9UIE5VTEwpKQorKDIgcm93cykKKwor LS0gc3Vic2VsZWN0IHRoYXQgcmVmZXJlbmNlcyB0aGUgcmVtb3ZlZCByZWxhdGlvbgorZXhw bGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0IHQxLmEsIChzZWxlY3QgYSBmcm9tIHNqIHdoZXJl IGEgPSB0Mi5hIGFuZCBhID0gdDEuYSkKK2Zyb20gc2ogdDEsIHNqIHQyCit3aGVyZSB0MS5h ID0gdDIuYTsKKyAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4g b24gc2ogdDIKKyAgIEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisgICBTdWJQbGFuIDEKKyAg ICAgLT4gIFJlc3VsdAorICAgICAgICAgICBPbmUtVGltZSBGaWx0ZXI6ICh0Mi5hID0gdDIu YSkKKyAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqCisgICAgICAgICAgICAgICAgIEZp bHRlcjogKGEgPSB0Mi5hKQorKDcgcm93cykKKworLS0gc2VsZi1qb2luIHVuZGVyIG91dGVy IGpvaW4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogeCBqb2luIHNq IHkgb24geC5hID0geS5hCitsZWZ0IGpvaW4gaW50OF90YmwgeiBvbiB4LmEgPSB6LnExOwor ICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIEpvaW4g RmlsdGVyOiAoeS5hID0gei5xMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiB5CisgICAgICAg ICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAg ICAtPiAgU2VxIFNjYW4gb24gaW50OF90YmwgegorKDYgcm93cykKKworZXhwbGFpbiAoY29z dHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB4IGpvaW4gc2ogeSBvbiB4LmEgPSB5LmEKK2xl ZnQgam9pbiBpbnQ4X3RibCB6IG9uIHkuYSA9IHoucTE7CisgICAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgSm9pbiBGaWx0ZXI6ICh5LmEgPSB6LnEx KQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIHkKKyAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9U IE5VTEwpCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBp bnQ4X3RibCB6CisoNiByb3dzKQorCistLSBUZXN0IHRoYXQgcGxhY2Vob2xkZXJzIGFyZSB1 cGRhdGVkIGNvcnJlY3RseSBhZnRlciBqb2luIHJlbW92YWwKK2V4cGxhaW4gKGNvc3RzIG9m ZikKK3NlbGVjdCAqIGZyb20gKHZhbHVlcyAoMSkpIHgKK2xlZnQgam9pbiAoc2VsZWN0IGNv YWxlc2NlKHkucTEsIDEpIGZyb20gaW50OF90YmwgeQorCXJpZ2h0IGpvaW4gc2ogajEgaW5u ZXIgam9pbiBzaiBqMiBvbiBqMS5hID0gajIuYQorCW9uIHRydWUpIHoKK29uIHRydWU7Cisg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIExlZnQgSm9p bgorICAgLT4gIFJlc3VsdAorICAgLT4gIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgICAg ICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoyCisgICAgICAgICAgICAgICBGaWx0ZXI6IChhIElT IE5PVCBOVUxMKQorICAgICAgICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAgICAgICAt PiAgU2VxIFNjYW4gb24gaW50OF90YmwgeQorKDcgcm93cykKKworLS0gVGVzdCB0aGF0IE9S IHByZWRpY2F0ZWQgYXJlIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIGpvaW4gcmVtb3ZhbAor Q1JFQVRFIFRBQkxFIHRhYl93aXRoX2ZsYWcgKCBpZCBJTlQgUFJJTUFSWSBLRVksIGlzX2Zs YWcgU01BTExJTlQpOworQ1JFQVRFIElOREVYIGlkeF90ZXN0X2lzX2ZsYWcgT04gdGFiX3dp dGhfZmxhZyAoaXNfZmxhZyk7CitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgQ09VTlQo KikgRlJPTSB0YWJfd2l0aF9mbGFnIFdIRVJFIChpc19mbGFnIElTIE5VTEwgT1IgaXNfZmxh ZyA9IDApIEFORCBpZCBJTiAoU0VMRUNUIGlkIEZST00gdGFiX3dpdGhfZmxhZyBXSEVSRSBp ZCBJTiAoMiwgMykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVF UlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4gIEJpdG1hcCBIZWFwIFNj YW4gb24gdGFiX3dpdGhfZmxhZworICAgICAgICAgUmVjaGVjayBDb25kOiAoKGlkID0gQU5Z ICgnezIsM30nOjppbnRlZ2VyW10pKSBBTkQgKGlkIElTIE5PVCBOVUxMKSkKKyAgICAgICAg IEZpbHRlcjogKChpc19mbGFnIElTIE5VTEwpIE9SIChpc19mbGFnID0gMCkpCisgICAgICAg ICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gdGFiX3dpdGhfZmxhZ19wa2V5CisgICAgICAg ICAgICAgICBJbmRleCBDb25kOiAoKGlkID0gQU5ZICgnezIsM30nOjppbnRlZ2VyW10pKSBB TkQgKGlkIElTIE5PVCBOVUxMKSkKKyg2IHJvd3MpCisKK0RST1AgVEFCTEUgdGFiX3dpdGhf ZmxhZzsKKy0tIEhBVklORyBjbGF1c2UKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCBw LmIgZnJvbSBzaiBwIGpvaW4gc2ogcSBvbiBwLmEgPSBxLmEgZ3JvdXAgYnkgcC5iIGhhdmlu ZyBzdW0ocC5hKSA9IDE7CisgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2hBZ2dyZWdhdGUKKyAgIEdy b3VwIEtleTogcS5iCisgICBGaWx0ZXI6IChzdW0ocS5hKSA9IDEpCisgICAtPiAgU2VxIFNj YW4gb24gc2ogcQorICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyg1IHJvd3Mp CisKKy0tIHVwZGF0ZSBsYXRlcmFsIHJlZmVyZW5jZXMgYW5kIHJhbmdlIHRhYmxlIGVudHJ5 IHJlZmVyZW5jZQorZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0IDEgZnJv bSAoc2VsZWN0IHguKiBmcm9tIHNqIHgsIHNqIHkgd2hlcmUgeC5hID0geS5hKSBxLAorICBs YXRlcmFsIGdlbmVyYXRlX3NlcmllcygxLCBxLmEpIGdzKGkpOworICAgICAgICAgICAgICAg ICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9v cAorICAgT3V0cHV0OiAxCisgICAtPiAgU2VxIFNjYW4gb24gcHVibGljLnNqIHkKKyAgICAg ICAgIE91dHB1dDogeS5hLCB5LmIsIHkuYworICAgICAgICAgRmlsdGVyOiAoeS5hIElTIE5P VCBOVUxMKQorICAgLT4gIEZ1bmN0aW9uIFNjYW4gb24gcGdfY2F0YWxvZy5nZW5lcmF0ZV9z ZXJpZXMgZ3MKKyAgICAgICAgIE91dHB1dDogZ3MuaQorICAgICAgICAgRnVuY3Rpb24gQ2Fs bDogZ2VuZXJhdGVfc2VyaWVzKDEsIHkuYSkKKyg4IHJvd3MpCisKK2V4cGxhaW4gKHZlcmJv c2UsIGNvc3RzIG9mZikKK3NlbGVjdCAxIGZyb20gKHNlbGVjdCB5LiogZnJvbSBzaiB4LCBz aiB5IHdoZXJlIHguYSA9IHkuYSkgcSwKKyAgbGF0ZXJhbCBnZW5lcmF0ZV9zZXJpZXMoMSwg cS5hKSBncyhpKTsKKyAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIE91dHB1dDogMQorICAgLT4gIFNl cSBTY2FuIG9uIHB1YmxpYy5zaiB5CisgICAgICAgICBPdXRwdXQ6IHkuYSwgeS5iLCB5LmMK KyAgICAgICAgIEZpbHRlcjogKHkuYSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBGdW5jdGlvbiBT Y2FuIG9uIHBnX2NhdGFsb2cuZ2VuZXJhdGVfc2VyaWVzIGdzCisgICAgICAgICBPdXRwdXQ6 IGdzLmkKKyAgICAgICAgIEZ1bmN0aW9uIENhbGw6IGdlbmVyYXRlX3NlcmllcygxLCB5LmEp CisoOCByb3dzKQorCistLSBUZXN0IHRoYXQgYSBub24tRUMtZGVyaXZlZCBqb2luIGNsYXVz ZSBpcyBwcm9jZXNzZWQgY29ycmVjdGx5LiBVc2UgYW4KKy0tIG91dGVyIGpvaW4gc28gdGhh dCB3ZSBjYW4ndCBmb3JtIGFuIEVDLgorZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgKiBm cm9tIHNqIHAgam9pbiBzaiBxIG9uIHAuYSA9IHEuYQorICBsZWZ0IGpvaW4gc2ogciBvbiBw LmEgKyBxLmEgPSByLmE7CisgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIExl ZnQgSm9pbgorICAgSm9pbiBGaWx0ZXI6ICgocS5hICsgcS5hKSA9IHIuYSkKKyAgIC0+ICBT ZXEgU2NhbiBvbiBzaiBxCisgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorICAg LT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogcgorKDYgcm93 cykKKworLS0gRklYTUUgdGhpcyBjb25zdGFudCBmYWxzZSBmaWx0ZXIgZG9lc24ndCBsb29r IGdvb2QuIFNob3VsZCB3ZSBtZXJnZQorLS0gZXF1aXZhbGVuY2UgY2xhc3Nlcz8KK2V4cGxh aW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogcCwgc2ogcSB3aGVyZSBwLmEgPSBx LmEgYW5kIHAuYiA9IDEgYW5kIHEuYiA9IDI7CisgICAgICAgICAgICAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBzaiBxCisgICBG aWx0ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5EIChiID0gMikgQU5EIChiID0gMSkpCisoMiBy b3dzKQorCistLSBDaGVjayB0aGF0IGF0dHJfbmVlZGVkIGlzIHVwZGF0ZWQgY29ycmVjdGx5 IGFmdGVyIHNlbGYtam9pbiByZW1vdmFsLiBJbiB0aGlzCistLSB0ZXN0LCB0aGUgam9pbiBv ZiBqMSB3aXRoIGoyIGlzIHJlbW92ZWQuIGsxLmIgaXMgcmVxdWlyZWQgYXQgZWl0aGVyIGox IG9yIGoyLgorLS0gSWYgdGhpcyBpbmZvIGlzIGxvc3QsIGpvaW4gdGFyZ2V0bGlzdCBmb3Ig KGsxLCBrMikgd2lsbCBub3QgY29udGFpbiBrMS5iLgorLS0gVXNlIGluZGV4IHNjYW4gZm9y IGsxIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0ICdiJyBmcm9tIHBoeXNpY2FsIHRsaXN0IHVzZWQg Zm9yCistLSBzZXFzY2FuLiBBbHNvIGRpc2FibGUgcmVvcmRlcmluZyBvZiBqb2lucyBiZWNh dXNlIHRoaXMgdGVzdCBkZXBlbmRzIG9uIGEKKy0tIHBhcnRpY3VsYXIgam9pbiB0cmVlLgor Y3JlYXRlIHRhYmxlIHNrIChhIGludCwgYiBpbnQpOworY3JlYXRlIGluZGV4IG9uIHNrKGEp Oworc2V0IGpvaW5fY29sbGFwc2VfbGltaXQgdG8gMTsKK3NldCBlbmFibGVfc2Vxc2NhbiB0 byBvZmY7CitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAxIGZyb20KKwkoc2sgazEgam9p biBzayBrMiBvbiBrMS5hID0gazIuYSkKKwlqb2luIChzaiBqMSBqb2luIHNqIGoyIG9uIGox LmEgPSBqMi5hKSBvbiBqMS5iID0gazEuYjsKKyAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZp bHRlcjogKGsxLmIgPSBqMi5iKQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAtPiAg SW5kZXggU2NhbiB1c2luZyBza19hX2lkeCBvbiBzayBrMQorICAgICAgICAgLT4gIEluZGV4 IE9ubHkgU2NhbiB1c2luZyBza19hX2lkeCBvbiBzayBrMgorICAgICAgICAgICAgICAgSW5k ZXggQ29uZDogKGEgPSBrMS5hKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAg SW5kZXggU2NhbiB1c2luZyBzal9hX2tleSBvbiBzaiBqMgorICAgICAgICAgICAgICAgSW5k ZXggQ29uZDogKGEgSVMgTk9UIE5VTEwpCisoOSByb3dzKQorCitleHBsYWluIChjb3N0cyBv ZmYpIHNlbGVjdCAxIGZyb20KKwkoc2sgazEgam9pbiBzayBrMiBvbiBrMS5hID0gazIuYSkK Kwlqb2luIChzaiBqMSBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hKSBvbiBqMi5iID0gazEu YjsKKyAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKGsxLmIgPSBqMi5iKQorICAg LT4gIE5lc3RlZCBMb29wCisgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBza19hX2lk eCBvbiBzayBrMQorICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBza19hX2lk eCBvbiBzayBrMgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGEgPSBrMS5hKQorICAg LT4gIE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBzal9hX2tl eSBvbiBzaiBqMgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGEgSVMgTk9UIE5VTEwp CisoOSByb3dzKQorCityZXNldCBqb2luX2NvbGxhcHNlX2xpbWl0OworcmVzZXQgZW5hYmxl X3NlcXNjYW47CistLSBDaGVjayB0aGF0IGNsYXVzZXMgZnJvbSB0aGUgam9pbiBmaWx0ZXIg bGlzdCBpcyBub3QgbG9zdCBvbiB0aGUgc2VsZi1qb2luIHJlbW92YWwKK0NSRUFURSBUQUJM RSBlbXAxICggaWQgU0VSSUFMIFBSSU1BUlkgS0VZIE5PVCBOVUxMLCBjb2RlIGludCk7Citl eHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9NIGVtcDEgZTEsIGVt cDEgZTIgV0hFUkUgZTEuaWQgPSBlMi5pZCBBTkQgZTIuY29kZSA8PiBlMS5jb2RlOworICAg ICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIFNlcSBTY2FuIG9uIHB1YmxpYy5lbXAxIGUyCisgICBPdXRwdXQ6IGUyLmlk LCBlMi5jb2RlLCBlMi5pZCwgZTIuY29kZQorICAgRmlsdGVyOiAoKGUyLmlkIElTIE5PVCBO VUxMKSBBTkQgKGUyLmNvZGUgPD4gZTIuY29kZSkpCisoMyByb3dzKQorCistLSBXZSBjYW4g cmVtb3ZlIHRoZSBqb2luIGV2ZW4gaWYgd2UgZmluZCB0aGUgam9pbiBjYW4ndCBkdXBsaWNh dGUgcm93cyBhbmQKKy0tIHRoZSBiYXNlIHF1YWxzIG9mIGVhY2ggc2lkZSBhcmUgZGlmZmVy ZW50LiAgSW4gdGhlIGZvbGxvd2luZyBjYXNlIHdlIGVuZCB1cAorLS0gbW92aW5nIHF1YWxz IG92ZXIgdG8gczEgdG8gbWFrZSBpdCBzbyBpdCBjYW4ndCBtYXRjaCBhbnkgcm93cy4KK2Ny ZWF0ZSB0YWJsZSBzbChhIGludCwgYiBpbnQpOworY3JlYXRlIHVuaXF1ZSBpbmRleCBvbiBz bChhLCBiKTsKK3ZhY3V1bSBhbmFseXplIHNsOworLS0gQm90aCBzaWRlcyBhcmUgdW5pcXVl LCBidXQgYmFzZSBxdWFscyBhcmUgZGlmZmVyZW50CitleHBsYWluIChjb3N0cyBvZmYpCitz ZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9 IDEgYW5kIHQyLmIgPSAyOworICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2wgdDIKKyAgIEZpbHRlcjogKChh IElTIE5PVCBOVUxMKSBBTkQgKGIgPSAyKSBBTkQgKGIgPSAxKSkKKygyIHJvd3MpCisKKy0t IEpvaW4gcXVhbCBpc24ndCBtZXJnZWpvaW5hYmxlLCBidXQgaW5uZXIgaXMgdW5pcXVlLgor ZXhwbGFpbiAoQ09TVFMgT0ZGKQorU0VMRUNUIG4yLmEgRlJPTSBzaiBuMSwgc2ogbjIgV0hF UkUgbjEuYSA8PiBuMi5hIEFORCBuMi5hID0gMTsKKyAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9v cAorICAgSm9pbiBGaWx0ZXI6IChuMS5hIDw+IG4yLmEpCisgICAtPiAgU2VxIFNjYW4gb24g c2ogbjIKKyAgICAgICAgIEZpbHRlcjogKGEgPSAxKQorICAgLT4gIFNlcSBTY2FuIG9uIHNq IG4xCisoNSByb3dzKQorCitleHBsYWluIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NCisJ KFNFTEVDVCBuMi5hIEZST00gc2ogbjEsIHNqIG4yIFdIRVJFIG4xLmEgPD4gbjIuYSkgcTAs IHNsCitXSEVSRSBxMC5hID0gMTsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9p biBGaWx0ZXI6IChuMS5hIDw+IG4yLmEpCisgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAg IC0+ICBTZXEgU2NhbiBvbiBzbAorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIG4yCisg ICAgICAgICAgICAgICBGaWx0ZXI6IChhID0gMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBu MQorKDcgcm93cykKKworLS0KKy0tLS0gT25seSBvbmUgc2lkZSBpcyB1bnFpdWUKKy0tc2Vs ZWN0ICogZnJvbSBzbCB0MSwgc2wgdDIgd2hlcmUgdDEuYSA9IHQyLmEgYW5kIHQxLmIgPSAx OworLS1zZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQg dDIuYiA9IDE7CistLQorLS0tLSBTZXZlcmFsIHVuaXF1ZXMgaW5kZXhlcyBtYXRjaCwgYW5k IHdlIHNlbGVjdCBhIGRpZmZlcmVudCBvbmUKKy0tLS0gZm9yIGVhY2ggc2lkZSwgc28gdGhl IGpvaW4gaXMgbm90IHJlbW92ZWQKKy0tY3JlYXRlIHRhYmxlIHNtKGEgaW50IHVuaXF1ZSwg YiBpbnQgdW5pcXVlLCBjIGludCB1bmlxdWUpOworLS1leHBsYWluIChjb3N0cyBvZmYpCist LXNlbGVjdCAqIGZyb20gc20gbSwgc20gbiB3aGVyZSBtLmEgPSBuLmIgYW5kIG0uYyA9IG4u YzsKKy0tZXhwbGFpbiAoY29zdHMgb2ZmKQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4g d2hlcmUgbS5hID0gbi5jIGFuZCBtLmIgPSBuLmI7CistLWV4cGxhaW4gKGNvc3RzIG9mZikK Ky0tc2VsZWN0ICogZnJvbSBzbSBtLCBzbSBuIHdoZXJlIG0uYyA9IG4uYiBhbmQgbS5hID0g bi5hOworLS0gQ2hlY2sgb3B0aW1pemF0aW9uIGRpc2FibGluZyBpZiBpdCB3aWxsIHZpb2xh dGUgc3BlY2lhbCBqb2luIGNvbmRpdGlvbnMuCistLSBUd28gaWRlbnRpY2FsIGpvaW5lZCBy ZWxhdGlvbnMgc2F0aXNmaWVzIHNlbGYgam9pbiByZW1vdmFsIGNvbmRpdGlvbnMgYnV0Cist LSBzdGF5IGluIGRpZmZlcmVudCBzcGVjaWFsIGpvaW4gaW5mb3MuCitDUkVBVEUgVEFCTEUg c2pfdDEgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFRBQkxFIHNqX3QyIChpZCBzZXJp YWwsIGEgaW50KTsKK0NSRUFURSBUQUJMRSBzal90MyAoaWQgc2VyaWFsLCBhIGludCk7CitD UkVBVEUgVEFCTEUgc2pfdDQgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFVOSVFVRSBJ TkRFWCBPTiBzal90MyBVU0lORyBidHJlZSAoYSxpZCk7CitDUkVBVEUgVU5JUVVFIElOREVY IE9OIHNqX3QyIFVTSU5HIGJ0cmVlIChpZCk7CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxF Q1QgKiBGUk9NIHNqX3QxCitKT0lOICgKKwlTRUxFQ1Qgc2pfdDIuaWQgQVMgaWQgRlJPTSBz al90MgorCVdIRVJFIEVYSVNUUworCQkoCisJCVNFTEVDVCBUUlVFIEZST00gc2pfdDMsc2pf dDQgV0hFUkUgc2pfdDMuYSA9IDEgQU5EIHNqX3QzLmlkID0gc2pfdDIuaWQKKwkJKQorCSkg dDJ0M3Q0CitPTiBzal90MS5pZCA9IHQydDN0NC5pZAorSk9JTiAoCisJU0VMRUNUIHNqX3Qy LmlkIEFTIGlkIEZST00gc2pfdDIKKwlXSEVSRSBFWElTVFMKKwkJKAorCQlTRUxFQ1QgVFJV RSBGUk9NIHNqX3QzLHNqX3Q0IFdIRVJFIHNqX3QzLmEgPSAxIEFORCBzal90My5pZCA9IHNq X3QyLmlkCisJCSkKKwkpIF90MnQzdDQKK09OIHNqX3QxLmlkID0gX3QydDN0NC5pZDsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChzal90My5pZCA9IHNq X3QxLmlkKQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICBKb2luIEZpbHRlcjogKHNq X3QzLmlkID0gc2pfdDIuaWQpCisgICAgICAgICAtPiAgTmVzdGVkIExvb3AgU2VtaSBKb2lu CisgICAgICAgICAgICAgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgICAgICAgICAgICAg IC0+ICBIYXNoQWdncmVnYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCBL ZXk6IHNqX3QzLmlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgTmVzdGVkIExv b3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBz al90NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIE1hdGVyaWFsaXpl CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgQml0bWFwIEhl YXAgU2NhbiBvbiBzal90MworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgUmVjaGVjayBDb25kOiAoYSA9IDEpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gc2pfdDNf YV9pZF9pZHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIEluZGV4IENvbmQ6IChhID0gMSkKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBJ bmRleCBPbmx5IFNjYW4gdXNpbmcgc2pfdDJfaWRfaWR4IG9uIHNqX3QyIHNqX3QyXzEKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IHNqX3QzLmlkKQor ICAgICAgICAgICAgICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAgICAgICAgICAgICAt PiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHNqX3QzX2FfaWRfaWR4IG9uIHNqX3QzIHNqX3Qz XzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICgoYSA9IDEpIEFO RCAoaWQgPSBzal90My5pZCkpCisgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4g b24gc2pfdDQgc2pfdDRfMQorICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBz al90Ml9pZF9pZHggb24gc2pfdDIKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9 IHNqX3QyXzEuaWQpCisgICAtPiAgU2VxIFNjYW4gb24gc2pfdDEKKygyNCByb3dzKQorCity ZXNldCBlbmFibGVfaGFzaGpvaW47CityZXNldCBlbmFibGVfbWVyZ2Vqb2luOwogLS0KIC0t IFRlc3QgaGludHMgZ2l2ZW4gb24gaW5jb3JyZWN0IGNvbHVtbiByZWZlcmVuY2VzIGFyZSB1 c2VmdWwKIC0tCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5c3Zp ZXdzLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0CmluZGV4 IDQ0MmVlYjFlM2YuLmZjNWJlNjI4NTYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvc3lzdmlld3Mub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQv c3lzdmlld3Mub3V0CkBAIC0xMTksMTAgKzExOSwxMSBAQCBzZWxlY3QgbmFtZSwgc2V0dGlu ZyBmcm9tIHBnX3NldHRpbmdzIHdoZXJlIG5hbWUgbGlrZSAnZW5hYmxlJSc7CiAgZW5hYmxl X3BhcnRpdGlvbl9wcnVuaW5nICAgICAgIHwgb24KICBlbmFibGVfcGFydGl0aW9ud2lzZV9h Z2dyZWdhdGUgfCBvZmYKICBlbmFibGVfcGFydGl0aW9ud2lzZV9qb2luICAgICAgfCBvZmYK KyBlbmFibGVfc2VsZl9qb2luX3JlbW92YWwgICAgICAgfCBvbgogIGVuYWJsZV9zZXFzY2Fu ICAgICAgICAgICAgICAgICB8IG9uCiAgZW5hYmxlX3NvcnQgICAgICAgICAgICAgICAgICAg IHwgb24KICBlbmFibGVfdGlkc2NhbiAgICAgICAgICAgICAgICAgfCBvbgotKDIwIHJvd3Mp CisoMjEgcm93cykKIAogLS0gVGVzdCB0aGF0IHRoZSBwZ190aW1lem9uZV9uYW1lcyBhbmQg cGdfdGltZXpvbmVfYWJicmV2cyB2aWV3cyBhcmUKIC0tIG1vcmUtb3ItbGVzcyB3b3JraW5n LiAgV2UgY2FuJ3QgdGVzdCB0aGVpciBjb250ZW50cyBpbiBhbnkgZ3JlYXQgZGV0YWlsCmRp ZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNsYXNzLnNxbCBiL3NyYy90 ZXN0L3JlZ3Jlc3Mvc3FsL2VxdWl2Y2xhc3Muc3FsCmluZGV4IDI0N2IwYTMxMDUuLjc3ZGQ5 NjRlYmYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2VxdWl2Y2xhc3Muc3Fs CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2VxdWl2Y2xhc3Muc3FsCkBAIC0yNTksNiAr MjU5LDIyIEBAIGRyb3AgdXNlciByZWdyZXNzX3VzZXJfZWN0ZXN0OwogZXhwbGFpbiAoY29z dHMgb2ZmKQogICBzZWxlY3QgKiBmcm9tIHRlbmsxIHdoZXJlIHVuaXF1ZTEgPSB1bmlxdWUx IGFuZCB1bmlxdWUyID0gdW5pcXVlMjsKIAorLS0gVGVzdCB0aGF0IGJyb2tlbiBFQ3MgYXJl IHByb2Nlc3NlZCBjb3JyZWN0bHkgZHVyaW5nIHNlbGYgam9pbiByZW1vdmFsLgorLS0gRGlz YWJsZSBtZXJnZSBqb2lucyBzbyB0aGF0IHdlIGRvbid0IGdldCBhbiBlcnJvciBhYm91dCBt aXNzaW5nIGNvbW11dGF0b3IuCistLSBUZXN0IGJvdGggb3JpZW50YXRpb25zIG9mIHRoZSBq b2luIGNsYXVzZSwgYmVjYXVzZSBvbmx5IG9uZSBvZiB0aGVtIGJyZWFrcworLS0gdGhlIEVD Lgorc2V0IGVuYWJsZV9tZXJnZWpvaW4gdG8gb2ZmOworCitleHBsYWluIChjb3N0cyBvZmYp CisgIHNlbGVjdCAqIGZyb20gZWMwIG0gam9pbiBlYzAgbiBvbiBtLmZmID0gbi5mZgorICBq b2luIGVjMSBwIG9uIG0uZmYgKyBuLmZmID0gcC5mMTsKKworZXhwbGFpbiAoY29zdHMgb2Zm KQorICBzZWxlY3QgKiBmcm9tIGVjMCBtIGpvaW4gZWMwIG4gb24gbS5mZiA9IG4uZmYKKyAg am9pbiBlYzEgcCBvbiBwLmYxOjppbnQ4ID0gKG0uZmYgKyBuLmZmKTo6aW50OGFsaWFzMTsK KworcmVzZXQgZW5hYmxlX21lcmdlam9pbjsKKwogLS0gdGhpcyBjb3VsZCBiZSBjb252ZXJ0 ZWQsIGJ1dCBpc24ndCBhdCBwcmVzZW50CiBleHBsYWluIChjb3N0cyBvZmYpCiAgIHNlbGVj dCAqIGZyb20gdGVuazEgd2hlcmUgdW5pcXVlMSA9IHVuaXF1ZTEgb3IgdW5pcXVlMiA9IHVu aXF1ZTI7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbCBiL3Ny Yy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsCmluZGV4IDZkZDAxYjAyMmUuLmE3YzA5ZDI1 NzMgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsCisrKyBiL3Ny Yy90ZXN0L3JlZ3Jlc3Mvc3FsL2pvaW4uc3FsCkBAIC0xNzUzLDYgKzE3NTMsMjAzIEBAIHNl bGVjdCAqIGZyb20KIHNlbGVjdCAqIGZyb20KICAgaW50OF90YmwgeCBqb2luIChpbnQ0X3Ri bCB4IGNyb3NzIGpvaW4gaW50NF90YmwgeShmZikpIGogb24gcTEgPSBmMTsgLS0gb2sKIAor LS0KKy0tIHRlc3QgdGhhdCBzZW1pLSBvciBpbm5lciBzZWxmLWpvaW5zIG9uIGEgdW5pcXVl IGNvbHVtbiBhcmUgcmVtb3ZlZAorLS0KKworLS0gZW5hYmxlIG9ubHkgbmVzdGxvb3AgdG8g Z2V0IG1vcmUgcHJlZGljdGFibGUgcGxhbnMKK3NldCBlbmFibGVfaGFzaGpvaW4gdG8gb2Zm Oworc2V0IGVuYWJsZV9tZXJnZWpvaW4gdG8gb2ZmOworCitjcmVhdGUgdGFibGUgc2ogKGEg aW50IHVuaXF1ZSwgYiBpbnQsIGMgaW50IHVuaXF1ZSk7CitpbnNlcnQgaW50byBzaiB2YWx1 ZXMgKDEsIG51bGwsIDIpLCAobnVsbCwgMiwgbnVsbCksICgyLCAxLCAxKTsKK2FuYWx5emUg c2o7CisKKy0tIFRyaXZpYWwgc2VsZi1qb2luIGNhc2UuCitleHBsYWluIChjb3N0cyBvZmYp CitzZWxlY3QgcC4qIGZyb20gc2ogcCwgc2ogcSB3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA9 IHEuYSAtIDE7CitzZWxlY3QgcC4qIGZyb20gc2ogcCwgc2ogcSB3aGVyZSBxLmEgPSBwLmEg YW5kIHEuYiA9IHEuYSAtIDE7CisKKy0tIFNlbGYtam9pbiByZW1vdmFsIHBlcmZvcm1zIGFm dGVyIGEgc3VicXVlcnkgcHVsbC11cCBwcm9jZXNzIGFuZCBjb3VsZCByZW1vdmUKKy0tIHN1 Y2gga2luZCBvZiBzZWxmLWpvaW4gdG9vLiBDaGVjayB0aGlzIG9wdGlvbi4KK2V4cGxhaW4g KGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogcAord2hlcmUgZXhpc3RzIChzZWxlY3Qg KiBmcm9tIHNqIHEKKwkJCQl3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA8IDEwKTsKK3NlbGVj dCAqIGZyb20gc2ogcCB3aGVyZSBleGlzdHMgKHNlbGVjdCAqIGZyb20gc2ogcSB3aGVyZSBx LmEgPSBwLmEgYW5kIHEuYiA8IDEwKTsKKworLS0gRG9uJ3QgcmVtb3ZlIHNlbGYtam9pbiBm b3IgdGhlIGNhc2Ugb2YgZXF1YWxpdHkgb2YgdHdvIGRpZmZlcmVudCB1bmlxdWUgY29sdW1u cy4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEsIHNqIHQyIHdo ZXJlIHQxLmEgPSB0Mi5jIGFuZCB0MS5iIGlzIG5vdCBudWxsOworCistLSBEZWdlbmVyYXRl ZCBjYXNlLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbQorCShzZWxlY3Qg YSBhcyB4IGZyb20gc2ogd2hlcmUgZmFsc2UpIGFzIHExLAorCShzZWxlY3QgYSBhcyB5IGZy b20gc2ogd2hlcmUgZmFsc2UpIGFzIHEyCit3aGVyZSBxMS54ID0gcTIueTsKKworLS0gV2Ug Y2FuJ3QgdXNlIGEgY3Jvc3MtRUMgZ2VuZXJhdGVkIHNlbGYgam9pbiBxdWFsIGJlY2F1c2Ug b2YgY3VycmVudCBsb2dpYyBvZgorLS0gdGhlIGdlbmVyYXRlX2pvaW5faW1wbGllZF9lcXVh bGl0aWVzIHJvdXRpbmUuCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNq IHQxLCBzaiB0MiB3aGVyZSB0MS5hID0gdDEuYiBhbmQgdDEuYiA9IHQyLmIgYW5kIHQyLmIg PSB0Mi5hOworZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MSwgc2og dDIsIHNqIHQzCit3aGVyZSB0MS5hID0gdDEuYiBhbmQgdDEuYiA9IHQyLmIgYW5kIHQyLmIg PSB0Mi5hCisJYW5kIHQxLmIgPSB0My5iIGFuZCB0My5iID0gdDMuYTsKKworLS0gRG91Ymxl IHNlbGYtam9pbiByZW1vdmFsLgorLS0gVXNlIGEgY29uZGl0aW9uIG9uICJiICsgMSIsIG5v dCBvbiAiYiIsIGZvciB0aGUgc2Vjb25kIGpvaW4sIHNvIHRoYXQKKy0tIHRoZSBlcXVpdmFs ZW5jZSBjbGFzcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZmlyc3Qgb25lLCBhbmQgd2UgY2Fu CistLSB0ZXN0IHRoZSBub24tZWMgY29kZSBwYXRoLgorZXhwbGFpbiAoY29zdHMgb2ZmKQor c2VsZWN0ICogZnJvbSBzaiB0MSBqb2luIHNqIHQyIG9uIHQxLmEgPSB0Mi5hIGFuZCB0MS5i ID0gdDIuYgorCWpvaW4gc2ogdDMgb24gdDIuYSA9IHQzLmEgYW5kIHQyLmIgKyAxID0gdDMu YiArIDE7CisKKy0tIHN1YnNlbGVjdCB0aGF0IHJlZmVyZW5jZXMgdGhlIHJlbW92ZWQgcmVs YXRpb24KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCB0MS5hLCAoc2VsZWN0IGEgZnJv bSBzaiB3aGVyZSBhID0gdDIuYSBhbmQgYSA9IHQxLmEpCitmcm9tIHNqIHQxLCBzaiB0Mgor d2hlcmUgdDEuYSA9IHQyLmE7CisKKy0tIHNlbGYtam9pbiB1bmRlciBvdXRlciBqb2luCitl eHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHggam9pbiBzaiB5IG9uIHgu YSA9IHkuYQorbGVmdCBqb2luIGludDhfdGJsIHogb24geC5hID0gei5xMTsKKworZXhwbGFp biAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB4IGpvaW4gc2ogeSBvbiB4LmEgPSB5 LmEKK2xlZnQgam9pbiBpbnQ4X3RibCB6IG9uIHkuYSA9IHoucTE7CisKKy0tIFRlc3QgdGhh dCBwbGFjZWhvbGRlcnMgYXJlIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIGpvaW4gcmVtb3Zh bAorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSAodmFsdWVzICgxKSkgeAor bGVmdCBqb2luIChzZWxlY3QgY29hbGVzY2UoeS5xMSwgMSkgZnJvbSBpbnQ4X3RibCB5CisJ cmlnaHQgam9pbiBzaiBqMSBpbm5lciBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hCisJb24g dHJ1ZSkgegorb24gdHJ1ZTsKKworLS0gVGVzdCB0aGF0IE9SIHByZWRpY2F0ZWQgYXJlIHVw ZGF0ZWQgY29ycmVjdGx5IGFmdGVyIGpvaW4gcmVtb3ZhbAorQ1JFQVRFIFRBQkxFIHRhYl93 aXRoX2ZsYWcgKCBpZCBJTlQgUFJJTUFSWSBLRVksIGlzX2ZsYWcgU01BTExJTlQpOworQ1JF QVRFIElOREVYIGlkeF90ZXN0X2lzX2ZsYWcgT04gdGFiX3dpdGhfZmxhZyAoaXNfZmxhZyk7 CitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgQ09VTlQoKikgRlJPTSB0YWJfd2l0aF9m bGFnIFdIRVJFIChpc19mbGFnIElTIE5VTEwgT1IgaXNfZmxhZyA9IDApIEFORCBpZCBJTiAo U0VMRUNUIGlkIEZST00gdGFiX3dpdGhfZmxhZyBXSEVSRSBpZCBJTiAoMiwgMykpOworRFJP UCBUQUJMRSB0YWJfd2l0aF9mbGFnOworCistLSBIQVZJTkcgY2xhdXNlCitleHBsYWluIChj b3N0cyBvZmYpCitzZWxlY3QgcC5iIGZyb20gc2ogcCBqb2luIHNqIHEgb24gcC5hID0gcS5h IGdyb3VwIGJ5IHAuYiBoYXZpbmcgc3VtKHAuYSkgPSAxOworCistLSB1cGRhdGUgbGF0ZXJh bCByZWZlcmVuY2VzIGFuZCByYW5nZSB0YWJsZSBlbnRyeSByZWZlcmVuY2UKK2V4cGxhaW4g KHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAxIGZyb20gKHNlbGVjdCB4LiogZnJvbSBz aiB4LCBzaiB5IHdoZXJlIHguYSA9IHkuYSkgcSwKKyAgbGF0ZXJhbCBnZW5lcmF0ZV9zZXJp ZXMoMSwgcS5hKSBncyhpKTsKKworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2Vs ZWN0IDEgZnJvbSAoc2VsZWN0IHkuKiBmcm9tIHNqIHgsIHNqIHkgd2hlcmUgeC5hID0geS5h KSBxLAorICBsYXRlcmFsIGdlbmVyYXRlX3NlcmllcygxLCBxLmEpIGdzKGkpOworCistLSBU ZXN0IHRoYXQgYSBub24tRUMtZGVyaXZlZCBqb2luIGNsYXVzZSBpcyBwcm9jZXNzZWQgY29y cmVjdGx5LiBVc2UgYW4KKy0tIG91dGVyIGpvaW4gc28gdGhhdCB3ZSBjYW4ndCBmb3JtIGFu IEVDLgorZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgKiBmcm9tIHNqIHAgam9pbiBzaiBx IG9uIHAuYSA9IHEuYQorICBsZWZ0IGpvaW4gc2ogciBvbiBwLmEgKyBxLmEgPSByLmE7CisK Ky0tIEZJWE1FIHRoaXMgY29uc3RhbnQgZmFsc2UgZmlsdGVyIGRvZXNuJ3QgbG9vayBnb29k LiBTaG91bGQgd2UgbWVyZ2UKKy0tIGVxdWl2YWxlbmNlIGNsYXNzZXM/CitleHBsYWluIChj b3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcC5hID0gcS5hIGFu ZCBwLmIgPSAxIGFuZCBxLmIgPSAyOworCistLSBDaGVjayB0aGF0IGF0dHJfbmVlZGVkIGlz IHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIHNlbGYtam9pbiByZW1vdmFsLiBJbiB0aGlzCist LSB0ZXN0LCB0aGUgam9pbiBvZiBqMSB3aXRoIGoyIGlzIHJlbW92ZWQuIGsxLmIgaXMgcmVx dWlyZWQgYXQgZWl0aGVyIGoxIG9yIGoyLgorLS0gSWYgdGhpcyBpbmZvIGlzIGxvc3QsIGpv aW4gdGFyZ2V0bGlzdCBmb3IgKGsxLCBrMikgd2lsbCBub3QgY29udGFpbiBrMS5iLgorLS0g VXNlIGluZGV4IHNjYW4gZm9yIGsxIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0ICdiJyBmcm9tIHBo eXNpY2FsIHRsaXN0IHVzZWQgZm9yCistLSBzZXFzY2FuLiBBbHNvIGRpc2FibGUgcmVvcmRl cmluZyBvZiBqb2lucyBiZWNhdXNlIHRoaXMgdGVzdCBkZXBlbmRzIG9uIGEKKy0tIHBhcnRp Y3VsYXIgam9pbiB0cmVlLgorY3JlYXRlIHRhYmxlIHNrIChhIGludCwgYiBpbnQpOworY3Jl YXRlIGluZGV4IG9uIHNrKGEpOworc2V0IGpvaW5fY29sbGFwc2VfbGltaXQgdG8gMTsKK3Nl dCBlbmFibGVfc2Vxc2NhbiB0byBvZmY7CitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAx IGZyb20KKwkoc2sgazEgam9pbiBzayBrMiBvbiBrMS5hID0gazIuYSkKKwlqb2luIChzaiBq MSBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hKSBvbiBqMS5iID0gazEuYjsKK2V4cGxhaW4g KGNvc3RzIG9mZikgc2VsZWN0IDEgZnJvbQorCShzayBrMSBqb2luIHNrIGsyIG9uIGsxLmEg PSBrMi5hKQorCWpvaW4gKHNqIGoxIGpvaW4gc2ogajIgb24gajEuYSA9IGoyLmEpIG9uIGoy LmIgPSBrMS5iOworcmVzZXQgam9pbl9jb2xsYXBzZV9saW1pdDsKK3Jlc2V0IGVuYWJsZV9z ZXFzY2FuOworCistLSBDaGVjayB0aGF0IGNsYXVzZXMgZnJvbSB0aGUgam9pbiBmaWx0ZXIg bGlzdCBpcyBub3QgbG9zdCBvbiB0aGUgc2VsZi1qb2luIHJlbW92YWwKK0NSRUFURSBUQUJM RSBlbXAxICggaWQgU0VSSUFMIFBSSU1BUlkgS0VZIE5PVCBOVUxMLCBjb2RlIGludCk7Citl eHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCitTRUxFQ1QgKiBGUk9NIGVtcDEgZTEsIGVt cDEgZTIgV0hFUkUgZTEuaWQgPSBlMi5pZCBBTkQgZTIuY29kZSA8PiBlMS5jb2RlOworCist LSBXZSBjYW4gcmVtb3ZlIHRoZSBqb2luIGV2ZW4gaWYgd2UgZmluZCB0aGUgam9pbiBjYW4n dCBkdXBsaWNhdGUgcm93cyBhbmQKKy0tIHRoZSBiYXNlIHF1YWxzIG9mIGVhY2ggc2lkZSBh cmUgZGlmZmVyZW50LiAgSW4gdGhlIGZvbGxvd2luZyBjYXNlIHdlIGVuZCB1cAorLS0gbW92 aW5nIHF1YWxzIG92ZXIgdG8gczEgdG8gbWFrZSBpdCBzbyBpdCBjYW4ndCBtYXRjaCBhbnkg cm93cy4KK2NyZWF0ZSB0YWJsZSBzbChhIGludCwgYiBpbnQpOworY3JlYXRlIHVuaXF1ZSBp bmRleCBvbiBzbChhLCBiKTsKK3ZhY3V1bSBhbmFseXplIHNsOworCistLSBCb3RoIHNpZGVz IGFyZSB1bmlxdWUsIGJ1dCBiYXNlIHF1YWxzIGFyZSBkaWZmZXJlbnQKK2V4cGxhaW4gKGNv c3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyIHdoZXJlIHQxLmEgPSB0Mi5h IGFuZCB0MS5iID0gMSBhbmQgdDIuYiA9IDI7CisKKy0tIEpvaW4gcXVhbCBpc24ndCBtZXJn ZWpvaW5hYmxlLCBidXQgaW5uZXIgaXMgdW5pcXVlLgorZXhwbGFpbiAoQ09TVFMgT0ZGKQor U0VMRUNUIG4yLmEgRlJPTSBzaiBuMSwgc2ogbjIgV0hFUkUgbjEuYSA8PiBuMi5hIEFORCBu Mi5hID0gMTsKK2V4cGxhaW4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00KKwkoU0VMRUNU IG4yLmEgRlJPTSBzaiBuMSwgc2ogbjIgV0hFUkUgbjEuYSA8PiBuMi5hKSBxMCwgc2wKK1dI RVJFIHEwLmEgPSAxOworCistLQorLS0tLSBPbmx5IG9uZSBzaWRlIGlzIHVucWl1ZQorLS1z ZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0MS5hID0gdDIuYSBhbmQgdDEuYiA9 IDE7CistLXNlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyIHdoZXJlIHQxLmEgPSB0Mi5hIGFu ZCB0Mi5iID0gMTsKKy0tCistLS0tIFNldmVyYWwgdW5pcXVlcyBpbmRleGVzIG1hdGNoLCBh bmQgd2Ugc2VsZWN0IGEgZGlmZmVyZW50IG9uZQorLS0tLSBmb3IgZWFjaCBzaWRlLCBzbyB0 aGUgam9pbiBpcyBub3QgcmVtb3ZlZAorLS1jcmVhdGUgdGFibGUgc20oYSBpbnQgdW5pcXVl LCBiIGludCB1bmlxdWUsIGMgaW50IHVuaXF1ZSk7CistLWV4cGxhaW4gKGNvc3RzIG9mZikK Ky0tc2VsZWN0ICogZnJvbSBzbSBtLCBzbSBuIHdoZXJlIG0uYSA9IG4uYiBhbmQgbS5jID0g bi5jOworLS1leHBsYWluIChjb3N0cyBvZmYpCistLXNlbGVjdCAqIGZyb20gc20gbSwgc20g biB3aGVyZSBtLmEgPSBuLmMgYW5kIG0uYiA9IG4uYjsKKy0tZXhwbGFpbiAoY29zdHMgb2Zm KQorLS1zZWxlY3QgKiBmcm9tIHNtIG0sIHNtIG4gd2hlcmUgbS5jID0gbi5iIGFuZCBtLmEg PSBuLmE7CisKKy0tIENoZWNrIG9wdGltaXphdGlvbiBkaXNhYmxpbmcgaWYgaXQgd2lsbCB2 aW9sYXRlIHNwZWNpYWwgam9pbiBjb25kaXRpb25zLgorLS0gVHdvIGlkZW50aWNhbCBqb2lu ZWQgcmVsYXRpb25zIHNhdGlzZmllcyBzZWxmIGpvaW4gcmVtb3ZhbCBjb25kaXRpb25zIGJ1 dAorLS0gc3RheSBpbiBkaWZmZXJlbnQgc3BlY2lhbCBqb2luIGluZm9zLgorQ1JFQVRFIFRB QkxFIHNqX3QxIChpZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBUQUJMRSBzal90MiAoaWQg c2VyaWFsLCBhIGludCk7CitDUkVBVEUgVEFCTEUgc2pfdDMgKGlkIHNlcmlhbCwgYSBpbnQp OworQ1JFQVRFIFRBQkxFIHNqX3Q0IChpZCBzZXJpYWwsIGEgaW50KTsKKworQ1JFQVRFIFVO SVFVRSBJTkRFWCBPTiBzal90MyBVU0lORyBidHJlZSAoYSxpZCk7CitDUkVBVEUgVU5JUVVF IElOREVYIE9OIHNqX3QyIFVTSU5HIGJ0cmVlIChpZCk7CisKK0VYUExBSU4gKENPU1RTIE9G RikKK1NFTEVDVCAqIEZST00gc2pfdDEKK0pPSU4gKAorCVNFTEVDVCBzal90Mi5pZCBBUyBp ZCBGUk9NIHNqX3QyCisJV0hFUkUgRVhJU1RTCisJCSgKKwkJU0VMRUNUIFRSVUUgRlJPTSBz al90Myxzal90NCBXSEVSRSBzal90My5hID0gMSBBTkQgc2pfdDMuaWQgPSBzal90Mi5pZAor CQkpCisJKSB0MnQzdDQKK09OIHNqX3QxLmlkID0gdDJ0M3Q0LmlkCitKT0lOICgKKwlTRUxF Q1Qgc2pfdDIuaWQgQVMgaWQgRlJPTSBzal90MgorCVdIRVJFIEVYSVNUUworCQkoCisJCVNF TEVDVCBUUlVFIEZST00gc2pfdDMsc2pfdDQgV0hFUkUgc2pfdDMuYSA9IDEgQU5EIHNqX3Qz LmlkID0gc2pfdDIuaWQKKwkJKQorCSkgX3QydDN0NAorT04gc2pfdDEuaWQgPSBfdDJ0M3Q0 LmlkOworCityZXNldCBlbmFibGVfaGFzaGpvaW47CityZXNldCBlbmFibGVfbWVyZ2Vqb2lu OworCiAtLQogLS0gVGVzdCBoaW50cyBnaXZlbiBvbiBpbmNvcnJlY3QgY29sdW1uIHJlZmVy ZW5jZXMgYXJlIHVzZWZ1bAogLS0KLS0gCjIuMjUuMQoK --------------YgnYS1yUkKKddgkSwfXo2mBC--