From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 5CEF844F1F for ; Fri, 10 Mar 2023 22:22:05 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 621FB68BD7C; Sat, 11 Mar 2023 00:22:03 +0200 (EET) Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0969B688373 for ; Sat, 11 Mar 2023 00:21:58 +0200 (EET) Received: by mail-wr1-f50.google.com with SMTP id j2so6352596wrh.9 for ; Fri, 10 Mar 2023 14:21:57 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; t=1678486916; h=content-transfer-encoding:content-language:to:subject:from :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=hyE345y4u2rmVKZZySn/LdZcta3W1jJm/53vgSEpQp4=; b=FXLpPj2ZTxjCoub31Iq3GfDLvg5l18W7QxsSgR4lFDrFnw3+R9GfizMZ+U1QxGtoyH xZb0eB4dN+/u+vSaiB4wY9WY1hWsqNNKHu1lJR49khKjOamAkUvk76kP1vvvRslfrDxH YMK/l7frezROPudIylaoQx2J9HvC3bQv08uCpiGUEbCa80z3PRuHvx3IWjveRSh/Wdza KKA8vXRPmWXBnRIKaNPBf0sAoK+jF2eKnkTmQ5PxQs7001TeTJoZJxCQYKntNLIUWA2z eTWL9nk0RfcFAJkU/UcyT+33h5b0K5/XltLL3VgtMeOiF0uN+WsDSRUwaodSoKhr8XVz xRgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678486916; h=content-transfer-encoding:content-language:to:subject:from :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=hyE345y4u2rmVKZZySn/LdZcta3W1jJm/53vgSEpQp4=; b=oKYdYkKwJbHrKk9Aoj3f4GbEWANj3EoKRO5FiyNtoC7d+3UexoUyva+ncO6GtbFAVh /4sQPmUuf2YJp98i4Nk5FEN6Ig0b/S+ff8uUr3JwaqdbnnrTGDnRiPgxCm6DoQtMLE32 9f4ysir47oPhOltVpNVM9aDUxVY7YCOpH7kbQQ7wO6HWmMmR0t4kdBBQIf1vsencDfMy 2MPwMOsdKMSa9Vs2M5EiS7FWO1vUdXQUofPQTnPITkkVrkBE3vlkNdNhe6WW/bzwdLBf TS3Qs5UhWO0NwYBXY8XFJKVZyGgWCduDfuM2DBGca3qdKzSZBMIIUbe2dv18VlTA24X7 4h7w== X-Gm-Message-State: AO0yUKWAaesC7ZGdRBUbGk0qZPKCWf8e5tz+WAYpKojlWnA6NGefTKzi BUtU2syKv65Nds/XRlYCxZathczHk8AafQ== X-Google-Smtp-Source: AK7set9XyN247JiPWERBYc4SUIWqkLNneI/mzzE6NXtFv/y51k38lZeK9guUOWlOgxTYEZiw7JGpUQ== X-Received: by 2002:a5d:5152:0:b0:2ce:9f35:b645 with SMTP id u18-20020a5d5152000000b002ce9f35b645mr525786wrt.20.1678486915778; Fri, 10 Mar 2023 14:21:55 -0800 (PST) Received: from [192.168.1.238] ([81.0.1.1]) by smtp.gmail.com with ESMTPSA id b17-20020a5d4d91000000b002c70851bfcasm817759wru.28.2023.03.10.14.21.55 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 10 Mar 2023 14:21:55 -0800 (PST) Message-ID: <751f4a1a-b820-0111-daaa-686a8283e567@gmail.com> Date: Fri, 10 Mar 2023 23:21:54 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.8.0 From: Suraj Shirvankar To: ffmpeg-devel@ffmpeg.org Content-Language: en-US Subject: [FFmpeg-devel] [PATCH] avfilter/vf_psnr_opencl: Support PSNR Opencl X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: VGhpcyBmZWF0dXJlIHVzZXMgb3BlbmNsIHRvIHBlcmZvcm0gdGhlIFBTTlIgY2FsY3VsYXRpb24u CgpJdHMgbXkgZmlyc3QgY29udHJpYnV0aW9uIHRvIHRoZSBwcm9qZWN0LCBwbGVhc2Ugc2hhcmUg eW91ciBmZWVkYmFjawoKClNpZ25lZC1vZmYtYnk6IFN1cmFqIFNoaXJ2YW5rYXIgPHN1cmFqc2hp cnZhbmthckBnbWFpbC5jb20+Ci0tLQpjb25maWd1cmUgfCAxICsKbGliYXZmaWx0ZXIvTWFrZWZp bGUgfCAxICsKbGliYXZmaWx0ZXIvYWxsZmlsdGVycy5jIHwgMSArCmxpYmF2ZmlsdGVyL29wZW5j bC9wc25yLmNsIHwgNDEgKysrCmxpYmF2ZmlsdGVyL29wZW5jbF9zb3VyY2UuaCB8IDEgKwpsaWJh dmZpbHRlci92Zl9wc25yX29wZW5jbC5jIHwgNTg1ICsrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrCjYgZmlsZXMgY2hhbmdlZCwgNjMwIGluc2VydGlvbnMoKykKY3JlYXRlIG1vZGUg MTAwNjQ0IGxpYmF2ZmlsdGVyL29wZW5jbC9wc25yLmNsCmNyZWF0ZSBtb2RlIDEwMDY0NCBsaWJh dmZpbHRlci92Zl9wc25yX29wZW5jbC5jCgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlIGIvY29uZmln dXJlCmluZGV4IGI2NjE2ZjAwYjYuLmYxMjdmZGVkY2EgMTAwNzU1Ci0tLSBhL2NvbmZpZ3VyZQor KysgYi9jb25maWd1cmUKQEAgLTM3MTQsNiArMzcxNCw3IEBAIHBwX2ZpbHRlcl9kZXBzPSJncGwg cG9zdHByb2MiCnByZXdpdHRfb3BlbmNsX2ZpbHRlcl9kZXBzPSJvcGVuY2wiCnByb2NhbXBfdmFh cGlfZmlsdGVyX2RlcHM9InZhYXBpIgpwcm9ncmFtX29wZW5jbF9maWx0ZXJfZGVwcz0ib3BlbmNs IgorcHNucl9vcGVuY2xfZmlsdGVyX2RlcHM9Im9wZW5jbCIKcHVsbHVwX2ZpbHRlcl9kZXBzPSJn cGwiCnJlbWFwX29wZW5jbF9maWx0ZXJfZGVwcz0ib3BlbmNsIgpyZW1vdmVsb2dvX2ZpbHRlcl9k ZXBzPSJhdmNvZGVjIGF2Zm9ybWF0IHN3c2NhbGUiCmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9N YWtlZmlsZSBiL2xpYmF2ZmlsdGVyL01ha2VmaWxlCmluZGV4IGZjNzVkNzA1ZTAuLjY2NzEyM2Jm OGEgMTAwNjQ0Ci0tLSBhL2xpYmF2ZmlsdGVyL01ha2VmaWxlCisrKyBiL2xpYmF2ZmlsdGVyL01h a2VmaWxlCkBAIC00MjIsNiArNDIyLDcgQEAgT0JKUy0kKENPTkZJR19QUkVXSVRUX09QRU5DTF9G SUxURVIpICs9IAp2Zl9jb252b2x1dGlvbl9vcGVuY2wubyBvcGVuY2wubwpPQkpTLSQoQ09ORklH X1BST0NBTVBfVkFBUElfRklMVEVSKSArPSB2Zl9wcm9jYW1wX3ZhYXBpLm8gdmFhcGlfdnBwLm8K T0JKUy0kKENPTkZJR19QUk9HUkFNX09QRU5DTF9GSUxURVIpICs9IHZmX3Byb2dyYW1fb3BlbmNs Lm8gb3BlbmNsLm8gCmZyYW1lc3luYy5vCk9CSlMtJChDT05GSUdfUFNFVURPQ09MT1JfRklMVEVS KSArPSB2Zl9wc2V1ZG9jb2xvci5vCitPQkpTLSQoQ09ORklHX1BTTlJfT1BFTkNMX0ZJTFRFUikg Kz0gdmZfcHNucl9vcGVuY2wubyBmcmFtZXN5bmMubyAKb3BlbmNsL3BzbnIubwpPQkpTLSQoQ09O RklHX1BTTlJfRklMVEVSKSArPSB2Zl9wc25yLm8gZnJhbWVzeW5jLm8KT0JKUy0kKENPTkZJR19Q VUxMVVBfRklMVEVSKSArPSB2Zl9wdWxsdXAubwpPQkpTLSQoQ09ORklHX1FQX0ZJTFRFUikgKz0g dmZfcXAubwpkaWZmIC0tZ2l0IGEvbGliYXZmaWx0ZXIvYWxsZmlsdGVycy5jIGIvbGliYXZmaWx0 ZXIvYWxsZmlsdGVycy5jCmluZGV4IGQ3ZGI0NmMyYWYuLmQ4YmQ4MzJiM2EgMTAwNjQ0Ci0tLSBh L2xpYmF2ZmlsdGVyL2FsbGZpbHRlcnMuYworKysgYi9saWJhdmZpbHRlci9hbGxmaWx0ZXJzLmMK QEAgLTM5OSw2ICszOTksNyBAQCBleHRlcm4gY29uc3QgQVZGaWx0ZXIgZmZfdmZfcHJvY2FtcF92 YWFwaTsKZXh0ZXJuIGNvbnN0IEFWRmlsdGVyIGZmX3ZmX3Byb2dyYW1fb3BlbmNsOwpleHRlcm4g Y29uc3QgQVZGaWx0ZXIgZmZfdmZfcHNldWRvY29sb3I7CmV4dGVybiBjb25zdCBBVkZpbHRlciBm Zl92Zl9wc25yOworZXh0ZXJuIGNvbnN0IEFWRmlsdGVyIGZmX3ZmX3BzbnJfb3BlbmNsOwpleHRl cm4gY29uc3QgQVZGaWx0ZXIgZmZfdmZfcHVsbHVwOwpleHRlcm4gY29uc3QgQVZGaWx0ZXIgZmZf dmZfcXA7CmV4dGVybiBjb25zdCBBVkZpbHRlciBmZl92Zl9yYW5kb207CmRpZmYgLS1naXQgYS9s aWJhdmZpbHRlci9vcGVuY2wvcHNuci5jbCBiL2xpYmF2ZmlsdGVyL29wZW5jbC9wc25yLmNsCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjY3MTNkODU4YmQKLS0tIC9kZXYv bnVsbAorKysgYi9saWJhdmZpbHRlci9vcGVuY2wvcHNuci5jbApAQCAtMCwwICsxLDQxIEBACitf X2tlcm5lbCB2b2lkIGNvbXB1dGVfaW1hZ2VzX21zZV84Yml0KF9fcmVhZF9vbmx5IGltYWdlMmRf dCBtYWluLAorIF9fcmVhZF9vbmx5IGltYWdlMmRfdCByZWYsCisgX193cml0ZV9vbmx5IGltYWdl MmRfdCBtc2VfaW1nKXsKKyBjb25zdCBzYW1wbGVyX3Qgc2FtcGxlciA9IChDTEtfTk9STUFMSVpF RF9DT09SRFNfRkFMU0UgfAorIENMS19GSUxURVJfTkVBUkVTVCk7CisgaW50MiBsb2MgPSAoaW50 MikoZ2V0X2dsb2JhbF9pZCgwKSwgZ2V0X2dsb2JhbF9pZCgxKSk7CisgaW50IG1zZXggPSAwLCBt c2V5ID0gMCwgbXNleiA9IDA7CisKKyBmbG9hdDQgbWFpbl9mLCByZWZfZjsKKworIG1haW5fZiA9 IHJlYWRfaW1hZ2VmKG1haW4sIHNhbXBsZXIsIGxvYyk7CisgcmVmX2YgPSByZWFkX2ltYWdlZihy ZWYsIHNhbXBsZXIsIGxvYyk7CisgbXNleCA9ICgobWFpbl9mLnggLSByZWZfZi54KSAqIChtYWlu X2YueCAtIHJlZl9mLngpICogMjU1ICogMjU1KTsKKyBtc2V5ID0gKChtYWluX2YueSAtIHJlZl9m LnkpICogKG1haW5fZi55IC0gcmVmX2YueSkgKiAyNTUgKiAyNTUpOworIG1zZXogPSAoKG1haW5f Zi56IC0gcmVmX2YueikgKiAobWFpbl9mLnogLSByZWZfZi56KSAqIDI1NSAqIDI1NSk7CisgaW50 NCB4ID0gKGludDQpKG1zZXgsIG1zZXksIG1zZXosIDAuMCk7Cisgd3JpdGVfaW1hZ2VpKG1zZV9p bWcsIGxvYywgeCk7CisgKyArfQorCitfX2tlcm5lbCB2b2lkIHN1bShfX3JlYWRfb25seSBpbWFn ZTJkX3QgbXNlX2ltZywKKyBpbnQgaGVpZ2h0LAorIGludCB3aWR0aCwKKyBnbG9iYWwgdWxvbmc0 KiByZXN1bHQpeworIGNvbnN0IHNhbXBsZXJfdCBzYW1wbGVyID0gKENMS19OT1JNQUxJWkVEX0NP T1JEU19GQUxTRSB8CisgQ0xLX0ZJTFRFUl9ORUFSRVNUKTsKKyBpbnQgaW5kZXggPSBnZXRfZ2xv YmFsX2lkKDApOworIHVsb25nNCBzdW0gPSAwOworCisgaWYoaW5kZXggPiBoZWlnaHQpCisgcmV0 dXJuOworIGZvcihpbnQgdyA9IDA7IHcgPCB3aWR0aDsgdysrKXsKKyBpbnQ0IHIgPSByZWFkX2lt YWdlaShtc2VfaW1nLCBzYW1wbGVyLCAoaW50MikodywgaW5kZXgpKTsKKyBzdW0ueCArPSByLng7 Cisgc3VtLnkgKz0gci55OworIHN1bS56ICs9IHIuejsKKyB9Cisgc3VtLncgPSAwOworIHJlc3Vs dFtpbmRleF0gPSBzdW07Cit9CmRpZmYgLS1naXQgYS9saWJhdmZpbHRlci9vcGVuY2xfc291cmNl LmggYi9saWJhdmZpbHRlci9vcGVuY2xfc291cmNlLmgKaW5kZXggOWVhYzJkYzUxNi4uMDQyMTgx MDU2ZiAxMDA2NDQKLS0tIGEvbGliYXZmaWx0ZXIvb3BlbmNsX3NvdXJjZS5oCisrKyBiL2xpYmF2 ZmlsdGVyL29wZW5jbF9zb3VyY2UuaApAQCAtMjcsNiArMjcsNyBAQCBleHRlcm4gY29uc3QgY2hh ciAqZmZfb3BlbmNsX3NvdXJjZV9kZXNoYWtlOwpleHRlcm4gY29uc3QgY2hhciAqZmZfb3BlbmNs X3NvdXJjZV9uZWlnaGJvcjsKZXh0ZXJuIGNvbnN0IGNoYXIgKmZmX29wZW5jbF9zb3VyY2Vfbmxt ZWFuczsKZXh0ZXJuIGNvbnN0IGNoYXIgKmZmX29wZW5jbF9zb3VyY2Vfb3ZlcmxheTsKK2V4dGVy biBjb25zdCBjaGFyICpmZl9vcGVuY2xfc291cmNlX3BzbnI7CmV4dGVybiBjb25zdCBjaGFyICpm Zl9vcGVuY2xfc291cmNlX3BhZDsKZXh0ZXJuIGNvbnN0IGNoYXIgKmZmX29wZW5jbF9zb3VyY2Vf cmVtYXA7CmV4dGVybiBjb25zdCBjaGFyICpmZl9vcGVuY2xfc291cmNlX3RvbmVtYXA7CmRpZmYg LS1naXQgYS9saWJhdmZpbHRlci92Zl9wc25yX29wZW5jbC5jIGIvbGliYXZmaWx0ZXIvdmZfcHNu cl9vcGVuY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi40NzA4MmRm NzcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYXZmaWx0ZXIvdmZfcHNucl9vcGVuY2wuYwpAQCAt MCwwICsxLDU4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBSb2dlciBQYXUgTW9ubsOp IDxyb2dlci5wYXVAZW50ZWwudXBjLmVkdT4KKyAqIENvcHlyaWdodCAoYykgMjAxMSBTdGVmYW5v IFNhYmF0aW5pCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMgUGF1bCBCIE1haG9sCisgKgorICogVGhp cyBmaWxlIGlzIHBhcnQgb2YgRkZtcGVnLgorICoKKyAqIEZGbXBlZyBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUg dGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lv biAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp b24uCisgKgorICogRkZtcGVnIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2ls bCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0 aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVj ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNl IGFsb25nIHdpdGggRkZtcGVnOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisg KiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0 b24sIE1BIAowMjExMC0xMzAxIFVTQQorICovCisKKy8qKgorICogQGZpbGUKKyAqIENhbGN1bGF0 ZSB0aGUgUFNOUiBiZXR3ZWVuIHR3byBpbnB1dCB2aWRlb3MuCisgKi8KKworI2luY2x1ZGUgImxp YmF2dXRpbC9hdnN0cmluZy5oIgorI2luY2x1ZGUgImxpYmF2dXRpbC9maWxlX29wZW4uaCIKKyNp bmNsdWRlICJsaWJhdnV0aWwvb3B0LmgiCisjaW5jbHVkZSAibGliYXZ1dGlsL3BpeGRlc2MuaCIK KyNpbmNsdWRlICJhdmZpbHRlci5oIgorI2luY2x1ZGUgImRyYXd1dGlscy5oIgorI2luY2x1ZGUg ImZyYW1lc3luYy5oIgorI2luY2x1ZGUgImludGVybmFsLmgiCisjaW5jbHVkZSAicHNuci5oIgor I2luY2x1ZGUgIm9wZW5jbC5oIgorI2luY2x1ZGUgIm9wZW5jbF9zb3VyY2UuaCIKKyNpbmNsdWRl ICJ0aW1lLmgiCisKK3R5cGVkZWYgc3RydWN0IFBTTlJPcGVuQ0xDb250ZXh0Cit7CisgT3BlbkNM RmlsdGVyQ29udGV4dCBvY2Y7CisgaW50IGluaXRpYWxpc2VkOworIEZGRnJhbWVTeW5jIGZzOwor IGNsX2tlcm5lbCBrZXJuZWw7CisgY2xfbWVtIG1zZV9pbWc7CisgY2xfbWVtIHdtOworIGNsX2tl cm5lbCBzdW07CisgY2xfY29tbWFuZF9xdWV1ZSBjb21tYW5kX3F1ZXVlOworIGRvdWJsZSBtc2Us IG1pbl9tc2UsIG1heF9tc2UsIG1zZV9jb21wWzRdOworIHVpbnQ2NF90IG5iX2ZyYW1lczsKKyBG SUxFICpzdGF0c19maWxlOworIGNoYXIgKnN0YXRzX2ZpbGVfc3RyOworIGludCBzdGF0c192ZXJz aW9uOworIGludCBzdGF0c19oZWFkZXJfd3JpdHRlbjsKKyBpbnQgc3RhdHNfYWRkX21heDsKKyBp bnQgbWF4WzRdLCBhdmVyYWdlX21heDsKKyBpbnQgaXNfcmdiOworIHVpbnQ4X3QgcmdiYV9tYXBb NF07CisgY2hhciBjb21wc1s0XTsKKyBpbnQgbmJfY29tcG9uZW50czsKKyBpbnQgcGxhbmV3aWR0 aFs0XTsKKyBpbnQgcGxhbmVoZWlnaHRbNF07CisgZG91YmxlIHBsYW5ld2VpZ2h0WzRdOworIHVp bnQ2NF90ICpzY29yZTsKKyBpbnQgY291bnRlcjsKK30gUFNOUk9wZW5DTENvbnRleHQ7CisKK2lu dCBmZl9mcmFtZXN5bmNfZHVhbGlucHV0X2dldF9zaW1wbGUoRkZGcmFtZVN5bmMgKmZzLCBBVkZy YW1lICoqZjAsIApBVkZyYW1lICoqZjEpOworaW50IGZmX2ZyYW1lc3luY19kdWFsaW5wdXRfZ2V0 X3NpbXBsZShGRkZyYW1lU3luYyAqZnMsIEFWRnJhbWUgKipmMCwgCkFWRnJhbWUgKipmMSkKK3sK KyBBVkZpbHRlckNvbnRleHQgKmN0eCA9IGZzLT5wYXJlbnQ7CisgQVZGcmFtZSAqbWFpbnBpYyA9 IE5VTEwsICpzZWNvbmRwaWMgPSBOVUxMOworIGludCByZXQ7CisKKyBpZiAoKHJldCA9IGZmX2Zy YW1lc3luY19nZXRfZnJhbWUoZnMsIDAsICZtYWlucGljLCAwKSkgPCAwIHx8CisgKHJldCA9IGZm X2ZyYW1lc3luY19nZXRfZnJhbWUoZnMsIDEsICZzZWNvbmRwaWMsIDApKSA8IDApCisgeworIHJl dHVybiByZXQ7CisgfQorIGF2X2Fzc2VydDAobWFpbnBpYyk7CisgYXZfYXNzZXJ0MChzZWNvbmRw aWMpOworIG1haW5waWMtPnB0cyA9IGF2X3Jlc2NhbGVfcShmcy0+cHRzLCBmcy0+dGltZV9iYXNl LCAKY3R4LT5vdXRwdXRzWzBdLT50aW1lX2Jhc2UpOworIHNlY29uZHBpYy0+cHRzID0gYXZfcmVz Y2FsZV9xKGZzLT5wdHMsIGZzLT50aW1lX2Jhc2UsIApjdHgtPm91dHB1dHNbMF0tPnRpbWVfYmFz ZSk7CisgaWYgKGN0eC0+aXNfZGlzYWJsZWQpCisgc2Vjb25kcGljID0gTlVMTDsKKyAqZjAgPSBt YWlucGljOworICpmMSA9IHNlY29uZHBpYzsKKyByZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUg dW5zaWduZWQgcG93XzIodW5zaWduZWQgYmFzZSkKK3sKKyByZXR1cm4gYmFzZSAqIGJhc2U7Cit9 CisKK3N0YXRpYyBpbmxpbmUgZG91YmxlIGdldF9wc25yKGRvdWJsZSBtc2UsIHVpbnQ2NF90IG5i X2ZyYW1lcywgaW50IG1heCkKK3sKKyByZXR1cm4gMTAuMCAqIGxvZzEwKHBvd18yKG1heCkgLyAo bXNlIC8gbmJfZnJhbWVzKSk7Cit9CisKK3N0YXRpYyBpbnQgcHNucl9vcGVuY2xfbG9hZChBVkZp bHRlckNvbnRleHQgKmF2Y3R4LAorIGVudW0gQVZQaXhlbEZvcm1hdCBtYWluX2Zvcm1hdCwKKyBl bnVtIEFWUGl4ZWxGb3JtYXQgcmVmX2Zvcm1hdCkKK3sKKyBQU05ST3BlbkNMQ29udGV4dCAqY3R4 ID0gYXZjdHgtPnByaXY7CisgaW50IGVyciwgc3VtLCBqOworIGNvbnN0IGNoYXIgKnNvdXJjZSA9 IGZmX29wZW5jbF9zb3VyY2VfcHNucjsKKyBjbF9pbnQgY2xlOworIEFWRmlsdGVyTGluayAqaW5s aW5rID0gYXZjdHgtPmlucHV0c1swXTsKKyBkb3VibGUgYXZlcmFnZV9tYXg7CisgY29uc3QgQVZQ aXhGbXREZXNjcmlwdG9yICptYWluX2Rlc2M7CisgY2xfaW50IGhlaWdodCwgd2lkdGg7CisgY2xf aW1hZ2VfZm9ybWF0IGltZ19mb3JtYXQ7CisgY2xfaW1hZ2VfZGVzYyBpbWdfZGVzYzsKKworIGVy ciA9IGZmX29wZW5jbF9maWx0ZXJfbG9hZF9wcm9ncmFtKGF2Y3R4LCAmc291cmNlLCAxKTsKKyBp ZiAoZXJyIDwgMCkKKyBnb3RvIGZhaWw7CisKKyBtYWluX2Rlc2MgPSBhdl9waXhfZm10X2Rlc2Nf Z2V0KG1haW5fZm9ybWF0KTsKKyBjdHgtPm5iX2NvbXBvbmVudHMgPSBtYWluX2Rlc2MtPm5iX2Nv bXBvbmVudHM7CisKKyBpZiAoYXZjdHgtPmlucHV0c1swXS0+dyAhPSBhdmN0eC0+aW5wdXRzWzFd LT53IHx8CisgYXZjdHgtPmlucHV0c1swXS0+aCAhPSBhdmN0eC0+aW5wdXRzWzFdLT5oKQorIHsK KyBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIldpZHRoIGFuZCBoZWlnaHQgb2YgaW5wdXQg dmlkZW9zIG11c3QgYmUgCnNhbWUuXG4iKTsKKyByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworIH0K KworIGN0eC0+bWF4WzBdID0gKDEgPDwgbWFpbl9kZXNjLT5jb21wWzBdLmRlcHRoKSAtIDE7Cisg Y3R4LT5tYXhbMV0gPSAoMSA8PCBtYWluX2Rlc2MtPmNvbXBbMV0uZGVwdGgpIC0gMTsKKyBjdHgt Pm1heFsyXSA9ICgxIDw8IG1haW5fZGVzYy0+Y29tcFsyXS5kZXB0aCkgLSAxOworIGN0eC0+bWF4 WzNdID0gKDEgPDwgbWFpbl9kZXNjLT5jb21wWzNdLmRlcHRoKSAtIDE7CisKKyBjdHgtPmlzX3Jn YiA9IGZmX2ZpbGxfcmdiYV9tYXAoY3R4LT5yZ2JhX21hcCwgbWFpbl9mb3JtYXQpID49IDA7Cisg Y3R4LT5jb21wc1swXSA9IGN0eC0+aXNfcmdiID8gJ3InIDogJ3knOworIGN0eC0+Y29tcHNbMV0g PSBjdHgtPmlzX3JnYiA/ICdnJyA6ICd1JzsKKyBjdHgtPmNvbXBzWzJdID0gY3R4LT5pc19yZ2Ig PyAnYicgOiAndic7CisgY3R4LT5jb21wc1szXSA9ICdhJzsKKworIGN0eC0+cGxhbmVoZWlnaHRb MV0gPSBjdHgtPnBsYW5laGVpZ2h0WzJdID0gQVZfQ0VJTF9SU0hJRlQoaW5saW5rLT5oLCAKbWFp bl9kZXNjLT5sb2cyX2Nocm9tYV9oKTsKKyBjdHgtPnBsYW5laGVpZ2h0WzBdID0gY3R4LT5wbGFu ZWhlaWdodFszXSA9IGlubGluay0+aDsKKyBjdHgtPnBsYW5ld2lkdGhbMV0gPSBjdHgtPnBsYW5l d2lkdGhbMl0gPSBBVl9DRUlMX1JTSElGVChpbmxpbmstPncsIAptYWluX2Rlc2MtPmxvZzJfY2hy b21hX3cpOworIGN0eC0+cGxhbmV3aWR0aFswXSA9IGN0eC0+cGxhbmV3aWR0aFszXSA9IGlubGlu ay0+dzsKKyBzdW0gPSAwOworIGZvciAoaiA9IDA7IGogPCBjdHgtPm5iX2NvbXBvbmVudHM7IGor KykKKyBzdW0gKz0gY3R4LT5wbGFuZWhlaWdodFtqXSAqIGN0eC0+cGxhbmV3aWR0aFtqXTsKKyBh dmVyYWdlX21heCA9IDA7CisgZm9yIChqID0gMDsgaiA8IGN0eC0+bmJfY29tcG9uZW50czsgaisr KQorIHsKKyBjdHgtPnBsYW5ld2VpZ2h0W2pdID0gKGRvdWJsZSljdHgtPnBsYW5laGVpZ2h0W2pd ICogY3R4LT5wbGFuZXdpZHRoW2pdIAovIHN1bTsKKyBhdmVyYWdlX21heCArPSBjdHgtPm1heFtq XSAqIGN0eC0+cGxhbmV3ZWlnaHRbal07CisgfQorIGN0eC0+YXZlcmFnZV9tYXggPSBscmludChh dmVyYWdlX21heCk7CisKKyBjdHgtPnNjb3JlID0gYXZfY2FsbG9jKGN0eC0+bmJfY29tcG9uZW50 cywgc2l6ZW9mKCpjdHgtPnNjb3JlKSk7CisgaWYgKCFjdHgtPnNjb3JlKQorIHJldHVybiBBVkVS Uk9SKEVOT01FTSk7CisKKyBjdHgtPmNvbW1hbmRfcXVldWUgPSBjbENyZWF0ZUNvbW1hbmRRdWV1 ZShjdHgtPm9jZi5od2N0eC0+Y29udGV4dCwKKyBjdHgtPm9jZi5od2N0eC0+ZGV2aWNlX2lkLAor IENMX1FVRVVFX1BST0ZJTElOR19FTkFCTEUsICZjbGUpOworIENMX0ZBSUxfT05fRVJST1IoQVZF UlJPUihFSU8pLCAiRmFpbGVkIHRvIGNyZWF0ZSBPcGVuQ0wgIgorICJjb21tYW5kIHF1ZXVlICVk LlxuIiwKKyBjbGUpOworCisgYXZfbG9nKGF2Y3R4LCBBVl9MT0dfREVCVUcsICJTZXR0aW5nIHVw IGtlcm5lbCAuXG4iKTsKKworIGN0eC0+a2VybmVsID0gY2xDcmVhdGVLZXJuZWwoY3R4LT5vY2Yu cHJvZ3JhbSwgCiJjb21wdXRlX2ltYWdlc19tc2VfOGJpdCIsICZjbGUpOworIENMX0ZBSUxfT05f RVJST1IoQVZFUlJPUihFSU8pLCAiRmFpbGVkIHRvIGNyZWF0ZSBrZXJuZWwgCmNvbXB1dGVfaW1h Z2VzX21zZV84Yml0ICVkLlxuIiwgY2xlKTsKKworIGN0eC0+c3VtID0gY2xDcmVhdGVLZXJuZWwo Y3R4LT5vY2YucHJvZ3JhbSwgInN1bSIsICZjbGUpOworIENMX0ZBSUxfT05fRVJST1IoQVZFUlJP UihFSU8pLCAiRmFpbGVkIHRvIGNyZWF0ZSBrZXJuZWwgc3VtICVkXG4iLCBjbGUpOworCisgaGVp Z2h0ID0gY3R4LT5wbGFuZWhlaWdodFswXTsKKyB3aWR0aCA9IGN0eC0+cGxhbmV3aWR0aFswXTsK KworIGltZ19mb3JtYXQgPSAoY2xfaW1hZ2VfZm9ybWF0KXtDTF9SR0JBLCBDTF9TSUdORURfSU5U MzJ9OworCisgaW1nX2Rlc2MgPSAoY2xfaW1hZ2VfZGVzYyl7CisgLmltYWdlX3R5cGUgPSBDTF9N RU1fT0JKRUNUX0lNQUdFMkQsCisgLmltYWdlX3dpZHRoID0gd2lkdGgsCisgLmltYWdlX2hlaWdo dCA9IGhlaWdodCwKKyAuaW1hZ2VfZGVwdGggPSAwLAorIC5pbWFnZV9hcnJheV9zaXplID0gMCwK KyAuaW1hZ2Vfcm93X3BpdGNoID0gMCwKKyAuaW1hZ2Vfc2xpY2VfcGl0Y2ggPSAwLAorIC5udW1f bWlwX2xldmVscyA9IDAsCisgLm51bV9zYW1wbGVzID0gMCwKKyAuYnVmZmVyID0gTlVMTCwKKyB9 OworCisgY3R4LT5tc2VfaW1nID0gY2xDcmVhdGVJbWFnZShjdHgtPm9jZi5od2N0eC0+Y29udGV4 dCwgMCwKKyAmaW1nX2Zvcm1hdCwgJmltZ19kZXNjLCBOVUxMLCAmY2xlKTsKKyBDTF9GQUlMX09O X0VSUk9SKEFWRVJST1IoRUlPKSwgIkZhaWxlZCB0byBjcmVhdGUgYnVmZmVyOiAlZC5cbiIsIGNs ZSk7CisKKyBjdHgtPndtID0gY2xDcmVhdGVCdWZmZXIoY3R4LT5vY2YuaHdjdHgtPmNvbnRleHQs IDAsIDQgKiBoZWlnaHQgKiAKc2l6ZW9mKGNsX3Vsb25nKSwgTlVMTCwgJmNsZSk7CisgQ0xfRkFJ TF9PTl9FUlJPUihBVkVSUk9SKEVJTyksICJGYWlsZWQgdG8gY3JlYXRlIGJ1ZmZlcjogJWQuXG4i LCBjbGUpOworCisgY3R4LT5pbml0aWFsaXNlZCA9IDE7CisgcmV0dXJuIDA7CisKK2ZhaWw6Cisg aWYgKGN0eC0+Y29tbWFuZF9xdWV1ZSkKKyBjbFJlbGVhc2VDb21tYW5kUXVldWUoY3R4LT5jb21t YW5kX3F1ZXVlKTsKKyBpZiAoY3R4LT5rZXJuZWwpCisgY2xSZWxlYXNlS2VybmVsKGN0eC0+a2Vy bmVsKTsKKyByZXR1cm4gZXJyOworfQorCisjZGVmaW5lIE9GRlNFVCh4KSBvZmZzZXRvZihQU05S T3BlbkNMQ29udGV4dCwgeCkKKyNkZWZpbmUgRkxBR1MgQVZfT1BUX0ZMQUdfRklMVEVSSU5HX1BB UkFNIHwgQVZfT1BUX0ZMQUdfVklERU9fUEFSQU0KKworc3RhdGljIGNvbnN0IEFWT3B0aW9uIHBz bnJfb3BlbmNsX29wdGlvbnNbXSA9IHsKKyB7InN0YXRzX2ZpbGUiLCAiU2V0IGZpbGUgd2hlcmUg dG8gc3RvcmUgcGVyLWZyYW1lIGRpZmZlcmVuY2UgCmluZm9ybWF0aW9uIiwgT0ZGU0VUKHN0YXRz X2ZpbGVfc3RyKSwgQVZfT1BUX1RZUEVfU1RSSU5HLCB7LnN0ciA9IE5VTEx9LCAKMCwgMCwgRkxB R1N9LAorIHsiZiIsICJTZXQgZmlsZSB3aGVyZSB0byBzdG9yZSBwZXItZnJhbWUgZGlmZmVyZW5j ZSBpbmZvcm1hdGlvbiIsIApPRkZTRVQoc3RhdHNfZmlsZV9zdHIpLCBBVl9PUFRfVFlQRV9TVFJJ TkcsIHsuc3RyID0gTlVMTH0sIDAsIDAsIEZMQUdTfSwKKyB7InN0YXRzX3ZlcnNpb24iLCAiU2V0 IHRoZSBmb3JtYXQgdmVyc2lvbiBmb3IgdGhlIHN0YXRzIGZpbGUuIiwgCk9GRlNFVChzdGF0c192 ZXJzaW9uKSwgQVZfT1BUX1RZUEVfSU5ULCB7Lmk2NCA9IDF9LCAxLCAyLCBGTEFHU30sCisgeyJv dXRwdXRfbWF4IiwgIkFkZCByYXcgc3RhdHMgKG1heCB2YWx1ZXMpIHRvIHRoZSBvdXRwdXQgbG9n LiIsIApPRkZTRVQoc3RhdHNfYWRkX21heCksIEFWX09QVF9UWVBFX0JPT0wsIHsuaTY0ID0gMH0s IDAsIDEsIEZMQUdTfSwKKyB7TlVMTH19OworCitGUkFNRVNZTkNfREVGSU5FX0NMQVNTKHBzbnJf b3BlbmNsLCBQU05ST3BlbkNMQ29udGV4dCwgZnMpOworCitzdGF0aWMgdm9pZCBzZXRfbWV0YShB VkRpY3Rpb25hcnkgKiptZXRhZGF0YSwgY29uc3QgY2hhciAqa2V5LCBjaGFyIApjb21wLCBmbG9h dCBkKQoreworIGNoYXIgdmFsdWVbMTI4XTsKKyBzbnByaW50Zih2YWx1ZSwgc2l6ZW9mKHZhbHVl KSwgIiVmIiwgZCk7CisgaWYgKGNvbXApCisgeworIGNoYXIga2V5MlsxMjhdOworIHNucHJpbnRm KGtleTIsIHNpemVvZihrZXkyKSwgIiVzJWMiLCBrZXksIGNvbXApOworIGF2X2RpY3Rfc2V0KG1l dGFkYXRhLCBrZXkyLCB2YWx1ZSwgMCk7CisgfQorIGVsc2UKKyB7CisgYXZfZGljdF9zZXQobWV0 YWRhdGEsIGtleSwgdmFsdWUsIDApOworIH0KK30KKworc3RhdGljIGludCBkb19vcGVuY2xfcHNu cihGRkZyYW1lU3luYyAqZnMpCit7CisgQVZGaWx0ZXJDb250ZXh0ICphdmN0eCA9IGZzLT5wYXJl bnQ7CisgUFNOUk9wZW5DTENvbnRleHQgKmN0eCA9IGF2Y3R4LT5wcml2OworIEFWRmlsdGVyTGlu ayAqb3V0bGluayA9IGF2Y3R4LT5vdXRwdXRzWzBdOworIEFWRnJhbWUgKm91dHB1dDsKKyBBVkZy YW1lICptYXN0ZXIsICpyZWY7CisgaW50IHJldCwgZXJyLCBpOworIGNsX2ludCBjbGU7Cisgc2l6 ZV90IGdsb2JhbF93b3JrWzJdOworIGludCBwbGFuZSwga2VybmVsX2FyZyA9IDA7CisgY2xfbWVt IG1haW5fbWVtLCByZWZfbWVtOworIGNsX3Vsb25nICpkYXRhX21lbTsKKyBkb3VibGUgcHNucl9h dmc7CisgdWludDY0X3QgY29tcF9zdW1bNF0gPSB7MH07CisgZG91YmxlIGNvbXBfbXNlWzRdLCBt c2UgPSAwLjsKKyBBVkRpY3Rpb25hcnkgKiptZXRhZGF0YTsKKyBjbF9pbnQgaGVpZ2h0LCB3aWR0 aDsKKworIHJldCA9IGZmX2ZyYW1lc3luY19kdWFsaW5wdXRfZ2V0X3NpbXBsZShmcywgJm1hc3Rl ciwgJnJlZik7CisgaWYgKHJldCA8IDApCisgcmV0dXJuIHJldDsKKworIGlmIChhdmN0eC0+aXNf ZGlzYWJsZWQgfHwgIXJlZikKKyByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG1hc3Rl cik7CisKKyBpZiAoIWN0eC0+aW5pdGlhbGlzZWQpCisgeworIEFWSFdGcmFtZXNDb250ZXh0ICpt YXN0ZXJfZmMgPQorIChBVkhXRnJhbWVzQ29udGV4dCAqKW1hc3Rlci0+aHdfZnJhbWVzX2N0eC0+ ZGF0YTsKKyBBVkhXRnJhbWVzQ29udGV4dCAqcmVmX2ZjID0KKyAoQVZIV0ZyYW1lc0NvbnRleHQg KilyZWYtPmh3X2ZyYW1lc19jdHgtPmRhdGE7CisKKyBlcnIgPSBwc25yX29wZW5jbF9sb2FkKGF2 Y3R4LCBtYXN0ZXJfZmMtPnN3X2Zvcm1hdCwKKyByZWZfZmMtPnN3X2Zvcm1hdCk7CisgaWYgKGVy ciA8IDApCisgcmV0dXJuIGVycjsKKyB9CisKKyBvdXRwdXQgPSBmZl9nZXRfdmlkZW9fYnVmZmVy KG91dGxpbmssIG91dGxpbmstPncsIG91dGxpbmstPmgpOworIGkgPSAwOworCisga2VybmVsX2Fy ZyA9IDA7CisgaGVpZ2h0ID0gY3R4LT5wbGFuZWhlaWdodFtpXTsKKyB3aWR0aCA9IGN0eC0+cGxh bmV3aWR0aFtpXTsKKworIG1haW5fbWVtID0gKGNsX21lbSltYXN0ZXItPmRhdGFbaV07CisgQ0xf U0VUX0tFUk5FTF9BUkcoY3R4LT5rZXJuZWwsIGtlcm5lbF9hcmcsIGNsX21lbSwgJm1haW5fbWVt KTsKKyBrZXJuZWxfYXJnKys7CisKKyByZWZfbWVtID0gKGNsX21lbSlyZWYtPmRhdGFbaV07Cisg Q0xfU0VUX0tFUk5FTF9BUkcoY3R4LT5rZXJuZWwsIGtlcm5lbF9hcmcsIGNsX21lbSwgJnJlZl9t ZW0pOworIGtlcm5lbF9hcmcrKzsKKworIENMX1NFVF9LRVJORUxfQVJHKGN0eC0+a2VybmVsLCBr ZXJuZWxfYXJnLCBjbF9tZW0sICZjdHgtPm1zZV9pbWcpOworIGtlcm5lbF9hcmcrKzsKKworIGVy ciA9IGZmX29wZW5jbF9maWx0ZXJfd29ya19zaXplX2Zyb21faW1hZ2UoYXZjdHgsIGdsb2JhbF93 b3JrLAorIG1hc3RlciwgaSwgMCk7CisKKyBpZiAoZXJyIDwgMCkKKyBnb3RvIGZhaWw7CisKKyBh dl9sb2coYXZjdHgsIEFWX0xPR19ERUJVRywgIkVucXVlaW5nIGtlcm5lbFxuIik7CisgY2xlID0g Y2xFbnF1ZXVlTkRSYW5nZUtlcm5lbChjdHgtPmNvbW1hbmRfcXVldWUsIGN0eC0+a2VybmVsLCAy LCBOVUxMLAorIGdsb2JhbF93b3JrLCBOVUxMLCAwLCBOVUxMLCBOVUxMKTsKKyBDTF9GQUlMX09O X0VSUk9SKEFWRVJST1IoRUlPKSwgIkZhaWxlZCB0byBlbnF1ZXVlIHBzbnIga2VybmVsICIKKyAi Zm9yIHBsYW5lICVkOiAlZC5cbiIsCisgcGxhbmUsIGNsZSk7CisKKyBDTF9TRVRfS0VSTkVMX0FS RyhjdHgtPnN1bSwgMCwgY2xfbWVtLCAmY3R4LT5tc2VfaW1nKTsKKyBDTF9TRVRfS0VSTkVMX0FS RyhjdHgtPnN1bSwgMSwgY2xfaW50LCAmaGVpZ2h0KTsKKyBDTF9TRVRfS0VSTkVMX0FSRyhjdHgt PnN1bSwgMiwgY2xfaW50LCAmd2lkdGgpOworIENMX1NFVF9LRVJORUxfQVJHKGN0eC0+c3VtLCAz LCBjbF9tZW0sICZjdHgtPndtKTsKKworIHNpemVfdCB3b3Jrc2l6ZVsyXSA9IHtoZWlnaHQsIDF9 OworIGNsZSA9IGNsRW5xdWV1ZU5EUmFuZ2VLZXJuZWwoY3R4LT5jb21tYW5kX3F1ZXVlLCBjdHgt PnN1bSwgMSwgTlVMTCwKKyB3b3Jrc2l6ZSwgTlVMTCwgMCwgTlVMTCwgTlVMTCk7CisgQ0xfRkFJ TF9PTl9FUlJPUihBVkVSUk9SKEVJTyksICJGYWlsZWQgdG8gZ2V0IGRhdGE6ICVkLlxuIiwgY2xl KTsKKworIGRhdGFfbWVtID0gYXZfbWFsbG9jKDQgKiBoZWlnaHQgKiBzaXplb2YoY2xfdWxvbmcp KTsKKyBpZiAoIWRhdGFfbWVtKQorIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisKKyBjbGUgPSBj bEVucXVldWVSZWFkQnVmZmVyKGN0eC0+Y29tbWFuZF9xdWV1ZSwgY3R4LT53bSwgQ0xfRkFMU0Us IDAsIDQgCiogaGVpZ2h0ICogc2l6ZW9mKGNsX3Vsb25nKSwgZGF0YV9tZW0sIDAsIE5VTEwsIE5V TEwpOworCisgY2xlID0gY2xGaW5pc2goY3R4LT5jb21tYW5kX3F1ZXVlKTsKKyBDTF9GQUlMX09O X0VSUk9SKEFWRVJST1IoRUlPKSwgIkZhaWxlZCB0byBmaW5pc2ggY29tbWFuZCBxdWV1ZTogCiVk LlxuIiwgY2xlKTsKKworIG1ldGFkYXRhID0gJm1hc3Rlci0+bWV0YWRhdGE7CisKKyBmb3IgKGlu dCBpID0gMDsgaSA8IDQgKiBoZWlnaHQ7IGkgKz0gNCkKKyB7CisgY29tcF9zdW1bMF0gKz0gZGF0 YV9tZW1baSArIDBdOworIGNvbXBfc3VtWzFdICs9IGRhdGFfbWVtW2kgKyAxXTsKKyBjb21wX3N1 bVsyXSArPSBkYXRhX21lbVtpICsgMl07CisgY29tcF9zdW1bM10gKz0gZGF0YV9tZW1baSArIDNd OworIH0KKworIGZvciAoaW50IGMgPSAwOyBjIDwgY3R4LT5uYl9jb21wb25lbnRzOyBjKyspCisg Y29tcF9tc2VbY10gPSBjb21wX3N1bVtjXSAvICgoZG91YmxlKWN0eC0+cGxhbmV3aWR0aFtjXSAq IApjdHgtPnBsYW5laGVpZ2h0W2NdKTsKKworIGZvciAoaW50IGMgPSAwOyBjIDwgY3R4LT5uYl9j b21wb25lbnRzOyBjKyspCisgbXNlICs9IGNvbXBfbXNlW2NdICogY3R4LT5wbGFuZXdlaWdodFtj XTsKKworIGF2X2xvZyhjdHgsIEFWX0xPR19UUkFDRSwgInZhbHVlcyAlZiAlZiAlZiAlZlxuICIs IGNvbXBfbXNlWzBdLCAKY29tcF9tc2VbMV0sIGNvbXBfbXNlWzJdLCBjb21wX21zZVszXSk7CisK KyBjdHgtPm1pbl9tc2UgPSBGRk1JTihjdHgtPm1pbl9tc2UsIG1zZSk7CisgY3R4LT5tYXhfbXNl ID0gRkZNQVgoY3R4LT5tYXhfbXNlLCBtc2UpOworCisgY3R4LT5tc2UgKz0gbXNlOworCisgZm9y IChpbnQgaiA9IDA7IGogPCBjdHgtPm5iX2NvbXBvbmVudHM7IGorKykKKyBjdHgtPm1zZV9jb21w W2pdICs9IGNvbXBfbXNlW2pdOworIGN0eC0+bmJfZnJhbWVzKys7CisKKyBhdl9sb2coY3R4LCBB Vl9MT0dfVFJBQ0UsICJ2YWx1ZXMgJWYgJWYgJWYgJWZcbiAiLCBjb21wX21zZVswXSwgCmNvbXBf bXNlWzFdLCBjb21wX21zZVsyXSwgY29tcF9tc2VbM10pOworCisgZm9yIChpbnQgaiA9IDA7IGog PCBjdHgtPm5iX2NvbXBvbmVudHM7IGorKykKKyB7CisgaW50IGMgPSBjdHgtPmlzX3JnYiA/IGN0 eC0+cmdiYV9tYXBbal0gOiBqOworIHNldF9tZXRhKG1ldGFkYXRhLCAibGF2ZmkucHNuci5tc2Uu IiwgY3R4LT5jb21wc1tqXSwgY29tcF9tc2VbY10pOworIHNldF9tZXRhKG1ldGFkYXRhLCAibGF2 ZmkucHNuci5wc25yLiIsIGN0eC0+Y29tcHNbal0sIApnZXRfcHNucihjb21wX21zZVtjXSwgMSwg Y3R4LT5tYXhbY10pKTsKKyB9Cisgc2V0X21ldGEobWV0YWRhdGEsICJsYXZmaS5wc25yLm1zZV9h dmciLCAwLCBtc2UpOworIHBzbnJfYXZnID0gZ2V0X3BzbnIobXNlLCAxLCBjdHgtPmF2ZXJhZ2Vf bWF4KTsKKyBzZXRfbWV0YShtZXRhZGF0YSwgImxhdmZpLnBzbnIucHNucl9hdmciLCAwLCBwc25y X2F2Zyk7CisKKyBpZiAoY3R4LT5zdGF0c19maWxlKQorIHsKKyBpZiAoY3R4LT5zdGF0c192ZXJz aW9uID09IDIgJiYgIWN0eC0+c3RhdHNfaGVhZGVyX3dyaXR0ZW4pCisgeworIGZwcmludGYoY3R4 LT5zdGF0c19maWxlLCAicHNucl9sb2dfdmVyc2lvbjoyIGZpZWxkczpuIik7CisgZnByaW50Zihj dHgtPnN0YXRzX2ZpbGUsICIsbXNlX2F2ZyIpOworIGZvciAoaW50IGogPSAwOyBqIDwgY3R4LT5u Yl9jb21wb25lbnRzOyBqKyspCisgeworIGZwcmludGYoY3R4LT5zdGF0c19maWxlLCAiLG1zZV8l YyIsIGN0eC0+Y29tcHNbal0pOworIH0KKyBmcHJpbnRmKGN0eC0+c3RhdHNfZmlsZSwgIixwc25y X2F2ZyIpOworIGZvciAoaW50IGogPSAwOyBqIDwgY3R4LT5uYl9jb21wb25lbnRzOyBqKyspCisg eworIGZwcmludGYoY3R4LT5zdGF0c19maWxlLCAiLHBzbnJfJWMiLCBjdHgtPmNvbXBzW2pdKTsK KyB9CisgaWYgKGN0eC0+c3RhdHNfYWRkX21heCkKKyB7CisgZnByaW50ZihjdHgtPnN0YXRzX2Zp bGUsICIsbWF4X2F2ZyIpOworIGZvciAoaW50IGogPSAwOyBqIDwgY3R4LT5uYl9jb21wb25lbnRz OyBqKyspCisgeworIGZwcmludGYoY3R4LT5zdGF0c19maWxlLCAiLG1heF8lYyIsIGN0eC0+Y29t cHNbal0pOworIH0KKyB9CisgZnByaW50ZihjdHgtPnN0YXRzX2ZpbGUsICJcbiIpOworIGN0eC0+ c3RhdHNfaGVhZGVyX3dyaXR0ZW4gPSAxOworIH0KKyBmcHJpbnRmKGN0eC0+c3RhdHNfZmlsZSwg Im46JSIgUFJJZDY0ICIgbXNlX2F2ZzolMC4yZiAiLCAKY3R4LT5uYl9mcmFtZXMsIG1zZSk7Cisg Zm9yIChpbnQgaiA9IDA7IGogPCBjdHgtPm5iX2NvbXBvbmVudHM7IGorKykKKyB7CisgaW50IGMg PSBjdHgtPmlzX3JnYiA/IGN0eC0+cmdiYV9tYXBbal0gOiBqOworIGZwcmludGYoY3R4LT5zdGF0 c19maWxlLCAibXNlXyVjOiUwLjJmICIsIGN0eC0+Y29tcHNbal0sIGNvbXBfbXNlW2NdKTsKKyB9 CisgZnByaW50ZihjdHgtPnN0YXRzX2ZpbGUsICJwc25yX2F2ZzolMC4yZiAiLCBwc25yX2F2Zyk7 CisgZm9yIChpbnQgaiA9IDA7IGogPCBjdHgtPm5iX2NvbXBvbmVudHM7IGorKykKKyB7CisgaW50 IGMgPSBjdHgtPmlzX3JnYiA/IGN0eC0+cmdiYV9tYXBbal0gOiBqOworIGZwcmludGYoY3R4LT5z dGF0c19maWxlLCAicHNucl8lYzolMC4yZiAiLCBjdHgtPmNvbXBzW2pdLAorIGdldF9wc25yKGNv bXBfbXNlW2NdLCAxLCBjdHgtPm1heFtjXSkpOworIH0KKyBpZiAoY3R4LT5zdGF0c192ZXJzaW9u ID09IDIgJiYgY3R4LT5zdGF0c19hZGRfbWF4KQorIHsKKyBmcHJpbnRmKGN0eC0+c3RhdHNfZmls ZSwgIm1heF9hdmc6JWQgIiwgY3R4LT5hdmVyYWdlX21heCk7CisgZm9yIChpbnQgaiA9IDA7IGog PCBjdHgtPm5iX2NvbXBvbmVudHM7IGorKykKKyB7CisgaW50IGMgPSBjdHgtPmlzX3JnYiA/IGN0 eC0+cmdiYV9tYXBbal0gOiBqOworIGZwcmludGYoY3R4LT5zdGF0c19maWxlLCAibWF4XyVjOiVk ICIsIGN0eC0+Y29tcHNbal0sIGN0eC0+bWF4W2NdKTsKKyB9CisgfQorIGZwcmludGYoY3R4LT5z dGF0c19maWxlLCAiXG4iKTsKKyBmZmx1c2goY3R4LT5zdGF0c19maWxlKTsKKyB9CisKKyBhdl9m cmVlKGRhdGFfbWVtKTsKKyByZXR1cm4gZmZfZmlsdGVyX2ZyYW1lKG91dGxpbmssIG91dHB1dCk7 CisKK2ZhaWw6CisgcmV0dXJuIGVycjsKK30KKworc3RhdGljIGF2X2NvbGQgaW50IHBzbnJfb3Bl bmNsX2luaXQoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgUFNOUk9wZW5DTENvbnRleHQgKnMg PSBjdHgtPnByaXY7CisKKyBzLT5taW5fbXNlID0gK0lORklOSVRZOworIHMtPm1heF9tc2UgPSAt SU5GSU5JVFk7CisKKyBpZiAocy0+c3RhdHNfZmlsZV9zdHIpCisgeworIGlmIChzLT5zdGF0c192 ZXJzaW9uIDwgMiAmJiBzLT5zdGF0c19hZGRfbWF4KQorIHsKKyBhdl9sb2coY3R4LCBBVl9MT0df RVJST1IsCisgInN0YXRzX2FkZF9tYXggd2FzIHNwZWNpZmllZCBidXQgc3RhdHNfdmVyc2lvbiA8 IDIuXG4iKTsKKyByZXR1cm4gQVZFUlJPUihFSU5WQUwpOworIH0KKyBpZiAoIXN0cmNtcChzLT5z dGF0c19maWxlX3N0ciwgIi0iKSkKKyB7Cisgcy0+c3RhdHNfZmlsZSA9IHN0ZG91dDsKKyB9Cisg ZWxzZQorIHsKKyBzLT5zdGF0c19maWxlID0gYXZwcml2X2ZvcGVuX3V0Zjgocy0+c3RhdHNfZmls ZV9zdHIsICJ3Iik7CisgaWYgKCFzLT5zdGF0c19maWxlKQorIHsKKyBpbnQgZXJyID0gQVZFUlJP UihlcnJubyk7CisgY2hhciBidWZbMTI4XTsKKyBhdl9zdHJlcnJvcihlcnIsIGJ1Ziwgc2l6ZW9m KGJ1ZikpOworIGF2X2xvZyhjdHgsIEFWX0xPR19FUlJPUiwgIkNvdWxkIG5vdCBvcGVuIHN0YXRz IGZpbGUgJXM6ICVzXG4iLAorIHMtPnN0YXRzX2ZpbGVfc3RyLCBidWYpOworIHJldHVybiBlcnI7 CisgfQorIH0KKyB9CisKKyBzLT5mcy5vbl9ldmVudCA9IGRvX29wZW5jbF9wc25yOworIHJldHVy biBmZl9vcGVuY2xfZmlsdGVyX2luaXQoY3R4KTsKK30KKworc3RhdGljIGludCBwc25yX29wZW5j bF9jb25maWdfaW5wdXRfcmVmKEFWRmlsdGVyTGluayAqaW5saW5rKQoreworIEFWRmlsdGVyQ29u dGV4dCAqYXZjdHggPSBpbmxpbmstPmRzdDsKKworIGlmICghaW5saW5rLT5od19mcmFtZXNfY3R4 KQorIHsKKyBhdl9sb2coYXZjdHgsIEFWX0xPR19FUlJPUiwgIk9wZW5DTCBmaWx0ZXJpbmcgcmVx dWlyZXMgYSAiCisgImhhcmR3YXJlIGZyYW1lcyBjb250ZXh0IG9uIHRoZSBpbnB1dC5cbiIpOwor IHJldHVybiBBVkVSUk9SKEVJTlZBTCk7CisgfQorCisgaWYgKGF2Y3R4LT5pbnB1dHNbMV0gIT0g aW5saW5rKQorIHJldHVybiAwOworCisgcmV0dXJuIGZmX29wZW5jbF9maWx0ZXJfY29uZmlnX2lu cHV0KGlubGluayk7Cit9CisKK3N0YXRpYyBpbnQgcHNucl9vcGVuY2xfY29uZmlnX291dHB1dChB VkZpbHRlckxpbmsgKm91dGxpbmspCit7CisgQVZGaWx0ZXJDb250ZXh0ICpjdHggPSBvdXRsaW5r LT5zcmM7CisgUFNOUk9wZW5DTENvbnRleHQgKnMgPSBjdHgtPnByaXY7CisgQVZGaWx0ZXJMaW5r ICptYWlubGluayA9IGN0eC0+aW5wdXRzWzBdOworIEFWRmlsdGVyTGluayAqcmVmbGluayA9IGN0 eC0+aW5wdXRzWzFdOworIGludCByZXQ7CisKKyByZXQgPSBmZl9mcmFtZXN5bmNfaW5pdF9kdWFs aW5wdXQoJnMtPmZzLCBjdHgpOworIGlmIChyZXQgPCAwKQorIHJldHVybiByZXQ7Cisgb3V0bGlu ay0+dyA9IG1haW5saW5rLT53OworIG91dGxpbmstPmggPSBtYWlubGluay0+aDsKKyBvdXRsaW5r LT50aW1lX2Jhc2UgPSBtYWlubGluay0+dGltZV9iYXNlOworIG91dGxpbmstPnNhbXBsZV9hc3Bl Y3RfcmF0aW8gPSBtYWlubGluay0+c2FtcGxlX2FzcGVjdF9yYXRpbzsKKyBvdXRsaW5rLT5mcmFt ZV9yYXRlID0gbWFpbmxpbmstPmZyYW1lX3JhdGU7CisgaWYgKChyZXQgPSBmZl9mcmFtZXN5bmNf Y29uZmlndXJlKCZzLT5mcykpIDwgMCkKKyByZXR1cm4gcmV0OworCisgb3V0bGluay0+dGltZV9i YXNlID0gcy0+ZnMudGltZV9iYXNlOworCisgaWYgKGF2X2NtcF9xKG1haW5saW5rLT50aW1lX2Jh c2UsIG91dGxpbmstPnRpbWVfYmFzZSkgfHwKKyBhdl9jbXBfcShyZWZsaW5rLT50aW1lX2Jhc2Us IG91dGxpbmstPnRpbWVfYmFzZSkpCisgYXZfbG9nKGN0eCwgQVZfTE9HX1dBUk5JTkcsICJub3Qg bWF0Y2hpbmcgdGltZWJhc2VzIGZvdW5kIGJldHdlZW4gCmZpcnN0IGlucHV0OiAlZC8lZCBhbmQg c2Vjb25kIGlucHV0ICVkLyVkLCByZXN1bHRzIG1heSBiZSBpbmNvcnJlY3QhXG4iLAorIG1haW5s aW5rLT50aW1lX2Jhc2UubnVtLCBtYWlubGluay0+dGltZV9iYXNlLmRlbiwKKyByZWZsaW5rLT50 aW1lX2Jhc2UubnVtLCByZWZsaW5rLT50aW1lX2Jhc2UuZGVuKTsKKworIHJldHVybiBmZl9mcmFt ZXN5bmNfY29uZmlndXJlKCZzLT5mcyk7Cit9CisKK3N0YXRpYyBpbnQgcHNucl9vcGVuY2xfYWN0 aXZhdGUoQVZGaWx0ZXJDb250ZXh0ICpjdHgpCit7CisgUFNOUk9wZW5DTENvbnRleHQgKnMgPSBj dHgtPnByaXY7CisgcmV0dXJuIGZmX2ZyYW1lc3luY19hY3RpdmF0ZSgmcy0+ZnMpOworfQorCitz dGF0aWMgYXZfY29sZCB2b2lkIHBzbnJfb3BlbmNsX3VuaW5pdChBVkZpbHRlckNvbnRleHQgKmN0 eCkKK3sKKyBQU05ST3BlbkNMQ29udGV4dCAqcyA9IGN0eC0+cHJpdjsKKworIGlmIChzLT5uYl9m cmFtZXMgPiAwKQorIHsKKyBpbnQgajsKKyBjaGFyIGJ1ZlsyNTZdOworCisgYnVmWzBdID0gMDsK KyBmb3IgKGogPSAwOyBqIDwgcy0+bmJfY29tcG9uZW50czsgaisrKQorIHsKKyBpbnQgYyA9IHMt PmlzX3JnYiA/IHMtPnJnYmFfbWFwW2pdIDogajsKKyBhdl9zdHJsY2F0ZihidWYsIHNpemVvZihi dWYpLCAiICVjOiVmIiwgcy0+Y29tcHNbal0sCisgZ2V0X3BzbnIocy0+bXNlX2NvbXBbY10sIHMt Pm5iX2ZyYW1lcywgcy0+bWF4W2NdKSk7CisgfQorIGF2X2xvZyhjdHgsIEFWX0xPR19JTkZPLCAi UFNOUiVzIGF2ZXJhZ2U6JWYgbWluOiVmIG1heDolZlxuIiwKKyBidWYsCisgZ2V0X3BzbnIocy0+ bXNlLCBzLT5uYl9mcmFtZXMsIHMtPmF2ZXJhZ2VfbWF4KSwKKyBnZXRfcHNucihzLT5tYXhfbXNl LCAxLCBzLT5hdmVyYWdlX21heCksCisgZ2V0X3BzbnIocy0+bWluX21zZSwgMSwgcy0+YXZlcmFn ZV9tYXgpKTsKKyB9CisKKyBmZl9mcmFtZXN5bmNfdW5pbml0KCZzLT5mcyk7CisgY2xSZWxlYXNl TWVtT2JqZWN0KHMtPm1zZV9pbWcpOworIGNsUmVsZWFzZU1lbU9iamVjdChzLT53bSk7CisgYXZf ZnJlZXAoJnMtPnNjb3JlKTsKKworIGlmIChzLT5zdGF0c19maWxlICYmIHMtPnN0YXRzX2ZpbGUg IT0gc3Rkb3V0KQorIGZjbG9zZShzLT5zdGF0c19maWxlKTsKK30KKworc3RhdGljIGNvbnN0IEFW RmlsdGVyUGFkIHBzbnJfb3BlbmNsX2lucHV0c1tdID0geworIHsKKyAubmFtZSA9ICJtYWluIiwK KyAudHlwZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAuY29uZmlnX3Byb3BzID0gJmZmX29wZW5j bF9maWx0ZXJfY29uZmlnX2lucHV0LAorIH0sCisgeworIC5uYW1lID0gInJlZmVyZW5jZSIsCisg LnR5cGUgPSBBVk1FRElBX1RZUEVfVklERU8sCisgLmNvbmZpZ19wcm9wcyA9ICZwc25yX29wZW5j bF9jb25maWdfaW5wdXRfcmVmLAorIH0sCit9OworCitzdGF0aWMgY29uc3QgQVZGaWx0ZXJQYWQg cHNucl9vcGVuY2xfb3V0cHV0c1tdID0geworIHsKKyAubmFtZSA9ICJkZWZhdWx0IiwKKyAudHlw ZSA9IEFWTUVESUFfVFlQRV9WSURFTywKKyAuY29uZmlnX3Byb3BzID0gcHNucl9vcGVuY2xfY29u ZmlnX291dHB1dCwKKyB9LAorfTsKKworY29uc3QgQVZGaWx0ZXIgZmZfdmZfcHNucl9vcGVuY2wg PSB7CisgLm5hbWUgPSAicHNucl9vcGVuY2wiLAorIC5kZXNjcmlwdGlvbiA9IE5VTExfSUZfQ09O RklHX1NNQUxMKCJDYWxjdWxhdGUgdGhlIFBTTlIgYmV0d2VlbiB0d28gCnZpZGVvIHN0cmVhbXMu IiksCisgLnByZWluaXQgPSBwc25yX29wZW5jbF9mcmFtZXN5bmNfcHJlaW5pdCwKKyAuaW5pdCA9 IHBzbnJfb3BlbmNsX2luaXQsCisgLnVuaW5pdCA9IHBzbnJfb3BlbmNsX3VuaW5pdCwKKyAuYWN0 aXZhdGUgPSBwc25yX29wZW5jbF9hY3RpdmF0ZSwKKyAucHJpdl9zaXplID0gc2l6ZW9mKFBTTlJP cGVuQ0xDb250ZXh0KSwKKyAucHJpdl9jbGFzcyA9ICZwc25yX29wZW5jbF9jbGFzcywKKyBGSUxU RVJfSU5QVVRTKHBzbnJfb3BlbmNsX2lucHV0cyksCisgRklMVEVSX09VVFBVVFMocHNucl9vcGVu Y2xfb3V0cHV0cyksCisgRklMVEVSX1NJTkdMRV9QSVhGTVQoQVZfUElYX0ZNVF9PUEVOQ0wpLAor IC5mbGFncyA9IEZGX0ZJTFRFUl9GTEFHX0hXRlJBTUVfQVdBUkUgfAorIEFWRklMVEVSX0ZMQUdf TUVUQURBVEFfT05MWSwKK307CgotLSAKMi4zNC4xCgpfX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fXwpmZm1wZWctZGV2ZWwgbWFpbGluZyBsaXN0CmZmbXBlZy1k ZXZlbEBmZm1wZWcub3JnCmh0dHBzOi8vZmZtcGVnLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ZmbXBl Zy1kZXZlbAoKVG8gdW5zdWJzY3JpYmUsIHZpc2l0IGxpbmsgYWJvdmUsIG9yIGVtYWlsCmZmbXBl Zy1kZXZlbC1yZXF1ZXN0QGZmbXBlZy5vcmcgd2l0aCBzdWJqZWN0ICJ1bnN1YnNjcmliZSIuCg==