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 1sy1Ii-00DnU5-RA for pgsql-hackers@arkaria.postgresql.org; Tue, 08 Oct 2024 03:54:21 +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 1sy1Ih-002J5t-2m for pgsql-hackers@arkaria.postgresql.org; Tue, 08 Oct 2024 03:54:19 +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 1sy1Ig-002J4s-GX for pgsql-hackers@lists.postgresql.org; Tue, 08 Oct 2024 03:54:18 +0000 Received: from mail-pg1-x52d.google.com ([2607:f8b0:4864:20::52d]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1sy1Ib-00389X-Fl for pgsql-hackers@lists.postgresql.org; Tue, 08 Oct 2024 03:54:17 +0000 Received: by mail-pg1-x52d.google.com with SMTP id 41be03b00d2f7-7db637d1e4eso3751330a12.2 for ; Mon, 07 Oct 2024 20:54:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1728359651; x=1728964451; darn=lists.postgresql.org; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=t9gBjEaKyfLF4GcQuzmcgH6QtGYSpK6lIlBzBj/2dAU=; b=AkKLO6T80/GtpcpSXkDrAEi6RGrc6yTkc5MF2I22hH357vhds91vT7DV4D4A023ToZ Knc84EQODEkneY0SIvQswXVRtZcPYw0oi/NZKyGGMQizTut0o3AVt+OrGYpbu3MMEnt1 7T3vJU44SPLltSl9ZFvkAfzZdIuBXPWPr0UZlmI5pBVXYkDG/6QdzAjda9ewvgKYRbq/ 2Vohiw6fhlFf5nT2p24yAKZ41PHkEChO2U+yg09WcjCpeIxhTvAAZD3RDmwZFKGVUcm4 jqzFnZuSGBnrxfjnD56p0grcuakl7tGCahPEtU1MJprjdNwwzSy+JXZFsHB+4Svzdfch aowA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1728359651; x=1728964451; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=t9gBjEaKyfLF4GcQuzmcgH6QtGYSpK6lIlBzBj/2dAU=; b=HuF8X6awKdr77jHUEQqtLUhqwz/xcsfLewqpvsv1dqDcwUBgunPWmvkN+CvtpdsguJ sPekoK/QwzXegDOuThOZv3wdCmn6mxmVjmKls7rg6Z63ms83q72dUn8uZi57Icdf/RTC lkIuQkK6QJw5B8p2D7XO5n1mbjP7RflGc6lY0RJ4JeWtFOh2eXarXdqHRHRkWqoSOLsg UAicrt89l07Fd1jZMka4QzMmrgmP+r9Q/Y86LgsfwnyScVcBsSZ7TFyrgRQ4uiSeA9PE 0j8tsghn2H+KxhSrXQR0JLJ6gd/fkFxqHOiLW5JFz4ZBaCQBcjS+knTiiS8X2M1a8L/O bRdQ== X-Forwarded-Encrypted: i=1; AJvYcCV8sbZBxasK4DEqa5JQQkghzXAcCltF6kovhZGuVFzRCQcwJyWkOsOCLo6dW8ALe2BTRCwUR/Xt035ErrYl@lists.postgresql.org X-Gm-Message-State: AOJu0YxIE+IyJXpi3mFinEperfCr2g4KNHSa+ROTLEvH+ju3BT6o/Gq4 ZsYU2vwbwDUR3BgheEG7RfqGXBIVos3zgLEMWIBZxkXdtrAkza40 X-Google-Smtp-Source: AGHT+IG+73S8bqa9mjJfP4rY1Yk01ZL653aUG96kjhwt0R6DrT/T4MlfvWp1iCYaptnkUHyVoDS0JQ== X-Received: by 2002:a17:90b:4c0d:b0:2d3:b438:725f with SMTP id 98e67ed59e1d1-2e1e62a978bmr16374454a91.24.1728359650631; Mon, 07 Oct 2024 20:54:10 -0700 (PDT) Received: from [10.10.20.99] (node-oie.pool-125-26.dynamic.totinternet.net. [125.26.124.22]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-20c13986787sm47134645ad.242.2024.10.07.20.54.05 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 07 Oct 2024 20:54:09 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------oJP06AU0YnCpwIpPfnvIobDI" Message-ID: <1b69a5a4-674e-4bd2-b711-e15ed593ec7d@gmail.com> Date: Tue, 8 Oct 2024 10:54:02 +0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Removing unneeded self joins To: Dean Rasheed , Alexander Korotkov Cc: Tom Lane , Robert Haas , Richard Guo , Alexander Lakhin , "Gregory Stark (as CFM)" , =?UTF-8?Q?Micha=C5=82_K=C5=82eczek?= , PostgreSQL Hackers References: <64486b0b-0404-e39e-322d-0801154901f3@postgrespro.ru> <735b5cd4-568d-fbf7-ad8c-dcfb4c3af86e@gmail.com> <2422119.1714691974@sss.pgh.pa.us> <24e93efd-eeac-43a6-a75a-ad68eacb32ee@postgrespro.ru> <3622801.1715010885@sss.pgh.pa.us> Content-Language: en-AU From: Andrei Lepikhov In-Reply-To: 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. --------------oJP06AU0YnCpwIpPfnvIobDI Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 7/24/24 18:07, Dean Rasheed wrote: > On Sat, 20 Jul 2024 at 12:39, Alexander Korotkov wrote: >> >>> The new function replace_relid() looks to be the same as adjust_relid_set(). >> >> They are similar, not the same. replace_relid() has handling for >> negative newId, while adjust_relid_set() hasn't. One thing I'd like >> to borrow from adjust_relid_set() to replace_relid() is the usage of >> IS_SPECIAL_VARNO() macro. > > Ah, that makes sense. In that case, I'd say that replace_relid() > should go in analyzejoins.c (and be a local function there), since > that's the only place that requires this special negative newId > handling. Done. See attachment. > So you have to remember that "inner" is "outer" and "outer" is "inner" > when going into generate_join_implied_equalities() from > remove_self_joins_one_group(). And the same thing happens when calling > innerrel_is_unique_ext() and match_unique_clauses(). I think all that > could be resolved by swapping "inner" and "outer" in the variable > names and comments in remove_self_joins_one_group(). As you can see, when you dive into the implementation of the generate_join_implied_equalities, an inner join works symmetrically. We don't need any other clauses here, except mentioning both inner and outer to prove self-join. So, it doesn't matter which side to choose as an inner - all the effect can be: instead of x1=x2, we will have clause x2=x1. > selfjoinquals = list_concat(selfjoinquals, outer->baserestrictinfo); > > That appears to be pointless, because is_innerrel_unique_for() will > filter the restrictlist it is given, removing those baserestrictinfo > clauses (because I think they'll always have can_join = false). And > then relation_has_unique_index_ext() will re-add them: Yeah, we used to have it to work out the case, then restrictlist == NIL. I agree, it may be a bit strange and too expensive. Let's add a flag check inside the innerrel_is_unique_ext instead. > This presumes that any caller interested in knowing the extra > baserestrictinfo clauses used to prove uniqueness must be looking at a > self join. That may be true today, but it doesn't seem like a good API > design choice. I think it would be better to just add "self_join" as > an extra parameter, and also maybe have the function return the > UniqueRelInfo containing the "extra_clauses", or NULL if it's not > unique. That way, it would be more extensible, if we wanted it to > return more information in the future. If more users are interested in this function, we can just rename the flag self_join to something more universal - extra_prove, I'm not sure. > > Instead of adding relation_has_unique_index_ext(), maybe it would be > OK to just change the signature of relation_has_unique_index_for(). It > looks like it's only called from one other place outside > analyzejoins.c. Perhaps the same is true for innerrel_is_unique_ext(). I vote against it remembering of extensions and broken APIs. > > Should match_unique_clauses() be comparing mergeopfamilies or opnos to > ensure that the clauses are using the same equality operator? Having the same variable side, same constant, unique index? I can imagine only a self-made algebra, which can break something here, but it looks like over-engineering, right? Attached version is rebased onto the new master. Because of a3179ab it may be necessary to do more detailed review. -- regards, Andrei Lepikhov --------------oJP06AU0YnCpwIpPfnvIobDI Content-Type: text/x-patch; charset=UTF-8; name="v8-0001-Remove-useless-self-joins.patch" Content-Disposition: attachment; filename="v8-0001-Remove-useless-self-joins.patch" Content-Transfer-Encoding: base64 RnJvbSAzNThhYWZhZmM5ZjYxYjUyYzM5ZDJhNzU0ZTdiMzIzYWRhMDBiNzhiIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmVpIFYuIExlcGlraG92IiA8bGVwaWhvdkBn bWFpbC5jb20+CkRhdGU6IE1vbiwgNyBPY3QgMjAyNCAxMDo0MzowNCArMDcwMApTdWJqZWN0 OiBbUEFUQ0ggdjhdIFJlbW92ZSB1c2VsZXNzIHNlbGYtam9pbnMKTUlNRS1WZXJzaW9uOiAx LjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04CkNvbnRlbnQtVHJh bnNmZXItRW5jb2Rpbmc6IDhiaXQKClRoZSBTZWxmIEpvaW4gRWxpbWluYXRpb24gKFNKRSkg ZmVhdHVyZSByZW1vdmVzIGFuIGlubmVyIGpvaW4gb2YgYSBwbGFpbiB0YWJsZQp0byBpdHNl bGYgaW4gdGhlIHF1ZXJ5IHRyZWUgaWYgaXMgcHJvdmVkIHRoYXQgdGhlIGpvaW4gY2FuIGJl IHJlcGxhY2VkIHdpdGgKYSBzY2FuIHdpdGhvdXQgaW1wYWN0aW5nIHRoZSBxdWVyeSByZXN1 bHQuIFNlbGYtam9pbiBhbmQgaW5uZXIgcmVsYXRpb24gYXJlCnJlcGxhY2VkIHdpdGggdGhl IG91dGVyIGluIHF1ZXJ5LCBlcXVpdmFsZW5jZSBjbGFzc2VzLCBhbmQgcGxhbm5lciBpbmZv CnN0cnVjdHVyZXMuIEFsc28sIHRoZSBpbm5lciByZXN0cmljdGxpc3QgbW92ZXMgdG8gdGhl IG91dGVyIG9uZSwgYW5kIGR1cGxpY2F0ZWQKY2xhdXNlcyBhcmUgcmVtb3ZlZC4gVGh1cywg dGhpcyBvcHRpbWl6YXRpb24gcmVkdWNlcyB0aGUgbGVuZ3RoIG9mIHRoZSByYW5nZQp0YWJs ZSBsaXN0ICh0aGlzIGVzcGVjaWFsbHkgbWFrZXMgc2Vuc2UgZm9yIHBhcnRpdGlvbmVkIHJl bGF0aW9ucyksIHJlZHVjZXMgdGhlCm51bWJlciBvZiByZXN0cmljdGlvbiBjbGF1c2VzID09 PSBzZWxlY3Rpdml0eSBlc3RpbWF0aW9ucywgYW5kIHBvdGVudGlhbGx5IGNhbgppbXByb3Zl IHRvdGFsIHBsYW5uZXIgcHJlZGljdGlvbiBmb3IgdGhlIHF1ZXJ5LgpUaGUgU0pFIHByb29m IGlzIGJhc2VkIG9uIGlubmVycmVsX2lzX3VuaXF1ZSBtYWNoaW5lcnkuCgpXZSBjYW4gcmVt b3ZlIGEgc2VsZi1qb2luIHdoZW4gZm9yIGVhY2ggb3V0ZXIgcm93OgoxLiBBdCBtb3N0IG9u ZSBpbm5lciByb3cgbWF0Y2hlcyB0aGUgam9pbiBjbGF1c2UuCjIuIEVhY2ggbWF0Y2hlZCBp bm5lciByb3cgbXVzdCBiZSAocGh5c2ljYWxseSkgdGhlIHNhbWUgcm93IGFzIHRoZSBvdXRl ciBvbmUuCgpJbiB0aGlzIHBhdGNoLCB3ZSB1c2UgdGhlIG5leHQgYXBwcm9hY2ggdG8gaWRl bnRpZnkgYSBzZWxmLWpvaW46CjEuIENvbGxlY3QgYWxsIG1lcmdlLWpvaW5hYmxlIGpvaW4g cXVhbHMgd2hpY2ggbG9vayBsaWtlIGEueCA9IGIueAoyLiBBZGQgdG8gdGhlIGxpc3QgYWJv dmUgdGhlIGJhc2VyZXN0cmljdGluZm8gb2YgdGhlIGlubmVyIHRhYmxlLgozLiBDaGVjayBp bm5lcnJlbF9pc191bmlxdWUoKSBmb3IgdGhlIHF1YWwgbGlzdC4gIElmIGl0IHJldHVybnMg ZmFsc2UsIHNraXAKdGhpcyBwYWlyIG9mIGpvaW5pbmcgdGFibGVzLgo0LiBDaGVjayB1bmlx dWVuZXNzLCBwcm92ZWQgYnkgdGhlIGJhc2VyZXN0cmljdGluZm8gY2xhdXNlcy4gVG8gcHJv dmUgdGhlCnBvc3NpYmlsaXR5IG9mIHNlbGYtam9pbiBlbGltaW5hdGlvbiwgdGhlIGlubmVy IGFuZCBvdXRlciBjbGF1c2VzIG11c3QgbWF0Y2gKZXhhY3RseS4KClRoZSByZWxhdGlvbiBy ZXBsYWNlbWVudCBwcm9jZWR1cmUgaXMgbm90IHRyaXZpYWwgYW5kIGl0IGlzIHBhcnRseSBj b21iaW5lZAp3aXRoIHRoZSBvbmUsIHVzZWQgdG8gcmVtb3ZlIHVzZWxlc3MgbGVmdCBqb2lu cy4gVGVzdHMsIGNvdmVyaW5nIHRoaXMgZmVhdHVyZSwKd2VyZSBhZGRlZCB0byBqb2luLnNx bC4gU29tZSByZWdyZXNzaW9uIHRlc3RzIGNoYW5nZWQgZHVlIHRvIHNlbGYtam9pbiByZW1v dmFsCmxvZ2ljLgoKRGlzY3Vzc2lvbjogaHR0cHM6Ly9wb3N0Z3IuZXMvbS9mbGF0LzY0NDg2 YjBiLTA0MDQtZTM5ZS0zMjJkLTA4MDExNTQ5MDFmMyU0MHBvc3RncmVzcHJvLnJ1CgpBdXRo b3I6IEFuZHJleSBMZXBpa2hvdiwgQWxleGFuZGVyIEt1em1lbmtvdgpSZXZpZXdlZC1ieTog VG9tIExhbmUsIFJvYmVydCBIYWFzLCBBbmRyZXMgRnJldW5kLCBTaW1vbiBSaWdncywgSm9u YXRoYW4gUy4gS2F0egpSZXZpZXdlZC1ieTogRGF2aWQgUm93bGV5LCBUaG9tYXMgTXVucm8s IEtvbnN0YW50aW4gS25pemhuaWssIEhlaWtraSBMaW5uYWthbmdhcwpSZXZpZXdlZC1ieTog SHl3ZWwgQ2FydmVyLCBMYXVyZW56IEFsYmUsIFJvbmFuIER1bmtsYXUsIHZpZ25lc2ggQywg WmhpaG9uZyBZdQpSZXZpZXdlZC1ieTogR3JlZyBTdGFyaywgSmFpbWUgQ2FzYW5vdmEsIE1p Y2hhxYIgS8WCZWN6ZWssIEFsZW5hIFJ5YmFraW5hClJldmlld2VkLWJ5OiBBbGV4YW5kZXIg S29yb3Rrb3YKLS0tCiBkb2Mvc3JjL3NnbWwvY29uZmlnLnNnbWwgICAgICAgICAgICAgICAg ICB8ICAgMTYgKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvZXF1aXZjbGFzcy5jICAg fCAgICAzICstCiBzcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jICAgICB8 ICAgMzkgKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vYW5hbHl6ZWpvaW5zLmMgfCAx MTU3ICsrKysrKysrKysrKysrKysrKystLQogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4v cGxhbm1haW4uYyAgICAgfCAgICA1ICsKIHNyYy9iYWNrZW5kL29wdGltaXplci9wcmVwL3By ZXB1bmlvbi5jICAgIHwgICAgNyArLQogc3JjL2JhY2tlbmQvcmV3cml0ZS9yZXdyaXRlTWFu aXAuYyAgICAgICAgfCAgMTEwICstCiBzcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJs ZXMuYyAgICAgICB8ICAgMTAgKwogc3JjL2luY2x1ZGUvbm9kZXMvcGF0aG5vZGVzLmggICAg ICAgICAgICAgfCAgIDM1ICstCiBzcmMvaW5jbHVkZS9vcHRpbWl6ZXIvb3B0aW1pemVyLmgg ICAgICAgICB8ICAgIDIgKwogc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhzLmggICAgICAg ICAgICAgfCAgICAzICsKIHNyYy9pbmNsdWRlL29wdGltaXplci9wbGFubWFpbi5oICAgICAg ICAgIHwgICAgNiArCiBzcmMvaW5jbHVkZS9yZXdyaXRlL3Jld3JpdGVNYW5pcC5oICAgICAg ICB8ICAgIDMgKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dCAg fCAgIDMwICsKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgICAgICAgIHwg MTA3OSArKysrKysrKysrKysrKysrKysrCiBzcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N5 c3ZpZXdzLm91dCAgICB8ICAgIDMgKy0KIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2VxdWl2Y2xh c3Muc3FsICAgICAgIHwgICAxNiArCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbCAg ICAgICAgICAgICB8ICA0OTAgKysrKysrKysrCiBzcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRl ZnMubGlzdCAgICAgICAgICB8ICAgIDMgKwogMTkgZmlsZXMgY2hhbmdlZCwgMjkxOCBpbnNl cnRpb25zKCspLCA5OSBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwv Y29uZmlnLnNnbWwgYi9kb2Mvc3JjL3NnbWwvY29uZmlnLnNnbWwKaW5kZXggOTcwN2Q1MjM4 ZC4uY2YwZGVlNjBmMCAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL2NvbmZpZy5zZ21sCisr KyBiL2RvYy9zcmMvc2dtbC9jb25maWcuc2dtbApAQCAtNTYyMiw2ICs1NjIyLDIyIEBAIEFO WSA8cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+bnVtX3N5bmM8L3JlcGxhY2VhYmxl PiAoIDxyZXBsYWNlYWJsZSBjbGFzcz0iCiAgICAgICA8L2xpc3RpdGVtPgogICAgICA8L3Zh cmxpc3RlbnRyeT4KIAorICAgICA8dmFybGlzdGVudHJ5IGlkPSJndWMtZW5hYmxlX3NlbGZf am9pbl9yZW1vdmFsIiB4cmVmbGFiZWw9ImVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbCI+Cisg ICAgICA8dGVybT48dmFybmFtZT5lbmFibGVfc2VsZl9qb2luX3JlbW92YWw8L3Zhcm5hbWU+ ICg8dHlwZT5ib29sZWFuPC90eXBlPikKKyAgICAgIDxpbmRleHRlcm0+CisgICAgICAgPHBy aW1hcnk+PHZhcm5hbWU+ZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsPC92YXJuYW1lPiBjb25m aWd1cmF0aW9uIHBhcmFtZXRlcjwvcHJpbWFyeT4KKyAgICAgIDwvaW5kZXh0ZXJtPgorICAg ICAgPC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAgICBF bmFibGVzIG9yIGRpc2FibGVzIHRoZSBxdWVyeSBwbGFubmVyJ3Mgb3B0aW1pemF0aW9uIHdo aWNoIGFuYWx5c2VzCisgICAgICAgIHRoZSBxdWVyeSB0cmVlIGFuZCByZXBsYWNlcyBzZWxm IGpvaW5zIHdpdGggc2VtYW50aWNhbGx5IGVxdWl2YWxlbnQKKyAgICAgICAgc2luZ2xlIHNj YW5zLiAgVGFrZXMgaW50byBjb25zaWRlcmF0aW9uIG9ubHkgcGxhaW4gdGFibGVzLgorICAg ICAgICBUaGUgZGVmYXVsdCBpcyA8bGl0ZXJhbD5vbjwvbGl0ZXJhbD4uCisgICAgICAgPC9w YXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC92YXJsaXN0ZW50cnk+CisKICAgICAg PHZhcmxpc3RlbnRyeSBpZD0iZ3VjLWVuYWJsZS1zZXFzY2FuIiB4cmVmbGFiZWw9ImVuYWJs ZV9zZXFzY2FuIj4KICAgICAgIDx0ZXJtPjx2YXJuYW1lPmVuYWJsZV9zZXFzY2FuPC92YXJu YW1lPiAoPHR5cGU+Ym9vbGVhbjwvdHlwZT4pCiAgICAgICA8aW5kZXh0ZXJtPgpkaWZmIC0t Z2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvZXF1aXZjbGFzcy5jIGIvc3JjL2Jh Y2tlbmQvb3B0aW1pemVyL3BhdGgvZXF1aXZjbGFzcy5jCmluZGV4IDhmNmYwMDVlY2IuLmNl NWQ4ZmMzYWMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2VxdWl2 Y2xhc3MuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9lcXVpdmNsYXNzLmMK QEAgLTg2MCw3ICs4NjAsOCBAQCBmaW5kX2NvbXB1dGFibGVfZWNfbWVtYmVyKFBsYW5uZXJJ bmZvICpyb290LAogCQlleHBydmFycyA9IHB1bGxfdmFyX2NsYXVzZSgoTm9kZSAqKSBlbS0+ ZW1fZXhwciwKIAkJCQkJCQkJICAgUFZDX0lOQ0xVREVfQUdHUkVHQVRFUyB8CiAJCQkJCQkJ CSAgIFBWQ19JTkNMVURFX1dJTkRPV0ZVTkNTIHwKLQkJCQkJCQkJICAgUFZDX0lOQ0xVREVf UExBQ0VIT0xERVJTKTsKKwkJCQkJCQkJICAgUFZDX0lOQ0xVREVfUExBQ0VIT0xERVJTIHwK KwkJCQkJCQkJICAgUFZDX0lOQ0xVREVfQ09OVkVSVFJPV1RZUEVTKTsKIAkJZm9yZWFjaChs YzIsIGV4cHJ2YXJzKQogCQl7CiAJCQlpZiAoIWlzX2V4cHJsaXN0X21lbWJlcihsZmlyc3Qo bGMyKSwgZXhwcnMpKQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgv aW5keHBhdGguYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMKaW5k ZXggYzBmY2M3ZDc4ZC4uMjIzMGIxMzEwNCAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3BhdGgvaW5keHBhdGguYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0 aC9pbmR4cGF0aC5jCkBAIC0zNDQwLDYgKzM0NDAsMjIgQEAgYm9vbAogcmVsYXRpb25faGFz X3VuaXF1ZV9pbmRleF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwK IAkJCQkJCQkgIExpc3QgKnJlc3RyaWN0bGlzdCwKIAkJCQkJCQkgIExpc3QgKmV4cHJsaXN0 LCBMaXN0ICpvcHJsaXN0KQoreworCXJldHVybiByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4 X2V4dChyb290LCByZWwsIHJlc3RyaWN0bGlzdCwKKwkJCQkJCQkJCQkgZXhwcmxpc3QsIG9w cmxpc3QsIE5VTEwpOworfQorCisvKgorICogcmVsYXRpb25faGFzX3VuaXF1ZV9pbmRleF9l eHQKKyAqCSAgU2FtZSBhcyByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvcigpLCBidXQg c3VwcG9ydHMgZXh0cmFfY2xhdXNlcworICoJICBwYXJhbWV0ZXIuICBJZiBleHRyYV9jbGF1 c2VzIGlzbid0IE5VTEwsIHJldHVybiBiYXNlcmVzdHJpY3RpbmZvIGNsYXVzZXMKKyAqCSAg d2hpY2ggd2VyZSB1c2VkIHRvIGRlcml2ZSB1bmlxdWVuZXNzLgorICovCitib29sCityZWxh dGlvbl9oYXNfdW5pcXVlX2luZGV4X2V4dChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5m byAqcmVsLAorCQkJCQkJCSAgTGlzdCAqcmVzdHJpY3RsaXN0LAorCQkJCQkJCSAgTGlzdCAq ZXhwcmxpc3QsIExpc3QgKm9wcmxpc3QsCisJCQkJCQkJICBMaXN0ICoqZXh0cmFfY2xhdXNl cykKIHsKIAlMaXN0Q2VsbCAgICppYzsKIApAQCAtMzQ5NSw2ICszNTExLDcgQEAgcmVsYXRp b25faGFzX3VuaXF1ZV9pbmRleF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8g KnJlbCwKIAl7CiAJCUluZGV4T3B0SW5mbyAqaW5kID0gKEluZGV4T3B0SW5mbyAqKSBsZmly c3QoaWMpOwogCQlpbnQJCQljOworCQlMaXN0CSAgICpleHBycyA9IE5JTDsKIAogCQkvKgog CQkgKiBJZiB0aGUgaW5kZXggaXMgbm90IHVuaXF1ZSwgb3Igbm90IGltbWVkaWF0ZWx5IGVu Zm9yY2VkLCBvciBpZiBpdCdzCkBAIC0zNTQ2LDYgKzM1NjMsMjQgQEAgcmVsYXRpb25faGFz X3VuaXF1ZV9pbmRleF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwK IAkJCQlpZiAobWF0Y2hfaW5kZXhfdG9fb3BlcmFuZChyZXhwciwgYywgaW5kKSkKIAkJCQl7 CiAJCQkJCW1hdGNoZWQgPSB0cnVlOyAvKiBjb2x1bW4gaXMgdW5pcXVlICovCisKKwkJCQkJ aWYgKGJtc19tZW1iZXJzaGlwKHJpbmZvLT5jbGF1c2VfcmVsaWRzKSA9PSBCTVNfU0lOR0xF VE9OKQorCQkJCQl7CisJCQkJCQlNZW1vcnlDb250ZXh0IG9sZE1lbUN0eCA9CisJCQkJCQkJ TWVtb3J5Q29udGV4dFN3aXRjaFRvKHJvb3QtPnBsYW5uZXJfY3h0KTsKKworCQkJCQkJLyoK KwkJCQkJCSAqIEFkZCBmaWx0ZXIgY2xhdXNlIGludG8gYSBsaXN0IGFsbG93aW5nIGNhbGxl ciB0bworCQkJCQkJICoga25vdyBpZiB1bmlxdWVuZXNzIGhhdmUgbWFkZSBub3Qgb25seSBi eSBqb2luCisJCQkJCQkgKiBjbGF1c2VzLgorCQkJCQkJICovCisJCQkJCQlBc3NlcnQoYm1z X2lzX2VtcHR5KHJpbmZvLT5sZWZ0X3JlbGlkcykgfHwKKwkJCQkJCQkgICBibXNfaXNfZW1w dHkocmluZm8tPnJpZ2h0X3JlbGlkcykpOworCQkJCQkJaWYgKGV4dHJhX2NsYXVzZXMpCisJ CQkJCQkJZXhwcnMgPSBsYXBwZW5kKGV4cHJzLCByaW5mbyk7CisJCQkJCQlNZW1vcnlDb250 ZXh0U3dpdGNoVG8ob2xkTWVtQ3R4KTsKKwkJCQkJfQorCiAJCQkJCWJyZWFrOwogCQkJCX0K IAkJCX0KQEAgLTM1ODgsNyArMzYyMywxMSBAQCByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4 X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCiAJCS8qIE1hdGNo ZWQgYWxsIGtleSBjb2x1bW5zIG9mIHRoaXMgaW5kZXg/ICovCiAJCWlmIChjID09IGluZC0+ bmtleWNvbHVtbnMpCisJCXsKKwkJCWlmIChleHRyYV9jbGF1c2VzKQorCQkJCSpleHRyYV9j bGF1c2VzID0gZXhwcnM7CiAJCQlyZXR1cm4gdHJ1ZTsKKwkJfQogCX0KIAogCXJldHVybiBm YWxzZTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wbGFuL2FuYWx5emVq b2lucy5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vYW5hbHl6ZWpvaW5zLmMKaW5k ZXggOTI4ZDkyNjY0NS4uYzQzNDNjM2RjMiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3BsYW4vYW5hbHl6ZWpvaW5zLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVy L3BsYW4vYW5hbHl6ZWpvaW5zLmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqLwogI2luY2x1ZGUg InBvc3RncmVzLmgiCiAKKyNpbmNsdWRlICJjYXRhbG9nL3BnX2NsYXNzLmgiCiAjaW5jbHVk ZSAibm9kZXMvbm9kZUZ1bmNzLmgiCiAjaW5jbHVkZSAib3B0aW1pemVyL2pvaW5pbmZvLmgi CiAjaW5jbHVkZSAib3B0aW1pemVyL29wdGltaXplci5oIgpAQCAtMzAsMTIgKzMxLDMwIEBA CiAjaW5jbHVkZSAib3B0aW1pemVyL3BsYWNlaG9sZGVyLmgiCiAjaW5jbHVkZSAib3B0aW1p emVyL3BsYW5tYWluLmgiCiAjaW5jbHVkZSAib3B0aW1pemVyL3Jlc3RyaWN0aW5mby5oIgor I2luY2x1ZGUgInJld3JpdGUvcmV3cml0ZU1hbmlwLmgiCiAjaW5jbHVkZSAidXRpbHMvbHN5 c2NhY2hlLmgiCiAKKy8qCisgKiBVdGlsaXR5IHN0cnVjdHVyZS4gSXQgaXMgbmVlZGVkIHRv IHBlcmZvcm0gYSBzb3J0aW5nIHByb2NlZHVyZSBhbmQgc2ltcGxpZnkKKyAqIHRoZSBzZWFy Y2ggb2YgU0pFLWNhbmRpZGF0ZSBiYXNlcmVscyByZWZlcmVuY2luZyB0aGUgc2FtZSBkYXRh YmFzZSByZWxhdGlvbi4KKyAqIEhhdmluZyBjb2xsZWN0ZWQgYWxsIGJhc2VyZWxzIGZyb20g dGhlIHF1ZXJ5IGpvaW50cmVlLCB0aGUgcGxhbm5lciBzb3J0cyB0aGVtCisgKiBhY2NvcmRp bmcgdG8gdGhlIHJlbG9pZCB2YWx1ZSwgZ3JvdXBzIHRoZW0gd2l0aCB0aGUgbmV4dCBwYXNz IGFuZCBhdHRlbXB0cyB0bworICogcmVtb3ZlIHNlbGYtam9pbnMuCisgKiBQcmVsaW1pbmFy eSBzb3J0aW5nIHByZXZlbnRzIHF1YWRyYXRpYyBiZWhhdmlvdXIgdGhhdCBjYW4gYmUgaGFy bWZ1bCBpbiB0aGUKKyAqIGNhc2Ugb2YgbnVtZXJvdXMgam9pbnMuCisgKi8KK3R5cGVkZWYg c3RydWN0Cit7CisJaW50CQkJcmVsaWQ7CisJT2lkCQkJcmVsb2lkOworfSBTZWxmSm9pbkNh bmRpZGF0ZTsKKworYm9vbAkJZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsOworCiAvKiBsb2Nh bCBmdW5jdGlvbnMgKi8KIHN0YXRpYyBib29sIGpvaW5faXNfcmVtb3ZhYmxlKFBsYW5uZXJJ bmZvICpyb290LCBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbyk7Ci1zdGF0aWMgdm9pZCByZW1v dmVfcmVsX2Zyb21fcXVlcnkoUGxhbm5lckluZm8gKnJvb3QsIGludCByZWxpZCwKLQkJCQkJ CQkJICBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbyk7CitzdGF0aWMgdm9pZCByZW1vdmVfbGVm dGpvaW5yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLAorCQkJ CQkJCQkJCSAgU3BlY2lhbEpvaW5JbmZvICpzamluZm8pOwogc3RhdGljIHZvaWQgcmVtb3Zl X3JlbF9mcm9tX3Jlc3RyaWN0aW5mbyhSZXN0cmljdEluZm8gKnJpbmZvLAogCQkJCQkJCQkJ CSBpbnQgcmVsaWQsIGludCBvanJlbGlkKTsKIHN0YXRpYyB2b2lkIHJlbW92ZV9yZWxfZnJv bV9lY2xhc3MoRXF1aXZhbGVuY2VDbGFzcyAqZWMsCkBAIC00MywxNCArNjIsMTYgQEAgc3Rh dGljIHZvaWQgcmVtb3ZlX3JlbF9mcm9tX2VjbGFzcyhFcXVpdmFsZW5jZUNsYXNzICplYywK IHN0YXRpYyBMaXN0ICpyZW1vdmVfcmVsX2Zyb21fam9pbmxpc3QoTGlzdCAqam9pbmxpc3Qs IGludCByZWxpZCwgaW50ICpucmVtb3ZlZCk7CiBzdGF0aWMgYm9vbCByZWxfc3VwcG9ydHNf ZGlzdGluY3RuZXNzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpOwogc3Rh dGljIGJvb2wgcmVsX2lzX2Rpc3RpbmN0X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0 SW5mbyAqcmVsLAotCQkJCQkJCQlMaXN0ICpjbGF1c2VfbGlzdCk7CisJCQkJCQkJCUxpc3Qg KmNsYXVzZV9saXN0LCBMaXN0ICoqZXh0cmFfY2xhdXNlcyk7CiBzdGF0aWMgT2lkCWRpc3Rp bmN0X2NvbF9zZWFyY2goaW50IGNvbG5vLCBMaXN0ICpjb2xub3MsIExpc3QgKm9waWRzKTsK IHN0YXRpYyBib29sIGlzX2lubmVycmVsX3VuaXF1ZV9mb3IoUGxhbm5lckluZm8gKnJvb3Qs CiAJCQkJCQkJCSAgIFJlbGlkcyBqb2lucmVsaWRzLAogCQkJCQkJCQkgICBSZWxpZHMgb3V0 ZXJyZWxpZHMsCiAJCQkJCQkJCSAgIFJlbE9wdEluZm8gKmlubmVycmVsLAogCQkJCQkJCQkg ICBKb2luVHlwZSBqb2ludHlwZSwKLQkJCQkJCQkJICAgTGlzdCAqcmVzdHJpY3RsaXN0KTsK KwkJCQkJCQkJICAgTGlzdCAqcmVzdHJpY3RsaXN0LAorCQkJCQkJCQkgICBMaXN0ICoqZXh0 cmFfY2xhdXNlcyk7CitzdGF0aWMgaW50CXNlbGZfam9pbl9jYW5kaWRhdGVzX2NtcChjb25z dCB2b2lkICphLCBjb25zdCB2b2lkICpiKTsKIAogCiAvKgpAQCAtODgsNyArMTA5LDcgQEAg cmVzdGFydDoKIAkJICovCiAJCWlubmVycmVsaWQgPSBibXNfc2luZ2xldG9uX21lbWJlcihz amluZm8tPm1pbl9yaWdodGhhbmQpOwogCi0JCXJlbW92ZV9yZWxfZnJvbV9xdWVyeShyb290 LCBpbm5lcnJlbGlkLCBzamluZm8pOworCQlyZW1vdmVfbGVmdGpvaW5yZWxfZnJvbV9xdWVy eShyb290LCBpbm5lcnJlbGlkLCBzamluZm8pOwogCiAJCS8qIFdlIHZlcmlmeSB0aGF0IGV4 YWN0bHkgb25lIHJlZmVyZW5jZSBnZXRzIHJlbW92ZWQgZnJvbSBqb2lubGlzdCAqLwogCQlu cmVtb3ZlZCA9IDA7CkBAIC0yOTIsOCArMzEzLDggQEAgam9pbl9pc19yZW1vdmFibGUoUGxh bm5lckluZm8gKnJvb3QsIFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKQogCQkJY29udGludWU7 CQkJLyogbm90IG1lcmdlam9pbmFibGUgKi8KIAogCQkvKgotCQkgKiBDaGVjayBpZiB0aGUg Y2xhdXNlIGhhcyB0aGUgZm9ybSAib3V0ZXIgb3AgaW5uZXIiIG9yICJpbm5lciBvcAotCQkg KiBvdXRlciIsIGFuZCBpZiBzbyBtYXJrIHdoaWNoIHNpZGUgaXMgaW5uZXIuCisJCSAqIENo ZWNrIGlmIGNsYXVzZSBoYXMgdGhlIGZvcm0gIm91dGVyIG9wIGlubmVyIiBvciAiaW5uZXIg b3Agb3V0ZXIiLAorCQkgKiBhbmQgaWYgc28gbWFyayB3aGljaCBzaWRlIGlzIGlubmVyLgog CQkgKi8KIAkJaWYgKCFjbGF1c2Vfc2lkZXNfbWF0Y2hfam9pbihyZXN0cmljdGluZm8sIHNq aW5mby0+bWluX2xlZnRoYW5kLAogCQkJCQkJCQkJIGlubmVycmVsLT5yZWxpZHMpKQpAQCAt MzA3LDcgKzMyOCw3IEBAIGpvaW5faXNfcmVtb3ZhYmxlKFBsYW5uZXJJbmZvICpyb290LCBT cGVjaWFsSm9pbkluZm8gKnNqaW5mbykKIAkgKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSByZWxl dmFudCBlcXVhbGl0eSBqb2luIGNsYXVzZXMsIHRyeSB0byBwcm92ZSB0aGUKIAkgKiBpbm5l cnJlbCBkaXN0aW5jdC4KIAkgKi8KLQlpZiAocmVsX2lzX2Rpc3RpbmN0X2Zvcihyb290LCBp bm5lcnJlbCwgY2xhdXNlX2xpc3QpKQorCWlmIChyZWxfaXNfZGlzdGluY3RfZm9yKHJvb3Qs IGlubmVycmVsLCBjbGF1c2VfbGlzdCwgTlVMTCkpCiAJCXJldHVybiB0cnVlOwogCiAJLyoK QEAgLTMxOSwzNiArMzQwLDY5IEBAIGpvaW5faXNfcmVtb3ZhYmxlKFBsYW5uZXJJbmZvICpy b290LCBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbykKIAogCiAvKgotICogUmVtb3ZlIHRoZSB0 YXJnZXQgcmVsaWQgYW5kIHJlZmVyZW5jZXMgdG8gdGhlIHRhcmdldCBqb2luIGZyb20gdGhl CisgKiBTdWJzdGl0dXRlIG5ld0lkIGJ5IG9sZElkIGluIHJlbGlkcy4KKyAqIFdvcmtzIGFs bW9zdCBsaWtlIHRoZSBhZGp1c3RfcmVsaWRfc2V0LCBidXQgcHJvY2VzcyBuZWdhdGl2ZSBu ZXdyZWxpZCBjYXNlLgorICoKKyAqIFdlIG11c3QgbWFrZSBhIGNvcHkgb2YgdGhlIG9yaWdp bmFsIEJpdG1hcHNldCBiZWZvcmUgbWFraW5nIGFueQorICogbW9kaWZpY2F0aW9ucywgYmVj YXVzZSB0aGUgc2FtZSBwb2ludGVyIHRvIGl0IG1pZ2h0IGJlIHNoYXJlZCBhbW9uZworICog ZGlmZmVyZW50IHBsYWNlcy4KKyAqIEFsc28sIHRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQg aW4gJ2RlbGV0ZSBvbmx5JyBtb2RlIChuZXdJZCA8IDApLgorICogSXQgYWxsb3dzIHVzIHRv IHV0aWxpc2UgdGhlIHNhbWUgY29kZSBpbiB0aGUgcmVtb3ZlX3VzZWxlc3Nfam9pbnMgYW5k IHRoZQorICogcmVtb3ZlX3NlbGZfam9pbnMgZmVhdHVyZXMuCisgKi8KK3N0YXRpYyBCaXRt YXBzZXQgKgorcmVwbGFjZV9yZWxpZChSZWxpZHMgcmVsaWRzLCBpbnQgb2xkcmVsaWQsIGlu dCBuZXdyZWxpZCkKK3sKKwlpZiAoSVNfU1BFQ0lBTF9WQVJOTyhvbGRyZWxpZCkpCisJCXJl dHVybiByZWxpZHM7CisKKwkvKiBEZWxldGUgcmVsaWQgd2l0aG91dCBzdWJzdGl0dXRpb24u ICovCisJaWYgKElTX1NQRUNJQUxfVkFSTk8obmV3cmVsaWQpKQorCXsKKwkJcmVsaWRzID0g Ym1zX2NvcHkocmVsaWRzKTsKKwkJcmV0dXJuIGJtc19kZWxfbWVtYmVyKHJlbGlkcywgb2xk cmVsaWQpOworCX0KKworCS8qIFN1YnN0aXR1dGUgbmV3SWQgZm9yIG9sZElkLiAqLworCWlm IChibXNfaXNfbWVtYmVyKG9sZHJlbGlkLCByZWxpZHMpKQorCXsKKwkJLyogRW5zdXJlIHdl IGhhdmUgYSBtb2RpZmlhYmxlIGNvcHkgKi8KKwkJcmVsaWRzID0gYm1zX2NvcHkocmVsaWRz KTsKKworCQkvKiBSZW1vdmUgb2xkLCBhZGQgbmV3ICovCisJCXJlbGlkcyA9IGJtc19kZWxf bWVtYmVyKHJlbGlkcywgb2xkcmVsaWQpOworCQlyZXR1cm4gYm1zX2FkZF9tZW1iZXIocmVs aWRzLCBuZXdyZWxpZCk7CisJfQorCisJcmV0dXJuIHJlbGlkczsKK30KKworLyoKKyAqIFJl bW92ZSB0aGUgdGFyZ2V0IHJlbC0+cmVsaWQgYW5kIHJlZmVyZW5jZXMgdG8gdGhlIHRhcmdl dCBqb2luIGZyb20gdGhlCiAgKiBwbGFubmVyJ3MgZGF0YSBzdHJ1Y3R1cmVzLCBoYXZpbmcg ZGV0ZXJtaW5lZCB0aGF0IHRoZXJlIGlzIG5vIG5lZWQKLSAqIHRvIGluY2x1ZGUgdGhlbSBp biB0aGUgcXVlcnkuCisgKiB0byBpbmNsdWRlIHRoZW0gaW4gdGhlIHF1ZXJ5LiAgT3B0aW9u YWxseSByZXBsYWNlIHRoZW0gd2l0aCBzdWJzdCBpZiBzdWJzdAorICogaXMgbm9uLW5lZ2F0 aXZlLgogICoKLSAqIFdlIGFyZSBub3QgdGVycmlibHkgdGhvcm91Z2ggaGVyZS4gIFdlIG9u bHkgYm90aGVyIHRvIHVwZGF0ZSBwYXJ0cyBvZgotICogdGhlIHBsYW5uZXIncyBkYXRhIHN0 cnVjdHVyZXMgdGhhdCB3aWxsIGFjdHVhbGx5IGJlIGNvbnN1bHRlZCBsYXRlci4KKyAqIFRo aXMgZnVuY3Rpb24gdXBkYXRlcyBvbmx5IHBhcnRzIG5lZWRlZCBmb3IgYm90aCBsZWZ0LWpv aW4gcmVtb3ZhbCBhbmQKKyAqIHNlbGYtam9pbiByZW1vdmFsLgogICovCiBzdGF0aWMgdm9p ZAotcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQs IFNwZWNpYWxKb2luSW5mbyAqc2ppbmZvKQorcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCisJCQkJCSAgaW50IHN1YnN0LCBTcGVj aWFsSm9pbkluZm8gKnNqaW5mbywKKwkJCQkJICBSZWxpZHMgam9pbnJlbGlkcykKIHsKLQlS ZWxPcHRJbmZvICpyZWwgPSBmaW5kX2Jhc2VfcmVsKHJvb3QsIHJlbGlkKTsKLQlpbnQJCQlv anJlbGlkID0gc2ppbmZvLT5vanJlbGlkOwotCVJlbGlkcwkJam9pbnJlbGlkczsKLQlSZWxp ZHMJCWpvaW5fcGx1c19jb21tdXRlOwotCUxpc3QJICAgKmpvaW5pbmZvczsKKwlpbnQJCQly ZWxpZCA9IHJlbC0+cmVsaWQ7CisJaW50CQkJb2pyZWxpZCA9IChzamluZm8gIT0gTlVMTCkg PyBzamluZm8tPm9qcmVsaWQgOiAtMTsKIAlJbmRleAkJcnRpOwogCUxpc3RDZWxsICAgKmw7 CiAKLQkvKiBDb21wdXRlIHRoZSByZWxpZCBzZXQgZm9yIHRoZSBqb2luIHdlIGFyZSBjb25z aWRlcmluZyAqLwotCWpvaW5yZWxpZHMgPSBibXNfdW5pb24oc2ppbmZvLT5taW5fbGVmdGhh bmQsIHNqaW5mby0+bWluX3JpZ2h0aGFuZCk7Ci0JQXNzZXJ0KG9qcmVsaWQgIT0gMCk7Ci0J am9pbnJlbGlkcyA9IGJtc19hZGRfbWVtYmVyKGpvaW5yZWxpZHMsIG9qcmVsaWQpOwotCiAJ LyoKIAkgKiBVcGRhdGUgYWxsX2Jhc2VyZWxzIGFuZCByZWxhdGVkIHJlbGlkIHNldHMuCiAJ ICovCi0Jcm9vdC0+YWxsX2Jhc2VyZWxzID0gYm1zX2RlbF9tZW1iZXIocm9vdC0+YWxsX2Jh c2VyZWxzLCByZWxpZCk7Ci0Jcm9vdC0+b3V0ZXJfam9pbl9yZWxzID0gYm1zX2RlbF9tZW1i ZXIocm9vdC0+b3V0ZXJfam9pbl9yZWxzLCBvanJlbGlkKTsKLQlyb290LT5hbGxfcXVlcnlf cmVscyA9IGJtc19kZWxfbWVtYmVyKHJvb3QtPmFsbF9xdWVyeV9yZWxzLCByZWxpZCk7Ci0J cm9vdC0+YWxsX3F1ZXJ5X3JlbHMgPSBibXNfZGVsX21lbWJlcihyb290LT5hbGxfcXVlcnlf cmVscywgb2pyZWxpZCk7CisJcm9vdC0+YWxsX2Jhc2VyZWxzID0gcmVwbGFjZV9yZWxpZChy b290LT5hbGxfYmFzZXJlbHMsIHJlbGlkLCBzdWJzdCk7CisJcm9vdC0+b3V0ZXJfam9pbl9y ZWxzID0gcmVwbGFjZV9yZWxpZChyb290LT5vdXRlcl9qb2luX3JlbHMsIG9qcmVsaWQsIHN1 YnN0KTsKKwlyb290LT5hbGxfcXVlcnlfcmVscyA9IHJlcGxhY2VfcmVsaWQocm9vdC0+YWxs X3F1ZXJ5X3JlbHMsIHJlbGlkLCBzdWJzdCk7CisJcm9vdC0+YWxsX3F1ZXJ5X3JlbHMgPSBy ZXBsYWNlX3JlbGlkKHJvb3QtPmFsbF9xdWVyeV9yZWxzLCBvanJlbGlkLCBzdWJzdCk7CiAK IAkvKgogCSAqIExpa2V3aXNlIHJlbW92ZSByZWZlcmVuY2VzIGZyb20gU3BlY2lhbEpvaW5J bmZvIGRhdGEgc3RydWN0dXJlcy4KQEAgLTM2MiwzMCArNDE2LDIzIEBAIHJlbW92ZV9yZWxf ZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9vdCwgaW50IHJlbGlkLCBTcGVjaWFsSm9pbklu Zm8gKnNqaW5mbykKIAl7CiAJCVNwZWNpYWxKb2luSW5mbyAqc2ppbmYgPSAoU3BlY2lhbEpv aW5JbmZvICopIGxmaXJzdChsKTsKIAotCQkvKgotCQkgKiBpbml0c3BsYW4uYyBpcyBmYWly bHkgY2F2YWxpZXIgYWJvdXQgYWxsb3dpbmcgU3BlY2lhbEpvaW5JbmZvcycKLQkJICogbGVm dGhhbmQvcmlnaHRoYW5kIHJlbGlkIHNldHMgdG8gYmUgc2hhcmVkIHdpdGggb3RoZXIgZGF0 YQotCQkgKiBzdHJ1Y3R1cmVzLiAgRW5zdXJlIHRoYXQgd2UgZG9uJ3QgbW9kaWZ5IHRoZSBv cmlnaW5hbCByZWxpZCBzZXRzLgotCQkgKiAoVGhlIGNvbW11dGVfeHh4IHNldHMgYXJlIGFs d2F5cyBwZXItU3BlY2lhbEpvaW5JbmZvIHRob3VnaC4pCi0JCSAqLwotCQlzamluZi0+bWlu X2xlZnRoYW5kID0gYm1zX2NvcHkoc2ppbmYtPm1pbl9sZWZ0aGFuZCk7Ci0JCXNqaW5mLT5t aW5fcmlnaHRoYW5kID0gYm1zX2NvcHkoc2ppbmYtPm1pbl9yaWdodGhhbmQpOwotCQlzamlu Zi0+c3luX2xlZnRoYW5kID0gYm1zX2NvcHkoc2ppbmYtPnN5bl9sZWZ0aGFuZCk7Ci0JCXNq aW5mLT5zeW5fcmlnaHRoYW5kID0gYm1zX2NvcHkoc2ppbmYtPnN5bl9yaWdodGhhbmQpOwot CQkvKiBOb3cgcmVtb3ZlIHJlbGlkIGFuZCBvanJlbGlkIGJpdHMgZnJvbSB0aGUgc2V0czog Ki8KLQkJc2ppbmYtPm1pbl9sZWZ0aGFuZCA9IGJtc19kZWxfbWVtYmVyKHNqaW5mLT5taW5f bGVmdGhhbmQsIHJlbGlkKTsKLQkJc2ppbmYtPm1pbl9yaWdodGhhbmQgPSBibXNfZGVsX21l bWJlcihzamluZi0+bWluX3JpZ2h0aGFuZCwgcmVsaWQpOwotCQlzamluZi0+c3luX2xlZnRo YW5kID0gYm1zX2RlbF9tZW1iZXIoc2ppbmYtPnN5bl9sZWZ0aGFuZCwgcmVsaWQpOwotCQlz amluZi0+c3luX3JpZ2h0aGFuZCA9IGJtc19kZWxfbWVtYmVyKHNqaW5mLT5zeW5fcmlnaHRo YW5kLCByZWxpZCk7Ci0JCXNqaW5mLT5taW5fbGVmdGhhbmQgPSBibXNfZGVsX21lbWJlcihz amluZi0+bWluX2xlZnRoYW5kLCBvanJlbGlkKTsKLQkJc2ppbmYtPm1pbl9yaWdodGhhbmQg PSBibXNfZGVsX21lbWJlcihzamluZi0+bWluX3JpZ2h0aGFuZCwgb2pyZWxpZCk7Ci0JCXNq aW5mLT5zeW5fbGVmdGhhbmQgPSBibXNfZGVsX21lbWJlcihzamluZi0+c3luX2xlZnRoYW5k LCBvanJlbGlkKTsKLQkJc2ppbmYtPnN5bl9yaWdodGhhbmQgPSBibXNfZGVsX21lbWJlcihz amluZi0+c3luX3JpZ2h0aGFuZCwgb2pyZWxpZCk7CisJCXNqaW5mLT5taW5fbGVmdGhhbmQg PSByZXBsYWNlX3JlbGlkKHNqaW5mLT5taW5fbGVmdGhhbmQsIHJlbGlkLCBzdWJzdCk7CisJ CXNqaW5mLT5taW5fcmlnaHRoYW5kID0gcmVwbGFjZV9yZWxpZChzamluZi0+bWluX3JpZ2h0 aGFuZCwgcmVsaWQsIHN1YnN0KTsKKwkJc2ppbmYtPnN5bl9sZWZ0aGFuZCA9IHJlcGxhY2Vf cmVsaWQoc2ppbmYtPnN5bl9sZWZ0aGFuZCwgcmVsaWQsIHN1YnN0KTsKKwkJc2ppbmYtPnN5 bl9yaWdodGhhbmQgPSByZXBsYWNlX3JlbGlkKHNqaW5mLT5zeW5fcmlnaHRoYW5kLCByZWxp ZCwgc3Vic3QpOworCQlzamluZi0+bWluX2xlZnRoYW5kID0gcmVwbGFjZV9yZWxpZChzamlu Zi0+bWluX2xlZnRoYW5kLCBvanJlbGlkLCBzdWJzdCk7CisJCXNqaW5mLT5taW5fcmlnaHRo YW5kID0gcmVwbGFjZV9yZWxpZChzamluZi0+bWluX3JpZ2h0aGFuZCwgb2pyZWxpZCwgc3Vi c3QpOworCQlzamluZi0+c3luX2xlZnRoYW5kID0gcmVwbGFjZV9yZWxpZChzamluZi0+c3lu X2xlZnRoYW5kLCBvanJlbGlkLCBzdWJzdCk7CisJCXNqaW5mLT5zeW5fcmlnaHRoYW5kID0g cmVwbGFjZV9yZWxpZChzamluZi0+c3luX3JpZ2h0aGFuZCwgb2pyZWxpZCwgc3Vic3QpOwor CiAJCS8qIHJlbGlkIGNhbm5vdCBhcHBlYXIgaW4gdGhlc2UgZmllbGRzLCBidXQgb2pyZWxp ZCBjYW46ICovCi0JCXNqaW5mLT5jb21tdXRlX2Fib3ZlX2wgPSBibXNfZGVsX21lbWJlcihz amluZi0+Y29tbXV0ZV9hYm92ZV9sLCBvanJlbGlkKTsKLQkJc2ppbmYtPmNvbW11dGVfYWJv dmVfciA9IGJtc19kZWxfbWVtYmVyKHNqaW5mLT5jb21tdXRlX2Fib3ZlX3IsIG9qcmVsaWQp OwotCQlzamluZi0+Y29tbXV0ZV9iZWxvd19sID0gYm1zX2RlbF9tZW1iZXIoc2ppbmYtPmNv bW11dGVfYmVsb3dfbCwgb2pyZWxpZCk7Ci0JCXNqaW5mLT5jb21tdXRlX2JlbG93X3IgPSBi bXNfZGVsX21lbWJlcihzamluZi0+Y29tbXV0ZV9iZWxvd19yLCBvanJlbGlkKTsKKwkJc2pp bmYtPmNvbW11dGVfYWJvdmVfbCA9IHJlcGxhY2VfcmVsaWQoc2ppbmYtPmNvbW11dGVfYWJv dmVfbCwgb2pyZWxpZCwgc3Vic3QpOworCQlzamluZi0+Y29tbXV0ZV9hYm92ZV9yID0gcmVw bGFjZV9yZWxpZChzamluZi0+Y29tbXV0ZV9hYm92ZV9yLCBvanJlbGlkLCBzdWJzdCk7CisJ CXNqaW5mLT5jb21tdXRlX2JlbG93X2wgPSByZXBsYWNlX3JlbGlkKHNqaW5mLT5jb21tdXRl X2JlbG93X2wsIG9qcmVsaWQsIHN1YnN0KTsKKwkJc2ppbmYtPmNvbW11dGVfYmVsb3dfciA9 IHJlcGxhY2VfcmVsaWQoc2ppbmYtPmNvbW11dGVfYmVsb3dfciwgb2pyZWxpZCwgc3Vic3Qp OworCisJCWlmIChzdWJzdCA+IDApCisJCQlDaGFuZ2VWYXJOb2RlcygoTm9kZSAqKSBzamlu Zi0+c2VtaV9yaHNfZXhwcnMsIHJlbGlkLCBzdWJzdCwgMCk7CiAJfQogCiAJLyoKQEAgLTQw NiwxMCArNDUzLDEwIEBAIHJlbW92ZV9yZWxfZnJvbV9xdWVyeShQbGFubmVySW5mbyAqcm9v dCwgaW50IHJlbGlkLCBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbykKIAl7CiAJCVBsYWNlSG9s ZGVySW5mbyAqcGhpbmZvID0gKFBsYWNlSG9sZGVySW5mbyAqKSBsZmlyc3QobCk7CiAKLQkJ QXNzZXJ0KCFibXNfaXNfbWVtYmVyKHJlbGlkLCBwaGluZm8tPnBoX2xhdGVyYWwpKTsKKwkJ QXNzZXJ0KHNqaW5mbyA9PSBOVUxMIHx8ICFibXNfaXNfbWVtYmVyKHJlbGlkLCBwaGluZm8t PnBoX2xhdGVyYWwpKTsKIAkJaWYgKGJtc19pc19zdWJzZXQocGhpbmZvLT5waF9uZWVkZWQs IGpvaW5yZWxpZHMpICYmCiAJCQlibXNfaXNfbWVtYmVyKHJlbGlkLCBwaGluZm8tPnBoX2V2 YWxfYXQpICYmCi0JCQkhYm1zX2lzX21lbWJlcihvanJlbGlkLCBwaGluZm8tPnBoX2V2YWxf YXQpKQorCQkJKHNqaW5mbyA9PSBOVUxMIHx8ICFibXNfaXNfbWVtYmVyKG9qcmVsaWQsIHBo aW5mby0+cGhfZXZhbF9hdCkpKQogCQl7CiAJCQlyb290LT5wbGFjZWhvbGRlcl9saXN0ID0g Zm9yZWFjaF9kZWxldGVfY3VycmVudChyb290LT5wbGFjZWhvbGRlcl9saXN0LAogCQkJCQkJ CQkJCQkJCQkJbCk7CkBAIC00MTksMjEgKzQ2Niw3MyBAQCByZW1vdmVfcmVsX2Zyb21fcXVl cnkoUGxhbm5lckluZm8gKnJvb3QsIGludCByZWxpZCwgU3BlY2lhbEpvaW5JbmZvICpzamlu Zm8pCiAJCXsKIAkJCVBsYWNlSG9sZGVyVmFyICpwaHYgPSBwaGluZm8tPnBoX3ZhcjsKIAot CQkJcGhpbmZvLT5waF9ldmFsX2F0ID0gYm1zX2RlbF9tZW1iZXIocGhpbmZvLT5waF9ldmFs X2F0LCByZWxpZCk7Ci0JCQlwaGluZm8tPnBoX2V2YWxfYXQgPSBibXNfZGVsX21lbWJlcihw aGluZm8tPnBoX2V2YWxfYXQsIG9qcmVsaWQpOworCQkJcGhpbmZvLT5waF9ldmFsX2F0ID0g cmVwbGFjZV9yZWxpZChwaGluZm8tPnBoX2V2YWxfYXQsIHJlbGlkLCBzdWJzdCk7CisJCQlw aGluZm8tPnBoX2V2YWxfYXQgPSByZXBsYWNlX3JlbGlkKHBoaW5mby0+cGhfZXZhbF9hdCwg b2pyZWxpZCwgc3Vic3QpOwogCQkJQXNzZXJ0KCFibXNfaXNfZW1wdHkocGhpbmZvLT5waF9l dmFsX2F0KSk7CS8qIGNoZWNrZWQgcHJldmlvdXNseSAqLwogCQkJLyogUmVkdWNlIHBoX25l ZWRlZCB0byBjb250YWluIG9ubHkgInJlbGF0aW9uIDAiOyBzZWUgYmVsb3cgKi8KIAkJCWlm IChibXNfaXNfbWVtYmVyKDAsIHBoaW5mby0+cGhfbmVlZGVkKSkKIAkJCQlwaGluZm8tPnBo X25lZWRlZCA9IGJtc19tYWtlX3NpbmdsZXRvbigwKTsKIAkJCWVsc2UKIAkJCQlwaGluZm8t PnBoX25lZWRlZCA9IE5VTEw7Ci0JCQlwaHYtPnBocmVscyA9IGJtc19kZWxfbWVtYmVyKHBo di0+cGhyZWxzLCByZWxpZCk7Ci0JCQlwaHYtPnBocmVscyA9IGJtc19kZWxfbWVtYmVyKHBo di0+cGhyZWxzLCBvanJlbGlkKTsKKworCQkJcGhpbmZvLT5waF9sYXRlcmFsID0gcmVwbGFj ZV9yZWxpZChwaGluZm8tPnBoX2xhdGVyYWwsIHJlbGlkLCBzdWJzdCk7CisJCQkvKgorCQkJ ICogcGhfbGF0ZXJhbCBtaWdodCBjb250YWluIHJlbHMgbWVudGlvbmVkIGluIHBoX2V2YWxf YXQgYWZ0ZXIgdGhlCisJCQkgKiByZXBsYWNlbWVudCwgcmVtb3ZlIHRoZW0uCisJCQkgKi8K KwkJCXBoaW5mby0+cGhfbGF0ZXJhbCA9IGJtc19kaWZmZXJlbmNlKHBoaW5mby0+cGhfbGF0 ZXJhbCwgcGhpbmZvLT5waF9ldmFsX2F0KTsKKwkJCS8qIHBoX2xhdGVyYWwgbWlnaHQgb3Ig bWlnaHQgbm90IGJlIGVtcHR5ICovCisKKwkJCXBodi0+cGhyZWxzID0gcmVwbGFjZV9yZWxp ZChwaHYtPnBocmVscywgcmVsaWQsIHN1YnN0KTsKKwkJCXBodi0+cGhyZWxzID0gcmVwbGFj ZV9yZWxpZChwaHYtPnBocmVscywgb2pyZWxpZCwgc3Vic3QpOwogCQkJQXNzZXJ0KCFibXNf aXNfZW1wdHkocGh2LT5waHJlbHMpKTsKKworCQkJQ2hhbmdlVmFyTm9kZXMoKE5vZGUgKikg cGh2LT5waGV4cHIsIHJlbGlkLCBzdWJzdCwgMCk7CisKIAkJCUFzc2VydChwaHYtPnBobnVs bGluZ3JlbHMgPT0gTlVMTCk7IC8qIG5vIG5lZWQgdG8gYWRqdXN0ICovCiAJCX0KIAl9CiAK KwkJZm9yIChydGkgPSAxOyBydGkgPCByb290LT5zaW1wbGVfcmVsX2FycmF5X3NpemU7IHJ0 aSsrKQorCXsKKwkJUmVsT3B0SW5mbyAqb3RoZXJyZWwgPSByb290LT5zaW1wbGVfcmVsX2Fy cmF5W3J0aV07CisKKwkJaWYgKG90aGVycmVsID09IE5VTEwpCisJCQljb250aW51ZTsKKwor CQkvKiBVcGRhdGUgbGF0ZXJhbF92YXJzIGxpc3QuICovCisJCWlmIChzdWJzdCA+IDApCisJ CQlDaGFuZ2VWYXJOb2RlcygoTm9kZSAqKSBvdGhlcnJlbC0+bGF0ZXJhbF92YXJzLCByZWxp ZCwgc3Vic3QsIDApOworCX0KK30KKworLyoKKyAqIFJlbW92ZSB0aGUgdGFyZ2V0IHJlbGlk IGFuZCByZWZlcmVuY2VzIHRvIHRoZSB0YXJnZXQgam9pbiBmcm9tIHRoZQorICogcGxhbm5l cidzIGRhdGEgc3RydWN0dXJlcywgaGF2aW5nIGRldGVybWluZWQgdGhhdCB0aGVyZSBpcyBu byBuZWVkCisgKiB0byBpbmNsdWRlIHRoZW0gaW4gdGhlIHF1ZXJ5LgorICoKKyAqIFdlIGFy ZSBub3QgdGVycmlibHkgdGhvcm91Z2ggaGVyZS4gIFdlIG9ubHkgYm90aGVyIHRvIHVwZGF0 ZSBwYXJ0cyBvZgorICogdGhlIHBsYW5uZXIncyBkYXRhIHN0cnVjdHVyZXMgdGhhdCB3aWxs IGFjdHVhbGx5IGJlIGNvbnN1bHRlZCBsYXRlci4KKyAqLworc3RhdGljIHZvaWQKK3JlbW92 ZV9sZWZ0am9pbnJlbF9mcm9tX3F1ZXJ5KFBsYW5uZXJJbmZvICpyb290LCBpbnQgcmVsaWQs CisJCQkJCQkJICBTcGVjaWFsSm9pbkluZm8gKnNqaW5mbykKK3sKKwlMaXN0CSAgICpqb2lu aW5mb3M7CisJaW50CQkJb2pyZWxpZCA9IHNqaW5mby0+b2pyZWxpZDsKKwlSZWxPcHRJbmZv ICpyZWwgPSBmaW5kX2Jhc2VfcmVsKHJvb3QsIHJlbGlkKTsKKwlSZWxpZHMJCWpvaW5fcGx1 c19jb21tdXRlOworCVJlbGlkcwkJam9pbnJlbGlkczsKKwlJbmRleAkJcnRpOworCUxpc3RD ZWxsICAgKmw7CisKKwkvKiBDb21wdXRlIHRoZSByZWxpZCBzZXQgZm9yIHRoZSBqb2luIHdl IGFyZSBjb25zaWRlcmluZyAqLworCWpvaW5yZWxpZHMgPSBibXNfdW5pb24oc2ppbmZvLT5t aW5fbGVmdGhhbmQsIHNqaW5mby0+bWluX3JpZ2h0aGFuZCk7CisJQXNzZXJ0KG9qcmVsaWQg IT0gMCk7CisJam9pbnJlbGlkcyA9IGJtc19hZGRfbWVtYmVyKGpvaW5yZWxpZHMsIG9qcmVs aWQpOworCisJcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KHJvb3QsIHJlbCwgLTEsIHNqaW5mbywg am9pbnJlbGlkcyk7CisKIAkvKgogCSAqIFJlbW92ZSBhbnkgam9pbnF1YWxzIHJlZmVyZW5j aW5nIHRoZSByZWwgZnJvbSB0aGUgam9pbmluZm8gbGlzdHMuCiAJICoKQEAgLTg3NSw5ICs5 NzQsMTQgQEAgcmVsX3N1cHBvcnRzX2Rpc3RpbmN0bmVzcyhQbGFubmVySW5mbyAqcm9vdCwg UmVsT3B0SW5mbyAqcmVsKQogICogTm90ZSB0aGF0IHRoZSBwYXNzZWQtaW4gY2xhdXNlX2xp c3QgbWF5IGJlIGRlc3RydWN0aXZlbHkgbW9kaWZpZWQhICBUaGlzCiAgKiBpcyBPSyBmb3Ig Y3VycmVudCB1c2VzLCBiZWNhdXNlIHRoZSBjbGF1c2VfbGlzdCBpcyBidWlsdCBieSB0aGUg Y2FsbGVyIGZvcgogICogdGhlIHNvbGUgcHVycG9zZSBvZiBwYXNzaW5nIHRvIHRoaXMgZnVu Y3Rpb24uCisgKgorICogZXh0cmFfY2xhdXNlcyBjb250YWlucyB0aGUgcmlnaHQgc2lkZXMg b2YgYmFzZXJlc3RyaWN0aW5mbyBjbGF1c2VzIGxvb2tpbmcKKyAqIGxpa2UgeCA9IGNvbnN0 IGlmIGRpc3RpbmN0bmVzcyBpcyBkZXJpdmVkIGZyb20gc3VjaCBjbGF1c2VzLCBub3Qgam9p bmluZm8KKyAqIGNsYXVzZS4gIFBhc3MgTlVMTCB0byB0aGUgZXh0cmFfY2xhdXNlcywgaWYg aXRzIHZhbHVlIGlzIG5vdCBuZWVkZWQuCiAgKi8KIHN0YXRpYyBib29sCi1yZWxfaXNfZGlz dGluY3RfZm9yKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsIExpc3QgKmNs YXVzZV9saXN0KQorcmVsX2lzX2Rpc3RpbmN0X2ZvcihQbGFubmVySW5mbyAqcm9vdCwgUmVs T3B0SW5mbyAqcmVsLCBMaXN0ICpjbGF1c2VfbGlzdCwKKwkJCQkJTGlzdCAqKmV4dHJhX2Ns YXVzZXMpCiB7CiAJLyoKIAkgKiBXZSBjb3VsZCBza2lwIGEgY291cGxlIG9mIHRlc3RzIGhl cmUgaWYgd2UgYXNzdW1lIGFsbCBjYWxsZXJzIGNoZWNrZWQKQEAgLTg5MCwxMCArOTk0LDEx IEBAIHJlbF9pc19kaXN0aW5jdF9mb3IoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8g KnJlbCwgTGlzdCAqY2xhdXNlX2xpc3QpCiAJewogCQkvKgogCQkgKiBFeGFtaW5lIHRoZSBp bmRleGVzIHRvIHNlZSBpZiB3ZSBoYXZlIGEgbWF0Y2hpbmcgdW5pcXVlIGluZGV4LgotCQkg KiByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvciBhdXRvbWF0aWNhbGx5IGFkZHMgYW55 IHVzYWJsZQorCQkgKiByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2V4dCBhdXRvbWF0aWNh bGx5IGFkZHMgYW55IHVzYWJsZQogCQkgKiByZXN0cmljdGlvbiBjbGF1c2VzIGZvciB0aGUg cmVsLCBzbyB3ZSBuZWVkbid0IGRvIHRoYXQgaGVyZS4KIAkJICovCi0JCWlmIChyZWxhdGlv bl9oYXNfdW5pcXVlX2luZGV4X2Zvcihyb290LCByZWwsIGNsYXVzZV9saXN0LCBOSUwsIE5J TCkpCisJCWlmIChyZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2V4dChyb290LCByZWwsIGNs YXVzZV9saXN0LCBOSUwsIE5JTCwKKwkJCQkJCQkJCQkgIGV4dHJhX2NsYXVzZXMpKQogCQkJ cmV0dXJuIHRydWU7CiAJfQogCWVsc2UgaWYgKHJlbC0+cnRla2luZCA9PSBSVEVfU1VCUVVF UlkpCkBAIC0xMjA3LDEyICsxMzEyLDQwIEBAIGlubmVycmVsX2lzX3VuaXF1ZShQbGFubmVy SW5mbyAqcm9vdCwKIAkJCQkgICBKb2luVHlwZSBqb2ludHlwZSwKIAkJCQkgICBMaXN0ICpy ZXN0cmljdGxpc3QsCiAJCQkJICAgYm9vbCBmb3JjZV9jYWNoZSkKK3sKKwlyZXR1cm4gaW5u ZXJyZWxfaXNfdW5pcXVlX2V4dChyb290LCBqb2lucmVsaWRzLCBvdXRlcnJlbGlkcywgaW5u ZXJyZWwsCisJCQkJCQkJCSAgam9pbnR5cGUsIHJlc3RyaWN0bGlzdCwgZm9yY2VfY2FjaGUs IE5VTEwpOworfQorCisvKgorICogaW5uZXJyZWxfaXNfdW5pcXVlX2V4dAorICoJICBEbyB0 aGUgc2FtZSBhcyBpbm5lcnJlbF9pc191bmlxdWUoKSwgYnV0IGFsc28gc2V0IHRvICcqZXh0 cmFfY2xhdXNlcycKKyAqCSAgYWRkaXRpb25hbCBjbGF1c2VzIGZyb20gYSBiYXNlcmVzdHJp Y3RpbmZvIGxpc3QgdGhhdCB3ZXJlIHVzZWQgdG8gcHJvdmUKKyAqCSAgdW5pcXVlbmVzcy4g IEEgbm9uIE5VTEwgJ2V4dHJhX2NsYXVzZXMnIGluZGljYXRlcyB0aGF0IHdlJ3JlIGNoZWNr aW5nCisgKgkgIGZvciBzZWxmLWpvaW4gYW5kIGNvcnJlc3BvbmRpbmdseSBkZWFsaW5nIHdp dGggZmlsdGVyZWQgY2xhdXNlcy4KKyAqLworYm9vbAoraW5uZXJyZWxfaXNfdW5pcXVlX2V4 dChQbGFubmVySW5mbyAqcm9vdCwKKwkJCQkJICAgUmVsaWRzIGpvaW5yZWxpZHMsCisJCQkJ CSAgIFJlbGlkcyBvdXRlcnJlbGlkcywKKwkJCQkJICAgUmVsT3B0SW5mbyAqaW5uZXJyZWws CisJCQkJCSAgIEpvaW5UeXBlIGpvaW50eXBlLAorCQkJCQkgICBMaXN0ICpyZXN0cmljdGxp c3QsCisJCQkJCSAgIGJvb2wgZm9yY2VfY2FjaGUsCisJCQkJCSAgIExpc3QgKipleHRyYV9j bGF1c2VzKQogewogCU1lbW9yeUNvbnRleHQgb2xkX2NvbnRleHQ7CiAJTGlzdENlbGwgICAq bGM7CisJVW5pcXVlUmVsSW5mbyAqdW5pcXVlUmVsSW5mbzsKKwlMaXN0CSAgICpvdXRlcl9l eHBycyA9IE5JTDsKKwlib29sCQlzZWxmX2pvaW4gPSAoZXh0cmFfY2xhdXNlcyAhPSBOVUxM KTsKIAotCS8qIENlcnRhaW5seSBjYW4ndCBwcm92ZSB1bmlxdWVuZXNzIHdoZW4gdGhlcmUg YXJlIG5vIGpvaW5jbGF1c2VzICovCi0JaWYgKHJlc3RyaWN0bGlzdCA9PSBOSUwpCisJLyoK KwkgKiBEb24ndCB3YXN0ZSBjeWNsZXMgYXR0ZW1wdGluZyB0byBwcm92ZSB1bmlxdWVuZXNz IHdoZW4gdGhlcmUgYXJlIG5vIGpvaW4KKwkgKiBjbGF1c2VzLiBTdGlsbCwgdHJ5IHRvIGRv IGl0IGluIGFuIGF0dGVtcHQgdG8gcmVtb3ZlIGEgam9pbiBiZWNhdXNlIGEKKwkgKiBkZWdl bmVyYXRlIGNhc2UgY2FuIHRha2UgcGxhY2UgYW5kIG1heSBiZSBwcm9maXRhYmxlIGZvciB0 aGUgcGVyZm9ybWFuY2UuCisJICovCisJaWYgKHJlc3RyaWN0bGlzdCA9PSBOSUwgJiYgIXNl bGZfam9pbikKIAkJcmV0dXJuIGZhbHNlOwogCiAJLyoKQEAgLTEyMjQsMTcgKzEzNTcsMjgg QEAgaW5uZXJyZWxfaXNfdW5pcXVlKFBsYW5uZXJJbmZvICpyb290LAogCiAJLyoKIAkgKiBR dWVyeSB0aGUgY2FjaGUgdG8gc2VlIGlmIHdlJ3ZlIG1hbmFnZWQgdG8gcHJvdmUgdGhhdCBp bm5lcnJlbCBpcwotCSAqIHVuaXF1ZSBmb3IgYW55IHN1YnNldCBvZiB0aGlzIG91dGVycmVs LiAgV2UgZG9uJ3QgbmVlZCBhbiBleGFjdCBtYXRjaCwKLQkgKiBhcyBleHRyYSBvdXRlcnJl bHMgY2FuJ3QgbWFrZSB0aGUgaW5uZXJyZWwgYW55IGxlc3MgdW5pcXVlIChvciBtb3JlCi0J ICogZm9ybWFsbHksIHRoZSByZXN0cmljdGxpc3QgZm9yIGEgam9pbiB0byBhIHN1cGVyc2V0 IG91dGVycmVsIG11c3QgYmUgYQotCSAqIHN1cGVyc2V0IG9mIHRoZSBjb25kaXRpb25zIHdl IHN1Y2Nlc3NmdWxseSB1c2VkIGJlZm9yZSkuCisJICogdW5pcXVlIGZvciBhbnkgc3Vic2V0 IG9mIHRoaXMgb3V0ZXJyZWwuICBGb3Igbm9uIHNlbGYtam9pbiBzZWFyY2gsIHdlCisJICog ZG9uJ3QgbmVlZCBhbiBleGFjdCBtYXRjaCwgYXMgZXh0cmEgb3V0ZXJyZWxzIGNhbid0IG1h a2UgdGhlIGlubmVycmVsCisJICogYW55IGxlc3MgdW5pcXVlIChvciBtb3JlIGZvcm1hbGx5 LCB0aGUgcmVzdHJpY3RsaXN0IGZvciBhIGpvaW4gdG8gYQorCSAqIHN1cGVyc2V0IG91dGVy cmVsIG11c3QgYmUgYSBzdXBlcnNldCBvZiB0aGUgY29uZGl0aW9ucyB3ZSBzdWNjZXNzZnVs bHkKKwkgKiB1c2VkIGJlZm9yZSkuIEZvciBzZWxmLWpvaW4gc2VhcmNoLCB3ZSByZXF1aXJl IGFuIGV4YWN0IG1hdGNoIG9mCisJICogb3V0ZXJyZWxzLCBiZWNhdXNlIHdlIG5lZWQgZXh0 cmEgY2xhdXNlcyB0byBiZSB2YWxpZCBmb3Igb3VyIGNhc2UuCisJICogQWxzbywgZm9yIHNl bGYtam9pbiBjaGVja2luZyB3ZSd2ZSBmaWx0ZXJlZCB0aGUgY2xhdXNlcyBsaXN0LiAgVGh1 cywKKwkgKiBmb3IgYSBzZWxmLWpvaW4gc2VhcmNoLCB3ZSBjYW4gbWF0Y2ggb25seSB0aGUg cmVzdWx0IGNhY2hlZCBmb3IgYW5vdGhlcgorCSAqIHNlbGYtam9pbiBjaGVjay4KIAkgKi8K IAlmb3JlYWNoKGxjLCBpbm5lcnJlbC0+dW5pcXVlX2Zvcl9yZWxzKQogCXsKLQkJUmVsaWRz CQl1bmlxdWVfZm9yX3JlbHMgPSAoUmVsaWRzKSBsZmlyc3QobGMpOworCQl1bmlxdWVSZWxJ bmZvID0gKFVuaXF1ZVJlbEluZm8gKikgbGZpcnN0KGxjKTsKIAotCQlpZiAoYm1zX2lzX3N1 YnNldCh1bmlxdWVfZm9yX3JlbHMsIG91dGVycmVsaWRzKSkKKwkJaWYgKCghc2VsZl9qb2lu ICYmIGJtc19pc19zdWJzZXQodW5pcXVlUmVsSW5mby0+b3V0ZXJyZWxpZHMsIG91dGVycmVs aWRzKSkgfHwKKwkJCShzZWxmX2pvaW4gJiYgYm1zX2VxdWFsKHVuaXF1ZVJlbEluZm8tPm91 dGVycmVsaWRzLCBvdXRlcnJlbGlkcykgJiYKKwkJCSB1bmlxdWVSZWxJbmZvLT5zZWxmX2pv aW4pKQorCQl7CisJCQlpZiAoZXh0cmFfY2xhdXNlcykKKwkJCQkqZXh0cmFfY2xhdXNlcyA9 IHVuaXF1ZVJlbEluZm8tPmV4dHJhX2NsYXVzZXM7CiAJCQlyZXR1cm4gdHJ1ZTsJCS8qIFN1 Y2Nlc3MhICovCisJCX0KIAl9CiAKIAkvKgpAQCAtMTI1MSw3ICsxMzk1LDggQEAgaW5uZXJy ZWxfaXNfdW5pcXVlKFBsYW5uZXJJbmZvICpyb290LAogCiAJLyogTm8gY2FjaGVkIGluZm9y bWF0aW9uLCBzbyB0cnkgdG8gbWFrZSB0aGUgcHJvb2YuICovCiAJaWYgKGlzX2lubmVycmVs X3VuaXF1ZV9mb3Iocm9vdCwgam9pbnJlbGlkcywgb3V0ZXJyZWxpZHMsIGlubmVycmVsLAot CQkJCQkJCSAgIGpvaW50eXBlLCByZXN0cmljdGxpc3QpKQorCQkJCQkJCSAgIGpvaW50eXBl LCByZXN0cmljdGxpc3QsCisJCQkJCQkJICAgc2VsZl9qb2luID8gJm91dGVyX2V4cHJzIDog TlVMTCkpCiAJewogCQkvKgogCQkgKiBDYWNoZSB0aGUgcG9zaXRpdmUgcmVzdWx0IGZvciBm dXR1cmUgcHJvYmVzLCBiZWluZyBzdXJlIHRvIGtlZXAgaXQKQEAgLTEyNjQsMTAgKzE0MDks MTYgQEAgaW5uZXJyZWxfaXNfdW5pcXVlKFBsYW5uZXJJbmZvICpyb290LAogCQkgKiBzdXBl cnNldHMgb2YgdGhlbSBhbnl3YXkuCiAJCSAqLwogCQlvbGRfY29udGV4dCA9IE1lbW9yeUNv bnRleHRTd2l0Y2hUbyhyb290LT5wbGFubmVyX2N4dCk7CisJCXVuaXF1ZVJlbEluZm8gPSBt YWtlTm9kZShVbmlxdWVSZWxJbmZvKTsKKwkJdW5pcXVlUmVsSW5mby0+b3V0ZXJyZWxpZHMg PSBibXNfY29weShvdXRlcnJlbGlkcyk7CisJCXVuaXF1ZVJlbEluZm8tPnNlbGZfam9pbiA9 IHNlbGZfam9pbjsKKwkJdW5pcXVlUmVsSW5mby0+ZXh0cmFfY2xhdXNlcyA9IG91dGVyX2V4 cHJzOwogCQlpbm5lcnJlbC0+dW5pcXVlX2Zvcl9yZWxzID0gbGFwcGVuZChpbm5lcnJlbC0+ dW5pcXVlX2Zvcl9yZWxzLAotCQkJCQkJCQkJCQlibXNfY29weShvdXRlcnJlbGlkcykpOwor CQkJCQkJCQkJCQl1bmlxdWVSZWxJbmZvKTsKIAkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9s ZF9jb250ZXh0KTsKIAorCQlpZiAoZXh0cmFfY2xhdXNlcykKKwkJCSpleHRyYV9jbGF1c2Vz ID0gb3V0ZXJfZXhwcnM7CiAJCXJldHVybiB0cnVlOwkJCS8qIFN1Y2Nlc3MhICovCiAJfQog CWVsc2UKQEAgLTEzMTMsNyArMTQ2NCw4IEBAIGlzX2lubmVycmVsX3VuaXF1ZV9mb3IoUGxh bm5lckluZm8gKnJvb3QsCiAJCQkJCSAgIFJlbGlkcyBvdXRlcnJlbGlkcywKIAkJCQkJICAg UmVsT3B0SW5mbyAqaW5uZXJyZWwsCiAJCQkJCSAgIEpvaW5UeXBlIGpvaW50eXBlLAotCQkJ CQkgICBMaXN0ICpyZXN0cmljdGxpc3QpCisJCQkJCSAgIExpc3QgKnJlc3RyaWN0bGlzdCwK KwkJCQkJICAgTGlzdCAqKmV4dHJhX2NsYXVzZXMpCiB7CiAJTGlzdAkgICAqY2xhdXNlX2xp c3QgPSBOSUw7CiAJTGlzdENlbGwgICAqbGM7CkBAIC0xMzQzLDE3ICsxNDk1LDg3NCBAQCBp c19pbm5lcnJlbF91bmlxdWVfZm9yKFBsYW5uZXJJbmZvICpyb290LAogCQkJY29udGludWU7 CQkJLyogbm90IG1lcmdlam9pbmFibGUgKi8KIAogCQkvKgotCQkgKiBDaGVjayBpZiBjbGF1 c2UgaGFzIHRoZSBmb3JtICJvdXRlciBvcCBpbm5lciIgb3IgImlubmVyIG9wIG91dGVyIiwK LQkJICogYW5kIGlmIHNvIG1hcmsgd2hpY2ggc2lkZSBpcyBpbm5lci4KKwkJICogQ2hlY2sg aWYgdGhlIGNsYXVzZSBoYXMgdGhlIGZvcm0gIm91dGVyIG9wIGlubmVyIiBvciAiaW5uZXIg b3AKKwkJICogb3V0ZXIiLCBhbmQgaWYgc28gbWFyayB3aGljaCBzaWRlIGlzIGlubmVyLgog CQkgKi8KIAkJaWYgKCFjbGF1c2Vfc2lkZXNfbWF0Y2hfam9pbihyZXN0cmljdGluZm8sIG91 dGVycmVsaWRzLAogCQkJCQkJCQkJIGlubmVycmVsLT5yZWxpZHMpKQogCQkJY29udGludWU7 CQkJLyogbm8gZ29vZCBmb3IgdGhlc2UgaW5wdXQgcmVsYXRpb25zICovCiAKLQkJLyogT0ss IGFkZCB0byBsaXN0ICovCisJCS8qIE9LLCBhZGQgdG8gdGhlIGxpc3QgKi8KIAkJY2xhdXNl X2xpc3QgPSBsYXBwZW5kKGNsYXVzZV9saXN0LCByZXN0cmljdGluZm8pOwogCX0KIAogCS8q IExldCByZWxfaXNfZGlzdGluY3RfZm9yKCkgZG8gdGhlIGhhcmQgd29yayAqLwotCXJldHVy biByZWxfaXNfZGlzdGluY3RfZm9yKHJvb3QsIGlubmVycmVsLCBjbGF1c2VfbGlzdCk7CisJ cmV0dXJuIHJlbF9pc19kaXN0aW5jdF9mb3Iocm9vdCwgaW5uZXJyZWwsIGNsYXVzZV9saXN0 LCBleHRyYV9jbGF1c2VzKTsKK30KKworLyoKKyAqIFVwZGF0ZSBFQyBtZW1iZXJzIHRvIHBv aW50IHRvIHRoZSByZW1haW5pbmcgcmVsYXRpb24gaW5zdGVhZCBvZiB0aGUgcmVtb3ZlZAor ICogb25lLCByZW1vdmluZyBkdXBsaWNhdGVzLgorICoKKyAqIFJlc3RyaWN0aW9uIGNsYXVz ZXMgZm9yIGJhc2UgcmVsYXRpb25zIGFyZSBhbHJlYWR5IGRpc3RyaWJ1dGVkIHRvCisgKiB0 aGUgcmVzcGVjdGl2ZSBiYXNlcmVzdHJpY3RpbmZvIGxpc3RzIChzZWUKKyAqIGdlbmVyYXRl X2ltcGxpZWRfZXF1YWxpdGllc19mb3JfY29sdW1uKS4gVGhlIGFib3ZlIGNvZGUgaGFzIGFs cmVhZHkgcHJvY2Vzc2VkCisgKiB0aGlzIGxpc3QsIGFuZCB1cGRhdGVkIHRoZXNlIGNsYXVz ZXMgdG8gcmVmZXJlbmNlIHRoZSByZW1haW5pbmcKKyAqIHJlbGF0aW9uLCBzbyB3ZSBjYW4g c2tpcCB0aGVtIGhlcmUgYmFzZWQgb24gdGhlaXIgcmVsaWRzLgorICoKKyAqIExpa2V3aXNl LCB3ZSBoYXZlIGFscmVhZHkgcHJvY2Vzc2VkIHRoZSBqb2luIGNsYXVzZXMgdGhhdCBqb2lu IHRoZQorICogcmVtb3ZlZCByZWxhdGlvbiB0byB0aGUgcmVtYWluaW5nIG9uZS4KKyAqCisg KiBGaW5hbGx5LCB0aGVyZSBhcmUgam9pbiBjbGF1c2VzIHRoYXQgam9pbiB0aGUgcmVtb3Zl ZCByZWxhdGlvbiB0bworICogc29tZSB0aGlyZCByZWxhdGlvbi4gV2UgY2FuJ3QganVzdCBk ZWxldGUgdGhlIHNvdXJjZSBjbGF1c2VzIGFuZAorICogcmVnZW5lcmF0ZSB0aGVtIGZyb20g dGhlIEVDIGJlY2F1c2UgdGhlIGNvcnJlc3BvbmRpbmcgZXF1YWxpdHkKKyAqIG9wZXJhdG9y cyBtaWdodCBiZSBtaXNzaW5nIChzZWUgdGhlIGhhbmRsaW5nIG9mIGVjX2Jyb2tlbikuCisg KiBUaGVyZWZvcmUsIHdlIHdpbGwgdXBkYXRlIHRoZSByZWZlcmVuY2VzIGluIHRoZSBzb3Vy Y2UgY2xhdXNlcy4KKyAqCisgKiBEZXJpdmVkIGNsYXVzZXMgY2FuIGJlIGdlbmVyYXRlZCBh Z2Fpbiwgc28gaXQgaXMgc2ltcGxlciB0byBqdXN0CisgKiBkZWxldGUgdGhlbS4KKyAqLwor c3RhdGljIHZvaWQKK3VwZGF0ZV9lY2xhc3NlcyhFcXVpdmFsZW5jZUNsYXNzICplYywgaW50 IGZyb20sIGludCB0bykKK3sKKwlMaXN0CSAgICpuZXdfbWVtYmVycyA9IE5JTDsKKwlMaXN0 CSAgICpuZXdfc291cmNlcyA9IE5JTDsKKworCWZvcmVhY2hfbm9kZShFcXVpdmFsZW5jZU1l bWJlciwgZW0sIGVjLT5lY19tZW1iZXJzKQorCXsKKwkJYm9vbAkJaXNfcmVkdW5kYW50ID0g ZmFsc2U7CisKKwkJaWYgKCFibXNfaXNfbWVtYmVyKGZyb20sIGVtLT5lbV9yZWxpZHMpKQor CQl7CisJCQluZXdfbWVtYmVycyA9IGxhcHBlbmQobmV3X21lbWJlcnMsIGVtKTsKKwkJCWNv bnRpbnVlOworCQl9CisKKwkJZW0tPmVtX3JlbGlkcyA9IHJlcGxhY2VfcmVsaWQoZW0tPmVt X3JlbGlkcywgZnJvbSwgdG8pOworCQllbS0+ZW1famRvbWFpbi0+amRfcmVsaWRzID0gcmVw bGFjZV9yZWxpZChlbS0+ZW1famRvbWFpbi0+amRfcmVsaWRzLCBmcm9tLCB0byk7CisKKwkJ LyogV2Ugb25seSBwcm9jZXNzIGlubmVyIGpvaW5zICovCisJCUNoYW5nZVZhck5vZGVzKChO b2RlICopIGVtLT5lbV9leHByLCBmcm9tLCB0bywgMCk7CisKKwkJZm9yZWFjaF9ub2RlKEVx dWl2YWxlbmNlTWVtYmVyLCBvdGhlciwgbmV3X21lbWJlcnMpCisJCXsKKwkJCWlmICghZXF1 YWwoZW0tPmVtX3JlbGlkcywgb3RoZXItPmVtX3JlbGlkcykpCisJCQkJY29udGludWU7CisK KwkJCWlmIChlcXVhbChlbS0+ZW1fZXhwciwgb3RoZXItPmVtX2V4cHIpKQorCQkJeworCQkJ CWlzX3JlZHVuZGFudCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAo IWlzX3JlZHVuZGFudCkKKwkJCW5ld19tZW1iZXJzID0gbGFwcGVuZChuZXdfbWVtYmVycywg ZW0pOworCX0KKworCWxpc3RfZnJlZShlYy0+ZWNfbWVtYmVycyk7CisJZWMtPmVjX21lbWJl cnMgPSBuZXdfbWVtYmVyczsKKworCWxpc3RfZnJlZShlYy0+ZWNfZGVyaXZlcyk7CisJZWMt PmVjX2Rlcml2ZXMgPSBOVUxMOworCisJLyogVXBkYXRlIEVDIHNvdXJjZSBleHByZXNzaW9u cyAqLworCWZvcmVhY2hfbm9kZShSZXN0cmljdEluZm8sIHJpbmZvLCBlYy0+ZWNfc291cmNl cykKKwl7CisJCWJvb2wJCWlzX3JlZHVuZGFudCA9IGZhbHNlOworCisJCWlmICghYm1zX2lz X21lbWJlcihmcm9tLCByaW5mby0+cmVxdWlyZWRfcmVsaWRzKSkKKwkJeworCQkJbmV3X3Nv dXJjZXMgPSBsYXBwZW5kKG5ld19zb3VyY2VzLCByaW5mbyk7CisJCQljb250aW51ZTsKKwkJ fQorCisJCUNoYW5nZVZhck5vZGVzKChOb2RlICopIHJpbmZvLCBmcm9tLCB0bywgMCk7CisK KwkJLyoKKwkJICogQWZ0ZXIgc3dpdGNoaW5nIHRoZSBjbGF1c2UgdG8gdGhlIHJlbWFpbmlu ZyByZWxhdGlvbiwgY2hlY2sgaXQgZm9yCisJCSAqIHJlZHVuZGFuY3kgd2l0aCBleGlzdGlu ZyBvbmVzLiBXZSBkb24ndCBoYXZlIHRvIGNoZWNrIGZvcgorCQkgKiByZWR1bmRhbmN5IHdp dGggZGVyaXZlZCBjbGF1c2VzLCBiZWNhdXNlIHdlJ3ZlIGp1c3QgZGVsZXRlZCB0aGVtLgor CQkgKi8KKwkJZm9yZWFjaF9ub2RlKFJlc3RyaWN0SW5mbywgb3RoZXIsIG5ld19zb3VyY2Vz KQorCQl7CisJCQlpZiAoIWVxdWFsKHJpbmZvLT5jbGF1c2VfcmVsaWRzLCBvdGhlci0+Y2xh dXNlX3JlbGlkcykpCisJCQkJY29udGludWU7CisKKwkJCWlmIChlcXVhbChyaW5mby0+Y2xh dXNlLCBvdGhlci0+Y2xhdXNlKSkKKwkJCXsKKwkJCQlpc19yZWR1bmRhbnQgPSB0cnVlOwor CQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFpc19yZWR1bmRhbnQpCisJCQluZXdf c291cmNlcyA9IGxhcHBlbmQobmV3X3NvdXJjZXMsIHJpbmZvKTsKKwl9CisKKwlsaXN0X2Zy ZWUoZWMtPmVjX3NvdXJjZXMpOworCWVjLT5lY19zb3VyY2VzID0gbmV3X3NvdXJjZXM7CisJ ZWMtPmVjX3JlbGlkcyA9IHJlcGxhY2VfcmVsaWQoZWMtPmVjX3JlbGlkcywgZnJvbSwgdG8p OworfQorCisvKgorICogIkxvZ2ljYWxseSIgY29tcGFyZXMgdHdvIFJlc3RyaWN0SW5mbydz IGlnbm9yaW5nIHRoZSAncmluZm9fc2VyaWFsJyBmaWVsZCwKKyAqIHdoaWNoIG1ha2VzIGFs bW9zdCBldmVyeSBSZXN0cmljdEluZm8gdW5pcXVlLiAgVGhpcyB0eXBlIG9mIGNvbXBhcmlz b24gaXMKKyAqIHVzZWZ1bCB3aGVuIHJlbW92aW5nIGR1cGxpY2F0ZXMgd2hpbGUgbW92aW5n IFJlc3RyaWN0SW5mbydzIGZyb20gcmVtb3ZlZAorICogcmVsYXRpb24gdG8gcmVtYWluaW5n IHJlbGF0aW9uIGR1cmluZyBzZWxmLWpvaW4gZWxpbWluYXRpb24uCisgKgorICogWFhYOiBJ biB0aGUgZnV0dXJlLCB3ZSBtaWdodCByZW1vdmUgdGhlICdyaW5mb19zZXJpYWwnIGZpZWxk IGNvbXBsZXRlbHkgYW5kCisgKiBnZXQgcmlkIG9mIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0 YXRpYyBib29sCityZXN0cmljdF9pbmZvc19sb2dpY2FsbHlfZXF1YWwoUmVzdHJpY3RJbmZv ICphLCBSZXN0cmljdEluZm8gKmIpCit7CisJaW50CQkJc2F2ZWRfcmluZm9fc2VyaWFsID0g YS0+cmluZm9fc2VyaWFsOworCWJvb2wJCXJlc3VsdDsKKworCWEtPnJpbmZvX3NlcmlhbCA9 IGItPnJpbmZvX3NlcmlhbDsKKwlyZXN1bHQgPSBlcXVhbChhLCBiKTsKKwlhLT5yaW5mb19z ZXJpYWwgPSBzYXZlZF9yaW5mb19zZXJpYWw7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisv KgorICogUmVtb3ZlIGEgcmVsYXRpb24gYWZ0ZXIgd2UgaGF2ZSBwcm92ZW4gdGhhdCBpdCBw YXJ0aWNpcGF0ZXMgb25seSBpbiBhbgorICogdW5uZWVkZWQgdW5pcXVlIHNlbGYgam9pbi4K KyAqCisgKiBSZXBsYWNlIGFueSBsaW5rcyBpbiBwbGFubmVyIGluZm8gc3RydWN0dXJlcy4K KyAqCisgKiBUcmFuc2ZlciBqb2luIGFuZCByZXN0cmljdGlvbiBjbGF1c2VzIGZyb20gdGhl IHJlbW92ZWQgcmVsYXRpb24gdG8gdGhlCisgKiByZW1haW5pbmcgb25lLiBXZSBjaGFuZ2Ug dGhlIFZhcnMgb2YgdGhlIGNsYXVzZSB0byBwb2ludCB0byB0aGUKKyAqIHJlbWFpbmluZyBy ZWxhdGlvbiBpbnN0ZWFkIG9mIHRoZSByZW1vdmVkIG9uZS4gVGhlIGNsYXVzZXMgdGhhdCBy ZXF1aXJlCisgKiBhIHN1YnNldCBvZiBqb2lucmVsaWRzIGJlY29tZSByZXN0cmljdGlvbiBj bGF1c2VzIG9mIHRoZSByZW1haW5pbmcKKyAqIHJlbGF0aW9uLCBhbmQgb3RoZXJzIHJlbWFp biBqb2luIGNsYXVzZXMuIFdlIGFwcGVuZCB0aGVtIHRvCisgKiBiYXNlcmVzdHJpY3RpbmZv IGFuZCBqb2luaW5mbyByZXNwZWN0aXZlbHksIHRyeWluZyBub3QgdG8gaW50cm9kdWNlCisg KiBkdXBsaWNhdGVzLgorICoKKyAqIFdlIGFsc28gaGF2ZSB0byBwcm9jZXNzIHRoZSAnam9p bmNsYXVzZXMnIGxpc3QgaGVyZSwgYmVjYXVzZSBpdAorICogY29udGFpbnMgRUMtZGVyaXZl ZCBqb2luIGNsYXVzZXMgd2hpY2ggbXVzdCBiZWNvbWUgZmlsdGVyIGNsYXVzZXMuIEl0Cisg KiBpcyBub3QgZW5vdWdoIHRvIGp1c3QgY29ycmVjdCB0aGUgRUNzIGJlY2F1c2UgdGhlIEVD LWRlcml2ZWQKKyAqIHJlc3RyaWN0aW9ucyBhcmUgZ2VuZXJhdGVkIGJlZm9yZSBqb2luIHJl bW92YWwgKHNlZQorICogZ2VuZXJhdGVfYmFzZV9pbXBsaWVkX2VxdWFsaXRpZXMpLgorICov CitzdGF0aWMgdm9pZAorcmVtb3ZlX3NlbGZfam9pbl9yZWwoUGxhbm5lckluZm8gKnJvb3Qs IFBsYW5Sb3dNYXJrICprbWFyaywgUGxhblJvd01hcmsgKnJtYXJrLAorCQkJCQkgUmVsT3B0 SW5mbyAqdG9LZWVwLCBSZWxPcHRJbmZvICp0b1JlbW92ZSwKKwkJCQkJIExpc3QgKnJlc3Ry aWN0bGlzdCkKK3sKKwlMaXN0CSAgICpqb2luaW5mb3M7CisJTGlzdENlbGwgICAqbGM7CisJ aW50CQkJaTsKKwlMaXN0CSAgICpqaW5mb19jYW5kaWRhdGVzID0gTklMOworCUxpc3QJICAg KmJpbmZvX2NhbmRpZGF0ZXMgPSBOSUw7CisKKwlBc3NlcnQodG9LZWVwLT5yZWxpZCA+IDAp OworCUFzc2VydCh0b1JlbW92ZS0+cmVsaWQgPiAwKTsKKworCS8qCisJICogUmVwbGFjZSB0 aGUgaW5kZXggb2YgdGhlIHJlbW92aW5nIHRhYmxlIHdpdGggdGhlIGtlZXBpbmcgb25lLiBU aGUKKwkgKiB0ZWNobmlxdWUgb2YgcmVtb3ZpbmcvZGlzdHJpYnV0aW5nIHJlc3RyaWN0aW5m byBpcyB1c2VkIGhlcmUgdG8gYXR0YWNoCisJICoganVzdCBhcHBlYXJlZCAoZm9yIGtlZXBp bmcgcmVsYXRpb24pIGpvaW4gY2xhdXNlcyBhbmQgYXZvaWQgYWRkaW5nCisJICogZHVwbGlj YXRlcyBvZiB0aG9zZSB0aGF0IGFscmVhZHkgZXhpc3QgaW4gdGhlIGpvaW5pbmZvIGxpc3Qu CisJICovCisJam9pbmluZm9zID0gbGlzdF9jb3B5KHRvUmVtb3ZlLT5qb2luaW5mbyk7CisJ Zm9yZWFjaF9ub2RlKFJlc3RyaWN0SW5mbywgcmluZm8sIGpvaW5pbmZvcykKKwl7CisJCXJl bW92ZV9qb2luX2NsYXVzZV9mcm9tX3JlbHMocm9vdCwgcmluZm8sIHJpbmZvLT5yZXF1aXJl ZF9yZWxpZHMpOworCQlDaGFuZ2VWYXJOb2RlcygoTm9kZSAqKSByaW5mbywgdG9SZW1vdmUt PnJlbGlkLCB0b0tlZXAtPnJlbGlkLCAwKTsKKworCQlpZiAoYm1zX21lbWJlcnNoaXAocmlu Zm8tPnJlcXVpcmVkX3JlbGlkcykgPT0gQk1TX01VTFRJUExFKQorCQkJamluZm9fY2FuZGlk YXRlcyA9IGxhcHBlbmQoamluZm9fY2FuZGlkYXRlcywgcmluZm8pOworCQllbHNlCisJCQli aW5mb19jYW5kaWRhdGVzID0gbGFwcGVuZChiaW5mb19jYW5kaWRhdGVzLCByaW5mbyk7CisJ fQorCisJLyoKKwkgKiBDb25jYXRlbmF0ZSByZXN0cmljdGxpc3QgdG8gdGhlIGxpc3Qgb2Yg YmFzZSByZXN0cmljdGlvbnMgb2YgdGhlCisJICogcmVtb3ZpbmcgdGFibGUganVzdCB0byBz aW1wbGlmeSB0aGUgcmVwbGFjZW1lbnQgcHJvY2VkdXJlOiBhbGwgb2YgdGhlbQorCSAqIHdl cmVuJ3QgY29ubmVjdGVkIHRvIGFueSBrZWVwaW5nIHJlbGF0aW9ucyBhbmQgbmVlZCB0byBi ZSBhZGRlZCB0byBzb21lCisJICogcmVscy4KKwkgKi8KKwl0b1JlbW92ZS0+YmFzZXJlc3Ry aWN0aW5mbyA9IGxpc3RfY29uY2F0KHRvUmVtb3ZlLT5iYXNlcmVzdHJpY3RpbmZvLAorCQkJ CQkJCQkJCQkgcmVzdHJpY3RsaXN0KTsKKwlmb3JlYWNoX25vZGUoUmVzdHJpY3RJbmZvLCBy aW5mbywgdG9SZW1vdmUtPmJhc2VyZXN0cmljdGluZm8pCisJeworCQlDaGFuZ2VWYXJOb2Rl cygoTm9kZSAqKSByaW5mbywgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlkLCAwKTsK KworCQlpZiAoYm1zX21lbWJlcnNoaXAocmluZm8tPnJlcXVpcmVkX3JlbGlkcykgPT0gQk1T X01VTFRJUExFKQorCQkJamluZm9fY2FuZGlkYXRlcyA9IGxhcHBlbmQoamluZm9fY2FuZGlk YXRlcywgcmluZm8pOworCQllbHNlCisJCQliaW5mb19jYW5kaWRhdGVzID0gbGFwcGVuZChi aW5mb19jYW5kaWRhdGVzLCByaW5mbyk7CisJfQorCisJLyoKKwkgKiBOb3csIGFkZCBhbGwg bm9uLXJlZHVuZGFudCBjbGF1c2VzIHRvIHRoZSBrZWVwaW5nIHJlbGF0aW9uLgorCSAqIENv bnRyYWRpY3Rvcnkgb3BlcmF0aW9uLiBPbiB0aGUgb25lIHNpZGUsIHdlIHJlZHVjZSB0aGUg bGVuZ3RoIG9mCisJICogcmVzdHJpY3QgbGlzdHMgdGhhdCBjYW4gaW1wYWN0IHBsYW5uaW5n IG9yIGV4ZWN1dGluZyB0aW1lLgorCSAqIEFkZGl0aW9uYWxseSwgd2UgaW1wcm92ZSB0aGUg YWNjdXJhY3kgb2YgY2FyZGluYWxpdHkgZXN0aW1hdGlvbi4gT24gdGhlCisJICogb3RoZXIg c2lkZSwgaXQgaXMgb25lIG1vcmUgcGxhY2UgdGhhdCBjYW4gbWFrZSBwbGFubmluZyB0aW1l IG11Y2gKKwkgKiBsb25nZXIgaW4gc3BlY2lmaWMgY2FzZXMuIEl0IHdvdWxkIGhhdmUgYmVl biBiZXR0ZXIgdG8gYXZvaWQgY2FsbGluZworCSAqIHRoZSBlcXVhbCgpIGZ1bmN0aW9uIGhl cmUsIGJ1dCBpdCdzIHRoZSBvbmx5IHdheSB0byBkZXRlY3QgZHVwbGljYXRlZAorCSAqIGlu ZXF1YWxpdHkgZXhwcmVzc2lvbnMuCisJICovCisJZm9yZWFjaF9ub2RlKFJlc3RyaWN0SW5m bywgcmluZm8sIGJpbmZvX2NhbmRpZGF0ZXMpCisJeworCQlib29sCQlpc19yZWR1bmRhbnQg PSBmYWxzZTsKKworCQlBc3NlcnQoIWJtc19pc19tZW1iZXIodG9SZW1vdmUtPnJlbGlkLCBy aW5mby0+cmVxdWlyZWRfcmVsaWRzKSk7CisKKwkJZm9yZWFjaF9ub2RlKFJlc3RyaWN0SW5m bywgc3JjLCB0b0tlZXAtPmJhc2VyZXN0cmljdGluZm8pCisJCXsKKwkJCWlmICghYm1zX2Vx dWFsKHNyYy0+Y2xhdXNlX3JlbGlkcywgcmluZm8tPmNsYXVzZV9yZWxpZHMpKQorCQkJCS8q IENvbnN0IGFuZCBub24tY29uc3QgZXhwcmVzc2lvbnMgY2FuJ3QgYmUgZXF1YWwgKi8KKwkJ CQljb250aW51ZTsKKworCQkJaWYgKHNyYyA9PSByaW5mbyB8fAorCQkJCShyaW5mby0+cGFy ZW50X2VjICE9IE5VTEwKKwkJCQkgJiYgc3JjLT5wYXJlbnRfZWMgPT0gcmluZm8tPnBhcmVu dF9lYykKKwkJCQl8fCByZXN0cmljdF9pbmZvc19sb2dpY2FsbHlfZXF1YWwocmluZm8sIHNy YykpCisJCQl7CisJCQkJaXNfcmVkdW5kYW50ID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0K KwkJfQorCQlpZiAoIWlzX3JlZHVuZGFudCkKKwkJCWRpc3RyaWJ1dGVfcmVzdHJpY3RpbmZv X3RvX3JlbHMocm9vdCwgcmluZm8pOworCX0KKwlmb3JlYWNoX25vZGUoUmVzdHJpY3RJbmZv LCByaW5mbywgamluZm9fY2FuZGlkYXRlcykKKwl7CisJCWJvb2wJCWlzX3JlZHVuZGFudCA9 IGZhbHNlOworCisJCUFzc2VydCghYm1zX2lzX21lbWJlcih0b1JlbW92ZS0+cmVsaWQsIHJp bmZvLT5yZXF1aXJlZF9yZWxpZHMpKTsKKworCQlmb3JlYWNoX25vZGUoUmVzdHJpY3RJbmZv LCBzcmMsIHRvS2VlcC0+am9pbmluZm8pCisJCXsKKwkJCWlmICghYm1zX2VxdWFsKHNyYy0+ Y2xhdXNlX3JlbGlkcywgcmluZm8tPmNsYXVzZV9yZWxpZHMpKQorCQkJCS8qIENhbid0IGNv bXBhcmUgdHJpdmlhbGx5IGRpZmZlcmVudCBjbGF1c2VzICovCisJCQkJY29udGludWU7CisK KwkJCWlmIChzcmMgPT0gcmluZm8gfHwKKwkJCQkocmluZm8tPnBhcmVudF9lYyAhPSBOVUxM CisJCQkJICYmIHNyYy0+cGFyZW50X2VjID09IHJpbmZvLT5wYXJlbnRfZWMpCisJCQkJfHwg cmVzdHJpY3RfaW5mb3NfbG9naWNhbGx5X2VxdWFsKHJpbmZvLCBzcmMpKQorCQkJeworCQkJ CWlzX3JlZHVuZGFudCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaWYgKCFp c19yZWR1bmRhbnQpCisJCQlkaXN0cmlidXRlX3Jlc3RyaWN0aW5mb190b19yZWxzKHJvb3Qs IHJpbmZvKTsKKwl9CisJbGlzdF9mcmVlKGJpbmZvX2NhbmRpZGF0ZXMpOworCWxpc3RfZnJl ZShqaW5mb19jYW5kaWRhdGVzKTsKKworCS8qCisJICogQXJyYW5nZSBlcXVpdmFsZW5jZSBj bGFzc2VzLCBtZW50aW9uZWQgcmVtb3ZpbmcgYSB0YWJsZSwgd2l0aCB0aGUKKwkgKiBrZWVw aW5nIG9uZTogdmFybm8gb2YgcmVtb3ZpbmcgdGFibGUgc2hvdWxkIGJlIHJlcGxhY2VkIGlu IG1lbWJlcnMgYW5kCisJICogc291cmNlcyBsaXN0cy4gQWxzbywgcmVtb3ZlIGR1cGxpY2F0 ZWQgZWxlbWVudHMgaWYgdGhpcyByZXBsYWNlbWVudAorCSAqIHByb2NlZHVyZSBjcmVhdGVk IHRoZW0uCisJICovCisJaSA9IC0xOworCXdoaWxlICgoaSA9IGJtc19uZXh0X21lbWJlcih0 b1JlbW92ZS0+ZWNsYXNzX2luZGV4ZXMsIGkpKSA+PSAwKQorCXsKKwkJRXF1aXZhbGVuY2VD bGFzcyAqZWMgPSAoRXF1aXZhbGVuY2VDbGFzcyAqKSBsaXN0X250aChyb290LT5lcV9jbGFz c2VzLCBpKTsKKworCQl1cGRhdGVfZWNsYXNzZXMoZWMsIHRvUmVtb3ZlLT5yZWxpZCwgdG9L ZWVwLT5yZWxpZCk7CisJCXRvS2VlcC0+ZWNsYXNzX2luZGV4ZXMgPSBibXNfYWRkX21lbWJl cih0b0tlZXAtPmVjbGFzc19pbmRleGVzLCBpKTsKKwl9CisKKwkvKgorCSAqIFRyYW5zZmVy IHRoZSB0YXJnZXRsaXN0IGFuZCBhdHRyX25lZWRlZCBmbGFncy4KKwkgKi8KKworCWZvcmVh Y2gobGMsIHRvUmVtb3ZlLT5yZWx0YXJnZXQtPmV4cHJzKQorCXsKKwkJTm9kZQkgICAqbm9k ZSA9IGxmaXJzdChsYyk7CisJCUNoYW5nZVZhck5vZGVzKG5vZGUsIHRvUmVtb3ZlLT5yZWxp ZCwgdG9LZWVwLT5yZWxpZCwgMCk7CisJCWlmICghbGlzdF9tZW1iZXIodG9LZWVwLT5yZWx0 YXJnZXQtPmV4cHJzLCBub2RlKSkKKwkJCXRvS2VlcC0+cmVsdGFyZ2V0LT5leHBycyA9IGxh cHBlbmQodG9LZWVwLT5yZWx0YXJnZXQtPmV4cHJzLCBub2RlKTsKKwl9CisKKwlmb3IgKGkg PSB0b0tlZXAtPm1pbl9hdHRyOyBpIDw9IHRvS2VlcC0+bWF4X2F0dHI7IGkrKykKKwl7CisJ CWludAkJCWF0dG5vID0gaSAtIHRvS2VlcC0+bWluX2F0dHI7CisKKwkJdG9SZW1vdmUtPmF0 dHJfbmVlZGVkW2F0dG5vXSA9IHJlcGxhY2VfcmVsaWQodG9SZW1vdmUtPmF0dHJfbmVlZGVk W2F0dG5vXSwKKwkJCQkJCQkJCQkJCQkgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlk KTsKKwkJdG9LZWVwLT5hdHRyX25lZWRlZFthdHRub10gPSBibXNfYWRkX21lbWJlcnModG9L ZWVwLT5hdHRyX25lZWRlZFthdHRub10sCisJCQkJCQkJCQkJCQkJIHRvUmVtb3ZlLT5hdHRy X25lZWRlZFthdHRub10pOworCX0KKworCS8qCisJICogSWYgdGhlIHJlbW92ZWQgcmVsYXRp b24gaGFzIGEgcm93IG1hcmssIHRyYW5zZmVyIGl0IHRvIHRoZSByZW1haW5pbmcKKwkgKiBv bmUuCisJICoKKwkgKiBJZiBib3RoIHJlbHMgaGF2ZSByb3cgbWFya3MsIGp1c3Qga2VlcCB0 aGUgb25lIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisJICogcmVtYWluaW5nIHJlbGF0aW9uLCBi ZWNhdXNlIHdlIHZlcmlmaWVkIGVhcmxpZXIgdGhhdCB0aGV5IGhhdmUgdGhlIHNhbWUKKwkg KiBzdHJlbmd0aC4KKwkgKi8KKwlpZiAocm1hcmspCisJeworCQlpZiAoa21hcmspCisJCXsK KwkJCUFzc2VydChrbWFyay0+bWFya1R5cGUgPT0gcm1hcmstPm1hcmtUeXBlKTsKKworCQkJ cm9vdC0+cm93TWFya3MgPSBsaXN0X2RlbGV0ZV9wdHIocm9vdC0+cm93TWFya3MsIHJtYXJr KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qIFNob3VsZG4ndCBoYXZlIGluaGVyaXRhbmNl IGNoaWxkcmVuIGhlcmUuICovCisJCQlBc3NlcnQocm1hcmstPnJ0aSA9PSBybWFyay0+cHJ0 aSk7CisKKwkJCXJtYXJrLT5ydGkgPSBybWFyay0+cHJ0aSA9IHRvS2VlcC0+cmVsaWQ7CisJ CX0KKwl9CisKKwkvKiBSZXBsYWNlIHZhcm5vIGluIGFsbCB0aGUgcXVlcnkgc3RydWN0dXJl cywgZXhjZXB0IG5vZGVzIFJhbmdlVGJsUmVmCisJICogb3RoZXJ3aXNlIGxhdGVyIHJlbW92 ZV9yZWxfZnJvbV9qb2lubGlzdCB3aWxsIHlpZWxkIGVycm9ycy4KKwkqLworCUNoYW5nZVZh ck5vZGVzRXh0ZW5kZWQoKE5vZGUgKikgcm9vdC0+cGFyc2UsIHRvUmVtb3ZlLT5yZWxpZCwg dG9LZWVwLT5yZWxpZCwgMCwgZmFsc2UpOworCisJLyogUmVwbGFjZSBsaW5rcyBpbiB0aGUg cGxhbm5lciBpbmZvICovCisJcmVtb3ZlX3JlbF9mcm9tX3F1ZXJ5KHJvb3QsIHRvUmVtb3Zl LCB0b0tlZXAtPnJlbGlkLCBOVUxMLCBOVUxMKTsKKworCS8qIEF0IGxhc3QsIHJlcGxhY2Ug dmFybm8gaW4gcm9vdCB0YXJnZXRsaXN0IGFuZCBIQVZJTkcgY2xhdXNlICovCisJQ2hhbmdl VmFyTm9kZXMoKE5vZGUgKikgcm9vdC0+cHJvY2Vzc2VkX3RsaXN0LCB0b1JlbW92ZS0+cmVs aWQsIHRvS2VlcC0+cmVsaWQsIDApOworCUNoYW5nZVZhck5vZGVzKChOb2RlICopIHJvb3Qt PnByb2Nlc3NlZF9ncm91cENsYXVzZSwgdG9SZW1vdmUtPnJlbGlkLCB0b0tlZXAtPnJlbGlk LCAwKTsKKworCXJlcGxhY2VfcmVsaWQocm9vdC0+YWxsX3Jlc3VsdF9yZWxpZHMsIHRvUmVt b3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisJcmVwbGFjZV9yZWxpZChyb290LT5sZWFm X3Jlc3VsdF9yZWxpZHMsIHRvUmVtb3ZlLT5yZWxpZCwgdG9LZWVwLT5yZWxpZCk7CisKKwor CS8qCisJICogVGhlcmUgbWF5IGJlIHJlZmVyZW5jZXMgdG8gdGhlIHJlbCBpbiByb290LT5m a2V5X2xpc3QsIGJ1dCBpZiBzbywKKwkgKiBtYXRjaF9mb3JlaWduX2tleXNfdG9fcXVhbHMo KSB3aWxsIGdldCByaWQgb2YgdGhlbS4KKwkgKi8KKworCS8qCisJICogRmluYWxseSwgcmVt b3ZlIHRoZSByZWwgZnJvbSB0aGUgYmFzZXJlbCBhcnJheSB0byBwcmV2ZW50IGl0IGZyb20g YmVpbmcKKwkgKiByZWZlcmVuY2VkIGFnYWluLiAgKFdlIGNhbid0IGRvIHRoaXMgZWFybGll ciBiZWNhdXNlCisJICogcmVtb3ZlX2pvaW5fY2xhdXNlX2Zyb21fcmVscyB3aWxsIHRvdWNo IGl0LikKKwkgKi8KKwlyb290LT5zaW1wbGVfcmVsX2FycmF5W3RvUmVtb3ZlLT5yZWxpZF0g PSBOVUxMOworCisJLyogQW5kIG51a2UgdGhlIFJlbE9wdEluZm8sIGp1c3QgaW4gY2FzZSB0 aGVyZSdzIGFub3RoZXIgYWNjZXNzIHBhdGggKi8KKwlwZnJlZSh0b1JlbW92ZSk7Cit9CisK Ky8qCisgKiBzcGxpdF9zZWxmam9pbl9xdWFscworICoJCVByb2Nlc3NlcyAnam9pbnF1YWxz JyBieSBidWlsZGluZyB0d28gbGlzdHM6IG9uZSBjb250YWluaW5nIHRoZSBxdWFscworICoJ CXdoZXJlIHRoZSBjb2x1bW5zL2V4cHJzIGFyZSBvbiBlaXRoZXIgc2lkZSBvZiB0aGUgam9p biBtYXRjaCwgYW5kCisgKgkJYW5vdGhlciBvbmUgY29udGFpbmluZyB0aGUgcmVtYWluaW5n IHF1YWxzLgorICoKKyAqICdqb2lucXVhbHMnIG11c3Qgb25seSBjb250YWluIHF1YWxzIGZv ciBhIFJURV9SRUxBVElPTiBiZWluZyBqb2luZWQgdG8KKyAqIGl0c2VsZi4KKyAqLworc3Rh dGljIHZvaWQKK3NwbGl0X3NlbGZqb2luX3F1YWxzKFBsYW5uZXJJbmZvICpyb290LCBMaXN0 ICpqb2lucXVhbHMsIExpc3QgKipzZWxmam9pbnF1YWxzLAorCQkJCQkgTGlzdCAqKm90aGVy am9pbnF1YWxzLCBpbnQgZnJvbSwgaW50IHRvKQoreworCUxpc3QJICAgKnNqb2lucXVhbHMg PSBOSUw7CisJTGlzdAkgICAqb2pvaW5xdWFscyA9IE5JTDsKKworCWZvcmVhY2hfbm9kZShS ZXN0cmljdEluZm8sIHJpbmZvLCBqb2lucXVhbHMpCisJeworCQlPcEV4cHIJICAgKmV4cHI7 CisJCU5vZGUJICAgKmxlZnRleHByOworCQlOb2RlCSAgICpyaWdodGV4cHI7CisKKwkJLyog SW4gZ2VuZXJhbCwgY2xhdXNlIGxvb2tzIGxpa2UgRihhcmcxKSA9IEcoYXJnMikgKi8KKwkJ aWYgKCFyaW5mby0+bWVyZ2VvcGZhbWlsaWVzIHx8CisJCQlibXNfbnVtX21lbWJlcnMocmlu Zm8tPmNsYXVzZV9yZWxpZHMpICE9IDIgfHwKKwkJCWJtc19tZW1iZXJzaGlwKHJpbmZvLT5s ZWZ0X3JlbGlkcykgIT0gQk1TX1NJTkdMRVRPTiB8fAorCQkJYm1zX21lbWJlcnNoaXAocmlu Zm8tPnJpZ2h0X3JlbGlkcykgIT0gQk1TX1NJTkdMRVRPTikKKwkJeworCQkJb2pvaW5xdWFs cyA9IGxhcHBlbmQob2pvaW5xdWFscywgcmluZm8pOworCQkJY29udGludWU7CisJCX0KKwor CQlleHByID0gKE9wRXhwciAqKSByaW5mby0+Y2xhdXNlOworCisJCWlmICghSXNBKGV4cHIs IE9wRXhwcikgfHwgbGlzdF9sZW5ndGgoZXhwci0+YXJncykgIT0gMikKKwkJeworCQkJb2pv aW5xdWFscyA9IGxhcHBlbmQob2pvaW5xdWFscywgcmluZm8pOworCQkJY29udGludWU7CisJ CX0KKworCQlsZWZ0ZXhwciA9IGdldF9sZWZ0b3AocmluZm8tPmNsYXVzZSk7CisJCXJpZ2h0 ZXhwciA9IGNvcHlPYmplY3QoZ2V0X3JpZ2h0b3AocmluZm8tPmNsYXVzZSkpOworCisJCWlm IChsZWZ0ZXhwciAmJiBJc0EobGVmdGV4cHIsIFJlbGFiZWxUeXBlKSkKKwkJCWxlZnRleHBy ID0gKE5vZGUgKikgKChSZWxhYmVsVHlwZSAqKSBsZWZ0ZXhwciktPmFyZzsKKwkJaWYgKHJp Z2h0ZXhwciAmJiBJc0EocmlnaHRleHByLCBSZWxhYmVsVHlwZSkpCisJCQlyaWdodGV4cHIg PSAoTm9kZSAqKSAoKFJlbGFiZWxUeXBlICopIHJpZ2h0ZXhwciktPmFyZzsKKworCQkvKgor CQkgKiBRdWl0ZSBhbiBleHBlbnNpdmUgb3BlcmF0aW9uLCBuYXJyb3dpbmcgdGhlIHVzZSBj YXNlLiBGb3IgZXhhbXBsZSwKKwkJICogd2hlbiB3ZSBoYXZlIGNhc3Qgb2YgdGhlIHNhbWUg dmFyIHRvIGRpZmZlcmVudCAoYnV0IGNvbXBhdGlibGUpCisJCSAqIHR5cGVzLgorCQkgKi8K KwkJQ2hhbmdlVmFyTm9kZXMocmlnaHRleHByLCBibXNfc2luZ2xldG9uX21lbWJlcihyaW5m by0+cmlnaHRfcmVsaWRzKSwKKwkJCQkJICBibXNfc2luZ2xldG9uX21lbWJlcihyaW5mby0+ bGVmdF9yZWxpZHMpLCAwKTsKKworCQlpZiAoZXF1YWwobGVmdGV4cHIsIHJpZ2h0ZXhwcikp CisJCQlzam9pbnF1YWxzID0gbGFwcGVuZChzam9pbnF1YWxzLCByaW5mbyk7CisJCWVsc2UK KwkJCW9qb2lucXVhbHMgPSBsYXBwZW5kKG9qb2lucXVhbHMsIHJpbmZvKTsKKwl9CisKKwkq c2VsZmpvaW5xdWFscyA9IHNqb2lucXVhbHM7CisJKm90aGVyam9pbnF1YWxzID0gb2pvaW5x dWFsczsKK30KKworLyoKKyAqIENoZWNrIGZvciBhIGNhc2Ugd2hlbiB1bmlxdWVuZXNzIGlz IGF0IGxlYXN0IHBhcnRseSBkZXJpdmVkIGZyb20gYQorICogYmFzZXJlc3RyaWN0aW5mbyBj bGF1c2UuIEluIHRoaXMgY2FzZSwgd2UgaGF2ZSBhIGNoYW5jZSB0byByZXR1cm4gb25seQor ICogb25lIHJvdyAoaWYgc3VjaCBjbGF1c2VzIG9uIGJvdGggc2lkZXMgb2YgU0ogYXJlIGVx dWFsKSBvciBub3RoaW5nIChpZiB0aGV5CisgKiBhcmUgZGlmZmVyZW50KS4KKyAqLworc3Rh dGljIGJvb2wKK21hdGNoX3VuaXF1ZV9jbGF1c2VzKFBsYW5uZXJJbmZvICpyb290LCBSZWxP cHRJbmZvICpvdXRlciwgTGlzdCAqdWNsYXVzZXMsCisJCQkJCSBJbmRleCByZWxpZCkKK3sK Kwlmb3JlYWNoX25vZGUoUmVzdHJpY3RJbmZvLCByaW5mbywgdWNsYXVzZXMpCisJeworCQlF eHByCSAgICpjbGF1c2U7CisJCU5vZGUJICAgKmljbGF1c2U7CisJCU5vZGUJICAgKmMxOwor CQlib29sCQltYXRjaGVkID0gZmFsc2U7CisKKwkJQXNzZXJ0KG91dGVyLT5yZWxpZCA+IDAg JiYgcmVsaWQgPiAwKTsKKworCQkvKiBPbmx5IGZpbHRlcnMgbGlrZSBmKFIueDEsLi4uLFIu eE4pID09IGV4cHIgd2Ugc2hvdWxkIGNvbnNpZGVyLiAqLworCQlBc3NlcnQoYm1zX2lzX2Vt cHR5KHJpbmZvLT5sZWZ0X3JlbGlkcykgXgorCQkJICAgYm1zX2lzX2VtcHR5KHJpbmZvLT5y aWdodF9yZWxpZHMpKTsKKworCQljbGF1c2UgPSAoRXhwciAqKSBjb3B5T2JqZWN0KHJpbmZv LT5jbGF1c2UpOworCQlDaGFuZ2VWYXJOb2RlcygoTm9kZSAqKSBjbGF1c2UsIHJlbGlkLCBv dXRlci0+cmVsaWQsIDApOworCisJCWljbGF1c2UgPSBibXNfaXNfZW1wdHkocmluZm8tPmxl ZnRfcmVsaWRzKSA/IGdldF9yaWdodG9wKGNsYXVzZSkgOgorCQkJZ2V0X2xlZnRvcChjbGF1 c2UpOworCQljMSA9IGJtc19pc19lbXB0eShyaW5mby0+bGVmdF9yZWxpZHMpID8gZ2V0X2xl ZnRvcChjbGF1c2UpIDoKKwkJCWdldF9yaWdodG9wKGNsYXVzZSk7CisKKwkJLyoKKwkJICog Q29tcGFyZSB0aGVzZSBsZWZ0IGFuZCByaWdodCBzaWRlcyB3aXRoIHRoZSBjb3JyZXNwb25k aW5nIHNpZGVzIG9mCisJCSAqIHRoZSBvdXRlcidzIGZpbHRlcnMuIElmIG5vIG9uZSBpcyBk ZXRlY3RlZCAtIHJldHVybiBpbW1lZGlhdGVseS4KKwkJICovCisJCWZvcmVhY2hfbm9kZShS ZXN0cmljdEluZm8sIG9yaW5mbywgb3V0ZXItPmJhc2VyZXN0cmljdGluZm8pCisJCXsKKwkJ CU5vZGUJICAgKm9jbGF1c2U7CisJCQlOb2RlCSAgICpjMjsKKworCQkJaWYgKG9yaW5mby0+ bWVyZ2VvcGZhbWlsaWVzID09IE5JTCkKKwkJCQkvKiBEb24ndCBjb25zaWRlciBjbGF1c2Vz IHdoaWNoIGFyZW4ndCBzaW1pbGFyIHRvICdGKFgpPUcoWSknICovCisJCQkJY29udGludWU7 CisKKwkJCUFzc2VydChpc19vcGNsYXVzZShvcmluZm8tPmNsYXVzZSkpOworCisJCQlvY2xh dXNlID0gYm1zX2lzX2VtcHR5KG9yaW5mby0+bGVmdF9yZWxpZHMpID8KKwkJCQlnZXRfcmln aHRvcChvcmluZm8tPmNsYXVzZSkgOiBnZXRfbGVmdG9wKG9yaW5mby0+Y2xhdXNlKTsKKwkJ CWMyID0gKGJtc19pc19lbXB0eShvcmluZm8tPmxlZnRfcmVsaWRzKSA/CisJCQkJICBnZXRf bGVmdG9wKG9yaW5mby0+Y2xhdXNlKSA6IGdldF9yaWdodG9wKG9yaW5mby0+Y2xhdXNlKSk7 CisKKwkJCWlmIChlcXVhbChpY2xhdXNlLCBvY2xhdXNlKSAmJiBlcXVhbChjMSwgYzIpKQor CQkJeworCQkJCW1hdGNoZWQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJ aWYgKCFtYXRjaGVkKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOwor fQorCisvKgorICogRmluZCBhbmQgcmVtb3ZlIHVuaXF1ZSBzZWxmIGpvaW5zIGluIGEgZ3Jv dXAgb2YgYmFzZSByZWxhdGlvbnMgdGhhdCBoYXZlCisgKiB0aGUgc2FtZSBPaWQuCisgKgor ICogUmV0dXJucyBhIHNldCBvZiByZWxpZHMgdGhhdCB3ZXJlIHJlbW92ZWQuCisgKi8KK3N0 YXRpYyBSZWxpZHMKK3JlbW92ZV9zZWxmX2pvaW5zX29uZV9ncm91cChQbGFubmVySW5mbyAq cm9vdCwgUmVsaWRzIHJlbGlkcykKK3sKKwlSZWxpZHMJCXJlc3VsdCA9IE5VTEw7CisJaW50 CQkJazsJCQkJLyogSW5kZXggb2Yga2VwdCByZWxhdGlvbiAqLworCWludAkJCXIgPSAtMTsJ CQkvKiBJbmRleCBvZiByZW1vdmVkIHJlbGF0aW9uICovCisKKwl3aGlsZSAoKHIgPSBibXNf bmV4dF9tZW1iZXIocmVsaWRzLCByKSkgPiAwKQorCXsKKwkJUmVsT3B0SW5mbyAqaW5uZXIg PSByb290LT5zaW1wbGVfcmVsX2FycmF5W3JdOworCisJCWsgPSByOworCisJCXdoaWxlICgo ayA9IGJtc19uZXh0X21lbWJlcihyZWxpZHMsIGspKSA+IDApCisJCXsKKwkJCVJlbGlkcwkJ am9pbnJlbGlkcyA9IE5VTEw7CisJCQlSZWxPcHRJbmZvICpvdXRlciA9IHJvb3QtPnNpbXBs ZV9yZWxfYXJyYXlba107CisJCQlMaXN0CSAgICpyZXN0cmljdGxpc3Q7CisJCQlMaXN0CSAg ICpzZWxmam9pbnF1YWxzOworCQkJTGlzdAkgICAqb3RoZXJqb2lucXVhbHM7CisJCQlMaXN0 Q2VsbCAgICpsYzsKKwkJCWJvb2wJCWppbmZvX2NoZWNrID0gdHJ1ZTsKKwkJCVBsYW5Sb3dN YXJrICpvbWFyayA9IE5VTEw7CisJCQlQbGFuUm93TWFyayAqaW1hcmsgPSBOVUxMOworCQkJ TGlzdAkgICAqdWNsYXVzZXMgPSBOSUw7CisKKwkJCS8qIEEgc2FuaXR5IGNoZWNrOiB0aGUg cmVsYXRpb25zIGhhdmUgdGhlIHNhbWUgT2lkLiAqLworCQkJQXNzZXJ0KHJvb3QtPnNpbXBs ZV9ydGVfYXJyYXlba10tPnJlbGlkID09CisJCQkJICAgcm9vdC0+c2ltcGxlX3J0ZV9hcnJh eVtyXS0+cmVsaWQpOworCisJCQkvKgorCQkJICogSXQgaXMgaW1wb3NzaWJsZSB0byBlbGlt aW5hdGUgam9pbiBvZiB0d28gcmVsYXRpb25zIGlmIHRoZXkKKwkJCSAqIGJlbG9uZyB0byBk aWZmZXJlbnQgcnVsZXMgb2Ygb3JkZXIuIE90aGVyd2lzZSBwbGFubmVyIGNhbid0IGJlCisJ CQkgKiBhYmxlIHRvIGZpbmQgYW55IHZhcmlhbnRzIG9mIGNvcnJlY3QgcXVlcnkgcGxhbi4K KwkJCSAqLworCQkJZm9yZWFjaChsYywgcm9vdC0+am9pbl9pbmZvX2xpc3QpCisJCQl7CisJ CQkJU3BlY2lhbEpvaW5JbmZvICppbmZvID0gKFNwZWNpYWxKb2luSW5mbyAqKSBsZmlyc3Qo bGMpOworCisJCQkJaWYgKChibXNfaXNfbWVtYmVyKGssIGluZm8tPnN5bl9sZWZ0aGFuZCkg XgorCQkJCQkgYm1zX2lzX21lbWJlcihyLCBpbmZvLT5zeW5fbGVmdGhhbmQpKSB8fAorCQkJ CQkoYm1zX2lzX21lbWJlcihrLCBpbmZvLT5zeW5fcmlnaHRoYW5kKSBeCisJCQkJCSBibXNf aXNfbWVtYmVyKHIsIGluZm8tPnN5bl9yaWdodGhhbmQpKSkKKwkJCQl7CisJCQkJCWppbmZv X2NoZWNrID0gZmFsc2U7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmICghamlu Zm9fY2hlY2spCisJCQkJY29udGludWU7CisKKwkJCS8qCisJCQkgKiBDaGVjayBSb3cgTWFy a3MgZXF1aXZhbGVuY2UuICBXZSBjYW4ndCByZW1vdmUgdGhlIGpvaW4gaWYgdGhlCisJCQkg KiByZWxhdGlvbnMgaGF2ZSByb3cgbWFya3Mgb2YgZGlmZmVyZW50IHN0cmVuZ3RoIChlLmcu IG9uZSBpcworCQkJICogbG9ja2VkIEZPUiBVUERBVEUgYW5kIGFub3RoZXIganVzdCBoYXMg Uk9XX01BUktfUkVGRVJFTkNFIGZvcgorCQkJICogRXZhbFBsYW5RdWFsIHJlY2hlY2tpbmcp LgorCQkJICovCisJCQlmb3JlYWNoKGxjLCByb290LT5yb3dNYXJrcykKKwkJCXsKKwkJCQlQ bGFuUm93TWFyayAqcm93TWFyayA9IChQbGFuUm93TWFyayAqKSBsZmlyc3QobGMpOworCisJ CQkJaWYgKHJvd01hcmstPnJ0aSA9PSBrKQorCQkJCXsKKwkJCQkJQXNzZXJ0KGltYXJrID09 IE5VTEwpOworCQkJCQlpbWFyayA9IHJvd01hcms7CisJCQkJfQorCQkJCWVsc2UgaWYgKHJv d01hcmstPnJ0aSA9PSByKQorCQkJCXsKKwkJCQkJQXNzZXJ0KG9tYXJrID09IE5VTEwpOwor CQkJCQlvbWFyayA9IHJvd01hcms7CisJCQkJfQorCisJCQkJaWYgKG9tYXJrICYmIGltYXJr KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChvbWFyayAmJiBpbWFyayAmJiBvbWFyay0+ bWFya1R5cGUgIT0gaW1hcmstPm1hcmtUeXBlKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgor CQkJICogV2Ugb25seSBkZWFsIHdpdGggYmFzZSByZWxzIGhlcmUsIHNvIHRoZWlyIHJlbGlk cyBiaXRzZXQKKwkJCSAqIGNvbnRhaW5zIG9ubHkgb25lIG1lbWJlciAtLSB0aGVpciByZWxp ZC4KKwkJCSAqLworCQkJam9pbnJlbGlkcyA9IGJtc19hZGRfbWVtYmVyKGpvaW5yZWxpZHMs IHIpOworCQkJam9pbnJlbGlkcyA9IGJtc19hZGRfbWVtYmVyKGpvaW5yZWxpZHMsIGspOwor CisJCQkvKgorCQkJICogUEhWcyBzaG91bGQgbm90IGltcG9zZSBhbnkgY29uc3RyYWludHMg b24gcmVtb3Zpbmcgc2VsZiBqb2lucy4KKwkJCSAqLworCisJCQkvKgorCQkJICogQXQgdGhp cyBzdGFnZSwgam9pbmluZm8gbGlzdHMgb2YgaW5uZXIgYW5kIG91dGVyIGNhbiBjb250YWlu CisJCQkgKiBvbmx5IGNsYXVzZXMsIHJlcXVpcmVkIGZvciBhIHN1cGVyaW9yIG91dGVyIGpv aW4gdGhhdCBjYW4ndAorCQkJICogaW5mbHVlbmNlIHRoaXMgb3B0aW1pemF0aW9uLiBTbywg d2UgY2FuIGF2b2lkIHRvIGNhbGwgdGhlCisJCQkgKiBidWlsZF9qb2lucmVsX3Jlc3RyaWN0 bGlzdCgpIHJvdXRpbmUuCisJCQkgKi8KKwkJCXJlc3RyaWN0bGlzdCA9IGdlbmVyYXRlX2pv aW5faW1wbGllZF9lcXVhbGl0aWVzKHJvb3QsIGpvaW5yZWxpZHMsCisJCQkJCQkJCQkJCQkJ CQlpbm5lci0+cmVsaWRzLAorCQkJCQkJCQkJCQkJCQkJb3V0ZXIsIE5VTEwpOworCisJCQkv KgorCQkJICogUHJvY2VzcyByZXN0cmljdGxpc3QgdG8gc2VwYXJhdGUgdGhlIHNlbGYgam9p biBxdWFscyBvdXQgb2YgdGhlCisJCQkgKiBvdGhlciBxdWFscy4gZS5nIHggPSB4IGdvZXMg dG8gc2VsZmpvaW5xdWFscyBhbmQgYSA9IGIgdG8KKwkJCSAqIG90aGVyam9pbnF1YWxzLgor CQkJICovCisJCQlzcGxpdF9zZWxmam9pbl9xdWFscyhyb290LCByZXN0cmljdGxpc3QsICZz ZWxmam9pbnF1YWxzLAorCQkJCQkJCQkgJm90aGVyam9pbnF1YWxzLCBpbm5lci0+cmVsaWQs IG91dGVyLT5yZWxpZCk7CisKKwkJCUFzc2VydChsaXN0X2xlbmd0aChyZXN0cmljdGxpc3Qp ID09CisJCQkJCShsaXN0X2xlbmd0aChzZWxmam9pbnF1YWxzKSArIGxpc3RfbGVuZ3RoKG90 aGVyam9pbnF1YWxzKSkpOworCisJCQkvKgorCQkJICogRGV0ZXJtaW5lIGlmIHRoZSBpbm5l ciB0YWJsZSBjYW4gZHVwbGljYXRlIG91dGVyIHJvd3MuICBXZSBtdXN0CisJCQkgKiBieXBh c3MgdGhlIHVuaXF1ZSByZWwgY2FjaGUgaGVyZSBzaW5jZSB3ZSdyZSBwb3NzaWJseSB1c2lu ZyBhCisJCQkgKiBzdWJzZXQgb2Ygam9pbiBxdWFscy4gV2UgY2FuIHVzZSAnZm9yY2VfY2Fj aGUnID09IHRydWUgd2hlbiBhbGwKKwkJCSAqIGpvaW4gcXVhbHMgYXJlIHNlbGYtam9pbiBx dWFscy4gIE90aGVyd2lzZSwgd2UgY291bGQgZW5kIHVwCisJCQkgKiBwdXR0aW5nIGZhbHNl IG5lZ2F0aXZlcyBpbiB0aGUgY2FjaGUuCisJCQkgKi8KKwkJCWlmICghaW5uZXJyZWxfaXNf dW5pcXVlX2V4dChyb290LCBqb2lucmVsaWRzLCBpbm5lci0+cmVsaWRzLAorCQkJCQkJCQkJ CW91dGVyLCBKT0lOX0lOTkVSLCBzZWxmam9pbnF1YWxzLAorCQkJCQkJCQkJCWZhbHNlLCAm dWNsYXVzZXMpKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogdWNsYXVzZXMgaXMg dGhlIGNvcHkgb2Ygb3V0ZXItPmJhc2VyZXN0cmljdGluZm8gdGhhdCBhc3NvY2lhdGVkIHdp dGggYSBpbmRleC4KKwkJCSAqIFdlIGFscmVhZHkgcHJvdmVuIHRoYXQgYmFzZWQgb24ge291 dGVyLT5iYXNlcmVzdHJpY3RpbmZvLCBzZWxmam9pbnF1YWxzfQorCQkJICogY29tcGFyc2lv biB3aXRoIHVuaXF1ZSBpbmRleCB3ZSBjYW4gZ3VhcmFudGVlcyB0aGF0IGZvciB0aGUgb3V0 ZXIgcmVsIHRoZXJlIGlzCisJCQkgKiBhdCBtb3N0IG9uZSByb3cgd2hlcmUgY29sdW1ucyBl cXVhbCBnaXZlbiB2YWx1ZXMuIFNvbWV0aW1lcyB0aGF0IGlzIG5vdCBvay4gZS5nLgorCQkJ ICogIndoZXJlIHMxLmIgPSBzMi5iIGFuZCBzMS5hID0gMSBhbmQgczIuYSA9IDIiLiAodGhl IGluZGV4IGlzIGJhc2VkIG9uIGNvbHVtbihhLGIpLgorCQkJICogaW4gdGhlc2Ugc2NhcmVu aW8sIHdlIGFsc28gbmVlZCB0byB2YWxpZGF0ZSBlcXVhbGl0eSBvZiBvdXRlci0+YmFzZXJl c3RyaWN0aW5mbworCQkJICogd2l0aCBpbm5lci0+b3V0ZXItPmJhc2VyZXN0cmljdGluZm8s CisJCQkgKiBvciBlbHNlIHdlIHdvbid0IG1hdGNoIHRoZSBzYW1lIHJvdyBvbiBlYWNoIHNp ZGUgb2YgdGhlIGpvaW4uCisJCQkgKi8KKwkJCWlmICghbWF0Y2hfdW5pcXVlX2NsYXVzZXMo cm9vdCwgaW5uZXIsIHVjbGF1c2VzLCBvdXRlci0+cmVsaWQpKQorCQkJCWNvbnRpbnVlOwor CisJCQkvKgorCQkJICogV2UgY2FuIHJlbW92ZSBlaXRoZXIgcmVsYXRpb24sIHNvIHJlbW92 ZSB0aGUgaW5uZXIgb25lIGluIG9yZGVyCisJCQkgKiB0byBzaW1wbGlmeSB0aGlzIGxvb3Au CisJCQkgKi8KKwkJCXJlbW92ZV9zZWxmX2pvaW5fcmVsKHJvb3QsIG9tYXJrLCBpbWFyaywg b3V0ZXIsIGlubmVyLCByZXN0cmljdGxpc3QpOworCisJCQlyZXN1bHQgPSBibXNfYWRkX21l bWJlcihyZXN1bHQsIHIpOworCisJCQkvKiBXZSBoYXZlIHJlbW92ZWQgdGhlIG91dGVyIHJl bGF0aW9uLCB0cnkgdGhlIG5leHQgb25lLiAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwly ZXR1cm4gcmVzdWx0OworfQorCisvKgorICogR2F0aGVyIGluZGV4ZXMgb2YgYmFzZSByZWxh dGlvbnMgZnJvbSB0aGUgam9pbmxpc3QgYW5kIHRyeSB0byBlbGltaW5hdGUgc2VsZgorICog am9pbnMuCisgKi8KK3N0YXRpYyBSZWxpZHMKK3JlbW92ZV9zZWxmX2pvaW5zX3JlY3Vyc2Uo UGxhbm5lckluZm8gKnJvb3QsIExpc3QgKmpvaW5saXN0LCBSZWxpZHMgdG9SZW1vdmUpCit7 CisJTGlzdENlbGwgICAqamw7CisJUmVsaWRzCQlyZWxpZHMgPSBOVUxMOworCVNlbGZKb2lu Q2FuZGlkYXRlICpjYW5kaWRhdGVzID0gTlVMTDsKKwlpbnQJCQlpOworCWludAkJCWo7CisJ aW50CQkJbnVtUmVsczsKKworCS8qIENvbGxlY3QgaW5kZXhlcyBvZiBiYXNlIHJlbGF0aW9u cyBvZiB0aGUgam9pbiB0cmVlICovCisJZm9yZWFjaChqbCwgam9pbmxpc3QpCisJeworCQlO b2RlCSAgICpqbG5vZGUgPSAoTm9kZSAqKSBsZmlyc3QoamwpOworCisJCWlmIChJc0Eoamxu b2RlLCBSYW5nZVRibFJlZikpCisJCXsKKwkJCWludAkJCXZhcm5vID0gKChSYW5nZVRibFJl ZiAqKSBqbG5vZGUpLT5ydGluZGV4OworCQkJUmFuZ2VUYmxFbnRyeSAqcnRlID0gcm9vdC0+ c2ltcGxlX3J0ZV9hcnJheVt2YXJub107CisKKwkJCS8qCisJCQkgKiBXZSBvbmx5IGNvbnNp ZGVyIG9yZGluYXJ5IHJlbGF0aW9ucyBhcyBjYW5kaWRhdGVzIHRvIGJlIHJlbW92ZWQsCisJ CQkgKiBhbmQgdGhlc2UgcmVsYXRpb25zIHNob3VsZCBub3QgaGF2ZSBUQUJMRVNBTVBMRSBj bGF1c2VzCisJCQkgKiBzcGVjaWZpZWQuICBSZW1vdmluZyBhIHJlbGF0aW9uIHdpdGggVEFC TEVTQU1QTEUgY2xhdXNlIGNvdWxkCisJCQkgKiBwb3RlbnRpYWxseSBjaGFuZ2UgdGhlIHN5 bnRheCBvZiB0aGUgcXVlcnkuCisJCQkgKiBCZWNhdXNlIG9mIFVQREFURS9ERUxFVEUgRVBR IG1lYWNoYW5pc20sIGN1cnJlbnRseSBRdWVyeS0+cmVzdWx0UmVsYXRpb24KKwkJCSAqIG9y IFF1ZXJ5LT5tZXJnZVRhcmdldFJlbGF0aW9uIGFzc29jaWF0ZWQgcmVsIGNhbm5vdCBiZSBl bGltaW5hdGVkLgorCQkJICovCisJCQlpZiAocnRlLT5ydGVraW5kID09IFJURV9SRUxBVElP TiAmJgorCQkJCXJ0ZS0+cmVsa2luZCA9PSBSRUxLSU5EX1JFTEFUSU9OICYmCisJCQkJcnRl LT50YWJsZXNhbXBsZSA9PSBOVUxMICYmCisJCQkJdmFybm8gIT0gcm9vdC0+cGFyc2UtPnJl c3VsdFJlbGF0aW9uICYmCisJCQkJdmFybm8gIT0gcm9vdC0+cGFyc2UtPm1lcmdlVGFyZ2V0 UmVsYXRpb24pCisJCQl7CisJCQkJQXNzZXJ0KCFibXNfaXNfbWVtYmVyKHZhcm5vLCByZWxp ZHMpKTsKKwkJCQlyZWxpZHMgPSBibXNfYWRkX21lbWJlcihyZWxpZHMsIHZhcm5vKTsKKwkJ CX0KKwkJfQorCQllbHNlIGlmIChJc0Eoamxub2RlLCBMaXN0KSkKKwkJeworCQkJLyogUmVj dXJzaXZlbHkgZ28gaW5zaWRlIHRoZSBzdWItam9pbmxpc3QgKi8KKwkJCXRvUmVtb3ZlID0g cmVtb3ZlX3NlbGZfam9pbnNfcmVjdXJzZShyb290LCAoTGlzdCAqKSBqbG5vZGUsCisJCQkJ CQkJCQkJCQkgdG9SZW1vdmUpOworCQl9CisJCWVsc2UKKwkJCWVsb2coRVJST1IsICJ1bnJl Y29nbml6ZWQgam9pbmxpc3Qgbm9kZSB0eXBlOiAlZCIsCisJCQkJIChpbnQpIG5vZGVUYWco amxub2RlKSk7CisJfQorCisJbnVtUmVscyA9IGJtc19udW1fbWVtYmVycyhyZWxpZHMpOwor CisJLyogTmVlZCBhdCBsZWFzdCB0d28gcmVsYXRpb25zIGZvciB0aGUgam9pbiAqLworCWlm IChudW1SZWxzIDwgMikKKwkJcmV0dXJuIHRvUmVtb3ZlOworCisJLyoKKwkgKiBJbiBvcmRl ciB0byBmaW5kIHJlbGF0aW9ucyB3aXRoIHRoZSBzYW1lIG9pZCB3ZSBmaXJzdCBidWlsZCBh biBhcnJheSBvZgorCSAqIGNhbmRpZGF0ZXMgYW5kIHRoZW4gc29ydCBpdCBieSBvaWQuCisJ ICovCisJY2FuZGlkYXRlcyA9IChTZWxmSm9pbkNhbmRpZGF0ZSAqKSBwYWxsb2Moc2l6ZW9m KFNlbGZKb2luQ2FuZGlkYXRlKSAqCisJCQkJCQkJCQkJCSAgbnVtUmVscyk7CisJaSA9IC0x OworCWogPSAwOworCXdoaWxlICgoaSA9IGJtc19uZXh0X21lbWJlcihyZWxpZHMsIGkpKSA+ PSAwKQorCXsKKwkJY2FuZGlkYXRlc1tqXS5yZWxpZCA9IGk7CisJCWNhbmRpZGF0ZXNbal0u cmVsb2lkID0gcm9vdC0+c2ltcGxlX3J0ZV9hcnJheVtpXS0+cmVsaWQ7CisJCWorKzsKKwl9 CisKKwlxc29ydChjYW5kaWRhdGVzLCBudW1SZWxzLCBzaXplb2YoU2VsZkpvaW5DYW5kaWRh dGUpLAorCQkgIHNlbGZfam9pbl9jYW5kaWRhdGVzX2NtcCk7CisKKwkvKgorCSAqIEl0ZXJh dGl2ZWx5IGZvcm0gYSBncm91cCBvZiByZWxhdGlvbiBpbmRleGVzIHdpdGggdGhlIHNhbWUg b2lkIGFuZAorCSAqIGxhdW5jaCB0aGUgcm91dGluZSB0aGF0IGRldGVjdHMgc2VsZi1qb2lu cyBpbiB0aGlzIGdyb3VwIGFuZCByZW1vdmVzCisJICogZXhjZXNzaXZlIHJhbmdlIHRhYmxl IGVudHJpZXMuCisJICoKKwkgKiBBdCB0aGUgZW5kIG9mIHRoZSBpdGVyYXRpb24sIGV4Y2x1 ZGUgdGhlIGdyb3VwIGZyb20gdGhlIG92ZXJhbGwgcmVsaWRzCisJICogbGlzdC4gU28gZWFj aCBuZXh0IGl0ZXJhdGlvbiBvZiB0aGUgY3ljbGUgd2lsbCBpbnZvbHZlIGxlc3MgYW5kIGxl c3MKKwkgKiB2YWx1ZSBvZiByZWxpZHMuCisJICovCisJaSA9IDA7CisJZm9yIChqID0gMTsg aiA8IG51bVJlbHMgKyAxOyBqKyspCisJeworCQlpZiAoaiA9PSBudW1SZWxzIHx8IGNhbmRp ZGF0ZXNbal0ucmVsb2lkICE9IGNhbmRpZGF0ZXNbaV0ucmVsb2lkKQorCQl7CisJCQlpZiAo aiAtIGkgPj0gMikKKwkJCXsKKwkJCQkvKiBDcmVhdGUgYSBncm91cCBvZiByZWxhdGlvbiBp bmRleGVzIHdpdGggdGhlIHNhbWUgb2lkICovCisJCQkJUmVsaWRzCQlncm91cCA9IE5VTEw7 CisJCQkJUmVsaWRzCQlyZW1vdmVkOworCisJCQkJd2hpbGUgKGkgPCBqKQorCQkJCXsKKwkJ CQkJZ3JvdXAgPSBibXNfYWRkX21lbWJlcihncm91cCwgY2FuZGlkYXRlc1tpXS5yZWxpZCk7 CisJCQkJCWkrKzsKKwkJCQl9CisJCQkJcmVsaWRzID0gYm1zX2RlbF9tZW1iZXJzKHJlbGlk cywgZ3JvdXApOworCisJCQkJLyoKKwkJCQkgKiBUcnkgdG8gcmVtb3ZlIHNlbGYtam9pbnMg ZnJvbSBhIGdyb3VwIG9mIGlkZW50aWNhbCBlbnRyaWVzLgorCQkJCSAqIE1ha2UgdGhlIG5l eHQgYXR0ZW1wdCBpdGVyYXRpdmVseSAtIGlmIHNvbWV0aGluZyBpcyBkZWxldGVkCisJCQkJ ICogZnJvbSBhIGdyb3VwLCBjaGFuZ2VzIGluIGNsYXVzZXMgYW5kIGVxdWl2YWxlbmNlIGNs YXNzZXMKKwkJCQkgKiBjYW4gZ2l2ZSB1cyBhIGNoYW5jZSB0byBmaW5kIG1vcmUgY2FuZGlk YXRlcy4KKwkJCQkgKi8KKwkJCQlkbworCQkJCXsKKwkJCQkJQXNzZXJ0KCFibXNfb3Zlcmxh cChncm91cCwgdG9SZW1vdmUpKTsKKwkJCQkJcmVtb3ZlZCA9IHJlbW92ZV9zZWxmX2pvaW5z X29uZV9ncm91cChyb290LCBncm91cCk7CisJCQkJCXRvUmVtb3ZlID0gYm1zX2FkZF9tZW1i ZXJzKHRvUmVtb3ZlLCByZW1vdmVkKTsKKwkJCQkJZ3JvdXAgPSBibXNfZGVsX21lbWJlcnMo Z3JvdXAsIHJlbW92ZWQpOworCQkJCX0gd2hpbGUgKCFibXNfaXNfZW1wdHkocmVtb3ZlZCkg JiYKKwkJCQkJCSBibXNfbWVtYmVyc2hpcChncm91cCkgPT0gQk1TX01VTFRJUExFKTsKKwkJ CQlibXNfZnJlZShyZW1vdmVkKTsKKwkJCQlibXNfZnJlZShncm91cCk7CisJCQl9CisJCQll bHNlCisJCQl7CisJCQkJLyogU2luZ2xlIHJlbGF0aW9uLCBqdXN0IHJlbW92ZSBpdCBmcm9t IHRoZSBzZXQgKi8KKwkJCQlyZWxpZHMgPSBibXNfZGVsX21lbWJlcihyZWxpZHMsIGNhbmRp ZGF0ZXNbaV0ucmVsaWQpOworCQkJCWkgPSBqOworCQkJfQorCQl9CisJfQorCisJQXNzZXJ0 KGJtc19pc19lbXB0eShyZWxpZHMpKTsKKworCXJldHVybiB0b1JlbW92ZTsKK30KKworLyoK KyAqIENvbXBhcmUgc2VsZi1qb2luIGNhbmRpZGF0ZXMgYnkgdGhlaXIgb2lkcy4KKyAqLwor c3RhdGljIGludAorc2VsZl9qb2luX2NhbmRpZGF0ZXNfY21wKGNvbnN0IHZvaWQgKmEsIGNv bnN0IHZvaWQgKmIpCit7CisJY29uc3QgU2VsZkpvaW5DYW5kaWRhdGUgKmNhID0gKGNvbnN0 IFNlbGZKb2luQ2FuZGlkYXRlICopIGE7CisJY29uc3QgU2VsZkpvaW5DYW5kaWRhdGUgKmNi ID0gKGNvbnN0IFNlbGZKb2luQ2FuZGlkYXRlICopIGI7CisKKwlpZiAoY2EtPnJlbG9pZCAh PSBjYi0+cmVsb2lkKQorCQlyZXR1cm4gKGNhLT5yZWxvaWQgPCBjYi0+cmVsb2lkID8gLTEg OiAxKTsKKwllbHNlCisJCXJldHVybiAwOworfQorCisvKgorICogRmluZCBhbmQgcmVtb3Zl IHVzZWxlc3Mgc2VsZiBqb2lucy4KKyAqCisgKiBTZWFyY2ggZm9yIGpvaW5zIHdoZXJlIGEg cmVsYXRpb24gaXMgam9pbmVkIHRvIGl0c2VsZi4gSWYgdGhlIGpvaW4gY2xhdXNlCisgKiBm b3IgZWFjaCB0dXBsZSBmcm9tIG9uZSBzaWRlIG9mIHRoZSBqb2luIGlzIHByb3ZlbiB0byBt YXRjaCB0aGUgc2FtZQorICogcGh5c2ljYWwgcm93IChvciBub3RoaW5nKSBvbiB0aGUgb3Ro ZXIgc2lkZSwgdGhhdCBzZWxmLWpvaW4gY2FuIGJlCisgKiBlbGltaW5hdGVkIGZyb20gdGhl IHF1ZXJ5LiAgU3VpdGFibGUgam9pbiBjbGF1c2VzIGFyZSBhc3N1bWVkIHRvIGJlIGluIHRo ZQorICogZm9ybSBvZiBYID0gWCwgYW5kIGNhbiBiZSByZXBsYWNlZCB3aXRoIE5PVCBOVUxM IGNsYXVzZXMuCisgKgorICogRm9yIHRoZSBzYWtlIG9mIHNpbXBsaWNpdHksIHdlIGRvbid0 IGFwcGx5IHRoaXMgb3B0aW1pemF0aW9uIHRvIHNwZWNpYWwKKyAqIGpvaW5zLiBIZXJlIGlz IGEgbGlzdCBvZiB3aGF0IHdlIGNvdWxkIGRvIGluIHNvbWUgcGFydGljdWxhciBjYXNlczoK KyAqICdhIGExIHNlbWkgam9pbiBhIGEyJzogaXMgcmVkdWNlZCB0byBpbm5lciBieSByZWR1 Y2VfdW5pcXVlX3NlbWlqb2lucywKKyAqIGFuZCB0aGVuIHJlbW92ZWQgbm9ybWFsbHkuCisg KiAnYSBhMSBhbnRpIGpvaW4gYSBhMic6IGNvdWxkIHNpbXBsaWZ5IHRvIGEgc2NhbiB3aXRo ICdvdXRlciBxdWFscyBBTkQKKyAqIChJUyBOVUxMIG9uIGpvaW4gY29sdW1ucyBPUiBOT1Qg aW5uZXIgcXVhbHMpJy4KKyAqICdhIGExIGxlZnQgam9pbiBhIGEyJzogY291bGQgc2ltcGxp ZnkgdG8gYSBzY2FuIGxpa2UgaW5uZXIgYnV0IHdpdGhvdXQKKyAqIE5PVCBOVUxMIGNvbmRp dGlvbnMgb24gam9pbiBjb2x1bW5zLgorICogJ2EgYTEgbGVmdCBqb2luIChhIGEyIGpvaW4g YiknOiBjYW4ndCBzaW1wbGlmeSB0aGlzLCBiZWNhdXNlIGpvaW4gdG8gYgorICogY2FuIGJv dGggcmVtb3ZlIHJvd3MgYW5kIGludHJvZHVjZSBkdXBsaWNhdGVzLgorICoKKyAqIFRvIHNl YXJjaCBmb3IgcmVtb3ZhYmxlIGpvaW5zLCB3ZSBvcmRlciBhbGwgdGhlIHJlbGF0aW9ucyBv biB0aGVpciBPaWQsCisgKiBnbyBvdmVyIGVhY2ggc2V0IHdpdGggdGhlIHNhbWUgT2lkLCBh bmQgY29uc2lkZXIgZWFjaCBwYWlyIG9mIHJlbGF0aW9ucworICogaW4gdGhpcyBzZXQuCisg KgorICogVG8gcmVtb3ZlIHRoZSBqb2luLCB3ZSBtYXJrIG9uZSBvZiB0aGUgcGFydGljaXBh dGluZyByZWxhdGlvbnMgYXMgZGVhZAorICogYW5kIHJld3JpdGUgYWxsIHJlZmVyZW5jZXMg dG8gaXQgdG8gcG9pbnQgdG8gdGhlIHJlbWFpbmluZyByZWxhdGlvbi4KKyAqIFRoaXMgaW5j bHVkZXMgbW9kaWZ5aW5nIFJlc3RyaWN0SW5mb3MsIEVxdWl2YWxlbmNlQ2xhc3NlcywgYW5k CisgKiBFcXVpdmFsZW5jZU1lbWJlcnMuIFdlIGFsc28gaGF2ZSB0byBtb2RpZnkgdGhlIHJv dyBtYXJrcy4gVGhlIGpvaW4gY2xhdXNlcworICogb2YgdGhlIHJlbW92ZWQgcmVsYXRpb24g YmVjb21lIGVpdGhlciByZXN0cmljdGlvbiBvciBqb2luIGNsYXVzZXMsIGJhc2VkIG9uCisg KiB3aGV0aGVyIHRoZXkgcmVmZXJlbmNlIGFueSByZWxhdGlvbnMgbm90IHBhcnRpY2lwYXRp bmcgaW4gdGhlIHJlbW92ZWQgam9pbi4KKyAqCisgKiAnam9pbmxpc3QnIGlzIHRoZSB0b3At bGV2ZWwgam9pbmxpc3Qgb2YgdGhlIHF1ZXJ5LiBJZiBpdCBoYXMgYW55CisgKiByZWZlcmVu Y2VzIHRvIHRoZSByZW1vdmVkIHJlbGF0aW9ucywgd2UgdXBkYXRlIHRoZW0gdG8gcG9pbnQg dG8gdGhlCisgKiByZW1haW5pbmcgb25lcy4KKyAqLworTGlzdCAqCityZW1vdmVfdXNlbGVz c19zZWxmX2pvaW5zKFBsYW5uZXJJbmZvICpyb290LCBMaXN0ICpqb2lubGlzdCkKK3sKKwlS ZWxpZHMJCXRvUmVtb3ZlID0gTlVMTDsKKwlpbnQJCQlyZWxpZCA9IC0xOworCisJaWYgKCFl bmFibGVfc2VsZl9qb2luX3JlbW92YWwgfHwgam9pbmxpc3QgPT0gTklMIHx8CisJCShsaXN0 X2xlbmd0aChqb2lubGlzdCkgPT0gMSAmJiAhSXNBKGxpbml0aWFsKGpvaW5saXN0KSwgTGlz dCkpKQorCQlyZXR1cm4gam9pbmxpc3Q7CisKKwkvKgorCSAqIE1lcmdlIHBhaXJzIG9mIHJl bGF0aW9ucyBwYXJ0aWNpcGF0ZWQgaW4gc2VsZi1qb2luLiBSZW1vdmUgdW5uZWNlc3NhcnkK KwkgKiByYW5nZSB0YWJsZSBlbnRyaWVzLgorCSAqLworCXRvUmVtb3ZlID0gcmVtb3ZlX3Nl bGZfam9pbnNfcmVjdXJzZShyb290LCBqb2lubGlzdCwgdG9SZW1vdmUpOworCisJaWYgKHVu bGlrZWx5KHRvUmVtb3ZlICE9IE5VTEwpKQorCXsKKwkJLyogQXQgdGhlIGVuZCwgcmVtb3Zl IG9ycGhhbmVkIHJlbGF0aW9uIGxpbmtzICovCisJCXdoaWxlICgocmVsaWQgPSBibXNfbmV4 dF9tZW1iZXIodG9SZW1vdmUsIHJlbGlkKSkgPj0gMCkKKwkJeworCQkJaW50CW5yZW1vdmVk ID0gMDsKKworCQkJam9pbmxpc3QgPSByZW1vdmVfcmVsX2Zyb21fam9pbmxpc3Qoam9pbmxp c3QsIHJlbGlkLCAmbnJlbW92ZWQpOworCQkJaWYgKG5yZW1vdmVkICE9IDEpCisJCQkJZWxv ZyhFUlJPUiwgImZhaWxlZCB0byBmaW5kIHJlbGF0aW9uICVkIGluIGpvaW5saXN0IiwgcmVs aWQpOworCQl9CisJfQorCisJcmV0dXJuIGpvaW5saXN0OwogfQpkaWZmIC0tZ2l0IGEvc3Jj L2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYyBiL3NyYy9iYWNrZW5kL29wdGlt aXplci9wbGFuL3BsYW5tYWluLmMKaW5kZXggZTE3ZDMxYTVjMy4uMDc1ZDM2YzdlYyAxMDA2 NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BsYW4vcGxhbm1haW4uYworKysgYi9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGxhbi9wbGFubWFpbi5jCkBAIC0yMzAsNiArMjMwLDEx IEBAIHF1ZXJ5X3BsYW5uZXIoUGxhbm5lckluZm8gKnJvb3QsCiAJICovCiAJcmVkdWNlX3Vu aXF1ZV9zZW1pam9pbnMocm9vdCk7CiAKKwkvKgorCSAqIFJlbW92ZSBzZWxmIGpvaW5zIG9u IGEgdW5pcXVlIGNvbHVtbi4KKwkgKi8KKwlqb2lubGlzdCA9IHJlbW92ZV91c2VsZXNzX3Nl bGZfam9pbnMocm9vdCwgam9pbmxpc3QpOworCiAJLyoKIAkgKiBOb3cgZGlzdHJpYnV0ZSAi cGxhY2Vob2xkZXJzIiB0byBiYXNlIHJlbHMgYXMgbmVlZGVkLiAgVGhpcyBoYXMgdG8gYmUK IAkgKiBkb25lIGFmdGVyIGpvaW4gcmVtb3ZhbCBiZWNhdXNlIHJlbW92YWwgY291bGQgY2hh bmdlIHdoZXRoZXIgYQpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3ByZXAv cHJlcHVuaW9uLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcHJlcC9wcmVwdW5pb24uYwpp bmRleCBhMGJhZjZkNGExLi42YTUxOWNjZGVjIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvcHJlcC9wcmVwdW5pb24uYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv cHJlcC9wcmVwdW5pb24uYwpAQCAtNjYyLDcgKzY2Miw3IEBAIGJ1aWxkX3NldG9wX2NoaWxk X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJICogb3RoZXJ3 aXNlIGRvIHN0YXRpc3RpY2FsIGVzdGltYXRpb24uCiAJICoKIAkgKiBYWFggeW91IGRvbid0 IHJlYWxseSB3YW50IHRvIGtub3cgYWJvdXQgdGhpczogd2UgZG8gdGhlIGVzdGltYXRpb24K LQkgKiB1c2luZyB0aGUgc3VicXVlcnkncyBvcmlnaW5hbCB0YXJnZXRsaXN0IGV4cHJlc3Np b25zLCBub3QgdGhlCisJICogdXNpbmcgdGhlIHN1YnJvb3QtPnBhcnNlJ3Mgb3JpZ2luYWwg dGFyZ2V0bGlzdCBleHByZXNzaW9ucywgbm90IHRoZQogCSAqIHN1YnJvb3QtPnByb2Nlc3Nl ZF90bGlzdCB3aGljaCBtaWdodCBzZWVtIG1vcmUgYXBwcm9wcmlhdGUuICBUaGUgcmVhc29u CiAJICogaXMgdGhhdCBpZiB0aGUgc3VicXVlcnkgaXMgaXRzZWxmIGEgc2V0b3AsIGl0IG1h eSByZXR1cm4gYQogCSAqIHByb2Nlc3NlZF90bGlzdCBjb250YWluaW5nICJ2YXJubyAwIiBW YXJzIGdlbmVyYXRlZCBieQpAQCAtNjcwLDYgKzY3MCw5IEBAIGJ1aWxkX3NldG9wX2NoaWxk X3BhdGhzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCiAJICogbWlnaHRp bHkuICBXZSBvdWdodCB0byBnZXQgcmlkIG9mIHRoZSAidmFybm8gMCIgaGFjaywgYnV0IHRo YXQgcmVxdWlyZXMKIAkgKiBhIHJlZGVzaWduIG9mIHRoZSBwYXJzZXRyZWUgcmVwcmVzZW50 YXRpb24gb2Ygc2V0b3BzLCBzbyB0aGF0IHRoZXJlIGNhbgogCSAqIGJlIGFuIFJURSBjb3Jy ZXNwb25kaW5nIHRvIGVhY2ggc2V0b3AncyBvdXRwdXQuCisJICogTm90ZSwgd2UgdXNlIHRo aXMgbm90IHN1YnF1ZXJ5J3MgdGFyZ2V0bGlzdCBidXQgc3Vicm9vdC0+cGFyc2UncworCSAq IHRhcmdldGxpc3QsIGJlY2F1c2UgaXQgd2FzIHJldmlzZWQgYnkgc2VsZi1qb2luIHJlbW92 YWwuICBzdWJxdWVyeSdzCisJICogdGFyZ2V0bGlzdCBtaWdodCBjb250YWluIHRoZSByZWZl cmVuY2VzIHRvIHRoZSByZW1vdmVkIHJlbGlkcy4KIAkgKi8KIAlpZiAocE51bUdyb3VwcykK IAl7CkBAIC02ODIsNyArNjg1LDcgQEAgYnVpbGRfc2V0b3BfY2hpbGRfcGF0aHMoUGxhbm5l ckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCSpwTnVtR3JvdXBzID0gcmVsLT5j aGVhcGVzdF90b3RhbF9wYXRoLT5yb3dzOwogCQllbHNlCiAJCQkqcE51bUdyb3VwcyA9IGVz dGltYXRlX251bV9ncm91cHMoc3Vicm9vdCwKLQkJCQkJCQkJCQkJICBnZXRfdGxpc3RfZXhw cnMoc3VicXVlcnktPnRhcmdldExpc3QsIGZhbHNlKSwKKwkJCQkJCQkJCQkJICBnZXRfdGxp c3RfZXhwcnMoc3Vicm9vdC0+cGFyc2UtPnRhcmdldExpc3QsIGZhbHNlKSwKIAkJCQkJCQkJ CQkJICByZWwtPmNoZWFwZXN0X3RvdGFsX3BhdGgtPnJvd3MsCiAJCQkJCQkJCQkJCSAgTlVM TCwKIAkJCQkJCQkJCQkJICBOVUxMKTsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3Jld3Jp dGUvcmV3cml0ZU1hbmlwLmMgYi9zcmMvYmFja2VuZC9yZXdyaXRlL3Jld3JpdGVNYW5pcC5j CmluZGV4IGIyMDYyNWZiZDIuLjEzZDZjZmRkY2EgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L3Jld3JpdGUvcmV3cml0ZU1hbmlwLmMKKysrIGIvc3JjL2JhY2tlbmQvcmV3cml0ZS9yZXdy aXRlTWFuaXAuYwpAQCAtNTQ4LDYgKzU0OCw3IEBAIG9mZnNldF9yZWxpZF9zZXQoUmVsaWRz IHJlbGlkcywgaW50IG9mZnNldCkKICAqIHRvICduZXdfaW5kZXgnLiAgVGhlIHZhcm5vc3lu IGZpZWxkcyBhcmUgY2hhbmdlZCB0b28uICBBbHNvLCBhZGp1c3Qgb3RoZXIKICAqIG5vZGVz IHRoYXQgY29udGFpbiByYW5nZXRhYmxlIGluZGV4ZXMsIHN1Y2ggYXMgUmFuZ2VUYmxSZWYg YW5kIEpvaW5FeHByLgogICoKKyAqIGNoYW5nZV9SYW5nZVRibFJlZjogZG8gd2UgY2hhbmdl IFJhbmdlVGJsUmVmIG9yIG5vdC4gc2VlIENoYW5nZVZhck5vZGVzRXh0ZW5kZWQuCiAgKiBO T1RFOiBhbHRob3VnaCB0aGlzIGhhcyB0aGUgZm9ybSBvZiBhIHdhbGtlciwgd2UgY2hlYXQg YW5kIG1vZGlmeSB0aGUKICAqIG5vZGVzIGluLXBsYWNlLiAgVGhlIGdpdmVuIGV4cHJlc3Np b24gdHJlZSBzaG91bGQgaGF2ZSBiZWVuIGNvcGllZAogICogZWFybGllciB0byBlbnN1cmUg dGhhdCBubyB1bndhbnRlZCBzaWRlLWVmZmVjdHMgb2NjdXIhCkBAIC01NTgsNiArNTU5LDcg QEAgdHlwZWRlZiBzdHJ1Y3QKIAlpbnQJCQlydF9pbmRleDsKIAlpbnQJCQluZXdfaW5kZXg7 CiAJaW50CQkJc3VibGV2ZWxzX3VwOworCWJvb2wJCWNoYW5nZV9SYW5nZVRibFJlZjsKIH0g Q2hhbmdlVmFyTm9kZXNfY29udGV4dDsKIAogc3RhdGljIGJvb2wKQEAgLTU5MCw3ICs1OTIs NyBAQCBDaGFuZ2VWYXJOb2Rlc193YWxrZXIoTm9kZSAqbm9kZSwgQ2hhbmdlVmFyTm9kZXNf Y29udGV4dCAqY29udGV4dCkKIAkJCWNleHByLT5jdmFybm8gPSBjb250ZXh0LT5uZXdfaW5k ZXg7CiAJCXJldHVybiBmYWxzZTsKIAl9Ci0JaWYgKElzQShub2RlLCBSYW5nZVRibFJlZikp CisJaWYgKElzQShub2RlLCBSYW5nZVRibFJlZikgJiYgY29udGV4dC0+Y2hhbmdlX1Jhbmdl VGJsUmVmKQogCXsKIAkJUmFuZ2VUYmxSZWYgKnJ0ciA9IChSYW5nZVRibFJlZiAqKSBub2Rl OwogCkBAIC02MzcsNiArNjM5LDc1IEBAIENoYW5nZVZhck5vZGVzX3dhbGtlcihOb2RlICpu b2RlLCBDaGFuZ2VWYXJOb2Rlc19jb250ZXh0ICpjb250ZXh0KQogCQl9CiAJCXJldHVybiBm YWxzZTsKIAl9CisJaWYgKElzQShub2RlLCBSZXN0cmljdEluZm8pKQorCXsKKwkJUmVzdHJp Y3RJbmZvICpyaW5mbyA9IChSZXN0cmljdEluZm8gKikgbm9kZTsKKwkJaW50CQkJcmVsaWQg PSAtMTsKKwkJYm9vbAkJaXNfcmVxX2VxdWFsID0KKwkJCShyaW5mby0+cmVxdWlyZWRfcmVs aWRzID09IHJpbmZvLT5jbGF1c2VfcmVsaWRzKTsKKwkJYm9vbAkJY2xhdXNlX3JlbGlkc19p c19tdWx0aXBsZSA9CisJCQkoYm1zX21lbWJlcnNoaXAocmluZm8tPmNsYXVzZV9yZWxpZHMp ID09IEJNU19NVUxUSVBMRSk7CisKKwkJaWYgKGJtc19pc19tZW1iZXIoY29udGV4dC0+cnRf aW5kZXgsIHJpbmZvLT5jbGF1c2VfcmVsaWRzKSkKKwkJeworCQkJZXhwcmVzc2lvbl90cmVl X3dhbGtlcigoTm9kZSAqKSByaW5mby0+Y2xhdXNlLCBDaGFuZ2VWYXJOb2Rlc193YWxrZXIs ICh2b2lkICopIGNvbnRleHQpOworCQkJZXhwcmVzc2lvbl90cmVlX3dhbGtlcigoTm9kZSAq KSByaW5mby0+b3JjbGF1c2UsIENoYW5nZVZhck5vZGVzX3dhbGtlciwgKHZvaWQgKikgY29u dGV4dCk7CisKKwkJCXJpbmZvLT5jbGF1c2VfcmVsaWRzID0KKwkJCQlhZGp1c3RfcmVsaWRf c2V0KHJpbmZvLT5jbGF1c2VfcmVsaWRzLCBjb250ZXh0LT5ydF9pbmRleCwgY29udGV4dC0+ bmV3X2luZGV4KTsKKwkJCXJpbmZvLT5udW1fYmFzZV9yZWxzID0gYm1zX251bV9tZW1iZXJz KHJpbmZvLT5jbGF1c2VfcmVsaWRzKTsKKwkJCXJpbmZvLT5sZWZ0X3JlbGlkcyA9CisJCQkJ YWRqdXN0X3JlbGlkX3NldChyaW5mby0+bGVmdF9yZWxpZHMsIGNvbnRleHQtPnJ0X2luZGV4 LCBjb250ZXh0LT5uZXdfaW5kZXgpOworCQkJcmluZm8tPnJpZ2h0X3JlbGlkcyA9CisJCQkJ YWRqdXN0X3JlbGlkX3NldChyaW5mby0+cmlnaHRfcmVsaWRzLCBjb250ZXh0LT5ydF9pbmRl eCwgY29udGV4dC0+bmV3X2luZGV4KTsKKwkJfQorCisJCWlmIChpc19yZXFfZXF1YWwpCisJ CQlyaW5mby0+cmVxdWlyZWRfcmVsaWRzID0gcmluZm8tPmNsYXVzZV9yZWxpZHM7CisJCWVs c2UKKwkJCXJpbmZvLT5yZXF1aXJlZF9yZWxpZHMgPQorCQkJCWFkanVzdF9yZWxpZF9zZXQo cmluZm8tPnJlcXVpcmVkX3JlbGlkcywgY29udGV4dC0+cnRfaW5kZXgsIGNvbnRleHQtPm5l d19pbmRleCk7CisKKwkJcmluZm8tPm91dGVyX3JlbGlkcyA9CisJCQlhZGp1c3RfcmVsaWRf c2V0KHJpbmZvLT5vdXRlcl9yZWxpZHMsIGNvbnRleHQtPnJ0X2luZGV4LCBjb250ZXh0LT5u ZXdfaW5kZXgpOworCQlyaW5mby0+aW5jb21wYXRpYmxlX3JlbGlkcyA9CisJCQlhZGp1c3Rf cmVsaWRfc2V0KHJpbmZvLT5pbmNvbXBhdGlibGVfcmVsaWRzLCBjb250ZXh0LT5ydF9pbmRl eCwgY29udGV4dC0+bmV3X2luZGV4KTsKKworCQlpZiAocmluZm8tPm1lcmdlb3BmYW1pbGll cyAmJgorCQkJYm1zX2dldF9zaW5nbGV0b25fbWVtYmVyKHJpbmZvLT5jbGF1c2VfcmVsaWRz LCAmcmVsaWQpICYmCisJCQljbGF1c2VfcmVsaWRzX2lzX211bHRpcGxlICYmCisJCQlyZWxp ZCA9PSBjb250ZXh0LT5uZXdfaW5kZXggJiYgSXNBKHJpbmZvLT5jbGF1c2UsIE9wRXhwcikp CisJCXsKKwkJCUV4cHIJICAgKmxlZnRPcDsKKwkJCUV4cHIJICAgKnJpZ2h0T3A7CisKKwkJ CWxlZnRPcCA9IChFeHByICopIGdldF9sZWZ0b3AocmluZm8tPmNsYXVzZSk7CisJCQlyaWdo dE9wID0gKEV4cHIgKikgZ2V0X3JpZ2h0b3AocmluZm8tPmNsYXVzZSk7CisKKwkJCS8qCisJ CQkgKiBmb3IgU0pFIChzZWxmIGpvaW4gZWxpbWluYXRpb24pLCBjaGFuZ2luZyB2YXJub3Mg d2lsbCBtYWtlIHQxLmEgPSB0Mi5hCisJCQkgKiB0byAidDEuYSA9IHQxLmEiLCB3aGljaCBp cyBhbHdheXMgdHJ1ZSwgd2UgY2FuIG9wdGl6bWllZCBpdCBvdXQuCisJCQkgKiB0byBvcHRp bXppZWQgaXQgb3V0LCB3ZSB1c2UgZXF1YWwgdG8gdmFsaWRhdGUsCisJCQkgKiBidXQgd2Ug YWxzbyBuZWVkIHRvIGFkZCBhIG5vdCBudWxsIHF1YWwgKE51bGxUZXN0KS4KKwkJCSAqCisJ CQkqLworCQkJaWYgKGxlZnRPcCAhPSBOVUxMICYmIGVxdWFsKGxlZnRPcCwgcmlnaHRPcCkp CisJCQl7CisJCQkJTnVsbFRlc3QgICAqbnRlc3QgPSBtYWtlTm9kZShOdWxsVGVzdCk7CisK KwkJCQludGVzdC0+YXJnID0gbGVmdE9wOworCQkJCW50ZXN0LT5udWxsdGVzdHR5cGUgPSBJ U19OT1RfTlVMTDsKKwkJCQludGVzdC0+YXJnaXNyb3cgPSBmYWxzZTsKKwkJCQludGVzdC0+ bG9jYXRpb24gPSAtMTsKKwkJCQlyaW5mby0+Y2xhdXNlID0gKEV4cHIgKikgbnRlc3Q7CisJ CQkJcmluZm8tPm1lcmdlb3BmYW1pbGllcyA9IE5JTDsKKwkJCQlyaW5mby0+bGVmdF9lbSA9 IE5VTEw7CisJCQkJcmluZm8tPnJpZ2h0X2VtID0gTlVMTDsKKwkJCX0KKwkJCUFzc2VydChy aW5mby0+b3JjbGF1c2UgPT0gTlVMTCk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KIAlp ZiAoSXNBKG5vZGUsIEFwcGVuZFJlbEluZm8pKQogCXsKIAkJQXBwZW5kUmVsSW5mbyAqYXBw aW5mbyA9IChBcHBlbmRSZWxJbmZvICopIG5vZGU7CkBAIC02NzAsMzIgKzc0MSwyOSBAQCBD aGFuZ2VWYXJOb2Rlc193YWxrZXIoTm9kZSAqbm9kZSwgQ2hhbmdlVmFyTm9kZXNfY29udGV4 dCAqY29udGV4dCkKIAkJCQkJCQkJICAodm9pZCAqKSBjb250ZXh0KTsKIH0KIAorLyoKKyAq IGFsbW9zdCBlcXVpdmFsZW50IHRvIENoYW5nZVZhck5vZGVzLiBhbHNvIHNlZSBjb21tZW50 cyBpbiBDaGFuZ2VWYXJOb2Rlcy4KKyAqIGRpZmZlcmVuY2Ugd2l0aCBDaGFuZ2VWYXJOb2Rl czoKKyAqIHdoZW4gd2UgdXNlIENoYW5nZVZhck5vZGVzIGZvciBub2RlIHdlIGNoYW5nZSBh bGwgb2YgaXQncyB1bmRlcmx5aW5nIG5vZGVzLgorICogYnV0IGZvciBTSkUgd2UgZG9uJ3Qg d2FudCB0byBjaGFuZ2Ugbm9kZSB0eXBlOiBSYW5nZVRibFJlZiwgaW4gc29tZSBvY2Nhc2lv bi4KKyAqIGJlY2F1c2UgU0pFIGxhc3Qgc3RlcCwgcmVtb3ZlX3JlbF9mcm9tX2pvaW5saXN0 IGlzIHRvCisgKiByZW1vdmUgbGVmdCBub2RlIChSYW5nZVRibFJlZikgb25lIGJ5IG9uZS4g aWYgaW4gYW55IGNhc2Ugd2hpbGUgdXNpbmcKKyAqIENoYW5nZVZhck5vZGVzLCBieSBhY2Np ZGVudGx5IGxlYWYgbm9kZSBSYW5nZVRibFJlZiBhbHNvIGJlaW5nIHVwZGF0ZWQKKyAqIHRo ZW4gcmVtb3ZlX3JlbF9mcm9tX2pvaW5saXN0IHdpbGwgaGF2ZSBlcnJvci4KKyovCiB2b2lk Ci1DaGFuZ2VWYXJOb2RlcyhOb2RlICpub2RlLCBpbnQgcnRfaW5kZXgsIGludCBuZXdfaW5k ZXgsIGludCBzdWJsZXZlbHNfdXApCitDaGFuZ2VWYXJOb2Rlc0V4dGVuZGVkKE5vZGUgKm5v ZGUsIGludCBydF9pbmRleCwgaW50IG5ld19pbmRleCwKKwkJCQkJICAgaW50IHN1YmxldmVs c191cCwgYm9vbCBjaGFuZ2VfUmFuZ2VUYmxSZWYpCiB7Ci0JQ2hhbmdlVmFyTm9kZXNfY29u dGV4dCBjb250ZXh0OwotCisJQ2hhbmdlVmFyTm9kZXNfY29udGV4dAljb250ZXh0OwogCWNv bnRleHQucnRfaW5kZXggPSBydF9pbmRleDsKIAljb250ZXh0Lm5ld19pbmRleCA9IG5ld19p bmRleDsKIAljb250ZXh0LnN1YmxldmVsc191cCA9IHN1YmxldmVsc191cDsKKwljb250ZXh0 LmNoYW5nZV9SYW5nZVRibFJlZiA9IGNoYW5nZV9SYW5nZVRibFJlZjsKIAotCS8qCi0JICog TXVzdCBiZSBwcmVwYXJlZCB0byBzdGFydCB3aXRoIGEgUXVlcnkgb3IgYSBiYXJlIGV4cHJl c3Npb24gdHJlZTsgaWYKLQkgKiBpdCdzIGEgUXVlcnksIGdvIHN0cmFpZ2h0IHRvIHF1ZXJ5 X3RyZWVfd2Fsa2VyIHRvIG1ha2Ugc3VyZSB0aGF0Ci0JICogc3VibGV2ZWxzX3VwIGRvZXNu J3QgZ2V0IGluY3JlbWVudGVkIHByZW1hdHVyZWx5LgotCSAqLwogCWlmIChub2RlICYmIElz QShub2RlLCBRdWVyeSkpCiAJewogCQlRdWVyeQkgICAqcXJ5ID0gKFF1ZXJ5ICopIG5vZGU7 Ci0KLQkJLyoKLQkJICogSWYgd2UgYXJlIHN0YXJ0aW5nIGF0IGEgUXVlcnksIGFuZCBzdWJs ZXZlbHNfdXAgaXMgemVybywgdGhlbiB3ZQotCQkgKiBtdXN0IGFsc28gZml4IHJhbmdldGFi bGUgaW5kZXhlcyBpbiB0aGUgUXVlcnkgaXRzZWxmIC0tLSBuYW1lbHkKLQkJICogcmVzdWx0 UmVsYXRpb24sIG1lcmdlVGFyZ2V0UmVsYXRpb24sIGV4Y2xSZWxJbmRleCAgYW5kIHJvd01h cmtzCi0JCSAqIGVudHJpZXMuICBzdWJsZXZlbHNfdXAgY2Fubm90IGJlIHplcm8gd2hlbiBy ZWN1cnNpbmcgaW50byBhCi0JCSAqIHN1YnF1ZXJ5LCBzbyB0aGVyZSdzIG5vIG5lZWQgdG8g aGF2ZSB0aGUgc2FtZSBsb2dpYyBpbnNpZGUKLQkJICogQ2hhbmdlVmFyTm9kZXNfd2Fsa2Vy LgotCQkgKi8KIAkJaWYgKHN1YmxldmVsc191cCA9PSAwKQogCQl7CiAJCQlMaXN0Q2VsbCAg ICpsOwpAQCAtNzA2LDcgKzc3NCw2IEBAIENoYW5nZVZhck5vZGVzKE5vZGUgKm5vZGUsIGlu dCBydF9pbmRleCwgaW50IG5ld19pbmRleCwgaW50IHN1YmxldmVsc191cCkKIAkJCWlmIChx cnktPm1lcmdlVGFyZ2V0UmVsYXRpb24gPT0gcnRfaW5kZXgpCiAJCQkJcXJ5LT5tZXJnZVRh cmdldFJlbGF0aW9uID0gbmV3X2luZGV4OwogCi0JCQkvKiB0aGlzIGlzIHVubGlrZWx5IHRv IGV2ZXIgYmUgdXNlZCwgYnV0IC4uLiAqLwogCQkJaWYgKHFyeS0+b25Db25mbGljdCAmJiBx cnktPm9uQ29uZmxpY3QtPmV4Y2xSZWxJbmRleCA9PSBydF9pbmRleCkKIAkJCQlxcnktPm9u Q29uZmxpY3QtPmV4Y2xSZWxJbmRleCA9IG5ld19pbmRleDsKIApAQCAtNzI0LDYgKzc5MSwx MSBAQCBDaGFuZ2VWYXJOb2RlcyhOb2RlICpub2RlLCBpbnQgcnRfaW5kZXgsIGludCBuZXdf aW5kZXgsIGludCBzdWJsZXZlbHNfdXApCiAJZWxzZQogCQlDaGFuZ2VWYXJOb2Rlc193YWxr ZXIobm9kZSwgJmNvbnRleHQpOwogfQordm9pZAorQ2hhbmdlVmFyTm9kZXMoTm9kZSAqbm9k ZSwgaW50IHJ0X2luZGV4LCBpbnQgbmV3X2luZGV4LCBpbnQgc3VibGV2ZWxzX3VwKQorewor CUNoYW5nZVZhck5vZGVzRXh0ZW5kZWQobm9kZSwgcnRfaW5kZXgsIG5ld19pbmRleCwgc3Vi bGV2ZWxzX3VwLCB0cnVlKTsKK30KIAogLyoKICAqIFN1YnN0aXR1dGUgbmV3cmVsaWQgZm9y IG9sZHJlbGlkIGluIGEgUmVsaWQgc2V0CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGls cy9taXNjL2d1Y190YWJsZXMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxl cy5jCmluZGV4IDY4NjMwOWRiNTguLjI0YzY5Njc0ZWEgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL21p c2MvZ3VjX3RhYmxlcy5jCkBAIC05ODYsNiArOTg2LDE2IEBAIHN0cnVjdCBjb25maWdfYm9v bCBDb25maWd1cmVOYW1lc0Jvb2xbXSA9CiAJCXRydWUsCiAJCU5VTEwsIE5VTEwsIE5VTEwK IAl9LAorCXsKKwkJeyJlbmFibGVfc2VsZl9qb2luX3JlbW92YWwiLCBQR0NfVVNFUlNFVCwg UVVFUllfVFVOSU5HX01FVEhPRCwKKwkJCWdldHRleHRfbm9vcCgiRW5hYmxlIHJlbW92YWwg b2YgdW5pcXVlIHNlbGYtam9pbnMuIiksCisJCQlOVUxMLAorCQkJR1VDX0VYUExBSU4gfCBH VUNfTk9UX0lOX1NBTVBMRQorCQl9LAorCQkmZW5hYmxlX3NlbGZfam9pbl9yZW1vdmFsLAor CQl0cnVlLAorCQlOVUxMLCBOVUxMLCBOVUxMCisJfSwKIAl7CiAJCXsiZW5hYmxlX2dyb3Vw X2J5X3Jlb3JkZXJpbmciLCBQR0NfVVNFUlNFVCwgUVVFUllfVFVOSU5HX01FVEhPRCwKIAkJ CWdldHRleHRfbm9vcCgiRW5hYmxlcyByZW9yZGVyaW5nIG9mIEdST1VQIEJZIGtleXMuIiks CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9wYXRobm9kZXMuaCBiL3NyYy9pbmNs dWRlL25vZGVzL3BhdGhub2Rlcy5oCmluZGV4IDA3ZTI0MTUzOTguLmYxZTVkZjE4YzIgMTAw NjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL25vZGVzL3BhdGhub2Rlcy5oCisrKyBiL3NyYy9pbmNs dWRlL25vZGVzL3BhdGhub2Rlcy5oCkBAIC03MzQsNyArNzM0LDcgQEAgdHlwZWRlZiBzdHJ1 Y3QgUGFydGl0aW9uU2NoZW1lRGF0YSAqUGFydGl0aW9uU2NoZW1lOwogICogcG9wdWxhdGUg dGhlc2UgZmllbGRzLCBmb3IgYmFzZSByZWxzOyBidXQgc29tZWRheSB0aGV5IG1pZ2h0IGJl IHVzZWQgZm9yCiAgKiBqb2luIHJlbHMgdG9vOgogICoKLSAqCQl1bmlxdWVfZm9yX3JlbHMg LSBsaXN0IG9mIFJlbGlkIHNldHMsIGVhY2ggb25lIGJlaW5nIGEgc2V0IG9mIG90aGVyCisg KgkJdW5pcXVlX2Zvcl9yZWxzIC0gbGlzdCBvZiBVbmlxdWVSZWxJbmZvLCBlYWNoIG9uZSBi ZWluZyBhIHNldCBvZiBvdGhlcgogICoJCQkJCXJlbHMgZm9yIHdoaWNoIHRoaXMgb25lIGhh cyBiZWVuIHByb3ZlbiB1bmlxdWUKICAqCQlub25fdW5pcXVlX2Zvcl9yZWxzIC0gbGlzdCBv ZiBSZWxpZCBzZXRzLCBlYWNoIG9uZSBiZWluZyBhIHNldCBvZgogICoJCQkJCW90aGVyIHJl bHMgZm9yIHdoaWNoIHdlIGhhdmUgdHJpZWQgYW5kIGZhaWxlZCB0byBwcm92ZQpAQCAtOTcz LDcgKzk3Myw3IEBAIHR5cGVkZWYgc3RydWN0IFJlbE9wdEluZm8KIAkvKgogCSAqIGNhY2hl IHNwYWNlIGZvciByZW1lbWJlcmluZyBpZiB3ZSBoYXZlIHByb3ZlbiB0aGlzIHJlbGF0aW9u IHVuaXF1ZQogCSAqLwotCS8qIGtub3duIHVuaXF1ZSBmb3IgdGhlc2Ugb3RoZXIgcmVsaWQg c2V0KHMpICovCisJLyoga25vd24gdW5pcXVlIGZvciB0aGVzZSBvdGhlciByZWxpZCBzZXQo cykgZ2l2ZW4gaW4gVW5pcXVlUmVsSW5mbyhzKSAqLwogCUxpc3QJICAgKnVuaXF1ZV9mb3Jf cmVsczsKIAkvKiBrbm93biBub3QgdW5pcXVlIGZvciB0aGVzZSBzZXQocykgKi8KIAlMaXN0 CSAgICpub25fdW5pcXVlX2Zvcl9yZWxzOwpAQCAtMzQ0MCw0ICszNDQwLDM1IEBAIHR5cGVk ZWYgc3RydWN0IEFnZ1RyYW5zSW5mbwogCWJvb2wJCWluaXRWYWx1ZUlzTnVsbDsKIH0gQWdn VHJhbnNJbmZvOwogCisvKgorICogVW5pcXVlUmVsSW5mbyBjYWNoZXMgYSBmYWN0IHRoYXQg YSByZWxhdGlvbiBpcyB1bmlxdWUgd2hlbiBiZWluZyBqb2luZWQKKyAqIHRvIG90aGVyIHJl bGF0aW9uKHMpLgorICovCit0eXBlZGVmIHN0cnVjdCBVbmlxdWVSZWxJbmZvCit7CisJcGdf bm9kZV9hdHRyKG5vX2NvcHlfZXF1YWwsIG5vX3JlYWQsIG5vX3F1ZXJ5X2p1bWJsZSkKKwor CU5vZGVUYWcJCXR5cGU7CisKKwkvKgorCSAqIFRoZSByZWxhdGlvbiBpbiBjb25zaWRlcmF0 aW9uIGlzIHVuaXF1ZSB3aGVuIGJlaW5nIGpvaW5lZCB3aXRoIHRoaXMgc2V0CisJICogb2Yg b3RoZXIgcmVsYXRpb24ocykuCisJICovCisJUmVsaWRzCQlvdXRlcnJlbGlkczsKKworCS8q CisJICogVGhlIHJlbGF0aW9uIGluIGNvbnNpZGVyYXRpb24gaXMgdW5pcXVlIHdoZW4gY29u c2lkZXJpbmcgb25seSBjbGF1c2VzCisJICogc3VpdGFibGUgZm9yIHNlbGYtam9pbiAocGFz c2VkIHNwbGl0X3NlbGZqb2luX3F1YWxzKCkpLgorCSAqLworCWJvb2wJCXNlbGZfam9pbjsK KworCS8qCisJICogQWRkaXRpb25hbCBjbGF1c2VzIGZyb20gYSBiYXNlcmVzdHJpY3RpbmZv IGxpc3QgdGhhdCB3ZXJlIHVzZWQgdG8gcHJvdmUKKwkgKiB0aGUgdW5pcXVlbmVzcy4gICBX ZSBjYWNoZSBpdCBmb3IgdGhlIHNlbGYtam9pbiBjaGVja2luZyBwcm9jZWR1cmU6IGEKKwkg KiBzZWxmLWpvaW4gY2FuIGJlIHJlbW92ZWQgaWYgdGhlIG91dGVyIHJlbGF0aW9uIGNvbnRh aW5zIHN0cmljdGx5IHRoZQorCSAqIHNhbWUgc2V0IG9mIGNsYXVzZXMuCisJICovCisJTGlz dAkgICAqZXh0cmFfY2xhdXNlczsKK30gVW5pcXVlUmVsSW5mbzsKKwogI2VuZGlmCQkJCQkJ CS8qIFBBVEhOT0RFU19IICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIv b3B0aW1pemVyLmggYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvb3B0aW1pemVyLmgKaW5kZXgg OTNlM2RjNzE5ZC4uNTUwZTAwMWRjMCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvb3B0aW1p emVyL29wdGltaXplci5oCisrKyBiL3NyYy9pbmNsdWRlL29wdGltaXplci9vcHRpbWl6ZXIu aApAQCAtMTkxLDYgKzE5MSw4IEBAIGV4dGVybiBTb3J0R3JvdXBDbGF1c2UgKmdldF9zb3J0 Z3JvdXByZWZfY2xhdXNlX25vZXJyKEluZGV4IHNvcnRyZWYsCiAJCQkJCQkJCQkJCSAqIG91 dHB1dCBsaXN0ICovCiAjZGVmaW5lIFBWQ19SRUNVUlNFX1BMQUNFSE9MREVSUwkweDAwMjAJ LyogcmVjdXJzZSBpbnRvIFBsYWNlSG9sZGVyVmFyCiAJCQkJCQkJCQkJCSAqIGFyZ3VtZW50 cyAqLworI2RlZmluZSBQVkNfSU5DTFVERV9DT05WRVJUUk9XVFlQRVMJMHgwMDQwICAgICAv KiBpbmNsdWRlIENvbnZlcnRSb3d0eXBlRXhwcnMgaW4KKwkJCQkJCQkqIG91dHB1dCBsaXN0 ICovCiAKIGV4dGVybiBCaXRtYXBzZXQgKnB1bGxfdmFybm9zKFBsYW5uZXJJbmZvICpyb290 LCBOb2RlICpub2RlKTsKIGV4dGVybiBCaXRtYXBzZXQgKnB1bGxfdmFybm9zX29mX2xldmVs KFBsYW5uZXJJbmZvICpyb290LCBOb2RlICpub2RlLCBpbnQgbGV2ZWxzdXApOwpkaWZmIC0t Z2l0IGEvc3JjL2luY2x1ZGUvb3B0aW1pemVyL3BhdGhzLmggYi9zcmMvaW5jbHVkZS9vcHRp bWl6ZXIvcGF0aHMuaAppbmRleCA1NDg2OWQ0NDAxLi42NGJhODlmY2I4IDEwMDY0NAotLS0g YS9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGF0aHMuaAorKysgYi9zcmMvaW5jbHVkZS9vcHRp bWl6ZXIvcGF0aHMuaApAQCAtNzIsNiArNzIsOSBAQCBleHRlcm4gdm9pZCBjcmVhdGVfaW5k ZXhfcGF0aHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCk7CiBleHRlcm4g Ym9vbCByZWxhdGlvbl9oYXNfdW5pcXVlX2luZGV4X2ZvcihQbGFubmVySW5mbyAqcm9vdCwg UmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQkJCSAgTGlzdCAqcmVzdHJpY3RsaXN0LAogCQkJ CQkJCQkJCSAgTGlzdCAqZXhwcmxpc3QsIExpc3QgKm9wcmxpc3QpOworZXh0ZXJuIGJvb2wg cmVsYXRpb25faGFzX3VuaXF1ZV9pbmRleF9leHQoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9w dEluZm8gKnJlbCwKKwkJCQkJCQkJCQkgIExpc3QgKnJlc3RyaWN0bGlzdCwgTGlzdCAqZXhw cmxpc3QsCisJCQkJCQkJCQkJICBMaXN0ICpvcHJsaXN0LCBMaXN0ICoqZXh0cmFfY2xhdXNl cyk7CiBleHRlcm4gYm9vbCBpbmRleGNvbF9pc19ib29sX2NvbnN0YW50X2Zvcl9xdWVyeShQ bGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkJCQkJCUluZGV4T3B0SW5mbyAqaW5kZXgsCiAJ CQkJCQkJCQkJCQlpbnQgaW5kZXhjb2wpOwpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvb3B0 aW1pemVyL3BsYW5tYWluLmggYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGxhbm1haW4uaApp bmRleCA5MzEzNzI2MWU0Li5iY2Q2N2YzNzkxIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9v cHRpbWl6ZXIvcGxhbm1haW4uaAorKysgYi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvcGxhbm1h aW4uaApAQCAtMjAsNiArMjAsNyBAQAogLyogR1VDIHBhcmFtZXRlcnMgKi8KICNkZWZpbmUg REVGQVVMVF9DVVJTT1JfVFVQTEVfRlJBQ1RJT04gMC4xCiBleHRlcm4gUEdETExJTVBPUlQg ZG91YmxlIGN1cnNvcl90dXBsZV9mcmFjdGlvbjsKK2V4dGVybiBQR0RMTElNUE9SVCBib29s IGVuYWJsZV9zZWxmX2pvaW5fcmVtb3ZhbDsKIAogLyogcXVlcnlfcGxhbm5lciBjYWxsYmFj ayB0byBjb21wdXRlIHF1ZXJ5X3BhdGhrZXlzICovCiB0eXBlZGVmIHZvaWQgKCpxdWVyeV9w YXRoa2V5c19jYWxsYmFjaykgKFBsYW5uZXJJbmZvICpyb290LCB2b2lkICpleHRyYSk7CkBA IC0xMTIsNiArMTEzLDExIEBAIGV4dGVybiBib29sIHF1ZXJ5X2lzX2Rpc3RpbmN0X2ZvcihR dWVyeSAqcXVlcnksIExpc3QgKmNvbG5vcywgTGlzdCAqb3BpZHMpOwogZXh0ZXJuIGJvb2wg aW5uZXJyZWxfaXNfdW5pcXVlKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCSAgIFJlbGlk cyBqb2lucmVsaWRzLCBSZWxpZHMgb3V0ZXJyZWxpZHMsIFJlbE9wdEluZm8gKmlubmVycmVs LAogCQkJCQkJCSAgIEpvaW5UeXBlIGpvaW50eXBlLCBMaXN0ICpyZXN0cmljdGxpc3QsIGJv b2wgZm9yY2VfY2FjaGUpOworZXh0ZXJuIGJvb2wgaW5uZXJyZWxfaXNfdW5pcXVlX2V4dChQ bGFubmVySW5mbyAqcm9vdCwgUmVsaWRzIGpvaW5yZWxpZHMsCisJCQkJCQkJCSAgIFJlbGlk cyBvdXRlcnJlbGlkcywgUmVsT3B0SW5mbyAqaW5uZXJyZWwsCisJCQkJCQkJCSAgIEpvaW5U eXBlIGpvaW50eXBlLCBMaXN0ICpyZXN0cmljdGxpc3QsCisJCQkJCQkJCSAgIGJvb2wgZm9y Y2VfY2FjaGUsIExpc3QgKip1Y2xhdXNlcyk7CitleHRlcm4gTGlzdCAqcmVtb3ZlX3VzZWxl c3Nfc2VsZl9qb2lucyhQbGFubmVySW5mbyAqcm9vdCwgTGlzdCAqam9pbnRyZWUpOwogCiAv KgogICogcHJvdG90eXBlcyBmb3IgcGxhbi9zZXRyZWZzLmMKZGlmZiAtLWdpdCBhL3NyYy9p bmNsdWRlL3Jld3JpdGUvcmV3cml0ZU1hbmlwLmggYi9zcmMvaW5jbHVkZS9yZXdyaXRlL3Jl d3JpdGVNYW5pcC5oCmluZGV4IGFjNmQyMDQ5ZTguLjcxMGVjN2IxYjcgMTAwNjQ0Ci0tLSBh L3NyYy9pbmNsdWRlL3Jld3JpdGUvcmV3cml0ZU1hbmlwLmgKKysrIGIvc3JjL2luY2x1ZGUv cmV3cml0ZS9yZXdyaXRlTWFuaXAuaApAQCAtMTUsNiArMTUsNyBAQAogI2RlZmluZSBSRVdS SVRFTUFOSVBfSAogCiAjaW5jbHVkZSAibm9kZXMvcGFyc2Vub2Rlcy5oIgorI2luY2x1ZGUg Im5vZGVzL3BhdGhub2Rlcy5oIgogCiBzdHJ1Y3QgQXR0ck1hcDsJCQkJCS8qIGF2b2lkIGlu Y2x1ZGluZyBhdHRtYXAuaCBoZXJlICovCiAKQEAgLTQ2LDYgKzQ3LDggQEAgZXh0ZXJuIHZv aWQgQ29tYmluZVJhbmdlVGFibGVzKExpc3QgKipkc3RfcnRhYmxlLCBMaXN0ICoqZHN0X3Bl cm1pbmZvcywKIGV4dGVybiB2b2lkIE9mZnNldFZhck5vZGVzKE5vZGUgKm5vZGUsIGludCBv ZmZzZXQsIGludCBzdWJsZXZlbHNfdXApOwogZXh0ZXJuIHZvaWQgQ2hhbmdlVmFyTm9kZXMo Tm9kZSAqbm9kZSwgaW50IHJ0X2luZGV4LCBpbnQgbmV3X2luZGV4LAogCQkJCQkJICAgaW50 IHN1YmxldmVsc191cCk7Cit2b2lkIENoYW5nZVZhck5vZGVzRXh0ZW5kZWQoTm9kZSAqbm9k ZSwgaW50IHJ0X2luZGV4LCBpbnQgbmV3X2luZGV4LAorCQkJCQkJCWludCBzdWJsZXZlbHNf dXAsIGJvb2wgY2hhbmdlX1JhbmdlVGJsUmVmKTsKIGV4dGVybiB2b2lkIEluY3JlbWVudFZh clN1YmxldmVsc1VwKE5vZGUgKm5vZGUsIGludCBkZWx0YV9zdWJsZXZlbHNfdXAsCiAJCQkJ CQkJCQlpbnQgbWluX3N1YmxldmVsc191cCk7CiBleHRlcm4gdm9pZCBJbmNyZW1lbnRWYXJT dWJsZXZlbHNVcF9ydGFibGUoTGlzdCAqcnRhYmxlLApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhw ZWN0ZWQvZXF1aXZjbGFzcy5vdXQKaW5kZXggYTMyODE2NGZlMC4uZjMyOGU5MmIwOCAxMDA2 NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9lcXVpdmNsYXNzLm91dAorKysg Yi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2VxdWl2Y2xhc3Mub3V0CkBAIC00MzAsNiAr NDMwLDM2IEBAIGV4cGxhaW4gKGNvc3RzIG9mZikKICAgIEZpbHRlcjogKCh1bmlxdWUxIElT IE5PVCBOVUxMKSBBTkQgKHVuaXF1ZTIgSVMgTk9UIE5VTEwpKQogKDIgcm93cykKIAorLS0g VGVzdCB0aGF0IGJyb2tlbiBFQ3MgYXJlIHByb2Nlc3NlZCBjb3JyZWN0bHkgZHVyaW5nIHNl bGYgam9pbiByZW1vdmFsLgorLS0gRGlzYWJsZSBtZXJnZSBqb2lucyBzbyB0aGF0IHdlIGRv bid0IGdldCBhbiBlcnJvciBhYm91dCBtaXNzaW5nIGNvbW11dGF0b3IuCistLSBUZXN0IGJv dGggb3JpZW50YXRpb25zIG9mIHRoZSBqb2luIGNsYXVzZSwgYmVjYXVzZSBvbmx5IG9uZSBv ZiB0aGVtIGJyZWFrcworLS0gdGhlIEVDLgorc2V0IGVuYWJsZV9tZXJnZWpvaW4gdG8gb2Zm OworZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxlY3QgKiBmcm9tIGVjMCBtIGpvaW4gZWMw IG4gb24gbS5mZiA9IG4uZmYKKyAgam9pbiBlYzEgcCBvbiBtLmZmICsgbi5mZiA9IHAuZjE7 CisgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZp bHRlcjogKChuLmZmICsgbi5mZikgPSBwLmYxKQorICAgLT4gIFNlcSBTY2FuIG9uIGVjMCBu CisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlYzEgcAor KDUgcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorICBzZWxlY3QgKiBmcm9tIGVjMCBt IGpvaW4gZWMwIG4gb24gbS5mZiA9IG4uZmYKKyAgam9pbiBlYzEgcCBvbiBwLmYxOjppbnQ4 ID0gKG0uZmYgKyBuLmZmKTo6aW50OGFsaWFzMTsKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg TmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoKHAuZjEpOjpiaWdpbnQgPSAoKG4uZmYg KyBuLmZmKSk6OmludDhhbGlhczEpCisgICAtPiAgU2VxIFNjYW4gb24gZWMwIG4KKyAgIC0+ ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGVjMSBwCisoNSByb3dz KQorCityZXNldCBlbmFibGVfbWVyZ2Vqb2luOwogLS0gdGhpcyBjb3VsZCBiZSBjb252ZXJ0 ZWQsIGJ1dCBpc24ndCBhdCBwcmVzZW50CiBleHBsYWluIChjb3N0cyBvZmYpCiAgIHNlbGVj dCAqIGZyb20gdGVuazEgd2hlcmUgdW5pcXVlMSA9IHVuaXF1ZTEgb3IgdW5pcXVlMiA9IHVu aXF1ZTI7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pvaW4ub3V0 IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2luLm91dAppbmRleCAxMmFiZDNhMGU3 Li4wMzA0NzBmYTRlIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL2pv aW4ub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKQEAgLTYy MjMsNiArNjIyMywxMDg1IEBAIHNlbGVjdCAqIGZyb20KIC0tLS0rLS0tLSstLS0tKy0tLS0K ICgwIHJvd3MpCiAKKy0tCistLSB0ZXN0IHRoYXQgc2VtaS0gb3IgaW5uZXIgc2VsZi1qb2lu cyBvbiBhIHVuaXF1ZSBjb2x1bW4gYXJlIHJlbW92ZWQKKy0tCistLSBlbmFibGUgb25seSBu ZXN0bG9vcCB0byBnZXQgbW9yZSBwcmVkaWN0YWJsZSBwbGFucworc2V0IGVuYWJsZV9oYXNo am9pbiB0byBvZmY7CitzZXQgZW5hYmxlX21lcmdlam9pbiB0byBvZmY7CitjcmVhdGUgdGFi bGUgc2ogKGEgaW50IHVuaXF1ZSwgYiBpbnQsIGMgaW50IHVuaXF1ZSk7CitpbnNlcnQgaW50 byBzaiB2YWx1ZXMgKDEsIG51bGwsIDIpLCAobnVsbCwgMiwgbnVsbCksICgyLCAxLCAxKTsK K2FuYWx5emUgc2o7CistLSBUcml2aWFsIHNlbGYtam9pbiBjYXNlLgorZXhwbGFpbiAoY29z dHMgb2ZmKQorc2VsZWN0IHAuKiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcS5hID0gcC5hIGFu ZCBxLmIgPSBxLmEgLSAxOworICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAg ICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgU2VxIFNjYW4gb24gc2ogcQorICAgRmlsdGVyOiAoKGEgSVMgTk9UIE5VTEwp IEFORCAoYiA9IChhIC0gMSkpKQorKDIgcm93cykKKworc2VsZWN0IHAuKiBmcm9tIHNqIHAs IHNqIHEgd2hlcmUgcS5hID0gcC5hIGFuZCBxLmIgPSBxLmEgLSAxOworIGEgfCBiIHwgYyAK Ky0tLSstLS0rLS0tCisgMiB8IDEgfCAxCisoMSByb3cpCisKKy0tIFNlbGYtam9pbiByZW1v dmFsIHBlcmZvcm1zIGFmdGVyIGEgc3VicXVlcnkgcHVsbC11cCBwcm9jZXNzIGFuZCBjb3Vs ZCByZW1vdmUKKy0tIHN1Y2gga2luZCBvZiBzZWxmLWpvaW4gdG9vLiBDaGVjayB0aGlzIG9w dGlvbi4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogcAord2hlcmUg ZXhpc3RzIChzZWxlY3QgKiBmcm9tIHNqIHEKKyAgICAgICAgICAgICAgd2hlcmUgcS5hID0g cC5hIGFuZCBxLmIgPCAxMCk7CisgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IFNlcSBTY2FuIG9uIHNqIHEKKyAgIEZpbHRlcjogKChhIElTIE5PVCBOVUxMKSBBTkQgKGIg PCAxMCkpCisoMiByb3dzKQorCitzZWxlY3QgKiBmcm9tIHNqIHAKK3doZXJlIGV4aXN0cyAo c2VsZWN0ICogZnJvbSBzaiBxCisgICAgICAgICAgICAgIHdoZXJlIHEuYSA9IHAuYSBhbmQg cS5iIDwgMTApOworIGEgfCBiIHwgYyAKKy0tLSstLS0rLS0tCisgMiB8IDEgfCAxCisoMSBy b3cpCisKKy0tIERvbid0IHJlbW92ZSBzZWxmLWpvaW4gZm9yIHRoZSBjYXNlIG9mIGVxdWFs aXR5IG9mIHR3byBkaWZmZXJlbnQgdW5pcXVlIGNvbHVtbnMuCitleHBsYWluIChjb3N0cyBv ZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBzaiB0MiB3aGVyZSB0MS5hID0gdDIuYyBhbmQg dDEuYiBpcyBub3QgbnVsbDsKKyAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg ICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVk IExvb3AKKyAgIEpvaW4gRmlsdGVyOiAodDEuYSA9IHQyLmMpCisgICAtPiAgU2VxIFNjYW4g b24gc2ogdDIKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4gIFNlcSBTY2FuIG9u IHNqIHQxCisgICAgICAgICAgICAgICBGaWx0ZXI6IChiIElTIE5PVCBOVUxMKQorKDYgcm93 cykKKworLS0gRW5zdXJlIHRoYXQgcmVsYXRpb25zIHdpdGggVEFCTEVTQU1QTEUgY2xhdXNl cyBhcmUgbm90IGNvbnNpZGVyZWQgYXMKKy0tIGNhbmRpZGF0ZXMgdG8gYmUgcmVtb3ZlZAor ZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBzaiB0MQorICAgIGpvaW4gbGF0 ZXJhbAorICAgICAgKHNlbGVjdCAqIGZyb20gc2ogdGFibGVzYW1wbGUgc3lzdGVtKHQxLmIp KSBzCisgICAgb24gdDEuYSA9IHMuYTsKKyAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg TmVzdGVkIExvb3AKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0MQorICAgLT4gIE1lbW9pemUK KyAgICAgICAgIENhY2hlIEtleTogdDEuYSwgdDEuYgorICAgICAgICAgQ2FjaGUgTW9kZTog YmluYXJ5CisgICAgICAgICAtPiAgU2FtcGxlIFNjYW4gb24gc2oKKyAgICAgICAgICAgICAg IFNhbXBsaW5nOiBzeXN0ZW0gKHQxLmIpCisgICAgICAgICAgICAgICBGaWx0ZXI6ICh0MS5h ID0gYSkKKyg4IHJvd3MpCisKKy0tIEVuc3VyZSB0aGF0IFNKRSBkb2VzIG5vdCBmb3JtIGEg c2VsZi1yZWZlcmVudGlhbCBsYXRlcmFsIGRlcGVuZGVuY3kKK2V4cGxhaW4gKGNvc3RzIG9m ZikKK3NlbGVjdCAqIGZyb20gc2ogdDEKKyAgICBsZWZ0IGpvaW4gbGF0ZXJhbAorICAgICAg KHNlbGVjdCB0MS5hIGFzIHQxYSwgKiBmcm9tIHNqIHQyKSBzCisgICAgb24gdHJ1ZQord2hl cmUgdDEuYSA9IHMuYTsKKyAgICAgICAgUVVFUlkgUExBTiAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2ogdDIKKyAgIEZpbHRlcjogKGEg SVMgTk9UIE5VTEwpCisoMiByb3dzKQorCistLSBEZWdlbmVyYXRlZCBjYXNlLgorZXhwbGFp biAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbQorICAoc2VsZWN0IGEgYXMgeCBmcm9tIHNq IHdoZXJlIGZhbHNlKSBhcyBxMSwKKyAgKHNlbGVjdCBhIGFzIHkgZnJvbSBzaiB3aGVyZSBm YWxzZSkgYXMgcTIKK3doZXJlIHExLnggPSBxMi55OworICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgUmVzdWx0CisgICBPbmUtVGlt ZSBGaWx0ZXI6IGZhbHNlCisoMiByb3dzKQorCistLSBXZSBjYW4ndCB1c2UgYSBjcm9zcy1F QyBnZW5lcmF0ZWQgc2VsZiBqb2luIHF1YWwgYmVjYXVzZSBvZiBjdXJyZW50IGxvZ2ljIG9m CistLSB0aGUgZ2VuZXJhdGVfam9pbl9pbXBsaWVkX2VxdWFsaXRpZXMgcm91dGluZS4KK2V4 cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEsIHNqIHQyIHdoZXJlIHQx LmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIuYiA9IHQyLmE7CisgICAgICAgICAg UVVFUlkgUExBTiAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKHQxLmEgPSB0Mi5iKQorICAgLT4gIFNl cSBTY2FuIG9uIHNqIHQxCisgICAgICAgICBGaWx0ZXI6IChhID0gYikKKyAgIC0+ICBTZXEg U2NhbiBvbiBzaiB0MgorICAgICAgICAgRmlsdGVyOiAoYiA9IGEpCisoNiByb3dzKQorCitl eHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxLCBzaiB0Miwgc2ogdDMK K3doZXJlIHQxLmEgPSB0MS5iIGFuZCB0MS5iID0gdDIuYiBhbmQgdDIuYiA9IHQyLmEgYW5k CisgICAgICB0MS5iID0gdDMuYiBhbmQgdDMuYiA9IHQzLmE7CisgICAgICAgICAgICAgUVVF UlkgUExBTiAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKHQxLmEgPSB0My5iKQorICAg LT4gIE5lc3RlZCBMb29wCisgICAgICAgICBKb2luIEZpbHRlcjogKHQxLmEgPSB0Mi5iKQor ICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIHQxCisgICAgICAgICAgICAgICBGaWx0ZXI6 IChhID0gYikKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBzaiB0MgorICAgICAgICAgICAg ICAgRmlsdGVyOiAoYiA9IGEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogdDMKKyAgICAgICAg IEZpbHRlcjogKGIgPSBhKQorKDEwIHJvd3MpCisKKy0tIERvdWJsZSBzZWxmLWpvaW4gcmVt b3ZhbC4KKy0tIFVzZSBhIGNvbmRpdGlvbiBvbiAiYiArIDEiLCBub3Qgb24gImIiLCBmb3Ig dGhlIHNlY29uZCBqb2luLCBzbyB0aGF0CistLSB0aGUgZXF1aXZhbGVuY2UgY2xhc3MgaXMg ZGlmZmVyZW50IGZyb20gdGhlIGZpcnN0IG9uZSwgYW5kIHdlIGNhbgorLS0gdGVzdCB0aGUg bm9uLWVjIGNvZGUgcGF0aC4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqCitmcm9t ICBzaiB0MQorICAgICAgam9pbiBzaiB0MiBvbiB0MS5hID0gdDIuYSBhbmQgdDEuYiA9IHQy LmIKKwkgIGpvaW4gc2ogdDMgb24gdDIuYSA9IHQzLmEgYW5kIHQyLmIgKyAxID0gdDMuYiAr IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNl cSBTY2FuIG9uIHNqIHQzCisgICBGaWx0ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5EIChiIElT IE5PVCBOVUxMKSBBTkQgKChiICsgMSkgSVMgTk9UIE5VTEwpKQorKDIgcm93cykKKworLS0g c3Vic2VsZWN0IHRoYXQgcmVmZXJlbmNlcyB0aGUgcmVtb3ZlZCByZWxhdGlvbgorZXhwbGFp biAoY29zdHMgb2ZmKQorc2VsZWN0IHQxLmEsIChzZWxlY3QgYSBmcm9tIHNqIHdoZXJlIGEg PSB0Mi5hIGFuZCBhID0gdDEuYSkKK2Zyb20gc2ogdDEsIHNqIHQyCit3aGVyZSB0MS5hID0g dDIuYTsKKyAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgIAorLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24g c2ogdDIKKyAgIEZpbHRlcjogKGEgSVMgTk9UIE5VTEwpCisgICBTdWJQbGFuIDEKKyAgICAg LT4gIFJlc3VsdAorICAgICAgICAgICBPbmUtVGltZSBGaWx0ZXI6ICh0Mi5hID0gdDIuYSkK KyAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqCisgICAgICAgICAgICAgICAgIEZpbHRl cjogKGEgPSB0Mi5hKQorKDcgcm93cykKKworLS0gc2VsZi1qb2luIHVuZGVyIG91dGVyIGpv aW4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogeCBqb2luIHNqIHkg b24geC5hID0geS5hCitsZWZ0IGpvaW4gaW50OF90YmwgeiBvbiB4LmEgPSB6LnExOworICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIEpvaW4gRmls dGVyOiAoeS5hID0gei5xMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiB5CisgICAgICAgICBG aWx0ZXI6IChhIElTIE5PVCBOVUxMKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAt PiAgU2VxIFNjYW4gb24gaW50OF90YmwgegorKDYgcm93cykKKworZXhwbGFpbiAoY29zdHMg b2ZmKQorc2VsZWN0ICogZnJvbSBzaiB4IGpvaW4gc2ogeSBvbiB4LmEgPSB5LmEKK2xlZnQg am9pbiBpbnQ4X3RibCB6IG9uIHkuYSA9IHoucTE7CisgICAgICAgICAgICAgUVVFUlkgUExB TiAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgSm9pbiBGaWx0ZXI6ICh5LmEgPSB6LnExKQor ICAgLT4gIFNlcSBTY2FuIG9uIHNqIHkKKyAgICAgICAgIEZpbHRlcjogKGEgSVMgTk9UIE5V TEwpCisgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBpbnQ4 X3RibCB6CisoNiByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9t ICgKKyAgc2VsZWN0IHQxLiosIHQyLmEgYXMgYXggZnJvbSBzaiB0MSBqb2luIHNqIHQyCisg IG9uICh0MS5hID0gdDIuYSBhbmQgdDEuYyAqIHQxLmMgPSB0Mi5jICsgMiBhbmQgdDIuYiBp cyBudWxsKQorKSBhcyBxMQorbGVmdCBqb2luCisgIChzZWxlY3QgdDMuKiBmcm9tIHNqIHQz LCBzaiB0NCB3aGVyZSB0My5jID0gdDQuYykgYXMgcTIKK29uIHExLmF4ID0gcTIuYTsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExv b3AgTGVmdCBKb2luCisgICBKb2luIEZpbHRlcjogKHQyLmEgPSB0NC5hKQorICAgLT4gIFNl cSBTY2FuIG9uIHNqIHQyCisgICAgICAgICBGaWx0ZXI6ICgoYiBJUyBOVUxMKSBBTkQgKGEg SVMgTk9UIE5VTEwpIEFORCAoKGMgKiBjKSA9IChjICsgMikpKQorICAgLT4gIFNlcSBTY2Fu IG9uIHNqIHQ0CisgICAgICAgICBGaWx0ZXI6IChjIElTIE5PVCBOVUxMKQorKDYgcm93cykK KworLS0gVGVzdCB0aGF0IHBsYWNlaG9sZGVycyBhcmUgdXBkYXRlZCBjb3JyZWN0bHkgYWZ0 ZXIgam9pbiByZW1vdmFsCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tICh2 YWx1ZXMgKDEpKSB4CitsZWZ0IGpvaW4gKHNlbGVjdCBjb2FsZXNjZSh5LnExLCAxKSBmcm9t IGludDhfdGJsIHkKKwlyaWdodCBqb2luIHNqIGoxIGlubmVyIGpvaW4gc2ogajIgb24gajEu YSA9IGoyLmEKKwlvbiB0cnVlKSB6CitvbiB0cnVlOworICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIC0+ICBSZXN1bHQKKyAg IC0+ICBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBz aiBqMgorICAgICAgICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKyAgICAgICAg IC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIGludDhf dGJsIHkKKyg3IHJvd3MpCisKKy0tIFRlc3QgdGhhdCByZWZlcmVuY2VzIHRvIHRoZSByZW1v dmVkIHJlbCBpbiBsYXRlcmFsIHN1YnF1ZXJpZXMgYXJlIHJlcGxhY2VkCistLSBjb3JyZWN0 bHkgYWZ0ZXIgam9pbiByZW1vdmFsCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBvZmYpCitz ZWxlY3QgdDMuYSBmcm9tIHNqIHQxCisJam9pbiBzaiB0MiBvbiB0MS5hID0gdDIuYQorCWpv aW4gbGF0ZXJhbCAoc2VsZWN0IHQxLmEgb2Zmc2V0IDApIHQzIG9uIHRydWU7CisgICAgICAg ICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBPdXRwdXQ6ICh0Mi5hKQorICAgLT4g IFNlcSBTY2FuIG9uIHB1YmxpYy5zaiB0MgorICAgICAgICAgT3V0cHV0OiB0Mi5hLCB0Mi5i LCB0Mi5jCisgICAgICAgICBGaWx0ZXI6ICh0Mi5hIElTIE5PVCBOVUxMKQorICAgLT4gIFJl c3VsdAorICAgICAgICAgT3V0cHV0OiB0Mi5hCisoNyByb3dzKQorCitleHBsYWluICh2ZXJi b3NlLCBjb3N0cyBvZmYpCitzZWxlY3QgdDMuYSBmcm9tIHNqIHQxCisJam9pbiBzaiB0MiBv biB0MS5hID0gdDIuYQorCWpvaW4gbGF0ZXJhbCAoc2VsZWN0ICogZnJvbSAoc2VsZWN0IHQx LmEgb2Zmc2V0IDApIG9mZnNldCAwKSB0MyBvbiB0cnVlOworICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBOZXN0ZWQgTG9vcAorICAgT3V0cHV0OiAodDIuYSkKKyAgIC0+ICBTZXEgU2NhbiBv biBwdWJsaWMuc2ogdDIKKyAgICAgICAgIE91dHB1dDogdDIuYSwgdDIuYiwgdDIuYworICAg ICAgICAgRmlsdGVyOiAodDIuYSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBSZXN1bHQKKyAgICAg ICAgIE91dHB1dDogdDIuYQorKDcgcm93cykKKworZXhwbGFpbiAodmVyYm9zZSwgY29zdHMg b2ZmKQorc2VsZWN0IHQ0LmEgZnJvbSBzaiB0MQorCWpvaW4gc2ogdDIgb24gdDEuYSA9IHQy LmEKKwlqb2luIGxhdGVyYWwgKHNlbGVjdCB0My5hIGZyb20gc2ogdDMsIChzZWxlY3QgdDEu YSkgb2Zmc2V0IDApIHQ0IG9uIHRydWU7CisgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3Rl ZCBMb29wCisgICBPdXRwdXQ6IHQzLmEKKyAgIC0+ICBTZXEgU2NhbiBvbiBwdWJsaWMuc2og dDIKKyAgICAgICAgIE91dHB1dDogdDIuYSwgdDIuYiwgdDIuYworICAgICAgICAgRmlsdGVy OiAodDIuYSBJUyBOT1QgTlVMTCkKKyAgIC0+ICBTZXEgU2NhbiBvbiBwdWJsaWMuc2ogdDMK KyAgICAgICAgIE91dHB1dDogdDMuYQorKDcgcm93cykKKworLS0gQ2hlY2sgdXBkYXRpbmcg b2YgTGF0ZXJhbCBsaW5rcyBmcm9tIHRvcC1sZXZlbCBxdWVyeSB0byB0aGUgcmVtb3Zpbmcg cmVsYXRpb24KK2V4cGxhaW4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gcGdfYW0gYW0g V0hFUkUgYW0uYW1uYW1lIElOICgKKyAgU0VMRUNUIGMxLnJlbG5hbWUgQVMgcmVsbmFtZQor ICBGUk9NIHBnX2NsYXNzIGMxCisgICAgSk9JTiBwZ19jbGFzcyBjMgorICAgIE9OIGMxLm9p ZD1jMi5vaWQgQU5EIGMxLm9pZCA8IDEwCispOworICAgICAgICAgICAgICAgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IE5lc3RlZCBMb29wIFNlbWkgSm9pbgorICAgSm9pbiBGaWx0ZXI6IChhbS5hbW5hbWUgPSBj Mi5yZWxuYW1lKQorICAgLT4gIFNlcSBTY2FuIG9uIHBnX2FtIGFtCisgICAtPiAgTWF0ZXJp YWxpemUKKyAgICAgICAgIC0+ICBJbmRleCBTY2FuIHVzaW5nIHBnX2NsYXNzX29pZF9pbmRl eCBvbiBwZ19jbGFzcyBjMgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKG9pZCA8ICcx MCc6Om9pZCkKKyg2IHJvd3MpCisKKy0tCistLSBTSkUgY29ybmVyIGNhc2U6IHVuaXF1ZW5l c3Mgb2YgYW4gaW5uZXIgaXMgZGVyaXZlZCBmcm9tCistLSBiYXNlcmVzdHJpY3RpbmZvIGNs YXVzZXMuCistLQorSU5TRVJUIElOVE8gc2ogVkFMVUVTICgzLCAxLCAzKTsKKy0tIFR3byBh cHByb2FjaGVzIHRvIHdyaXRlIGEgam9pbi4gSW4gYm90aCBjYXNlcyBpdCBpcyBzZWwtam9p biB3aGljaCBhZGRyZXNzZXMKKy0tIHRoZSBzYW1lIHBoeXNpY2FsIHR1cGxlIGFuZCBjYW4g YmUgcmVtb3ZlZCBmcm9tIHRoZSBqb2luIHNlYXJjaCBzcGFjZS4KK0VYUExBSU4gKENPU1RT IE9GRikgU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYSA9IDMgQU5EIGoy LmEgPSAzOworICAgIFFVRVJZIFBMQU4gICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNl cSBTY2FuIG9uIHNqIGoyCisgICBGaWx0ZXI6IChhID0gMykKKygyIHJvd3MpCisKK0VYUExB SU4gKENPU1RTIE9GRikgU0VMRUNUICogRlJPTSBzaiBqMSBKT0lOIHNqIGoyIE9OIChqMS5h ID0gMyBBTkQgajIuYSA9IDMpOworICAgIFFVRVJZIFBMQU4gICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLQorIFNlcSBTY2FuIG9uIHNqIGoyCisgICBGaWx0ZXI6IChhID0gMykKKygyIHJv d3MpCisKKy0tIERvbid0IHJlbW92ZSBTSgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNU ICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAyIEFO RCBqMi5hID0gMzsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgIAorLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAo ajEuYiA9IGoyLmIpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogajEKKyAgICAgICAgIEZpbHRl cjogKGEgPSAyKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoyCisgICAgICAgICBGaWx0ZXI6 IChhID0gMykKKyg2IHJvd3MpCisKKy0tIFJldHVybiBvbmUgcm93CitTRUxFQ1QgKiBGUk9N IHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDIgQU5EIGoyLmEg PSAzOworIGEgfCBiIHwgYyB8IGEgfCBiIHwgYyAKKy0tLSstLS0rLS0tKy0tLSstLS0rLS0t CisgMiB8IDEgfCAxIHwgMyB8IDEgfCAzCisoMSByb3cpCisKKy0tIFJlbW92ZSBTSiwgZGVm aW5lIHVuaXF1ZW5lc3MgYnkgYSBjb25zdGFudAorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VM RUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAy IEFORCBqMi5hID0gMjsKKyAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBT Y2FuIG9uIHNqIGoyCisgICBGaWx0ZXI6ICgoYiBJUyBOT1QgTlVMTCkgQU5EIChhID0gMikp CisoMiByb3dzKQorCistLSBSZXR1cm4gb25lIHJvdworU0VMRUNUICogRlJPTSBzaiBqMSwg c2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAyIEFORCBqMi5hID0gMjsKKyBh IHwgYiB8IGMgfCBhIHwgYiB8IGMgCistLS0rLS0tKy0tLSstLS0rLS0tKy0tLQorIDIgfCAx IHwgMSB8IDIgfCAxIHwgMQorKDEgcm93KQorCistLSBSZW1vdmUgU0osIGRlZmluZSB1bmlx dWVuZXNzIGJ5IGEgY29uc3RhbnQgZXhwcmVzc2lvbgorRVhQTEFJTiAoQ09TVFMgT0ZGKQor U0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iCisgIEFORCBq MS5hID0gKEVYVFJBQ1QoRE9XIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpLzE1ICsgMyk6 OmludAorICBBTkQgKEVYVFJBQ1QoRE9XIEZST00gY3VycmVudF90aW1lc3RhbXAoMCkpLzE1 ICsgMyk6OmludCA9IGoyLmE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgU2VxIFNjYW4gb24gc2ogajIKKyAgIEZpbHRlcjogKChiIElTIE5PVCBOVUxMKSBBTkQg KGEgPSAoKChFWFRSQUNUKGRvdyBGUk9NIENVUlJFTlRfVElNRVNUQU1QKDApKSAvICcxNSc6 Om51bWVyaWMpICsgJzMnOjpudW1lcmljKSk6OmludGVnZXIpKQorKDIgcm93cykKKworLS0g UmV0dXJuIG9uZSByb3cKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5i ID0gajIuYgorICBBTkQgajEuYSA9IChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0 YW1wKDApKS8xNSArIDMpOjppbnQKKyAgQU5EIChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRf dGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQgPSBqMi5hOworIGEgfCBiIHwgYyB8IGEgfCBi IHwgYyAKKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tCisgMyB8IDEgfCAzIHwgMyB8IDEgfCAz CisoMSByb3cpCisKKy0tIFJlbW92ZSBTSgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNU ICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAxIEFO RCBqMi5hID0gMTsKKyAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2Fu IG9uIHNqIGoyCisgICBGaWx0ZXI6ICgoYiBJUyBOT1QgTlVMTCkgQU5EIChhID0gMSkpCiso MiByb3dzKQorCistLSBSZXR1cm4gbm8gcm93cworU0VMRUNUICogRlJPTSBzaiBqMSwgc2og ajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAxIEFORCBqMi5hID0gMTsKKyBhIHwg YiB8IGMgfCBhIHwgYiB8IGMgCistLS0rLS0tKy0tLSstLS0rLS0tKy0tLQorKDAgcm93cykK KworLS0gU2h1ZmZsZSBhIGNsYXVzZS4gUmVtb3ZlIFNKCitFWFBMQUlOIChDT1NUUyBPRkYp CitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgMSA9 IGoxLmEgQU5EIGoyLmEgPSAxOworICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg U2VxIFNjYW4gb24gc2ogajIKKyAgIEZpbHRlcjogKChiIElTIE5PVCBOVUxMKSBBTkQgKGEg PSAxKSkKKygyIHJvd3MpCisKKy0tIFJldHVybiBubyByb3dzCitTRUxFQ1QgKiBGUk9NIHNq IGoxLCBzaiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgMSA9IGoxLmEgQU5EIGoyLmEgPSAx OworIGEgfCBiIHwgYyB8IGEgfCBiIHwgYyAKKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tCiso MCByb3dzKQorCistLSBTSkUgQ29ybmVyIGNhc2U6IGEgJ2EueD1hLngnIGNsYXVzZSwgaGF2 ZSByZXBsYWNlZCB3aXRoICdhLnggSVMgTk9UIE5VTEwnCistLSBhZnRlciBTSiBlbGltaW5h dGlvbiBpdCBzaG91bGRuJ3QgYmUgYSBtZXJnZWpvaW5hYmxlIGNsYXVzZS4KK0VYUExBSU4g KENPU1RTIE9GRikKK1NFTEVDVCB0NC4qCitGUk9NIChTRUxFQ1QgdDEuKiwgdDIuYSBBUyBh MSBGUk9NIHNqIHQxLCBzaiB0MiBXSEVSRSB0MS5iID0gdDIuYikgQVMgdDMKK0pPSU4gc2og dDQgT04gKHQ0LmEgPSB0My5hKSBXSEVSRSB0My5hMSA9IDQyOworICAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICh0MS5iID0gdDIuYikKKyAgIC0+ICBT ZXEgU2NhbiBvbiBzaiB0MgorICAgICAgICAgRmlsdGVyOiAoYSA9IDQyKQorICAgLT4gIFNl cSBTY2FuIG9uIHNqIHQxCisgICAgICAgICBGaWx0ZXI6IChhIElTIE5PVCBOVUxMKQorKDYg cm93cykKKworU0VMRUNUIHQ0LioKK0ZST00gKFNFTEVDVCB0MS4qLCB0Mi5hIEFTIGExIEZS T00gc2ogdDEsIHNqIHQyIFdIRVJFIHQxLmIgPSB0Mi5iKSBBUyB0MworSk9JTiBzaiB0NCBP TiAodDQuYSA9IHQzLmEpIFdIRVJFIHQzLmExID0gNDI7CisgYSB8IGIgfCBjIAorLS0tKy0t LSstLS0KKygwIHJvd3MpCisKKy0tIEZ1bmN0aW9uYWwgaW5kZXgKK0NSRUFURSBVTklRVUUg SU5ERVggc2pfZm5faWR4IE9OIHNqKChhICogYSkpOworLS0gUmVtb3ZlIFNKCitFWFBMQUlO IChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorCVdIRVJFIGoxLmIg PSBqMi5iIEFORCBqMS5hKmoxLmEgPSAxIEFORCBqMi5hKmoyLmEgPSAxOworICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gc2ogajIK KyAgIEZpbHRlcjogKChiIElTIE5PVCBOVUxMKSBBTkQgKChhICogYSkgPSAxKSkKKygyIHJv d3MpCisKKy0tIERvbid0IHJlbW92ZSBTSgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNU ICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSpqMS5h ID0gMSBBTkQgajIuYSpqMi5hID0gMjsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAg Sm9pbiBGaWx0ZXI6IChqMS5iID0gajIuYikKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMQor ICAgICAgICAgRmlsdGVyOiAoKGEgKiBhKSA9IDEpCisgICAtPiAgU2VxIFNjYW4gb24gc2og ajIKKyAgICAgICAgIEZpbHRlcjogKChhICogYSkgPSAyKQorKDYgcm93cykKKworLS0gUmVz dHJpY3Rpb24gY29udGFpbnMgZXhwcmVzc2lvbnMgaW4gYm90aCBzaWRlcywgUmVtb3ZlIFNK LgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dI RVJFIGoxLmIgPSBqMi5iCisgIEFORCAoajEuYSpqMS5hKSA9IChFWFRSQUNUKERPVyBGUk9N IGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQKKyAgQU5EIChFWFRSQUNUKERP VyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQgPSAoajIuYSpqMi5h KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBT ZXEgU2NhbiBvbiBzaiBqMgorICAgRmlsdGVyOiAoKGIgSVMgTk9UIE5VTEwpIEFORCAoKGEg KiBhKSA9ICgoKEVYVFJBQ1QoZG93IEZST00gQ1VSUkVOVF9USU1FU1RBTVAoMCkpIC8gJzE1 Jzo6bnVtZXJpYykgKyAnMyc6Om51bWVyaWMpKTo6aW50ZWdlcikpCisoMiByb3dzKQorCist LSBFbXB0eSBzZXQgb2Ygcm93cyBzaG91bGQgYmUgcmV0dXJuZWQKK1NFTEVDVCAqIEZST00g c2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgKGoxLmEqajEuYSkgPSAo RVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6aW50Cisg IEFORCAoRVhUUkFDVChET1cgRlJPTSBjdXJyZW50X3RpbWVzdGFtcCgwKSkvMTUgKyAzKTo6 aW50ID0gKGoyLmEqajIuYSk7CisgYSB8IGIgfCBjIHwgYSB8IGIgfCBjIAorLS0tKy0tLSst LS0rLS0tKy0tLSstLS0KKygwIHJvd3MpCisKKy0tIFJlc3RyaWN0aW9uIGNvbnRhaW5zIHZv bGF0aWxlIGZ1bmN0aW9uIC0gZGlzYWJsZSBTSkUgZmVhdHVyZS4KK0VYUExBSU4gKENPU1RT IE9GRikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgor ICBBTkQgKGoxLmEqajEuYy8zKSA9IChyYW5kb20oKS8zICsgMyk6OmludAorICBBTkQgKHJh bmRvbSgpLzMgKyAzKTo6aW50ID0gKGoyLmEqajIuYy8zKTsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisg ICBKb2luIEZpbHRlcjogKGoxLmIgPSBqMi5iKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGox CisgICAgICAgICBGaWx0ZXI6ICgoKGEgKiBjKSAvIDMpID0gKCgocmFuZG9tKCkgLyAnMyc6 OmRvdWJsZSBwcmVjaXNpb24pICsgJzMnOjpkb3VibGUgcHJlY2lzaW9uKSk6OmludGVnZXIp CisgICAtPiAgU2VxIFNjYW4gb24gc2ogajIKKyAgICAgICAgIEZpbHRlcjogKCgoKHJhbmRv bSgpIC8gJzMnOjpkb3VibGUgcHJlY2lzaW9uKSArICczJzo6ZG91YmxlIHByZWNpc2lvbikp OjppbnRlZ2VyID0gKChhICogYykgLyAzKSkKKyg2IHJvd3MpCisKKy0tIFJldHVybiBvbmUg cm93CitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorV0hFUkUgajEuYiA9IGoyLmIKKyAg QU5EIChqMS5hKmoxLmMvMykgPSAocmFuZG9tKCkvMyArIDMpOjppbnQKKyAgQU5EIChyYW5k b20oKS8zICsgMyk6OmludCA9IChqMi5hKmoyLmMvMyk7CisgYSB8IGIgfCBjIHwgYSB8IGIg fCBjIAorLS0tKy0tLSstLS0rLS0tKy0tLSstLS0KKyAzIHwgMSB8IDMgfCAzIHwgMSB8IDMK KygxIHJvdykKKworLS0gTXVsdGlwbGUgZmlsdGVycworQ1JFQVRFIFVOSVFVRSBJTkRFWCBz al90ZW1wX2lkeDEgT04gc2ooYSxiLGMpOworLS0gUmVtb3ZlIFNKCitFWFBMQUlOIChDT1NU UyBPRkYpCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorCVdIRVJFIGoxLmIgPSBqMi5i IEFORCBqMS5hID0gMiBBTkQgajEuYyA9IDMgQU5EIGoyLmEgPSAyIEFORCAzID0gajIuYzsK KyAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIFNlcSBTY2FuIG9uIHNqIGoyCisgICBGaWx0ZXI6ICgoYiBJUyBOT1QgTlVMTCkgQU5E IChhID0gMikgQU5EIChjID0gMykpCisoMiByb3dzKQorCistLSBEb24ndCByZW1vdmUgU0oK K0VYUExBSU4gKENPU1RTIE9GRikKKwlTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorCVdI RVJFIGoxLmIgPSBqMi5iIEFORCAyID0gajEuYSBBTkQgajEuYyA9IDMgQU5EIGoyLmEgPSAx IEFORCAzID0gajIuYzsKKyAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExv b3AKKyAgIEpvaW4gRmlsdGVyOiAoajEuYiA9IGoyLmIpCisgICAtPiAgU2VxIFNjYW4gb24g c2ogajEKKyAgICAgICAgIEZpbHRlcjogKCgyID0gYSkgQU5EIChjID0gMykpCisgICAtPiAg U2VxIFNjYW4gb24gc2ogajIKKyAgICAgICAgIEZpbHRlcjogKChjID0gMykgQU5EIChhID0g MSkpCisoNiByb3dzKQorCitDUkVBVEUgVU5JUVVFIElOREVYIHNqX3RlbXBfaWR4IE9OIHNq KGEsYik7CistLSBEb24ndCByZW1vdmUgU0oKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVD VCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMjsK KyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAoajEuYiA9IGoyLmIp CisgICAtPiAgU2VxIFNjYW4gb24gc2ogajEKKyAgICAgICAgIEZpbHRlcjogKGEgPSAyKQor ICAgLT4gIFNlcSBTY2FuIG9uIHNqIGoyCisoNSByb3dzKQorCistLSBEb24ndCByZW1vdmUg U0oKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdI RVJFIGoxLmIgPSBqMi5iIEFORCAyID0gajIuYTsKKyAgICAgICAgICBRVUVSWSBQTEFOICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AK KyAgIEpvaW4gRmlsdGVyOiAoajEuYiA9IGoyLmIpCisgICAtPiAgU2VxIFNjYW4gb24gc2og ajIKKyAgICAgICAgIEZpbHRlcjogKDIgPSBhKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIGox CisoNSByb3dzKQorCistLSBEb24ndCByZW1vdmUgU0oKK0VYUExBSU4gKENPU1RTIE9GRikK K1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5iIEFORCAoajEu YSA9IDEgT1IgajIuYSA9IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQ TEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9v cAorICAgSm9pbiBGaWx0ZXI6ICgoajEuYiA9IGoyLmIpIEFORCAoKGoxLmEgPSAxKSBPUiAo ajIuYSA9IDEpKSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBqMQorICAgLT4gIE1hdGVyaWFs aXplCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogajIKKyg1IHJvd3MpCisKK0RST1Ag SU5ERVggc2pfZm5faWR4LCBzal90ZW1wX2lkeDEsIHNqX3RlbXBfaWR4OworLS0gVGVzdCB0 aGF0IE9SIHByZWRpY2F0ZWQgYXJlIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIGpvaW4gcmVt b3ZhbAorQ1JFQVRFIFRBQkxFIHRhYl93aXRoX2ZsYWcgKCBpZCBJTlQgUFJJTUFSWSBLRVks IGlzX2ZsYWcgU01BTExJTlQpOworQ1JFQVRFIElOREVYIGlkeF90ZXN0X2lzX2ZsYWcgT04g dGFiX3dpdGhfZmxhZyAoaXNfZmxhZyk7CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1Qg Q09VTlQoKikgRlJPTSB0YWJfd2l0aF9mbGFnCitXSEVSRQorCShpc19mbGFnIElTIE5VTEwg T1IgaXNfZmxhZyA9IDApCisJQU5EIGlkIElOIChTRUxFQ1QgaWQgRlJPTSB0YWJfd2l0aF9m bGFnIFdIRVJFIGlkIElOICgyLCAzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAg IC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIHRhYl93aXRoX2ZsYWcKKyAgICAgICAgIFJlY2hl Y2sgQ29uZDogKGlkID0gQU5ZICgnezIsM30nOjppbnRlZ2VyW10pKQorICAgICAgICAgRmls dGVyOiAoKGlzX2ZsYWcgSVMgTlVMTCkgT1IgKGlzX2ZsYWcgPSAwKSkKKyAgICAgICAgIC0+ ICBCaXRtYXAgSW5kZXggU2NhbiBvbiB0YWJfd2l0aF9mbGFnX3BrZXkKKyAgICAgICAgICAg ICAgIEluZGV4IENvbmQ6IChpZCA9IEFOWSAoJ3syLDN9Jzo6aW50ZWdlcltdKSkKKyg2IHJv d3MpCisKK0RST1AgVEFCTEUgdGFiX3dpdGhfZmxhZzsKKy0tIEhBVklORyBjbGF1c2UKK2V4 cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCBwLmIgZnJvbSBzaiBwIGpvaW4gc2ogcSBvbiBw LmEgPSBxLmEgZ3JvdXAgYnkgcC5iIGhhdmluZyBzdW0ocC5hKSA9IDE7CisgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIEhhc2hBZ2dyZWdhdGUKKyAgIEdyb3VwIEtleTogcS5iCisgICBGaWx0ZXI6IChz dW0ocS5hKSA9IDEpCisgICAtPiAgU2VxIFNjYW4gb24gc2ogcQorICAgICAgICAgRmlsdGVy OiAoYSBJUyBOT1QgTlVMTCkKKyg1IHJvd3MpCisKKy0tIHVwZGF0ZSBsYXRlcmFsIHJlZmVy ZW5jZXMgYW5kIHJhbmdlIHRhYmxlIGVudHJ5IHJlZmVyZW5jZQorZXhwbGFpbiAodmVyYm9z ZSwgY29zdHMgb2ZmKQorc2VsZWN0IDEgZnJvbSAoc2VsZWN0IHguKiBmcm9tIHNqIHgsIHNq IHkgd2hlcmUgeC5hID0geS5hKSBxLAorICBsYXRlcmFsIGdlbmVyYXRlX3NlcmllcygxLCBx LmEpIGdzKGkpOworICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgT3V0cHV0OiAxCisgICAtPiAgU2Vx IFNjYW4gb24gcHVibGljLnNqIHkKKyAgICAgICAgIE91dHB1dDogeS5hLCB5LmIsIHkuYwor ICAgICAgICAgRmlsdGVyOiAoeS5hIElTIE5PVCBOVUxMKQorICAgLT4gIEZ1bmN0aW9uIFNj YW4gb24gcGdfY2F0YWxvZy5nZW5lcmF0ZV9zZXJpZXMgZ3MKKyAgICAgICAgIE91dHB1dDog Z3MuaQorICAgICAgICAgRnVuY3Rpb24gQ2FsbDogZ2VuZXJhdGVfc2VyaWVzKDEsIHkuYSkK Kyg4IHJvd3MpCisKK2V4cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAxIGZy b20gKHNlbGVjdCB5LiogZnJvbSBzaiB4LCBzaiB5IHdoZXJlIHguYSA9IHkuYSkgcSwKKyAg bGF0ZXJhbCBnZW5lcmF0ZV9zZXJpZXMoMSwgcS5hKSBncyhpKTsKKyAgICAgICAgICAgICAg ICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExv b3AKKyAgIE91dHB1dDogMQorICAgLT4gIFNlcSBTY2FuIG9uIHB1YmxpYy5zaiB5CisgICAg ICAgICBPdXRwdXQ6IHkuYSwgeS5iLCB5LmMKKyAgICAgICAgIEZpbHRlcjogKHkuYSBJUyBO T1QgTlVMTCkKKyAgIC0+ICBGdW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cuZ2VuZXJhdGVf c2VyaWVzIGdzCisgICAgICAgICBPdXRwdXQ6IGdzLmkKKyAgICAgICAgIEZ1bmN0aW9uIENh bGw6IGdlbmVyYXRlX3NlcmllcygxLCB5LmEpCisoOCByb3dzKQorCistLSBUZXN0IHRoYXQg YSBub24tRUMtZGVyaXZlZCBqb2luIGNsYXVzZSBpcyBwcm9jZXNzZWQgY29ycmVjdGx5LiBV c2UgYW4KKy0tIG91dGVyIGpvaW4gc28gdGhhdCB3ZSBjYW4ndCBmb3JtIGFuIEVDLgorZXhw bGFpbiAoY29zdHMgb2ZmKSBzZWxlY3QgKiBmcm9tIHNqIHAgam9pbiBzaiBxIG9uIHAuYSA9 IHEuYQorICBsZWZ0IGpvaW4gc2ogciBvbiBwLmEgKyBxLmEgPSByLmE7CisgICAgICAgICAg ICAgUVVFUlkgUExBTiAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgSm9pbiBGaWx0ZXI6ICgo cS5hICsgcS5hKSA9IHIuYSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBxCisgICAgICAgICBG aWx0ZXI6IChhIElTIE5PVCBOVUxMKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAt PiAgU2VxIFNjYW4gb24gc2ogcgorKDYgcm93cykKKworLS0gRklYTUUgdGhpcyBjb25zdGFu dCBmYWxzZSBmaWx0ZXIgZG9lc24ndCBsb29rIGdvb2QuIFNob3VsZCB3ZSBtZXJnZQorLS0g ZXF1aXZhbGVuY2UgY2xhc3Nlcz8KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZy b20gc2ogcCwgc2ogcSB3aGVyZSBwLmEgPSBxLmEgYW5kIHAuYiA9IDEgYW5kIHEuYiA9IDI7 CisgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAg IAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KKyBTZXEgU2NhbiBvbiBzaiBxCisgICBGaWx0ZXI6ICgoYSBJUyBOT1QgTlVMTCkgQU5E IChiID0gMikgQU5EIChiID0gMSkpCisoMiByb3dzKQorCistLSBDaGVjayB0aGF0IGF0dHJf bmVlZGVkIGlzIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIHNlbGYtam9pbiByZW1vdmFsLiBJ biB0aGlzCistLSB0ZXN0LCB0aGUgam9pbiBvZiBqMSB3aXRoIGoyIGlzIHJlbW92ZWQuIGsx LmIgaXMgcmVxdWlyZWQgYXQgZWl0aGVyIGoxIG9yIGoyLgorLS0gSWYgdGhpcyBpbmZvIGlz IGxvc3QsIGpvaW4gdGFyZ2V0bGlzdCBmb3IgKGsxLCBrMikgd2lsbCBub3QgY29udGFpbiBr MS5iLgorLS0gVXNlIGluZGV4IHNjYW4gZm9yIGsxIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0ICdi JyBmcm9tIHBoeXNpY2FsIHRsaXN0IHVzZWQgZm9yCistLSBzZXFzY2FuLiBBbHNvIGRpc2Fi bGUgcmVvcmRlcmluZyBvZiBqb2lucyBiZWNhdXNlIHRoaXMgdGVzdCBkZXBlbmRzIG9uIGEK Ky0tIHBhcnRpY3VsYXIgam9pbiB0cmVlLgorY3JlYXRlIHRhYmxlIHNrIChhIGludCwgYiBp bnQpOworY3JlYXRlIGluZGV4IG9uIHNrKGEpOworc2V0IGpvaW5fY29sbGFwc2VfbGltaXQg dG8gMTsKK3NldCBlbmFibGVfc2Vxc2NhbiB0byBvZmY7CitleHBsYWluIChjb3N0cyBvZmYp IHNlbGVjdCAxIGZyb20KKwkoc2sgazEgam9pbiBzayBrMiBvbiBrMS5hID0gazIuYSkKKwlq b2luIChzaiBqMSBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hKSBvbiBqMS5iID0gazEuYjsK KyAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIE5lc3RlZCBMb29wCisgICBKb2luIEZpbHRlcjogKGsxLmIgPSBqMi5iKQorICAgLT4g IE5lc3RlZCBMb29wCisgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBza19hX2lkeCBv biBzayBrMQorICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBza19hX2lkeCBv biBzayBrMgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGEgPSBrMS5hKQorICAgLT4g IE1hdGVyaWFsaXplCisgICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBzal9hX2tleSBv biBzaiBqMgorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKGEgSVMgTk9UIE5VTEwpCiso OSByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpIHNlbGVjdCAxIGZyb20KKwkoc2sgazEg am9pbiBzayBrMiBvbiBrMS5hID0gazIuYSkKKwlqb2luIChzaiBqMSBqb2luIHNqIGoyIG9u IGoxLmEgPSBqMi5hKSBvbiBqMi5iID0gazEuYjsKKyAgICAgICAgICAgICAgICAgICAgIFFV RVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICBKb2lu IEZpbHRlcjogKGsxLmIgPSBqMi5iKQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAt PiAgSW5kZXggU2NhbiB1c2luZyBza19hX2lkeCBvbiBzayBrMQorICAgICAgICAgLT4gIElu ZGV4IE9ubHkgU2NhbiB1c2luZyBza19hX2lkeCBvbiBzayBrMgorICAgICAgICAgICAgICAg SW5kZXggQ29uZDogKGEgPSBrMS5hKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICAt PiAgSW5kZXggU2NhbiB1c2luZyBzal9hX2tleSBvbiBzaiBqMgorICAgICAgICAgICAgICAg SW5kZXggQ29uZDogKGEgSVMgTk9UIE5VTEwpCisoOSByb3dzKQorCityZXNldCBqb2luX2Nv bGxhcHNlX2xpbWl0OworcmVzZXQgZW5hYmxlX3NlcXNjYW47CistLSBDaGVjayB0aGF0IGNs YXVzZXMgZnJvbSB0aGUgam9pbiBmaWx0ZXIgbGlzdCBpcyBub3QgbG9zdCBvbiB0aGUgc2Vs Zi1qb2luIHJlbW92YWwKK0NSRUFURSBUQUJMRSBlbXAxIChpZCBTRVJJQUwgUFJJTUFSWSBL RVkgTk9UIE5VTEwsIGNvZGUgaW50KTsKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikK K1NFTEVDVCAqIEZST00gZW1wMSBlMSwgZW1wMSBlMiBXSEVSRSBlMS5pZCA9IGUyLmlkIEFO RCBlMi5jb2RlIDw+IGUxLmNvZGU7CisgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIFNlcSBTY2FuIG9uIHB1YmxpYy5lbXAxIGUyCisgICBPdXRwdXQ6IGUyLmlkLCBlMi5j b2RlLCBlMi5pZCwgZTIuY29kZQorICAgRmlsdGVyOiAoZTIuY29kZSA8PiBlMi5jb2RlKQor KDMgcm93cykKKworLS0gU2h1ZmZsZSBzZWxmLWpvaW5lZCByZWxhdGlvbnMuIE9ubHkgaW4g dGhlIGNhc2Ugb2YgaXRlcmF0aXZlIGRlbGV0aW9uCistLSBhdHRlbXB0cyBleHBsYWlucyBv ZiB0aGVzZSBxdWVyaWVzIHdpbGwgYmUgaWRlbnRpY2FsLgorQ1JFQVRFIFVOSVFVRSBJTkRF WCBPTiBlbXAxKChpZCppZCkpOworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGNvdW50 KCopIEZST00gZW1wMSBjMSwgZW1wMSBjMiwgZW1wMSBjMworV0hFUkUgYzEuaWQ9YzIuaWQg QU5EIGMxLmlkKmMyLmlkPWMzLmlkKmMzLmlkOworICAgICAgICAgICAgICAgUVVFUlkgUExB TiAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgQWdncmVnYXRlCisgICAtPiAgU2VxIFNjYW4gb24gZW1wMSBjMworICAgICAg ICAgRmlsdGVyOiAoKGlkICogaWQpIElTIE5PVCBOVUxMKQorKDMgcm93cykKKworRVhQTEFJ TiAoQ09TVFMgT0ZGKQorU0VMRUNUIGNvdW50KCopIEZST00gZW1wMSBjMSwgZW1wMSBjMiwg ZW1wMSBjMworV0hFUkUgYzEuaWQ9YzMuaWQgQU5EIGMxLmlkKmMzLmlkPWMyLmlkKmMyLmlk OworICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQWdncmVnYXRlCisgICAtPiAg U2VxIFNjYW4gb24gZW1wMSBjMworICAgICAgICAgRmlsdGVyOiAoKGlkICogaWQpIElTIE5P VCBOVUxMKQorKDMgcm93cykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGNvdW50 KCopIEZST00gZW1wMSBjMSwgZW1wMSBjMiwgZW1wMSBjMworV0hFUkUgYzMuaWQ9YzIuaWQg QU5EIGMzLmlkKmMyLmlkPWMxLmlkKmMxLmlkOworICAgICAgICAgICAgICAgUVVFUlkgUExB TiAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgQWdncmVnYXRlCisgICAtPiAgU2VxIFNjYW4gb24gZW1wMSBjMworICAgICAg ICAgRmlsdGVyOiAoKGlkICogaWQpIElTIE5PVCBOVUxMKQorKDMgcm93cykKKworLS0gQ2hl Y2sgdGhlIHVzYWdlIG9mIGEgcGFyc2UgdHJlZSBieSB0aGUgc2V0IG9wZXJhdGlvbnMgKGJ1 ZyAjMTgxNzApCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgYzEuY29kZSBGUk9NIGVt cDEgYzEgTEVGVCBKT0lOIGVtcDEgYzIgT04gYzEuaWQgPSBjMi5pZAorV0hFUkUgYzIuaWQg SVMgTk9UIE5VTEwKK0VYQ0VQVCBBTEwKK1NFTEVDVCBjMy5jb2RlIEZST00gZW1wMSBjMzsK KyAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBIYXNoU2V0T3AgRXhjZXB0 IEFsbAorICAgLT4gIEFwcGVuZAorICAgICAgICAgLT4gIFN1YnF1ZXJ5IFNjYW4gb24gIipT RUxFQ1QqIDEiCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gZW1wMSBjMgorICAg ICAgICAgLT4gIFN1YnF1ZXJ5IFNjYW4gb24gIipTRUxFQ1QqIDIiCisgICAgICAgICAgICAg ICAtPiAgU2VxIFNjYW4gb24gZW1wMSBjMworKDYgcm93cykKKworLS0gQ2hlY2sgdGhhdCBT SkUgcmVtb3ZlcyByZWZlcmVuY2VzIGZyb20gUEhWcyBjb3JyZWN0bHkKK2V4cGxhaW4gKGNv c3RzIG9mZikKK3NlbGVjdCAqIGZyb20gZW1wMSB0MSBsZWZ0IGpvaW4KKyAgICAoc2VsZWN0 IGNvYWxlc2NlKHQzLmNvZGUsIDEpIGZyb20gZW1wMSB0MgorICAgICAgICBsZWZ0IGpvaW4g KGVtcDEgdDMgam9pbiBlbXAxIHQ0IG9uIHQzLmlkID0gdDQuaWQpCisgICAgICAgIG9uIHRy dWUpCitvbiB0cnVlOworICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K KyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4KKyAgIC0+ICBTZXEgU2NhbiBvbiBlbXAxIHQxCisg ICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgIC0+ICBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4K KyAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlbXAxIHQyCisgICAgICAgICAgICAg ICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBv biBlbXAxIHQ0CisoNyByb3dzKQorCistLSBDaGVjayB0aGF0IFNKRSByZW1vdmVzIHRoZSB3 aG9sZSBQSFZzIGNvcnJlY3RseQorZXhwbGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2Vs ZWN0IDEgZnJvbSBlbXAxIHQxIGxlZnQgam9pbgorICAgICgoc2VsZWN0IDEgYXMgeCwgKiBm cm9tIGVtcDEgdDIpIHMxIGlubmVyIGpvaW4KKyAgICAgICAgKHNlbGVjdCAqIGZyb20gZW1w MSB0MykgczIgb24gczEuaWQgPSBzMi5pZCkKKyAgICBvbiB0cnVlCit3aGVyZSBzMS54ID0g MTsKKyAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgT3V0 cHV0OiAxCisgICAtPiAgU2VxIFNjYW4gb24gcHVibGljLmVtcDEgdDEKKyAgICAgICAgIE91 dHB1dDogdDEuaWQsIHQxLmNvZGUKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgT3V0 cHV0OiB0My5pZAorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHB1YmxpYy5lbXAxIHQzCisg ICAgICAgICAgICAgICBPdXRwdXQ6IHQzLmlkCisgICAgICAgICAgICAgICBGaWx0ZXI6ICgx ID0gMSkKKyg5IHJvd3MpCisKKy0tIENoZWNrIHRoYXQgUEhWcyBkbyBub3QgaW1wb3NlIGFu eSBjb25zdHJhaW50cyBvbiByZW1vdmluZyBzZWxmIGpvaW5zCitleHBsYWluICh2ZXJib3Nl LCBjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIGVtcDEgdDEgam9pbiBlbXAxIHQyIG9uIHQx LmlkID0gdDIuaWQgbGVmdCBqb2luCisgICAgbGF0ZXJhbCAoc2VsZWN0IHQxLmlkIGFzIHQx aWQsICogZnJvbSBnZW5lcmF0ZV9zZXJpZXMoMSwxKSB0MykgcyBvbiB0cnVlOworICAgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgIAor LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQorIE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgT3V0cHV0OiB0Mi5pZCwgdDIuY29k ZSwgdDIuaWQsIHQyLmNvZGUsICh0Mi5pZCksIHQzLnQzCisgICAtPiAgU2VxIFNjYW4gb24g cHVibGljLmVtcDEgdDIKKyAgICAgICAgIE91dHB1dDogdDIuaWQsIHQyLmNvZGUKKyAgIC0+ ICBGdW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cuZ2VuZXJhdGVfc2VyaWVzIHQzCisgICAg ICAgICBPdXRwdXQ6IHQzLnQzLCB0Mi5pZAorICAgICAgICAgRnVuY3Rpb24gQ2FsbDogZ2Vu ZXJhdGVfc2VyaWVzKDEsIDEpCisoNyByb3dzKQorCitleHBsYWluICh2ZXJib3NlLCBjb3N0 cyBvZmYpCitzZWxlY3QgKiBmcm9tIGdlbmVyYXRlX3NlcmllcygxLDEwKSB0MShpZCkgbGVm dCBqb2luCisgICAgbGF0ZXJhbCAoc2VsZWN0IHQxLmlkIGFzIHQxaWQsIHQyLmlkIGZyb20g ZW1wMSB0MiBqb2luIGVtcDEgdDMgb24gdDIuaWQgPSB0My5pZCkKK29uIHRydWU7CisgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IE5lc3RlZCBMb29wIExlZnQgSm9pbgorICAgT3V0cHV0OiB0MS5pZCwgKHQxLmlkKSwgdDMu aWQKKyAgIC0+ICBGdW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cuZ2VuZXJhdGVfc2VyaWVz IHQxCisgICAgICAgICBPdXRwdXQ6IHQxLmlkCisgICAgICAgICBGdW5jdGlvbiBDYWxsOiBn ZW5lcmF0ZV9zZXJpZXMoMSwgMTApCisgICAtPiAgU2VxIFNjYW4gb24gcHVibGljLmVtcDEg dDMKKyAgICAgICAgIE91dHB1dDogdDMuaWQsIHQxLmlkCisoNyByb3dzKQorCistLSBDaGVj ayB0aGF0IFNKRSByZXBsYWNlcyBqb2luIGNsYXVzZXMgaW52b2x2aW5nIHRoZSByZW1vdmVk IHJlbCBjb3JyZWN0bHkKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gZW1w MSB0MQorICAgaW5uZXIgam9pbiBlbXAxIHQyIG9uIHQxLmlkID0gdDIuaWQKKyAgICBsZWZ0 IGpvaW4gZW1wMSB0MyBvbiB0MS5pZCA+IDEgYW5kIHQxLmlkIDwgMjsKKyAgICAgICAgICAg ICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBMZWZ0IEpvaW4K KyAgIEpvaW4gRmlsdGVyOiAoKHQyLmlkID4gMSkgQU5EICh0Mi5pZCA8IDIpKQorICAgLT4g IFNlcSBTY2FuIG9uIGVtcDEgdDIKKyAgIC0+ICBNYXRlcmlhbGl6ZQorICAgICAgICAgLT4g IFNlcSBTY2FuIG9uIGVtcDEgdDMKKyg1IHJvd3MpCisKKy0tIENoZWNrIHRoYXQgU0pFIGRv ZXNuJ3QgcmVwbGFjZSB0aGUgdGFyZ2V0IHJlbGF0aW9uCitFWFBMQUlOIChDT1NUUyBPRkYp CitXSVRIIHQxIEFTIChTRUxFQ1QgKiBGUk9NIGVtcDEpCitVUERBVEUgZW1wMSBTRVQgY29k ZSA9IHQxLmNvZGUgKyAxIEZST00gdDEKK1dIRVJFIHQxLmlkID0gZW1wMS5pZCBSRVRVUk5J TkcgZW1wMS5pZCwgZW1wMS5jb2RlLCB0MS5jb2RlOworICAgICAgICAgICAgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFVwZGF0ZSBvbiBlbXAx CisgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBlbXAxCisg ICAgICAgICAtPiAgSW5kZXggU2NhbiB1c2luZyBlbXAxX3BrZXkgb24gZW1wMSBlbXAxXzEK KyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IGVtcDEuaWQpCisoNSByb3dzKQor CitJTlNFUlQgSU5UTyBlbXAxIFZBTFVFUyAoMSwgMSksICgyLCAxKTsKK1dJVEggdDEgQVMg KFNFTEVDVCAqIEZST00gZW1wMSkKK1VQREFURSBlbXAxIFNFVCBjb2RlID0gdDEuY29kZSAr IDEgRlJPTSB0MQorV0hFUkUgdDEuaWQgPSBlbXAxLmlkIFJFVFVSTklORyBlbXAxLmlkLCBl bXAxLmNvZGUsIHQxLmNvZGU7CisgaWQgfCBjb2RlIHwgY29kZSAKKy0tLS0rLS0tLS0tKy0t LS0tLQorICAxIHwgICAgMiB8ICAgIDEKKyAgMiB8ICAgIDIgfCAgICAxCisoMiByb3dzKQor CitUUlVOQ0FURSBlbXAxOworRVhQTEFJTiAoQ09TVFMgT0ZGKQorVVBEQVRFIHNqIHNxIFNF VCBiID0gMSBGUk9NIHNqIGFzIHN6IFdIRVJFIHNxLmEgPSBzei5hOworICAgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIFVwZGF0ZSBvbiBzaiBzcQorICAgLT4gIE5lc3RlZCBMb29wCisgICAg ICAgICBKb2luIEZpbHRlcjogKHNxLmEgPSBzei5hKQorICAgICAgICAgLT4gIFNlcSBTY2Fu IG9uIHNqIHNxCisgICAgICAgICAtPiAgTWF0ZXJpYWxpemUKKyAgICAgICAgICAgICAgIC0+ ICBTZXEgU2NhbiBvbiBzaiBzegorKDYgcm93cykKKworQ1JFQVRFIFJVTEUgc2pfZGVsX3J1 bGUgQVMgT04gREVMRVRFIFRPIHNqCisgIERPIElOU1RFQUQKKyAgICBVUERBVEUgc2ogU0VU IGEgPSAxIFdIRVJFIGEgPSBvbGQuYTsKK0VYUExBSU4gKENPU1RTIE9GRikgREVMRVRFIEZS T00gc2o7CisgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgIAorLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBVcGRhdGUgb24gc2ogc2pfMQor ICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICBKb2luIEZpbHRlcjogKHNqLmEgPSBzal8x LmEpCisgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2ogc2pfMQorICAgICAgICAgLT4gIE1h dGVyaWFsaXplCisgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4gb24gc2oKKyg2IHJvd3Mp CisKK0RST1AgUlVMRSBzal9kZWxfcnVsZSBPTiBzaiBDQVNDQURFOworLS0gQ2hlY2sgdGhh dCBTSkUgZG9lcyBub3QgbWlzdGFrZW5seSBvbWl0IHF1YWwgY2xhdXNlcyAoYnVnICMxODE4 NykKK2luc2VydCBpbnRvIGVtcDEgdmFsdWVzICgxLCAxKTsKK2V4cGxhaW4gKGNvc3RzIG9m ZikKK3NlbGVjdCAxIGZyb20gZW1wMSBmdWxsIGpvaW4KKyAgICAoc2VsZWN0ICogZnJvbSBl bXAxIHQxIGpvaW4KKyAgICAgICAgZW1wMSB0MiBqb2luIGVtcDEgdDMgb24gdDIuaWQgPSB0 My5pZAorICAgICAgICBvbiB0cnVlCisgICAgd2hlcmUgZmFsc2UpIHMgb24gdHJ1ZQord2hl cmUgZmFsc2U7CisgICAgICAgIFFVRVJZIFBMQU4gICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBSZXN1bHQKKyAgIE9uZS1UaW1lIEZpbHRlcjogZmFsc2UKKygyIHJv d3MpCisKK3NlbGVjdCAxIGZyb20gZW1wMSBmdWxsIGpvaW4KKyAgICAoc2VsZWN0ICogZnJv bSBlbXAxIHQxIGpvaW4KKyAgICAgICAgZW1wMSB0MiBqb2luIGVtcDEgdDMgb24gdDIuaWQg PSB0My5pZAorICAgICAgICBvbiB0cnVlCisgICAgd2hlcmUgZmFsc2UpIHMgb24gdHJ1ZQor d2hlcmUgZmFsc2U7CisgP2NvbHVtbj8gCistLS0tLS0tLS0tCisoMCByb3dzKQorCistLSBD aGVjayB0aGF0IFNKRSBkb2VzIG5vdCBtaXN0YWtlbmx5IHJlLXVzZSBrbm93bGVkZ2Ugb2Yg cmVsYXRpb24gdW5pcXVlbmVzcworLS0gbWFkZSB3aXRoIGRpZmZlcmVudCBzZXQgb2YgcXVh bHMKK2luc2VydCBpbnRvIGVtcDEgdmFsdWVzICgyLCAxKTsKK2V4cGxhaW4gKGNvc3RzIG9m ZikKK3NlbGVjdCAqIGZyb20gZW1wMSB0MSB3aGVyZSBleGlzdHMgKHNlbGVjdCAqIGZyb20g ZW1wMSB0MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdDIu aWQgPSB0MS5jb2RlIGFuZCB0Mi5jb2RlID4gMCk7CisgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIE5lc3RlZCBMb29wCisgICAtPiAgU2VxIFNjYW4gb24gZW1w MSB0MQorICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgZW1wMV9wa2V5IG9uIGVtcDEgdDIKKyAg ICAgICAgIEluZGV4IENvbmQ6IChpZCA9IHQxLmNvZGUpCisgICAgICAgICBGaWx0ZXI6IChj b2RlID4gMCkKKyg1IHJvd3MpCisKK3NlbGVjdCAqIGZyb20gZW1wMSB0MSB3aGVyZSBleGlz dHMgKHNlbGVjdCAqIGZyb20gZW1wMSB0MgorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgd2hlcmUgdDIuaWQgPSB0MS5jb2RlIGFuZCB0Mi5jb2RlID4gMCk7CisgaWQg fCBjb2RlIAorLS0tLSstLS0tLS0KKyAgMSB8ICAgIDEKKyAgMiB8ICAgIDEKKygyIHJvd3Mp CisKKy0tIFdlIGNhbiByZW1vdmUgdGhlIGpvaW4gZXZlbiBpZiB3ZSBmaW5kIHRoZSBqb2lu IGNhbid0IGR1cGxpY2F0ZSByb3dzIGFuZAorLS0gdGhlIGJhc2UgcXVhbHMgb2YgZWFjaCBz aWRlIGFyZSBkaWZmZXJlbnQuICBJbiB0aGUgZm9sbG93aW5nIGNhc2Ugd2UgZW5kIHVwCist LSBtb3ZpbmcgcXVhbHMgb3ZlciB0byBzMSB0byBtYWtlIGl0IHNvIGl0IGNhbid0IG1hdGNo IGFueSByb3dzLgorY3JlYXRlIHRhYmxlIHNsKGEgaW50LCBiIGludCwgYyBpbnQpOworY3Jl YXRlIHVuaXF1ZSBpbmRleCBvbiBzbChhLCBiKTsKK3ZhY3V1bSBhbmFseXplIHNsOworLS0g Qm90aCBzaWRlcyBhcmUgdW5pcXVlLCBidXQgYmFzZSBxdWFscyBhcmUgZGlmZmVyZW50Citl eHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0MiB3aGVyZSB0 MS5hID0gdDIuYSBhbmQgdDEuYiA9IDEgYW5kIHQyLmIgPSAyOworICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0 ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6ICh0MS5hID0gdDIuYSkKKyAgIC0+ICBTZXEgU2Nh biBvbiBzbCB0MQorICAgICAgICAgRmlsdGVyOiAoYiA9IDEpCisgICAtPiAgU2VxIFNjYW4g b24gc2wgdDIKKyAgICAgICAgIEZpbHRlcjogKGIgPSAyKQorKDYgcm93cykKKworLS0gQ2hl Y2sgTnVsbFRlc3QgaW4gYmFzZXJlc3RyaWN0aW5mbyBsaXN0CitleHBsYWluIChjb3N0cyBv ZmYpCitzZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0Mgord2hlcmUgdDEuYSA9IHQyLmEgYW5k IHQxLmIgPSAxIGFuZCB0Mi5iID0gMgorICBhbmQgdDEuYyBJUyBOT1QgTlVMTCBhbmQgdDIu YyBJUyBOT1QgTlVMTAorICBhbmQgdDIuYiBJUyBOT1QgTlVMTCBhbmQgdDEuYiBJUyBOT1Qg TlVMTAorICBhbmQgdDEuYSBJUyBOT1QgTlVMTCBhbmQgdDIuYSBJUyBOT1QgTlVMTDsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpvaW4gRmlsdGVyOiAodDEuYSA9IHQy LmEpCisgICAtPiAgU2VxIFNjYW4gb24gc2wgdDEKKyAgICAgICAgIEZpbHRlcjogKChjIElT IE5PVCBOVUxMKSBBTkQgKGIgSVMgTk9UIE5VTEwpIEFORCAoYSBJUyBOT1QgTlVMTCkgQU5E IChiID0gMSkpCisgICAtPiAgU2VxIFNjYW4gb24gc2wgdDIKKyAgICAgICAgIEZpbHRlcjog KChjIElTIE5PVCBOVUxMKSBBTkQgKGIgSVMgTk9UIE5VTEwpIEFORCAoYSBJUyBOT1QgTlVM TCkgQU5EIChiID0gMikpCisoNiByb3dzKQorCitleHBsYWluICh2ZXJib3NlLCBjb3N0cyBv ZmYpCitzZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0Mgord2hlcmUgdDEuYiA9IHQyLmIgYW5k IHQyLmEgPSAzIGFuZCB0MS5hID0gMworICBhbmQgdDEuYyBJUyBOT1QgTlVMTCBhbmQgdDIu YyBJUyBOT1QgTlVMTAorICBhbmQgdDIuYiBJUyBOT1QgTlVMTCBhbmQgdDEuYiBJUyBOT1Qg TlVMTAorICBhbmQgdDEuYSBJUyBOT1QgTlVMTCBhbmQgdDIuYSBJUyBOT1QgTlVMTDsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgU2VxIFNjYW4gb24gcHVibGljLnNsIHQyCisg ICBPdXRwdXQ6IHQyLmEsIHQyLmIsIHQyLmMsIHQyLmEsIHQyLmIsIHQyLmMKKyAgIEZpbHRl cjogKCh0Mi5jIElTIE5PVCBOVUxMKSBBTkQgKHQyLmIgSVMgTk9UIE5VTEwpIEFORCAodDIu YSBJUyBOT1QgTlVMTCkgQU5EICh0Mi5hID0gMykpCisoMyByb3dzKQorCistLSBKb2luIHF1 YWwgaXNuJ3QgbWVyZ2Vqb2luYWJsZSwgYnV0IGlubmVyIGlzIHVuaXF1ZS4KK0VYUExBSU4g KENPU1RTIE9GRikKK1NFTEVDVCBuMi5hIEZST00gc2ogbjEsIHNqIG4yIFdIRVJFIG4xLmEg PD4gbjIuYSBBTkQgbjIuYSA9IDE7CisgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIEpv aW4gRmlsdGVyOiAobjEuYSA8PiBuMi5hKQorICAgLT4gIFNlcSBTY2FuIG9uIHNqIG4yCisg ICAgICAgICBGaWx0ZXI6IChhID0gMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBuMQorKDUg cm93cykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTQorKFNFTEVDVCBu Mi5hIEZST00gc2ogbjEsIHNqIG4yIFdIRVJFIG4xLmEgPD4gbjIuYSkgcTAsIHNsCitXSEVS RSBxMC5hID0gMTsKKyAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAKKy0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6 IChuMS5hIDw+IG4yLmEpCisgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgIC0+ICBTZXEg U2NhbiBvbiBzbAorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIHNqIG4yCisgICAgICAgICAg ICAgICBGaWx0ZXI6IChhID0gMSkKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBuMQorKDcgcm93 cykKKworLS0gQ2hlY2sgb3B0aW1pemF0aW9uIGRpc2FibGluZyBpZiBpdCB3aWxsIHZpb2xh dGUgc3BlY2lhbCBqb2luIGNvbmRpdGlvbnMuCistLSBUd28gaWRlbnRpY2FsIGpvaW5lZCBy ZWxhdGlvbnMgc2F0aXNmaWVzIHNlbGYgam9pbiByZW1vdmFsIGNvbmRpdGlvbnMgYnV0Cist LSBzdGF5IGluIGRpZmZlcmVudCBzcGVjaWFsIGpvaW4gaW5mb3MuCitDUkVBVEUgVEFCTEUg c2pfdDEgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFRBQkxFIHNqX3QyIChpZCBzZXJp YWwsIGEgaW50KTsKK0NSRUFURSBUQUJMRSBzal90MyAoaWQgc2VyaWFsLCBhIGludCk7CitD UkVBVEUgVEFCTEUgc2pfdDQgKGlkIHNlcmlhbCwgYSBpbnQpOworQ1JFQVRFIFVOSVFVRSBJ TkRFWCBPTiBzal90MyBVU0lORyBidHJlZSAoYSxpZCk7CitDUkVBVEUgVU5JUVVFIElOREVY IE9OIHNqX3QyIFVTSU5HIGJ0cmVlIChpZCk7CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxF Q1QgKiBGUk9NIHNqX3QxCitKT0lOICgKKwlTRUxFQ1Qgc2pfdDIuaWQgQVMgaWQgRlJPTSBz al90MgorCVdIRVJFIEVYSVNUUworCQkoCisJCVNFTEVDVCBUUlVFIEZST00gc2pfdDMsc2pf dDQgV0hFUkUgc2pfdDMuYSA9IDEgQU5EIHNqX3QzLmlkID0gc2pfdDIuaWQKKwkJKQorCSkg dDJ0M3Q0CitPTiBzal90MS5pZCA9IHQydDN0NC5pZAorSk9JTiAoCisJU0VMRUNUIHNqX3Qy LmlkIEFTIGlkIEZST00gc2pfdDIKKwlXSEVSRSBFWElTVFMKKwkJKAorCQlTRUxFQ1QgVFJV RSBGUk9NIHNqX3QzLHNqX3Q0IFdIRVJFIHNqX3QzLmEgPSAxIEFORCBzal90My5pZCA9IHNq X3QyLmlkCisJCSkKKwkpIF90MnQzdDQKK09OIHNqX3QxLmlkID0gX3QydDN0NC5pZDsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBOZXN0ZWQgTG9vcAorICAgSm9pbiBGaWx0ZXI6IChzal90My5pZCA9IHNq X3QxLmlkKQorICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICBKb2luIEZpbHRlcjogKHNq X3QyLmlkID0gc2pfdDMuaWQpCisgICAgICAgICAtPiAgTmVzdGVkIExvb3AgU2VtaSBKb2lu CisgICAgICAgICAgICAgICAtPiAgTmVzdGVkIExvb3AKKyAgICAgICAgICAgICAgICAgICAg IC0+ICBIYXNoQWdncmVnYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCBL ZXk6IHNqX3QzLmlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgTmVzdGVkIExv b3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBTZXEgU2NhbiBvbiBz al90NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIE1hdGVyaWFsaXpl CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgQml0bWFwIEhl YXAgU2NhbiBvbiBzal90MworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgUmVjaGVjayBDb25kOiAoYSA9IDEpCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gc2pfdDNf YV9pZF9pZHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIEluZGV4IENvbmQ6IChhID0gMSkKKyAgICAgICAgICAgICAgICAgICAgIC0+ICBJ bmRleCBPbmx5IFNjYW4gdXNpbmcgc2pfdDJfaWRfaWR4IG9uIHNqX3QyIHNqX3QyXzEKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9IHNqX3QzLmlkKQor ICAgICAgICAgICAgICAgLT4gIE5lc3RlZCBMb29wCisgICAgICAgICAgICAgICAgICAgICAt PiAgSW5kZXggT25seSBTY2FuIHVzaW5nIHNqX3QzX2FfaWRfaWR4IG9uIHNqX3QzIHNqX3Qz XzEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICgoYSA9IDEpIEFO RCAoaWQgPSBzal90My5pZCkpCisgICAgICAgICAgICAgICAgICAgICAtPiAgU2VxIFNjYW4g b24gc2pfdDQgc2pfdDRfMQorICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBz al90Ml9pZF9pZHggb24gc2pfdDIKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChpZCA9 IHNqX3QyXzEuaWQpCisgICAtPiAgU2VxIFNjYW4gb24gc2pfdDEKKygyNCByb3dzKQorCist LQorLS0gVGVzdCBSb3dNYXJrcy1yZWxhdGVkIGNvZGUKKy0tCistLSBCb3RoIHNpZGVzIGhh dmUgZXhwbGljaXQgTG9ja1Jvd3MgbWFya3MKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVD VCBhMS5hIEZST00gc2ogYTEsc2ogYTIgV0hFUkUgKGExLmE9YTIuYSkgRk9SIFVQREFURTsK KyAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tCisgTG9ja1Jvd3MKKyAgIC0+ICBTZXEgU2NhbiBvbiBzaiBhMgor ICAgICAgICAgRmlsdGVyOiAoYSBJUyBOT1QgTlVMTCkKKygzIHJvd3MpCisKK3Jlc2V0IGVu YWJsZV9oYXNoam9pbjsKK3Jlc2V0IGVuYWJsZV9tZXJnZWpvaW47CiAtLQogLS0gVGVzdCBo aW50cyBnaXZlbiBvbiBpbmNvcnJlY3QgY29sdW1uIHJlZmVyZW5jZXMgYXJlIHVzZWZ1bAog LS0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc3lzdmlld3Mub3V0 IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3cy5vdXQKaW5kZXggZmFkN2Zj M2E3ZS4uN2ZjYzA3YzIwYyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9zeXN2aWV3cy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zeXN2aWV3 cy5vdXQKQEAgLTE2NywxMCArMTY3LDExIEBAIHNlbGVjdCBuYW1lLCBzZXR0aW5nIGZyb20g cGdfc2V0dGluZ3Mgd2hlcmUgbmFtZSBsaWtlICdlbmFibGUlJzsKICBlbmFibGVfcGFydGl0 aW9ud2lzZV9hZ2dyZWdhdGUgfCBvZmYKICBlbmFibGVfcGFydGl0aW9ud2lzZV9qb2luICAg ICAgfCBvZmYKICBlbmFibGVfcHJlc29ydGVkX2FnZ3JlZ2F0ZSAgICAgfCBvbgorIGVuYWJs ZV9zZWxmX2pvaW5fcmVtb3ZhbCAgICAgICB8IG9uCiAgZW5hYmxlX3NlcXNjYW4gICAgICAg ICAgICAgICAgIHwgb24KICBlbmFibGVfc29ydCAgICAgICAgICAgICAgICAgICAgfCBvbgog IGVuYWJsZV90aWRzY2FuICAgICAgICAgICAgICAgICB8IG9uCi0oMjIgcm93cykKKygyMyBy b3dzKQogCiAtLSBUaGVyZSBhcmUgYWx3YXlzIHdhaXQgZXZlbnQgZGVzY3JpcHRpb25zIGZv ciB2YXJpb3VzIHR5cGVzLiAgSW5qZWN0aW9uUG9pbnQKIC0tIG1heSBiZSBwcmVzZW50IG9y IGFic2VudCwgZGVwZW5kaW5nIG9uIGhpc3Rvcnkgc2luY2UgbGFzdCBwb3N0bWFzdGVyIHN0 YXJ0LgpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvZXF1aXZjbGFzcy5zcWwg Yi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNsYXNzLnNxbAppbmRleCAyOGVkNzkxMGQw Li43ZmMyMTU5MzQ5IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNs YXNzLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9lcXVpdmNsYXNzLnNxbApAQCAt MjU5LDYgKzI1OSwyMiBAQCBkcm9wIHVzZXIgcmVncmVzc191c2VyX2VjdGVzdDsKIGV4cGxh aW4gKGNvc3RzIG9mZikKICAgc2VsZWN0ICogZnJvbSB0ZW5rMSB3aGVyZSB1bmlxdWUxID0g dW5pcXVlMSBhbmQgdW5pcXVlMiA9IHVuaXF1ZTI7CiAKKy0tIFRlc3QgdGhhdCBicm9rZW4g RUNzIGFyZSBwcm9jZXNzZWQgY29ycmVjdGx5IGR1cmluZyBzZWxmIGpvaW4gcmVtb3ZhbC4K Ky0tIERpc2FibGUgbWVyZ2Ugam9pbnMgc28gdGhhdCB3ZSBkb24ndCBnZXQgYW4gZXJyb3Ig YWJvdXQgbWlzc2luZyBjb21tdXRhdG9yLgorLS0gVGVzdCBib3RoIG9yaWVudGF0aW9ucyBv ZiB0aGUgam9pbiBjbGF1c2UsIGJlY2F1c2Ugb25seSBvbmUgb2YgdGhlbSBicmVha3MKKy0t IHRoZSBFQy4KK3NldCBlbmFibGVfbWVyZ2Vqb2luIHRvIG9mZjsKKworZXhwbGFpbiAoY29z dHMgb2ZmKQorICBzZWxlY3QgKiBmcm9tIGVjMCBtIGpvaW4gZWMwIG4gb24gbS5mZiA9IG4u ZmYKKyAgam9pbiBlYzEgcCBvbiBtLmZmICsgbi5mZiA9IHAuZjE7CisKK2V4cGxhaW4gKGNv c3RzIG9mZikKKyAgc2VsZWN0ICogZnJvbSBlYzAgbSBqb2luIGVjMCBuIG9uIG0uZmYgPSBu LmZmCisgIGpvaW4gZWMxIHAgb24gcC5mMTo6aW50OCA9IChtLmZmICsgbi5mZik6OmludDhh bGlhczE7CisKK3Jlc2V0IGVuYWJsZV9tZXJnZWpvaW47CisKIC0tIHRoaXMgY291bGQgYmUg Y29udmVydGVkLCBidXQgaXNuJ3QgYXQgcHJlc2VudAogZXhwbGFpbiAoY29zdHMgb2ZmKQog ICBzZWxlY3QgKiBmcm9tIHRlbmsxIHdoZXJlIHVuaXF1ZTEgPSB1bmlxdWUxIG9yIHVuaXF1 ZTIgPSB1bmlxdWUyOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvam9pbi5z cWwgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbAppbmRleCAwYzY1ZTVhZjRiLi40 ZTQyOTc1MGFmIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbAor KysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9qb2luLnNxbApAQCAtMjM1MCw2ICsyMzUwLDQ5 NiBAQCBzZWxlY3QgKiBmcm9tCiBzZWxlY3QgKiBmcm9tCiAgIGludDhfdGJsIHggam9pbiAo aW50NF90YmwgeCBjcm9zcyBqb2luIGludDRfdGJsIHkoZmYpKSBqIG9uIHExID0gZjE7IC0t IG9rCiAKKy0tCistLSB0ZXN0IHRoYXQgc2VtaS0gb3IgaW5uZXIgc2VsZi1qb2lucyBvbiBh IHVuaXF1ZSBjb2x1bW4gYXJlIHJlbW92ZWQKKy0tCisKKy0tIGVuYWJsZSBvbmx5IG5lc3Rs b29wIHRvIGdldCBtb3JlIHByZWRpY3RhYmxlIHBsYW5zCitzZXQgZW5hYmxlX2hhc2hqb2lu IHRvIG9mZjsKK3NldCBlbmFibGVfbWVyZ2Vqb2luIHRvIG9mZjsKKworY3JlYXRlIHRhYmxl IHNqIChhIGludCB1bmlxdWUsIGIgaW50LCBjIGludCB1bmlxdWUpOworaW5zZXJ0IGludG8g c2ogdmFsdWVzICgxLCBudWxsLCAyKSwgKG51bGwsIDIsIG51bGwpLCAoMiwgMSwgMSk7Cith bmFseXplIHNqOworCistLSBUcml2aWFsIHNlbGYtam9pbiBjYXNlLgorZXhwbGFpbiAoY29z dHMgb2ZmKQorc2VsZWN0IHAuKiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcS5hID0gcC5hIGFu ZCBxLmIgPSBxLmEgLSAxOworc2VsZWN0IHAuKiBmcm9tIHNqIHAsIHNqIHEgd2hlcmUgcS5h ID0gcC5hIGFuZCBxLmIgPSBxLmEgLSAxOworCistLSBTZWxmLWpvaW4gcmVtb3ZhbCBwZXJm b3JtcyBhZnRlciBhIHN1YnF1ZXJ5IHB1bGwtdXAgcHJvY2VzcyBhbmQgY291bGQgcmVtb3Zl CistLSBzdWNoIGtpbmQgb2Ygc2VsZi1qb2luIHRvby4gQ2hlY2sgdGhpcyBvcHRpb24uCitl eHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHAKK3doZXJlIGV4aXN0cyAo c2VsZWN0ICogZnJvbSBzaiBxCisgICAgICAgICAgICAgIHdoZXJlIHEuYSA9IHAuYSBhbmQg cS5iIDwgMTApOworc2VsZWN0ICogZnJvbSBzaiBwCit3aGVyZSBleGlzdHMgKHNlbGVjdCAq IGZyb20gc2ogcQorICAgICAgICAgICAgICB3aGVyZSBxLmEgPSBwLmEgYW5kIHEuYiA8IDEw KTsKKworLS0gRG9uJ3QgcmVtb3ZlIHNlbGYtam9pbiBmb3IgdGhlIGNhc2Ugb2YgZXF1YWxp dHkgb2YgdHdvIGRpZmZlcmVudCB1bmlxdWUgY29sdW1ucy4KK2V4cGxhaW4gKGNvc3RzIG9m ZikKK3NlbGVjdCAqIGZyb20gc2ogdDEsIHNqIHQyIHdoZXJlIHQxLmEgPSB0Mi5jIGFuZCB0 MS5iIGlzIG5vdCBudWxsOworCistLSBFbnN1cmUgdGhhdCByZWxhdGlvbnMgd2l0aCBUQUJM RVNBTVBMRSBjbGF1c2VzIGFyZSBub3QgY29uc2lkZXJlZCBhcworLS0gY2FuZGlkYXRlcyB0 byBiZSByZW1vdmVkCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQx CisgICAgam9pbiBsYXRlcmFsCisgICAgICAoc2VsZWN0ICogZnJvbSBzaiB0YWJsZXNhbXBs ZSBzeXN0ZW0odDEuYikpIHMKKyAgICBvbiB0MS5hID0gcy5hOworCistLSBFbnN1cmUgdGhh dCBTSkUgZG9lcyBub3QgZm9ybSBhIHNlbGYtcmVmZXJlbnRpYWwgbGF0ZXJhbCBkZXBlbmRl bmN5CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHQxCisgICAgbGVm dCBqb2luIGxhdGVyYWwKKyAgICAgIChzZWxlY3QgdDEuYSBhcyB0MWEsICogZnJvbSBzaiB0 MikgcworICAgIG9uIHRydWUKK3doZXJlIHQxLmEgPSBzLmE7CisKKy0tIERlZ2VuZXJhdGVk IGNhc2UuCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tCisgIChzZWxlY3Qg YSBhcyB4IGZyb20gc2ogd2hlcmUgZmFsc2UpIGFzIHExLAorICAoc2VsZWN0IGEgYXMgeSBm cm9tIHNqIHdoZXJlIGZhbHNlKSBhcyBxMgord2hlcmUgcTEueCA9IHEyLnk7CisKKy0tIFdl IGNhbid0IHVzZSBhIGNyb3NzLUVDIGdlbmVyYXRlZCBzZWxmIGpvaW4gcXVhbCBiZWNhdXNl IG9mIGN1cnJlbnQgbG9naWMgb2YKKy0tIHRoZSBnZW5lcmF0ZV9qb2luX2ltcGxpZWRfZXF1 YWxpdGllcyByb3V0aW5lLgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSBz aiB0MSwgc2ogdDIgd2hlcmUgdDEuYSA9IHQxLmIgYW5kIHQxLmIgPSB0Mi5iIGFuZCB0Mi5i ID0gdDIuYTsKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2ogdDEsIHNq IHQyLCBzaiB0Mword2hlcmUgdDEuYSA9IHQxLmIgYW5kIHQxLmIgPSB0Mi5iIGFuZCB0Mi5i ID0gdDIuYSBhbmQKKyAgICAgIHQxLmIgPSB0My5iIGFuZCB0My5iID0gdDMuYTsKKworLS0g RG91YmxlIHNlbGYtam9pbiByZW1vdmFsLgorLS0gVXNlIGEgY29uZGl0aW9uIG9uICJiICsg MSIsIG5vdCBvbiAiYiIsIGZvciB0aGUgc2Vjb25kIGpvaW4sIHNvIHRoYXQKKy0tIHRoZSBl cXVpdmFsZW5jZSBjbGFzcyBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZmlyc3Qgb25lLCBhbmQg d2UgY2FuCistLSB0ZXN0IHRoZSBub24tZWMgY29kZSBwYXRoLgorZXhwbGFpbiAoY29zdHMg b2ZmKQorc2VsZWN0ICoKK2Zyb20gIHNqIHQxCisgICAgICBqb2luIHNqIHQyIG9uIHQxLmEg PSB0Mi5hIGFuZCB0MS5iID0gdDIuYgorCSAgam9pbiBzaiB0MyBvbiB0Mi5hID0gdDMuYSBh bmQgdDIuYiArIDEgPSB0My5iICsgMTsKKworLS0gc3Vic2VsZWN0IHRoYXQgcmVmZXJlbmNl cyB0aGUgcmVtb3ZlZCByZWxhdGlvbgorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0IHQx LmEsIChzZWxlY3QgYSBmcm9tIHNqIHdoZXJlIGEgPSB0Mi5hIGFuZCBhID0gdDEuYSkKK2Zy b20gc2ogdDEsIHNqIHQyCit3aGVyZSB0MS5hID0gdDIuYTsKKworLS0gc2VsZi1qb2luIHVu ZGVyIG91dGVyIGpvaW4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2og eCBqb2luIHNqIHkgb24geC5hID0geS5hCitsZWZ0IGpvaW4gaW50OF90YmwgeiBvbiB4LmEg PSB6LnExOworCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHggam9p biBzaiB5IG9uIHguYSA9IHkuYQorbGVmdCBqb2luIGludDhfdGJsIHogb24geS5hID0gei5x MTsKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSAoCisgIHNlbGVjdCB0 MS4qLCB0Mi5hIGFzIGF4IGZyb20gc2ogdDEgam9pbiBzaiB0MgorICBvbiAodDEuYSA9IHQy LmEgYW5kIHQxLmMgKiB0MS5jID0gdDIuYyArIDIgYW5kIHQyLmIgaXMgbnVsbCkKKykgYXMg cTEKK2xlZnQgam9pbgorICAoc2VsZWN0IHQzLiogZnJvbSBzaiB0Mywgc2ogdDQgd2hlcmUg dDMuYyA9IHQ0LmMpIGFzIHEyCitvbiBxMS5heCA9IHEyLmE7CisKKy0tIFRlc3QgdGhhdCBw bGFjZWhvbGRlcnMgYXJlIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIGpvaW4gcmVtb3ZhbAor ZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICogZnJvbSAodmFsdWVzICgxKSkgeAorbGVm dCBqb2luIChzZWxlY3QgY29hbGVzY2UoeS5xMSwgMSkgZnJvbSBpbnQ4X3RibCB5CisJcmln aHQgam9pbiBzaiBqMSBpbm5lciBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hCisJb24gdHJ1 ZSkgegorb24gdHJ1ZTsKKworLS0gVGVzdCB0aGF0IHJlZmVyZW5jZXMgdG8gdGhlIHJlbW92 ZWQgcmVsIGluIGxhdGVyYWwgc3VicXVlcmllcyBhcmUgcmVwbGFjZWQKKy0tIGNvcnJlY3Rs eSBhZnRlciBqb2luIHJlbW92YWwKK2V4cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK3Nl bGVjdCB0My5hIGZyb20gc2ogdDEKKwlqb2luIHNqIHQyIG9uIHQxLmEgPSB0Mi5hCisJam9p biBsYXRlcmFsIChzZWxlY3QgdDEuYSBvZmZzZXQgMCkgdDMgb24gdHJ1ZTsKKworZXhwbGFp biAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0IHQzLmEgZnJvbSBzaiB0MQorCWpvaW4g c2ogdDIgb24gdDEuYSA9IHQyLmEKKwlqb2luIGxhdGVyYWwgKHNlbGVjdCAqIGZyb20gKHNl bGVjdCB0MS5hIG9mZnNldCAwKSBvZmZzZXQgMCkgdDMgb24gdHJ1ZTsKKworZXhwbGFpbiAo dmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0IHQ0LmEgZnJvbSBzaiB0MQorCWpvaW4gc2og dDIgb24gdDEuYSA9IHQyLmEKKwlqb2luIGxhdGVyYWwgKHNlbGVjdCB0My5hIGZyb20gc2og dDMsIChzZWxlY3QgdDEuYSkgb2Zmc2V0IDApIHQ0IG9uIHRydWU7CisKKy0tIENoZWNrIHVw ZGF0aW5nIG9mIExhdGVyYWwgbGlua3MgZnJvbSB0b3AtbGV2ZWwgcXVlcnkgdG8gdGhlIHJl bW92aW5nIHJlbGF0aW9uCitleHBsYWluIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHBn X2FtIGFtIFdIRVJFIGFtLmFtbmFtZSBJTiAoCisgIFNFTEVDVCBjMS5yZWxuYW1lIEFTIHJl bG5hbWUKKyAgRlJPTSBwZ19jbGFzcyBjMQorICAgIEpPSU4gcGdfY2xhc3MgYzIKKyAgICBP TiBjMS5vaWQ9YzIub2lkIEFORCBjMS5vaWQgPCAxMAorKTsKKworLS0KKy0tIFNKRSBjb3Ju ZXIgY2FzZTogdW5pcXVlbmVzcyBvZiBhbiBpbm5lciBpcyBkZXJpdmVkIGZyb20KKy0tIGJh c2VyZXN0cmljdGluZm8gY2xhdXNlcy4KKy0tCisKK0lOU0VSVCBJTlRPIHNqIFZBTFVFUyAo MywgMSwgMyk7CisKKy0tIFR3byBhcHByb2FjaGVzIHRvIHdyaXRlIGEgam9pbi4gSW4gYm90 aCBjYXNlcyBpdCBpcyBzZWwtam9pbiB3aGljaCBhZGRyZXNzZXMKKy0tIHRoZSBzYW1lIHBo eXNpY2FsIHR1cGxlIGFuZCBjYW4gYmUgcmVtb3ZlZCBmcm9tIHRoZSBqb2luIHNlYXJjaCBz cGFjZS4KK0VYUExBSU4gKENPU1RTIE9GRikgU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIg V0hFUkUgajEuYSA9IDMgQU5EIGoyLmEgPSAzOworRVhQTEFJTiAoQ09TVFMgT0ZGKSBTRUxF Q1QgKiBGUk9NIHNqIGoxIEpPSU4gc2ogajIgT04gKGoxLmEgPSAzIEFORCBqMi5hID0gMyk7 CisKKy0tIERvbid0IHJlbW92ZSBTSgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICog RlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAyIEFORCBq Mi5hID0gMzsKKy0tIFJldHVybiBvbmUgcm93CitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBq MiBXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSA9IDIgQU5EIGoyLmEgPSAzOworCistLSBS ZW1vdmUgU0osIGRlZmluZSB1bmlxdWVuZXNzIGJ5IGEgY29uc3RhbnQKK0VYUExBSU4gKENP U1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIgPSBqMi5i IEFORCBqMS5hID0gMiBBTkQgajIuYSA9IDI7CistLSBSZXR1cm4gb25lIHJvdworU0VMRUNU ICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoyLmIgQU5EIGoxLmEgPSAyIEFO RCBqMi5hID0gMjsKKworLS0gUmVtb3ZlIFNKLCBkZWZpbmUgdW5pcXVlbmVzcyBieSBhIGNv bnN0YW50IGV4cHJlc3Npb24KK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00g c2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgajEuYSA9IChFWFRSQUNU KERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQKKyAgQU5EIChF WFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQgPSBq Mi5hOworLS0gUmV0dXJuIG9uZSByb3cKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCitX SEVSRSBqMS5iID0gajIuYgorICBBTkQgajEuYSA9IChFWFRSQUNUKERPVyBGUk9NIGN1cnJl bnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQKKyAgQU5EIChFWFRSQUNUKERPVyBGUk9N IGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQgPSBqMi5hOworCistLSBSZW1v dmUgU0oKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoy IFdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMSBBTkQgajIuYSA9IDE7CistLSBSZXR1 cm4gbm8gcm93cworU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEuYiA9IGoy LmIgQU5EIGoxLmEgPSAxIEFORCBqMi5hID0gMTsKKworLS0gU2h1ZmZsZSBhIGNsYXVzZS4g UmVtb3ZlIFNKCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBz aiBqMiBXSEVSRSBqMS5iID0gajIuYiBBTkQgMSA9IGoxLmEgQU5EIGoyLmEgPSAxOworLS0g UmV0dXJuIG5vIHJvd3MKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyIFdIRVJFIGoxLmIg PSBqMi5iIEFORCAxID0gajEuYSBBTkQgajIuYSA9IDE7CisKKy0tIFNKRSBDb3JuZXIgY2Fz ZTogYSAnYS54PWEueCcgY2xhdXNlLCBoYXZlIHJlcGxhY2VkIHdpdGggJ2EueCBJUyBOT1Qg TlVMTCcKKy0tIGFmdGVyIFNKIGVsaW1pbmF0aW9uIGl0IHNob3VsZG4ndCBiZSBhIG1lcmdl am9pbmFibGUgY2xhdXNlLgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIHQ0LioKK0ZS T00gKFNFTEVDVCB0MS4qLCB0Mi5hIEFTIGExIEZST00gc2ogdDEsIHNqIHQyIFdIRVJFIHQx LmIgPSB0Mi5iKSBBUyB0MworSk9JTiBzaiB0NCBPTiAodDQuYSA9IHQzLmEpIFdIRVJFIHQz LmExID0gNDI7CitTRUxFQ1QgdDQuKgorRlJPTSAoU0VMRUNUIHQxLiosIHQyLmEgQVMgYTEg RlJPTSBzaiB0MSwgc2ogdDIgV0hFUkUgdDEuYiA9IHQyLmIpIEFTIHQzCitKT0lOIHNqIHQ0 IE9OICh0NC5hID0gdDMuYSkgV0hFUkUgdDMuYTEgPSA0MjsKKworLS0gRnVuY3Rpb25hbCBp bmRleAorQ1JFQVRFIFVOSVFVRSBJTkRFWCBzal9mbl9pZHggT04gc2ooKGEgKiBhKSk7CisK Ky0tIFJlbW92ZSBTSgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBzaiBq MSwgc2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQgajEuYSpqMS5hID0gMSBBTkQgajIu YSpqMi5hID0gMTsKKy0tIERvbid0IHJlbW92ZSBTSgorRVhQTEFJTiAoQ09TVFMgT0ZGKQor U0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKKwlXSEVSRSBqMS5iID0gajIuYiBBTkQgajEu YSpqMS5hID0gMSBBTkQgajIuYSpqMi5hID0gMjsKKworLS0gUmVzdHJpY3Rpb24gY29udGFp bnMgZXhwcmVzc2lvbnMgaW4gYm90aCBzaWRlcywgUmVtb3ZlIFNKLgorRVhQTEFJTiAoQ09T VFMgT0ZGKQorU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5i CisgIEFORCAoajEuYSpqMS5hKSA9IChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0 YW1wKDApKS8xNSArIDMpOjppbnQKKyAgQU5EIChFWFRSQUNUKERPVyBGUk9NIGN1cnJlbnRf dGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQgPSAoajIuYSpqMi5hKTsKKy0tIEVtcHR5IHNl dCBvZiByb3dzIHNob3VsZCBiZSByZXR1cm5lZAorU0VMRUNUICogRlJPTSBzaiBqMSwgc2og ajIKK1dIRVJFIGoxLmIgPSBqMi5iCisgIEFORCAoajEuYSpqMS5hKSA9IChFWFRSQUNUKERP VyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQKKyAgQU5EIChFWFRS QUNUKERPVyBGUk9NIGN1cnJlbnRfdGltZXN0YW1wKDApKS8xNSArIDMpOjppbnQgPSAoajIu YSpqMi5hKTsKKworLS0gUmVzdHJpY3Rpb24gY29udGFpbnMgdm9sYXRpbGUgZnVuY3Rpb24g LSBkaXNhYmxlIFNKRSBmZWF0dXJlLgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICog RlJPTSBzaiBqMSwgc2ogajIKK1dIRVJFIGoxLmIgPSBqMi5iCisgIEFORCAoajEuYSpqMS5j LzMpID0gKHJhbmRvbSgpLzMgKyAzKTo6aW50CisgIEFORCAocmFuZG9tKCkvMyArIDMpOjpp bnQgPSAoajIuYSpqMi5jLzMpOworLS0gUmV0dXJuIG9uZSByb3cKK1NFTEVDVCAqIEZST00g c2ogajEsIHNqIGoyCitXSEVSRSBqMS5iID0gajIuYgorICBBTkQgKGoxLmEqajEuYy8zKSA9 IChyYW5kb20oKS8zICsgMyk6OmludAorICBBTkQgKHJhbmRvbSgpLzMgKyAzKTo6aW50ID0g KGoyLmEqajIuYy8zKTsKKworLS0gTXVsdGlwbGUgZmlsdGVycworQ1JFQVRFIFVOSVFVRSBJ TkRFWCBzal90ZW1wX2lkeDEgT04gc2ooYSxiLGMpOworCistLSBSZW1vdmUgU0oKK0VYUExB SU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoyCisJV0hFUkUgajEu YiA9IGoyLmIgQU5EIGoxLmEgPSAyIEFORCBqMS5jID0gMyBBTkQgajIuYSA9IDIgQU5EIDMg PSBqMi5jOworCistLSBEb24ndCByZW1vdmUgU0oKK0VYUExBSU4gKENPU1RTIE9GRikKKwlT RUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMgorCVdIRVJFIGoxLmIgPSBqMi5iIEFORCAyID0g ajEuYSBBTkQgajEuYyA9IDMgQU5EIGoyLmEgPSAxIEFORCAzID0gajIuYzsKKworQ1JFQVRF IFVOSVFVRSBJTkRFWCBzal90ZW1wX2lkeCBPTiBzaihhLGIpOworCistLSBEb24ndCByZW1v dmUgU0oKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gc2ogajEsIHNqIGoy IFdIRVJFIGoxLmIgPSBqMi5iIEFORCBqMS5hID0gMjsKKworLS0gRG9uJ3QgcmVtb3ZlIFNK CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHNqIGoxLCBzaiBqMiBXSEVS RSBqMS5iID0gajIuYiBBTkQgMiA9IGoyLmE7CisKKy0tIERvbid0IHJlbW92ZSBTSgorRVhQ TEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUICogRlJPTSBzaiBqMSwgc2ogajIgV0hFUkUgajEu YiA9IGoyLmIgQU5EIChqMS5hID0gMSBPUiBqMi5hID0gMSk7CisKK0RST1AgSU5ERVggc2pf Zm5faWR4LCBzal90ZW1wX2lkeDEsIHNqX3RlbXBfaWR4OworCistLSBUZXN0IHRoYXQgT1Ig cHJlZGljYXRlZCBhcmUgdXBkYXRlZCBjb3JyZWN0bHkgYWZ0ZXIgam9pbiByZW1vdmFsCitD UkVBVEUgVEFCTEUgdGFiX3dpdGhfZmxhZyAoIGlkIElOVCBQUklNQVJZIEtFWSwgaXNfZmxh ZyBTTUFMTElOVCk7CitDUkVBVEUgSU5ERVggaWR4X3Rlc3RfaXNfZmxhZyBPTiB0YWJfd2l0 aF9mbGFnIChpc19mbGFnKTsKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIENPVU5U KCopIEZST00gdGFiX3dpdGhfZmxhZworV0hFUkUKKwkoaXNfZmxhZyBJUyBOVUxMIE9SIGlz X2ZsYWcgPSAwKQorCUFORCBpZCBJTiAoU0VMRUNUIGlkIEZST00gdGFiX3dpdGhfZmxhZyBX SEVSRSBpZCBJTiAoMiwgMykpOworRFJPUCBUQUJMRSB0YWJfd2l0aF9mbGFnOworCistLSBI QVZJTkcgY2xhdXNlCitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgcC5iIGZyb20gc2og cCBqb2luIHNqIHEgb24gcC5hID0gcS5hIGdyb3VwIGJ5IHAuYiBoYXZpbmcgc3VtKHAuYSkg PSAxOworCistLSB1cGRhdGUgbGF0ZXJhbCByZWZlcmVuY2VzIGFuZCByYW5nZSB0YWJsZSBl bnRyeSByZWZlcmVuY2UKK2V4cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAx IGZyb20gKHNlbGVjdCB4LiogZnJvbSBzaiB4LCBzaiB5IHdoZXJlIHguYSA9IHkuYSkgcSwK KyAgbGF0ZXJhbCBnZW5lcmF0ZV9zZXJpZXMoMSwgcS5hKSBncyhpKTsKKworZXhwbGFpbiAo dmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0IDEgZnJvbSAoc2VsZWN0IHkuKiBmcm9tIHNq IHgsIHNqIHkgd2hlcmUgeC5hID0geS5hKSBxLAorICBsYXRlcmFsIGdlbmVyYXRlX3Nlcmll cygxLCBxLmEpIGdzKGkpOworCistLSBUZXN0IHRoYXQgYSBub24tRUMtZGVyaXZlZCBqb2lu IGNsYXVzZSBpcyBwcm9jZXNzZWQgY29ycmVjdGx5LiBVc2UgYW4KKy0tIG91dGVyIGpvaW4g c28gdGhhdCB3ZSBjYW4ndCBmb3JtIGFuIEVDLgorZXhwbGFpbiAoY29zdHMgb2ZmKSBzZWxl Y3QgKiBmcm9tIHNqIHAgam9pbiBzaiBxIG9uIHAuYSA9IHEuYQorICBsZWZ0IGpvaW4gc2og ciBvbiBwLmEgKyBxLmEgPSByLmE7CisKKy0tIEZJWE1FIHRoaXMgY29uc3RhbnQgZmFsc2Ug ZmlsdGVyIGRvZXNuJ3QgbG9vayBnb29kLiBTaG91bGQgd2UgbWVyZ2UKKy0tIGVxdWl2YWxl bmNlIGNsYXNzZXM/CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNqIHAs IHNqIHEgd2hlcmUgcC5hID0gcS5hIGFuZCBwLmIgPSAxIGFuZCBxLmIgPSAyOworCistLSBD aGVjayB0aGF0IGF0dHJfbmVlZGVkIGlzIHVwZGF0ZWQgY29ycmVjdGx5IGFmdGVyIHNlbGYt am9pbiByZW1vdmFsLiBJbiB0aGlzCistLSB0ZXN0LCB0aGUgam9pbiBvZiBqMSB3aXRoIGoy IGlzIHJlbW92ZWQuIGsxLmIgaXMgcmVxdWlyZWQgYXQgZWl0aGVyIGoxIG9yIGoyLgorLS0g SWYgdGhpcyBpbmZvIGlzIGxvc3QsIGpvaW4gdGFyZ2V0bGlzdCBmb3IgKGsxLCBrMikgd2ls bCBub3QgY29udGFpbiBrMS5iLgorLS0gVXNlIGluZGV4IHNjYW4gZm9yIGsxIHNvIHRoYXQg d2UgZG9uJ3QgZ2V0ICdiJyBmcm9tIHBoeXNpY2FsIHRsaXN0IHVzZWQgZm9yCistLSBzZXFz Y2FuLiBBbHNvIGRpc2FibGUgcmVvcmRlcmluZyBvZiBqb2lucyBiZWNhdXNlIHRoaXMgdGVz dCBkZXBlbmRzIG9uIGEKKy0tIHBhcnRpY3VsYXIgam9pbiB0cmVlLgorY3JlYXRlIHRhYmxl IHNrIChhIGludCwgYiBpbnQpOworY3JlYXRlIGluZGV4IG9uIHNrKGEpOworc2V0IGpvaW5f Y29sbGFwc2VfbGltaXQgdG8gMTsKK3NldCBlbmFibGVfc2Vxc2NhbiB0byBvZmY7CitleHBs YWluIChjb3N0cyBvZmYpIHNlbGVjdCAxIGZyb20KKwkoc2sgazEgam9pbiBzayBrMiBvbiBr MS5hID0gazIuYSkKKwlqb2luIChzaiBqMSBqb2luIHNqIGoyIG9uIGoxLmEgPSBqMi5hKSBv biBqMS5iID0gazEuYjsKK2V4cGxhaW4gKGNvc3RzIG9mZikgc2VsZWN0IDEgZnJvbQorCShz ayBrMSBqb2luIHNrIGsyIG9uIGsxLmEgPSBrMi5hKQorCWpvaW4gKHNqIGoxIGpvaW4gc2og ajIgb24gajEuYSA9IGoyLmEpIG9uIGoyLmIgPSBrMS5iOworcmVzZXQgam9pbl9jb2xsYXBz ZV9saW1pdDsKK3Jlc2V0IGVuYWJsZV9zZXFzY2FuOworCistLSBDaGVjayB0aGF0IGNsYXVz ZXMgZnJvbSB0aGUgam9pbiBmaWx0ZXIgbGlzdCBpcyBub3QgbG9zdCBvbiB0aGUgc2VsZi1q b2luIHJlbW92YWwKK0NSRUFURSBUQUJMRSBlbXAxIChpZCBTRVJJQUwgUFJJTUFSWSBLRVkg Tk9UIE5VTEwsIGNvZGUgaW50KTsKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NF TEVDVCAqIEZST00gZW1wMSBlMSwgZW1wMSBlMiBXSEVSRSBlMS5pZCA9IGUyLmlkIEFORCBl Mi5jb2RlIDw+IGUxLmNvZGU7CisKKy0tIFNodWZmbGUgc2VsZi1qb2luZWQgcmVsYXRpb25z LiBPbmx5IGluIHRoZSBjYXNlIG9mIGl0ZXJhdGl2ZSBkZWxldGlvbgorLS0gYXR0ZW1wdHMg ZXhwbGFpbnMgb2YgdGhlc2UgcXVlcmllcyB3aWxsIGJlIGlkZW50aWNhbC4KK0NSRUFURSBV TklRVUUgSU5ERVggT04gZW1wMSgoaWQqaWQpKTsKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQor U0VMRUNUIGNvdW50KCopIEZST00gZW1wMSBjMSwgZW1wMSBjMiwgZW1wMSBjMworV0hFUkUg YzEuaWQ9YzIuaWQgQU5EIGMxLmlkKmMyLmlkPWMzLmlkKmMzLmlkOworCitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgY291bnQoKikgRlJPTSBlbXAxIGMxLCBlbXAxIGMyLCBlbXAx IGMzCitXSEVSRSBjMS5pZD1jMy5pZCBBTkQgYzEuaWQqYzMuaWQ9YzIuaWQqYzIuaWQ7CisK K0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBjb3VudCgqKSBGUk9NIGVtcDEgYzEsIGVt cDEgYzIsIGVtcDEgYzMKK1dIRVJFIGMzLmlkPWMyLmlkIEFORCBjMy5pZCpjMi5pZD1jMS5p ZCpjMS5pZDsKKworLS0gQ2hlY2sgdGhlIHVzYWdlIG9mIGEgcGFyc2UgdHJlZSBieSB0aGUg c2V0IG9wZXJhdGlvbnMgKGJ1ZyAjMTgxNzApCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxF Q1QgYzEuY29kZSBGUk9NIGVtcDEgYzEgTEVGVCBKT0lOIGVtcDEgYzIgT04gYzEuaWQgPSBj Mi5pZAorV0hFUkUgYzIuaWQgSVMgTk9UIE5VTEwKK0VYQ0VQVCBBTEwKK1NFTEVDVCBjMy5j b2RlIEZST00gZW1wMSBjMzsKKworLS0gQ2hlY2sgdGhhdCBTSkUgcmVtb3ZlcyByZWZlcmVu Y2VzIGZyb20gUEhWcyBjb3JyZWN0bHkKK2V4cGxhaW4gKGNvc3RzIG9mZikKK3NlbGVjdCAq IGZyb20gZW1wMSB0MSBsZWZ0IGpvaW4KKyAgICAoc2VsZWN0IGNvYWxlc2NlKHQzLmNvZGUs IDEpIGZyb20gZW1wMSB0MgorICAgICAgICBsZWZ0IGpvaW4gKGVtcDEgdDMgam9pbiBlbXAx IHQ0IG9uIHQzLmlkID0gdDQuaWQpCisgICAgICAgIG9uIHRydWUpCitvbiB0cnVlOworCist LSBDaGVjayB0aGF0IFNKRSByZW1vdmVzIHRoZSB3aG9sZSBQSFZzIGNvcnJlY3RseQorZXhw bGFpbiAodmVyYm9zZSwgY29zdHMgb2ZmKQorc2VsZWN0IDEgZnJvbSBlbXAxIHQxIGxlZnQg am9pbgorICAgICgoc2VsZWN0IDEgYXMgeCwgKiBmcm9tIGVtcDEgdDIpIHMxIGlubmVyIGpv aW4KKyAgICAgICAgKHNlbGVjdCAqIGZyb20gZW1wMSB0MykgczIgb24gczEuaWQgPSBzMi5p ZCkKKyAgICBvbiB0cnVlCit3aGVyZSBzMS54ID0gMTsKKworLS0gQ2hlY2sgdGhhdCBQSFZz IGRvIG5vdCBpbXBvc2UgYW55IGNvbnN0cmFpbnRzIG9uIHJlbW92aW5nIHNlbGYgam9pbnMK K2V4cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gZW1wMSB0MSBq b2luIGVtcDEgdDIgb24gdDEuaWQgPSB0Mi5pZCBsZWZ0IGpvaW4KKyAgICBsYXRlcmFsIChz ZWxlY3QgdDEuaWQgYXMgdDFpZCwgKiBmcm9tIGdlbmVyYXRlX3NlcmllcygxLDEpIHQzKSBz IG9uIHRydWU7CisKK2V4cGxhaW4gKHZlcmJvc2UsIGNvc3RzIG9mZikKK3NlbGVjdCAqIGZy b20gZ2VuZXJhdGVfc2VyaWVzKDEsMTApIHQxKGlkKSBsZWZ0IGpvaW4KKyAgICBsYXRlcmFs IChzZWxlY3QgdDEuaWQgYXMgdDFpZCwgdDIuaWQgZnJvbSBlbXAxIHQyIGpvaW4gZW1wMSB0 MyBvbiB0Mi5pZCA9IHQzLmlkKQorb24gdHJ1ZTsKKworLS0gQ2hlY2sgdGhhdCBTSkUgcmVw bGFjZXMgam9pbiBjbGF1c2VzIGludm9sdmluZyB0aGUgcmVtb3ZlZCByZWwgY29ycmVjdGx5 CitleHBsYWluIChjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIGVtcDEgdDEKKyAgIGlubmVy IGpvaW4gZW1wMSB0MiBvbiB0MS5pZCA9IHQyLmlkCisgICAgbGVmdCBqb2luIGVtcDEgdDMg b24gdDEuaWQgPiAxIGFuZCB0MS5pZCA8IDI7CisKKy0tIENoZWNrIHRoYXQgU0pFIGRvZXNu J3QgcmVwbGFjZSB0aGUgdGFyZ2V0IHJlbGF0aW9uCitFWFBMQUlOIChDT1NUUyBPRkYpCitX SVRIIHQxIEFTIChTRUxFQ1QgKiBGUk9NIGVtcDEpCitVUERBVEUgZW1wMSBTRVQgY29kZSA9 IHQxLmNvZGUgKyAxIEZST00gdDEKK1dIRVJFIHQxLmlkID0gZW1wMS5pZCBSRVRVUk5JTkcg ZW1wMS5pZCwgZW1wMS5jb2RlLCB0MS5jb2RlOworCitJTlNFUlQgSU5UTyBlbXAxIFZBTFVF UyAoMSwgMSksICgyLCAxKTsKKworV0lUSCB0MSBBUyAoU0VMRUNUICogRlJPTSBlbXAxKQor VVBEQVRFIGVtcDEgU0VUIGNvZGUgPSB0MS5jb2RlICsgMSBGUk9NIHQxCitXSEVSRSB0MS5p ZCA9IGVtcDEuaWQgUkVUVVJOSU5HIGVtcDEuaWQsIGVtcDEuY29kZSwgdDEuY29kZTsKKwor VFJVTkNBVEUgZW1wMTsKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorVVBEQVRFIHNqIHNxIFNF VCBiID0gMSBGUk9NIHNqIGFzIHN6IFdIRVJFIHNxLmEgPSBzei5hOworCitDUkVBVEUgUlVM RSBzal9kZWxfcnVsZSBBUyBPTiBERUxFVEUgVE8gc2oKKyAgRE8gSU5TVEVBRAorICAgIFVQ REFURSBzaiBTRVQgYSA9IDEgV0hFUkUgYSA9IG9sZC5hOworRVhQTEFJTiAoQ09TVFMgT0ZG KSBERUxFVEUgRlJPTSBzajsKK0RST1AgUlVMRSBzal9kZWxfcnVsZSBPTiBzaiBDQVNDQURF OworCistLSBDaGVjayB0aGF0IFNKRSBkb2VzIG5vdCBtaXN0YWtlbmx5IG9taXQgcXVhbCBj bGF1c2VzIChidWcgIzE4MTg3KQoraW5zZXJ0IGludG8gZW1wMSB2YWx1ZXMgKDEsIDEpOwor ZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0IDEgZnJvbSBlbXAxIGZ1bGwgam9pbgorICAg IChzZWxlY3QgKiBmcm9tIGVtcDEgdDEgam9pbgorICAgICAgICBlbXAxIHQyIGpvaW4gZW1w MSB0MyBvbiB0Mi5pZCA9IHQzLmlkCisgICAgICAgIG9uIHRydWUKKyAgICB3aGVyZSBmYWxz ZSkgcyBvbiB0cnVlCit3aGVyZSBmYWxzZTsKK3NlbGVjdCAxIGZyb20gZW1wMSBmdWxsIGpv aW4KKyAgICAoc2VsZWN0ICogZnJvbSBlbXAxIHQxIGpvaW4KKyAgICAgICAgZW1wMSB0MiBq b2luIGVtcDEgdDMgb24gdDIuaWQgPSB0My5pZAorICAgICAgICBvbiB0cnVlCisgICAgd2hl cmUgZmFsc2UpIHMgb24gdHJ1ZQord2hlcmUgZmFsc2U7CisKKy0tIENoZWNrIHRoYXQgU0pF IGRvZXMgbm90IG1pc3Rha2VubHkgcmUtdXNlIGtub3dsZWRnZSBvZiByZWxhdGlvbiB1bmlx dWVuZXNzCistLSBtYWRlIHdpdGggZGlmZmVyZW50IHNldCBvZiBxdWFscworaW5zZXJ0IGlu dG8gZW1wMSB2YWx1ZXMgKDIsIDEpOworZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICog ZnJvbSBlbXAxIHQxIHdoZXJlIGV4aXN0cyAoc2VsZWN0ICogZnJvbSBlbXAxIHQyCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB0Mi5pZCA9IHQxLmNvZGUg YW5kIHQyLmNvZGUgPiAwKTsKK3NlbGVjdCAqIGZyb20gZW1wMSB0MSB3aGVyZSBleGlzdHMg KHNlbGVjdCAqIGZyb20gZW1wMSB0MgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgd2hlcmUgdDIuaWQgPSB0MS5jb2RlIGFuZCB0Mi5jb2RlID4gMCk7CisKKy0tIFdl IGNhbiByZW1vdmUgdGhlIGpvaW4gZXZlbiBpZiB3ZSBmaW5kIHRoZSBqb2luIGNhbid0IGR1 cGxpY2F0ZSByb3dzIGFuZAorLS0gdGhlIGJhc2UgcXVhbHMgb2YgZWFjaCBzaWRlIGFyZSBk aWZmZXJlbnQuICBJbiB0aGUgZm9sbG93aW5nIGNhc2Ugd2UgZW5kIHVwCistLSBtb3Zpbmcg cXVhbHMgb3ZlciB0byBzMSB0byBtYWtlIGl0IHNvIGl0IGNhbid0IG1hdGNoIGFueSByb3dz LgorY3JlYXRlIHRhYmxlIHNsKGEgaW50LCBiIGludCwgYyBpbnQpOworY3JlYXRlIHVuaXF1 ZSBpbmRleCBvbiBzbChhLCBiKTsKK3ZhY3V1bSBhbmFseXplIHNsOworCistLSBCb3RoIHNp ZGVzIGFyZSB1bmlxdWUsIGJ1dCBiYXNlIHF1YWxzIGFyZSBkaWZmZXJlbnQKK2V4cGxhaW4g KGNvc3RzIG9mZikKK3NlbGVjdCAqIGZyb20gc2wgdDEsIHNsIHQyIHdoZXJlIHQxLmEgPSB0 Mi5hIGFuZCB0MS5iID0gMSBhbmQgdDIuYiA9IDI7CisKKy0tIENoZWNrIE51bGxUZXN0IGlu IGJhc2VyZXN0cmljdGluZm8gbGlzdAorZXhwbGFpbiAoY29zdHMgb2ZmKQorc2VsZWN0ICog ZnJvbSBzbCB0MSwgc2wgdDIKK3doZXJlIHQxLmEgPSB0Mi5hIGFuZCB0MS5iID0gMSBhbmQg dDIuYiA9IDIKKyAgYW5kIHQxLmMgSVMgTk9UIE5VTEwgYW5kIHQyLmMgSVMgTk9UIE5VTEwK KyAgYW5kIHQyLmIgSVMgTk9UIE5VTEwgYW5kIHQxLmIgSVMgTk9UIE5VTEwKKyAgYW5kIHQx LmEgSVMgTk9UIE5VTEwgYW5kIHQyLmEgSVMgTk9UIE5VTEw7CitleHBsYWluICh2ZXJib3Nl LCBjb3N0cyBvZmYpCitzZWxlY3QgKiBmcm9tIHNsIHQxLCBzbCB0Mgord2hlcmUgdDEuYiA9 IHQyLmIgYW5kIHQyLmEgPSAzIGFuZCB0MS5hID0gMworICBhbmQgdDEuYyBJUyBOT1QgTlVM TCBhbmQgdDIuYyBJUyBOT1QgTlVMTAorICBhbmQgdDIuYiBJUyBOT1QgTlVMTCBhbmQgdDEu YiBJUyBOT1QgTlVMTAorICBhbmQgdDEuYSBJUyBOT1QgTlVMTCBhbmQgdDIuYSBJUyBOT1Qg TlVMTDsKKworLS0gSm9pbiBxdWFsIGlzbid0IG1lcmdlam9pbmFibGUsIGJ1dCBpbm5lciBp cyB1bmlxdWUuCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgbjIuYSBGUk9NIHNqIG4x LCBzaiBuMiBXSEVSRSBuMS5hIDw+IG4yLmEgQU5EIG4yLmEgPSAxOworCitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NCisoU0VMRUNUIG4yLmEgRlJPTSBzaiBuMSwgc2og bjIgV0hFUkUgbjEuYSA8PiBuMi5hKSBxMCwgc2wKK1dIRVJFIHEwLmEgPSAxOworCistLSBD aGVjayBvcHRpbWl6YXRpb24gZGlzYWJsaW5nIGlmIGl0IHdpbGwgdmlvbGF0ZSBzcGVjaWFs IGpvaW4gY29uZGl0aW9ucy4KKy0tIFR3byBpZGVudGljYWwgam9pbmVkIHJlbGF0aW9ucyBz YXRpc2ZpZXMgc2VsZiBqb2luIHJlbW92YWwgY29uZGl0aW9ucyBidXQKKy0tIHN0YXkgaW4g ZGlmZmVyZW50IHNwZWNpYWwgam9pbiBpbmZvcy4KK0NSRUFURSBUQUJMRSBzal90MSAoaWQg c2VyaWFsLCBhIGludCk7CitDUkVBVEUgVEFCTEUgc2pfdDIgKGlkIHNlcmlhbCwgYSBpbnQp OworQ1JFQVRFIFRBQkxFIHNqX3QzIChpZCBzZXJpYWwsIGEgaW50KTsKK0NSRUFURSBUQUJM RSBzal90NCAoaWQgc2VyaWFsLCBhIGludCk7CisKK0NSRUFURSBVTklRVUUgSU5ERVggT04g c2pfdDMgVVNJTkcgYnRyZWUgKGEsaWQpOworQ1JFQVRFIFVOSVFVRSBJTkRFWCBPTiBzal90 MiBVU0lORyBidHJlZSAoaWQpOworCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgKiBG Uk9NIHNqX3QxCitKT0lOICgKKwlTRUxFQ1Qgc2pfdDIuaWQgQVMgaWQgRlJPTSBzal90Mgor CVdIRVJFIEVYSVNUUworCQkoCisJCVNFTEVDVCBUUlVFIEZST00gc2pfdDMsc2pfdDQgV0hF UkUgc2pfdDMuYSA9IDEgQU5EIHNqX3QzLmlkID0gc2pfdDIuaWQKKwkJKQorCSkgdDJ0M3Q0 CitPTiBzal90MS5pZCA9IHQydDN0NC5pZAorSk9JTiAoCisJU0VMRUNUIHNqX3QyLmlkIEFT IGlkIEZST00gc2pfdDIKKwlXSEVSRSBFWElTVFMKKwkJKAorCQlTRUxFQ1QgVFJVRSBGUk9N IHNqX3QzLHNqX3Q0IFdIRVJFIHNqX3QzLmEgPSAxIEFORCBzal90My5pZCA9IHNqX3QyLmlk CisJCSkKKwkpIF90MnQzdDQKK09OIHNqX3QxLmlkID0gX3QydDN0NC5pZDsKKworLS0KKy0t IFRlc3QgUm93TWFya3MtcmVsYXRlZCBjb2RlCistLQorCistLSBCb3RoIHNpZGVzIGhhdmUg ZXhwbGljaXQgTG9ja1Jvd3MgbWFya3MKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBh MS5hIEZST00gc2ogYTEsc2ogYTIgV0hFUkUgKGExLmE9YTIuYSkgRk9SIFVQREFURTsKKwor cmVzZXQgZW5hYmxlX2hhc2hqb2luOworcmVzZXQgZW5hYmxlX21lcmdlam9pbjsKKwogLS0K IC0tIFRlc3QgaGludHMgZ2l2ZW4gb24gaW5jb3JyZWN0IGNvbHVtbiByZWZlcmVuY2VzIGFy ZSB1c2VmdWwKIC0tCmRpZmYgLS1naXQgYS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMu bGlzdCBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CmluZGV4IGM0ZGU1OTdi MWYuLjAzNmUyZDcxN2IgMTAwNjQ0Ci0tLSBhL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVm cy5saXN0CisrKyBiL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CkBAIC0zOTEs NiArMzkxLDcgQEAgQ2F0YWxvZ0lkCiBDYXRhbG9nSWRNYXBFbnRyeQogQ2F0YWxvZ0luZGV4 U3RhdGUKIENoYW5nZVZhck5vZGVzX2NvbnRleHQKK1JlcGxhY2VWYXJub0NvbnRleHQKIENo ZWNrUG9pbnQKIENoZWNrUG9pbnRTdG10CiBDaGVja3BvaW50U3RhdHNEYXRhCkBAIC0yNTcz LDYgKzI1NzQsNyBAQCBTZWVuUmVsc0VudHJ5CiBTZWxlY3RMaW1pdAogU2VsZWN0U3RtdAog U2VsZWN0aXZpdHkKK1NlbGZKb2luQ2FuZGlkYXRlCiBTZW1UUGFkZGVkCiBTZW1pQW50aUpv aW5GYWN0b3JzCiBTZXFTY2FuCkBAIC00MDE2LDYgKzQwMTgsNyBAQCB1bmljb2RlU3R5bGVD b2x1bW5Gb3JtYXQKIHVuaWNvZGVTdHlsZUZvcm1hdAogdW5pY29kZVN0eWxlUm93Rm9ybWF0 CiB1bmljb2RlX2xpbmVzdHlsZQorVW5pcXVlUmVsSW5mbwogdW5pdF9jb252ZXJzaW9uCiB1 bmxvZ2dlZF9yZWxhdGlvbl9lbnRyeQogdXRmX2xvY2FsX2NvbnZlcnNpb25fZnVuYwotLSAK Mi4zOS41Cgo= --------------oJP06AU0YnCpwIpPfnvIobDI--