From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Jon Smirl" Subject: Re: Huge win, compressing a window of delta runs as a unit Date: Fri, 18 Aug 2006 08:53:10 -0400 Message-ID: <9e4733910608180553r34fa7b25he0bf910ef804630f@mail.gmail.com> References: <9e4733910608161020s6855140bs68aaab6e1bbd3bad@mail.gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_3056_22851849.1155905590069" Cc: "Shawn Pearce" , git X-From: git-owner@vger.kernel.org Fri Aug 18 14:53:26 2006 Return-path: Envelope-to: gcvg-git@gmane.org Received: from vger.kernel.org ([209.132.176.167]) by ciao.gmane.org with esmtp (Exim 4.43) id 1GE3qf-0007pl-IR for gcvg-git@gmane.org; Fri, 18 Aug 2006 14:53:18 +0200 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751258AbWHRMxN (ORCPT ); Fri, 18 Aug 2006 08:53:13 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751263AbWHRMxN (ORCPT ); Fri, 18 Aug 2006 08:53:13 -0400 Received: from nz-out-0102.google.com ([64.233.162.192]:2276 "EHLO nz-out-0102.google.com") by vger.kernel.org with ESMTP id S1751258AbWHRMxL (ORCPT ); Fri, 18 Aug 2006 08:53:11 -0400 Received: by nz-out-0102.google.com with SMTP id x7so517875nzc for ; Fri, 18 Aug 2006 05:53:10 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:references; b=sYwPHee3p8QRCFW2h39EV+XEqEKinRv0xoE9XuCpC8WslhDDAj18nmZU8QCL71bnMxRKnRIRu+NJm92UlPaIJQ4yYxRYDwDB2rADbfDMILccBruggIV6yRhuUXtdKw/z1zZ9Ka4T3xhirLb4tx1ogjCbPmx3d6x1244bJB4xQYE= Received: by 10.65.240.5 with SMTP id s5mr3632079qbr; Fri, 18 Aug 2006 05:53:10 -0700 (PDT) Received: by 10.65.133.17 with HTTP; Fri, 18 Aug 2006 05:53:08 -0700 (PDT) To: "Nicolas Pitre" In-Reply-To: Sender: git-owner@vger.kernel.org Precedence: bulk X-Mailing-List: git@vger.kernel.org Archived-At: ------=_Part_3056_22851849.1155905590069 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline I attached Shawn's code. He is gone until Monday and can't defend it. Do note that I am running this on the Mozilla CVS which is over 10 years old. Some of the files have over 2,000 deltas. I average 10 deltas per file but the distribution is not at all even. Many files get checked-in and never changed, for example 1000's of images. -- Jon Smirl jonsmirl@gmail.com ------=_Part_3056_22851849.1155905590069 Content-Type: text/x-csrc; name=fast-import3.c; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_er0jwhus Content-Disposition: attachment; filename="fast-import3.c" LyoKRm9ybWF0IG9mIFNURElOIHN0cmVhbToKCiAgc3RyZWFtIDo6PSBjbWQqOwoKICBjbWQgOjo9 IG5ld19ibG9iCiAgICAgICAgfCBuZXdfYnJhbmNoCiAgICAgICAgfCBuZXdfY29tbWl0CiAgICAg ICAgfCBuZXdfdGFnCiAgICAgICAgOwoKICBuZXdfYmxvYiA6Oj0gJ2Jsb2InIGxmCgltYXJrPwog ICAgZmlsZV9jb250ZW50OwogIGZpbGVfY29udGVudCA6Oj0gZGF0YTsKCiAgbmV3X2JyYW5jaCA6 Oj0gJ2JyYW5jaCcgc3AgcmVmX3N0ciBsZgogICAgKCdmcm9tJyBzcCAocmVmX3N0ciB8IGhleHNo YTEgfCBzaGExZXhwX3N0ciB8IGlkbnVtKSBsZik/CiAgICBsZjsKCiAgbmV3X2NvbW1pdCA6Oj0g J2NvbW1pdCcgc3AgcmVmX3N0ciBsZgoJbWFyaz8KCSgnYXV0aG9yJyBzcCBuYW1lICc8JyBlbWFp bCAnPicgdHMgdHogbGYpPwoJJ2NvbW1pdHRlcicgc3AgbmFtZSAnPCcgZW1haWwgJz4nIHRzIHR6 IGxmCgljb21taXRfbXNnCiAgICBmaWxlX2NoYW5nZSoKICAgIGxmOwogIGNvbW1pdF9tc2cgOjo9 IGRhdGE7CgogIGZpbGVfY2hhbmdlIDo6PSAnTScgc3AgbW9kZSBzcCAoaGV4c2hhMSB8IGlkbnVt KSBzcCBwYXRoX3N0ciBsZgogICAgICAgICAgICAgICAgfCAnRCcgc3AgcGF0aF9zdHIgbGYKICAg ICAgICAgICAgICAgIDsKICBtb2RlIDo6PSAnNjQ0JyB8ICc3NTUnOwoKICBuZXdfdGFnIDo6PSAn dGFnJyBzcCB0YWdfc3RyIGxmCiAgICAnZnJvbScgc3AgKHJlZl9zdHIgfCBoZXhzaGExIHwgc2hh MWV4cF9zdHIgfCBpZG51bSkgbGYKCSd0YWdnZXInIHNwIG5hbWUgJzwnIGVtYWlsICc+JyB0cyB0 eiBsZgogICAgdGFnX21zZzsKICB0YWdfbXNnIDo6PSBkYXRhOwoKICAgICAjIG5vdGU6IHRoZSBm aXJzdCBpZG51bSBpbiBhIHN0cmVhbSBzaG91bGQgYmUgMSBhbmQgc3Vic2VxdWVudAogICAgICMg aWRudW1zIHNob3VsZCBub3QgaGF2ZSBnYXBzIGJldHdlZW4gdmFsdWVzIGFzIHRoaXMgd2lsbCBj YXVzZQogICAgICMgdGhlIHN0cmVhbSBwYXJzZXIgdG8gcmVzZXJ2ZSBzcGFjZSBmb3IgdGhlIGdh cHBlZCB2YWx1ZXMuICBBbgoJICMgaWRudW0gY2FuIGJlIHVwZGF0ZWQgaW4gdGhlIGZ1dHVyZSB0 byBhIG5ldyBvYmplY3QgYnkgaXNzdWluZwogICAgICMgYSBuZXcgbWFyayBkaXJlY3RpdmUgd2l0 aCB0aGUgb2xkIGlkbnVtLgoJICMKICBtYXJrIDo6PSAnbWFyaycgc3AgaWRudW0gbGY7CgogICAg ICMgbm90ZTogZGVjbGVuIGluZGljYXRlcyB0aGUgbGVuZ3RoIG9mIGJpbmFyeV9kYXRhIGluIGJ5 dGVzLgogICAgICMgZGVjbGVuIGRvZXMgbm90IGluY2x1ZGUgdGhlIGxmIHByZWNlZWRpbmcgb3Ig dHJhaWxpbmcgdGhlCiAgICAgIyBiaW5hcnkgZGF0YS4KICAgICAjCiAgZGF0YSA6Oj0gJ2RhdGEn IHNwIGRlY2xlbiBsZgogICAgYmluYXJ5X2RhdGEKCWxmOwoKICAgICAjIG5vdGU6IHF1b3RlZCBz dHJpbmdzIGFyZSBDLXN0eWxlIHF1b3Rpbmcgc3VwcG9ydGluZyBcYyBmb3IKICAgICAjIGNvbW1v biBlc2NhcGVzIG9mICdjJyAoZS4uZyBcbiwgXHQsIFxcLCBcIikgb3IgXG5ubiB3aGVyZSBubm4K CSAjIGlzIHRoZSBzaWduZWQgYnl0ZSB2YWx1ZSBpbiBvY3RhbC4gIE5vdGUgdGhhdCB0aGUgb25s eQogICAgICMgY2hhcmFjdGVycyB3aGljaCBtdXN0IGFjdHVhbGx5IGJlIGVzY2FwZWQgdG8gcHJv dGVjdCB0aGUKICAgICAjIHN0cmVhbSBmb3JtYXR0aW5nIGlzOiBcLCAiIGFuZCBMRi4gIE90aGVy d2lzZSB0aGVzZSB2YWx1ZXMKCSAjIGFyZSBVVEY4LgogICAgICMKICByZWZfc3RyICAgICA6Oj0g cmVmICAgICB8ICciJyBxdW90ZWQocmVmKSAgICAgJyInIDsKICBzaGExZXhwX3N0ciA6Oj0gc2hh MWV4cCB8ICciJyBxdW90ZWQoc2hhMWV4cCkgJyInIDsKICB0YWdfc3RyICAgICA6Oj0gdGFnICAg ICB8ICciJyBxdW90ZWQodGFnKSAgICAgJyInIDsKICBwYXRoX3N0ciAgICA6Oj0gcGF0aCAgICB8 ICciJyBxdW90ZWQocGF0aCkgICAgJyInIDsKCiAgZGVjbGVuIDo6PSAjIHVuc2lnbmVkIDMyIGJp dCB2YWx1ZSwgYXNjaWkgYmFzZTEwIG5vdGF0aW9uOwogIGJpbmFyeV9kYXRhIDo6PSAjIGZpbGUg Y29udGVudCwgbm90IGludGVycHJldGVkOwoKICBzcCA6Oj0gIyBBU0NJSSBzcGFjZSBjaGFyYWN0 ZXI7CiAgbGYgOjo9ICMgQVNDSUkgbmV3bGluZSAoTEYpIGNoYXJhY3RlcjsKCiAgICAgIyBub3Rl OiBhIGNvbG9uICgnOicpIG11c3QgcHJlY2VkZSB0aGUgbnVtZXJpY2FsIHZhbHVlIGFzc2lnbmVk IHRvCgkgIyBhbiBpZG51bS4gIFRoaXMgaXMgdG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBhIHJlZiBv ciB0YWcgbmFtZSBhcwogICAgICMgR0lUIGRvZXMgbm90IHBlcm1pdCAnOicgaW4gcmVmIG9yIHRh ZyBzdHJpbmdzLgoJICMKICBpZG51bSAgIDo6PSAnOicgZGVjbGVuOwogIHBhdGggICAgOjo9ICMg R0lUIHN0eWxlIGZpbGUgcGF0aCwgZS5nLiAiYS9iL2MiOwogIHJlZiAgICAgOjo9ICMgR0lUIHJl ZiBuYW1lLCBlLmcuICJyZWZzL2hlYWRzL01PWl9HRUNLT19FWFBFUklNRU5UIjsKICB0YWcgICAg IDo6PSAjIEdJVCB0YWcgbmFtZSwgZS5nLiAiRklSRUZPWF8xXzUiOwogIHNoYTFleHAgOjo9ICMg QW55IHZhbGlkIEdJVCBTSEExIGV4cHJlc3Npb247CiAgaGV4c2hhMSA6Oj0gIyBTSEExIGluIGhl eGFkZWNpbWFsIGZvcm1hdDsKCiAgICAgIyBub3RlOiBuYW1lIGFuZCBlbWFpbCBhcmUgVVRGOCBz dHJpbmdzLCBob3dldmVyIG5hbWUgbXVzdCBub3QKCSAjIGNvbnRhaW4gJzwnIG9yIGxmIGFuZCBl bWFpbCBtdXN0IG5vdCBjb250YWluIGFueSBvZiB0aGUKICAgICAjIGZvbGxvd2luZzogJzwnLCAn PicsIGxmLgoJICMKICBuYW1lICA6Oj0gIyB2YWxpZCBHSVQgYXV0aG9yL2NvbW1pdHRlciBuYW1l OwogIGVtYWlsIDo6PSAjIHZhbGlkIEdJVCBhdXRob3IvY29tbWl0dGVyIGVtYWlsOwogIHRzICAg IDo6PSAjIHRpbWUgc2luY2UgdGhlIGVwb2NoIGluIHNlY29uZHMsIGFzY2lpIGJhc2UxMCBub3Rh dGlvbjsKICB0eiAgICA6Oj0gIyBHSVQgc3R5bGUgdGltZXpvbmU7CiovCgojaW5jbHVkZSAiYnVp bHRpbi5oIgojaW5jbHVkZSAiY2FjaGUuaCIKI2luY2x1ZGUgIm9iamVjdC5oIgojaW5jbHVkZSAi YmxvYi5oIgojaW5jbHVkZSAidHJlZS5oIgojaW5jbHVkZSAiZGVsdGEuaCIKI2luY2x1ZGUgInBh Y2suaCIKI2luY2x1ZGUgInJlZnMuaCIKI2luY2x1ZGUgImNzdW0tZmlsZS5oIgojaW5jbHVkZSAi c3RyYnVmLmgiCiNpbmNsdWRlICJxdW90ZS5oIgoKc3RydWN0IG9iamVjdF9lbnRyeQp7CglzdHJ1 Y3Qgb2JqZWN0X2VudHJ5ICpuZXh0OwoJZW51bSBvYmplY3RfdHlwZSB0eXBlOwoJdW5zaWduZWQg bG9uZyBvZmZzZXQ7Cgl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOwp9OwoKc3RydWN0IG9iamVjdF9l bnRyeV9wb29sCnsKCXN0cnVjdCBvYmplY3RfZW50cnlfcG9vbCAqbmV4dF9wb29sOwoJc3RydWN0 IG9iamVjdF9lbnRyeSAqbmV4dF9mcmVlOwoJc3RydWN0IG9iamVjdF9lbnRyeSAqZW5kOwoJc3Ry dWN0IG9iamVjdF9lbnRyeSBlbnRyaWVzW0ZMRVhfQVJSQVldOyAvKiBtb3JlICovCn07CgpzdHJ1 Y3QgbGFzdF9vYmplY3QKewoJdm9pZCAqZGF0YTsKCXVuc2lnbmVkIGludCBsZW47Cgl1bnNpZ25l ZCBpbnQgZGVwdGg7Cgl1bnNpZ25lZCBjaGFyIHNoYTFbMjBdOwp9OwoKc3RydWN0IG1lbV9wb29s CnsKCXN0cnVjdCBtZW1fcG9vbCAqbmV4dF9wb29sOwoJY2hhciAqbmV4dF9mcmVlOwoJY2hhciAq ZW5kOwoJY2hhciBzcGFjZVtGTEVYX0FSUkFZXTsgLyogbW9yZSAqLwp9OwoKc3RydWN0IGF0b21f c3RyCnsKCXN0cnVjdCBhdG9tX3N0ciAqbmV4dF9hdG9tOwoJaW50IHN0cl9sZW47CgljaGFyIHN0 cl9kYXRbRkxFWF9BUlJBWV07IC8qIG1vcmUgKi8KfTsKCnN0cnVjdCB0cmVlX2NvbnRlbnQ7CnN0 cnVjdCB0cmVlX2VudHJ5CnsKCXN0cnVjdCB0cmVlX2NvbnRlbnQgKnRyZWU7CglzdHJ1Y3QgYXRv bV9zdHIqIG5hbWU7Cgl1bnNpZ25lZCBpbnQgbW9kZTsKCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07 Cn07CgpzdHJ1Y3QgdHJlZV9jb250ZW50CnsKCXVuc2lnbmVkIGludCBlbnRyeV9jYXBhY2l0eTsg LyogbXVzdCBtYXRjaCBhdmFpbF90cmVlX2NvbnRlbnQgKi8KCXVuc2lnbmVkIGludCBlbnRyeV9j b3VudDsKCXN0cnVjdCB0cmVlX2VudHJ5ICplbnRyaWVzW0ZMRVhfQVJSQVldOyAvKiBtb3JlICov Cn07CgpzdHJ1Y3QgYXZhaWxfdHJlZV9jb250ZW50CnsKCXVuc2lnbmVkIGludCBlbnRyeV9jYXBh Y2l0eTsgLyogbXVzdCBtYXRjaCB0cmVlX2NvbnRlbnQgKi8KCXN0cnVjdCBhdmFpbF90cmVlX2Nv bnRlbnQgKm5leHRfYXZhaWw7Cn07CgpzdHJ1Y3QgYnJhbmNoCnsKCXN0cnVjdCBicmFuY2ggKnRh YmxlX25leHRfYnJhbmNoOwoJc3RydWN0IGJyYW5jaCAqYWN0aXZlX25leHRfYnJhbmNoOwoJY29u c3QgY2hhciAqbmFtZTsKCXVuc2lnbmVkIGxvbmcgbGFzdF9jb21taXQ7CglzdHJ1Y3QgdHJlZV9l bnRyeSBicmFuY2hfdHJlZTsKCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07Cn07CgoKLyogU3RhdHMg YW5kIG1pc2MuIGNvdW50ZXJzICovCnN0YXRpYyBpbnQgbWF4X2RlcHRoID0gMTA7CnN0YXRpYyB1 bnNpZ25lZCBsb25nIGFsbG9jX2NvdW50OwpzdGF0aWMgdW5zaWduZWQgbG9uZyBicmFuY2hfY291 bnQ7CnN0YXRpYyB1bnNpZ25lZCBsb25nIG9iamVjdF9jb3VudDsKc3RhdGljIHVuc2lnbmVkIGxv bmcgZHVwbGljYXRlX2NvdW50OwpzdGF0aWMgdW5zaWduZWQgbG9uZyBvYmplY3RfY291bnRfYnlf dHlwZVs5XTsKc3RhdGljIHVuc2lnbmVkIGxvbmcgZHVwbGljYXRlX2NvdW50X2J5X3R5cGVbOV07 CnN0YXRpYyB1bnNpZ25lZCBsb25nIHN0cmVhbV9jbnQ7CgovKiBNZW1vcnkgcG9vbHMgKi8Kc3Rh dGljIHNpemVfdCBtZW1fcG9vbF9hbGxvYyA9IDIqMTAyNCoxMDI0IC0gc2l6ZW9mKHN0cnVjdCBt ZW1fcG9vbCk7CnN0YXRpYyBzaXplX3QgdG90YWxfYWxsb2NkOwpzdGF0aWMgc3RydWN0IG1lbV9w b29sICptZW1fcG9vbDsKCi8qIEF0b20gbWFuYWdlbWVudCAqLwpzdGF0aWMgdW5zaWduZWQgaW50 IGF0b21fdGFibGVfc3ogPSA0NDUxOwpzdGF0aWMgdW5zaWduZWQgaW50IGF0b21fY250OwpzdGF0 aWMgc3RydWN0IGF0b21fc3RyICoqYXRvbV90YWJsZTsKCi8qIFRoZSAucGFjayBmaWxlIGJlaW5n IGdlbmVyYXRlZCAqLwpzdGF0aWMgaW50IHBhY2tfZmQ7CnN0YXRpYyB1bnNpZ25lZCBsb25nIHBh Y2tfb2Zmc2V0OwpzdGF0aWMgdW5zaWduZWQgY2hhciBwYWNrX3NoYTFbMjBdOwpzdGF0aWMgel9z dHJlYW0genM7CnN0YXRpYyBpbnQgenNfbGl2ZTsKc3RhdGljIHZvaWQqIHpzX291dDsKc3RhdGlj IHVuc2lnbmVkIGxvbmcgenNfb3V0bGVuOwoKLyogVGFibGUgb2Ygb2JqZWN0cyB3ZSd2ZSB3cml0 dGVuLiAqLwpzdGF0aWMgdW5zaWduZWQgaW50IG9iamVjdF9lbnRyeV9hbGxvYyA9IDEwMDA7CnN0 YXRpYyBzdHJ1Y3Qgb2JqZWN0X2VudHJ5X3Bvb2wgKmJsb2NrczsKc3RhdGljIHN0cnVjdCBvYmpl Y3RfZW50cnkgKm9iamVjdF90YWJsZVsxIDw8IDE2XTsKCi8qIE91ciBsYXN0IGJsb2IgKi8Kc3Rh dGljIHN0cnVjdCBsYXN0X29iamVjdCBsYXN0X2Jsb2I7CgovKiBUcmVlIG1hbmFnZW1lbnQgKi8K c3RhdGljIHVuc2lnbmVkIGludCB0cmVlX2VudHJ5X2FsbG9jID0gMTAwMDsKc3RhdGljIHZvaWQg KmF2YWlsX3RyZWVfZW50cnk7CnN0YXRpYyB1bnNpZ25lZCBpbnQgYXZhaWxfdHJlZV90YWJsZV9z eiA9IDEwMDsKc3RhdGljIHN0cnVjdCBhdmFpbF90cmVlX2NvbnRlbnQgKiphdmFpbF90cmVlX3Rh YmxlOwoKLyogQnJhbmNoIGRhdGEgKi8Kc3RhdGljIHVuc2lnbmVkIGludCBtYXhfYWN0aXZlX2Jy YW5jaGVzID0gNTsKc3RhdGljIHVuc2lnbmVkIGludCBjdXJfYWN0aXZlX2JyYW5jaGVzOwpzdGF0 aWMgdW5zaWduZWQgaW50IGJyYW5jaF90YWJsZV9zeiA9IDEwMzk7CnN0YXRpYyBzdHJ1Y3QgYnJh bmNoICoqYnJhbmNoX3RhYmxlOwpzdGF0aWMgc3RydWN0IGJyYW5jaCAqYWN0aXZlX2JyYW5jaGVz OwoKLyogSW5wdXQgc3RyZWFtIHBhcnNpbmcgKi8Kc3RhdGljIHN0cnVjdCBzdHJidWYgY29tbWFu ZF9idWY7CnN0YXRpYyB1bnNpZ25lZCBsb25nIGNvbW1hbmRfbWFyazsKCgpzdGF0aWMgdm9pZCBh bGxvY19vYmplY3RzKGludCBjbnQpCnsKCXN0cnVjdCBvYmplY3RfZW50cnlfcG9vbCAqYjsKCgli ID0geG1hbGxvYyhzaXplb2Yoc3RydWN0IG9iamVjdF9lbnRyeV9wb29sKQoJCSsgY250ICogc2l6 ZW9mKHN0cnVjdCBvYmplY3RfZW50cnkpKTsKCWItPm5leHRfcG9vbCA9IGJsb2NrczsKCWItPm5l eHRfZnJlZSA9IGItPmVudHJpZXM7CgliLT5lbmQgPSBiLT5lbnRyaWVzICsgY250OwoJYmxvY2tz ID0gYjsKCWFsbG9jX2NvdW50ICs9IGNudDsKfQoKc3RhdGljIHN0cnVjdCBvYmplY3RfZW50cnkq IG5ld19vYmplY3QodW5zaWduZWQgY2hhciAqc2hhMSkKewoJc3RydWN0IG9iamVjdF9lbnRyeSAq ZTsKCglpZiAoYmxvY2tzLT5uZXh0X2ZyZWUgPT0gYmxvY2tzLT5lbmQpCgkJYWxsb2Nfb2JqZWN0 cyhvYmplY3RfZW50cnlfYWxsb2MpOwoKCWUgPSBibG9ja3MtPm5leHRfZnJlZSsrOwoJbWVtY3B5 KGUtPnNoYTEsIHNoYTEsIHNpemVvZihlLT5zaGExKSk7CglyZXR1cm4gZTsKfQoKc3RhdGljIHN0 cnVjdCBvYmplY3RfZW50cnkqIGZpbmRfb2JqZWN0KHVuc2lnbmVkIGNoYXIgKnNoYTEpCnsKCXVu c2lnbmVkIGludCBoID0gc2hhMVswXSA8PCA4IHwgc2hhMVsxXTsKCXN0cnVjdCBvYmplY3RfZW50 cnkgKmU7Cglmb3IgKGUgPSBvYmplY3RfdGFibGVbaF07IGU7IGUgPSBlLT5uZXh0KQoJCWlmICgh bWVtY21wKHNoYTEsIGUtPnNoYTEsIHNpemVvZihlLT5zaGExKSkpCgkJCXJldHVybiBlOwoJcmV0 dXJuIE5VTEw7Cn0KCnN0YXRpYyBzdHJ1Y3Qgb2JqZWN0X2VudHJ5KiBpbnNlcnRfb2JqZWN0KHVu c2lnbmVkIGNoYXIgKnNoYTEpCnsKCXVuc2lnbmVkIGludCBoID0gc2hhMVswXSA8PCA4IHwgc2hh MVsxXTsKCXN0cnVjdCBvYmplY3RfZW50cnkgKmUgPSBvYmplY3RfdGFibGVbaF07CglzdHJ1Y3Qg b2JqZWN0X2VudHJ5ICpwID0gTlVMTDsKCgl3aGlsZSAoZSkgewoJCWlmICghbWVtY21wKHNoYTEs IGUtPnNoYTEsIHNpemVvZihlLT5zaGExKSkpCgkJCXJldHVybiBlOwoJCXAgPSBlOwoJCWUgPSBl LT5uZXh0OwoJfQoKCWUgPSBuZXdfb2JqZWN0KHNoYTEpOwoJZS0+bmV4dCA9IE5VTEw7CgllLT5v ZmZzZXQgPSAwOwoJaWYgKHApCgkJcC0+bmV4dCA9IGU7CgllbHNlCgkJb2JqZWN0X3RhYmxlW2hd ID0gZTsKCXJldHVybiBlOwp9CgpzdGF0aWMgdW5zaWduZWQgaW50IGhjX3N0cihjb25zdCBjaGFy ICpzLCBzaXplX3QgbGVuKQp7Cgl1bnNpZ25lZCBpbnQgciA9IDA7Cgl3aGlsZSAobGVuLS0gPiAw KQoJCXIgPSByICogMzEgKyAqcysrOwoJcmV0dXJuIHI7Cn0KCnN0YXRpYyB2b2lkKiBwb29sX2Fs bG9jKHNpemVfdCBsZW4pCnsKCXN0cnVjdCBtZW1fcG9vbCAqcDsKCXZvaWQgKnI7CgoJZm9yIChw ID0gbWVtX3Bvb2w7IHA7IHAgPSBwLT5uZXh0X3Bvb2wpCgkJaWYgKChwLT5lbmQgLSBwLT5uZXh0 X2ZyZWUgPj0gbGVuKSkKCQkJYnJlYWs7CgoJaWYgKCFwKSB7CgkJaWYgKGxlbiA+PSAobWVtX3Bv b2xfYWxsb2MvMikpIHsKCQkJdG90YWxfYWxsb2NkICs9IGxlbjsKCQkJcmV0dXJuIHhtYWxsb2Mo bGVuKTsKCQl9CgkJdG90YWxfYWxsb2NkICs9IHNpemVvZihzdHJ1Y3QgbWVtX3Bvb2wpICsgbWVt X3Bvb2xfYWxsb2M7CgkJcCA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBtZW1fcG9vbCkgKyBtZW1f cG9vbF9hbGxvYyk7CgkJcC0+bmV4dF9wb29sID0gbWVtX3Bvb2w7CgkJcC0+bmV4dF9mcmVlID0g cC0+c3BhY2U7CgkJcC0+ZW5kID0gcC0+bmV4dF9mcmVlICsgbWVtX3Bvb2xfYWxsb2M7CgkJbWVt X3Bvb2wgPSBwOwoJfQoKCXIgPSBwLT5uZXh0X2ZyZWU7CglwLT5uZXh0X2ZyZWUgKz0gbGVuOwoJ cmV0dXJuIHI7Cn0KCnN0YXRpYyB2b2lkKiBwb29sX2NhbGxvYyhzaXplX3QgY291bnQsIHNpemVf dCBzaXplKQp7CglzaXplX3QgbGVuID0gY291bnQgKiBzaXplOwoJdm9pZCAqciA9IHBvb2xfYWxs b2MobGVuKTsKCW1lbXNldChyLCAwLCBsZW4pOwoJcmV0dXJuIHI7Cn0KCnN0YXRpYyBjaGFyKiBw b29sX3N0cmR1cChjb25zdCBjaGFyICpzKQp7CgljaGFyICpyID0gcG9vbF9hbGxvYyhzdHJsZW4o cykgKyAxKTsKCXN0cmNweShyLCBzKTsKCXJldHVybiByOwp9CgpzdGF0aWMgc3RydWN0IGF0b21f c3RyKiB0b19hdG9tKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4pCnsKCXVuc2lnbmVkIGludCBo YyA9IGhjX3N0cihzLCBsZW4pICUgYXRvbV90YWJsZV9zejsKCXN0cnVjdCBhdG9tX3N0ciAqYzsK CQoJZm9yIChjID0gYXRvbV90YWJsZVtoY107IGM7IGMgPSBjLT5uZXh0X2F0b20pCgkJaWYgKGMt PnN0cl9sZW4gPT0gbGVuICYmICFzdHJuY21wKHMsIGMtPnN0cl9kYXQsIGxlbikpCgkJCXJldHVy biBjOwoKCWMgPSBwb29sX2FsbG9jKHNpemVvZihzdHJ1Y3QgYXRvbV9zdHIpICsgbGVuICsgMSk7 CgljLT5zdHJfbGVuID0gbGVuOwoJc3RybmNweShjLT5zdHJfZGF0LCBzLCBsZW4pOwoJYy0+c3Ry X2RhdFtsZW5dID0gMDsKCWMtPm5leHRfYXRvbSA9IGF0b21fdGFibGVbaGNdOwoJYXRvbV90YWJs ZVtoY10gPSBjOwoJYXRvbV9jbnQrKzsKCXJldHVybiBjOwp9CgpzdGF0aWMgc3RydWN0IGJyYW5j aCogbG9va3VwX2JyYW5jaChjb25zdCBjaGFyICpuYW1lKQp7Cgl1bnNpZ25lZCBpbnQgaGMgPSBo Y19zdHIobmFtZSwgc3RybGVuKG5hbWUpKSAlIGJyYW5jaF90YWJsZV9zejsKCXN0cnVjdCBicmFu Y2ggKmI7CgoJZm9yIChiID0gYnJhbmNoX3RhYmxlW2hjXTsgYjsgYiA9IGItPnRhYmxlX25leHRf YnJhbmNoKQoJCWlmICghc3RyY21wKG5hbWUsIGItPm5hbWUpKQoJCQlyZXR1cm4gYjsKCXJldHVy biBOVUxMOwp9CgpzdGF0aWMgc3RydWN0IGJyYW5jaCogbmV3X2JyYW5jaChjb25zdCBjaGFyICpu YW1lKQp7Cgl1bnNpZ25lZCBpbnQgaGMgPSBoY19zdHIobmFtZSwgc3RybGVuKG5hbWUpKSAlIGJy YW5jaF90YWJsZV9zejsKCXN0cnVjdCBicmFuY2gqIGIgPSBsb29rdXBfYnJhbmNoKG5hbWUpOwoK CWlmIChiKQoJCWRpZSgiSW52YWxpZCBhdHRlbXB0IHRvIGNyZWF0ZSBkdXBsaWNhdGUgYnJhbmNo OiAlcyIsIG5hbWUpOwoJaWYgKGNoZWNrX3JlZl9mb3JtYXQobmFtZSkpCgkJZGllKCJCcmFuY2gg bmFtZSBkb2Vzbid0IGNvbmZvcm0gdG8gR0lUIHN0YW5kYXJkczogJXMiLCBuYW1lKTsKCgliID0g cG9vbF9jYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBicmFuY2gpKTsKCWItPm5hbWUgPSBwb29sX3N0 cmR1cChuYW1lKTsKCWItPnRhYmxlX25leHRfYnJhbmNoID0gYnJhbmNoX3RhYmxlW2hjXTsKCWJy YW5jaF90YWJsZVtoY10gPSBiOwoJYnJhbmNoX2NvdW50Kys7CglyZXR1cm4gYjsKfQoKc3RhdGlj IHVuc2lnbmVkIGludCBoY19lbnRyaWVzKHVuc2lnbmVkIGludCBjbnQpCnsKCWNudCA9IGNudCAm IDcgPyAoY250IC8gOCkgKyAxIDogY250IC8gODsKCXJldHVybiBjbnQgPCBhdmFpbF90cmVlX3Rh YmxlX3N6ID8gY250IDogYXZhaWxfdHJlZV90YWJsZV9zeiAtIDE7Cn0KCnN0YXRpYyBzdHJ1Y3Qg dHJlZV9jb250ZW50KiBuZXdfdHJlZV9jb250ZW50KHVuc2lnbmVkIGludCBjbnQpCnsKCXN0cnVj dCBhdmFpbF90cmVlX2NvbnRlbnQgKmYsICpsID0gTlVMTDsKCXN0cnVjdCB0cmVlX2NvbnRlbnQg KnQ7Cgl1bnNpZ25lZCBpbnQgaGMgPSBoY19lbnRyaWVzKGNudCk7CgoJZm9yIChmID0gYXZhaWxf dHJlZV90YWJsZVtoY107IGY7IGwgPSBmLCBmID0gZi0+bmV4dF9hdmFpbCkKCQlpZiAoZi0+ZW50 cnlfY2FwYWNpdHkgPj0gY250KQoJCQlicmVhazsKCglpZiAoZikgewoJCWlmIChsKQoJCQlsLT5u ZXh0X2F2YWlsID0gZi0+bmV4dF9hdmFpbDsKCQllbHNlCgkJCWF2YWlsX3RyZWVfdGFibGVbaGNd ID0gZi0+bmV4dF9hdmFpbDsKCX0gZWxzZSB7CgkJY250ID0gY250ICYgNyA/ICgoY250IC8gOCkg KyAxKSAqIDggOiBjbnQ7CgkJZiA9IHBvb2xfYWxsb2Moc2l6ZW9mKCp0KSArIHNpemVvZih0LT5l bnRyaWVzWzBdKSAqIGNudCk7CgkJZi0+ZW50cnlfY2FwYWNpdHkgPSBjbnQ7Cgl9CgoJdCA9IChz dHJ1Y3QgdHJlZV9jb250ZW50KilmOwoJdC0+ZW50cnlfY291bnQgPSAwOwoJcmV0dXJuIHQ7Cn0K CnN0YXRpYyB2b2lkIHJlbGVhc2VfdHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9lbnRyeSAqZSk7CnN0 YXRpYyB2b2lkIHJlbGVhc2VfdHJlZV9jb250ZW50KHN0cnVjdCB0cmVlX2NvbnRlbnQgKnQpCnsK CXN0cnVjdCBhdmFpbF90cmVlX2NvbnRlbnQgKmYgPSAoc3RydWN0IGF2YWlsX3RyZWVfY29udGVu dCopdDsKCXVuc2lnbmVkIGludCBoYyA9IGhjX2VudHJpZXMoZi0+ZW50cnlfY2FwYWNpdHkpOwoJ dW5zaWduZWQgaW50IGk7Cglmb3IgKGkgPSAwOyBpIDwgdC0+ZW50cnlfY291bnQ7IGkrKykKCQly ZWxlYXNlX3RyZWVfZW50cnkodC0+ZW50cmllc1tpXSk7CglmLT5uZXh0X2F2YWlsID0gYXZhaWxf dHJlZV90YWJsZVtoY107CglhdmFpbF90cmVlX3RhYmxlW2hjXSA9IGY7Cn0KCnN0YXRpYyBzdHJ1 Y3QgdHJlZV9jb250ZW50KiBncm93X3RyZWVfY29udGVudCgKCXN0cnVjdCB0cmVlX2NvbnRlbnQg KnQsCglpbnQgYW10KQp7CglzdHJ1Y3QgdHJlZV9jb250ZW50ICpyID0gbmV3X3RyZWVfY29udGVu dCh0LT5lbnRyeV9jb3VudCArIGFtdCk7CglyLT5lbnRyeV9jb3VudCA9IHQtPmVudHJ5X2NvdW50 OwoJbWVtY3B5KHItPmVudHJpZXMsdC0+ZW50cmllcyx0LT5lbnRyeV9jb3VudCpzaXplb2YodC0+ ZW50cmllc1swXSkpOwoJcmVsZWFzZV90cmVlX2NvbnRlbnQodCk7CglyZXR1cm4gcjsKfQoKc3Rh dGljIHN0cnVjdCB0cmVlX2VudHJ5KiBuZXdfdHJlZV9lbnRyeSgpCnsKCXN0cnVjdCB0cmVlX2Vu dHJ5ICplOwoKCWlmICghYXZhaWxfdHJlZV9lbnRyeSkgewoJCXVuc2lnbmVkIGludCBuID0gdHJl ZV9lbnRyeV9hbGxvYzsKCQlhdmFpbF90cmVlX2VudHJ5ID0gZSA9IHhtYWxsb2MobiAqIHNpemVv ZihzdHJ1Y3QgdHJlZV9lbnRyeSkpOwoJCXdoaWxlIChuLS0pIHsKCQkJKigodm9pZCoqKWUpID0g ZSArIDE7CgkJCWUrKzsKCQl9Cgl9CgoJZSA9IGF2YWlsX3RyZWVfZW50cnk7CglhdmFpbF90cmVl X2VudHJ5ID0gKigodm9pZCoqKWUpOwoJcmV0dXJuIGU7Cn0KCnN0YXRpYyB2b2lkIHJlbGVhc2Vf dHJlZV9lbnRyeShzdHJ1Y3QgdHJlZV9lbnRyeSAqZSkKewoJaWYgKGUtPnRyZWUpCgkJcmVsZWFz ZV90cmVlX2NvbnRlbnQoZS0+dHJlZSk7CgkqKCh2b2lkKiopZSkgPSBhdmFpbF90cmVlX2VudHJ5 OwoJYXZhaWxfdHJlZV9lbnRyeSA9IGU7Cn0KCnN0YXRpYyB2b2lkIHlyZWFkKGludCBmZCwgdm9p ZCAqYnVmZmVyLCBzaXplX3QgbGVuZ3RoKQp7Cglzc2l6ZV90IHJldCA9IDA7Cgl3aGlsZSAocmV0 IDwgbGVuZ3RoKSB7CgkJc3NpemVfdCBzaXplID0geHJlYWQoZmQsIChjaGFyICopIGJ1ZmZlciAr IHJldCwgbGVuZ3RoIC0gcmV0KTsKCQlpZiAoIXNpemUpCgkJCWRpZSgiUmVhZCBmcm9tIGRlc2Ny aXB0b3IgJWk6IGVuZCBvZiBzdHJlYW0iLCBmZCk7CgkJaWYgKHNpemUgPCAwKQoJCQlkaWUoIlJl YWQgZnJvbSBkZXNjcmlwdG9yICVpOiAlcyIsIGZkLCBzdHJlcnJvcihlcnJubykpOwoJCXJldCAr PSBzaXplOwoJfQp9CgpzdGF0aWMgdm9pZCB5d3JpdGUoaW50IGZkLCB2b2lkICpidWZmZXIsIHNp emVfdCBsZW5ndGgpCnsKCXNzaXplX3QgcmV0ID0gMDsKCXdoaWxlIChyZXQgPCBsZW5ndGgpIHsK CQlzc2l6ZV90IHNpemUgPSB4d3JpdGUoZmQsIChjaGFyICopIGJ1ZmZlciArIHJldCwgbGVuZ3Ro IC0gcmV0KTsKCQlpZiAoIXNpemUpCgkJCWRpZSgiV3JpdGUgdG8gZGVzY3JpcHRvciAlaTogZW5k IG9mIGZpbGUiLCBmZCk7CgkJaWYgKHNpemUgPCAwKQoJCQlkaWUoIldyaXRlIHRvIGRlc2NyaXB0 b3IgJWk6ICVzIiwgZmQsIHN0cmVycm9yKGVycm5vKSk7CgkJcmV0ICs9IHNpemU7Cgl9Cn0KCnN0 YXRpYyBzaXplX3QgZW5jb2RlX2hlYWRlcigKCWVudW0gb2JqZWN0X3R5cGUgdHlwZSwKCXNpemVf dCBzaXplLAoJdW5zaWduZWQgY2hhciAqaGRyKQp7CglpbnQgbiA9IDE7Cgl1bnNpZ25lZCBjaGFy IGM7CgoJaWYgKHR5cGUgPCBPQkpfQ09NTUlUIHx8IHR5cGUgPiBPQkpfREVMVEEpCgkJZGllKCJi YWQgdHlwZSAlZCIsIHR5cGUpOwoKCWMgPSAodHlwZSA8PCA0KSB8IChzaXplICYgMTUpOwoJc2l6 ZSA+Pj0gNDsKCXdoaWxlIChzaXplKSB7CgkJKmhkcisrID0gYyB8IDB4ODA7CgkJYyA9IHNpemUg JiAweDdmOwoJCXNpemUgPj49IDc7CgkJbisrOwoJfQoJKmhkciA9IGM7CglyZXR1cm4gbjsKfQoK c3RhdGljIHZvaWQgenNfZmluaXNoKCkKewoJaWYgKHpzX2xpdmUpIHsKCQl3aGlsZSAoZGVmbGF0 ZSgmenMsIFpfRklOSVNIKSA9PSBaX09LKSB7CgkJCWlmICh6cy50b3RhbF9vdXQpIHsKCQkJCXl3 cml0ZShwYWNrX2ZkLCB6c19vdXQsIHpzLnRvdGFsX291dCk7CgkJCQlwYWNrX29mZnNldCArPSB6 cy50b3RhbF9vdXQ7CgkJCQl6cy5uZXh0X291dCA9IHpzX291dDsKCQkJCXpzLmF2YWlsX291dCA9 IHpzX291dGxlbjsKCQkJCXpzLnRvdGFsX291dCA9IDA7CgkJCX0KCQl9CgkJZGVmbGF0ZUVuZCgm enMpOwoJCWZyZWUoenNfb3V0KTsKCQlzdHJlYW1fY250Kys7Cgl9Cn0KCnN0YXRpYyBpbnQgc3Rv cmVfb2JqZWN0KAoJZW51bSBvYmplY3RfdHlwZSB0eXBlLAoJdm9pZCAqZGF0LAoJc2l6ZV90IGRh dGxlbiwKCXN0cnVjdCBsYXN0X29iamVjdCAqbGFzdCwKCXVuc2lnbmVkIGNoYXIgKnNoYTFvdXQp CnsKCXZvaWQgKmRlbHRhOwoJc3RydWN0IG9iamVjdF9lbnRyeSAqZTsKCXVuc2lnbmVkIGNoYXIg aGRyWzk2XTsKCXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07Cgl1bnNpZ25lZCBsb25nIGhkcmxlbiwg ZGVsdGFsZW47CglTSEFfQ1RYIGM7CgoJaGRybGVuID0gc3ByaW50ZigoY2hhciopaGRyLCIlcyAl bHUiLHR5cGVfbmFtZXNbdHlwZV0sZGF0bGVuKSArIDE7CglTSEExX0luaXQoJmMpOwoJU0hBMV9V cGRhdGUoJmMsIGhkciwgaGRybGVuKTsKCVNIQTFfVXBkYXRlKCZjLCBkYXQsIGRhdGxlbik7CglT SEExX0ZpbmFsKHNoYTEsICZjKTsKCWlmIChzaGExb3V0KQoJCW1lbWNweShzaGExb3V0LCBzaGEx LCBzaXplb2Yoc2hhMSkpOwoKCWUgPSBpbnNlcnRfb2JqZWN0KHNoYTEpOwoJaWYgKGUtPm9mZnNl dCkgewoJCWR1cGxpY2F0ZV9jb3VudCsrOwoJCWR1cGxpY2F0ZV9jb3VudF9ieV90eXBlW3R5cGVd Kys7CgkJcmV0dXJuIDE7Cgl9CgllLT50eXBlID0gdHlwZTsKCWUtPm9mZnNldCA9IHBhY2tfb2Zm c2V0OwoJb2JqZWN0X2NvdW50Kys7CglvYmplY3RfY291bnRfYnlfdHlwZVt0eXBlXSsrOwoKCWlm IChsYXN0ICYmIGxhc3QtPmRhdGEgJiYgbGFzdC0+ZGVwdGggPCBtYXhfZGVwdGgpCgkJZGVsdGEg PSBkaWZmX2RlbHRhKGxhc3QtPmRhdGEsIGxhc3QtPmxlbiwKCQkJZGF0LCBkYXRsZW4sCgkJCSZk ZWx0YWxlbiwgMCk7CgllbHNlIHsKCQl6c19maW5pc2goKTsKCQlkZWx0YSA9IDA7CgkJbWVtc2V0 KCZ6cywgMCwgc2l6ZW9mKHpzKSk7CgkJZGVmbGF0ZUluaXQoJnpzLCB6bGliX2NvbXByZXNzaW9u X2xldmVsKTsKCQl6c19saXZlID0gMTsKCQl6c19vdXRsZW4gPSAxMDI0KjEwMjQ7CgkJenNfb3V0 ID0geG1hbGxvYyh6c19vdXRsZW4pOwoJCXpzLm5leHRfb3V0ID0genNfb3V0OwoJCXpzLmF2YWls X291dCA9IHpzX291dGxlbjsKCX0KCglpZiAoZGVsdGEpIHsKCQlsYXN0LT5kZXB0aCsrOwoJCXpz Lm5leHRfaW4gPSBkZWx0YTsKCQl6cy5hdmFpbF9pbiA9IGRlbHRhbGVuOwoJCWhkcmxlbiA9IGVu Y29kZV9oZWFkZXIoT0JKX0RFTFRBLCBkZWx0YWxlbiwgaGRyKTsKCQl5d3JpdGUocGFja19mZCwg aGRyLCBoZHJsZW4pOwoJCXl3cml0ZShwYWNrX2ZkLCBsYXN0LT5zaGExLCBzaXplb2Yoc2hhMSkp OwoJCXBhY2tfb2Zmc2V0ICs9IGhkcmxlbiArIHNpemVvZihzaGExKTsKCX0gZWxzZSB7CgkJaWYg KGxhc3QpCgkJCWxhc3QtPmRlcHRoID0gMDsKCQl6cy5uZXh0X2luID0gZGF0OwoJCXpzLmF2YWls X2luID0gZGF0bGVuOwoJCWhkcmxlbiA9IGVuY29kZV9oZWFkZXIodHlwZSwgZGF0bGVuLCBoZHIp OwoJCXl3cml0ZShwYWNrX2ZkLCBoZHIsIGhkcmxlbik7CgkJcGFja19vZmZzZXQgKz0gaGRybGVu OwoJfQoKCXdoaWxlIChkZWZsYXRlKCZ6cywgWl9OT19GTFVTSCkgPT0gWl9PSykgewoJCWlmICh6 cy50b3RhbF9vdXQpIHsKCQkJeXdyaXRlKHBhY2tfZmQsIHpzX291dCwgenMudG90YWxfb3V0KTsK CQkJcGFja19vZmZzZXQgKz0genMudG90YWxfb3V0OwoJCQl6cy5uZXh0X291dCA9IHpzX291dDsK CQkJenMuYXZhaWxfb3V0ID0genNfb3V0bGVuOwoJCQl6cy50b3RhbF9vdXQgPSAwOwoJCX0KCX0K CglpZiAoZGVsdGEpCgkJZnJlZShkZWx0YSk7CglpZiAobGFzdCkgewoJCWlmIChsYXN0LT5kYXRh KQoJCQlmcmVlKGxhc3QtPmRhdGEpOwoJCWxhc3QtPmRhdGEgPSBkYXQ7CgkJbGFzdC0+bGVuID0g ZGF0bGVuOwoJCW1lbWNweShsYXN0LT5zaGExLCBzaGExLCBzaXplb2Yoc2hhMSkpOwoJfQoJcmV0 dXJuIDA7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICpnZXRfbW9kZShjb25zdCBjaGFyICpzdHIsIHVu c2lnbmVkIGludCAqbW9kZXApCnsKCXVuc2lnbmVkIGNoYXIgYzsKCXVuc2lnbmVkIGludCBtb2Rl ID0gMDsKCgl3aGlsZSAoKGMgPSAqc3RyKyspICE9ICcgJykgewoJCWlmIChjIDwgJzAnIHx8IGMg PiAnNycpCgkJCXJldHVybiBOVUxMOwoJCW1vZGUgPSAobW9kZSA8PCAzKSArIChjIC0gJzAnKTsK CX0KCSptb2RlcCA9IG1vZGU7CglyZXR1cm4gc3RyOwp9CgpzdGF0aWMgdm9pZCBsb2FkX3RyZWUo c3RydWN0IHRyZWVfZW50cnkgKnJvb3QpCnsKCXN0cnVjdCBvYmplY3RfZW50cnkgKm15b2U7Cglz dHJ1Y3QgdHJlZV9jb250ZW50ICp0OwoJdW5zaWduZWQgbG9uZyBzaXplOwoJY2hhciAqYnVmOwoJ Y29uc3QgY2hhciAqYzsKCWNoYXIgdHlwZVsyMF07CgoJcm9vdC0+dHJlZSA9IHQgPSBuZXdfdHJl ZV9jb250ZW50KDgpOwoJaWYgKCFtZW1jbXAocm9vdC0+c2hhMSwgbnVsbF9zaGExLCAyMCkpCgkJ cmV0dXJuOwoKCW15b2UgPSBmaW5kX29iamVjdChyb290LT5zaGExKTsKCWlmIChteW9lKSB7CgkJ ZGllKCJGSVhNRSIpOwoJfSBlbHNlIHsKCQlidWYgPSByZWFkX3NoYTFfZmlsZShyb290LT5zaGEx LCB0eXBlLCAmc2l6ZSk7CgkJaWYgKCFidWYgfHwgc3RyY21wKHR5cGUsIHRyZWVfdHlwZSkpCgkJ CWRpZSgiQ2FuJ3QgbG9hZCBleGlzdGluZyB0cmVlICVzIiwgc2hhMV90b19oZXgocm9vdC0+c2hh MSkpOwoJfQoKCWMgPSBidWY7Cgl3aGlsZSAoYyAhPSAoYnVmICsgc2l6ZSkpIHsKCQlzdHJ1Y3Qg dHJlZV9lbnRyeSAqZSA9IG5ld190cmVlX2VudHJ5KCk7CgoJCWlmICh0LT5lbnRyeV9jb3VudCA9 PSB0LT5lbnRyeV9jYXBhY2l0eSkKCQkJcm9vdC0+dHJlZSA9IHQgPSBncm93X3RyZWVfY29udGVu dCh0LCA4KTsKCQl0LT5lbnRyaWVzW3QtPmVudHJ5X2NvdW50KytdID0gZTsKCgkJZS0+dHJlZSA9 IE5VTEw7CgkJYyA9IGdldF9tb2RlKGMsICZlLT5tb2RlKTsKCQlpZiAoIWMpCgkJCWRpZSgiQ29y cnVwdCBtb2RlIGluICVzIiwgc2hhMV90b19oZXgocm9vdC0+c2hhMSkpOwoJCWUtPm5hbWUgPSB0 b19hdG9tKGMsIHN0cmxlbihjKSk7CgkJYyArPSBlLT5uYW1lLT5zdHJfbGVuICsgMTsKCQltZW1j cHkoZS0+c2hhMSwgYywgc2l6ZW9mKGUtPnNoYTEpKTsKCQljICs9IDIwOwoJfQoJZnJlZShidWYp Owp9CgpzdGF0aWMgaW50IHRlY21wIChjb25zdCB2b2lkICpfYSwgY29uc3Qgdm9pZCAqX2IpCnsK CXN0cnVjdCB0cmVlX2VudHJ5ICphID0gKigoc3RydWN0IHRyZWVfZW50cnkqKilfYSk7CglzdHJ1 Y3QgdHJlZV9lbnRyeSAqYiA9ICooKHN0cnVjdCB0cmVlX2VudHJ5KiopX2IpOwoJcmV0dXJuIGJh c2VfbmFtZV9jb21wYXJlKAoJCWEtPm5hbWUtPnN0cl9kYXQsIGEtPm5hbWUtPnN0cl9sZW4sIGEt Pm1vZGUsCgkJYi0+bmFtZS0+c3RyX2RhdCwgYi0+bmFtZS0+c3RyX2xlbiwgYi0+bW9kZSk7Cn0K CnN0YXRpYyB2b2lkIHN0b3JlX3RyZWUoc3RydWN0IHRyZWVfZW50cnkgKnJvb3QpCnsKCXN0cnVj dCB0cmVlX2NvbnRlbnQgKnQgPSByb290LT50cmVlOwoJdW5zaWduZWQgaW50IGk7CglzaXplX3Qg bWF4bGVuOwoJY2hhciAqYnVmLCAqYzsKCglpZiAobWVtY21wKHJvb3QtPnNoYTEsIG51bGxfc2hh MSwgMjApKQoJCXJldHVybjsKCgltYXhsZW4gPSAwOwoJZm9yIChpID0gMDsgaSA8IHQtPmVudHJ5 X2NvdW50OyBpKyspIHsKCQltYXhsZW4gKz0gdC0+ZW50cmllc1tpXS0+bmFtZS0+c3RyX2xlbiAr IDM0OwoJCWlmICh0LT5lbnRyaWVzW2ldLT50cmVlKQoJCQlzdG9yZV90cmVlKHQtPmVudHJpZXNb aV0pOwoJfQoKCXFzb3J0KHQtPmVudHJpZXMsIHQtPmVudHJ5X2NvdW50LCBzaXplb2YodC0+ZW50 cmllc1swXSksIHRlY21wKTsKCWJ1ZiA9IGMgPSB4bWFsbG9jKG1heGxlbik7Cglmb3IgKGkgPSAw OyBpIDwgdC0+ZW50cnlfY291bnQ7IGkrKykgewoJCXN0cnVjdCB0cmVlX2VudHJ5ICplID0gdC0+ ZW50cmllc1tpXTsKCQljICs9IHNwcmludGYoYywgIiVvIiwgZS0+bW9kZSk7CgkJKmMrKyA9ICcg JzsKCQlzdHJjcHkoYywgZS0+bmFtZS0+c3RyX2RhdCk7CgkJYyArPSBlLT5uYW1lLT5zdHJfbGVu ICsgMTsKCQltZW1jcHkoYywgZS0+c2hhMSwgMjApOwoJCWMgKz0gMjA7Cgl9CglzdG9yZV9vYmpl Y3QoT0JKX1RSRUUsIGJ1ZiwgYyAtIGJ1ZiwgTlVMTCwgcm9vdC0+c2hhMSk7CglmcmVlKGJ1Zik7 Cn0KCnN0YXRpYyBpbnQgdHJlZV9jb250ZW50X3NldCgKCXN0cnVjdCB0cmVlX2VudHJ5ICpyb290 LAoJY29uc3QgY2hhciAqcCwKCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnNoYTEsCgljb25zdCB1bnNp Z25lZCBpbnQgbW9kZSkKewoJc3RydWN0IHRyZWVfY29udGVudCAqdCA9IHJvb3QtPnRyZWU7Cglj b25zdCBjaGFyICpzbGFzaDE7Cgl1bnNpZ25lZCBpbnQgaSwgbjsKCXN0cnVjdCB0cmVlX2VudHJ5 ICplOwoKCXNsYXNoMSA9IHN0cmNocihwLCAnLycpOwoJaWYgKHNsYXNoMSkKCQluID0gc2xhc2gx IC0gcDsKCWVsc2UKCQluID0gc3RybGVuKHApOwoKCWZvciAoaSA9IDA7IGkgPCB0LT5lbnRyeV9j b3VudDsgaSsrKSB7CgkJZSA9IHQtPmVudHJpZXNbaV07CgkJaWYgKGUtPm5hbWUtPnN0cl9sZW4g PT0gbiAmJiAhc3RybmNtcChwLCBlLT5uYW1lLT5zdHJfZGF0LCBuKSkgewoJCQlpZiAoIXNsYXNo MSkgewoJCQkJaWYgKGUtPm1vZGUgPT0gbW9kZSAmJiAhbWVtY21wKGUtPnNoYTEsIHNoYTEsIDIw KSkKCQkJCQlyZXR1cm4gMDsKCQkJCWUtPm1vZGUgPSBtb2RlOwoJCQkJbWVtY3B5KGUtPnNoYTEs IHNoYTEsIDIwKTsKCQkJCWlmIChlLT50cmVlKSB7CgkJCQkJcmVsZWFzZV90cmVlX2NvbnRlbnQo ZS0+dHJlZSk7CgkJCQkJZS0+dHJlZSA9IE5VTEw7CgkJCQl9CgkJCQltZW1jcHkocm9vdC0+c2hh MSwgbnVsbF9zaGExLCAyMCk7CgkJCQlyZXR1cm4gMTsKCQkJfQoJCQlpZiAoIVNfSVNESVIoZS0+ bW9kZSkpIHsKCQkJCWUtPnRyZWUgPSBuZXdfdHJlZV9jb250ZW50KDgpOwoJCQkJZS0+bW9kZSA9 IFNfSUZESVI7CgkJCX0KCQkJaWYgKCFlLT50cmVlKQoJCQkJbG9hZF90cmVlKGUpOwoJCQlpZiAo dHJlZV9jb250ZW50X3NldChlLCBzbGFzaDEgKyAxLCBzaGExLCBtb2RlKSkgewoJCQkJbWVtY3B5 KHJvb3QtPnNoYTEsIG51bGxfc2hhMSwgMjApOwoJCQkJcmV0dXJuIDE7CgkJCX0KCQkJcmV0dXJu IDA7CgkJfQoJfQoKCWlmICh0LT5lbnRyeV9jb3VudCA9PSB0LT5lbnRyeV9jYXBhY2l0eSkKCQly b290LT50cmVlID0gdCA9IGdyb3dfdHJlZV9jb250ZW50KHQsIDgpOwoJZSA9IG5ld190cmVlX2Vu dHJ5KCk7CgllLT5uYW1lID0gdG9fYXRvbShwLCBuKTsKCXQtPmVudHJpZXNbdC0+ZW50cnlfY291 bnQrK10gPSBlOwoJaWYgKHNsYXNoMSkgewoJCWUtPnRyZWUgPSBuZXdfdHJlZV9jb250ZW50KDgp OwoJCWUtPm1vZGUgPSBTX0lGRElSOwoJCXRyZWVfY29udGVudF9zZXQoZSwgc2xhc2gxICsgMSwg c2hhMSwgbW9kZSk7Cgl9IGVsc2UgewoJCWUtPnRyZWUgPSBOVUxMOwoJCWUtPm1vZGUgPSBtb2Rl OwoJCW1lbWNweShlLT5zaGExLCBzaGExLCAyMCk7Cgl9CgltZW1jcHkocm9vdC0+c2hhMSwgbnVs bF9zaGExLCAyMCk7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCB0cmVlX2NvbnRlbnRfcmVtb3Zl KHN0cnVjdCB0cmVlX2VudHJ5ICpyb290LCBjb25zdCBjaGFyICpwKQp7CglzdHJ1Y3QgdHJlZV9j b250ZW50ICp0ID0gcm9vdC0+dHJlZTsKCWNvbnN0IGNoYXIgKnNsYXNoMTsKCXVuc2lnbmVkIGlu dCBpLCBuOwoJc3RydWN0IHRyZWVfZW50cnkgKmU7CgoJc2xhc2gxID0gc3RyY2hyKHAsICcvJyk7 CglpZiAoc2xhc2gxKQoJCW4gPSBzbGFzaDEgLSBwOwoJZWxzZQoJCW4gPSBzdHJsZW4ocCk7CgoJ Zm9yIChpID0gMDsgaSA8IHQtPmVudHJ5X2NvdW50OyBpKyspIHsKCQllID0gdC0+ZW50cmllc1tp XTsKCQlpZiAoZS0+bmFtZS0+c3RyX2xlbiA9PSBuICYmICFzdHJuY21wKHAsIGUtPm5hbWUtPnN0 cl9kYXQsIG4pKSB7CgkJCWlmICghc2xhc2gxIHx8ICFTX0lTRElSKGUtPm1vZGUpKQoJCQkJZ290 byBkZWxfZW50cnk7CgkJCWlmICghZS0+dHJlZSkKCQkJCWxvYWRfdHJlZShlKTsKCQkJaWYgKHRy ZWVfY29udGVudF9yZW1vdmUoZSwgc2xhc2gxICsgMSkpIHsKCQkJCWlmICghZS0+dHJlZS0+ZW50 cnlfY291bnQpCgkJCQkJZ290byBkZWxfZW50cnk7CgkJCQltZW1jcHkocm9vdC0+c2hhMSwgbnVs bF9zaGExLCAyMCk7CgkJCQlyZXR1cm4gMTsKCQkJfQoJCQlyZXR1cm4gMDsKCQl9Cgl9CglyZXR1 cm4gMDsKCmRlbF9lbnRyeToKCWZvciAoaSsrOyBpIDwgdC0+ZW50cnlfY291bnQ7IGkrKykKCQl0 LT5lbnRyaWVzW2ktMV0gPSB0LT5lbnRyaWVzW2ldOwoJdC0+ZW50cnlfY291bnQtLTsKCXJlbGVh c2VfdHJlZV9lbnRyeShlKTsKCW1lbWNweShyb290LT5zaGExLCBudWxsX3NoYTEsIDIwKTsKCXJl dHVybiAxOwp9CgpzdGF0aWMgdm9pZCBpbml0X3BhY2tfaGVhZGVyKCkKewoJY29uc3QgY2hhciog bWFnaWMgPSAiUEFDSyI7Cgl1bnNpZ25lZCBsb25nIHZlcnNpb24gPSAzOwoJdW5zaWduZWQgbG9u ZyB6ZXJvID0gMDsKCgl2ZXJzaW9uID0gaHRvbmwodmVyc2lvbik7Cgl5d3JpdGUocGFja19mZCwg KGNoYXIqKW1hZ2ljLCA0KTsKCXl3cml0ZShwYWNrX2ZkLCAmdmVyc2lvbiwgNCk7Cgl5d3JpdGUo cGFja19mZCwgJnplcm8sIDQpOwoJcGFja19vZmZzZXQgPSA0ICogMzsKfQoKc3RhdGljIHZvaWQg Zml4dXBfaGVhZGVyX2Zvb3RlcigpCnsKCVNIQV9DVFggYzsKCWNoYXIgaGRyWzhdOwoJdW5zaWdu ZWQgbG9uZyBjbnQ7CgljaGFyICpidWY7CglzaXplX3QgbjsKCgl6c19maW5pc2goKTsKCWlmIChs c2VlayhwYWNrX2ZkLCAwLCBTRUVLX1NFVCkgIT0gMCkKCQlkaWUoIkZhaWxlZCBzZWVraW5nIHRv IHN0YXJ0OiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CgoJU0hBMV9Jbml0KCZjKTsKCXlyZWFkKHBh Y2tfZmQsIGhkciwgOCk7CglTSEExX1VwZGF0ZSgmYywgaGRyLCA4KTsKCgljbnQgPSBodG9ubChv YmplY3RfY291bnQpOwoJU0hBMV9VcGRhdGUoJmMsICZjbnQsIDQpOwoJeXdyaXRlKHBhY2tfZmQs ICZjbnQsIDQpOwoKCWJ1ZiA9IHhtYWxsb2MoMTI4ICogMTAyNCk7Cglmb3IgKDs7KSB7CgkJbiA9 IHhyZWFkKHBhY2tfZmQsIGJ1ZiwgMTI4ICogMTAyNCk7CgkJaWYgKG4gPD0gMCkKCQkJYnJlYWs7 CgkJU0hBMV9VcGRhdGUoJmMsIGJ1Ziwgbik7Cgl9CglmcmVlKGJ1Zik7CgoJU0hBMV9GaW5hbChw YWNrX3NoYTEsICZjKTsKCXl3cml0ZShwYWNrX2ZkLCBwYWNrX3NoYTEsIHNpemVvZihwYWNrX3No YTEpKTsKfQoKc3RhdGljIGludCBvZWNtcCAoY29uc3Qgdm9pZCAqX2EsIGNvbnN0IHZvaWQgKl9i KQp7CglzdHJ1Y3Qgb2JqZWN0X2VudHJ5ICphID0gKigoc3RydWN0IG9iamVjdF9lbnRyeSoqKV9h KTsKCXN0cnVjdCBvYmplY3RfZW50cnkgKmIgPSAqKChzdHJ1Y3Qgb2JqZWN0X2VudHJ5KiopX2Ip OwoJcmV0dXJuIG1lbWNtcChhLT5zaGExLCBiLT5zaGExLCBzaXplb2YoYS0+c2hhMSkpOwp9Cgpz dGF0aWMgdm9pZCB3cml0ZV9pbmRleChjb25zdCBjaGFyICppZHhfbmFtZSkKewoJc3RydWN0IHNo YTFmaWxlICpmOwoJc3RydWN0IG9iamVjdF9lbnRyeSAqKmlkeCwgKipjLCAqKmxhc3Q7CglzdHJ1 Y3Qgb2JqZWN0X2VudHJ5ICplOwoJc3RydWN0IG9iamVjdF9lbnRyeV9wb29sICpvOwoJdW5zaWdu ZWQgaW50IGFycmF5WzI1Nl07CglpbnQgaTsKCgkvKiBCdWlsZCB0aGUgc29ydGVkIHRhYmxlIG9m IG9iamVjdCBJRHMuICovCglpZHggPSB4bWFsbG9jKG9iamVjdF9jb3VudCAqIHNpemVvZihzdHJ1 Y3Qgb2JqZWN0X2VudHJ5KikpOwoJYyA9IGlkeDsKCWZvciAobyA9IGJsb2NrczsgbzsgbyA9IG8t Pm5leHRfcG9vbCkKCQlmb3IgKGUgPSBvLT5lbnRyaWVzOyBlICE9IG8tPm5leHRfZnJlZTsgZSsr KQoJCQkqYysrID0gZTsKCWxhc3QgPSBpZHggKyBvYmplY3RfY291bnQ7Cglxc29ydChpZHgsIG9i amVjdF9jb3VudCwgc2l6ZW9mKHN0cnVjdCBvYmplY3RfZW50cnkqKSwgb2VjbXApOwoKCS8qIEdl bmVyYXRlIHRoZSBmYW4tb3V0IGFycmF5LiAqLwoJYyA9IGlkeDsKCWZvciAoaSA9IDA7IGkgPCAy NTY7IGkrKykgewoJCXN0cnVjdCBvYmplY3RfZW50cnkgKipuZXh0ID0gYzs7CgkJd2hpbGUgKG5l eHQgPCBsYXN0KSB7CgkJCWlmICgoKm5leHQpLT5zaGExWzBdICE9IGkpCgkJCQlicmVhazsKCQkJ bmV4dCsrOwoJCX0KCQlhcnJheVtpXSA9IGh0b25sKG5leHQgLSBpZHgpOwoJCWMgPSBuZXh0OwoJ fQoKCWYgPSBzaGExY3JlYXRlKCIlcyIsIGlkeF9uYW1lKTsKCXNoYTF3cml0ZShmLCBhcnJheSwg MjU2ICogc2l6ZW9mKGludCkpOwoJZm9yIChjID0gaWR4OyBjICE9IGxhc3Q7IGMrKykgewoJCXVu c2lnbmVkIGludCBvZmZzZXQgPSBodG9ubCgoKmMpLT5vZmZzZXQpOwoJCXNoYTF3cml0ZShmLCAm b2Zmc2V0LCA0KTsKCQlzaGExd3JpdGUoZiwgKCpjKS0+c2hhMSwgc2l6ZW9mKCgqYyktPnNoYTEp KTsKCX0KCXNoYTF3cml0ZShmLCBwYWNrX3NoYTEsIHNpemVvZihwYWNrX3NoYTEpKTsKCXNoYTFj bG9zZShmLCBOVUxMLCAxKTsKCWZyZWUoaWR4KTsKfQoKc3RhdGljIHZvaWQgZHVtcF9icmFuY2hl cygpCnsKCXN0YXRpYyBjb25zdCBjaGFyICptc2cgPSAiZmFzdC1pbXBvcnQiOwoJdW5zaWduZWQg aW50IGk7CglzdHJ1Y3QgYnJhbmNoICpiOwoJc3RydWN0IHJlZl9sb2NrICpsb2NrOwoKCWZvciAo aSA9IDA7IGkgPCBicmFuY2hfdGFibGVfc3o7IGkrKykgewoJCWZvciAoYiA9IGJyYW5jaF90YWJs ZVtpXTsgYjsgYiA9IGItPnRhYmxlX25leHRfYnJhbmNoKSB7CgkJCWxvY2sgPSBsb2NrX2FueV9y ZWZfZm9yX3VwZGF0ZShiLT5uYW1lLCBOVUxMLCAwKTsKCQkJaWYgKCFsb2NrIHx8IHdyaXRlX3Jl Zl9zaGExKGxvY2ssIGItPnNoYTEsIG1zZykgPCAwKQoJCQkJZGllKCJDYW4ndCB3cml0ZSAlcyIs IGItPm5hbWUpOwoJCX0KCX0KfQoKc3RhdGljIHZvaWQgcmVhZF9uZXh0X2NvbW1hbmQoKQp7Cgly ZWFkX2xpbmUoJmNvbW1hbmRfYnVmLCBzdGRpbiwgJ1xuJyk7Cn0KCnN0YXRpYyB2b2lkIGNtZF9t YXJrKCkKewoJaWYgKCFzdHJuY21wKCJtYXJrIDoiLCBjb21tYW5kX2J1Zi5idWYsIDYpKSB7CgkJ Y29tbWFuZF9tYXJrID0gc3RydG91bChjb21tYW5kX2J1Zi5idWYgKyA2LCBOVUxMLCAxMCk7CgkJ cmVhZF9uZXh0X2NvbW1hbmQoKTsKCX0KCWVsc2UKCQljb21tYW5kX21hcmsgPSAwOwp9CgpzdGF0 aWMgdm9pZCogY21kX2RhdGEgKHNpemVfdCAqc2l6ZSkKewoJc2l6ZV90IG4gPSAwOwoJdm9pZCAq YnVmZmVyOwoJc2l6ZV90IGxlbmd0aDsKCglpZiAoc3RybmNtcCgiZGF0YSAiLCBjb21tYW5kX2J1 Zi5idWYsIDUpKQoJCWRpZSgiRXhwZWN0ZWQgJ2RhdGEgbicgY29tbWFuZCwgZm91bmQ6ICVzIiwg Y29tbWFuZF9idWYuYnVmKTsKCglsZW5ndGggPSBzdHJ0b3VsKGNvbW1hbmRfYnVmLmJ1ZiArIDUs IE5VTEwsIDEwKTsKCWJ1ZmZlciA9IHhtYWxsb2MobGVuZ3RoKTsKCgl3aGlsZSAobiA8IGxlbmd0 aCkgewoJCXNpemVfdCBzID0gZnJlYWQoKGNoYXIqKWJ1ZmZlciArIG4sIDEsIGxlbmd0aCAtIG4s IHN0ZGluKTsKCQlpZiAoIXMgJiYgZmVvZihzdGRpbikpCgkJCWRpZSgiRU9GIGluIGRhdGEgKCVs dSBieXRlcyByZW1haW5pbmcpIiwgbGVuZ3RoIC0gbik7CgkJbiArPSBzOwoJfQoKCWlmIChmZ2V0 YyhzdGRpbikgIT0gJ1xuJykKCQlkaWUoIkFuIGxmIGRpZCBub3QgdHJhaWwgdGhlIGJpbmFyeSBk YXRhIGFzIGV4cGVjdGVkLiIpOwoKCSpzaXplID0gbGVuZ3RoOwoJcmV0dXJuIGJ1ZmZlcjsKfQoK c3RhdGljIHZvaWQgY21kX25ld19ibG9iKCkKewoJc2l6ZV90IGRhdGxlbjsKCXZvaWQgKmRhdDsK CXVuc2lnbmVkIGNoYXIgc2hhMVsyMF07CgoJcmVhZF9uZXh0X2NvbW1hbmQoKTsKCWNtZF9tYXJr KCk7CglkYXQgPSBjbWRfZGF0YSgmZGF0bGVuKTsKCglpZiAoc3RvcmVfb2JqZWN0KE9CSl9CTE9C LCBkYXQsIGRhdGxlbiwgJmxhc3RfYmxvYiwgc2hhMSkpIAoJCWZyZWUoZGF0KTsKfQoKc3RhdGlj IHZvaWQgdW5sb2FkX29uZV9icmFuY2goKQp7Cgl3aGlsZSAoY3VyX2FjdGl2ZV9icmFuY2hlcyA+ PSBtYXhfYWN0aXZlX2JyYW5jaGVzKSB7CgkJdW5zaWduZWQgbG9uZyBtaW5fY29tbWl0ID0gVUxP TkdfTUFYOwoJCXN0cnVjdCBicmFuY2ggKmUsICpsID0gTlVMTCwgKnAgPSBOVUxMOwoKCQlmb3Ig KGUgPSBhY3RpdmVfYnJhbmNoZXM7IGU7IGUgPSBlLT5hY3RpdmVfbmV4dF9icmFuY2gpIHsKCQkJ aWYgKGUtPmxhc3RfY29tbWl0IDwgbWluX2NvbW1pdCkgewoJCQkJcCA9IGw7CgkJCQltaW5fY29t bWl0ID0gZS0+bGFzdF9jb21taXQ7CgkJCX0KCQkJbCA9IGU7CgkJfQoKCQlpZiAocCkgewoJCQll ID0gcC0+YWN0aXZlX25leHRfYnJhbmNoOwoJCQlwLT5hY3RpdmVfbmV4dF9icmFuY2ggPSBlLT5h Y3RpdmVfbmV4dF9icmFuY2g7CgkJfSBlbHNlIHsKCQkJZSA9IGFjdGl2ZV9icmFuY2hlczsKCQkJ YWN0aXZlX2JyYW5jaGVzID0gZS0+YWN0aXZlX25leHRfYnJhbmNoOwoJCX0KCQllLT5hY3RpdmVf bmV4dF9icmFuY2ggPSBOVUxMOwoJCWlmIChlLT5icmFuY2hfdHJlZS50cmVlKSB7CgkJCXJlbGVh c2VfdHJlZV9jb250ZW50KGUtPmJyYW5jaF90cmVlLnRyZWUpOwoJCQllLT5icmFuY2hfdHJlZS50 cmVlID0gTlVMTDsKCQl9CgkJY3VyX2FjdGl2ZV9icmFuY2hlcy0tOwoJfQp9CgpzdGF0aWMgdm9p ZCBsb2FkX2JyYW5jaChzdHJ1Y3QgYnJhbmNoICpiKQp7Cglsb2FkX3RyZWUoJmItPmJyYW5jaF90 cmVlKTsKCWItPmFjdGl2ZV9uZXh0X2JyYW5jaCA9IGFjdGl2ZV9icmFuY2hlczsKCWFjdGl2ZV9i cmFuY2hlcyA9IGI7CgljdXJfYWN0aXZlX2JyYW5jaGVzKys7Cn0KCnN0YXRpYyB2b2lkIGZpbGVf Y2hhbmdlX20oc3RydWN0IGJyYW5jaCAqYikKewoJY29uc3QgY2hhciAqcCA9IGNvbW1hbmRfYnVm LmJ1ZiArIDI7CgljaGFyICpwX3VxOwoJY29uc3QgY2hhciAqZW5kcDsKCXN0cnVjdCBvYmplY3Rf ZW50cnkgKm9lOwoJdW5zaWduZWQgY2hhciBzaGExWzIwXTsKCXVuc2lnbmVkIGludCBtb2RlOwoJ Y2hhciB0eXBlWzIwXTsKCglwID0gZ2V0X21vZGUocCwgJm1vZGUpOwoJaWYgKCFwKQoJCWRpZSgi Q29ycnVwdCBtb2RlOiAlcyIsIGNvbW1hbmRfYnVmLmJ1Zik7Cglzd2l0Y2ggKG1vZGUpIHsKCWNh c2UgU19JRlJFRyB8IDA2NDQ6CgljYXNlIFNfSUZSRUcgfCAwNzU1OgoJY2FzZSAwNjQ0OgoJY2Fz ZSAwNzU1OgoJCS8qIG9rICovCgkJYnJlYWs7CglkZWZhdWx0OgoJCWRpZSgiQ29ycnVwdCBtb2Rl OiAlcyIsIGNvbW1hbmRfYnVmLmJ1Zik7Cgl9CgoJaWYgKGdldF9zaGExX2hleChwLCBzaGExKSkK CQlkaWUoIkludmFsaWQgU0hBMTogJXMiLCBjb21tYW5kX2J1Zi5idWYpOwoJcCArPSA0MDsKCWlm ICgqcCsrICE9ICcgJykKCQlkaWUoIk1pc3Npbmcgc3BhY2UgYWZ0ZXIgU0hBMTogJXMiLCBjb21t YW5kX2J1Zi5idWYpOwoKCXBfdXEgPSB1bnF1b3RlX2Nfc3R5bGUocCwgJmVuZHApOwoJaWYgKHBf dXEpIHsKCQlpZiAoKmVuZHApCgkJCWRpZSgiR2FyYmFnZSBhZnRlciBwYXRoIGluOiAlcyIsIGNv bW1hbmRfYnVmLmJ1Zik7CgkJcCA9IHBfdXE7Cgl9CgoJb2UgPSBmaW5kX29iamVjdChzaGExKTsK CWlmIChvZSkgewoJCWlmIChvZS0+dHlwZSAhPSBPQkpfQkxPQikKCQkJZGllKCJOb3QgYSBibG9i IChhY3R1YWxseSBhICVzKTogJXMiLAoJCQkJY29tbWFuZF9idWYuYnVmLCB0eXBlX25hbWVzW29l LT50eXBlXSk7Cgl9IGVsc2UgewoJCWlmIChzaGExX29iamVjdF9pbmZvKHNoYTEsIHR5cGUsIE5V TEwpKQoJCQlkaWUoIkJsb2Igbm90IGZvdW5kOiAlcyIsIGNvbW1hbmRfYnVmLmJ1Zik7CgkJaWYg KHN0cmNtcChibG9iX3R5cGUsIHR5cGUpKQoJCQlkaWUoIk5vdCBhIGJsb2IgKGFjdHVhbGx5IGEg JXMpOiAlcyIsCgkJCQljb21tYW5kX2J1Zi5idWYsIHR5cGUpOwoJfQoKCXRyZWVfY29udGVudF9z ZXQoJmItPmJyYW5jaF90cmVlLCBwLCBzaGExLCBTX0lGUkVHIHwgbW9kZSk7CgoJaWYgKHBfdXEp CgkJZnJlZShwX3VxKTsKfQoKc3RhdGljIHZvaWQgZmlsZV9jaGFuZ2VfZChzdHJ1Y3QgYnJhbmNo ICpiKQp7Cgljb25zdCBjaGFyICpwID0gY29tbWFuZF9idWYuYnVmICsgMjsKCWNoYXIgKnBfdXE7 Cgljb25zdCBjaGFyICplbmRwOwoKCXBfdXEgPSB1bnF1b3RlX2Nfc3R5bGUocCwgJmVuZHApOwoJ aWYgKHBfdXEpIHsKCQlpZiAoKmVuZHApCgkJCWRpZSgiR2FyYmFnZSBhZnRlciBwYXRoIGluOiAl cyIsIGNvbW1hbmRfYnVmLmJ1Zik7CgkJcCA9IHBfdXE7Cgl9Cgl0cmVlX2NvbnRlbnRfcmVtb3Zl KCZiLT5icmFuY2hfdHJlZSwgcCk7CglpZiAocF91cSkKCQlmcmVlKHBfdXEpOwp9CgpzdGF0aWMg dm9pZCBjbWRfbmV3X2NvbW1pdCgpCnsKCXN0cnVjdCBicmFuY2ggKmI7Cgl2b2lkICptc2c7Cglz aXplX3QgbXNnbGVuOwoJY2hhciAqc3RyX3VxOwoJY29uc3QgY2hhciAqZW5kcDsKCWNoYXIgKnNw OwoJY2hhciAqYXV0aG9yID0gTlVMTDsKCWNoYXIgKmNvbW1pdHRlciA9IE5VTEw7CgljaGFyICpi b2R5OwoKCS8qIE9idGFpbiB0aGUgYnJhbmNoIG5hbWUgZnJvbSB0aGUgcmVzdCBvZiBvdXIgY29t bWFuZCAqLwoJc3AgPSBzdHJjaHIoY29tbWFuZF9idWYuYnVmLCAnICcpICsgMTsKCXN0cl91cSA9 IHVucXVvdGVfY19zdHlsZShzcCwgJmVuZHApOwoJaWYgKHN0cl91cSkgewoJCWlmICgqZW5kcCkK CQkJZGllKCJHYXJiYWdlIGFmdGVyIHJlZiBpbjogJXMiLCBjb21tYW5kX2J1Zi5idWYpOwoJCXNw ID0gc3RyX3VxOwoJfQoJYiA9IGxvb2t1cF9icmFuY2goc3ApOwoJaWYgKCFiKQoJCWRpZSgiQnJh bmNoIG5vdCBkZWNsYXJlZDogJXMiLCBzcCk7CglpZiAoc3RyX3VxKQoJCWZyZWUoc3RyX3VxKTsK CglyZWFkX25leHRfY29tbWFuZCgpOwoJY21kX21hcmsoKTsKCWlmICghc3RybmNtcCgiYXV0aG9y ICIsIGNvbW1hbmRfYnVmLmJ1ZiwgNykpIHsKCQlhdXRob3IgPSBzdHJkdXAoY29tbWFuZF9idWYu YnVmKTsKCQlyZWFkX25leHRfY29tbWFuZCgpOwoJfQoJaWYgKCFzdHJuY21wKCJjb21taXR0ZXIg IiwgY29tbWFuZF9idWYuYnVmLCAxMCkpIHsKCQljb21taXR0ZXIgPSBzdHJkdXAoY29tbWFuZF9i dWYuYnVmKTsKCQlyZWFkX25leHRfY29tbWFuZCgpOwoJfQoJaWYgKCFjb21taXR0ZXIpCgkJZGll KCJFeHBlY3RlZCBjb21taXR0ZXIgYnV0IGRpZG4ndCBnZXQgb25lIik7Cgltc2cgPSBjbWRfZGF0 YSgmbXNnbGVuKTsKCgkvKiBlbnN1cmUgdGhlIGJyYW5jaCBpcyBhY3RpdmUvbG9hZGVkICovCglp ZiAoIWItPmJyYW5jaF90cmVlLnRyZWUpIHsKCQl1bmxvYWRfb25lX2JyYW5jaCgpOwoJCWxvYWRf YnJhbmNoKGIpOwoJfQoKCS8qIGZpbGVfY2hhbmdlKiAqLwoJZm9yICg7OykgewoJCXJlYWRfbmV4 dF9jb21tYW5kKCk7CgkJaWYgKDEgPT0gY29tbWFuZF9idWYubGVuKQoJCQlicmVhazsKCQllbHNl IGlmICghc3RybmNtcCgiTSAiLCBjb21tYW5kX2J1Zi5idWYsIDIpKQoJCQlmaWxlX2NoYW5nZV9t KGIpOwoJCWVsc2UgaWYgKCFzdHJuY21wKCJEICIsIGNvbW1hbmRfYnVmLmJ1ZiwgMikpCgkJCWZp bGVfY2hhbmdlX2QoYik7CgkJZWxzZQoJCQlkaWUoIlVuc3VwcG9ydGVkIGZpbGVfY2hhbmdlOiAl cyIsIGNvbW1hbmRfYnVmLmJ1Zik7Cgl9CgoJLyogYnVpbGQgdGhlIHRyZWUgYW5kIHRoZSBjb21t aXQgKi8KCXN0b3JlX3RyZWUoJmItPmJyYW5jaF90cmVlKTsKCWJvZHkgPSB4bWFsbG9jKDk3ICsg bXNnbGVuCgkJKyAoYXV0aG9yCgkJCT8gc3RybGVuKGF1dGhvcikgKyBzdHJsZW4oY29tbWl0dGVy KQoJCQk6IDIgKiBzdHJsZW4oY29tbWl0dGVyKSkpOwoJc3AgPSBib2R5OwoJc3AgKz0gc3ByaW50 ZihzcCwgInRyZWUgJXNcbiIsIHNoYTFfdG9faGV4KGItPmJyYW5jaF90cmVlLnNoYTEpKTsKCWlm IChtZW1jbXAoYi0+c2hhMSwgbnVsbF9zaGExLCAyMCkpCgkJc3AgKz0gc3ByaW50ZihzcCwgInBh cmVudCAlc1xuIiwgc2hhMV90b19oZXgoYi0+c2hhMSkpOwoJaWYgKGF1dGhvcikKCQlzcCArPSBz cHJpbnRmKHNwLCAiJXNcbiIsIGF1dGhvcik7CgllbHNlCgkJc3AgKz0gc3ByaW50ZihzcCwgImF1 dGhvciAlc1xuIiwgY29tbWl0dGVyICsgMTApOwoJc3AgKz0gc3ByaW50ZihzcCwgIiVzXG5cbiIs IGNvbW1pdHRlcik7CgltZW1jcHkoc3AsIG1zZywgbXNnbGVuKTsKCXNwICs9IG1zZ2xlbjsKCWlm IChhdXRob3IpCgkJZnJlZShhdXRob3IpOwoJZnJlZShjb21taXR0ZXIpOwoJZnJlZShtc2cpOwoK CXN0b3JlX29iamVjdChPQkpfQ09NTUlULCBib2R5LCBzcCAtIGJvZHksIE5VTEwsIGItPnNoYTEp OwoJZnJlZShib2R5KTsKCWItPmxhc3RfY29tbWl0ID0gb2JqZWN0X2NvdW50X2J5X3R5cGVbT0JK X0NPTU1JVF07Cn0KCnN0YXRpYyB2b2lkIGNtZF9uZXdfYnJhbmNoKCkKewoJc3RydWN0IGJyYW5j aCAqYjsKCWNoYXIgKnN0cl91cTsKCWNvbnN0IGNoYXIgKmVuZHA7CgljaGFyICpzcDsKCgkvKiBP YnRhaW4gdGhlIG5ldyBicmFuY2ggbmFtZSBmcm9tIHRoZSByZXN0IG9mIG91ciBjb21tYW5kICov CglzcCA9IHN0cmNocihjb21tYW5kX2J1Zi5idWYsICcgJykgKyAxOwoJc3RyX3VxID0gdW5xdW90 ZV9jX3N0eWxlKHNwLCAmZW5kcCk7CglpZiAoc3RyX3VxKSB7CgkJaWYgKCplbmRwKQoJCQlkaWUo IkdhcmJhZ2UgYWZ0ZXIgcmVmIGluOiAlcyIsIGNvbW1hbmRfYnVmLmJ1Zik7CgkJc3AgPSBzdHJf dXE7Cgl9CgliID0gbmV3X2JyYW5jaChzcCk7CglpZiAoc3RyX3VxKQoJCWZyZWUoc3RyX3VxKTsK CXJlYWRfbmV4dF9jb21tYW5kKCk7CgoJLyogZnJvbSAuLi4gKi8KCWlmICghc3RybmNtcCgiZnJv bSAiLCBjb21tYW5kX2J1Zi5idWYsIDUpKSB7CgkJY29uc3QgY2hhciAqZnJvbTsKCQlzdHJ1Y3Qg YnJhbmNoICpzOwoKCQlmcm9tID0gc3RyY2hyKGNvbW1hbmRfYnVmLmJ1ZiwgJyAnKSArIDE7CgkJ c3RyX3VxID0gdW5xdW90ZV9jX3N0eWxlKGZyb20sICZlbmRwKTsKCQlpZiAoc3RyX3VxKSB7CgkJ CWlmICgqZW5kcCkKCQkJCWRpZSgiR2FyYmFnZSBhZnRlciBzdHJpbmcgaW46ICVzIiwgY29tbWFu ZF9idWYuYnVmKTsKCQkJZnJvbSA9IHN0cl91cTsKCQl9CgoJCXMgPSBsb29rdXBfYnJhbmNoKGZy b20pOwoJCWlmIChiID09IHMpCgkJCWRpZSgiQ2FuJ3QgY3JlYXRlIGEgYnJhbmNoIGZyb20gaXRz ZWxmOiAlcyIsIGItPm5hbWUpOwoJCWVsc2UgaWYgKHMpIHsKCQkJbWVtY3B5KGItPnNoYTEsIHMt PnNoYTEsIDIwKTsKCQkJbWVtY3B5KGItPmJyYW5jaF90cmVlLnNoYTEsIHMtPmJyYW5jaF90cmVl LnNoYTEsIDIwKTsKCQl9IGVsc2UgaWYgKCFnZXRfc2hhMShmcm9tLCBiLT5zaGExKSkgewoJCQlp ZiAoIW1lbWNtcChiLT5zaGExLCBudWxsX3NoYTEsIDIwKSkKCQkJCW1lbWNweShiLT5icmFuY2hf dHJlZS5zaGExLCBudWxsX3NoYTEsIDIwKTsKCQkJZWxzZSB7CgkJCQl1bnNpZ25lZCBsb25nIHNp emU7CgkJCQljaGFyICpidWY7CgoJCQkJYnVmID0gcmVhZF9vYmplY3Rfd2l0aF9yZWZlcmVuY2Uo Yi0+c2hhMSwKCQkJCQl0eXBlX25hbWVzW09CSl9DT01NSVRdLCAmc2l6ZSwgYi0+c2hhMSk7CgkJ CQlpZiAoIWJ1ZiB8fCBzaXplIDwgNDYpCgkJCQkJZGllKCJOb3QgYSB2YWxpZCBjb21taXQ6ICVz IiwgZnJvbSk7CgkJCQlpZiAobWVtY21wKCJ0cmVlICIsIGJ1ZiwgNSkKCQkJCQl8fCBnZXRfc2hh MV9oZXgoYnVmICsgNSwgYi0+YnJhbmNoX3RyZWUuc2hhMSkpCgkJCQkJZGllKCJUaGUgY29tbWl0 ICVzIGlzIGNvcnJ1cHQiLCBzaGExX3RvX2hleChiLT5zaGExKSk7CgkJCQlmcmVlKGJ1Zik7CgkJ CX0KCQl9IGVsc2UKCQkJZGllKCJJbnZhbGlkIHJlZiBuYW1lIG9yIFNIQTEgZXhwcmVzc2lvbjog JXMiLCBmcm9tKTsKCgkJaWYgKHN0cl91cSkKCQkJZnJlZShzdHJfdXEpOwoJCXJlYWRfbmV4dF9j b21tYW5kKCk7Cgl9IGVsc2UgewoJCW1lbWNweShiLT5zaGExLCBudWxsX3NoYTEsIDIwKTsKCQlt ZW1jcHkoYi0+YnJhbmNoX3RyZWUuc2hhMSwgbnVsbF9zaGExLCAyMCk7Cgl9CgoJaWYgKGNvbW1h bmRfYnVmLmVvZiB8fCBjb21tYW5kX2J1Zi5sZW4gPiAxKQoJCWRpZSgiQW4gbGYgZGlkIG5vdCB0 ZXJtaW5hdGUgdGhlIGJyYW5jaCBjb21tYW5kIGFzIGV4cGVjdGVkLiIpOwp9CgppbnQgbWFpbihp bnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCnsKCWNvbnN0IGNoYXIgKmJhc2VfbmFtZSA9IGFy Z3ZbMV07CglpbnQgZXN0X29ial9jbnQgPSBhdG9pKGFyZ3ZbMl0pOwoJY2hhciAqcGFja19uYW1l OwoJY2hhciAqaWR4X25hbWU7CglzdHJ1Y3Qgc3RhdCBzYjsKCglzZXR1cF9pZGVudCgpOwoJZ2l0 X2NvbmZpZyhnaXRfZGVmYXVsdF9jb25maWcpOwoKCXBhY2tfbmFtZSA9IHhtYWxsb2Moc3RybGVu KGJhc2VfbmFtZSkgKyA2KTsKCXNwcmludGYocGFja19uYW1lLCAiJXMucGFjayIsIGJhc2VfbmFt ZSk7CglpZHhfbmFtZSA9IHhtYWxsb2Moc3RybGVuKGJhc2VfbmFtZSkgKyA1KTsKCXNwcmludGYo aWR4X25hbWUsICIlcy5pZHgiLCBiYXNlX25hbWUpOwoKCXBhY2tfZmQgPSBvcGVuKHBhY2tfbmFt ZSwgT19SRFdSfE9fQ1JFQVR8T19FWENMLCAwNjY2KTsKCWlmIChwYWNrX2ZkIDwgMCkKCQlkaWUo IkNhbid0IGNyZWF0ZSAlczogJXMiLCBwYWNrX25hbWUsIHN0cmVycm9yKGVycm5vKSk7CgoJaW5p dF9wYWNrX2hlYWRlcigpOwoJYWxsb2Nfb2JqZWN0cyhlc3Rfb2JqX2NudCk7CglzdHJidWZfaW5p dCgmY29tbWFuZF9idWYpOwoKCWF0b21fdGFibGUgPSB4Y2FsbG9jKGF0b21fdGFibGVfc3osIHNp emVvZihzdHJ1Y3QgYXRvbV9zdHIqKSk7CglicmFuY2hfdGFibGUgPSB4Y2FsbG9jKGJyYW5jaF90 YWJsZV9zeiwgc2l6ZW9mKHN0cnVjdCBicmFuY2gqKSk7CglhdmFpbF90cmVlX3RhYmxlID0geGNh bGxvYyhhdmFpbF90cmVlX3RhYmxlX3N6LCBzaXplb2Yoc3RydWN0IGF2YWlsX3RyZWVfY29udGVu dCopKTsKCglmb3IgKDs7KSB7CgkJcmVhZF9uZXh0X2NvbW1hbmQoKTsKCQlpZiAoY29tbWFuZF9i dWYuZW9mKQoJCQlicmVhazsKCQllbHNlIGlmICghc3RyY21wKCJibG9iIiwgY29tbWFuZF9idWYu YnVmKSkKCQkJY21kX25ld19ibG9iKCk7CgkJZWxzZSBpZiAoIXN0cm5jbXAoImJyYW5jaCAiLCBj b21tYW5kX2J1Zi5idWYsIDcpKQoJCQljbWRfbmV3X2JyYW5jaCgpOwoJCWVsc2UgaWYgKCFzdHJu Y21wKCJjb21taXQgIiwgY29tbWFuZF9idWYuYnVmLCA3KSkKCQkJY21kX25ld19jb21taXQoKTsK CQllbHNlCgkJCWRpZSgiVW5zdXBwb3J0ZWQgY29tbWFuZDogJXMiLCBjb21tYW5kX2J1Zi5idWYp OwoJfQoKCWZpeHVwX2hlYWRlcl9mb290ZXIoKTsKCWNsb3NlKHBhY2tfZmQpOwoJd3JpdGVfaW5k ZXgoaWR4X25hbWUpOwoJZHVtcF9icmFuY2hlcygpOwoKCWZwcmludGYoc3RkZXJyLCAiJXMgc3Rh dGlzdGljczpcbiIsIGFyZ3ZbMF0pOwoJZnByaW50ZihzdGRlcnIsICItLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwoJZnByaW50ZihzdGRlcnIs ICJBbGxvYydkIG9iamVjdHM6ICUxMGx1ICglMTBsdSBvdmVyZmxvdyAgKVxuIiwgYWxsb2NfY291 bnQsIGFsbG9jX2NvdW50IC0gZXN0X29ial9jbnQpOwoJZnByaW50ZihzdGRlcnIsICJUb3RhbCBv YmplY3RzOiAgICUxMGx1ICglMTBsdSBkdXBsaWNhdGVzKVxuIiwgb2JqZWN0X2NvdW50LCBkdXBs aWNhdGVfY291bnQpOwoJZnByaW50ZihzdGRlcnIsICIgICAgICBibG9icyAgOiAgICUxMGx1ICgl MTBsdSBkdXBsaWNhdGVzKVxuIiwgb2JqZWN0X2NvdW50X2J5X3R5cGVbT0JKX0JMT0JdLCBkdXBs aWNhdGVfY291bnRfYnlfdHlwZVtPQkpfQkxPQl0pOwoJZnByaW50ZihzdGRlcnIsICIgICAgICB0 cmVlcyAgOiAgICUxMGx1ICglMTBsdSBkdXBsaWNhdGVzKVxuIiwgb2JqZWN0X2NvdW50X2J5X3R5 cGVbT0JKX1RSRUVdLCBkdXBsaWNhdGVfY291bnRfYnlfdHlwZVtPQkpfVFJFRV0pOwoJZnByaW50 ZihzdGRlcnIsICIgICAgICBjb21taXRzOiAgICUxMGx1ICglMTBsdSBkdXBsaWNhdGVzKVxuIiwg b2JqZWN0X2NvdW50X2J5X3R5cGVbT0JKX0NPTU1JVF0sIGR1cGxpY2F0ZV9jb3VudF9ieV90eXBl W09CSl9DT01NSVRdKTsKCWZwcmludGYoc3RkZXJyLCAiICAgICAgdGFncyAgIDogICAlMTBsdSAo JTEwbHUgZHVwbGljYXRlcylcbiIsIG9iamVjdF9jb3VudF9ieV90eXBlW09CSl9UQUddLCBkdXBs aWNhdGVfY291bnRfYnlfdHlwZVtPQkpfVEFHXSk7CglmcHJpbnRmKHN0ZGVyciwgIlRvdGFsIHN0 cmVhbXM6ICAgJTEwdVxuIiwgc3RyZWFtX2NudCk7CglmcHJpbnRmKHN0ZGVyciwgIlRvdGFsIGJy YW5jaGVzOiAgJTEwbHVcbiIsIGJyYW5jaF9jb3VudCk7CglmcHJpbnRmKHN0ZGVyciwgIlRvdGFs IGF0b21zOiAgICAgJTEwdVxuIiwgYXRvbV9jbnQpOwoJZnByaW50ZihzdGRlcnIsICJNZW1vcnkg dG90YWw6ICAgICUxMGx1IEtpQlxuIiwgKHRvdGFsX2FsbG9jZCArIGFsbG9jX2NvdW50KnNpemVv ZihzdHJ1Y3Qgb2JqZWN0X2VudHJ5KSkvMTAyNCk7CglmcHJpbnRmKHN0ZGVyciwgIiAgICAgICBw b29sczogICAgJTEwbHUgS2lCXG4iLCB0b3RhbF9hbGxvY2QvMTAyNCk7CglmcHJpbnRmKHN0ZGVy ciwgIiAgICAgb2JqZWN0czogICAgJTEwbHUgS2lCXG4iLCAoYWxsb2NfY291bnQqc2l6ZW9mKHN0 cnVjdCBvYmplY3RfZW50cnkpKS8xMDI0KTsKCWZwcmludGYoc3RkZXJyLCAiLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKCglzdGF0KHBhY2tf bmFtZSwgJnNiKTsKCWZwcmludGYoc3RkZXJyLCAiUGFjayBzaXplOiAgICAgICAlMTBsdSBLaUJc biIsICh1bnNpZ25lZCBsb25nKShzYi5zdF9zaXplLzEwMjQpKTsKCXN0YXQoaWR4X25hbWUsICZz Yik7CglmcHJpbnRmKHN0ZGVyciwgIkluZGV4IHNpemU6ICAgICAgJTEwbHUgS2lCXG4iLCAodW5z aWduZWQgbG9uZykoc2Iuc3Rfc2l6ZS8xMDI0KSk7CgoJZnByaW50ZihzdGRlcnIsICJcbiIpOwoK CXJldHVybiAwOwp9Cgo= ------=_Part_3056_22851849.1155905590069--