From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from outgoing2021.csail.mit.edu (outgoing2021.csail.mit.edu [128.30.2.78]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 62AA113957E for ; Sun, 7 Sep 2025 17:56:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=128.30.2.78 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757267779; cv=none; b=Qkod44qvFywOff2utFqsbqPZms68h5UBLDbDyB+NyJ8Z4dDJwVhu8DoSuTdHQ6QlGYovM3L4UVP/YUfsBTLnAcsWW3UuDVUBaaYLJzHfNzGjcwg7opJUcgZf8HX/d7LDJFnbEgt4wliCowWoGXxSd0g+vhojCflTHOK4E09xVcE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757267779; c=relaxed/simple; bh=1Bv56PIZaxhfFBKKFgXiY91Gs4HdIe41Fgk8yOckVb8=; h=To:cc:From:Subject:MIME-Version:Content-Type:Date:Message-ID; b=TtXGut9lT/ioB182EMRuPaCbnmmKCHx/fOdt1v01knFc4J2iQ7pCromurnYnYrCpj4oROiB3WeigGeD682Excy1Y9SnUuNXCFM+Mx8u2I4Nfg3zTX/c6WpkpPH6GwvNoXdZXICGQhNdCPCvBzxuY2lFMxV7ugGzf8fgMww7Xr4E= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=csail.mit.edu; spf=pass smtp.mailfrom=csail.mit.edu; dkim=pass (2048-bit key) header.d=outgoing.csail.mit.edu header.i=@outgoing.csail.mit.edu header.b=PaNWIbXC; arc=none smtp.client-ip=128.30.2.78 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=csail.mit.edu Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=csail.mit.edu Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=outgoing.csail.mit.edu header.i=@outgoing.csail.mit.edu header.b="PaNWIbXC" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=outgoing.csail.mit.edu; s=test20231205; h=Message-ID:Date:Content-Type: MIME-Version:Subject:Reply-To:From:cc:To:Sender:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=Xw0tjlT/UBUx6vy2Sqfvs/dRUaKux5j/0xE1M6Rvv3E=; t=1757267777; x=1758131777; b=PaNWIbXCzBKSKz6HAnTfnLf0hulc5n3QuStngHs/H9JIm6Q3NettIYpQBL60c1cvXuNfDJ9GUxF +JscHCrEf8daAsPnARgWxIBSuzqVfGyEA8feFF1qLhP0TKnxmw6UiUrFcVho4g7hQtlaLAt+eBHOd Av/E5QayKMNdNg/979QFG/Kvy+f/JfPkp87Edmx8sw/dr58ampxj3f7hqfD9jzz5IIapAcs0pA8dR rkVVzV0p77SG9NQAwAl2uxoh/yDpq2XrKmNwI+srsfa2M73c593Ss4ZRO6EMWWWPAGNjuSNDX5sR9 MIdOdMSPzHDfo5T306/Jsbj0si5cIodPUP0w==; Received: from [24.147.175.133] (helo=crash.local) by outgoing2021.csail.mit.edu with esmtpsa (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1uvJcV-001jUP-EB; Sun, 07 Sep 2025 13:56:07 -0400 Received: from localhost (localhost [127.0.0.1]) by crash.local (Postfix) with ESMTP id 90C542877A25; Sun, 07 Sep 2025 13:56:06 -0400 (EDT) To: Trond Myklebust , Anna Schumaker cc: linux-nfs@vger.kernel.org From: rtm@csail.mit.edu Reply-To: rtm@csail.mit.edu Subject: _nfs4_open_and_get_state() should check d_splice_alias() return for error Precedence: bulk X-Mailing-List: linux-nfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Date: Sun, 07 Sep 2025 13:56:06 -0400 Message-ID: <23296.1757267766@localhost> --=-=-= Content-Type: text/plain In this code in fs/nfs/nfs4proc.c _nfs_open_and_get_state(): dentry = opendata->dentry; if (d_really_is_negative(dentry)) { struct dentry *alias; d_drop(dentry); alias = d_splice_alias(igrab(state->inode), dentry); /* d_splice_alias() can't fail here - it's a non-directory */ if (alias) { dput(ctx->dentry); ctx->dentry = dentry = alias; } d_splice_alias() can fail, returning ERR_PTR(-ELOOP). Then this call later on causes a crash: nfs_set_verifier(dentry, dir_verifier); I've attached a demo program: # uname -a Linux xxx 6.17.0-rc4-00231-gc8ed9b5c02a5 #27 SMP PREEMPT_DYNAMIC Fri Sep 5 15:07:50 EDT 2025 x86_64 x86_64 x86_64 GNU/Linux # cc nfs166c.c # ./a.out ... BUG: kernel NULL pointer dereference, address: 0000000000000058 Here's a gdb backtrace: #0 nfs_set_verifier (dentry=dentry@entry=0xffffffffffffffd8, verf=verf@entry=0) at ./include/linux/spinlock.h:351 #1 0xffffffff8043a6c2 in _nfs4_open_and_get_state (ctx=0xffffffd602f93c00, opendata=0xffffffd60558a000) at fs/nfs/nfs4proc.c:3197 #2 _nfs4_do_open (dir=0xffffffd60288c7e0, opened=0xffffffc6002f3b4c, c=0xffffffc6002f3a30, flags=32768, ctx=0xffffffd602f93c00) at fs/nfs/nfs4proc.c:3274 #3 nfs4_do_open (dir=dir@entry=0xffffffd60288c7e0, ctx=ctx@entry=0xffffffd602f93c00, flags=flags@entry=32768, sattr=sattr@entry=0xffffffc6002f3b78, label=label@entry=0x0, opened=opened@entry=0xffffffc6002f3b4c) at fs/nfs/nfs4proc.c:3345 #4 0xffffffff8043aa92 in nfs4_atomic_open (dir=0xffffffd60288c7e0, ctx=0xffffffd602f93c00, open_flags=32768, attr=0xffffffc6002f3b78, opened=0xffffffc6002f3b4c) at fs/nfs/nfs4proc.c:3919 #5 0xffffffff804056c4 in nfs_atomic_open (dir=0xffffffd60288c7e0, dentry=0xffffffd6029af9c8, file=0xffffffd604734040, open_flags=32768, mode=) at fs/nfs/dir.c:2138 #6 0xffffffff802c2a8a in atomic_open (mode=0, open_flag=, file=0xffffffd604734040, dentry=0xffffffd6029af9c8, nd=0xffffffc6002f3cf8) at fs/namei.c:3528 #7 lookup_open (op=0xffffffc6002f3e30, got_write=false, file=0xffffffd604734040, nd=0xffffffc6002f3cf8) at fs/namei.c:3687 #8 open_last_lookups (op=0xffffffc6002f3e30, file=0xffffffd604734040, nd=0xffffffc6002f3cf8) at fs/namei.c:3815 #9 path_openat (nd=nd@entry=0xffffffc6002f3cf8, op=op@entry=0xffffffc6002f3e30, flags=flags@entry=257) at fs/namei.c:4051 #10 0xffffffff802c3098 in do_filp_open (dfd=dfd@entry=-100, pathname=pathname@entry=0xffffffd6027f1100, op=op@entry=0xffffffc6002f3e30) at fs/namei.c:4081 #11 0xffffffff802ae234 in do_sys_openat2 (dfd=-100, filename=, how=how@entry=0xffffffc6002f3e90) at fs/open.c:1435 #12 0xffffffff802ae5a2 in do_sys_open (mode=, flags=, filename=, dfd=) at fs/open.c:1450 #13 __do_sys_openat (mode=, flags=, filename=, dfd=) at fs/open.c:1466 #14 __se_sys_openat (mode=, flags=, filename=, dfd=) at fs/open.c:1461 #15 __riscv_sys_openat (regs=) at fs/open.c:1461 #16 0xffffffff812197ee in syscall_handler (syscall=, regs=0xffffffc6002f3ee0) at ./arch/riscv/include/asm/syscall.h:112 #17 do_trap_ecall_u (regs=0xffffffc6002f3ee0) at arch/riscv/kernel/traps.c:343 Robert Morris rtm@mit.edu --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=nfs166c.c Content-Transfer-Encoding: base64 I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5o PgojZGVmaW5lIF9HTlVfU09VUkNFCiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN5cy9z b2NrZXQuaD4KI2luY2x1ZGUgPHN5cy9maWxlLmg+CiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2lu Y2x1ZGUgPG5ldGluZXQvaW4uaD4KI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiNpbmNsdWRlIDxzeXMv cmVzb3VyY2UuaD4KI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8c3lzL21vdW50Lmg+ CiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxz eXMvdmZzLmg+CiNpbmNsdWRlIDxkaXJlbnQuaD4KI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVk ZSA8ZmNudGwuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzeXMveGF0dHIuaD4KCi8v IHJldHVybiBhbiBlcnJvciByYXRoZXIgdGhhbiBPSyBmb3IgdGhlIGZpcnN0Ci8vIEdFVEFUVFIg YWZ0ZXIgdGhlIGZpcnN0IG9wZW4uCmludCBkb2l0ID0gMDsKaW50IHN5bV9vcCA9IDE4OwppbnQg c3ltX3NraXAgPSAwOwoKaW50IG9wY291bnRzWzI1Nl07CmxvbmcgbG9uZyBuZXh0X2Nvb2tpZSA9 IDM7CmludCBjdXJyZW50X2ZoID0gMDsKaW50IGNvbXBvdW5kX3N0YXR1czsKaW50IHNlbmRfYmFj azsKCi8vIG1hcCBmaWxlL2RpciBuYW1lcyB0byBmaWxlIGhhbmRsZQpjaGFyICpmaG5hbWVzWzEw MF0gPSB7CiAgICAgICAgICAgICAgICIiLAogICAgICAgICAgICAgICAidG1wIiwKICAgICAgICAg ICAgICAgIngiLAogICAgICAgICAgICAgICAieSIsCiAgICAgICAgICAgICAgICJ6IiwKICAgICAg ICAgICAgICAgInp6eiIsCiAgICAgICAgICAgICAgIDAKfTsKCmludApuYW1lMmZoKGNoYXIgKm5h bWUsIGludCBjcmVhdGUpCnsKICBmb3IoaW50IGkgPSAwOyBmaG5hbWVzW2ldOyBpKyspewogICAg aWYoc3RyY21wKG5hbWUsIGZobmFtZXNbaV0pID09IDApCiAgICAgIHJldHVybiBpOwogIH0KICBp ZihjcmVhdGUpewogICAgZm9yKGludCBpID0gMDsgOyBpKyspewogICAgICBpZihmaG5hbWVzW2ld ID09IDApewogICAgICAgIGZobmFtZXNbaV0gPSBtYWxsb2MoMTAwKTsKICAgICAgICBzdHJjcHko ZmhuYW1lc1tpXSwgbmFtZSk7CiAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0KICAgIH0KICB9CiAg cmV0dXJuIC0xOwp9CgpjaGFyIGlidWZbMTYqMTAyNF07CmludCBpbGVuID0gMDsKaW50IGlpID0g MDsKY2hhciBvYnVmWzE2KjEwMjRdOwppbnQgb2kgPSAwOwoKZXh0ZXJuIHNzaXplX3QgY29weV9m aWxlX3JhbmdlKGludCwgb2ZmX3QqLCBpbnQsIG9mZl90Kiwgc2l6ZV90LCB1bnNpZ25lZCBpbnQp OwoKaW50IHJlYWRuKGludCBmZCwgdm9pZCAqeGJ1ZiwgaW50IG4pIHsKICBjaGFyICpidWYgPSAo Y2hhciAqKSB4YnVmOwogIGludCBvcmlnID0gbjsKICB3aGlsZShuID4gMCl7CiAgICBpbnQgY2Mg PSByZWFkKGZkLCBidWYsIG4pOwogICAgaWYoY2MgPD0gMCkgeyBwZXJyb3IoInJlYWQiKTsgcmV0 dXJuIC0xOyB9CiAgICBuIC09IGNjOwogICAgYnVmICs9IGNjOwogIH0KICByZXR1cm4gb3JpZzsK fQoKdW5zaWduZWQgaW50CnBhcnNlMzIoKQp7CiAgaWYoaWkgPj0gaWxlbil7CiAgICBwcmludGYo InBhcnNlZCBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgaW5wdXRcbiIpOwogICAgcmV0dXJuIDB4ZmZm ZmZmZmY7CiAgfQogIHVuc2lnbmVkIGludCB4ID0gKihpbnQqKShpYnVmK2lpKTsKICBpaSArPSA0 OwogIHJldHVybiBudG9obCh4KTsKfQoKdW5zaWduZWQgbG9uZyBsb25nCnBhcnNlNjQoKQp7CiAg dW5zaWduZWQgbG9uZyBsb25nIGhpID0gcGFyc2UzMigpOwogIHVuc2lnbmVkIGxvbmcgbG9uZyBs byA9IHBhcnNlMzIoKTsKICByZXR1cm4gKGhpIDw8IDMyKSB8IGxvOwp9CgovLyBzZXNzaW9uaWQ0 IC0tIDE2IGJ5dGVzCnZvaWQKcGFyc2Vfc2lkKGNoYXIgKnNpZCkKewogIGZvcihpbnQgaSA9IDA7 IGkgPCAxNjsgaSsrKXsKICAgIGlmKHNpZCkKICAgICAgc2lkW2ldID0gaWJ1ZltpaV07CiAgICBp aSsrOwogIH0KfQoKdW5zaWduZWQgaW50CnBhcnNlX29wYXF1ZShjaGFyICpidWYpCnsKICBpZihi dWYpCiAgICBidWZbMF0gPSAwOwogIGludCBub21pbmFsX24gPSBwYXJzZTMyKCk7CiAgaWYobm9t aW5hbF9uID4gNDA5Nil7CiAgICBwcmludGYoImNyYXp5IG9wYXF1ZSBsZW5ndGggJWRcbiIsIG5v bWluYWxfbik7CiAgICByZXR1cm4gMDsKICB9CiAgaW50IHJlYWxfbiA9IG5vbWluYWxfbjsKICB3 aGlsZSgocmVhbF9uJTQpICE9IDApIHJlYWxfbiArPSAxOwogIGZvcihpbnQgaSA9IDA7IGkgPCBy ZWFsX247IGkrKyl7CiAgICBpZihidWYgJiYgaSA8IHJlYWxfbikKICAgICAgYnVmW2ldID0gaWJ1 ZltpaV07CiAgICBpaSsrOwogIH0KICByZXR1cm4gbm9taW5hbF9uOwp9Cgp2b2lkCnB1dDMyKHVu c2lnbmVkIGludCB4KQp7CiAgYXNzZXJ0KChvaSAlIDQpID09IDApOwogICooaW50Kikob2J1Zitv aSkgPSBodG9ubCh4KTsKICBvaSArPSA0Owp9Cgp2b2lkCnB1dDY0KHVuc2lnbmVkIGxvbmcgbG9u ZyB4KQp7CiAgcHV0MzIoeCA+PiAzMik7CiAgcHV0MzIoeCk7Cn0KCnZvaWQKcHV0X29wYXF1ZShp bnQgbiwgY2hhciAqYnVmKQp7CiAgaW50IG5uID0gbjsKICBwdXQzMihubik7CiAgZm9yKGludCBp ID0gMDsgaSA8IG47IGkrKykKICAgIG9idWZbb2krK10gPSAoYnVmID8gYnVmW2ldIDogMCk7CiAg d2hpbGUobiAmIDMpewogICAgb2J1ZltvaSsrXSA9IDA7CiAgICBuKys7CiAgfQp9Cgp2b2lkCnB1 dF9zaWQoY2hhciAqc2lkKQp7CiAgZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspewogICAgb2J1 ZltvaSsrXSA9IChzaWQgPyBzaWRbaV0gOiAwKTsKICB9Cn0KCnZvaWQKcGFyc2Vfbm9wKCkKewp9 Cgp2b2lkCnBhcnNlX29wX2V4Y2hhbmdlX2lkKCkKewogIHBhcnNlMzIoKTsgLy8gdmVyaWZpZXI0 LCBmaXJzdCBoYWxmCiAgcGFyc2UzMigpOyAvLyB2ZXJpZmllcjQsIHNlY29uZCBoYWxmCiAgcGFy c2Vfb3BhcXVlKDApOyAvLyBlaWFfY2xpZW50b3duZXIKICBpbnQgY2ZsYWdzID0gcGFyc2UzMigp OyAvLyBlaWFfZmxhZ3MKICBwcmludGYoImNmbGFncyAweCV4XG4iLCBjZmxhZ3MpOwogIHBhcnNl MzIoKTsgLy8gc3RhdGVfcHJvdGVjdDRfYS5zcGFfaG93LCBhc3N1bWUgU1A0X05PTkUKICBpbnQg bmltcGwgPSBwYXJzZTMyKCk7IC8vIGxlbmd0aCBvZiBjbGllbnRfaW1wbF9pZAogIGZvcihpbnQg aW1wbGkgPSAwOyBpbXBsaSA8IG5pbXBsOyBpbXBsaSsrKXsKICAgIGNoYXIganVua1s1MTJdOwog ICAgcGFyc2Vfb3BhcXVlKGp1bmspOyAvLyBuaWlfZG9tYWluCiAgICAvLyBwcmludGYoIm5paV9k b21haW46ICVzXG4iLCBqdW5rKTsKICAgIHBhcnNlX29wYXF1ZShqdW5rKTsgLy8gbmlpX25hbWUK ICAgIC8vIHByaW50ZigibmlpX25hbWU6ICVzXG4iLCBqdW5rKTsKICAgIHBhcnNlNjQoKTsgLy8g MS8yIG9mIG5mc3RpbWU0CiAgICBwYXJzZTMyKCk7IC8vIDEvMiBvZiBuZnN0aW1lNAogIH0KCiAg Ly8gZmluaXNoIEVYQ0hBTkdFX0lENHJlcwogIHB1dDMyKDApOyAvLyBlaXJfc3RhdHVzID0gTkZT NF9PSwogIHB1dDY0KDEpOyAvLyBjbGllbnRpZDQKICBwdXQzMigxKTsgLy8gc2VxdWVuY2VpZDQK ICAvL2ludCBzZmxhZ3MgPSAweDEwMyB8IDB4MTAwMDA7IC8vIEVYQ0hHSUQ0X0ZMQUdfVVNFX05P Tl9QTkZTCiAgaW50IHNmbGFncyA9IDB4MTAzIHwgMHgyMDAwMCB8IDB4NDAwMDAgfCAweDgwMDAw MDAwOyAvLyB0cnkgdG8gZW5hYmxlIHBORlMKICBwdXQzMihzZmxhZ3MpOyAvLyBlaXJfZmxhZ3MK ICBwdXQzMigwKTsgLy8gc3RhdGVfcHJvdGVjdDRfci5zcHJfaG93ID0gU1A0X05PTkUKICBwdXQ2 NCgxKTsgLy8gc2VydmVyX293bmVyNC5zb19taW5vcl9pZAogIHB1dDMyKDQpOyAvLyBsZW5ndGgg b2Ygc29fbWFqb3JfaWQ8PgogIHB1dDMyKDB4MTEyMjMzNDQpOyAvLyBzb19tYWpvcl9pZDw+CiAg cHV0MzIoNCk7IC8vIGxlbmd0aCBvZiBlaXJfc2VydmVyX3Njb3BlCiAgcHV0MzIoMHgxMTIyMzM0 NCk7CiAgcHV0MzIoMSk7IC8vIGxlbmd0aCBvZiBlaXJfc2VydmVyX2ltcGxfaWQ8MT4KICBwdXQz Mig0KTsgLy8gbmZzX2ltcGxfaWQ0Lm5paV9kb21haW4KICBwdXQzMigweDExMjIzMzQ0KTsKICBw dXQzMig0KTsgLy8gbmZzX2ltcGxfaWQ0Lm5paV9uYW1lCiAgcHV0MzIoMHgxMTIyMzM0NCk7CiAg cHV0NjQoMCk7IC8vIG5paV9kYXRlIDEvMgogIHB1dDMyKDApOyAvLyBuaWlfZGF0ZSAyLzIKfQoK dm9pZApwYXJzZV9vcF9jcmVhdGVfc2Vzc2lvbigpCnsKICBwYXJzZTY0KCk7IC8vIGNzYV9jbGll bnRpZAogIGludCBzZXEgPSBwYXJzZTMyKCk7IC8vIGNzYV9zZXF1ZW5jZQogIHBhcnNlMzIoKTsg Ly8gY3NhX2ZsYWdzCiAgLy8gY3NhX2ZvcmVfY2hhbl9hdHRycywgY3NhX2JhY2tfY2hhbl9hdHRy cwogIGludCBhdHRyc1syXVs2XTsKICBmb3IoaW50IGkgPSAwOyBpIDwgMjsgaSsrKXsKICAgIGZv cihpbnQgaiA9IDA7IGogPCA2OyBqKyspewogICAgICBhdHRyc1tpXVtqXSA9IHBhcnNlMzIoKTsK ICAgIH0KICAgIHBhcnNlX29wYXF1ZSgwKTsgLy8gY2FfcmRtYV9pcmQ8MT4KICB9CiAgLy8gWFhY CiAgaWkgPSBpbGVuOwoKICBwdXQzMigwKTsgLy8gT0sKICBmb3IoaW50IGkgPSAwOyBpIDwgNDsg aSsrKQogICAgcHV0MzIoMSk7IC8vIGNzcl9zZXNzaW9uaWQgaS80CiAgcHV0MzIoc2VxKTsgLy8g Y3NyX3NlcXVlbmNlCiAgcHV0MzIoMHgzKTsgLy8gY3NyX2ZsYWdzCgogIGZvcihpbnQgaSA9IDA7 IGkgPCAyOyBpKyspewogICAgZm9yKGludCBqID0gMDsgaiA8IDY7IGorKykKICAgICAgcHV0MzIo YXR0cnNbaV1bal0pOwogICAgcHV0MzIoMCk7IC8vIGNhX3JkbWFfaXJkCiAgfQp9Cgp2b2lkCnBh cnNlX29wX3NldGNsaWVudGlkKCkKewogIHBhcnNlMzIoKTsgLy8gdmVyaWZpZXI0CiAgcGFyc2Uz MigpOyAvLyB2ZXJpZmllcjQKICBwYXJzZV9vcGFxdWUoMCk7IC8vIGlkPD4KICBwYXJzZTMyKCk7 IC8vIGNiX2NsaWVudDQuY2JfcHJvZ3JhbQogIHBhcnNlX29wYXF1ZSgwKTsgLy8gY2xpZW50YWRk cjQgcl9uZXRpZAogIHBhcnNlX29wYXF1ZSgwKTsgLy8gY2xpZW50YWRkcjQgcl9hZGRyCiAgcGFy c2UzMigpOyAvLyBjYWxsYmFja19pZGVudAoKICBwdXQzMigwKTsgLy8gT0sKICBwdXQ2NCgxKTsg Ly8gY2xpZW50aWQ0CiAgcHV0NjQoMSk7IC8vIHZlcmlmaWVyNAp9Cgp2b2lkCnBhcnNlX29wX3Nl dGNsaWVudGlkX2NvbmZpcm0oKQp7CiAgcGFyc2UzMigpOyAvLyBjbGllbnRpZDQKICBwYXJzZTMy KCk7CiAgcGFyc2UzMigpOyAvLyB2ZXJpZmllcjQKICBwYXJzZTMyKCk7CgogIHB1dDMyKDApOyAv LyBPSwp9Cgp2b2lkCnBhcnNlX29wX3NlcXVlbmNlKCkKewogIGNoYXIgc2lkWzE2XTsKCiAgcGFy c2Vfc2lkKHNpZCk7IC8vIHNhX3Nlc3Npb25pZAogIGludCBzZXEgPSBwYXJzZTMyKCk7IC8vIHNh X3NlcXVlbmNlaWQKICBpbnQgc2xvdCA9IHBhcnNlMzIoKTsgLy8gc2Ffc2xvdGlkCiAgaW50IGhp c2xvdCA9IHBhcnNlMzIoKTsgLy8gc2FfaGlnaGVzdF9zbG90aWQKICBwYXJzZTMyKCk7IC8vIHNh X2NhY2hldGhpcwoKICBwdXQzMigwKTsgLy8gT0sKICBwdXRfc2lkKHNpZCk7IC8vIHNyX3Nlc3Np b25pZAogIHB1dDMyKHNlcSk7IC8vIHNyX3NlcXVlbmNlaWQKICBwdXQzMihzbG90KTsgLy8gc3Jf c2xvdGlkCiAgcHV0MzIoaGlzbG90KTsgLy8gc3JfaGlnaGVzdF9zbG90aWQKICBwdXQzMihoaXNs b3QpOyAvLyBzcl90YXJnZXRfaGlnaGVzdF9zbG90aWQKICBwdXQzMigwKTsgLy8gc3Jfc3RhdHVz X2ZsYWdzCn0KCnZvaWQKcGFyc2Vfb3BfcmVjbGFpbV9jb21wbGV0ZSgpCnsKICBwYXJzZTMyKCk7 IC8vIHJjYV9vbmVfZnMKICBwdXQzMigwKTsgLy8gcmNyX3N0YXR1cwp9Cgp2b2lkCnBhcnNlX29w X3B1dHJvb3RmaCgpCnsKICAvLyBubyBhcmd1bWVudHMKICBwdXQzMigwKTsgLy8gT0sKICBjdXJy ZW50X2ZoID0gMDsKfQoKdm9pZApwYXJzZV9vcF9zZWNpbmZvX25vX25hbWUoKQp7CiAgcGFyc2Uz MigpOyAvLyBzZWNpbmZvX3N0eWxlNAogIHB1dDMyKDApOyAvLyBPSwogIHB1dDMyKDEpOyAvLyAj IG9mIHNlY2luZm80CiNpZiAxCiAgcHV0MzIoMCk7IC8vIGZsYXZvciA9IEFVVEhfTlVMTAojZWxz ZQogIHB1dDMyKDYpOyAvLyBmbGF2b3IgPSBSUENTRUNfR1NTCiAgcHV0MzIoNCk7IC8vIHNpemUg b2Ygc2VjX29pZDQKICBwdXQzMigweGZmZmZmZmZmKTsKICBwdXQzMigwKTsgLy8gcW9wNAogIHB1 dDMyKDEpOyAvLyBycGNfZ3NzX3N2Y190CiNlbmRpZgp9Cgp2b2lkCnBhcnNlX29wX2Rlc3Ryb3lf c2Vzc2lvbigpCnsKICBwYXJzZV9zaWQoMCk7CiAgcHV0MzIoMCk7IC8vIE9LCn0KCnZvaWQKcGFy c2Vfb3BfZGVzdHJveV9jbGllbnRpZCgpCnsKICBwYXJzZTY0KCk7IC8vIGNsaWVudGlkCiAgcHV0 MzIoMCk7IC8vIE9LCn0KCnZvaWQKcGFyc2Vfb3BfZ2V0ZmgoKQp7CiAgLy8gbm8gYXJndW1lbnRz CiAgcHV0MzIoMCk7IC8vIE9LCiAgaW50IHhmaCA9IGN1cnJlbnRfZmg7CiAgcHV0X29wYXF1ZSg0 LCAoY2hhciopJnhmaCk7IC8vIGZoCn0KCi8vCi8vIGNhbGxlZCBieSBnZXRhdHRyIGFuZCByZWFk ZGlyLgovLyBnZW5lcmF0ZXMgYSBmYXR0cjQgKGJpdG1hcDQgdGhlbiBhdHRybGlzdDQpLgovLwp2 b2lkCnB1dF9mYXR0cjQoaW50IHh3b3Jkc1tdLCBpbnQgZmgpCnsKICBpbnQgd29yZHNbM107CiAg Zm9yKGludCBpID0gMDsgaSA8IDM7IGkrKyl7CiAgICB3b3Jkc1tpXSA9IHh3b3Jkc1tpXTsKICB9 CiAgaW50IGJpdHdvcmRzID0gMzsKICBwdXQzMihiaXR3b3Jkcyk7CiAgaW50IHdvcmQwaSA9IG9p OwogIGZvcihpbnQgaSA9IDA7IGkgPCBiaXR3b3JkczsgaSsrKQogICAgcHV0MzIod29yZHNbaV0p OwogIGludCBsZW5pID0gb2k7CiAgcHV0MzIoMCk7IC8vIHBsYWNlaG9sZGVyIGZvciB0b3RhbCBs ZW5ndGggb2YgYXR0cnMKICBmb3IoaW50IGEgPSAwOyBhIDwgYml0d29yZHMqMzI7IGErKyl7CiAg ICBpZih3b3Jkc1thLzMyXSAmICgxIDw8IChhICUgMzIpKSl7CiAgICAgIGlmKGEgPT0gMCl7CiAg ICAgICAgcHV0MzIoMyk7IC8vICMgYml0bWFwIHdvcmRzIG9mIHN1cHBvcnRlZCBhdHRycwogICAg ICAgIHB1dDMyKDB4ZmZmZmZmZmYpOwogICAgICAgIHB1dDMyKDB4ZmZmZmZmZmYpOwogICAgICAg IHB1dDMyKDB4ZmZmZmZmZmYpOwogICAgICB9IGVsc2UgaWYoYSA9PSAxKXsKICAgICAgICBpbnQg dHlwZSA9IDE7CiAgICAgICAgaWYoZmggPT0gMCB8fCBmaCA9PSAxKQogICAgICAgICAgdHlwZSA9 IDI7CiAgICAgICAgcHV0MzIodHlwZSk7IC8vIE5GNERJUj0yIG9yIE5GNFJFRz0xCiAgICAgIH0g ZWxzZSBpZihhID09IDIpewogICAgICAgIHB1dDMyKDApOyAvLyBmaF9leHBpcmVfdHlwZQogICAg ICB9IGVsc2UgaWYoYSA9PSAzKXsKICAgICAgICBwdXQ2NCgwKTsgLy8gY2hhbmdlCiAgICAgIH0g ZWxzZSBpZihhID09IDQpewogICAgICAgIHB1dDY0KDQwOTYqMTApOyAvLyBzaXplCiAgICAgIH0g ZWxzZSBpZihhID09IDUpewogICAgICAgIHB1dDMyKDEpOyAvLyBsaW5rIHN1cHBvcnQKICAgICAg fSBlbHNlIGlmKGEgPT0gNil7CiAgICAgICAgcHV0MzIoMSk7IC8vIHN5bWxpbmsgc3VwcG9ydAog ICAgICB9IGVsc2UgaWYoYSA9PSA4KXsKICAgICAgICBwdXQ2NCgxKTsgLy8gZnNpZCBtYWpvcgog ICAgICAgIHB1dDY0KDEpOyAvLyBmc2lkIG1pbm9yCiAgICAgIH0gZWxzZSBpZihhID09IDEwKXsK ICAgICAgICBwdXQzMigxMCk7IC8vIGxlYXNlIHRpbWUKICAgICAgfSBlbHNlIGlmKGEgPT0gMTEp ewogICAgICAgIHB1dDMyKDApOyAvLyByZGF0dHJfZXJyb3IKICAgICAgfSBlbHNlIGlmKGEgPT0g MTIpewogICAgICAgIC8vIEFDTAogICAgICAgIHByaW50ZigicmVwbHlpbmcgd2l0aCBhbiBBQ0xc biIpOwogICAgICAgIGludCBuID0gMjsKICAgICAgICBwdXQzMihuKTsKICAgICAgICBmb3IoaW50 IGkgPSAwOyBpIDwgbjsgaSsrKXsKICAgICAgICAgIHB1dDMyKDApOyAvLyB0eXBlCiAgICAgICAg ICBwdXQzMigwKTsgLy8gZmxhZwogICAgICAgICAgcHV0MzIoMCk7IC8vIG1hc2sKICAgICAgICAg IGNoYXIgd2hvWzMyXTsKICAgICAgICAgIG1lbXNldCh3aG8sIDAsIHNpemVvZih3aG8pKTsKICAg ICAgICAgIHN0cmNweSh3aG8sICJiaW5AeC5jb20iKTsKICAgICAgICAgIHB1dF9vcGFxdWUoc3Ry bGVuKHdobyksIHdobyk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYoYSA9PSAxMyl7CiAgICAg ICAgcHV0MzIoMHhmKTsgLy8gYWNsc3VwcG9ydAogICAgICB9IGVsc2UgaWYoYSA9PSAxNSl7CiAg ICAgICAgcHV0MzIoMSk7IC8vIGNhbnNldHRpbWUKICAgICAgfSBlbHNlIGlmKGEgPT0gMTYpewog ICAgICAgIHB1dDMyKDApOyAvLyBjYXNlIGluc2Vuc2l0aXZlCiAgICAgIH0gZWxzZSBpZihhID09 IDE3KXsKICAgICAgICBwdXQzMigxKTsgLy8gY2FzZSBwcmVzZXJ2aW5nCiAgICAgIH0gZWxzZSBp ZihhID09IDE4KXsKICAgICAgICBwdXQzMigwKTsgLy8gY2hvd25fcmVzdHJpY3RlZAogICAgICB9 IGVsc2UgaWYoYSA9PSAxOSl7CiAgICAgICAgLy8gZmlsZWhhbmRsZQogICAgICAgIGludCB4Zmgg PSBmaDsKICAgICAgICBwdXRfb3BhcXVlKDQsIChjaGFyKikmeGZoKTsgLy8gZmgKICAgICAgfSBl bHNlIGlmKGEgPT0gMjApewogICAgICAgIHB1dDY0KGZoKTsgLy8gZmlsZWlkCiAgICAgIH0gZWxz ZSBpZihhID09IDIxKXsKICAgICAgICBwdXQ2NCg5OTk5KTsgLy8gZmlsZXNfYXZhaWwKICAgICAg fSBlbHNlIGlmKGEgPT0gMjIpewogICAgICAgIHB1dDY0KDk5OTkpOyAvLyBmaWxlc19mcmVlCiAg ICAgIH0gZWxzZSBpZihhID09IDIzKXsKICAgICAgICBwdXQ2NCg5OTk5OSk7IC8vIGZpbGVzX3Rv dGFsCiAgICAgIH0gZWxzZSBpZihhID09IDI0KXsKICAgICAgICAvLyBmc19sb2NhdGlvbnMKICAg ICAgICBwdXQzMigxKTsgLy8gIyBwYXRoIGNvbXBvbmVudHMKICAgICAgICBwdXRfb3BhcXVlKDEs ICJyIik7IC8vIHBhdGhuYW1lNAogICAgICAgIHB1dDMyKDEpOyAvLyBsb2NhdGlvbnM8PgogICAg ICAgIHB1dDMyKDEpOyAvLyBzZXJ2ZXJzPD4KICAgICAgICBwdXRfb3BhcXVlKDEsICJzIik7IC8v IHNlcnZlcgogICAgICAgIHB1dDMyKDEpOyAvLyAjIHBhdGggY29tcG9uZW50cwogICAgICAgIHB1 dF9vcGFxdWUoMSwgIngiKTsgLy8gcm9vdHBhdGgKICAgICAgfSBlbHNlIGlmKGEgPT0gMjYpewog ICAgICAgIHB1dDMyKDEpOyAvLyBob21vZ2VuZW91cwogICAgICB9IGVsc2UgaWYoYSA9PSAyNyl7 CiAgICAgICAgcHV0NjQoMHhmZmZmZmZmZmZmZmYpOyAvLyBtYXggZmlsZSBzaXplCiAgICAgIH0g ZWxzZSBpZihhID09IDI4KXsKICAgICAgICBwdXQzMigweGZmZmYpOyAvLyBtYXggbGluawogICAg ICB9IGVsc2UgaWYoYSA9PSAyOSl7CiAgICAgICAgcHV0MzIoMjU2KTsgLy8gbWF4IG5hbWUKICAg ICAgfSBlbHNlIGlmKGEgPT0gMzApewogICAgICAgIHB1dDY0KDEwKjQwOTYpOyAvLyBtYXggcmVh ZAogICAgICB9IGVsc2UgaWYoYSA9PSAzMSl7CiAgICAgICAgcHV0NjQoMTAqNDA5Nik7IC8vIG1h eCB3cml0ZQogICAgICB9IGVsc2UgaWYoYSA9PSAzMyl7CiAgICAgICAgcHV0MzIoMDc3Nyk7IC8v IG1vZGUKICAgICAgfSBlbHNlIGlmKGEgPT0gMzQpewogICAgICAgIHB1dDMyKDEpOyAvLyBub190 cnVuYwogICAgICB9IGVsc2UgaWYoYSA9PSAzNSl7CiAgICAgICAgcHV0MzIoMyk7IC8vIG51bWxp bmtzCiAgICAgIH0gZWxzZSBpZihhID09IDM2KXsKICAgICAgICBwcmludGYoInJlcGx5aW5nIHdp dGggYW4gb3duZXJcbiIpOwogICAgICAgIC8vIHB1dF9vcGFxdWUoNiwgIm90aGVyIik7IC8vIG93 bmVyCiAgICAgICAgcHV0X29wYXF1ZSg5LCAiYmluQHguY29tIik7IC8vIG93bmVyCiAgICAgICAg Ly8gcHV0X29wYXF1ZSg1LCAiNjU1MzQiKTsgLy8gb3duZXIKICAgICAgfSBlbHNlIGlmKGEgPT0g MzcpewogICAgICAgIC8vIHB1dF9vcGFxdWUoNiwgIm90aGVyIik7IC8vIG93bmVyX2dyb3VwCiAg ICAgICAgcHV0X29wYXF1ZSg5LCAiYmluQHguY29tIik7IC8vIG93bmVyX2dyb3VwCiAgICAgICAg Ly8gcHV0X29wYXF1ZSg1LCAiNjU1MzQiKTsgLy8gb3duZXJfZ3JvdXAKICAgICAgfSBlbHNlIGlm KGEgPT0gNDEpewogICAgICAgIHB1dDMyKDApOyAvLyByYXdkZXYgbWFqb3IKICAgICAgICBwdXQz MigwKTsgLy8gcmF3ZGV2IG1pbm9yCiAgICAgIH0gZWxzZSBpZihhID09IDQyKXsKICAgICAgICBw dXQ2NCgxMCoxMDI0KjEwMjQpOyAvLyBzcGFjZV9hdmFpbAogICAgICB9IGVsc2UgaWYoYSA9PSA0 Myl7CiAgICAgICAgcHV0NjQoMTAqMTAyNCoxMDI0KTsgLy8gc3BhY2VfZnJlZQogICAgICB9IGVs c2UgaWYoYSA9PSA0NCl7CiAgICAgICAgcHV0NjQoMjAqMTAyNCoxMDI0KTsgLy8gc3BhY2VfdG90 YWwKICAgICAgfSBlbHNlIGlmKGEgPT0gNDUpewogICAgICAgIHB1dDY0KDQwOTYqMTApOyAvLyBz cGFjZSB1c2VkCiAgICAgIH0gZWxzZSBpZihhID09IDQ3KXsKICAgICAgICBwdXQ2NCgwKTsgLy8g dGltZSBhY2Nlc3Mgc2Vjb25kcwogICAgICAgIHB1dDMyKDApOyAvLyBuc2Vjb25kcwogICAgICB9 IGVsc2UgaWYoYSA9PSA1MCl7CiAgICAgICAgcHV0NjQoMCk7IC8vIHRpbWUgY3JlYXRlIHNlY29u ZHMKICAgICAgICBwdXQzMigwKTsgLy8gbnNlY29uZHMKICAgICAgfSBlbHNlIGlmKGEgPT0gNTEp ewogICAgICAgIHB1dDY0KDApOyAvLyB0aW1lIGRlbHRhIHNlY29uZHMKICAgICAgICBwdXQzMigw KTsgLy8gbnNlY29uZHMKICAgICAgfSBlbHNlIGlmKGEgPT0gNTIpewogICAgICAgIHB1dDY0KDAp OyAvLyB0aW1lIG1ldGFkYXRhIHNlY29uZHMKICAgICAgICBwdXQzMigwKTsgLy8gbnNlY29uZHMK ICAgICAgfSBlbHNlIGlmKGEgPT0gNTMpewogICAgICAgIHB1dDY0KDApOyAvLyB0aW1lIG1vZGlm eSBzZWNvbmRzCiAgICAgICAgcHV0MzIoMCk7IC8vIG5zZWNvbmRzCiAgICAgIH0gZWxzZSBpZihh ID09IDU1KXsKICAgICAgICBwdXQ2NCgwKTsgLy8gbW91bnRlZF9vbl9maWxlaWQgPz8/CiAgICAg IH0gZWxzZSBpZihhID09IDYyKXsKICAgICAgICAvLyBmc19sYXlvdXRfdHlwZXMKICAgICAgICBw dXQzMigxKTsKICAgICAgICAvLyBwdXQzMigzKTsgLy8gTEFZT1VUNF9CTE9DS19WT0xVTUUKICAg ICAgICAvLyBwdXQzMigyKTsgLy8gTEFZT1VUNF9PU0QyX09CSkVDVFMKICAgICAgICBwdXQzMigx KTsgLy8gTEFZT1VUNF9ORlNWNF8xX0ZJTEVTCiAgICAgIH0gZWxzZSBpZihhID09IDY1KXsKICAg ICAgICAvLyBMQVlPVVRfQkxLU0laRQogICAgICAgIHB1dDMyKDEwMjQpOwogICAgICB9IGVsc2Ug aWYoYSA9PSA3Nyl7CiAgICAgICAgLy8gQ0xPTkVfQkxLU0laRQogICAgICAgIHB1dDMyKDEwMjQp OwogICAgICB9IGVsc2UgaWYoYSA9PSA3OSl7CiAgICAgICAgLy8gQ0hBTkdFX0FUVFJfVFlQRQog ICAgICAgIHB1dDMyKDQpOyAvLyA/Pz8KICAgICAgfSBlbHNlIGlmKGEgPT0gODIpewogICAgICAg IC8vIFhBVFRSX1NVUFBPUlQKICAgICAgICBwdXQzMigxKTsKICAgICAgfSBlbHNlIGlmKGEgPT0g NzUpewogICAgICAgIC8vIEZBVFRSNF9TVVBQQVRUUl9FWENMQ1JFQVQKICAgICAgICBwdXQzMigz KTsgLy8gYml0bWFwIGxlbmd0aAogICAgICAgIHB1dDMyKDB4ZmZmZmZmZmYpOwogICAgICAgIHB1 dDMyKDB4ZmZmZmZmZmYpOwogICAgICAgIHB1dDMyKDB4ZmZmZmZmZmYpOwogICAgICB9IGVsc2Ug aWYoYSA9PSA4Nil7CiAgICAgICAgLy8gRkFUVFI0X09QRU5fQVJHVU1FTlRTCiAgICAgICAgZm9y KGludCBpID0gMDsgaSA8IDU7IGkrKyl7CiAgICAgICAgICBwdXQzMigxKTsgLy8gYml0bWFwIGxl bmd0aAogICAgICAgICAgcHV0MzIoMHhmZmZmZmZmZik7CiAgICAgICAgfQogICAgICB9IGVsc2Ug aWYoYSA9PSA4MCl7CiAgICAgICAgLy8gRkFUVFI0X1NFQ19MQUJFTCwgRkFUVFI0X1dPUkQyX1NF Q1VSSVRZX0xBQkVMCiAgICAgICAgcHV0MzIoMCk7IC8vIGxmcwogICAgICAgIHB1dDMyKDApOyAv LyBwaQogICAgICAgIHB1dDMyKDQpOyAvLyBsYWJlbC0+bGVuCiAgICAgICAgcHV0MzIoMCk7IC8v ID8/PwogICAgICB9IGVsc2UgaWYoYSA9PSA2OCl7CiAgICAgICAgLy8gRkFUVFI0X01EU1RIUkVT SE9MRAogICAgICAgIHB1dDMyKDEpOyAgLy8gbnVtCiAgICAgICAgcHV0MzIoMCk7IC8vIGxfdHlw ZQogICAgICAgIHB1dDMyKDMpOyAvLyBiaXRtYXAgc2l6ZQogICAgICAgIHB1dDMyKDB4ZmZmZmZm ZmYpOwogICAgICAgIHB1dDMyKDB4ZmZmZmZmZmYpOwogICAgICAgIHB1dDMyKDB4ZmZmZmZmZmYp OwogICAgICAgIHB1dDMyKDMyKTsgLy8gYXR0cl9sZW5ndGgKICAgICAgICBwdXQzMigwKTsgLy8g dGhyZXNob2xkX2hpbnQKICAgICAgICBwdXQzMigwKTsKICAgICAgICBwdXQzMigwKTsgLy8gdGhy ZXNob2xkX2hpbnQKICAgICAgICBwdXQzMigwKTsKICAgICAgICBwdXQzMigwKTsgLy8gdGhyZXNo b2xkX2hpbnQKICAgICAgICBwdXQzMigwKTsKICAgICAgICBwdXQzMigwKTsgLy8gdGhyZXNob2xk X2hpbnQKICAgICAgICBwdXQzMigwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwcmludGYoInVu a25vd24gcmVxdWVzdGVkIGF0dHIgJWRcbiIsIGEpOwogICAgICB9CiAgICB9CiAgfQogICooaW50 Kikob2J1ZitsZW5pKSA9IGh0b25sKG9pIC0gbGVuaSAtIDQpOwp9Cgp2b2lkCnBhcnNlX29wX2dl dGF0dHIoKQp7CiAgaW50IGJpdHdvcmRzID0gcGFyc2UzMigpOwogIGludCB3b3Jkc1s0XTsKICBt ZW1zZXQod29yZHMsIDAsIHNpemVvZih3b3JkcykpOwogIGlmKGJpdHdvcmRzIDwgMSB8fCBiaXR3 b3JkcyA+IDMpCiAgICBwcmludGYoInBhcnNlX29wX2dldGF0dHI6IGNyYXp5IGJpdHdvcmRzICVk XG4iLCBiaXR3b3Jkcyk7CiAgZm9yKGludCBpID0gMDsgaSA8IGJpdHdvcmRzICYmIGkgPCA0OyBp KyspCiAgICB3b3Jkc1tpXSA9IHBhcnNlMzIoKTsKCiAgLy9wdXQzMigwKTsgLy8gT0sKICBpZihk b2l0KXsKICAgIHByaW50ZigiPj4+IHJldHVybmluZyBzdGF0dXM9MHg4MCBmb3IgR0VUQVRUUlxu Iik7CiAgICBwdXQzMigweDgwKTsKICAgIGRvaXQgPSAwOwogIH0gZWxzZSB7CiAgICBwdXQzMigw KTsgLy8gT0sKICB9CgogIHB1dF9mYXR0cjQod29yZHMsIGN1cnJlbnRfZmgpOwp9Cgp2b2lkCnBh cnNlX29wX3B1dGZoKCkKewogIGNoYXIgYnVmWzY0XTsKICBpbnQgbiA9IHBhcnNlX29wYXF1ZShi dWYpOyAvLyBmaAogIGlmKG4gIT0gNCl7CiAgICBwcmludGYoIm9wX3B1dGZoIGZoIHNpemUgJWQs IG5vdCA0XG4iLCBuKTsKICAgIGV4aXQoMSk7CiAgfQogIGludCBmaCA9ICooaW50KilidWY7CiAg Y3VycmVudF9maCA9IGZoOwogIHB1dDMyKDApOyAvLyBPSwp9Cgp2b2lkCnBhcnNlX29wX2FjY2Vz cygpCnsKICBpbnQgbWFzayA9IHBhcnNlMzIoKTsgLy8gbWFzayBvZiByaWdodHMgdG8gcXVlcnkK ICBwdXQzMigwKTsgLy8gT0sKICBwdXQzMihtYXNrKTsgLy8gc3VwcG9ydGVkID0gYWxsIHJpZ2h0 cwogIHB1dDMyKG1hc2spOyAvLyBhY2Nlc3MgPSBhbGwgcmlnaHRzCn0KCnZvaWQKcGFyc2Vfb3Bf bG9va3VwKCkKewogIGNoYXIgbmFtZVsyNTZdOwogIGludCBuID0gcGFyc2Vfb3BhcXVlKG5hbWUp OwogIG5hbWVbbj49MD9uOjBdID0gJ1wwJzsKICBpbnQgeGZoID0gbmFtZTJmaChuYW1lLCAwKTsK ICBpZih4ZmggPCAwKXsKICAgIHByaW50ZigibG9va3VwICVzIC0+IEVOT0VOVFxuIiwgbmFtZSk7 CiAgICBwdXQzMigyKTsgLy8gTkZTNEVSUl9OT0VOVAogICAgaWYoY29tcG91bmRfc3RhdHVzID09 IDApCiAgICAgIGNvbXBvdW5kX3N0YXR1cyA9IDI7CiAgfSBlbHNlIHsKICAgIHB1dDMyKDApOyAv LyBPSwogICAgY3VycmVudF9maCA9IHhmaDsKICAgIHByaW50ZigibG9va3VwICVzIC0+IGZoICVk XG4iLCBuYW1lLCBjdXJyZW50X2ZoKTsKICB9Cn0KCnZvaWQKcGFyc2Vfb3BfbG9va3VwcCgpCnsK ICBjdXJyZW50X2ZoID0gMTsgLy8gL3RtcAogIHB1dDMyKDApOyAvLyBPSwp9Cgp2b2lkCnBhcnNl X29wX3JlYWRkaXIoKQp7CiAgbG9uZyBsb25nIGNvb2tpZSA9IHBhcnNlNjQoKTsKICBsb25nIGxv bmcgdmVyZiA9IHBhcnNlNjQoKTsgLy8gY29va2llIHZlcmlmaWVyCiAgcGFyc2UzMigpOyAvLyBk aXJjb3VudAogIHBhcnNlMzIoKTsgLy8gbWF4Y291bnQKICAvLyBhdHRyX3JlcXVlc3QKICBpbnQg Yml0d29yZHMgPSBwYXJzZTMyKCk7CiAgaW50IHdvcmRzWzRdOwogIG1lbXNldCh3b3JkcywgMCwg c2l6ZW9mKHdvcmRzKSk7CiAgZm9yKGludCBpID0gMDsgaSA8IGJpdHdvcmRzICYmIGkgPCA0OyBp KyspCiAgICB3b3Jkc1tpXSA9IHBhcnNlMzIoKTsKCiAgcHV0MzIoMCk7IC8vIE9LCiAgcHV0NjQo dmVyZik7IC8vIGNvb2tpZXZlcmYKICBjaGFyICpuYW1lc1tdID0geyAieiIsICJ6enoiIH07CiAg Zm9yKGludCBpID0gMDsgaSA8IDI7IGkrKyl7CiAgICBwdXQzMigxKTsgLy8gKm5leHRlbnRyeQog ICAgcHV0NjQobmV4dF9jb29raWUrKyk7IC8vIGNvb2tpZQogICAgcHV0X29wYXF1ZSgzLCBuYW1l c1tpXSk7IC8vIG5hbWUKICAgIHB1dF9mYXR0cjQod29yZHMsIG5hbWUyZmgobmFtZXNbaV0sIDEp KTsKICB9CgogIHB1dDMyKDApOyAvLyAqbmV4dGVudHJ5CgogIHB1dDMyKDEpOyAvLyBlb2YKfQoK dm9pZApwYXJzZV9vcF9vcGVuKCkKewogIGNoYXIgbmFtZVsyNTZdOwogIG5hbWVbMF0gPSAwOwog IHBhcnNlMzIoKTsgLy8gc2VxaWQKICBwYXJzZTMyKCk7IC8vIHNoYXJlX2FjY2VzcwogIHBhcnNl MzIoKTsgLy8gc2hhcmVfZGVueQogIHBhcnNlNjQoKTsgLy8gb3duZXIgY2xpZW50IGlkCiAgcGFy c2Vfb3BhcXVlKDApOyAvLyBvd25lciBvd25lcgogIC8vIG9wZW5mbGFnNAogIGludCBvcGVudHlw ZSA9IHBhcnNlMzIoKTsKICBpZihvcGVudHlwZSA9PSAxKXsKICAgIC8vIE9QRU40X0NSRUFURQog ICAgaW50IG1vZGUgPSBwYXJzZTMyKCk7IC8vIGNyZWF0ZWhvdzQKICAgIGlmKG1vZGUgPT0gMCl7 CiAgICAgIC8vIFVOQ0hFQ0tFRDQKICAgICAgLy8gZmF0dHI0IGNyZWF0ZWF0dHJzCiAgICAgIGlu dCBiaXR3b3JkcyA9IHBhcnNlMzIoKTsKICAgICAgaW50IHdvcmRzWzMyXTsKICAgICAgZm9yKGlu dCBpID0gMDsgaSA8IGJpdHdvcmRzOyBpKyspCiAgICAgICAgd29yZHNbaV0gPSBwYXJzZTMyKCk7 CiAgICAgIHBhcnNlX29wYXF1ZSgwKTsgLy8gYXR0cmxpc3Q0CiAgICB9IGVsc2UgewogICAgICBw cmludGYoIk9QRU40X0NSRUFURSB1bmtub3duIG1vZGUgJWRcbiIsIG1vZGUpOwogICAgICBleGl0 KDEpOwogICAgfQogIH0gZWxzZSBpZihvcGVudHlwZSA9PSAwKXsKICAgIC8vIE9QRU40X05PQ1JF QVRFCiAgfSBlbHNlIHsKICAgIHByaW50ZigidW5rbm93biBvcGVudHlwZSAlZFxuIiwgb3BlbnR5 cGUpOwogICAgZXhpdCgxKTsKICB9CiAgaW50IG9wZW5fY2xhaW1fdHlwZSA9IHBhcnNlMzIoKTsK ICBpZihvcGVuX2NsYWltX3R5cGUgPT0gMCl7CiAgICAvLyBDTEFJTV9OVUxMCiAgICBwYXJzZV9v cGFxdWUobmFtZSk7IC8vIGZpbGUgbmFtZQogIH0gZWxzZSBpZihvcGVuX2NsYWltX3R5cGUgPT0g Mil7CiAgICAvLyBDTEFJTV9ERUxFR0FURV9DVVIKICAgIC8vIG9wZW5fY2xhaW1fZGVsZWdhdGVf Y3VyNAogICAgLy8gc3RhdGVpZDQKICAgIHBhcnNlMzIoKTsgLy8gc2VxaWQKICAgIHBhcnNlMzIo KTsKICAgIHBhcnNlMzIoKTsKICAgIHBhcnNlMzIoKTsKICAgIHBhcnNlX29wYXF1ZShuYW1lKTsg Ly8gZmlsZSBuYW1lCiAgfSBlbHNlIGlmKG9wZW5fY2xhaW1fdHlwZSA9PSA0KXsKICAgIC8vIENM QUlNX0ZICiAgfSBlbHNlIHsKICAgIHByaW50Zigib3ksIG9wZW5fY2xhaW1fdHlwZSAlZFxuIiwg b3Blbl9jbGFpbV90eXBlKTsKICAgIGV4aXQoMSk7CiAgfQoKICBpbnQgeGZoID0gbmFtZTJmaChu YW1lLCBvcGVudHlwZSk7CiAgaWYoeGZoIDwgMCl7CiAgICBwcmludGYoIm9wZW4oJXMpIEVOT0VO VFxuIiwgbmFtZSk7CiAgICBwdXQzMigyKTsgLy8gTkZTNEVSUl9OT0VOVAogIH0gZWxzZSB7CiAg ICBwdXQzMigwKTsgLy8gT0sKICAgIC8vIHN0YXRlaWQ0CiAgICBwdXQzMigxKTsgLy8gc2VxaWQK ICAgIHB1dDMyKDEpOyAvLyBvdGhlcgogICAgcHV0MzIoMSk7CiAgICBwdXQzMigxKTsKICAgIC8v IGNoYW5nZV9pbmZvNAogICAgcHV0MzIoMSk7CiAgICBwdXQ2NCgwKTsgLy8gYmVmb3JlCiAgICBw dXQ2NCgwKTsgLy8gYWZ0ZXIKICAgIHB1dDMyKDApOyAvLyByZmxhZ3MKCiAgICBwdXQzMigzKTsg Ly8gYXR0cnNldCBiaXRtYXAgbGVuZ3RoIC8gYml0bWFwNAogICAgcHV0MzIoMCk7CiAgICBwdXQz MigwKTsKICAgIHB1dDMyKDApOwoKICAgIC8vIG9wZW5fZGVsZWdhdGlvbjQKICAgIHB1dDMyKDIp OyAvLyBPUEVOX0RFTEVHQVRFX1dSSVRFCiAgICBwdXQzMigwKTsgLy8gc3RhdGVpZDQgc2VxaWQK ICAgIHB1dDMyKDApOyAvLyBzdGF0ZWlkNCBvdGhlcgogICAgcHV0MzIoMCk7IC8vIHN0YXRlaWQ0 IG90aGVyCiAgICBwdXQzMigwKTsgLy8gc3RhdGVpZDQgb3RoZXIKICAgIHB1dDMyKDApOyAvLyBy ZWNhbGwKICAgIHB1dDMyKDEpOyAvLyBORlNfTElNSVRfU0laRQogICAgcHV0NjQoMTAyNDApOwog ICAgcHV0MzIoMCk7IC8vIGFjZXR5cGU0CiAgICBwdXQzMigwKTsgLy8gYWNlZmxhZzQKICAgIHB1 dDMyKDApOyAvLyBhY2VtYXNrNAogICAgcHV0X29wYXF1ZSg0LCAiYWJjZCIpOwoKICAgIHByaW50 ZigiICBuYW1lPSVzXG4iLCBuYW1lKTsKICAgIGlmKG5hbWVbMF0pewogICAgICBjdXJyZW50X2Zo ID0geGZoOwogICAgfSBlbHNlIHsKICAgICAgcHJpbnRmKCJvcF9vcGVuOiBubyBuYW1lIHdpdGgg d2hpY2ggdG8gc2V0IGZoXG4iKTsKICAgIH0KICB9Cn0KCnZvaWQKcGFyc2Vfb3Bfc2V0YXR0cigp CnsKICAvLyBzdGF0ZWlkNAogIHBhcnNlMzIoKTsgLy8gc2VxaWQKICBwYXJzZTMyKCk7IC8vIG90 aGVyCiAgcGFyc2UzMigpOyAvLyBvdGhlcgogIHBhcnNlMzIoKTsgLy8gb3RoZXIKICAvLyBmYXR0 cjQKICBpbnQgYml0d29yZHMgPSBwYXJzZTMyKCk7CiAgaW50IHdvcmRzWzY0XTsKICBmb3IoaW50 IGkgPSAwOyBpIDwgYml0d29yZHM7IGkrKykKICAgIHdvcmRzW2ldID0gcGFyc2UzMigpOwogIHBh cnNlX29wYXF1ZSgwKTsgLy8gYXR0cmxpc3Q0CgogIHB1dDMyKDApOyAvLyBPSwogIHB1dDMyKGJp dHdvcmRzKTsKICBmb3IoaW50IGkgPSAwOyBpIDwgYml0d29yZHM7IGkrKykKICAgIHB1dDMyKHdv cmRzW2ldKTsKfQoKdm9pZApwYXJzZV9vcF9sYXlvdXRnZXQoKQp7CiAgcGFyc2UzMigpOyAvLyBs b2dhX3NpZ25hbF9sYXlvdXRfYXZhaWwKICBwYXJzZTMyKCk7IC8vIGxheW91dHR5cGU0CiAgcGFy c2UzMigpOyAvLyBsYXlvdXRpb21vZGU0CiAgcGFyc2U2NCgpOyAvLyBvZmZzZXQKICBwYXJzZTY0 KCk7IC8vIGxlbmd0aAogIHBhcnNlNjQoKTsgLy8gbWlubGVuZ3RoCiAgcGFyc2UzMigpOyAvLyBz dGF0ZWlkNCBzZXFpZAogIHBhcnNlMzIoKTsgLy8gc3RhdGVpZDQgb3RoZXIKICBwYXJzZTMyKCk7 IC8vIHN0YXRlaWQ0IG90aGVyCiAgcGFyc2UzMigpOyAvLyBzdGF0ZWlkNCBvdGhlcgogIHBhcnNl MzIoKTsgLy8gY291bnQzMgogIAogIHB1dDMyKDApOyAvLyBPSwogIHB1dDMyKDApOyAvLyByZXR1 cm5fb25fY2xvc2UKICBwdXQzMigwKTsgLy8gc3RhdGVpZDQgc2VxaWQKICBwdXQzMigwKTsgLy8g c3RhdGVpZDQgb3RoZXIKICBwdXQzMigwKTsgLy8gc3RhdGVpZDQgb3RoZXIKICBwdXQzMigwKTsg Ly8gc3RhdGVpZDQgb3RoZXIKCiAgcHV0MzIoMSk7IC8vICMgb2YgbGF5b3V0NAoKI2lmIDAKICAv LyBibG9jayB0aGluZywgZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0LmMKICBwdXQ2NCgw KTsgLy8gb2Zmc2V0CiAgcHV0NjQoMTAwMDAwMCk7IC8vIGxlbmd0aAogIHB1dDMyKDIpOyAvLyBs YXlvdXRpb21vZGU0CiAgcHV0MzIoMyk7IC8vIGxheW91dHR5cGU0CiAgLy8gaHR0cHM6Ly9kYXRh dHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM1NjYzCiAgcHV0MzIoNCs0NCs0NCk7IC8vIHNp emUgb2YgdGhlIGZvbGxvd2luZyAib3BhcXVlIgogIC8vIGZvciBibF9hbGxvY19sc2VnKCkKICBw dXQzMigyKTsgLy8gY291bnQgb2YgZm9sbG93aW5nIGV4dGVudHMKICBmb3IoaW50IGkgPSAwOyBp IDwgMjsgaSsrKXsKICAgIC8vIDE2IGJ5dGVzIG9mIGRldmljZWRpZDQgYmV4X3ZvbF9pZAogICAg Zm9yKGludCBpID0gMDsgaSA8IDQ7IGkrKykKICAgICAgcHV0MzIoMSk7CiAgICBwdXQ2NCgwKTsg Ly8gYmV4X2ZpbGVfb2Zmc2V0CiAgICBwdXQ2NCgwKTsgLy8gYmV4X2xlbmd0aAogICAgcHV0NjQo MCk7IC8vIGJleF9zdG9yYWdlX29mZnNldAogICAgcHV0MzIoMCk7IC8vIGJleF9zdGF0ZQogIH0K I2VuZGlmCgojaWYgMAogIHB1dDY0KDApOyAvLyBvZmZzZXQKICBwdXQ2NCgxMDAwMDAwKTsgLy8g bGVuZ3RoCiAgcHV0MzIoMik7IC8vIGxheW91dGlvbW9kZTQKICBwdXQzMigyKTsgLy8gbGF5b3V0 dHlwZTQKICBwdXRfb3BhcXVlKDgsICJ4eHh4eHh4eCIpOyAvLyBsb2NfYm9keQojZW5kaWYKCiAg cHV0NjQoMCk7IC8vIG9mZnNldAogIHB1dDY0KDEwMDAwMDApOyAvLyBsZW5ndGgKICBwdXQzMigy KTsgLy8gbGF5b3V0aW9tb2RlNAogIHB1dDMyKDEpOyAvLyBsYXlvdXR0eXBlNCBMQVlPVVQ0X05G U1Y0XzFfRklMRVMKICBwdXQzMigxNiArIDIwKTsgLy8gdG90YWwgc2l6ZSBvZiBmb2xsb3dpbmcs IGZvciBmaWxlbGF5b3V0X2RlY29kZV9sYXlvdXQKICBwdXQ2NCgwKTsgLy8gZGV2aWNlIGlkCiAg cHV0NjQoMCk7IC8vIGRldmljZSBpZAogIHB1dDMyKDB4MTAwKTsgLy8gbmZsX3V0aWwKICBwdXQz MigwKTsgLy8gZmlyc3Rfc3RyaXBlX2luZGV4CiAgcHV0NjQoMCk7IC8vIHBhdHRlcm5fb2Zmc2V0 CiAgcHV0MzIoMCk7IC8vIG51bV9maAp9Cgp2b2lkCnBhcnNlX29wX2dldGRldmljZWluZm8oKQp7 CiAgcGFyc2UzMigpOyAvLyBkZXZpY2VpZDQKICBwYXJzZTMyKCk7CiAgcGFyc2UzMigpOwogIHBh cnNlMzIoKTsKICBwYXJzZTMyKCk7IC8vIGxheW91dHR5cGU0CiAgcGFyc2UzMigpOyAvLyBjb3Vu dDQKICBpbnQgbmIgPSBwYXJzZTMyKCk7IC8vICMgYml0bWFwd29yZHMKICBmb3IoaW50IGkgPSAw OyBpIDwgbmI7IGkrKykKICAgIHBhcnNlMzIoKTsgLy8gYml0bWFwNAoKICBwdXQzMigwKTsgLy8g T0sKICAvLyBkZXZpY2VfYWRkcjQgZ2Rpcl9kZXZpY2VfYWRkcgogIHB1dDMyKDEpOyAvLyBsYXlv dXR0eXBlNAoKICAvLyBkYV9hZGRyX2JvZHksIGZvciBuZnM0X2ZsX2FsbG9jX2RldmljZWlkX25v ZGUKICBwdXQzMigyMio0KTsKICBwdXQzMigyKTsgLy8gc3RyaXBlIGNvdW50CiAgcHV0MzIoMCk7 IC8vIGluZGV4CiAgcHV0MzIoMSk7IC8vIGluZGV4CiAgcHV0MzIoMik7IC8vIGRzX251bQogIGZv cihpbnQgaSA9IDA7IGkgPCAyOyBpKyspewogICAgcHV0MzIoMSk7IC8vIG1wX2NvdW50CiAgICBw dXRfb3BhcXVlKDMsICJ0Y3AiKTsgLy8gbmV0aWQKICAgIHB1dF9vcGFxdWUoMTEsICIwLjAuMC4w LjIwNDkuMjA0OSIpOwogIH0KCiAgcHV0MzIoMSk7IC8vIGJpdG1hcDQ8PgogIHB1dDMyKDB4ZmZm ZmZmZmYpOyAvLyBiaXRtYXA0Cn0KCnZvaWQKcGFyc2Vfb3Bfd3JpdGUoKQp7CiAgcGFyc2UzMigp OyAvLyBzdGF0ZWlkNAogIHBhcnNlMzIoKTsgLy8gc3RhdGVpZDQKICBwYXJzZTMyKCk7IC8vIHN0 YXRlaWQ0CiAgcGFyc2UzMigpOyAvLyBzdGF0ZWlkNAogIHBhcnNlNjQoKTsgLy8gb2Zmc2V0CiAg cGFyc2UzMigpOyAvLyBzdGFibGVfaG93NAogIGludCBuID0gcGFyc2Vfb3BhcXVlKDApOyAvLyBk YXRhCgogIHB1dDMyKDApOyAvLyBPSwogIHB1dDMyKG4pOyAvLyBjb3VudAogIHB1dDMyKDApOyAv LyBVTlNUQUJMRTQKICBwdXQ2NCgxKTsgLy8gdmVyaWZpZXIKfQoKdm9pZApwYXJzZV9vcF9yZWFk KCkKewogIHBhcnNlMzIoKTsgLy8gc3RhdGVpZDQKICBwYXJzZTMyKCk7IC8vIHN0YXRlaWQ0CiAg cGFyc2UzMigpOyAvLyBzdGF0ZWlkNAogIHBhcnNlMzIoKTsgLy8gc3RhdGVpZDQKICBwYXJzZTY0 KCk7IC8vIG9mZnNldAogIHBhcnNlMzIoKTsgLy8gY291bnQKCiAgcHV0MzIoMCk7IC8vIE9LCiAg cHV0MzIoMSk7IC8vIGVvZgogIHB1dF9vcGFxdWUoNCwgImFiY2QiKTsKfQoKdm9pZApwYXJzZV9v cF9yZWFkX3BsdXMoKQp7CiAgcGFyc2UzMigpOyAvLyBzdGF0ZWlkNAogIHBhcnNlMzIoKTsgLy8g c3RhdGVpZDQKICBwYXJzZTMyKCk7IC8vIHN0YXRlaWQ0CiAgcGFyc2UzMigpOyAvLyBzdGF0ZWlk NAogIHBhcnNlNjQoKTsgLy8gb2Zmc2V0CiAgcGFyc2UzMigpOyAvLyBjb3VudAoKICBwdXQzMigw KTsgLy8gT0sKICBwdXQzMigxKTsgLy8gZW9mCiAgcHV0MzIoMik7IC8vICMgb2YgcmVhZF9wbHVz X2NvbnRlbnQKCiAgcHV0MzIoMCk7IC8vIE5GUzRfQ09OVEVOVF9EQVRBCiAgcHV0NjQoMCk7IC8v IG9mZnNldAogIHB1dF9vcGFxdWUoNCwgImFiY2QiKTsKCiAgcHV0MzIoMSk7IC8vIE5GUzRfQ09O VEVOVF9IT0xFCiAgcHV0NjQoMCk7IC8vIG9mZnNldAogIHB1dDY0KDEpOyAvLyBsZW5ndGgKfQoK dm9pZApwYXJzZV9vcF9jb21taXQoKQp7CiAgcGFyc2U2NCgpOyAvLyBvZmZzZXQKICBwYXJzZTMy KCk7IC8vIGNvdW50CiAgcHV0MzIoMCk7IC8vIE9LCiAgcHV0NjQoMSk7IC8vIHZlcmlmaWVyNAp9 Cgp2b2lkCnBhcnNlX29wX2Nsb3NlKCkKewogIHBhcnNlMzIoKTsgLy8gc2VxaWQKICBwYXJzZTMy KCk7IC8vIHN0YXRlaWQ0LnNlcWlkCiAgcGFyc2UzMigpOyAvLyBzdGF0ZWlkNC5vdGhlcgogIHBh cnNlMzIoKTsgLy8gc3RhdGVpZDQub3RoZXIKICBwYXJzZTMyKCk7IC8vIHN0YXRlaWQ0Lm90aGVy CiAgcHV0MzIoMCk7IC8vIE9LCiAgcHV0MzIoMik7IC8vIHNlcWlkCiAgcHV0MzIoMSk7IC8vIG90 aGVyCiAgcHV0MzIoMSk7CiAgcHV0MzIoMSk7Cn0KCnZvaWQKcGFyc2Vfb3BfY3JlYXRlKCkKewog IGludCB0eXBlID0gcGFyc2UzMigpOyAvLyB0eXBlCiAgY2hhciBuYW1lWzEyOF07CiAgbWVtc2V0 KG5hbWUsIDAsIHNpemVvZihuYW1lKSk7CiAgaW50IG5hbWVsZW4gPSBwYXJzZV9vcGFxdWUobmFt ZSk7CiAgLy8gZmF0dHI0CiAgaW50IGJpdHdvcmRzID0gcGFyc2UzMigpOwogIGludCB3b3Jkc1s2 NF07CiAgZm9yKGludCBpID0gMDsgaSA8IGJpdHdvcmRzOyBpKyspCiAgICB3b3Jkc1tpXSA9IHBh cnNlMzIoKTsKICBwYXJzZV9vcGFxdWUoMCk7IC8vIGF0dHJsaXN0NAogIHByaW50ZigiY3JlYXRl IHR5cGU9JWQgbmFtZT0lc1xuIiwgdHlwZSwgbmFtZSk7CgogIGN1cnJlbnRfZmggPSBuYW1lMmZo KG5hbWUsIDEpOwogIHB1dDMyKDApOyAvLyBPSwogIHB1dDMyKDEpOyAvLyBjaGFuZ2VfaW5mbzQu YXRvbWljCiAgcHV0NjQoMSk7IC8vIGJlZm9yZQogIHB1dDY0KDIpOyAvLyBhZnRlcgogIHB1dDMy KGJpdHdvcmRzKTsKICBmb3IoaW50IGkgPSAwOyBpIDwgYml0d29yZHM7IGkrKykKICAgIHB1dDMy KHdvcmRzW2ldKTsKfQoKdm9pZApwYXJzZV9vcF9yZW1vdmUoKQp7CiAgY2hhciBuYW1lWzI1Nl07 CiAgbWVtc2V0KG5hbWUsIDAsIHNpemVvZihuYW1lKSk7CiAgaW50IG5hbWVsZW4gPSBwYXJzZV9v cGFxdWUobmFtZSk7CiAgcHV0MzIoMCk7IC8vIE9LCiAgcHV0MzIoMSk7IC8vIGNoYW5nZV9pbmZv NC5hdG9taWMKICBwdXQ2NCgxKTsgLy8gYmVmb3JlCiAgcHV0NjQoMik7IC8vIGFmdGVyCn0KCmlu dCBzYXZlZF9maDsKCnZvaWQKcGFyc2Vfb3Bfc2F2ZWZoKCkKewogIHNhdmVkX2ZoID0gY3VycmVu dF9maDsKICBwdXQzMigwKTsgLy8gT0sKfQoKdm9pZApwYXJzZV9vcF9yZXN0b3JlZmgoKQp7CiAg Y3VycmVudF9maCA9IHNhdmVkX2ZoOwogIHB1dDMyKDApOyAvLyBPSwp9Cgp2b2lkCnBhcnNlX29w X3JlbmFtZSgpCnsKICBjaGFyIG5hbWUxWzI1Nl0sIG5hbWUyWzI1Nl07CiAgbWVtc2V0KG5hbWUx LCAwLCBzaXplb2YobmFtZTEpKTsKICBtZW1zZXQobmFtZTIsIDAsIHNpemVvZihuYW1lMikpOwog IHBhcnNlX29wYXF1ZShuYW1lMSk7CiAgcGFyc2Vfb3BhcXVlKG5hbWUyKTsKICBwcmludGYoInJl bmFtZSAlcyAlc1xuIiwgbmFtZTEsIG5hbWUyKTsKCiAgcHV0MzIoMCk7IC8vIE9LCiAgLy8gY2hh bmdlX2luZm80CiAgcHV0MzIoMSk7CiAgcHV0NjQoMSk7IC8vIGJlZm9yZQogIHB1dDY0KDIpOyAv LyBhZnRlcgogIC8vIGNoYW5nZV9pbmZvNAogIHB1dDMyKDEpOwogIHB1dDY0KDMpOyAvLyBiZWZv cmUKICBwdXQ2NCg0KTsgLy8gYWZ0ZXIKfQoKdm9pZApwYXJzZV9vcF9zZWVrKCkKewogIC8vIHN0 YXRlaWQ0CiAgcGFyc2UzMigpOyAvLyBzZXFpZAogIHBhcnNlMzIoKTsKICBwYXJzZTMyKCk7CiAg cGFyc2UzMigpOwogIGxvbmcgb2Zmc2V0ID0gcGFyc2U2NCgpOyAvLyBvZmZzZXQKICBpbnQgd2hh dCA9IHBhcnNlMzIoKTsKICBwcmludGYoInNlZWsgb2Zmc2V0PSVsZCB3aGF0PSVkXG4iLCBvZmZz ZXQsIHdoYXQpOwogIHB1dDMyKDApOyAvLyBPSwogIGlmKHdoYXQgPT0gMCl7CiAgICAvLyBuZXh0 IGRhdGE/CiAgICBpZihvZmZzZXQgPj0gMzIpewogICAgICBwdXQzMigxKTsKICAgICAgcHV0NjQo b2Zmc2V0KTsKICAgIH0gZWxzZSB7CiAgICAgIHB1dDMyKDApOwogICAgICBwdXQ2NChvZmZzZXQg KyAxKTsKICAgIH0KICB9IGVsc2UgewogICAgLy8gbmV4dCBob2xlPwogICAgaWYob2Zmc2V0ID49 IDMyKXsKICAgICAgcHV0MzIoMSk7CiAgICAgIHB1dDY0KG9mZnNldCk7CiAgICB9IGVsc2Ugewog ICAgICBwdXQzMigwKTsKICAgICAgcHV0NjQoMzIpOwogICAgfQogIH0KfQoKdm9pZApwYXJzZV9v cF9jb3B5KCkKewogIC8vIHN0YXRlaWQ0CiAgcGFyc2UzMigpOyAvLyBzZXFpZAogIHBhcnNlMzIo KTsKICBwYXJzZTMyKCk7CiAgcGFyc2UzMigpOwogIC8vIHN0YXRlaWQ0CiAgcGFyc2UzMigpOyAv LyBzZXFpZAogIHBhcnNlMzIoKTsKICBwYXJzZTMyKCk7CiAgcGFyc2UzMigpOwogIHBhcnNlNjQo KTsgLy8gb2Zmc2V0CiAgcGFyc2U2NCgpOyAvLyBvZmZzZXQKICBsb25nIGxvbmcgY291bnQgPSBw YXJzZTY0KCk7IC8vIGNvdW50CiAgcGFyc2UzMigpOyAvLyBjb25zZWN1dGl2ZQogIHBhcnNlMzIo KTsgLy8gc3luY2hyb25vdXMKICBpbnQgbmxvYyA9IHBhcnNlMzIoKTsKICBmb3IoaW50IGkgPSAw OyBpIDwgbmxvYzsgaSsrKXsKICAgIGludCB0eXBlID0gcGFyc2UzMigpOwogICAgaWYodHlwZSA9 PSAxIHx8IHR5cGUgPT0gMil7CiAgICAgIHBhcnNlX29wYXF1ZSgwKTsgLy8gbmFtZSBvZiB1cmwK ICAgIH0gZWxzZSB7CiAgICAgIHBhcnNlX29wYXF1ZSgwKTsgLy8gbmV0d29yayBpZAogICAgICBw YXJzZV9vcGFxdWUoMCk7IC8vIHVuaXZlcnNhbCBhZGRyZXNzCiAgICB9CiAgfQoKICBzdGF0aWMg aW50IGFscmVhZHkgPSAwOwogIGlmKGFscmVhZHkgPj0gMil7CiAgICBwcmludGYoInRvbyBtYW55 IG9wX2NvcHlcbiIpOwogICAgcHV0MzIoMSk7IC8vIG5vdCBPSwogICAgcmV0dXJuOwogIH0KICBh bHJlYWR5Kys7CgogIHB1dDMyKDApOyAvLyBPSwogIC8vIHN0YXRlaWQ0IGNhbGxiYWNrX2lkPDE+ CiAgaWYoMSl7CiAgICBwdXQzMigwKTsgLy8gbgogIH0gZWxzZSB7CiAgICBwdXQzMigxKTsgLy8g bgogICAgcHV0MzIoMSk7IC8vIHNlcWlkCiAgICBwdXQzMigxKTsgLy8gb3RoZXIKICAgIHB1dDMy KDEpOwogICAgcHV0MzIoMSk7CiAgfQogIHB1dDY0KGNvdW50KTsgLy8gY291bnQKICBwdXQzMigw KTsgLy8gc3RhYmxlX2hvdyBVTlNUQUJMRQogIHB1dDY0KDEpOyAvLyB2ZXJpZmllcgogIHB1dDMy KDEpOyAvLyBjb25zZWN1dGl2ZQogIHB1dDMyKDApOyAvLyBzeW5jaHJvbm91cwp9Cgp2b2lkCnBh cnNlX29wX29mZmxvYWRfc3RhdHVzKCkKewogIC8vIHN0YXRlaWQ0CiAgcGFyc2UzMigpOyAvLyBz ZXFpZAogIHBhcnNlMzIoKTsgLy8gb3RoZXIKICBwYXJzZTMyKCk7IC8vIG90aGVyCiAgcGFyc2Uz MigpOyAvLyBvdGhlcgoKICBwdXQzMigwKTsgLy8gT0sKICBwdXQ2NCgxKTsgLy8gb3NyX2NvdW50 CiAgcHV0MzIoMSk7IC8vIG9zcl9jb21wbGV0ZQogIHB1dDMyKDApOyAvLyBuZnNzdGF0NAp9Cgp2 b2lkCnBhcnNlX29wX2Nsb25lKCkKewogIC8vIHN0YXRlaWQ0CiAgcGFyc2UzMigpOyAvLyBzZXFp ZAogIHBhcnNlMzIoKTsgLy8gb3RoZXIKICBwYXJzZTMyKCk7IC8vIG90aGVyCiAgcGFyc2UzMigp OyAvLyBvdGhlcgogIC8vIHN0YXRlaWQ0CiAgcGFyc2UzMigpOyAvLyBzZXFpZAogIHBhcnNlMzIo KTsgLy8gb3RoZXIKICBwYXJzZTMyKCk7IC8vIG90aGVyCiAgcGFyc2UzMigpOyAvLyBvdGhlcgog IHBhcnNlNjQoKTsgLy8gc3JjIG9mZnNldAogIHBhcnNlNjQoKTsgLy8gZHN0IG9mZnNldAogIHBh cnNlNjQoKTsgLy8gY291bnQKCiAgcHV0MzIoMCk7IC8vIG5mc3N0YXQ0Cn0KCnZvaWQKcGFyc2Vf b3BfbG9jaygpCnsKICBwYXJzZTMyKCk7IC8vIGxvY2sgdHlwZQogIHBhcnNlMzIoKTsgLy8gcmVj bGFpbQogIHBhcnNlNjQoKTsgLy8gb2Zmc2V0CiAgcGFyc2U2NCgpOyAvLyBsZW5ndGgKICBpbnQg b3duZXIgPSBwYXJzZTMyKCk7IC8vIGxvY2s0IG5ld19sb2NrX293bmVyCiAgaWYob3duZXIpewog ICAgcGFyc2UzMigpOyAvLyBvcGVuX3NlcWlkCiAgICAvLyBzdGF0ZWlkNAogICAgcGFyc2UzMigp OyAvLyBzZXFpZAogICAgcGFyc2UzMigpOwogICAgcGFyc2UzMigpOwogICAgcGFyc2UzMigpOwog ICAgcGFyc2UzMigpOyAvLyBsb2NrX3NlcWlkCiAgICBwYXJzZTY0KCk7IC8vIGNsaWVudGlkCiAg ICBwYXJzZV9vcGFxdWUoMCk7IC8vIG93bmVyCiAgfSBlbHNlIHsKICAgIC8vIHN0YXRlaWQ0CiAg ICBwYXJzZTMyKCk7IC8vIHNlcWlkCiAgICBwYXJzZTMyKCk7CiAgICBwYXJzZTMyKCk7CiAgICBw YXJzZTMyKCk7CiAgICBwYXJzZTMyKCk7IC8vIHNlcWlkCiAgfQoKICBwdXQzMigwKTsgLy8gT0sK ICAvLyBzdGF0ZWlkNAogIHB1dDMyKDEpOyAvLyBzZXFpZAogIHB1dDMyKDEpOyAvLyBvdGhlcgog IHB1dDMyKDEpOwogIHB1dDMyKDEpOwoKICBzZW5kX2JhY2sgPSAxOwp9Cgp2b2lkCnBhcnNlX29w X2xvY2t1KCkKewogIHBhcnNlMzIoKTsgLy8gbG9jayB0eXBlCiAgcGFyc2UzMigpOyAvLyBzZXFp ZAogIC8vIHN0YXRlaWQ0CiAgcGFyc2UzMigpOyAvLyBzZXFpZAogIHBhcnNlMzIoKTsKICBwYXJz ZTMyKCk7CiAgcGFyc2UzMigpOwogIHBhcnNlNjQoKTsgLy8gb2Zmc2V0CiAgcGFyc2U2NCgpOyAv LyBsZW5ndGgKCiAgcHV0MzIoMCk7IC8vIE9LCiAgLy8gc3RhdGVpZDQKICBwdXQzMigxKTsgLy8g c2VxaWQKICBwdXQzMigxKTsgLy8gb3RoZXIKICBwdXQzMigxKTsKICBwdXQzMigxKTsKfQoKdm9p ZApwYXJzZV9vcF9mcmVlX3N0YXRlaWQoKQp7CiAgLy8gc3RhdGVpZDQKICBwYXJzZTMyKCk7IC8v IHNlcWlkCiAgcGFyc2UzMigpOwogIHBhcnNlMzIoKTsKICBwYXJzZTMyKCk7CgogIHB1dDMyKDAp OyAvLyBPSwp9Cgp2b2lkCnBhcnNlX2NvbXBvdW5kKCkKewogIGNoYXIgdGFnWzUxMl07CiAgaW50 IHRhZ2xlbiA9IHBhcnNlX29wYXF1ZSh0YWcpOyAvLyB0YWcKICBpbnQgY21pbiA9IHBhcnNlMzIo KTsgLy8gY2xpZW50IG1pbm9yIHZlcnNpb24KICBpZihjbWluICE9IDIpewogICAgcHJpbnRmKCJo bW0sIGNsaWVudCBtaW5vciAlZFxuIiwgY21pbik7CiAgfQogIGludCBub3BzID0gcGFyc2UzMigp OwoKICAvLyBzdGFydCBhIENPTVBPVU5ENHJlcwogIGludCBzdGF0dXNfb2kgPSBvaTsKICBjb21w b3VuZF9zdGF0dXMgPSAwOwogIHB1dDMyKGNvbXBvdW5kX3N0YXR1cyk7IC8vIHBsYWNlLWhvbGRl cgogIHB1dF9vcGFxdWUodGFnbGVuLCB0YWcpOwogIHB1dDMyKG5vcHMpOyAvLyBsZW5ndGggb2Yg cmVzYXJyYXk8PgogIAogIGludCBvcGluZGV4ID0gMDsKICBmb3Iob3BpbmRleCA9IDA7IG9waW5k ZXggPCBub3BzICYmIGlpIDwgaWxlbjsgb3BpbmRleCsrKXsKICAgIGludCBvcCA9IHBhcnNlMzIo KTsKICAgIHByaW50Zigib3AgJWQgIyVkXG4iLCBvcCwgb3Bjb3VudHNbb3AmMHhmZl0pOwogICAg cHV0MzIob3ApOyAvLyByZXNvcCBpbiBuZnNfcmVzb3A0CiAgICBpZihzeW1fb3AgPT0gb3Apewog ICAgICBpZihzeW1fc2tpcCA9PSAwKSBkb2l0ID0gMTsKICAgICAgc3ltX3NraXAgLT0gMTsKICAg IH0KCgogICAgaWYob3AgPT0gNDIpewogICAgICBwYXJzZV9vcF9leGNoYW5nZV9pZCgpOwogICAg fSBlbHNlIGlmKG9wID09IDM1KXsKICAgICAgcGFyc2Vfb3Bfc2V0Y2xpZW50aWQoKTsKICAgIH0g ZWxzZSBpZihvcCA9PSAzNil7CiAgICAgIHBhcnNlX29wX3NldGNsaWVudGlkX2NvbmZpcm0oKTsK ICAgIH0gZWxzZSBpZihvcCA9PSA0Myl7CiAgICAgIHBhcnNlX29wX2NyZWF0ZV9zZXNzaW9uKCk7 CiAgICB9IGVsc2UgaWYob3AgPT0gNTMpewogICAgICBwYXJzZV9vcF9zZXF1ZW5jZSgpOwogICAg fSBlbHNlIGlmKG9wID09IDU4KXsKICAgICAgcGFyc2Vfb3BfcmVjbGFpbV9jb21wbGV0ZSgpOwog ICAgfSBlbHNlIGlmKG9wID09IDI0KXsKICAgICAgcGFyc2Vfb3BfcHV0cm9vdGZoKCk7CiAgICB9 IGVsc2UgaWYob3AgPT0gNTIpewogICAgICBwYXJzZV9vcF9zZWNpbmZvX25vX25hbWUoKTsKICAg IH0gZWxzZSBpZihvcCA9PSA0NCl7CiAgICAgIHBhcnNlX29wX2Rlc3Ryb3lfc2Vzc2lvbigpOwog ICAgfSBlbHNlIGlmKG9wID09IDU3KXsKICAgICAgcGFyc2Vfb3BfZGVzdHJveV9jbGllbnRpZCgp OwogICAgfSBlbHNlIGlmKG9wID09IDEwKXsKICAgICAgcGFyc2Vfb3BfZ2V0ZmgoKTsKICAgIH0g ZWxzZSBpZihvcCA9PSA5KXsKICAgICAgcGFyc2Vfb3BfZ2V0YXR0cigpOwogICAgfSBlbHNlIGlm KG9wID09IDIyKXsKICAgICAgcGFyc2Vfb3BfcHV0ZmgoKTsKICAgIH0gZWxzZSBpZihvcCA9PSAz KXsKICAgICAgcGFyc2Vfb3BfYWNjZXNzKCk7CiAgICB9IGVsc2UgaWYob3AgPT0gMTUpewogICAg ICBwYXJzZV9vcF9sb29rdXAoKTsKICAgIH0gZWxzZSBpZihvcCA9PSAxNil7CiAgICAgIHBhcnNl X29wX2xvb2t1cHAoKTsKICAgIH0gZWxzZSBpZihvcCA9PSAyNil7CiAgICAgIHBhcnNlX29wX3Jl YWRkaXIoKTsKICAgIH0gZWxzZSBpZihvcCA9PSAxOCl7CiAgICAgIHBhcnNlX29wX29wZW4oKTsK ICAgIH0gZWxzZSBpZihvcCA9PSA0NSl7CiAgICAgIHBhcnNlX29wX2ZyZWVfc3RhdGVpZCgpOwog ICAgfSBlbHNlIGlmKG9wID09IDEyKXsKICAgICAgcGFyc2Vfb3BfbG9jaygpOwogICAgfSBlbHNl IGlmKG9wID09IDE0KXsKICAgICAgcGFyc2Vfb3BfbG9ja3UoKTsKICAgIH0gZWxzZSBpZihvcCA9 PSA2KXsKICAgICAgcGFyc2Vfb3BfY3JlYXRlKCk7CiAgICB9IGVsc2UgaWYob3AgPT0gMjgpewog ICAgICBwYXJzZV9vcF9yZW1vdmUoKTsKICAgIH0gZWxzZSBpZihvcCA9PSA0KXsKICAgICAgcGFy c2Vfb3BfY2xvc2UoKTsKICAgIH0gZWxzZSBpZihvcCA9PSAzNCl7CiAgICAgIHBhcnNlX29wX3Nl dGF0dHIoKTsKICAgIH0gZWxzZSBpZihvcCA9PSA1MCl7CiAgICAgIHBhcnNlX29wX2xheW91dGdl dCgpOwogICAgfSBlbHNlIGlmKG9wID09IDQ3KXsKICAgICAgcGFyc2Vfb3BfZ2V0ZGV2aWNlaW5m bygpOwogICAgfSBlbHNlIGlmKG9wID09IDM4KXsKICAgICAgcGFyc2Vfb3Bfd3JpdGUoKTsKICAg IH0gZWxzZSBpZihvcCA9PSAyNSl7CiAgICAgIHBhcnNlX29wX3JlYWQoKTsKICAgIH0gZWxzZSBp ZihvcCA9PSA2OCl7CiAgICAgIHBhcnNlX29wX3JlYWRfcGx1cygpOwogICAgfSBlbHNlIGlmKG9w ID09IDUpewogICAgICBwYXJzZV9vcF9jb21taXQoKTsKICAgIH0gZWxzZSBpZihvcCA9PSAzMil7 CiAgICAgIHBhcnNlX29wX3NhdmVmaCgpOwogICAgfSBlbHNlIGlmKG9wID09IDMxKXsKICAgICAg cGFyc2Vfb3BfcmVzdG9yZWZoKCk7CiAgICB9IGVsc2UgaWYob3AgPT0gMjkpewogICAgICBwYXJz ZV9vcF9yZW5hbWUoKTsKICAgIH0gZWxzZSBpZihvcCA9PSA2OSl7CiAgICAgIHBhcnNlX29wX3Nl ZWsoKTsKICAgIH0gZWxzZSBpZihvcCA9PSA2MCl7CiAgICAgIHBhcnNlX29wX2NvcHkoKTsKICAg IH0gZWxzZSBpZihvcCA9PSA2Nyl7CiAgICAgIHBhcnNlX29wX29mZmxvYWRfc3RhdHVzKCk7CiAg ICB9IGVsc2UgaWYob3AgPT0gNzEpewogICAgICBwYXJzZV9vcF9jbG9uZSgpOwogICAgfSBlbHNl IHsKICAgICAgcHJpbnRmKCJ1bmtub3duIG9wICVkXG4iLCBvcCk7CiAgICAgIC8vIGNhbm5vdCBj b250aW51ZSB0byB0aGUgbmV4dCBvcCBzaW5jZQogICAgICAvLyB3ZSBkb24ndCBrbm93IGhvdyBs b25nIHRoaXMgb25lIGlzLgogICAgICBicmVhazsKICAgIH0KICAgIG9wY291bnRzW29wJjB4ZmZd ICs9IDE7CiAgfQogICooaW50Kikob2J1ZitzdGF0dXNfb2kpID0gaHRvbmwoY29tcG91bmRfc3Rh dHVzKTsKICBpZihvcGluZGV4ICE9IG5vcHMpCiAgICBwcmludGYoImNvbXBvdW5kIHdpdGggJWQg bm9wcyBidXQgb25seSBlbm91Z2ggYnl0ZXMgZm9yICVkXG4iLCBub3BzLCBvcGluZGV4KTsKICBp ZihpaSAhPSBpbGVuKQogICAgcHJpbnRmKCJjb21wb3VuZCBjb25zdW1lZCBvbmx5ICVkIG9mICVk IGJ5dGVzXG4iLCBpaSwgaWxlbik7Cn0KCnZvaWQKcGFyc2VfcnBjKCkKewogIC8vIFNVTiBSUEMK ICBpbnQgeGlkID0gcGFyc2UzMigpOwogIGludCBtdHlwZSA9IHBhcnNlMzIoKTsgLy8gbXR5cGUs IDA9Q0FMTCwgMT1SRVBMWQogIGlmKG10eXBlID09IDEpewogICAgLy8gcnBjIHJlcGx5CiAgICBp bnQgc3RhdDAgPSBwYXJzZTMyKCk7IC8vIE1TR19BQ0NFUFRFRAogICAgaW50IGZsYXZvciA9IHBh cnNlMzIoKTsKICAgIHBhcnNlX29wYXF1ZSgwKTsgLy8gdmVyZgogICAgaW50IHN0YXQxID0gcGFy c2UzMigpOyAvLyBzdGF0dXMKICAgIGludCBzdGF0MiA9IHBhcnNlMzIoKTsgLy8gc3RhdHVzCiAg ICBwYXJzZV9vcGFxdWUoMCk7CiAgICBpbnQgbm9wcyA9IHBhcnNlMzIoKTsKICAgIGludCBvcCA9 IHBhcnNlMzIoKTsKICAgIHByaW50ZigiZ290IGEgYmFja2NoYW5uZWwgcmVwbHksIHN0YXQgJWQg JWQsIG5vcHMgJWQgb3AxICVkXG4iLCBzdGF0MSwgc3RhdDIsIG5vcHMsIG9wKTsKICAgIC8vIHBy aW50ZigiZ290IGEgYmFja2NoYW5uZWwgcmVwbHlcbiIpOwogICAgcmV0dXJuOwogIH0KICBwYXJz ZTMyKCk7IC8vIHJwYyB2ZXJzaW9uCiAgaW50IHByb2dubyA9IHBhcnNlMzIoKTsgLy8gcHJvZyMK ICBpbnQgcHJvZ3ZlcnMgPSBwYXJzZTMyKCk7IC8vIHByb2cgdmVycwogIGludCBwcm9jID0gcGFy c2UzMigpOwogIGludCBjcmVkdHlwZSA9IHBhcnNlMzIoKTsgLy8gY3JlZCB0eXBlCiAgcGFyc2Vf b3BhcXVlKDApOyAvLyBjcmVkCiAgaW50IHZlcmZ0eXBlID0gcGFyc2UzMigpOyAvLyB2ZXJmIHR5 cGUKICBwYXJzZV9vcGFxdWUoMCk7IC8vIHZlcmYKCiAgcHV0MzIoeGlkKTsKICBwdXQzMigxKTsg Ly8gUkVQTFkKICBwdXQzMigwKTsgLy8gTVNHX0FDQ0VQVEVECiAgcHV0MzIoMCk7IC8vIG9wYXF1 ZV9hdXRoIGZsYXZvciA9IEFVVEhfTlVMTAogIHB1dDMyKDApOyAvLyBvcGFxdWVfYXV0aCBsZW5n dGgKICBwdXQzMigwKTsgLy8gU1VDQ0VTUwoKICBpZihwcm9jID09IDApewogICAgcGFyc2Vfbm9w KCk7CiAgfSBlbHNlIGlmKHByb2dubyA9PSAxMDAwMDMgJiYgcHJvYyA9PSAxKXsKICAgIHBhcnNl X2NvbXBvdW5kKCk7CiAgfSBlbHNlIHsKICAgIHByaW50ZigidW5rbm93biBycGMgcHJvZ25vPSVk IHByb2d2ZXJzPSVkIHByb2M9JWRcbiIsCiAgICAgICAgICAgcHJvZ25vLCBwcm9ndmVycywgcHJv Yyk7CiAgfQp9Cgp2b2lkCnB1dF9ycGNfaGVhZGVyKGludCBwcm9nLCBpbnQgcHJvYykKewogIGlu dCB4aWQgPSAxOwogIHB1dDMyKHhpZCsrKTsKICBwdXQzMigwKTsgLy8gbXR5cGU9Q0FMTAogIHB1 dDMyKDIpOyAvLyBycGMgdmVyc2lvbgogIHB1dDMyKHByb2cpOyAvLyBwcm9nICMgLS0gbmZzIHY0 IGNhbGxiYWNrCiAgcHV0MzIoMSk7IC8vIHByb2cgdmVycwogIHB1dDMyKHByb2MpOyAvLyBwcm9j CiAgaWYocHJvYyA9PSAwKXsKICAgIHB1dDMyKDApOyAvLyBjcmVkIHR5cGUKICAgIHB1dDMyKDAp OyAvLyBjcmVkIGxlbgogIH0gZWxzZSB7CiAgICBwdXQzMigxKTsgLy8gY3JlZCB0eXBlIEFVVEhf U1lTIC8gQVVUSF9VTklYCiAgICBwdXQzMigzMik7IC8vIGNyZWQgbGVuZ3RoCiAgICBwdXQzMigw KTsgLy8gc3RhbXAKICAgIHB1dF9vcGFxdWUoOSwgImxvY2FsaG9zdCIpOwogICAgcHV0MzIoNjU1 MzQpOyAvLyB1aWQKICAgIHB1dDMyKDY1NTM0KTsgLy8gZ2lkCiAgICBwdXQzMigwKTsgLy8gIyBn aWRzCiAgfQogIHB1dDMyKDApOyAvLyB2ZXJmIHR5cGUKICBwdXQzMigwKTsgLy8gdmVyZiBsZW4K fQoKdm9pZApzeXMoY29uc3QgY2hhciAqY21kKQp7CiAgdm9sYXRpbGUgaW50IHggPSBzeXN0ZW0o Y21kKTsKICAodm9pZCkgeDsKfQoKaW50Cm1haW4oKXsKCiAgaW50IHMgPSBzb2NrZXQoQUZfSU5F VCwgU09DS19TVFJFQU0sIDApOwogIHN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CiAgbWVtc2V0KCZz aW4sIDAsIHNpemVvZihzaW4pKTsKICBzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CiAgc2luLnNp bl9wb3J0ID0gaHRvbnMoMjA0OSk7CiAgaW50IHllcyA9IDE7CiAgc2V0c29ja29wdChzLCBTT0xf U09DS0VULCBTT19SRVVTRUFERFIsICZ5ZXMsIHNpemVvZih5ZXMpKTsKICBpZihiaW5kKHMsIChz dHJ1Y3Qgc29ja2FkZHIgKikmc2luLCBzaXplb2Yoc2luKSkgPCAwKXsKICAgIHBlcnJvcigiYmlu ZCIpOyBleGl0KDEpOwogIH0KICBsaXN0ZW4ocywgMTApOwogIHN5bmMoKTsKCiAgaW50IHBpZDEg PSBmb3JrKCk7CiAgaWYocGlkMSA9PSAwKXsKICAgIGNsb3NlKHMpOwogICAgc2xlZXAoMSk7CiAg ICBpZihzeXN0ZW0oImVjaG8gLW4gbW91bnQ6IDsgbW91bnQgLXQgbmZzNCAtbyB0cnVua2Rpc2Nv dmVyeSxub2xvY2ssbm9kZXYgMTI3LjAuMC4xOi90bXAgL21udCIpID09IDApewogICAgICBpZigw KXsKICAgICAgICBwcmludGYoInN0YXRmczogIik7IGZmbHVzaChzdGRvdXQpOwogICAgICAgIHN0 cnVjdCBzdGF0ZnMgc2I7CiAgICAgICAgaW50IHJldCA9IHN0YXRmcygiL21udC8uIiwgJnNiKTsK ICAgICAgICBpZihyZXQgPCAwKSBwZXJyb3IoInN0YXRmcyIpOwogICAgICAgIHN5cygiZWNobyAt biB1bW91bnQ6IDsgdW1vdW50IC9tbnQiKTsKICAgICAgfQogICAgICBpZigwKXsKICAgICAgICBw cmludGYoIm9wZW46XG4iKTsKICAgICAgICBpbnQgZmQgPSBvcGVuKCIvbW50IiwgMCk7CiAgICAg ICAgaWYoZmQgPCAwKSB7IHBlcnJvcigiL21udCIpOyBleGl0KDEpOyB9CiAgICAgICAgb2ZmX3Qg YmFzZSA9IDA7CiAgICAgICAgY2hhciBidWZbNDA5Nl07CiAgICAgICAgc3NpemVfdCByZXQ7CiAg ICAgICAgcHJpbnRmKCJnZXRkaXJlbnRyaWVzICMxOlxuIik7CiAgICAgICAgcmV0ID0gZ2V0ZGly ZW50cmllcyhmZCwgYnVmLCBzaXplb2YoYnVmKSwgJmJhc2UpOwogICAgICAgIGlmKHJldCA8IDAp IHBlcnJvcigiZ2V0ZGlyZW50cmllcyIpOwogICAgICAgIHByaW50ZigiZ2V0ZGlyZW50cmllcyAj MjpcbiIpOwogICAgICAgIHJldCA9IGdldGRpcmVudHJpZXMoZmQsIGJ1Ziwgc2l6ZW9mKGJ1Ziks ICZiYXNlKTsKICAgICAgICBpZihyZXQgPCAwKSBwZXJyb3IoImdldGRpcmVudHJpZXMiKTsKICAg ICAgICBwcmludGYoImNsb3NlOlxuIik7CiAgICAgICAgY2xvc2UoZmQpOwogICAgICAgIHN5cygi ZWNobyAtbiB1bW91bnQ6IDsgdW1vdW50IC9tbnQiKTsKICAgICAgfQogICAgICBpZigwKXsKICAg ICAgICBpbnQgZmQgPSBvcGVuKCIvbW50L3giLCAwKTsKICAgICAgICBwcmludGYoIm9wZW4gL21u dC94IC0+ICVkIGVycm5vICVkXG4iLCBmZCwgZXJybm8pOwogICAgICAgIGlmKGZkIDwgMCkgcGVy cm9yKCIvbW50L3giKTsKICAgICAgICBjbG9zZShmZCk7CiAgICAgIH0KICAgICAgaWYoMCl7CiAg ICAgICAgcHJpbnRmKCJjcmVhdGUgL21udC9uZXc6XG4iKTsKICAgICAgICBpbnQgZmQgPSBvcGVu KCIvbW50L25ldyIsIE9fUkRXUnxPX0NSRUFULCAwNjY2KTsKICAgICAgICBpZihmZCA8IDApIHBl cnJvcigiL21udC9uZXciKTsKICAgICAgICBwcmludGYoIndyaXRlIC9tbnQvbmV3OlxuIik7CiAg ICAgICAgaWYod3JpdGUoZmQsICJ4IiwgMSkgPCAwKSBwZXJyb3IoIndyaXRlIik7CiAgICAgICAg cHJpbnRmKCJmc3luYyAvbW50L25ldzpcbiIpOwogICAgICAgIGZzeW5jKGZkKTsKICAgICAgICBs c2VlayhmZCwgMEwsIDApOwogICAgICAgIGNoYXIgYnVmWzUxMl07CiAgICAgICAgcHJpbnRmKCJy ZWFkIC9tbnQvbmV3OlxuIik7CiAgICAgICAgdm9sYXRpbGUgaW50IGp1bmsgPSByZWFkKGZkLCBi dWYsIHNpemVvZihidWYpKTsKICAgICAgICAodm9pZCkganVuazsKICAgICAgICAvL21rZGlyKCIv bW50L25ldy9uZXduZXciLCAwNzc3KTsKICAgICAgICAvL2lmKHVubGluaygiL21udC9uZXciKSA8 IDApIHBlcnJvcigidW5saW5rIik7CiAgICAgICAgLy9jbG9zZShmZCk7CiAgICAgICAgcHJpbnRm KCJmbG9jayAvbW50L25ldzpcbiIpOwogICAgICAgIGlmKGZsb2NrKGZkLCBMT0NLX0VYKSA8IDAp IHBlcnJvcigiZmxvY2siKTsKICAgICAgICBwcmludGYoImNsb3NlIC9tbnQvbmV3OlxuIik7CiAg ICAgICAgY2xvc2UoZmQpOwogICAgICAgIHN5cygiZWNobyAtbiB1bW91bnQ6IDsgdW1vdW50IC9t bnQiKTsKICAgICAgfQogICAgICBpZigwKXsKICAgICAgICBwcmludGYoIm9wZW46XG4iKTsKICAg ICAgICBpbnQgZmQgPSBvcGVuKCIvbW50L3giLCBPX0NSRUFUfE9fUkRXUiwgMDY2Nik7CiAgICAg ICAgaWYoZmQgPCAwKSBwZXJyb3IoIm9wZW4iKTsKICAgICAgICBwcmludGYoImZsb2NrOlxuIik7 CiAgICAgICAgaWYoZmxvY2soZmQsIExPQ0tfRVgpIDwgMCkgcGVycm9yKCJmbG9jayIpOwogICAg ICAgIHByaW50ZigiY2xvc2U6XG4iKTsKICAgICAgICBjbG9zZShmZCk7CiAgICAgICAgc3lzKCJl Y2hvIC1uIHVtb3VudDogOyB1bW91bnQgL21udCIpOwogICAgICB9CiAgICAgIGlmKDApewogICAg ICAgIHByaW50ZigibWtkaXI6XG4iKTsKICAgICAgICBpbnQgcmV0ID0gbWtkaXIoIi9tbnQveCIs IDA3NzcpOwogICAgICAgIGlmKHJldCA8IDApIHBlcnJvcigibWtkaXIiKTsKICAgICAgICBwcmlu dGYoImNyZWF0OlxuIik7CiAgICAgICAgaW50IGZkID0gY3JlYXQoIi9tbnQveC9lIiwgMDY2Nik7 CiAgICAgICAgaWYoZmQgPCAwKSBwZXJyb3IoImNyZWF0Iik7CiAgICAgICAgY2xvc2UoZmQpOwog ICAgICAgIHByaW50Zigicm1kaXI6XG4iKTsKICAgICAgICBpZihybWRpcigiL21udC94IikgPCAw KQogICAgICAgICAgcGVycm9yKCJybWRpciIpOwogICAgICAgIHN5cygiZWNobyAtbiB1bW91bnQ6 IDsgdW1vdW50IC9tbnQiKTsKICAgICAgfQogICAgICBpZigwKXsKICAgICAgICBzeXMoIm5mczRf Z2V0ZmFjbCAvbW50L3ggPiAvZGV2L251bGwgMj4mMSIpOwogICAgICB9CiAgICAgIGlmKDApewog ICAgICAgIGludCBmZCA9IG9wZW4oIi9tbnQveCIsIE9fUkRXUnxPX0NSRUFULCAwNjY2KTsKICAg ICAgICBpZihmZCA8IDApIHBlcnJvcigib3BlbiAvbW50L3giKTsKICAgICAgICBjaGFyIGJ1Zlsz Ml07CiAgICAgICAgbWVtc2V0KGJ1ZiwgMSwgc2l6ZW9mKGJ1ZikpOwogICAgICAgIGlmKHdyaXRl KGZkLCBidWYsIHNpemVvZihidWYpKSA8IDApIHBlcnJvcigid3JpdGUiKTsKICAgICAgICBsc2Vl ayhmZCwgKG9mZl90KTAsIDApOwogICAgICAgIGludCBmZDIgPSBjcmVhdCgiL21udC9uZXduZXci LCAwNjY2KTsKICAgICAgICBpZihmZDIgPCAwKSBwZXJyb3IoImNyZWF0IC9tbnQvbmV3bmV3Iik7 CiAgICAgICAgb2ZmX3QgbzEgPSAwOwogICAgICAgIG9mZl90IG8yID0gMDsKICAgICAgICBwcmlu dGYoImNvcHk6XG4iKTsKICAgICAgICBpZihjb3B5X2ZpbGVfcmFuZ2UoZmQsICZvMSwgZmQyLCAm bzIsIDE2LCAwKSA8IDApIHBlcnJvcigiY29weV9maWxlX3JhbmdlIik7CiAgICAgICAgcHJpbnRm KCJjbG9zZTpcbiIpOwogICAgICAgIGZzeW5jKGZkKTsKICAgICAgICBjbG9zZShmZCk7CiAgICAg ICAgZnN5bmMoZmQyKTsKICAgICAgICBjbG9zZShmZDIpOwogICAgICAgIHN5cygiZWNobyAtbiB1 bW91bnQ6IDsgdW1vdW50IC9tbnQiKTsKICAgICAgfQogICAgICBpZigwKXsKICAgICAgICBzdHJ1 Y3Qgc3RhdCBzYjsKICAgICAgICBpbnQgcmV0ID0gc3RhdCgiL21udC94IiwgJnNiKTsKICAgICAg ICBwcmludGYoInN0YXQgL21udC94IHJldD0lZCB1aWQ9JWRcbiIsIHJldCwgc2Iuc3RfdWlkKTsK ICAgICAgfQogICAgICBpZigwKXsKICAgICAgICBzeXMoImVjaG8gLW4gbHM6IDsgbHMgLWwgL21u dCIpOwogICAgICAgIHN5cygiZWNobyAtbiBsczogOyBscyAtbCAvbW50Ly4gL21udC96Iik7CiAg ICAgICAgc3lzKCJlY2hvIC1uIGVjaG86IDsgZWNobyBoaSA+IC9tbnQveCIpOwogICAgICAgIHN5 cygiZWNobyAtbiBkZDogOyBkZCBpZj0vbW50L3kgb2Y9L2Rldi9udWxsIGJzPTUxMiBjb3VudD0x Iik7CiAgICAgICAgc3lzKCJlY2hvIC1uIHVtb3VudDogOyB1bW91bnQgL21udCIpOwogICAgICB9 CiAgICAgIGlmKDApewogICAgICAgIHN5cygiZWNobyAtbiBtdiB6IHk6IDsgbXYgLWYgL21udC96 IC9tbnQveSIpOwogICAgICAgIHN5cygiZWNobyAtbiBtdiB5IHo6IDsgbXYgLWYgL21udC96IC9t bnQveSIpOwogICAgICAgIHN5cygiZWNobyAtbiB1bW91bnQ6IDsgdW1vdW50IC9tbnQiKTsKICAg ICAgfQogICAgICBpZigwKXsKICAgICAgICBzeXMoImVjaG8gLW4gZWNobzogOyBlY2hvIGhpID4g L21udC94Iik7CiAgICAgICAgc3lzKCJlY2hvIC1uIHVtb3VudDogOyB1bW91bnQgL21udCIpOwog ICAgICB9CiAgICAgIGlmKDApewogICAgICAgIHN5cygiZWNobyAtbiBsczogOyBscyAtbCAvbW50 Iik7CiAgICAgICAgc3lzKCJlY2hvIC1uIHVtb3VudDogOyB1bW91bnQgL21udCIpOwogICAgICB9 CiAgICAgIGlmKDApewogICAgICAgIHByaW50Zigib3BlbiB4OlxuIik7CiAgICAgICAgaW50IGZk ID0gb3BlbigiL21udC94IiwgT19SRFdSKTsKICAgICAgICBpZihmZCA8IDApCiAgICAgICAgICBw ZXJyb3IoIi9tbnQveCIpOwogICAgICAgIHByaW50ZigibGlzdHhhdHRyOlxuIik7CiAgICAgICAg Y2hhciBidWZbMTI4XTsKICAgICAgICBpZihmbGlzdHhhdHRyKGZkLCBidWYsIHNpemVvZihidWYp KSA8IDApCiAgICAgICAgICBwZXJyb3IoImxpc3R4YXR0ciIpOwogICAgICAgIC8vIHN5c3RlbS5u ZnM0X2FjbAogICAgICAgIC8vIHN5c3RlbS5uZnM0X2RhY2wKICAgICAgICAvLyBzeXN0ZW0ubmZz NF9zYWNsCiAgICAgICAgcHJpbnRmKCJnZXR4YXR0cjpcbiIpOwogICAgICAgIGlmKGZnZXR4YXR0 cihmZCwgInN5c3RlbS5uZnM0X2FjbCIsIGJ1Ziwgc2l6ZW9mKGJ1ZikpIDwgMCkKICAgICAgICAg IHBlcnJvcigiZ2V0eGF0dHIiKTsKICAgICAgICBwcmludGYoImZzeW5jL2Nsb3NlOlxuIik7CiAg ICAgICAgZnN5bmMoZmQpOwogICAgICAgIGNsb3NlKGZkKTsKICAgICAgICBzeXMoImVjaG8gLW4g dW1vdW50OiA7IHVtb3VudCAvbW50Iik7CiAgICAgIH0KICAgICAgaWYoMCl7CiAgICAgICAgcHJp bnRmKCJvcGVuOlxuIik7CiAgICAgICAgaW50IGZkID0gb3BlbigiL21udC94IiwgMCk7CiAgICAg ICAgaWYoZmQgPCAwKSBwZXJyb3IoIm9wZW4iKTsKICAgICAgICBjaGFyIGJ1ZlsyMDQ4XTsKICAg ICAgICBwcmludGYoInJlYWQ6XG4iKTsKICAgICAgICBpbnQgbiA9IHJlYWQoZmQsIGJ1Ziwgc2l6 ZW9mKGJ1ZikpOwogICAgICAgIGlmKG4gPCAwKSBwZXJyb3IoInJlYWQiKTsKICAgICAgICBjbG9z ZShmZCk7CiAgICAgICAgc3lzKCJlY2hvIC1uIHVtb3VudDogOyB1bW91bnQgL21udCIpOwogICAg ICB9CiAgICAgIGlmKDApewogICAgICAgIHByaW50Zigib3BlbjpcbiIpOwogICAgICAgIGludCBm ZCA9IG9wZW4oIi9tbnQveCIsIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQywgMDY2Nik7CiAgICAg ICAgaWYoZmQgPCAwKSBwZXJyb3IoIm9wZW4iKTsKICAgICAgICBjaGFyIGJ1ZlsyMDQ4XTsKICAg ICAgICBwcmludGYoIndyaXRlOlxuIik7CiAgICAgICAgaW50IG4gPSB3cml0ZShmZCwgYnVmLCBz aXplb2YoYnVmKSk7CiAgICAgICAgaWYobiA8IDApIHBlcnJvcigid3JpdGUiKTsKICAgICAgICBj bG9zZShmZCk7CiAgICAgICAgc3lzKCJlY2hvIC1uIHVtb3VudDogOyB1bW91bnQgL21udCIpOwog ICAgICB9CiAgICAgIGlmKDApewogICAgICAgIHN5cygiZWNobyAtbiBjcDogOyBjcCAtLXJlZmxp bms9YWx3YXlzIC9tbnQveCAvbW50L3kiKTsKICAgICAgICBzeXMoImVjaG8gLW4gdW1vdW50OiA7 IHVtb3VudCAvbW50Iik7CiAgICAgIH0KICAgICAgaWYoMSl7CiAgICAgICAgcHJpbnRmKCJvcGVu OlxuIik7CiAgICAgICAgaW50IGZkID0gb3BlbigiL21udC90bXAiLCBPX1JET05MWSk7CiAgICAg ICAgaWYoZmQgPCAwKSBwZXJyb3IoIm9wZW4iKTsKICAgICAgICBwcmludGYoIm1rZGlyYXQ6XG4i KTsKICAgICAgICBpbnQgcmV0ID0gbWtkaXJhdChmZCwgInIiLCAwNzc3KTsKICAgICAgICBpZihy ZXQgPCAwKSBwZXJyb3IoIm1rZGlyYXQiKTsKICAgICAgICBwcmludGYoImNyZWF0OlxuIik7CiAg ICAgICAgaW50IGZkMSA9IGNyZWF0KCIvbW50L3RtcC9yL2UiLCAwNjY2KTsKICAgICAgICBpZihm ZCA8IDApIHBlcnJvcigiY3JlYXQiKTsKICAgICAgICBjbG9zZShmZDEpOwogICAgICAgIGNsb3Nl KGZkKTsKICAgICAgICBwcmludGYoInJtZGlyOlxuIik7CiAgICAgICAgaWYocm1kaXIoIi9tbnQv dG1wL3IiKSA8IDApCiAgICAgICAgICBwZXJyb3IoInJtZGlyIik7CiAgICAgICAgc3lzKCJlY2hv IC1uIHVtb3VudDogOyB1bW91bnQgL21udCIpOwogICAgICB9CiAgICB9CiAgICBleGl0KDApOwog IH0KCiAgaW50IHBpZDIgPSBmb3JrKCk7CiAgaWYocGlkMiA9PSAwKXsKCiAgICB3aGlsZSgxKXsK ICAgICAgc29ja2xlbl90IHNpbmxlbiA9IHNpemVvZihzaW4pOwogICAgICBwcmludGYoImNhbGxp bmcgYWNjZXB0XG4iKTsKICAgICAgaW50IHMxID0gYWNjZXB0KHMsIChzdHJ1Y3Qgc29ja2FkZHIg KikgJnNpbiwgJnNpbmxlbik7CiAgICAgIHByaW50ZigiYWNjZXB0IHJldHVybmVkICVkXG4iLCBz MSk7CiAgICAgIGlmKHMxIDwgMCkgeyBwZXJyb3IoImFjY2VwdCIpOyBleGl0KDEpOyB9CiAgICAg IAogICAgICB3aGlsZSgxKXsKICAgICAgICBpZihyZWFkbihzMSwgJmlsZW4sIDQpIDwgMCkgYnJl YWs7CiAgICAgICAgaWxlbiA9IG50b2hsKGlsZW4pOwogICAgICAgIGlsZW4gJj0gMHg3ZmZmZmZm ZjsKICAgICAgICBpZihyZWFkbihzMSwgaWJ1ZiwgaWxlbikgPCAwKSBicmVhazsKICAgICAgICBv aSA9IGlpID0gMDsKICAgICAgICBwdXQzMigwKTsgLy8gcGxhY2UtaG9sZGVyIGZvciBsZW5ndGgK ICAgICAgICBwYXJzZV9ycGMoKTsKICAgICAgICAqKGludCopKG9idWYrMCkgPSBodG9ubCgob2kg LSA0KSB8IDB4ODAwMDAwMDApOwogICAgICAgIGlmKG9pID4gMCl7CiAgICAgICAgICBpZih3cml0 ZShzMSwgb2J1Ziwgb2kpPD0wKSBwZXJyb3IoIndyaXRlIik7CiAgICAgICAgfQoKICAgICAgICBp ZihzZW5kX2JhY2spewogICAgICAgICAgc2VuZF9iYWNrID0gMDsKICAgICAgICAgIG9pID0gMDsK ICAgICAgICAgIHB1dDMyKDApOyAvLyBkdW1teSBsZW5ndGgKICAgICAgICAgIHB1dF9ycGNfaGVh ZGVyKDB4NDAwMDAwMDAsIDEpOwoKICAgICAgICAgIC8vIENCX0NPTVBPVU5ECiAgICAgICAgICBw dXRfb3BhcXVlKDAsICIiKTsgLy8gY29tcG91bmQgdGFnCiAgICAgICAgICBwdXQzMigyKTsgLy8g bWlub3IgdmVyc2lvbgogICAgICAgICAgcHV0MzIoMCk7IC8vIGNhbGxiYWNrX2lkZW50CiAgICAg ICAgICBwdXQzMigyKTsgLy8gb3BlcmF0aW9ucyBpbiB0aGUgY29tcG91bmQKCiAgICAgICAgICAv LyBDQl9TRVFVRU5DRQogICAgICAgICAgcHV0MzIoMTEpOwogICAgICAgICAgZm9yKGludCBpID0g MDsgaSA8IDQ7IGkrKykKICAgICAgICAgICAgcHV0MzIoMSk7IC8vIHNlc3Npb25pZAogICAgICAg ICAgcHV0MzIoMSk7IC8vIHNlcXVlbmNlaWQgPz8/CiAgICAgICAgICBwdXQzMigwKTsgLy8gc2xv dGlkCiAgICAgICAgICBwdXQzMigwKTsgLy8gaGlnaGVzdF9zbG90aWQKICAgICAgICAgIHB1dDMy KDApOyAvLyBjYWNoZXRoaXMKICAgICAgICAgIHB1dDMyKDApOyAvLyBjc2FfcmVmZXJyaW5nX2Nh bGxfbGlzdHM8PgogICAgICAgICAgCiAgICAgICAgICBpbnQgeG9pID0gb2k7CiAgICAgICAgICBm b3IoaW50IGkgPSAwOyBpIDwgMzI7IGkrKykKICAgICAgICAgICAgcHV0MzIoMHhmZmZmZmZmZik7 CiAgICAgICAgICAqKGludCopKG9idWYrMCkgPSBodG9ubCgob2kgLSA0KSB8IDB4ODAwMDAwMDAp OwogICAgICAgICAgaWYod3JpdGUoczEsIG9idWYsIG9pKTw9MCkgcGVycm9yKCJ3cml0ZSIpOwog ICAgICAgIH0KICAgICAgfQogICAgICBjbG9zZShzMSk7CiAgICB9CiAgICBleGl0KDEpOwogIH0K ICBjbG9zZShzKTsKICBzbGVlcCgxMCk7CiAga2lsbChwaWQxLCA5KTsKICBraWxsKHBpZDIsIDkp OwogIHNsZWVwKDEpOwp9Cg== --=-=-=--