From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7A67DC61DA4 for ; Mon, 6 Feb 2023 21:57:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229771AbjBFV5F (ORCPT ); Mon, 6 Feb 2023 16:57:05 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59342 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229649AbjBFV5E (ORCPT ); Mon, 6 Feb 2023 16:57:04 -0500 Received: from mail-il1-x130.google.com (mail-il1-x130.google.com [IPv6:2607:f8b0:4864:20::130]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0C7362CFFA for ; Mon, 6 Feb 2023 13:57:01 -0800 (PST) Received: by mail-il1-x130.google.com with SMTP id v1so1234127ilg.5 for ; Mon, 06 Feb 2023 13:57:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=kernel-dk.20210112.gappssmtp.com; s=20210112; h=in-reply-to:from:references:cc:to:content-language:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=bm9AeXfepBxuveRYGKVwADt8tMjUN7ePVu2JnTDBN1c=; b=4VFaa2PtjHs2cDTaTu6Jzgsoqi1bDAZT91NodHr5A5V3dVLhY+MALqXw5kk0XWK7UT dYFJ0m+i40lk445vDHGayjd0XqEcs3HUmhm02O+kVx33eYECedDHyr5SdUHc1n3QcehE SWR3XMBho7t5d45U1jWWKZoeDG4+53oDrqBGZjCAYiKhGGWs61ZTzimq2lMPYseyNb0G 6EzPCPmRtGAlDyeXsOTapQOPWECnDQZe5adHOcMOjLHE2YYyZBBy0hqo19A+WEWHzG/6 i02o2sDW4vrSakten4YJhHvcgNnlGrcVUB825g0/wpOlEPOzEfKTCo5Roiu2Bs61J8Fy iZAA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=in-reply-to:from:references:cc:to:content-language:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=bm9AeXfepBxuveRYGKVwADt8tMjUN7ePVu2JnTDBN1c=; b=ziCbIQgMA08JkibNe5CjFurLpFl3xx6yxp+SB9b+pxFzWd6RkH8456z6psy6IdUhn+ K+2Fic8NOXpoXsTRz9cak2edEQpvn1rCHFYHERJo4ZNiXkJ/KG+0UHJMpjwwQzr7XFfX ZGt3EaH4aV29fFQCLJe+rR3wAYPgwhwj+69nKhhjlo4cF2s8HhzYtB/lnXgLbIHXQ/hU XwmbQP8K3qrIyIPPgifxiXEX7rPQtnmjrWdSvWdTqQT4Unn30+pf7NleKF6BQEEcIJKm ctzPd8w7VaccG0PgHTtBreD5hXUuekcjBhDx//pTXStA5wVLLeabGuIt6k8Oizn4cpAJ UBug== X-Gm-Message-State: AO0yUKUjkG/N96Z+nCkAC1YZ35/c89kkcjE8D7G+Gtqs6praf2w+Z5Cw LddBaNmVPhzpEOMfE2+o7Jmq9g== X-Google-Smtp-Source: AK7set8zuPpkdC7st0oGjsqQ2wtOTyy5UfnftbM67+gKYYwS6GrwvhVlRt1eKAfjXXlag3GmV6TeIA== X-Received: by 2002:a92:d24d:0:b0:313:904d:abcd with SMTP id v13-20020a92d24d000000b00313904dabcdmr561584ilg.3.1675720620317; Mon, 06 Feb 2023 13:57:00 -0800 (PST) Received: from [192.168.1.94] ([96.43.243.2]) by smtp.gmail.com with ESMTPSA id n20-20020a056638121400b003acde48bdc3sm3738659jas.111.2023.02.06.13.56.59 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 06 Feb 2023 13:56:59 -0800 (PST) Content-Type: multipart/mixed; boundary="------------MJeJrJqaUhxaK0Kg26S0GBCO" Message-ID: <00a0809e-7b47-c43c-3a13-a84cd692f514@kernel.dk> Date: Mon, 6 Feb 2023 14:56:57 -0700 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux aarch64; rv:102.0) Gecko/20100101 Thunderbird/102.7.1 Subject: Re: [PATCH v2] 9p/client: don't assume signal_pending() clears on recalc_sigpending() Content-Language: en-US To: Dominique Martinet Cc: Christian Schoenebeck , Eric Van Hensbergen , netdev , Jakub Kicinski , Pengfei Xu , v9fs-developer@lists.sourceforge.net References: <9422b998-5bab-85cc-5416-3bb5cf6dd853@kernel.dk> From: Jens Axboe In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org This is a multi-part message in MIME format. --------------MJeJrJqaUhxaK0Kg26S0GBCO Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit On 2/6/23 2:42?PM, Dominique Martinet wrote: > Jens Axboe wrote on Mon, Feb 06, 2023 at 01:19:24PM -0700: >>> I agree with your assessment that we can't use task_work_run(), I assume >>> it's also quite bad to just clear the flag? >>> I'm not familiar with these task at all, in which case do they happen? >>> Would you be able to share an easy reproducer so that I/someone can try >>> on various transports? >> >> You can't just clear the flag without also running the task_work. Hence >> it either needs to be done right there, or leave it pending and let the >> exit to userspace take care of it. > > Sorry I didn't develop that idea; the signal path resets the pending > signal when we're done, I assumed we could also reset the TWA_SIGNAL > flag when we're done flushing. That might take a while though, so it's > far from optimal. Sure, if you set it again when done, then it will probably work just fine. But you need to treat TIF_NOTIFY_SIGNAL and TIF_SIGPENDING separately. An attempt at that at the end of this email, totally untested, and I'm not certain it's a good idea at all (see below). Is there a reason why we can't exit and get the task_work processed instead? That'd be greatly preferable. >>> If it's "rare enough" I'd say sacrificing the connection might make more >>> sense than a busy loop, but if it's becoming common I think we'll need >>> to spend some more time thinking about it... >>> It might be less effort to dig out my async flush commits if this become >>> too complicated, but I wish I could say I have time for it... >> >> It can be a number of different things - eg fput() will do it. > > Hm, schedule_delayed_work on the last fput, ok. > I was wondering what it had to do with the current 9p thread, but since > it's not scheduled on a particular cpu it can pick another cpu to wake > up, that makes sense -- although conceptually it feels rather bad to > interrupt a remote IO because of a local task that can be done later; > e.g. between having the fput wait a bit, or cancel a slow operation like > a 1MB write, I'd rather make the fput wait. > Do you know why that signal/interrupt is needed in the first place? It's needed if the task is currently sleeping in the kernel, to abort a sleeping loop. The task_work may contain actions that will result in the sleep loop being satisfied and hence ending, which means it needs to be processed. That's my worry with the check-and-clear, then reset state solution. >> The particular case that I came across was io_uring, which will use >> TWA_SIGNAL based task_work for retry operations (and other things). If >> you use io_uring, and depending on how you setup the ring, it can be >> quite common or will never happen. Dropping the connection task_work >> being pending is not a viable solution, I'm afraid. > > Thanks for confirming that it's perfectly normal, let's not drop > connections :) > > My preferred approach is still to try and restore the async flush code, > but that will take a while -- it's not something that'll work right away > and I want some tests so it won't be ready for this merge window. > If we can have some sort of workaround until then it'll probably be for > the best, but I don't have any other idea (than temporarily clearing the > flag) at this point. > > I'll setup some uring IO on 9p and see if I can produce these. I'm attaching a test case. I don't think it's particularly useful, but it does nicely demonstrate the infinite loop that 9p gets into if there's task_work pending. -- Jens Axboe --------------MJeJrJqaUhxaK0Kg26S0GBCO Content-Type: text/x-csrc; charset=UTF-8; name="repro.c" Content-Disposition: attachment; filename="repro.c" Content-Transfer-Encoding: base64 Ly8gYXV0b2dlbmVyYXRlZCBieSBzeXprYWxsZXIgKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29n bGUvc3l6a2FsbGVyKQoKI2RlZmluZSBfR05VX1NPVVJDRQoKI2luY2x1ZGUgPGRpcmVudC5o PgojaW5jbHVkZSA8ZW5kaWFuLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8ZmNu dGwuaD4KI2luY2x1ZGUgPHNldGptcC5oPgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRl IDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGJvb2wuaD4KI2luY2x1ZGUgPHN0ZGRlZi5oPgoj aW5jbHVkZSA8c3RkaW50Lmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGli Lmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojaW5jbHVk ZSA8c3lzL21tYW4uaD4KI2luY2x1ZGUgPHN5cy9tb3VudC5oPgojaW5jbHVkZSA8c3lzL3By Y3RsLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4K I2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3dhaXQuaD4KI2luY2x1ZGUg PHRpbWUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2luY2x1ZGUgPGxpbnV4L2xvb3AuaD4K CiNpZm5kZWYgX19OUl9pb191cmluZ19zZXR1cAojZGVmaW5lIF9fTlJfaW9fdXJpbmdfc2V0 dXAgNDI1CiNlbmRpZgojaWZuZGVmIF9fTlJfbWVtZmRfY3JlYXRlCiNkZWZpbmUgX19OUl9t ZW1mZF9jcmVhdGUgMzE5CiNlbmRpZgoKc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBwcm9j aWQ7CgpzdGF0aWMgX190aHJlYWQgaW50IGNsb25lX29uZ29pbmc7CnN0YXRpYyBfX3RocmVh ZCBpbnQgc2tpcF9zZWd2OwpzdGF0aWMgX190aHJlYWQgam1wX2J1ZiBzZWd2X2VudjsKCnN0 YXRpYyB2b2lkIHNlZ3ZfaGFuZGxlcihpbnQgc2lnLCBzaWdpbmZvX3QqIGluZm8sIHZvaWQq IGN0eCkKewogIGlmIChfX2F0b21pY19sb2FkX24oJmNsb25lX29uZ29pbmcsIF9fQVRPTUlD X1JFTEFYRUQpICE9IDApIHsKICAgIGV4aXQoc2lnKTsKICB9CiAgdWludHB0cl90IGFkZHIg PSAodWludHB0cl90KWluZm8tPnNpX2FkZHI7CiAgY29uc3QgdWludHB0cl90IHByb2dfc3Rh cnQgPSAxIDw8IDIwOwogIGNvbnN0IHVpbnRwdHJfdCBwcm9nX2VuZCA9IDEwMCA8PCAyMDsK ICBpbnQgc2tpcCA9IF9fYXRvbWljX2xvYWRfbigmc2tpcF9zZWd2LCBfX0FUT01JQ19SRUxB WEVEKSAhPSAwOwogIGludCB2YWxpZCA9IGFkZHIgPCBwcm9nX3N0YXJ0IHx8IGFkZHIgPiBw cm9nX2VuZDsKICBpZiAoc2tpcCAmJiB2YWxpZCkgewogICAgX2xvbmdqbXAoc2Vndl9lbnYs IDEpOwogIH0KICBleGl0KHNpZyk7Cn0KCnN0YXRpYyB2b2lkIGluc3RhbGxfc2Vndl9oYW5k bGVyKHZvaWQpCnsKICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwogIG1lbXNldCgmc2EsIDAsIHNp emVvZihzYSkpOwogIHNhLnNhX2hhbmRsZXIgPSBTSUdfSUdOOwogIHN5c2NhbGwoU1lTX3J0 X3NpZ2FjdGlvbiwgMHgyMCwgJnNhLCBOVUxMLCA4KTsKICBzeXNjYWxsKFNZU19ydF9zaWdh Y3Rpb24sIDB4MjEsICZzYSwgTlVMTCwgOCk7CiAgbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNh KSk7CiAgc2Euc2Ffc2lnYWN0aW9uID0gc2Vndl9oYW5kbGVyOwogIHNhLnNhX2ZsYWdzID0g U0FfTk9ERUZFUiB8IFNBX1NJR0lORk87CiAgc2lnYWN0aW9uKFNJR1NFR1YsICZzYSwgTlVM TCk7CiAgc2lnYWN0aW9uKFNJR0JVUywgJnNhLCBOVUxMKTsKfQoKI2RlZmluZSBOT05GQUlM SU5HKC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGludCBvayA9IDE7 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKICAgIF9fYXRvbWljX2ZldGNoX2FkZCgmc2tpcF9zZWd2LCAxLCBfX0FU T01JQ19TRVFfQ1NUKTsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGlmIChfc2V0am1w KHNlZ3ZfZW52KSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKICAgICAgX19WQV9BUkdTX187ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gZWxzZSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKICAgICAgb2sgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIF9fYXRvbWljX2Zl dGNoX3N1Yigmc2tpcF9zZWd2LCAxLCBfX0FUT01JQ19TRVFfQ1NUKTsgICAgICAgICAgICAg ICAgICAgICAgIFwKICAgIG9rOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICB9KQoKc3RhdGljIHZv aWQgc2xlZXBfbXModWludDY0X3QgbXMpCnsKICB1c2xlZXAobXMgKiAxMDAwKTsKfQoKc3Rh dGljIHVpbnQ2NF90IGN1cnJlbnRfdGltZV9tcyh2b2lkKQp7CiAgc3RydWN0IHRpbWVzcGVj IHRzOwogIGlmIChjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKSkKICAgIGV4 aXQoMSk7CiAgcmV0dXJuICh1aW50NjRfdCl0cy50dl9zZWMgKiAxMDAwICsgKHVpbnQ2NF90 KXRzLnR2X25zZWMgLyAxMDAwMDAwOwp9CgpzdGF0aWMgYm9vbCB3cml0ZV9maWxlKGNvbnN0 IGNoYXIqIGZpbGUsIGNvbnN0IGNoYXIqIHdoYXQsIC4uLikKewogIGNoYXIgYnVmWzEwMjRd OwogIHZhX2xpc3QgYXJnczsKICB2YV9zdGFydChhcmdzLCB3aGF0KTsKICB2c25wcmludGYo YnVmLCBzaXplb2YoYnVmKSwgd2hhdCwgYXJncyk7CiAgdmFfZW5kKGFyZ3MpOwogIGJ1Zltz aXplb2YoYnVmKSAtIDFdID0gMDsKICBpbnQgbGVuID0gc3RybGVuKGJ1Zik7CiAgaW50IGZk ID0gb3BlbihmaWxlLCBPX1dST05MWSB8IE9fQ0xPRVhFQyk7CiAgaWYgKGZkID09IC0xKQog ICAgcmV0dXJuIGZhbHNlOwogIGlmICh3cml0ZShmZCwgYnVmLCBsZW4pICE9IGxlbikgewog ICAgaW50IGVyciA9IGVycm5vOwogICAgY2xvc2UoZmQpOwogICAgZXJybm8gPSBlcnI7CiAg ICByZXR1cm4gZmFsc2U7CiAgfQogIGNsb3NlKGZkKTsKICByZXR1cm4gdHJ1ZTsKfQoKLy8l IFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gcHVmZi57YyxofSwgZm91bmQgaW4gdGhlIHps aWIgZGV2ZWxvcG1lbnQuIFRoZQovLyUgb3JpZ2luYWwgZmlsZXMgY29tZSB3aXRoIHRoZSBm b2xsb3dpbmcgY29weXJpZ2h0IG5vdGljZToKCi8vJSBDb3B5cmlnaHQgKEMpIDIwMDItMjAx MyBNYXJrIEFkbGVyLCBhbGwgcmlnaHRzIHJlc2VydmVkCi8vJSB2ZXJzaW9uIDIuMywgMjEg SmFuIDIwMTMKLy8lIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91 dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCi8vJSB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdp bGwgdGhlIGF1dGhvciBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLy8lIGFyaXNp bmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi8vJSBQZXJtaXNzaW9uIGlzIGdy YW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwK Ly8lIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0 IGFuZCByZWRpc3RyaWJ1dGUgaXQKLy8lIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93 aW5nIHJlc3RyaWN0aW9uczoKLy8lIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBt dXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90Ci8vJSAgICBjbGFpbSB0 aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBz b2Z0d2FyZQovLyUgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUg cHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCi8vJSAgICBhcHByZWNpYXRlZCBidXQg aXMgbm90IHJlcXVpcmVkLgovLyUgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBi ZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKLy8lICAgIG1pc3Jl cHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KLy8lIDMuIFRoaXMg bm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBk aXN0cmlidXRpb24uCi8vJSBNYXJrIEFkbGVyICAgIG1hZGxlckBhbHVtbmkuY2FsdGVjaC5l ZHUKCi8vJSBCRUdJTiBDT0RFIERFUklWRUQgRlJPTSBwdWZmLntjLGh9CgojZGVmaW5lIE1B WEJJVFMgMTUKI2RlZmluZSBNQVhMQ09ERVMgMjg2CiNkZWZpbmUgTUFYRENPREVTIDMwCiNk ZWZpbmUgTUFYQ09ERVMgKE1BWExDT0RFUyArIE1BWERDT0RFUykKI2RlZmluZSBGSVhMQ09E RVMgMjg4CgpzdHJ1Y3QgcHVmZl9zdGF0ZSB7CiAgdW5zaWduZWQgY2hhciogb3V0OwogIHVu c2lnbmVkIGxvbmcgb3V0bGVuOwogIHVuc2lnbmVkIGxvbmcgb3V0Y250OwogIGNvbnN0IHVu c2lnbmVkIGNoYXIqIGluOwogIHVuc2lnbmVkIGxvbmcgaW5sZW47CiAgdW5zaWduZWQgbG9u ZyBpbmNudDsKICBpbnQgYml0YnVmOwogIGludCBiaXRjbnQ7CiAgam1wX2J1ZiBlbnY7Cn07 CnN0YXRpYyBpbnQgcHVmZl9iaXRzKHN0cnVjdCBwdWZmX3N0YXRlKiBzLCBpbnQgbmVlZCkK ewogIGxvbmcgdmFsID0gcy0+Yml0YnVmOwogIHdoaWxlIChzLT5iaXRjbnQgPCBuZWVkKSB7 CiAgICBpZiAocy0+aW5jbnQgPT0gcy0+aW5sZW4pCiAgICAgIGxvbmdqbXAocy0+ZW52LCAx KTsKICAgIHZhbCB8PSAobG9uZykocy0+aW5bcy0+aW5jbnQrK10pIDw8IHMtPmJpdGNudDsK ICAgIHMtPmJpdGNudCArPSA4OwogIH0KICBzLT5iaXRidWYgPSAoaW50KSh2YWwgPj4gbmVl ZCk7CiAgcy0+Yml0Y250IC09IG5lZWQ7CiAgcmV0dXJuIChpbnQpKHZhbCAmICgoMUwgPDwg bmVlZCkgLSAxKSk7Cn0Kc3RhdGljIGludCBwdWZmX3N0b3JlZChzdHJ1Y3QgcHVmZl9zdGF0 ZSogcykKewogIHMtPmJpdGJ1ZiA9IDA7CiAgcy0+Yml0Y250ID0gMDsKICBpZiAocy0+aW5j bnQgKyA0ID4gcy0+aW5sZW4pCiAgICByZXR1cm4gMjsKICB1bnNpZ25lZCBsZW4gPSBzLT5p bltzLT5pbmNudCsrXTsKICBsZW4gfD0gcy0+aW5bcy0+aW5jbnQrK10gPDwgODsKICBpZiAo cy0+aW5bcy0+aW5jbnQrK10gIT0gKH5sZW4gJiAweGZmKSB8fAogICAgICBzLT5pbltzLT5p bmNudCsrXSAhPSAoKH5sZW4gPj4gOCkgJiAweGZmKSkKICAgIHJldHVybiAtMjsKICBpZiAo cy0+aW5jbnQgKyBsZW4gPiBzLT5pbmxlbikKICAgIHJldHVybiAyOwogIGlmIChzLT5vdXRj bnQgKyBsZW4gPiBzLT5vdXRsZW4pCiAgICByZXR1cm4gMTsKICBmb3IgKDsgbGVuLS07IHMt Pm91dGNudCsrLCBzLT5pbmNudCsrKSB7CiAgICBpZiAocy0+aW5bcy0+aW5jbnRdKQogICAg ICBzLT5vdXRbcy0+b3V0Y250XSA9IHMtPmluW3MtPmluY250XTsKICB9CiAgcmV0dXJuIDA7 Cn0Kc3RydWN0IHB1ZmZfaHVmZm1hbiB7CiAgc2hvcnQqIGNvdW50OwogIHNob3J0KiBzeW1i b2w7Cn07CnN0YXRpYyBpbnQgcHVmZl9kZWNvZGUoc3RydWN0IHB1ZmZfc3RhdGUqIHMsIGNv bnN0IHN0cnVjdCBwdWZmX2h1ZmZtYW4qIGgpCnsKICBpbnQgZmlyc3QgPSAwOwogIGludCBp bmRleCA9IDA7CiAgaW50IGJpdGJ1ZiA9IHMtPmJpdGJ1ZjsKICBpbnQgbGVmdCA9IHMtPmJp dGNudDsKICBpbnQgY29kZSA9IGZpcnN0ID0gaW5kZXggPSAwOwogIGludCBsZW4gPSAxOwog IHNob3J0KiBuZXh0ID0gaC0+Y291bnQgKyAxOwogIHdoaWxlICgxKSB7CiAgICB3aGlsZSAo bGVmdC0tKSB7CiAgICAgIGNvZGUgfD0gYml0YnVmICYgMTsKICAgICAgYml0YnVmID4+PSAx OwogICAgICBpbnQgY291bnQgPSAqbmV4dCsrOwogICAgICBpZiAoY29kZSAtIGNvdW50IDwg Zmlyc3QpIHsKICAgICAgICBzLT5iaXRidWYgPSBiaXRidWY7CiAgICAgICAgcy0+Yml0Y250 ID0gKHMtPmJpdGNudCAtIGxlbikgJiA3OwogICAgICAgIHJldHVybiBoLT5zeW1ib2xbaW5k ZXggKyAoY29kZSAtIGZpcnN0KV07CiAgICAgIH0KICAgICAgaW5kZXggKz0gY291bnQ7CiAg ICAgIGZpcnN0ICs9IGNvdW50OwogICAgICBmaXJzdCA8PD0gMTsKICAgICAgY29kZSA8PD0g MTsKICAgICAgbGVuKys7CiAgICB9CiAgICBsZWZ0ID0gKE1BWEJJVFMgKyAxKSAtIGxlbjsK ICAgIGlmIChsZWZ0ID09IDApCiAgICAgIGJyZWFrOwogICAgaWYgKHMtPmluY250ID09IHMt PmlubGVuKQogICAgICBsb25nam1wKHMtPmVudiwgMSk7CiAgICBiaXRidWYgPSBzLT5pbltz LT5pbmNudCsrXTsKICAgIGlmIChsZWZ0ID4gOCkKICAgICAgbGVmdCA9IDg7CiAgfQogIHJl dHVybiAtMTA7Cn0Kc3RhdGljIGludCBwdWZmX2NvbnN0cnVjdChzdHJ1Y3QgcHVmZl9odWZm bWFuKiBoLCBjb25zdCBzaG9ydCogbGVuZ3RoLCBpbnQgbikKewogIGludCBsZW47CiAgZm9y IChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspCiAgICBoLT5jb3VudFtsZW5dID0g MDsKICBpbnQgc3ltYm9sOwogIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgbjsgc3ltYm9s KyspCiAgICAoaC0+Y291bnRbbGVuZ3RoW3N5bWJvbF1dKSsrOwogIGlmIChoLT5jb3VudFsw XSA9PSBuKQogICAgcmV0dXJuIDA7CiAgaW50IGxlZnQgPSAxOwogIGZvciAobGVuID0gMTsg bGVuIDw9IE1BWEJJVFM7IGxlbisrKSB7CiAgICBsZWZ0IDw8PSAxOwogICAgbGVmdCAtPSBo LT5jb3VudFtsZW5dOwogICAgaWYgKGxlZnQgPCAwKQogICAgICByZXR1cm4gbGVmdDsKICB9 CiAgc2hvcnQgb2Zmc1tNQVhCSVRTICsgMV07CiAgb2Zmc1sxXSA9IDA7CiAgZm9yIChsZW4g PSAxOyBsZW4gPCBNQVhCSVRTOyBsZW4rKykKICAgIG9mZnNbbGVuICsgMV0gPSBvZmZzW2xl bl0gKyBoLT5jb3VudFtsZW5dOwogIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgbjsgc3lt Ym9sKyspCiAgICBpZiAobGVuZ3RoW3N5bWJvbF0gIT0gMCkKICAgICAgaC0+c3ltYm9sW29m ZnNbbGVuZ3RoW3N5bWJvbF1dKytdID0gc3ltYm9sOwogIHJldHVybiBsZWZ0Owp9CnN0YXRp YyBpbnQgcHVmZl9jb2RlcyhzdHJ1Y3QgcHVmZl9zdGF0ZSogcywgY29uc3Qgc3RydWN0IHB1 ZmZfaHVmZm1hbiogbGVuY29kZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVj dCBwdWZmX2h1ZmZtYW4qIGRpc3Rjb2RlKQp7CiAgc3RhdGljIGNvbnN0IHNob3J0IGxlbnNb MjldID0gezMsICA0LCAgNSwgIDYsICAgNywgICA4LCAgIDksICAgMTAsICAxMSwgMTMsCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCAxNywgMTksIDIzLCAgMjcsICAz MSwgIDM1LCAgNDMsICA1MSwgNTksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTh9OwogIHN0YXRpYyBj b25zdCBzaG9ydCBsZXh0WzI5XSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAx LCAxLCAyLCAyLCAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAzLCAz LCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA1LCAwfTsKICBzdGF0aWMgY29uc3Qgc2hv cnQgZGlzdHNbMzBdID0gewogICAgICAxLCAgICAyLCAgICAzLCAgICA0LCAgICA1LCAgICA3 LCAgICA5LCAgICAxMywgICAgMTcsICAgIDI1LAogICAgICAzMywgICA0OSwgICA2NSwgICA5 NywgICAxMjksICAxOTMsICAyNTcsICAzODUsICAgNTEzLCAgIDc2OSwKICAgICAgMTAyNSwg MTUzNywgMjA0OSwgMzA3MywgNDA5NywgNjE0NSwgODE5MywgMTIyODksIDE2Mzg1LCAyNDU3 N307CiAgc3RhdGljIGNvbnN0IHNob3J0IGRleHRbMzBdID0gezAsIDAsIDAsICAwLCAgMSwg IDEsICAyLCAgMiwgIDMsICAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0 LCA0LCA1LCAgNSwgIDYsICA2LCAgNywgIDcsICA4LCAgOCwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgOSwgOSwgMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzfTsK ICBpbnQgc3ltYm9sOwogIGRvIHsKICAgIHN5bWJvbCA9IHB1ZmZfZGVjb2RlKHMsIGxlbmNv ZGUpOwogICAgaWYgKHN5bWJvbCA8IDApCiAgICAgIHJldHVybiBzeW1ib2w7CiAgICBpZiAo c3ltYm9sIDwgMjU2KSB7CiAgICAgIGlmIChzLT5vdXRjbnQgPT0gcy0+b3V0bGVuKQogICAg ICAgIHJldHVybiAxOwogICAgICBpZiAoc3ltYm9sKQogICAgICAgIHMtPm91dFtzLT5vdXRj bnRdID0gc3ltYm9sOwogICAgICBzLT5vdXRjbnQrKzsKICAgIH0gZWxzZSBpZiAoc3ltYm9s ID4gMjU2KSB7CiAgICAgIHN5bWJvbCAtPSAyNTc7CiAgICAgIGlmIChzeW1ib2wgPj0gMjkp CiAgICAgICAgcmV0dXJuIC0xMDsKICAgICAgaW50IGxlbiA9IGxlbnNbc3ltYm9sXSArIHB1 ZmZfYml0cyhzLCBsZXh0W3N5bWJvbF0pOwogICAgICBzeW1ib2wgPSBwdWZmX2RlY29kZShz LCBkaXN0Y29kZSk7CiAgICAgIGlmIChzeW1ib2wgPCAwKQogICAgICAgIHJldHVybiBzeW1i b2w7CiAgICAgIHVuc2lnbmVkIGRpc3QgPSBkaXN0c1tzeW1ib2xdICsgcHVmZl9iaXRzKHMs IGRleHRbc3ltYm9sXSk7CiAgICAgIGlmIChkaXN0ID4gcy0+b3V0Y250KQogICAgICAgIHJl dHVybiAtMTE7CiAgICAgIGlmIChzLT5vdXRjbnQgKyBsZW4gPiBzLT5vdXRsZW4pCiAgICAg ICAgcmV0dXJuIDE7CiAgICAgIHdoaWxlIChsZW4tLSkgewogICAgICAgIGlmIChkaXN0IDw9 IHMtPm91dGNudCAmJiBzLT5vdXRbcy0+b3V0Y250IC0gZGlzdF0pCiAgICAgICAgICBzLT5v dXRbcy0+b3V0Y250XSA9IHMtPm91dFtzLT5vdXRjbnQgLSBkaXN0XTsKICAgICAgICBzLT5v dXRjbnQrKzsKICAgICAgfQogICAgfQogIH0gd2hpbGUgKHN5bWJvbCAhPSAyNTYpOwogIHJl dHVybiAwOwp9CnN0YXRpYyBpbnQgcHVmZl9maXhlZChzdHJ1Y3QgcHVmZl9zdGF0ZSogcykK ewogIHN0YXRpYyBpbnQgdmlyZ2luID0gMTsKICBzdGF0aWMgc2hvcnQgbGVuY250W01BWEJJ VFMgKyAxXSwgbGVuc3ltW0ZJWExDT0RFU107CiAgc3RhdGljIHNob3J0IGRpc3RjbnRbTUFY QklUUyArIDFdLCBkaXN0c3ltW01BWERDT0RFU107CiAgc3RhdGljIHN0cnVjdCBwdWZmX2h1 ZmZtYW4gbGVuY29kZSwgZGlzdGNvZGU7CiAgaWYgKHZpcmdpbikgewogICAgbGVuY29kZS5j b3VudCA9IGxlbmNudDsKICAgIGxlbmNvZGUuc3ltYm9sID0gbGVuc3ltOwogICAgZGlzdGNv ZGUuY291bnQgPSBkaXN0Y250OwogICAgZGlzdGNvZGUuc3ltYm9sID0gZGlzdHN5bTsKICAg IHNob3J0IGxlbmd0aHNbRklYTENPREVTXTsKICAgIGludCBzeW1ib2w7CiAgICBmb3IgKHN5 bWJvbCA9IDA7IHN5bWJvbCA8IDE0NDsgc3ltYm9sKyspCiAgICAgIGxlbmd0aHNbc3ltYm9s XSA9IDg7CiAgICBmb3IgKDsgc3ltYm9sIDwgMjU2OyBzeW1ib2wrKykKICAgICAgbGVuZ3Ro c1tzeW1ib2xdID0gOTsKICAgIGZvciAoOyBzeW1ib2wgPCAyODA7IHN5bWJvbCsrKQogICAg ICBsZW5ndGhzW3N5bWJvbF0gPSA3OwogICAgZm9yICg7IHN5bWJvbCA8IEZJWExDT0RFUzsg c3ltYm9sKyspCiAgICAgIGxlbmd0aHNbc3ltYm9sXSA9IDg7CiAgICBwdWZmX2NvbnN0cnVj dCgmbGVuY29kZSwgbGVuZ3RocywgRklYTENPREVTKTsKICAgIGZvciAoc3ltYm9sID0gMDsg c3ltYm9sIDwgTUFYRENPREVTOyBzeW1ib2wrKykKICAgICAgbGVuZ3Roc1tzeW1ib2xdID0g NTsKICAgIHB1ZmZfY29uc3RydWN0KCZkaXN0Y29kZSwgbGVuZ3RocywgTUFYRENPREVTKTsK ICAgIHZpcmdpbiA9IDA7CiAgfQogIHJldHVybiBwdWZmX2NvZGVzKHMsICZsZW5jb2RlLCAm ZGlzdGNvZGUpOwp9CnN0YXRpYyBpbnQgcHVmZl9keW5hbWljKHN0cnVjdCBwdWZmX3N0YXRl KiBzKQp7CiAgc3RhdGljIGNvbnN0IHNob3J0IG9yZGVyWzE5XSA9IHsxNiwgMTcsIDE4LCAw LCA4LCAgNywgOSwgIDYsIDEwLCA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgMTEsIDQsICAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNX07CiAgaW50IG5sZW4gPSBwdWZm X2JpdHMocywgNSkgKyAyNTc7CiAgaW50IG5kaXN0ID0gcHVmZl9iaXRzKHMsIDUpICsgMTsK ICBpbnQgbmNvZGUgPSBwdWZmX2JpdHMocywgNCkgKyA0OwogIGlmIChubGVuID4gTUFYTENP REVTIHx8IG5kaXN0ID4gTUFYRENPREVTKQogICAgcmV0dXJuIC0zOwogIHNob3J0IGxlbmd0 aHNbTUFYQ09ERVNdOwogIGludCBpbmRleDsKICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBu Y29kZTsgaW5kZXgrKykKICAgIGxlbmd0aHNbb3JkZXJbaW5kZXhdXSA9IHB1ZmZfYml0cyhz LCAzKTsKICBmb3IgKDsgaW5kZXggPCAxOTsgaW5kZXgrKykKICAgIGxlbmd0aHNbb3JkZXJb aW5kZXhdXSA9IDA7CiAgc2hvcnQgbGVuY250W01BWEJJVFMgKyAxXSwgbGVuc3ltW01BWExD T0RFU107CiAgc3RydWN0IHB1ZmZfaHVmZm1hbiBsZW5jb2RlID0ge2xlbmNudCwgbGVuc3lt fTsKICBpbnQgZXJyID0gcHVmZl9jb25zdHJ1Y3QoJmxlbmNvZGUsIGxlbmd0aHMsIDE5KTsK ICBpZiAoZXJyICE9IDApCiAgICByZXR1cm4gLTQ7CiAgaW5kZXggPSAwOwogIHdoaWxlIChp bmRleCA8IG5sZW4gKyBuZGlzdCkgewogICAgaW50IHN5bWJvbDsKICAgIGludCBsZW47CiAg ICBzeW1ib2wgPSBwdWZmX2RlY29kZShzLCAmbGVuY29kZSk7CiAgICBpZiAoc3ltYm9sIDwg MCkKICAgICAgcmV0dXJuIHN5bWJvbDsKICAgIGlmIChzeW1ib2wgPCAxNikKICAgICAgbGVu Z3Roc1tpbmRleCsrXSA9IHN5bWJvbDsKICAgIGVsc2UgewogICAgICBsZW4gPSAwOwogICAg ICBpZiAoc3ltYm9sID09IDE2KSB7CiAgICAgICAgaWYgKGluZGV4ID09IDApCiAgICAgICAg ICByZXR1cm4gLTU7CiAgICAgICAgbGVuID0gbGVuZ3Roc1tpbmRleCAtIDFdOwogICAgICAg IHN5bWJvbCA9IDMgKyBwdWZmX2JpdHMocywgMik7CiAgICAgIH0gZWxzZSBpZiAoc3ltYm9s ID09IDE3KQogICAgICAgIHN5bWJvbCA9IDMgKyBwdWZmX2JpdHMocywgMyk7CiAgICAgIGVs c2UKICAgICAgICBzeW1ib2wgPSAxMSArIHB1ZmZfYml0cyhzLCA3KTsKICAgICAgaWYgKGlu ZGV4ICsgc3ltYm9sID4gbmxlbiArIG5kaXN0KQogICAgICAgIHJldHVybiAtNjsKICAgICAg d2hpbGUgKHN5bWJvbC0tKQogICAgICAgIGxlbmd0aHNbaW5kZXgrK10gPSBsZW47CiAgICB9 CiAgfQogIGlmIChsZW5ndGhzWzI1Nl0gPT0gMCkKICAgIHJldHVybiAtOTsKICBlcnIgPSBw dWZmX2NvbnN0cnVjdCgmbGVuY29kZSwgbGVuZ3Rocywgbmxlbik7CiAgaWYgKGVyciAmJiAo ZXJyIDwgMCB8fCBubGVuICE9IGxlbmNvZGUuY291bnRbMF0gKyBsZW5jb2RlLmNvdW50WzFd KSkKICAgIHJldHVybiAtNzsKICBzaG9ydCBkaXN0Y250W01BWEJJVFMgKyAxXSwgZGlzdHN5 bVtNQVhEQ09ERVNdOwogIHN0cnVjdCBwdWZmX2h1ZmZtYW4gZGlzdGNvZGUgPSB7ZGlzdGNu dCwgZGlzdHN5bX07CiAgZXJyID0gcHVmZl9jb25zdHJ1Y3QoJmRpc3Rjb2RlLCBsZW5ndGhz ICsgbmxlbiwgbmRpc3QpOwogIGlmIChlcnIgJiYgKGVyciA8IDAgfHwgbmRpc3QgIT0gZGlz dGNvZGUuY291bnRbMF0gKyBkaXN0Y29kZS5jb3VudFsxXSkpCiAgICByZXR1cm4gLTg7CiAg cmV0dXJuIHB1ZmZfY29kZXMocywgJmxlbmNvZGUsICZkaXN0Y29kZSk7Cn0Kc3RhdGljIGlu dCBwdWZmKHVuc2lnbmVkIGNoYXIqIGRlc3QsIHVuc2lnbmVkIGxvbmcqIGRlc3RsZW4sCiAg ICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBzb3VyY2UsIHVuc2lnbmVkIGxv bmcgc291cmNlbGVuKQp7CiAgc3RydWN0IHB1ZmZfc3RhdGUgcyA9IHsKICAgICAgLm91dCA9 IGRlc3QsCiAgICAgIC5vdXRsZW4gPSAqZGVzdGxlbiwKICAgICAgLm91dGNudCA9IDAsCiAg ICAgIC5pbiA9IHNvdXJjZSwKICAgICAgLmlubGVuID0gc291cmNlbGVuLAogICAgICAuaW5j bnQgPSAwLAogICAgICAuYml0YnVmID0gMCwKICAgICAgLmJpdGNudCA9IDAsCiAgfTsKICBp bnQgZXJyOwogIGlmIChzZXRqbXAocy5lbnYpICE9IDApCiAgICBlcnIgPSAyOwogIGVsc2Ug ewogICAgaW50IGxhc3Q7CiAgICBkbyB7CiAgICAgIGxhc3QgPSBwdWZmX2JpdHMoJnMsIDEp OwogICAgICBpbnQgdHlwZSA9IHB1ZmZfYml0cygmcywgMik7CiAgICAgIGVyciA9IHR5cGUg PT0gMCA/IHB1ZmZfc3RvcmVkKCZzKQogICAgICAgICAgICAgICAgICAgICAgOiAodHlwZSA9 PSAxID8gcHVmZl9maXhlZCgmcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICA6ICh0eXBlID09IDIgPyBwdWZmX2R5bmFtaWMoJnMpIDogLTEpKTsKICAgICAgaWYgKGVy ciAhPSAwKQogICAgICAgIGJyZWFrOwogICAgfSB3aGlsZSAoIWxhc3QpOwogIH0KICAqZGVz dGxlbiA9IHMub3V0Y250OwogIHJldHVybiBlcnI7Cn0KCi8vJSBFTkQgQ09ERSBERVJJVkVE IEZST00gcHVmZi57YyxofQoKI2RlZmluZSBaTElCX0hFQURFUl9XSURUSCAyCgpzdGF0aWMg aW50IHB1ZmZfemxpYl90b19maWxlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNvdXJjZSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHNvdXJjZWxlbiwgaW50 IGRlc3RfZmQpCnsKICBpZiAoc291cmNlbGVuIDwgWkxJQl9IRUFERVJfV0lEVEgpCiAgICBy ZXR1cm4gMDsKICBzb3VyY2UgKz0gWkxJQl9IRUFERVJfV0lEVEg7CiAgc291cmNlbGVuIC09 IFpMSUJfSEVBREVSX1dJRFRIOwogIGNvbnN0IHVuc2lnbmVkIGxvbmcgbWF4X2Rlc3RsZW4g PSAxMzIgPDwgMjA7CiAgdm9pZCogcmV0ID0gbW1hcCgwLCBtYXhfZGVzdGxlbiwgUFJPVF9X UklURSB8IFBST1RfUkVBRCwKICAgICAgICAgICAgICAgICAgIE1BUF9QUklWQVRFIHwgTUFQ X0FOT04sIC0xLCAwKTsKICBpZiAocmV0ID09IE1BUF9GQUlMRUQpCiAgICByZXR1cm4gLTE7 CiAgdW5zaWduZWQgY2hhciogZGVzdCA9ICh1bnNpZ25lZCBjaGFyKilyZXQ7CiAgdW5zaWdu ZWQgbG9uZyBkZXN0bGVuID0gbWF4X2Rlc3RsZW47CiAgaW50IGVyciA9IHB1ZmYoZGVzdCwg JmRlc3RsZW4sIHNvdXJjZSwgc291cmNlbGVuKTsKICBpZiAoZXJyKSB7CiAgICBtdW5tYXAo ZGVzdCwgbWF4X2Rlc3RsZW4pOwogICAgZXJybm8gPSAtZXJyOwogICAgcmV0dXJuIC0xOwog IH0KICBpZiAod3JpdGUoZGVzdF9mZCwgZGVzdCwgZGVzdGxlbikgIT0gKHNzaXplX3QpZGVz dGxlbikgewogICAgbXVubWFwKGRlc3QsIG1heF9kZXN0bGVuKTsKICAgIHJldHVybiAtMTsK ICB9CiAgcmV0dXJuIG11bm1hcChkZXN0LCBkZXN0bGVuKTsKfQoKc3RhdGljIGludCBzZXR1 cF9sb29wX2RldmljZSh1bnNpZ25lZCBjaGFyKiBkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9vcG5hbWUsIGlu dCogbG9vcGZkX3ApCnsKICBpbnQgZXJyID0gMCwgbG9vcGZkID0gLTE7CiAgaW50IG1lbWZk ID0gc3lzY2FsbChfX05SX21lbWZkX2NyZWF0ZSwgInN5emthbGxlciIsIDApOwogIGlmICht ZW1mZCA9PSAtMSkgewogICAgZXJyID0gZXJybm87CiAgICBnb3RvIGVycm9yOwogIH0KICBp ZiAocHVmZl96bGliX3RvX2ZpbGUoZGF0YSwgc2l6ZSwgbWVtZmQpKSB7CiAgICBlcnIgPSBl cnJubzsKICAgIGdvdG8gZXJyb3JfY2xvc2VfbWVtZmQ7CiAgfQogIGxvb3BmZCA9IG9wZW4o bG9vcG5hbWUsIE9fUkRXUik7CiAgaWYgKGxvb3BmZCA9PSAtMSkgewogICAgZXJyID0gZXJy bm87CiAgICBnb3RvIGVycm9yX2Nsb3NlX21lbWZkOwogIH0KICBpZiAoaW9jdGwobG9vcGZk LCBMT09QX1NFVF9GRCwgbWVtZmQpKSB7CiAgICBpZiAoZXJybm8gIT0gRUJVU1kpIHsKICAg ICAgZXJyID0gZXJybm87CiAgICAgIGdvdG8gZXJyb3JfY2xvc2VfbG9vcDsKICAgIH0KICAg IGlvY3RsKGxvb3BmZCwgTE9PUF9DTFJfRkQsIDApOwogICAgdXNsZWVwKDEwMDApOwogICAg aWYgKGlvY3RsKGxvb3BmZCwgTE9PUF9TRVRfRkQsIG1lbWZkKSkgewogICAgICBlcnIgPSBl cnJubzsKICAgICAgZ290byBlcnJvcl9jbG9zZV9sb29wOwogICAgfQogIH0KICBjbG9zZSht ZW1mZCk7CiAgKmxvb3BmZF9wID0gbG9vcGZkOwogIHJldHVybiAwOwoKZXJyb3JfY2xvc2Vf bG9vcDoKICBjbG9zZShsb29wZmQpOwplcnJvcl9jbG9zZV9tZW1mZDoKICBjbG9zZShtZW1m ZCk7CmVycm9yOgogIGVycm5vID0gZXJyOwogIHJldHVybiAtMTsKfQoKc3RhdGljIGxvbmcg c3l6X21vdW50X2ltYWdlKHZvbGF0aWxlIGxvbmcgZnNhcmcsIHZvbGF0aWxlIGxvbmcgZGly LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRpbGUgbG9uZyBmbGFncywgdm9s YXRpbGUgbG9uZyBvcHRzYXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRp bGUgbG9uZyBjaGFuZ2VfZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sYXRp bGUgdW5zaWduZWQgbG9uZyBzaXplLCB2b2xhdGlsZSBsb25nIGltYWdlKQp7CiAgdW5zaWdu ZWQgY2hhciogZGF0YSA9ICh1bnNpZ25lZCBjaGFyKilpbWFnZTsKICBpbnQgcmVzID0gLTEs IGVyciA9IDAsIGxvb3BmZCA9IC0xLCBuZWVkX2xvb3BfZGV2aWNlID0gISFzaXplOwogIGNo YXIqIG1vdW50X29wdHMgPSAoY2hhciopb3B0c2FyZzsKICBjaGFyKiB0YXJnZXQgPSAoY2hh ciopZGlyOwogIGNoYXIqIGZzID0gKGNoYXIqKWZzYXJnOwogIGNoYXIqIHNvdXJjZSA9IE5V TEw7CiAgY2hhciBsb29wbmFtZVs2NF07CiAgaWYgKG5lZWRfbG9vcF9kZXZpY2UpIHsKICAg IG1lbXNldChsb29wbmFtZSwgMCwgc2l6ZW9mKGxvb3BuYW1lKSk7CiAgICBzbnByaW50Zihs b29wbmFtZSwgc2l6ZW9mKGxvb3BuYW1lKSwgIi9kZXYvbG9vcCVsbHUiLCBwcm9jaWQpOwog ICAgaWYgKHNldHVwX2xvb3BfZGV2aWNlKGRhdGEsIHNpemUsIGxvb3BuYW1lLCAmbG9vcGZk KSA9PSAtMSkKICAgICAgcmV0dXJuIC0xOwogICAgc291cmNlID0gbG9vcG5hbWU7CiAgfQog IG1rZGlyKHRhcmdldCwgMDc3Nyk7CiAgY2hhciBvcHRzWzI1Nl07CiAgbWVtc2V0KG9wdHMs IDAsIHNpemVvZihvcHRzKSk7CiAgaWYgKHN0cmxlbihtb3VudF9vcHRzKSA+IChzaXplb2Yo b3B0cykgLSAzMikpIHsKICB9CiAgc3RybmNweShvcHRzLCBtb3VudF9vcHRzLCBzaXplb2Yo b3B0cykgLSAzMik7CiAgaWYgKHN0cmNtcChmcywgImlzbzk2NjAiKSA9PSAwKSB7CiAgICBm bGFncyB8PSBNU19SRE9OTFk7CiAgfSBlbHNlIGlmIChzdHJuY21wKGZzLCAiZXh0IiwgMykg PT0gMCkgewogICAgYm9vbCBoYXNfcmVtb3VudF9ybyA9IGZhbHNlOwogICAgY2hhciogcmVt b3VudF9yb19zdGFydCA9IHN0cnN0cihvcHRzLCAiZXJyb3JzPXJlbW91bnQtcm8iKTsKICAg IGlmIChyZW1vdW50X3JvX3N0YXJ0ICE9IE5VTEwpIHsKICAgICAgY2hhciBhZnRlciA9ICoo cmVtb3VudF9yb19zdGFydCArIHN0cmxlbigiZXJyb3JzPXJlbW91bnQtcm8iKSk7CiAgICAg IGNoYXIgYmVmb3JlID0gcmVtb3VudF9yb19zdGFydCA9PSBvcHRzID8gJ1wwJyA6ICoocmVt b3VudF9yb19zdGFydCAtIDEpOwogICAgICBoYXNfcmVtb3VudF9ybyA9ICgoYmVmb3JlID09 ICdcMCcgfHwgYmVmb3JlID09ICcsJykgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKGFm dGVyID09ICdcMCcgfHwgYWZ0ZXIgPT0gJywnKSk7CiAgICB9CiAgICBpZiAoc3Ryc3RyKG9w dHMsICJlcnJvcnM9cGFuaWMiKSB8fCAhaGFzX3JlbW91bnRfcm8pCiAgICAgIHN0cmNhdChv cHRzLCAiLGVycm9ycz1jb250aW51ZSIpOwogIH0gZWxzZSBpZiAoc3RyY21wKGZzLCAieGZz IikgPT0gMCkgewogICAgc3RyY2F0KG9wdHMsICIsbm91dWlkIik7CiAgfQogIHJlcyA9IG1v dW50KHNvdXJjZSwgdGFyZ2V0LCBmcywgZmxhZ3MsIG9wdHMpOwogIGlmIChyZXMgPT0gLTEp IHsKICAgIGVyciA9IGVycm5vOwogICAgZ290byBlcnJvcl9jbGVhcl9sb29wOwogIH0KICBy ZXMgPSBvcGVuKHRhcmdldCwgT19SRE9OTFkgfCBPX0RJUkVDVE9SWSk7CiAgaWYgKHJlcyA9 PSAtMSkgewogICAgZXJyID0gZXJybm87CiAgICBnb3RvIGVycm9yX2NsZWFyX2xvb3A7CiAg fQogIGlmIChjaGFuZ2VfZGlyKSB7CiAgICByZXMgPSBjaGRpcih0YXJnZXQpOwogICAgaWYg KHJlcyA9PSAtMSkgewogICAgICBlcnIgPSBlcnJubzsKICAgIH0KICB9CgplcnJvcl9jbGVh cl9sb29wOgogIGlmIChuZWVkX2xvb3BfZGV2aWNlKSB7CiAgICBpb2N0bChsb29wZmQsIExP T1BfQ0xSX0ZELCAwKTsKICAgIGNsb3NlKGxvb3BmZCk7CiAgfQogIGVycm5vID0gZXJyOwog IHJldHVybiByZXM7Cn0KCnN0YXRpYyB2b2lkIGtpbGxfYW5kX3dhaXQoaW50IHBpZCwgaW50 KiBzdGF0dXMpCnsKICBraWxsKC1waWQsIFNJR0tJTEwpOwogIGtpbGwocGlkLCBTSUdLSUxM KTsKICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CiAgICBpZiAod2FpdHBpZCgt MSwgc3RhdHVzLCBXTk9IQU5HIHwgX19XQUxMKSA9PSBwaWQpCiAgICAgIHJldHVybjsKICAg IHVzbGVlcCgxMDAwKTsKICB9CiAgRElSKiBkaXIgPSBvcGVuZGlyKCIvc3lzL2ZzL2Z1c2Uv Y29ubmVjdGlvbnMiKTsKICBpZiAoZGlyKSB7CiAgICBmb3IgKDs7KSB7CiAgICAgIHN0cnVj dCBkaXJlbnQqIGVudCA9IHJlYWRkaXIoZGlyKTsKICAgICAgaWYgKCFlbnQpCiAgICAgICAg YnJlYWs7CiAgICAgIGlmIChzdHJjbXAoZW50LT5kX25hbWUsICIuIikgPT0gMCB8fCBzdHJj bXAoZW50LT5kX25hbWUsICIuLiIpID09IDApCiAgICAgICAgY29udGludWU7CiAgICAgIGNo YXIgYWJvcnRbMzAwXTsKICAgICAgc25wcmludGYoYWJvcnQsIHNpemVvZihhYm9ydCksICIv c3lzL2ZzL2Z1c2UvY29ubmVjdGlvbnMvJXMvYWJvcnQiLAogICAgICAgICAgICAgICBlbnQt PmRfbmFtZSk7CiAgICAgIGludCBmZCA9IG9wZW4oYWJvcnQsIE9fV1JPTkxZKTsKICAgICAg aWYgKGZkID09IC0xKSB7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKHdy aXRlKGZkLCBhYm9ydCwgMSkgPCAwKSB7CiAgICAgIH0KICAgICAgY2xvc2UoZmQpOwogICAg fQogICAgY2xvc2VkaXIoZGlyKTsKICB9IGVsc2UgewogIH0KICB3aGlsZSAod2FpdHBpZCgt MSwgc3RhdHVzLCBfX1dBTEwpICE9IHBpZCkgewogIH0KfQoKc3RhdGljIHZvaWQgcmVzZXRf bG9vcCgpCnsKICBjaGFyIGJ1Zls2NF07CiAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwg Ii9kZXYvbG9vcCVsbHUiLCBwcm9jaWQpOwogIGludCBsb29wZmQgPSBvcGVuKGJ1ZiwgT19S RFdSKTsKICBpZiAobG9vcGZkICE9IC0xKSB7CiAgICBpb2N0bChsb29wZmQsIExPT1BfQ0xS X0ZELCAwKTsKICAgIGNsb3NlKGxvb3BmZCk7CiAgfQp9CgpzdGF0aWMgdm9pZCBzZXR1cF90 ZXN0KCkKewogIHByY3RsKFBSX1NFVF9QREVBVEhTSUcsIFNJR0tJTEwsIDAsIDAsIDApOwog IHNldHBncnAoKTsKICB3cml0ZV9maWxlKCIvcHJvYy9zZWxmL29vbV9zY29yZV9hZGoiLCAi MTAwMCIpOwp9CgpzdGF0aWMgdm9pZCBleGVjdXRlX29uZSh2b2lkKTsKCiNkZWZpbmUgV0FJ VF9GTEFHUyBfX1dBTEwKCnN0YXRpYyB2b2lkIGxvb3Aodm9pZCkKewogIGludCBpdGVyID0g MDsKICBmb3IgKDs7IGl0ZXIrKykgewogICAgcmVzZXRfbG9vcCgpOwogICAgaW50IHBpZCA9 IGZvcmsoKTsKICAgIGlmIChwaWQgPCAwKQogICAgICBleGl0KDEpOwogICAgaWYgKHBpZCA9 PSAwKSB7CiAgICAgIHNldHVwX3Rlc3QoKTsKICAgICAgZXhlY3V0ZV9vbmUoKTsKICAgICAg ZXhpdCgwKTsKICAgIH0KICAgIGludCBzdGF0dXMgPSAwOwogICAgdWludDY0X3Qgc3RhcnQg PSBjdXJyZW50X3RpbWVfbXMoKTsKICAgIGZvciAoOzspIHsKICAgICAgaWYgKHdhaXRwaWQo LTEsICZzdGF0dXMsIFdOT0hBTkcgfCBXQUlUX0ZMQUdTKSA9PSBwaWQpCiAgICAgICAgYnJl YWs7CiAgICAgIHNsZWVwX21zKDEpOwogICAgICBpZiAoY3VycmVudF90aW1lX21zKCkgLSBz dGFydCA8IDUwMDApCiAgICAgICAgY29udGludWU7CiAgICAgIGtpbGxfYW5kX3dhaXQocGlk LCAmc3RhdHVzKTsKICAgICAgYnJlYWs7CiAgICB9CiAgfQp9Cgp1aW50NjRfdCByWzNdID0g ezB4ZmZmZmZmZmZmZmZmZmZmZiwgMHhmZmZmZmZmZmZmZmZmZmZmLCAweGZmZmZmZmZmZmZm ZmZmZmZ9OwoKdm9pZCBleGVjdXRlX29uZSh2b2lkKQp7CiAgaW50cHRyX3QgcmVzID0gMDsK ICByZXMgPSBzeXNjYWxsKF9fTlJfcGlwZTIsIDB4MjAwMDAxMDB1bCwgMHVsKTsKICBpZiAo cmVzICE9IC0xKSB7CiAgICBOT05GQUlMSU5HKHJbMF0gPSAqKHVpbnQzMl90KikweDIwMDAw MTAwKTsKICAgIE5PTkZBSUxJTkcoclsxXSA9ICoodWludDMyX3QqKTB4MjAwMDAxMDQpOwog IH0KICBOT05GQUlMSU5HKG1lbWNweSgodm9pZCopMHgyMDAwMjA4MCwgIi4vZmlsZTBcMDAw IiwgOCkpOwogIE5PTkZBSUxJTkcoc3l6X21vdW50X2ltYWdlKDAsIDB4MjAwMDIwODAsIDAs IDAsIDAsIDAsIDApKTsKICBOT05GQUlMSU5HKG1lbWNweSgodm9pZCopMHgyMDAwMDBjMCwK ICAgICAgICAgICAgICAgICAgICAiXHgxNVx4MDZceDAwXHgwMFx4NjVceGZmXHhmZlx4MDBc eDAwXHgwMFx4MDBceDA4XHgwMFx4MzkiCiAgICAgICAgICAgICAgICAgICAgIlx4NTBceDMy XHgzMFx4MzBceDMwXHgyZVx4NzUiLAogICAgICAgICAgICAgICAgICAgIDIxKSk7CiAgc3lz Y2FsbChfX05SX3dyaXRlLCByWzFdLCAweDIwMDAwMGMwdWwsIDB4MTV1bCk7CiAgTk9ORkFJ TElORygqKHVpbnQzMl90KikweDIwMDAwMWM0ID0gMCk7CiAgTk9ORkFJTElORygqKHVpbnQz Ml90KikweDIwMDAwMWM4ID0gMHgxMCk7CiAgTk9ORkFJTElORygqKHVpbnQzMl90KikweDIw MDAwMWNjID0gMCk7CiAgTk9ORkFJTElORygqKHVpbnQzMl90KikweDIwMDAwMWQwID0gMCk7 CiAgTk9ORkFJTElORygqKHVpbnQzMl90KikweDIwMDAwMWQ4ID0gLTEpOwogIE5PTkZBSUxJ TkcobWVtc2V0KCh2b2lkKikweDIwMDAwMWRjLCAwLCAxMikpOwogIHJlcyA9IHN5c2NhbGwo X19OUl9pb191cmluZ19zZXR1cCwgMHg1ZWM5LCAweDIwMDAwMWMwdWwpOwogIGlmIChyZXMg IT0gLTEpCiAgICByWzJdID0gcmVzOwogIHN5c2NhbGwoX19OUl9jbG9zZSwgclsyXSk7CiAg Tk9ORkFJTElORyhtZW1jcHkoKHZvaWQqKTB4MjAwMDAwODAsICIuL2ZpbGUwXDAwMCIsIDgp KTsKICBOT05GQUlMSU5HKG1lbWNweSgodm9pZCopMHgyMDAwMDA0MCwgIjlwXDAwMCIsIDMp KTsKICBOT05GQUlMSU5HKG1lbWNweSgodm9pZCopMHgyMDAwMDE0MCwgInRyYW5zPWZkLHJm ZG5vPSIsIDE1KSk7CiAgTk9ORkFJTElORyhzcHJpbnRmKChjaGFyKikweDIwMDAwMTRmLCAi MHglMDE2bGx4IiwgKGxvbmcgbG9uZylyWzBdKSk7CiAgTk9ORkFJTElORyhtZW1jcHkoKHZv aWQqKTB4MjAwMDAxNjEsICIsd2Zkbm89IiwgNykpOwogIE5PTkZBSUxJTkcoc3ByaW50Zigo Y2hhciopMHgyMDAwMDE2OCwgIjB4JTAxNmxseCIsIChsb25nIGxvbmcpclsxXSkpOwogIHN5 c2NhbGwoX19OUl9tb3VudCwgMHVsLCAweDIwMDAwMDgwdWwsIDB4MjAwMDAwNDB1bCwgMHVs LCAweDIwMDAwMTQwdWwpOwp9CmludCBtYWluKHZvaWQpCnsKICBzeXNjYWxsKF9fTlJfbW1h cCwgMHgxZmZmZjAwMHVsLCAweDEwMDB1bCwgMHVsLCAweDMydWwsIC0xLCAwdWwpOwogIHN5 c2NhbGwoX19OUl9tbWFwLCAweDIwMDAwMDAwdWwsIDB4MTAwMDAwMHVsLCA3dWwsIDB4MzJ1 bCwgLTEsIDB1bCk7CiAgc3lzY2FsbChfX05SX21tYXAsIDB4MjEwMDAwMDB1bCwgMHgxMDAw dWwsIDB1bCwgMHgzMnVsLCAtMSwgMHVsKTsKICBpbnN0YWxsX3NlZ3ZfaGFuZGxlcigpOwog IGxvb3AoKTsKICByZXR1cm4gMDsKfQo= --------------MJeJrJqaUhxaK0Kg26S0GBCO--