From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 397B93858D28 for ; Wed, 23 Nov 2022 11:16:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 397B93858D28 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1669202212; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=WCsP6swe1WBUrb3BusaCyMeBS0gm3e6AjhD5oBc+yvo=; b=QJBIFWbrzr5x0W7sHaQuKR/LrWvAaADjlPIExFY6BJ4Mkxtv96N9DjL271uYWs1zX5wDWz YnTUWKE0/She1fZrEUhiI7jGRUCYSoVxb0I+qLB9AHEfNHMta35faypEvo1c2SRZf9eD8U iqHJMPA4jwbv7EvKAWy9iRsNshc93y0= Received: from mail-yb1-f198.google.com (mail-yb1-f198.google.com [209.85.219.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-513-RJFmiGmUP5WeIMXMuMb88g-1; Wed, 23 Nov 2022 06:16:48 -0500 X-MC-Unique: RJFmiGmUP5WeIMXMuMb88g-1 Received: by mail-yb1-f198.google.com with SMTP id s45-20020a252d6d000000b006ef41900103so2780541ybe.13 for ; Wed, 23 Nov 2022 03:16:47 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=WCsP6swe1WBUrb3BusaCyMeBS0gm3e6AjhD5oBc+yvo=; b=p5c8MKrCgQeQeG3OQSLH8ki/ZOiUu2wCk+S5jW15FtCjAeGeedE1+yi5vpkBMyHOut QxzkAwj4D3UgNKmoI7bEhi4iS/f8OtBpX7EtxwPG5IC+F62oLTIH14JHbCcTZFlyExi0 oT394BVoMQimCQbEy2OmjFFGJAfdfaVGt5rIf1VltIO49bEWvkvAv2M68OUDNzg6AIsn ttD0EGAQHK+Q9gL6U1RqfVSyLHnw2SWbcrOJcUZIaMjnQ7bLRB13i1loFwiI538nB10q N+GQFzA6tNNvKCdWSHpQjawsU+TVd9nfSWCtmprMZdIxNty0aSgALAM7POI0Rq/+209v ccvw== X-Gm-Message-State: ANoB5pn5ESB77ovrsOZ4Zj0nt1M6VEShk/GU394uCrBPPzYoVsiuQMLX o/OsCo1+RreHQ8VM5QusTQLpbq9L41SATg3fzfx4C1G6AUwoJnEFjgrBQnf4qRPiTEldcltYLq+ GYtI8hjAls8KT5ZJnKpWK5vQ8jEqezhG58g== X-Received: by 2002:a25:2d44:0:b0:6f0:6dfa:c762 with SMTP id s4-20020a252d44000000b006f06dfac762mr917013ybe.109.1669202207437; Wed, 23 Nov 2022 03:16:47 -0800 (PST) X-Google-Smtp-Source: AA0mqf7O4xsf+z+pvYOF/qHkR8PYQxK5KP/cN+J5rEzYFBy98X1HzK9ef4InVqo4vkPGFDlVRnEdWudTFd9DSRlwy7c= X-Received: by 2002:a25:2d44:0:b0:6f0:6dfa:c762 with SMTP id s4-20020a252d44000000b006f06dfac762mr916992ybe.109.1669202207130; Wed, 23 Nov 2022 03:16:47 -0800 (PST) MIME-Version: 1.0 References: <2eb36356-ffbf-6c8b-2824-08e204280d52@gmail.com> <84f3725f-7635-2ff1-22d7-1dcdb544cdfd@redhat.com> In-Reply-To: <84f3725f-7635-2ff1-22d7-1dcdb544cdfd@redhat.com> From: Aldy Hernandez Date: Wed, 23 Nov 2022 12:16:36 +0100 Message-ID: Subject: Re: [PATCH] Remove legacy VRP (maybe?) To: Richard Biener Cc: Jeff Law , Jakub Jelinek , "MacLeod, Andrew" , gcc-patches X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/mixed; boundary="0000000000009d9cf905ee216c6c" X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --0000000000009d9cf905ee216c6c Content-Type: text/plain; charset="UTF-8" Tell you what... the only thing that's not painfully obvious in my patchset is that I'm removing irange::symbolic_p() in my first patch. I can revert that bit and re-test the entire set. That way, there won't be anything remotely controversial. We can wait until next year, remove symbolic_p() and put a big fat assert in the setter to make sure nothing ever creeps in there. Just trying to make the transition / review easier ;-). Aldy On Tue, Nov 22, 2022 at 2:40 PM Aldy Hernandez wrote: > > > > On 11/22/22 10:22, Richard Biener wrote: > > On Tue, Nov 22, 2022 at 10:04 AM Aldy Hernandez wrote: > >> > >> > >> > >> On 11/22/22 09:25, Richard Biener wrote: > >>> On Tue, Nov 22, 2022 at 9:24 AM Richard Biener > >>> wrote: > >>>> > >>>> On Mon, Nov 21, 2022 at 5:49 PM Jeff Law wrote: > >>>>> > >>>>> > >>>>> On 11/21/22 09:35, Aldy Hernandez via Gcc-patches wrote: > >>>>>> I've been playing around with removing the legacy VRP code for the > >>>>>> next release. It's a layered onion to get this right, but the first > >>>>>> bit is pretty straightforward and may be useful for this release. > >>>>>> Basically, it entails removing the old VRP pass itself, along with > >>>>>> value_range_equiv which have no producers left. The current users of > >>>>>> value_range_equiv don't put anything in the equivalence bitmaps, so > >>>>>> they're basically behaving like plain value_range. > >>>>>> > >>>>>> I removed as much as possible without having to change any behavior, > >>>>>> and this is what I came up with. Is this something that would be > >>>>>> useful for this release? Would it help release managers have less > >>>>>> unused cruft in the tree? > >>>>>> > >>>>>> Neither Andrew nor I have any strong feelings here. We don't foresee > >>>>>> the legacy code changing at all in the offseason, so we can just > >>>>>> accumulate these patches in local trees. > >>>>> > >>>>> I'd lean towards removal after gcc-13 releases. > >>>> > >>>> I think removing the ability to switch to the old implementation easens > >>>> maintainance so I'd prefer to have this before the gcc-13 release. > >>>> > >>>> So please go ahead. > >>> > >>> Btw, ASSERT_EXPR should also go away with this, no? > >> > >> Ah yes, for everything except ipa-*.* which uses it internally (and sets > >> it in its internal structures): > >> > >> - ASSERT_EXPR means that only the value in operand is allowed to > >> pass > >> through (without any change), for all other values the result is > >> unknown. > > > > Ick. But yeah, I can see how 'ASSERT_EXPR' looked nice to use here > > (but it's only a distinct value, so TARGET_OPTION_NODE would have > > worked here as well) > > > >> I can remove all other uses, including any externally visible documentation. > > > > Works for me. > > Documented and added change log entries. Retested on x86-64 Linux. > > There are three follow-up patches removing ASSERT_EXPR which I'll post > shortly. > > OK for trunk? > > Aldy --0000000000009d9cf905ee216c6c Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Remove-unused-legacy-VRP-code.patch" Content-Disposition: attachment; filename="0001-Remove-unused-legacy-VRP-code.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_latjqmsr0 RnJvbSA3NGM4NjgzZTEyY2E0NzQ1M2NlOGU2MTFjZmM3Yzc4NGI3YWVkNmNjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGR5IEhlcm5hbmRleiA8YWxkeWhAcmVkaGF0LmNvbT4KRGF0 ZTogU2F0LCAxOSBOb3YgMjAyMiAxMToxMToyNSArMDEwMApTdWJqZWN0OiBbUEFUQ0hdIFJlbW92 ZSB1bnVzZWQgbGVnYWN5IFZSUCBjb2RlLgoKUmVtb3ZlcyB1bnVzZWQgbGVnYWN5IFZSUCBjb2Rl LiAgVGhlIGxlZ2FjeSBtb2RlIGluIHZhbHVlX3JhbmdlJ3MgaXMKc3RpbGwgYXJvdW5kLCBhcyBp dCBjYW4ndCBiZSB0cml2aWFsbHkgZGVsZXRlZC4KCldpdGggdGhpcyBwYXRjaCB2ci12YWx1ZXMu Y2MgbWVsdHMgYXdheSB0byBzaW1wbGlmeV91c2luZ19yYW5nZXMsIGJ1dApJIGhhdmUgYXZvaWRl ZCBhbnkgcmVuYW1pbmcgb2YgYWN0dWFsIGZpbGVzLCBzaW5jZSB3ZSBoYXZlIHBsYW5zIGZvcgpj b25zb2xpZGF0aW9uIG9mIG90aGVyIGZvbGRpbmcgd2l0aCByYW5nZXMgZm9yIHRoZSBuZXh0IHJl bGVhc2UuCgpnY2MvQ2hhbmdlTG9nOgoKCSogZG9jL2ludm9rZS50ZXhpOiBSZW1vdmUgZG9jcyBm b3IgbWF4LXZycC1zd2l0Y2gtYXNzZXJ0aW9ucywKCXZycDEtbW9kZSwgYW5kIHZycDItbW9kZS4K CSogcGFyYW1zLm9wdDogU2FtZS4KCSogcmFuZ2Utb3AuY2MgKG1hc2tlZF9pbmNyZW1lbnQpOiBN b3ZlIGZyb20gdHJlZS12cnAuY2MuCgkqIHRyZWUtdnJwLmNjIChjbGFzcyBsaXZlX25hbWVzKTog UmVtb3ZlLgoJKGxpdmVfbmFtZXM6OmluaXRfYml0bWFwX2lmX25lZWRlZCk6IFJlbW92ZS4KCShs aXZlX25hbWVzOjpibG9ja19oYXNfbGl2ZV9uYW1lc19wKTogUmVtb3ZlLgoJKGxpdmVfbmFtZXM6 OmNsZWFyX2Jsb2NrKTogUmVtb3ZlLgoJKGxpdmVfbmFtZXM6Om1lcmdlKTogUmVtb3ZlLgoJKGxp dmVfbmFtZXM6OnNldCk6IFJlbW92ZS4KCShsaXZlX25hbWVzOjpjbGVhcik6IFJlbW92ZS4KCShs aXZlX25hbWVzOjpsaXZlX25hbWVzKTogUmVtb3ZlLgoJKGxpdmVfbmFtZXM6On5saXZlX25hbWVz KTogUmVtb3ZlLgoJKGxpdmVfbmFtZXM6OmxpdmVfb25fYmxvY2tfcCk6IFJlbW92ZS4KCShsaXZl X25hbWVzOjpsaXZlX29uX2VkZ2VfcCk6IFJlbW92ZS4KCShnZXRfc2luZ2xlX3N5bWJvbCk6IE1h a2Ugc3RhdGljLgoJKGJ1aWxkX3N5bWJvbGljX2V4cHIpOiBSZW1vdmUuCgkoYWRqdXN0X3N5bWJv bGljX2JvdW5kKTogUmVtb3ZlLgoJKGNvbWJpbmVfYm91bmQpOiBSZW1vdmUuCgkoc2V0X3ZhbHVl X3JhbmdlX3dpdGhfb3ZlcmZsb3cpOiBSZW1vdmUuCgkoZXh0cmFjdF9yYW5nZV9mcm9tX3BvaW50 ZXJfcGx1c19leHByKTogUmVtb3ZlLgoJKGV4dHJhY3RfcmFuZ2VfZnJvbV9wbHVzX21pbnVzX2V4 cHIpOiBSZW1vdmUuCgkoZHJvcF91bmRlZmluZXNfdG9fdmFyeWluZyk6IFJlbW92ZS4KCShyYW5n ZV9mb2xkX2JpbmFyeV9zeW1ib2xpY3NfcCk6IFJlbW92ZS4KCShyYW5nZV9mb2xkX3VuYXJ5X3N5 bWJvbGljc19wKTogUmVtb3ZlLgoJKHJhbmdlX2ZvbGRfYmluYXJ5X2V4cHIpOiBSZW1vdmUuCgko aW5mZXJfdmFsdWVfcmFuZ2UpOiBSZW1vdmUuCgkoZHVtcF9hc3NlcnRfaW5mbyk6IFJlbW92ZS4K CShkdW1wX2Fzc2VydHNfaW5mbyk6IFJlbW92ZS4KCShhZGRfYXNzZXJ0X2luZm8pOiBSZW1vdmUu CgkoZXh0cmFjdF9jb2RlX2FuZF92YWxfZnJvbV9jb25kX3dpdGhfb3BzKTogUmVtb3ZlLgoJKG1h c2tlZF9pbmNyZW1lbnQpOiBNb3ZlIHRvIHJhbmdlLW9wLmNjLgoJKHJlZ2lzdGVyX2VkZ2VfYXNz ZXJ0X2Zvcl8yKTogUmVtb3ZlLgoJKGZpbmRfY2FzZV9sYWJlbF9pbmRleCk6IFJlbW92ZS4KCShm aW5kX2Nhc2VfbGFiZWxfcmFuZ2UpOiBSZW1vdmUuCgkocmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9y XzEpOiBSZW1vdmUuCgkoaXNfbWFza2VkX3JhbmdlX3Rlc3QpOiBSZW1vdmUuCgkocmVnaXN0ZXJf ZWRnZV9hc3NlcnRfZm9yKTogUmVtb3ZlLgoJKHN0bXRfaW50ZXJlc3RpbmdfZm9yX3ZycCk6IFJl bW92ZS4KCShzdHJ1Y3QgY2FzZV9pbmZvKTogUmVtb3ZlLgoJKHN0cnVjdCBhc3NlcnRfbG9jdXMp OiBSZW1vdmUuCgkoY2xhc3MgdnJwX2Fzc2VydHMpOiBSZW1vdmUuCgkodnJwX2Fzc2VydHM6OmJ1 aWxkX2Fzc2VydF9leHByX2Zvcik6IFJlbW92ZS4KCSh2cnBfYXNzZXJ0czo6ZHVtcCk6IFJlbW92 ZS4KCSh2cnBfYXNzZXJ0czo6cmVnaXN0ZXJfbmV3X2Fzc2VydF9mb3IpOiBSZW1vdmUuCgkodnJw X2Fzc2VydHM6OmZpbmlzaF9yZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3IpOiBSZW1vdmUuCgkodnJw X2Fzc2VydHM6OmZpbmRfY29uZGl0aW9uYWxfYXNzZXJ0cyk6IFJlbW92ZS4KCSh2cnBfYXNzZXJ0 czo6Y29tcGFyZV9jYXNlX2xhYmVscyk6IFJlbW92ZS4KCSh2cnBfYXNzZXJ0czo6ZmluZF9zd2l0 Y2hfYXNzZXJ0cyk6IFJlbW92ZS4KCSh2cnBfYXNzZXJ0czo6ZmluZF9hc3NlcnRfbG9jYXRpb25z X2luX2JiKTogUmVtb3ZlLgoJKHZycF9hc3NlcnRzOjpmaW5kX2Fzc2VydF9sb2NhdGlvbnMpOiBS ZW1vdmUuCgkodnJwX2Fzc2VydHM6OnByb2Nlc3NfYXNzZXJ0X2luc2VydGlvbnNfZm9yKTogUmVt b3ZlLgoJKHZycF9hc3NlcnRzOjpjb21wYXJlX2Fzc2VydF9sb2MpOiBSZW1vdmUuCgkodnJwX2Fz c2VydHM6OnByb2Nlc3NfYXNzZXJ0X2luc2VydGlvbnMpOiBSZW1vdmUuCgkodnJwX2Fzc2VydHM6 Omluc2VydF9yYW5nZV9hc3NlcnRpb25zKTogUmVtb3ZlLgoJKHZycF9hc3NlcnRzOjphbGxfaW1t X3VzZXNfaW5fc3RtdF9vcl9mZWVkX2NvbmQpOiBSZW1vdmUuCgkodnJwX2Fzc2VydHM6OnJlbW92 ZV9yYW5nZV9hc3NlcnRpb25zKTogUmVtb3ZlLgoJKGNsYXNzIHZycF9wcm9wKTogUmVtb3ZlLgoJ KHZycF9wcm9wOjppbml0aWFsaXplKTogUmVtb3ZlLgoJKGVudW0gc3NhX3Byb3BfcmVzdWx0KTog UmVtb3ZlLgoJKHZycF9wcm9wOjp2aXNpdF9zdG10KTogUmVtb3ZlLgoJKHZycF9wcm9wOjp2aXNp dF9waGkpOiBSZW1vdmUuCgkodnJwX3Byb3A6OmZpbmFsaXplKTogUmVtb3ZlLgoJKGNsYXNzIHZy cF9mb2xkZXIpOiBSZW1vdmUuCgkodnJwX2ZvbGRlcjo6Zm9sZF9wcmVkaWNhdGVfaW4pOiBSZW1v dmUuCgkodnJwX2ZvbGRlcjo6Zm9sZF9zdG10KTogUmVtb3ZlLgoJKHZycF9mb2xkZXI6OnNpbXBs aWZ5X2Nhc3RlZF9jb25kcyk6IFJlbW92ZS4KCShleGVjdXRlX3ZycCk6IFJlbW92ZS4KCSogdHJl ZS12cnAuaCAoc3RydWN0IGFzc2VydF9pbmZvKTogUmVtb3ZlLgoJKHJlZ2lzdGVyX2VkZ2VfYXNz ZXJ0X2Zvcik6IFJlbW92ZS4KCShzdG10X2ludGVyZXN0aW5nX2Zvcl92cnApOiBSZW1vdmUuCgko aW5mZXJfdmFsdWVfcmFuZ2UpOiBSZW1vdmUuCgkoZ2V0X3NpbmdsZV9zeW1ib2wpOiBSZW1vdmUu CgkobWFza2VkX2luY3JlbWVudCk6IFJlbW92ZS4KCShleGVjdXRlX3Jhbmdlcl92cnApOiBSZW1v dmUuCgkqIHZyLXZhbHVlcy5jYyAoc2V0X3ZhbHVlX3JhbmdlX3RvX25vbm5lZ2F0aXZlKTogUmVt b3ZlLgoJKHNldF92YWx1ZV9yYW5nZV90b190cnV0aHZhbHVlKTogUmVtb3ZlLgoJKHZyX3ZhbHVl czo6Z2V0X2xhdHRpY2VfZW50cnkpOiBSZW1vdmUuCgkodnJfdmFsdWVzOjpnZXRfdmFsdWVfcmFu Z2UpOiBSZW1vdmUuCgkodnJfdmFsdWVzOjpyYW5nZV9vZl9leHByKTogUmVtb3ZlLgoJKHZyX3Zh bHVlczo6dmFsdWVfb2ZfZXhwcik6IFJlbW92ZS4KCSh2cl92YWx1ZXM6OnZhbHVlX29uX2VkZ2Up OiBSZW1vdmUuCgkodnJfdmFsdWVzOjp2YWx1ZV9vZl9zdG10KTogUmVtb3ZlLgoJKHZyX3ZhbHVl czo6c2V0X2RlZl90b192YXJ5aW5nKTogUmVtb3ZlLgoJKHZyX3ZhbHVlczo6c2V0X2RlZnNfdG9f dmFyeWluZyk6IFJlbW92ZS4KCSh2cl92YWx1ZXM6OnVwZGF0ZV92YWx1ZV9yYW5nZSk6IFJlbW92 ZS4KCShzeW1ib2xpY19yYW5nZV9iYXNlZF9vbl9wKTogUmVtb3ZlLgoJKGdpbXBsZV9hc3NpZ25f bm9uemVyb19wKTogUmVtb3ZlLgoJKGdpbXBsZV9zdG10X25vbnplcm9fcCk6IFJlbW92ZS4KCSh2 cl92YWx1ZXM6OnZycF9zdG10X2NvbXB1dGVzX25vbnplcm8pOiBSZW1vdmUuCgkodnJfdmFsdWVz OjpvcF93aXRoX2NvbnN0YW50X3NpbmdsZXRvbl92YWx1ZV9yYW5nZSk6IFJlbW92ZS4KCSh2cl92 YWx1ZXM6OmV4dHJhY3RfcmFuZ2VfZm9yX3Zhcl9mcm9tX2NvbXBhcmlzb25fZXhwcik6IFJlbW92 ZS4KCSh2cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2VfZnJvbV9hc3NlcnQpOiBSZW1vdmUuCgkodnJf dmFsdWVzOjpleHRyYWN0X3JhbmdlX2Zyb21fc3NhX25hbWUpOiBSZW1vdmUuCgkodnJfdmFsdWVz OjpleHRyYWN0X3JhbmdlX2Zyb21fYmluYXJ5X2V4cHIpOiBSZW1vdmUuCgkodnJfdmFsdWVzOjpl eHRyYWN0X3JhbmdlX2Zyb21fdW5hcnlfZXhwcik6IFJlbW92ZS4KCSh2cl92YWx1ZXM6OmV4dHJh Y3RfcmFuZ2VfZnJvbV9jb25kX2V4cHIpOiBSZW1vdmUuCgkodnJfdmFsdWVzOjpleHRyYWN0X3Jh bmdlX2Zyb21fY29tcGFyaXNvbik6IFJlbW92ZS4KCSh2cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2Vf ZnJvbV91YnNhbl9idWlsdGluKTogUmVtb3ZlLgoJKHZyX3ZhbHVlczo6ZXh0cmFjdF9yYW5nZV9i YXNpYyk6IFJlbW92ZS4KCSh2cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2VfZnJvbV9hc3NpZ25tZW50 KTogUmVtb3ZlLgoJKHZyX3ZhbHVlczo6YWRqdXN0X3JhbmdlX3dpdGhfc2Nldik6IFJlbW92ZS4K CSh2cl92YWx1ZXM6OmR1bXApOiBSZW1vdmUuCgkodnJfdmFsdWVzOjp2cl92YWx1ZXMpOiBSZW1v dmUuCgkodnJfdmFsdWVzOjp+dnJfdmFsdWVzKTogUmVtb3ZlLgoJKHZycF92YWx1ZWl6ZSk6IFJl bW92ZS4KCSh2cnBfdmFsdWVpemVfMSk6IFJlbW92ZS4KCShnZXRfb3V0cHV0X2Zvcl92cnApOiBS ZW1vdmUuCgkodnJfdmFsdWVzOjp2cnBfdmlzaXRfYXNzaWdubWVudF9vcl9jYWxsKTogUmVtb3Zl LgoJKHNpbXBsaWZ5X3VzaW5nX3Jhbmdlczo6dnJwX2V2YWx1YXRlX2NvbmRpdGlvbmFsKTogUmVt b3ZlLgoJKHZyX3ZhbHVlczo6dnJwX3Zpc2l0X3N3aXRjaF9zdG10KTogUmVtb3ZlLgoJKHZyX3Zh bHVlczo6ZXh0cmFjdF9yYW5nZV9mcm9tX3N0bXQpOiBSZW1vdmUuCgkodnJfdmFsdWVzOjpleHRy YWN0X3JhbmdlX2Zyb21fcGhpX25vZGUpOiBSZW1vdmUuCgkoc2ltcGxpZnlfdXNpbmdfcmFuZ2Vz Ojpmb2xkX2NvbmQpOiBBZGQgRklYTUUgbm90ZS4KCSh2cl92YWx1ZXM6OnNldF92cl92YWx1ZSk6 IFJlbW92ZS4KCSh2cl92YWx1ZXM6OnN3YXBfdnJfdmFsdWUpOiBSZW1vdmUuCgkqIHZyLXZhbHVl cy5oIChjbGFzcyB2cl92YWx1ZXMpOiBSZW1vdmUuCgkoZ2V0X291dHB1dF9mb3JfdnJwKTogUmVt b3ZlLgotLS0KIGdjYy9kb2MvaW52b2tlLnRleGkgfCAgIDEwIC0KIGdjYy9wYXJhbXMub3B0ICAg ICAgfCAgIDIxIC0KIGdjYy9yYW5nZS1vcC5jYyAgICAgfCAgIDI4ICsKIGdjYy90cmVlLXZycC5j YyAgICAgfCAzODM4ICsrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0K IGdjYy90cmVlLXZycC5oICAgICAgfCAgIDI1IC0KIGdjYy92ci12YWx1ZXMuY2MgICAgfCAxODY3 ICstLS0tLS0tLS0tLS0tLS0tLS0tLQogZ2NjL3ZyLXZhbHVlcy5oICAgICB8ICAxMDAgKy0KIDcg ZmlsZXMgY2hhbmdlZCwgMjUyIGluc2VydGlvbnMoKyksIDU2MzcgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvZ2NjL2RvYy9pbnZva2UudGV4aSBiL2djYy9kb2MvaW52b2tlLnRleGkKaW5kZXgg MzMwZGE2ZWI1ZDQuLmUyOTc1MjVkZjMxIDEwMDY0NAotLS0gYS9nY2MvZG9jL2ludm9rZS50ZXhp CisrKyBiL2djYy9kb2MvaW52b2tlLnRleGkKQEAgLTE1NzgxLDE5ICsxNTc4MSw5IEBAIFRoZSBt YXhpbXVtIG51bWJlciBvZiBtYXktZGVmcyB3ZSBhbmFseXplIHdoZW4gbG9va2luZyBmb3IgYSBt dXN0LWRlZgogc3BlY2lmeWluZyB0aGUgZHluYW1pYyB0eXBlIG9mIGFuIG9iamVjdCB0aGF0IGlu dm9rZXMgYSB2aXJ0dWFsIGNhbGwKIHdlIG1heSBiZSBhYmxlIHRvIGRldmlydHVhbGl6ZSBzcGVj dWxhdGl2ZWx5LgogCi1AaXRlbSBtYXgtdnJwLXN3aXRjaC1hc3NlcnRpb25zCi1UaGUgbWF4aW11 bSBudW1iZXIgb2YgYXNzZXJ0aW9ucyB0byBhZGQgYWxvbmcgdGhlIGRlZmF1bHQgZWRnZSBvZiBh IHN3aXRjaAotc3RhdGVtZW50IGR1cmluZyBWUlAuCi0KIEBpdGVtIGV2cnAtc3BhcnNlLXRocmVz aG9sZAogTWF4aW11bSBudW1iZXIgb2YgYmFzaWMgYmxvY2tzIGJlZm9yZSBFVlJQIHVzZXMgYSBz cGFyc2UgY2FjaGUuCiAKLUBpdGVtIHZycDEtbW9kZQotU3BlY2lmaWVzIHRoZSBtb2RlIFZSUCBw YXNzIDEgc2hvdWxkIG9wZXJhdGUgaW4uCi0KLUBpdGVtIHZycDItbW9kZQotU3BlY2lmaWVzIHRo ZSBtb2RlIFZSUCBwYXNzIDIgc2hvdWxkIG9wZXJhdGUgaW4uCi0KIEBpdGVtIHJhbmdlci1kZWJ1 ZwogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIGRlYnVnIG91dHB1dCB0byBiZSBpc3N1ZWQgZm9yIHJh bmdlcy4KIApkaWZmIC0tZ2l0IGEvZ2NjL3BhcmFtcy5vcHQgYi9nY2MvcGFyYW1zLm9wdAppbmRl eCBhMzRmZWUxOTNmYy4uYzFkY2I3ZWE0ODcgMTAwNjQ0Ci0tLSBhL2djYy9wYXJhbXMub3B0Cisr KyBiL2djYy9wYXJhbXMub3B0CkBAIC03NDYsMTAgKzc0Niw2IEBAIE1heC4gc2l6ZSBvZiB2YXIg dHJhY2tpbmcgaGFzaCB0YWJsZXMuCiBDb21tb24gSm9pbmVkIFVJbnRlZ2VyIFZhcihwYXJhbV9t YXhfZmluZF9iYXNlX3Rlcm1fdmFsdWVzKSBJbml0KDIwMCkgUGFyYW0gT3B0aW1pemF0aW9uCiBN YXhpbXVtIG51bWJlciBvZiBWQUxVRXMgaGFuZGxlZCBkdXJpbmcgYSBzaW5nbGUgZmluZF9iYXNl X3Rlcm0gY2FsbC4KIAotLXBhcmFtPW1heC12cnAtc3dpdGNoLWFzc2VydGlvbnM9Ci1Db21tb24g Sm9pbmVkIFVJbnRlZ2VyIFZhcihwYXJhbV9tYXhfdnJwX3N3aXRjaF9hc3NlcnRpb25zKSBJbml0 KDEwKSBQYXJhbSBPcHRpbWl6YXRpb24KLU1heGltdW0gbnVtYmVyIG9mIGFzc2VydGlvbnMgdG8g YWRkIGFsb25nIHRoZSBkZWZhdWx0IGVkZ2Ugb2YgYSBzd2l0Y2ggc3RhdGVtZW50IGR1cmluZyBW UlAuCi0KIC1wYXJhbT1taW4tY3Jvc3NqdW1wLWluc25zPQogQ29tbW9uIEpvaW5lZCBVSW50ZWdl ciBWYXIocGFyYW1fbWluX2Nyb3NzanVtcF9pbnNucykgSW5pdCg1KSBJbnRlZ2VyUmFuZ2UoMSwg NjU1MzYpIFBhcmFtIE9wdGltaXphdGlvbgogVGhlIG1pbmltdW0gbnVtYmVyIG9mIG1hdGNoaW5n IGluc3RydWN0aW9ucyB0byBjb25zaWRlciBmb3IgY3Jvc3NqdW1waW5nLgpAQCAtMTE2NSwyMSAr MTE2MSw0IEBAIFRoZSBtYXhpbXVtIGZhY3RvciB3aGljaCB0aGUgbG9vcCB2ZWN0b3JpemVyIGFw cGxpZXMgdG8gdGhlIGNvc3Qgb2Ygc3RhdGVtZW50cyBpCiBDb21tb24gSm9pbmVkIFVJbnRlZ2Vy IFZhcihwYXJhbV92ZWN0X2luZHVjdGlvbl9mbG9hdCkgSW5pdCgxKSBJbnRlZ2VyUmFnZSgwLCAx KSBQYXJhbSBPcHRpbWl6YXRpb24KIEVuYWJsZSBsb29wIHZlY3Rvcml6YXRpb24gb2YgZmxvYXRp bmcgcG9pbnQgaW5kdWN0aW9ucy4KIAotLXBhcmFtPXZycDEtbW9kZT0KLUNvbW1vbiBKb2luZWQg VmFyKHBhcmFtX3ZycDFfbW9kZSkgRW51bSh2cnBfbW9kZSkgSW5pdChWUlBfTU9ERV9SQU5HRVIp IFBhcmFtIE9wdGltaXphdGlvbgotLS1wYXJhbT12cnAxLW1vZGU9W3ZycHxyYW5nZXJdIFNwZWNp ZmllcyB0aGUgbW9kZSBWUlAxIHNob3VsZCBvcGVyYXRlIGluLgotCi0tcGFyYW09dnJwMi1tb2Rl PQotQ29tbW9uIEpvaW5lZCBWYXIocGFyYW1fdnJwMl9tb2RlKSBFbnVtKHZycF9tb2RlKSBJbml0 KFZSUF9NT0RFX1JBTkdFUikgUGFyYW0gT3B0aW1pemF0aW9uCi0tLXBhcmFtPXZycDItbW9kZT1b dnJwfHJhbmdlcl0gU3BlY2lmaWVzIHRoZSBtb2RlIFZSUDIgc2hvdWxkIG9wZXJhdGUgaW4uCi0K LUVudW0KLU5hbWUodnJwX21vZGUpIFR5cGUoZW51bSB2cnBfbW9kZSkgVW5rbm93bkVycm9yKHVu a25vd24gdnJwIG1vZGUgJXFzKQotCi1FbnVtVmFsdWUKLUVudW0odnJwX21vZGUpIFN0cmluZyh2 cnApIFZhbHVlKFZSUF9NT0RFX1ZSUCkKLQotRW51bVZhbHVlCi1FbnVtKHZycF9tb2RlKSBTdHJp bmcocmFuZ2VyKSBWYWx1ZShWUlBfTU9ERV9SQU5HRVIpCi0KIDsgVGhpcyBjb21tZW50IGlzIHRv IGVuc3VyZSB3ZSByZXRhaW4gdGhlIGJsYW5rIGxpbmUgYWJvdmUuCmRpZmYgLS1naXQgYS9nY2Mv cmFuZ2Utb3AuY2MgYi9nY2MvcmFuZ2Utb3AuY2MKaW5kZXggNmZhM2IxNTE1OTYuLmNhMWMzOGM5 MzA3IDEwMDY0NAotLS0gYS9nY2MvcmFuZ2Utb3AuY2MKKysrIGIvZ2NjL3JhbmdlLW9wLmNjCkBA IC0zMDgyLDYgKzMwODIsMzQgQEAgc2V0X25vbnplcm9fcmFuZ2VfZnJvbV9tYXNrIChpcmFuZ2Ug JnIsIHRyZWUgdHlwZSwgY29uc3QgaXJhbmdlICZsaHMpCiAgICAgci5zZXRfdmFyeWluZyAodHlw ZSk7CiB9CiAKKy8qIEZpbmQgb3V0IHNtYWxsZXN0IFJFUyB3aGVyZSBSRVMgPiBWQUwgJiYgKFJF UyAmIE1BU0spID09IFJFUywgaWYgYW55CisgICAob3RoZXJ3aXNlIHJldHVybiBWQUwpLiAgVkFM IGFuZCBNQVNLIG11c3QgYmUgemVyby1leHRlbmRlZCBmb3IKKyAgIHByZWNpc2lvbiBQUkVDLiAg SWYgU0dOQklUIGlzIG5vbi16ZXJvLCBmaXJzdCB4b3IgVkFMIHdpdGggU0dOQklUCisgICAodG8g dHJhbnNmb3JtIHNpZ25lZCB2YWx1ZXMgaW50byB1bnNpZ25lZCkgYW5kIGF0IHRoZSBlbmQgeG9y CisgICBTR05CSVQgYmFjay4gICovCisKK3dpZGVfaW50CittYXNrZWRfaW5jcmVtZW50IChjb25z dCB3aWRlX2ludCAmdmFsX2luLCBjb25zdCB3aWRlX2ludCAmbWFzaywKKwkJICBjb25zdCB3aWRl X2ludCAmc2duYml0LCB1bnNpZ25lZCBpbnQgcHJlYykKK3sKKyAgd2lkZV9pbnQgYml0ID0gd2k6 Om9uZSAocHJlYyksIHJlczsKKyAgdW5zaWduZWQgaW50IGk7CisKKyAgd2lkZV9pbnQgdmFsID0g dmFsX2luIF4gc2duYml0OworICBmb3IgKGkgPSAwOyBpIDwgcHJlYzsgaSsrLCBiaXQgKz0gYml0 KQorICAgIHsKKyAgICAgIHJlcyA9IG1hc2s7CisgICAgICBpZiAoKHJlcyAmIGJpdCkgPT0gMCkK Kwljb250aW51ZTsKKyAgICAgIHJlcyA9IGJpdCAtIDE7CisgICAgICByZXMgPSB3aTo6Yml0X2Fu ZF9ub3QgKHZhbCArIGJpdCwgcmVzKTsKKyAgICAgIHJlcyAmPSBtYXNrOworICAgICAgaWYgKHdp OjpndHVfcCAocmVzLCB2YWwpKQorCXJldHVybiByZXMgXiBzZ25iaXQ7CisgICAgfQorICByZXR1 cm4gdmFsIF4gc2duYml0OworfQorCiAvLyBUaGlzIHdhcyBzaGFtZWxlc3NseSBzdG9sZW4gZnJv bSByZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMiBhbmQKIC8vIGFkanVzdGVkIHRvIHdvcmsgd2l0 aCBpcmFuZ2VzLgogCmRpZmYgLS1naXQgYS9nY2MvdHJlZS12cnAuY2MgYi9nY2MvdHJlZS12cnAu Y2MKaW5kZXggYTQ3NGQ5ZDExZTUuLjg2OTc4MDg2Y2ZiIDEwMDY0NAotLS0gYS9nY2MvdHJlZS12 cnAuY2MKKysrIGIvZ2NjL3RyZWUtdnJwLmNjCkBAIC0yMjksMTA5ICsyMjksNiBAQCByZW1vdmVf dW5yZWFjaGFibGU6OnJlbW92ZV9hbmRfdXBkYXRlX2dsb2JhbHMgKGJvb2wgZmluYWxfcCkKICAg cmV0dXJuIGNoYW5nZTsKIH0KIAotLyogU2V0IG9mIFNTQSBuYW1lcyBmb3VuZCBsaXZlIGR1cmlu ZyB0aGUgUlBPIHRyYXZlcnNhbCBvZiB0aGUgZnVuY3Rpb24KLSAgIGZvciBzdGlsbCBhY3RpdmUg YmFzaWMtYmxvY2tzLiAgKi8KLWNsYXNzIGxpdmVfbmFtZXMKLXsKLXB1YmxpYzoKLSAgbGl2ZV9u YW1lcyAoKTsKLSAgfmxpdmVfbmFtZXMgKCk7Ci0gIHZvaWQgc2V0ICh0cmVlLCBiYXNpY19ibG9j ayk7Ci0gIHZvaWQgY2xlYXIgKHRyZWUsIGJhc2ljX2Jsb2NrKTsKLSAgdm9pZCBtZXJnZSAoYmFz aWNfYmxvY2sgZGVzdCwgYmFzaWNfYmxvY2sgc3JjKTsKLSAgYm9vbCBsaXZlX29uX2Jsb2NrX3Ag KHRyZWUsIGJhc2ljX2Jsb2NrKTsKLSAgYm9vbCBsaXZlX29uX2VkZ2VfcCAodHJlZSwgZWRnZSk7 Ci0gIGJvb2wgYmxvY2tfaGFzX2xpdmVfbmFtZXNfcCAoYmFzaWNfYmxvY2spOwotICB2b2lkIGNs ZWFyX2Jsb2NrIChiYXNpY19ibG9jayk7Ci0KLXByaXZhdGU6Ci0gIHNiaXRtYXAgKmxpdmU7Ci0g IHVuc2lnbmVkIG51bV9ibG9ja3M7Ci0gIHZvaWQgaW5pdF9iaXRtYXBfaWZfbmVlZGVkIChiYXNp Y19ibG9jayk7Ci19OwotCi12b2lkCi1saXZlX25hbWVzOjppbml0X2JpdG1hcF9pZl9uZWVkZWQg KGJhc2ljX2Jsb2NrIGJiKQotewotICB1bnNpZ25lZCBpID0gYmItPmluZGV4OwotICBpZiAoIWxp dmVbaV0pCi0gICAgewotICAgICAgbGl2ZVtpXSA9IHNiaXRtYXBfYWxsb2MgKG51bV9zc2FfbmFt ZXMpOwotICAgICAgYml0bWFwX2NsZWFyIChsaXZlW2ldKTsKLSAgICB9Ci19Ci0KLWJvb2wKLWxp dmVfbmFtZXM6OmJsb2NrX2hhc19saXZlX25hbWVzX3AgKGJhc2ljX2Jsb2NrIGJiKQotewotICB1 bnNpZ25lZCBpID0gYmItPmluZGV4OwotICByZXR1cm4gbGl2ZVtpXSAmJiBiaXRtYXBfZW1wdHlf cCAobGl2ZVtpXSk7Ci19Ci0KLXZvaWQKLWxpdmVfbmFtZXM6OmNsZWFyX2Jsb2NrIChiYXNpY19i bG9jayBiYikKLXsKLSAgdW5zaWduZWQgaSA9IGJiLT5pbmRleDsKLSAgaWYgKGxpdmVbaV0pCi0g ICAgewotICAgICAgc2JpdG1hcF9mcmVlIChsaXZlW2ldKTsKLSAgICAgIGxpdmVbaV0gPSBOVUxM OwotICAgIH0KLX0KLQotdm9pZAotbGl2ZV9uYW1lczo6bWVyZ2UgKGJhc2ljX2Jsb2NrIGRlc3Qs IGJhc2ljX2Jsb2NrIHNyYykKLXsKLSAgaW5pdF9iaXRtYXBfaWZfbmVlZGVkIChkZXN0KTsKLSAg aW5pdF9iaXRtYXBfaWZfbmVlZGVkIChzcmMpOwotICBiaXRtYXBfaW9yIChsaXZlW2Rlc3QtPmlu ZGV4XSwgbGl2ZVtkZXN0LT5pbmRleF0sIGxpdmVbc3JjLT5pbmRleF0pOwotfQotCi12b2lkCi1s aXZlX25hbWVzOjpzZXQgKHRyZWUgbmFtZSwgYmFzaWNfYmxvY2sgYmIpCi17Ci0gIGluaXRfYml0 bWFwX2lmX25lZWRlZCAoYmIpOwotICBiaXRtYXBfc2V0X2JpdCAobGl2ZVtiYi0+aW5kZXhdLCBT U0FfTkFNRV9WRVJTSU9OIChuYW1lKSk7Ci19Ci0KLXZvaWQKLWxpdmVfbmFtZXM6OmNsZWFyICh0 cmVlIG5hbWUsIGJhc2ljX2Jsb2NrIGJiKQotewotICB1bnNpZ25lZCBpID0gYmItPmluZGV4Owot ICBpZiAobGl2ZVtpXSkKLSAgICBiaXRtYXBfY2xlYXJfYml0IChsaXZlW2ldLCBTU0FfTkFNRV9W RVJTSU9OIChuYW1lKSk7Ci19Ci0KLWxpdmVfbmFtZXM6OmxpdmVfbmFtZXMgKCkKLXsKLSAgbnVt X2Jsb2NrcyA9IGxhc3RfYmFzaWNfYmxvY2tfZm9yX2ZuIChjZnVuKTsKLSAgbGl2ZSA9IFhDTkVX VkVDIChzYml0bWFwLCBudW1fYmxvY2tzKTsKLX0KLQotbGl2ZV9uYW1lczo6fmxpdmVfbmFtZXMg KCkKLXsKLSAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG51bV9ibG9ja3M7ICsraSkKLSAgICBp ZiAobGl2ZVtpXSkKLSAgICAgIHNiaXRtYXBfZnJlZSAobGl2ZVtpXSk7Ci0gIFhERUxFVEVWRUMg KGxpdmUpOwotfQotCi1ib29sCi1saXZlX25hbWVzOjpsaXZlX29uX2Jsb2NrX3AgKHRyZWUgbmFt ZSwgYmFzaWNfYmxvY2sgYmIpCi17Ci0gIHJldHVybiAobGl2ZVtiYi0+aW5kZXhdCi0JICAmJiBi aXRtYXBfYml0X3AgKGxpdmVbYmItPmluZGV4XSwgU1NBX05BTUVfVkVSU0lPTiAobmFtZSkpKTsK LX0KLQotLyogUmV0dXJuIHRydWUgaWYgdGhlIFNTQSBuYW1lIE5BTUUgaXMgbGl2ZSBvbiB0aGUg ZWRnZSBFLiAgKi8KLQotYm9vbAotbGl2ZV9uYW1lczo6bGl2ZV9vbl9lZGdlX3AgKHRyZWUgbmFt ZSwgZWRnZSBlKQotewotICByZXR1cm4gbGl2ZV9vbl9ibG9ja19wIChuYW1lLCBlLT5kZXN0KTsK LX0KLQotCiAvKiBWUl9UWVBFIGRlc2NyaWJlcyBhIHJhbmdlIHdpdGggbWluaW51bSB2YWx1ZSAq TUlOIGFuZCBtYXhpbXVtCiAgICB2YWx1ZSAqTUFYLiAgUmVzdHJpY3QgdGhlIHJhbmdlIHRvIHRo ZSBzZXQgb2YgdmFsdWVzIHRoYXQgaGF2ZQogICAgbm8gYml0cyBzZXQgb3V0c2lkZSBOT05aRVJP X0JJVFMuICBVcGRhdGUgKk1JTiBhbmQgKk1BWCBhbmQKQEAgLTQxNyw3ICszMTQsNyBAQCByYW5n ZV9pbnRfY3N0X3AgKGNvbnN0IHZhbHVlX3JhbmdlICp2cikKICAgIG90aGVyd2lzZS4gIFdlIG9u bHkgaGFuZGxlIGFkZGl0aXZlIG9wZXJhdGlvbnMgYW5kIHNldCBORUcgdG8gdHJ1ZSBpZiB0aGUK ICAgIHN5bWJvbCBpcyBuZWdhdGVkIGFuZCBJTlYgdG8gdGhlIGludmFyaWFudCBwYXJ0LCBpZiBh bnkuICAqLwogCi10cmVlCitzdGF0aWMgdHJlZQogZ2V0X3NpbmdsZV9zeW1ib2wgKHRyZWUgdCwg Ym9vbCAqbmVnLCB0cmVlICppbnYpCiB7CiAgIGJvb2wgbmVnXzsKQEAgLTQ2OCwyNCArMzY1LDYg QEAgZ2V0X3NpbmdsZV9zeW1ib2wgKHRyZWUgdCwgYm9vbCAqbmVnLCB0cmVlICppbnYpCiAgIHJl dHVybiB0OwogfQogCi0vKiBUaGUgcmV2ZXJzZSBvcGVyYXRpb246IGJ1aWxkIGEgc3ltYm9saWMg ZXhwcmVzc2lvbiB3aXRoIFRZUEUKLSAgIGZyb20gc3ltYm9sIFNZTSwgbmVnYXRlZCBhY2NvcmRp bmcgdG8gTkVHLCBhbmQgaW52YXJpYW50IElOVi4gICovCi0KLXN0YXRpYyB0cmVlCi1idWlsZF9z eW1ib2xpY19leHByICh0cmVlIHR5cGUsIHRyZWUgc3ltLCBib29sIG5lZywgdHJlZSBpbnYpCi17 Ci0gIGNvbnN0IGJvb2wgcG9pbnRlcl9wID0gUE9JTlRFUl9UWVBFX1AgKHR5cGUpOwotICB0cmVl IHQgPSBzeW07Ci0KLSAgaWYgKG5lZykKLSAgICB0ID0gYnVpbGQxIChORUdBVEVfRVhQUiwgdHlw ZSwgdCk7Ci0KLSAgaWYgKGludGVnZXJfemVyb3AgKGludikpCi0gICAgcmV0dXJuIHQ7Ci0KLSAg cmV0dXJuIGJ1aWxkMiAocG9pbnRlcl9wID8gUE9JTlRFUl9QTFVTX0VYUFIgOiBQTFVTX0VYUFIs IHR5cGUsIHQsIGludik7Ci19Ci0KIC8qIFJldHVybgogICAgMSBpZiBWQUwgPCBWQUwyCiAgICAw IGlmICEoVkFMIDwgVkFMMikKQEAgLTY5Nyw0MTEgKzU3Niw2IEBAIGNvbXBhcmVfdmFsdWVzICh0 cmVlIHZhbDEsIHRyZWUgdmFsMikKICAgcmV0dXJuIGNvbXBhcmVfdmFsdWVzX3dhcm52ICh2YWwx LCB2YWwyLCAmc29wKTsKIH0KIAotLyogSWYgQk9VTkQgd2lsbCBpbmNsdWRlIGEgc3ltYm9saWMg Ym91bmQsIGFkanVzdCBpdCBhY2NvcmRpbmdseSwKLSAgIG90aGVyd2lzZSBsZWF2ZSBpdCBhcyBp cy4KLQotICAgQ09ERSBpcyB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uIHRoYXQgY29tYmluZWQgdGhl IGJvdW5kcyAoUExVU19FWFBSCi0gICBvciBNSU5VU19FWFBSKS4KLQotICAgVFlQRSBpcyB0aGUg dHlwZSBvZiB0aGUgb3JpZ2luYWwgb3BlcmF0aW9uLgotCi0gICBTWU1fT1BuIGlzIHRoZSBzeW1i b2xpYyBmb3IgT1BuIGlmIGl0IGhhcyBhIHN5bWJvbGljLgotCi0gICBORUdfT1BuIGlzIFRSVUUg aWYgdGhlIE9QbiB3YXMgbmVnYXRlZC4gICovCi0KLXN0YXRpYyB2b2lkCi1hZGp1c3Rfc3ltYm9s aWNfYm91bmQgKHRyZWUgJmJvdW5kLCBlbnVtIHRyZWVfY29kZSBjb2RlLCB0cmVlIHR5cGUsCi0J CSAgICAgICB0cmVlIHN5bV9vcDAsIHRyZWUgc3ltX29wMSwKLQkJICAgICAgIGJvb2wgbmVnX29w MCwgYm9vbCBuZWdfb3AxKQotewotICBib29sIG1pbnVzX3AgPSAoY29kZSA9PSBNSU5VU19FWFBS KTsKLSAgLyogSWYgdGhlIHJlc3VsdCBib3VuZCBpcyBjb25zdGFudCwgd2UncmUgZG9uZTsgb3Ro ZXJ3aXNlLCBidWlsZCB0aGUKLSAgICAgc3ltYm9saWMgbG93ZXIgYm91bmQuICAqLwotICBpZiAo c3ltX29wMCA9PSBzeW1fb3AxKQotICAgIDsKLSAgZWxzZSBpZiAoc3ltX29wMCkKLSAgICBib3Vu ZCA9IGJ1aWxkX3N5bWJvbGljX2V4cHIgKHR5cGUsIHN5bV9vcDAsCi0JCQkJIG5lZ19vcDAsIGJv dW5kKTsKLSAgZWxzZSBpZiAoc3ltX29wMSkKLSAgICB7Ci0gICAgICAvKiBXZSBtYXkgbm90IG5l Z2F0ZSBpZiB0aGF0IG1pZ2h0IGludHJvZHVjZQotCSB1bmRlZmluZWQgb3ZlcmZsb3cuICAqLwot ICAgICAgaWYgKCFtaW51c19wCi0JICB8fCBuZWdfb3AxCi0JICB8fCBUWVBFX09WRVJGTE9XX1dS QVBTICh0eXBlKSkKLQlib3VuZCA9IGJ1aWxkX3N5bWJvbGljX2V4cHIgKHR5cGUsIHN5bV9vcDEs Ci0JCQkJICAgICBuZWdfb3AxIF4gbWludXNfcCwgYm91bmQpOwotICAgICAgZWxzZQotCWJvdW5k ID0gTlVMTF9UUkVFOwotICAgIH0KLX0KLQotLyogQ29tYmluZSBPUDEgYW5kIE9QMSwgd2hpY2gg YXJlIHR3byBwYXJ0cyBvZiBhIGJvdW5kLCBpbnRvIG9uZSB3aWRlCi0gICBpbnQgYm91bmQgYWNj b3JkaW5nIHRvIENPREUuICBDT0RFIGlzIHRoZSBvcGVyYXRpb24gY29tYmluaW5nIHRoZQotICAg Ym91bmQgKGVpdGhlciBhIFBMVVNfRVhQUiBvciBhIE1JTlVTX0VYUFIpLgotCi0gICBUWVBFIGlz IHRoZSB0eXBlIG9mIHRoZSBjb21iaW5lIG9wZXJhdGlvbi4KLQotICAgV0kgaXMgdGhlIHdpZGUg aW50IHRvIHN0b3JlIHRoZSByZXN1bHQuCi0KLSAgIE9WRiBpcyAtMSBpZiBhbiB1bmRlcmZsb3cg b2NjdXJyZWQsICsxIGlmIGFuIG92ZXJmbG93IG9jY3VycmVkIG9yIDAKLSAgIGlmIG92ZXIvdW5k ZXJmbG93IG9jY3VycmVkLiAgKi8KLQotc3RhdGljIHZvaWQKLWNvbWJpbmVfYm91bmQgKGVudW0g dHJlZV9jb2RlIGNvZGUsIHdpZGVfaW50ICZ3aSwgd2k6Om92ZXJmbG93X3R5cGUgJm92ZiwKLQkg ICAgICAgdHJlZSB0eXBlLCB0cmVlIG9wMCwgdHJlZSBvcDEpCi17Ci0gIGJvb2wgbWludXNfcCA9 IChjb2RlID09IE1JTlVTX0VYUFIpOwotICBjb25zdCBzaWdub3Agc2duID0gVFlQRV9TSUdOICh0 eXBlKTsKLSAgY29uc3QgdW5zaWduZWQgaW50IHByZWMgPSBUWVBFX1BSRUNJU0lPTiAodHlwZSk7 Ci0KLSAgLyogQ29tYmluZSB0aGUgYm91bmRzLCBpZiBhbnkuICAqLwotICBpZiAob3AwICYmIG9w MSkKLSAgICB7Ci0gICAgICBpZiAobWludXNfcCkKLQl3aSA9IHdpOjpzdWIgKHdpOjp0b193aWRl IChvcDApLCB3aTo6dG9fd2lkZSAob3AxKSwgc2duLCAmb3ZmKTsKLSAgICAgIGVsc2UKLQl3aSA9 IHdpOjphZGQgKHdpOjp0b193aWRlIChvcDApLCB3aTo6dG9fd2lkZSAob3AxKSwgc2duLCAmb3Zm KTsKLSAgICB9Ci0gIGVsc2UgaWYgKG9wMCkKLSAgICB3aSA9IHdpOjp0b193aWRlIChvcDApOwot ICBlbHNlIGlmIChvcDEpCi0gICAgewotICAgICAgaWYgKG1pbnVzX3ApCi0Jd2kgPSB3aTo6bmVn ICh3aTo6dG9fd2lkZSAob3AxKSwgJm92Zik7Ci0gICAgICBlbHNlCi0Jd2kgPSB3aTo6dG9fd2lk ZSAob3AxKTsKLSAgICB9Ci0gIGVsc2UKLSAgICB3aSA9IHdpOjpzaHdpICgwLCBwcmVjKTsKLX0K LQotLyogR2l2ZW4gYSByYW5nZSBpbiBbV01JTiwgV01BWF0sIGFkanVzdCBpdCBmb3IgcG9zc2li bGUgb3ZlcmZsb3cgYW5kCi0gICBwdXQgdGhlIHJlc3VsdCBpbiBWUi4KLQotICAgVFlQRSBpcyB0 aGUgdHlwZSBvZiB0aGUgcmFuZ2UuCi0KLSAgIE1JTl9PVkYgYW5kIE1BWF9PVkYgaW5kaWNhdGUg d2hhdCB0eXBlIG9mIG92ZXJmbG93LCBpZiBhbnksCi0gICBvY2N1cnJlZCB3aGlsZSBvcmlnaW5h bGx5IGNhbGN1bGF0aW5nIFdNSU4gb3IgV01BWC4gIC0xIGluZGljYXRlcwotICAgdW5kZXJmbG93 LiAgKzEgaW5kaWNhdGVzIG92ZXJmbG93LiAgMCBpbmRpY2F0ZXMgbmVpdGhlci4gICovCi0KLXN0 YXRpYyB2b2lkCi1zZXRfdmFsdWVfcmFuZ2Vfd2l0aF9vdmVyZmxvdyAodmFsdWVfcmFuZ2Vfa2lu ZCAma2luZCwgdHJlZSAmbWluLCB0cmVlICZtYXgsCi0JCQkgICAgICAgdHJlZSB0eXBlLAotCQkJ ICAgICAgIGNvbnN0IHdpZGVfaW50ICZ3bWluLCBjb25zdCB3aWRlX2ludCAmd21heCwKLQkJCSAg ICAgICB3aTo6b3ZlcmZsb3dfdHlwZSBtaW5fb3ZmLAotCQkJICAgICAgIHdpOjpvdmVyZmxvd190 eXBlIG1heF9vdmYpCi17Ci0gIGNvbnN0IHNpZ25vcCBzZ24gPSBUWVBFX1NJR04gKHR5cGUpOwot ICBjb25zdCB1bnNpZ25lZCBpbnQgcHJlYyA9IFRZUEVfUFJFQ0lTSU9OICh0eXBlKTsKLQotICAv KiBGb3Igb25lIGJpdCBwcmVjaXNpb24gaWYgbWF4IDwgbWluLCB0aGVuIHRoZSBzd2FwcGVkCi0g ICAgIHJhbmdlIGNvdmVycyBhbGwgdmFsdWVzLiAgKi8KLSAgaWYgKHByZWMgPT0gMSAmJiB3aTo6 bHRfcCAod21heCwgd21pbiwgc2duKSkKLSAgICB7Ci0gICAgICBraW5kID0gVlJfVkFSWUlORzsK LSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaWYgKFRZUEVfT1ZFUkZMT1dfV1JBUFMgKHR5cGUp KQotICAgIHsKLSAgICAgIC8qIElmIG92ZXJmbG93IHdyYXBzLCB0cnVuY2F0ZSB0aGUgdmFsdWVz IGFuZCBhZGp1c3QgdGhlCi0JIHJhbmdlIGtpbmQgYW5kIGJvdW5kcyBhcHByb3ByaWF0ZWx5LiAg Ki8KLSAgICAgIHdpZGVfaW50IHRtaW4gPSB3aWRlX2ludDo6ZnJvbSAod21pbiwgcHJlYywgc2du KTsKLSAgICAgIHdpZGVfaW50IHRtYXggPSB3aWRlX2ludDo6ZnJvbSAod21heCwgcHJlYywgc2du KTsKLSAgICAgIGlmICgobWluX292ZiAhPSB3aTo6T1ZGX05PTkUpID09IChtYXhfb3ZmICE9IHdp OjpPVkZfTk9ORSkpCi0JewotCSAgLyogSWYgdGhlIGxpbWl0cyBhcmUgc3dhcHBlZCwgd2Ugd3Jh cHBlZCBhcm91bmQgYW5kIGNvdmVyCi0JICAgICB0aGUgZW50aXJlIHJhbmdlLiAgKi8KLQkgIGlm ICh3aTo6Z3RfcCAodG1pbiwgdG1heCwgc2duKSkKLQkgICAga2luZCA9IFZSX1ZBUllJTkc7Ci0J ICBlbHNlCi0JICAgIHsKLQkgICAgICBraW5kID0gVlJfUkFOR0U7Ci0JICAgICAgLyogTm8gb3Zl cmZsb3cgb3IgYm90aCBvdmVyZmxvdyBvciB1bmRlcmZsb3cuICBUaGUKLQkJIHJhbmdlIGtpbmQg c3RheXMgVlJfUkFOR0UuICAqLwotCSAgICAgIG1pbiA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUs IHRtaW4pOwotCSAgICAgIG1heCA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIHRtYXgpOwotCSAg ICB9Ci0JICByZXR1cm47Ci0JfQotICAgICAgZWxzZSBpZiAoKG1pbl9vdmYgPT0gd2k6Ok9WRl9V TkRFUkZMT1cgJiYgbWF4X292ZiA9PSB3aTo6T1ZGX05PTkUpCi0JICAgICAgIHx8IChtYXhfb3Zm ID09IHdpOjpPVkZfT1ZFUkZMT1cgJiYgbWluX292ZiA9PSB3aTo6T1ZGX05PTkUpKQotCXsKLQkg IC8qIE1pbiB1bmRlcmZsb3cgb3IgbWF4IG92ZXJmbG93LiAgVGhlIHJhbmdlIGtpbmQKLQkgICAg IGNoYW5nZXMgdG8gVlJfQU5USV9SQU5HRS4gICovCi0JICBib29sIGNvdmVycyA9IGZhbHNlOwot CSAgd2lkZV9pbnQgdGVtID0gdG1pbjsKLQkgIHRtaW4gPSB0bWF4ICsgMTsKLQkgIGlmICh3aTo6 Y21wICh0bWluLCB0bWF4LCBzZ24pIDwgMCkKLQkgICAgY292ZXJzID0gdHJ1ZTsKLQkgIHRtYXgg PSB0ZW0gLSAxOwotCSAgaWYgKHdpOjpjbXAgKHRtYXgsIHRlbSwgc2duKSA+IDApCi0JICAgIGNv dmVycyA9IHRydWU7Ci0JICAvKiBJZiB0aGUgYW50aS1yYW5nZSB3b3VsZCBjb3ZlciBub3RoaW5n LCBkcm9wIHRvIHZhcnlpbmcuCi0JICAgICBMaWtld2lzZSBpZiB0aGUgYW50aS1yYW5nZSBib3Vu ZHMgYXJlIG91dHNpZGUgb2YgdGhlCi0JICAgICB0eXBlcyB2YWx1ZXMuICAqLwotCSAgaWYgKGNv dmVycyB8fCB3aTo6Y21wICh0bWluLCB0bWF4LCBzZ24pID4gMCkKLQkgICAgewotCSAgICAgIGtp bmQgPSBWUl9WQVJZSU5HOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCSAga2luZCA9IFZSX0FO VElfUkFOR0U7Ci0JICBtaW4gPSB3aWRlX2ludF90b190cmVlICh0eXBlLCB0bWluKTsKLQkgIG1h eCA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIHRtYXgpOwotCSAgcmV0dXJuOwotCX0KLSAgICAg IGVsc2UKLQl7Ci0JICAvKiBPdGhlciB1bmRlcmZsb3cgYW5kL29yIG92ZXJmbG93LCBkcm9wIHRv IFZSX1ZBUllJTkcuICAqLwotCSAga2luZCA9IFZSX1ZBUllJTkc7Ci0JICByZXR1cm47Ci0JfQot ICAgIH0KLSAgZWxzZQotICAgIHsKLSAgICAgIC8qIElmIG92ZXJmbG93IGRvZXMgbm90IHdyYXAs IHNhdHVyYXRlIHRvIHRoZSB0eXBlcyBtaW4vbWF4Ci0JIHZhbHVlLiAgKi8KLSAgICAgIHdpZGVf aW50IHR5cGVfbWluID0gd2k6Om1pbl92YWx1ZSAocHJlYywgc2duKTsKLSAgICAgIHdpZGVfaW50 IHR5cGVfbWF4ID0gd2k6Om1heF92YWx1ZSAocHJlYywgc2duKTsKLSAgICAgIGtpbmQgPSBWUl9S QU5HRTsKLSAgICAgIGlmIChtaW5fb3ZmID09IHdpOjpPVkZfVU5ERVJGTE9XKQotCW1pbiA9IHdp ZGVfaW50X3RvX3RyZWUgKHR5cGUsIHR5cGVfbWluKTsKLSAgICAgIGVsc2UgaWYgKG1pbl9vdmYg PT0gd2k6Ok9WRl9PVkVSRkxPVykKLQltaW4gPSB3aWRlX2ludF90b190cmVlICh0eXBlLCB0eXBl X21heCk7Ci0gICAgICBlbHNlCi0JbWluID0gd2lkZV9pbnRfdG9fdHJlZSAodHlwZSwgd21pbik7 Ci0KLSAgICAgIGlmIChtYXhfb3ZmID09IHdpOjpPVkZfVU5ERVJGTE9XKQotCW1heCA9IHdpZGVf aW50X3RvX3RyZWUgKHR5cGUsIHR5cGVfbWluKTsKLSAgICAgIGVsc2UgaWYgKG1heF9vdmYgPT0g d2k6Ok9WRl9PVkVSRkxPVykKLQltYXggPSB3aWRlX2ludF90b190cmVlICh0eXBlLCB0eXBlX21h eCk7Ci0gICAgICBlbHNlCi0JbWF4ID0gd2lkZV9pbnRfdG9fdHJlZSAodHlwZSwgd21heCk7Ci0g ICAgfQotfQotCi0vKiBGb2xkIHR3byB2YWx1ZSByYW5nZSdzIG9mIGEgUE9JTlRFUl9QTFVTX0VY UFIgaW50byBWUi4gICovCi0KLXN0YXRpYyB2b2lkCi1leHRyYWN0X3JhbmdlX2Zyb21fcG9pbnRl cl9wbHVzX2V4cHIgKHZhbHVlX3JhbmdlICp2ciwKLQkJCQkgICAgICBlbnVtIHRyZWVfY29kZSBj b2RlLAotCQkJCSAgICAgIHRyZWUgZXhwcl90eXBlLAotCQkJCSAgICAgIGNvbnN0IHZhbHVlX3Jh bmdlICp2cjAsCi0JCQkJICAgICAgY29uc3QgdmFsdWVfcmFuZ2UgKnZyMSkKLXsKLSAgZ2NjX2No ZWNraW5nX2Fzc2VydCAoUE9JTlRFUl9UWVBFX1AgKGV4cHJfdHlwZSkKLQkJICAgICAgICYmIGNv ZGUgPT0gUE9JTlRFUl9QTFVTX0VYUFIpOwotICAvKiBGb3IgcG9pbnRlciB0eXBlcywgd2UgYXJl IHJlYWxseSBvbmx5IGludGVyZXN0ZWQgaW4gYXNzZXJ0aW5nCi0gICAgIHdoZXRoZXIgdGhlIGV4 cHJlc3Npb24gZXZhbHVhdGVzIHRvIG5vbi1OVUxMLgotICAgICBXaXRoIC1mbm8tZGVsZXRlLW51 bGwtcG9pbnRlci1jaGVja3Mgd2UgbmVlZCB0byBiZSBtb3JlCi0gICAgIGNvbnNlcnZhdGl2ZS4g IEFzIHNvbWUgb2JqZWN0IG1pZ2h0IHJlc2lkZSBhdCBhZGRyZXNzIDAsCi0gICAgIHRoZW4gc29t ZSBvZmZzZXQgY291bGQgYmUgYWRkZWQgdG8gaXQgYW5kIHRoZSBzYW1lIG9mZnNldAotICAgICBz dWJ0cmFjdGVkIGFnYWluIGFuZCB0aGUgcmVzdWx0IHdvdWxkIGJlIE5VTEwuCi0gICAgIEUuZy4K LSAgICAgc3RhdGljIGludCBhWzEyXTsgd2hlcmUgJmFbMF0gaXMgTlVMTCBhbmQKLSAgICAgcHRy ID0gJmFbNl07Ci0gICAgIHB0ciAtPSA2OwotICAgICBwdHIgd2lsbCBiZSBOVUxMIGhlcmUsIGV2 ZW4gd2hlbiB0aGVyZSBpcyBQT0lOVEVSX1BMVVNfRVhQUgotICAgICB3aGVyZSB0aGUgZmlyc3Qg cmFuZ2UgZG9lc24ndCBpbmNsdWRlIHplcm8gYW5kIHRoZSBzZWNvbmQgb25lCi0gICAgIGRvZXNu J3QgZWl0aGVyLiAgQXMgdGhlIHNlY29uZCBvcGVyYW5kIGlzIHNpemV0eXBlICh1bnNpZ25lZCks Ci0gICAgIGNvbnNpZGVyIGFsbCByYW5nZXMgd2hlcmUgdGhlIE1TQiBjb3VsZCBiZSBzZXQgYXMg cG9zc2libGUKLSAgICAgc3VidHJhY3Rpb25zIHdoZXJlIHRoZSByZXN1bHQgbWlnaHQgYmUgTlVM TC4gICovCi0gIGlmICgoIXJhbmdlX2luY2x1ZGVzX3plcm9fcCAodnIwKQotICAgICAgIHx8ICFy YW5nZV9pbmNsdWRlc196ZXJvX3AgKHZyMSkpCi0gICAgICAmJiAhVFlQRV9PVkVSRkxPV19XUkFQ UyAoZXhwcl90eXBlKQotICAgICAgJiYgKGZsYWdfZGVsZXRlX251bGxfcG9pbnRlcl9jaGVja3MK LQkgIHx8IChyYW5nZV9pbnRfY3N0X3AgKHZyMSkKLQkgICAgICAmJiAhdHJlZV9pbnRfY3N0X3Np Z25fYml0ICh2cjEtPm1heCAoKSkpKSkKLSAgICB2ci0+c2V0X25vbnplcm8gKGV4cHJfdHlwZSk7 Ci0gIGVsc2UgaWYgKHZyMC0+emVyb19wICgpICYmIHZyMS0+emVyb19wICgpKQotICAgIHZyLT5z ZXRfemVybyAoZXhwcl90eXBlKTsKLSAgZWxzZQotICAgIHZyLT5zZXRfdmFyeWluZyAoZXhwcl90 eXBlKTsKLX0KLQotLyogRXh0cmFjdCByYW5nZSBpbmZvcm1hdGlvbiBmcm9tIGEgUExVUy9NSU5V U19FWFBSIGFuZCBzdG9yZSB0aGUKLSAgIHJlc3VsdCBpbiAqVlIuICAqLwotCi1zdGF0aWMgdm9p ZAotZXh0cmFjdF9yYW5nZV9mcm9tX3BsdXNfbWludXNfZXhwciAodmFsdWVfcmFuZ2UgKnZyLAot CQkJCSAgICBlbnVtIHRyZWVfY29kZSBjb2RlLAotCQkJCSAgICB0cmVlIGV4cHJfdHlwZSwKLQkJ CQkgICAgY29uc3QgdmFsdWVfcmFuZ2UgKnZyMF8sCi0JCQkJICAgIGNvbnN0IHZhbHVlX3Jhbmdl ICp2cjFfKQotewotICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChjb2RlID09IFBMVVNfRVhQUiB8fCBj b2RlID09IE1JTlVTX0VYUFIpOwotCi0gIHZhbHVlX3JhbmdlIHZyMCA9ICp2cjBfLCB2cjEgPSAq dnIxXzsKLSAgdmFsdWVfcmFuZ2UgdnJ0ZW0wLCB2cnRlbTE7Ci0KLSAgLyogTm93IGNhbm9uaWNh bGl6ZSBhbnRpLXJhbmdlcyB0byByYW5nZXMgd2hlbiB0aGV5IGFyZSBub3Qgc3ltYm9saWMKLSAg ICAgYW5kIGV4cHJlc3MgfltdIG9wIFggYXMgKFtdJyBvcCBYKSBVIChbXScnIG9wIFgpLiAgKi8K LSAgaWYgKHZyMC5raW5kICgpID09IFZSX0FOVElfUkFOR0UKLSAgICAgICYmIHJhbmdlc19mcm9t X2FudGlfcmFuZ2UgKCZ2cjAsICZ2cnRlbTAsICZ2cnRlbTEpKQotICAgIHsKLSAgICAgIGV4dHJh Y3RfcmFuZ2VfZnJvbV9wbHVzX21pbnVzX2V4cHIgKHZyLCBjb2RlLCBleHByX3R5cGUsICZ2cnRl bTAsIHZyMV8pOwotICAgICAgaWYgKCF2cnRlbTEudW5kZWZpbmVkX3AgKCkpCi0JewotCSAgdmFs dWVfcmFuZ2UgdnJyZXM7Ci0JICBleHRyYWN0X3JhbmdlX2Zyb21fcGx1c19taW51c19leHByICgm dnJyZXMsIGNvZGUsIGV4cHJfdHlwZSwKLQkJCQkJICAgICAgJnZydGVtMSwgdnIxXyk7Ci0JICB2 ci0+dW5pb25fICh2cnJlcyk7Ci0JfQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgLyogTGlrZXdp c2UgZm9yIFggb3AgfltdLiAgKi8KLSAgaWYgKHZyMS5raW5kICgpID09IFZSX0FOVElfUkFOR0UK LSAgICAgICYmIHJhbmdlc19mcm9tX2FudGlfcmFuZ2UgKCZ2cjEsICZ2cnRlbTAsICZ2cnRlbTEp KQotICAgIHsKLSAgICAgIGV4dHJhY3RfcmFuZ2VfZnJvbV9wbHVzX21pbnVzX2V4cHIgKHZyLCBj b2RlLCBleHByX3R5cGUsIHZyMF8sICZ2cnRlbTApOwotICAgICAgaWYgKCF2cnRlbTEudW5kZWZp bmVkX3AgKCkpCi0JewotCSAgdmFsdWVfcmFuZ2UgdnJyZXM7Ci0JICBleHRyYWN0X3JhbmdlX2Zy b21fcGx1c19taW51c19leHByICgmdnJyZXMsIGNvZGUsIGV4cHJfdHlwZSwKLQkJCQkJICAgICAg dnIwXywgJnZydGVtMSk7Ci0JICB2ci0+dW5pb25fICh2cnJlcyk7Ci0JfQotICAgICAgcmV0dXJu OwotICAgIH0KLQotICB2YWx1ZV9yYW5nZV9raW5kIGtpbmQ7Ci0gIHZhbHVlX3JhbmdlX2tpbmQg dnIwX2tpbmQgPSB2cjAua2luZCAoKSwgdnIxX2tpbmQgPSB2cjEua2luZCAoKTsKLSAgdHJlZSB2 cjBfbWluID0gdnIwLm1pbiAoKSwgdnIwX21heCA9IHZyMC5tYXggKCk7Ci0gIHRyZWUgdnIxX21p biA9IHZyMS5taW4gKCksIHZyMV9tYXggPSB2cjEubWF4ICgpOwotICB0cmVlIG1pbiA9IE5VTExf VFJFRSwgbWF4ID0gTlVMTF9UUkVFOwotCi0gIC8qIFRoaXMgd2lsbCBub3JtYWxpemUgdGhpbmdz IHN1Y2ggdGhhdCBjYWxjdWxhdGluZwotICAgICBbMCwwXSAtIFZSX1ZBUllJTkcgaXMgbm90IGRy b3BwZWQgdG8gdmFyeWluZywgYnV0IGlzCi0gICAgIGNhbGN1bGF0ZWQgYXMgW01JTisxLCBNQVhd LiAgKi8KLSAgaWYgKHZyMC52YXJ5aW5nX3AgKCkpCi0gICAgewotICAgICAgdnIwX2tpbmQgPSBW Ul9SQU5HRTsKLSAgICAgIHZyMF9taW4gPSB2cnBfdmFsX21pbiAoZXhwcl90eXBlKTsKLSAgICAg IHZyMF9tYXggPSB2cnBfdmFsX21heCAoZXhwcl90eXBlKTsKLSAgICB9Ci0gIGlmICh2cjEudmFy eWluZ19wICgpKQotICAgIHsKLSAgICAgIHZyMV9raW5kID0gVlJfUkFOR0U7Ci0gICAgICB2cjFf bWluID0gdnJwX3ZhbF9taW4gKGV4cHJfdHlwZSk7Ci0gICAgICB2cjFfbWF4ID0gdnJwX3ZhbF9t YXggKGV4cHJfdHlwZSk7Ci0gICAgfQotCi0gIGNvbnN0IGJvb2wgbWludXNfcCA9IChjb2RlID09 IE1JTlVTX0VYUFIpOwotICB0cmVlIG1pbl9vcDAgPSB2cjBfbWluOwotICB0cmVlIG1pbl9vcDEg PSBtaW51c19wID8gdnIxX21heCA6IHZyMV9taW47Ci0gIHRyZWUgbWF4X29wMCA9IHZyMF9tYXg7 Ci0gIHRyZWUgbWF4X29wMSA9IG1pbnVzX3AgPyB2cjFfbWluIDogdnIxX21heDsKLSAgdHJlZSBz eW1fbWluX29wMCA9IE5VTExfVFJFRTsKLSAgdHJlZSBzeW1fbWluX29wMSA9IE5VTExfVFJFRTsK LSAgdHJlZSBzeW1fbWF4X29wMCA9IE5VTExfVFJFRTsKLSAgdHJlZSBzeW1fbWF4X29wMSA9IE5V TExfVFJFRTsKLSAgYm9vbCBuZWdfbWluX29wMCwgbmVnX21pbl9vcDEsIG5lZ19tYXhfb3AwLCBu ZWdfbWF4X29wMTsKLQotICBuZWdfbWluX29wMCA9IG5lZ19taW5fb3AxID0gbmVnX21heF9vcDAg PSBuZWdfbWF4X29wMSA9IGZhbHNlOwotCi0gIC8qIElmIHdlIGhhdmUgYSBQTFVTIG9yIE1JTlVT IHdpdGggdHdvIFZSX1JBTkdFcywgZWl0aGVyIGNvbnN0YW50IG9yCi0gICAgIHNpbmdsZS1zeW1i b2xpYyByYW5nZXMsIHRyeSB0byBjb21wdXRlIHRoZSBwcmVjaXNlIHJlc3VsdGluZyByYW5nZSwK LSAgICAgYnV0IG9ubHkgaWYgd2Uga25vdyB0aGF0IHRoaXMgcmVzdWx0aW5nIHJhbmdlIHdpbGwg YWxzbyBiZSBjb25zdGFudAotICAgICBvciBzaW5nbGUtc3ltYm9saWMuICAqLwotICBpZiAodnIw X2tpbmQgPT0gVlJfUkFOR0UgJiYgdnIxX2tpbmQgPT0gVlJfUkFOR0UKLSAgICAgICYmIChUUkVF X0NPREUgKG1pbl9vcDApID09IElOVEVHRVJfQ1NUCi0JICB8fCAoc3ltX21pbl9vcDAKLQkgICAg ICA9IGdldF9zaW5nbGVfc3ltYm9sIChtaW5fb3AwLCAmbmVnX21pbl9vcDAsICZtaW5fb3AwKSkp Ci0gICAgICAmJiAoVFJFRV9DT0RFIChtaW5fb3AxKSA9PSBJTlRFR0VSX0NTVAotCSAgfHwgKHN5 bV9taW5fb3AxCi0JICAgICAgPSBnZXRfc2luZ2xlX3N5bWJvbCAobWluX29wMSwgJm5lZ19taW5f b3AxLCAmbWluX29wMSkpKQotICAgICAgJiYgKCEoc3ltX21pbl9vcDAgJiYgc3ltX21pbl9vcDEp Ci0JICB8fCAoc3ltX21pbl9vcDAgPT0gc3ltX21pbl9vcDEKLQkgICAgICAmJiBuZWdfbWluX29w MCA9PSAobWludXNfcCA/IG5lZ19taW5fb3AxIDogIW5lZ19taW5fb3AxKSkpCi0gICAgICAmJiAo VFJFRV9DT0RFIChtYXhfb3AwKSA9PSBJTlRFR0VSX0NTVAotCSAgfHwgKHN5bV9tYXhfb3AwCi0J ICAgICAgPSBnZXRfc2luZ2xlX3N5bWJvbCAobWF4X29wMCwgJm5lZ19tYXhfb3AwLCAmbWF4X29w MCkpKQotICAgICAgJiYgKFRSRUVfQ09ERSAobWF4X29wMSkgPT0gSU5URUdFUl9DU1QKLQkgIHx8 IChzeW1fbWF4X29wMQotCSAgICAgID0gZ2V0X3NpbmdsZV9zeW1ib2wgKG1heF9vcDEsICZuZWdf bWF4X29wMSwgJm1heF9vcDEpKSkKLSAgICAgICYmICghKHN5bV9tYXhfb3AwICYmIHN5bV9tYXhf b3AxKQotCSAgfHwgKHN5bV9tYXhfb3AwID09IHN5bV9tYXhfb3AxCi0JICAgICAgJiYgbmVnX21h eF9vcDAgPT0gKG1pbnVzX3AgPyBuZWdfbWF4X29wMSA6ICFuZWdfbWF4X29wMSkpKSkKLSAgICB7 Ci0gICAgICB3aWRlX2ludCB3bWluLCB3bWF4OwotICAgICAgd2k6Om92ZXJmbG93X3R5cGUgbWlu X292ZiA9IHdpOjpPVkZfTk9ORTsKLSAgICAgIHdpOjpvdmVyZmxvd190eXBlIG1heF9vdmYgPSB3 aTo6T1ZGX05PTkU7Ci0KLSAgICAgIC8qIEJ1aWxkIHRoZSBib3VuZHMuICAqLwotICAgICAgY29t YmluZV9ib3VuZCAoY29kZSwgd21pbiwgbWluX292ZiwgZXhwcl90eXBlLCBtaW5fb3AwLCBtaW5f b3AxKTsKLSAgICAgIGNvbWJpbmVfYm91bmQgKGNvZGUsIHdtYXgsIG1heF9vdmYsIGV4cHJfdHlw ZSwgbWF4X29wMCwgbWF4X29wMSk7Ci0KLSAgICAgIC8qIElmIHRoZSByZXN1bHRpbmcgcmFuZ2Ug d2lsbCBiZSBzeW1ib2xpYywgd2UgbmVlZCB0byBlbGltaW5hdGUgYW55Ci0JIGV4cGxpY2l0IG9y IGltcGxpY2l0IG92ZXJmbG93IGludHJvZHVjZWQgaW4gdGhlIGFib3ZlIGNvbXB1dGF0aW9uCi0J IGJlY2F1c2UgY29tcGFyZV92YWx1ZXMgY291bGQgbWFrZSBhbiBpbmNvcnJlY3QgdXNlIG9mIGl0 LiAgVGhhdCdzCi0JIHdoeSB3ZSByZXF1aXJlIG9uZSBvZiB0aGUgcmFuZ2VzIHRvIGJlIGEgc2lu Z2xldG9uLiAgKi8KLSAgICAgIGlmICgoc3ltX21pbl9vcDAgIT0gc3ltX21pbl9vcDEgfHwgc3lt X21heF9vcDAgIT0gc3ltX21heF9vcDEpCi0JICAmJiAoKGJvb2wpbWluX292ZiB8fCAoYm9vbClt YXhfb3ZmCi0JICAgICAgfHwgKG1pbl9vcDAgIT0gbWF4X29wMCAmJiBtaW5fb3AxICE9IG1heF9v cDEpKSkKLQl7Ci0JICB2ci0+c2V0X3ZhcnlpbmcgKGV4cHJfdHlwZSk7Ci0JICByZXR1cm47Ci0J fQotCi0gICAgICAvKiBBZGp1c3QgdGhlIHJhbmdlIGZvciBwb3NzaWJsZSBvdmVyZmxvdy4gICov Ci0gICAgICBzZXRfdmFsdWVfcmFuZ2Vfd2l0aF9vdmVyZmxvdyAoa2luZCwgbWluLCBtYXgsIGV4 cHJfdHlwZSwKLQkJCQkgICAgIHdtaW4sIHdtYXgsIG1pbl9vdmYsIG1heF9vdmYpOwotICAgICAg aWYgKGtpbmQgPT0gVlJfVkFSWUlORykKLQl7Ci0JICB2ci0+c2V0X3ZhcnlpbmcgKGV4cHJfdHlw ZSk7Ci0JICByZXR1cm47Ci0JfQotCi0gICAgICAvKiBCdWlsZCB0aGUgc3ltYm9saWMgYm91bmRz IGlmIG5lZWRlZC4gICovCi0gICAgICBhZGp1c3Rfc3ltYm9saWNfYm91bmQgKG1pbiwgY29kZSwg ZXhwcl90eXBlLAotCQkJICAgICBzeW1fbWluX29wMCwgc3ltX21pbl9vcDEsCi0JCQkgICAgIG5l Z19taW5fb3AwLCBuZWdfbWluX29wMSk7Ci0gICAgICBhZGp1c3Rfc3ltYm9saWNfYm91bmQgKG1h eCwgY29kZSwgZXhwcl90eXBlLAotCQkJICAgICBzeW1fbWF4X29wMCwgc3ltX21heF9vcDEsCi0J CQkgICAgIG5lZ19tYXhfb3AwLCBuZWdfbWF4X29wMSk7Ci0gICAgfQotICBlbHNlCi0gICAgewot ICAgICAgLyogRm9yIG90aGVyIGNhc2VzLCBmb3IgZXhhbXBsZSBpZiB3ZSBoYXZlIGEgUExVU19F WFBSIHdpdGggdHdvCi0JIFZSX0FOVElfUkFOR0VzLCBkcm9wIHRvIFZSX1ZBUllJTkcuICBJdCB3 b3VsZCB0YWtlIG1vcmUgZWZmb3J0Ci0JIHRvIGNvbXB1dGUgYSBwcmVjaXNlIHJhbmdlIGZvciBz dWNoIGEgY2FzZS4KLQkgPz8/ICBHZW5lcmFsIGV2ZW4gbWl4ZWQgcmFuZ2Uga2luZCBvcGVyYXRp b25zIGNhbiBiZSBleHByZXNzZWQKLQkgYnkgZm9yIGV4YW1wbGUgdHJhbnNmb3JtaW5nIH5bMywg NV0gKyBbMSwgMl0gdG8gcmFuZ2Utb25seQotCSBvcGVyYXRpb25zIGFuZCBhIHVuaW9uIHByaW1p dGl2ZToKLQkgWy1JTkYsIDJdICsgWzEsIDJdICBVICBbNSwgK0lORl0gKyBbMSwgMl0KLQkgWy1J TkYrMSwgNF0gICAgIFUgICAgWzYsICtJTkYoT1ZGKV0KLQkgdGhvdWdoIHVzdWFsbHkgdGhlIHVu aW9uIGlzIG5vdCBleGFjdGx5IHJlcHJlc2VudGFibGUgd2l0aAotCSBhIHNpbmdsZSByYW5nZSBv ciBhbnRpLXJhbmdlIGFzIHRoZSBhYm92ZSBpcwotCSBbLUlORisxLCArSU5GKE9WRildIGludGVy c2VjdGVkIHdpdGggfls1LCA1XQotCSBidXQgb25lIGNvdWxkIHVzZSBhIHNjaGVtZSBzaW1pbGFy IHRvIGVxdWl2YWxlbmNlcyBmb3IgdGhpcy4gKi8KLSAgICAgIHZyLT5zZXRfdmFyeWluZyAoZXhw cl90eXBlKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgLyogSWYgZWl0aGVyIE1JTiBvciBN QVggb3ZlcmZsb3dlZCwgdGhlbiBzZXQgdGhlIHJlc3VsdGluZyByYW5nZSB0bwotICAgICBWQVJZ SU5HLiAgKi8KLSAgaWYgKG1pbiA9PSBOVUxMX1RSRUUKLSAgICAgIHx8IFRSRUVfT1ZFUkZMT1df UCAobWluKQotICAgICAgfHwgbWF4ID09IE5VTExfVFJFRQotICAgICAgfHwgVFJFRV9PVkVSRkxP V19QIChtYXgpKQotICAgIHsKLSAgICAgIHZyLT5zZXRfdmFyeWluZyAoZXhwcl90eXBlKTsKLSAg ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgaW50IGNtcCA9IGNvbXBhcmVfdmFsdWVzIChtaW4sIG1h eCk7Ci0gIGlmIChjbXAgPT0gLTIgfHwgY21wID09IDEpCi0gICAgewotICAgICAgLyogSWYgdGhl IG5ldyByYW5nZSBoYXMgaXRzIGxpbWl0cyBzd2FwcGVkIGFyb3VuZCAoTUlOID4gTUFYKSwKLQkg dGhlbiB0aGUgb3BlcmF0aW9uIGNhdXNlZCBvbmUgb2YgdGhlbSB0byB3cmFwIGFyb3VuZCwgbWFy awotCSB0aGUgbmV3IHJhbmdlIFZBUllJTkcuICAqLwotICAgICAgdnItPnNldF92YXJ5aW5nIChl eHByX3R5cGUpOwotICAgIH0KLSAgZWxzZQotICAgIHZyLT5zZXQgKG1pbiwgbWF4LCBraW5kKTsK LX0KLQogLyogSWYgdGhlIHR5cGVzIHBhc3NlZCBhcmUgc3VwcG9ydGVkLCByZXR1cm4gVFJVRSwg b3RoZXJ3aXNlIHNldCBWUiB0bwogICAgVkFSWUlORyBhbmQgcmV0dXJuIEZBTFNFLiAgKi8KIApA QCAtMTEzNCw4OSArNjA4LDYgQEAgZGVmaW5lZF9yYW5nZXNfcCAodmFsdWVfcmFuZ2UgKnZyLAog ICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIHZhbHVlX3JhbmdlCi1kcm9wX3VuZGVmaW5lc190 b192YXJ5aW5nIChjb25zdCB2YWx1ZV9yYW5nZSAqdnIsIHRyZWUgZXhwcl90eXBlKQotewotICBp ZiAodnItPnVuZGVmaW5lZF9wICgpKQotICAgIHJldHVybiB2YWx1ZV9yYW5nZSAoZXhwcl90eXBl KTsKLSAgZWxzZQotICAgIHJldHVybiAqdnI7Ci19Ci0KLS8qIElmIGFueSBvcGVyYW5kIGlzIHN5 bWJvbGljLCBwZXJmb3JtIGEgYmluYXJ5IG9wZXJhdGlvbiBvbiB0aGVtIGFuZAotICAgcmV0dXJu IFRSVUUsIG90aGVyd2lzZSByZXR1cm4gRkFMU0UuICAqLwotCi1zdGF0aWMgYm9vbAotcmFuZ2Vf Zm9sZF9iaW5hcnlfc3ltYm9saWNzX3AgKHZhbHVlX3JhbmdlICp2ciwKLQkJCSAgICAgICB0cmVl X2NvZGUgY29kZSwKLQkJCSAgICAgICB0cmVlIGV4cHJfdHlwZSwKLQkJCSAgICAgICBjb25zdCB2 YWx1ZV9yYW5nZSAqdnIwXywKLQkJCSAgICAgICBjb25zdCB2YWx1ZV9yYW5nZSAqdnIxXykKLXsK LSAgaWYgKHZyMF8tPnN5bWJvbGljX3AgKCkgfHwgdnIxXy0+c3ltYm9saWNfcCAoKSkKLSAgICB7 Ci0gICAgICB2YWx1ZV9yYW5nZSB2cjAgPSBkcm9wX3VuZGVmaW5lc190b192YXJ5aW5nICh2cjBf LCBleHByX3R5cGUpOwotICAgICAgdmFsdWVfcmFuZ2UgdnIxID0gZHJvcF91bmRlZmluZXNfdG9f dmFyeWluZyAodnIxXywgZXhwcl90eXBlKTsKLSAgICAgIGlmICgoY29kZSA9PSBQTFVTX0VYUFIg fHwgY29kZSA9PSBNSU5VU19FWFBSKSkKLQl7Ci0JICBleHRyYWN0X3JhbmdlX2Zyb21fcGx1c19t aW51c19leHByICh2ciwgY29kZSwgZXhwcl90eXBlLAotCQkJCQkgICAgICAmdnIwLCAmdnIxKTsK LQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGlmIChQT0lOVEVSX1RZUEVfUCAoZXhwcl90eXBl KSAmJiBjb2RlID09IFBPSU5URVJfUExVU19FWFBSKQotCXsKLQkgIGV4dHJhY3RfcmFuZ2VfZnJv bV9wb2ludGVyX3BsdXNfZXhwciAodnIsIGNvZGUsIGV4cHJfdHlwZSwKLQkJCQkJCSZ2cjAsICZ2 cjEpOwotCSAgcmV0dXJuIHRydWU7Ci0JfQotICAgICAgcmFuZ2Vfb3BfaGFuZGxlciBvcCAoY29k ZSwgZXhwcl90eXBlKTsKLSAgICAgIGlmICghb3ApCi0JdnItPnNldF92YXJ5aW5nIChleHByX3R5 cGUpOwotICAgICAgdnIwLm5vcm1hbGl6ZV9zeW1ib2xpY3MgKCk7Ci0gICAgICB2cjEubm9ybWFs aXplX3N5bWJvbGljcyAoKTsKLSAgICAgIHJldHVybiBvcC5mb2xkX3JhbmdlICgqdnIsIGV4cHJf dHlwZSwgdnIwLCB2cjEpOwotICAgIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBJZiBvcGVy YW5kIGlzIHN5bWJvbGljLCBwZXJmb3JtIGEgdW5hcnkgb3BlcmF0aW9uIG9uIGl0IGFuZCByZXR1 cm4KLSAgIFRSVUUsIG90aGVyd2lzZSByZXR1cm4gRkFMU0UuICAqLwotCi1zdGF0aWMgYm9vbAot cmFuZ2VfZm9sZF91bmFyeV9zeW1ib2xpY3NfcCAodmFsdWVfcmFuZ2UgKnZyLAotCQkJICAgICAg dHJlZV9jb2RlIGNvZGUsCi0JCQkgICAgICB0cmVlIGV4cHJfdHlwZSwKLQkJCSAgICAgIGNvbnN0 IHZhbHVlX3JhbmdlICp2cjApCi17Ci0gIGlmICh2cjAtPnN5bWJvbGljX3AgKCkpCi0gICAgewot ICAgICAgaWYgKGNvZGUgPT0gTkVHQVRFX0VYUFIpCi0JewotCSAgLyogLVggaXMgc2ltcGx5IDAg LSBYLiAgKi8KLQkgIHZhbHVlX3JhbmdlIHplcm87Ci0JICB6ZXJvLnNldF96ZXJvICh2cjAtPnR5 cGUgKCkpOwotCSAgcmFuZ2VfZm9sZF9iaW5hcnlfZXhwciAodnIsIE1JTlVTX0VYUFIsIGV4cHJf dHlwZSwgJnplcm8sIHZyMCk7Ci0JICByZXR1cm4gdHJ1ZTsKLQl9Ci0gICAgICBpZiAoY29kZSA9 PSBCSVRfTk9UX0VYUFIpCi0JewotCSAgLyogflggaXMgc2ltcGx5IC0xIC0gWC4gICovCi0JICB2 YWx1ZV9yYW5nZSBtaW51c29uZTsKLQkgIHRyZWUgdCA9IGJ1aWxkX2ludF9jc3QgKHZyMC0+dHlw ZSAoKSwgLTEpOwotCSAgbWludXNvbmUuc2V0ICh0LCB0KTsKLQkgIHJhbmdlX2ZvbGRfYmluYXJ5 X2V4cHIgKHZyLCBNSU5VU19FWFBSLCBleHByX3R5cGUsICZtaW51c29uZSwgdnIwKTsKLQkgIHJl dHVybiB0cnVlOwotCX0KLSAgICAgIHJhbmdlX29wX2hhbmRsZXIgb3AgKGNvZGUsIGV4cHJfdHlw ZSk7Ci0gICAgICBpZiAoIW9wKQotCXZyLT5zZXRfdmFyeWluZyAoZXhwcl90eXBlKTsKLSAgICAg IHZhbHVlX3JhbmdlIHZyMF9jc3QgKCp2cjApOwotICAgICAgdnIwX2NzdC5ub3JtYWxpemVfc3lt Ym9saWNzICgpOwotICAgICAgcmV0dXJuIG9wLmZvbGRfcmFuZ2UgKCp2ciwgZXhwcl90eXBlLCB2 cjBfY3N0LCB2YWx1ZV9yYW5nZSAoZXhwcl90eXBlKSk7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7 Ci19Ci0KIC8qIFBlcmZvcm0gYSBiaW5hcnkgb3BlcmF0aW9uIG9uIGEgcGFpciBvZiByYW5nZXMu ICAqLwogCiB2b2lkCkBAIC0xMjM2LDkgKzYyNyw2IEBAIHJhbmdlX2ZvbGRfYmluYXJ5X2V4cHIg KHZhbHVlX3JhbmdlICp2ciwKICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgaWYgKHJhbmdlX2Zv bGRfYmluYXJ5X3N5bWJvbGljc19wICh2ciwgY29kZSwgZXhwcl90eXBlLCB2cjBfLCB2cjFfKSkK LSAgICByZXR1cm47Ci0KICAgdmFsdWVfcmFuZ2UgdnIwICgqdnIwXyk7CiAgIHZhbHVlX3Jhbmdl IHZyMSAoKnZyMV8pOwogICBpZiAodnIwLnVuZGVmaW5lZF9wICgpKQpAQCAtMTI2OSwyNDUgKzY1 Nyw0MiBAQCByYW5nZV9mb2xkX3VuYXJ5X2V4cHIgKHZhbHVlX3JhbmdlICp2ciwKICAgICAgIHJl dHVybjsKICAgICB9CiAKLSAgaWYgKHJhbmdlX2ZvbGRfdW5hcnlfc3ltYm9saWNzX3AgKHZyLCBj b2RlLCBleHByX3R5cGUsIHZyMCkpCi0gICAgcmV0dXJuOwotCiAgIHZhbHVlX3JhbmdlIHZyMF9j c3QgKCp2cjApOwogICB2cjBfY3N0Lm5vcm1hbGl6ZV9hZGRyZXNzZXMgKCk7CiAgIGlmICghb3Au Zm9sZF9yYW5nZSAoKnZyLCBleHByX3R5cGUsIHZyMF9jc3QsIHZhbHVlX3JhbmdlIChleHByX3R5 cGUpKSkKICAgICB2ci0+c2V0X3ZhcnlpbmcgKGV4cHJfdHlwZSk7CiB9CiAKLS8qIElmIHRoZSBy YW5nZSBvZiB2YWx1ZXMgdGFrZW4gYnkgT1AgY2FuIGJlIGluZmVycmVkIGFmdGVyIFNUTVQgZXhl Y3V0ZXMsCi0gICByZXR1cm4gdGhlIGNvbXBhcmlzb24gY29kZSAoQ09NUF9DT0RFX1ApIGFuZCB2 YWx1ZSAoVkFMX1ApIHRoYXQKLSAgIGRlc2NyaWJlcyB0aGUgaW5mZXJyZWQgcmFuZ2UuICBSZXR1 cm4gdHJ1ZSBpZiBhIHJhbmdlIGNvdWxkIGJlCi0gICBpbmZlcnJlZC4gICovCi0KLWJvb2wKLWlu ZmVyX3ZhbHVlX3JhbmdlIChnaW1wbGUgKnN0bXQsIHRyZWUgb3AsIHRyZWVfY29kZSAqY29tcF9j b2RlX3AsIHRyZWUgKnZhbF9wKQotewotICAqdmFsX3AgPSBOVUxMX1RSRUU7Ci0gICpjb21wX2Nv ZGVfcCA9IEVSUk9SX01BUks7Ci0KLSAgLyogRG8gbm90IGF0dGVtcHQgdG8gaW5mZXIgYW55dGhp bmcgaW4gbmFtZXMgdGhhdCBmbG93IHRocm91Z2gKLSAgICAgYWJub3JtYWwgZWRnZXMuICAqLwot ICBpZiAoU1NBX05BTUVfT0NDVVJTX0lOX0FCTk9STUFMX1BISSAob3ApKQotICAgIHJldHVybiBm YWxzZTsKLQotICAvKiBJZiBTVE1UIGlzIHRoZSBsYXN0IHN0YXRlbWVudCBvZiBhIGJhc2ljIGJs b2NrIHdpdGggbm8gbm9ybWFsCi0gICAgIHN1Y2Nlc3NvcnMsIHRoZXJlIGlzIG5vIHBvaW50IGlu ZmVycmluZyBhbnl0aGluZyBhYm91dCBhbnkgb2YgaXRzCi0gICAgIG9wZXJhbmRzLiAgV2Ugd291 bGQgbm90IGJlIGFibGUgdG8gZmluZCBhIHByb3BlciBpbnNlcnRpb24gcG9pbnQKLSAgICAgZm9y IHRoZSBhc3NlcnRpb24sIGFueXdheS4gICovCi0gIGlmIChzdG10X2VuZHNfYmJfcCAoc3RtdCkp Ci0gICAgewotICAgICAgZWRnZV9pdGVyYXRvciBlaTsKLSAgICAgIGVkZ2UgZTsKLQotICAgICAg Rk9SX0VBQ0hfRURHRSAoZSwgZWksIGdpbXBsZV9iYiAoc3RtdCktPnN1Y2NzKQotCWlmICghKGUt PmZsYWdzICYgKEVER0VfQUJOT1JNQUx8RURHRV9FSCkpKQotCSAgYnJlYWs7Ci0gICAgICBpZiAo ZSA9PSBOVUxMKQotCXJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgaWYgKGluZmVyX25vbm51bGxf cmFuZ2UgKHN0bXQsIG9wKSkKLSAgICB7Ci0gICAgICAqdmFsX3AgPSBidWlsZF9pbnRfY3N0IChU UkVFX1RZUEUgKG9wKSwgMCk7Ci0gICAgICAqY29tcF9jb2RlX3AgPSBORV9FWFBSOwotICAgICAg cmV0dXJuIHRydWU7Ci0gICAgfQorLyogSGVscGVyIGZvciBvdmVyZmxvd19jb21wYXJpc29uX3AK IAotICByZXR1cm4gZmFsc2U7Ci19CisgICBPUDAgQ09ERSBPUDEgaXMgYSBjb21wYXJpc29uLiAg RXhhbWluZSB0aGUgY29tcGFyaXNvbiBhbmQgcG90ZW50aWFsbHkKKyAgIE9QMSdzIGRlZmluaW5n IHN0YXRlbWVudCB0byBzZWUgaWYgaXQgdWx0aW1hdGVseSBoYXMgdGhlIGZvcm0KKyAgIE9QMCBD T0RFIChPUDAgUExVUyBJTlRFR0VSX0NTVCkKIAotLyogRHVtcCBhc3NlcnRfaW5mbyBzdHJ1Y3R1 cmUuICAqLworICAgSWYgc28sIHJldHVybiBUUlVFIGluZGljYXRpbmcgdGhpcyBpcyBhbiBvdmVy ZmxvdyB0ZXN0IGFuZCBzdG9yZSBpbnRvCisgICAqTkVXX0NTVCBhbiB1cGRhdGVkIGNvbnN0YW50 IHRoYXQgY2FuIGJlIHVzZWQgaW4gYSBuYXJyb3dlZCByYW5nZSB0ZXN0LgogCi12b2lkCi1kdW1w X2Fzc2VydF9pbmZvIChGSUxFICpmaWxlLCBjb25zdCBhc3NlcnRfaW5mbyAmYXNzZXJ0KQotewot ICBmcHJpbnRmIChmaWxlLCAiQXNzZXJ0IGZvcjogIik7Ci0gIHByaW50X2dlbmVyaWNfZXhwciAo ZmlsZSwgYXNzZXJ0Lm5hbWUpOwotICBmcHJpbnRmIChmaWxlLCAiXG5cdFBSRURJQ0FURTogZXhw cj1bIik7Ci0gIHByaW50X2dlbmVyaWNfZXhwciAoZmlsZSwgYXNzZXJ0LmV4cHIpOwotICBmcHJp bnRmIChmaWxlLCAiXSAlcyAiLCBnZXRfdHJlZV9jb2RlX25hbWUgKGFzc2VydC5jb21wX2NvZGUp KTsKLSAgZnByaW50ZiAoZmlsZSwgInZhbD1bIik7Ci0gIHByaW50X2dlbmVyaWNfZXhwciAoZmls ZSwgYXNzZXJ0LnZhbCk7Ci0gIGZwcmludGYgKGZpbGUsICJdXG5cbiIpOwotfQorICAgUkVWRVJT RUQgaW5kaWNhdGVzIGlmIHRoZSBjb21wYXJpc29uIHdhcyBvcmlnaW5hbGx5OgogCi1ERUJVR19G VU5DVElPTiB2b2lkCi1kZWJ1ZyAoY29uc3QgYXNzZXJ0X2luZm8gJmFzc2VydCkKLXsKLSAgZHVt cF9hc3NlcnRfaW5mbyAoc3RkZXJyLCBhc3NlcnQpOwotfQorICAgT1AxIENPREUnIE9QMC4KIAot LyogRHVtcCBhIHZlY3RvciBvZiBhc3NlcnRfaW5mbydzLiAgKi8KKyAgIFRoaXMgYWZmZWN0cyBo b3cgd2UgYnVpbGQgdGhlIHVwZGF0ZWQgY29uc3RhbnQuICAqLwogCi12b2lkCi1kdW1wX2Fzc2Vy dHNfaW5mbyAoRklMRSAqZmlsZSwgY29uc3QgdmVjPGFzc2VydF9pbmZvPiAmYXNzZXJ0cykKK3N0 YXRpYyBib29sCitvdmVyZmxvd19jb21wYXJpc29uX3BfMSAoZW51bSB0cmVlX2NvZGUgY29kZSwg dHJlZSBvcDAsIHRyZWUgb3AxLAorCQkJIGJvb2wgZm9sbG93X2Fzc2VydF9leHBycywgYm9vbCBy ZXZlcnNlZCwgdHJlZSAqbmV3X2NzdCkKIHsKLSAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGFz c2VydHMubGVuZ3RoICgpOyArK2kpCisgIC8qIFNlZSBpZiB0aGlzIGlzIGEgcmVsYXRpb25hbCBv cGVyYXRpb24gYmV0d2VlbiB0d28gU1NBX05BTUVTIHdpdGgKKyAgICAgdW5zaWduZWQsIG92ZXJm bG93IHdyYXBwaW5nIHZhbHVlcy4gIElmIHNvLCBjaGVjayBpdCBtb3JlIGRlZXBseS4gICovCisg IGlmICgoY29kZSA9PSBMVF9FWFBSIHx8IGNvZGUgPT0gTEVfRVhQUgorICAgICAgIHx8IGNvZGUg PT0gR0VfRVhQUiB8fCBjb2RlID09IEdUX0VYUFIpCisgICAgICAmJiBUUkVFX0NPREUgKG9wMCkg PT0gU1NBX05BTUUKKyAgICAgICYmIFRSRUVfQ09ERSAob3AxKSA9PSBTU0FfTkFNRQorICAgICAg JiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKG9wMCkpCisgICAgICAmJiBUWVBFX1VOU0lH TkVEIChUUkVFX1RZUEUgKG9wMCkpCisgICAgICAmJiBUWVBFX09WRVJGTE9XX1dSQVBTIChUUkVF X1RZUEUgKG9wMCkpKQogICAgIHsKLSAgICAgIGR1bXBfYXNzZXJ0X2luZm8gKGZpbGUsIGFzc2Vy dHNbaV0pOwotICAgICAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0gICAgfQotfQotCi1ERUJVR19G VU5DVElPTiB2b2lkCi1kZWJ1ZyAoY29uc3QgdmVjPGFzc2VydF9pbmZvPiAmYXNzZXJ0cykKLXsK LSAgZHVtcF9hc3NlcnRzX2luZm8gKHN0ZGVyciwgYXNzZXJ0cyk7Ci19Ci0KLS8qIFB1c2ggdGhl IGFzc2VydCBpbmZvIGZvciBOQU1FLCBFWFBSLCBDT01QX0NPREUgYW5kIFZBTCB0byBBU1NFUlRT LiAgKi8KLQotc3RhdGljIHZvaWQKLWFkZF9hc3NlcnRfaW5mbyAodmVjPGFzc2VydF9pbmZvPiAm YXNzZXJ0cywKLQkJIHRyZWUgbmFtZSwgdHJlZSBleHByLCBlbnVtIHRyZWVfY29kZSBjb21wX2Nv ZGUsIHRyZWUgdmFsKQotewotICBhc3NlcnRfaW5mbyBpbmZvOwotICBpbmZvLmNvbXBfY29kZSA9 IGNvbXBfY29kZTsKLSAgaW5mby5uYW1lID0gbmFtZTsKLSAgaWYgKFRSRUVfT1ZFUkZMT1dfUCAo dmFsKSkKLSAgICB2YWwgPSBkcm9wX3RyZWVfb3ZlcmZsb3cgKHZhbCk7Ci0gIGluZm8udmFsID0g dmFsOwotICBpbmZvLmV4cHIgPSBleHByOwotICBhc3NlcnRzLnNhZmVfcHVzaCAoaW5mbyk7Ci0g IGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKLSAgICBkdW1wX3ByaW50ZiAoTVNHX05PVEUgfCBNU0df UFJJT1JJVFlfSU5URVJOQUxTLAotCQkgIkFkZGluZyBhc3NlcnQgZm9yICVUIGZyb20gJVQgJXMg JVRcbiIsCi0JCSBuYW1lLCBleHByLCBvcF9zeW1ib2xfY29kZSAoY29tcF9jb2RlKSwgdmFsKTsK LX0KLQotLyogKENPTkRfT1AwIENPTkRfQ09ERSBDT05EX09QMSkgaXMgYSBwcmVkaWNhdGUgd2hp Y2ggdXNlcyBOQU1FLgotICAgRXh0cmFjdCBhIHN1aXRhYmxlIHRlc3QgY29kZSBhbmQgdmFsdWUg YW5kIHN0b3JlIHRoZW0gaW50byAqQ09ERV9QIGFuZAotICAgKlZBTF9QIHNvIHRoZSBwcmVkaWNh dGUgaXMgbm9ybWFsaXplZCB0byBOQU1FICpDT0RFX1AgKlZBTF9QLgotCi0gICBJZiBubyBleHRy YWN0aW9uIHdhcyBwb3NzaWJsZSwgcmV0dXJuIEZBTFNFLCBvdGhlcndpc2UgcmV0dXJuIFRSVUUu Ci0KLSAgIElmIElOVkVSVCBpcyB0cnVlLCB0aGVuIHdlIGludmVydCB0aGUgcmVzdWx0IHN0b3Jl ZCBpbnRvICpDT0RFX1AuICAqLwotCi1zdGF0aWMgYm9vbAotZXh0cmFjdF9jb2RlX2FuZF92YWxf ZnJvbV9jb25kX3dpdGhfb3BzICh0cmVlIG5hbWUsIGVudW0gdHJlZV9jb2RlIGNvbmRfY29kZSwK LQkJCQkJIHRyZWUgY29uZF9vcDAsIHRyZWUgY29uZF9vcDEsCi0JCQkJCSBib29sIGludmVydCwg ZW51bSB0cmVlX2NvZGUgKmNvZGVfcCwKLQkJCQkJIHRyZWUgKnZhbF9wKQotewotICBlbnVtIHRy ZWVfY29kZSBjb21wX2NvZGU7Ci0gIHRyZWUgdmFsOwotCi0gIC8qIE90aGVyd2lzZSwgd2UgaGF2 ZSBhIGNvbXBhcmlzb24gb2YgdGhlIGZvcm0gTkFNRSBDT01QIFZBTAotICAgICBvciBWQUwgQ09N UCBOQU1FLiAgKi8KLSAgaWYgKG5hbWUgPT0gY29uZF9vcDEpCi0gICAgewotICAgICAgLyogSWYg dGhlIHByZWRpY2F0ZSBpcyBvZiB0aGUgZm9ybSBWQUwgQ09NUCBOQU1FLCBmbGlwCi0JIENPTVAg YXJvdW5kIGJlY2F1c2Ugd2UgbmVlZCB0byByZWdpc3RlciBOQU1FIGFzIHRoZQotCSBmaXJzdCBv cGVyYW5kIGluIHRoZSBwcmVkaWNhdGUuICAqLwotICAgICAgY29tcF9jb2RlID0gc3dhcF90cmVl X2NvbXBhcmlzb24gKGNvbmRfY29kZSk7Ci0gICAgICB2YWwgPSBjb25kX29wMDsKLSAgICB9Ci0g IGVsc2UgaWYgKG5hbWUgPT0gY29uZF9vcDApCi0gICAgewotICAgICAgLyogVGhlIGNvbXBhcmlz b24gaXMgb2YgdGhlIGZvcm0gTkFNRSBDT01QIFZBTCwgc28gdGhlCi0JIGNvbXBhcmlzb24gY29k ZSByZW1haW5zIHVuY2hhbmdlZC4gICovCi0gICAgICBjb21wX2NvZGUgPSBjb25kX2NvZGU7Ci0g ICAgICB2YWwgPSBjb25kX29wMTsKLSAgICB9Ci0gIGVsc2UKLSAgICBnY2NfdW5yZWFjaGFibGUg KCk7Ci0KLSAgLyogSW52ZXJ0IHRoZSBjb21wYXJpc29uIGNvZGUgYXMgbmVjZXNzYXJ5LiAgKi8K LSAgaWYgKGludmVydCkKLSAgICBjb21wX2NvZGUgPSBpbnZlcnRfdHJlZV9jb21wYXJpc29uIChj b21wX2NvZGUsIDApOwotCi0gIC8qIFZSUCBvbmx5IGhhbmRsZXMgaW50ZWdyYWwgYW5kIHBvaW50 ZXIgdHlwZXMuICAqLwotICBpZiAoISBJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAodmFsKSkK LSAgICAgICYmICEgUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQRSAodmFsKSkpCi0gICAgcmV0dXJu IGZhbHNlOwotCi0gIC8qIERvIG5vdCByZWdpc3RlciBhbHdheXMtZmFsc2UgcHJlZGljYXRlcy4K LSAgICAgRklYTUU6ICB0aGlzIHdvcmtzIGFyb3VuZCBhIGxpbWl0YXRpb24gaW4gZm9sZCgpIHdo ZW4gZGVhbGluZyB3aXRoCi0gICAgIGVudW1lcmF0aW9ucy4gIEdpdmVuICdlbnVtIHsgTjEsIE4y IH0geDsnLCBmb2xkIHdpbGwgbm90Ci0gICAgIGZvbGQgJ2lmICh4ID4gTjIpJyB0byAnaWYgKDAp Jy4gICovCi0gIGlmICgoY29tcF9jb2RlID09IEdUX0VYUFIgfHwgY29tcF9jb2RlID09IExUX0VY UFIpCi0gICAgICAmJiBJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAodmFsKSkpCi0gICAgewot ICAgICAgdHJlZSBtaW4gPSBUWVBFX01JTl9WQUxVRSAoVFJFRV9UWVBFICh2YWwpKTsKLSAgICAg IHRyZWUgbWF4ID0gVFlQRV9NQVhfVkFMVUUgKFRSRUVfVFlQRSAodmFsKSk7Ci0KLSAgICAgIGlm IChjb21wX2NvZGUgPT0gR1RfRVhQUgotCSAgJiYgKCFtYXgKLQkgICAgICB8fCBjb21wYXJlX3Zh bHVlcyAodmFsLCBtYXgpID09IDApKQotCXJldHVybiBmYWxzZTsKLQotICAgICAgaWYgKGNvbXBf Y29kZSA9PSBMVF9FWFBSCi0JICAmJiAoIW1pbgotCSAgICAgIHx8IGNvbXBhcmVfdmFsdWVzICh2 YWwsIG1pbikgPT0gMCkpCi0JcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgKmNvZGVfcCA9IGNvbXBf Y29kZTsKLSAgKnZhbF9wID0gdmFsOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluZCBvdXQg c21hbGxlc3QgUkVTIHdoZXJlIFJFUyA+IFZBTCAmJiAoUkVTICYgTUFTSykgPT0gUkVTLCBpZiBh bnkKLSAgIChvdGhlcndpc2UgcmV0dXJuIFZBTCkuICBWQUwgYW5kIE1BU0sgbXVzdCBiZSB6ZXJv LWV4dGVuZGVkIGZvcgotICAgcHJlY2lzaW9uIFBSRUMuICBJZiBTR05CSVQgaXMgbm9uLXplcm8s IGZpcnN0IHhvciBWQUwgd2l0aCBTR05CSVQKLSAgICh0byB0cmFuc2Zvcm0gc2lnbmVkIHZhbHVl cyBpbnRvIHVuc2lnbmVkKSBhbmQgYXQgdGhlIGVuZCB4b3IKLSAgIFNHTkJJVCBiYWNrLiAgKi8K LQotd2lkZV9pbnQKLW1hc2tlZF9pbmNyZW1lbnQgKGNvbnN0IHdpZGVfaW50ICZ2YWxfaW4sIGNv bnN0IHdpZGVfaW50ICZtYXNrLAotCQkgIGNvbnN0IHdpZGVfaW50ICZzZ25iaXQsIHVuc2lnbmVk IGludCBwcmVjKQotewotICB3aWRlX2ludCBiaXQgPSB3aTo6b25lIChwcmVjKSwgcmVzOwotICB1 bnNpZ25lZCBpbnQgaTsKLQotICB3aWRlX2ludCB2YWwgPSB2YWxfaW4gXiBzZ25iaXQ7Ci0gIGZv ciAoaSA9IDA7IGkgPCBwcmVjOyBpKyssIGJpdCArPSBiaXQpCi0gICAgewotICAgICAgcmVzID0g bWFzazsKLSAgICAgIGlmICgocmVzICYgYml0KSA9PSAwKQotCWNvbnRpbnVlOwotICAgICAgcmVz ID0gYml0IC0gMTsKLSAgICAgIHJlcyA9IHdpOjpiaXRfYW5kX25vdCAodmFsICsgYml0LCByZXMp OwotICAgICAgcmVzICY9IG1hc2s7Ci0gICAgICBpZiAod2k6Omd0dV9wIChyZXMsIHZhbCkpCi0J cmV0dXJuIHJlcyBeIHNnbmJpdDsKLSAgICB9Ci0gIHJldHVybiB2YWwgXiBzZ25iaXQ7Ci19Ci0K LS8qIEhlbHBlciBmb3Igb3ZlcmZsb3dfY29tcGFyaXNvbl9wCi0KLSAgIE9QMCBDT0RFIE9QMSBp cyBhIGNvbXBhcmlzb24uICBFeGFtaW5lIHRoZSBjb21wYXJpc29uIGFuZCBwb3RlbnRpYWxseQot ICAgT1AxJ3MgZGVmaW5pbmcgc3RhdGVtZW50IHRvIHNlZSBpZiBpdCB1bHRpbWF0ZWx5IGhhcyB0 aGUgZm9ybQotICAgT1AwIENPREUgKE9QMCBQTFVTIElOVEVHRVJfQ1NUKQotCi0gICBJZiBzbywg cmV0dXJuIFRSVUUgaW5kaWNhdGluZyB0aGlzIGlzIGFuIG92ZXJmbG93IHRlc3QgYW5kIHN0b3Jl IGludG8KLSAgICpORVdfQ1NUIGFuIHVwZGF0ZWQgY29uc3RhbnQgdGhhdCBjYW4gYmUgdXNlZCBp biBhIG5hcnJvd2VkIHJhbmdlIHRlc3QuCi0KLSAgIFJFVkVSU0VEIGluZGljYXRlcyBpZiB0aGUg Y29tcGFyaXNvbiB3YXMgb3JpZ2luYWxseToKLQotICAgT1AxIENPREUnIE9QMC4KLQotICAgVGhp cyBhZmZlY3RzIGhvdyB3ZSBidWlsZCB0aGUgdXBkYXRlZCBjb25zdGFudC4gICovCi0KLXN0YXRp YyBib29sCi1vdmVyZmxvd19jb21wYXJpc29uX3BfMSAoZW51bSB0cmVlX2NvZGUgY29kZSwgdHJl ZSBvcDAsIHRyZWUgb3AxLAotCQkgICAgICAgICBib29sIGZvbGxvd19hc3NlcnRfZXhwcnMsIGJv b2wgcmV2ZXJzZWQsIHRyZWUgKm5ld19jc3QpCi17Ci0gIC8qIFNlZSBpZiB0aGlzIGlzIGEgcmVs YXRpb25hbCBvcGVyYXRpb24gYmV0d2VlbiB0d28gU1NBX05BTUVTIHdpdGgKLSAgICAgdW5zaWdu ZWQsIG92ZXJmbG93IHdyYXBwaW5nIHZhbHVlcy4gIElmIHNvLCBjaGVjayBpdCBtb3JlIGRlZXBs eS4gICovCi0gIGlmICgoY29kZSA9PSBMVF9FWFBSIHx8IGNvZGUgPT0gTEVfRVhQUgotICAgICAg IHx8IGNvZGUgPT0gR0VfRVhQUiB8fCBjb2RlID09IEdUX0VYUFIpCi0gICAgICAmJiBUUkVFX0NP REUgKG9wMCkgPT0gU1NBX05BTUUKLSAgICAgICYmIFRSRUVfQ09ERSAob3AxKSA9PSBTU0FfTkFN RQotICAgICAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKG9wMCkpCi0gICAgICAmJiBU WVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKG9wMCkpCi0gICAgICAmJiBUWVBFX09WRVJGTE9XX1dS QVBTIChUUkVFX1RZUEUgKG9wMCkpKQotICAgIHsKLSAgICAgIGdpbXBsZSAqb3AxX2RlZiA9IFNT QV9OQU1FX0RFRl9TVE1UIChvcDEpOworICAgICAgZ2ltcGxlICpvcDFfZGVmID0gU1NBX05BTUVf REVGX1NUTVQgKG9wMSk7CiAKICAgICAgIC8qIElmIHJlcXVlc3RlZCwgZm9sbG93IGFueSBBU1NF UlRfRVhQUnMgYmFja3dhcmRzIGZvciBPUDEuICAqLwogICAgICAgaWYgKGZvbGxvd19hc3NlcnRf ZXhwcnMpCkBAIC0xNTg5LDI4NDQgKzc3NCwyMzYgQEAgb3ZlcmZsb3dfY29tcGFyaXNvbl9wICh0 cmVlX2NvZGUgY29kZSwgdHJlZSBuYW1lLCB0cmVlIHZhbCwKIAkJCQkgIHVzZV9lcXVpdl9wLCB0 cnVlLCBuZXdfY3N0KTsKIH0KIAorLyogSGFuZGxlCisgICBfNCA9IHhfMyAmIDMxOworICAgaWYg KF80ICE9IDApCisgICAgIGdvdG8gPGJiIDY+OworICAgZWxzZQorICAgICBnb3RvIDxiYiA3PjsK KyAgIDxiYiA2PjoKKyAgIF9fYnVpbHRpbl91bnJlYWNoYWJsZSAoKTsKKyAgIDxiYiA3PjoKKyAg IHhfNSA9IEFTU0VSVF9FWFBSIDx4XzMsIC4uLj47CisgICBJZiB4XzMgaGFzIG5vIG90aGVyIGlt bWVkaWF0ZSB1c2VzIChjaGVja2VkIGJ5IGNhbGxlciksCisgICB2YXIgaXMgdGhlIHhfMyB2YXIg ZnJvbSBBU1NFUlRfRVhQUiwgd2UgY2FuIGNsZWFyIGxvdyA1IGJpdHMKKyAgIGZyb20gdGhlIG5v bi16ZXJvIGJpdG1hc2suICAqLwogCi0vKiBUcnkgdG8gcmVnaXN0ZXIgYW4gZWRnZSBhc3NlcnRp b24gZm9yIFNTQSBuYW1lIE5BTUUgb24gZWRnZSBFIGZvcgotICAgdGhlIGNvbmRpdGlvbiBDT05E IGNvbnRyaWJ1dGluZyB0byB0aGUgY29uZGl0aW9uYWwganVtcCBwb2ludGVkIHRvIGJ5IEJTSS4K LSAgIEludmVydCB0aGUgY29uZGl0aW9uIENPTkQgaWYgSU5WRVJUIGlzIHRydWUuICAqLwotCi1z dGF0aWMgdm9pZAotcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yXzIgKHRyZWUgbmFtZSwgZWRnZSBl LAotCQkJICAgIGVudW0gdHJlZV9jb2RlIGNvbmRfY29kZSwKLQkJCSAgICB0cmVlIGNvbmRfb3Aw LCB0cmVlIGNvbmRfb3AxLCBib29sIGludmVydCwKLQkJCSAgICB2ZWM8YXNzZXJ0X2luZm8+ICZh c3NlcnRzKQordm9pZAorbWF5YmVfc2V0X25vbnplcm9fYml0cyAoZWRnZSBlLCB0cmVlIHZhcikK IHsKLSAgdHJlZSB2YWw7Ci0gIGVudW0gdHJlZV9jb2RlIGNvbXBfY29kZTsKKyAgYmFzaWNfYmxv Y2sgY29uZF9iYiA9IGUtPnNyYzsKKyAgZ2ltcGxlICpzdG10ID0gbGFzdF9zdG10IChjb25kX2Ji KTsKKyAgdHJlZSBjc3Q7CiAKLSAgaWYgKCFleHRyYWN0X2NvZGVfYW5kX3ZhbF9mcm9tX2NvbmRf d2l0aF9vcHMgKG5hbWUsIGNvbmRfY29kZSwKLQkJCQkJCWNvbmRfb3AwLAotCQkJCQkJY29uZF9v cDEsCi0JCQkJCQlpbnZlcnQsICZjb21wX2NvZGUsICZ2YWwpKQorICBpZiAoc3RtdCA9PSBOVUxM CisgICAgICB8fCBnaW1wbGVfY29kZSAoc3RtdCkgIT0gR0lNUExFX0NPTkQKKyAgICAgIHx8IGdp bXBsZV9jb25kX2NvZGUgKHN0bXQpICE9ICgoZS0+ZmxhZ3MgJiBFREdFX1RSVUVfVkFMVUUpCisJ CQkJICAgICA/IEVRX0VYUFIgOiBORV9FWFBSKQorICAgICAgfHwgVFJFRV9DT0RFIChnaW1wbGVf Y29uZF9saHMgKHN0bXQpKSAhPSBTU0FfTkFNRQorICAgICAgfHwgIWludGVnZXJfemVyb3AgKGdp bXBsZV9jb25kX3JocyAoc3RtdCkpKQogICAgIHJldHVybjsKIAotICAvKiBRdWV1ZSB0aGUgYXNz ZXJ0LiAgKi8KLSAgdHJlZSB4OwotICBpZiAob3ZlcmZsb3dfY29tcGFyaXNvbl9wIChjb21wX2Nv ZGUsIG5hbWUsIHZhbCwgZmFsc2UsICZ4KSkKLSAgICB7Ci0gICAgICBlbnVtIHRyZWVfY29kZSBu ZXdfY29kZSA9ICgoY29tcF9jb2RlID09IEdUX0VYUFIgfHwgY29tcF9jb2RlID09IEdFX0VYUFIp Ci0JCQkJID8gR1RfRVhQUiA6IExFX0VYUFIpOwotICAgICAgYWRkX2Fzc2VydF9pbmZvIChhc3Nl cnRzLCBuYW1lLCBuYW1lLCBuZXdfY29kZSwgeCk7Ci0gICAgfQotICBhZGRfYXNzZXJ0X2luZm8g KGFzc2VydHMsIG5hbWUsIG5hbWUsIGNvbXBfY29kZSwgdmFsKTsKLQotICAvKiBJbiB0aGUgY2Fz ZSBvZiBOQU1FIDw9IENTVCBhbmQgTkFNRSBiZWluZyBkZWZpbmVkIGFzCi0gICAgIE5BTUUgPSAo dW5zaWduZWQpIE5BTUUyICsgQ1NUMiB3ZSBjYW4gYXNzZXJ0IE5BTUUyID49IC1DU1QyCi0gICAg IGFuZCBOQU1FMiA8PSBDU1QgLSBDU1QyLiAgV2UgY2FuIGRvIHRoZSBzYW1lIGZvciBOQU1FID4g Q1NULgotICAgICBUaGlzIGNhdGNoZXMgcmFuZ2UgYW5kIGFudGktcmFuZ2UgdGVzdHMuICAqLwot ICBpZiAoKGNvbXBfY29kZSA9PSBMRV9FWFBSCi0gICAgICAgfHwgY29tcF9jb2RlID09IEdUX0VY UFIpCi0gICAgICAmJiBUUkVFX0NPREUgKHZhbCkgPT0gSU5URUdFUl9DU1QKLSAgICAgICYmIFRZ UEVfVU5TSUdORUQgKFRSRUVfVFlQRSAodmFsKSkpCisgIHN0bXQgPSBTU0FfTkFNRV9ERUZfU1RN VCAoZ2ltcGxlX2NvbmRfbGhzIChzdG10KSk7CisgIGlmICghaXNfZ2ltcGxlX2Fzc2lnbiAoc3Rt dCkKKyAgICAgIHx8IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0bXQpICE9IEJJVF9BTkRfRVhQ UgorICAgICAgfHwgVFJFRV9DT0RFIChnaW1wbGVfYXNzaWduX3JoczIgKHN0bXQpKSAhPSBJTlRF R0VSX0NTVCkKKyAgICByZXR1cm47CisgIGlmIChnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpICE9 IHZhcikKICAgICB7Ci0gICAgICBnaW1wbGUgKmRlZl9zdG10ID0gU1NBX05BTUVfREVGX1NUTVQg KG5hbWUpOwotICAgICAgdHJlZSBjc3QyID0gTlVMTF9UUkVFLCBuYW1lMiA9IE5VTExfVFJFRSwg bmFtZTMgPSBOVUxMX1RSRUU7CisgICAgICBnaW1wbGUgKnN0bXQyOwogCi0gICAgICAvKiBFeHRy YWN0IENTVDIgZnJvbSB0aGUgKG9wdGlvbmFsKSBhZGRpdGlvbi4gICovCi0gICAgICBpZiAoaXNf Z2ltcGxlX2Fzc2lnbiAoZGVmX3N0bXQpCi0JICAmJiBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChk ZWZfc3RtdCkgPT0gUExVU19FWFBSKQotCXsKLQkgIG5hbWUyID0gZ2ltcGxlX2Fzc2lnbl9yaHMx IChkZWZfc3RtdCk7Ci0JICBjc3QyID0gZ2ltcGxlX2Fzc2lnbl9yaHMyIChkZWZfc3RtdCk7Ci0J ICBpZiAoVFJFRV9DT0RFIChuYW1lMikgPT0gU1NBX05BTUUKLQkgICAgICAmJiBUUkVFX0NPREUg KGNzdDIpID09IElOVEVHRVJfQ1NUKQotCSAgICBkZWZfc3RtdCA9IFNTQV9OQU1FX0RFRl9TVE1U IChuYW1lMik7Ci0JfQorICAgICAgaWYgKFRSRUVfQ09ERSAoZ2ltcGxlX2Fzc2lnbl9yaHMxIChz dG10KSkgIT0gU1NBX05BTUUpCisJcmV0dXJuOworICAgICAgc3RtdDIgPSBTU0FfTkFNRV9ERUZf U1RNVCAoZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KSk7CisgICAgICBpZiAoIWdpbXBsZV9hc3Np Z25fY2FzdF9wIChzdG10MikKKwkgIHx8IGdpbXBsZV9hc3NpZ25fcmhzMSAoc3RtdDIpICE9IHZh cgorCSAgfHwgIUNPTlZFUlRfRVhQUl9DT0RFX1AgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0 bXQyKSkKKwkgIHx8IChUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX3Jo czEgKHN0bXQpKSkKKwkJCSAgICAgICE9IFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKHZhcikp KSkKKwlyZXR1cm47CisgICAgfQorICBjc3QgPSBnaW1wbGVfYXNzaWduX3JoczIgKHN0bXQpOwor ICBzZXRfbm9uemVyb19iaXRzICh2YXIsIHdpOjpiaXRfYW5kX25vdCAoZ2V0X25vbnplcm9fYml0 cyAodmFyKSwKKwkJCQkJICB3aTo6dG9fd2lkZSAoY3N0KSkpOworfQogCi0gICAgICAvKiBFeHRy YWN0IE5BTUUyIGZyb20gdGhlIChvcHRpb25hbCkgc2lnbi1jaGFuZ2luZyBjYXN0LiAgKi8KLSAg ICAgIGlmIChnYXNzaWduICphc3MgPSBkeW5fY2FzdCA8Z2Fzc2lnbiAqPiAoZGVmX3N0bXQpKQot CXsKLQkgIGlmIChDT05WRVJUX0VYUFJfQ09ERV9QIChnaW1wbGVfYXNzaWduX3Joc19jb2RlIChh c3MpKQotCSAgICAgICYmICEgVFlQRV9VTlNJR05FRCAoVFJFRV9UWVBFIChnaW1wbGVfYXNzaWdu X3JoczEgKGFzcykpKQotCSAgICAgICYmIChUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChnaW1w bGVfYXNzaWduX2xocyAoYXNzKSkpCi0JCSAgPT0gVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAo Z2ltcGxlX2Fzc2lnbl9yaHMxIChhc3MpKSkpKQotCSAgICBuYW1lMyA9IGdpbXBsZV9hc3NpZ25f cmhzMSAoYXNzKTsKLQl9CisvKiBTZWFyY2hlcyB0aGUgY2FzZSBsYWJlbCB2ZWN0b3IgVkVDIGZv ciB0aGUgaW5kZXggKklEWCBvZiB0aGUgQ0FTRV9MQUJFTAorICAgdGhhdCBpbmNsdWRlcyB0aGUg dmFsdWUgVkFMLiAgVGhlIHNlYXJjaCBpcyByZXN0cmljdGVkIHRvIHRoZSByYW5nZQorICAgW1NU QVJUX0lEWCwgbiAtIDFdIHdoZXJlIG4gaXMgdGhlIHNpemUgb2YgVkVDLgogCi0gICAgICAvKiBJ ZiBuYW1lMyBpcyB1c2VkIGxhdGVyLCBjcmVhdGUgYW4gQVNTRVJUX0VYUFIgZm9yIGl0LiAgKi8K LSAgICAgIGlmIChuYW1lMyAhPSBOVUxMX1RSRUUKLSAgICAgIAkgICYmIFRSRUVfQ09ERSAobmFt ZTMpID09IFNTQV9OQU1FCi0JICAmJiAoY3N0MiA9PSBOVUxMX1RSRUUKLQkgICAgICB8fCBUUkVF X0NPREUgKGNzdDIpID09IElOVEVHRVJfQ1NUKQotCSAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVF X1RZUEUgKG5hbWUzKSkpCi0JewotCSAgdHJlZSB0bXA7CisgICBJZiB0aGVyZSBpcyBhIENBU0Vf TEFCRUwgZm9yIFZBTCwgaXRzIGluZGV4IGlzIHBsYWNlZCBpbiBJRFggYW5kIHRydWUgaXMKKyAg IHJldHVybmVkLgogCi0JICAvKiBCdWlsZCBhbiBleHByZXNzaW9uIGZvciB0aGUgcmFuZ2UgdGVz dC4gICovCi0JICB0bXAgPSBidWlsZDEgKE5PUF9FWFBSLCBUUkVFX1RZUEUgKG5hbWUpLCBuYW1l Myk7Ci0JICBpZiAoY3N0MiAhPSBOVUxMX1RSRUUpCi0JICAgIHRtcCA9IGJ1aWxkMiAoUExVU19F WFBSLCBUUkVFX1RZUEUgKG5hbWUpLCB0bXAsIGNzdDIpOwotCSAgYWRkX2Fzc2VydF9pbmZvIChh c3NlcnRzLCBuYW1lMywgdG1wLCBjb21wX2NvZGUsIHZhbCk7Ci0JfQorICAgSWYgdGhlcmUgaXMg bm8gQ0FTRV9MQUJFTCBmb3IgVkFMIGFuZCB0aGVyZSBpcyBvbmUgdGhhdCBpcyBsYXJnZXIgdGhh biBWQUwsCisgICBpdCBpcyBwbGFjZWQgaW4gSURYIGFuZCBmYWxzZSBpcyByZXR1cm5lZC4KIAot ICAgICAgLyogSWYgbmFtZTIgaXMgdXNlZCBsYXRlciwgY3JlYXRlIGFuIEFTU0VSVF9FWFBSIGZv ciBpdC4gICovCi0gICAgICBpZiAobmFtZTIgIT0gTlVMTF9UUkVFCi0gICAgICAJICAmJiBUUkVF X0NPREUgKG5hbWUyKSA9PSBTU0FfTkFNRQotCSAgJiYgVFJFRV9DT0RFIChjc3QyKSA9PSBJTlRF R0VSX0NTVAotCSAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKG5hbWUyKSkpCi0Jewot CSAgdHJlZSB0bXA7Ci0KLQkgIC8qIEJ1aWxkIGFuIGV4cHJlc3Npb24gZm9yIHRoZSByYW5nZSB0 ZXN0LiAgKi8KLQkgIHRtcCA9IG5hbWUyOwotCSAgaWYgKFRSRUVfVFlQRSAobmFtZSkgIT0gVFJF RV9UWVBFIChuYW1lMikpCi0JICAgIHRtcCA9IGJ1aWxkMSAoTk9QX0VYUFIsIFRSRUVfVFlQRSAo bmFtZSksIHRtcCk7Ci0JICBpZiAoY3N0MiAhPSBOVUxMX1RSRUUpCi0JICAgIHRtcCA9IGJ1aWxk MiAoUExVU19FWFBSLCBUUkVFX1RZUEUgKG5hbWUpLCB0bXAsIGNzdDIpOwotCSAgYWRkX2Fzc2Vy dF9pbmZvIChhc3NlcnRzLCBuYW1lMiwgdG1wLCBjb21wX2NvZGUsIHZhbCk7Ci0JfQotICAgIH0K KyAgIElmIFZBTCBpcyBsYXJnZXIgdGhhbiBhbnkgQ0FTRV9MQUJFTCwgbiBpcyBwbGFjZWQgb24g SURYIGFuZCBmYWxzZSBpcworICAgcmV0dXJuZWQuICovCiAKLSAgLyogSW4gdGhlIGNhc2Ugb2Yg cG9zdC1pbi9kZWNyZW1lbnQgdGVzdHMgbGlrZSBpZiAoaSsrKSAuLi4gYW5kIHVzZXMKLSAgICAg b2YgdGhlIGluL2RlY3JlbWVudGVkIHZhbHVlIG9uIHRoZSBlZGdlIHRoZSBleHRyYSBuYW1lIHdl IHdhbnQgdG8KLSAgICAgYXNzZXJ0IGZvciBpcyBub3Qgb24gdGhlIGRlZiBjaGFpbiBvZiB0aGUg bmFtZSBjb21wYXJlZC4gIEluc3RlYWQKLSAgICAgaXQgaXMgaW4gdGhlIHNldCBvZiB1c2Ugc3Rt dHMuCi0gICAgIFNpbWlsYXIgY2FzZXMgaGFwcGVuIGZvciBjb252ZXJzaW9ucyB0aGF0IHdlcmUg c2ltcGxpZmllZCB0aHJvdWdoCi0gICAgIGZvbGRfe3NpZ25fY2hhbmdlZCx3aWRlbmVkfV9jb21w YXJpc29uLiAgKi8KLSAgaWYgKChjb21wX2NvZGUgPT0gTkVfRVhQUgotICAgICAgIHx8IGNvbXBf Y29kZSA9PSBFUV9FWFBSKQotICAgICAgJiYgVFJFRV9DT0RFICh2YWwpID09IElOVEVHRVJfQ1NU KQotICAgIHsKLSAgICAgIGltbV91c2VfaXRlcmF0b3IgdWk7Ci0gICAgICBnaW1wbGUgKnVzZV9z dG10OwotICAgICAgRk9SX0VBQ0hfSU1NX1VTRV9TVE1UICh1c2Vfc3RtdCwgdWksIG5hbWUpCi0J ewotCSAgaWYgKCFpc19naW1wbGVfYXNzaWduICh1c2Vfc3RtdCkpCi0JICAgIGNvbnRpbnVlOwor Ym9vbAorZmluZF9jYXNlX2xhYmVsX2luZGV4IChnc3dpdGNoICpzdG10LCBzaXplX3Qgc3RhcnRf aWR4LCB0cmVlIHZhbCwgc2l6ZV90ICppZHgpCit7CisgIHNpemVfdCBuID0gZ2ltcGxlX3N3aXRj aF9udW1fbGFiZWxzIChzdG10KTsKKyAgc2l6ZV90IGxvdywgaGlnaDsKIAotCSAgLyogQ3V0IG9m ZiB0byB1c2Utc3RtdHMgdGhhdCBhcmUgZG9taW5hdGluZyB0aGUgcHJlZGVjZXNzb3IuICAqLwot CSAgaWYgKCFkb21pbmF0ZWRfYnlfcCAoQ0RJX0RPTUlOQVRPUlMsIGUtPnNyYywgZ2ltcGxlX2Ji ICh1c2Vfc3RtdCkpKQotCSAgICBjb250aW51ZTsKKyAgLyogRmluZCBjYXNlIGxhYmVsIGZvciBt aW5pbXVtIG9mIHRoZSB2YWx1ZSByYW5nZSBvciB0aGUgbmV4dCBvbmUuCisgICAgIEF0IGVhY2gg aXRlcmF0aW9uIHdlIGFyZSBzZWFyY2hpbmcgaW4gW2xvdywgaGlnaCAtIDFdLiAqLwogCi0JICB0 cmVlIG5hbWUyID0gZ2ltcGxlX2Fzc2lnbl9saHMgKHVzZV9zdG10KTsKLQkgIGlmIChUUkVFX0NP REUgKG5hbWUyKSAhPSBTU0FfTkFNRSkKLQkgICAgY29udGludWU7CisgIGZvciAobG93ID0gc3Rh cnRfaWR4LCBoaWdoID0gbjsgaGlnaCAhPSBsb3c7ICkKKyAgICB7CisgICAgICB0cmVlIHQ7Cisg ICAgICBpbnQgY21wOworICAgICAgLyogTm90ZSB0aGF0IGkgIT0gaGlnaCwgc28gd2UgbmV2ZXIg YXNrIGZvciBuLiAqLworICAgICAgc2l6ZV90IGkgPSAoaGlnaCArIGxvdykgLyAyOworICAgICAg dCA9IGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGkpOwogCi0JICBlbnVtIHRyZWVfY29kZSBj b2RlID0gZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAodXNlX3N0bXQpOwotCSAgdHJlZSBjc3Q7Ci0J ICBpZiAoY29kZSA9PSBQTFVTX0VYUFIKLQkgICAgICB8fCBjb2RlID09IE1JTlVTX0VYUFIpCi0J ICAgIHsKLQkgICAgICBjc3QgPSBnaW1wbGVfYXNzaWduX3JoczIgKHVzZV9zdG10KTsKLQkgICAg ICBpZiAoVFJFRV9DT0RFIChjc3QpICE9IElOVEVHRVJfQ1NUKQotCQljb250aW51ZTsKLQkgICAg ICBjc3QgPSBpbnRfY29uc3RfYmlub3AgKGNvZGUsIHZhbCwgY3N0KTsKLQkgICAgfQotCSAgZWxz ZSBpZiAoQ09OVkVSVF9FWFBSX0NPREVfUCAoY29kZSkpCi0JICAgIHsKLQkgICAgICAvKiBGb3Ig dHJ1bmNhdGluZyBjb252ZXJzaW9ucyB3ZSBjYW5ub3QgcmVjb3JkCi0JCSBhbiBpbmVxdWFsaXR5 LiAgKi8KLQkgICAgICBpZiAoY29tcF9jb2RlID09IE5FX0VYUFIKLQkJICAmJiAoVFlQRV9QUkVD SVNJT04gKFRSRUVfVFlQRSAobmFtZTIpKQotCQkgICAgICA8IFRZUEVfUFJFQ0lTSU9OIChUUkVF X1RZUEUgKG5hbWUpKSkpCi0JCWNvbnRpbnVlOwotCSAgICAgIGNzdCA9IGZvbGRfY29udmVydCAo VFJFRV9UWVBFIChuYW1lMiksIHZhbCk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgY29udGludWU7 CisgICAgICAvKiBDYWNoZSB0aGUgcmVzdWx0IG9mIGNvbXBhcmluZyBDQVNFX0xPVyBhbmQgdmFs LiAgKi8KKyAgICAgIGNtcCA9IHRyZWVfaW50X2NzdF9jb21wYXJlIChDQVNFX0xPVyAodCksIHZh bCk7CiAKLQkgIGlmIChUUkVFX09WRVJGTE9XX1AgKGNzdCkpCi0JICAgIGNzdCA9IGRyb3BfdHJl ZV9vdmVyZmxvdyAoY3N0KTsKLQkgIGFkZF9hc3NlcnRfaW5mbyAoYXNzZXJ0cywgbmFtZTIsIG5h bWUyLCBjb21wX2NvZGUsIGNzdCk7Ci0JfQotICAgIH0KLSAKLSAgaWYgKFRSRUVfQ09ERV9DTEFT UyAoY29tcF9jb2RlKSA9PSB0Y2NfY29tcGFyaXNvbgotICAgICAgJiYgVFJFRV9DT0RFICh2YWwp ID09IElOVEVHRVJfQ1NUKQotICAgIHsKLSAgICAgIGdpbXBsZSAqZGVmX3N0bXQgPSBTU0FfTkFN RV9ERUZfU1RNVCAobmFtZSk7Ci0gICAgICB0cmVlIG5hbWUyID0gTlVMTF9UUkVFLCBuYW1lc1sy XSwgY3N0MiA9IE5VTExfVFJFRTsKLSAgICAgIHRyZWUgdmFsMiA9IE5VTExfVFJFRTsKLSAgICAg IHVuc2lnbmVkIGludCBwcmVjID0gVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAodmFsKSk7Ci0g ICAgICB3aWRlX2ludCBtYXNrID0gd2k6Onplcm8gKHByZWMpOwotICAgICAgdW5zaWduZWQgaW50 IG5wcmVjID0gcHJlYzsKLSAgICAgIGVudW0gdHJlZV9jb2RlIHJoc19jb2RlID0gRVJST1JfTUFS SzsKLQotICAgICAgaWYgKGlzX2dpbXBsZV9hc3NpZ24gKGRlZl9zdG10KSkKLQlyaHNfY29kZSA9 IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKGRlZl9zdG10KTsKLQotICAgICAgLyogSW4gdGhlIGNh c2Ugb2YgTkFNRSAhPSBDU1QxIHdoZXJlIE5BTUUgPSBBICstIENTVDIgd2UgY2FuCi0gICAgICAg ICBhc3NlcnQgdGhhdCBBICE9IENTVDEgLSsgQ1NUMi4gICovCi0gICAgICBpZiAoKGNvbXBfY29k ZSA9PSBFUV9FWFBSIHx8IGNvbXBfY29kZSA9PSBORV9FWFBSKQotCSAgJiYgKHJoc19jb2RlID09 IFBMVVNfRVhQUiB8fCByaHNfY29kZSA9PSBNSU5VU19FWFBSKSkKKyAgICAgIGlmIChjbXAgPT0g MCkKIAl7Ci0JICB0cmVlIG9wMCA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoZGVmX3N0bXQpOwotCSAg dHJlZSBvcDEgPSBnaW1wbGVfYXNzaWduX3JoczIgKGRlZl9zdG10KTsKLQkgIGlmIChUUkVFX0NP REUgKG9wMCkgPT0gU1NBX05BTUUKLQkgICAgICAmJiBUUkVFX0NPREUgKG9wMSkgPT0gSU5URUdF Ul9DU1QpCi0JICAgIHsKLQkgICAgICBlbnVtIHRyZWVfY29kZSByZXZlcnNlX29wID0gKHJoc19j b2RlID09IFBMVVNfRVhQUgotCQkJCQkgICA/IE1JTlVTX0VYUFIgOiBQTFVTX0VYUFIpOwotCSAg ICAgIG9wMSA9IGludF9jb25zdF9iaW5vcCAocmV2ZXJzZV9vcCwgdmFsLCBvcDEpOwotCSAgICAg IGlmIChUUkVFX09WRVJGTE9XIChvcDEpKQotCQlvcDEgPSBkcm9wX3RyZWVfb3ZlcmZsb3cgKG9w MSk7Ci0JICAgICAgYWRkX2Fzc2VydF9pbmZvIChhc3NlcnRzLCBvcDAsIG9wMCwgY29tcF9jb2Rl LCBvcDEpOwotCSAgICB9CisJICAvKiBSYW5nZXMgY2Fubm90IGJlIGVtcHR5LiAqLworCSAgKmlk eCA9IGk7CisJICByZXR1cm4gdHJ1ZTsKIAl9Ci0KLSAgICAgIC8qIEFkZCBhc3NlcnRzIGZvciBO QU1FIGNtcCBDU1QgYW5kIE5BTUUgYmVpbmcgZGVmaW5lZAotCSBhcyBOQU1FID0gKGludCkgTkFN RTIuICAqLwotICAgICAgaWYgKCFUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKHZhbCkpCi0JICAm JiAoY29tcF9jb2RlID09IExFX0VYUFIgfHwgY29tcF9jb2RlID09IExUX0VYUFIKLQkgICAgICB8 fCBjb21wX2NvZGUgPT0gR1RfRVhQUiB8fCBjb21wX2NvZGUgPT0gR0VfRVhQUikKLQkgICYmIGdp bXBsZV9hc3NpZ25fY2FzdF9wIChkZWZfc3RtdCkpCisgICAgICBlbHNlIGlmIChjbXAgPiAwKQor CWhpZ2ggPSBpOworICAgICAgZWxzZQogCXsKLQkgIG5hbWUyID0gZ2ltcGxlX2Fzc2lnbl9yaHMx IChkZWZfc3RtdCk7Ci0JICBpZiAoQ09OVkVSVF9FWFBSX0NPREVfUCAocmhzX2NvZGUpCi0JICAg ICAgJiYgVFJFRV9DT0RFIChuYW1lMikgPT0gU1NBX05BTUUKLQkgICAgICAmJiBJTlRFR1JBTF9U WVBFX1AgKFRSRUVfVFlQRSAobmFtZTIpKQotCSAgICAgICYmIFRZUEVfVU5TSUdORUQgKFRSRUVf VFlQRSAobmFtZTIpKQotCSAgICAgICYmIHByZWMgPT0gVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQ RSAobmFtZTIpKQotCSAgICAgICYmIChjb21wX2NvZGUgPT0gTEVfRVhQUiB8fCBjb21wX2NvZGUg PT0gR1RfRVhQUgotCQkgIHx8ICF0cmVlX2ludF9jc3RfZXF1YWwgKHZhbCwKLQkJCQkJICBUWVBF X01JTl9WQUxVRSAoVFJFRV9UWVBFICh2YWwpKSkpKQorCSAgbG93ID0gaSArIDE7CisJICBpZiAo Q0FTRV9ISUdIICh0KSAhPSBOVUxMCisJICAgICAgJiYgdHJlZV9pbnRfY3N0X2NvbXBhcmUgKENB U0VfSElHSCAodCksIHZhbCkgPj0gMCkKIAkgICAgewotCSAgICAgIHRyZWUgdG1wLCBjc3Q7Ci0J ICAgICAgZW51bSB0cmVlX2NvZGUgbmV3X2NvbXBfY29kZSA9IGNvbXBfY29kZTsKLQotCSAgICAg IGNzdCA9IGZvbGRfY29udmVydCAoVFJFRV9UWVBFIChuYW1lMiksCi0JCQkJICBUWVBFX01JTl9W QUxVRSAoVFJFRV9UWVBFICh2YWwpKSk7Ci0JICAgICAgLyogQnVpbGQgYW4gZXhwcmVzc2lvbiBm b3IgdGhlIHJhbmdlIHRlc3QuICAqLwotCSAgICAgIHRtcCA9IGJ1aWxkMiAoUExVU19FWFBSLCBU UkVFX1RZUEUgKG5hbWUyKSwgbmFtZTIsIGNzdCk7Ci0JICAgICAgY3N0ID0gZm9sZF9idWlsZDIg KFBMVVNfRVhQUiwgVFJFRV9UWVBFIChuYW1lMiksIGNzdCwKLQkJCQkgZm9sZF9jb252ZXJ0IChU UkVFX1RZUEUgKG5hbWUyKSwgdmFsKSk7Ci0JICAgICAgaWYgKGNvbXBfY29kZSA9PSBMVF9FWFBS IHx8IGNvbXBfY29kZSA9PSBHRV9FWFBSKQotCQl7Ci0JCSAgbmV3X2NvbXBfY29kZSA9IGNvbXBf Y29kZSA9PSBMVF9FWFBSID8gTEVfRVhQUiA6IEdUX0VYUFI7Ci0JCSAgY3N0ID0gZm9sZF9idWls ZDIgKE1JTlVTX0VYUFIsIFRSRUVfVFlQRSAobmFtZTIpLCBjc3QsCi0JCQkJICAgICBidWlsZF9p bnRfY3N0IChUUkVFX1RZUEUgKG5hbWUyKSwgMSkpOwotCQl9Ci0JICAgICAgYWRkX2Fzc2VydF9p bmZvIChhc3NlcnRzLCBuYW1lMiwgdG1wLCBuZXdfY29tcF9jb2RlLCBjc3QpOworCSAgICAgICpp ZHggPSBpOworCSAgICAgIHJldHVybiB0cnVlOwogCSAgICB9CiAJfQorICAgIH0KIAotICAgICAg LyogQWRkIGFzc2VydHMgZm9yIE5BTUUgY21wIENTVCBhbmQgTkFNRSBiZWluZyBkZWZpbmVkIGFz Ci0JIE5BTUUgPSBOQU1FMiA+PiBDU1QyLgorICAqaWR4ID0gaGlnaDsKKyAgcmV0dXJuIGZhbHNl OworfQogCi0JIEV4dHJhY3QgQ1NUMiBmcm9tIHRoZSByaWdodCBzaGlmdC4gICovCi0gICAgICBp ZiAocmhzX2NvZGUgPT0gUlNISUZUX0VYUFIpCi0JewotCSAgbmFtZTIgPSBnaW1wbGVfYXNzaWdu X3JoczEgKGRlZl9zdG10KTsKLQkgIGNzdDIgPSBnaW1wbGVfYXNzaWduX3JoczIgKGRlZl9zdG10 KTsKLQkgIGlmIChUUkVFX0NPREUgKG5hbWUyKSA9PSBTU0FfTkFNRQotCSAgICAgICYmIHRyZWVf Zml0c191aHdpX3AgKGNzdDIpCi0JICAgICAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUg KG5hbWUyKSkKLQkgICAgICAmJiBJTl9SQU5HRSAodHJlZV90b191aHdpIChjc3QyKSwgMSwgcHJl YyAtIDEpCi0JICAgICAgJiYgdHlwZV9oYXNfbW9kZV9wcmVjaXNpb25fcCAoVFJFRV9UWVBFICh2 YWwpKSkKLQkgICAgewotCSAgICAgIG1hc2sgPSB3aTo6bWFzayAodHJlZV90b191aHdpIChjc3Qy KSwgZmFsc2UsIHByZWMpOwotCSAgICAgIHZhbDIgPSBmb2xkX2JpbmFyeSAoTFNISUZUX0VYUFIs IFRSRUVfVFlQRSAodmFsKSwgdmFsLCBjc3QyKTsKLQkgICAgfQotCX0KLSAgICAgIGlmICh2YWwy ICE9IE5VTExfVFJFRQotCSAgJiYgVFJFRV9DT0RFICh2YWwyKSA9PSBJTlRFR0VSX0NTVAotCSAg JiYgc2ltcGxlX2NzdF9lcXVhbCAoZm9sZF9idWlsZDIgKFJTSElGVF9FWFBSLAotCQkJCQkgICAg VFJFRV9UWVBFICh2YWwpLAotCQkJCQkgICAgdmFsMiwgY3N0MiksIHZhbCkpCi0JewotCSAgZW51 bSB0cmVlX2NvZGUgbmV3X2NvbXBfY29kZSA9IGNvbXBfY29kZTsKLQkgIHRyZWUgdG1wLCBuZXdf dmFsOworLyogU2VhcmNoZXMgdGhlIGNhc2UgbGFiZWwgdmVjdG9yIFZFQyBmb3IgdGhlIHJhbmdl IG9mIENBU0VfTEFCRUxzIHRoYXQgaXMgdXNlZAorICAgZm9yIHZhbHVlcyBiZXR3ZWVuIE1JTiBh bmQgTUFYLiBUaGUgZmlyc3QgaW5kZXggaXMgcGxhY2VkIGluIE1JTl9JRFguIFRoZQorICAgbGFz dCBpbmRleCBpcyBwbGFjZWQgaW4gTUFYX0lEWC4gSWYgdGhlIHJhbmdlIG9mIENBU0VfTEFCRUxz IGlzIGVtcHR5CisgICB0aGVuIE1BWF9JRFggPCBNSU5fSURYLgorICAgUmV0dXJucyB0cnVlIGlm IHRoZSBkZWZhdWx0IGxhYmVsIGlzIG5vdCBuZWVkZWQuICovCiAKLQkgIHRtcCA9IG5hbWUyOwot CSAgaWYgKGNvbXBfY29kZSA9PSBFUV9FWFBSIHx8IGNvbXBfY29kZSA9PSBORV9FWFBSKQotCSAg ICB7Ci0JICAgICAgaWYgKCFUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKHZhbCkpKQotCQl7Ci0J CSAgdHJlZSB0eXBlID0gYnVpbGRfbm9uc3RhbmRhcmRfaW50ZWdlcl90eXBlIChwcmVjLCAxKTsK LQkJICB0bXAgPSBidWlsZDEgKE5PUF9FWFBSLCB0eXBlLCBuYW1lMik7Ci0JCSAgdmFsMiA9IGZv bGRfY29udmVydCAodHlwZSwgdmFsMik7Ci0JCX0KLQkgICAgICB0bXAgPSBmb2xkX2J1aWxkMiAo TUlOVVNfRVhQUiwgVFJFRV9UWVBFICh0bXApLCB0bXAsIHZhbDIpOwotCSAgICAgIG5ld192YWwg PSB3aWRlX2ludF90b190cmVlIChUUkVFX1RZUEUgKHRtcCksIG1hc2spOwotCSAgICAgIG5ld19j b21wX2NvZGUgPSBjb21wX2NvZGUgPT0gRVFfRVhQUiA/IExFX0VYUFIgOiBHVF9FWFBSOwotCSAg ICB9Ci0JICBlbHNlIGlmIChjb21wX2NvZGUgPT0gTFRfRVhQUiB8fCBjb21wX2NvZGUgPT0gR0Vf RVhQUikKLQkgICAgewotCSAgICAgIHdpZGVfaW50IG1pbnZhbAotCQk9IHdpOjptaW5fdmFsdWUg KHByZWMsIFRZUEVfU0lHTiAoVFJFRV9UWVBFICh2YWwpKSk7Ci0JICAgICAgbmV3X3ZhbCA9IHZh bDI7Ci0JICAgICAgaWYgKG1pbnZhbCA9PSB3aTo6dG9fd2lkZSAobmV3X3ZhbCkpCi0JCW5ld192 YWwgPSBOVUxMX1RSRUU7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIHdpZGVfaW50 IG1heHZhbAotCQk9IHdpOjptYXhfdmFsdWUgKHByZWMsIFRZUEVfU0lHTiAoVFJFRV9UWVBFICh2 YWwpKSk7Ci0JICAgICAgbWFzayB8PSB3aTo6dG9fd2lkZSAodmFsMik7Ci0JICAgICAgaWYgKHdp OjplcV9wIChtYXNrLCBtYXh2YWwpKQotCQluZXdfdmFsID0gTlVMTF9UUkVFOwotCSAgICAgIGVs c2UKLQkJbmV3X3ZhbCA9IHdpZGVfaW50X3RvX3RyZWUgKFRSRUVfVFlQRSAodmFsMiksIG1hc2sp OwotCSAgICB9Citib29sCitmaW5kX2Nhc2VfbGFiZWxfcmFuZ2UgKGdzd2l0Y2ggKnN0bXQsIHRy ZWUgbWluLCB0cmVlIG1heCwgc2l6ZV90ICptaW5faWR4LAorCQkgICAgICAgc2l6ZV90ICptYXhf aWR4KQoreworICBzaXplX3QgaSwgajsKKyAgYm9vbCBtaW5fdGFrZV9kZWZhdWx0ID0gIWZpbmRf Y2FzZV9sYWJlbF9pbmRleCAoc3RtdCwgMSwgbWluLCAmaSk7CisgIGJvb2wgbWF4X3Rha2VfZGVm YXVsdCA9ICFmaW5kX2Nhc2VfbGFiZWxfaW5kZXggKHN0bXQsIGksIG1heCwgJmopOwogCi0JICBp ZiAobmV3X3ZhbCkKLQkgICAgYWRkX2Fzc2VydF9pbmZvIChhc3NlcnRzLCBuYW1lMiwgdG1wLCBu ZXdfY29tcF9jb2RlLCBuZXdfdmFsKTsKLQl9CisgIGlmIChpID09IGoKKyAgICAgICYmIG1pbl90 YWtlX2RlZmF1bHQKKyAgICAgICYmIG1heF90YWtlX2RlZmF1bHQpCisgICAgeworICAgICAgLyog T25seSB0aGUgZGVmYXVsdCBjYXNlIGxhYmVsIHJlYWNoZWQuCisgICAgICAgICBSZXR1cm4gYW4g ZW1wdHkgcmFuZ2UuICovCisgICAgICAqbWluX2lkeCA9IDE7CisgICAgICAqbWF4X2lkeCA9IDA7 CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgYm9vbCB0 YWtlX2RlZmF1bHQgPSBtaW5fdGFrZV9kZWZhdWx0IHx8IG1heF90YWtlX2RlZmF1bHQ7CisgICAg ICB0cmVlIGxvdywgaGlnaDsKKyAgICAgIHNpemVfdCBrOwogCi0gICAgICAvKiBJZiB3ZSBoYXZl IGEgY29udmVyc2lvbiB0aGF0IGRvZXNuJ3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgc291cmNl Ci0gICAgICAgICBzaW1wbHkgcmVnaXN0ZXIgdGhlIHNhbWUgYXNzZXJ0IGZvciBpdC4gICovCi0g ICAgICBpZiAoQ09OVkVSVF9FWFBSX0NPREVfUCAocmhzX2NvZGUpKQotCXsKLQkgIHZhbHVlX3Jh bmdlIHZyOwotCSAgdHJlZSByaHMxID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChkZWZfc3RtdCk7Ci0J ICBpZiAoSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKHJoczEpKQotCSAgICAgICYmIFRSRUVf Q09ERSAocmhzMSkgPT0gU1NBX05BTUUKLQkgICAgICAvKiBNYWtlIHN1cmUgdGhlIHJlbGF0aW9u IHByZXNlcnZlcyB0aGUgdXBwZXIvbG93ZXIgYm91bmRhcnkgb2YKLQkgICAgICAgICB0aGUgcmFu Z2UgY29uc2VydmF0aXZlbHkuICAqLwotCSAgICAgICYmIChjb21wX2NvZGUgPT0gTkVfRVhQUgot CQkgIHx8IGNvbXBfY29kZSA9PSBFUV9FWFBSCi0JCSAgfHwgKFRZUEVfU0lHTiAoVFJFRV9UWVBF IChuYW1lKSkKLQkJICAgICAgPT0gVFlQRV9TSUdOIChUUkVFX1RZUEUgKHJoczEpKSkKLQkJICB8 fCAoKGNvbXBfY29kZSA9PSBMRV9FWFBSCi0JCSAgICAgICB8fCBjb21wX2NvZGUgPT0gTFRfRVhQ UikKLQkJICAgICAgJiYgIVRZUEVfVU5TSUdORUQgKFRSRUVfVFlQRSAocmhzMSkpKQotCQkgIHx8 ICgoY29tcF9jb2RlID09IEdFX0VYUFIKLQkJICAgICAgIHx8IGNvbXBfY29kZSA9PSBHVF9FWFBS KQotCQkgICAgICAmJiBUWVBFX1VOU0lHTkVEIChUUkVFX1RZUEUgKHJoczEpKSkpCi0JICAgICAg LyogQW5kIHRoZSBjb252ZXJzaW9uIGRvZXMgbm90IGFsdGVyIHRoZSB2YWx1ZSB3ZSBjb21wYXJl Ci0JICAgICAgICAgYWdhaW5zdCBhbmQgYWxsIHZhbHVlcyBpbiByaHMxIGNhbiBiZSByZXByZXNl bnRlZCBpbgotCQkgdGhlIGNvbnZlcnRlZCB0byB0eXBlLiAgKi8KLQkgICAgICAmJiBpbnRfZml0 c190eXBlX3AgKHZhbCwgVFJFRV9UWVBFIChyaHMxKSkKLQkgICAgICAmJiAoKFRZUEVfUFJFQ0lT SU9OIChUUkVFX1RZUEUgKG5hbWUpKQotCQkgICA+IFRZUEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUg KHJoczEpKSkKLQkJICB8fCAoKGdldF9yYW5nZV9xdWVyeSAoY2Z1biktPnJhbmdlX29mX2V4cHIg KHZyLCByaHMxKQotCQkgICAgICAgJiYgdnIua2luZCAoKSA9PSBWUl9SQU5HRSkKLQkJICAgICAg JiYgd2k6OmZpdHNfdG9fdHJlZV9wCi0JCQkgICAod2lkZXN0X2ludDo6ZnJvbSAodnIubG93ZXJf Ym91bmQgKCksCi0JCQkJCSAgICAgIFRZUEVfU0lHTiAoVFJFRV9UWVBFIChyaHMxKSkpLAotCQkJ ICAgIFRSRUVfVFlQRSAobmFtZSkpCi0JCSAgICAgICYmIHdpOjpmaXRzX3RvX3RyZWVfcAotCQkJ ICAgKHdpZGVzdF9pbnQ6OmZyb20gKHZyLnVwcGVyX2JvdW5kICgpLAotCQkJCQkgICAgICBUWVBF X1NJR04gKFRSRUVfVFlQRSAocmhzMSkpKSwKLQkJCSAgICBUUkVFX1RZUEUgKG5hbWUpKSkpKQot CSAgICBhZGRfYXNzZXJ0X2luZm8gKGFzc2VydHMsIHJoczEsIHJoczEsCi0JCSAJICAgICBjb21w X2NvZGUsIGZvbGRfY29udmVydCAoVFJFRV9UWVBFIChyaHMxKSwgdmFsKSk7Ci0JfQorICAgICAg aWYgKG1heF90YWtlX2RlZmF1bHQpCisJai0tOwogCi0gICAgICAvKiBBZGQgYXNzZXJ0cyBmb3Ig TkFNRSBjbXAgQ1NUIGFuZCBOQU1FIGJlaW5nIGRlZmluZWQgYXMKLQkgTkFNRSA9IE5BTUUyICYg Q1NUMi4KLQotCSBFeHRyYWN0IENTVDIgZnJvbSB0aGUgYW5kLgotCi0JIEFsc28gaGFuZGxlCi0J IE5BTUUgPSAodW5zaWduZWQpIE5BTUUyOwotCSBjYXN0cyB3aGVyZSBOQU1FJ3MgdHlwZSBpcyB1 bnNpZ25lZCBhbmQgaGFzIHNtYWxsZXIgcHJlY2lzaW9uCi0JIHRoYW4gTkFNRTIncyB0eXBlIGFz IGlmIGl0IHdhcyBOQU1FID0gTkFNRTIgJiBNQVNLLiAgKi8KLSAgICAgIG5hbWVzWzBdID0gTlVM TF9UUkVFOwotICAgICAgbmFtZXNbMV0gPSBOVUxMX1RSRUU7Ci0gICAgICBjc3QyID0gTlVMTF9U UkVFOwotICAgICAgaWYgKHJoc19jb2RlID09IEJJVF9BTkRfRVhQUgotCSAgfHwgKENPTlZFUlRf RVhQUl9DT0RFX1AgKHJoc19jb2RlKQotCSAgICAgICYmIElOVEVHUkFMX1RZUEVfUCAoVFJFRV9U WVBFICh2YWwpKQotCSAgICAgICYmIFRZUEVfVU5TSUdORUQgKFRSRUVfVFlQRSAodmFsKSkKLQkg ICAgICAmJiBUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX3JoczEgKGRl Zl9zdG10KSkpCi0JCSA+IHByZWMpKQorICAgICAgLyogSWYgdGhlIGNhc2UgbGFiZWwgcmFuZ2Ug aXMgY29udGludW91cywgd2UgZG8gbm90IG5lZWQKKwkgdGhlIGRlZmF1bHQgY2FzZSBsYWJlbC4g IFZlcmlmeSB0aGF0LiAgKi8KKyAgICAgIGhpZ2ggPSBDQVNFX0xPVyAoZ2ltcGxlX3N3aXRjaF9s YWJlbCAoc3RtdCwgaSkpOworICAgICAgaWYgKENBU0VfSElHSCAoZ2ltcGxlX3N3aXRjaF9sYWJl bCAoc3RtdCwgaSkpKQorCWhpZ2ggPSBDQVNFX0hJR0ggKGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0 bXQsIGkpKTsKKyAgICAgIGZvciAoayA9IGkgKyAxOyBrIDw9IGo7ICsraykKIAl7Ci0JICBuYW1l MiA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoZGVmX3N0bXQpOwotCSAgaWYgKHJoc19jb2RlID09IEJJ VF9BTkRfRVhQUikKLQkgICAgY3N0MiA9IGdpbXBsZV9hc3NpZ25fcmhzMiAoZGVmX3N0bXQpOwot CSAgZWxzZQotCSAgICB7Ci0JICAgICAgY3N0MiA9IFRZUEVfTUFYX1ZBTFVFIChUUkVFX1RZUEUg KHZhbCkpOwotCSAgICAgIG5wcmVjID0gVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAobmFtZTIp KTsKLQkgICAgfQotCSAgaWYgKFRSRUVfQ09ERSAobmFtZTIpID09IFNTQV9OQU1FCi0JICAgICAg JiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKG5hbWUyKSkKLQkgICAgICAmJiBUUkVFX0NP REUgKGNzdDIpID09IElOVEVHRVJfQ1NUCi0JICAgICAgJiYgIWludGVnZXJfemVyb3AgKGNzdDIp Ci0JICAgICAgJiYgKG5wcmVjID4gMQotCQkgIHx8IFRZUEVfVU5TSUdORUQgKFRSRUVfVFlQRSAo dmFsKSkpKQorCSAgbG93ID0gQ0FTRV9MT1cgKGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGsp KTsKKwkgIGlmICghaW50ZWdlcl9vbmVwIChpbnRfY29uc3RfYmlub3AgKE1JTlVTX0VYUFIsIGxv dywgaGlnaCkpKQogCSAgICB7Ci0JICAgICAgZ2ltcGxlICpkZWZfc3RtdDIgPSBTU0FfTkFNRV9E RUZfU1RNVCAobmFtZTIpOwotCSAgICAgIGlmIChnaW1wbGVfYXNzaWduX2Nhc3RfcCAoZGVmX3N0 bXQyKSkKLQkJewotCQkgIG5hbWVzWzFdID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChkZWZfc3RtdDIp OwotCQkgIGlmICghQ09OVkVSVF9FWFBSX0NPREVfUCAoZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAo ZGVmX3N0bXQyKSkKLQkJICAgICAgfHwgVFJFRV9DT0RFIChuYW1lc1sxXSkgIT0gU1NBX05BTUUK LQkJICAgICAgfHwgIUlOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFIChuYW1lc1sxXSkpCi0JCSAg ICAgIHx8IChUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChuYW1lMikpCi0JCQkgICE9IFRZUEVf UFJFQ0lTSU9OIChUUkVFX1RZUEUgKG5hbWVzWzFdKSkpKQotCQkgICAgbmFtZXNbMV0gPSBOVUxM X1RSRUU7Ci0JCX0KLQkgICAgICBuYW1lc1swXSA9IG5hbWUyOworCSAgICAgIHRha2VfZGVmYXVs dCA9IHRydWU7CisJICAgICAgYnJlYWs7CiAJICAgIH0KKwkgIGhpZ2ggPSBsb3c7CisJICBpZiAo Q0FTRV9ISUdIIChnaW1wbGVfc3dpdGNoX2xhYmVsIChzdG10LCBrKSkpCisJICAgIGhpZ2ggPSBD QVNFX0hJR0ggKGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGspKTsKIAl9Ci0gICAgICBpZiAo bmFtZXNbMF0gfHwgbmFtZXNbMV0pCi0JewotCSAgd2lkZV9pbnQgbWludiwgbWF4diwgdmFsdiwg Y3N0MnY7Ci0JICB3aWRlX2ludCB0ZW0sIHNnbmJpdDsKLQkgIGJvb2wgdmFsaWRfcCA9IGZhbHNl LCB2YWxuLCBjc3QybjsKLQkgIGVudW0gdHJlZV9jb2RlIGNjb2RlID0gY29tcF9jb2RlOwotCi0J ICB2YWx2ID0gd2lkZV9pbnQ6OmZyb20gKHdpOjp0b193aWRlICh2YWwpLCBucHJlYywgVU5TSUdO RUQpOwotCSAgY3N0MnYgPSB3aWRlX2ludDo6ZnJvbSAod2k6OnRvX3dpZGUgKGNzdDIpLCBucHJl YywgVU5TSUdORUQpOwotCSAgdmFsbiA9IHdpOjpuZWdfcCAodmFsdiwgVFlQRV9TSUdOIChUUkVF X1RZUEUgKHZhbCkpKTsKLQkgIGNzdDJuID0gd2k6Om5lZ19wIChjc3QydiwgVFlQRV9TSUdOIChU UkVFX1RZUEUgKHZhbCkpKTsKLQkgIC8qIElmIENTVDIgZG9lc24ndCBoYXZlIG1vc3Qgc2lnbmlm aWNhbnQgYml0IHNldCwKLQkgICAgIGJ1dCBWQUwgaXMgbmVnYXRpdmUsIHdlIGhhdmUgY29tcGFy aXNvbiBsaWtlCi0JICAgICBpZiAoKHggJiAweDEyMykgPiAtNCkgKGFsd2F5cyB0cnVlKS4gIEp1 c3QgZ2l2ZSB1cC4gICovCi0JICBpZiAoIWNzdDJuICYmIHZhbG4pCi0JICAgIGNjb2RlID0gRVJS T1JfTUFSSzsKLQkgIGlmIChjc3QybikKLQkgICAgc2duYml0ID0gd2k6OnNldF9iaXRfaW5femVy byAobnByZWMgLSAxLCBucHJlYyk7Ci0JICBlbHNlCi0JICAgIHNnbmJpdCA9IHdpOjp6ZXJvIChu cHJlYyk7Ci0JICBtaW52ID0gdmFsdiAmIGNzdDJ2OwotCSAgc3dpdGNoIChjY29kZSkKLQkgICAg ewotCSAgICBjYXNlIEVRX0VYUFI6Ci0JICAgICAgLyogTWluaW11bSB1bnNpZ25lZCB2YWx1ZSBm b3IgZXF1YWxpdHkgaXMgVkFMICYgQ1NUMgotCQkgKHNob3VsZCBiZSBlcXVhbCB0byBWQUwsIG90 aGVyd2lzZSB3ZSBwcm9iYWJseSBzaG91bGQKLQkJIGhhdmUgZm9sZGVkIHRoZSBjb21wYXJpc29u IGludG8gZmFsc2UpIGFuZAotCQkgbWF4aW11bSB1bnNpZ25lZCB2YWx1ZSBpcyBWQUwgfCB+Q1NU Mi4gICovCi0JICAgICAgbWF4diA9IHZhbHYgfCB+Y3N0MnY7Ci0JICAgICAgdmFsaWRfcCA9IHRy dWU7Ci0JICAgICAgYnJlYWs7CiAKLQkgICAgY2FzZSBORV9FWFBSOgotCSAgICAgIHRlbSA9IHZh bHYgfCB+Y3N0MnY7Ci0JICAgICAgLyogSWYgVkFMIGlzIDAsIGhhbmRsZSAoWCAmIENTVDIpICE9 IDAgYXMgKFggJiBDU1QyKSA+IDBVLiAgKi8KLQkgICAgICBpZiAodmFsdiA9PSAwKQotCQl7Ci0J CSAgY3N0Mm4gPSBmYWxzZTsKLQkJICBzZ25iaXQgPSB3aTo6emVybyAobnByZWMpOwotCQkgIGdv dG8gZ3RfZXhwcjsKLQkJfQotCSAgICAgIC8qIElmIChWQUwgfCB+Q1NUMikgaXMgYWxsIG9uZXMs IGhhbmRsZSBpdCBhcwotCQkgKFggJiBDU1QyKSA8IFZBTC4gICovCi0JICAgICAgaWYgKHRlbSA9 PSAtMSkKLQkJewotCQkgIGNzdDJuID0gZmFsc2U7Ci0JCSAgdmFsbiA9IGZhbHNlOwotCQkgIHNn bmJpdCA9IHdpOjp6ZXJvIChucHJlYyk7Ci0JCSAgZ290byBsdF9leHByOwotCQl9Ci0JICAgICAg aWYgKCFjc3QybiAmJiB3aTo6bmVnX3AgKGNzdDJ2KSkKLQkJc2duYml0ID0gd2k6OnNldF9iaXRf aW5femVybyAobnByZWMgLSAxLCBucHJlYyk7Ci0JICAgICAgaWYgKHNnbmJpdCAhPSAwKQotCQl7 Ci0JCSAgaWYgKHZhbHYgPT0gc2duYml0KQotCQkgICAgewotCQkgICAgICBjc3QybiA9IHRydWU7 Ci0JCSAgICAgIHZhbG4gPSB0cnVlOwotCQkgICAgICBnb3RvIGd0X2V4cHI7Ci0JCSAgICB9Ci0J CSAgaWYgKHRlbSA9PSB3aTo6bWFzayAobnByZWMgLSAxLCBmYWxzZSwgbnByZWMpKQotCQkgICAg ewotCQkgICAgICBjc3QybiA9IHRydWU7Ci0JCSAgICAgIGdvdG8gbHRfZXhwcjsKLQkJICAgIH0K LQkJICBpZiAoIWNzdDJuKQotCQkgICAgc2duYml0ID0gd2k6Onplcm8gKG5wcmVjKTsKLQkJfQot CSAgICAgIGJyZWFrOworICAgICAgKm1pbl9pZHggPSBpOworICAgICAgKm1heF9pZHggPSBqOwor ICAgICAgcmV0dXJuICF0YWtlX2RlZmF1bHQ7CisgICAgfQorfQogCi0JICAgIGNhc2UgR0VfRVhQ UjoKLQkgICAgICAvKiBNaW5pbXVtIHVuc2lnbmVkIHZhbHVlIGZvciA+PSBpZiAoVkFMICYgQ1NU MikgPT0gVkFMCi0JCSBpcyBWQUwgYW5kIG1heGltdW0gdW5zaWduZWQgdmFsdWUgaXMgfjAuICBG b3Igc2lnbmVkCi0JCSBjb21wYXJpc29uLCBpZiBDU1QyIGRvZXNuJ3QgaGF2ZSBtb3N0IHNpZ25p ZmljYW50IGJpdAotCQkgc2V0LCBoYW5kbGUgaXQgc2ltaWxhcmx5LiAgSWYgQ1NUMiBoYXMgTVNC IHNldCwKLQkJIHRoZSBtaW5pbXVtIGlzIHRoZSBzYW1lLCBhbmQgbWF4aW11bSBpcyB+MFUvMi4g ICovCi0JICAgICAgaWYgKG1pbnYgIT0gdmFsdikKLQkJewotCQkgIC8qIElmIChWQUwgJiBDU1Qy KSAhPSBWQUwsIFggJiBDU1QyIGNhbid0IGJlIGVxdWFsIHRvCi0JCSAgICAgVkFMLiAgKi8KLQkJ ICBtaW52ID0gbWFza2VkX2luY3JlbWVudCAodmFsdiwgY3N0MnYsIHNnbmJpdCwgbnByZWMpOwot CQkgIGlmIChtaW52ID09IHZhbHYpCi0JCSAgICBicmVhazsKLQkJfQotCSAgICAgIG1heHYgPSB3 aTo6bWFzayAobnByZWMgLSAoY3N0Mm4gPyAxIDogMCksIGZhbHNlLCBucHJlYyk7Ci0JICAgICAg dmFsaWRfcCA9IHRydWU7Ci0JICAgICAgYnJlYWs7Ci0KLQkgICAgY2FzZSBHVF9FWFBSOgotCSAg ICBndF9leHByOgotCSAgICAgIC8qIEZpbmQgb3V0IHNtYWxsZXN0IE1JTlYgd2hlcmUgTUlOViA+ IFZBTAotCQkgJiYgKE1JTlYgJiBDU1QyKSA9PSBNSU5WLCBpZiBhbnkuICBJZiBWQUwgaXMgc2ln bmVkIGFuZAotCQkgQ1NUMiBoYXMgTVNCIHNldCwgY29tcHV0ZSBpdCBiaWFzZWQgYnkgMSA8PCAo bnByZWMgLSAxKS4gICovCi0JICAgICAgbWludiA9IG1hc2tlZF9pbmNyZW1lbnQgKHZhbHYsIGNz dDJ2LCBzZ25iaXQsIG5wcmVjKTsKLQkgICAgICBpZiAobWludiA9PSB2YWx2KQotCQlicmVhazsK LQkgICAgICBtYXh2ID0gd2k6Om1hc2sgKG5wcmVjIC0gKGNzdDJuID8gMSA6IDApLCBmYWxzZSwg bnByZWMpOwotCSAgICAgIHZhbGlkX3AgPSB0cnVlOwotCSAgICAgIGJyZWFrOwotCi0JICAgIGNh c2UgTEVfRVhQUjoKLQkgICAgICAvKiBNaW5pbXVtIHVuc2lnbmVkIHZhbHVlIGZvciA8PSBpcyAw IGFuZCBtYXhpbXVtCi0JCSB1bnNpZ25lZCB2YWx1ZSBpcyBWQUwgfCB+Q1NUMiBpZiAoVkFMICYg Q1NUMikgPT0gVkFMLgotCQkgT3RoZXJ3aXNlLCBmaW5kIHNtYWxsZXN0IFZBTDIgd2hlcmUgVkFM MiA+IFZBTAotCQkgJiYgKFZBTDIgJiBDU1QyKSA9PSBWQUwyIGFuZCB1c2UgKFZBTDIgLSAxKSB8 IH5DU1QyCi0JCSBhcyBtYXhpbXVtLgotCQkgRm9yIHNpZ25lZCBjb21wYXJpc29uLCBpZiBDU1Qy IGRvZXNuJ3QgaGF2ZSBtb3N0Ci0JCSBzaWduaWZpY2FudCBiaXQgc2V0LCBoYW5kbGUgaXQgc2lt aWxhcmx5LiAgSWYgQ1NUMiBoYXMKLQkJIE1TQiBzZXQsIHRoZSBtYXhpbXVtIGlzIHRoZSBzYW1l IGFuZCBtaW5pbXVtIGlzIElOVF9NSU4uICAqLwotCSAgICAgIGlmIChtaW52ID09IHZhbHYpCi0J CW1heHYgPSB2YWx2OwotCSAgICAgIGVsc2UKLQkJewotCQkgIG1heHYgPSBtYXNrZWRfaW5jcmVt ZW50ICh2YWx2LCBjc3Qydiwgc2duYml0LCBucHJlYyk7Ci0JCSAgaWYgKG1heHYgPT0gdmFsdikK LQkJICAgIGJyZWFrOwotCQkgIG1heHYgLT0gMTsKLQkJfQotCSAgICAgIG1heHYgfD0gfmNzdDJ2 OwotCSAgICAgIG1pbnYgPSBzZ25iaXQ7Ci0JICAgICAgdmFsaWRfcCA9IHRydWU7Ci0JICAgICAg YnJlYWs7Ci0KLQkgICAgY2FzZSBMVF9FWFBSOgotCSAgICBsdF9leHByOgotCSAgICAgIC8qIE1p bmltdW0gdW5zaWduZWQgdmFsdWUgZm9yIDwgaXMgMCBhbmQgbWF4aW11bQotCQkgdW5zaWduZWQg dmFsdWUgaXMgKFZBTC0xKSB8IH5DU1QyIGlmIChWQUwgJiBDU1QyKSA9PSBWQUwuCi0JCSBPdGhl cndpc2UsIGZpbmQgc21hbGxlc3QgVkFMMiB3aGVyZSBWQUwyID4gVkFMCi0JCSAmJiAoVkFMMiAm IENTVDIpID09IFZBTDIgYW5kIHVzZSAoVkFMMiAtIDEpIHwgfkNTVDIKLQkJIGFzIG1heGltdW0u Ci0JCSBGb3Igc2lnbmVkIGNvbXBhcmlzb24sIGlmIENTVDIgZG9lc24ndCBoYXZlIG1vc3QKLQkJ IHNpZ25pZmljYW50IGJpdCBzZXQsIGhhbmRsZSBpdCBzaW1pbGFybHkuICBJZiBDU1QyIGhhcwot CQkgTVNCIHNldCwgdGhlIG1heGltdW0gaXMgdGhlIHNhbWUgYW5kIG1pbmltdW0gaXMgSU5UX01J Ti4gICovCi0JICAgICAgaWYgKG1pbnYgPT0gdmFsdikKLQkJewotCQkgIGlmICh2YWx2ID09IHNn bmJpdCkKLQkJICAgIGJyZWFrOwotCQkgIG1heHYgPSB2YWx2OwotCQl9Ci0JICAgICAgZWxzZQot CQl7Ci0JCSAgbWF4diA9IG1hc2tlZF9pbmNyZW1lbnQgKHZhbHYsIGNzdDJ2LCBzZ25iaXQsIG5w cmVjKTsKLQkJICBpZiAobWF4diA9PSB2YWx2KQotCQkgICAgYnJlYWs7Ci0JCX0KLQkgICAgICBt YXh2IC09IDE7Ci0JICAgICAgbWF4diB8PSB+Y3N0MnY7Ci0JICAgICAgbWludiA9IHNnbmJpdDsK LQkgICAgICB2YWxpZF9wID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQotCSAgICBkZWZhdWx0Ogot CSAgICAgIGJyZWFrOwotCSAgICB9Ci0JICBpZiAodmFsaWRfcAotCSAgICAgICYmIChtYXh2IC0g bWludikgIT0gLTEpCi0JICAgIHsKLQkgICAgICB0cmVlIHRtcCwgbmV3X3ZhbCwgdHlwZTsKLQkg ICAgICBpbnQgaTsKLQotCSAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JCWlmIChuYW1l c1tpXSkKLQkJICB7Ci0JCSAgICB3aWRlX2ludCBtYXh2MiA9IG1heHY7Ci0JCSAgICB0bXAgPSBu YW1lc1tpXTsKLQkJICAgIHR5cGUgPSBUUkVFX1RZUEUgKG5hbWVzW2ldKTsKLQkJICAgIGlmICgh VFlQRV9VTlNJR05FRCAodHlwZSkpCi0JCSAgICAgIHsKLQkJCXR5cGUgPSBidWlsZF9ub25zdGFu ZGFyZF9pbnRlZ2VyX3R5cGUgKG5wcmVjLCAxKTsKLQkJCXRtcCA9IGJ1aWxkMSAoTk9QX0VYUFIs IHR5cGUsIG5hbWVzW2ldKTsKLQkJICAgICAgfQotCQkgICAgaWYgKG1pbnYgIT0gMCkKLQkJICAg ICAgewotCQkJdG1wID0gYnVpbGQyIChQTFVTX0VYUFIsIHR5cGUsIHRtcCwKLQkJCQkgICAgICB3 aWRlX2ludF90b190cmVlICh0eXBlLCAtbWludikpOwotCQkJbWF4djIgPSBtYXh2IC0gbWludjsK LQkJICAgICAgfQotCQkgICAgbmV3X3ZhbCA9IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIG1heHYy KTsKLQkJICAgIGFkZF9hc3NlcnRfaW5mbyAoYXNzZXJ0cywgbmFtZXNbaV0sIHRtcCwgTEVfRVhQ UiwgbmV3X3ZhbCk7Ci0JCSAgfQotCSAgICB9Ci0JfQotICAgIH0KLX0KLQotLyogT1AgaXMgYW4g b3BlcmFuZCBvZiBhIHRydXRoIHZhbHVlIGV4cHJlc3Npb24gd2hpY2ggaXMga25vd24gdG8gaGF2 ZQotICAgYSBwYXJ0aWN1bGFyIHZhbHVlLiAgUmVnaXN0ZXIgYW55IGFzc2VydHMgZm9yIE9QIGFu ZCBmb3IgYW55Ci0gICBvcGVyYW5kcyBpbiBPUCdzIGRlZmluaW5nIHN0YXRlbWVudC4KLQotICAg SWYgQ09ERSBpcyBFUV9FWFBSLCB0aGVuIHdlIHdhbnQgdG8gcmVnaXN0ZXIgT1AgaXMgemVybyAo ZmFsc2UpLAotICAgaWYgQ09ERSBpcyBORV9FWFBSLCB0aGVuIHdlIHdhbnQgdG8gcmVnaXN0ZXIg T1AgaXMgbm9uemVybyAodHJ1ZSkuICAgKi8KLQotc3RhdGljIHZvaWQKLXJlZ2lzdGVyX2VkZ2Vf YXNzZXJ0X2Zvcl8xICh0cmVlIG9wLCBlbnVtIHRyZWVfY29kZSBjb2RlLAotCQkJICAgIGVkZ2Ug ZSwgdmVjPGFzc2VydF9pbmZvPiAmYXNzZXJ0cykKLXsKLSAgZ2ltcGxlICpvcF9kZWY7Ci0gIHRy ZWUgdmFsOwotICBlbnVtIHRyZWVfY29kZSByaHNfY29kZTsKLQotICAvKiBXZSBvbmx5IGNhcmUg YWJvdXQgU1NBX05BTUVzLiAgKi8KLSAgaWYgKFRSRUVfQ09ERSAob3ApICE9IFNTQV9OQU1FKQot ICAgIHJldHVybjsKLQotICAvKiBXZSBrbm93IHRoYXQgT1Agd2lsbCBoYXZlIGEgemVybyBvciBu b256ZXJvIHZhbHVlLiAgKi8KLSAgdmFsID0gYnVpbGRfaW50X2NzdCAoVFJFRV9UWVBFIChvcCks IDApOwotICBhZGRfYXNzZXJ0X2luZm8gKGFzc2VydHMsIG9wLCBvcCwgY29kZSwgdmFsKTsKLQot ICAvKiBOb3cgbG9vayBhdCBob3cgT1AgaXMgc2V0LiAgSWYgaXQncyBzZXQgZnJvbSBhIGNvbXBh cmlzb24sCi0gICAgIGEgdHJ1dGggb3BlcmF0aW9uIG9yIHNvbWUgYml0IG9wZXJhdGlvbnMsIHRo ZW4gd2UgbWF5IGJlIGFibGUKLSAgICAgdG8gcmVnaXN0ZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhl IG9wZXJhbmRzIG9mIHRoYXQgYXNzaWdubWVudC4gICovCi0gIG9wX2RlZiA9IFNTQV9OQU1FX0RF Rl9TVE1UIChvcCk7Ci0gIGlmIChnaW1wbGVfY29kZSAob3BfZGVmKSAhPSBHSU1QTEVfQVNTSUdO KQotICAgIHJldHVybjsKLQotICByaHNfY29kZSA9IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKG9w X2RlZik7Ci0KLSAgaWYgKFRSRUVfQ09ERV9DTEFTUyAocmhzX2NvZGUpID09IHRjY19jb21wYXJp c29uKQotICAgIHsKLSAgICAgIGJvb2wgaW52ZXJ0ID0gKGNvZGUgPT0gRVFfRVhQUiA/IHRydWUg OiBmYWxzZSk7Ci0gICAgICB0cmVlIG9wMCA9IGdpbXBsZV9hc3NpZ25fcmhzMSAob3BfZGVmKTsK LSAgICAgIHRyZWUgb3AxID0gZ2ltcGxlX2Fzc2lnbl9yaHMyIChvcF9kZWYpOwotCi0gICAgICBp ZiAoVFJFRV9DT0RFIChvcDApID09IFNTQV9OQU1FKQotICAgICAgICByZWdpc3Rlcl9lZGdlX2Fz c2VydF9mb3JfMiAob3AwLCBlLCByaHNfY29kZSwgb3AwLCBvcDEsIGludmVydCwgYXNzZXJ0cyk7 Ci0gICAgICBpZiAoVFJFRV9DT0RFIChvcDEpID09IFNTQV9OQU1FKQotICAgICAgICByZWdpc3Rl cl9lZGdlX2Fzc2VydF9mb3JfMiAob3AxLCBlLCByaHNfY29kZSwgb3AwLCBvcDEsIGludmVydCwg YXNzZXJ0cyk7Ci0gICAgfQotICBlbHNlIGlmICgoY29kZSA9PSBORV9FWFBSCi0JICAgICYmIGdp bXBsZV9hc3NpZ25fcmhzX2NvZGUgKG9wX2RlZikgPT0gQklUX0FORF9FWFBSKQotCSAgIHx8IChj b2RlID09IEVRX0VYUFIKLQkgICAgICAgJiYgZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAob3BfZGVm KSA9PSBCSVRfSU9SX0VYUFIpKQotICAgIHsKLSAgICAgIC8qIFJlY3Vyc2Ugb24gZWFjaCBvcGVy YW5kLiAgKi8KLSAgICAgIHRyZWUgb3AwID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChvcF9kZWYpOwot ICAgICAgdHJlZSBvcDEgPSBnaW1wbGVfYXNzaWduX3JoczIgKG9wX2RlZik7Ci0gICAgICBpZiAo VFJFRV9DT0RFIChvcDApID09IFNTQV9OQU1FCi0JICAmJiBoYXNfc2luZ2xlX3VzZSAob3AwKSkK LQlyZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMSAob3AwLCBjb2RlLCBlLCBhc3NlcnRzKTsKLSAg ICAgIGlmIChUUkVFX0NPREUgKG9wMSkgPT0gU1NBX05BTUUKLQkgICYmIGhhc19zaW5nbGVfdXNl IChvcDEpKQotCXJlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2Zvcl8xIChvcDEsIGNvZGUsIGUsIGFzc2Vy dHMpOwotICAgIH0KLSAgZWxzZSBpZiAoZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAob3BfZGVmKSA9 PSBCSVRfTk9UX0VYUFIKLQkgICAmJiBUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChnaW1wbGVf YXNzaWduX2xocyAob3BfZGVmKSkpID09IDEpCi0gICAgewotICAgICAgLyogUmVjdXJzZSwgZmxp cHBpbmcgQ09ERS4gICovCi0gICAgICBjb2RlID0gaW52ZXJ0X3RyZWVfY29tcGFyaXNvbiAoY29k ZSwgZmFsc2UpOwotICAgICAgcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yXzEgKGdpbXBsZV9hc3Np Z25fcmhzMSAob3BfZGVmKSwgY29kZSwgZSwgYXNzZXJ0cyk7Ci0gICAgfQotICBlbHNlIGlmIChn aW1wbGVfYXNzaWduX3Joc19jb2RlIChvcF9kZWYpID09IFNTQV9OQU1FKQotICAgIHsKLSAgICAg IC8qIFJlY3Vyc2UgdGhyb3VnaCB0aGUgY29weS4gICovCi0gICAgICByZWdpc3Rlcl9lZGdlX2Fz c2VydF9mb3JfMSAoZ2ltcGxlX2Fzc2lnbl9yaHMxIChvcF9kZWYpLCBjb2RlLCBlLCBhc3NlcnRz KTsKLSAgICB9Ci0gIGVsc2UgaWYgKENPTlZFUlRfRVhQUl9DT0RFX1AgKGdpbXBsZV9hc3NpZ25f cmhzX2NvZGUgKG9wX2RlZikpKQotICAgIHsKLSAgICAgIC8qIFJlY3Vyc2UgdGhyb3VnaCB0aGUg dHlwZSBjb252ZXJzaW9uLCB1bmxlc3MgaXQgaXMgYSBuYXJyb3dpbmcKLQkgY29udmVyc2lvbiBv ciBjb252ZXJzaW9uIGZyb20gbm9uLWludGVncmFsIHR5cGUuICAqLwotICAgICAgdHJlZSByaHMg PSBnaW1wbGVfYXNzaWduX3JoczEgKG9wX2RlZik7Ci0gICAgICBpZiAoSU5URUdSQUxfVFlQRV9Q IChUUkVFX1RZUEUgKHJocykpCi0JICAmJiAoVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAocmhz KSkKLQkgICAgICA8PSBUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChvcCkpKSkKLQlyZWdpc3Rl cl9lZGdlX2Fzc2VydF9mb3JfMSAocmhzLCBjb2RlLCBlLCBhc3NlcnRzKTsKLSAgICB9Ci19Ci0K LS8qIENoZWNrIGlmIGNvbXBhcmlzb24KLSAgICAgTkFNRSBDT05EX09QIElOVEVHRVJfQ1NUCi0g ICBoYXMgYSBmb3JtIG9mCi0gICAgIChYICYgMTEuLi4xMDAuLjApIENPTkRfT1AgWFguLi5YMDAu Li4wCi0gICBTdWNoIGNvbXBhcmlzb24gY2FuIHlpZWxkIGFzc2VydGlvbnMgbGlrZQotICAgICBY ID49IFhYLi4uWDAwLi4uMAotICAgICBYIDw9IFhYLi4uWDExLi4uMQotICAgaW4gY2FzZSBvZiBD T05EX09QIGJlaW5nIEVRX0VYUFIgb3IKLSAgICAgWCA8IFhYLi4uWDAwLi4uMAotICAgICBYID4g WFguLi5YMTEuLi4xCi0gICBpbiBjYXNlIG9mIE5FX0VYUFIuICAqLwotCi1zdGF0aWMgYm9vbAot aXNfbWFza2VkX3JhbmdlX3Rlc3QgKHRyZWUgbmFtZSwgdHJlZSB2YWx0LCBlbnVtIHRyZWVfY29k ZSBjb25kX2NvZGUsCi0JCSAgICAgIHRyZWUgKm5ld19uYW1lLCB0cmVlICpsb3csIGVudW0gdHJl ZV9jb2RlICpsb3dfY29kZSwKLQkJICAgICAgdHJlZSAqaGlnaCwgZW51bSB0cmVlX2NvZGUgKmhp Z2hfY29kZSkKLXsKLSAgZ2ltcGxlICpkZWZfc3RtdCA9IFNTQV9OQU1FX0RFRl9TVE1UIChuYW1l KTsKLQotICBpZiAoIWlzX2dpbXBsZV9hc3NpZ24gKGRlZl9zdG10KQotICAgICAgfHwgZ2ltcGxl X2Fzc2lnbl9yaHNfY29kZSAoZGVmX3N0bXQpICE9IEJJVF9BTkRfRVhQUikKLSAgICByZXR1cm4g ZmFsc2U7Ci0KLSAgdHJlZSB0ID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChkZWZfc3RtdCk7Ci0gIHRy ZWUgbWFza3QgPSBnaW1wbGVfYXNzaWduX3JoczIgKGRlZl9zdG10KTsKLSAgaWYgKFRSRUVfQ09E RSAodCkgIT0gU1NBX05BTUUgfHwgVFJFRV9DT0RFIChtYXNrdCkgIT0gSU5URUdFUl9DU1QpCi0g ICAgcmV0dXJuIGZhbHNlOwotCi0gIHdpOjp0cmVlX3RvX3dpZGVfcmVmIG1hc2sgPSB3aTo6dG9f d2lkZSAobWFza3QpOwotICB3aWRlX2ludCBpbnZfbWFzayA9IH5tYXNrOwotICAvKiBNdXN0IGhh dmUgYmVlbiByZW1vdmVkIGJ5IG5vdyBzbyBkb24ndCBib3RoZXIgb3B0aW1pemluZy4gICovCi0g IGlmIChtYXNrID09IDAgfHwgaW52X21hc2sgPT0gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAg LyogQXNzdW1lIFZBTFQgaXMgSU5URUdFUl9DU1QuICAqLwotICB3aTo6dHJlZV90b193aWRlX3Jl ZiB2YWwgPSB3aTo6dG9fd2lkZSAodmFsdCk7Ci0KLSAgaWYgKChpbnZfbWFzayAmIChpbnZfbWFz ayArIDEpKSAhPSAwCi0gICAgICB8fCAodmFsICYgbWFzaykgIT0gdmFsKQotICAgIHJldHVybiBm YWxzZTsKLQotICBib29sIGlzX3JhbmdlID0gY29uZF9jb2RlID09IEVRX0VYUFI7Ci0KLSAgdHJl ZSB0eXBlID0gVFJFRV9UWVBFICh0KTsKLSAgd2lkZV9pbnQgbWluID0gd2k6Om1pbl92YWx1ZSAo dHlwZSksCi0gICAgbWF4ID0gd2k6Om1heF92YWx1ZSAodHlwZSk7Ci0KLSAgaWYgKGlzX3Jhbmdl KQotICAgIHsKLSAgICAgICpsb3dfY29kZSA9IHZhbCA9PSBtaW4gPyBFUlJPUl9NQVJLIDogR0Vf RVhQUjsKLSAgICAgICpoaWdoX2NvZGUgPSB2YWwgPT0gbWF4ID8gRVJST1JfTUFSSyA6IExFX0VY UFI7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogV2UgY2FuIHN0aWxsIGdlbmVyYXRl IGFzc2VydGlvbiBpZiBvbmUgb2YgYWx0ZXJuYXRpdmVzCi0JIGlzIGtub3duIHRvIGFsd2F5cyBi ZSBmYWxzZS4gICovCi0gICAgICBpZiAodmFsID09IG1pbikKLQl7Ci0JICAqbG93X2NvZGUgPSAo ZW51bSB0cmVlX2NvZGUpIDA7Ci0JICAqaGlnaF9jb2RlID0gR1RfRVhQUjsKLQl9Ci0gICAgICBl bHNlIGlmICgodmFsIHwgaW52X21hc2spID09IG1heCkKLQl7Ci0JICAqbG93X2NvZGUgPSBMVF9F WFBSOwotCSAgKmhpZ2hfY29kZSA9IChlbnVtIHRyZWVfY29kZSkgMDsKLQl9Ci0gICAgICBlbHNl Ci0JcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAqbmV3X25hbWUgPSB0OwotICAqbG93ID0gd2lk ZV9pbnRfdG9fdHJlZSAodHlwZSwgdmFsKTsKLSAgKmhpZ2ggPSB3aWRlX2ludF90b190cmVlICh0 eXBlLCB2YWwgfCBpbnZfbWFzayk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFRyeSB0byBy ZWdpc3RlciBhbiBlZGdlIGFzc2VydGlvbiBmb3IgU1NBIG5hbWUgTkFNRSBvbiBlZGdlIEUgZm9y Ci0gICB0aGUgY29uZGl0aW9uIENPTkQgY29udHJpYnV0aW5nIHRvIHRoZSBjb25kaXRpb25hbCBq dW1wIHBvaW50ZWQgdG8gYnkKLSAgIFNJLiAgKi8KLQotdm9pZAotcmVnaXN0ZXJfZWRnZV9hc3Nl cnRfZm9yICh0cmVlIG5hbWUsIGVkZ2UgZSwKLQkJCSAgZW51bSB0cmVlX2NvZGUgY29uZF9jb2Rl LCB0cmVlIGNvbmRfb3AwLAotCQkJICB0cmVlIGNvbmRfb3AxLCB2ZWM8YXNzZXJ0X2luZm8+ICZh c3NlcnRzKQotewotICB0cmVlIHZhbDsKLSAgZW51bSB0cmVlX2NvZGUgY29tcF9jb2RlOwotICBi b29sIGlzX2Vsc2VfZWRnZSA9IChlLT5mbGFncyAmIEVER0VfRkFMU0VfVkFMVUUpICE9IDA7Ci0K LSAgLyogRG8gbm90IGF0dGVtcHQgdG8gaW5mZXIgYW55dGhpbmcgaW4gbmFtZXMgdGhhdCBmbG93 IHRocm91Z2gKLSAgICAgYWJub3JtYWwgZWRnZXMuICAqLwotICBpZiAoU1NBX05BTUVfT0NDVVJT X0lOX0FCTk9STUFMX1BISSAobmFtZSkpCi0gICAgcmV0dXJuOwotCi0gIGlmICghZXh0cmFjdF9j b2RlX2FuZF92YWxfZnJvbV9jb25kX3dpdGhfb3BzIChuYW1lLCBjb25kX2NvZGUsCi0JCQkJCQlj b25kX29wMCwgY29uZF9vcDEsCi0JCQkJCQlpc19lbHNlX2VkZ2UsCi0JCQkJCQkmY29tcF9jb2Rl LCAmdmFsKSkKLSAgICByZXR1cm47Ci0KLSAgLyogUmVnaXN0ZXIgQVNTRVJUX0VYUFJzIGZvciBu YW1lLiAgKi8KLSAgcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yXzIgKG5hbWUsIGUsIGNvbmRfY29k ZSwgY29uZF9vcDAsCi0JCQkgICAgICBjb25kX29wMSwgaXNfZWxzZV9lZGdlLCBhc3NlcnRzKTsK LQotCi0gIC8qIElmIENPTkQgaXMgZWZmZWN0aXZlbHkgYW4gZXF1YWxpdHkgdGVzdCBvZiBhbiBT U0FfTkFNRSBhZ2FpbnN0Ci0gICAgIHRoZSB2YWx1ZSB6ZXJvIG9yIG9uZSwgdGhlbiB3ZSBtYXkg YmUgYWJsZSB0byBhc3NlcnQgdmFsdWVzCi0gICAgIGZvciBTU0FfTkFNRXMgd2hpY2ggZmxvdyBp bnRvIENPTkQuICAqLwotCi0gIC8qIEluIHRoZSBjYXNlIG9mIE5BTUUgPT0gMSBvciBOQU1FICE9 IDAsIGZvciBCSVRfQU5EX0VYUFIgZGVmaW5pbmcKLSAgICAgc3RhdGVtZW50IG9mIE5BTUUgd2Ug Y2FuIGFzc2VydCBib3RoIG9wZXJhbmRzIG9mIHRoZSBCSVRfQU5EX0VYUFIKLSAgICAgaGF2ZSBu b256ZXJvIHZhbHVlLiAgKi8KLSAgaWYgKChjb21wX2NvZGUgPT0gRVFfRVhQUiAmJiBpbnRlZ2Vy X29uZXAgKHZhbCkpCi0gICAgICB8fCAoY29tcF9jb2RlID09IE5FX0VYUFIgJiYgaW50ZWdlcl96 ZXJvcCAodmFsKSkpCi0gICAgewotICAgICAgZ2ltcGxlICpkZWZfc3RtdCA9IFNTQV9OQU1FX0RF Rl9TVE1UIChuYW1lKTsKLQotICAgICAgaWYgKGlzX2dpbXBsZV9hc3NpZ24gKGRlZl9zdG10KQot CSAgJiYgZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoZGVmX3N0bXQpID09IEJJVF9BTkRfRVhQUikK LQl7Ci0JICB0cmVlIG9wMCA9IGdpbXBsZV9hc3NpZ25fcmhzMSAoZGVmX3N0bXQpOwotCSAgdHJl ZSBvcDEgPSBnaW1wbGVfYXNzaWduX3JoczIgKGRlZl9zdG10KTsKLQkgIHJlZ2lzdGVyX2VkZ2Vf YXNzZXJ0X2Zvcl8xIChvcDAsIE5FX0VYUFIsIGUsIGFzc2VydHMpOwotCSAgcmVnaXN0ZXJfZWRn ZV9hc3NlcnRfZm9yXzEgKG9wMSwgTkVfRVhQUiwgZSwgYXNzZXJ0cyk7Ci0JfQotICAgICAgZWxz ZSBpZiAoaXNfZ2ltcGxlX2Fzc2lnbiAoZGVmX3N0bXQpCi0JICAgICAgICYmIChUUkVFX0NPREVf Q0xBU1MgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKGRlZl9zdG10KSkKLQkJICAgPT0gdGNjX2Nv bXBhcmlzb24pKQotCXJlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2Zvcl8xIChuYW1lLCBORV9FWFBSLCBl LCBhc3NlcnRzKTsKLSAgICB9Ci0KLSAgLyogSW4gdGhlIGNhc2Ugb2YgTkFNRSA9PSAwIG9yIE5B TUUgIT0gMSwgZm9yIEJJVF9JT1JfRVhQUiBkZWZpbmluZwotICAgICBzdGF0ZW1lbnQgb2YgTkFN RSB3ZSBjYW4gYXNzZXJ0IGJvdGggb3BlcmFuZHMgb2YgdGhlIEJJVF9JT1JfRVhQUgotICAgICBo YXZlIHplcm8gdmFsdWUuICAqLwotICBpZiAoKGNvbXBfY29kZSA9PSBFUV9FWFBSICYmIGludGVn ZXJfemVyb3AgKHZhbCkpCi0gICAgICB8fCAoY29tcF9jb2RlID09IE5FX0VYUFIKLQkgICYmIGlu dGVnZXJfb25lcCAodmFsKQotCSAgJiYgVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAobmFtZSkp ID09IDEpKQotICAgIHsKLSAgICAgIGdpbXBsZSAqZGVmX3N0bXQgPSBTU0FfTkFNRV9ERUZfU1RN VCAobmFtZSk7Ci0KLSAgICAgIC8qIEZvciBCSVRfSU9SX0VYUFIgb25seSBpZiBOQU1FID09IDAg Ym90aCBvcGVyYW5kcyBoYXZlCi0JIG5lY2Vzc2FyaWx5IHplcm8gdmFsdWUsIG9yIGlmIHR5cGUt cHJlY2lzaW9uIGlzIG9uZS4gICovCi0gICAgICBpZiAoaXNfZ2ltcGxlX2Fzc2lnbiAoZGVmX3N0 bXQpCi0JICAmJiBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChkZWZfc3RtdCkgPT0gQklUX0lPUl9F WFBSKQotCXsKLQkgIHRyZWUgb3AwID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChkZWZfc3RtdCk7Ci0J ICB0cmVlIG9wMSA9IGdpbXBsZV9hc3NpZ25fcmhzMiAoZGVmX3N0bXQpOwotCSAgcmVnaXN0ZXJf ZWRnZV9hc3NlcnRfZm9yXzEgKG9wMCwgRVFfRVhQUiwgZSwgYXNzZXJ0cyk7Ci0JICByZWdpc3Rl cl9lZGdlX2Fzc2VydF9mb3JfMSAob3AxLCBFUV9FWFBSLCBlLCBhc3NlcnRzKTsKLQl9Ci0gICAg ICBlbHNlIGlmIChpc19naW1wbGVfYXNzaWduIChkZWZfc3RtdCkKLQkgICAgICAgJiYgKFRSRUVf Q09ERV9DTEFTUyAoZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoZGVmX3N0bXQpKQotCQkgICA9PSB0 Y2NfY29tcGFyaXNvbikpCi0JcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yXzEgKG5hbWUsIEVRX0VY UFIsIGUsIGFzc2VydHMpOwotICAgIH0KLQotICAvKiBTb21ldGltZXMgd2UgY2FuIGluZmVyIHJh bmdlcyBmcm9tIChOQU1FICYgTUFTSykgPT0gVkFMVUUuICAqLwotICBpZiAoKGNvbXBfY29kZSA9 PSBFUV9FWFBSIHx8IGNvbXBfY29kZSA9PSBORV9FWFBSKQotICAgICAgJiYgVFJFRV9DT0RFICh2 YWwpID09IElOVEVHRVJfQ1NUKQotICAgIHsKLSAgICAgIGVudW0gdHJlZV9jb2RlIGxvd19jb2Rl LCBoaWdoX2NvZGU7Ci0gICAgICB0cmVlIGxvdywgaGlnaDsKLSAgICAgIGlmIChpc19tYXNrZWRf cmFuZ2VfdGVzdCAobmFtZSwgdmFsLCBjb21wX2NvZGUsICZuYW1lLCAmbG93LAotCQkJCSZsb3df Y29kZSwgJmhpZ2gsICZoaWdoX2NvZGUpKQotCXsKLQkgIGlmIChsb3dfY29kZSAhPSBFUlJPUl9N QVJLKQotCSAgICByZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3JfMiAobmFtZSwgZSwgbG93X2NvZGUs IG5hbWUsCi0JCQkJCWxvdywgLyppbnZlcnQqL2ZhbHNlLCBhc3NlcnRzKTsKLQkgIGlmIChoaWdo X2NvZGUgIT0gRVJST1JfTUFSSykKLQkgICAgcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yXzIgKG5h bWUsIGUsIGhpZ2hfY29kZSwgbmFtZSwKLQkJCQkJaGlnaCwgLyppbnZlcnQqL2ZhbHNlLCBhc3Nl cnRzKTsKLQl9Ci0gICAgfQotfQotCi0vKiBIYW5kbGUKLSAgIF80ID0geF8zICYgMzE7Ci0gICBp ZiAoXzQgIT0gMCkKLSAgICAgZ290byA8YmIgNj47Ci0gICBlbHNlCi0gICAgIGdvdG8gPGJiIDc+ OwotICAgPGJiIDY+OgotICAgX19idWlsdGluX3VucmVhY2hhYmxlICgpOwotICAgPGJiIDc+Ogot ICAgeF81ID0gQVNTRVJUX0VYUFIgPHhfMywgLi4uPjsKLSAgIElmIHhfMyBoYXMgbm8gb3RoZXIg aW1tZWRpYXRlIHVzZXMgKGNoZWNrZWQgYnkgY2FsbGVyKSwKLSAgIHZhciBpcyB0aGUgeF8zIHZh ciBmcm9tIEFTU0VSVF9FWFBSLCB3ZSBjYW4gY2xlYXIgbG93IDUgYml0cwotICAgZnJvbSB0aGUg bm9uLXplcm8gYml0bWFzay4gICovCi0KLXZvaWQKLW1heWJlX3NldF9ub256ZXJvX2JpdHMgKGVk Z2UgZSwgdHJlZSB2YXIpCi17Ci0gIGJhc2ljX2Jsb2NrIGNvbmRfYmIgPSBlLT5zcmM7Ci0gIGdp bXBsZSAqc3RtdCA9IGxhc3Rfc3RtdCAoY29uZF9iYik7Ci0gIHRyZWUgY3N0OwotCi0gIGlmIChz dG10ID09IE5VTEwKLSAgICAgIHx8IGdpbXBsZV9jb2RlIChzdG10KSAhPSBHSU1QTEVfQ09ORAot ICAgICAgfHwgZ2ltcGxlX2NvbmRfY29kZSAoc3RtdCkgIT0gKChlLT5mbGFncyAmIEVER0VfVFJV RV9WQUxVRSkKLQkJCQkgICAgID8gRVFfRVhQUiA6IE5FX0VYUFIpCi0gICAgICB8fCBUUkVFX0NP REUgKGdpbXBsZV9jb25kX2xocyAoc3RtdCkpICE9IFNTQV9OQU1FCi0gICAgICB8fCAhaW50ZWdl cl96ZXJvcCAoZ2ltcGxlX2NvbmRfcmhzIChzdG10KSkpCi0gICAgcmV0dXJuOwotCi0gIHN0bXQg PSBTU0FfTkFNRV9ERUZfU1RNVCAoZ2ltcGxlX2NvbmRfbGhzIChzdG10KSk7Ci0gIGlmICghaXNf Z2ltcGxlX2Fzc2lnbiAoc3RtdCkKLSAgICAgIHx8IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0 bXQpICE9IEJJVF9BTkRfRVhQUgotICAgICAgfHwgVFJFRV9DT0RFIChnaW1wbGVfYXNzaWduX3Jo czIgKHN0bXQpKSAhPSBJTlRFR0VSX0NTVCkKLSAgICByZXR1cm47Ci0gIGlmIChnaW1wbGVfYXNz aWduX3JoczEgKHN0bXQpICE9IHZhcikKLSAgICB7Ci0gICAgICBnaW1wbGUgKnN0bXQyOwotCi0g ICAgICBpZiAoVFJFRV9DT0RFIChnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpKSAhPSBTU0FfTkFN RSkKLQlyZXR1cm47Ci0gICAgICBzdG10MiA9IFNTQV9OQU1FX0RFRl9TVE1UIChnaW1wbGVfYXNz aWduX3JoczEgKHN0bXQpKTsKLSAgICAgIGlmICghZ2ltcGxlX2Fzc2lnbl9jYXN0X3AgKHN0bXQy KQotCSAgfHwgZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10MikgIT0gdmFyCi0JICB8fCAhQ09OVkVS VF9FWFBSX0NPREVfUCAoZ2ltcGxlX2Fzc2lnbl9yaHNfY29kZSAoc3RtdDIpKQotCSAgfHwgKFRZ UEVfUFJFQ0lTSU9OIChUUkVFX1RZUEUgKGdpbXBsZV9hc3NpZ25fcmhzMSAoc3RtdCkpKQotCQkJ ICAgICAgIT0gVFlQRV9QUkVDSVNJT04gKFRSRUVfVFlQRSAodmFyKSkpKQotCXJldHVybjsKLSAg ICB9Ci0gIGNzdCA9IGdpbXBsZV9hc3NpZ25fcmhzMiAoc3RtdCk7Ci0gIHNldF9ub256ZXJvX2Jp dHMgKHZhciwgd2k6OmJpdF9hbmRfbm90IChnZXRfbm9uemVyb19iaXRzICh2YXIpLAotCQkJCQkg IHdpOjp0b193aWRlIChjc3QpKSk7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIFNUTVQgaXMgaW50 ZXJlc3RpbmcgZm9yIFZSUC4gICovCi0KLWJvb2wKLXN0bXRfaW50ZXJlc3RpbmdfZm9yX3ZycCAo Z2ltcGxlICpzdG10KQotewotICBpZiAoZ2ltcGxlX2NvZGUgKHN0bXQpID09IEdJTVBMRV9QSEkp Ci0gICAgewotICAgICAgdHJlZSByZXMgPSBnaW1wbGVfcGhpX3Jlc3VsdCAoc3RtdCk7Ci0gICAg ICByZXR1cm4gKCF2aXJ0dWFsX29wZXJhbmRfcCAocmVzKQotCSAgICAgICYmIChJTlRFR1JBTF9U WVBFX1AgKFRSRUVfVFlQRSAocmVzKSkKLQkJICB8fCBQT0lOVEVSX1RZUEVfUCAoVFJFRV9UWVBF IChyZXMpKSkpOwotICAgIH0KLSAgZWxzZSBpZiAoaXNfZ2ltcGxlX2Fzc2lnbiAoc3RtdCkgfHwg aXNfZ2ltcGxlX2NhbGwgKHN0bXQpKQotICAgIHsKLSAgICAgIHRyZWUgbGhzID0gZ2ltcGxlX2dl dF9saHMgKHN0bXQpOwotCi0gICAgICAvKiBJbiBnZW5lcmFsLCBhc3NpZ25tZW50cyB3aXRoIHZp cnR1YWwgb3BlcmFuZHMgYXJlIG5vdCB1c2VmdWwKLQkgZm9yIGRlcml2aW5nIHJhbmdlcywgd2l0 aCB0aGUgb2J2aW91cyBleGNlcHRpb24gb2YgY2FsbHMgdG8KLQkgYnVpbHRpbiBmdW5jdGlvbnMu ICAqLwotICAgICAgaWYgKGxocyAmJiBUUkVFX0NPREUgKGxocykgPT0gU1NBX05BTUUKLQkgICYm IChJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQRSAobGhzKSkKLQkgICAgICB8fCBQT0lOVEVSX1RZ UEVfUCAoVFJFRV9UWVBFIChsaHMpKSkKLQkgICYmIChpc19naW1wbGVfY2FsbCAoc3RtdCkKLQkg ICAgICB8fCAhZ2ltcGxlX3Z1c2UgKHN0bXQpKSkKLQlyZXR1cm4gdHJ1ZTsKLSAgICAgIGVsc2Ug aWYgKGlzX2dpbXBsZV9jYWxsIChzdG10KSAmJiBnaW1wbGVfY2FsbF9pbnRlcm5hbF9wIChzdG10 KSkKLQlzd2l0Y2ggKGdpbXBsZV9jYWxsX2ludGVybmFsX2ZuIChzdG10KSkKLQkgIHsKLQkgIGNh c2UgSUZOX0FERF9PVkVSRkxPVzoKLQkgIGNhc2UgSUZOX1NVQl9PVkVSRkxPVzoKLQkgIGNhc2Ug SUZOX01VTF9PVkVSRkxPVzoKLQkgIGNhc2UgSUZOX0FUT01JQ19DT01QQVJFX0VYQ0hBTkdFOgot CSAgICAvKiBUaGVzZSBpbnRlcm5hbCBjYWxscyByZXR1cm4gX0NvbXBsZXggaW50ZWdlciB0eXBl LAotCSAgICAgICBidXQgYXJlIGludGVyZXN0aW5nIHRvIFZSUCBuZXZlcnRoZWxlc3MuICAqLwot CSAgICBpZiAobGhzICYmIFRSRUVfQ09ERSAobGhzKSA9PSBTU0FfTkFNRSkKLQkgICAgICByZXR1 cm4gdHJ1ZTsKLQkgICAgYnJlYWs7Ci0JICBkZWZhdWx0OgotCSAgICBicmVhazsKLQkgIH0KLSAg ICB9Ci0gIGVsc2UgaWYgKGdpbXBsZV9jb2RlIChzdG10KSA9PSBHSU1QTEVfQ09ORAotCSAgIHx8 IGdpbXBsZV9jb2RlIChzdG10KSA9PSBHSU1QTEVfU1dJVENIKQotICAgIHJldHVybiB0cnVlOwot Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogU2VhcmNoZXMgdGhlIGNhc2UgbGFiZWwgdmVjdG9y IFZFQyBmb3IgdGhlIGluZGV4ICpJRFggb2YgdGhlIENBU0VfTEFCRUwKLSAgIHRoYXQgaW5jbHVk ZXMgdGhlIHZhbHVlIFZBTC4gIFRoZSBzZWFyY2ggaXMgcmVzdHJpY3RlZCB0byB0aGUgcmFuZ2UK LSAgIFtTVEFSVF9JRFgsIG4gLSAxXSB3aGVyZSBuIGlzIHRoZSBzaXplIG9mIFZFQy4KLQotICAg SWYgdGhlcmUgaXMgYSBDQVNFX0xBQkVMIGZvciBWQUwsIGl0cyBpbmRleCBpcyBwbGFjZWQgaW4g SURYIGFuZCB0cnVlIGlzCi0gICByZXR1cm5lZC4KLQotICAgSWYgdGhlcmUgaXMgbm8gQ0FTRV9M QUJFTCBmb3IgVkFMIGFuZCB0aGVyZSBpcyBvbmUgdGhhdCBpcyBsYXJnZXIgdGhhbiBWQUwsCi0g ICBpdCBpcyBwbGFjZWQgaW4gSURYIGFuZCBmYWxzZSBpcyByZXR1cm5lZC4KLQotICAgSWYgVkFM IGlzIGxhcmdlciB0aGFuIGFueSBDQVNFX0xBQkVMLCBuIGlzIHBsYWNlZCBvbiBJRFggYW5kIGZh bHNlIGlzCi0gICByZXR1cm5lZC4gKi8KLQotYm9vbAotZmluZF9jYXNlX2xhYmVsX2luZGV4IChn c3dpdGNoICpzdG10LCBzaXplX3Qgc3RhcnRfaWR4LCB0cmVlIHZhbCwgc2l6ZV90ICppZHgpCi17 Ci0gIHNpemVfdCBuID0gZ2ltcGxlX3N3aXRjaF9udW1fbGFiZWxzIChzdG10KTsKLSAgc2l6ZV90 IGxvdywgaGlnaDsKLQotICAvKiBGaW5kIGNhc2UgbGFiZWwgZm9yIG1pbmltdW0gb2YgdGhlIHZh bHVlIHJhbmdlIG9yIHRoZSBuZXh0IG9uZS4KLSAgICAgQXQgZWFjaCBpdGVyYXRpb24gd2UgYXJl IHNlYXJjaGluZyBpbiBbbG93LCBoaWdoIC0gMV0uICovCi0KLSAgZm9yIChsb3cgPSBzdGFydF9p ZHgsIGhpZ2ggPSBuOyBoaWdoICE9IGxvdzsgKQotICAgIHsKLSAgICAgIHRyZWUgdDsKLSAgICAg IGludCBjbXA7Ci0gICAgICAvKiBOb3RlIHRoYXQgaSAhPSBoaWdoLCBzbyB3ZSBuZXZlciBhc2sg Zm9yIG4uICovCi0gICAgICBzaXplX3QgaSA9IChoaWdoICsgbG93KSAvIDI7Ci0gICAgICB0ID0g Z2ltcGxlX3N3aXRjaF9sYWJlbCAoc3RtdCwgaSk7Ci0KLSAgICAgIC8qIENhY2hlIHRoZSByZXN1 bHQgb2YgY29tcGFyaW5nIENBU0VfTE9XIGFuZCB2YWwuICAqLwotICAgICAgY21wID0gdHJlZV9p bnRfY3N0X2NvbXBhcmUgKENBU0VfTE9XICh0KSwgdmFsKTsKLQotICAgICAgaWYgKGNtcCA9PSAw KQotCXsKLQkgIC8qIFJhbmdlcyBjYW5ub3QgYmUgZW1wdHkuICovCi0JICAqaWR4ID0gaTsKLQkg IHJldHVybiB0cnVlOwotCX0KLSAgICAgIGVsc2UgaWYgKGNtcCA+IDApCi0gICAgICAgIGhpZ2gg PSBpOwotICAgICAgZWxzZQotCXsKLQkgIGxvdyA9IGkgKyAxOwotCSAgaWYgKENBU0VfSElHSCAo dCkgIT0gTlVMTAotCSAgICAgICYmIHRyZWVfaW50X2NzdF9jb21wYXJlIChDQVNFX0hJR0ggKHQp LCB2YWwpID49IDApCi0JICAgIHsKLQkgICAgICAqaWR4ID0gaTsKLQkgICAgICByZXR1cm4gdHJ1 ZTsKLQkgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICppZHggPSBoaWdoOwotICByZXR1cm4g ZmFsc2U7Ci19Ci0KLS8qIFNlYXJjaGVzIHRoZSBjYXNlIGxhYmVsIHZlY3RvciBWRUMgZm9yIHRo ZSByYW5nZSBvZiBDQVNFX0xBQkVMcyB0aGF0IGlzIHVzZWQKLSAgIGZvciB2YWx1ZXMgYmV0d2Vl biBNSU4gYW5kIE1BWC4gVGhlIGZpcnN0IGluZGV4IGlzIHBsYWNlZCBpbiBNSU5fSURYLiBUaGUK LSAgIGxhc3QgaW5kZXggaXMgcGxhY2VkIGluIE1BWF9JRFguIElmIHRoZSByYW5nZSBvZiBDQVNF X0xBQkVMcyBpcyBlbXB0eQotICAgdGhlbiBNQVhfSURYIDwgTUlOX0lEWC4KLSAgIFJldHVybnMg dHJ1ZSBpZiB0aGUgZGVmYXVsdCBsYWJlbCBpcyBub3QgbmVlZGVkLiAqLwotCi1ib29sCi1maW5k X2Nhc2VfbGFiZWxfcmFuZ2UgKGdzd2l0Y2ggKnN0bXQsIHRyZWUgbWluLCB0cmVlIG1heCwgc2l6 ZV90ICptaW5faWR4LAotCQkgICAgICAgc2l6ZV90ICptYXhfaWR4KQotewotICBzaXplX3QgaSwg ajsKLSAgYm9vbCBtaW5fdGFrZV9kZWZhdWx0ID0gIWZpbmRfY2FzZV9sYWJlbF9pbmRleCAoc3Rt dCwgMSwgbWluLCAmaSk7Ci0gIGJvb2wgbWF4X3Rha2VfZGVmYXVsdCA9ICFmaW5kX2Nhc2VfbGFi ZWxfaW5kZXggKHN0bXQsIGksIG1heCwgJmopOwotCi0gIGlmIChpID09IGoKLSAgICAgICYmIG1p bl90YWtlX2RlZmF1bHQKLSAgICAgICYmIG1heF90YWtlX2RlZmF1bHQpCi0gICAgewotICAgICAg LyogT25seSB0aGUgZGVmYXVsdCBjYXNlIGxhYmVsIHJlYWNoZWQuCi0gICAgICAgICBSZXR1cm4g YW4gZW1wdHkgcmFuZ2UuICovCi0gICAgICAqbWluX2lkeCA9IDE7Ci0gICAgICAqbWF4X2lkeCA9 IDA7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgYm9v bCB0YWtlX2RlZmF1bHQgPSBtaW5fdGFrZV9kZWZhdWx0IHx8IG1heF90YWtlX2RlZmF1bHQ7Ci0g ICAgICB0cmVlIGxvdywgaGlnaDsKLSAgICAgIHNpemVfdCBrOwotCi0gICAgICBpZiAobWF4X3Rh a2VfZGVmYXVsdCkKLQlqLS07Ci0KLSAgICAgIC8qIElmIHRoZSBjYXNlIGxhYmVsIHJhbmdlIGlz IGNvbnRpbnVvdXMsIHdlIGRvIG5vdCBuZWVkCi0JIHRoZSBkZWZhdWx0IGNhc2UgbGFiZWwuICBW ZXJpZnkgdGhhdC4gICovCi0gICAgICBoaWdoID0gQ0FTRV9MT1cgKGdpbXBsZV9zd2l0Y2hfbGFi ZWwgKHN0bXQsIGkpKTsKLSAgICAgIGlmIChDQVNFX0hJR0ggKGdpbXBsZV9zd2l0Y2hfbGFiZWwg KHN0bXQsIGkpKSkKLQloaWdoID0gQ0FTRV9ISUdIIChnaW1wbGVfc3dpdGNoX2xhYmVsIChzdG10 LCBpKSk7Ci0gICAgICBmb3IgKGsgPSBpICsgMTsgayA8PSBqOyArK2spCi0JewotCSAgbG93ID0g Q0FTRV9MT1cgKGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQsIGspKTsKLQkgIGlmICghaW50ZWdl cl9vbmVwIChpbnRfY29uc3RfYmlub3AgKE1JTlVTX0VYUFIsIGxvdywgaGlnaCkpKQotCSAgICB7 Ci0JICAgICAgdGFrZV9kZWZhdWx0ID0gdHJ1ZTsKLQkgICAgICBicmVhazsKLQkgICAgfQotCSAg aGlnaCA9IGxvdzsKLQkgIGlmIChDQVNFX0hJR0ggKGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN0bXQs IGspKSkKLQkgICAgaGlnaCA9IENBU0VfSElHSCAoZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3RtdCwg aykpOwotCX0KLQotICAgICAgKm1pbl9pZHggPSBpOwotICAgICAgKm1heF9pZHggPSBqOwotICAg ICAgcmV0dXJuICF0YWtlX2RlZmF1bHQ7Ci0gICAgfQotfQotCi0vKiBHaXZlbiBhIFNXSVRDSF9T VE1ULCByZXR1cm4gdGhlIGNhc2UgbGFiZWwgdGhhdCBlbmNvbXBhc3NlcyB0aGUKLSAgIGtub3du IHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIHN3aXRjaCBvcGVyYW5kLiAgUkFOR0VfT0ZfT1AgaXMg YQotICAgcmFuZ2UgZm9yIHRoZSBrbm93biB2YWx1ZXMgb2YgdGhlIHN3aXRjaCBvcGVyYW5kLiAg Ki8KLQotdHJlZQotZmluZF9jYXNlX2xhYmVsX3JhbmdlIChnc3dpdGNoICpzd2l0Y2hfc3RtdCwg Y29uc3QgaXJhbmdlICpyYW5nZV9vZl9vcCkKLXsKLSAgaWYgKHJhbmdlX29mX29wLT51bmRlZmlu ZWRfcCAoKQotICAgICAgfHwgcmFuZ2Vfb2Zfb3AtPnZhcnlpbmdfcCAoKQotICAgICAgfHwgcmFu Z2Vfb2Zfb3AtPnN5bWJvbGljX3AgKCkpCi0gICAgcmV0dXJuIE5VTExfVFJFRTsKLQotICBzaXpl X3QgaSwgajsKLSAgdHJlZSBvcCA9IGdpbXBsZV9zd2l0Y2hfaW5kZXggKHN3aXRjaF9zdG10KTsK LSAgdHJlZSB0eXBlID0gVFJFRV9UWVBFIChvcCk7Ci0gIHRyZWUgdG1pbiA9IHdpZGVfaW50X3Rv X3RyZWUgKHR5cGUsIHJhbmdlX29mX29wLT5sb3dlcl9ib3VuZCAoKSk7Ci0gIHRyZWUgdG1heCA9 IHdpZGVfaW50X3RvX3RyZWUgKHR5cGUsIHJhbmdlX29mX29wLT51cHBlcl9ib3VuZCAoKSk7Ci0g IGZpbmRfY2FzZV9sYWJlbF9yYW5nZSAoc3dpdGNoX3N0bXQsIHRtaW4sIHRtYXgsICZpLCAmaik7 Ci0gIGlmIChpID09IGopCi0gICAgewotICAgICAgLyogTG9vayBmb3IgZXhhY3RseSBvbmUgbGFi ZWwgdGhhdCBlbmNvbXBhc3NlcyB0aGUgcmFuZ2Ugb2YKLQkgdGhlIG9wZXJhbmQuICAqLwotICAg ICAgdHJlZSBsYWJlbCA9IGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN3aXRjaF9zdG10LCBpKTsKLSAg ICAgIHRyZWUgY2FzZV9oaWdoCi0JPSBDQVNFX0hJR0ggKGxhYmVsKSA/IENBU0VfSElHSCAobGFi ZWwpIDogQ0FTRV9MT1cgKGxhYmVsKTsKLSAgICAgIGludF9yYW5nZV9tYXggbGFiZWxfcmFuZ2Ug KENBU0VfTE9XIChsYWJlbCksIGNhc2VfaGlnaCk7Ci0gICAgICBpZiAoIXR5cGVzX2NvbXBhdGli bGVfcCAobGFiZWxfcmFuZ2UudHlwZSAoKSwgcmFuZ2Vfb2Zfb3AtPnR5cGUgKCkpKQotCXJhbmdl X2Nhc3QgKGxhYmVsX3JhbmdlLCByYW5nZV9vZl9vcC0+dHlwZSAoKSk7Ci0gICAgICBsYWJlbF9y YW5nZS5pbnRlcnNlY3QgKCpyYW5nZV9vZl9vcCk7Ci0gICAgICBpZiAobGFiZWxfcmFuZ2UgPT0g KnJhbmdlX29mX29wKQotCXJldHVybiBsYWJlbDsKLSAgICB9Ci0gIGVsc2UgaWYgKGkgPiBqKQot ICAgIHsKLSAgICAgIC8qIElmIHRoZXJlIGFyZSBubyBsYWJlbHMgYXQgYWxsLCB0YWtlIHRoZSBk ZWZhdWx0LiAgKi8KLSAgICAgIHJldHVybiBnaW1wbGVfc3dpdGNoX2xhYmVsIChzd2l0Y2hfc3Rt dCwgMCk7Ci0gICAgfQotICBlbHNlCi0gICAgewotICAgICAgLyogT3RoZXJ3aXNlLCB0aGVyZSBh cmUgdmFyaW91cyBsYWJlbHMgdGhhdCBjYW4gZW5jb21wYXNzCi0JIHRoZSByYW5nZSBvZiBvcGVy YW5kLiAgSW4gd2hpY2ggY2FzZSwgc2VlIGlmIHRoZSByYW5nZSBvZgotCSB0aGUgb3BlcmFuZCBp cyBlbnRpcmVseSAqb3V0c2lkZSogdGhlIGJvdW5kcyBvZiBhbGwgdGhlCi0JIChub24tZGVmYXVs dCkgY2FzZSBsYWJlbHMuICBJZiBzbywgdGFrZSB0aGUgZGVmYXVsdC4gICovCi0gICAgICB1bnNp Z25lZCBuID0gZ2ltcGxlX3N3aXRjaF9udW1fbGFiZWxzIChzd2l0Y2hfc3RtdCk7Ci0gICAgICB0 cmVlIG1pbl9sYWJlbCA9IGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN3aXRjaF9zdG10LCAxKTsKLSAg ICAgIHRyZWUgbWF4X2xhYmVsID0gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3dpdGNoX3N0bXQsIG4g LSAxKTsKLSAgICAgIHRyZWUgY2FzZV9oaWdoID0gQ0FTRV9ISUdIIChtYXhfbGFiZWwpOwotICAg ICAgaWYgKCFjYXNlX2hpZ2gpCi0JY2FzZV9oaWdoID0gQ0FTRV9MT1cgKG1heF9sYWJlbCk7Ci0g ICAgICBpbnRfcmFuZ2VfbWF4IGxhYmVsX3JhbmdlIChDQVNFX0xPVyAobWluX2xhYmVsKSwgY2Fz ZV9oaWdoKTsKLSAgICAgIGlmICghdHlwZXNfY29tcGF0aWJsZV9wIChsYWJlbF9yYW5nZS50eXBl ICgpLCByYW5nZV9vZl9vcC0+dHlwZSAoKSkpCi0JcmFuZ2VfY2FzdCAobGFiZWxfcmFuZ2UsIHJh bmdlX29mX29wLT50eXBlICgpKTsKLSAgICAgIGxhYmVsX3JhbmdlLmludGVyc2VjdCAoKnJhbmdl X29mX29wKTsKLSAgICAgIGlmIChsYWJlbF9yYW5nZS51bmRlZmluZWRfcCAoKSkKLQlyZXR1cm4g Z2ltcGxlX3N3aXRjaF9sYWJlbCAoc3dpdGNoX3N0bXQsIDApOwotICAgIH0KLSAgcmV0dXJuIE5V TExfVFJFRTsKLX0KLQotc3RydWN0IGNhc2VfaW5mbwotewotICB0cmVlIGV4cHI7Ci0gIGJhc2lj X2Jsb2NrIGJiOwotfTsKLQotLyogTG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIEFTU0VSVF9FWFBS cy4gIEVhY2ggaW5zdGFuY2Ugb2YgdGhpcwotICAgc3RydWN0dXJlIGRlc2NyaWJlcyBhbiBBU1NF UlRfRVhQUiBmb3IgYW4gU1NBIG5hbWUuICBTaW5jZSBhIHNpbmdsZQotICAgU1NBIG5hbWUgbWF5 IGhhdmUgbW9yZSB0aGFuIG9uZSBhc3NlcnRpb24gYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVzZQot ICAgbG9jYXRpb25zIGFyZSBrZXB0IGluIGEgbGlua2VkIGxpc3QgYXR0YWNoZWQgdG8gdGhlIGNv cnJlc3BvbmRpbmcKLSAgIFNTQSBuYW1lLiAgKi8KLXN0cnVjdCBhc3NlcnRfbG9jdXMKLXsKLSAg LyogQmFzaWMgYmxvY2sgd2hlcmUgdGhlIGFzc2VydGlvbiB3b3VsZCBiZSBpbnNlcnRlZC4gICov Ci0gIGJhc2ljX2Jsb2NrIGJiOwotCi0gIC8qIFNvbWUgYXNzZXJ0aW9ucyBuZWVkIHRvIGJlIGlu c2VydGVkIG9uIGFuIGVkZ2UgKGUuZy4sIGFzc2VydGlvbnMKLSAgICAgZ2VuZXJhdGVkIGJ5IENP TkRfRVhQUnMpLiAgSW4gdGhvc2UgY2FzZXMsIEJCIHdpbGwgYmUgTlVMTC4gICovCi0gIGVkZ2Ug ZTsKLQotICAvKiBQb2ludGVyIHRvIHRoZSBzdGF0ZW1lbnQgdGhhdCBnZW5lcmF0ZWQgdGhpcyBh c3NlcnRpb24uICAqLwotICBnaW1wbGVfc3RtdF9pdGVyYXRvciBzaTsKLQotICAvKiBQcmVkaWNh dGUgY29kZSBmb3IgdGhlIEFTU0VSVF9FWFBSLiAgTXVzdCBiZSBDT01QQVJJU09OX0NMQVNTX1Au ICAqLwotICBlbnVtIHRyZWVfY29kZSBjb21wX2NvZGU7Ci0KLSAgLyogVmFsdWUgYmVpbmcgY29t cGFyZWQgYWdhaW5zdC4gICovCi0gIHRyZWUgdmFsOwotCi0gIC8qIEV4cHJlc3Npb24gdG8gY29t cGFyZS4gICovCi0gIHRyZWUgZXhwcjsKLQotICAvKiBOZXh0IG5vZGUgaW4gdGhlIGxpbmtlZCBs aXN0LiAgKi8KLSAgYXNzZXJ0X2xvY3VzICpuZXh0OwotfTsKLQotLyogQ2xhc3MgdG8gdHJhdmVy c2UgdGhlIGZsb3dncmFwaCBsb29raW5nIGZvciBjb25kaXRpb25hbCBqdW1wcyB0bwotICAgaW5z ZXJ0IEFTU0VSVF9FWFBSIHJhbmdlIGV4cHJlc3Npb25zLiAgVGhlc2UgcmFuZ2UgZXhwcmVzc2lv bnMgYXJlCi0gICBtZWFudCB0byBwcm92aWRlIGluZm9ybWF0aW9uIHRvIG9wdGltaXphdGlvbnMg dGhhdCBuZWVkIHRvIHJlYXNvbgotICAgaW4gdGVybXMgb2YgdmFsdWUgcmFuZ2VzLiAgVGhleSB3 aWxsIG5vdCBiZSBleHBhbmRlZCBpbnRvIFJUTC4gICovCi0KLWNsYXNzIHZycF9hc3NlcnRzCi17 Ci1wdWJsaWM6Ci0gIHZycF9hc3NlcnRzIChzdHJ1Y3QgZnVuY3Rpb24gKmZuKSA6IGZ1biAoZm4p IHsgfQotCi0gIHZvaWQgaW5zZXJ0X3JhbmdlX2Fzc2VydGlvbnMgKCk7Ci0KLSAgLyogQ29udmVy dCByYW5nZSBhc3NlcnRpb24gZXhwcmVzc2lvbnMgaW50byB0aGUgaW1wbGllZCBjb3BpZXMgYW5k Ci0gICAgIGNvcHkgcHJvcGFnYXRlIGF3YXkgdGhlIGNvcGllcy4gICovCi0gIHZvaWQgcmVtb3Zl X3JhbmdlX2Fzc2VydGlvbnMgKCk7Ci0KLSAgLyogRHVtcCBhbGwgdGhlIHJlZ2lzdGVyZWQgYXNz ZXJ0aW9ucyBmb3IgYWxsIHRoZSBuYW1lcyB0byBGSUxFLiAgKi8KLSAgdm9pZCBkdW1wIChGSUxF ICopOwotCi0gIC8qIER1bXAgYWxsIHRoZSByZWdpc3RlcmVkIGFzc2VydGlvbnMgZm9yIE5BTUUg dG8gRklMRS4gICovCi0gIHZvaWQgZHVtcCAoRklMRSAqZmlsZSwgdHJlZSBuYW1lKTsKLQotICAv KiBEdW1wIGFsbCB0aGUgcmVnaXN0ZXJlZCBhc3NlcnRpb25zIGZvciBOQU1FIHRvIHN0ZGVyci4g ICovCi0gIHZvaWQgZGVidWcgKHRyZWUgbmFtZSkKLSAgewotICAgIGR1bXAgKHN0ZGVyciwgbmFt ZSk7Ci0gIH0KLQotICAvKiBEdW1wIGFsbCB0aGUgcmVnaXN0ZXJlZCBhc3NlcnRpb25zIGZvciBh bGwgdGhlIG5hbWVzIHRvIHN0ZGVyci4gICovCi0gIHZvaWQgZGVidWcgKCkKLSAgewotICAgIGR1 bXAgKHN0ZGVycik7Ci0gIH0KLQotcHJpdmF0ZToKLSAgLyogU2V0IG9mIFNTQSBuYW1lcyBmb3Vu ZCBsaXZlIGR1cmluZyB0aGUgUlBPIHRyYXZlcnNhbCBvZiB0aGUgZnVuY3Rpb24KLSAgICAgZm9y IHN0aWxsIGFjdGl2ZSBiYXNpYy1ibG9ja3MuICAqLwotICBsaXZlX25hbWVzIGxpdmU7Ci0KLSAg LyogRnVuY3Rpb24gdG8gd29yayBvbi4gICovCi0gIHN0cnVjdCBmdW5jdGlvbiAqZnVuOwotCi0g IC8qIElmIGJpdCBJIGlzIHByZXNlbnQsIGl0IG1lYW5zIHRoYXQgU1NBIG5hbWUgTl9pIGhhcyBh IGxpc3Qgb2YKLSAgICAgYXNzZXJ0aW9ucyB0aGF0IHNob3VsZCBiZSBpbnNlcnRlZCBpbiB0aGUg SUwuICAqLwotICBiaXRtYXAgbmVlZF9hc3NlcnRfZm9yOwotCi0gIC8qIEFycmF5IG9mIGxvY2F0 aW9ucyBsaXN0cyB3aGVyZSB0byBpbnNlcnQgYXNzZXJ0aW9ucy4gIEFTU0VSVFNfRk9SW0ldCi0g ICAgIGhvbGRzIGEgbGlzdCBvZiBBU1NFUlRfTE9DVVNfVCBub2RlcyB0aGF0IGRlc2NyaWJlIHdo ZXJlCi0gICAgIEFTU0VSVF9FWFBScyBmb3IgU1NBIG5hbWUgTl9JIHNob3VsZCBiZSBpbnNlcnRl ZC4gICovCi0gIGFzc2VydF9sb2N1cyAqKmFzc2VydHNfZm9yOwotCi0gIC8qIEZpbmlzaCBmb3Vu ZCBBU1NFUlRTIGZvciBFIGFuZCByZWdpc3RlciB0aGVtIGF0IEdTSS4gICovCi0gIHZvaWQgZmlu aXNoX3JlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2ZvciAoZWRnZSBlLCBnaW1wbGVfc3RtdF9pdGVyYXRv ciBnc2ksCi0JCQkJCXZlYzxhc3NlcnRfaW5mbz4gJmFzc2VydHMpOwotCi0gIC8qIERldGVybWlu ZSB3aGV0aGVyIHRoZSBvdXRnb2luZyBlZGdlcyBvZiBCQiBzaG91bGQgcmVjZWl2ZSBhbgotICAg ICBBU1NFUlRfRVhQUiBmb3IgZWFjaCBvZiB0aGUgb3BlcmFuZHMgb2YgQkIncyBMQVNUIHN0YXRl bWVudC4gIFRoZQotICAgICBsYXN0IHN0YXRlbWVudCBvZiBCQiBtdXN0IGJlIGEgU1dJVENIX0VY UFIuCi0KLSAgICAgSWYgYW55IG9mIHRoZSBzdWItZ3JhcGhzIHJvb3RlZCBhdCBCQiBoYXZlIGFu IGludGVyZXN0aW5nIHVzZSBvZgotICAgICB0aGUgcHJlZGljYXRlIG9wZXJhbmRzLCBhbiBhc3Nl cnQgbG9jYXRpb24gbm9kZSBpcyBhZGRlZCB0byB0aGUKLSAgICAgbGlzdCBvZiBhc3NlcnRpb25z IGZvciB0aGUgY29ycmVzcG9uZGluZyBvcGVyYW5kcy4gICovCi0gIHZvaWQgZmluZF9zd2l0Y2hf YXNzZXJ0cyAoYmFzaWNfYmxvY2sgYmIsIGdzd2l0Y2ggKmxhc3QpOwotCi0gIC8qIERvIGFuIFJQ TyB3YWxrIG92ZXIgdGhlIGZ1bmN0aW9uIGNvbXB1dGluZyBTU0EgbmFtZSBsaXZlbmVzcwotICAg ICBvbi10aGUtZmx5IGFuZCBkZWNpZGluZyBvbiBhc3NlcnQgZXhwcmVzc2lvbnMgdG8gaW5zZXJ0 LiAgKi8KLSAgdm9pZCBmaW5kX2Fzc2VydF9sb2NhdGlvbnMgKCk7Ci0KLSAgLyogVHJhdmVyc2Ug YWxsIHRoZSBzdGF0ZW1lbnRzIGluIGJsb2NrIEJCIGxvb2tpbmcgZm9yIHN0YXRlbWVudHMgdGhh dAotICAgICBtYXkgZ2VuZXJhdGUgdXNlZnVsIGFzc2VydGlvbnMgZm9yIHRoZSBTU0EgbmFtZXMg aW4gdGhlaXIgb3BlcmFuZC4KLSAgICAgU2VlIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBjb21lbnRh cnkgZm9yIG1vcmUgaW5mb3JtYXRpb24uICAqLwotICB2b2lkIGZpbmRfYXNzZXJ0X2xvY2F0aW9u c19pbl9iYiAoYmFzaWNfYmxvY2sgYmIpOwotCi0gIC8qIERldGVybWluZSB3aGV0aGVyIHRoZSBv dXRnb2luZyBlZGdlcyBvZiBCQiBzaG91bGQgcmVjZWl2ZSBhbgotICAgICBBU1NFUlRfRVhQUiBm b3IgZWFjaCBvZiB0aGUgb3BlcmFuZHMgb2YgQkIncyBMQVNUIHN0YXRlbWVudC4KLSAgICAgVGhl IGxhc3Qgc3RhdGVtZW50IG9mIEJCIG11c3QgYmUgYSBDT05EX0VYUFIuCi0KLSAgICAgSWYgYW55 IG9mIHRoZSBzdWItZ3JhcGhzIHJvb3RlZCBhdCBCQiBoYXZlIGFuIGludGVyZXN0aW5nIHVzZSBv ZgotICAgICB0aGUgcHJlZGljYXRlIG9wZXJhbmRzLCBhbiBhc3NlcnQgbG9jYXRpb24gbm9kZSBp cyBhZGRlZCB0byB0aGUKLSAgICAgbGlzdCBvZiBhc3NlcnRpb25zIGZvciB0aGUgY29ycmVzcG9u ZGluZyBvcGVyYW5kcy4gICovCi0gIHZvaWQgZmluZF9jb25kaXRpb25hbF9hc3NlcnRzIChiYXNp Y19ibG9jayBiYiwgZ2NvbmQgKmxhc3QpOwotCi0gIC8qIFByb2Nlc3MgYWxsIHRoZSBpbnNlcnRp b25zIHJlZ2lzdGVyZWQgZm9yIGV2ZXJ5IG5hbWUgTl9pIHJlZ2lzdGVyZWQKLSAgICAgaW4gTkVF RF9BU1NFUlRfRk9SLiAgVGhlIGxpc3Qgb2YgYXNzZXJ0aW9ucyB0byBiZSBpbnNlcnRlZCBhcmUK LSAgICAgZm91bmQgaW4gQVNTRVJUU19GT1JbaV0uICAqLwotICB2b2lkIHByb2Nlc3NfYXNzZXJ0 X2luc2VydGlvbnMgKCk7Ci0KLSAgLyogSWYgTkFNRSBkb2Vzbid0IGhhdmUgYW4gQVNTRVJUX0VY UFIgcmVnaXN0ZXJlZCBmb3IgYXNzZXJ0aW5nCi0gICAgICdFWFBSIENPTVBfQ09ERSBWQUwnIGF0 IGEgbG9jYXRpb24gdGhhdCBkb21pbmF0ZXMgYmxvY2sgQkIgb3IKLSAgICAgRS0+REVTVCwgdGhl biByZWdpc3RlciB0aGlzIGxvY2F0aW9uIGFzIGEgcG9zc2libGUgaW5zZXJ0aW9uIHBvaW50Ci0g ICAgIGZvciBBU1NFUlRfRVhQUiA8TkFNRSwgRVhQUiBDT01QX0NPREUgVkFMPi4KLQotICAgICBC QiwgRSBhbmQgU0kgcHJvdmlkZSB0aGUgZXhhY3QgaW5zZXJ0aW9uIHBvaW50IGZvciB0aGUgbmV3 Ci0gICAgIEFTU0VSVF9FWFBSLiAgSWYgQkIgaXMgTlVMTCwgdGhlbiB0aGUgQVNTRVJUX0VYUFIg aXMgdG8gYmUgaW5zZXJ0ZWQKLSAgICAgb24gZWRnZSBFLiAgT3RoZXJ3aXNlLCBpZiBFIGlzIE5V TEwsIHRoZSBBU1NFUlRfRVhQUiBpcyBpbnNlcnRlZCBvbgotICAgICBCQi4gIElmIFNJIHBvaW50 cyB0byBhIENPTkRfRVhQUiBvciBhIFNXSVRDSF9FWFBSIHN0YXRlbWVudCwgdGhlbiBFCi0gICAg IG11c3Qgbm90IGJlIE5VTEwuICAqLwotICB2b2lkIHJlZ2lzdGVyX25ld19hc3NlcnRfZm9yICh0 cmVlIG5hbWUsIHRyZWUgZXhwciwKLQkJCQllbnVtIHRyZWVfY29kZSBjb21wX2NvZGUsCi0JCQkJ dHJlZSB2YWwsIGJhc2ljX2Jsb2NrIGJiLAotCQkJCWVkZ2UgZSwgZ2ltcGxlX3N0bXRfaXRlcmF0 b3Igc2kpOwotCi0gIC8qIEdpdmVuIGEgQ09ORF9FWFBSIENPTkQgb2YgdGhlIGZvcm0gJ1YgT1Ag VycsIGFuZCBhbiBTU0EgbmFtZSBWLAotICAgICBjcmVhdGUgYSBuZXcgU1NBIG5hbWUgTiBhbmQg cmV0dXJuIHRoZSBhc3NlcnRpb24gYXNzaWdubWVudAotICAgICAnTiA9IEFTU0VSVF9FWFBSIDxW LCBWIE9QIFc+Jy4gICovCi0gIGdpbXBsZSAqYnVpbGRfYXNzZXJ0X2V4cHJfZm9yICh0cmVlIGNv bmQsIHRyZWUgdik7Ci0KLSAgLyogQ3JlYXRlIGFuIEFTU0VSVF9FWFBSIGZvciBOQU1FIGFuZCBp bnNlcnQgaXQgaW4gdGhlIGxvY2F0aW9uCi0gICAgIGluZGljYXRlZCBieSBMT0MuICBSZXR1cm4g dHJ1ZSBpZiB3ZSBtYWRlIGFueSBlZGdlIGluc2VydGlvbnMuICAqLwotICBib29sIHByb2Nlc3Nf YXNzZXJ0X2luc2VydGlvbnNfZm9yICh0cmVlIG5hbWUsIGFzc2VydF9sb2N1cyAqbG9jKTsKLQot ICAvKiBRc29ydCBjYWxsYmFjayBmb3Igc29ydGluZyBhc3NlcnQgbG9jYXRpb25zLiAgKi8KLSAg dGVtcGxhdGUgPGJvb2wgc3RhYmxlPiBzdGF0aWMgaW50IGNvbXBhcmVfYXNzZXJ0X2xvYyAoY29u c3Qgdm9pZCAqLAotCQkJCQkJCWNvbnN0IHZvaWQgKik7Ci0KLSAgLyogUmV0dXJuIGZhbHNlIGlm IEVYUFIgaXMgYSBwcmVkaWNhdGUgZXhwcmVzc2lvbiBpbnZvbHZpbmcgZmxvYXRpbmcKLSAgICAg cG9pbnQgdmFsdWVzLiAgKi8KLSAgYm9vbCBmcF9wcmVkaWNhdGUgKGdpbXBsZSAqc3RtdCkKLSAg ewotICAgIEdJTVBMRV9DSEVDSyAoc3RtdCwgR0lNUExFX0NPTkQpOwotICAgIHJldHVybiBGTE9B VF9UWVBFX1AgKFRSRUVfVFlQRSAoZ2ltcGxlX2NvbmRfbGhzIChzdG10KSkpOwotICB9Ci0KLSAg Ym9vbCBhbGxfaW1tX3VzZXNfaW5fc3RtdF9vcl9mZWVkX2NvbmQgKHRyZWUgdmFyLCBnaW1wbGUg KnN0bXQsCi0JCQkJCSAgYmFzaWNfYmxvY2sgY29uZF9iYik7Ci0KLSAgc3RhdGljIGludCBjb21w YXJlX2Nhc2VfbGFiZWxzIChjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik7Ci19OwotCi0vKiBH aXZlbiBhIENPTkRfRVhQUiBDT05EIG9mIHRoZSBmb3JtICdWIE9QIFcnLCBhbmQgYW4gU1NBIG5h bWUgViwKLSAgIGNyZWF0ZSBhIG5ldyBTU0EgbmFtZSBOIGFuZCByZXR1cm4gdGhlIGFzc2VydGlv biBhc3NpZ25tZW50Ci0gICAnTiA9IEFTU0VSVF9FWFBSIDxWLCBWIE9QIFc+Jy4gICovCi0KLWdp bXBsZSAqCi12cnBfYXNzZXJ0czo6YnVpbGRfYXNzZXJ0X2V4cHJfZm9yICh0cmVlIGNvbmQsIHRy ZWUgdikKLXsKLSAgdHJlZSBhOwotICBnYXNzaWduICphc3NlcnRpb247Ci0KLSAgZ2NjX2Fzc2Vy dCAoVFJFRV9DT0RFICh2KSA9PSBTU0FfTkFNRQotCSAgICAgICYmIENPTVBBUklTT05fQ0xBU1Nf UCAoY29uZCkpOwotCi0gIGEgPSBidWlsZDIgKEFTU0VSVF9FWFBSLCBUUkVFX1RZUEUgKHYpLCB2 LCBjb25kKTsKLSAgYXNzZXJ0aW9uID0gZ2ltcGxlX2J1aWxkX2Fzc2lnbiAoTlVMTF9UUkVFLCBh KTsKLQotICAvKiBUaGUgbmV3IEFTU0VSVF9FWFBSLCBjcmVhdGVzIGEgbmV3IFNTQSBuYW1lIHRo YXQgcmVwbGFjZXMgdGhlCi0gICAgIG9wZXJhbmQgb2YgdGhlIEFTU0VSVF9FWFBSLiAgQ3JlYXRl IGl0IHNvIHRoZSBuZXcgbmFtZSBhbmQgdGhlIG9sZCBvbmUKLSAgICAgYXJlIHJlZ2lzdGVyZWQg aW4gdGhlIHJlcGxhY2VtZW50IHRhYmxlIHNvIHRoYXQgd2UgY2FuIGZpeCB0aGUgU1NBIHdlYgot ICAgICBhZnRlciBhZGRpbmcgYWxsIHRoZSBBU1NFUlRfRVhQUnMuICAqLwotICB0cmVlIG5ld19k ZWYgPSBjcmVhdGVfbmV3X2RlZl9mb3IgKHYsIGFzc2VydGlvbiwgTlVMTCk7Ci0gIC8qIE1ha2Ug c3VyZSB3ZSBwcmVzZXJ2ZSBhYm5vcm1hbG5lc3MgdGhyb3VnaG91dCBhbiBBU1NFUlRfRVhQUiBj aGFpbgotICAgICBnaXZlbiB3ZSBoYXZlIHRvIGJlIGFibGUgdG8gZnVsbHkgcHJvcGFnYXRlIHRo b3NlIG91dCB0byByZS1jcmVhdGUKLSAgICAgdmFsaWQgU1NBIHdoZW4gcmVtb3ZpbmcgdGhlIGFz c2VydHMuICAqLwotICBpZiAoU1NBX05BTUVfT0NDVVJTX0lOX0FCTk9STUFMX1BISSAodikpCi0g ICAgU1NBX05BTUVfT0NDVVJTX0lOX0FCTk9STUFMX1BISSAobmV3X2RlZikgPSAxOwotCi0gIHJl dHVybiBhc3NlcnRpb247Ci19Ci0KLS8qIER1bXAgYWxsIHRoZSByZWdpc3RlcmVkIGFzc2VydGlv bnMgZm9yIE5BTUUgdG8gRklMRS4gICovCi0KLXZvaWQKLXZycF9hc3NlcnRzOjpkdW1wIChGSUxF ICpmaWxlLCB0cmVlIG5hbWUpCi17Ci0gIGFzc2VydF9sb2N1cyAqbG9jOwotCi0gIGZwcmludGYg KGZpbGUsICJBc3NlcnRpb25zIHRvIGJlIGluc2VydGVkIGZvciAiKTsKLSAgcHJpbnRfZ2VuZXJp Y19leHByIChmaWxlLCBuYW1lKTsKLSAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0KLSAgbG9jID0g YXNzZXJ0c19mb3JbU1NBX05BTUVfVkVSU0lPTiAobmFtZSldOwotICB3aGlsZSAobG9jKQotICAg IHsKLSAgICAgIGZwcmludGYgKGZpbGUsICJcdCIpOwotICAgICAgcHJpbnRfZ2ltcGxlX3N0bXQg KGZpbGUsIGdzaV9zdG10IChsb2MtPnNpKSwgMCk7Ci0gICAgICBmcHJpbnRmIChmaWxlLCAiXG5c dEJCICMlZCIsIGxvYy0+YmItPmluZGV4KTsKLSAgICAgIGlmIChsb2MtPmUpCi0JewotCSAgZnBy aW50ZiAoZmlsZSwgIlxuXHRFREdFICVkLT4lZCIsIGxvYy0+ZS0+c3JjLT5pbmRleCwKLQkgICAg ICAgICAgIGxvYy0+ZS0+ZGVzdC0+aW5kZXgpOwotCSAgZHVtcF9lZGdlX2luZm8gKGZpbGUsIGxv Yy0+ZSwgZHVtcF9mbGFncywgMCk7Ci0JfQotICAgICAgZnByaW50ZiAoZmlsZSwgIlxuXHRQUkVE SUNBVEU6ICIpOwotICAgICAgcHJpbnRfZ2VuZXJpY19leHByIChmaWxlLCBsb2MtPmV4cHIpOwot ICAgICAgZnByaW50ZiAoZmlsZSwgIiAlcyAiLCBnZXRfdHJlZV9jb2RlX25hbWUgKGxvYy0+Y29t cF9jb2RlKSk7Ci0gICAgICBwcmludF9nZW5lcmljX2V4cHIgKGZpbGUsIGxvYy0+dmFsKTsKLSAg ICAgIGZwcmludGYgKGZpbGUsICJcblxuIik7Ci0gICAgICBsb2MgPSBsb2MtPm5leHQ7Ci0gICAg fQotCi0gIGZwcmludGYgKGZpbGUsICJcbiIpOwotfQotCi0vKiBEdW1wIGFsbCB0aGUgcmVnaXN0 ZXJlZCBhc3NlcnRpb25zIGZvciBhbGwgdGhlIG5hbWVzIHRvIEZJTEUuICAqLwotCi12b2lkCi12 cnBfYXNzZXJ0czo6ZHVtcCAoRklMRSAqZmlsZSkKLXsKLSAgdW5zaWduZWQgaTsKLSAgYml0bWFw X2l0ZXJhdG9yIGJpOwotCi0gIGZwcmludGYgKGZpbGUsICJcbkFTU0VSVF9FWFBScyB0byBiZSBp bnNlcnRlZFxuXG4iKTsKLSAgRVhFQ1VURV9JRl9TRVRfSU5fQklUTUFQIChuZWVkX2Fzc2VydF9m b3IsIDAsIGksIGJpKQotICAgIGR1bXAgKGZpbGUsIHNzYV9uYW1lIChpKSk7Ci0gIGZwcmludGYg KGZpbGUsICJcbiIpOwotfQotCi0vKiBJZiBOQU1FIGRvZXNuJ3QgaGF2ZSBhbiBBU1NFUlRfRVhQ UiByZWdpc3RlcmVkIGZvciBhc3NlcnRpbmcKLSAgICdFWFBSIENPTVBfQ09ERSBWQUwnIGF0IGEg bG9jYXRpb24gdGhhdCBkb21pbmF0ZXMgYmxvY2sgQkIgb3IKLSAgIEUtPkRFU1QsIHRoZW4gcmVn aXN0ZXIgdGhpcyBsb2NhdGlvbiBhcyBhIHBvc3NpYmxlIGluc2VydGlvbiBwb2ludAotICAgZm9y IEFTU0VSVF9FWFBSIDxOQU1FLCBFWFBSIENPTVBfQ09ERSBWQUw+LgotCi0gICBCQiwgRSBhbmQg U0kgcHJvdmlkZSB0aGUgZXhhY3QgaW5zZXJ0aW9uIHBvaW50IGZvciB0aGUgbmV3Ci0gICBBU1NF UlRfRVhQUi4gIElmIEJCIGlzIE5VTEwsIHRoZW4gdGhlIEFTU0VSVF9FWFBSIGlzIHRvIGJlIGlu c2VydGVkCi0gICBvbiBlZGdlIEUuICBPdGhlcndpc2UsIGlmIEUgaXMgTlVMTCwgdGhlIEFTU0VS VF9FWFBSIGlzIGluc2VydGVkIG9uCi0gICBCQi4gIElmIFNJIHBvaW50cyB0byBhIENPTkRfRVhQ UiBvciBhIFNXSVRDSF9FWFBSIHN0YXRlbWVudCwgdGhlbiBFCi0gICBtdXN0IG5vdCBiZSBOVUxM LiAgKi8KLQotdm9pZAotdnJwX2Fzc2VydHM6OnJlZ2lzdGVyX25ld19hc3NlcnRfZm9yICh0cmVl IG5hbWUsIHRyZWUgZXhwciwKLQkJCQkgICAgICBlbnVtIHRyZWVfY29kZSBjb21wX2NvZGUsCi0J CQkJICAgICAgdHJlZSB2YWwsCi0JCQkJICAgICAgYmFzaWNfYmxvY2sgYmIsCi0JCQkJICAgICAg ZWRnZSBlLAotCQkJCSAgICAgIGdpbXBsZV9zdG10X2l0ZXJhdG9yIHNpKQotewotICBhc3NlcnRf bG9jdXMgKm4sICpsb2MsICpsYXN0X2xvYzsKLSAgYmFzaWNfYmxvY2sgZGVzdF9iYjsKLQotICBn Y2NfY2hlY2tpbmdfYXNzZXJ0IChiYiA9PSBOVUxMIHx8IGUgPT0gTlVMTCk7Ci0KLSAgaWYgKGUg PT0gTlVMTCkKLSAgICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChnaW1wbGVfY29kZSAoZ3NpX3N0bXQg KHNpKSkgIT0gR0lNUExFX0NPTkQKLQkJCSAmJiBnaW1wbGVfY29kZSAoZ3NpX3N0bXQgKHNpKSkg IT0gR0lNUExFX1NXSVRDSCk7Ci0KLSAgLyogTmV2ZXIgYnVpbGQgYW4gYXNzZXJ0IGNvbXBhcmlu ZyBhZ2FpbnN0IGFuIGludGVnZXIgY29uc3RhbnQgd2l0aAotICAgICBUUkVFX09WRVJGTE9XIHNl dC4gIFRoaXMgY29uZnVzZXMgb3VyIHVuZGVmaW5lZCBvdmVyZmxvdyB3YXJuaW5nCi0gICAgIG1h Y2hpbmVyeS4gICovCi0gIGlmIChUUkVFX09WRVJGTE9XX1AgKHZhbCkpCi0gICAgdmFsID0gZHJv cF90cmVlX292ZXJmbG93ICh2YWwpOwotCi0gIC8qIFRoZSBuZXcgYXNzZXJ0aW9uIEEgd2lsbCBi ZSBpbnNlcnRlZCBhdCBCQiBvciBFLiAgV2UgbmVlZCB0bwotICAgICBkZXRlcm1pbmUgaWYgdGhl IG5ldyBsb2NhdGlvbiBpcyBkb21pbmF0ZWQgYnkgYSBwcmV2aW91c2x5Ci0gICAgIHJlZ2lzdGVy ZWQgbG9jYXRpb24gZm9yIEEuICBJZiB3ZSBhcmUgZG9pbmcgYW4gZWRnZSBpbnNlcnRpb24sCi0g ICAgIGFzc3VtZSB0aGF0IEEgd2lsbCBiZSBpbnNlcnRlZCBhdCBFLT5ERVNULiAgTm90ZSB0aGF0 IHRoaXMgaXMgbm90Ci0gICAgIG5lY2Vzc2FyaWx5IHRydWUuCi0KLSAgICAgSWYgRSBpcyBhIGNy aXRpY2FsIGVkZ2UsIGl0IHdpbGwgYmUgc3BsaXQuICBCdXQgZXZlbiBpZiBFIGlzCi0gICAgIHNw bGl0LCB0aGUgbmV3IGJsb2NrIHdpbGwgZG9taW5hdGUgdGhlIHNhbWUgc2V0IG9mIGJsb2NrcyB0 aGF0Ci0gICAgIEUtPkRFU1QgZG9taW5hdGVzLgotCi0gICAgIFRoZSByZXZlcnNlLCBob3dldmVy LCBpcyBub3QgdHJ1ZSwgYmxvY2tzIGRvbWluYXRlZCBieSBFLT5ERVNUCi0gICAgIHdpbGwgbm90 IGJlIGRvbWluYXRlZCBieSB0aGUgbmV3IGJsb2NrIGNyZWF0ZWQgdG8gc3BsaXQgRS4gIFNvLAot ICAgICBpZiB0aGUgaW5zZXJ0aW9uIGxvY2F0aW9uIGlzIG9uIGEgY3JpdGljYWwgZWRnZSwgd2Ug d2lsbCBub3QgdXNlCi0gICAgIHRoZSBuZXcgbG9jYXRpb24gdG8gbW92ZSBhbm90aGVyIGFzc2Vy dGlvbiBwcmV2aW91c2x5IHJlZ2lzdGVyZWQKLSAgICAgYXQgYSBibG9jayBkb21pbmF0ZWQgYnkg RS0+REVTVC4gICovCi0gIGRlc3RfYmIgPSAoYmIpID8gYmIgOiBlLT5kZXN0OwotCi0gIC8qIElm IE5BTUUgYWxyZWFkeSBoYXMgYW4gQVNTRVJUX0VYUFIgcmVnaXN0ZXJlZCBmb3IgQ09NUF9DT0RF IGFuZAotICAgICBWQUwgYXQgYSBibG9jayBkb21pbmF0aW5nIERFU1RfQkIsIHRoZW4gd2UgZG9u J3QgbmVlZCB0byBpbnNlcnQgYSBuZXcKLSAgICAgb25lLiAgU2ltaWxhcmx5LCBpZiB0aGUgc2Ft ZSBhc3NlcnRpb24gYWxyZWFkeSBleGlzdHMgYXQgYSBibG9jawotICAgICBkb21pbmF0ZWQgYnkg REVTVF9CQiBhbmQgdGhlIG5ldyBsb2NhdGlvbiBpcyBub3Qgb24gYSBjcml0aWNhbAotICAgICBl ZGdlLCB0aGVuIHVwZGF0ZSB0aGUgZXhpc3RpbmcgbG9jYXRpb24gZm9yIHRoZSBhc3NlcnRpb24g KGkuZS4sCi0gICAgIG1vdmUgdGhlIGFzc2VydGlvbiB1cCBpbiB0aGUgZG9taW5hbmNlIHRyZWUp LgotCi0gICAgIE5vdGUsIHRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBzaW1wbGUgbGlua2VkIGxp c3QgYmVjYXVzZSB0aGVyZQotICAgICBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiBhIGhhbmRmdWwg b2YgYXNzZXJ0aW9ucyByZWdpc3RlcmVkIHBlcgotICAgICBuYW1lLiAgSWYgdGhpcyBiZWNvbWVz IGEgcGVyZm9ybWFuY2UgcHJvYmxlbSwgYSB0YWJsZSBoYXNoZWQgYnkKLSAgICAgQ09NUF9DT0RF IGFuZCBWQUwgY291bGQgYmUgaW1wbGVtZW50ZWQuICAqLwotICBsb2MgPSBhc3NlcnRzX2ZvcltT U0FfTkFNRV9WRVJTSU9OIChuYW1lKV07Ci0gIGxhc3RfbG9jID0gbG9jOwotICB3aGlsZSAobG9j KQotICAgIHsKLSAgICAgIGlmIChsb2MtPmNvbXBfY29kZSA9PSBjb21wX2NvZGUKLQkgICYmIChs b2MtPnZhbCA9PSB2YWwKLQkgICAgICB8fCBvcGVyYW5kX2VxdWFsX3AgKGxvYy0+dmFsLCB2YWws IDApKQotCSAgJiYgKGxvYy0+ZXhwciA9PSBleHByCi0JICAgICAgfHwgb3BlcmFuZF9lcXVhbF9w IChsb2MtPmV4cHIsIGV4cHIsIDApKSkKLQl7Ci0JICAvKiBJZiBFIGlzIG5vdCBhIGNyaXRpY2Fs IGVkZ2UgYW5kIERFU1RfQkIKLQkgICAgIGRvbWluYXRlcyB0aGUgZXhpc3RpbmcgbG9jYXRpb24g Zm9yIHRoZSBhc3NlcnRpb24sIG1vdmUKLQkgICAgIHRoZSBhc3NlcnRpb24gdXAgaW4gdGhlIGRv bWluYW5jZSB0cmVlIGJ5IHVwZGF0aW5nIGl0cwotCSAgICAgbG9jYXRpb24gaW5mb3JtYXRpb24u ICAqLwotCSAgaWYgKChlID09IE5VTEwgfHwgIUVER0VfQ1JJVElDQUxfUCAoZSkpCi0JICAgICAg JiYgZG9taW5hdGVkX2J5X3AgKENESV9ET01JTkFUT1JTLCBsb2MtPmJiLCBkZXN0X2JiKSkKLQkg ICAgewotCSAgICAgIGxvYy0+YmIgPSBkZXN0X2JiOwotCSAgICAgIGxvYy0+ZSA9IGU7Ci0JICAg ICAgbG9jLT5zaSA9IHNpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotCX0KLQotICAgICAgLyog VXBkYXRlIHRoZSBsYXN0IG5vZGUgb2YgdGhlIGxpc3QgYW5kIG1vdmUgdG8gdGhlIG5leHQgb25l LiAgKi8KLSAgICAgIGxhc3RfbG9jID0gbG9jOwotICAgICAgbG9jID0gbG9jLT5uZXh0OwotICAg IH0KLQotICAvKiBJZiB3ZSBkaWRuJ3QgZmluZCBhbiBhc3NlcnRpb24gYWxyZWFkeSByZWdpc3Rl cmVkIGZvcgotICAgICBOQU1FIENPTVBfQ09ERSBWQUwsIGFkZCBhIG5ldyBvbmUgYXQgdGhlIGVu ZCBvZiB0aGUgbGlzdCBvZgotICAgICBhc3NlcnRpb25zIGFzc29jaWF0ZWQgd2l0aCBOQU1FLiAg Ki8KLSAgbiA9IFhORVcgKHN0cnVjdCBhc3NlcnRfbG9jdXMpOwotICBuLT5iYiA9IGRlc3RfYmI7 Ci0gIG4tPmUgPSBlOwotICBuLT5zaSA9IHNpOwotICBuLT5jb21wX2NvZGUgPSBjb21wX2NvZGU7 Ci0gIG4tPnZhbCA9IHZhbDsKLSAgbi0+ZXhwciA9IGV4cHI7Ci0gIG4tPm5leHQgPSBOVUxMOwot Ci0gIGlmIChsYXN0X2xvYykKLSAgICBsYXN0X2xvYy0+bmV4dCA9IG47Ci0gIGVsc2UKLSAgICBh c3NlcnRzX2ZvcltTU0FfTkFNRV9WRVJTSU9OIChuYW1lKV0gPSBuOwotCi0gIGJpdG1hcF9zZXRf Yml0IChuZWVkX2Fzc2VydF9mb3IsIFNTQV9OQU1FX1ZFUlNJT04gKG5hbWUpKTsKLX0KLQotLyog RmluaXNoIGZvdW5kIEFTU0VSVFMgZm9yIEUgYW5kIHJlZ2lzdGVyIHRoZW0gYXQgR1NJLiAgKi8K LQotdm9pZAotdnJwX2Fzc2VydHM6OmZpbmlzaF9yZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3IgKGVk Z2UgZSwKLQkJCQkJICAgICAgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgZ3NpLAotCQkJCQkgICAgICB2 ZWM8YXNzZXJ0X2luZm8+ICZhc3NlcnRzKQotewotICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwg YXNzZXJ0cy5sZW5ndGggKCk7ICsraSkKLSAgICAvKiBPbmx5IHJlZ2lzdGVyIGFuIEFTU0VSVF9F WFBSIGlmIE5BTUUgd2FzIGZvdW5kIGluIHRoZSBzdWItZ3JhcGgKLSAgICAgICByZWFjaGFibGUg ZnJvbSBFLiAgKi8KLSAgICBpZiAobGl2ZS5saXZlX29uX2VkZ2VfcCAoYXNzZXJ0c1tpXS5uYW1l LCBlKSkKLSAgICAgIHJlZ2lzdGVyX25ld19hc3NlcnRfZm9yIChhc3NlcnRzW2ldLm5hbWUsIGFz c2VydHNbaV0uZXhwciwKLQkJCSAgICAgICBhc3NlcnRzW2ldLmNvbXBfY29kZSwgYXNzZXJ0c1tp XS52YWwsCi0JCQkgICAgICAgTlVMTCwgZSwgZ3NpKTsKLX0KLQotLyogRGV0ZXJtaW5lIHdoZXRo ZXIgdGhlIG91dGdvaW5nIGVkZ2VzIG9mIEJCIHNob3VsZCByZWNlaXZlIGFuCi0gICBBU1NFUlRf RVhQUiBmb3IgZWFjaCBvZiB0aGUgb3BlcmFuZHMgb2YgQkIncyBMQVNUIHN0YXRlbWVudC4KLSAg IFRoZSBsYXN0IHN0YXRlbWVudCBvZiBCQiBtdXN0IGJlIGEgQ09ORF9FWFBSLgotCi0gICBJZiBh bnkgb2YgdGhlIHN1Yi1ncmFwaHMgcm9vdGVkIGF0IEJCIGhhdmUgYW4gaW50ZXJlc3RpbmcgdXNl IG9mCi0gICB0aGUgcHJlZGljYXRlIG9wZXJhbmRzLCBhbiBhc3NlcnQgbG9jYXRpb24gbm9kZSBp cyBhZGRlZCB0byB0aGUKLSAgIGxpc3Qgb2YgYXNzZXJ0aW9ucyBmb3IgdGhlIGNvcnJlc3BvbmRp bmcgb3BlcmFuZHMuICAqLwotCi12b2lkCi12cnBfYXNzZXJ0czo6ZmluZF9jb25kaXRpb25hbF9h c3NlcnRzIChiYXNpY19ibG9jayBiYiwgZ2NvbmQgKmxhc3QpCi17Ci0gIGdpbXBsZV9zdG10X2l0 ZXJhdG9yIGJzaTsKLSAgdHJlZSBvcDsKLSAgZWRnZV9pdGVyYXRvciBlaTsKLSAgZWRnZSBlOwot ICBzc2Ffb3BfaXRlciBpdGVyOwotCi0gIGJzaSA9IGdzaV9mb3Jfc3RtdCAobGFzdCk7Ci0KLSAg LyogTG9vayBmb3IgdXNlcyBvZiB0aGUgb3BlcmFuZHMgaW4gZWFjaCBvZiB0aGUgc3ViLWdyYXBo cwotICAgICByb290ZWQgYXQgQkIuICBXZSBuZWVkIHRvIGNoZWNrIGVhY2ggb2YgdGhlIG91dGdv aW5nIGVkZ2VzCi0gICAgIHNlcGFyYXRlbHksIHNvIHRoYXQgd2Uga25vdyB3aGF0IGtpbmQgb2Yg QVNTRVJUX0VYUFIgdG8KLSAgICAgaW5zZXJ0LiAgKi8KLSAgRk9SX0VBQ0hfRURHRSAoZSwgZWks IGJiLT5zdWNjcykKLSAgICB7Ci0gICAgICBpZiAoZS0+ZGVzdCA9PSBiYikKLQljb250aW51ZTsK LQotICAgICAgLyogUmVnaXN0ZXIgdGhlIG5lY2Vzc2FyeSBhc3NlcnRpb25zIGZvciBlYWNoIG9w ZXJhbmQgaW4gdGhlCi0JIGNvbmRpdGlvbmFsIHByZWRpY2F0ZS4gICovCi0gICAgICBhdXRvX3Zl Yzxhc3NlcnRfaW5mbywgOD4gYXNzZXJ0czsKLSAgICAgIEZPUl9FQUNIX1NTQV9UUkVFX09QRVJB TkQgKG9wLCBsYXN0LCBpdGVyLCBTU0FfT1BfVVNFKQotCXJlZ2lzdGVyX2VkZ2VfYXNzZXJ0X2Zv ciAob3AsIGUsCi0JCQkJICBnaW1wbGVfY29uZF9jb2RlIChsYXN0KSwKLQkJCQkgIGdpbXBsZV9j b25kX2xocyAobGFzdCksCi0JCQkJICBnaW1wbGVfY29uZF9yaHMgKGxhc3QpLCBhc3NlcnRzKTsK LSAgICAgIGZpbmlzaF9yZWdpc3Rlcl9lZGdlX2Fzc2VydF9mb3IgKGUsIGJzaSwgYXNzZXJ0cyk7 Ci0gICAgfQotfQotCi0vKiBDb21wYXJlIHR3byBjYXNlIGxhYmVscyBzb3J0aW5nIGZpcnN0IGJ5 IHRoZSBkZXN0aW5hdGlvbiBiYiBpbmRleAotICAgYW5kIHRoZW4gYnkgdGhlIGNhc2UgdmFsdWUu ICAqLwotCi1pbnQKLXZycF9hc3NlcnRzOjpjb21wYXJlX2Nhc2VfbGFiZWxzIChjb25zdCB2b2lk ICpwMSwgY29uc3Qgdm9pZCAqcDIpCi17Ci0gIGNvbnN0IHN0cnVjdCBjYXNlX2luZm8gKmNpMSA9 IChjb25zdCBzdHJ1Y3QgY2FzZV9pbmZvICopIHAxOwotICBjb25zdCBzdHJ1Y3QgY2FzZV9pbmZv ICpjaTIgPSAoY29uc3Qgc3RydWN0IGNhc2VfaW5mbyAqKSBwMjsKLSAgaW50IGlkeDEgPSBjaTEt PmJiLT5pbmRleDsKLSAgaW50IGlkeDIgPSBjaTItPmJiLT5pbmRleDsKLQotICBpZiAoaWR4MSA8 IGlkeDIpCi0gICAgcmV0dXJuIC0xOwotICBlbHNlIGlmIChpZHgxID09IGlkeDIpCi0gICAgewot ICAgICAgLyogTWFrZSBzdXJlIHRoZSBkZWZhdWx0IGxhYmVsIGlzIGZpcnN0IGluIGEgZ3JvdXAu ICAqLwotICAgICAgaWYgKCFDQVNFX0xPVyAoY2kxLT5leHByKSkKLQlyZXR1cm4gLTE7Ci0gICAg ICBlbHNlIGlmICghQ0FTRV9MT1cgKGNpMi0+ZXhwcikpCi0JcmV0dXJuIDE7Ci0gICAgICBlbHNl Ci0JcmV0dXJuIHRyZWVfaW50X2NzdF9jb21wYXJlIChDQVNFX0xPVyAoY2kxLT5leHByKSwKLQkJ CQkgICAgIENBU0VfTE9XIChjaTItPmV4cHIpKTsKLSAgICB9Ci0gIGVsc2UKLSAgICByZXR1cm4g MTsKLX0KLQotLyogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG91dGdvaW5nIGVkZ2VzIG9mIEJCIHNo b3VsZCByZWNlaXZlIGFuCi0gICBBU1NFUlRfRVhQUiBmb3IgZWFjaCBvZiB0aGUgb3BlcmFuZHMg b2YgQkIncyBMQVNUIHN0YXRlbWVudC4KLSAgIFRoZSBsYXN0IHN0YXRlbWVudCBvZiBCQiBtdXN0 IGJlIGEgU1dJVENIX0VYUFIuCi0KLSAgIElmIGFueSBvZiB0aGUgc3ViLWdyYXBocyByb290ZWQg YXQgQkIgaGF2ZSBhbiBpbnRlcmVzdGluZyB1c2Ugb2YKLSAgIHRoZSBwcmVkaWNhdGUgb3BlcmFu ZHMsIGFuIGFzc2VydCBsb2NhdGlvbiBub2RlIGlzIGFkZGVkIHRvIHRoZQotICAgbGlzdCBvZiBh c3NlcnRpb25zIGZvciB0aGUgY29ycmVzcG9uZGluZyBvcGVyYW5kcy4gICovCi0KLXZvaWQKLXZy cF9hc3NlcnRzOjpmaW5kX3N3aXRjaF9hc3NlcnRzIChiYXNpY19ibG9jayBiYiwgZ3N3aXRjaCAq bGFzdCkKLXsKLSAgZ2ltcGxlX3N0bXRfaXRlcmF0b3IgYnNpOwotICB0cmVlIG9wOwotICBlZGdl IGU7Ci0gIHN0cnVjdCBjYXNlX2luZm8gKmNpOwotICBzaXplX3QgbiA9IGdpbXBsZV9zd2l0Y2hf bnVtX2xhYmVscyAobGFzdCk7Ci0jaWYgR0NDX1ZFUlNJT04gPj0gNDAwMAotICB1bnNpZ25lZCBp bnQgaWR4OwotI2Vsc2UKLSAgLyogV29yayBhcm91bmQgR0NDIDMuNCBidWcgKFBSIDM3MDg2KS4g ICovCi0gIHZvbGF0aWxlIHVuc2lnbmVkIGludCBpZHg7Ci0jZW5kaWYKLQotICBic2kgPSBnc2lf Zm9yX3N0bXQgKGxhc3QpOwotICBvcCA9IGdpbXBsZV9zd2l0Y2hfaW5kZXggKGxhc3QpOwotICBp ZiAoVFJFRV9DT0RFIChvcCkgIT0gU1NBX05BTUUpCi0gICAgcmV0dXJuOwotCi0gIC8qIEJ1aWxk IGEgdmVjdG9yIG9mIGNhc2UgbGFiZWxzIHNvcnRlZCBieSBkZXN0aW5hdGlvbiBsYWJlbC4gICov Ci0gIGNpID0gWE5FV1ZFQyAoc3RydWN0IGNhc2VfaW5mbywgbik7Ci0gIGZvciAoaWR4ID0gMDsg aWR4IDwgbjsgKytpZHgpCi0gICAgewotICAgICAgY2lbaWR4XS5leHByID0gZ2ltcGxlX3N3aXRj aF9sYWJlbCAobGFzdCwgaWR4KTsKLSAgICAgIGNpW2lkeF0uYmIgPSBsYWJlbF90b19ibG9jayAo ZnVuLCBDQVNFX0xBQkVMIChjaVtpZHhdLmV4cHIpKTsKLSAgICB9Ci0gIGVkZ2UgZGVmYXVsdF9l ZGdlID0gZmluZF9lZGdlIChiYiwgY2lbMF0uYmIpOwotICBxc29ydCAoY2ksIG4sIHNpemVvZiAo c3RydWN0IGNhc2VfaW5mbyksIGNvbXBhcmVfY2FzZV9sYWJlbHMpOwotCi0gIGZvciAoaWR4ID0g MDsgaWR4IDwgbjsgKytpZHgpCi0gICAgewotICAgICAgdHJlZSBtaW4sIG1heDsKLSAgICAgIHRy ZWUgY2wgPSBjaVtpZHhdLmV4cHI7Ci0gICAgICBiYXNpY19ibG9jayBjYmIgPSBjaVtpZHhdLmJi OwotCi0gICAgICBtaW4gPSBDQVNFX0xPVyAoY2wpOwotICAgICAgbWF4ID0gQ0FTRV9ISUdIIChj bCk7Ci0KLSAgICAgIC8qIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBjYXNlIGxhYmVscyB3aXRoIHRo ZSBzYW1lIGRlc3RpbmF0aW9uCi0JIHdlIG5lZWQgdG8gY29tYmluZSB0aGVtIHRvIGEgc2luZ2xl IHZhbHVlIHJhbmdlIGZvciB0aGUgZWRnZS4gICovCi0gICAgICBpZiAoaWR4ICsgMSA8IG4gJiYg Y2JiID09IGNpW2lkeCArIDFdLmJiKQotCXsKLQkgIC8qIFNraXAgbGFiZWxzIHVudGlsIHRoZSBs YXN0IG9mIHRoZSBncm91cC4gICovCi0JICBkbyB7Ci0JICAgICsraWR4OwotCSAgfSB3aGlsZSAo aWR4IDwgbiAmJiBjYmIgPT0gY2lbaWR4XS5iYik7Ci0JICAtLWlkeDsKLQotCSAgLyogUGljayB1 cCB0aGUgbWF4aW11bSBvZiB0aGUgY2FzZSBsYWJlbCByYW5nZS4gICovCi0JICBpZiAoQ0FTRV9I SUdIIChjaVtpZHhdLmV4cHIpKQotCSAgICBtYXggPSBDQVNFX0hJR0ggKGNpW2lkeF0uZXhwcik7 Ci0JICBlbHNlCi0JICAgIG1heCA9IENBU0VfTE9XIChjaVtpZHhdLmV4cHIpOwotCX0KLQotICAg ICAgLyogQ2FuJ3QgZXh0cmFjdCBhIHVzZWZ1bCBhc3NlcnRpb24gb3V0IG9mIGEgcmFuZ2UgdGhh dCBpbmNsdWRlcyB0aGUKLQkgZGVmYXVsdCBsYWJlbC4gICovCi0gICAgICBpZiAobWluID09IE5V TExfVFJFRSkKLQljb250aW51ZTsKLQotICAgICAgLyogRmluZCB0aGUgZWRnZSB0byByZWdpc3Rl ciB0aGUgYXNzZXJ0IGV4cHIgb24uICAqLwotICAgICAgZSA9IGZpbmRfZWRnZSAoYmIsIGNiYik7 Ci0KLSAgICAgIC8qIFJlZ2lzdGVyIHRoZSBuZWNlc3NhcnkgYXNzZXJ0aW9ucyBmb3IgdGhlIG9w ZXJhbmQgaW4gdGhlCi0JIFNXSVRDSF9FWFBSLiAgKi8KLSAgICAgIGF1dG9fdmVjPGFzc2VydF9p bmZvLCA4PiBhc3NlcnRzOwotICAgICAgcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yIChvcCwgZSwK LQkJCQltYXggPyBHRV9FWFBSIDogRVFfRVhQUiwKLQkJCQlvcCwgZm9sZF9jb252ZXJ0IChUUkVF X1RZUEUgKG9wKSwgbWluKSwKLQkJCQlhc3NlcnRzKTsKLSAgICAgIGlmIChtYXgpCi0JcmVnaXN0 ZXJfZWRnZV9hc3NlcnRfZm9yIChvcCwgZSwgTEVfRVhQUiwgb3AsCi0JCQkJICBmb2xkX2NvbnZl cnQgKFRSRUVfVFlQRSAob3ApLCBtYXgpLAotCQkJCSAgYXNzZXJ0cyk7Ci0gICAgICBmaW5pc2hf cmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yIChlLCBic2ksIGFzc2VydHMpOwotICAgIH0KLQotICBY REVMRVRFVkVDIChjaSk7Ci0KLSAgaWYgKCFsaXZlLmxpdmVfb25fZWRnZV9wIChvcCwgZGVmYXVs dF9lZGdlKSkKLSAgICByZXR1cm47Ci0KLSAgLyogTm93IHJlZ2lzdGVyIGFsb25nIHRoZSBkZWZh dWx0IGxhYmVsIGFzc2VydGlvbnMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZQotICAgICBhbnRpLXJh bmdlIG9mIGVhY2ggbGFiZWwuICAqLwotICBpbnQgaW5zZXJ0aW9uX2xpbWl0ID0gcGFyYW1fbWF4 X3ZycF9zd2l0Y2hfYXNzZXJ0aW9uczsKLSAgaWYgKGluc2VydGlvbl9saW1pdCA9PSAwKQotICAg IHJldHVybjsKLQotICAvKiBXZSBjYW4ndCBkbyB0aGlzIGlmIHRoZSBkZWZhdWx0IGNhc2Ugc2hh cmVzIGEgbGFiZWwgd2l0aCBhbm90aGVyIGNhc2UuICAqLwotICB0cmVlIGRlZmF1bHRfY2wgPSBn aW1wbGVfc3dpdGNoX2RlZmF1bHRfbGFiZWwgKGxhc3QpOwotICBmb3IgKGlkeCA9IDE7IGlkeCA8 IG47IGlkeCsrKQotICAgIHsKLSAgICAgIHRyZWUgbWluLCBtYXg7Ci0gICAgICB0cmVlIGNsID0g Z2ltcGxlX3N3aXRjaF9sYWJlbCAobGFzdCwgaWR4KTsKLSAgICAgIGlmIChDQVNFX0xBQkVMIChj bCkgPT0gQ0FTRV9MQUJFTCAoZGVmYXVsdF9jbCkpCi0JY29udGludWU7Ci0KLSAgICAgIG1pbiA9 IENBU0VfTE9XIChjbCk7Ci0gICAgICBtYXggPSBDQVNFX0hJR0ggKGNsKTsKLQotICAgICAgLyog Q29tYmluZSBjb250aWd1b3VzIGNhc2UgcmFuZ2VzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGFz c2VydGlvbnMKLQkgdG8gaW5zZXJ0LiAgKi8KLSAgICAgIGZvciAoaWR4ID0gaWR4ICsgMTsgaWR4 IDwgbjsgaWR4KyspCi0JewotCSAgdHJlZSBuZXh0X21pbiwgbmV4dF9tYXg7Ci0JICB0cmVlIG5l eHRfY2wgPSBnaW1wbGVfc3dpdGNoX2xhYmVsIChsYXN0LCBpZHgpOwotCSAgaWYgKENBU0VfTEFC RUwgKG5leHRfY2wpID09IENBU0VfTEFCRUwgKGRlZmF1bHRfY2wpKQotCSAgICBicmVhazsKLQot CSAgbmV4dF9taW4gPSBDQVNFX0xPVyAobmV4dF9jbCk7Ci0JICBuZXh0X21heCA9IENBU0VfSElH SCAobmV4dF9jbCk7Ci0KLQkgIHdpZGVfaW50IGRpZmZlcmVuY2UgPSAod2k6OnRvX3dpZGUgKG5l eHRfbWluKQotCQkJCSAtIHdpOjp0b193aWRlIChtYXggPyBtYXggOiBtaW4pKTsKLQkgIGlmICh3 aTo6ZXFfcCAoZGlmZmVyZW5jZSwgMSkpCi0JICAgIG1heCA9IG5leHRfbWF4ID8gbmV4dF9tYXgg OiBuZXh0X21pbjsKLQkgIGVsc2UKLQkgICAgYnJlYWs7Ci0JfQotICAgICAgaWR4LS07Ci0KLSAg ICAgIGlmIChtYXggPT0gTlVMTF9UUkVFKQotCXsKLQkgIC8qIFJlZ2lzdGVyIHRoZSBhc3NlcnRp b24gT1AgIT0gTUlOLiAgKi8KLQkgIGF1dG9fdmVjPGFzc2VydF9pbmZvLCA4PiBhc3NlcnRzOwot CSAgbWluID0gZm9sZF9jb252ZXJ0IChUUkVFX1RZUEUgKG9wKSwgbWluKTsKLQkgIHJlZ2lzdGVy X2VkZ2VfYXNzZXJ0X2ZvciAob3AsIGRlZmF1bHRfZWRnZSwgTkVfRVhQUiwgb3AsIG1pbiwKLQkJ CQkgICAgYXNzZXJ0cyk7Ci0JICBmaW5pc2hfcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yIChkZWZh dWx0X2VkZ2UsIGJzaSwgYXNzZXJ0cyk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIC8qIFJlZ2lz dGVyIHRoZSBhc3NlcnRpb24gKHVuc2lnbmVkKU9QIC0gTUlOID4gKE1BWCAtIE1JTiksCi0JICAg ICB3aGljaCB3aWxsIGdpdmUgT1AgdGhlIGFudGktcmFuZ2UgfltNSU4sTUFYXS4gICovCi0JICB0 cmVlIHVvcCA9IGZvbGRfY29udmVydCAodW5zaWduZWRfdHlwZV9mb3IgKFRSRUVfVFlQRSAob3Ap KSwgb3ApOwotCSAgbWluID0gZm9sZF9jb252ZXJ0IChUUkVFX1RZUEUgKHVvcCksIG1pbik7Ci0J ICBtYXggPSBmb2xkX2NvbnZlcnQgKFRSRUVfVFlQRSAodW9wKSwgbWF4KTsKLQotCSAgdHJlZSBs aHMgPSBmb2xkX2J1aWxkMiAoTUlOVVNfRVhQUiwgVFJFRV9UWVBFICh1b3ApLCB1b3AsIG1pbik7 Ci0JICB0cmVlIHJocyA9IGludF9jb25zdF9iaW5vcCAoTUlOVVNfRVhQUiwgbWF4LCBtaW4pOwot CSAgcmVnaXN0ZXJfbmV3X2Fzc2VydF9mb3IgKG9wLCBsaHMsIEdUX0VYUFIsIHJocywKLQkJCQkg ICBOVUxMLCBkZWZhdWx0X2VkZ2UsIGJzaSk7Ci0JfQotCi0gICAgICBpZiAoLS1pbnNlcnRpb25f bGltaXQgPT0gMCkKLQlicmVhazsKLSAgICB9Ci19Ci0KLS8qIFRyYXZlcnNlIGFsbCB0aGUgc3Rh dGVtZW50cyBpbiBibG9jayBCQiBsb29raW5nIGZvciBzdGF0ZW1lbnRzIHRoYXQKLSAgIG1heSBn ZW5lcmF0ZSB1c2VmdWwgYXNzZXJ0aW9ucyBmb3IgdGhlIFNTQSBuYW1lcyBpbiB0aGVpciBvcGVy YW5kLgotICAgSWYgYSBzdGF0ZW1lbnQgcHJvZHVjZXMgYSB1c2VmdWwgYXNzZXJ0aW9uIEEgZm9y IG5hbWUgTl9pLCB0aGVuIHRoZQotICAgbGlzdCBvZiBhc3NlcnRpb25zIGFscmVhZHkgZ2VuZXJh dGVkIGZvciBOX2kgaXMgc2Nhbm5lZCB0bwotICAgZGV0ZXJtaW5lIGlmIEEgaXMgYWN0dWFsbHkg bmVlZGVkLgotCi0gICBJZiBOX2kgYWxyZWFkeSBoYWQgdGhlIGFzc2VydGlvbiBBIGF0IGEgbG9j YXRpb24gZG9taW5hdGluZyB0aGUKLSAgIGN1cnJlbnQgbG9jYXRpb24sIHRoZW4gbm90aGluZyBu ZWVkcyB0byBiZSBkb25lLiAgT3RoZXJ3aXNlLCB0aGUKLSAgIG5ldyBsb2NhdGlvbiBmb3IgQSBp cyByZWNvcmRlZCBpbnN0ZWFkLgotCi0gICAxLSBGb3IgZXZlcnkgc3RhdGVtZW50IFMgaW4gQkIs IGFsbCB0aGUgdmFyaWFibGVzIHVzZWQgYnkgUyBhcmUKLSAgICAgIGFkZGVkIHRvIGJpdG1hcCBG T1VORF9JTl9TVUJHUkFQSC4KLQotICAgMi0gSWYgc3RhdGVtZW50IFMgdXNlcyBhbiBvcGVyYW5k IE4gaW4gYSB3YXkgdGhhdCBleHBvc2VzIGEga25vd24KLSAgICAgIHZhbHVlIHJhbmdlIGZvciBO LCB0aGVuIGlmIE4gd2FzIG5vdCBhbHJlYWR5IGdlbmVyYXRlZCBieSBhbgotICAgICAgQVNTRVJU X0VYUFIsIGNyZWF0ZSBhIG5ldyBhc3NlcnQgbG9jYXRpb24gZm9yIE4uICBGb3IgaW5zdGFuY2Us Ci0gICAgICBpZiBOIGlzIGEgcG9pbnRlciBhbmQgdGhlIHN0YXRlbWVudCBkZXJlZmVyZW5jZXMg aXQsIHdlIGNhbgotICAgICAgYXNzdW1lIHRoYXQgTiBpcyBub3QgTlVMTC4KLQotICAgMy0gQ09O RF9FWFBScyBhcmUgYSBzcGVjaWFsIGNhc2Ugb2YgIzIuICBXZSBjYW4gZGVyaXZlIHJhbmdlCi0g ICAgICBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwcmVkaWNhdGUgYnV0IG5lZWQgdG8gaW5zZXJ0IGRp ZmZlcmVudAotICAgICAgQVNTRVJUX0VYUFJzIGZvciBlYWNoIG9mIHRoZSBzdWItZ3JhcGhzIHJv b3RlZCBhdCB0aGUKLSAgICAgIGNvbmRpdGlvbmFsIGJsb2NrLiAgSWYgdGhlIGxhc3Qgc3RhdGVt ZW50IG9mIEJCIGlzIGEgY29uZGl0aW9uYWwKLSAgICAgIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0g J1ggb3AgWScsIHRoZW4KLQotICAgICAgYSkgUmVtb3ZlIFggYW5kIFkgZnJvbSB0aGUgc2V0IEZP VU5EX0lOX1NVQkdSQVBILgotCi0gICAgICBiKSBJZiB0aGUgY29uZGl0aW9uYWwgaXMgdGhlIG9u bHkgZW50cnkgcG9pbnQgdG8gdGhlIHN1Yi1ncmFwaAotCSBjb3JyZXNwb25kaW5nIHRvIHRoZSBU SEVOX0NMQVVTRSwgcmVjdXJzZSBpbnRvIGl0LiAgT24KLQkgcmV0dXJuLCBpZiBYIGFuZC9vciBZ IGFyZSBtYXJrZWQgaW4gRk9VTkRfSU5fU1VCR1JBUEgsIHRoZW4KLQkgYW4gQVNTRVJUX0VYUFIg aXMgYWRkZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHZhcmlhYmxlLgotCi0gICAgICBjKSBSZXBl YXQgc3RlcCAoYikgb24gdGhlIEVMU0VfQ0xBVVNFLgotCi0gICAgICBkKSBNYXJrIFggYW5kIFkg aW4gRk9VTkRfSU5fU1VCR1JBUEguCi0KLSAgICAgIEZvciBpbnN0YW5jZSwKLQotCSAgICBpZiAo YSA9PSA5KQotCSAgICAgIGIgPSBhOwotCSAgICBlbHNlCi0JICAgICAgYiA9IGMgKyAxOwotCi0g ICAgICBJbiB0aGlzIGNhc2UsIGFuIGFzc2VydGlvbiBvbiB0aGUgVEhFTiBjbGF1c2UgaXMgdXNl ZnVsIHRvCi0gICAgICBkZXRlcm1pbmUgdGhhdCAnYScgaXMgYWx3YXlzIDkgb24gdGhhdCBlZGdl LiAgSG93ZXZlciwgYW4gYXNzZXJ0aW9uCi0gICAgICBvbiB0aGUgRUxTRSBjbGF1c2Ugd291bGQg YmUgdW5uZWNlc3NhcnkuCi0KLSAgIDQtIElmIEJCIGRvZXMgbm90IGVuZCBpbiBhIGNvbmRpdGlv bmFsIGV4cHJlc3Npb24sIHRoZW4gd2UgcmVjdXJzZQotICAgICAgaW50byBCQidzIGRvbWluYXRv ciBjaGlsZHJlbi4KLQotICAgQXQgdGhlIGVuZCBvZiB0aGUgcmVjdXJzaXZlIHRyYXZlcnNhbCwg ZXZlcnkgU1NBIG5hbWUgd2lsbCBoYXZlIGEKLSAgIGxpc3Qgb2YgbG9jYXRpb25zIHdoZXJlIEFT U0VSVF9FWFBScyBzaG91bGQgYmUgYWRkZWQuICBXaGVuIGEgbmV3Ci0gICBsb2NhdGlvbiBmb3Ig bmFtZSBOIGlzIGZvdW5kLCBpdCBpcyByZWdpc3RlcmVkIGJ5IGNhbGxpbmcKLSAgIHJlZ2lzdGVy X25ld19hc3NlcnRfZm9yLiAgVGhhdCBmdW5jdGlvbiBrZWVwcyB0cmFjayBvZiBhbGwgdGhlCi0g ICByZWdpc3RlcmVkIGFzc2VydGlvbnMgdG8gcHJldmVudCBhZGRpbmcgdW5uZWNlc3NhcnkgYXNz ZXJ0aW9ucy4KLSAgIEZvciBpbnN0YW5jZSwgaWYgYSBwb2ludGVyIFBfNCBpcyBkZXJlZmVyZW5j ZWQgbW9yZSB0aGFuIG9uY2UgaW4gYQotICAgZG9taW5hdG9yIHRyZWUsIG9ubHkgdGhlIGxvY2F0 aW9uIGRvbWluYXRpbmcgYWxsIHRoZSBkZXJlZmVyZW5jZSBvZgotICAgUF80IHdpbGwgcmVjZWl2 ZSBhbiBBU1NFUlRfRVhQUi4gICovCi0KLXZvaWQKLXZycF9hc3NlcnRzOjpmaW5kX2Fzc2VydF9s b2NhdGlvbnNfaW5fYmIgKGJhc2ljX2Jsb2NrIGJiKQotewotICBnaW1wbGUgKmxhc3Q7Ci0KLSAg bGFzdCA9IGxhc3Rfc3RtdCAoYmIpOwotCi0gIC8qIElmIEJCJ3MgbGFzdCBzdGF0ZW1lbnQgaXMg YSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgaW52b2x2aW5nIGludGVnZXIKLSAgICAgb3BlcmFuZHMs IGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIGFkZCBBU1NFUlRfRVhQUnMuICAqLwotICBpZiAobGFz dAotICAgICAgJiYgZ2ltcGxlX2NvZGUgKGxhc3QpID09IEdJTVBMRV9DT05ECi0gICAgICAmJiAh ZnBfcHJlZGljYXRlIChsYXN0KQotICAgICAgJiYgIVpFUk9fU1NBX09QRVJBTkRTIChsYXN0LCBT U0FfT1BfVVNFKSkKLSAgICBmaW5kX2NvbmRpdGlvbmFsX2Fzc2VydHMgKGJiLCBhc19hIDxnY29u ZCAqPiAobGFzdCkpOwotCi0gIC8qIElmIEJCJ3MgbGFzdCBzdGF0ZW1lbnQgaXMgYSBzd2l0Y2gg c3RhdGVtZW50IGludm9sdmluZyBpbnRlZ2VyCi0gICAgIG9wZXJhbmRzLCBkZXRlcm1pbmUgaWYg d2UgbmVlZCB0byBhZGQgQVNTRVJUX0VYUFJzLiAgKi8KLSAgaWYgKGxhc3QKLSAgICAgICYmIGdp bXBsZV9jb2RlIChsYXN0KSA9PSBHSU1QTEVfU1dJVENICi0gICAgICAmJiAhWkVST19TU0FfT1BF UkFORFMgKGxhc3QsIFNTQV9PUF9VU0UpKQotICAgIGZpbmRfc3dpdGNoX2Fzc2VydHMgKGJiLCBh c19hIDxnc3dpdGNoICo+IChsYXN0KSk7Ci0KLSAgLyogVHJhdmVyc2UgYWxsIHRoZSBzdGF0ZW1l bnRzIGluIEJCIG1hcmtpbmcgdXNlZCBuYW1lcyBhbmQgbG9va2luZwotICAgICBmb3Igc3RhdGVt ZW50cyB0aGF0IG1heSBpbmZlciBhc3NlcnRpb25zIGZvciB0aGVpciB1c2VkIG9wZXJhbmRzLiAg Ki8KLSAgZm9yIChnaW1wbGVfc3RtdF9pdGVyYXRvciBzaSA9IGdzaV9sYXN0X2JiIChiYik7ICFn c2lfZW5kX3AgKHNpKTsKLSAgICAgICBnc2lfcHJldiAoJnNpKSkKLSAgICB7Ci0gICAgICBnaW1w bGUgKnN0bXQ7Ci0gICAgICB0cmVlIG9wOwotICAgICAgc3NhX29wX2l0ZXIgaTsKLQotICAgICAg c3RtdCA9IGdzaV9zdG10IChzaSk7Ci0KLSAgICAgIGlmIChpc19naW1wbGVfZGVidWcgKHN0bXQp KQotCWNvbnRpbnVlOwotCi0gICAgICAvKiBTZWUgaWYgd2UgY2FuIGRlcml2ZSBhbiBhc3NlcnRp b24gZm9yIGFueSBvZiBTVE1UJ3Mgb3BlcmFuZHMuICAqLwotICAgICAgRk9SX0VBQ0hfU1NBX1RS RUVfT1BFUkFORCAob3AsIHN0bXQsIGksIFNTQV9PUF9VU0UpCi0JewotCSAgdHJlZSB2YWx1ZTsK LQkgIGVudW0gdHJlZV9jb2RlIGNvbXBfY29kZTsKLQotCSAgLyogSWYgb3AgaXMgbm90IGxpdmUg YmV5b25kIHRoaXMgc3RtdCwgZG8gbm90IGJvdGhlciB0byBpbnNlcnQKLQkgICAgIGFzc2VydHMg Zm9yIGl0LiAgKi8KLQkgIGlmICghbGl2ZS5saXZlX29uX2Jsb2NrX3AgKG9wLCBiYikpCi0JICAg IGNvbnRpbnVlOwotCi0JICAvKiBJZiBPUCBpcyB1c2VkIGluIHN1Y2ggYSB3YXkgdGhhdCB3ZSBj YW4gaW5mZXIgYSB2YWx1ZQotCSAgICAgcmFuZ2UgZm9yIGl0LCBhbmQgd2UgZG9uJ3QgZmluZCBh IHByZXZpb3VzIGFzc2VydGlvbiBmb3IKLQkgICAgIGl0LCBjcmVhdGUgYSBuZXcgYXNzZXJ0aW9u IGxvY2F0aW9uIG5vZGUgZm9yIE9QLiAgKi8KLQkgIGlmIChpbmZlcl92YWx1ZV9yYW5nZSAoc3Rt dCwgb3AsICZjb21wX2NvZGUsICZ2YWx1ZSkpCi0JICAgIHsKLQkgICAgICAvKiBJZiB3ZSBhcmUg YWJsZSB0byBpbmZlciBhIG5vbnplcm8gdmFsdWUgcmFuZ2UgZm9yIE9QLAotCQkgdGhlbiB3YWxr IGJhY2t3YXJkcyB0aHJvdWdoIHRoZSB1c2UtZGVmIGNoYWluIHRvIHNlZSBpZiBPUAotCQkgd2Fz IHNldCB2aWEgYSB0eXBlY2FzdC4KLQotCQkgSWYgc28sIHRoZW4gd2UgY2FuIGFsc28gaW5mZXIg YSBub256ZXJvIHZhbHVlIHJhbmdlCi0JCSBmb3IgdGhlIG9wZXJhbmQgb2YgdGhlIE5PUF9FWFBS LiAgKi8KLQkgICAgICBpZiAoY29tcF9jb2RlID09IE5FX0VYUFIgJiYgaW50ZWdlcl96ZXJvcCAo dmFsdWUpKQotCQl7Ci0JCSAgdHJlZSB0ID0gb3A7Ci0JCSAgZ2ltcGxlICpkZWZfc3RtdCA9IFNT QV9OQU1FX0RFRl9TVE1UICh0KTsKLQotCQkgIHdoaWxlIChpc19naW1wbGVfYXNzaWduIChkZWZf c3RtdCkKLQkJCSAmJiBDT05WRVJUX0VYUFJfQ09ERV9QCi0JCQkgICAgIChnaW1wbGVfYXNzaWdu X3Joc19jb2RlIChkZWZfc3RtdCkpCi0JCQkgJiYgVFJFRV9DT0RFCi0JCQkgICAgIChnaW1wbGVf YXNzaWduX3JoczEgKGRlZl9zdG10KSkgPT0gU1NBX05BTUUKLQkJCSAmJiBQT0lOVEVSX1RZUEVf UAotCQkJICAgICAoVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX3JoczEgKGRlZl9zdG10KSkpKQot CQkgICAgewotCQkgICAgICB0ID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChkZWZfc3RtdCk7Ci0JCSAg ICAgIGRlZl9zdG10ID0gU1NBX05BTUVfREVGX1NUTVQgKHQpOwotCi0JCSAgICAgIC8qIE5vdGUg d2Ugd2FudCB0byByZWdpc3RlciB0aGUgYXNzZXJ0IGZvciB0aGUKLQkJCSBvcGVyYW5kIG9mIHRo ZSBOT1BfRVhQUiBhZnRlciBTSSwgbm90IGFmdGVyIHRoZQotCQkJIGNvbnZlcnNpb24uICAqLwot CQkgICAgICBpZiAobGl2ZS5saXZlX29uX2Jsb2NrX3AgKHQsIGJiKSkKLQkJCXJlZ2lzdGVyX25l d19hc3NlcnRfZm9yICh0LCB0LCBjb21wX2NvZGUsIHZhbHVlLAotCQkJCQkJIGJiLCBOVUxMLCBz aSk7Ci0JCSAgICB9Ci0JCX0KLQotCSAgICAgIHJlZ2lzdGVyX25ld19hc3NlcnRfZm9yIChvcCwg b3AsIGNvbXBfY29kZSwgdmFsdWUsIGJiLCBOVUxMLCBzaSk7Ci0JICAgIH0KLQl9Ci0KLSAgICAg IC8qIFVwZGF0ZSBsaXZlLiAgKi8KLSAgICAgIEZPUl9FQUNIX1NTQV9UUkVFX09QRVJBTkQgKG9w LCBzdG10LCBpLCBTU0FfT1BfVVNFKQotCWxpdmUuc2V0IChvcCwgYmIpOwotICAgICAgRk9SX0VB Q0hfU1NBX1RSRUVfT1BFUkFORCAob3AsIHN0bXQsIGksIFNTQV9PUF9ERUYpCi0JbGl2ZS5jbGVh ciAob3AsIGJiKTsKLSAgICB9Ci0KLSAgLyogVHJhdmVyc2UgYWxsIFBISSBub2RlcyBpbiBCQiwg dXBkYXRpbmcgbGl2ZS4gICovCi0gIGZvciAoZ3BoaV9pdGVyYXRvciBzaSA9IGdzaV9zdGFydF9w aGlzIChiYik7ICFnc2lfZW5kX3AgKHNpKTsKLSAgICAgICBnc2lfbmV4dCAoJnNpKSkKLSAgICB7 Ci0gICAgICB1c2Vfb3BlcmFuZF9wIGFyZ19wOwotICAgICAgc3NhX29wX2l0ZXIgaTsKLSAgICAg IGdwaGkgKnBoaSA9IHNpLnBoaSAoKTsKLSAgICAgIHRyZWUgcmVzID0gZ2ltcGxlX3BoaV9yZXN1 bHQgKHBoaSk7Ci0KLSAgICAgIGlmICh2aXJ0dWFsX29wZXJhbmRfcCAocmVzKSkKLQljb250aW51 ZTsKLQotICAgICAgRk9SX0VBQ0hfUEhJX0FSRyAoYXJnX3AsIHBoaSwgaSwgU1NBX09QX1VTRSkK LQl7Ci0JICB0cmVlIGFyZyA9IFVTRV9GUk9NX1BUUiAoYXJnX3ApOwotCSAgaWYgKFRSRUVfQ09E RSAoYXJnKSA9PSBTU0FfTkFNRSkKLQkgICAgbGl2ZS5zZXQgKGFyZywgYmIpOwotCX0KLQotICAg ICAgbGl2ZS5jbGVhciAocmVzLCBiYik7Ci0gICAgfQotfQotCi0vKiBEbyBhbiBSUE8gd2FsayBv dmVyIHRoZSBmdW5jdGlvbiBjb21wdXRpbmcgU1NBIG5hbWUgbGl2ZW5lc3MKLSAgIG9uLXRoZS1m bHkgYW5kIGRlY2lkaW5nIG9uIGFzc2VydCBleHByZXNzaW9ucyB0byBpbnNlcnQuICAqLwotCi12 b2lkCi12cnBfYXNzZXJ0czo6ZmluZF9hc3NlcnRfbG9jYXRpb25zICh2b2lkKQotewotICBpbnQg KnJwbyA9IFhORVdWRUMgKGludCwgbGFzdF9iYXNpY19ibG9ja19mb3JfZm4gKGZ1bikpOwotICBp bnQgKmJiX3JwbyA9IFhORVdWRUMgKGludCwgbGFzdF9iYXNpY19ibG9ja19mb3JfZm4gKGZ1bikp OwotICBpbnQgKmxhc3RfcnBvID0gWENORVdWRUMgKGludCwgbGFzdF9iYXNpY19ibG9ja19mb3Jf Zm4gKGZ1bikpOwotICBpbnQgcnBvX2NudCwgaTsKLQotICBycG9fY250ID0gcHJlX2FuZF9yZXZf cG9zdF9vcmRlcl9jb21wdXRlIChOVUxMLCBycG8sIGZhbHNlKTsKLSAgZm9yIChpID0gMDsgaSA8 IHJwb19jbnQ7ICsraSkKLSAgICBiYl9ycG9bcnBvW2ldXSA9IGk7Ci0KLSAgLyogUHJlLXNlZWQg bG9vcCBsYXRjaCBsaXZlbmVzcyBmcm9tIGxvb3AgaGVhZGVyIFBISSBub2Rlcy4gIER1ZSB0bwot ICAgICB0aGUgb3JkZXIgd2UgY29tcHV0ZSBsaXZlbmVzcyBhbmQgaW5zZXJ0IGFzc2VydHMgd2Ug b3RoZXJ3aXNlCi0gICAgIGZhaWwgdG8gaW5zZXJ0IGFzc2VydHMgaW50byB0aGUgbG9vcCBsYXRj aC4gICovCi0gIGZvciAoYXV0byBsb29wIDogbG9vcHNfbGlzdCAoY2Z1biwgMCkpCi0gICAgewot ICAgICAgaSA9IGxvb3AtPmxhdGNoLT5pbmRleDsKLSAgICAgIHVuc2lnbmVkIGludCBqID0gc2lu Z2xlX3N1Y2NfZWRnZSAobG9vcC0+bGF0Y2gpLT5kZXN0X2lkeDsKLSAgICAgIGZvciAoZ3BoaV9p dGVyYXRvciBnc2kgPSBnc2lfc3RhcnRfcGhpcyAobG9vcC0+aGVhZGVyKTsKLQkgICAhZ3NpX2Vu ZF9wIChnc2kpOyBnc2lfbmV4dCAoJmdzaSkpCi0JewotCSAgZ3BoaSAqcGhpID0gZ3NpLnBoaSAo KTsKLQkgIGlmICh2aXJ0dWFsX29wZXJhbmRfcCAoZ2ltcGxlX3BoaV9yZXN1bHQgKHBoaSkpKQot CSAgICBjb250aW51ZTsKLQkgIHRyZWUgYXJnID0gZ2ltcGxlX3BoaV9hcmdfZGVmIChwaGksIGop OwotCSAgaWYgKFRSRUVfQ09ERSAoYXJnKSA9PSBTU0FfTkFNRSkKLQkgICAgbGl2ZS5zZXQgKGFy ZywgbG9vcC0+bGF0Y2gpOwotCX0KLSAgICB9Ci0KLSAgZm9yIChpID0gcnBvX2NudCAtIDE7IGkg Pj0gMDsgLS1pKQotICAgIHsKLSAgICAgIGJhc2ljX2Jsb2NrIGJiID0gQkFTSUNfQkxPQ0tfRk9S X0ZOIChmdW4sIHJwb1tpXSk7Ci0gICAgICBlZGdlIGU7Ci0gICAgICBlZGdlX2l0ZXJhdG9yIGVp OwotCi0gICAgICAvKiBQcm9jZXNzIEJCIGFuZCB1cGRhdGUgdGhlIGxpdmUgaW5mb3JtYXRpb24g d2l0aCB1c2VzIGluCi0gICAgICAgICB0aGlzIGJsb2NrLiAgKi8KLSAgICAgIGZpbmRfYXNzZXJ0 X2xvY2F0aW9uc19pbl9iYiAoYmIpOwotCi0gICAgICAvKiBNZXJnZSBsaXZlbmVzcyBpbnRvIHRo ZSBwcmVkZWNlc3NvciBibG9ja3MgYW5kIGZyZWUgaXQuICAqLwotICAgICAgaWYgKCFsaXZlLmJs b2NrX2hhc19saXZlX25hbWVzX3AgKGJiKSkKLQl7Ci0JICBpbnQgcHJlZF9ycG8gPSBpOwotCSAg Rk9SX0VBQ0hfRURHRSAoZSwgZWksIGJiLT5wcmVkcykKLQkgICAgewotCSAgICAgIGludCBwcmVk ID0gZS0+c3JjLT5pbmRleDsKLQkgICAgICBpZiAoKGUtPmZsYWdzICYgRURHRV9ERlNfQkFDSykg fHwgcHJlZCA9PSBFTlRSWV9CTE9DSykKLQkJY29udGludWU7Ci0KLQkgICAgICBsaXZlLm1lcmdl IChlLT5zcmMsIGJiKTsKLQotCSAgICAgIGlmIChiYl9ycG9bcHJlZF0gPCBwcmVkX3JwbykKLQkJ cHJlZF9ycG8gPSBiYl9ycG9bcHJlZF07Ci0JICAgIH0KLQotCSAgLyogUmVjb3JkIHRoZSBSUE8g bnVtYmVyIG9mIHRoZSBsYXN0IHZpc2l0ZWQgYmxvY2sgdGhhdCBuZWVkcwotCSAgICAgbGl2ZSBp bmZvcm1hdGlvbiBmcm9tIHRoaXMgYmxvY2suICAqLwotCSAgbGFzdF9ycG9bcnBvW2ldXSA9IHBy ZWRfcnBvOwotCX0KLSAgICAgIGVsc2UKLQlsaXZlLmNsZWFyX2Jsb2NrIChiYik7Ci0KLSAgICAg IC8qIFdlIGNhbiBmcmVlIGFsbCBzdWNjZXNzb3JzIGxpdmUgYml0bWFwcyBpZiBhbGwgdGhlaXIK LSAgICAgICAgIHByZWRlY2Vzc29ycyBoYXZlIGJlZW4gdmlzaXRlZCBhbHJlYWR5LiAgKi8KLSAg ICAgIEZPUl9FQUNIX0VER0UgKGUsIGVpLCBiYi0+c3VjY3MpCi0JaWYgKGxhc3RfcnBvW2UtPmRl c3QtPmluZGV4XSA9PSBpKQotCSAgbGl2ZS5jbGVhcl9ibG9jayAoZS0+ZGVzdCk7Ci0gICAgfQot Ci0gIFhERUxFVEVWRUMgKHJwbyk7Ci0gIFhERUxFVEVWRUMgKGJiX3Jwbyk7Ci0gIFhERUxFVEVW RUMgKGxhc3RfcnBvKTsKLX0KLQotLyogQ3JlYXRlIGFuIEFTU0VSVF9FWFBSIGZvciBOQU1FIGFu ZCBpbnNlcnQgaXQgaW4gdGhlIGxvY2F0aW9uCi0gICBpbmRpY2F0ZWQgYnkgTE9DLiAgUmV0dXJu IHRydWUgaWYgd2UgbWFkZSBhbnkgZWRnZSBpbnNlcnRpb25zLiAgKi8KLQotYm9vbAotdnJwX2Fz c2VydHM6OnByb2Nlc3NfYXNzZXJ0X2luc2VydGlvbnNfZm9yICh0cmVlIG5hbWUsIGFzc2VydF9s b2N1cyAqbG9jKQotewotICAvKiBCdWlsZCB0aGUgY29tcGFyaXNvbiBleHByZXNzaW9uIE5BTUVf aSBDT01QX0NPREUgVkFMLiAgKi8KLSAgZ2ltcGxlICpzdG10OwotICB0cmVlIGNvbmQ7Ci0gIGdp bXBsZSAqYXNzZXJ0X3N0bXQ7Ci0gIGVkZ2VfaXRlcmF0b3IgZWk7Ci0gIGVkZ2UgZTsKLQotICAv KiBJZiB3ZSBoYXZlIFggPD0+IFggZG8gbm90IGluc2VydCBhbiBhc3NlcnQgZXhwciBmb3IgdGhh dC4gICovCi0gIGlmIChsb2MtPmV4cHIgPT0gbG9jLT52YWwpCi0gICAgcmV0dXJuIGZhbHNlOwot Ci0gIGNvbmQgPSBidWlsZDIgKGxvYy0+Y29tcF9jb2RlLCBib29sZWFuX3R5cGVfbm9kZSwgbG9j LT5leHByLCBsb2MtPnZhbCk7Ci0gIGFzc2VydF9zdG10ID0gYnVpbGRfYXNzZXJ0X2V4cHJfZm9y IChjb25kLCBuYW1lKTsKLSAgaWYgKGxvYy0+ZSkKLSAgICB7Ci0gICAgICAvKiBXZSBoYXZlIGJl ZW4gYXNrZWQgdG8gaW5zZXJ0IHRoZSBhc3NlcnRpb24gb24gYW4gZWRnZS4gIFRoaXMKLQkgaXMg dXNlZCBvbmx5IGJ5IENPTkRfRVhQUiBhbmQgU1dJVENIX0VYUFIgYXNzZXJ0aW9ucy4gICovCi0g ICAgICBnY2NfY2hlY2tpbmdfYXNzZXJ0IChnaW1wbGVfY29kZSAoZ3NpX3N0bXQgKGxvYy0+c2kp KSA9PSBHSU1QTEVfQ09ORAotCQkJICAgfHwgKGdpbXBsZV9jb2RlIChnc2lfc3RtdCAobG9jLT5z aSkpCi0JCQkgICAgICAgPT0gR0lNUExFX1NXSVRDSCkpOwotCi0gICAgICBnc2lfaW5zZXJ0X29u X2VkZ2UgKGxvYy0+ZSwgYXNzZXJ0X3N0bXQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQot Ci0gIC8qIElmIHRoZSBzdG10IGl0ZXJhdG9yIHBvaW50cyBhdCB0aGUgZW5kIHRoZW4gdGhpcyBp cyBhbiBpbnNlcnRpb24KLSAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGJsb2NrLiAgKi8KLSAg aWYgKGdzaV9lbmRfcCAobG9jLT5zaSkpCi0gICAgewotICAgICAgZ2ltcGxlX3N0bXRfaXRlcmF0 b3Igc2kgPSBnc2lfYWZ0ZXJfbGFiZWxzIChsb2MtPmJiKTsKLSAgICAgIGdzaV9pbnNlcnRfYmVm b3JlICgmc2ksIGFzc2VydF9zdG10LCBHU0lfU0FNRV9TVE1UKTsKLSAgICAgIHJldHVybiBmYWxz ZTsKLQotICAgIH0KLSAgLyogT3RoZXJ3aXNlLCB3ZSBjYW4gaW5zZXJ0IHJpZ2h0IGFmdGVyIExP Qy0+U0kgaWZmIHRoZQotICAgICBzdGF0ZW1lbnQgbXVzdCBub3QgYmUgdGhlIGxhc3Qgc3RhdGVt ZW50IGluIHRoZSBibG9jay4gICovCi0gIHN0bXQgPSBnc2lfc3RtdCAobG9jLT5zaSk7Ci0gIGlm ICghc3RtdF9lbmRzX2JiX3AgKHN0bXQpKQotICAgIHsKLSAgICAgIGdzaV9pbnNlcnRfYWZ0ZXIg KCZsb2MtPnNpLCBhc3NlcnRfc3RtdCwgR1NJX1NBTUVfU1RNVCk7Ci0gICAgICByZXR1cm4gZmFs c2U7Ci0gICAgfQotCi0gIC8qIElmIFNUTVQgbXVzdCBiZSB0aGUgbGFzdCBzdGF0ZW1lbnQgaW4g QkIsIHdlIGNhbiBvbmx5IGluc2VydCBuZXcKLSAgICAgYXNzZXJ0aW9ucyBvbiB0aGUgbm9uLWFi bm9ybWFsIGVkZ2Ugb3V0IG9mIEJCLiAgTm90ZSB0aGF0IHNpbmNlCi0gICAgIFNUTVQgaXMgbm90 IGNvbnRyb2wgZmxvdywgdGhlcmUgbWF5IG9ubHkgYmUgb25lIG5vbi1hYm5vcm1hbC9laCBlZGdl Ci0gICAgIG91dCBvZiBCQi4gICovCi0gIEZPUl9FQUNIX0VER0UgKGUsIGVpLCBsb2MtPmJiLT5z dWNjcykKLSAgICBpZiAoIShlLT5mbGFncyAmIChFREdFX0FCTk9STUFMfEVER0VfRUgpKSkKLSAg ICAgIHsKLQlnc2lfaW5zZXJ0X29uX2VkZ2UgKGUsIGFzc2VydF9zdG10KTsKLQlyZXR1cm4gdHJ1 ZTsKLSAgICAgIH0KLQotICBnY2NfdW5yZWFjaGFibGUgKCk7Ci19Ci0KLS8qIFFzb3J0IGhlbHBl ciBmb3Igc29ydGluZyBhc3NlcnQgbG9jYXRpb25zLiAgSWYgc3RhYmxlIGlzIHRydWUsIGRvbid0 Ci0gICB1c2UgaXRlcmF0aXZlX2hhc2hfZXhwciBiZWNhdXNlIGl0IGNhbiBiZSB1bnN0YWJsZSBm b3IgLWZjb21wYXJlLWRlYnVnLAotICAgb24gdGhlIG90aGVyIHNpZGUgc29tZSBwb2ludGVycyBt aWdodCBiZSBOVUxMLiAgKi8KLQotdGVtcGxhdGUgPGJvb2wgc3RhYmxlPgotaW50Ci12cnBfYXNz ZXJ0czo6Y29tcGFyZV9hc3NlcnRfbG9jIChjb25zdCB2b2lkICpwYSwgY29uc3Qgdm9pZCAqcGIp Ci17Ci0gIGFzc2VydF9sb2N1cyAqIGNvbnN0IGEgPSAqKGFzc2VydF9sb2N1cyAqIGNvbnN0ICop cGE7Ci0gIGFzc2VydF9sb2N1cyAqIGNvbnN0IGIgPSAqKGFzc2VydF9sb2N1cyAqIGNvbnN0ICop cGI7Ci0KLSAgLyogSWYgc3RhYmxlLCBzb21lIGFzc2VydHMgbWlnaHQgYmUgb3B0aW1pemVkIGF3 YXkgYWxyZWFkeSwgc29ydAotICAgICB0aGVtIGxhc3QuICAqLwotICBpZiAoc3RhYmxlKQotICAg IHsKLSAgICAgIGlmIChhID09IE5VTEwpCi0JcmV0dXJuIGIgIT0gTlVMTDsKLSAgICAgIGVsc2Ug aWYgKGIgPT0gTlVMTCkKLQlyZXR1cm4gLTE7Ci0gICAgfQotCi0gIGlmIChhLT5lID09IE5VTEwg JiYgYi0+ZSAhPSBOVUxMKQotICAgIHJldHVybiAxOwotICBlbHNlIGlmIChhLT5lICE9IE5VTEwg JiYgYi0+ZSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLQotICAvKiBBZnRlciB0aGUgYWJvdmUg Y2hlY2tzLCB3ZSBrbm93IHRoYXQgKGEtPmUgPT0gTlVMTCkgPT0gKGItPmUgPT0gTlVMTCksCi0g ICAgIG5vIG5lZWQgdG8gdGVzdCBib3RoIGEtPmUgYW5kIGItPmUuICAqLwotCi0gIC8qIFNvcnQg YWZ0ZXIgZGVzdGluYXRpb24gaW5kZXguICAqLwotICBpZiAoYS0+ZSA9PSBOVUxMKQotICAgIDsK LSAgZWxzZSBpZiAoYS0+ZS0+ZGVzdC0+aW5kZXggPiBiLT5lLT5kZXN0LT5pbmRleCkKLSAgICBy ZXR1cm4gMTsKLSAgZWxzZSBpZiAoYS0+ZS0+ZGVzdC0+aW5kZXggPCBiLT5lLT5kZXN0LT5pbmRl eCkKLSAgICByZXR1cm4gLTE7Ci0KLSAgLyogU29ydCBhZnRlciBjb21wX2NvZGUuICAqLwotICBp ZiAoYS0+Y29tcF9jb2RlID4gYi0+Y29tcF9jb2RlKQotICAgIHJldHVybiAxOwotICBlbHNlIGlm IChhLT5jb21wX2NvZGUgPCBiLT5jb21wX2NvZGUpCi0gICAgcmV0dXJuIC0xOwotCi0gIGhhc2h2 YWxfdCBoYSwgaGI7Ci0KLSAgLyogRS5nLiBpZiBhLT52YWwgaXMgQUREUl9FWFBSIG9mIGEgVkFS X0RFQ0wsIGl0ZXJhdGl2ZV9oYXNoX2V4cHIKLSAgICAgdXNlcyBERUNMX1VJRCBvZiB0aGUgVkFS X0RFQ0wsIHNvIHNvcnRpbmcgbWlnaHQgZGlmZmVyIGJldHdlZW4KLSAgICAgLWcgYW5kIC1nMC4g IFdoZW4gZG9pbmcgdGhlIHJlbW92YWwgb2YgcmVkdW5kYW50IGFzc2VydCBleHBycwotICAgICBh bmQgY29tbW9uaXphdGlvbiB0byBzdWNjZXNzb3JzLCB0aGlzIGRvZXMgbm90IG1hdHRlciwgYnV0 IGZvcgotICAgICB0aGUgZmluYWwgc29ydCBuZWVkcyB0byBiZSBzdGFibGUuICAqLwotICBpZiAo c3RhYmxlKQotICAgIHsKLSAgICAgIGhhID0gMDsKLSAgICAgIGhiID0gMDsKLSAgICB9Ci0gIGVs c2UKLSAgICB7Ci0gICAgICBoYSA9IGl0ZXJhdGl2ZV9oYXNoX2V4cHIgKGEtPmV4cHIsIGl0ZXJh dGl2ZV9oYXNoX2V4cHIgKGEtPnZhbCwgMCkpOwotICAgICAgaGIgPSBpdGVyYXRpdmVfaGFzaF9l eHByIChiLT5leHByLCBpdGVyYXRpdmVfaGFzaF9leHByIChiLT52YWwsIDApKTsKLSAgICB9Ci0K LSAgLyogQnJlYWsgdGhlIHRpZSB1c2luZyBoYXNoaW5nIGFuZCBzb3VyY2UvYmIgaW5kZXguICAq LwotICBpZiAoaGEgPT0gaGIpCi0gICAgcmV0dXJuIChhLT5lICE9IE5VTEwKLQkgICAgPyBhLT5l LT5zcmMtPmluZGV4IC0gYi0+ZS0+c3JjLT5pbmRleAotCSAgICA6IGEtPmJiLT5pbmRleCAtIGIt PmJiLT5pbmRleCk7Ci0gIHJldHVybiBoYSA+IGhiID8gMSA6IC0xOwotfQotCi0vKiBQcm9jZXNz IGFsbCB0aGUgaW5zZXJ0aW9ucyByZWdpc3RlcmVkIGZvciBldmVyeSBuYW1lIE5faSByZWdpc3Rl cmVkCi0gICBpbiBORUVEX0FTU0VSVF9GT1IuICBUaGUgbGlzdCBvZiBhc3NlcnRpb25zIHRvIGJl IGluc2VydGVkIGFyZQotICAgZm91bmQgaW4gQVNTRVJUU19GT1JbaV0uICAqLwotCi12b2lkCi12 cnBfYXNzZXJ0czo6cHJvY2Vzc19hc3NlcnRfaW5zZXJ0aW9ucyAoKQotewotICB1bnNpZ25lZCBp OwotICBiaXRtYXBfaXRlcmF0b3IgYmk7Ci0gIGJvb2wgdXBkYXRlX2VkZ2VzX3AgPSBmYWxzZTsK LSAgaW50IG51bV9hc3NlcnRzID0gMDsKLQotICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdz ICYgVERGX0RFVEFJTFMpKQotICAgIGR1bXAgKGR1bXBfZmlsZSk7Ci0KLSAgRVhFQ1VURV9JRl9T RVRfSU5fQklUTUFQIChuZWVkX2Fzc2VydF9mb3IsIDAsIGksIGJpKQotICAgIHsKLSAgICAgIGFz c2VydF9sb2N1cyAqbG9jID0gYXNzZXJ0c19mb3JbaV07Ci0gICAgICBnY2NfYXNzZXJ0IChsb2Mp OwotCi0gICAgICBhdXRvX3ZlYzxhc3NlcnRfbG9jdXMgKiwgMTY+IGFzc2VydHM7Ci0gICAgICBm b3IgKDsgbG9jOyBsb2MgPSBsb2MtPm5leHQpCi0JYXNzZXJ0cy5zYWZlX3B1c2ggKGxvYyk7Ci0g ICAgICBhc3NlcnRzLnFzb3J0IChjb21wYXJlX2Fzc2VydF9sb2M8ZmFsc2U+KTsKLQotICAgICAg LyogUHVzaCBkb3duIGNvbW1vbiBhc3NlcnRzIHRvIHN1Y2Nlc3NvcnMgYW5kIHJlbW92ZSByZWR1 bmRhbnQgb25lcy4gICovCi0gICAgICB1bnNpZ25lZCBlY250ID0gMDsKLSAgICAgIGFzc2VydF9s b2N1cyAqY29tbW9uID0gTlVMTDsKLSAgICAgIHVuc2lnbmVkIGNvbW1vbmogPSAwOwotICAgICAg Zm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IGFzc2VydHMubGVuZ3RoICgpOyArK2opCi0JewotCSAg bG9jID0gYXNzZXJ0c1tqXTsKLQkgIGlmICghIGxvYy0+ZSkKLQkgICAgY29tbW9uID0gTlVMTDsK LQkgIGVsc2UgaWYgKCEgY29tbW9uCi0JCSAgIHx8IGxvYy0+ZS0+ZGVzdCAhPSBjb21tb24tPmUt PmRlc3QKLQkJICAgfHwgbG9jLT5jb21wX2NvZGUgIT0gY29tbW9uLT5jb21wX2NvZGUKLQkJICAg fHwgISBvcGVyYW5kX2VxdWFsX3AgKGxvYy0+dmFsLCBjb21tb24tPnZhbCwgMCkKLQkJICAgfHwg ISBvcGVyYW5kX2VxdWFsX3AgKGxvYy0+ZXhwciwgY29tbW9uLT5leHByLCAwKSkKLQkgICAgewot CSAgICAgIGNvbW1vbmogPSBqOwotCSAgICAgIGNvbW1vbiA9IGxvYzsKLQkgICAgICBlY250ID0g MTsKLQkgICAgfQotCSAgZWxzZSBpZiAobG9jLT5lID09IGFzc2VydHNbai0xXS0+ZSkKLQkgICAg ewotCSAgICAgIC8qIFJlbW92ZSBkdXBsaWNhdGUgYXNzZXJ0cy4gICovCi0JICAgICAgaWYgKGNv bW1vbmogPT0gaiAtIDEpCi0JCXsKLQkJICBjb21tb25qID0gajsKLQkJICBjb21tb24gPSBsb2M7 Ci0JCX0KLQkgICAgICBmcmVlIChhc3NlcnRzW2otMV0pOwotCSAgICAgIGFzc2VydHNbai0xXSA9 IE5VTEw7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGVjbnQrKzsKLQkgICAgICBp ZiAoRURHRV9DT1VOVCAoY29tbW9uLT5lLT5kZXN0LT5wcmVkcykgPT0gZWNudCkKLQkJewotCQkg IC8qIFdlIGhhdmUgdGhlIHNhbWUgYXNzZXJ0aW9uIG9uIGFsbCBpbmNvbWluZyBlZGdlcyBvZiBh IEJCLgotCQkgICAgIEluc2VydCBpdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoYXQgYmxvY2suICAq LwotCQkgIGxvYy0+YmIgPSBsb2MtPmUtPmRlc3Q7Ci0JCSAgbG9jLT5lID0gTlVMTDsKLQkJICBs b2MtPnNpID0gZ3NpX25vbmUgKCk7Ci0JCSAgY29tbW9uID0gTlVMTDsKLQkJICAvKiBDbGVhciBh c3NlcnRzIGNvbW1vbmVkLiAgKi8KLQkJICBmb3IgKDsgY29tbW9uaiAhPSBqOyArK2NvbW1vbmop Ci0JCSAgICBpZiAoYXNzZXJ0c1tjb21tb25qXSkKLQkJICAgICAgewotCQkJZnJlZSAoYXNzZXJ0 c1tjb21tb25qXSk7Ci0JCQlhc3NlcnRzW2NvbW1vbmpdID0gTlVMTDsKLQkJICAgICAgfQotCQl9 Ci0JICAgIH0KLQl9Ci0KLSAgICAgIC8qIFRoZSBhc3NlcnRzIHZlY3RvciBzb3J0aW5nIGFib3Zl IG1pZ2h0IGJlIHVuc3RhYmxlIGZvcgotCSAtZmNvbXBhcmUtZGVidWcsIHNvcnQgYWdhaW4gdG8g ZW5zdXJlIGEgc3RhYmxlIHNvcnQuICAqLwotICAgICAgYXNzZXJ0cy5xc29ydCAoY29tcGFyZV9h c3NlcnRfbG9jPHRydWU+KTsKLSAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBhc3NlcnRz Lmxlbmd0aCAoKTsgKytqKQotCXsKLQkgIGxvYyA9IGFzc2VydHNbal07Ci0JICBpZiAoISBsb2Mp Ci0JICAgIGJyZWFrOwotCSAgdXBkYXRlX2VkZ2VzX3AgfD0gcHJvY2Vzc19hc3NlcnRfaW5zZXJ0 aW9uc19mb3IgKHNzYV9uYW1lIChpKSwgbG9jKTsKLQkgIG51bV9hc3NlcnRzKys7Ci0JICBmcmVl IChsb2MpOwotCX0KLSAgICB9Ci0KLSAgaWYgKHVwZGF0ZV9lZGdlc19wKQotICAgIGdzaV9jb21t aXRfZWRnZV9pbnNlcnRzICgpOwotCi0gIHN0YXRpc3RpY3NfY291bnRlcl9ldmVudCAoZnVuLCAi TnVtYmVyIG9mIEFTU0VSVF9FWFBSIGV4cHJlc3Npb25zIGluc2VydGVkIiwKLQkJCSAgICBudW1f YXNzZXJ0cyk7Ci19Ci0KLS8qIFRyYXZlcnNlIHRoZSBmbG93Z3JhcGggbG9va2luZyBmb3IgY29u ZGl0aW9uYWwganVtcHMgdG8gaW5zZXJ0IHJhbmdlCi0gICBleHByZXNzaW9ucy4gIFRoZXNlIHJh bmdlIGV4cHJlc3Npb25zIGFyZSBtZWFudCB0byBwcm92aWRlIGluZm9ybWF0aW9uCi0gICB0byBv cHRpbWl6YXRpb25zIHRoYXQgbmVlZCB0byByZWFzb24gaW4gdGVybXMgb2YgdmFsdWUgcmFuZ2Vz LiAgVGhleQotICAgd2lsbCBub3QgYmUgZXhwYW5kZWQgaW50byBSVEwuICBGb3IgaW5zdGFuY2Us IGdpdmVuOgotCi0gICB4ID0gLi4uCi0gICB5ID0gLi4uCi0gICBpZiAoeCA8IHkpCi0gICAgIHkg PSB4IC0gMjsKLSAgIGVsc2UKLSAgICAgeCA9IHkgKyAzOwotCi0gICB0aGlzIHBhc3Mgd2lsbCB0 cmFuc2Zvcm0gdGhlIGNvZGUgaW50bzoKLQotICAgeCA9IC4uLgotICAgeSA9IC4uLgotICAgaWYg KHggPCB5KQotICAgIHsKLSAgICAgIHggPSBBU1NFUlRfRVhQUiA8eCwgeCA8IHk+Ci0gICAgICB5 ID0geCAtIDIKLSAgICB9Ci0gICBlbHNlCi0gICAgewotICAgICAgeSA9IEFTU0VSVF9FWFBSIDx5 LCB4ID49IHk+Ci0gICAgICB4ID0geSArIDMKLSAgICB9Ci0KLSAgIFRoZSBpZGVhIGlzIHRoYXQg b25jZSBjb3B5IGFuZCBjb25zdGFudCBwcm9wYWdhdGlvbiBoYXZlIHJ1biwgb3RoZXIKLSAgIG9w dGltaXphdGlvbnMgd2lsbCBiZSBhYmxlIHRvIGRldGVybWluZSB3aGF0IHJhbmdlcyBvZiB2YWx1 ZXMgY2FuICd4JwotICAgdGFrZSBpbiBkaWZmZXJlbnQgcGF0aHMgb2YgdGhlIGNvZGUsIHNpbXBs eSBieSBjaGVja2luZyB0aGUgcmVhY2hpbmcKLSAgIGRlZmluaXRpb24gb2YgJ3gnLiAgKi8KLQot dm9pZAotdnJwX2Fzc2VydHM6Omluc2VydF9yYW5nZV9hc3NlcnRpb25zICh2b2lkKQotewotICBu ZWVkX2Fzc2VydF9mb3IgPSBCSVRNQVBfQUxMT0MgKE5VTEwpOwotICBhc3NlcnRzX2ZvciA9IFhD TkVXVkVDIChhc3NlcnRfbG9jdXMgKiwgbnVtX3NzYV9uYW1lcyk7Ci0KLSAgY2FsY3VsYXRlX2Rv bWluYW5jZV9pbmZvIChDRElfRE9NSU5BVE9SUyk7Ci0KLSAgZmluZF9hc3NlcnRfbG9jYXRpb25z ICgpOwotICBpZiAoIWJpdG1hcF9lbXB0eV9wIChuZWVkX2Fzc2VydF9mb3IpKQotICAgIHsKLSAg ICAgIHByb2Nlc3NfYXNzZXJ0X2luc2VydGlvbnMgKCk7Ci0gICAgICB1cGRhdGVfc3NhIChUT0RP X3VwZGF0ZV9zc2Ffbm9fcGhpKTsKLSAgICB9Ci0KLSAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9m bGFncyAmIFRERl9ERVRBSUxTKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJc blNTQSBmb3JtIGFmdGVyIGluc2VydGluZyBBU1NFUlRfRVhQUnNcbiIpOwotICAgICAgZHVtcF9m dW5jdGlvbl90b19maWxlIChjdXJyZW50X2Z1bmN0aW9uX2RlY2wsIGR1bXBfZmlsZSwgZHVtcF9m bGFncyk7Ci0gICAgfQotCi0gIGZyZWUgKGFzc2VydHNfZm9yKTsKLSAgQklUTUFQX0ZSRUUgKG5l ZWRfYXNzZXJ0X2Zvcik7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIGFsbCBpbW0gdXNlcyBvZiBW QVIgYXJlIGVpdGhlciBpbiBTVE1ULCBvcgotICAgZmVlZCAob3B0aW9uYWxseSB0aHJvdWdoIGEg Y2hhaW4gb2Ygc2luZ2xlIGltbSB1c2VzKSBHSU1QTEVfQ09ORAotICAgaW4gYmFzaWMgYmxvY2sg Q09ORF9CQi4gICovCi0KLWJvb2wKLXZycF9hc3NlcnRzOjphbGxfaW1tX3VzZXNfaW5fc3RtdF9v cl9mZWVkX2NvbmQgKHRyZWUgdmFyLAotCQkJCQkJZ2ltcGxlICpzdG10LAotCQkJCQkJYmFzaWNf YmxvY2sgY29uZF9iYikKLXsKLSAgdXNlX29wZXJhbmRfcCB1c2VfcCwgdXNlMl9wOwotICBpbW1f dXNlX2l0ZXJhdG9yIGl0ZXI7Ci0KLSAgRk9SX0VBQ0hfSU1NX1VTRV9GQVNUICh1c2VfcCwgaXRl ciwgdmFyKQotICAgIGlmIChVU0VfU1RNVCAodXNlX3ApICE9IHN0bXQpCi0gICAgICB7Ci0JZ2lt cGxlICp1c2Vfc3RtdCA9IFVTRV9TVE1UICh1c2VfcCksICp1c2Vfc3RtdDI7Ci0JaWYgKGlzX2dp bXBsZV9kZWJ1ZyAodXNlX3N0bXQpKQotCSAgY29udGludWU7Ci0Jd2hpbGUgKGlzX2dpbXBsZV9h c3NpZ24gKHVzZV9zdG10KQotCSAgICAgICAmJiBUUkVFX0NPREUgKGdpbXBsZV9hc3NpZ25fbGhz ICh1c2Vfc3RtdCkpID09IFNTQV9OQU1FCi0JICAgICAgICYmIHNpbmdsZV9pbW1fdXNlIChnaW1w bGVfYXNzaWduX2xocyAodXNlX3N0bXQpLAotCQkJCSAgJnVzZTJfcCwgJnVzZV9zdG10MikpCi0J ICB1c2Vfc3RtdCA9IHVzZV9zdG10MjsKLQlpZiAoZ2ltcGxlX2NvZGUgKHVzZV9zdG10KSAhPSBH SU1QTEVfQ09ORAotCSAgICB8fCBnaW1wbGVfYmIgKHVzZV9zdG10KSAhPSBjb25kX2JiKQotCSAg cmV0dXJuIGZhbHNlOwotICAgICAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29udmVydCBy YW5nZSBhc3NlcnRpb24gZXhwcmVzc2lvbnMgaW50byB0aGUgaW1wbGllZCBjb3BpZXMgYW5kCi0g ICBjb3B5IHByb3BhZ2F0ZSBhd2F5IHRoZSBjb3BpZXMuICBEb2luZyB0aGUgdHJpdmlhbCBjb3B5 IHByb3BhZ2F0aW9uCi0gICBoZXJlIGF2b2lkcyB0aGUgbmVlZCB0byBydW4gdGhlIGZ1bGwgY29w eSBwcm9wYWdhdGlvbiBwYXNzIGFmdGVyCi0gICBWUlAuCi0KLSAgIEZJWE1FLCB0aGlzIHdpbGwg ZXZlbnR1YWxseSBsZWFkIHRvIGNvcHkgcHJvcGFnYXRpb24gcmVtb3ZpbmcgdGhlCi0gICBuYW1l cyB0aGF0IGhhZCB1c2VmdWwgcmFuZ2UgaW5mb3JtYXRpb24gYXR0YWNoZWQgdG8gdGhlbS4gIEZv cgotICAgaW5zdGFuY2UsIGlmIHdlIGhhZCB0aGUgYXNzZXJ0aW9uIE5faSA9IEFTU0VSVF9FWFBS IDxOX2osIE5faiA+IDM+LAotICAgdGhlbiBOX2kgd2lsbCBoYXZlIHRoZSByYW5nZSBbMywgK0lO Rl0uCi0KLSAgIEhvd2V2ZXIsIGJ5IGNvbnZlcnRpbmcgdGhlIGFzc2VydGlvbiBpbnRvIHRoZSBp bXBsaWVkIGNvcHkKLSAgIG9wZXJhdGlvbiBOX2kgPSBOX2osIHdlIHdpbGwgdGhlbiBjb3B5LXBy b3BhZ2F0ZSBOX2ogaW50byB0aGUgdXNlcwotICAgb2YgTl9pIGFuZCBsb3NlIHRoZSByYW5nZSBp bmZvcm1hdGlvbi4KLQotICAgVGhlIHByb2JsZW0gd2l0aCBrZWVwaW5nIEFTU0VSVF9FWFBScyBh cm91bmQgaXMgdGhhdCBwYXNzZXMgYWZ0ZXIKLSAgIFZSUCBuZWVkIHRvIGhhbmRsZSB0aGVtIGFw cHJvcHJpYXRlbHkuCi0KLSAgIEFub3RoZXIgYXBwcm9hY2ggd291bGQgYmUgdG8gbWFrZSB0aGUg cmFuZ2UgaW5mb3JtYXRpb24gYSBmaXJzdAotICAgY2xhc3MgcHJvcGVydHkgb2YgdGhlIFNTQV9O QU1FIHNvIHRoYXQgaXQgY2FuIGJlIHF1ZXJpZWQgZnJvbQotICAgYW55IHBhc3MuICBUaGlzIGlz IG1hZGUgc29tZXdoYXQgbW9yZSBjb21wbGV4IGJ5IHRoZSBuZWVkIGZvcgotICAgbXVsdGlwbGUg cmFuZ2VzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBvbmUgU1NBX05BTUUuICAqLwotCi12b2lkCi12 cnBfYXNzZXJ0czo6cmVtb3ZlX3JhbmdlX2Fzc2VydGlvbnMgKCkKLXsKLSAgYmFzaWNfYmxvY2sg YmI7Ci0gIGdpbXBsZV9zdG10X2l0ZXJhdG9yIHNpOwotICAvKiAxIGlmIGxvb2tpbmcgYXQgQVNT RVJUX0VYUFJzIGltbWVkaWF0ZWx5IGF0IHRoZSBiZWdpbm5pbmcgb2YKLSAgICAgYSBiYXNpYyBi bG9jayBwcmVjZWVkZWQgYnkgR0lNUExFX0NPTkQgYnJhbmNoaW5nIHRvIGl0IGFuZAotICAgICBf X2J1aWx0aW5fdHJhcCwgLTEgaWYgbm90IHlldCBjaGVja2VkLCAwIG90aGVyd2lzZS4gICovCi0g IGludCBpc191bnJlYWNoYWJsZTsKLQotICAvKiBOb3RlIHRoYXQgdGhlIEJTSSBpdGVyYXRvciBi dW1wIGhhcHBlbnMgYXQgdGhlIGJvdHRvbSBvZiB0aGUKLSAgICAgbG9vcCBhbmQgbm8gYnVtcCBp cyBuZWNlc3NhcnkgaWYgd2UncmUgcmVtb3ZpbmcgdGhlIHN0YXRlbWVudAotICAgICByZWZlcmVu Y2VkIGJ5IHRoZSBjdXJyZW50IEJTSS4gICovCi0gIEZPUl9FQUNIX0JCX0ZOIChiYiwgZnVuKQot ICAgIGZvciAoc2kgPSBnc2lfYWZ0ZXJfbGFiZWxzIChiYiksIGlzX3VucmVhY2hhYmxlID0gLTE7 ICFnc2lfZW5kX3AgKHNpKTspCi0gICAgICB7Ci0JZ2ltcGxlICpzdG10ID0gZ3NpX3N0bXQgKHNp KTsKLQotCWlmIChpc19naW1wbGVfYXNzaWduIChzdG10KQotCSAgICAmJiBnaW1wbGVfYXNzaWdu X3Joc19jb2RlIChzdG10KSA9PSBBU1NFUlRfRVhQUikKLQkgIHsKLQkgICAgdHJlZSBsaHMgPSBn aW1wbGVfYXNzaWduX2xocyAoc3RtdCk7Ci0JICAgIHRyZWUgcmhzID0gZ2ltcGxlX2Fzc2lnbl9y aHMxIChzdG10KTsKLQkgICAgdHJlZSB2YXI7Ci0KLQkgICAgdmFyID0gQVNTRVJUX0VYUFJfVkFS IChyaHMpOwotCi0JICAgIGlmIChUUkVFX0NPREUgKHZhcikgPT0gU1NBX05BTUUKLQkJJiYgIVBP SU5URVJfVFlQRV9QIChUUkVFX1RZUEUgKGxocykpCi0JCSYmIFNTQV9OQU1FX1JBTkdFX0lORk8g KGxocykpCi0JICAgICAgewotCQlpZiAoaXNfdW5yZWFjaGFibGUgPT0gLTEpCi0JCSAgewotCQkg ICAgaXNfdW5yZWFjaGFibGUgPSAwOwotCQkgICAgaWYgKHNpbmdsZV9wcmVkX3AgKGJiKQotCQkJ JiYgYXNzZXJ0X3VucmVhY2hhYmxlX2ZhbGx0aHJ1X2VkZ2VfcAotCQkJCQkJICAgIChzaW5nbGVf cHJlZF9lZGdlIChiYikpKQotCQkgICAgICBpc191bnJlYWNoYWJsZSA9IDE7Ci0JCSAgfQotCQkv KiBIYW5kbGUKLQkJICAgaWYgKHhfNyA+PSAxMCAmJiB4XzcgPCAyMCkKLQkJICAgICBfX2J1aWx0 aW5fdW5yZWFjaGFibGUgKCk7Ci0JCSAgIHhfOCA9IEFTU0VSVF9FWFBSIDx4XzcsIC4uLj47Ci0J CSAgIGlmIHRoZSBvbmx5IHVzZXMgb2YgeF83IGFyZSBpbiB0aGUgQVNTRVJUX0VYUFIgYW5kCi0J CSAgIGluIHRoZSBjb25kaXRpb24uICBJbiB0aGF0IGNhc2UsIHdlIGNhbiBjb3B5IHRoZQotCQkg ICByYW5nZSBpbmZvIGZyb20geF84IGNvbXB1dGVkIGluIHRoaXMgcGFzcyBhbHNvCi0JCSAgIGZv ciB4XzcuICAqLwotCQlpZiAoaXNfdW5yZWFjaGFibGUKLQkJICAgICYmIGFsbF9pbW1fdXNlc19p bl9zdG10X29yX2ZlZWRfY29uZCAodmFyLCBzdG10LAotCQkJCQkJCSAgc2luZ2xlX3ByZWQgKGJi KSkpCi0JCSAgewotCQkgICAgaWYgKFNTQV9OQU1FX1JBTkdFX0lORk8gKHZhcikpCi0JCSAgICAg IHsKLQkJCS8qID8/IFRoaXMgaXMgYSBtaW5vciB3YXJ0IGV4cG9zaW5nIHRoZQotCQkJICAgaW50 ZXJuYWxzIG9mIFNTQV9OQU1FX1JBTkdFX0lORk8gaW4gb3JkZXIKLQkJCSAgIHRvIG1haW50YWlu IGV4aXN0aW5nIGJlaGF2aW9yLiAgVGhpcyBpcwotCQkJICAgYmVjYXVzZSBkdXBsaWNhdGVfc3Nh X25hbWVfcmFuZ2VfaW5mbyBiZWxvdwotCQkJICAgbmVlZHMgYSBOVUxMIGRlc3RpbmF0aW9uIHJh bmdlLiAgVGhpcyBpcwotCQkJICAgYWxsIHNsYXRlZCBmb3IgcmVtb3ZhbC4uLiAgKi8KLQkJCWdn Y19mcmVlIChTU0FfTkFNRV9SQU5HRV9JTkZPICh2YXIpKTsKLQkJCVNTQV9OQU1FX1JBTkdFX0lO Rk8gKHZhcikgPSBOVUxMOwotCQkgICAgICB9Ci0JCSAgICBkdXBsaWNhdGVfc3NhX25hbWVfcmFu Z2VfaW5mbyAodmFyLCBsaHMpOwotCQkgICAgbWF5YmVfc2V0X25vbnplcm9fYml0cyAoc2luZ2xl X3ByZWRfZWRnZSAoYmIpLCB2YXIpOwotCQkgIH0KLQkgICAgICB9Ci0KLQkgICAgLyogUHJvcGFn YXRlIHRoZSBSSFMgaW50byBldmVyeSB1c2Ugb2YgdGhlIExIUy4gIEZvciBTU0EgbmFtZXMKLQkg ICAgICAgYWxzbyBwcm9wYWdhdGUgYWJub3JtYWxzIGFzIGl0IG1lcmVseSByZXN0b3JlcyB0aGUg b3JpZ2luYWwKLQkgICAgICAgSUwgaW4gdGhpcyBjYXNlIChhbiByZXBsYWNlX3VzZXNfYnkgd291 bGQgYXNzZXJ0KS4gICovCi0JICAgIGlmIChUUkVFX0NPREUgKHZhcikgPT0gU1NBX05BTUUpCi0J ICAgICAgewotCQlpbW1fdXNlX2l0ZXJhdG9yIGl0ZXI7Ci0JCXVzZV9vcGVyYW5kX3AgdXNlX3A7 Ci0JCWdpbXBsZSAqdXNlX3N0bXQ7Ci0JCUZPUl9FQUNIX0lNTV9VU0VfU1RNVCAodXNlX3N0bXQs IGl0ZXIsIGxocykKLQkJICBGT1JfRUFDSF9JTU1fVVNFX09OX1NUTVQgKHVzZV9wLCBpdGVyKQot CQkgICAgU0VUX1VTRSAodXNlX3AsIHZhcik7Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAg cmVwbGFjZV91c2VzX2J5IChsaHMsIHZhcik7Ci0KLQkgICAgLyogQW5kIGZpbmFsbHksIHJlbW92 ZSB0aGUgY29weSwgaXQgaXMgbm90IG5lZWRlZC4gICovCi0JICAgIGdzaV9yZW1vdmUgKCZzaSwg dHJ1ZSk7Ci0JICAgIHJlbGVhc2VfZGVmcyAoc3RtdCk7Ci0JICB9Ci0JZWxzZQotCSAgewotCSAg ICBpZiAoIWlzX2dpbXBsZV9kZWJ1ZyAoZ3NpX3N0bXQgKHNpKSkpCi0JICAgICAgaXNfdW5yZWFj aGFibGUgPSAwOwotCSAgICBnc2lfbmV4dCAoJnNpKTsKLQkgIH0KLSAgICAgIH0KLX0KLQotY2xh c3MgdnJwX3Byb3AgOiBwdWJsaWMgc3NhX3Byb3BhZ2F0aW9uX2VuZ2luZQotewotcHVibGljOgot ICB2cnBfcHJvcCAodnJfdmFsdWVzICp2KQotICAgIDogc3NhX3Byb3BhZ2F0aW9uX2VuZ2luZSAo KSwKLSAgICAgIG1fdnJfdmFsdWVzICh2KSB7IH0KLQotICB2b2lkIGluaXRpYWxpemUgKHN0cnVj dCBmdW5jdGlvbiAqKTsKLSAgdm9pZCBmaW5hbGl6ZSAoKTsKLQotcHJpdmF0ZToKLSAgZW51bSBz c2FfcHJvcF9yZXN1bHQgdmlzaXRfc3RtdCAoZ2ltcGxlICosIGVkZ2UgKiwgdHJlZSAqKSBmaW5h bCBvdmVycmlkZTsKLSAgZW51bSBzc2FfcHJvcF9yZXN1bHQgdmlzaXRfcGhpIChncGhpICopIGZp bmFsIG92ZXJyaWRlOwotCi0gIHN0cnVjdCBmdW5jdGlvbiAqZnVuOwotICB2cl92YWx1ZXMgKm1f dnJfdmFsdWVzOwotfTsKLQotLyogSW5pdGlhbGl6YXRpb24gcmVxdWlyZWQgYnkgc3NhX3Byb3Bh Z2F0ZSBlbmdpbmUuICAqLwotCi12b2lkCi12cnBfcHJvcDo6aW5pdGlhbGl6ZSAoc3RydWN0IGZ1 bmN0aW9uICpmbikKLXsKLSAgYmFzaWNfYmxvY2sgYmI7Ci0gIGZ1biA9IGZuOwotCi0gIEZPUl9F QUNIX0JCX0ZOIChiYiwgZnVuKQotICAgIHsKLSAgICAgIGZvciAoZ3BoaV9pdGVyYXRvciBzaSA9 IGdzaV9zdGFydF9waGlzIChiYik7ICFnc2lfZW5kX3AgKHNpKTsKLQkgICBnc2lfbmV4dCAoJnNp KSkKLQl7Ci0JICBncGhpICpwaGkgPSBzaS5waGkgKCk7Ci0JICBpZiAoIXN0bXRfaW50ZXJlc3Rp bmdfZm9yX3ZycCAocGhpKSkKLQkgICAgewotCSAgICAgIHRyZWUgbGhzID0gUEhJX1JFU1VMVCAo cGhpKTsKLQkgICAgICBtX3ZyX3ZhbHVlcy0+c2V0X2RlZl90b192YXJ5aW5nIChsaHMpOwotCSAg ICAgIHByb3Bfc2V0X3NpbXVsYXRlX2FnYWluIChwaGksIGZhbHNlKTsKLQkgICAgfQotCSAgZWxz ZQotCSAgICBwcm9wX3NldF9zaW11bGF0ZV9hZ2FpbiAocGhpLCB0cnVlKTsKLQl9Ci0KLSAgICAg IGZvciAoZ2ltcGxlX3N0bXRfaXRlcmF0b3Igc2kgPSBnc2lfc3RhcnRfYmIgKGJiKTsgIWdzaV9l bmRfcCAoc2kpOwotCSAgIGdzaV9uZXh0ICgmc2kpKQotICAgICAgICB7Ci0JICBnaW1wbGUgKnN0 bXQgPSBnc2lfc3RtdCAoc2kpOwotCi0gCSAgLyogSWYgdGhlIHN0YXRlbWVudCBpcyBhIGNvbnRy b2wgaW5zbiwgdGhlbiB3ZSBkbyBub3QKLSAJICAgICB3YW50IHRvIGF2b2lkIHNpbXVsYXRpbmcg dGhlIHN0YXRlbWVudCBvbmNlLiAgRmFpbHVyZQotIAkgICAgIHRvIGRvIHNvIG1lYW5zIHRoYXQg dGhvc2UgZWRnZXMgd2lsbCBuZXZlciBnZXQgYWRkZWQuICAqLwotCSAgaWYgKHN0bXRfZW5kc19i Yl9wIChzdG10KSkKLQkgICAgcHJvcF9zZXRfc2ltdWxhdGVfYWdhaW4gKHN0bXQsIHRydWUpOwot CSAgZWxzZSBpZiAoIXN0bXRfaW50ZXJlc3RpbmdfZm9yX3ZycCAoc3RtdCkpCi0JICAgIHsKLQkg ICAgICBtX3ZyX3ZhbHVlcy0+c2V0X2RlZnNfdG9fdmFyeWluZyAoc3RtdCk7Ci0JICAgICAgcHJv cF9zZXRfc2ltdWxhdGVfYWdhaW4gKHN0bXQsIGZhbHNlKTsKLQkgICAgfQotCSAgZWxzZQotCSAg ICBwcm9wX3NldF9zaW11bGF0ZV9hZ2FpbiAoc3RtdCwgdHJ1ZSk7Ci0JfQotICAgIH0KLX0KLQot LyogRXZhbHVhdGUgc3RhdGVtZW50IFNUTVQuICBJZiB0aGUgc3RhdGVtZW50IHByb2R1Y2VzIGEg dXNlZnVsIHJhbmdlLAotICAgcmV0dXJuIFNTQV9QUk9QX0lOVEVSRVNUSU5HIGFuZCByZWNvcmQg dGhlIFNTQSBuYW1lIHdpdGggdGhlCi0gICBpbnRlcmVzdGluZyByYW5nZSBpbnRvICpPVVRQVVRf UC4KLQotICAgSWYgU1RNVCBpcyBhIGNvbmRpdGlvbmFsIGJyYW5jaCBhbmQgd2UgY2FuIGRldGVy bWluZSBpdHMgdHJ1dGgKLSAgIHZhbHVlLCB0aGUgdGFrZW4gZWRnZSBpcyByZWNvcmRlZCBpbiAq VEFLRU5fRURHRV9QLgotCi0gICBJZiBTVE1UIHByb2R1Y2VzIGEgdmFyeWluZyB2YWx1ZSwgcmV0 dXJuIFNTQV9QUk9QX1ZBUllJTkcuICAqLwotCi1lbnVtIHNzYV9wcm9wX3Jlc3VsdAotdnJwX3By b3A6OnZpc2l0X3N0bXQgKGdpbXBsZSAqc3RtdCwgZWRnZSAqdGFrZW5fZWRnZV9wLCB0cmVlICpv dXRwdXRfcCkKLXsKLSAgdHJlZSBsaHMgPSBnaW1wbGVfZ2V0X2xocyAoc3RtdCk7Ci0gIHZhbHVl X3JhbmdlX2VxdWl2IHZyOwotICBtX3ZyX3ZhbHVlcy0+ZXh0cmFjdF9yYW5nZV9mcm9tX3N0bXQg KHN0bXQsIHRha2VuX2VkZ2VfcCwgb3V0cHV0X3AsICZ2cik7Ci0KLSAgaWYgKCpvdXRwdXRfcCkK LSAgICB7Ci0gICAgICBpZiAobV92cl92YWx1ZXMtPnVwZGF0ZV92YWx1ZV9yYW5nZSAoKm91dHB1 dF9wLCAmdnIpKQotCXsKLQkgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVU QUlMUykpCi0JICAgIHsKLQkgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJGb3VuZCBuZXcgcmFu Z2UgZm9yICIpOwotCSAgICAgIHByaW50X2dlbmVyaWNfZXhwciAoZHVtcF9maWxlLCAqb3V0cHV0 X3ApOwotCSAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIjogIik7Ci0JICAgICAgZHVtcF92YWx1 ZV9yYW5nZSAoZHVtcF9maWxlLCAmdnIpOwotCSAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIlxu Iik7Ci0JICAgIH0KLQotCSAgaWYgKHZyLnZhcnlpbmdfcCAoKSkKLQkgICAgcmV0dXJuIFNTQV9Q Uk9QX1ZBUllJTkc7Ci0KLQkgIHJldHVybiBTU0FfUFJPUF9JTlRFUkVTVElORzsKLQl9Ci0gICAg ICByZXR1cm4gU1NBX1BST1BfTk9UX0lOVEVSRVNUSU5HOwotICAgIH0KLQotICBpZiAoaXNfZ2lt cGxlX2NhbGwgKHN0bXQpICYmIGdpbXBsZV9jYWxsX2ludGVybmFsX3AgKHN0bXQpKQotICAgIHN3 aXRjaCAoZ2ltcGxlX2NhbGxfaW50ZXJuYWxfZm4gKHN0bXQpKQotICAgICAgewotICAgICAgY2Fz ZSBJRk5fQUREX09WRVJGTE9XOgotICAgICAgY2FzZSBJRk5fU1VCX09WRVJGTE9XOgotICAgICAg Y2FzZSBJRk5fTVVMX09WRVJGTE9XOgotICAgICAgY2FzZSBJRk5fQVRPTUlDX0NPTVBBUkVfRVhD SEFOR0U6Ci0JLyogVGhlc2UgaW50ZXJuYWwgY2FsbHMgcmV0dXJuIF9Db21wbGV4IGludGVnZXIg dHlwZSwKLQkgICB3aGljaCBWUlAgZG9lcyBub3QgdHJhY2ssIGJ1dCB0aGUgaW1tZWRpYXRlIHVz ZXMKLQkgICB0aGVyZW9mIG1pZ2h0IGJlIGludGVyZXN0aW5nLiAgKi8KLQlpZiAobGhzICYmIFRS RUVfQ09ERSAobGhzKSA9PSBTU0FfTkFNRSkKLQkgIHsKLQkgICAgaW1tX3VzZV9pdGVyYXRvciBp dGVyOwotCSAgICB1c2Vfb3BlcmFuZF9wIHVzZV9wOwotCSAgICBlbnVtIHNzYV9wcm9wX3Jlc3Vs dCByZXMgPSBTU0FfUFJPUF9WQVJZSU5HOwotCi0JICAgIG1fdnJfdmFsdWVzLT5zZXRfZGVmX3Rv X3ZhcnlpbmcgKGxocyk7Ci0KLQkgICAgRk9SX0VBQ0hfSU1NX1VTRV9GQVNUICh1c2VfcCwgaXRl ciwgbGhzKQotCSAgICAgIHsKLQkJZ2ltcGxlICp1c2Vfc3RtdCA9IFVTRV9TVE1UICh1c2VfcCk7 Ci0JCWlmICghaXNfZ2ltcGxlX2Fzc2lnbiAodXNlX3N0bXQpKQotCQkgIGNvbnRpbnVlOwotCQll bnVtIHRyZWVfY29kZSByaHNfY29kZSA9IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHVzZV9zdG10 KTsKLQkJaWYgKHJoc19jb2RlICE9IFJFQUxQQVJUX0VYUFIgJiYgcmhzX2NvZGUgIT0gSU1BR1BB UlRfRVhQUikKLQkJICBjb250aW51ZTsKLQkJdHJlZSByaHMxID0gZ2ltcGxlX2Fzc2lnbl9yaHMx ICh1c2Vfc3RtdCk7Ci0JCXRyZWUgdXNlX2xocyA9IGdpbXBsZV9hc3NpZ25fbGhzICh1c2Vfc3Rt dCk7Ci0JCWlmIChUUkVFX0NPREUgKHJoczEpICE9IHJoc19jb2RlCi0JCSAgICB8fCBUUkVFX09Q RVJBTkQgKHJoczEsIDApICE9IGxocwotCQkgICAgfHwgVFJFRV9DT0RFICh1c2VfbGhzKSAhPSBT U0FfTkFNRQotCQkgICAgfHwgIXN0bXRfaW50ZXJlc3RpbmdfZm9yX3ZycCAodXNlX3N0bXQpCi0J CSAgICB8fCAoIUlOVEVHUkFMX1RZUEVfUCAoVFJFRV9UWVBFICh1c2VfbGhzKSkKLQkJCXx8ICFU WVBFX01JTl9WQUxVRSAoVFJFRV9UWVBFICh1c2VfbGhzKSkKLQkJCXx8ICFUWVBFX01BWF9WQUxV RSAoVFJFRV9UWVBFICh1c2VfbGhzKSkpKQotCQkgIGNvbnRpbnVlOwotCi0JCS8qIElmIHRoZXJl IGlzIGEgY2hhbmdlIGluIHRoZSB2YWx1ZSByYW5nZSBmb3IgYW55IG9mIHRoZQotCQkgICBSRUFM UEFSVF9FWFBSL0lNQUdQQVJUX0VYUFIgaW1tZWRpYXRlIHVzZXMsIHJldHVybgotCQkgICBTU0Ff UFJPUF9JTlRFUkVTVElORy4gIElmIHRoZXJlIGFyZSBhbnkgUkVBTFBBUlRfRVhQUgotCQkgICBv ciBJTUFHUEFSVF9FWFBSIGltbWVkaWF0ZSB1c2VzLCBidXQgbm9uZSBvZiB0aGVtIGhhdmUKLQkJ ICAgYSBjaGFuZ2UgaW4gdGhlaXIgdmFsdWUgcmFuZ2VzLCByZXR1cm4KLQkJICAgU1NBX1BST1Bf Tk9UX0lOVEVSRVNUSU5HLiAgSWYgdGhlcmUgYXJlIG5vCi0JCSAgIHtSRUFMLElNQUd9UEFSVF9F WFBSIHVzZXMgYXQgYWxsLAotCQkgICByZXR1cm4gU1NBX1BST1BfVkFSWUlORy4gICovCi0JCXZh bHVlX3JhbmdlX2VxdWl2IG5ld192cjsKLQkJbV92cl92YWx1ZXMtPmV4dHJhY3RfcmFuZ2VfYmFz aWMgKCZuZXdfdnIsIHVzZV9zdG10KTsKLQkJY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKm9sZF92 cgotCQkgID0gbV92cl92YWx1ZXMtPmdldF92YWx1ZV9yYW5nZSAodXNlX2xocyk7Ci0JCWlmICgh b2xkX3ZyLT5lcXVhbF9wIChuZXdfdnIsIC8qaWdub3JlX2VxdWl2cz0qL2ZhbHNlKSkKLQkJICBy ZXMgPSBTU0FfUFJPUF9JTlRFUkVTVElORzsKLQkJZWxzZQotCQkgIHJlcyA9IFNTQV9QUk9QX05P VF9JTlRFUkVTVElORzsKLQkJbmV3X3ZyLmVxdWl2X2NsZWFyICgpOwotCQlpZiAocmVzID09IFNT QV9QUk9QX0lOVEVSRVNUSU5HKQotCQkgIHsKLQkJICAgICpvdXRwdXRfcCA9IGxoczsKLQkJICAg IHJldHVybiByZXM7Ci0JCSAgfQotCSAgICAgIH0KLQotCSAgICByZXR1cm4gcmVzOwotCSAgfQot CWJyZWFrOwotICAgICAgZGVmYXVsdDoKLQlicmVhazsKLSAgICAgIH0KLQotICAvKiBBbGwgb3Ro ZXIgc3RhdGVtZW50cyBwcm9kdWNlIG5vdGhpbmcgb2YgaW50ZXJlc3QgZm9yIFZSUCwgc28gbWFy awotICAgICB0aGVpciBvdXRwdXRzIHZhcnlpbmcgYW5kIHByZXZlbnQgZnVydGhlciBzaW11bGF0 aW9uLiAgKi8KLSAgbV92cl92YWx1ZXMtPnNldF9kZWZzX3RvX3ZhcnlpbmcgKHN0bXQpOwotCi0g IHJldHVybiAoKnRha2VuX2VkZ2VfcCkgPyBTU0FfUFJPUF9JTlRFUkVTVElORyA6IFNTQV9QUk9Q X1ZBUllJTkc7Ci19Ci0KLS8qIFZpc2l0IGFsbCBhcmd1bWVudHMgZm9yIFBISSBub2RlIFBISSB0 aGF0IGZsb3cgdGhyb3VnaCBleGVjdXRhYmxlCi0gICBlZGdlcy4gIElmIGEgdmFsaWQgdmFsdWUg cmFuZ2UgY2FuIGJlIGRlcml2ZWQgZnJvbSBhbGwgdGhlIGluY29taW5nCi0gICB2YWx1ZSByYW5n ZXMsIHNldCBhIG5ldyByYW5nZSBmb3IgdGhlIExIUyBvZiBQSEkuICAqLwotCi1lbnVtIHNzYV9w cm9wX3Jlc3VsdAotdnJwX3Byb3A6OnZpc2l0X3BoaSAoZ3BoaSAqcGhpKQotewotICB0cmVlIGxo cyA9IFBISV9SRVNVTFQgKHBoaSk7Ci0gIHZhbHVlX3JhbmdlX2VxdWl2IHZyX3Jlc3VsdDsKLSAg bV92cl92YWx1ZXMtPmV4dHJhY3RfcmFuZ2VfZnJvbV9waGlfbm9kZSAocGhpLCAmdnJfcmVzdWx0 KTsKLSAgaWYgKG1fdnJfdmFsdWVzLT51cGRhdGVfdmFsdWVfcmFuZ2UgKGxocywgJnZyX3Jlc3Vs dCkpCi0gICAgewotICAgICAgaWYgKGR1bXBfZmlsZSAmJiAoZHVtcF9mbGFncyAmIFRERl9ERVRB SUxTKSkKLQl7Ci0JICBmcHJpbnRmIChkdW1wX2ZpbGUsICJGb3VuZCBuZXcgcmFuZ2UgZm9yICIp OwotCSAgcHJpbnRfZ2VuZXJpY19leHByIChkdW1wX2ZpbGUsIGxocyk7Ci0JICBmcHJpbnRmIChk dW1wX2ZpbGUsICI6ICIpOwotCSAgZHVtcF92YWx1ZV9yYW5nZSAoZHVtcF9maWxlLCAmdnJfcmVz dWx0KTsKLQkgIGZwcmludGYgKGR1bXBfZmlsZSwgIlxuIik7Ci0JfQotCi0gICAgICBpZiAodnJf cmVzdWx0LnZhcnlpbmdfcCAoKSkKLQlyZXR1cm4gU1NBX1BST1BfVkFSWUlORzsKLQotICAgICAg cmV0dXJuIFNTQV9QUk9QX0lOVEVSRVNUSU5HOwotICAgIH0KLQotICAvKiBOb3RoaW5nIGNoYW5n ZWQsIGRvbid0IGFkZCBvdXRnb2luZyBlZGdlcy4gICovCi0gIHJldHVybiBTU0FfUFJPUF9OT1Rf SU5URVJFU1RJTkc7Ci19Ci0KLS8qIFRyYXZlcnNlIGFsbCB0aGUgYmxvY2tzIGZvbGRpbmcgY29u ZGl0aW9uYWxzIHdpdGgga25vd24gcmFuZ2VzLiAgKi8KLQotdm9pZAotdnJwX3Byb3A6OmZpbmFs aXplICgpCi17Ci0gIHNpemVfdCBpOwotCi0gIC8qIFdlIGhhdmUgY29tcGxldGVkIHByb3BhZ2F0 aW5nIHRocm91Z2ggdGhlIGxhdHRpY2UuICAqLwotICBtX3ZyX3ZhbHVlcy0+c2V0X2xhdHRpY2Vf cHJvcGFnYXRpb25fY29tcGxldGUgKCk7Ci0KLSAgaWYgKGR1bXBfZmlsZSkKLSAgICB7Ci0gICAg ICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcblZhbHVlIHJhbmdlcyBhZnRlciBWUlA6XG5cbiIpOwot ICAgICAgbV92cl92YWx1ZXMtPmR1bXAgKGR1bXBfZmlsZSk7Ci0gICAgICBmcHJpbnRmIChkdW1w X2ZpbGUsICJcbiIpOwotICAgIH0KLQotICAvKiBTZXQgdmFsdWUgcmFuZ2UgdG8gbm9uIHBvaW50 ZXIgU1NBX05BTUVzLiAgKi8KLSAgZm9yIChpID0gMDsgaSA8IG51bV9zc2FfbmFtZXM7IGkrKykK LSAgICB7Ci0gICAgICB0cmVlIG5hbWUgPSBzc2FfbmFtZSAoaSk7Ci0gICAgICBpZiAoIW5hbWUp Ci0JY29udGludWU7Ci0KLSAgICAgIGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICp2ciA9IG1fdnJf dmFsdWVzLT5nZXRfdmFsdWVfcmFuZ2UgKG5hbWUpOwotICAgICAgaWYgKCFuYW1lIHx8IHZyLT52 YXJ5aW5nX3AgKCkgfHwgIXZyLT5jb25zdGFudF9wICgpKQotCWNvbnRpbnVlOwotCi0gICAgICBp ZiAoUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQRSAobmFtZSkpCi0JICAmJiByYW5nZV9pbmNsdWRl c196ZXJvX3AgKHZyKSA9PSAwKQotCXNldF9wdHJfbm9ubnVsbCAobmFtZSk7Ci0gICAgICBlbHNl IGlmICghUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQRSAobmFtZSkpKQotCXNldF9yYW5nZV9pbmZv IChuYW1lLCAqdnIpOwotICAgIH0KLX0KKy8qIEdpdmVuIGEgU1dJVENIX1NUTVQsIHJldHVybiB0 aGUgY2FzZSBsYWJlbCB0aGF0IGVuY29tcGFzc2VzIHRoZQorICAga25vd24gcG9zc2libGUgdmFs dWVzIGZvciB0aGUgc3dpdGNoIG9wZXJhbmQuICBSQU5HRV9PRl9PUCBpcyBhCisgICByYW5nZSBm b3IgdGhlIGtub3duIHZhbHVlcyBvZiB0aGUgc3dpdGNoIG9wZXJhbmQuICAqLwogCi1jbGFzcyB2 cnBfZm9sZGVyIDogcHVibGljIHN1YnN0aXR1dGVfYW5kX2ZvbGRfZW5naW5lCit0cmVlCitmaW5k X2Nhc2VfbGFiZWxfcmFuZ2UgKGdzd2l0Y2ggKnN3aXRjaF9zdG10LCBjb25zdCBpcmFuZ2UgKnJh bmdlX29mX29wKQogewotIHB1YmxpYzoKLSAgdnJwX2ZvbGRlciAodnJfdmFsdWVzICp2KQotICAg IDogc3Vic3RpdHV0ZV9hbmRfZm9sZF9lbmdpbmUgKC8qIEZvbGQgYWxsIHN0bXRzLiAgKi8gdHJ1 ZSksCi0gICAgICBtX3ZyX3ZhbHVlcyAodiksIHNpbXBsaWZpZXIgKHYpCi0gICAgeyAgfQotICB2 b2lkIHNpbXBsaWZ5X2Nhc3RlZF9jb25kcyAoZnVuY3Rpb24gKmZ1bik7CisgIGlmIChyYW5nZV9v Zl9vcC0+dW5kZWZpbmVkX3AgKCkKKyAgICAgIHx8IHJhbmdlX29mX29wLT52YXJ5aW5nX3AgKCkp CisgICAgcmV0dXJuIE5VTExfVFJFRTsKIAotcHJpdmF0ZToKLSAgdHJlZSB2YWx1ZV9vZl9leHBy ICh0cmVlIG5hbWUsIGdpbXBsZSAqc3RtdCkgb3ZlcnJpZGUKKyAgc2l6ZV90IGksIGo7CisgIHRy ZWUgb3AgPSBnaW1wbGVfc3dpdGNoX2luZGV4IChzd2l0Y2hfc3RtdCk7CisgIHRyZWUgdHlwZSA9 IFRSRUVfVFlQRSAob3ApOworICB0cmVlIHRtaW4gPSB3aWRlX2ludF90b190cmVlICh0eXBlLCBy YW5nZV9vZl9vcC0+bG93ZXJfYm91bmQgKCkpOworICB0cmVlIHRtYXggPSB3aWRlX2ludF90b190 cmVlICh0eXBlLCByYW5nZV9vZl9vcC0+dXBwZXJfYm91bmQgKCkpOworICBmaW5kX2Nhc2VfbGFi ZWxfcmFuZ2UgKHN3aXRjaF9zdG10LCB0bWluLCB0bWF4LCAmaSwgJmopOworICBpZiAoaSA9PSBq KQogICAgIHsKLSAgICAgIHJldHVybiBtX3ZyX3ZhbHVlcy0+dmFsdWVfb2ZfZXhwciAobmFtZSwg c3RtdCk7CisgICAgICAvKiBMb29rIGZvciBleGFjdGx5IG9uZSBsYWJlbCB0aGF0IGVuY29tcGFz c2VzIHRoZSByYW5nZSBvZgorCSB0aGUgb3BlcmFuZC4gICovCisgICAgICB0cmVlIGxhYmVsID0g Z2ltcGxlX3N3aXRjaF9sYWJlbCAoc3dpdGNoX3N0bXQsIGkpOworICAgICAgdHJlZSBjYXNlX2hp Z2gKKwk9IENBU0VfSElHSCAobGFiZWwpID8gQ0FTRV9ISUdIIChsYWJlbCkgOiBDQVNFX0xPVyAo bGFiZWwpOworICAgICAgaW50X3JhbmdlX21heCBsYWJlbF9yYW5nZSAoQ0FTRV9MT1cgKGxhYmVs KSwgY2FzZV9oaWdoKTsKKyAgICAgIGlmICghdHlwZXNfY29tcGF0aWJsZV9wIChsYWJlbF9yYW5n ZS50eXBlICgpLCByYW5nZV9vZl9vcC0+dHlwZSAoKSkpCisJcmFuZ2VfY2FzdCAobGFiZWxfcmFu Z2UsIHJhbmdlX29mX29wLT50eXBlICgpKTsKKyAgICAgIGxhYmVsX3JhbmdlLmludGVyc2VjdCAo KnJhbmdlX29mX29wKTsKKyAgICAgIGlmIChsYWJlbF9yYW5nZSA9PSAqcmFuZ2Vfb2Zfb3ApCisJ cmV0dXJuIGxhYmVsOwogICAgIH0KLSAgYm9vbCBmb2xkX3N0bXQgKGdpbXBsZV9zdG10X2l0ZXJh dG9yICopIGZpbmFsIG92ZXJyaWRlOwotICBib29sIGZvbGRfcHJlZGljYXRlX2luIChnaW1wbGVf c3RtdF9pdGVyYXRvciAqKTsKLQotICB2cl92YWx1ZXMgKm1fdnJfdmFsdWVzOwotICBzaW1wbGlm eV91c2luZ19yYW5nZXMgc2ltcGxpZmllcjsKLX07Ci0KLS8qIElmIHRoZSBzdGF0ZW1lbnQgcG9p bnRlZCBieSBTSSBoYXMgYSBwcmVkaWNhdGUgd2hvc2UgdmFsdWUgY2FuIGJlCi0gICBjb21wdXRl ZCB1c2luZyB0aGUgdmFsdWUgcmFuZ2UgaW5mb3JtYXRpb24gY29tcHV0ZWQgYnkgVlJQLCBjb21w dXRlCi0gICBpdHMgdmFsdWUgYW5kIHJldHVybiB0cnVlLiAgT3RoZXJ3aXNlLCByZXR1cm4gZmFs c2UuICAqLwotCi1ib29sCi12cnBfZm9sZGVyOjpmb2xkX3ByZWRpY2F0ZV9pbiAoZ2ltcGxlX3N0 bXRfaXRlcmF0b3IgKnNpKQotewotICBib29sIGFzc2lnbm1lbnRfcCA9IGZhbHNlOwotICB0cmVl IHZhbDsKLSAgZ2ltcGxlICpzdG10ID0gZ3NpX3N0bXQgKCpzaSk7Ci0KLSAgaWYgKGlzX2dpbXBs ZV9hc3NpZ24gKHN0bXQpCi0gICAgICAmJiBUUkVFX0NPREVfQ0xBU1MgKGdpbXBsZV9hc3NpZ25f cmhzX2NvZGUgKHN0bXQpKSA9PSB0Y2NfY29tcGFyaXNvbikKKyAgZWxzZSBpZiAoaSA+IGopCiAg ICAgewotICAgICAgYXNzaWdubWVudF9wID0gdHJ1ZTsKLSAgICAgIHZhbCA9IHNpbXBsaWZpZXIu dnJwX2V2YWx1YXRlX2NvbmRpdGlvbmFsIChnaW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KSwK LQkJCQkJCSBnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpLAotCQkJCQkJIGdpbXBsZV9hc3NpZ25f cmhzMiAoc3RtdCksCi0JCQkJCQkgc3RtdCk7CisgICAgICAvKiBJZiB0aGVyZSBhcmUgbm8gbGFi ZWxzIGF0IGFsbCwgdGFrZSB0aGUgZGVmYXVsdC4gICovCisgICAgICByZXR1cm4gZ2ltcGxlX3N3 aXRjaF9sYWJlbCAoc3dpdGNoX3N0bXQsIDApOwogICAgIH0KLSAgZWxzZSBpZiAoZ2NvbmQgKmNv bmRfc3RtdCA9IGR5bl9jYXN0IDxnY29uZCAqPiAoc3RtdCkpCi0gICAgdmFsID0gc2ltcGxpZmll ci52cnBfZXZhbHVhdGVfY29uZGl0aW9uYWwgKGdpbXBsZV9jb25kX2NvZGUgKGNvbmRfc3RtdCks Ci0JCQkJCSAgICAgICBnaW1wbGVfY29uZF9saHMgKGNvbmRfc3RtdCksCi0JCQkJCSAgICAgICBn aW1wbGVfY29uZF9yaHMgKGNvbmRfc3RtdCksCi0JCQkJCSAgICAgICBzdG10KTsKICAgZWxzZQot ICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAodmFsKQogICAgIHsKLSAgICAgIGlmIChhc3NpZ25t ZW50X3ApCi0JdmFsID0gZm9sZF9jb252ZXJ0IChUUkVFX1RZUEUgKGdpbXBsZV9hc3NpZ25fbGhz IChzdG10KSksIHZhbCk7Ci0KLSAgICAgIGlmIChkdW1wX2ZpbGUpCi0JewotCSAgZnByaW50ZiAo ZHVtcF9maWxlLCAiRm9sZGluZyBwcmVkaWNhdGUgIik7Ci0JICBwcmludF9naW1wbGVfZXhwciAo ZHVtcF9maWxlLCBzdG10LCAwKTsKLQkgIGZwcmludGYgKGR1bXBfZmlsZSwgIiB0byAiKTsKLQkg IHByaW50X2dlbmVyaWNfZXhwciAoZHVtcF9maWxlLCB2YWwpOwotCSAgZnByaW50ZiAoZHVtcF9m aWxlLCAiXG4iKTsKLQl9Ci0KLSAgICAgIGlmIChpc19naW1wbGVfYXNzaWduIChzdG10KSkKLQln aW1wbGVfYXNzaWduX3NldF9yaHNfZnJvbV90cmVlIChzaSwgdmFsKTsKLSAgICAgIGVsc2UKLQl7 Ci0JICBnY2NfYXNzZXJ0IChnaW1wbGVfY29kZSAoc3RtdCkgPT0gR0lNUExFX0NPTkQpOwotCSAg Z2NvbmQgKmNvbmRfc3RtdCA9IGFzX2EgPGdjb25kICo+IChzdG10KTsKLQkgIGlmIChpbnRlZ2Vy X3plcm9wICh2YWwpKQotCSAgICBnaW1wbGVfY29uZF9tYWtlX2ZhbHNlIChjb25kX3N0bXQpOwot CSAgZWxzZSBpZiAoaW50ZWdlcl9vbmVwICh2YWwpKQotCSAgICBnaW1wbGVfY29uZF9tYWtlX3Ry dWUgKGNvbmRfc3RtdCk7Ci0JICBlbHNlCi0JICAgIGdjY191bnJlYWNoYWJsZSAoKTsKLQl9Ci0K LSAgICAgIHJldHVybiB0cnVlOworICAgICAgLyogT3RoZXJ3aXNlLCB0aGVyZSBhcmUgdmFyaW91 cyBsYWJlbHMgdGhhdCBjYW4gZW5jb21wYXNzCisJIHRoZSByYW5nZSBvZiBvcGVyYW5kLiAgSW4g d2hpY2ggY2FzZSwgc2VlIGlmIHRoZSByYW5nZSBvZgorCSB0aGUgb3BlcmFuZCBpcyBlbnRpcmVs eSAqb3V0c2lkZSogdGhlIGJvdW5kcyBvZiBhbGwgdGhlCisJIChub24tZGVmYXVsdCkgY2FzZSBs YWJlbHMuICBJZiBzbywgdGFrZSB0aGUgZGVmYXVsdC4gICovCisgICAgICB1bnNpZ25lZCBuID0g Z2ltcGxlX3N3aXRjaF9udW1fbGFiZWxzIChzd2l0Y2hfc3RtdCk7CisgICAgICB0cmVlIG1pbl9s YWJlbCA9IGdpbXBsZV9zd2l0Y2hfbGFiZWwgKHN3aXRjaF9zdG10LCAxKTsKKyAgICAgIHRyZWUg bWF4X2xhYmVsID0gZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3dpdGNoX3N0bXQsIG4gLSAxKTsKKyAg ICAgIHRyZWUgY2FzZV9oaWdoID0gQ0FTRV9ISUdIIChtYXhfbGFiZWwpOworICAgICAgaWYgKCFj YXNlX2hpZ2gpCisJY2FzZV9oaWdoID0gQ0FTRV9MT1cgKG1heF9sYWJlbCk7CisgICAgICBpbnRf cmFuZ2VfbWF4IGxhYmVsX3JhbmdlIChDQVNFX0xPVyAobWluX2xhYmVsKSwgY2FzZV9oaWdoKTsK KyAgICAgIGlmICghdHlwZXNfY29tcGF0aWJsZV9wIChsYWJlbF9yYW5nZS50eXBlICgpLCByYW5n ZV9vZl9vcC0+dHlwZSAoKSkpCisJcmFuZ2VfY2FzdCAobGFiZWxfcmFuZ2UsIHJhbmdlX29mX29w LT50eXBlICgpKTsKKyAgICAgIGxhYmVsX3JhbmdlLmludGVyc2VjdCAoKnJhbmdlX29mX29wKTsK KyAgICAgIGlmIChsYWJlbF9yYW5nZS51bmRlZmluZWRfcCAoKSkKKwlyZXR1cm4gZ2ltcGxlX3N3 aXRjaF9sYWJlbCAoc3dpdGNoX3N0bXQsIDApOwogICAgIH0KLQotICByZXR1cm4gZmFsc2U7Ci19 Ci0KLS8qIENhbGxiYWNrIGZvciBzdWJzdGl0dXRlX2FuZF9mb2xkIGZvbGRpbmcgdGhlIHN0bXQg YXQgKlNJLiAgKi8KLQotYm9vbAotdnJwX2ZvbGRlcjo6Zm9sZF9zdG10IChnaW1wbGVfc3RtdF9p dGVyYXRvciAqc2kpCi17Ci0gIGlmIChmb2xkX3ByZWRpY2F0ZV9pbiAoc2kpKQotICAgIHJldHVy biB0cnVlOwotCi0gIHJldHVybiBzaW1wbGlmaWVyLnNpbXBsaWZ5IChzaSk7CisgIHJldHVybiBO VUxMX1RSRUU7CiB9CiAKLS8qIEEgY29tcGFyaXNvbiBvZiBhbiBTU0FfTkFNRSBhZ2FpbnN0IGEg Y29uc3RhbnQgd2hlcmUgdGhlIFNTQV9OQU1FCi0gICB3YXMgc2V0IGJ5IGEgdHlwZSBjb252ZXJz aW9uIGNhbiBvZnRlbiBiZSByZXdyaXR0ZW4gdG8gdXNlIHRoZSBSSFMKLSAgIG9mIHRoZSB0eXBl IGNvbnZlcnNpb24uICBEbyB0aGlzIG9wdGltaXphdGlvbiBmb3IgYWxsIGNvbmRpdGlvbmFscwot ICAgaW4gRlVOLiAgKi8KLQotdm9pZAotdnJwX2ZvbGRlcjo6c2ltcGxpZnlfY2FzdGVkX2NvbmRz IChmdW5jdGlvbiAqZnVuKQorc3RydWN0IGNhc2VfaW5mbwogeworICB0cmVlIGV4cHI7CiAgIGJh c2ljX2Jsb2NrIGJiOwotICBGT1JfRUFDSF9CQl9GTiAoYmIsIGZ1bikKLSAgICB7Ci0gICAgICBn aW1wbGUgKmxhc3QgPSBsYXN0X3N0bXQgKGJiKTsKLSAgICAgIGlmIChsYXN0ICYmIGdpbXBsZV9j b2RlIChsYXN0KSA9PSBHSU1QTEVfQ09ORCkKLQl7Ci0JICBpZiAoc2ltcGxpZmllci5zaW1wbGlm eV9jYXN0ZWRfY29uZCAoYXNfYSA8Z2NvbmQgKj4gKGxhc3QpKSkKLQkgICAgewotCSAgICAgIGlm IChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCi0JCXsKLQkJICBmcHJp bnRmIChkdW1wX2ZpbGUsICJGb2xkZWQgaW50bzogIik7Ci0JCSAgcHJpbnRfZ2ltcGxlX3N0bXQg KGR1bXBfZmlsZSwgbGFzdCwgMCwgVERGX1NMSU0pOwotCQkgIGZwcmludGYgKGR1bXBfZmlsZSwg IlxuIik7Ci0JCX0KLQkgICAgfQotCX0KLSAgICB9Ci19Ci0KLS8qIE1haW4gZW50cnkgcG9pbnQg dG8gVlJQIChWYWx1ZSBSYW5nZSBQcm9wYWdhdGlvbikuICBUaGlzIHBhc3MgaXMKLSAgIGxvb3Nl bHkgYmFzZWQgb24gSi4gUi4gQy4gUGF0dGVyc29uLCBgYEFjY3VyYXRlIFN0YXRpYyBCcmFuY2gK LSAgIFByZWRpY3Rpb24gYnkgVmFsdWUgUmFuZ2UgUHJvcGFnYXRpb24sJycgaW4gU0lHUExBTiBD b25mZXJlbmNlIG9uCi0gICBQcm9ncmFtbWluZyBMYW5ndWFnZSBEZXNpZ24gYW5kIEltcGxlbWVu dGF0aW9uLCBwcC4gNjctNzgsIDE5OTUuCi0gICBBbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vY2l0 ZXNlZXIuaXN0LnBzdS5lZHUvcGF0dGVyc29uOTVhY2N1cmF0ZS5odG1sCi0KLSAgIFRoaXMgaXMg ZXNzZW50aWFsbHkgYW4gU1NBLUNDUCBwYXNzIG1vZGlmaWVkIHRvIGRlYWwgd2l0aCByYW5nZXMK LSAgIGluc3RlYWQgb2YgY29uc3RhbnRzLgotCi0gICBXaGlsZSBwcm9wYWdhdGluZyByYW5nZXMs IHdlIG1heSBmaW5kIHRoYXQgdHdvIG9yIG1vcmUgU1NBIG5hbWUKLSAgIGhhdmUgZXF1aXZhbGVu dCwgdGhvdWdoIGRpc3RpbmN0IHJhbmdlcy4gIEZvciBpbnN0YW5jZSwKLQotICAgICAxCXhfOSA9 IHBfMy0+YTsKLSAgICAgMglwXzQgPSBBU1NFUlRfRVhQUiA8cF8zLCBwXzMgIT0gMD4KLSAgICAg MwlpZiAocF80ID09IHFfMikKLSAgICAgNAkgIHBfNSA9IEFTU0VSVF9FWFBSIDxwXzQsIHBfNCA9 PSBxXzI+OwotICAgICA1CWVuZGlmCi0gICAgIDYJaWYgKHFfMikKLQotICAgSW4gdGhlIGNvZGUg YWJvdmUsIHBvaW50ZXIgcF81IGhhcyByYW5nZSBbcV8yLCBxXzJdLCBidXQgZnJvbSB0aGUKLSAg IGNvZGUgd2UgY2FuIGFsc28gZGV0ZXJtaW5lIHRoYXQgcF81IGNhbm5vdCBiZSBOVUxMIGFuZCwg aWYgcV8yIGhhZAotICAgYSBub24tdmFyeWluZyByYW5nZSwgcF81J3MgcmFuZ2Ugc2hvdWxkIGFs c28gYmUgY29tcGF0aWJsZSB3aXRoIGl0LgotCi0gICBUaGVzZSBlcXVpdmFsZW5jZXMgYXJlIGNy ZWF0ZWQgYnkgdHdvIGV4cHJlc3Npb25zOiBBU1NFUlRfRVhQUiBhbmQKLSAgIGNvcHkgb3BlcmF0 aW9ucy4gIFNpbmNlIHBfNSBpcyBhbiBhc3NlcnRpb24gb24gcF80LCBhbmQgcF80IHdhcyB0aGUK LSAgIHJlc3VsdCBvZiBhbm90aGVyIGFzc2VydGlvbiwgdGhlbiB3ZSBjYW4gdXNlIHRoZSBmYWN0 IHRoYXQgcF81IGFuZAotICAgcF80IGFyZSBlcXVpdmFsZW50IHdoZW4gZXZhbHVhdGluZyBwXzUn cyByYW5nZS4KLQotICAgVG9nZXRoZXIgd2l0aCB2YWx1ZSByYW5nZXMsIHdlIGFsc28gcHJvcGFn YXRlIHRoZXNlIGVxdWl2YWxlbmNlcwotICAgYmV0d2VlbiBuYW1lcyBzbyB0aGF0IHdlIGNhbiB0 YWtlIGFkdmFudGFnZSBvZiBpbmZvcm1hdGlvbiBmcm9tCi0gICBtdWx0aXBsZSByYW5nZXMgd2hl biBkb2luZyBmaW5hbCByZXBsYWNlbWVudC4gIE5vdGUgdGhhdCB0aGlzCi0gICBlcXVpdmFsZW5j eSByZWxhdGlvbiBpcyB0cmFuc2l0aXZlIGJ1dCBub3Qgc3ltbWV0cmljLgotCi0gICBJbiB0aGUg ZXhhbXBsZSBhYm92ZSwgcF81IGlzIGVxdWl2YWxlbnQgdG8gcF80LCBxXzIgYW5kIHBfMywgYnV0 IHdlCi0gICBjYW5ub3QgYXNzZXJ0IHRoYXQgcV8yIGlzIGVxdWl2YWxlbnQgdG8gcF81IGJlY2F1 c2UgcV8yIG1heSBiZSB1c2VkCi0gICBpbiBjb250ZXh0cyB3aGVyZSB0aGF0IGFzc2VydGlvbiBk b2VzIG5vdCBob2xkIChlLmcuLCBpbiBsaW5lIDYpLgotCi0gICBUT0RPLCB0aGUgbWFpbiBkaWZm ZXJlbmNlIGJldHdlZW4gdGhpcyBwYXNzIGFuZCBQYXR0ZXJzb24ncyBpcyB0aGF0Ci0gICB3ZSBk byBub3QgcHJvcGFnYXRlIGVkZ2UgcHJvYmFiaWxpdGllcy4gIFdlIG9ubHkgY29tcHV0ZSB3aGV0 aGVyCi0gICBlZGdlcyBjYW4gYmUgdGFrZW4gb3Igbm90LiAgVGhhdCBpcywgaW5zdGVhZCBvZiBo YXZpbmcgYSBzcGVjdHJ1bQotICAgb2YganVtcCBwcm9iYWJpbGl0aWVzIGJldHdlZW4gMCBhbmQg MSwgd2Ugb25seSBkZWFsIHdpdGggMCwgMSBhbmQKLSAgIERPTidUIEtOT1cuICBJbiB0aGUgZnV0 dXJlLCBpdCBtYXkgYmUgd29ydGh3aGlsZSB0byBwcm9wYWdhdGUKLSAgIHByb2JhYmlsaXRpZXMg dG8gYWlkIGJyYW5jaCBwcmVkaWN0aW9uLiAgKi8KLQotc3RhdGljIHVuc2lnbmVkIGludAotZXhl Y3V0ZV92cnAgKHN0cnVjdCBmdW5jdGlvbiAqZnVuLCBib29sIHdhcm5fYXJyYXlfYm91bmRzX3Ap Ci17Ci0gIGxvb3Bfb3B0aW1pemVyX2luaXQgKExPT1BTX05PUk1BTCB8IExPT1BTX0hBVkVfUkVD T1JERURfRVhJVFMpOwotICByZXdyaXRlX2ludG9fbG9vcF9jbG9zZWRfc3NhIChOVUxMLCBUT0RP X3VwZGF0ZV9zc2EpOwotICBzY2V2X2luaXRpYWxpemUgKCk7Ci0KLSAgLyogPz8/ICBUaGlzIGVu ZHMgdXAgdXNpbmcgc3RhbGUgRURHRV9ERlNfQkFDSyBmb3IgbGl2ZW5lc3MgY29tcHV0YXRpb24u Ci0gICAgIEluc2VydGluZyBhc3NlcnRpb25zIG1heSBzcGxpdCBlZGdlcyB3aGljaCB3aWxsIGlu dmFsaWRhdGUKLSAgICAgRURHRV9ERlNfQkFDSy4gICovCi0gIHZycF9hc3NlcnRzIGFzc2VydF9l bmdpbmUgKGZ1bik7Ci0gIGFzc2VydF9lbmdpbmUuaW5zZXJ0X3JhbmdlX2Fzc2VydGlvbnMgKCk7 Ci0KLSAgLyogRm9yIHZpc2l0aW5nIFBISSBub2RlcyB3ZSBuZWVkIEVER0VfREZTX0JBQ0sgY29t cHV0ZWQuICAqLwotICBtYXJrX2Rmc19iYWNrX2VkZ2VzICgpOwotCi0gIHZyX3ZhbHVlcyB2cnBf dnJfdmFsdWVzOwotCi0gIGNsYXNzIHZycF9wcm9wIHZycF9wcm9wICgmdnJwX3ZyX3ZhbHVlcyk7 Ci0gIHZycF9wcm9wLmluaXRpYWxpemUgKGZ1bik7Ci0gIHZycF9wcm9wLnNzYV9wcm9wYWdhdGUg KCk7Ci0KLSAgLyogSW5zdGFudGlhdGUgdGhlIGZvbGRlciBoZXJlLCBzbyB0aGF0IGVkZ2UgY2xl YW51cHMgaGFwcGVuIGF0IHRoZQotICAgICBlbmQgb2YgdGhpcyBmdW5jdGlvbi4gICovCi0gIHZy cF9mb2xkZXIgZm9sZGVyICgmdnJwX3ZyX3ZhbHVlcyk7Ci0gIHZycF9wcm9wLmZpbmFsaXplICgp OwotCi0gIC8qIElmIHdlJ3JlIGNoZWNraW5nIGFycmF5IHJlZnMsIHdlIHdhbnQgdG8gbWVyZ2Ug aW5mb3JtYXRpb24gb24KLSAgICAgdGhlIGV4ZWN1dGFiaWxpdHkgb2YgZWFjaCBlZGdlIGJldHdl ZW4gdnJwX2ZvbGRlciBhbmQgdGhlCi0gICAgIGNoZWNrX2FycmF5X2JvdW5kc19kb21fd2Fsa2Vy OiBlYWNoIGNhbiBjbGVhciB0aGUKLSAgICAgRURHRV9FWEVDVVRBQkxFIGZsYWcgb24gZWRnZXMs IGluIGRpZmZlcmVudCB3YXlzLgotCi0gICAgIEhlbmNlLCBpZiB3ZSdyZSBnb2luZyB0byBjYWxs IGNoZWNrX2FsbF9hcnJheV9yZWZzLCBzZXQKLSAgICAgdGhlIGZsYWcgb24gZXZlcnkgZWRnZSBu b3csIHJhdGhlciB0aGFuIGluCi0gICAgIGNoZWNrX2FycmF5X2JvdW5kc19kb21fd2Fsa2VyJ3Mg Y3RvcjsgdnJwX2ZvbGRlciBtYXkgY2xlYXIKLSAgICAgaXQgZnJvbSBzb21lIGVkZ2VzLiAgKi8K LSAgaWYgKHdhcm5fYXJyYXlfYm91bmRzICYmIHdhcm5fYXJyYXlfYm91bmRzX3ApCi0gICAgc2V0 X2FsbF9lZGdlc19hc19leGVjdXRhYmxlIChmdW4pOwotCi0gIGZvbGRlci5zdWJzdGl0dXRlX2Fu ZF9mb2xkICgpOwotCi0gIGlmICh3YXJuX2FycmF5X2JvdW5kcyAmJiB3YXJuX2FycmF5X2JvdW5k c19wKQotICAgIHsKLSAgICAgIGFycmF5X2JvdW5kc19jaGVja2VyIGFycmF5X2NoZWNrZXIgKGZ1 biwgJnZycF92cl92YWx1ZXMpOwotICAgICAgYXJyYXlfY2hlY2tlci5jaGVjayAoKTsKLSAgICB9 Ci0KLSAgZm9sZGVyLnNpbXBsaWZ5X2Nhc3RlZF9jb25kcyAoZnVuKTsKLQotICBmcmVlX251bWJl cnNfb2ZfaXRlcmF0aW9uc19lc3RpbWF0ZXMgKGZ1bik7Ci0KLSAgYXNzZXJ0X2VuZ2luZS5yZW1v dmVfcmFuZ2VfYXNzZXJ0aW9ucyAoKTsKLQotICBzY2V2X2ZpbmFsaXplICgpOwotICBsb29wX29w dGltaXplcl9maW5hbGl6ZSAoKTsKLSAgcmV0dXJuIDA7Ci19Cit9OwogCiAvLyBUaGlzIGlzIGEg cmFuZ2VyIGJhc2VkIGZvbGRlciB3aGljaCBjb250aW51ZXMgdG8gdXNlIHRoZSBkb21pbmF0b3IK IC8vIHdhbGsgdG8gYWNjZXNzIHRoZSBzdWJzdGl0dXRlIGFuZCBmb2xkIG1hY2hpbmVyeS4gIFJh bmdlcyBhcmUgY2FsY3VsYXRlZApAQCAtNDYyMSwxMCArMTE5OCw3IEBAIHB1YmxpYzoKICAgICAg IGlmIChteV9wYXNzID09IDApCiAJcmV0dXJuIGV4ZWN1dGVfcmFuZ2VyX3ZycCAoZnVuLCAvKndh cm5fYXJyYXlfYm91bmRzX3A9Ki9mYWxzZSwgZmFsc2UpOwogCi0gICAgICBpZiAoKG15X3Bhc3Mg PT0gMSAmJiBwYXJhbV92cnAxX21vZGUgPT0gVlJQX01PREVfUkFOR0VSKQotCSAgfHwgKG15X3Bh c3MgPT0gMiAmJiBwYXJhbV92cnAyX21vZGUgPT0gVlJQX01PREVfUkFOR0VSKSkKLQlyZXR1cm4g ZXhlY3V0ZV9yYW5nZXJfdnJwIChmdW4sIHdhcm5fYXJyYXlfYm91bmRzX3AsIG15X3Bhc3MgPT0g Mik7Ci0gICAgICByZXR1cm4gZXhlY3V0ZV92cnAgKGZ1biwgd2Fybl9hcnJheV9ib3VuZHNfcCk7 CisgICAgICByZXR1cm4gZXhlY3V0ZV9yYW5nZXJfdnJwIChmdW4sIHdhcm5fYXJyYXlfYm91bmRz X3AsIG15X3Bhc3MgPT0gMik7CiAgICAgfQogCiAgcHJpdmF0ZToKZGlmZiAtLWdpdCBhL2djYy90 cmVlLXZycC5oIGIvZ2NjL3RyZWUtdnJwLmgKaW5kZXggYjg2NDRlOWQwYTcuLjA3NjMwYjViMWNh IDEwMDY0NAotLS0gYS9nY2MvdHJlZS12cnAuaAorKysgYi9nY2MvdHJlZS12cnAuaApAQCAtMjIs MjYgKzIyLDYgQEAgYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBDT1BZSU5HMy4gIElmIG5v dCBzZWUKIAogI2luY2x1ZGUgInZhbHVlLXJhbmdlLmgiCiAKLXN0cnVjdCBhc3NlcnRfaW5mbwot ewotICAvKiBQcmVkaWNhdGUgY29kZSBmb3IgdGhlIEFTU0VSVF9FWFBSLiAgTXVzdCBiZSBDT01Q QVJJU09OX0NMQVNTX1AuICAqLwotICBlbnVtIHRyZWVfY29kZSBjb21wX2NvZGU7Ci0KLSAgLyog TmFtZSB0byByZWdpc3RlciB0aGUgYXNzZXJ0IGZvci4gICovCi0gIHRyZWUgbmFtZTsKLQotICAv KiBWYWx1ZSBiZWluZyBjb21wYXJlZCBhZ2FpbnN0LiAgKi8KLSAgdHJlZSB2YWw7Ci0KLSAgLyog RXhwcmVzc2lvbiB0byBjb21wYXJlLiAgKi8KLSAgdHJlZSBleHByOwotfTsKLQotZXh0ZXJuIHZv aWQgcmVnaXN0ZXJfZWRnZV9hc3NlcnRfZm9yICh0cmVlLCBlZGdlLCBlbnVtIHRyZWVfY29kZSwK LQkJCQkgICAgICB0cmVlLCB0cmVlLCB2ZWM8YXNzZXJ0X2luZm8+ICYpOwotZXh0ZXJuIGJvb2wg c3RtdF9pbnRlcmVzdGluZ19mb3JfdnJwIChnaW1wbGUgKik7Ci1leHRlcm4gYm9vbCBpbmZlcl92 YWx1ZV9yYW5nZSAoZ2ltcGxlICosIHRyZWUsIHRyZWVfY29kZSAqLCB0cmVlICopOwotCiBleHRl cm4gYm9vbCByYW5nZV9pbnRfY3N0X3AgKGNvbnN0IHZhbHVlX3JhbmdlICopOwogCiBleHRlcm4g aW50IGNvbXBhcmVfdmFsdWVzICh0cmVlLCB0cmVlKTsKQEAgLTYwLDExICs0MCw2IEBAIGV4dGVy biBib29sIGZpbmRfY2FzZV9sYWJlbF9yYW5nZSAoZ3N3aXRjaCAqLCB0cmVlLCB0cmVlLCBzaXpl X3QgKiwgc2l6ZV90ICopOwogZXh0ZXJuIHRyZWUgZmluZF9jYXNlX2xhYmVsX3JhbmdlIChnc3dp dGNoICosIGNvbnN0IGlyYW5nZSAqdnIpOwogZXh0ZXJuIGJvb2wgZmluZF9jYXNlX2xhYmVsX2lu ZGV4IChnc3dpdGNoICosIHNpemVfdCwgdHJlZSwgc2l6ZV90ICopOwogZXh0ZXJuIGJvb2wgb3Zl cmZsb3dfY29tcGFyaXNvbl9wICh0cmVlX2NvZGUsIHRyZWUsIHRyZWUsIGJvb2wsIHRyZWUgKik7 Ci1leHRlcm4gdHJlZSBnZXRfc2luZ2xlX3N5bWJvbCAodHJlZSwgYm9vbCAqLCB0cmVlICopOwog ZXh0ZXJuIHZvaWQgbWF5YmVfc2V0X25vbnplcm9fYml0cyAoZWRnZSwgdHJlZSk7Ci1leHRlcm4g d2lkZV9pbnQgbWFza2VkX2luY3JlbWVudCAoY29uc3Qgd2lkZV9pbnQgJnZhbF9pbiwgY29uc3Qg d2lkZV9pbnQgJm1hc2ssCi0JCQkJICBjb25zdCB3aWRlX2ludCAmc2duYml0LCB1bnNpZ25lZCBp bnQgcHJlYyk7CiAKLWV4dGVybiB1bnNpZ25lZCBpbnQgZXhlY3V0ZV9yYW5nZXJfdnJwIChzdHJ1 Y3QgZnVuY3Rpb24gKmZ1biwKLQkJCQkJYm9vbCB3YXJuX2FycmF5X2JvdW5kc19wID0gZmFsc2Up OwogI2VuZGlmIC8qIEdDQ19UUkVFX1ZSUF9IICovCmRpZmYgLS1naXQgYS9nY2MvdnItdmFsdWVz LmNjIGIvZ2NjL3ZyLXZhbHVlcy5jYwppbmRleCA3MWZlZDFlNmE3ZS4uMjUxNWQ5ODgzZjQgMTAw NjQ0Ci0tLSBhL2djYy92ci12YWx1ZXMuY2MKKysrIGIvZ2NjL3ZyLXZhbHVlcy5jYwpAQCAtNTIs NDE1ICs1Miw2IEBAIGFsb25nIHdpdGggR0NDOyBzZWUgdGhlIGZpbGUgQ09QWUlORzMuICBJZiBu b3Qgc2VlCiAjaW5jbHVkZSAicmFuZ2Utb3AuaCIKICNpbmNsdWRlICJnaW1wbGUtcmFuZ2UuaCIK IAotLyogU2V0IHZhbHVlIHJhbmdlIFZSIHRvIGEgbm9uLW5lZ2F0aXZlIHJhbmdlIG9mIHR5cGUg VFlQRS4gICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZAotc2V0X3ZhbHVlX3JhbmdlX3RvX25vbm5l Z2F0aXZlICh2YWx1ZV9yYW5nZV9lcXVpdiAqdnIsIHRyZWUgdHlwZSkKLXsKLSAgdHJlZSB6ZXJv ID0gYnVpbGRfaW50X2NzdCAodHlwZSwgMCk7Ci0gIHZyLT51cGRhdGUgKHplcm8sIHZycF92YWxf bWF4ICh0eXBlKSk7Ci19Ci0KLS8qIFNldCB2YWx1ZSByYW5nZSBWUiB0byBhIHJhbmdlIG9mIGEg dHJ1dGh2YWx1ZSBvZiB0eXBlIFRZUEUuICAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXNldF92 YWx1ZV9yYW5nZV90b190cnV0aHZhbHVlICh2YWx1ZV9yYW5nZV9lcXVpdiAqdnIsIHRyZWUgdHlw ZSkKLXsKLSAgaWYgKFRZUEVfUFJFQ0lTSU9OICh0eXBlKSA9PSAxKQotICAgIHZyLT5zZXRfdmFy eWluZyAodHlwZSk7Ci0gIGVsc2UKLSAgICB2ci0+dXBkYXRlIChidWlsZF9pbnRfY3N0ICh0eXBl LCAwKSwgYnVpbGRfaW50X2NzdCAodHlwZSwgMSkpOwotfQotCi0vKiBSZXR1cm4gdGhlIGxhdHRp Y2UgZW50cnkgZm9yIFZBUiBvciBOVUxMIGlmIGl0IGRvZXNuJ3QgZXhpc3Qgb3IgY2Fubm90Ci0g ICBiZSBpbml0aWFsaXplZC4gICovCi0KLXZhbHVlX3JhbmdlX2VxdWl2ICoKLXZyX3ZhbHVlczo6 Z2V0X2xhdHRpY2VfZW50cnkgKGNvbnN0X3RyZWUgdmFyKQotewotICB2YWx1ZV9yYW5nZV9lcXVp diAqdnI7Ci0gIHRyZWUgc3ltOwotICB1bnNpZ25lZCB2ZXIgPSBTU0FfTkFNRV9WRVJTSU9OICh2 YXIpOwotCi0gIC8qIElmIHdlIHF1ZXJ5IHRoZSBlbnRyeSBmb3IgYSBuZXcgU1NBIG5hbWUgYXZv aWQgcmVhbGxvY2F0aW5nIHRoZSBsYXR0aWNlCi0gICAgIHNpbmNlIHdlIHNob3VsZCBnZXQgaGVy ZSBhdCBtb3N0IGZyb20gdGhlIHN1YnN0aXR1dGUtYW5kLWZvbGQgc3RhZ2Ugd2hpY2gKLSAgICAg d2lsbCBuZXZlciB0cnkgdG8gY2hhbmdlIHZhbHVlcy4gICovCi0gIGlmICh2ZXIgPj0gbnVtX3Zy X3ZhbHVlcykKLSAgICByZXR1cm4gTlVMTDsKLQotICB2ciA9IHZyX3ZhbHVlW3Zlcl07Ci0gIGlm ICh2cikKLSAgICByZXR1cm4gdnI7Ci0KLSAgLyogQ3JlYXRlIGEgZGVmYXVsdCB2YWx1ZSByYW5n ZS4gICovCi0gIHZyID0gYWxsb2NhdGVfdmFsdWVfcmFuZ2VfZXF1aXYgKCk7Ci0gIHZyX3ZhbHVl W3Zlcl0gPSB2cjsKLQotICAvKiBBZnRlciBwcm9wYWdhdGlvbiBmaW5pc2hlZCByZXR1cm4gdmFy eWluZy4gICovCi0gIGlmICh2YWx1ZXNfcHJvcGFnYXRlZCkKLSAgICB7Ci0gICAgICB2ci0+c2V0 X3ZhcnlpbmcgKFRSRUVfVFlQRSAodmFyKSk7Ci0gICAgICByZXR1cm4gdnI7Ci0gICAgfQotCi0g IHZyLT5zZXRfdW5kZWZpbmVkICgpOwotCi0gIC8qIElmIFZBUiBpcyBhIGRlZmF1bHQgZGVmaW5p dGlvbiBvZiBhIHBhcmFtZXRlciwgdGhlIHZhcmlhYmxlIGNhbgotICAgICB0YWtlIGFueSB2YWx1 ZSBpbiBWQVIncyB0eXBlLiAgKi8KLSAgaWYgKFNTQV9OQU1FX0lTX0RFRkFVTFRfREVGICh2YXIp KQotICAgIHsKLSAgICAgIHN5bSA9IFNTQV9OQU1FX1ZBUiAodmFyKTsKLSAgICAgIGlmIChUUkVF X0NPREUgKHN5bSkgPT0gUEFSTV9ERUNMKQotCXsKLQkgIC8qIFRyeSB0byB1c2UgdGhlICJub25u dWxsIiBhdHRyaWJ1dGUgdG8gY3JlYXRlIH5bMCwgMF0KLQkgICAgIGFudGktcmFuZ2VzIGZvciBw b2ludGVycy4gIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgdmFsaWQgd2l0aAotCSAgICAgZGVmYXVs dCBkZWZpbml0aW9ucyBvZiBQQVJNX0RFQ0xzLiAgKi8KLQkgIGlmIChQT0lOVEVSX1RZUEVfUCAo VFJFRV9UWVBFIChzeW0pKQotCSAgICAgICYmIChub25udWxsX2FyZ19wIChzeW0pCi0JCSAgfHwg KGdldF9nbG9iYWxfcmFuZ2VfcXVlcnkgKCktPnJhbmdlX29mX2V4cHIgKCp2ciwKLQkJCQkJCWNv bnN0X2Nhc3QgPHRyZWU+ICh2YXIpKQotCQkgICAgICAmJiB2ci0+bm9uemVyb19wICgpKSkpCi0J ICAgIHsKLQkgICAgICB2ci0+c2V0X25vbnplcm8gKFRSRUVfVFlQRSAoc3ltKSk7Ci0JICAgICAg dnItPmVxdWl2X2NsZWFyICgpOwotCSAgICB9Ci0JICBlbHNlIGlmIChJTlRFR1JBTF9UWVBFX1Ag KFRSRUVfVFlQRSAoc3ltKSkpCi0JICAgIHsKLQkgICAgICBnZXRfZ2xvYmFsX3JhbmdlX3F1ZXJ5 ICgpLT5yYW5nZV9vZl9leHByICgqdnIsIGNvbnN0X2Nhc3QgPHRyZWU+ICh2YXIpKTsKLQkgICAg ICBpZiAodnItPnVuZGVmaW5lZF9wICgpKQotCQl2ci0+c2V0X3ZhcnlpbmcgKFRSRUVfVFlQRSAo c3ltKSk7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgdnItPnNldF92YXJ5aW5nIChUUkVFX1RZUEUg KHN5bSkpOwotCX0KLSAgICAgIGVsc2UgaWYgKFRSRUVfQ09ERSAoc3ltKSA9PSBSRVNVTFRfREVD TAotCSAgICAgICAmJiBERUNMX0JZX1JFRkVSRU5DRSAoc3ltKSkKLQl7Ci0JICB2ci0+c2V0X25v bnplcm8gKFRSRUVfVFlQRSAoc3ltKSk7Ci0JICB2ci0+ZXF1aXZfY2xlYXIgKCk7Ci0JfQotICAg IH0KLQotICByZXR1cm4gdnI7Ci19Ci0KLS8qIFJldHVybiB2YWx1ZSByYW5nZSBpbmZvcm1hdGlv biBmb3IgVkFSLgotCi0gICBJZiB3ZSBoYXZlIG5vIHZhbHVlcyByYW5nZXMgcmVjb3JkZWQgKGll LCBWUlAgaXMgbm90IHJ1bm5pbmcpLCB0aGVuCi0gICByZXR1cm4gTlVMTC4gIE90aGVyd2lzZSBj cmVhdGUgYW4gZW1wdHkgcmFuZ2UgaWYgbm9uZSBleGlzdGVkIGZvciBWQVIuICAqLwotCi1jb25z dCB2YWx1ZV9yYW5nZV9lcXVpdiAqCi12cl92YWx1ZXM6OmdldF92YWx1ZV9yYW5nZSAoY29uc3Rf dHJlZSB2YXIsCi0JCQkgICAgZ2ltcGxlICpzdG10IEFUVFJJQlVURV9VTlVTRUQpCi17Ci0gIC8q IElmIHdlIGhhdmUgbm8gcmVjb3JkZWQgcmFuZ2VzLCB0aGVuIHJldHVybiBOVUxMLiAgKi8KLSAg aWYgKCF2cl92YWx1ZSkKLSAgICByZXR1cm4gTlVMTDsKLQotICB2YWx1ZV9yYW5nZV9lcXVpdiAq dnIgPSBnZXRfbGF0dGljZV9lbnRyeSAodmFyKTsKLQotICAvKiBSZWFsbG9jYXRlIHRoZSBsYXR0 aWNlIGlmIG5lZWRlZC4gICovCi0gIGlmICghdnIpCi0gICAgewotICAgICAgdW5zaWduZWQgaW50 IG9sZF9zeiA9IG51bV92cl92YWx1ZXM7Ci0gICAgICBudW1fdnJfdmFsdWVzID0gbnVtX3NzYV9u YW1lcyArIG51bV9zc2FfbmFtZXMgLyAxMDsKLSAgICAgIHZyX3ZhbHVlID0gWFJFU0laRVZFQyAo dmFsdWVfcmFuZ2VfZXF1aXYgKiwgdnJfdmFsdWUsIG51bV92cl92YWx1ZXMpOwotICAgICAgZm9y ICggOyBvbGRfc3ogPCBudW1fdnJfdmFsdWVzOyBvbGRfc3orKykKLSAgICAgICAgdnJfdmFsdWUg W29sZF9zel0gPSBOVUxMOwotCi0gICAgICAvKiBOb3cgdGhhdCB0aGUgbGF0dGljZSBoYXMgYmVl biByZXNpemVkLCB3ZSBzaG91bGQgbmV2ZXIgZmFpbC4gICovCi0gICAgICB2ciA9IGdldF9sYXR0 aWNlX2VudHJ5ICh2YXIpOwotICAgICAgZ2NjX2Fzc2VydCAodnIpOwotICAgIH0KLQotICByZXR1 cm4gdnI7Ci19Ci0KLWJvb2wKLXZyX3ZhbHVlczo6cmFuZ2Vfb2ZfZXhwciAodnJhbmdlICZyLCB0 cmVlIGV4cHIsIGdpbXBsZSAqc3RtdCkKLXsKLSAgaWYgKCFnaW1wbGVfcmFuZ2Vfc3NhX3AgKGV4 cHIpKQotICAgIHJldHVybiBnZXRfdHJlZV9yYW5nZSAociwgZXhwciwgc3RtdCk7Ci0KLSAgaWYg KGNvbnN0IHZhbHVlX3JhbmdlICp2ciA9IGdldF92YWx1ZV9yYW5nZSAoZXhwciwgc3RtdCkpCi0g ICAgewotICAgICAgaWYgKCF2ci0+c3VwcG9ydHNfdHlwZV9wIChUUkVFX1RZUEUgKGV4cHIpKSkK LQl7Ci0JICAvLyB2cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2VfYmFzaWMoKSB1c2Ugb2YgcmFuZ2Vy J3MKLQkgIC8vIGZvbGRfcmFuZ2UoKSBjYW4gY3JlYXRlIGEgc2l0dWF0aW9uIHdoZXJlIHdlIGFy ZSBhc2tlZAotCSAgLy8gZm9yIHRoZSByYW5nZSBvZiBhbiB1bnN1cHBvcnRlZCBsZWdhY3kgdHlw ZS4gIFNpbmNlCi0JICAvLyBnZXRfdmFsdWVfcmFuZ2UoKSBhYm92ZSB3aWxsIHJldHVybiB2YXJ5 aW5nIG9yIHVuZGVmaW5lZAotCSAgLy8gZm9yIHN1Y2ggdHlwZXMsIGF2b2lkIGNvcHlpbmcgaW5j b21wYXRpYmxlIHJhbmdlIHR5cGVzLgotCSAgaWYgKHZyLT51bmRlZmluZWRfcCAoKSkKLQkgICAg ci5zZXRfdW5kZWZpbmVkICgpOwotCSAgZWxzZQotCSAgICByLnNldF92YXJ5aW5nIChUUkVFX1RZ UEUgKGV4cHIpKTsKLQkgIHJldHVybiB0cnVlOwotCX0KLSAgICAgIGlmICh2ci0+dW5kZWZpbmVk X3AgKCkgfHwgdnItPmNvbnN0YW50X3AgKCkpCi0JciA9ICp2cjsKLSAgICAgIGVsc2UKLQl7Ci0J ICB2YWx1ZV9yYW5nZSB0bXAgPSAqdnI7Ci0JICB0bXAubm9ybWFsaXplX3N5bWJvbGljcyAoKTsK LQkgIHIgPSB0bXA7Ci0JfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICByZXR1cm4gZmFs c2U7Ci19Ci0KLXRyZWUKLXZyX3ZhbHVlczo6dmFsdWVfb2ZfZXhwciAodHJlZSBvcCwgZ2ltcGxl ICopCi17Ci0gIHJldHVybiBvcF93aXRoX2NvbnN0YW50X3NpbmdsZXRvbl92YWx1ZV9yYW5nZSAo b3ApOwotfQotCi10cmVlCi12cl92YWx1ZXM6OnZhbHVlX29uX2VkZ2UgKGVkZ2UsIHRyZWUgb3Ap Ci17Ci0gIHJldHVybiBvcF93aXRoX2NvbnN0YW50X3NpbmdsZXRvbl92YWx1ZV9yYW5nZSAob3Ap OwotfQotCi10cmVlCi12cl92YWx1ZXM6OnZhbHVlX29mX3N0bXQgKGdpbXBsZSAqc3RtdCwgdHJl ZSBvcCkKLXsKLSAgaWYgKCFvcCkKLSAgICBvcCA9IGdpbXBsZV9nZXRfbGhzIChzdG10KTsKLQot ICBnY2NfY2hlY2tpbmdfYXNzZXJ0ICghb3B8fCBvcCA9PSBnaW1wbGVfZ2V0X2xocyAoc3RtdCkp OwotCi0gIGlmIChvcCkKLSAgICByZXR1cm4gb3Bfd2l0aF9jb25zdGFudF9zaW5nbGV0b25fdmFs dWVfcmFuZ2UgKG9wKTsKLSAgcmV0dXJuIE5VTExfVFJFRTsKLX0KLQotLyogU2V0IHRoZSBsYXR0 aWNlIGVudHJ5IGZvciBERUYgdG8gVkFSWUlORy4gICovCi0KLXZvaWQKLXZyX3ZhbHVlczo6c2V0 X2RlZl90b192YXJ5aW5nIChjb25zdF90cmVlIGRlZikKLXsKLSAgdmFsdWVfcmFuZ2VfZXF1aXYg KnZyID0gZ2V0X2xhdHRpY2VfZW50cnkgKGRlZik7Ci0gIGlmICh2cikKLSAgICB2ci0+c2V0X3Zh cnlpbmcgKFRSRUVfVFlQRSAoZGVmKSk7Ci19Ci0KLS8qIFNldCB2YWx1ZS1yYW5nZXMgb2YgYWxs IFNTQSBuYW1lcyBkZWZpbmVkIGJ5IFNUTVQgdG8gdmFyeWluZy4gICovCi0KLXZvaWQKLXZyX3Zh bHVlczo6c2V0X2RlZnNfdG9fdmFyeWluZyAoZ2ltcGxlICpzdG10KQotewotICBzc2Ffb3BfaXRl ciBpOwotICB0cmVlIGRlZjsKLSAgRk9SX0VBQ0hfU1NBX1RSRUVfT1BFUkFORCAoZGVmLCBzdG10 LCBpLCBTU0FfT1BfREVGKQotICAgIHNldF9kZWZfdG9fdmFyeWluZyAoZGVmKTsKLX0KLQotLyog VXBkYXRlIHRoZSB2YWx1ZSByYW5nZSBhbmQgZXF1aXZhbGVuY2Ugc2V0IGZvciB2YXJpYWJsZSBW QVIgdG8KLSAgIE5FV19WUi4gIFJldHVybiB0cnVlIGlmIE5FV19WUiBpcyBkaWZmZXJlbnQgZnJv bSBWQVIncyBwcmV2aW91cwotICAgdmFsdWUuCi0KLSAgIE5PVEU6IFRoaXMgZnVuY3Rpb24gYXNz dW1lcyB0aGF0IE5FV19WUiBpcyBhIHRlbXBvcmFyeSB2YWx1ZSByYW5nZQotICAgb2JqZWN0IGNy ZWF0ZWQgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgdXBkYXRpbmcgVkFSJ3MgcmFuZ2UuICBUaGUK LSAgIHN0b3JhZ2UgdXNlZCBieSB0aGUgZXF1aXZhbGVuY2Ugc2V0IGZyb20gTkVXX1ZSIHdpbGwg YmUgZnJlZWQgYnkKLSAgIHRoaXMgZnVuY3Rpb24uICBEbyBub3QgY2FsbCB1cGRhdGVfdmFsdWVf cmFuZ2Ugd2hlbiBORVdfVlIKLSAgIGlzIHRoZSByYW5nZSBvYmplY3QgYXNzb2NpYXRlZCB3aXRo IGFub3RoZXIgU1NBIG5hbWUuICAqLwotCi1ib29sCi12cl92YWx1ZXM6OnVwZGF0ZV92YWx1ZV9y YW5nZSAoY29uc3RfdHJlZSB2YXIsIHZhbHVlX3JhbmdlX2VxdWl2ICpuZXdfdnIpCi17Ci0gIHZh bHVlX3JhbmdlX2VxdWl2ICpvbGRfdnI7Ci0gIGJvb2wgaXNfbmV3OwotCi0gIC8qIElmIHRoZXJl IGlzIGEgdmFsdWUtcmFuZ2Ugb24gdGhlIFNTQSBuYW1lIGZyb20gZWFybGllciBhbmFseXNpcwot ICAgICBmYWN0b3IgdGhhdCBpbi4gICovCi0gIGlmIChJTlRFR1JBTF9UWVBFX1AgKFRSRUVfVFlQ RSAodmFyKSkpCi0gICAgewotICAgICAgdmFsdWVfcmFuZ2VfZXF1aXYgbnI7Ci0gICAgICBnZXRf Z2xvYmFsX3JhbmdlX3F1ZXJ5ICgpLT5yYW5nZV9vZl9leHByIChuciwgY29uc3RfY2FzdCA8dHJl ZT4gKHZhcikpOwotICAgICAgaWYgKCFuci51bmRlZmluZWRfcCAoKSkKLQluZXdfdnItPmxlZ2Fj eV92ZXJib3NlX2ludGVyc2VjdCAoJm5yKTsKLSAgICB9Ci0KLSAgLyogVXBkYXRlIHRoZSB2YWx1 ZSByYW5nZSwgaWYgbmVjZXNzYXJ5LiAgSWYgd2UgY2Fubm90IGFsbG9jYXRlIGEgbGF0dGljZQot ICAgICBlbnRyeSBmb3IgVkFSIGtlZXAgaXQgYXQgVkFSWUlORy4gIFRoaXMgaGFwcGVucyB3aGVu IERPTSBmZWVkcyB1cyBzdG10cwotICAgICB3aXRoIFNTQSBuYW1lcyBhbGxvY2F0ZWQgYWZ0ZXIg c2V0dGluZyB1cCB0aGUgbGF0dGljZS4gICovCi0gIG9sZF92ciA9IGdldF9sYXR0aWNlX2VudHJ5 ICh2YXIpOwotICBpZiAoIW9sZF92cikKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGlzX25ldyA9ICFv bGRfdnItPmVxdWFsX3AgKCpuZXdfdnIsIC8qaWdub3JlX2VxdWl2cz0qL2ZhbHNlKTsKLQotICBp ZiAoaXNfbmV3KQotICAgIHsKLSAgICAgIC8qIERvIG5vdCBhbGxvdyB0cmFuc2l0aW9ucyB1cCB0 aGUgbGF0dGljZS4gIFRoZSBmb2xsb3dpbmcKLQkgaXMgc2xpZ2h0bHkgbW9yZSBhd2t3YXJkIHRo YW4ganVzdCBuZXdfdnItPnR5cGUgPCBvbGRfdnItPnR5cGUKLQkgYmVjYXVzZSBWUl9SQU5HRSBh bmQgVlJfQU5USV9SQU5HRSBuZWVkIHRvIGJlIGNvbnNpZGVyZWQKLQkgdGhlIHNhbWUuICBXZSBt YXkgbm90IGhhdmUgaXNfbmV3IHdoZW4gdHJhbnNpdGlvbmluZyB0bwotCSBVTkRFRklORUQuICBJ ZiBvbGRfdnItPnR5cGUgaXMgVkFSWUlORywgd2Ugc2hvdWxkbid0IGJlCi0JIGNhbGxlZCwgaWYg d2UgYXJlIGFueXdheSwga2VlcCBpdCBWQVJZSU5HLiAgKi8KLSAgICAgIGlmIChvbGRfdnItPnZh cnlpbmdfcCAoKSkKLQl7Ci0JICBuZXdfdnItPnNldF92YXJ5aW5nIChUUkVFX1RZUEUgKHZhcikp OwotCSAgaXNfbmV3ID0gZmFsc2U7Ci0JfQotICAgICAgZWxzZSBpZiAobmV3X3ZyLT51bmRlZmlu ZWRfcCAoKSkKLQl7Ci0JICBvbGRfdnItPnNldF92YXJ5aW5nIChUUkVFX1RZUEUgKHZhcikpOwot CSAgbmV3X3ZyLT5zZXRfdmFyeWluZyAoVFJFRV9UWVBFICh2YXIpKTsKLQkgIHJldHVybiB0cnVl OwotCX0KLSAgICAgIGVsc2UKLQlvbGRfdnItPnNldCAobmV3X3ZyLT5taW4gKCksIG5ld192ci0+ bWF4ICgpLCBuZXdfdnItPmVxdWl2ICgpLAotCQkgICAgIG5ld192ci0+a2luZCAoKSk7Ci0gICAg fQotCi0gIG5ld192ci0+ZXF1aXZfY2xlYXIgKCk7Ci0KLSAgcmV0dXJuIGlzX25ldzsKLX0KLQot LyogUmV0dXJuIHRydWUgaWYgdmFsdWUgcmFuZ2UgVlIgaW52b2x2ZXMgZXhhY3RseSBvbmUgc3lt Ym9sIFNZTS4gICovCi0KLXN0YXRpYyBib29sCi1zeW1ib2xpY19yYW5nZV9iYXNlZF9vbl9wICh2 YWx1ZV9yYW5nZSAqdnIsIGNvbnN0X3RyZWUgc3ltKQotewotICBib29sIG5lZywgbWluX2hhc19z eW1ib2wsIG1heF9oYXNfc3ltYm9sOwotICB0cmVlIGludjsKLQotICBpZiAoaXNfZ2ltcGxlX21p bl9pbnZhcmlhbnQgKHZyLT5taW4gKCkpKQotICAgIG1pbl9oYXNfc3ltYm9sID0gZmFsc2U7Ci0g IGVsc2UgaWYgKGdldF9zaW5nbGVfc3ltYm9sICh2ci0+bWluICgpLCAmbmVnLCAmaW52KSA9PSBz eW0pCi0gICAgbWluX2hhc19zeW1ib2wgPSB0cnVlOwotICBlbHNlCi0gICAgcmV0dXJuIGZhbHNl OwotCi0gIGlmIChpc19naW1wbGVfbWluX2ludmFyaWFudCAodnItPm1heCAoKSkpCi0gICAgbWF4 X2hhc19zeW1ib2wgPSBmYWxzZTsKLSAgZWxzZSBpZiAoZ2V0X3NpbmdsZV9zeW1ib2wgKHZyLT5t YXggKCksICZuZWcsICZpbnYpID09IHN5bSkKLSAgICBtYXhfaGFzX3N5bWJvbCA9IHRydWU7Ci0g IGVsc2UKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIChtaW5faGFzX3N5bWJvbCB8fCBt YXhfaGFzX3N5bWJvbCk7Ci19Ci0KLS8qIFJldHVybiB0cnVlIGlmIHRoZSByZXN1bHQgb2YgYXNz aWdubWVudCBTVE1UIGlzIGtub3cgdG8gYmUgbm9uLXplcm8uICAqLwotCi1zdGF0aWMgYm9vbAot Z2ltcGxlX2Fzc2lnbl9ub256ZXJvX3AgKGdpbXBsZSAqc3RtdCkKLXsKLSAgZW51bSB0cmVlX2Nv ZGUgY29kZSA9IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0bXQpOwotICBib29sIHN0cmljdF9v dmVyZmxvd19wOwotICB0cmVlIHR5cGUgPSBUUkVFX1RZUEUgKGdpbXBsZV9hc3NpZ25fbGhzIChz dG10KSk7Ci0gIHN3aXRjaCAoZ2V0X2dpbXBsZV9yaHNfY2xhc3MgKGNvZGUpKQotICAgIHsKLSAg ICBjYXNlIEdJTVBMRV9VTkFSWV9SSFM6Ci0gICAgICByZXR1cm4gdHJlZV91bmFyeV9ub256ZXJv X3dhcm52X3AgKGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0bXQpLAotCQkJCQkgdHlwZSwKLQkJ CQkJIGdpbXBsZV9hc3NpZ25fcmhzMSAoc3RtdCksCi0JCQkJCSAmc3RyaWN0X292ZXJmbG93X3Ap OwotICAgIGNhc2UgR0lNUExFX0JJTkFSWV9SSFM6Ci0gICAgICByZXR1cm4gdHJlZV9iaW5hcnlf bm9uemVyb193YXJudl9wIChnaW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KSwKLQkJCQkJICB0 eXBlLAotCQkJCQkgIGdpbXBsZV9hc3NpZ25fcmhzMSAoc3RtdCksCi0JCQkJCSAgZ2ltcGxlX2Fz c2lnbl9yaHMyIChzdG10KSwKLQkJCQkJICAmc3RyaWN0X292ZXJmbG93X3ApOwotICAgIGNhc2Ug R0lNUExFX1RFUk5BUllfUkhTOgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgR0lNUExF X1NJTkdMRV9SSFM6Ci0gICAgICByZXR1cm4gdHJlZV9zaW5nbGVfbm9uemVyb193YXJudl9wIChn aW1wbGVfYXNzaWduX3JoczEgKHN0bXQpLAotCQkJCQkgICZzdHJpY3Rfb3ZlcmZsb3dfcCk7Ci0g ICAgY2FzZSBHSU1QTEVfSU5WQUxJRF9SSFM6Ci0gICAgICBnY2NfdW5yZWFjaGFibGUgKCk7Ci0g ICAgZGVmYXVsdDoKLSAgICAgIGdjY191bnJlYWNoYWJsZSAoKTsKLSAgICB9Ci19Ci0KLS8qIFJl dHVybiB0cnVlIGlmIFNUTVQgaXMga25vd24gdG8gY29tcHV0ZSBhIG5vbi16ZXJvIHZhbHVlLiAg Ki8KLQotc3RhdGljIGJvb2wKLWdpbXBsZV9zdG10X25vbnplcm9fcCAoZ2ltcGxlICpzdG10KQot ewotICBzd2l0Y2ggKGdpbXBsZV9jb2RlIChzdG10KSkKLSAgICB7Ci0gICAgY2FzZSBHSU1QTEVf QVNTSUdOOgotICAgICAgcmV0dXJuIGdpbXBsZV9hc3NpZ25fbm9uemVyb19wIChzdG10KTsKLSAg ICBjYXNlIEdJTVBMRV9DQUxMOgotICAgICAgewotICAgICAgICBnY2FsbCAqY2FsbF9zdG10ID0g YXNfYTxnY2FsbCAqPiAoc3RtdCk7Ci0JcmV0dXJuIChnaW1wbGVfY2FsbF9ub25udWxsX3Jlc3Vs dF9wIChjYWxsX3N0bXQpCi0JCXx8IGdpbXBsZV9jYWxsX25vbm51bGxfYXJnIChjYWxsX3N0bXQp KTsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgZ2NjX3VucmVhY2hhYmxlICgpOwotICAg IH0KLX0KLS8qIExpa2UgdHJlZV9leHByX25vbnplcm9fcCwgYnV0IHRoaXMgZnVuY3Rpb24gdXNl cyB2YWx1ZSByYW5nZXMKLSAgIG9idGFpbmVkIHNvIGZhci4gICovCi0KLWJvb2wKLXZyX3ZhbHVl czo6dnJwX3N0bXRfY29tcHV0ZXNfbm9uemVybyAoZ2ltcGxlICpzdG10KQotewotICBpZiAoZ2lt cGxlX3N0bXRfbm9uemVyb19wIChzdG10KSkKLSAgICByZXR1cm4gdHJ1ZTsKLQotICAvKiBJZiB3 ZSBoYXZlIGFuIGV4cHJlc3Npb24gb2YgdGhlIGZvcm0gJlgtPmEsIHRoZW4gdGhlIGV4cHJlc3Np b24KLSAgICAgaXMgbm9ubnVsbCBpZiBYIGlzIG5vbm51bGwuICAqLwotICBpZiAoaXNfZ2ltcGxl X2Fzc2lnbiAoc3RtdCkKLSAgICAgICYmIGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0bXQpID09 IEFERFJfRVhQUikKLSAgICB7Ci0gICAgICB0cmVlIGV4cHIgPSBnaW1wbGVfYXNzaWduX3JoczEg KHN0bXQpOwotICAgICAgcG9seV9pbnQ2NCBiaXRzaXplLCBiaXRwb3M7Ci0gICAgICB0cmVlIG9m ZnNldDsKLSAgICAgIG1hY2hpbmVfbW9kZSBtb2RlOwotICAgICAgaW50IHVuc2lnbmVkcCwgcmV2 ZXJzZXAsIHZvbGF0aWxlcDsKLSAgICAgIHRyZWUgYmFzZSA9IGdldF9pbm5lcl9yZWZlcmVuY2Ug KFRSRUVfT1BFUkFORCAoZXhwciwgMCksICZiaXRzaXplLAotCQkJCSAgICAgICAmYml0cG9zLCAm b2Zmc2V0LCAmbW9kZSwgJnVuc2lnbmVkcCwKLQkJCQkgICAgICAgJnJldmVyc2VwLCAmdm9sYXRp bGVwKTsKLQotICAgICAgaWYgKGJhc2UgIT0gTlVMTF9UUkVFCi0JICAmJiBUUkVFX0NPREUgKGJh c2UpID09IE1FTV9SRUYKLQkgICYmIFRSRUVfQ09ERSAoVFJFRV9PUEVSQU5EIChiYXNlLCAwKSkg PT0gU1NBX05BTUUpCi0JewotCSAgcG9seV9vZmZzZXRfaW50IG9mZiA9IDA7Ci0JICBib29sIG9m Zl9jc3QgPSBmYWxzZTsKLQkgIGlmIChvZmZzZXQgPT0gTlVMTF9UUkVFIHx8IFRSRUVfQ09ERSAo b2Zmc2V0KSA9PSBJTlRFR0VSX0NTVCkKLQkgICAgewotCSAgICAgIG9mZiA9IG1lbV9yZWZfb2Zm c2V0IChiYXNlKTsKLQkgICAgICBpZiAob2Zmc2V0KQotCQlvZmYgKz0gcG9seV9vZmZzZXRfaW50 Ojpmcm9tICh3aTo6dG9fcG9seV93aWRlIChvZmZzZXQpLAotCQkJCQkgICAgICBTSUdORUQpOwot CSAgICAgIG9mZiA8PD0gTE9HMl9CSVRTX1BFUl9VTklUOwotCSAgICAgIG9mZiArPSBiaXRwb3M7 Ci0JICAgICAgb2ZmX2NzdCA9IHRydWU7Ci0JICAgIH0KLQkgIC8qIElmICZYLT5hIGlzIGVxdWFs IHRvIFggYW5kIFggaXMgflswLCAwXSwgdGhlIHJlc3VsdCBpcyB0b28uCi0JICAgICBGb3IgLWZk ZWxldGUtbnVsbC1wb2ludGVyLWNoZWNrcyAtZm5vLXdyYXB2LXBvaW50ZXIgd2UgZG9uJ3QKLQkg ICAgIGFsbG93IGdvaW5nIGZyb20gbm9uLU5VTEwgcG9pbnRlciB0byBOVUxMLiAgKi8KLQkgIGlm ICgob2ZmX2NzdCAmJiBrbm93bl9lcSAob2ZmLCAwKSkKLQkgICAgICB8fCAoZmxhZ19kZWxldGVf bnVsbF9wb2ludGVyX2NoZWNrcwotCQkgICYmICFUWVBFX09WRVJGTE9XX1dSQVBTIChUUkVFX1RZ UEUgKGV4cHIpKSkpCi0JICAgIHsKLQkgICAgICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnIK LQkJPSBnZXRfdmFsdWVfcmFuZ2UgKFRSRUVfT1BFUkFORCAoYmFzZSwgMCksIHN0bXQpOwotCSAg ICAgIGlmICghcmFuZ2VfaW5jbHVkZXNfemVyb19wICh2cikpCi0JCXJldHVybiB0cnVlOwotCSAg ICB9Ci0JICAvKiBJZiBNRU1fUkVGIGhhcyBhICJwb3NpdGl2ZSIgb2Zmc2V0LCBjb25zaWRlciBp dCBub24tTlVMTAotCSAgICAgYWx3YXlzLCBmb3IgLWZkZWxldGUtbnVsbC1wb2ludGVyLWNoZWNr cyBhbHNvICJuZWdhdGl2ZSIKLQkgICAgIG9uZXMuICBQdW50IGZvciB1bmtub3duIG9mZnNldHMg KGUuZy4gdmFyaWFibGUgb25lcykuICAqLwotCSAgaWYgKCFUWVBFX09WRVJGTE9XX1dSQVBTIChU UkVFX1RZUEUgKGV4cHIpKQotCSAgICAgICYmIG9mZl9jc3QKLQkgICAgICAmJiBrbm93bl9uZSAo b2ZmLCAwKQotCSAgICAgICYmIChmbGFnX2RlbGV0ZV9udWxsX3BvaW50ZXJfY2hlY2tzIHx8IGtu b3duX2d0IChvZmYsIDApKSkKLQkgICAgcmV0dXJuIHRydWU7Ci0JfQotICAgIH0KLQotICByZXR1 cm4gZmFsc2U7Ci19Ci0KIC8qIFJldHVybnMgdHJ1ZSBpZiBFWFBSIGlzIGEgdmFsaWQgdmFsdWUg KGFzIGV4cGVjdGVkIGJ5IGNvbXBhcmVfdmFsdWVzKSAtLQogICAgYSBnaW1wbGUgaW52YXJpYW50 LCBvciBTU0FfTkFNRSArLSBDU1QuICAqLwogCkBAIC00NzgsMjUgKzY5LDYgQEAgdmFsaWRfdmFs dWVfcCAodHJlZSBleHByKQogICByZXR1cm4gaXNfZ2ltcGxlX21pbl9pbnZhcmlhbnQgKGV4cHIp OwogfQogCi0vKiBJZiBPUCBoYXMgYSB2YWx1ZSByYW5nZSB3aXRoIGEgc2luZ2xlIGNvbnN0YW50 IHZhbHVlIHJldHVybiB0aGF0LAotICAgb3RoZXJ3aXNlIHJldHVybiBOVUxMX1RSRUUuICBUaGlz IHJldHVybnMgT1AgaXRzZWxmIGlmIE9QIGlzIGEKLSAgIGNvbnN0YW50LiAgKi8KLQotdHJlZQot dnJfdmFsdWVzOjpvcF93aXRoX2NvbnN0YW50X3NpbmdsZXRvbl92YWx1ZV9yYW5nZSAodHJlZSBv cCkKLXsKLSAgaWYgKGlzX2dpbXBsZV9taW5faW52YXJpYW50IChvcCkpCi0gICAgcmV0dXJuIG9w OwotCi0gIGlmIChUUkVFX0NPREUgKG9wKSAhPSBTU0FfTkFNRSkKLSAgICByZXR1cm4gTlVMTF9U UkVFOwotCi0gIHRyZWUgdDsKLSAgaWYgKGdldF92YWx1ZV9yYW5nZSAob3ApLT5zaW5nbGV0b25f cCAoJnQpKQotICAgIHJldHVybiB0OwotICByZXR1cm4gTlVMTDsKLX0KLQogLyogUmV0dXJuIHRy dWUgaWYgb3AgaXMgaW4gYSBib29sZWFuIFswLCAxXSB2YWx1ZS1yYW5nZS4gICovCiAKIGJvb2wK QEAgLTUxOSw1NDkgKzkxLDYgQEAgc2ltcGxpZnlfdXNpbmdfcmFuZ2VzOjpvcF93aXRoX2Jvb2xl YW5fdmFsdWVfcmFuZ2VfcCAodHJlZSBvcCwgZ2ltcGxlICpzKQogCQkJICAgICBidWlsZF9vbmVf Y3N0IChUUkVFX1RZUEUgKG9wKSkpOwogfQogCi0vKiBFeHRyYWN0IHZhbHVlIHJhbmdlIGluZm9y bWF0aW9uIGZvciBWQVIgd2hlbiAoT1AgQ09ORF9DT0RFIExJTUlUKSBpcwotICAgdHJ1ZSBhbmQg c3RvcmUgaXQgaW4gKlZSX1AuICAqLwotCi12b2lkCi12cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2Vf Zm9yX3Zhcl9mcm9tX2NvbXBhcmlzb25fZXhwciAodHJlZSB2YXIsCi0JCQkJCQkgICAgICAgZW51 bSB0cmVlX2NvZGUgY29uZF9jb2RlLAotCQkJCQkJICAgICAgIHRyZWUgb3AsIHRyZWUgbGltaXQs Ci0JCQkJCQkgICAgICAgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyX3ApCi17Ci0gIHRyZWUgIG1pbiwg bWF4LCB0eXBlOwotICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqbGltaXRfdnI7Ci0gIHR5cGUg PSBUUkVFX1RZUEUgKHZhcik7Ci0KLSAgLyogRm9yIHBvaW50ZXIgYXJpdGhtZXRpYywgd2Ugb25s eSBrZWVwIHRyYWNrIG9mIHBvaW50ZXIgZXF1YWxpdHkKLSAgICAgYW5kIGluZXF1YWxpdHkuICBJ ZiB3ZSBhcnJpdmUgaGVyZSB3aXRoIHVuZm9sZGVkIGNvbmRpdGlvbnMgbGlrZQotICAgICBfMSA+ IF8xIGRvIG5vdCBkZXJpdmUgYW55dGhpbmcuICAqLwotICBpZiAoKFBPSU5URVJfVFlQRV9QICh0 eXBlKSAmJiBjb25kX2NvZGUgIT0gTkVfRVhQUiAmJiBjb25kX2NvZGUgIT0gRVFfRVhQUikKLSAg ICAgIHx8IGxpbWl0ID09IHZhcikKLSAgICB7Ci0gICAgICB2cl9wLT5zZXRfdmFyeWluZyAodHlw ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gIC8qIElmIExJTUlUIGlzIGFub3RoZXIgU1NB IG5hbWUgYW5kIExJTUlUIGhhcyBhIHJhbmdlIG9mIGl0cyBvd24sCi0gICAgIHRyeSB0byB1c2Ug TElNSVQncyByYW5nZSB0byBhdm9pZCBjcmVhdGluZyBzeW1ib2xpYyByYW5nZXMKLSAgICAgdW5u ZWNlc3NhcmlseS4gKi8KLSAgbGltaXRfdnIgPSAoVFJFRV9DT0RFIChsaW1pdCkgPT0gU1NBX05B TUUpID8gZ2V0X3ZhbHVlX3JhbmdlIChsaW1pdCkgOiBOVUxMOwotCi0gIC8qIExJTUlUJ3MgcmFu Z2UgaXMgb25seSBpbnRlcmVzdGluZyBpZiBpdCBoYXMgYW55IHVzZWZ1bCBpbmZvcm1hdGlvbi4g ICovCi0gIGlmICghIGxpbWl0X3ZyCi0gICAgICB8fCBsaW1pdF92ci0+dW5kZWZpbmVkX3AgKCkK LSAgICAgIHx8IGxpbWl0X3ZyLT52YXJ5aW5nX3AgKCkKLSAgICAgIHx8IChsaW1pdF92ci0+c3lt Ym9saWNfcCAoKQotCSAgJiYgISAobGltaXRfdnItPmtpbmQgKCkgPT0gVlJfUkFOR0UKLQkJJiYg KGxpbWl0X3ZyLT5taW4gKCkgPT0gbGltaXRfdnItPm1heCAoKQotCQkgICAgfHwgb3BlcmFuZF9l cXVhbF9wIChsaW1pdF92ci0+bWluICgpLAotCQkJCQlsaW1pdF92ci0+bWF4ICgpLCAwKSkpKSkK LSAgICBsaW1pdF92ciA9IE5VTEw7Ci0KLSAgLyogSW5pdGlhbGx5LCB0aGUgbmV3IHJhbmdlIGhh cyB0aGUgc2FtZSBzZXQgb2YgZXF1aXZhbGVuY2VzIG9mCi0gICAgIFZBUidzIHJhbmdlLiAgVGhp cyB3aWxsIGJlIHJldmlzZWQgYmVmb3JlIHJldHVybmluZyB0aGUgZmluYWwKLSAgICAgdmFsdWUu ICBTaW5jZSBhc3NlcnRpb25zIG1heSBiZSBjaGFpbmVkIHZpYSBtdXR1YWxseSBleGNsdXNpdmUK LSAgICAgcHJlZGljYXRlcywgd2Ugd2lsbCBuZWVkIHRvIHRyaW0gdGhlIHNldCBvZiBlcXVpdmFs ZW5jZXMgYmVmb3JlCi0gICAgIHdlIGFyZSBkb25lLiAgKi8KLSAgZ2NjX2Fzc2VydCAodnJfcC0+ ZXF1aXYgKCkgPT0gTlVMTCk7Ci0gIHZyX3AtPmVxdWl2X2FkZCAodmFyLCBnZXRfdmFsdWVfcmFu Z2UgKHZhciksICZ2cnBfZXF1aXZfb2JzdGFjayk7Ci0KLSAgLyogRXh0cmFjdCBhIG5ldyByYW5n ZSBiYXNlZCBvbiB0aGUgYXNzZXJ0ZWQgY29tcGFyaXNvbiBmb3IgVkFSIGFuZAotICAgICBMSU1J VCdzIHZhbHVlIHJhbmdlLiAgTm90aWNlIHRoYXQgaWYgTElNSVQgaGFzIGFuIGFudGktcmFuZ2Us IHdlCi0gICAgIHdpbGwgb25seSB1c2UgaXQgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zIChFUV9F WFBSKS4gIEZvciBhbnkKLSAgICAgb3RoZXIga2luZCBvZiBhc3NlcnRpb24sIHdlIGNhbm5vdCBk ZXJpdmUgYSByYW5nZSBmcm9tIExJTUlUJ3MKLSAgICAgYW50aS1yYW5nZSB0aGF0IGNhbiBiZSB1 c2VkIHRvIGRlc2NyaWJlIHRoZSBuZXcgcmFuZ2UuICBGb3IKLSAgICAgaW5zdGFuY2UsIEFTU0VS VF9FWFBSIDx4XzIsIHhfMiA8PSBiXzQ+LiAgSWYgYl80IGlzIH5bMiwgMTBdLAotICAgICB0aGVu IGJfNCB0YWtlcyBvbiB0aGUgcmFuZ2VzIFstSU5GLCAxXSBhbmQgWzExLCArSU5GXS4gIFRoZXJl IGlzCi0gICAgIG5vIHNpbmdsZSByYW5nZSBmb3IgeF8yIHRoYXQgY291bGQgZGVzY3JpYmUgTEVf RVhQUiwgc28gd2UgbWlnaHQKLSAgICAgYXMgd2VsbCBidWlsZCB0aGUgcmFuZ2UgW2JfNCwgK0lO Rl0gZm9yIGl0LgotICAgICBPbmUgc3BlY2lhbCBjYXNlIHdlIGhhbmRsZSBpcyBleHRyYWN0aW5n IGEgcmFuZ2UgZnJvbSBhCi0gICAgIHJhbmdlIHRlc3QgZW5jb2RlZCBhcyAodW5zaWduZWQpdmFy ICsgQ1NUIDw9IGxpbWl0LiAgKi8KLSAgaWYgKFRSRUVfQ09ERSAob3ApID09IE5PUF9FWFBSCi0g ICAgICB8fCBUUkVFX0NPREUgKG9wKSA9PSBQTFVTX0VYUFIpCi0gICAgewotICAgICAgaWYgKFRS RUVfQ09ERSAob3ApID09IFBMVVNfRVhQUikKLSAgICAgICAgewotCSAgbWluID0gZm9sZF9idWls ZDEgKE5FR0FURV9FWFBSLCBUUkVFX1RZUEUgKFRSRUVfT1BFUkFORCAob3AsIDEpKSwKLQkJCSAg ICAgVFJFRV9PUEVSQU5EIChvcCwgMSkpOwotICAgICAgICAgIG1heCA9IGludF9jb25zdF9iaW5v cCAoUExVU19FWFBSLCBsaW1pdCwgbWluKTsKLQkgIG9wID0gVFJFRV9PUEVSQU5EIChvcCwgMCk7 Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIG1pbiA9IGJ1aWxkX2ludF9jc3QgKFRSRUVfVFlQRSAo dmFyKSwgMCk7Ci0JICBtYXggPSBsaW1pdDsKLQl9Ci0KLSAgICAgIC8qIE1ha2Ugc3VyZSB0byBu b3Qgc2V0IFRSRUVfT1ZFUkZMT1cgb24gdGhlIGZpbmFsIHR5cGUKLQkgY29udmVyc2lvbi4gIFdl IGFyZSB3aWxsaW5nbHkgaW50ZXJwcmV0aW5nIGxhcmdlIHBvc2l0aXZlCi0JIHVuc2lnbmVkIHZh bHVlcyBhcyBuZWdhdGl2ZSBzaWduZWQgdmFsdWVzIGhlcmUuICAqLwotICAgICAgbWluID0gZm9y Y2VfZml0X3R5cGUgKFRSRUVfVFlQRSAodmFyKSwgd2k6OnRvX3dpZGVzdCAobWluKSwgMCwgZmFs c2UpOwotICAgICAgbWF4ID0gZm9yY2VfZml0X3R5cGUgKFRSRUVfVFlQRSAodmFyKSwgd2k6OnRv X3dpZGVzdCAobWF4KSwgMCwgZmFsc2UpOwotCi0gICAgICAvKiBXZSBjYW4gdHJhbnNmb3JtIGEg bWF4LCBtaW4gcmFuZ2UgdG8gYW4gYW50aS1yYW5nZSBvcgotICAgICAgICAgdmljZS12ZXJzYS4g IFVzZSBzZXRfYW5kX2Nhbm9uaWNhbGl6ZSB3aGljaCBkb2VzIHRoaXMgZm9yCi0gICAgICAgICB1 cy4gICovCi0gICAgICBpZiAoY29uZF9jb2RlID09IExFX0VYUFIpCi0JdnJfcC0+c2V0IChtaW4s IG1heCwgdnJfcC0+ZXF1aXYgKCkpOwotICAgICAgZWxzZSBpZiAoY29uZF9jb2RlID09IEdUX0VY UFIpCi0JdnJfcC0+c2V0IChtaW4sIG1heCwgdnJfcC0+ZXF1aXYgKCksIFZSX0FOVElfUkFOR0Up OwotICAgICAgZWxzZQotCWdjY191bnJlYWNoYWJsZSAoKTsKLSAgICB9Ci0gIGVsc2UgaWYgKGNv bmRfY29kZSA9PSBFUV9FWFBSKQotICAgIHsKLSAgICAgIGVudW0gdmFsdWVfcmFuZ2Vfa2luZCBy YW5nZV9raW5kOwotCi0gICAgICBpZiAobGltaXRfdnIpCi0JewotCSAgcmFuZ2Vfa2luZCA9IGxp bWl0X3ZyLT5raW5kICgpOwotCSAgbWluID0gbGltaXRfdnItPm1pbiAoKTsKLQkgIG1heCA9IGxp bWl0X3ZyLT5tYXggKCk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHJhbmdlX2tpbmQgPSBWUl9S QU5HRTsKLQkgIG1pbiA9IGxpbWl0OwotCSAgbWF4ID0gbGltaXQ7Ci0JfQotCi0gICAgICB2cl9w LT51cGRhdGUgKG1pbiwgbWF4LCByYW5nZV9raW5kKTsKLQotICAgICAgLyogV2hlbiBhc3NlcnRp bmcgdGhlIGVxdWFsaXR5IFZBUiA9PSBMSU1JVCBhbmQgTElNSVQgaXMgYW5vdGhlcgotCSBTU0Eg bmFtZSwgdGhlIG5ldyByYW5nZSB3aWxsIGFsc28gaW5oZXJpdCB0aGUgZXF1aXZhbGVuY2Ugc2V0 Ci0JIGZyb20gTElNSVQuICAqLwotICAgICAgaWYgKFRSRUVfQ09ERSAobGltaXQpID09IFNTQV9O QU1FKQotCXZyX3AtPmVxdWl2X2FkZCAobGltaXQsIGdldF92YWx1ZV9yYW5nZSAobGltaXQpLCAm dnJwX2VxdWl2X29ic3RhY2spOwotICAgIH0KLSAgZWxzZSBpZiAoY29uZF9jb2RlID09IE5FX0VY UFIpCi0gICAgewotICAgICAgLyogQXMgZGVzY3JpYmVkIGFib3ZlLCB3aGVuIExJTUlUJ3MgcmFu Z2UgaXMgYW4gYW50aS1yYW5nZSBhbmQKLQkgdGhpcyBhc3NlcnRpb24gaXMgYW4gaW5lcXVhbGl0 eSAoTkVfRVhQUiksIHRoZW4gd2UgY2Fubm90Ci0JIGRlcml2ZSBhbnl0aGluZyBmcm9tIHRoZSBh bnRpLXJhbmdlLiAgRm9yIGluc3RhbmNlLCBpZgotCSBMSU1JVCdzIHJhbmdlIHdhcyB+WzAsIDBd LCB0aGUgYXNzZXJ0aW9uICdWQVIgIT0gTElNSVQnIGRvZXMKLQkgbm90IGltcGx5IHRoYXQgVkFS J3MgcmFuZ2UgaXMgWzAsIDBdLiAgU28sIGluIHRoZSBjYXNlIG9mCi0JIGFudGktcmFuZ2VzLCB3 ZSBqdXN0IGFzc2VydCB0aGUgaW5lcXVhbGl0eSB1c2luZyBMSU1JVCBhbmQKLQkgbm90IGl0cyBh bnRpLXJhbmdlLgotCi0JIElmIExJTUlUX1ZSIGlzIGEgcmFuZ2UsIHdlIGNhbiBvbmx5IHVzZSBp dCB0byBidWlsZCBhIG5ldwotCSBhbnRpLXJhbmdlIGlmIExJTUlUX1ZSIGlzIGEgc2luZ2xlLXZh bHVlZCByYW5nZS4gIEZvcgotCSBpbnN0YW5jZSwgaWYgTElNSVRfVlIgaXMgWzAsIDFdLCB0aGUg cHJlZGljYXRlCi0JIFZBUiAhPSBbMCwgMV0gZG9lcyBub3QgbWVhbiB0aGF0IFZBUidzIHJhbmdl IGlzIH5bMCwgMV0uCi0JIFJhdGhlciwgaXQgbWVhbnMgdGhhdCBmb3IgdmFsdWUgMCBWQVIgc2hv dWxkIGJlIH5bMCwgMF0KLQkgYW5kIGZvciB2YWx1ZSAxLCBWQVIgc2hvdWxkIGJlIH5bMSwgMV0u ICBXZSBjYW5ub3QKLQkgcmVwcmVzZW50IHRoZXNlIHJhbmdlcy4KLQotCSBUaGUgb25seSBzaXR1 YXRpb24gaW4gd2hpY2ggd2UgY2FuIGJ1aWxkIGEgdmFsaWQKLQkgYW50aS1yYW5nZSBpcyB3aGVu IExJTUlUX1ZSIGlzIGEgc2luZ2xlLXZhbHVlZCByYW5nZQotCSAoaS5lLiwgTElNSVRfVlItPk1J TiA9PSBMSU1JVF9WUi0+TUFYKS4gIEluIHRoYXQgY2FzZSwKLQkgYnVpbGQgdGhlIGFudGktcmFu Z2UgfltMSU1JVF9WUi0+TUlOLCBMSU1JVF9WUi0+TUFYXS4gICovCi0gICAgICBpZiAobGltaXRf dnIKLQkgICYmIGxpbWl0X3ZyLT5raW5kICgpID09IFZSX1JBTkdFCi0JICAmJiBjb21wYXJlX3Zh bHVlcyAobGltaXRfdnItPm1pbiAoKSwgbGltaXRfdnItPm1heCAoKSkgPT0gMCkKLQl7Ci0JICBt aW4gPSBsaW1pdF92ci0+bWluICgpOwotCSAgbWF4ID0gbGltaXRfdnItPm1heCAoKTsKLQl9Ci0g ICAgICBlbHNlCi0JewotCSAgLyogSW4gYW55IG90aGVyIGNhc2UsIHdlIGNhbm5vdCB1c2UgTElN SVQncyByYW5nZSB0byBidWlsZCBhCi0JICAgICB2YWxpZCBhbnRpLXJhbmdlLiAgKi8KLQkgIG1p biA9IG1heCA9IGxpbWl0OwotCX0KLQotICAgICAgLyogSWYgTUlOIGFuZCBNQVggY292ZXIgdGhl IHdob2xlIHJhbmdlIGZvciB0aGVpciB0eXBlLCB0aGVuCi0JIGp1c3QgdXNlIHRoZSBvcmlnaW5h bCBMSU1JVC4gICovCi0gICAgICBpZiAoSU5URUdSQUxfVFlQRV9QICh0eXBlKQotCSAgJiYgdnJw X3ZhbF9pc19taW4gKG1pbikKLQkgICYmIHZycF92YWxfaXNfbWF4IChtYXgpKQotCW1pbiA9IG1h eCA9IGxpbWl0OwotCi0gICAgICB2cl9wLT5zZXQgKG1pbiwgbWF4LCB2cl9wLT5lcXVpdiAoKSwg VlJfQU5USV9SQU5HRSk7Ci0gICAgfQotICBlbHNlIGlmIChjb25kX2NvZGUgPT0gTEVfRVhQUiB8 fCBjb25kX2NvZGUgPT0gTFRfRVhQUikKLSAgICB7Ci0gICAgICBtaW4gPSBUWVBFX01JTl9WQUxV RSAodHlwZSk7Ci0KLSAgICAgIGlmIChsaW1pdF92ciA9PSBOVUxMIHx8IGxpbWl0X3ZyLT5raW5k ICgpID09IFZSX0FOVElfUkFOR0UpCi0JbWF4ID0gbGltaXQ7Ci0gICAgICBlbHNlCi0JewotCSAg LyogSWYgTElNSVRfVlIgaXMgb2YgdGhlIGZvcm0gW04xLCBOMl0sIHdlIG5lZWQgdG8gYnVpbGQg dGhlCi0JICAgICByYW5nZSBbTUlOLCBOMl0gZm9yIExFX0VYUFIgYW5kIFtNSU4sIE4yIC0gMV0g Zm9yCi0JICAgICBMVF9FWFBSLiAgKi8KLQkgIG1heCA9IGxpbWl0X3ZyLT5tYXggKCk7Ci0JfQot Ci0gICAgICAvKiBJZiB0aGUgbWF4aW11bSB2YWx1ZSBmb3JjZXMgdXMgdG8gYmUgb3V0IG9mIGJv dW5kcywgc2ltcGx5IHB1bnQuCi0JIEl0IHdvdWxkIGJlIHBvaW50bGVzcyB0byB0cnkgYW5kIGRv IGFueXRoaW5nIG1vcmUgc2luY2UgdGhpcwotCSBhbGwgc2hvdWxkIGJlIG9wdGltaXplZCBhd2F5 IGFib3ZlIHVzLiAgKi8KLSAgICAgIGlmIChjb25kX2NvZGUgPT0gTFRfRVhQUgotCSAgJiYgY29t cGFyZV92YWx1ZXMgKG1heCwgbWluKSA9PSAwKQotCXZyX3AtPnNldF92YXJ5aW5nIChUUkVFX1RZ UEUgKG1pbikpOwotICAgICAgZWxzZQotCXsKLQkgIC8qIEZvciBMVF9FWFBSLCB3ZSBjcmVhdGUg dGhlIHJhbmdlIFtNSU4sIE1BWCAtIDFdLiAgKi8KLQkgIGlmIChjb25kX2NvZGUgPT0gTFRfRVhQ UikKLQkgICAgewotCSAgICAgIGlmIChUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChtYXgpKSA9 PSAxCi0JCSAgJiYgIVRZUEVfVU5TSUdORUQgKFRSRUVfVFlQRSAobWF4KSkpCi0JCW1heCA9IGZv bGRfYnVpbGQyIChQTFVTX0VYUFIsIFRSRUVfVFlQRSAobWF4KSwgbWF4LAotCQkJCSAgIGJ1aWxk X2ludF9jc3QgKFRSRUVfVFlQRSAobWF4KSwgLTEpKTsKLQkgICAgICBlbHNlCi0JCW1heCA9IGZv bGRfYnVpbGQyIChNSU5VU19FWFBSLCBUUkVFX1RZUEUgKG1heCksIG1heCwKLQkJCQkgICBidWls ZF9pbnRfY3N0IChUUkVFX1RZUEUgKG1heCksIDEpKTsKLQkgICAgICAvKiBTaWduYWwgdG8gY29t cGFyZV92YWx1ZXNfd2FybnYgdGhpcyBleHByIGRvZXNuJ3Qgb3ZlcmZsb3cuICAqLwotCSAgICAg IGlmIChFWFBSX1AgKG1heCkpCi0JCXN1cHByZXNzX3dhcm5pbmcgKG1heCwgT1BUX1dvdmVyZmxv dyk7Ci0JICAgIH0KLQotCSAgdnJfcC0+dXBkYXRlIChtaW4sIG1heCk7Ci0JfQotICAgIH0KLSAg ZWxzZSBpZiAoY29uZF9jb2RlID09IEdFX0VYUFIgfHwgY29uZF9jb2RlID09IEdUX0VYUFIpCi0g ICAgewotICAgICAgbWF4ID0gVFlQRV9NQVhfVkFMVUUgKHR5cGUpOwotCi0gICAgICBpZiAobGlt aXRfdnIgPT0gTlVMTCB8fCBsaW1pdF92ci0+a2luZCAoKSA9PSBWUl9BTlRJX1JBTkdFKQotCW1p biA9IGxpbWl0OwotICAgICAgZWxzZQotCXsKLQkgIC8qIElmIExJTUlUX1ZSIGlzIG9mIHRoZSBm b3JtIFtOMSwgTjJdLCB3ZSBuZWVkIHRvIGJ1aWxkIHRoZQotCSAgICAgcmFuZ2UgW04xLCBNQVhd IGZvciBHRV9FWFBSIGFuZCBbTjEgKyAxLCBNQVhdIGZvcgotCSAgICAgR1RfRVhQUi4gICovCi0J ICBtaW4gPSBsaW1pdF92ci0+bWluICgpOwotCX0KLQotICAgICAgLyogSWYgdGhlIG1pbmltdW0g dmFsdWUgZm9yY2VzIHVzIHRvIGJlIG91dCBvZiBib3VuZHMsIHNpbXBseSBwdW50LgotCSBJdCB3 b3VsZCBiZSBwb2ludGxlc3MgdG8gdHJ5IGFuZCBkbyBhbnl0aGluZyBtb3JlIHNpbmNlIHRoaXMK LQkgYWxsIHNob3VsZCBiZSBvcHRpbWl6ZWQgYXdheSBhYm92ZSB1cy4gICovCi0gICAgICBpZiAo Y29uZF9jb2RlID09IEdUX0VYUFIKLQkgICYmIGNvbXBhcmVfdmFsdWVzIChtaW4sIG1heCkgPT0g MCkKLQl2cl9wLT5zZXRfdmFyeWluZyAoVFJFRV9UWVBFIChtaW4pKTsKLSAgICAgIGVsc2UKLQl7 Ci0JICAvKiBGb3IgR1RfRVhQUiwgd2UgY3JlYXRlIHRoZSByYW5nZSBbTUlOICsgMSwgTUFYXS4g ICovCi0JICBpZiAoY29uZF9jb2RlID09IEdUX0VYUFIpCi0JICAgIHsKLQkgICAgICBpZiAoVFlQ RV9QUkVDSVNJT04gKFRSRUVfVFlQRSAobWluKSkgPT0gMQotCQkgICYmICFUWVBFX1VOU0lHTkVE IChUUkVFX1RZUEUgKG1pbikpKQotCQltaW4gPSBmb2xkX2J1aWxkMiAoTUlOVVNfRVhQUiwgVFJF RV9UWVBFIChtaW4pLCBtaW4sCi0JCQkJICAgYnVpbGRfaW50X2NzdCAoVFJFRV9UWVBFIChtaW4p LCAtMSkpOwotCSAgICAgIGVsc2UKLQkJbWluID0gZm9sZF9idWlsZDIgKFBMVVNfRVhQUiwgVFJF RV9UWVBFIChtaW4pLCBtaW4sCi0JCQkJICAgYnVpbGRfaW50X2NzdCAoVFJFRV9UWVBFIChtaW4p LCAxKSk7Ci0JICAgICAgLyogU2lnbmFsIHRvIGNvbXBhcmVfdmFsdWVzX3dhcm52IHRoaXMgZXhw ciBkb2Vzbid0IG92ZXJmbG93LiAgKi8KLQkgICAgICBpZiAoRVhQUl9QIChtaW4pKQotCQlzdXBw cmVzc193YXJuaW5nIChtaW4sIE9QVF9Xb3ZlcmZsb3cpOwotCSAgICB9Ci0KLQkgIHZyX3AtPnVw ZGF0ZSAobWluLCBtYXgpOwotCX0KLSAgICB9Ci0gIGVsc2UKLSAgICBnY2NfdW5yZWFjaGFibGUg KCk7Ci0KLSAgLyogRmluYWxseSBpbnRlcnNlY3QgdGhlIG5ldyByYW5nZSB3aXRoIHdoYXQgd2Ug YWxyZWFkeSBrbm93IGFib3V0IHZhci4gICovCi0gIHZyX3AtPmxlZ2FjeV92ZXJib3NlX2ludGVy c2VjdCAoZ2V0X3ZhbHVlX3JhbmdlICh2YXIpKTsKLX0KLQotLyogRXh0cmFjdCB2YWx1ZSByYW5n ZSBpbmZvcm1hdGlvbiBmcm9tIGFuIEFTU0VSVF9FWFBSIEVYUFIgYW5kIHN0b3JlCi0gICBpdCBp biAqVlJfUC4gICovCi0KLXZvaWQKLXZyX3ZhbHVlczo6ZXh0cmFjdF9yYW5nZV9mcm9tX2Fzc2Vy dCAodmFsdWVfcmFuZ2VfZXF1aXYgKnZyX3AsIHRyZWUgZXhwcikKLXsKLSAgdHJlZSB2YXIgPSBB U1NFUlRfRVhQUl9WQVIgKGV4cHIpOwotICB0cmVlIGNvbmQgPSBBU1NFUlRfRVhQUl9DT05EIChl eHByKTsKLSAgdHJlZSBsaW1pdCwgb3A7Ci0gIGVudW0gdHJlZV9jb2RlIGNvbmRfY29kZTsKLSAg Z2NjX2Fzc2VydCAoQ09NUEFSSVNPTl9DTEFTU19QIChjb25kKSk7Ci0KLSAgLyogRmluZCBWQVIg aW4gdGhlIEFTU0VSVF9FWFBSIGNvbmRpdGlvbmFsLiAgKi8KLSAgaWYgKHZhciA9PSBUUkVFX09Q RVJBTkQgKGNvbmQsIDApCi0gICAgICB8fCBUUkVFX0NPREUgKFRSRUVfT1BFUkFORCAoY29uZCwg MCkpID09IFBMVVNfRVhQUgotICAgICAgfHwgVFJFRV9DT0RFIChUUkVFX09QRVJBTkQgKGNvbmQs IDApKSA9PSBOT1BfRVhQUikKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgcHJlZGljYXRlIGlzIG9m IHRoZSBmb3JtIFZBUiBDT01QIExJTUlULCB0aGVuIHdlIGp1c3QKLQkgdGFrZSBMSU1JVCBmcm9t IHRoZSBSSFMgYW5kIHVzZSB0aGUgc2FtZSBjb21wYXJpc29uIGNvZGUuICAqLwotICAgICAgY29u ZF9jb2RlID0gVFJFRV9DT0RFIChjb25kKTsKLSAgICAgIGxpbWl0ID0gVFJFRV9PUEVSQU5EIChj b25kLCAxKTsKLSAgICAgIG9wID0gVFJFRV9PUEVSQU5EIChjb25kLCAwKTsKLSAgICB9Ci0gIGVs c2UKLSAgICB7Ci0gICAgICAvKiBJZiB0aGUgcHJlZGljYXRlIGlzIG9mIHRoZSBmb3JtIExJTUlU IENPTVAgVkFSLCB0aGVuIHdlIG5lZWQKLQkgdG8gZmxpcCBhcm91bmQgdGhlIGNvbXBhcmlzb24g Y29kZSB0byBjcmVhdGUgdGhlIHByb3BlciByYW5nZQotCSBmb3IgVkFSLiAgKi8KLSAgICAgIGNv bmRfY29kZSA9IHN3YXBfdHJlZV9jb21wYXJpc29uIChUUkVFX0NPREUgKGNvbmQpKTsKLSAgICAg IGxpbWl0ID0gVFJFRV9PUEVSQU5EIChjb25kLCAwKTsKLSAgICAgIG9wID0gVFJFRV9PUEVSQU5E IChjb25kLCAxKTsKLSAgICB9Ci0gIGV4dHJhY3RfcmFuZ2VfZm9yX3Zhcl9mcm9tX2NvbXBhcmlz b25fZXhwciAodmFyLCBjb25kX2NvZGUsIG9wLAotCQkJCQkgICAgICBsaW1pdCwgdnJfcCk7Ci19 Ci0KLS8qIEV4dHJhY3QgcmFuZ2UgaW5mb3JtYXRpb24gZnJvbSBTU0EgbmFtZSBWQVIgYW5kIHN0 b3JlIGl0IGluIFZSLiAgSWYKLSAgIFZBUiBoYXMgYW4gaW50ZXJlc3RpbmcgcmFuZ2UsIHVzZSBp dC4gIE90aGVyd2lzZSwgY3JlYXRlIHRoZQotICAgcmFuZ2UgW1ZBUiwgVkFSXSBhbmQgcmV0dXJu IGl0LiAgVGhpcyBpcyB1c2VmdWwgaW4gc2l0dWF0aW9ucyB3aGVyZQotICAgd2UgbWF5IGhhdmUg Y29uZGl0aW9uYWxzIHRlc3RpbmcgdmFsdWVzIG9mIFZBUllJTkcgbmFtZXMuICBGb3IKLSAgIGlu c3RhbmNlLAotCi0gICAJeF8zID0geV81OwotCWlmICh4XzMgPiB5XzUpCi0JICAuLi4KLQotICAg IEV2ZW4gaWYgeV81IGlzIGRlZW1lZCBWQVJZSU5HLCB3ZSBjYW4gZGV0ZXJtaW5lIHRoYXQgeF8z ID4geV81IGlzCi0gICAgYWx3YXlzIGZhbHNlLiAgKi8KLQotdm9pZAotdnJfdmFsdWVzOjpleHRy YWN0X3JhbmdlX2Zyb21fc3NhX25hbWUgKHZhbHVlX3JhbmdlX2VxdWl2ICp2ciwgdHJlZSB2YXIp Ci17Ci0gIGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICp2YXJfdnIgPSBnZXRfdmFsdWVfcmFuZ2Ug KHZhcik7Ci0KLSAgaWYgKCF2YXJfdnItPnZhcnlpbmdfcCAoKSkKLSAgICB2ci0+ZGVlcF9jb3B5 ICh2YXJfdnIpOwotICBlbHNlCi0gICAgdnItPnNldCAodmFyKTsKLQotICBpZiAoIXZyLT51bmRl ZmluZWRfcCAoKSkKLSAgICB2ci0+ZXF1aXZfYWRkICh2YXIsIGdldF92YWx1ZV9yYW5nZSAodmFy KSwgJnZycF9lcXVpdl9vYnN0YWNrKTsKLX0KLQotLyogRXh0cmFjdCByYW5nZSBpbmZvcm1hdGlv biBmcm9tIGEgYmluYXJ5IGV4cHJlc3Npb24gT1AwIENPREUgT1AxIGJhc2VkIG9uCi0gICB0aGUg cmFuZ2VzIG9mIGVhY2ggb2YgaXRzIG9wZXJhbmRzIHdpdGggcmVzdWx0aW5nIHR5cGUgRVhQUl9U WVBFLgotICAgVGhlIHJlc3VsdGluZyByYW5nZSBpcyBzdG9yZWQgaW4gKlZSLiAgKi8KLQotdm9p ZAotdnJfdmFsdWVzOjpleHRyYWN0X3JhbmdlX2Zyb21fYmluYXJ5X2V4cHIgKHZhbHVlX3Jhbmdl X2VxdWl2ICp2ciwKLQkJCQkJICAgZW51bSB0cmVlX2NvZGUgY29kZSwKLQkJCQkJICAgdHJlZSBl eHByX3R5cGUsIHRyZWUgb3AwLCB0cmVlIG9wMSkKLXsKLSAgLyogR2V0IHZhbHVlIHJhbmdlcyBm b3IgZWFjaCBvcGVyYW5kLiAgRm9yIGNvbnN0YW50IG9wZXJhbmRzLCBjcmVhdGUKLSAgICAgYSBu ZXcgdmFsdWUgcmFuZ2Ugd2l0aCB0aGUgb3BlcmFuZCB0byBzaW1wbGlmeSBwcm9jZXNzaW5nLiAg Ki8KLSAgdmFsdWVfcmFuZ2UgdnIwLCB2cjE7Ci0gIGlmIChUUkVFX0NPREUgKG9wMCkgPT0gU1NB X05BTUUpCi0gICAgdnIwID0gKihnZXRfdmFsdWVfcmFuZ2UgKG9wMCkpOwotICBlbHNlIGlmIChp c19naW1wbGVfbWluX2ludmFyaWFudCAob3AwKSkKLSAgICB2cjAuc2V0IChvcDAsIG9wMCk7Ci0g IGVsc2UKLSAgICB2cjAuc2V0X3ZhcnlpbmcgKFRSRUVfVFlQRSAob3AwKSk7Ci0KLSAgaWYgKFRS RUVfQ09ERSAob3AxKSA9PSBTU0FfTkFNRSkKLSAgICB2cjEgPSAqKGdldF92YWx1ZV9yYW5nZSAo b3AxKSk7Ci0gIGVsc2UgaWYgKGlzX2dpbXBsZV9taW5faW52YXJpYW50IChvcDEpKQotICAgIHZy MS5zZXQgKG9wMSwgb3AxKTsKLSAgZWxzZQotICAgIHZyMS5zZXRfdmFyeWluZyAoVFJFRV9UWVBF IChvcDEpKTsKLQotICAvKiBJZiBvbmUgYXJndW1lbnQgaXMgdmFyeWluZywgd2UgY2FuIHNvbWV0 aW1lcyBzdGlsbCBkZWR1Y2UgYQotICAgICByYW5nZSBmb3IgdGhlIG91dHB1dDogYW55ICsgWzMs ICtJTkZdIGlzIGluIFtNSU4rMywgK0lORl0uICAqLwotICBpZiAoSU5URUdSQUxfVFlQRV9QIChU UkVFX1RZUEUgKG9wMCkpCi0gICAgICAmJiBUWVBFX09WRVJGTE9XX1VOREVGSU5FRCAoVFJFRV9U WVBFIChvcDApKSkKLSAgICB7Ci0gICAgICBpZiAodnIwLnZhcnlpbmdfcCAoKSAmJiAhdnIxLnZh cnlpbmdfcCAoKSkKLQl2cjAgPSB2YWx1ZV9yYW5nZSAodnJwX3ZhbF9taW4gKGV4cHJfdHlwZSks IHZycF92YWxfbWF4IChleHByX3R5cGUpKTsKLSAgICAgIGVsc2UgaWYgKHZyMS52YXJ5aW5nX3Ag KCkgJiYgIXZyMC52YXJ5aW5nX3AgKCkpCi0JdnIxID0gdmFsdWVfcmFuZ2UgKHZycF92YWxfbWlu IChleHByX3R5cGUpLCB2cnBfdmFsX21heCAoZXhwcl90eXBlKSk7Ci0gICAgfQotCi0gIHJhbmdl X2ZvbGRfYmluYXJ5X2V4cHIgKHZyLCBjb2RlLCBleHByX3R5cGUsICZ2cjAsICZ2cjEpOwotCi0g IC8qIFNldCB2YWx1ZV9yYW5nZSBmb3IgbiBpbiBmb2xsb3dpbmcgc2VxdWVuY2U6Ci0gICAgIGRl ZiA9IF9fYnVpbHRpbl9tZW1jaHIgKGFyZywgMCwgc3opCi0gICAgIG4gPSBkZWYgLSBhcmcKLSAg ICAgSGVyZSB0aGUgcmFuZ2UgZm9yIG4gY2FuIGJlIHNldCB0byBbMCwgUFRSRElGRl9NQVggLSAx XS4gKi8KLQotICBpZiAodnItPnZhcnlpbmdfcCAoKQotICAgICAgJiYgY29kZSA9PSBQT0lOVEVS X0RJRkZfRVhQUgotICAgICAgJiYgVFJFRV9DT0RFIChvcDApID09IFNTQV9OQU1FCi0gICAgICAm JiBUUkVFX0NPREUgKG9wMSkgPT0gU1NBX05BTUUpCi0gICAgewotICAgICAgdHJlZSBvcDBfcHR5 cGUgPSBUUkVFX1RZUEUgKFRSRUVfVFlQRSAob3AwKSk7Ci0gICAgICB0cmVlIG9wMV9wdHlwZSA9 IFRSRUVfVFlQRSAoVFJFRV9UWVBFIChvcDEpKTsKLSAgICAgIGdjYWxsICpjYWxsX3N0bXQgPSBO VUxMOwotCi0gICAgICBpZiAoVFlQRV9NT0RFIChvcDBfcHR5cGUpID09IFRZUEVfTU9ERSAoY2hh cl90eXBlX25vZGUpCi0JICAmJiBUWVBFX1BSRUNJU0lPTiAob3AwX3B0eXBlKSA9PSBUWVBFX1BS RUNJU0lPTiAoY2hhcl90eXBlX25vZGUpCi0JICAmJiBUWVBFX01PREUgKG9wMV9wdHlwZSkgPT0g VFlQRV9NT0RFIChjaGFyX3R5cGVfbm9kZSkKLQkgICYmIFRZUEVfUFJFQ0lTSU9OIChvcDFfcHR5 cGUpID09IFRZUEVfUFJFQ0lTSU9OIChjaGFyX3R5cGVfbm9kZSkKLQkgICYmIChjYWxsX3N0bXQg PSBkeW5fY2FzdDxnY2FsbCAqPihTU0FfTkFNRV9ERUZfU1RNVCAob3AwKSkpCi0JICAmJiBnaW1w bGVfY2FsbF9idWlsdGluX3AgKGNhbGxfc3RtdCwgQlVJTFRfSU5fTUVNQ0hSKQotCSAgJiYgb3Bl cmFuZF9lcXVhbF9wIChvcDAsIGdpbXBsZV9jYWxsX2xocyAoY2FsbF9zdG10KSwgMCkKLQkgICYm IG9wZXJhbmRfZXF1YWxfcCAob3AxLCBnaW1wbGVfY2FsbF9hcmcgKGNhbGxfc3RtdCwgMCksIDAp Ci0JICAmJiBpbnRlZ2VyX3plcm9wIChnaW1wbGVfY2FsbF9hcmcgKGNhbGxfc3RtdCwgMSkpKQot CSAgICB7Ci0JICAgICAgdHJlZSBtYXggPSB2cnBfdmFsX21heCAocHRyZGlmZl90eXBlX25vZGUp OwotCSAgICAgIHdpZGVfaW50IHdtYXggPSB3aTo6dG9fd2lkZSAobWF4LCBUWVBFX1BSRUNJU0lP TiAoVFJFRV9UWVBFIChtYXgpKSk7Ci0JICAgICAgdHJlZSByYW5nZV9taW4gPSBidWlsZF96ZXJv X2NzdCAoZXhwcl90eXBlKTsKLQkgICAgICB0cmVlIHJhbmdlX21heCA9IHdpZGVfaW50X3RvX3Ry ZWUgKGV4cHJfdHlwZSwgd21heCAtIDEpOwotCSAgICAgIHZyLT5zZXQgKHJhbmdlX21pbiwgcmFu Z2VfbWF4LCBOVUxMKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLSAgICAgfQotCi0gIC8qIFRy eSBoYXJkZXIgZm9yIFBMVVMgYW5kIE1JTlVTIGlmIHRoZSByYW5nZSBvZiBvbmUgb3BlcmFuZCBp cyBzeW1ib2xpYwotICAgICBhbmQgYmFzZWQgb24gdGhlIG90aGVyIG9wZXJhbmQsIGZvciBleGFt cGxlIGlmIGl0IHdhcyBkZWR1Y2VkIGZyb20gYQotICAgICBzeW1ib2xpYyBjb21wYXJpc29uLiAg V2hlbiBhIGJvdW5kIG9mIHRoZSByYW5nZSBvZiB0aGUgZmlyc3Qgb3BlcmFuZAotICAgICBpcyBp bnZhcmlhbnQsIHdlIHNldCB0aGUgY29ycmVzcG9uZGluZyBib3VuZCBvZiB0aGUgbmV3IHJhbmdl IHRvIElORgotICAgICBpbiBvcmRlciB0byBhdm9pZCByZWN1cnNpbmcgb24gdGhlIHJhbmdlIG9m IHRoZSBzZWNvbmQgb3BlcmFuZC4gICovCi0gIGlmICh2ci0+dmFyeWluZ19wICgpCi0gICAgICAm JiAoY29kZSA9PSBQTFVTX0VYUFIgfHwgY29kZSA9PSBNSU5VU19FWFBSKQotICAgICAgJiYgVFJF RV9DT0RFIChvcDEpID09IFNTQV9OQU1FCi0gICAgICAmJiB2cjAua2luZCAoKSA9PSBWUl9SQU5H RQotICAgICAgJiYgc3ltYm9saWNfcmFuZ2VfYmFzZWRfb25fcCAoJnZyMCwgb3AxKSkKLSAgICB7 Ci0gICAgICBjb25zdCBib29sIG1pbnVzX3AgPSAoY29kZSA9PSBNSU5VU19FWFBSKTsKLSAgICAg IHZhbHVlX3JhbmdlIG5fdnIxOwotCi0gICAgICAvKiBUcnkgd2l0aCBWUjAgYW5kIFstSU5GLCBP UDFdLiAgKi8KLSAgICAgIGlmIChpc19naW1wbGVfbWluX2ludmFyaWFudCAobWludXNfcCA/IHZy MC5tYXggKCkgOiB2cjAubWluICgpKSkKLQluX3ZyMS5zZXQgKHZycF92YWxfbWluIChleHByX3R5 cGUpLCBvcDEpOwotCi0gICAgICAvKiBUcnkgd2l0aCBWUjAgYW5kIFtPUDEsICtJTkZdLiAgKi8K LSAgICAgIGVsc2UgaWYgKGlzX2dpbXBsZV9taW5faW52YXJpYW50IChtaW51c19wID8gdnIwLm1p biAoKSA6IHZyMC5tYXggKCkpKQotCW5fdnIxLnNldCAob3AxLCB2cnBfdmFsX21heCAoZXhwcl90 eXBlKSk7Ci0KLSAgICAgIC8qIFRyeSB3aXRoIFZSMCBhbmQgW09QMSwgT1AxXS4gICovCi0gICAg ICBlbHNlCi0Jbl92cjEuc2V0IChvcDEsIG9wMSk7Ci0KLSAgICAgIHJhbmdlX2ZvbGRfYmluYXJ5 X2V4cHIgKHZyLCBjb2RlLCBleHByX3R5cGUsICZ2cjAsICZuX3ZyMSk7Ci0gICAgfQotCi0gIGlm ICh2ci0+dmFyeWluZ19wICgpCi0gICAgICAmJiAoY29kZSA9PSBQTFVTX0VYUFIgfHwgY29kZSA9 PSBNSU5VU19FWFBSKQotICAgICAgJiYgVFJFRV9DT0RFIChvcDApID09IFNTQV9OQU1FCi0gICAg ICAmJiB2cjEua2luZCAoKSA9PSBWUl9SQU5HRQotICAgICAgJiYgc3ltYm9saWNfcmFuZ2VfYmFz ZWRfb25fcCAoJnZyMSwgb3AwKSkKLSAgICB7Ci0gICAgICBjb25zdCBib29sIG1pbnVzX3AgPSAo Y29kZSA9PSBNSU5VU19FWFBSKTsKLSAgICAgIHZhbHVlX3JhbmdlIG5fdnIwOwotCi0gICAgICAv KiBUcnkgd2l0aCBbLUlORiwgT1AwXSBhbmQgVlIxLiAgKi8KLSAgICAgIGlmIChpc19naW1wbGVf bWluX2ludmFyaWFudCAobWludXNfcCA/IHZyMS5tYXggKCkgOiB2cjEubWluICgpKSkKLQluX3Zy MC5zZXQgKHZycF92YWxfbWluIChleHByX3R5cGUpLCBvcDApOwotCi0gICAgICAvKiBUcnkgd2l0 aCBbT1AwLCArSU5GXSBhbmQgVlIxLiAgKi8KLSAgICAgIGVsc2UgaWYgKGlzX2dpbXBsZV9taW5f aW52YXJpYW50IChtaW51c19wID8gdnIxLm1pbiAoKTogdnIxLm1heCAoKSkpCi0Jbl92cjAuc2V0 IChvcDAsIHZycF92YWxfbWF4IChleHByX3R5cGUpKTsKLQotICAgICAgLyogVHJ5IHdpdGggW09Q MCwgT1AwXSBhbmQgVlIxLiAgKi8KLSAgICAgIGVsc2UKLQluX3ZyMC5zZXQgKG9wMCwgb3AwKTsK LQotICAgICAgcmFuZ2VfZm9sZF9iaW5hcnlfZXhwciAodnIsIGNvZGUsIGV4cHJfdHlwZSwgJm5f dnIwLCAmdnIxKTsKLSAgICB9Ci0KLSAgLyogSWYgd2UgZGlkbid0IGRlcml2ZSBhIHJhbmdlIGZv ciBNSU5VU19FWFBSLCBhbmQKLSAgICAgb3AxJ3MgcmFuZ2UgaXMgfltvcDAsb3AwXSBvciB2aWNl LXZlcnNhLCB0aGVuIHdlCi0gICAgIGNhbiBkZXJpdmUgYSBub24tbnVsbCByYW5nZS4gIFRoaXMg aGFwcGVucyBvZnRlbiBmb3IKLSAgICAgcG9pbnRlciBzdWJ0cmFjdGlvbi4gICovCi0gIGlmICh2 ci0+dmFyeWluZ19wICgpCi0gICAgICAmJiAoY29kZSA9PSBNSU5VU19FWFBSIHx8IGNvZGUgPT0g UE9JTlRFUl9ESUZGX0VYUFIpCi0gICAgICAmJiBUUkVFX0NPREUgKG9wMCkgPT0gU1NBX05BTUUK LSAgICAgICYmICgodnIwLmtpbmQgKCkgPT0gVlJfQU5USV9SQU5HRQotCSAgICYmIHZyMC5taW4g KCkgPT0gb3AxCi0JICAgJiYgdnIwLm1pbiAoKSA9PSB2cjAubWF4ICgpKQotCSAgfHwgKHZyMS5r aW5kICgpID09IFZSX0FOVElfUkFOR0UKLQkgICAgICAmJiB2cjEubWluICgpID09IG9wMAotCSAg ICAgICYmIHZyMS5taW4gKCkgPT0gdnIxLm1heCAoKSkpKQotICAgIHsKLSAgICAgIHZyLT5zZXRf bm9uemVybyAoZXhwcl90eXBlKTsKLSAgICAgIHZyLT5lcXVpdl9jbGVhciAoKTsKLSAgICB9Ci19 Ci0KLS8qIEV4dHJhY3QgcmFuZ2UgaW5mb3JtYXRpb24gZnJvbSBhIHVuYXJ5IGV4cHJlc3Npb24g Q09ERSBPUDAgYmFzZWQgb24KLSAgIHRoZSByYW5nZSBvZiBpdHMgb3BlcmFuZCB3aXRoIHJlc3Vs dGluZyB0eXBlIFRZUEUuCi0gICBUaGUgcmVzdWx0aW5nIHJhbmdlIGlzIHN0b3JlZCBpbiAqVlIu ICAqLwotCi12b2lkCi12cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2VfZnJvbV91bmFyeV9leHByICh2 YWx1ZV9yYW5nZV9lcXVpdiAqdnIsCi0JCQkJCSAgZW51bSB0cmVlX2NvZGUgY29kZSwKLQkJCQkJ ICB0cmVlIHR5cGUsIHRyZWUgb3AwKQotewotICB2YWx1ZV9yYW5nZSB2cjA7Ci0KLSAgLyogR2V0 IHZhbHVlIHJhbmdlcyBmb3IgdGhlIG9wZXJhbmQuICBGb3IgY29uc3RhbnQgb3BlcmFuZHMsIGNy ZWF0ZQotICAgICBhIG5ldyB2YWx1ZSByYW5nZSB3aXRoIHRoZSBvcGVyYW5kIHRvIHNpbXBsaWZ5 IHByb2Nlc3NpbmcuICAqLwotICBpZiAoVFJFRV9DT0RFIChvcDApID09IFNTQV9OQU1FKQotICAg IHZyMCA9ICooZ2V0X3ZhbHVlX3JhbmdlIChvcDApKTsKLSAgZWxzZSBpZiAoaXNfZ2ltcGxlX21p bl9pbnZhcmlhbnQgKG9wMCkpCi0gICAgdnIwLnNldCAob3AwLCBvcDApOwotICBlbHNlCi0gICAg dnIwLnNldF92YXJ5aW5nICh0eXBlKTsKLQotICByYW5nZV9mb2xkX3VuYXJ5X2V4cHIgKHZyLCBj b2RlLCB0eXBlLCAmdnIwLCBUUkVFX1RZUEUgKG9wMCkpOwotfQotCi0KLS8qIEV4dHJhY3QgcmFu Z2UgaW5mb3JtYXRpb24gZnJvbSBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gU1RNVCBiYXNlZCBv bgotICAgdGhlIHJhbmdlcyBvZiBlYWNoIG9mIGl0cyBvcGVyYW5kcyBhbmQgdGhlIGV4cHJlc3Np b24gY29kZS4gICovCi0KLXZvaWQKLXZyX3ZhbHVlczo6ZXh0cmFjdF9yYW5nZV9mcm9tX2NvbmRf ZXhwciAodmFsdWVfcmFuZ2VfZXF1aXYgKnZyLCBnYXNzaWduICpzdG10KQotewotICAvKiBHZXQg dmFsdWUgcmFuZ2VzIGZvciBlYWNoIG9wZXJhbmQuICBGb3IgY29uc3RhbnQgb3BlcmFuZHMsIGNy ZWF0ZQotICAgICBhIG5ldyB2YWx1ZSByYW5nZSB3aXRoIHRoZSBvcGVyYW5kIHRvIHNpbXBsaWZ5 IHByb2Nlc3NpbmcuICAqLwotICB0cmVlIG9wMCA9IGdpbXBsZV9hc3NpZ25fcmhzMiAoc3RtdCk7 Ci0gIHZhbHVlX3JhbmdlX2VxdWl2IHRlbTA7Ci0gIGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICp2 cjAgPSAmdGVtMDsKLSAgaWYgKFRSRUVfQ09ERSAob3AwKSA9PSBTU0FfTkFNRSkKLSAgICB2cjAg PSBnZXRfdmFsdWVfcmFuZ2UgKG9wMCk7Ci0gIGVsc2UgaWYgKGlzX2dpbXBsZV9taW5faW52YXJp YW50IChvcDApKQotICAgIHRlbTAuc2V0IChvcDApOwotICBlbHNlCi0gICAgdGVtMC5zZXRfdmFy eWluZyAoVFJFRV9UWVBFIChvcDApKTsKLQotICB0cmVlIG9wMSA9IGdpbXBsZV9hc3NpZ25fcmhz MyAoc3RtdCk7Ci0gIHZhbHVlX3JhbmdlX2VxdWl2IHRlbTE7Ci0gIGNvbnN0IHZhbHVlX3Jhbmdl X2VxdWl2ICp2cjEgPSAmdGVtMTsKLSAgaWYgKFRSRUVfQ09ERSAob3AxKSA9PSBTU0FfTkFNRSkK LSAgICB2cjEgPSBnZXRfdmFsdWVfcmFuZ2UgKG9wMSk7Ci0gIGVsc2UgaWYgKGlzX2dpbXBsZV9t aW5faW52YXJpYW50IChvcDEpKQotICAgIHRlbTEuc2V0IChvcDEpOwotICBlbHNlCi0gICAgdGVt MS5zZXRfdmFyeWluZyAoVFJFRV9UWVBFIChvcDEpKTsKLQotICAvKiBUaGUgcmVzdWx0aW5nIHZh bHVlIHJhbmdlIGlzIHRoZSB1bmlvbiBvZiB0aGUgb3BlcmFuZCByYW5nZXMgKi8KLSAgdnItPmRl ZXBfY29weSAodnIwKTsKLSAgdnItPmxlZ2FjeV92ZXJib3NlX3VuaW9uXyAodnIxKTsKLX0KLQot Ci0vKiBFeHRyYWN0IHJhbmdlIGluZm9ybWF0aW9uIGZyb20gYSBjb21wYXJpc29uIGV4cHJlc3Np b24gRVhQUiBiYXNlZAotICAgb24gdGhlIHJhbmdlIG9mIGl0cyBvcGVyYW5kIGFuZCB0aGUgZXhw cmVzc2lvbiBjb2RlLiAgKi8KLQotdm9pZAotdnJfdmFsdWVzOjpleHRyYWN0X3JhbmdlX2Zyb21f Y29tcGFyaXNvbiAodmFsdWVfcmFuZ2VfZXF1aXYgKnZyLAotCQkJCQkgIGdpbXBsZSAqc3RtdCkK LXsKLSAgZW51bSB0cmVlX2NvZGUgY29kZSA9IGdpbXBsZV9hc3NpZ25fcmhzX2NvZGUgKHN0bXQp OwotICB0cmVlIHR5cGUgPSBUUkVFX1RZUEUgKGdpbXBsZV9hc3NpZ25fbGhzIChzdG10KSk7Ci0g IHRyZWUgb3AwID0gZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KTsKLSAgdHJlZSBvcDEgPSBnaW1w bGVfYXNzaWduX3JoczIgKHN0bXQpOwotICBib29sIHNvcDsKLSAgdHJlZSB2YWwKLSAgICA9IHNp bXBsaWZpZXIudnJwX2V2YWx1YXRlX2NvbmRpdGlvbmFsX3dhcm52X3dpdGhfb3BzIChzdG10LCBj b2RlLCBvcDAsIG9wMSwKLQkJCQkJCQkgIGZhbHNlLCAmc29wLCBOVUxMKTsKLSAgaWYgKHZhbCkK LSAgICB7Ci0gICAgICAvKiBTaW5jZSB0aGlzIGV4cHJlc3Npb24gd2FzIGZvdW5kIG9uIHRoZSBS SFMgb2YgYW4gYXNzaWdubWVudCwKLQkgaXRzIHR5cGUgbWF5IGJlIGRpZmZlcmVudCBmcm9tIF9C b29sLiAgQ29udmVydCBWQUwgdG8gRVhQUidzCi0JIHR5cGUuICAqLwotICAgICAgdmFsID0gZm9s ZF9jb252ZXJ0ICh0eXBlLCB2YWwpOwotICAgICAgaWYgKGlzX2dpbXBsZV9taW5faW52YXJpYW50 ICh2YWwpKQotCXZyLT5zZXQgKHZhbCk7Ci0gICAgICBlbHNlCi0JdnItPnVwZGF0ZSAodmFsLCB2 YWwpOwotICAgIH0KLSAgZWxzZQotICAgIC8qIFRoZSByZXN1bHQgb2YgYSBjb21wYXJpc29uIGlz IGFsd2F5cyB0cnVlIG9yIGZhbHNlLiAgKi8KLSAgICBzZXRfdmFsdWVfcmFuZ2VfdG9fdHJ1dGh2 YWx1ZSAodnIsIHR5cGUpOwotfQotCiAvKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHNpbXBsaWZ5X2lu dGVybmFsX2NhbGxfdXNpbmdfcmFuZ2VzIGFuZAogICAgZXh0cmFjdF9yYW5nZV9iYXNpYy4gIFJl dHVybiB0cnVlIGlmIE9QMCBTVUJDT0RFIE9QMSBmb3IKICAgIFNVQkNPREUge1BMVVMsTUlOVVMs TVVMVH1fRVhQUiBpcyBrbm93biB0byBuZXZlciBvdmVyZmxvdyBvcgpAQCAtMTE1MCwyNDcgKzE3 OSwyNSBAQCBjaGVja19mb3JfYmluYXJ5X29wX292ZXJmbG93IChyYW5nZV9xdWVyeSAqcXVlcnks CiAJICAgIHsKIAkgICAgICB3bWluID0gd3Q7CiAJICAgICAgd21heCA9IHd0OwotCSAgICB9Ci0J ICBlbHNlCi0JICAgIHsKLQkgICAgICB3bWluID0gd2k6OnNtaW4gKHdtaW4sIHd0KTsKLQkgICAg ICB3bWF4ID0gd2k6OnNtYXggKHdtYXgsIHd0KTsKLQkgICAgfQotCX0KLSAgICAgIC8qIFRoZSBy ZXN1bHQgb2Ygb3AwIENPREUgb3AxIGlzIGtub3duIHRvIGJlIGluIHJhbmdlCi0JIFt3bWluLCB3 bWF4XS4gICovCi0gICAgICB3aWRlc3RfaW50IHd0bWluID0gd2k6OnRvX3dpZGVzdCAodnJwX3Zh bF9taW4gKHR5cGUpKTsKLSAgICAgIHdpZGVzdF9pbnQgd3RtYXggPSB3aTo6dG9fd2lkZXN0ICh2 cnBfdmFsX21heCAodHlwZSkpOwotICAgICAgLyogSWYgYWxsIHZhbHVlcyBpbiBbd21pbiwgd21h eF0gYXJlIHNtYWxsZXIgdGhhbgotCSBbd3RtaW4sIHd0bWF4XSBvciBhbGwgYXJlIGxhcmdlciB0 aGFuIFt3dG1pbiwgd3RtYXhdLAotCSB0aGUgYXJpdGhtZXRpYyBvcGVyYXRpb24gd2lsbCBhbHdh eXMgb3ZlcmZsb3cuICAqLwotICAgICAgaWYgKHdtYXggPCB3dG1pbiB8fCB3bWluID4gd3RtYXgp Ci0JcmV0dXJuIHRydWU7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICByZXR1cm4gdHJ1 ZTsKLX0KLQotLyogRGVyaXZlIGEgcmFuZ2UgZnJvbSBhIGJ1aWx0aW4uICBTZXQgcmFuZ2UgaW4g VlIgYW5kIHJldHVybiBUUlVFIGlmCi0gICBzdWNjZXNzZnVsLiAgKi8KLQotYm9vbAotdnJfdmFs dWVzOjpleHRyYWN0X3JhbmdlX2Zyb21fdWJzYW5fYnVpbHRpbiAodmFsdWVfcmFuZ2VfZXF1aXYg KnZyLCBnaW1wbGUgKnN0bXQpCi17Ci0gIGdjY19hc3NlcnQgKGlzX2dpbXBsZV9jYWxsIChzdG10 KSk7Ci0gIGVudW0gdHJlZV9jb2RlIHN1YmNvZGUgPSBFUlJPUl9NQVJLOwotICBjb21iaW5lZF9m biBjZm4gPSBnaW1wbGVfY2FsbF9jb21iaW5lZF9mbiAoc3RtdCk7Ci0gIHNjYWxhcl9pbnRfbW9k ZSBtb2RlOwotCi0gIHN3aXRjaCAoY2ZuKQotICAgIHsKLSAgICBjYXNlIENGTl9VQlNBTl9DSEVD S19BREQ6Ci0gICAgICBzdWJjb2RlID0gUExVU19FWFBSOwotICAgICAgYnJlYWs7Ci0gICAgY2Fz ZSBDRk5fVUJTQU5fQ0hFQ0tfU1VCOgotICAgICAgc3ViY29kZSA9IE1JTlVTX0VYUFI7Ci0gICAg ICBicmVhazsKLSAgICBjYXNlIENGTl9VQlNBTl9DSEVDS19NVUw6Ci0gICAgICBzdWJjb2RlID0g TVVMVF9FWFBSOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICAg IH0KLSAgaWYgKHN1YmNvZGUgIT0gRVJST1JfTUFSSykKLSAgICB7Ci0gICAgICBib29sIHNhdmVk X2ZsYWdfd3JhcHYgPSBmbGFnX3dyYXB2OwotICAgICAgLyogUHJldGVuZCB0aGUgYXJpdGhtZXRp Y3MgaXMgd3JhcHBpbmcuICBJZiB0aGVyZSBpcwotCSBhbnkgb3ZlcmZsb3csIHdlJ2xsIGNvbXBs YWluLCBidXQgd2lsbCBhY3R1YWxseSBkbwotCSB3cmFwcGluZyBvcGVyYXRpb24uICAqLwotICAg ICAgZmxhZ193cmFwdiA9IDE7Ci0gICAgICBleHRyYWN0X3JhbmdlX2Zyb21fYmluYXJ5X2V4cHIg KHZyLCBzdWJjb2RlLAotCQkJCSAgICAgIFRSRUVfVFlQRSAoZ2ltcGxlX2NhbGxfYXJnIChzdG10 LCAwKSksCi0JCQkJICAgICAgZ2ltcGxlX2NhbGxfYXJnIChzdG10LCAwKSwKLQkJCQkgICAgICBn aW1wbGVfY2FsbF9hcmcgKHN0bXQsIDEpKTsKLSAgICAgIGZsYWdfd3JhcHYgPSBzYXZlZF9mbGFn X3dyYXB2OwotCi0gICAgICAvKiBJZiBmb3IgYm90aCBhcmd1bWVudHMgdnJwX3ZhbHVlaXplIHJl dHVybmVkIG5vbi1OVUxMLAotCSB0aGlzIHNob3VsZCBoYXZlIGJlZW4gYWxyZWFkeSBmb2xkZWQg YW5kIGlmIG5vdCwgaXQKLQkgd2Fzbid0IGZvbGRlZCBiZWNhdXNlIG9mIG92ZXJmbG93LiAgQXZv aWQgcmVtb3ZpbmcgdGhlCi0JIFVCU0FOX0NIRUNLXyogY2FsbHMgaW4gdGhhdCBjYXNlLiAgKi8K LSAgICAgIGlmICh2ci0+a2luZCAoKSA9PSBWUl9SQU5HRQotCSAgJiYgKHZyLT5taW4gKCkgPT0g dnItPm1heCAoKQotCSAgICAgIHx8IG9wZXJhbmRfZXF1YWxfcCAodnItPm1pbiAoKSwgdnItPm1h eCAoKSwgMCkpKQotCXZyLT5zZXRfdmFyeWluZyAodnItPnR5cGUgKCkpOwotCi0gICAgICByZXR1 cm4gIXZyLT52YXJ5aW5nX3AgKCk7Ci0gICAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRy eSB0byBkZXJpdmUgYSBub25uZWdhdGl2ZSBvciBub256ZXJvIHJhbmdlIG91dCBvZiBTVE1UIHJl bHlpbmcKLSAgIHByaW1hcmlseSBvbiBnZW5lcmljIHJvdXRpbmVzIGluIGZvbGQgaW4gY29uanVu Y3Rpb24gd2l0aCByYW5nZSBkYXRhLgotICAgU3RvcmUgdGhlIHJlc3VsdCBpbiAqVlIgKi8KLQot dm9pZAotdnJfdmFsdWVzOjpleHRyYWN0X3JhbmdlX2Jhc2ljICh2YWx1ZV9yYW5nZV9lcXVpdiAq dnIsIGdpbXBsZSAqc3RtdCkKLXsKLSAgYm9vbCBzb3A7Ci0KLSAgaWYgKGlzX2dpbXBsZV9jYWxs IChzdG10KSkKLSAgICB7Ci0gICAgICBjb21iaW5lZF9mbiBjZm4gPSBnaW1wbGVfY2FsbF9jb21i aW5lZF9mbiAoc3RtdCk7Ci0gICAgICBzd2l0Y2ggKGNmbikKLQl7Ci0JY2FzZSBDRk5fVUJTQU5f Q0hFQ0tfQUREOgotCWNhc2UgQ0ZOX1VCU0FOX0NIRUNLX1NVQjoKLQljYXNlIENGTl9VQlNBTl9D SEVDS19NVUw6Ci0JICBpZiAoZXh0cmFjdF9yYW5nZV9mcm9tX3Vic2FuX2J1aWx0aW4gKHZyLCBz dG10KSkKLQkgICAgcmV0dXJuOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkgIGlmIChmb2xkX3Jh bmdlICgqdnIsIHN0bXQsIHRoaXMpKQotCSAgICB7Ci0JICAgICAgLyogVGhlIG9yaWdpbmFsIGNv ZGUgbnVrZWQgZXF1aXZhbGVuY2VzIGV2ZXJ5IHRpbWUgYQotCQkgcmFuZ2Ugd2FzIGZvdW5kLCBz byBkbyB0aGUgc2FtZSBoZXJlLiAgKi8KLQkgICAgICB2ci0+ZXF1aXZfY2xlYXIgKCk7Ci0JICAg ICAgcmV0dXJuOwotCSAgICB9Ci0JICBicmVhazsKLQl9Ci0gICAgfQotICAvKiBIYW5kbGUgZXh0 cmFjdGlvbiBvZiB0aGUgdHdvIHJlc3VsdHMgKHJlc3VsdCBvZiBhcml0aG1ldGljcyBhbmQKLSAg ICAgYSBmbGFnIHdoZXRoZXIgYXJpdGhtZXRpY3Mgb3ZlcmZsb3dlZCkgZnJvbSB7QURELFNVQixN VUx9X09WRVJGTE9XCi0gICAgIGludGVybmFsIGZ1bmN0aW9uLiAgU2ltaWxhcmx5IGZyb20gQVRP TUlDX0NPTVBBUkVfRVhDSEFOR0UuICAqLwotICBpZiAoaXNfZ2ltcGxlX2Fzc2lnbiAoc3RtdCkK LSAgICAgICYmIChnaW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KSA9PSBSRUFMUEFSVF9FWFBS Ci0JICB8fCBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KSA9PSBJTUFHUEFSVF9FWFBSKQot ICAgICAgJiYgSU5URUdSQUxfVFlQRV9QIChUUkVFX1RZUEUgKGdpbXBsZV9hc3NpZ25fbGhzIChz dG10KSkpKQotICAgIHsKLSAgICAgIGVudW0gdHJlZV9jb2RlIGNvZGUgPSBnaW1wbGVfYXNzaWdu X3Joc19jb2RlIChzdG10KTsKLSAgICAgIHRyZWUgb3AgPSBnaW1wbGVfYXNzaWduX3JoczEgKHN0 bXQpOwotICAgICAgdHJlZSB0eXBlID0gVFJFRV9UWVBFIChnaW1wbGVfYXNzaWduX2xocyAoc3Rt dCkpOwotICAgICAgaWYgKFRSRUVfQ09ERSAob3ApID09IGNvZGUgJiYgVFJFRV9DT0RFIChUUkVF X09QRVJBTkQgKG9wLCAwKSkgPT0gU1NBX05BTUUpCi0JewotCSAgZ2ltcGxlICpnID0gU1NBX05B TUVfREVGX1NUTVQgKFRSRUVfT1BFUkFORCAob3AsIDApKTsKLQkgIGlmIChpc19naW1wbGVfY2Fs bCAoZykgJiYgZ2ltcGxlX2NhbGxfaW50ZXJuYWxfcCAoZykpCisJICAgIH0KKwkgIGVsc2UKIAkg ICAgewotCSAgICAgIGVudW0gdHJlZV9jb2RlIHN1YmNvZGUgPSBFUlJPUl9NQVJLOwotCSAgICAg IHN3aXRjaCAoZ2ltcGxlX2NhbGxfaW50ZXJuYWxfZm4gKGcpKQotCQl7Ci0JCWNhc2UgSUZOX0FE RF9PVkVSRkxPVzoKLQkJICBzdWJjb2RlID0gUExVU19FWFBSOwotCQkgIGJyZWFrOwotCQljYXNl IElGTl9TVUJfT1ZFUkZMT1c6Ci0JCSAgc3ViY29kZSA9IE1JTlVTX0VYUFI7Ci0JCSAgYnJlYWs7 Ci0JCWNhc2UgSUZOX01VTF9PVkVSRkxPVzoKLQkJICBzdWJjb2RlID0gTVVMVF9FWFBSOwotCQkg IGJyZWFrOwotCQljYXNlIElGTl9BVE9NSUNfQ09NUEFSRV9FWENIQU5HRToKLQkJICBpZiAoY29k ZSA9PSBJTUFHUEFSVF9FWFBSKQotCQkgICAgewotCQkgICAgICAvKiBUaGlzIGlzIHRoZSBib29s ZWFuIHJldHVybiB2YWx1ZSB3aGV0aGVyIGNvbXBhcmUgYW5kCi0JCQkgZXhjaGFuZ2UgY2hhbmdl ZCBhbnl0aGluZyBvciBub3QuICAqLwotCQkgICAgICB2ci0+c2V0IChidWlsZF9pbnRfY3N0ICh0 eXBlLCAwKSwKLQkJCSAgICAgICBidWlsZF9pbnRfY3N0ICh0eXBlLCAxKSwgTlVMTCk7Ci0JCSAg ICAgIHJldHVybjsKLQkJICAgIH0KLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBicmVhazsK LQkJfQotCSAgICAgIGlmIChzdWJjb2RlICE9IEVSUk9SX01BUkspCi0JCXsKLQkJICB0cmVlIG9w MCA9IGdpbXBsZV9jYWxsX2FyZyAoZywgMCk7Ci0JCSAgdHJlZSBvcDEgPSBnaW1wbGVfY2FsbF9h cmcgKGcsIDEpOwotCQkgIGlmIChjb2RlID09IElNQUdQQVJUX0VYUFIpCi0JCSAgICB7Ci0JCSAg ICAgIGJvb2wgb3ZmID0gZmFsc2U7Ci0JCSAgICAgIGlmIChjaGVja19mb3JfYmluYXJ5X29wX292 ZXJmbG93ICh0aGlzLCBzdWJjb2RlLCB0eXBlLAotCQkJCQkJCW9wMCwgb3AxLCAmb3ZmKSkKLQkJ CXZyLT5zZXQgKGJ1aWxkX2ludF9jc3QgKHR5cGUsIG92ZikpOwotCQkgICAgICBlbHNlIGlmIChU WVBFX1BSRUNJU0lPTiAodHlwZSkgPT0gMQotCQkJICAgICAgICYmICFUWVBFX1VOU0lHTkVEICh0 eXBlKSkKLQkJCXZyLT5zZXRfdmFyeWluZyAodHlwZSk7Ci0JCSAgICAgIGVsc2UKLQkJCXZyLT5z ZXQgKGJ1aWxkX2ludF9jc3QgKHR5cGUsIDApLAotCQkJCSBidWlsZF9pbnRfY3N0ICh0eXBlLCAx KSwgTlVMTCk7Ci0JCSAgICB9Ci0JCSAgZWxzZSBpZiAodHlwZXNfY29tcGF0aWJsZV9wICh0eXBl LCBUUkVFX1RZUEUgKG9wMCkpCi0JCQkgICAmJiB0eXBlc19jb21wYXRpYmxlX3AgKHR5cGUsIFRS RUVfVFlQRSAob3AxKSkpCi0JCSAgICB7Ci0JCSAgICAgIGJvb2wgc2F2ZWRfZmxhZ193cmFwdiA9 IGZsYWdfd3JhcHY7Ci0JCSAgICAgIC8qIFByZXRlbmQgdGhlIGFyaXRobWV0aWNzIGlzIHdyYXBw aW5nLiAgSWYgdGhlcmUgaXMKLQkJCSBhbnkgb3ZlcmZsb3csIElNQUdQQVJUX0VYUFIgd2lsbCBi ZSBzZXQuICAqLwotCQkgICAgICBmbGFnX3dyYXB2ID0gMTsKLQkJICAgICAgZXh0cmFjdF9yYW5n ZV9mcm9tX2JpbmFyeV9leHByICh2ciwgc3ViY29kZSwgdHlwZSwKLQkJCQkJCSAgICAgIG9wMCwg b3AxKTsKLQkJICAgICAgZmxhZ193cmFwdiA9IHNhdmVkX2ZsYWdfd3JhcHY7Ci0JCSAgICB9Ci0J CSAgZWxzZQotCQkgICAgewotCQkgICAgICB2YWx1ZV9yYW5nZV9lcXVpdiB2cjAsIHZyMTsKLQkJ ICAgICAgYm9vbCBzYXZlZF9mbGFnX3dyYXB2ID0gZmxhZ193cmFwdjsKLQkJICAgICAgLyogUHJl dGVuZCB0aGUgYXJpdGhtZXRpY3MgaXMgd3JhcHBpbmcuICBJZiB0aGVyZSBpcwotCQkJIGFueSBv dmVyZmxvdywgSU1BR1BBUlRfRVhQUiB3aWxsIGJlIHNldC4gICovCi0JCSAgICAgIGZsYWdfd3Jh cHYgPSAxOwotCQkgICAgICBleHRyYWN0X3JhbmdlX2Zyb21fdW5hcnlfZXhwciAoJnZyMCwgTk9Q X0VYUFIsCi0JCQkJCQkgICAgIHR5cGUsIG9wMCk7Ci0JCSAgICAgIGV4dHJhY3RfcmFuZ2VfZnJv bV91bmFyeV9leHByICgmdnIxLCBOT1BfRVhQUiwKLQkJCQkJCSAgICAgdHlwZSwgb3AxKTsKLQkJ ICAgICAgcmFuZ2VfZm9sZF9iaW5hcnlfZXhwciAodnIsIHN1YmNvZGUsIHR5cGUsICZ2cjAsICZ2 cjEpOwotCQkgICAgICBmbGFnX3dyYXB2ID0gc2F2ZWRfZmxhZ193cmFwdjsKLQkJICAgIH0KLQkJ ICByZXR1cm47Ci0JCX0KKwkgICAgICB3bWluID0gd2k6OnNtaW4gKHdtaW4sIHd0KTsKKwkgICAg ICB3bWF4ID0gd2k6OnNtYXggKHdtYXgsIHd0KTsKIAkgICAgfQogCX0KKyAgICAgIC8qIFRoZSBy ZXN1bHQgb2Ygb3AwIENPREUgb3AxIGlzIGtub3duIHRvIGJlIGluIHJhbmdlCisJIFt3bWluLCB3 bWF4XS4gICovCisgICAgICB3aWRlc3RfaW50IHd0bWluID0gd2k6OnRvX3dpZGVzdCAodnJwX3Zh bF9taW4gKHR5cGUpKTsKKyAgICAgIHdpZGVzdF9pbnQgd3RtYXggPSB3aTo6dG9fd2lkZXN0ICh2 cnBfdmFsX21heCAodHlwZSkpOworICAgICAgLyogSWYgYWxsIHZhbHVlcyBpbiBbd21pbiwgd21h eF0gYXJlIHNtYWxsZXIgdGhhbgorCSBbd3RtaW4sIHd0bWF4XSBvciBhbGwgYXJlIGxhcmdlciB0 aGFuIFt3dG1pbiwgd3RtYXhdLAorCSB0aGUgYXJpdGhtZXRpYyBvcGVyYXRpb24gd2lsbCBhbHdh eXMgb3ZlcmZsb3cuICAqLworICAgICAgaWYgKHdtYXggPCB3dG1pbiB8fCB3bWluID4gd3RtYXgp CisJcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAvKiBOb25lIG9m IHRoZSBiZWxvdyBzaG91bGQgbmVlZCBhICd0eXBlJywgYnV0IHdlIGFyZSBvbmx5IGNhbGxlZAot ICAgICBmb3IgYXNzaWdubWVudHMgYW5kIGNhbGxzIHdpdGggYSBMSFMuICAqLwotICB0cmVlIHR5 cGUgPSBUUkVFX1RZUEUgKGdpbXBsZV9nZXRfbGhzIChzdG10KSk7Ci0gIGlmIChJTlRFR1JBTF9U WVBFX1AgKHR5cGUpCi0gICAgICAmJiBnaW1wbGVfc3RtdF9ub25uZWdhdGl2ZV93YXJudl9wIChz dG10LCAmc29wKSkKLSAgICBzZXRfdmFsdWVfcmFuZ2VfdG9fbm9ubmVnYXRpdmUgKHZyLCB0eXBl KTsKLSAgZWxzZSBpZiAodnJwX3N0bXRfY29tcHV0ZXNfbm9uemVybyAoc3RtdCkpCi0gICAgewot ICAgICAgdnItPnNldF9ub256ZXJvICh0eXBlKTsKLSAgICAgIHZyLT5lcXVpdl9jbGVhciAoKTsK LSAgICB9Ci0gIGVsc2UKLSAgICB2ci0+c2V0X3ZhcnlpbmcgKHR5cGUpOwotfQotCi0KLS8qIFRy eSB0byBjb21wdXRlIGEgdXNlZnVsIHJhbmdlIG91dCBvZiBhc3NpZ25tZW50IFNUTVQgYW5kIHN0 b3JlIGl0Ci0gICBpbiAqVlIuICAqLwotCi12b2lkCi12cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2Vf ZnJvbV9hc3NpZ25tZW50ICh2YWx1ZV9yYW5nZV9lcXVpdiAqdnIsIGdhc3NpZ24gKnN0bXQpCi17 Ci0gIGVudW0gdHJlZV9jb2RlIGNvZGUgPSBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KTsK LQotICBpZiAoY29kZSA9PSBBU1NFUlRfRVhQUikKLSAgICBleHRyYWN0X3JhbmdlX2Zyb21fYXNz ZXJ0ICh2ciwgZ2ltcGxlX2Fzc2lnbl9yaHMxIChzdG10KSk7Ci0gIGVsc2UgaWYgKGNvZGUgPT0g U1NBX05BTUUpCi0gICAgZXh0cmFjdF9yYW5nZV9mcm9tX3NzYV9uYW1lICh2ciwgZ2ltcGxlX2Fz c2lnbl9yaHMxIChzdG10KSk7Ci0gIGVsc2UgaWYgKFRSRUVfQ09ERV9DTEFTUyAoY29kZSkgPT0g dGNjX2JpbmFyeSkKLSAgICBleHRyYWN0X3JhbmdlX2Zyb21fYmluYXJ5X2V4cHIgKHZyLCBnaW1w bGVfYXNzaWduX3Joc19jb2RlIChzdG10KSwKLQkJCQkgICAgVFJFRV9UWVBFIChnaW1wbGVfYXNz aWduX2xocyAoc3RtdCkpLAotCQkJCSAgICBnaW1wbGVfYXNzaWduX3JoczEgKHN0bXQpLAotCQkJ CSAgICBnaW1wbGVfYXNzaWduX3JoczIgKHN0bXQpKTsKLSAgZWxzZSBpZiAoVFJFRV9DT0RFX0NM QVNTIChjb2RlKSA9PSB0Y2NfdW5hcnkpCi0gICAgZXh0cmFjdF9yYW5nZV9mcm9tX3VuYXJ5X2V4 cHIgKHZyLCBnaW1wbGVfYXNzaWduX3Joc19jb2RlIChzdG10KSwKLQkJCQkgICBUUkVFX1RZUEUg KGdpbXBsZV9hc3NpZ25fbGhzIChzdG10KSksCi0JCQkJICAgZ2ltcGxlX2Fzc2lnbl9yaHMxIChz dG10KSk7Ci0gIGVsc2UgaWYgKGNvZGUgPT0gQ09ORF9FWFBSKQotICAgIGV4dHJhY3RfcmFuZ2Vf ZnJvbV9jb25kX2V4cHIgKHZyLCBzdG10KTsKLSAgZWxzZSBpZiAoVFJFRV9DT0RFX0NMQVNTIChj b2RlKSA9PSB0Y2NfY29tcGFyaXNvbikKLSAgICBleHRyYWN0X3JhbmdlX2Zyb21fY29tcGFyaXNv biAodnIsIHN0bXQpOwotICBlbHNlIGlmIChnZXRfZ2ltcGxlX3Joc19jbGFzcyAoY29kZSkgPT0g R0lNUExFX1NJTkdMRV9SSFMKLQkgICAmJiBpc19naW1wbGVfbWluX2ludmFyaWFudCAoZ2ltcGxl X2Fzc2lnbl9yaHMxIChzdG10KSkpCi0gICAgdnItPnNldCAoZ2ltcGxlX2Fzc2lnbl9yaHMxIChz dG10KSk7Ci0gIGVsc2UKLSAgICB2ci0+c2V0X3ZhcnlpbmcgKFRSRUVfVFlQRSAoZ2ltcGxlX2Fz c2lnbl9saHMgKHN0bXQpKSk7Ci0KLSAgaWYgKHZyLT52YXJ5aW5nX3AgKCkpCi0gICAgZXh0cmFj dF9yYW5nZV9iYXNpYyAodnIsIHN0bXQpOworICByZXR1cm4gdHJ1ZTsKIH0KIAogLyogR2l2ZW4g dHdvIG51bWVyaWMgdmFsdWUgcmFuZ2VzIFZSMCwgVlIxIGFuZCBhIGNvbXBhcmlzb24gY29kZSBD T01QOgpAQCAtMTgwOCwyMDIgKzYxNSw2IEBAIGJvdW5kc19vZl92YXJfaW5fbG9vcCAodHJlZSAq bWluLCB0cmVlICptYXgsIHJhbmdlX3F1ZXJ5ICpxdWVyeSwKICAgcmV0dXJuIHRydWU7CiB9CiAK LS8qIEdpdmVuIGEgcmFuZ2UgVlIsIGEgTE9PUCBhbmQgYSB2YXJpYWJsZSBWQVIsIGRldGVybWlu ZSB3aGV0aGVyIGl0Ci0gICB3b3VsZCBiZSBwcm9maXRhYmxlIHRvIGFkanVzdCBWUiB1c2luZyBz Y2FsYXIgZXZvbHV0aW9uIGluZm9ybWF0aW9uCi0gICBmb3IgVkFSLiAgSWYgc28sIHVwZGF0ZSBW UiB3aXRoIHRoZSBuZXcgbGltaXRzLiAgKi8KLQotdm9pZAotdnJfdmFsdWVzOjphZGp1c3RfcmFu Z2Vfd2l0aF9zY2V2ICh2YWx1ZV9yYW5nZV9lcXVpdiAqdnIsIGNsYXNzIGxvb3AgKmxvb3AsCi0J CQkJICAgZ2ltcGxlICpzdG10LCB0cmVlIHZhcikKLXsKLSAgdHJlZSBtaW4sIG1heDsKLSAgaWYg KGJvdW5kc19vZl92YXJfaW5fbG9vcCAoJm1pbiwgJm1heCwgdGhpcywgbG9vcCwgc3RtdCwgdmFy KSkKLSAgICB7Ci0gICAgICBpZiAodnItPnVuZGVmaW5lZF9wICgpIHx8IHZyLT52YXJ5aW5nX3Ag KCkpCi0JewotCSAgLyogRm9yIFZBUllJTkcgb3IgVU5ERUZJTkVEIHJhbmdlcywganVzdCBhYm91 dCBhbnl0aGluZyB3ZSBnZXQKLQkgICAgIGZyb20gc2NhbGFyIGV2b2x1dGlvbnMgc2hvdWxkIGJl IGJldHRlci4gICovCi0JICB2ci0+dXBkYXRlIChtaW4sIG1heCk7Ci0JfQotICAgICAgZWxzZSBp ZiAodnItPmtpbmQgKCkgPT0gVlJfUkFOR0UpCi0JewotCSAgLyogU3RhcnQgd2l0aCB0aGUgaW5w dXQgcmFuZ2UuLi4gKi8KLQkgIHRyZWUgdnJtaW4gPSB2ci0+bWluICgpOwotCSAgdHJlZSB2cm1h eCA9IHZyLT5tYXggKCk7Ci0KLQkgIC8qIC4uLmFuZCBuYXJyb3cgaXQgZG93biB3aXRoIHdoYXQg d2UgZ290IGZyb20gU0NFVi4gICovCi0JICBpZiAoY29tcGFyZV92YWx1ZXMgKG1pbiwgdnJtaW4p ID09IDEpCi0JICAgIHZybWluID0gbWluOwotCSAgaWYgKGNvbXBhcmVfdmFsdWVzIChtYXgsIHZy bWF4KSA9PSAtMSkKLQkgICAgdnJtYXggPSBtYXg7Ci0KLQkgIHZyLT51cGRhdGUgKHZybWluLCB2 cm1heCk7Ci0JfQotICAgICAgZWxzZSBpZiAodnItPmtpbmQgKCkgPT0gVlJfQU5USV9SQU5HRSkK LQl7Ci0JICAvKiA/PyBBcyBhbiBlbmhhbmNlbWVudCwgaWYgVlIsIE1JTiwgYW5kIE1BWCBhcmUg Y29uc3RhbnRzLCBvbmUKLQkgICAgIGNvdWxkIGp1c3QgaW50ZXJzZWN0IFZSIHdpdGggYSByYW5n ZSBvZiBbTUlOLE1BWF0uICAqLwotCX0KLSAgICB9Ci19Ci0KLS8qIER1bXAgdmFsdWUgcmFuZ2Vz IG9mIGFsbCBTU0FfTkFNRXMgdG8gRklMRS4gICovCi0KLXZvaWQKLXZyX3ZhbHVlczo6ZHVtcCAo RklMRSAqZmlsZSkKLXsKLSAgc2l6ZV90IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IG51bV92cl92 YWx1ZXM7IGkrKykKLSAgICB7Ci0gICAgICBpZiAodnJfdmFsdWVbaV0gJiYgc3NhX25hbWUgKGkp KQotCXsKLQkgIHByaW50X2dlbmVyaWNfZXhwciAoZmlsZSwgc3NhX25hbWUgKGkpKTsKLQkgIGZw cmludGYgKGZpbGUsICI6ICIpOwotCSAgZHVtcF92YWx1ZV9yYW5nZSAoZmlsZSwgdnJfdmFsdWVb aV0pOwotCSAgZnByaW50ZiAoZmlsZSwgIlxuIik7Ci0JfQotICAgIH0KLQotICBmcHJpbnRmIChm aWxlLCAiXG4iKTsKLX0KLQotLyogSW5pdGlhbGl6ZSBWUlAgbGF0dGljZS4gICovCi0KLXZyX3Zh bHVlczo6dnJfdmFsdWVzICgpIDogc2ltcGxpZmllciAodGhpcykKLXsKLSAgdmFsdWVzX3Byb3Bh Z2F0ZWQgPSBmYWxzZTsKLSAgbnVtX3ZyX3ZhbHVlcyA9IG51bV9zc2FfbmFtZXMgKiAyOwotICB2 cl92YWx1ZSA9IFhDTkVXVkVDICh2YWx1ZV9yYW5nZV9lcXVpdiAqLCBudW1fdnJfdmFsdWVzKTsK LSAgdnJfcGhpX2VkZ2VfY291bnRzID0gWENORVdWRUMgKGludCwgbnVtX3NzYV9uYW1lcyk7Ci0g IGJpdG1hcF9vYnN0YWNrX2luaXRpYWxpemUgKCZ2cnBfZXF1aXZfb2JzdGFjayk7Ci19Ci0KLS8q IEZyZWUgVlJQIGxhdHRpY2UuICAqLwotCi12cl92YWx1ZXM6On52cl92YWx1ZXMgKCkKLXsKLSAg LyogRnJlZSBhbGxvY2F0ZWQgbWVtb3J5LiAgKi8KLSAgZnJlZSAodnJfdmFsdWUpOwotICBmcmVl ICh2cl9waGlfZWRnZV9jb3VudHMpOwotICBiaXRtYXBfb2JzdGFja19yZWxlYXNlICgmdnJwX2Vx dWl2X29ic3RhY2spOwotCi0gIC8qIFNvIHRoYXQgd2UgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW4g VlJQIGRhdGEgYmVpbmcgYXZhaWxhYmxlCi0gICAgIGFuZCBub3QgYXZhaWxhYmxlLiAgKi8KLSAg dnJfdmFsdWUgPSBOVUxMOwotICB2cl9waGlfZWRnZV9jb3VudHMgPSBOVUxMOwotfQotCi0KLS8q IEEgaGFjay4gICovCi1zdGF0aWMgY2xhc3MgdnJfdmFsdWVzICp4X3ZyX3ZhbHVlczsKLQotLyog UmV0dXJuIHRoZSBzaW5nbGV0b24gdmFsdWUtcmFuZ2UgZm9yIE5BTUUgb3IgTkFNRS4gICovCi0K LXN0YXRpYyBpbmxpbmUgdHJlZQotdnJwX3ZhbHVlaXplICh0cmVlIG5hbWUpCi17Ci0gIGlmIChU UkVFX0NPREUgKG5hbWUpID09IFNTQV9OQU1FKQotICAgIHsKLSAgICAgIGNvbnN0IHZhbHVlX3Jh bmdlX2VxdWl2ICp2ciA9IHhfdnJfdmFsdWVzLT5nZXRfdmFsdWVfcmFuZ2UgKG5hbWUpOwotICAg ICAgaWYgKHZyLT5raW5kICgpID09IFZSX1JBTkdFCi0JICAmJiAoVFJFRV9DT0RFICh2ci0+bWlu ICgpKSA9PSBTU0FfTkFNRQotCSAgICAgIHx8IGlzX2dpbXBsZV9taW5faW52YXJpYW50ICh2ci0+ bWluICgpKSkKLQkgICYmIHZycF9vcGVyYW5kX2VxdWFsX3AgKHZyLT5taW4gKCksIHZyLT5tYXgg KCkpKQotCXJldHVybiB2ci0+bWluICgpOwotICAgIH0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLS8q IFJldHVybiB0aGUgc2luZ2xldG9uIHZhbHVlLXJhbmdlIGZvciBOQU1FIGlmIHRoYXQgaXMgYSBj b25zdGFudAotICAgYnV0IHNpZ25hbCB0byBub3QgZm9sbG93IFNTQSBlZGdlcy4gICovCi0KLXN0 YXRpYyBpbmxpbmUgdHJlZQotdnJwX3ZhbHVlaXplXzEgKHRyZWUgbmFtZSkKLXsKLSAgaWYgKFRS RUVfQ09ERSAobmFtZSkgPT0gU1NBX05BTUUpCi0gICAgewotICAgICAgLyogSWYgdGhlIGRlZmlu aXRpb24gbWF5IGJlIHNpbXVsYXRlZCBhZ2FpbiB3ZSBjYW5ub3QgZm9sbG93Ci0gICAgICAgICB0 aGlzIFNTQSBlZGdlIGFzIHRoZSBTU0EgcHJvcGFnYXRvciBkb2VzIG5vdCBuZWNlc3NhcmlseQot CSByZS12aXNpdCB0aGUgdXNlLiAgKi8KLSAgICAgIGdpbXBsZSAqZGVmX3N0bXQgPSBTU0FfTkFN RV9ERUZfU1RNVCAobmFtZSk7Ci0gICAgICBpZiAoIWdpbXBsZV9ub3BfcCAoZGVmX3N0bXQpCi0J ICAmJiBwcm9wX3NpbXVsYXRlX2FnYWluX3AgKGRlZl9zdG10KSkKLQlyZXR1cm4gTlVMTF9UUkVF OwotICAgICAgY29uc3QgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyID0geF92cl92YWx1ZXMtPmdldF92 YWx1ZV9yYW5nZSAobmFtZSk7Ci0gICAgICB0cmVlIHNpbmdsZXRvbjsKLSAgICAgIGlmICh2ci0+ c2luZ2xldG9uX3AgKCZzaW5nbGV0b24pKQotCXJldHVybiBzaW5nbGV0b247Ci0gICAgfQotICBy ZXR1cm4gbmFtZTsKLX0KLQotLyogR2l2ZW4gU1RNVCwgYW4gYXNzaWdubWVudCBvciBjYWxsLCBy ZXR1cm4gaXRzIExIUyBpZiB0aGUgdHlwZQotICAgb2YgdGhlIExIUyBpcyBzdWl0YWJsZSBmb3Ig VlJQIGFuYWx5c2lzLCBlbHNlIHJldHVybiBOVUxMX1RSRUUuICAqLwotCi10cmVlCi1nZXRfb3V0 cHV0X2Zvcl92cnAgKGdpbXBsZSAqc3RtdCkKLXsKLSAgaWYgKCFpc19naW1wbGVfYXNzaWduIChz dG10KSAmJiAhaXNfZ2ltcGxlX2NhbGwgKHN0bXQpKQotICAgIHJldHVybiBOVUxMX1RSRUU7Ci0K LSAgLyogV2Ugb25seSBrZWVwIHRyYWNrIG9mIHJhbmdlcyBpbiBpbnRlZ3JhbCBhbmQgcG9pbnRl ciB0eXBlcy4gICovCi0gIHRyZWUgbGhzID0gZ2ltcGxlX2dldF9saHMgKHN0bXQpOwotICBpZiAo VFJFRV9DT0RFIChsaHMpID09IFNTQV9OQU1FCi0gICAgICAmJiAoKElOVEVHUkFMX1RZUEVfUCAo VFJFRV9UWVBFIChsaHMpKQotCSAgIC8qIEl0IGlzIHZhbGlkIHRvIGhhdmUgTlVMTCBNSU4vTUFY IHZhbHVlcyBvbiBhIHR5cGUuICBTZWUKLQkgICAgICBidWlsZF9yYW5nZV90eXBlLiAgKi8KLQkg ICAmJiBUWVBFX01JTl9WQUxVRSAoVFJFRV9UWVBFIChsaHMpKQotCSAgICYmIFRZUEVfTUFYX1ZB TFVFIChUUkVFX1RZUEUgKGxocykpKQotCSAgfHwgUE9JTlRFUl9UWVBFX1AgKFRSRUVfVFlQRSAo bGhzKSkpKQotICAgIHJldHVybiBsaHM7Ci0KLSAgcmV0dXJuIE5VTExfVFJFRTsKLX0KLQotLyog VmlzaXQgYXNzaWdubWVudCBTVE1ULiAgSWYgaXQgcHJvZHVjZXMgYW4gaW50ZXJlc3RpbmcgcmFu Z2UsIHJlY29yZAotICAgdGhlIHJhbmdlIGluIFZSIGFuZCBzZXQgTEhTIHRvIE9VVFBVVF9QLiAg Ki8KLQotdm9pZAotdnJfdmFsdWVzOjp2cnBfdmlzaXRfYXNzaWdubWVudF9vcl9jYWxsIChnaW1w bGUgKnN0bXQsIHRyZWUgKm91dHB1dF9wLAotCQkJCQkgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyKQot ewotICB0cmVlIGxocyA9IGdldF9vdXRwdXRfZm9yX3ZycCAoc3RtdCk7Ci0gICpvdXRwdXRfcCA9 IGxoczsKLQotICAvKiBXZSBvbmx5IGtlZXAgdHJhY2sgb2YgcmFuZ2VzIGluIGludGVncmFsIGFu ZCBwb2ludGVyIHR5cGVzLiAgKi8KLSAgaWYgKGxocykKLSAgICB7Ci0gICAgICBlbnVtIGdpbXBs ZV9jb2RlIGNvZGUgPSBnaW1wbGVfY29kZSAoc3RtdCk7Ci0KLSAgICAgIC8qIFRyeSBmb2xkaW5n IHRoZSBzdGF0ZW1lbnQgdG8gYSBjb25zdGFudCBmaXJzdC4gICovCi0gICAgICB4X3ZyX3ZhbHVl cyA9IHRoaXM7Ci0gICAgICB0cmVlIHRlbSA9IGdpbXBsZV9mb2xkX3N0bXRfdG9fY29uc3RhbnRf MSAoc3RtdCwgdnJwX3ZhbHVlaXplLAotCQkJCQkJIHZycF92YWx1ZWl6ZV8xKTsKLSAgICAgIHhf dnJfdmFsdWVzID0gTlVMTDsKLSAgICAgIGlmICh0ZW0pCi0JewotCSAgaWYgKFRSRUVfQ09ERSAo dGVtKSA9PSBTU0FfTkFNRQotCSAgICAgICYmIChTU0FfTkFNRV9JU19ERUZBVUxUX0RFRiAodGVt KQotCQkgIHx8ICEgcHJvcF9zaW11bGF0ZV9hZ2Fpbl9wIChTU0FfTkFNRV9ERUZfU1RNVCAodGVt KSkpKQotCSAgICB7Ci0JICAgICAgZXh0cmFjdF9yYW5nZV9mcm9tX3NzYV9uYW1lICh2ciwgdGVt KTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLQkgIGVsc2UgaWYgKGlzX2dpbXBsZV9taW5faW52 YXJpYW50ICh0ZW0pKQotCSAgICB7Ci0JICAgICAgdnItPnNldCAodGVtKTsKLQkgICAgICByZXR1 cm47Ci0JICAgIH0KLQl9Ci0gICAgICAvKiBUaGVuIGRpc3BhdGNoIHRvIHZhbHVlLXJhbmdlIGV4 dHJhY3RpbmcgZnVuY3Rpb25zLiAgKi8KLSAgICAgIGlmIChjb2RlID09IEdJTVBMRV9DQUxMKQot CWV4dHJhY3RfcmFuZ2VfYmFzaWMgKHZyLCBzdG10KTsKLSAgICAgIGVsc2UKLQlleHRyYWN0X3Jh bmdlX2Zyb21fYXNzaWdubWVudCAodnIsIGFzX2EgPGdhc3NpZ24gKj4gKHN0bXQpKTsKLSAgICB9 Ci19Ci0KIC8qIEhlbHBlciB0aGF0IGdldHMgdGhlIHZhbHVlIHJhbmdlIG9mIHRoZSBTU0FfTkFN RSB3aXRoIHZlcnNpb24gSQogICAgb3IgYSBzeW1ib2xpYyByYW5nZSBjb250YWluaW5nIHRoZSBT U0FfTkFNRSBvbmx5IGlmIHRoZSB2YWx1ZSByYW5nZQogICAgaXMgdmFyeWluZyBvciB1bmRlZmlu ZWQuICBVc2VzIFRFTSBhcyBzdG9yYWdlIGZvciB0aGUgYWx0ZXJuYXRlIHJhbmdlLiAgKi8KQEAg LTIzNTIsMTAwICs5NjMsNiBAQCBzaW1wbGlmeV91c2luZ19yYW5nZXM6OnZycF9ldmFsdWF0ZV9j b25kaXRpb25hbF93YXJudl93aXRoX29wcwogICByZXR1cm4gTlVMTF9UUkVFOwogfQogCi0vKiBH aXZlbiAoQ09ERSBPUDAgT1AxKSB3aXRoaW4gU1RNVCwgdHJ5IHRvIHNpbXBsaWZ5IGl0IGJhc2Vk IG9uIHZhbHVlIHJhbmdlCi0gICBpbmZvcm1hdGlvbi4gIFJldHVybiBOVUxMIGlmIHRoZSBjb25k aXRpb25hbCBjYW5ub3QgYmUgZXZhbHVhdGVkLgotICAgVGhlIHJhbmdlcyBvZiBhbGwgdGhlIG5h bWVzIGVxdWl2YWxlbnQgd2l0aCB0aGUgb3BlcmFuZHMgaW4gQ09ORAotICAgd2lsbCBiZSB1c2Vk IHdoZW4gdHJ5aW5nIHRvIGNvbXB1dGUgdGhlIHZhbHVlLiAgSWYgdGhlIHJlc3VsdCBpcwotICAg YmFzZWQgb24gdW5kZWZpbmVkIHNpZ25lZCBvdmVyZmxvdywgaXNzdWUgYSB3YXJuaW5nIGlmCi0g ICBhcHByb3ByaWF0ZS4gICovCi0KLXRyZWUKLXNpbXBsaWZ5X3VzaW5nX3Jhbmdlczo6dnJwX2V2 YWx1YXRlX2NvbmRpdGlvbmFsICh0cmVlX2NvZGUgY29kZSwgdHJlZSBvcDAsCi0JCQkJCQkgdHJl ZSBvcDEsIGdpbXBsZSAqc3RtdCkKLXsKLSAgYm9vbCBzb3A7Ci0gIHRyZWUgcmV0OwotICBib29s IG9ubHlfcmFuZ2VzOwotCi0gIC8qIFNvbWUgcGFzc2VzIGFuZCBmb2xkaW5ncyBsZWFrIGNvbnN0 YW50cyB3aXRoIG92ZXJmbG93IGZsYWcgc2V0Ci0gICAgIGludG8gdGhlIElMLiAgQXZvaWQgZG9p bmcgd3JvbmcgdGhpbmdzIHdpdGggdGhlc2UgYW5kIGJhaWwgb3V0LiAgKi8KLSAgaWYgKChUUkVF X0NPREUgKG9wMCkgPT0gSU5URUdFUl9DU1QKLSAgICAgICAmJiBUUkVFX09WRVJGTE9XIChvcDAp KQotICAgICAgfHwgKFRSRUVfQ09ERSAob3AxKSA9PSBJTlRFR0VSX0NTVAotCSAgJiYgVFJFRV9P VkVSRkxPVyAob3AxKSkpCi0gICAgcmV0dXJuIE5VTExfVFJFRTsKLQotICBzb3AgPSBmYWxzZTsK LSAgcmV0ID0gdnJwX2V2YWx1YXRlX2NvbmRpdGlvbmFsX3dhcm52X3dpdGhfb3BzIChzdG10LCBj b2RlLCBvcDAsIG9wMSwgdHJ1ZSwKLQkJCQkJCSAmc29wLCAmb25seV9yYW5nZXMpOwotCi0gIGlm IChyZXQgJiYgc29wKQotICAgIHsKLSAgICAgIGVudW0gd2Fybl9zdHJpY3Rfb3ZlcmZsb3dfY29k ZSB3YzsKLSAgICAgIGNvbnN0IGNoYXIqIHdhcm5tc2c7Ci0KLSAgICAgIGlmIChpc19naW1wbGVf bWluX2ludmFyaWFudCAocmV0KSkKLQl7Ci0JICB3YyA9IFdBUk5fU1RSSUNUX09WRVJGTE9XX0NP TkRJVElPTkFMOwotCSAgd2Fybm1zZyA9IEdfKCJhc3N1bWluZyBzaWduZWQgb3ZlcmZsb3cgZG9l cyBub3Qgb2NjdXIgd2hlbiAiCi0JCSAgICAgICAic2ltcGxpZnlpbmcgY29uZGl0aW9uYWwgdG8g Y29uc3RhbnQiKTsKLQl9Ci0gICAgICBlbHNlCi0JewotCSAgd2MgPSBXQVJOX1NUUklDVF9PVkVS RkxPV19DT01QQVJJU09OOwotCSAgd2Fybm1zZyA9IEdfKCJhc3N1bWluZyBzaWduZWQgb3ZlcmZs b3cgZG9lcyBub3Qgb2NjdXIgd2hlbiAiCi0JCSAgICAgICAic2ltcGxpZnlpbmcgY29uZGl0aW9u YWwiKTsKLQl9Ci0KLSAgICAgIGlmIChpc3N1ZV9zdHJpY3Rfb3ZlcmZsb3dfd2FybmluZyAod2Mp KQotCXsKLQkgIGxvY2F0aW9uX3QgbG9jYXRpb247Ci0KLQkgIGlmICghZ2ltcGxlX2hhc19sb2Nh dGlvbiAoc3RtdCkpCi0JICAgIGxvY2F0aW9uID0gaW5wdXRfbG9jYXRpb247Ci0JICBlbHNlCi0J ICAgIGxvY2F0aW9uID0gZ2ltcGxlX2xvY2F0aW9uIChzdG10KTsKLQkgIHdhcm5pbmdfYXQgKGxv Y2F0aW9uLCBPUFRfV3N0cmljdF9vdmVyZmxvdywgIiVzIiwgd2Fybm1zZyk7Ci0JfQotICAgIH0K LQotICBpZiAod2Fybl90eXBlX2xpbWl0cwotICAgICAgJiYgcmV0ICYmIG9ubHlfcmFuZ2VzCi0g ICAgICAmJiBUUkVFX0NPREVfQ0xBU1MgKGNvZGUpID09IHRjY19jb21wYXJpc29uCi0gICAgICAm JiBUUkVFX0NPREUgKG9wMCkgPT0gU1NBX05BTUUpCi0gICAgewotICAgICAgLyogSWYgdGhlIGNv bXBhcmlzb24gaXMgYmVpbmcgZm9sZGVkIGFuZCB0aGUgb3BlcmFuZCBvbiB0aGUgTEhTCi0JIGlz IGJlaW5nIGNvbXBhcmVkIGFnYWluc3QgYSBjb25zdGFudCB2YWx1ZSB0aGF0IGlzIG91dHNpZGUg b2YKLQkgdGhlIG5hdHVyYWwgcmFuZ2Ugb2YgT1AwJ3MgdHlwZSwgdGhlbiB0aGUgcHJlZGljYXRl IHdpbGwKLQkgYWx3YXlzIGZvbGQgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgT1AwLiAgSWYg LVd0eXBlLWxpbWl0cwotCSB3YXMgc3BlY2lmaWVkLCBlbWl0IGEgd2FybmluZy4gICovCi0gICAg ICB0cmVlIHR5cGUgPSBUUkVFX1RZUEUgKG9wMCk7Ci0gICAgICBjb25zdCB2YWx1ZV9yYW5nZV9l cXVpdiAqdnIwID0gcXVlcnktPmdldF92YWx1ZV9yYW5nZSAob3AwLCBzdG10KTsKLQotICAgICAg aWYgKHZyMC0+dmFyeWluZ19wICgpCi0JICAmJiBJTlRFR1JBTF9UWVBFX1AgKHR5cGUpCi0JICAm JiBpc19naW1wbGVfbWluX2ludmFyaWFudCAob3AxKSkKLQl7Ci0JICBsb2NhdGlvbl90IGxvY2F0 aW9uOwotCi0JICBpZiAoIWdpbXBsZV9oYXNfbG9jYXRpb24gKHN0bXQpKQotCSAgICBsb2NhdGlv biA9IGlucHV0X2xvY2F0aW9uOwotCSAgZWxzZQotCSAgICBsb2NhdGlvbiA9IGdpbXBsZV9sb2Nh dGlvbiAoc3RtdCk7Ci0KLQkgIHdhcm5pbmdfYXQgKGxvY2F0aW9uLCBPUFRfV3R5cGVfbGltaXRz LAotCQkgICAgICBpbnRlZ2VyX3plcm9wIChyZXQpCi0JCSAgICAgID8gR18oImNvbXBhcmlzb24g YWx3YXlzIGZhbHNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdWUgdG8gbGltaXRl ZCByYW5nZSBvZiBkYXRhIHR5cGUiKQotCQkgICAgICA6IEdfKCJjb21wYXJpc29uIGFsd2F5cyB0 cnVlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJkdWUgdG8gbGltaXRlZCByYW5nZSBv ZiBkYXRhIHR5cGUiKSk7Ci0JfQotICAgIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0KIC8qIFZp c2l0IGNvbmRpdGlvbmFsIHN0YXRlbWVudCBTVE1ULiAgSWYgd2UgY2FuIGRldGVybWluZSB3aGlj aCBlZGdlCiAgICB3aWxsIGJlIHRha2VuIG91dCBvZiBTVE1UJ3MgYmFzaWMgYmxvY2ssIHJlY29y ZCBpdCBpbgogICAgKlRBS0VOX0VER0VfUC4gIE90aGVyd2lzZSwgc2V0ICpUQUtFTl9FREdFX1Ag dG8gTlVMTC4gICovCkBAIC0yNjE5LDMzNiArMTEzNiw2IEBAIGZpbmRfY2FzZV9sYWJlbF9yYW5n ZXMgKGdzd2l0Y2ggKnN0bXQsIGNvbnN0IHZhbHVlX3JhbmdlICp2ciwKICAgcmV0dXJuIGZhbHNl OwogfQogCi0vKiBWaXNpdCBzd2l0Y2ggc3RhdGVtZW50IFNUTVQuICBJZiB3ZSBjYW4gZGV0ZXJt aW5lIHdoaWNoIGVkZ2UKLSAgIHdpbGwgYmUgdGFrZW4gb3V0IG9mIFNUTVQncyBiYXNpYyBibG9j aywgcmVjb3JkIGl0IGluCi0gICAqVEFLRU5fRURHRV9QLiAgT3RoZXJ3aXNlLCAqVEFLRU5fRURH RV9QIHNldCB0byBOVUxMLiAgKi8KLQotdm9pZAotdnJfdmFsdWVzOjp2cnBfdmlzaXRfc3dpdGNo X3N0bXQgKGdzd2l0Y2ggKnN0bXQsIGVkZ2UgKnRha2VuX2VkZ2VfcCkKLXsKLSAgdHJlZSBvcCwg dmFsOwotICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnI7Ci0gIHNpemVfdCBpID0gMCwgaiA9 IDAsIGssIGw7Ci0gIGJvb2wgdGFrZV9kZWZhdWx0OwotCi0gICp0YWtlbl9lZGdlX3AgPSBOVUxM OwotICBvcCA9IGdpbXBsZV9zd2l0Y2hfaW5kZXggKHN0bXQpOwotICBpZiAoVFJFRV9DT0RFIChv cCkgIT0gU1NBX05BTUUpCi0gICAgcmV0dXJuOwotCi0gIHZyID0gZ2V0X3ZhbHVlX3JhbmdlIChv cCk7Ci0gIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCi0gICAg ewotICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiXG5WaXNpdGluZyBzd2l0Y2ggZXhwcmVzc2lv biB3aXRoIG9wZXJhbmQgIik7Ci0gICAgICBwcmludF9nZW5lcmljX2V4cHIgKGR1bXBfZmlsZSwg b3ApOwotICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiIHdpdGgga25vd24gcmFuZ2UgIik7Ci0g ICAgICBkdW1wX3ZhbHVlX3JhbmdlIChkdW1wX2ZpbGUsIHZyKTsKLSAgICAgIGZwcmludGYgKGR1 bXBfZmlsZSwgIlxuIik7Ci0gICAgfQotCi0gIGlmICh2ci0+dW5kZWZpbmVkX3AgKCkKLSAgICAg IHx8IHZyLT52YXJ5aW5nX3AgKCkKLSAgICAgIHx8IHZyLT5zeW1ib2xpY19wICgpKQotICAgIHJl dHVybjsKLQotICAvKiBGaW5kIHRoZSBzaW5nbGUgZWRnZSB0aGF0IGlzIHRha2VuIGZyb20gdGhl IHN3aXRjaCBleHByZXNzaW9uLiAgKi8KLSAgdGFrZV9kZWZhdWx0ID0gIWZpbmRfY2FzZV9sYWJl bF9yYW5nZXMgKHN0bXQsIHZyLCAmaSwgJmosICZrLCAmbCk7Ci0KLSAgLyogQ2hlY2sgaWYgdGhl IHJhbmdlIHNwYW5zIG5vIENBU0VfTEFCRUwuIElmIHNvLCB3ZSBvbmx5IHJlYWNoIHRoZSBkZWZh dWx0Ci0gICAgIGxhYmVsICovCi0gIGlmIChqIDwgaSkKLSAgICB7Ci0gICAgICBnY2NfYXNzZXJ0 ICh0YWtlX2RlZmF1bHQpOwotICAgICAgdmFsID0gZ2ltcGxlX3N3aXRjaF9kZWZhdWx0X2xhYmVs IChzdG10KTsKLSAgICB9Ci0gIGVsc2UKLSAgICB7Ci0gICAgICAvKiBDaGVjayBpZiBsYWJlbHMg d2l0aCBpbmRleCBpIHRvIGogYW5kIG1heWJlIHRoZSBkZWZhdWx0IGxhYmVsCi0JIGFyZSBhbGwg cmVhY2hpbmcgdGhlIHNhbWUgbGFiZWwuICAqLwotCi0gICAgICB2YWwgPSBnaW1wbGVfc3dpdGNo X2xhYmVsIChzdG10LCBpKTsKLSAgICAgIGlmICh0YWtlX2RlZmF1bHQKLQkgICYmIENBU0VfTEFC RUwgKGdpbXBsZV9zd2l0Y2hfZGVmYXVsdF9sYWJlbCAoc3RtdCkpCi0JICAhPSBDQVNFX0xBQkVM ICh2YWwpKQotCXsKLQkgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlM UykpCi0JICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIiAgbm90IGEgc2luZ2xlIGRlc3RpbmF0aW9u IGZvciB0aGlzICIKLQkJICAgICAicmFuZ2VcbiIpOwotCSAgcmV0dXJuOwotCX0KLSAgICAgIGZv ciAoKytpOyBpIDw9IGo7ICsraSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChDQVNFX0xBQkVM IChnaW1wbGVfc3dpdGNoX2xhYmVsIChzdG10LCBpKSkgIT0gQ0FTRV9MQUJFTCAodmFsKSkKLQkg ICAgewotCSAgICAgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykp Ci0JCWZwcmludGYgKGR1bXBfZmlsZSwgIiAgbm90IGEgc2luZ2xlIGRlc3RpbmF0aW9uIGZvciB0 aGlzICIKLQkJCSAicmFuZ2VcbiIpOwotCSAgICAgIHJldHVybjsKLQkgICAgfQotICAgICAgICB9 Ci0gICAgICBmb3IgKDsgayA8PSBsOyArK2spCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoQ0FT RV9MQUJFTCAoZ2ltcGxlX3N3aXRjaF9sYWJlbCAoc3RtdCwgaykpICE9IENBU0VfTEFCRUwgKHZh bCkpCi0JICAgIHsKLQkgICAgICBpZiAoZHVtcF9maWxlICYmIChkdW1wX2ZsYWdzICYgVERGX0RF VEFJTFMpKQotCQlmcHJpbnRmIChkdW1wX2ZpbGUsICIgIG5vdCBhIHNpbmdsZSBkZXN0aW5hdGlv biBmb3IgdGhpcyAiCi0JCQkgInJhbmdlXG4iKTsKLQkgICAgICByZXR1cm47Ci0JICAgIH0KLSAg ICAgICAgfQotICAgIH0KLQotICAqdGFrZW5fZWRnZV9wID0gZmluZF9lZGdlIChnaW1wbGVfYmIg KHN0bXQpLAotCQkJICAgICBsYWJlbF90b19ibG9jayAoY2Z1biwgQ0FTRV9MQUJFTCAodmFsKSkp OwotCi0gIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCi0gICAg ewotICAgICAgZnByaW50ZiAoZHVtcF9maWxlLCAiICB3aWxsIHRha2UgZWRnZSB0byAiKTsKLSAg ICAgIHByaW50X2dlbmVyaWNfc3RtdCAoZHVtcF9maWxlLCBDQVNFX0xBQkVMICh2YWwpKTsKLSAg ICB9Ci19Ci0KLQotLyogRXZhbHVhdGUgc3RhdGVtZW50IFNUTVQuICBJZiB0aGUgc3RhdGVtZW50 IHByb2R1Y2VzIGEgdXNlZnVsIHJhbmdlLAotICAgc2V0IFZSIGFuZCBjb3JlcHNwb25kaW5nIE9V VFBVVF9QLgotCi0gICBJZiBTVE1UIGlzIGEgY29uZGl0aW9uYWwgYnJhbmNoIGFuZCB3ZSBjYW4g ZGV0ZXJtaW5lIGl0cyB0cnV0aAotICAgdmFsdWUsIHRoZSB0YWtlbiBlZGdlIGlzIHJlY29yZGVk IGluICpUQUtFTl9FREdFX1AuICAqLwotCi12b2lkCi12cl92YWx1ZXM6OmV4dHJhY3RfcmFuZ2Vf ZnJvbV9zdG10IChnaW1wbGUgKnN0bXQsIGVkZ2UgKnRha2VuX2VkZ2VfcCwKLQkJCQkgICAgdHJl ZSAqb3V0cHV0X3AsIHZhbHVlX3JhbmdlX2VxdWl2ICp2cikKLXsKLQotICBpZiAoZHVtcF9maWxl ICYmIChkdW1wX2ZsYWdzICYgVERGX0RFVEFJTFMpKQotICAgIHsKLSAgICAgIGZwcmludGYgKGR1 bXBfZmlsZSwgIlxuZXh0cmFjdF9yYW5nZV9mcm9tX3N0bXQgdmlzaXRpbmc6XG4iKTsKLSAgICAg IHByaW50X2dpbXBsZV9zdG10IChkdW1wX2ZpbGUsIHN0bXQsIDAsIGR1bXBfZmxhZ3MpOwotICAg IH0KLQotICBpZiAoIXN0bXRfaW50ZXJlc3RpbmdfZm9yX3ZycCAoc3RtdCkpCi0gICAgZ2NjX2Fz c2VydCAoc3RtdF9lbmRzX2JiX3AgKHN0bXQpKTsKLSAgZWxzZSBpZiAoaXNfZ2ltcGxlX2Fzc2ln biAoc3RtdCkgfHwgaXNfZ2ltcGxlX2NhbGwgKHN0bXQpKQotICAgIHZycF92aXNpdF9hc3NpZ25t ZW50X29yX2NhbGwgKHN0bXQsIG91dHB1dF9wLCB2cik7Ci0gIGVsc2UgaWYgKGdpbXBsZV9jb2Rl IChzdG10KSA9PSBHSU1QTEVfQ09ORCkKLSAgICBzaW1wbGlmaWVyLnZycF92aXNpdF9jb25kX3N0 bXQgKGFzX2EgPGdjb25kICo+IChzdG10KSwgdGFrZW5fZWRnZV9wKTsKLSAgZWxzZSBpZiAoZ2lt cGxlX2NvZGUgKHN0bXQpID09IEdJTVBMRV9TV0lUQ0gpCi0gICAgdnJwX3Zpc2l0X3N3aXRjaF9z dG10IChhc19hIDxnc3dpdGNoICo+IChzdG10KSwgdGFrZW5fZWRnZV9wKTsKLX0KLQotLyogVmlz aXQgYWxsIGFyZ3VtZW50cyBmb3IgUEhJIG5vZGUgUEhJIHRoYXQgZmxvdyB0aHJvdWdoIGV4ZWN1 dGFibGUKLSAgIGVkZ2VzLiAgSWYgYSB2YWxpZCB2YWx1ZSByYW5nZSBjYW4gYmUgZGVyaXZlZCBm cm9tIGFsbCB0aGUgaW5jb21pbmcKLSAgIHZhbHVlIHJhbmdlcywgc2V0IGEgbmV3IHJhbmdlIGlu IFZSX1JFU1VMVC4gICovCi0KLXZvaWQKLXZyX3ZhbHVlczo6ZXh0cmFjdF9yYW5nZV9mcm9tX3Bo aV9ub2RlIChncGhpICpwaGksCi0JCQkJCXZhbHVlX3JhbmdlX2VxdWl2ICp2cl9yZXN1bHQpCi17 Ci0gIHRyZWUgbGhzID0gUEhJX1JFU1VMVCAocGhpKTsKLSAgY29uc3QgdmFsdWVfcmFuZ2VfZXF1 aXYgKmxoc192ciA9IGdldF92YWx1ZV9yYW5nZSAobGhzKTsKLSAgYm9vbCBmaXJzdCA9IHRydWU7 Ci0gIGludCBvbGRfZWRnZXM7Ci0gIGNsYXNzIGxvb3AgKmw7Ci0KLSAgaWYgKGR1bXBfZmlsZSAm JiAoZHVtcF9mbGFncyAmIFRERl9ERVRBSUxTKSkKLSAgICB7Ci0gICAgICBmcHJpbnRmIChkdW1w X2ZpbGUsICJcblZpc2l0aW5nIFBISSBub2RlOiAiKTsKLSAgICAgIHByaW50X2dpbXBsZV9zdG10 IChkdW1wX2ZpbGUsIHBoaSwgMCwgZHVtcF9mbGFncyk7Ci0gICAgfQotCi0gIGJvb2wgbWF5X3Np bXVsYXRlX2JhY2tlZGdlX2FnYWluID0gZmFsc2U7Ci0gIGludCBlZGdlcyA9IDA7Ci0gIGZvciAo c2l6ZV90IGkgPSAwOyBpIDwgZ2ltcGxlX3BoaV9udW1fYXJncyAocGhpKTsgaSsrKQotICAgIHsK LSAgICAgIGVkZ2UgZSA9IGdpbXBsZV9waGlfYXJnX2VkZ2UgKHBoaSwgaSk7Ci0KLSAgICAgIGlm IChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykpCi0JewotCSAgZnByaW50 ZiAoZHVtcF9maWxlLAotCSAgICAgICIgICAgQXJndW1lbnQgIyVkICglZCAtPiAlZCAlc2V4ZWN1 dGFibGUpXG4iLAotCSAgICAgIChpbnQpIGksIGUtPnNyYy0+aW5kZXgsIGUtPmRlc3QtPmluZGV4 LAotCSAgICAgIChlLT5mbGFncyAmIEVER0VfRVhFQ1VUQUJMRSkgPyAiIiA6ICJub3QgIik7Ci0J fQotCi0gICAgICBpZiAoZS0+ZmxhZ3MgJiBFREdFX0VYRUNVVEFCTEUpCi0JewotCSAgdmFsdWVf cmFuZ2VfZXF1aXYgdnJfYXJnX3RlbTsKLQkgIGNvbnN0IHZhbHVlX3JhbmdlX2VxdWl2ICp2cl9h cmcgPSAmdnJfYXJnX3RlbTsKLQotCSAgKytlZGdlczsKLQotCSAgdHJlZSBhcmcgPSBQSElfQVJH X0RFRiAocGhpLCBpKTsKLQkgIGlmIChUUkVFX0NPREUgKGFyZykgPT0gU1NBX05BTUUpCi0JICAg IHsKLQkgICAgICAvKiBTZWUgaWYgd2UgYXJlIGV2ZW50dWFsbHkgZ29pbmcgdG8gY2hhbmdlIG9u ZSBvZiB0aGUgYXJncy4gICovCi0JICAgICAgZ2ltcGxlICpkZWZfc3RtdCA9IFNTQV9OQU1FX0RF Rl9TVE1UIChhcmcpOwotCSAgICAgIGlmICghIGdpbXBsZV9ub3BfcCAoZGVmX3N0bXQpCi0JCSAg JiYgcHJvcF9zaW11bGF0ZV9hZ2Fpbl9wIChkZWZfc3RtdCkKLQkJICAmJiBlLT5mbGFncyAmIEVE R0VfREZTX0JBQ0spCi0JCW1heV9zaW11bGF0ZV9iYWNrZWRnZV9hZ2FpbiA9IHRydWU7Ci0KLQkg ICAgICBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAqdnJfYXJnXyA9IGdldF92YWx1ZV9yYW5nZSAo YXJnKTsKLQkgICAgICAvKiBEbyBub3QgYWxsb3cgZXF1aXZhbGVuY2VzIG9yIHN5bWJvbGljIHJh bmdlcyB0byBsZWFrIGluIGZyb20KLQkJIGJhY2tlZGdlcy4gIFRoYXQgY3JlYXRlcyBpbnZhbGlk IGVxdWl2YWxlbmNpZXMuCi0JCSBTZWUgUFI1MzQ2NSBhbmQgUFI1NDc2Ny4gICovCi0JICAgICAg aWYgKGUtPmZsYWdzICYgRURHRV9ERlNfQkFDSykKLQkJewotCQkgIGlmICghdnJfYXJnXy0+dmFy eWluZ19wICgpICYmICF2cl9hcmdfLT51bmRlZmluZWRfcCAoKSkKLQkJICAgIHsKLQkJICAgICAg dnJfYXJnX3RlbS5zZXQgKHZyX2FyZ18tPm1pbiAoKSwgdnJfYXJnXy0+bWF4ICgpLCBOVUxMLAot CQkJCSAgICAgIHZyX2FyZ18tPmtpbmQgKCkpOwotCQkgICAgICBpZiAodnJfYXJnX3RlbS5zeW1i b2xpY19wICgpKQotCQkJdnJfYXJnX3RlbS5zZXRfdmFyeWluZyAoVFJFRV9UWVBFIChhcmcpKTsK LQkJICAgIH0KLQkJICBlbHNlCi0JCSAgICB2cl9hcmcgPSB2cl9hcmdfOwotCQl9Ci0JICAgICAg LyogSWYgdGhlIG5vbi1iYWNrZWRnZSBhcmd1bWVudHMgcmFuZ2UgaXMgVlJfVkFSWUlORyB0aGVu Ci0JCSB3ZSBjYW4gc3RpbGwgdHJ5IHJlY29yZGluZyBhIHNpbXBsZSBlcXVpdmFsZW5jZS4gICov Ci0JICAgICAgZWxzZSBpZiAodnJfYXJnXy0+dmFyeWluZ19wICgpKQotCQl2cl9hcmdfdGVtLnNl dCAoYXJnKTsKLQkgICAgICBlbHNlCi0JCXZyX2FyZyA9IHZyX2FyZ187Ci0JICAgIH0KLQkgIGVs c2UKLQkgICAgewotCSAgICAgIGlmIChUUkVFX09WRVJGTE9XX1AgKGFyZykpCi0JCWFyZyA9IGRy b3BfdHJlZV9vdmVyZmxvdyAoYXJnKTsKLQotCSAgICAgIHZyX2FyZ190ZW0uc2V0IChhcmcpOwot CSAgICB9Ci0KLQkgIGlmIChkdW1wX2ZpbGUgJiYgKGR1bXBfZmxhZ3MgJiBUREZfREVUQUlMUykp Ci0JICAgIHsKLQkgICAgICBmcHJpbnRmIChkdW1wX2ZpbGUsICJcdCIpOwotCSAgICAgIHByaW50 X2dlbmVyaWNfZXhwciAoZHVtcF9maWxlLCBhcmcsIGR1bXBfZmxhZ3MpOwotCSAgICAgIGZwcmlu dGYgKGR1bXBfZmlsZSwgIjogIik7Ci0JICAgICAgZHVtcF92YWx1ZV9yYW5nZSAoZHVtcF9maWxl LCB2cl9hcmcpOwotCSAgICAgIGZwcmludGYgKGR1bXBfZmlsZSwgIlxuIik7Ci0JICAgIH0KLQot CSAgaWYgKGZpcnN0KQotCSAgICB2cl9yZXN1bHQtPmRlZXBfY29weSAodnJfYXJnKTsKLQkgIGVs c2UKLQkgICAgdnJfcmVzdWx0LT5sZWdhY3lfdmVyYm9zZV91bmlvbl8gKHZyX2FyZyk7Ci0JICBm aXJzdCA9IGZhbHNlOwotCi0JICBpZiAodnJfcmVzdWx0LT52YXJ5aW5nX3AgKCkpCi0JICAgIGJy ZWFrOwotCX0KLSAgICB9Ci0KLSAgaWYgKHZyX3Jlc3VsdC0+dmFyeWluZ19wICgpKQotICAgIGdv dG8gdmFyeWluZzsKLSAgZWxzZSBpZiAodnJfcmVzdWx0LT51bmRlZmluZWRfcCAoKSkKLSAgICBn b3RvIHVwZGF0ZV9yYW5nZTsKLQotICBvbGRfZWRnZXMgPSB2cl9waGlfZWRnZV9jb3VudHNbU1NB X05BTUVfVkVSU0lPTiAobGhzKV07Ci0gIHZyX3BoaV9lZGdlX2NvdW50c1tTU0FfTkFNRV9WRVJT SU9OIChsaHMpXSA9IGVkZ2VzOwotCi0gIC8qIFRvIHByZXZlbnQgaW5maW5pdGUgaXRlcmF0aW9u cyBpbiB0aGUgYWxnb3JpdGhtLCBkZXJpdmUgcmFuZ2VzCi0gICAgIHdoZW4gdGhlIG5ldyB2YWx1 ZSBpcyBzbGlnaHRseSBiaWdnZXIgb3Igc21hbGxlciB0aGFuIHRoZQotICAgICBwcmV2aW91cyBv bmUuICBXZSBkb24ndCBkbyB0aGlzIGlmIHdlIGhhdmUgc2VlbiBhIG5ldyBleGVjdXRhYmxlCi0g ICAgIGVkZ2U7IHRoaXMgaGVscHMgdXMgYXZvaWQgYW4gaW5maW5pdHkgZm9yIGNvbmRpdGlvbmFs cwotICAgICB3aGljaCBhcmUgbm90IGluIGEgbG9vcC4gIElmIHRoZSBvbGQgdmFsdWUtcmFuZ2Ug d2FzIFZSX1VOREVGSU5FRAotICAgICB1c2UgdGhlIHVwZGF0ZWQgcmFuZ2UgYW5kIGl0ZXJhdGUg b25lIG1vcmUgdGltZS4gIElmIHdlIHdpbGwgbm90Ci0gICAgIHNpbXVsYXRlIHRoaXMgUEhJIGFn YWluIHZpYSB0aGUgYmFja2VkZ2UgYWxsb3cgdXMgdG8gaXRlcmF0ZS4gICovCi0gIGlmIChlZGdl cyA+IDAKLSAgICAgICYmIGdpbXBsZV9waGlfbnVtX2FyZ3MgKHBoaSkgPiAxCi0gICAgICAmJiBl ZGdlcyA9PSBvbGRfZWRnZXMKLSAgICAgICYmICFsaHNfdnItPnVuZGVmaW5lZF9wICgpCi0gICAg ICAmJiBtYXlfc2ltdWxhdGVfYmFja2VkZ2VfYWdhaW4pCi0gICAgewotICAgICAgLyogQ29tcGFy ZSBvbGQgYW5kIG5ldyByYW5nZXMsIGZhbGwgYmFjayB0byB2YXJ5aW5nIGlmIHRoZQotICAgICAg ICAgdmFsdWVzIGFyZSBub3QgY29tcGFyYWJsZS4gICovCi0gICAgICBpbnQgY21wX21pbiA9IGNv bXBhcmVfdmFsdWVzIChsaHNfdnItPm1pbiAoKSwgdnJfcmVzdWx0LT5taW4gKCkpOwotICAgICAg aWYgKGNtcF9taW4gPT0gLTIpCi0JZ290byB2YXJ5aW5nOwotICAgICAgaW50IGNtcF9tYXggPSBj b21wYXJlX3ZhbHVlcyAobGhzX3ZyLT5tYXggKCksIHZyX3Jlc3VsdC0+bWF4ICgpKTsKLSAgICAg IGlmIChjbXBfbWF4ID09IC0yKQotCWdvdG8gdmFyeWluZzsKLQotICAgICAgLyogRm9yIG5vbiBW Ul9SQU5HRSBvciBmb3IgcG9pbnRlcnMgZmFsbCBiYWNrIHRvIHZhcnlpbmcgaWYKLQkgdGhlIHJh bmdlIGNoYW5nZWQuICAqLwotICAgICAgaWYgKChsaHNfdnItPmtpbmQgKCkgIT0gVlJfUkFOR0Ug fHwgdnJfcmVzdWx0LT5raW5kICgpICE9IFZSX1JBTkdFCi0JICAgfHwgUE9JTlRFUl9UWVBFX1Ag KFRSRUVfVFlQRSAobGhzKSkpCi0JICAmJiAoY21wX21pbiAhPSAwIHx8IGNtcF9tYXggIT0gMCkp Ci0JZ290byB2YXJ5aW5nOwotCi0gICAgICAvKiBJZiB0aGUgbmV3IG1pbmltdW0gaXMgbGFyZ2Vy IHRoYW4gdGhlIHByZXZpb3VzIG9uZQotCSByZXRhaW4gdGhlIG9sZCB2YWx1ZS4gIElmIHRoZSBu ZXcgbWluaW11bSB2YWx1ZSBpcyBzbWFsbGVyCi0JIHRoYW4gdGhlIHByZXZpb3VzIG9uZSBhbmQg bm90IC1JTkYgZ28gYWxsIHRoZSB3YXkgdG8gLUlORiArIDEuCi0JIEluIHRoZSBmaXJzdCBjYXNl LCB0byBhdm9pZCBpbmZpbml0ZSBib3VuY2luZyBiZXR3ZWVuIGRpZmZlcmVudAotCSBtaW5pbXVt cywgYW5kIGluIHRoZSBvdGhlciBjYXNlIHRvIGF2b2lkIGl0ZXJhdGluZyBtaWxsaW9ucyBvZgot CSB0aW1lcyB0byByZWFjaCAtSU5GLiAgR29pbmcgdG8gLUlORiArIDEgYWxzbyBsZXRzIHRoZSBm b2xsb3dpbmcKLQkgaXRlcmF0aW9uIGNvbXB1dGUgd2hldGhlciB0aGVyZSB3aWxsIGJlIGFueSBv dmVyZmxvdywgYXQgdGhlCi0JIGV4cGVuc2Ugb2Ygb25lIGFkZGl0aW9uYWwgaXRlcmF0aW9uLiAg Ki8KLSAgICAgIHRyZWUgbmV3X21pbiA9IHZyX3Jlc3VsdC0+bWluICgpOwotICAgICAgdHJlZSBu ZXdfbWF4ID0gdnJfcmVzdWx0LT5tYXggKCk7Ci0gICAgICBpZiAoY21wX21pbiA8IDApCi0JbmV3 X21pbiA9IGxoc192ci0+bWluICgpOwotICAgICAgZWxzZSBpZiAoY21wX21pbiA+IDAKLQkgICAg ICAgJiYgKFRSRUVfQ09ERSAodnJfcmVzdWx0LT5taW4gKCkpICE9IElOVEVHRVJfQ1NUCi0JCSAg IHx8IHRyZWVfaW50X2NzdF9sdCAodnJwX3ZhbF9taW4gKHZyX3Jlc3VsdC0+dHlwZSAoKSksCi0J CQkJICAgICAgIHZyX3Jlc3VsdC0+bWluICgpKSkpCi0JbmV3X21pbiA9IGludF9jb25zdF9iaW5v cCAoUExVU19FWFBSLAotCQkJCSAgIHZycF92YWxfbWluICh2cl9yZXN1bHQtPnR5cGUgKCkpLAot CQkJCSAgIGJ1aWxkX2ludF9jc3QgKHZyX3Jlc3VsdC0+dHlwZSAoKSwgMSkpOwotCi0gICAgICAv KiBTaW1pbGFybHkgZm9yIHRoZSBtYXhpbXVtIHZhbHVlLiAgKi8KLSAgICAgIGlmIChjbXBfbWF4 ID4gMCkKLQluZXdfbWF4ID0gbGhzX3ZyLT5tYXggKCk7Ci0gICAgICBlbHNlIGlmIChjbXBfbWF4 IDwgMAotCSAgICAgICAmJiAoVFJFRV9DT0RFICh2cl9yZXN1bHQtPm1heCAoKSkgIT0gSU5URUdF Ul9DU1QKLQkJICAgfHwgdHJlZV9pbnRfY3N0X2x0ICh2cl9yZXN1bHQtPm1heCAoKSwKLQkJCQkg ICAgICAgdnJwX3ZhbF9tYXggKHZyX3Jlc3VsdC0+dHlwZSAoKSkpKSkKLQluZXdfbWF4ID0gaW50 X2NvbnN0X2Jpbm9wIChNSU5VU19FWFBSLAotCQkJCSAgIHZycF92YWxfbWF4ICh2cl9yZXN1bHQt PnR5cGUgKCkpLAotCQkJCSAgIGJ1aWxkX2ludF9jc3QgKHZyX3Jlc3VsdC0+dHlwZSAoKSwgMSkp OwotCi0gICAgICB2cl9yZXN1bHQtPnVwZGF0ZSAobmV3X21pbiwgbmV3X21heCwgdnJfcmVzdWx0 LT5raW5kICgpKTsKLQotICAgICAgLyogSWYgd2UgZHJvcHBlZCBlaXRoZXIgYm91bmQgdG8gKy1J TkYgdGhlbiBpZiB0aGlzIGlzIGEgbG9vcAotCSBQSEkgbm9kZSBTQ0VWIG1heSBrbm93biBtb3Jl IGFib3V0IGl0cyB2YWx1ZS1yYW5nZS4gICovCi0gICAgICBpZiAoY21wX21pbiA+IDAgfHwgY21w X21pbiA8IDAKLQkgICB8fCBjbXBfbWF4IDwgMCB8fCBjbXBfbWF4ID4gMCkKLQlnb3RvIHNjZXZf Y2hlY2s7Ci0KLSAgICAgIGdvdG8gaW5maW5pdGVfY2hlY2s7Ci0gICAgfQotCi0gIGdvdG8gdXBk YXRlX3JhbmdlOwotCi12YXJ5aW5nOgotICB2cl9yZXN1bHQtPnNldF92YXJ5aW5nIChUUkVFX1RZ UEUgKGxocykpOwotCi1zY2V2X2NoZWNrOgotICAvKiBJZiB0aGlzIGlzIGEgbG9vcCBQSEkgbm9k ZSBTQ0VWIG1heSBrbm93biBtb3JlIGFib3V0IGl0cyB2YWx1ZS1yYW5nZS4KLSAgICAgc2Nldl9j aGVjayBjYW4gYmUgcmVhY2hlZCBmcm9tIHR3byBwYXRocywgb25lIGlzIGEgZmFsbCB0aHJvdWdo IGZyb20gYWJvdmUKLSAgICAgInZhcnlpbmciIGxhYmVsLCB0aGUgb3RoZXIgaXMgZGlyZWN0IGdv dG8gZnJvbSBjb2RlIGJsb2NrIHdoaWNoIHRyaWVzIHRvCi0gICAgIGF2b2lkIGluZmluaXRlIHNp bXVsYXRpb24uICAqLwotICBpZiAoc2Nldl9pbml0aWFsaXplZF9wICgpCi0gICAgICAmJiAobCA9 IGxvb3BfY29udGFpbmluZ19zdG10IChwaGkpKQotICAgICAgJiYgbC0+aGVhZGVyID09IGdpbXBs ZV9iYiAocGhpKSkKLSAgICBhZGp1c3RfcmFuZ2Vfd2l0aF9zY2V2ICh2cl9yZXN1bHQsIGwsIHBo aSwgbGhzKTsKLQotaW5maW5pdGVfY2hlY2s6Ci0gIC8qIElmIHdlIHdpbGwgZW5kIHVwIHdpdGgg YSAoLUlORiwgK0lORikgcmFuZ2UsIHNldCBpdCB0bwotICAgICBWQVJZSU5HLiAgU2FtZSBpZiB0 aGUgcHJldmlvdXMgbWF4IHZhbHVlIHdhcyBpbnZhbGlkIGZvcgotICAgICB0aGUgdHlwZSBhbmQg d2UgZW5kIHVwIHdpdGggdnJfcmVzdWx0Lm1pbiA+IHZyX3Jlc3VsdC5tYXguICAqLwotICBpZiAo KCF2cl9yZXN1bHQtPnZhcnlpbmdfcCAoKSAmJiAhdnJfcmVzdWx0LT51bmRlZmluZWRfcCAoKSkK LSAgICAgICYmICEoKHZycF92YWxfaXNfbWF4ICh2cl9yZXN1bHQtPm1heCAoKSkgJiYgdnJwX3Zh bF9pc19taW4gKHZyX3Jlc3VsdC0+bWluICgpKSkKLQkgICB8fCBjb21wYXJlX3ZhbHVlcyAodnJf cmVzdWx0LT5taW4gKCksIHZyX3Jlc3VsdC0+bWF4ICgpKSA+IDApKQotICAgIDsKLSAgZWxzZQot ICAgIHZyX3Jlc3VsdC0+c2V0X3ZhcnlpbmcgKFRSRUVfVFlQRSAobGhzKSk7Ci0KLSAgLyogSWYg dGhlIG5ldyByYW5nZSBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgcHJldmlvdXMgdmFsdWUsIGtlZXAK LSAgICAgaXRlcmF0aW5nLiAgKi8KLXVwZGF0ZV9yYW5nZToKLSAgcmV0dXJuOwotfQotCiAvKiBT aW1wbGlmeSBib29sZWFuIG9wZXJhdGlvbnMgaWYgdGhlIHNvdXJjZSBpcyBrbm93bgogICAgdG8g YmUgYWxyZWFkeSBhIGJvb2xlYW4uICAqLwogYm9vbApAQCAtMzU1Nyw4ICsxNzQ0LDcgQEAgc2lt cGxpZnlfdXNpbmdfcmFuZ2VzOjpmb2xkX2NvbmQgKGdjb25kICpjb25kKQogICAgICAgcmV0dXJu IHRydWU7CiAgICAgfQogCi0gIC8qID8/IHZycF9mb2xkZXI6OmZvbGRfcHJlZGljYXRlX2luKCkg aXMgYSBzdXBlcnNldCBvZiB0aGlzLiAgQXQKLSAgICAgc29tZSBwb2ludCB3ZSBzaG91bGQgbWVy Z2UgYWxsIHZhcmlhbnRzIG9mIHRoaXMgY29kZS4gICovCisgIC8vIEZJWE1FOiBBdWRpdCB0aGUg Y29kZSBiZWxvdyBhbmQgbWFrZSBzdXJlIGl0IG5ldmVyIGZpbmRzIGFueXRoaW5nLgogICBlZGdl IHRha2VuX2VkZ2U7CiAgIHZycF92aXNpdF9jb25kX3N0bXQgKGNvbmQsICZ0YWtlbl9lZGdlKTsK IApAQCAtNDQyOCwyNCArMjYxNCwzIEBAIHNpbXBsaWZ5X3VzaW5nX3Jhbmdlczo6c2ltcGxpZnkg KGdpbXBsZV9zdG10X2l0ZXJhdG9yICpnc2kpCiAKICAgcmV0dXJuIGZhbHNlOwogfQotCi0vKiBT ZXQgdGhlIGxhdHRpY2UgZW50cnkgZm9yIFZBUiB0byBWUi4gICovCi0KLXZvaWQKLXZyX3ZhbHVl czo6c2V0X3ZyX3ZhbHVlICh0cmVlIHZhciwgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyKQotewotICBp ZiAoU1NBX05BTUVfVkVSU0lPTiAodmFyKSA+PSBudW1fdnJfdmFsdWVzKQotICAgIHJldHVybjsK LSAgdnJfdmFsdWVbU1NBX05BTUVfVkVSU0lPTiAodmFyKV0gPSB2cjsKLX0KLQotLyogU3dhcCB0 aGUgbGF0dGljZSBlbnRyeSBmb3IgVkFSIHdpdGggVlIgYW5kIHJldHVybiB0aGUgb2xkIGVudHJ5 LiAgKi8KLQotdmFsdWVfcmFuZ2VfZXF1aXYgKgotdnJfdmFsdWVzOjpzd2FwX3ZyX3ZhbHVlICh0 cmVlIHZhciwgdmFsdWVfcmFuZ2VfZXF1aXYgKnZyKQotewotICBpZiAoU1NBX05BTUVfVkVSU0lP TiAodmFyKSA+PSBudW1fdnJfdmFsdWVzKQotICAgIHJldHVybiBOVUxMOwotICBzdGQ6OnN3YXAg KHZyX3ZhbHVlW1NTQV9OQU1FX1ZFUlNJT04gKHZhcildLCB2cik7Ci0gIHJldHVybiB2cjsKLX0K ZGlmZiAtLWdpdCBhL2djYy92ci12YWx1ZXMuaCBiL2djYy92ci12YWx1ZXMuaAppbmRleCA4Yzhm MDMxNzE0Ny4uOGVlOGNjMTJmOGIgMTAwNjQ0Ci0tLSBhL2djYy92ci12YWx1ZXMuaAorKysgYi9n Y2MvdnItdmFsdWVzLmgKQEAgLTMzLDIxICszMywxNCBAQCBwdWJsaWM6CiAgIHNpbXBsaWZ5X3Vz aW5nX3JhbmdlcyAocmFuZ2VfcXVlcnkgKnF1ZXJ5ID0gTlVMTCwKIAkJCSBpbnQgbm90X2V4ZWN1 dGFibGVfZmxhZyA9IDApOwogICB+c2ltcGxpZnlfdXNpbmdfcmFuZ2VzICgpOwotICB2b2lkIHNl dF9yYW5nZV9xdWVyeSAoY2xhc3MgcmFuZ2VfcXVlcnkgKnEsIGludCBub3RfZXhlY3V0YWJsZV9m bGFnID0gMCkKLSAgICAgIHsgcXVlcnkgPSBxOyBtX25vdF9leGVjdXRhYmxlX2ZsYWcgPSBub3Rf ZXhlY3V0YWJsZV9mbGFnOyB9Ci0KICAgYm9vbCBzaW1wbGlmeSAoZ2ltcGxlX3N0bXRfaXRlcmF0 b3IgKik7Ci0KLSAgLy8gPz8gVGhlc2Ugc2hvdWxkIGJlIGNsZWFuZWQsIG1lcmdlZCwgYW5kIG1h ZGUgcHJpdmF0ZS4KLSAgdHJlZSB2cnBfZXZhbHVhdGVfY29uZGl0aW9uYWwgKHRyZWVfY29kZSwg dHJlZSwgdHJlZSwgZ2ltcGxlICopOwotICB2b2lkIHZycF92aXNpdF9jb25kX3N0bXQgKGdjb25k ICosIGVkZ2UgKik7CiAgIGJvb2wgZm9sZF9jb25kIChnY29uZCAqKTsKK3ByaXZhdGU6CisgIHZv aWQgdnJwX3Zpc2l0X2NvbmRfc3RtdCAoZ2NvbmQgKiwgZWRnZSAqKTsKICAgdHJlZSB2cnBfZXZh bHVhdGVfY29uZGl0aW9uYWxfd2FybnZfd2l0aF9vcHMgKGdpbXBsZSAqc3RtdCwgZW51bSB0cmVl X2NvZGUsCiAJCQkJCQl0cmVlLCB0cmVlLCBib29sLAogCQkJCQkJYm9vbCAqLCBib29sICopOwog ICBib29sIHNpbXBsaWZ5X2Nhc3RlZF9jb25kIChnY29uZCAqKTsKLQotcHJpdmF0ZToKICAgYm9v bCBzaW1wbGlmeV90cnV0aF9vcHNfdXNpbmdfcmFuZ2VzIChnaW1wbGVfc3RtdF9pdGVyYXRvciAq LCBnaW1wbGUgKik7CiAgIGJvb2wgc2ltcGxpZnlfZGl2X29yX21vZF91c2luZ19yYW5nZXMgKGdp bXBsZV9zdG10X2l0ZXJhdG9yICosIGdpbXBsZSAqKTsKICAgYm9vbCBzaW1wbGlmeV9hYnNfdXNp bmdfcmFuZ2VzIChnaW1wbGVfc3RtdF9pdGVyYXRvciAqLCBnaW1wbGUgKik7CkBAIC04OSw5NSAr ODIsNiBAQCBwcml2YXRlOgogICB2ZWM8ZWRnZT4gbV9mbGFnX3NldF9lZGdlczsgIC8vIExpc3Qg b2YgZWRnZXMgd2l0aCBmbGFnIHRvIGJlIGNsZWFyZWQuCiB9OwogCi0vKiBUaGUgVlJfVkFMVUVT IGNsYXNzIGhvbGRzIHRoZSBjdXJyZW50IHZpZXcgb2YgcmFuZ2UgaW5mb3JtYXRpb24KLSAgIGZv ciBhbGwgdGhlIFNTQV9OQU1FcyBpbiB0aGUgSUwuCi0KLSAgIEl0IGNhbiBiZSB1c2VkIHRvIGhv bGQgY29udGV4dCBzZW5zaXRpdmUgcmFuZ2UgaW5mb3JtYXRpb24gZHVyaW5nCi0gICBhIGRvbWlu YXRvciB3YWxrIG9yIGl0IG1heSBiZSB1c2VkIHRvIGhvbGQgcmFuZ2UgaW5mb3JtYXRpb24gaW4g dGhlCi0gICBzdGFuZGFyZCBWUlAgcGFzcyBhcyByYW5nZXMgYXJlIHByb3BhZ2F0ZWQgdGhyb3Vn aCB0aGUgbGF0dGljZSB0byBhCi0gICBzdGVhZHkgc3RhdGUuCi0KLSAgIFRoaXMgaW5mb3JtYXRp b24gaXMgaW5kZXBlbmRlbnQgb2YgdGhlIHJhbmdlIGluZm9ybWF0aW9uIHRoYXQgZ2V0cwotICAg YXR0YWNoZWQgdG8gU1NBX05BTUVzLiAgQSBwYXNzIHN1Y2ggYXMgVlJQIG1heSBjaG9vc2UgdG8g dHJhbnNmZXIKLSAgIHRoZSBnbG9iYWwgaW5mb3JtYXRpb24gaXQgcHJvZHVjZXMgaW50byBnbG9i YWwgcmFuZ2UgaW5mb3JtYXRpb24gdGhhdAotICAgZ2V0cyBhdHRhY2hlZCB0byBhbiBTU0FfTkFN RS4gIEl0J3MgdW5jbGVhciBob3cgdXNlZnVsIHRoYXQgZ2xvYmFsCi0gICBpbmZvcm1hdGlvbiB3 aWxsIGJlIGluIGEgd29ybGQgd2hlcmUgd2UgY2FuIGNvbXB1dGUgY29udGV4dCBzZW5zaXRpdmUK LSAgIHJhbmdlIGluZm9ybWF0aW9uIGZhc3Qgb3IgcGVyZm9ybSBvbi1kZW1hbmQgcXVlcmllcy4g ICovCi1jbGFzcyB2cl92YWx1ZXMgOiBwdWJsaWMgcmFuZ2VfcXVlcnkKLXsKLSBwdWJsaWM6Ci0g IHZyX3ZhbHVlcyAodm9pZCk7Ci0gIH52cl92YWx1ZXMgKHZvaWQpOwotCi0gIHZpcnR1YWwgYm9v bCByYW5nZV9vZl9leHByICh2cmFuZ2UgJnIsIHRyZWUgZXhwciwgZ2ltcGxlICpzdG10KSBvdmVy cmlkZTsKLSAgdmlydHVhbCB0cmVlIHZhbHVlX29mX2V4cHIgKHRyZWUsIGdpbXBsZSAqID0gTlVM TCkgb3ZlcnJpZGU7Ci0gIHZpcnR1YWwgdHJlZSB2YWx1ZV9vbl9lZGdlIChlZGdlLCB0cmVlKSBv dmVycmlkZTsKLSAgdmlydHVhbCB0cmVlIHZhbHVlX29mX3N0bXQgKGdpbXBsZSAqLCB0cmVlID0g TlVMTF9UUkVFKSBvdmVycmlkZTsKLSAgdmlydHVhbCBjb25zdCB2YWx1ZV9yYW5nZV9lcXVpdiAq Z2V0X3ZhbHVlX3JhbmdlIChjb25zdF90cmVlLAotCQkJCQkJICAgIGdpbXBsZSAqID0gTlVMTCkg b3ZlcnJpZGU7Ci0gIHZvaWQgc2V0X3ZyX3ZhbHVlICh0cmVlLCB2YWx1ZV9yYW5nZV9lcXVpdiAq KTsKLSAgdmFsdWVfcmFuZ2VfZXF1aXYgKnN3YXBfdnJfdmFsdWUgKHRyZWUsIHZhbHVlX3Jhbmdl X2VxdWl2ICopOwotCi0gIHZvaWQgc2V0X2RlZl90b192YXJ5aW5nIChjb25zdF90cmVlKTsKLSAg dm9pZCBzZXRfZGVmc190b192YXJ5aW5nIChnaW1wbGUgKik7Ci0gIGJvb2wgdXBkYXRlX3ZhbHVl X3JhbmdlIChjb25zdF90cmVlLCB2YWx1ZV9yYW5nZV9lcXVpdiAqKTsKLSAgdHJlZSBvcF93aXRo X2NvbnN0YW50X3NpbmdsZXRvbl92YWx1ZV9yYW5nZSAodHJlZSk7Ci0gIHZvaWQgYWRqdXN0X3Jh bmdlX3dpdGhfc2NldiAodmFsdWVfcmFuZ2VfZXF1aXYgKiwgY2xhc3MgbG9vcCAqLAotCQkJICAg ICAgIGdpbXBsZSAqLCB0cmVlKTsKLSAgdmlydHVhbCB2b2lkIGR1bXAgKEZJTEUgKikgb3ZlcnJp ZGU7Ci0KLSAgdm9pZCBleHRyYWN0X3JhbmdlX2Zvcl92YXJfZnJvbV9jb21wYXJpc29uX2V4cHIg KHRyZWUsIGVudW0gdHJlZV9jb2RlLAotCQkJCQkJICAgdHJlZSwgdHJlZSwKLQkJCQkJCSAgIHZh bHVlX3JhbmdlX2VxdWl2ICopOwotICB2b2lkIGV4dHJhY3RfcmFuZ2VfZnJvbV9waGlfbm9kZSAo Z3BoaSAqLCB2YWx1ZV9yYW5nZV9lcXVpdiAqKTsKLSAgdm9pZCBleHRyYWN0X3JhbmdlX2Jhc2lj ICh2YWx1ZV9yYW5nZV9lcXVpdiAqLCBnaW1wbGUgKik7Ci0gIHZvaWQgZXh0cmFjdF9yYW5nZV9m cm9tX3N0bXQgKGdpbXBsZSAqLCBlZGdlICosIHRyZWUgKiwgdmFsdWVfcmFuZ2VfZXF1aXYgKik7 Ci0KLSAgLyogSW5kaWNhdGUgdGhhdCBwcm9wYWdhdGlvbiB0aHJvdWdoIHRoZSBsYXR0aWNlIGlz IGNvbXBsZXRlLiAgKi8KLSAgdm9pZCBzZXRfbGF0dGljZV9wcm9wYWdhdGlvbl9jb21wbGV0ZSAo dm9pZCkgeyB2YWx1ZXNfcHJvcGFnYXRlZCA9IHRydWU7IH0KLQotICAvKiBBbGxvY2F0ZSBhIG5l dyB2YWx1ZV9yYW5nZSBvYmplY3QuICAqLwotICB2YWx1ZV9yYW5nZV9lcXVpdiAqYWxsb2NhdGVf dmFsdWVfcmFuZ2VfZXF1aXYgKHZvaWQpCi0gICAgeyByZXR1cm4gcmFuZ2VfcXVlcnk6OmFsbG9j YXRlX3ZhbHVlX3JhbmdlX2VxdWl2ICgpOyB9Ci0gIHZvaWQgZnJlZV92YWx1ZV9yYW5nZSAodmFs dWVfcmFuZ2VfZXF1aXYgKnZyKQotICAgIHsgZnJlZV92YWx1ZV9yYW5nZV9lcXVpdiAodnIpOyB9 Ci0KLSBwcml2YXRlOgotICB2YWx1ZV9yYW5nZV9lcXVpdiAqZ2V0X2xhdHRpY2VfZW50cnkgKGNv bnN0X3RyZWUpOwotICBib29sIHZycF9zdG10X2NvbXB1dGVzX25vbnplcm8gKGdpbXBsZSAqKTsK LSAgdm9pZCBleHRyYWN0X3JhbmdlX2Zyb21fYXNzaWdubWVudCAodmFsdWVfcmFuZ2VfZXF1aXYg KiwgZ2Fzc2lnbiAqKTsKLSAgdm9pZCBleHRyYWN0X3JhbmdlX2Zyb21fYXNzZXJ0ICh2YWx1ZV9y YW5nZV9lcXVpdiAqLCB0cmVlKTsKLSAgdm9pZCBleHRyYWN0X3JhbmdlX2Zyb21fc3NhX25hbWUg KHZhbHVlX3JhbmdlX2VxdWl2ICosIHRyZWUpOwotICB2b2lkIGV4dHJhY3RfcmFuZ2VfZnJvbV9i aW5hcnlfZXhwciAodmFsdWVfcmFuZ2VfZXF1aXYgKiwgZW51bSB0cmVlX2NvZGUsCi0JCQkJICAg ICAgIHRyZWUsIHRyZWUsIHRyZWUpOwotICB2b2lkIGV4dHJhY3RfcmFuZ2VfZnJvbV91bmFyeV9l eHByICh2YWx1ZV9yYW5nZV9lcXVpdiAqLCBlbnVtIHRyZWVfY29kZSwKLQkJCQkgICAgICB0cmVl LCB0cmVlKTsKLSAgdm9pZCBleHRyYWN0X3JhbmdlX2Zyb21fY29uZF9leHByICh2YWx1ZV9yYW5n ZV9lcXVpdiAqLCBnYXNzaWduICopOwotICB2b2lkIGV4dHJhY3RfcmFuZ2VfZnJvbV9jb21wYXJp c29uICh2YWx1ZV9yYW5nZV9lcXVpdiAqLCBnaW1wbGUgKik7Ci0gIHZvaWQgdnJwX3Zpc2l0X2Fz c2lnbm1lbnRfb3JfY2FsbCAoZ2ltcGxlKiwgdHJlZSAqLCB2YWx1ZV9yYW5nZV9lcXVpdiAqKTsK LSAgdm9pZCB2cnBfdmlzaXRfc3dpdGNoX3N0bXQgKGdzd2l0Y2ggKiwgZWRnZSAqKTsKLSAgYm9v bCBleHRyYWN0X3JhbmdlX2Zyb21fdWJzYW5fYnVpbHRpbiAodmFsdWVfcmFuZ2VfZXF1aXYgKiwg Z2ltcGxlICopOwotCi0gIC8qIFRoaXMgcHJvYmFibHkgYmVsb25ncyBpbiB0aGUgbGF0dGljZSBy YXRoZXIgdGhhbiBpbiBoZXJlLiAgKi8KLSAgYm9vbCB2YWx1ZXNfcHJvcGFnYXRlZDsKLQotICAv KiBBbGxvY2F0aW9ucyBmb3IgZXF1aXZhbGVuY2VzIGFsbCBjb21lIGZyb20gdGhpcyBvYnN0YWNr LiAgKi8KLSAgYml0bWFwX29ic3RhY2sgdnJwX2VxdWl2X29ic3RhY2s7Ci0KLSAgLyogVmFsdWUg cmFuZ2UgYXJyYXkuICBBZnRlciBwcm9wYWdhdGlvbiwgVlJfVkFMVUVbSV0gaG9sZHMgdGhlIHJh bmdlCi0gICAgIG9mIHZhbHVlcyB0aGF0IFNTQSBuYW1lIE5fSSBtYXkgdGFrZS4gICovCi0gIHVu c2lnbmVkIGludCBudW1fdnJfdmFsdWVzOwotICB2YWx1ZV9yYW5nZV9lcXVpdiAqKnZyX3ZhbHVl OwotCi0gIC8qIEZvciBhIFBISSBub2RlIHdoaWNoIHNldHMgU1NBIG5hbWUgTl9JLCBWUl9DT1VO VFNbSV0gaG9sZHMgdGhlCi0gICAgIG51bWJlciBvZiBleGVjdXRhYmxlIGVkZ2VzIHdlIHNhdyB0 aGUgbGFzdCB0aW1lIHdlIHZpc2l0ZWQgdGhlCi0gICAgIG5vZGUuICAqLwotICBpbnQgKnZyX3Bo aV9lZGdlX2NvdW50czsKLSAgc2ltcGxpZnlfdXNpbmdfcmFuZ2VzIHNpbXBsaWZpZXI7Ci19Owot Ci1leHRlcm4gdHJlZSBnZXRfb3V0cHV0X2Zvcl92cnAgKGdpbXBsZSAqKTsKLQogZXh0ZXJuIGJv b2wgcmFuZ2VfZml0c190eXBlX3AgKGNvbnN0IHZhbHVlX3JhbmdlICp2ciwKIAkJCSAgICAgICB1 bnNpZ25lZCBkZXN0X3ByZWNpc2lvbiwgc2lnbm9wIGRlc3Rfc2duKTsKIGV4dGVybiBib29sIGJv dW5kc19vZl92YXJfaW5fbG9vcCAodHJlZSAqbWluLCB0cmVlICptYXgsIHJhbmdlX3F1ZXJ5ICos Ci0tIAoyLjM4LjEKCg== --0000000000009d9cf905ee216c6c--