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 06DA6C433EF for ; Wed, 5 Jan 2022 14:59:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241170AbiAEO7V (ORCPT ); Wed, 5 Jan 2022 09:59:21 -0500 Received: from outgoing-stata.csail.mit.edu ([128.30.2.210]:43680 "EHLO outgoing-stata.csail.mit.edu" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236073AbiAEO7T (ORCPT ); Wed, 5 Jan 2022 09:59:19 -0500 Received: from c-73-149-22-248.hsd1.ma.comcast.net ([73.149.22.248] helo=crash.local) by outgoing-stata.csail.mit.edu with esmtpsa (TLS1.2:DHE_RSA_AES_256_CBC_SHA256:256) (Exim 4.82) (envelope-from ) id 1n57ky-000F7V-Uz; Wed, 05 Jan 2022 09:59:17 -0500 Received: from crash.local (localhost [127.0.0.1]) by crash.local (Postfix) with ESMTP id 7FC3114529BC1; Wed, 5 Jan 2022 09:59:16 -0500 (EST) To: "J. Bruce Fields" , Chuck Lever cc: linux-nfs@vger.kernel.org From: rtm@csail.mit.edu Reply-To: rtm@csail.mit.edu Subject: nfsd v4 server can crash in COPY_NOTIFY MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Date: Wed, 05 Jan 2022 09:59:16 -0500 Message-ID: <7318.1641394756@crash.local> Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org --=-=-= Content-Type: text/plain If the special ONE stateid is passed to nfs4_preprocess_stateid_op(), it returns status=0 but does not set *cstid. nfsd4_copy_notify() depends on stid being set if status=0, and thus can crash if the client sends the right COPY_NOTIFY RPC. I've attached a demo. # uname -a Linux (none) 5.16.0-rc7-00108-g800829388818-dirty #28 SMP Wed Jan 5 14:40:37 UTC 2022 riscv64 riscv64 riscv64 GNU/Linux # cc nfsd_5.c # ./a.out ... [ 35.583265] Unable to handle kernel paging request at virtual address ffffffff00000008 [ 35.596916] status: 0000000200000121 badaddr: ffffffff00000008 cause: 000000000000000d [ 35.597781] [] nfs4_alloc_init_cpntf_state+0x94/0xdc [ 35.598576] [] nfsd4_copy_notify+0xf8/0x28e [ 35.599386] [] nfsd4_proc_compound+0x2b6/0x4ee [ 35.600166] [] nfsd_dispatch+0x118/0x174 [ 35.600840] [] svc_process_common+0x2f4/0x56c [ 35.601630] [] svc_process+0xc4/0x102 [ 35.602302] [] nfsd+0xfa/0x162 [ 35.602979] [] kthread+0x124/0x136 [ 35.603668] [] ret_from_exception+0x0/0xc [ 35.604667] ---[ end trace 69f12ad62072e251 ]--- --=-=-= Content-Type: application/octet-stream Content-Disposition: attachment; filename=nfsd_5.c Content-Transfer-Encoding: base64 I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5o PgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxz eXMvaW9jdGwuaD4KI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2luY2x1ZGUgPHN5cy93YWl0Lmg+ CiNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KI2luY2x1ZGUgPGFycGEvaW5ldC5oPgojaW5jbHVk ZSA8YXNzZXJ0Lmg+CgojZGVmaW5lIE5BQSAxMjgKdW5zaWduZWQgbG9uZyBsb25nIGFhW05BQV0g PSB7CjB4YzJmZmZmZmZ1bGwsCjB4MHVsbCwKMHhmY2ZmZmZmZjAwMDAwMDAwdWxsLAoweGZhZmZm ZmZmdWxsLAoweGM2ZmZmZmZmMDAwMDAwMDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4 MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgw dWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1 bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVs bCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxs LAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGws CjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwK MHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAow eDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4 MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgw dWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1 bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVs bCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxs LAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGws CjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwK MHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAow eDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4 MHVsbCwKMHgwdWxsLAoweDB1bGwsCjB4MHVsbCwKMHgwdWxsLAoweDB1bGwsCn07CmludCBhYWkg PSAwOwppbnQgc3ltc3RhcnQgPSAtMTsKCmNoYXIgb2J1ZlsxMDI0MF07CmludCBvaSA9IDA7Cgpp bnQgczsgLy8gc29ja2V0IGZkCmludCB4aWQgPSAxOwp1bnNpZ25lZCBsb25nIGxvbmcgY2xpZW50 aWQ7IC8vIHNlcnZlciB0ZWxscyB1cyBpbiBleGNoYW5nZV9pZCByZXBseQp1bnNpZ25lZCBpbnQg c2VxdWVuY2VpZDsKdW5zaWduZWQgaW50IHNsb3Qwc2VxdWVuY2VpZCA9IDE7CmNoYXIgc2Vzc2lv bmlkWzE2XTsKaW50IHN0YXRlaWRfc2VxaWQ7IC8vIGZyb20gbGFzdCByZWNlaXZlZCBzdGF0ZWlk NApjaGFyIHN0YXRlaWRfb3RoZXJbMTJdOyAvLyBmcm9tIGxhc3QgcmVjZWl2ZWQgc3RhdGVpZDQK aW50IHRtcF9maF9sZW47CmNoYXIgdG1wX2ZoWzI1Nl07Cgp2b2lkCnN5cyhjb25zdCBjaGFyICpj bWQpCnsKICB2b2xhdGlsZSBpbnQganVuayA9IHN5c3RlbShjbWQpOwogICh2b2lkKSBqdW5rOwp9 Cgp2b2lkIHB1dF9mYXR0cjRfb25lKCk7CnZvaWQgcHV0X2ZhdHRyNF9tYW55KCk7Cgp2b2lkCnB1 dDMyKHVuc2lnbmVkIGludCB4KQp7CiAgYXNzZXJ0KChvaSAlIDQpID09IDApOwogICooaW50Kiko b2J1ZitvaSkgPSBodG9ubCh4KTsKICBvaSArPSA0Owp9Cgp2b2lkCnB1dDY0KHVuc2lnbmVkIGxv bmcgbG9uZyB4KQp7CiAgcHV0MzIoeCA+PiAzMik7CiAgcHV0MzIoeCk7Cn0KCnZvaWQKcHV0X29w YXF1ZShpbnQgbiwgY29uc3QgY2hhciAqYnVmKQp7CiAgcHV0MzIobik7CiAgZm9yKGludCBpID0g MDsgaSA8IG47IGkrKykKICAgIG9idWZbb2krK10gPSAoYnVmID8gYnVmW2ldIDogMCk7CiAgd2hp bGUobiAmIDMpewogICAgb2J1ZltvaSsrXSA9IDA7CiAgICBuKys7CiAgfQp9Cgp2b2lkCnB1dF9v cGFxdWVfcmVwZWF0KGludCBuLCBjaGFyIGMpCnsKICBwdXQzMihuKTsKICBmb3IoaW50IGkgPSAw OyBpIDwgbjsgaSsrKQogICAgb2J1ZltvaSsrXSA9IGM7CiAgd2hpbGUoKG4lNCkhPTApewogICAg b2J1ZltvaSsrXSA9IDA7CiAgICBuKys7CiAgfQp9Cgp2b2lkCnB1dF9zZXNzaW9uaWQoY29uc3Qg Y2hhciAqc2lkKQp7CiAgZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspewogICAgb2J1ZltvaSsr XSA9IChzaWQgPyBzaWRbaV0gOiAwKTsKICB9Cn0KCnZvaWQKcHV0X3Jlc2V0KCkKewogIG9pID0g NDsgLy8gbGVhdmUgcm9vbSBmb3IgcGFja2V0IGxlbmd0aAp9Cgp2b2lkCnNlbmRfc2VuZCgpCnsK ICBhc3NlcnQob2kgPj0gNCk7CiAgYXNzZXJ0KChvaSAlIDQpID09IDApOwogIGFzc2VydChvaSA8 PSBzaXplb2Yob2J1ZikpOwogIGFzc2VydChhYWkgPD0gTkFBKTsKICBmb3IoaW50IGkgPSAwOyBp IDwgMTY7IGkrKykKICAgIHB1dDMyKDB4ZmZmZmZmZmYpOwogIGlmKHN5bXN0YXJ0ICE9IC0xKXsK ICAgIGZvcihpbnQgaSA9IHN5bXN0YXJ0OyBpIDwgb2kgJiYgYWFpIDwgTkFBOyBpICs9IDgpCiAg ICAgICoobG9uZyBsb25nICopKG9idWYgKyBpKSBePSBhYVthYWkrK107CiAgfQogICooaW50Kiko b2J1ZiswKSA9IGh0b25sKChvaSAtIDQpIHwgMHg4MDAwMDAwMCk7CiAgcHJpbnRmKCJ3cml0aW5n ICVkIHhpZCAlZFxuIiwgb2ksIG50b2hsKCooaW50Kikob2J1Zis0KSkpOwogIGlmKHdyaXRlKHMs IG9idWYsIG9pKSA8PSAwKSBwZXJyb3IoIndyaXRlIik7CiAgb2kgPSAwOwogIHN5bXN0YXJ0ID0g LTE7Cn0KCnZvaWQKcHV0X3JwY19oZWFkZXIoaW50IHByb2MpCnsKICBwdXRfcmVzZXQoKTsKICBw dXQzMih4aWQrKyk7CiAgcHV0MzIoMCk7IC8vIG10eXBlPUNBTEwKICBwdXQzMigyKTsgLy8gcnBj IHZlcnNpb24KICBwdXQzMigxMDAwMDMpOyAvLyBwcm9nICMKICBwdXQzMig0KTsgLy8gcHJvZyB2 ZXJzCiAgcHV0MzIocHJvYyk7IC8vIHByb2MKICBpZihwcm9jID09IDApewogICAgcHV0MzIoMCk7 IC8vIGNyZWQgdHlwZQogICAgcHV0MzIoMCk7IC8vIGNyZWQgbGVuCiAgfSBlbHNlIHsKICAgIHB1 dDMyKDEpOyAvLyBjcmVkIHR5cGUgQVVUSF9TWVMgLyBBVVRIX1VOSVgKICAgIHB1dDMyKDMyKTsg Ly8gY3JlZCBsZW5ndGgKICAgIHB1dDMyKDApOyAvLyBzdGFtcAogICAgcHV0X29wYXF1ZSg5LCAi bG9jYWxob3N0Iik7CiAgICBwdXQzMig2NTUzNCk7IC8vIHVpZAogICAgcHV0MzIoNjU1MzQpOyAv LyBnaWQKICAgIHB1dDMyKDApOyAvLyAjIGdpZHMKICB9CiAgcHV0MzIoMCk7IC8vIHZlcmYgdHlw ZQogIHB1dDMyKDApOyAvLyB2ZXJmIGxlbgp9Cgp2b2lkCnB1dF9jb21wb3VuZChpbnQgbikKewog IHB1dF9ycGNfaGVhZGVyKDEpOwoKICAvLyBjb21wb3VuZCBoZWFkZXIKICBwdXRfb3BhcXVlKDAs ICIiKTsgLy8gdGFnCiAgcHV0MzIoMik7IC8vIG1pbm9yIHZlcnNpb24KICBwdXQzMihuKTsgLy8g IyBvcGVyYXRpb25zIGluIHRoZSBjb21wb3VuZAp9CgovLyBtb3N0IENPTVBPVU5EcyBhcmUgcmVx dWlyZWQgdG8gc3RhcnQgd2l0aCBhIFNFUVVFTkNFLgp2b2lkCnB1dF9zZXF1ZW5jZSgpCnsKICBw dXQzMig1Myk7IC8vIFNFUVVFTkNFCiAgcHV0X3Nlc3Npb25pZChzZXNzaW9uaWQpOyAvLyBzZXNz aW9uaWQgKDE2IGJ5dGVzKQogIHB1dDMyKHNsb3Qwc2VxdWVuY2VpZCsrKTsgLy8gc2VxdWVuY2Vp ZCA/Pz8KICBwdXQzMigwKTsgLy8gc2xvdGlkCiAgcHV0MzIoMCk7IC8vIGhpZ2hlc3Rfc2xvdGlk CiAgcHV0MzIoMCk7IC8vIGNhY2hldGhpcwp9Cgp2b2lkCnB1dF9yZWNsYWltX2NvbXBsZXRlKCkK ewogIHB1dDMyKDU4KTsgLy8gUkVDTEFJTV9DT01QTEVURQogIHB1dDMyKDApOyAvLyAwIG1lYW5z IGdsb2JhbCwgMSBtZWFucyBqdXN0IGN1cnJlbnQgZmgKfQoKCmNoYXIgaWJ1ZlsxMDI0MF07Cmlu dCBpaTsKaW50IGlsZW47CgppbnQKcmVhZG4oaW50IGZkLCB2b2lkICp4YnVmLCBpbnQgbikKewog IGNoYXIgKmJ1ZiA9IChjaGFyICopIHhidWY7CiAgaW50IG9yaWcgPSBuOwogIHdoaWxlKG4gPiAw KXsKICAgIGludCBjYyA9IHJlYWQoZmQsIGJ1Ziwgbik7CiAgICBpZihjYyA8PSAwKSB7IHBlcnJv cigicmVhZCIpOyByZXR1cm4gLTE7IH0KICAgIG4gLT0gY2M7CiAgICBidWYgKz0gY2M7CiAgfQog IHJldHVybiBvcmlnOwp9Cgp1bnNpZ25lZCBpbnQKcGFyc2UzMigpCnsKICBpZihpaSA+PSBpbGVu KXsKICAgIHByaW50ZigicGFyc2VkIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBpbnB1dFxuIik7CiAg ICByZXR1cm4gMDsKICB9CiAgdW5zaWduZWQgaW50IHggPSAqKGludCopKGlidWYraWkpOwogIGlp ICs9IDQ7CiAgcmV0dXJuIG50b2hsKHgpOwp9Cgp1bnNpZ25lZCBsb25nIGxvbmcKcGFyc2U2NCgp CnsKICB1bnNpZ25lZCBsb25nIGxvbmcgaGkgPSBwYXJzZTMyKCk7CiAgdW5zaWduZWQgbG9uZyBs b25nIGxvID0gcGFyc2UzMigpOwogIHJldHVybiAoaGkgPDwgMzIpIHwgbG87Cn0KCi8vIHNlc3Np b25pZDQgLS0gMTYgYnl0ZXMKdm9pZApwYXJzZV9zZXNzaW9uaWQoY2hhciAqc2lkKQp7CiAgZm9y KGludCBpID0gMDsgaSA8IDE2OyBpKyspewogICAgaWYoc2lkKQogICAgICBzaWRbaV0gPSBpYnVm W2lpXTsKICAgIGlpKys7CiAgfQp9Cgp2b2lkCnB1dF9zaWQoY2hhciAqc2lkKQp7CiAgZm9yKGlu dCBpID0gMDsgaSA8IDE2OyBpKyspewogICAgb2J1ZltvaSsrXSA9IChzaWQgPyBzaWRbaV0gOiAw KTsKICB9Cn0KCi8vIHNlc3Npb25pZDQgLS0gMTYgYnl0ZXMKdm9pZApwYXJzZV9zaWQoY2hhciAq c2lkKQp7CiAgZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspewogICAgaWYoc2lkKQogICAgICBz aWRbaV0gPSBpYnVmW2lpXTsKICAgIGlpKys7CiAgfQp9Cgp1bnNpZ25lZCBpbnQKcGFyc2Vfb3Bh cXVlKGNoYXIgKmJ1ZikKewogIGlmKGJ1ZikKICAgIGJ1ZlswXSA9IDA7CiAgaW50IG5vbWluYWxf biA9IHBhcnNlMzIoKTsKICBpZihub21pbmFsX24gPiA0MDk2KXsKICAgIHByaW50ZigiY3Jhenkg b3BhcXVlIGxlbmd0aCAlZFxuIiwgbm9taW5hbF9uKTsKICAgIHJldHVybiAwOwogIH0KICBpbnQg cmVhbF9uID0gbm9taW5hbF9uOwogIHdoaWxlKChyZWFsX24lNCkgIT0gMCkgcmVhbF9uICs9IDE7 CiAgZm9yKGludCBpID0gMDsgaSA8IHJlYWxfbjsgaSsrKXsKICAgIGlmKGJ1ZiAmJiBpIDwgcmVh bF9uKQogICAgICBidWZbaV0gPSBpYnVmW2lpXTsKICAgIGlpKys7CiAgfQogIHJldHVybiBub21p bmFsX247Cn0KCnZvaWQKcGFyc2VfZXhjaGFuZ2VfaWRfcmVwbHkoKQp7CiAgaW50IHN0YXR1cyA9 IHBhcnNlMzIoKTsKICBpZihzdGF0dXMgIT0gMCkKICAgIHByaW50ZigiZXhjaGFuZ2VfaWQgcmVw bHkgc3RhdHVzICVkLCBub3QgMFxuIiwgc3RhdHVzKTsKICBjbGllbnRpZCA9IHBhcnNlNjQoKTsK ICBzZXF1ZW5jZWlkID0gcGFyc2UzMigpOwogIHByaW50ZigiZXhjaGFuZ2VfaWQgY2xpZW50aWQg MHglbGx4IHNlcXVlbmNlaWQgMHgleFxuIiwgY2xpZW50aWQsIHNlcXVlbmNlaWQpOwp9Cgp2b2lk CnBhcnNlX2NyZWF0ZV9zZXNzaW9uX3JlcGx5KCkKewogIGludCBzdGF0dXMgPSBwYXJzZTMyKCk7 CiAgaWYoc3RhdHVzICE9IDApCiAgICBwcmludGYoImNyZWF0ZV9zZXNzaW9uIHJlcGx5IHN0YXR1 cyAlZCwgbm90IDBcbiIsIHN0YXR1cyk7CiAgcGFyc2Vfc2Vzc2lvbmlkKHNlc3Npb25pZCk7Cn0K CnZvaWQKcGFyc2Vfc2VxdWVuY2VfcmVwbHkoKQp7CiAgaW50IHN0YXR1cyA9IHBhcnNlMzIoKTsK ICBpZihzdGF0dXMgIT0gMCkKICAgIHByaW50Zigic2VxdWVuY2UgcmVwbHkgc3RhdHVzICVkLCBu b3QgMFxuIiwgc3RhdHVzKTsKICBwYXJzZV9zZXNzaW9uaWQoMCk7CiAgcGFyc2UzMigpOyAvLyBz ZXF1ZW5jZWlkCiAgcGFyc2UzMigpOyAvLyBzbG90aWQKICBwYXJzZTMyKCk7IC8vIGhpZ2hlc3Rf c2xvdGlkCiAgcGFyc2UzMigpOyAvLyB0YXJnZXRfaGlnaGVzdF9zbG90aWQKICBwYXJzZTMyKCk7 IC8vIHN0YXR1c19mbGFncwp9Cgp2b2lkCnBhcnNlX3B1dHJvb3RmaF9yZXBseSgpCnsKICBpbnQg c3RhdHVzID0gcGFyc2UzMigpOwogIGlmKHN0YXR1cyAhPSAwKQogICAgcHJpbnRmKCJwdXRyb290 ZmhfcmVwbHkgc3RhdHVzICVkXG4iLCBzdGF0dXMpOwp9Cgp2b2lkCnBhcnNlX2xvb2t1cF9yZXBs eSgpCnsKICBpbnQgc3RhdHVzID0gcGFyc2UzMigpOwogIGlmKHN0YXR1cyAhPSAwKQogICAgcHJp bnRmKCJsb29rdXBfcmVwbHkgc3RhdHVzICVkXG4iLCBzdGF0dXMpOwp9Cgp2b2lkCnBhcnNlX3N0 YXRlaWQoKQp7CiAgc3RhdGVpZF9zZXFpZCA9IHBhcnNlMzIoKTsKICBmb3IoaW50IGkgPSAwOyBp IDwgMTI7IGkrKykKICAgIHN0YXRlaWRfb3RoZXJbaV0gPSBpYnVmW2lpKytdOwp9Cgp2b2lkCnBh cnNlX29wZW5fcmVwbHkoKQp7CiAgaW50IHN0YXR1cyA9IHBhcnNlMzIoKTsKICBpZihzdGF0dXMg IT0gMCl7CiAgICBwcmludGYoIm9wZW4gc3RhdHVzICVkXG4iLCBzdGF0dXMpOwogICAgcmV0dXJu OwogIH0KICBwYXJzZV9zdGF0ZWlkKCk7CiAgcGFyc2UzMigpOyAvLyBjaGFuZ2VfaW5mbyBhdG9t aWMKICBwYXJzZTY0KCk7IC8vIGNoYW5nZV9pbmZvIGJlZm9yZQogIHBhcnNlNjQoKTsgLy8gY2hh bmdlX2luZm8gYWZ0ZXIKICBwYXJzZTMyKCk7IC8vIHJmbGFncwogIHVuc2lnbmVkIGludCBiaXR3 b3JkcyA9IHBhcnNlMzIoKTsgLy8gYXR0cnNldAogIGZvcihpbnQgaSA9IDA7IGkgPCBiaXR3b3Jk czsgaSsrKQogICAgcGFyc2UzMigpOwogIGludCBkZWxlZ2F0aW9uX3R5cGUgPSBwYXJzZTMyKCk7 IC8vIG9wZW5fZGVsZWdhdGlvbjQKICBpZihkZWxlZ2F0aW9uX3R5cGUgPT0gMCl7CiAgICAvLyBP UEVOX0RFTEVHQVRFX05PTkUKICB9IGVsc2UgaWYoZGVsZWdhdGlvbl90eXBlID09IDEpewogICAg Ly8gT1BFTl9ERUxFR0FURV9SRUFECiAgICAvLyBvcGVuX3JlYWRfZGVsZWdhdGlvbjQKICAgIHBh cnNlMzIoKTsgLy8gc3RhdGVpZCBzZXFpZAogICAgcGFyc2UzMigpOyAvLyBvdGhlcgogICAgcGFy c2UzMigpOyAvLyBvdGhlcgogICAgcGFyc2UzMigpOyAvLyBvdGhlcgogICAgcGFyc2UzMigpOyAv LyByZWNhbGwKICAgIC8vIG5mc2FjZTQKICAgIHBhcnNlMzIoKTsgLy8gbmZzYWNlNCB0eXBlCiAg ICBwYXJzZTMyKCk7IC8vIG5mc2FjZTQgZmxhZwogICAgcGFyc2UzMigpOyAvLyBuZnNhY2U0IGFj Y2Vzc19tYXJrCiAgICBwYXJzZV9vcGFxdWUoMCk7IC8vIG5mc2FjZTQgd2hvCiAgfSBlbHNlIGlm KGRlbGVnYXRpb25fdHlwZSA9PSAyKXsKICAgIC8vIE9QRU5fREVMRUdBVEVfV1JJVEUKICAgIHBh cnNlMzIoKTsgLy8gc3RhdGVpZCBzZXFpZAogICAgcGFyc2UzMigpOyAvLyBvdGhlcgogICAgcGFy c2UzMigpOyAvLyBvdGhlcgogICAgcGFyc2UzMigpOyAvLyBvdGhlcgogICAgcGFyc2UzMigpOyAv LyByZWNhbGwKICAgIC8vIG5mc19zcGFjZV9saW1pdDQKICAgIGludCBsaW1pdGJ5ID0gcGFyc2Uz MigpOwogICAgaWYobGltaXRieSA9PSAxKXsKICAgICAgLy8gTkZTX0xJTUlUX1NJWkUKICAgICAg cGFyc2U2NCgpOyAvLyBmaWxlc2l6ZQogICAgfSBlbHNlIGlmKGxpbWl0YnkgPT0gMil7CiAgICAg IC8vIE5GU19MSU1JVF9CTE9DS1MKICAgICAgcGFyc2UzMigpOyAvLyBudW1fYmxvY2tzCiAgICAg IHBhcnNlMzIoKTsgLy8gYnl0ZXNfcGVyX2Jsb2NrCiAgICB9IGVsc2UgewogICAgICBwcmludGYo Im9wZW4gcmVwbHksIHVua25vd24gbGltaXRieSAlZFxuIiwgbGltaXRieSk7CiAgICB9CiAgICAv LyBuZnNhY2U0CiAgICBwYXJzZTMyKCk7IC8vIG5mc2FjZTQgdHlwZQogICAgcGFyc2UzMigpOyAv LyBuZnNhY2U0IGZsYWcKICAgIHBhcnNlMzIoKTsgLy8gbmZzYWNlNCBhY2Nlc3NfbWFyawogICAg cGFyc2Vfb3BhcXVlKDApOyAvLyBuZnNhY2U0IHdobwogIH0gZWxzZSB7CiAgICBwcmludGYoIkRJ RCBOT1QgdW5kZXJzdGFuZCBkZWxlZ2F0aW9uX3R5cGUgJWRcbiIsIGRlbGVnYXRpb25fdHlwZSk7 CiAgfQp9Cgp2b2lkCnBhcnNlX2NvbXBvdW5kX3JlcGx5KCkKewogIGludCBzdGF0ID0gcGFyc2Uz MigpOyAvLyBPSwogIHBhcnNlX29wYXF1ZSgwKTsKICBpbnQgbm9wcyA9IHBhcnNlMzIoKTsKICBw cmludGYoImNvbXBvdW5kIHJlcGx5LCBub3BzICVkLCBzdGF0ICVkIiwgbm9wcywgc3RhdCk7CiAg aWYoc3RhdCA+IDAgJiYgc3RhdCA8IDIwMCl7CiAgICBwcmludGYoIiAlcyIsIHN0cmVycm9yKHN0 YXQpKTsKICB9CiAgcHJpbnRmKCJcbiIpOwogIGZvcihpbnQgb3BpID0gMDsgb3BpIDwgbm9wcyAm JiBpaSA8IGlsZW47IG9waSsrKXsKICAgIGludCBvcCA9IHBhcnNlMzIoKTsKICAgIHByaW50Zigi cmVwbHkgZm9yIG9wICVkXG4iLCBvcCk7CiAgICBpZihvcCA9PSA1Myl7CiAgICAgIHBhcnNlX3Nl cXVlbmNlX3JlcGx5KCk7CiAgICB9IGVsc2UgaWYob3AgPT0gNDIpewogICAgICBwYXJzZV9leGNo YW5nZV9pZF9yZXBseSgpOwogICAgfSBlbHNlIGlmKG9wID09IDQzKXsKICAgICAgcGFyc2VfY3Jl YXRlX3Nlc3Npb25fcmVwbHkoKTsKICAgIH0gZWxzZSBpZihvcCA9PSAyNCl7CiAgICAgIHBhcnNl X3B1dHJvb3RmaF9yZXBseSgpOwogICAgfSBlbHNlIGlmKG9wID09IDE1KXsKICAgICAgcGFyc2Vf bG9va3VwX3JlcGx5KCk7CiAgICB9IGVsc2UgaWYob3AgPT0gMTgpewogICAgICBwYXJzZV9vcGVu X3JlcGx5KCk7CiAgICB9IGVsc2UgaWYob3AgPT0gMjYpewogICAgICBpbnQgc3RhdHVzID0gcGFy c2UzMigpOwogICAgICBwcmludGYoInJlYWRkaXIgc3RhdHVzICVkXG4iLCBzdGF0dXMpOwogICAg ICBpZihzdGF0dXMgPT0gMCl7CiAgICAgICAgbG9uZyBsb25nIHZlcmYgPSBwYXJzZTY0KCk7CiAg ICAgICAgaW50IG5lbnRyaWVzID0gcGFyc2UzMigpOwogICAgICAgIGxvbmcgbG9uZyBjb29raWUg PSBwYXJzZTY0KCk7CiAgICAgICAgY2hhciBuYW1lWzEwMjRdOwogICAgICAgIG1lbXNldChuYW1l LCAwLCBzaXplb2YobmFtZSkpOwogICAgICAgIHBhcnNlX29wYXF1ZShuYW1lKTsKICAgICAgICBw cmludGYoInZlcmYgJWxseCAqZW50cmllcyAlZCBjb29raWUgJWxseCBuYW1lICVzXG4iLCB2ZXJm LCBuZW50cmllcywgY29va2llLCBuYW1lKTsKICAgICAgfQogICAgICBicmVhazsKICAgIH0gZWxz ZSBpZihvcCA9PSAzNCl7CiAgICAgIGludCBzdGF0dXMgPSBwYXJzZTMyKCk7CiAgICAgIHByaW50 Zigic2V0YXR0ciBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CiAgICAgIGJyZWFrOwogICAgfSBlbHNl IGlmKG9wID09IDIyKXsKICAgICAgLy8gcHV0ZmgKICAgICAgaW50IHN0YXR1cyA9IHBhcnNlMzIo KTsKICAgICAgcHJpbnRmKCJwdXRmaCBzdGF0dXMgJWRcbiIsIHN0YXR1cyk7CiAgICB9IGVsc2Ug aWYob3AgPT0gMTApewogICAgICAvLyBnZXRmaAogICAgICBpbnQgc3RhdHVzID0gcGFyc2UzMigp OwogICAgICBpZihzdGF0dXMgPT0gMCl7CiAgICAgICAgaW50IHRtcF9maF9sZW4gPSBwYXJzZV9v cGFxdWUodG1wX2ZoKTsKICAgICAgICBwcmludGYoImdldGZoIGZoX2xlbiAlZFxuIiwgdG1wX2Zo X2xlbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnRmKCJnZXRmaCBzdGF0dXMgJWRcbiIs IHN0YXR1cyk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KfQoK dm9pZApwYXJzZV9jYWxsYmFjayhpbnQgeGlkKQp7CiAgcGFyc2UzMigpOyAvLyBycGMgdmVyc2lv bgogIHBhcnNlMzIoKTsgLy8gcHJvZyAjCiAgcGFyc2UzMigpOyAvLyBwcm9nIHZlcnMKICBpbnQg cHJvYyA9IHBhcnNlMzIoKTsgLy8gcHJvYwogIHBhcnNlMzIoKTsgLy8gYXV0aCBmbGF2b3IKICBw YXJzZV9vcGFxdWUoMCk7IC8vIGF1dGgKICBwYXJzZTMyKCk7IC8vIHZlcmYgZmxhdm9yCiAgcGFy c2Vfb3BhcXVlKDApOyAvLyB2ZXJmCiAgcHJpbnRmKCJjYWxsYmFjayBwcm9jPSVkXG4iLCBwcm9j KTsKCiAgb2kgPSAwOwogIHB1dDMyKDApOyAvLyBwbGFjZWhvbGRlcgogIHB1dDMyKHhpZCk7CiAg cHV0MzIoMSk7IC8vIFJFUExZCiAgcHV0MzIoMCk7IC8vIE1TR19BQ0NFUFRFRAogIHB1dDMyKDAp OyAvLyBvcGFxdWVfYXV0aCBmbGF2b3IgPSBBVVRIX05VTEwKICBwdXQzMigwKTsgLy8gb3BhcXVl X2F1dGggbGVuZ3RoCiAgcHV0MzIoMCk7IC8vIFNVQ0NFU1MKICBpbnQgeG9pID0gb2k7CiAgaWYo cHJvYyA9PSAwKXsKICAgIC8vIG5vcAogIH0gZWxzZSBpZihwcm9jID09IDEpewogICAgLy8gY29t cG91bmQKICAgIHBhcnNlX29wYXF1ZSgwKTsgLy8gdGFnCiAgICBwYXJzZTMyKCk7IC8vIG1pbm9y dmVyc2lvbgogICAgcGFyc2UzMigpOyAvLyBjYWxsYmFja19pZGVudAogICAgaW50IG5vcHMgPSBw YXJzZTMyKCk7CiAgICBwdXQzMigwKTsgLy8gc3RhdHVzCiAgICBwdXRfb3BhcXVlKDAsICIiKTsg Ly8gdGFnCiAgICBwdXQzMihub3BzKTsKICAgIGZvcihpbnQgb3BpID0gMDsgb3BpIDwgbm9wczsg b3BpKyspewogICAgICBpbnQgb3AgPSBwYXJzZTMyKCk7CiAgICAgIHhvaSA9IG9pOwogICAgICBw dXQzMihvcCk7CiAgICAgIGlmKG9wID09IDExKXsKICAgICAgICAvLyBDQl9TRVFVRU5DRQogICAg ICAgIGNoYXIgc2lkWzE2XTsKICAgICAgICBwYXJzZV9zaWQoc2lkKTsKICAgICAgICBpbnQgc2Vx ID0gcGFyc2UzMigpOyAvLyBzZXF1ZW5jZWlkCiAgICAgICAgaW50IHNsb3QgPSBwYXJzZTMyKCk7 IC8vIHNsb3RpZAogICAgICAgIGludCBoaXNsb3QgPSBwYXJzZTMyKCk7IC8vIGhpZ2hlc3Rfc2xv dGlkCiAgICAgICAgcGFyc2UzMigpOyAvLyBjYWNoZXRoaXMKICAgICAgICBpbnQgbnJjbCA9IHBh cnNlMzIoKTsgLy8gY3NhX3JlZmVycmluZ19jYWxsX2xpc3RzPD4KICAgICAgICBmb3IoaW50IHJj aSA9IDA7IHJjaSA8IG5yY2w7IHJjaSsrKXsKICAgICAgICAgIHBhcnNlMzIoKTsgLy8gc2Vzc2lv bmlkCiAgICAgICAgICBwYXJzZTMyKCk7CiAgICAgICAgICBwYXJzZTMyKCk7CiAgICAgICAgICBw YXJzZTMyKCk7CiAgICAgICAgICBpbnQgbnh4eCA9IHBhcnNlMzIoKTsgLy8gcmNsX3JlZmVycmlu Z19jYWxsczw+CiAgICAgICAgICBmb3IoaW50IHhpID0gMDsgeGkgPCBueHh4OyB4aSsrKXsKICAg ICAgICAgICAgcGFyc2UzMigpOyAvLyBzZXF1ZW5jZWlkCiAgICAgICAgICAgIHBhcnNlMzIoKTsg Ly8gc2xvdGlkCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHB1dF9zaWQoc2lkKTsKICAg ICAgICBwdXQzMihzZXEpOyAvLyBzZXF1ZW5jZWlkCiAgICAgICAgcHV0MzIoc2xvdCk7IC8vIHNs b3RpZAogICAgICAgIHB1dDMyKGhpc2xvdCk7IC8vIGhpZ2hlc3Rfc2xvdGlkCiAgICAgICAgcHV0 MzIoaGlzbG90KTsgLy8gdGFyZ2V0X2hpZ2hlc3Rfc2xvdGlkCiAgICAgIH0gZWxzZSBpZihvcCA9 PSA0KXsKICAgICAgICBwcmludGYoIkNCX1JFQ0FMTFxuIik7CiAgICAgICAgLy8gc3RhdGVpZDQK ICAgICAgICBwYXJzZTMyKCk7IC8vIHNlcWlkCiAgICAgICAgcGFyc2UzMigpOyAvLyBvdGhlcgog ICAgICAgIHBhcnNlMzIoKTsKICAgICAgICBwYXJzZTMyKCk7CiAgICAgICAgcGFyc2UzMigpOyAv LyB0cnVuY2F0ZQogICAgICAgIHBhcnNlX29wYXF1ZSgwKTsgLy8gZmgKICAgICAgICBwdXQzMigw KTsgLy8gT0sKICAgICAgfSBlbHNlIHsKICAgICAgICBwcmludGYoImNhbGxiYWNrIHVua25vd24g b3AgJWRcbiIsIG9wKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0gZWxzZSB7CiAg ICBwcmludGYoImNhbGxiYWNrOiB1bmtub3duIHByb2MgJWRcbiIsIHByb2MpOwogIH0KICBzZW5k X3NlbmQoKTsKfQoKdm9pZApwYXJzZV9yZXBseShpbnQgcHJvYykKewogIGludCBkZXNpcmVkX3hp ZCA9IHhpZCAtIDE7CiBhZ2FpbjoKICBpZihyZWFkbihzLCAmaWxlbiwgNCkgPCAwKQogICAgcmV0 dXJuOwogIGlsZW4gPSBudG9obChpbGVuKTsKICBpZigoaWxlbiAmIDB4ODAwMDAwMDApID09IDAp CiAgICBwcmludGYoImlsZW4gaXMgbWlzc2luZyAweDgwMDAwMDAwXG4iKTsKICBpbGVuICY9IDB4 N2ZmZmZmZmY7CiAgaWYoaWxlbiA+IHNpemVvZihpYnVmKSl7CiAgICBwcmludGYoImh1Z2UgcGFj a2V0ICVkXG4iLCBpbGVuKTsKICAgIHJldHVybjsKICB9CiAgaWYocmVhZG4ocywgaWJ1ZiwgaWxl bikgPCAwKQogICAgcmV0dXJuOwogIGlpID0gMDsKICBpbnQgeHhpZCA9IHBhcnNlMzIoKTsgLy8g eGlkCiAgaW50IG10eXBlID0gcGFyc2UzMigpOyAvLyAxID0gUkVQTFkKICBpZihtdHlwZSA9PSAw KXsKICAgIC8vIENBTEwgLS0gYSBjYWxsYmFjawogICAgcGFyc2VfY2FsbGJhY2soeHhpZCk7CiAg ICBnb3RvIGFnYWluOwogIH0KICBpZih4eGlkICE9IGRlc2lyZWRfeGlkKXsKICAgIHByaW50Zigi eGlkIG1pc21hdGNoLCB3YW50ZWQgMHgleCwgZ290IDB4JXgsIGlsZW4gJWQsIGlpICVkXG4iLCBk ZXNpcmVkX3hpZCwgeHhpZCwgaWxlbiwgaWkpOwogIH0KICBpZihtdHlwZSAhPSAxKQogICAgcHJp bnRmKCJ1bmV4cGVjdGVkIG10eXBlICVkLCBleHBlY3RlZCAxIC8gUkVQTFlcbiIsIG10eXBlKTsK ICBpbnQgc3RhdCA9IHBhcnNlMzIoKTsgLy8gTVNHX0FDQ0VQVEVECiAgaWYoc3RhdCAhPSAwKQog ICAgcHJpbnRmKCJ1bmV4cGVjdGVkIHJlcGx5IHN0YXQgJWQsIGV4cGVjdGVkIDAgLyBNU0dfQUND RVBURURcbiIsIHN0YXQpOwogIGludCBmbGF2b3IgPSBwYXJzZTMyKCk7IC8vIGF1dGggZmxhdm9y CiAgaWYoZmxhdm9yICE9IDApCiAgICBwcmludGYoInVuZXhwZWN0ZWQgYXV0aF9mbGF2b3IgJWQs IGV4cGVjdGluZyAwIC8gQVVUSF9OT05FXG4iLCBmbGF2b3IpOwogIHBhcnNlX29wYXF1ZSgwKTsg Ly8gdmVyZgogIHN0YXQgPSBwYXJzZTMyKCk7IC8vIFNVQ0NFU1MKICBpZihzdGF0ICE9IDApCiAg ICBwcmludGYoInVuZXhwZWN0ZWQgc3RhdCAlZCwgZXhwZWN0ZWQgMCAvIFNVQ0NFU1NcbiIsIHN0 YXQpOwoKICBpZihwcm9jID09IDApewogICAgcHJpbnRmKCJnb3QgcmVwbHkgZm9yIHByb2MgJWRc biIsIHByb2MpOwogIH0gZWxzZSBpZihwcm9jID09IDEpewogICAgcGFyc2VfY29tcG91bmRfcmVw bHkoKTsKICB9IGVsc2UgewogICAgcHJpbnRmKCJnb3QgdW5leHBlY3RlZCByZXBseSBmb3IgcHJv YyAlZCB4aWQgJWRcbiIsIHByb2MsIHh4aWQpOwogIH0KfQoKdm9pZApzZW5kX25vcCgpCnsKICBw dXRfcnBjX2hlYWRlcigwKTsKICBzZW5kX3NlbmQoKTsKICBwYXJzZV9yZXBseSgwKTsKfQoKdm9p ZApzZW5kX2V4Y2hhbmdlX2lkKGludCBkb3N5bSkKewogIHB1dF9jb21wb3VuZCgxKTsKICBpZihk b3N5bSAmJiBzeW1zdGFydCA9PSAtMSkKICAgIHN5bXN0YXJ0ID0gb2k7CiAgcHV0MzIoNDIpOyAv LyBvcGVyYXRpb24gNDI6IEVYQ0hBTkdFX0lECiAgaW50IGNvX3ZlcmlmaWVyID0gMTsKI2lmICFT WU0KICBjb192ZXJpZmllciA9IGdldHBpZCgpOyAvLyBuZWVkcyB0byBiZSB1bmlxdWUKI2VuZGlm CiAgcHV0NjQoY29fdmVyaWZpZXIpOyAvLyB2ZXJpZmllcjQKICBwdXRfb3BhcXVlKDIyLCAiTGlu dXggTkZTdjQuMiB4eXp6eSIpOyAvLyBjb19vd25lcmlkCiAgcHV0MzIoMHgxMDMpOyAgLy8gZmxh Z3MKICBwdXQzMigwKTsgLy8gU1A0X05PTkUKICBwdXQzMigxKTsgLy8gbGVuZ3RoIG9mIGNsaWVu dF9pbXBsX2lkCiAgcHV0X29wYXF1ZSgxMCwgImtlcm5lbC5vcmciKTsgLy8gbmlpX2RvbWFpbgog IHB1dF9vcGFxdWUoNCwgImJsYWgiKTsgLy8gbmlpX25hbWUKICBwdXQ2NCgwKTsgLy8gbmZzdGlt ZTQKICBwdXQzMigwKTsgLy8gbmZzdGltZTQKICBzZW5kX3NlbmQoKTsKICBwYXJzZV9yZXBseSgx KTsKfQoKdm9pZApzZW5kX2V4Y2hhbmdlX2lkX3N5bSgpCnsKICBwdXRfY29tcG91bmQoMSk7CiAg cHV0MzIoNDIpOyAvLyBvcGVyYXRpb24gNDI6IEVYQ0hBTkdFX0lECiAgcHV0NjQoMSk7IC8vIHZl cmlmaWVyNAogIHB1dF9vcGFxdWUoMjIsICJMaW51eCBORlN2NC4yIHh5enp5Iik7IC8vIGNvX293 bmVyaWQKICBwdXQzMigweDEwMyBeIGFhW2FhaSsrXSk7ICAvLyBmbGFncwogIHVuc2lnbmVkIGlu dCBob3cgPSBhYVthYWkrK107CiAgcHV0MzIoaG93KTsKICBpbnQgeG9pID0gb2k7CiAgaWYoaG93 ID09IDApeyAvLyBTUDRfTk9ORQogIH0gZWxzZSBpZihob3cgPT0gMSl7IC8vIFNQNF9NQUNIX0NS RUQKICAgIHB1dDMyKDMpOwogICAgcHV0MzIoMHhmZmZmZmZmZik7CiAgICBwdXQzMigweGZmZmZm ZmZmKTsKICAgIHB1dDMyKDB4ZmZmZmZmZmYpOwogICAgcHV0MzIoMyk7CiAgICBwdXQzMigweGZm ZmZmZmZmKTsKICAgIHB1dDMyKDB4ZmZmZmZmZmYpOwogICAgcHV0MzIoMHhmZmZmZmZmZik7CiAg fSBlbHNlIGlmKGhvdyA9PSAyKXsgLy8gU1A0X1NTVgogICAgLy8gc3NwX29wcwogICAgcHV0MzIo Myk7CiAgICBwdXQzMigweGZmZmZmZmZmKTsKICAgIHB1dDMyKDB4ZmZmZmZmZmYpOwogICAgcHV0 MzIoMHhmZmZmZmZmZik7CiAgICAvLyBzc3BfaGFzaF9hbGdzPD4KICAgIHB1dDMyKDIpOwogICAg cHV0X29wYXF1ZSg4LCAiMTIzNDU2NzgiKTsKICAgIHB1dF9vcGFxdWUoOCwgIjFiY2RlZmdoIik7 CiAgICAvLyBzc3BfZW5jcl9hbGdzPD4KICAgIHB1dDMyKDIpOwogICAgcHV0X29wYXF1ZSg4LCAi MTIzNDU2NzgiKTsKICAgIHB1dF9vcGFxdWUoOCwgIjFiY2RlZmdoIik7CiAgICBwdXQzMig5OSk7 IC8vIHNzcF93aW5kb3cKICAgIHB1dDMyKDk5KTsgLy8gc3NwX251bV9nc3NfaGFuZGxlcwogIH0K ICB1bnNpZ25lZCBpbnQgbiA9IGFhW2FhaSsrXTsKICBpZihuID4gMjApIG4gPSAyMDsKICBwdXQz MihuKTsgLy8gbGVuZ3RoIG9mIGNsaWVudF9pbXBsX2lkCiAgZm9yKGludCBpID0geG9pOyBpIDwg b2kgJiYgYWFpIDwgTkFBOyBpICs9IDgpCiAgICAqKGxvbmcgbG9uZyAqKShvYnVmK2kpIF49IGFh W2FhaSsrXTsKICBmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKXsKICAgIHB1dF9vcGFxdWVfcmVw ZWF0KGFhW2FhaSsrXSAmIDB4ZmYsICd4Jyk7IC8vIG5paV9kb21haW4KICAgIHB1dF9vcGFxdWVf cmVwZWF0KGFhW2FhaSsrXSAmIDB4ZmYsICd5Jyk7IC8vIG5paV9uYW1lCiAgICBwdXQ2NCgwKTsg Ly8gbmZzdGltZTQKICAgIHB1dDMyKDApOyAvLyBuZnN0aW1lNAogIH0KICBzZW5kX3NlbmQoKTsK ICBwYXJzZV9yZXBseSgxKTsKfQoKdm9pZApzZW5kX2NyZWF0ZV9zZXNzaW9uKGludCBkb3N5bSkK ewogIHB1dF9jb21wb3VuZCgxKTsKICBwdXQzMig0Myk7IC8vIENSRUFURV9TRVNTSU9OCiAgcHV0 NjQoY2xpZW50aWQpOwogIHB1dDMyKHNlcXVlbmNlaWQrKyk7CiAgaWYoZG9zeW0gJiYgc3ltc3Rh cnQgPT0gLTEpCiAgICBzeW1zdGFydCA9IG9pOwogIHB1dDMyKDMpOyAvLyBmbGFncywgMT1GTEFH X1BFUlNJU1QsIDI9Q09OTl9CQUNLX0NIQU4KICAvLyBjc2FfZm9yZV9jaGFuX2F0dHJzLCBjc2Ff YmFja19jaGFuX2F0dHJzCiAgZm9yKGludCBpID0gMDsgaSA8IDI7IGkrKyl7CiAgICBwdXQzMigw KTsgLy8gaGVhZGVycGFkc2l6ZQogICAgcHV0MzIoNDA5Nik7IC8vIG1heHJlcXVlc3RzaXplCiAg ICBwdXQzMig0MDk2KTsgLy8gbWF4cmVzcG9uc2VzaXplCiAgICBwdXQzMig0MDk2KTsgLy8gbWF4 cmVzcG9uc2VzaXplX2NhY2hlZAogICAgcHV0MzIoOCk7IC8vIG1heG9wZXJhdGlvbnMKICAgIHB1 dDMyKDE2KTsgLy8gbWF4cmVxdWVzdHMKICAgIHB1dDMyKDApOyAvLyBjYV9yZG1hX2lyZDw+CiAg fQogIHB1dDMyKDB4NDAwMDAwMDApOyAvLyBjc2FfY2JfcHJvZ3JhbQogIHB1dDMyKDEpOyAvLyBs ZW5ndGggb2YgY3NhX3NlY19wYXJtcwojaWYgMAogIHB1dDMyKDApOyAvLyBBVVRIX05PTkUKI2Vs c2UKICBwdXQzMigxKTsgLy8gZmxhdm9yIEFVVEhfU1lTCiAgcHV0MzIoMCk7IC8vIHN0YW1wCiAg cHV0X29wYXF1ZSg5LCAibG9jYWxob3N0Iik7CiAgcHV0MzIoNjU1MzQpOyAvLyB1aWQKICBwdXQz Mig2NTUzNCk7IC8vIGdpZAogIHB1dDMyKDApOyAvLyAjIGdpZHMKI2VuZGlmCiAgc2VuZF9zZW5k KCk7CiAgcGFyc2VfcmVwbHkoMSk7Cn0KCnZvaWQKc2VuZF9zZXF1ZW5jZSgpCnsKICBwdXRfY29t cG91bmQoMSk7CiAgcHV0X3NlcXVlbmNlKCk7CiAgc2VuZF9zZW5kKCk7CiAgcGFyc2VfcmVwbHko MSk7Cn0KCnZvaWQKc2VuZF9yZWNsYWltX2NvbXBsZXRlKCkKewogIHB1dF9jb21wb3VuZCgyKTsK ICBwdXRfc2VxdWVuY2UoKTsKICBwdXRfcmVjbGFpbV9jb21wbGV0ZSgpOwogIHNlbmRfc2VuZCgp OwogIHBhcnNlX3JlcGx5KDEpOwp9Cgp2b2lkCnB1dF9yb290ZmgoKQp7CiAgcHV0MzIoMjQpOwp9 Cgp2b2lkCnB1dF9vcGVuX2V4aXN0aW5nKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc2hhcmUp CnsKICBwdXQzMigxOCk7CiAgcHV0MzIoMCk7IC8vIHNlcWlkCiAgcHV0MzIoc2hhcmUpOyAvLyBz aGFyZV9hY2Nlc3MgMT1SRUFEIDM9Qk9USAogIHB1dDMyKDApOyAvLyBzaGFyZV9kZW55CiAgcHV0 NjQoY2xpZW50aWQpOyAvLyBvd25lcgogIHB1dF9vcGFxdWUoMjIsICJMaW51eCBORlN2NC4yIHh5 enp5Iik7IC8vIG93bmVyCiAgcHV0MzIoMCk7IC8vIG9wZW5ob3cgT1BFTjRfTk9DUkVBVEUKICBw dXQzMigwKTsgLy8gQ0xBSU1fTlVMTAogIHB1dF9vcGFxdWUoc3RybGVuKGZpbGVuYW1lKSwgZmls ZW5hbWUpOwp9Cgp2b2lkCnB1dF9vcGVuX2NyZWF0ZShjaGFyICpuYW1lLCBpbnQgZG9zeW0pCnsK ICBwdXQzMigxOCk7CiAgcHV0MzIoMCk7IC8vIHNlcWlkCiAgcHV0MzIoMyk7IC8vIHNoYXJlX2Fj Y2VzcyBCT1RICiAgcHV0MzIoMCk7IC8vIHNoYXJlX2RlbnkKICBwdXQ2NChjbGllbnRpZCk7IC8v IG93bmVyCiAgcHV0X29wYXF1ZSgyMiwgIkxpbnV4IE5GU3Y0LjIgeHl6enkiKTsgLy8gb3duZXIK ICBwdXQzMigxKTsgLy8gb3BlbmhvdyBPUEVONF9DUkVBVEUKICB1bnNpZ25lZCBpbnQgbW9kZSA9 IDA7IC8vIFVOQ0hFQ0tFRDQKICBpZihkb3N5bSkKICAgIG1vZGUgXj0gYWFbYWFpKytdOwogIHB1 dDMyKG1vZGUpOwogIGlmKG1vZGUgPT0gMiB8fCBtb2RlID09IDMpewogICAgcHV0NjQoMCk7IC8v IHZlcmlmaWVyCiAgfQogIGlmKG1vZGUgIT0gMil7CiAgICBpZihkb3N5bSl7CiAgICAgIC8vcHV0 X2ZhdHRyNF9vbmUoKTsKICAgICAgcHV0MzIoMik7CiAgICAgIHB1dDY0KGFhW2FhaSsrXSk7CiAg ICAgIHB1dDMyKDE2KjgpOwogICAgICBmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKICAgICAg ICBwdXQ2NChhYVthYWkrK10pOwogICAgfSBlbHNlIHsKICAgICAgcHV0MzIoMik7IC8vIGF0dHIg Yml0bWFwIGxlbmd0aAogICAgICBwdXQzMigxNik7IC8vIGF0dHIgYml0cwogICAgICBwdXQzMigy KTsgLy8gYXR0ciBiaXRzCiAgICAgIHB1dDMyKDEyKTsgLy8gYXR0ciBsZW4KICAgICAgcHV0MzIo MCk7CiAgICAgIHB1dDMyKDApOwogICAgICBwdXQzMig0MjApOwogICAgfQogIH0KICB1bnNpZ25l ZCBpbnQgY2xhaW1fdHlwZSA9IDA7IC8vIENMQUlNX05VTEwKICBpZihkb3N5bSkKICAgIGNsYWlt X3R5cGUgXj0gYWFbYWFpKytdOwogIHB1dDMyKGNsYWltX3R5cGUpOwogIHsKICAgIGNoYXIgZmZb MjU2XTsKICAgIHNwcmludGYoZmYsICIvdG1wLyVzIiwgbmFtZSk7CiAgICB1bmxpbmsoZmYpOwog IH0KICBpZihjbGFpbV90eXBlID09IDAgfHwgY2xhaW1fdHlwZSA9PSAzKXsKICAgIHB1dF9vcGFx dWUoc3RybGVuKG5hbWUpLCBuYW1lKTsKICB9IGVsc2UgaWYoY2xhaW1fdHlwZSA9PSAxKXsgLy8g Q0xBSU1fUFJFVklPVVMKICAgIHB1dDMyKGFhW2FhaSsrXSk7CiAgfSBlbHNlIGlmKGNsYWltX3R5 cGUgPT0gMil7IC8vIENMQUlNX0RFTEVHQVRFX0NVUgogICAgLy8gc3RhdGVpZDQKICAgIHB1dDMy KHN0YXRlaWRfc2VxaWQpOyAvLyBvcGVuX3N0YXRlaWQsIGZyb20gcHJldmlvdXMgT1BFTgogICAg Zm9yKGludCBpID0gMDsgaSA8IDEyOyBpKyspCiAgICAgIG9idWZbb2krK10gPSBzdGF0ZWlkX290 aGVyW2ldOwogICAgcHV0X29wYXF1ZShzdHJsZW4obmFtZSksIG5hbWUpOwogIH0gZWxzZSBpZihj bGFpbV90eXBlID09IDQpeyAvLyBDTEFJTV9GSAogIH0gZWxzZSBpZihjbGFpbV90eXBlID09IDUp eyAvLyBDVVJfRkgKICAgIHB1dDMyKHN0YXRlaWRfc2VxaWQpOyAvLyBvcGVuX3N0YXRlaWQsIGZy b20gcHJldmlvdXMgT1BFTgogICAgZm9yKGludCBpID0gMDsgaSA8IDEyOyBpKyspCiAgICAgIG9i dWZbb2krK10gPSBzdGF0ZWlkX290aGVyW2ldOwogIH0gZWxzZSBpZihjbGFpbV90eXBlID09IDYp eyAvLyBQUkVWX0ZICiAgfQp9Cgp2b2lkCnB1dF9yZWFkZGlyKGludCBkb3N5bSkKewogIHB1dDMy KDI2KTsKICBpZihkb3N5bSAmJiBzeW1zdGFydCA9PSAtMSkKICAgIHN5bXN0YXJ0ID0gb2k7CiAg cHV0NjQoMCk7IC8vIGNvb2tpZQogIHB1dDY0KDApOyAvLyBjb29raWV2ZXJmCiAgcHV0MzIoNTEy KTsgLy8gZGlyY291bnQgKGJ5dGVzKQogIHB1dDMyKDUxMik7IC8vIG1heGNvdW50IChieXRlcykK ICAvLyBiaXRtYXAKICBwdXQzMig0KTsKICBwdXQzMigweDAwMTgwOTFhKTsKICBwdXQzMigweDAw YjBhMjNhKTsKICBwdXQzMigwKTsKICBwdXQzMigwKTsKfQoKdm9pZApwdXRfbG9va3VwKGNvbnN0 IGNoYXIgKm5hbWUpCnsKICBwdXQzMigxNSk7CiAgcHV0X29wYXF1ZShzdHJsZW4obmFtZSksIG5h bWUpOwp9CgovLwovLyBnZW5lcmF0ZXMgYSBmYXR0cjQgKGJpdG1hcDQgdGhlbiBhdHRybGlzdDQp LgovLwp2b2lkCnB1dF9mYXR0cjQoaW50IHh3b3Jkc1tdLCBpbnQgZmgpCnsKICBpbnQgd29yZHNb M107CiAgZm9yKGludCBpID0gMDsgaSA8IDM7IGkrKyl7CiAgICB3b3Jkc1tpXSA9IHh3b3Jkc1tp XTsKICB9CiAgaW50IGJpdHdvcmRzID0gMzsKICBwdXQzMihiaXR3b3Jkcyk7CiAgaW50IHdvcmQw aSA9IG9pOwogIGZvcihpbnQgaSA9IDA7IGkgPCBiaXR3b3JkczsgaSsrKQogICAgcHV0MzIod29y ZHNbaV0pOwogIGludCBsZW5pID0gb2k7CiAgcHV0MzIoMCk7IC8vIHBsYWNlaG9sZGVyIGZvciB0 b3RhbCBsZW5ndGggb2YgYXR0cnMKICBmb3IoaW50IGEgPSAwOyBhIDwgYml0d29yZHMqMzI7IGEr Kyl7CiAgICBpZih3b3Jkc1thLzMyXSAmICgxIDw8IChhICUgMzIpKSl7CiAgICAgIGludCB4b2kg PSBvaTsKICAgICAgaWYoYSA9PSAwKXsKICAgICAgICBwdXQzMigyKTsgLy8gIyBiaXRtYXAgd29y ZHMgb2Ygc3VwcG9ydGVkIGF0dHJzCiAgICAgICAgcHV0MzIoMHhmZmZmZmZmZik7CiAgICAgICAg cHV0MzIoMHhmZmZmZmZmZik7CiAgICAgIH0gZWxzZSBpZihhID09IDEpewogICAgICAgIGludCB0 eXBlID0gMTsKICAgICAgICBpZihmaCA9PSAwIHx8IGZoID09IDEpCiAgICAgICAgICB0eXBlID0g MjsKICAgICAgICBwdXQzMih0eXBlKTsgLy8gTkY0RElSPTIgb3IgTkY0UkVHPTEKICAgICAgfSBl bHNlIGlmKGEgPT0gMil7CiAgICAgICAgcHV0MzIoMCk7IC8vIGZoX2V4cGlyZV90eXBlCiAgICAg IH0gZWxzZSBpZihhID09IDMpewogICAgICAgIHB1dDY0KDApOyAvLyBjaGFuZ2UKICAgICAgfSBl bHNlIGlmKGEgPT0gNCl7CiAgICAgICAgcHV0NjQoNDA5NioxMCk7IC8vIHNpemUKICAgICAgfSBl bHNlIGlmKGEgPT0gNSl7CiAgICAgICAgcHV0MzIoMSk7IC8vIGxpbmsgc3VwcG9ydAogICAgICB9 IGVsc2UgaWYoYSA9PSA2KXsKICAgICAgICBwdXQzMigxKTsgLy8gc3ltbGluayBzdXBwb3J0CiAg ICAgIH0gZWxzZSBpZihhID09IDgpewogICAgICAgIHB1dDY0KDEpOyAvLyBmc2lkIG1ham9yCiAg ICAgICAgcHV0NjQoMSk7IC8vIGZzaWQgbWlub3IKICAgICAgfSBlbHNlIGlmKGEgPT0gMTApewog ICAgICAgIHB1dDMyKDEpOyAvLyBsZWFzZSB0aW1lCiAgICAgIH0gZWxzZSBpZihhID09IDExKXsK ICAgICAgICBwdXQzMigwKTsgLy8gcmRhdHRyX2Vycm9yCiAgICAgIH0gZWxzZSBpZihhID09IDEy KXsKICAgICAgICAvLyBBQ0wKICAgICAgICBpbnQgbiA9IDI7CiAgICAgICAgcHV0MzIobik7CiAg ICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKyl7CiAgICAgICAgICBwdXQzMigwKTsgLy8g dHlwZQogICAgICAgICAgcHV0MzIoMCk7IC8vIGZsYWcKICAgICAgICAgIHB1dDMyKDApOyAvLyBt YXNrCiAgICAgICAgICBjaGFyIHdob1s5XTsKICAgICAgICAgIG1lbXNldCh3aG8sIDAsIHNpemVv Zih3aG8pKTsKICAgICAgICAgIC8vc3RyY3B5KHdobywgIjEiKTsKICAgICAgICAgIHN0cmNweSh3 aG8sICJPV05FUkAiKTsKICAgICAgICAgIC8vc3RyY3B5KHdobywgIkdST1VQQCIpOwogICAgICAg ICAgcHV0X29wYXF1ZShzdHJsZW4od2hvKSwgd2hvKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBp ZihhID09IDEzKXsKICAgICAgICBwdXQzMigweGYpOyAvLyBhY2xzdXBwb3J0CiAgICAgIH0gZWxz ZSBpZihhID09IDE5KXsKICAgICAgICAvLyBmaWxlaGFuZGxlCiAgICAgICAgaW50IHhmaCA9IGZo OwogICAgICAgIHB1dF9vcGFxdWUoNCwgKGNoYXIqKSZ4ZmgpOyAvLyBmaAogICAgICB9IGVsc2Ug aWYoYSA9PSAyMCl7CiAgICAgICAgcHV0NjQoZmgpOyAvLyBmaWxlaWQKICAgICAgfSBlbHNlIGlm KGEgPT0gMjQpewogICAgICAgIC8vIGZzX2xvY2F0aW9ucwogICAgICAgIHB1dDMyKDEpOwogICAg ICAgIHB1dF9vcGFxdWUoMTAsICJhYmNkZTEyMzQ1Iik7IC8vIHBhdGhuYW1lNAogICAgICAgIHB1 dDMyKDEpOyAvLyBsb2NhdGlvbnM8PgogICAgICAgIHB1dF9vcGFxdWUoMTAsICJhYmNkZTEyMzQ1 Iik7IC8vIHNlcnZlcgogICAgICAgIHB1dDMyKDEpOwogICAgICAgIHB1dF9vcGFxdWUoMTAsICJh YmNkZTEyMzQ1Iik7IC8vIHJvb3RwYXRoCiAgICAgIH0gZWxzZSBpZihhID09IDI3KXsKICAgICAg ICBwdXQ2NCgweGZmZmZmZmZmZmZmZik7IC8vIG1heCBmaWxlIHNpemUKICAgICAgfSBlbHNlIGlm KGEgPT0gMjgpewogICAgICAgIHB1dDMyKDB4ZmZmZik7IC8vIG1heCBsaW5rCiAgICAgIH0gZWxz ZSBpZihhID09IDI5KXsKICAgICAgICBwdXQzMigyNTYpOyAvLyBtYXggbmFtZQogICAgICB9IGVs c2UgaWYoYSA9PSAzMCl7CiAgICAgICAgcHV0NjQoMTAqNDA5Nik7IC8vIG1heCByZWFkCiAgICAg IH0gZWxzZSBpZihhID09IDMxKXsKICAgICAgICBwdXQ2NCgxMCo0MDk2KTsgLy8gbWF4IHdyaXRl CiAgICAgIH0gZWxzZSBpZihhID09IDMzKXsKICAgICAgICBwdXQzMigwNzc3KTsgLy8gbW9kZQog ICAgICB9IGVsc2UgaWYoYSA9PSAzNSl7CiAgICAgICAgcHV0MzIoMyk7IC8vIG51bWxpbmtzCiAg ICAgIH0gZWxzZSBpZihhID09IDM2KXsKICAgICAgICBwdXRfb3BhcXVlKDYsICJvdGhlciIpOyAv LyBvd25lcgogICAgICB9IGVsc2UgaWYoYSA9PSAzNyl7CiAgICAgICAgcHV0X29wYXF1ZSg2LCAi b3RoZXIiKTsgLy8gb3duZXJfZ3JvdXAKICAgICAgfSBlbHNlIGlmKGEgPT0gNDEpewogICAgICAg IHB1dDMyKDEpOyAvLyByYXdkZXYgbWFqb3IKICAgICAgICBwdXQzMigxKTsgLy8gcmF3ZGV2IG1p bm9yCiAgICAgIH0gZWxzZSBpZihhID09IDQ1KXsKICAgICAgICBwdXQ2NCg0MDk2KjEwKTsgLy8g c3BhY2UgdXNlZAogICAgICB9IGVsc2UgaWYoYSA9PSA0Nyl7CiAgICAgICAgcHV0NjQoMCk7IC8v IHRpbWUgYWNjZXNzIHNlY29uZHMKICAgICAgICBwdXQzMigwKTsgLy8gbnNlY29uZHMKICAgICAg fSBlbHNlIGlmKGEgPT0gNTEpewogICAgICAgIHB1dDY0KDApOyAvLyB0aW1lIGRlbHRhIHNlY29u ZHMKICAgICAgICBwdXQzMigwKTsgLy8gbnNlY29uZHMKICAgICAgfSBlbHNlIGlmKGEgPT0gNTIp ewogICAgICAgIHB1dDY0KDApOyAvLyB0aW1lIG1ldGFkYXRhIHNlY29uZHMKICAgICAgICBwdXQz MigwKTsgLy8gbnNlY29uZHMKICAgICAgfSBlbHNlIGlmKGEgPT0gNTMpewogICAgICAgIHB1dDY0 KDApOyAvLyB0aW1lIG1vZGlmeSBzZWNvbmRzCiAgICAgICAgcHV0MzIoMCk7IC8vIG5zZWNvbmRz CiAgICAgIH0gZWxzZSBpZihhID09IDU1KXsKICAgICAgICBwdXQ2NCgwKTsgLy8gbW91bnRlZF9v bl9maWxlaWQgPz8/CiAgICAgIH0gZWxzZSBpZihhID09IDYyKXsKICAgICAgICAvLyBmc19sYXlv dXRfdHlwZXMKICAgICAgICBwdXQzMigxKTsKICAgICAgICBwdXQzMigxKTsgLy8gTEFZT1VUNF9O RlNWNF8xX0ZJTEVTCiAgICAgIH0gZWxzZSBpZihhID09IDc1KXsKICAgICAgICAvLyBGQVRUUjRf U1VQUEFUVFJfRVhDTENSRUFUCiAgICAgICAgcHV0MzIoMik7IC8vIGJpdG1hcCBsZW5ndGgKICAg ICAgICBwdXQzMigweGZmZmZmZmZmKTsKICAgICAgICBwdXQzMigweGZmZmZmZmZmKTsKICAgICAg fSBlbHNlIHsKICAgICAgICAvLyB1bmtub3duIGF0dHIsIGRlbGV0ZSBmcm9tIGJpdG1hcC4KICAg ICAgICB3b3Jkc1thLzMyXSAmPSB+KDEgPDwgKGEgJSAzMikpOwogICAgICAgICooaW50Kikob2J1 ZiArIHdvcmQwaSArIDQqKGEvMzIpKSA9IGh0b25sKHdvcmRzW2EvMzJdKTsKICAgICAgfQogICAg fQogIH0KICBmb3IoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykKICAgIHB1dDMyKDB4ZmZmZmZmZmYp OwogICooaW50Kikob2J1ZitsZW5pKSA9IGh0b25sKG9pIC0gbGVuaSAtIDQpOwp9Cgp2b2lkCnB1 dF9mYXR0cjRfaW5uZXIoaW50IHdvcmRzW10pCnsKICBpbnQgYml0d29yZHMgPSAzOwogIHB1dDMy KGJpdHdvcmRzKTsKICBpbnQgd29yZDBpID0gb2k7CiAgZm9yKGludCBpID0gMDsgaSA8IGJpdHdv cmRzOyBpKyspCiAgICBwdXQzMih3b3Jkc1tpXSk7CiAgaW50IGxlbmkgPSBvaTsKICBwdXQzMigw KTsgLy8gcGxhY2Vob2xkZXIgZm9yIHRvdGFsIGxlbmd0aCBvZiBhdHRycwogIGZvcihpbnQgYSA9 IDA7IGEgPCBiaXR3b3JkcyozMjsgYSsrKXsKICAgIGlmKHdvcmRzW2EvMzJdICYgKDEgPDwgKGEg JSAzMikpKXsKICAgICAgaWYoYSA9PSAwKXsKICAgICAgICBpbnQgbiA9IDMgXiAoYWFbYWFpKytd ICYgMHhmKTsKICAgICAgICBwdXQzMihuKTsgLy8gIyBiaXRtYXAgd29yZHMgb2Ygc3VwcG9ydGVk IGF0dHJzCiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG47IGkrKyl7CiAgICAgICAgICBwdXQz MigweGZmZmZmZmZmIF4gYWFbYWFpKytdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZihhID09 IDEpewogICAgICAgIHB1dDMyKDEgXiBhYVthYWkrK10pOyAvLyBORjRESVI9MiBvciBORjRSRUc9 MQogICAgICB9IGVsc2UgaWYoYSA9PSAyKXsKICAgICAgICBwdXQzMihhYVthYWkrK10pOyAvLyBm aF9leHBpcmVfdHlwZQogICAgICB9IGVsc2UgaWYoYSA9PSAzKXsKICAgICAgICBwdXQ2NChhYVth YWkrK10pOyAvLyBjaGFuZ2UKICAgICAgfSBlbHNlIGlmKGEgPT0gNCl7CiAgICAgICAgcHV0NjQo MTAzIF4gYWFbYWFpKytdKTsgLy8gc2l6ZQogICAgICB9IGVsc2UgaWYoYSA9PSA1KXsKICAgICAg ICBwdXQzMihhYVthYWkrK10pOyAvLyBsaW5rIHN1cHBvcnQKICAgICAgfSBlbHNlIGlmKGEgPT0g Nil7CiAgICAgICAgcHV0MzIoYWFbYWFpKytdKTsgLy8gc3ltbGluayBzdXBwb3J0CiAgICAgIH0g ZWxzZSBpZihhID09IDgpewogICAgICAgIHB1dDY0KGFhW2FhaSsrXSk7IC8vIGZzaWQgbWFqb3IK ICAgICAgICBwdXQ2NChhYVthYWkrK10pOyAvLyBmc2lkIG1pbm9yCiAgICAgIH0gZWxzZSBpZihh ID09IDEwKXsKICAgICAgICBwdXQzMihhYVthYWkrK10pOyAvLyBsZWFzZSB0aW1lCiAgICAgIH0g ZWxzZSBpZihhID09IDExKXsKICAgICAgICBwdXQzMihhYVthYWkrK10pOyAvLyByZGF0dHJfZXJy b3IKICAgICAgfSBlbHNlIGlmKGEgPT0gMTIpewogICAgICAgIC8vIEFDTAogICAgICAgIGludCBu ID0gMSBeIGFhW2FhaSsrXTsKICAgICAgICBwdXQzMihuKTsKICAgICAgICBmb3IoaW50IGkgPSAw OyBpIDwgbiAmJiBpIDwgMjsgaSsrKXsKICAgICAgICAgIHB1dDMyKGFhW2FhaSsrXSk7IC8vIHR5 cGUKICAgICAgICAgIHB1dDMyKGFhW2FhaSsrXSk7IC8vIGZsYWcKICAgICAgICAgIHB1dDMyKGFh W2FhaSsrXSk7IC8vIG1hc2sKICAgICAgICAgIGNoYXIgd2hvWzldOwogICAgICAgICAgbWVtc2V0 KHdobywgMCwgc2l6ZW9mKHdobykpOwogICAgICAgICAgLy8gc3RyY3B5KHdobywgIjY1NTM0Iik7 CiAgICAgICAgICBzdHJjcHkod2hvLCAiT1dORVJAIik7CiAgICAgICAgICAqKGxvbmcgbG9uZyop d2hvIF49IGFhW2FhaSsrXTsKICAgICAgICAgIHB1dF9vcGFxdWUoc3RybGVuKHdobyksIHdobyk7 CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYoYSA9PSAxMyl7CiAgICAgICAgcHV0MzIoMHhmIF4g YWFbYWFpKytdKTsgLy8gYWNsc3VwcG9ydAogICAgICB9IGVsc2UgaWYoYSA9PSAxOSl7CiAgICAg ICAgLy8gZmlsZWhhbmRsZQogICAgICAgIGludCBuID0gYWFbYWFpKytdICYgMHhmZjsKICAgICAg ICBwdXRfb3BhcXVlX3JlcGVhdChuLCAneCcpOwogICAgICB9IGVsc2UgaWYoYSA9PSAyMCl7CiAg ICAgICAgcHV0NjQoYWFbYWFpKytdICYgMHgzKTsgLy8gZmlsZWlkCiAgICAgIH0gZWxzZSBpZihh ID09IDI0KXsKICAgICAgICAvLyBmc19sb2NhdGlvbnMKICAgICAgICBwdXRfb3BhcXVlKDEwLCAi YWJjZGUxMjM0NSIpOyAvLyBwYXRobmFtZTQKICAgICAgICBpbnQgbiA9IGFhW2FhaSsrXSAmIDB4 MWY7CiAgICAgICAgcHV0MzIobik7IC8vIGxvY2F0aW9uczw+CiAgICAgICAgZm9yKGludCBpID0g MDsgaSA8IG47IGkrKyl7CiAgICAgICAgICBwdXRfb3BhcXVlX3JlcGVhdChhYVthYWkrK10gJiAw eDFmZiwgJ3gnKTsgLy8gc2VydmVyCiAgICAgICAgICBwdXRfb3BhcXVlX3JlcGVhdChhYVthYWkr K10gJiAweDFmZiwgJ3knKTsgLy8gcm9vdHBhdGgKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZihh ID09IDI3KXsKICAgICAgICBwdXQ2NChhYVthYWkrK10pOyAvLyBtYXggZmlsZSBzaXplCiAgICAg IH0gZWxzZSBpZihhID09IDI4KXsKICAgICAgICBwdXQzMihhYVthYWkrK10pOyAvLyBtYXggbGlu awogICAgICB9IGVsc2UgaWYoYSA9PSAyOSl7CiAgICAgICAgcHV0MzIoYWFbYWFpKytdKTsgLy8g bWF4IG5hbWUKICAgICAgfSBlbHNlIGlmKGEgPT0gMzApewogICAgICAgIHB1dDY0KGFhW2FhaSsr XSk7IC8vIG1heCByZWFkCiAgICAgIH0gZWxzZSBpZihhID09IDMxKXsKICAgICAgICBwdXQ2NChh YVthYWkrK10pOyAvLyBtYXggd3JpdGUKICAgICAgfSBlbHNlIGlmKGEgPT0gMzMpewogICAgICAg IHB1dDMyKGFhW2FhaSsrXSk7IC8vIG1vZGUKICAgICAgfSBlbHNlIGlmKGEgPT0gMzUpewogICAg ICAgIHB1dDMyKGFhW2FhaSsrXSk7IC8vIG51bWxpbmtzCiAgICAgIH0gZWxzZSBpZihhID09IDM2 KXsKICAgICAgICBwdXRfb3BhcXVlX3JlcGVhdChhYVthYWkrK10gJiAweDFmZiwgJ3onKTsgLy8g b3duZXIKICAgICAgfSBlbHNlIGlmKGEgPT0gMzcpewogICAgICAgIHB1dF9vcGFxdWVfcmVwZWF0 KGFhW2FhaSsrXSAmIDB4MWZmLCAneicpOyAvLyBvd25lcl9ncm91cAogICAgICB9IGVsc2UgaWYo YSA9PSA0MSl7CiAgICAgICAgcHV0MzIoYWFbYWFpKytdKTsgLy8gcmF3ZGV2IG1ham9yCiAgICAg ICAgcHV0MzIoYWFbYWFpKytdKTsgLy8gcmF3ZGV2IG1pbm9yCiAgICAgIH0gZWxzZSBpZihhID09 IDQ1KXsKICAgICAgICBwdXQ2NChhYVthYWkrK10pOyAvLyBzcGFjZSB1c2VkCiAgICAgIH0gZWxz ZSBpZihhID09IDQ3KXsKICAgICAgICBwdXQ2NCgwKTsgLy8gdGltZSBhY2Nlc3Mgc2Vjb25kcwog ICAgICAgIHB1dDMyKDApOyAvLyBuc2Vjb25kcwogICAgICB9IGVsc2UgaWYoYSA9PSA1MSl7CiAg ICAgICAgcHV0NjQoYWFbYWFpKytdKTsgLy8gdGltZSBkZWx0YSBzZWNvbmRzCiAgICAgICAgcHV0 MzIoYWFbYWFpKytdKTsgLy8gbnNlY29uZHMKICAgICAgfSBlbHNlIGlmKGEgPT0gNTIpewogICAg ICAgIHB1dDY0KDApOyAvLyB0aW1lIG1ldGFkYXRhIHNlY29uZHMKICAgICAgICBwdXQzMigwKTsg Ly8gbnNlY29uZHMKICAgICAgfSBlbHNlIGlmKGEgPT0gNTMpewogICAgICAgIHB1dDY0KDApOyAv LyB0aW1lIG1vZGlmeSBzZWNvbmRzCiAgICAgICAgcHV0MzIoMCk7IC8vIG5zZWNvbmRzCiAgICAg IH0gZWxzZSBpZihhID09IDU1KXsKICAgICAgICBwdXQ2NChhYVthYWkrK10pOyAvLyBtb3VudGVk X29uX2ZpbGVpZCA/Pz8KICAgICAgfSBlbHNlIGlmKGEgPT0gNjIpewogICAgICAgIC8vIGZzX2xh eW91dF90eXBlcwogICAgICAgIHB1dDMyKGFhW2FhaSsrXSk7CiAgICAgICAgcHV0MzIoYWFbYWFp KytdKTsgLy8gTEFZT1VUNF9ORlNWNF8xX0ZJTEVTCiAgICAgIH0gZWxzZSBpZihhID09IDc1KXsK ICAgICAgICAvLyBGQVRUUjRfU1VQUEFUVFJfRVhDTENSRUFUCiAgICAgICAgaW50IG4gPSBhYVth YWkrK10gJiAweGY7CiAgICAgICAgcHV0MzIobik7IC8vICMgYml0bWFwIHdvcmRzIG9mIHN1cHBv cnRlZCBhdHRycwogICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspewogICAgICAgICAg cHV0MzIoYWFbYWFpKytdKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gdW5r bm93biBhdHRyLCBkZWxldGUgZnJvbSBiaXRtYXAuCiAgICAgICAgd29yZHNbYS8zMl0gJj0gfigx IDw8IChhICUgMzIpKTsKICAgICAgICAqKGludCopKG9idWYgKyB3b3JkMGkgKyA0KihhLzMyKSkg PSBodG9ubCh3b3Jkc1thLzMyXSk7CiAgICAgIH0KICAgIH0KICB9CiAgZm9yKGludCBpID0gMDsg aSA8IDE2OyBpKyspCiAgICBwdXQzMigweGZmZmZmZmZmKTsKICAqKGludCopKG9idWYrbGVuaSkg PSBodG9ubChvaSAtIGxlbmkgLSA0KTsKfQoKLy8KLy8gZ2VuZXJhdGUgYSBzeW1ib2xpYyBmYXR0 cjQsIHdpdGggbXVsdGlwbGUgZWxlbWVudHMuCi8vIHRyaWVzIHRvIGF2b2lkIGdlbmVyYXRpbmcg aWxsZWdhbCBYRFIuCi8vCnZvaWQKcHV0X2ZhdHRyNF9tYW55KCkKewogIGludCBiaXR3b3JkcyA9 IDM7CiAgaW50IHdvcmRzWzRdOwogIG1lbXNldCh3b3JkcywgMCwgc2l6ZW9mKHdvcmRzKSk7CiAg aW50IHNldG1lW10gPSB7IC0xIH07CiAgZm9yKGludCBpID0gMDsgc2V0bWVbaV0gPj0gMDsgaSsr KXsKICAgIGludCBhID0gc2V0bWVbaV07CiAgICB3b3Jkc1thLzMyXSB8PSAxIDw8IChhICUgMzIp OwogIH0KICBmb3IoaW50IGkgPSAwOyBpIDwgYml0d29yZHM7IGkrKyl7CiAgICB3b3Jkc1tpXSBe PSBhYVthYWkrK107CiAgfQogIHB1dF9mYXR0cjRfaW5uZXIod29yZHMpOwp9CgovLwovLyBhIHN5 bWJvbGljIGZhdHRyNCB3aXRoIGp1c3Qgb25lIGl0ZW0gc2V0LgovLwp2b2lkCnB1dF9mYXR0cjRf b25lKCkKewogIGludCBiaXR3b3JkcyA9IDM7CiAgaW50IHdvcmRzWzRdOwogIG1lbXNldCh3b3Jk cywgMCwgc2l6ZW9mKHdvcmRzKSk7CiAgdW5zaWduZWQgaW50IGJpdCA9IGFhW2FhaSsrXTsKICBp ZihiaXQgPj0gMyozMikKICAgIGJpdCA9IDQ7CiAgd29yZHNbYml0LzMyXSB8PSAxIDw8IChiaXQg JSAzMik7CiAgcHV0X2ZhdHRyNF9pbm5lcih3b3Jkcyk7Cn0KCnZvaWQKcHV0X3NldGF0dHIoKQp7 CiAgcHV0MzIoMzQpOwogIHB1dDMyKHN0YXRlaWRfc2VxaWQpOyAvLyBvcGVuX3N0YXRlaWQsIGZy b20gcHJldmlvdXMgT1BFTgogIGZvcihpbnQgaSA9IDA7IGkgPCAxMjsgaSsrKQogICAgb2J1Zltv aSsrXSA9IHN0YXRlaWRfb3RoZXJbaV07CiAgcHV0X2ZhdHRyNF9vbmUoKTsKfQoKdm9pZApzZW5k X29wZW5fZXhpc3RpbmcoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBzaGFyaW5nKQp7CiAgcHV0 X2NvbXBvdW5kKDQpOwogIHB1dF9zZXF1ZW5jZSgpOwogIHB1dF9yb290ZmgoKTsKICBwdXRfbG9v a3VwKCJ0bXAiKTsKICBwdXRfb3Blbl9leGlzdGluZyhmaWxlbmFtZSwgc2hhcmluZyk7CiAgc2Vu ZF9zZW5kKCk7CiAgcGFyc2VfcmVwbHkoMSk7Cn0KCnZvaWQKc2VuZF9vcGVuX2NyZWF0ZShjaGFy ICpuYW1lLCBpbnQgZG9zeW0pCnsKICBwdXRfY29tcG91bmQoNCk7CiAgcHV0X3NlcXVlbmNlKCk7 CiAgcHV0X3Jvb3RmaCgpOwogIHB1dF9sb29rdXAoInRtcCIpOwogIHB1dF9vcGVuX2NyZWF0ZShu YW1lLCBkb3N5bSk7CiAgc2VuZF9zZW5kKCk7CiAgcGFyc2VfcmVwbHkoMSk7Cn0KCnZvaWQKcHV0 X2NyZWF0ZSgpCnsKICBwdXQzMig2KTsKICBpbnQgdHlwZSA9IDU7IC8vIE5GUzRMTksKICB0eXBl IF49IGFhW2FhaSsrXTsKICBwdXQzMih0eXBlKTsKICBpZih0eXBlID09IDUpewogICAgcHV0X29w YXF1ZSgxNiwgImFiY2RlZmdoMTIzNDU2NzgiKTsKICB9IGVsc2UgaWYodHlwZSA9PSA0IHx8IHR5 cGUgPT0gMyl7IC8vIENIUiwgQkxLCiAgICBwdXQzMihhYVthYWkrK10pOyAvLyBtYWpvcgogICAg cHV0MzIoYWFbYWFpKytdKTsgLy8gbWlub3IKICB9CiAgdW5saW5rKCIvdG1wL25ld2xpbmsiKTsK ICBwdXRfb3BhcXVlKDcsICJuZXdsaW5rIik7CiAgcHV0X2ZhdHRyNF9vbmUoKTsKICBpZigwKXsK ICAgIHB1dDMyKDMpOyAvLyBmYXR0cjQgYml0bWFwIHNpemUKICAgIHB1dDMyKDApOwogICAgcHV0 MzIoMCk7CiAgICBwdXQzMigwKTsKICAgIHB1dDMyKDApOyAvLyBvcGFxdWUgZmF0dHI0IHNpemUK ICB9Cn0KCnZvaWQKc2VuZF9jcmVhdGUoKQp7CiAgcHV0X2NvbXBvdW5kKDQpOwogIHB1dF9zZXF1 ZW5jZSgpOwogIHB1dF9yb290ZmgoKTsKICBwdXRfbG9va3VwKCJ0bXAiKTsKICBwdXRfY3JlYXRl KCk7CiAgc2VuZF9zZW5kKCk7CiAgcGFyc2VfcmVwbHkoMSk7Cn0KCnZvaWQKc2VuZF9zZXRhdHRy KGNoYXIgKm5hbWUsIGludCBkb3N5bSkKewogIHB1dF9jb21wb3VuZCg1KTsKICBwdXRfc2VxdWVu Y2UoKTsKICBwdXRfcm9vdGZoKCk7CiAgcHV0X2xvb2t1cCgidG1wIik7CiAgcHV0X2xvb2t1cChu YW1lKTsKICBwdXRfc2V0YXR0cigpOwogIHNlbmRfc2VuZCgpOwogIHBhcnNlX3JlcGx5KDEpOwp9 Cgp2b2lkCnB1dF9zZXRfYWNsKGludCBkb3N5bSkKewogIHB1dDMyKDM0KTsKICBwdXQzMihzdGF0 ZWlkX3NlcWlkKTsgLy8gb3Blbl9zdGF0ZWlkLCBmcm9tIHByZXZpb3VzIE9QRU4KICBmb3IoaW50 IGkgPSAwOyBpIDwgMTI7IGkrKykKICAgIG9idWZbb2krK10gPSBzdGF0ZWlkX290aGVyW2ldOwog IGludCB3b3Jkc1szXTsKICB3b3Jkc1swXSA9IHdvcmRzWzFdID0gd29yZHNbMl0gPSAwOwogIHdv cmRzWzBdIHw9ICgxIDw8IDEyKTsgLy8gYWNsCiAgaWYoZG9zeW0gJiYgc3ltc3RhcnQgPT0gLTEp CiAgICBzeW1zdGFydCA9IG9pICsgNCo0OyAvLyBza2lwIG92ZXIgRkFUVFI0IGJpdG1hcAogIHB1 dF9mYXR0cjQod29yZHMsIDEpOwp9Cgp2b2lkCnB1dF9nZXRhdHRyKCkKewogIHB1dDMyKDkpOwog IHB1dDMyKDMpOwogIHB1dDMyKDEgPDwgMTIpOwogIHB1dDMyKDApOwogIHB1dDMyKDApOwp9Cgp2 b2lkCnNlbmRfc2V0X2FjbChjaGFyICpuYW1lLCBpbnQgZG9zeW0pCnsKICBwdXRfY29tcG91bmQo Nik7CiAgcHV0X3NlcXVlbmNlKCk7CiAgcHV0X3Jvb3RmaCgpOwogIHB1dF9sb29rdXAoInRtcCIp OwogIHB1dF9sb29rdXAobmFtZSk7CiAgcHV0X3NldF9hY2woZG9zeW0pOwogIHB1dF9nZXRhdHRy KCk7CiAgc2VuZF9zZW5kKCk7CiAgcGFyc2VfcmVwbHkoMSk7Cn0KCnZvaWQKcHV0X3B1dGZoKGlu dCBkb3N5bSkKewogIHB1dDMyKDIyKTsKICBpZihkb3N5bSAmJiBzeW1zdGFydCA9PSAtMSkKICAg IHN5bXN0YXJ0ID0gb2k7CiAgcHV0X29wYXF1ZSgyOCwgdG1wX2ZoKTsKfQoKdm9pZApzZW5kX3B1 dGZoKCkKewogIHB1dF9jb21wb3VuZCgyKTsKICBwdXRfc2VxdWVuY2UoKTsKICBwdXRfcHV0Zmgo MCk7CiAgc2VuZF9zZW5kKCk7CiAgcGFyc2VfcmVwbHkoMSk7Cn0KCnZvaWQKcHV0X2dldGZoKCkK ewogIHB1dDMyKDEwKTsKfQoKdm9pZApzZW5kX2xvb2t1cCgpCnsKICBwdXRfY29tcG91bmQoNCk7 CiAgcHV0X3NlcXVlbmNlKCk7CiAgcHV0X3Jvb3RmaCgpOwogIHB1dF9sb29rdXAoInRtcCIpOwog IHB1dF9nZXRmaCgpOwogIHNlbmRfc2VuZCgpOwogIHBhcnNlX3JlcGx5KDEpOwp9Cgp2b2lkCnNl bmRfcmVhZGRpcihpbnQgZG9zeW0pCnsKICBwdXRfY29tcG91bmQoNCk7CiAgcHV0X3NlcXVlbmNl KCk7CiAgcHV0X3Jvb3RmaCgpOwogIHB1dF9sb29rdXAoInRtcCIpOwogIHB1dF9yZWFkZGlyKGRv c3ltKTsKICBzZW5kX3NlbmQoKTsKICBwYXJzZV9yZXBseSgxKTsKfQoKdm9pZApwdXRfbGlzdHhh dHRycygpCnsKICBwdXQzMig3NCk7CiAgcHV0NjQoMCk7IC8vIGNvb2tpZQogIHB1dDMyKDE2Mzg0 KTsgLy8gbWF4Y291bnQKfQoKdm9pZApzZW5kX2xpc3R4YXR0cnMoKQp7CiAgcHV0X2NvbXBvdW5k KDQpOwogIHB1dF9zZXF1ZW5jZSgpOwogIHB1dF9yb290ZmgoKTsKICBwdXRfbG9va3VwKCJ0bXAi KTsKICBwdXRfbGlzdHhhdHRycygpOwogIHNlbmRfc2VuZCgpOwogIHBhcnNlX3JlcGx5KDEpOwp9 Cgp2b2lkCnB1dF91bmxvY2soaW50IGRvc3ltKQp7CiAgcHV0MzIoMTQpOwogIGlmKGRvc3ltICYm IHN5bXN0YXJ0ID09IC0xKQogICAgc3ltc3RhcnQgPSBvaTsKICBwdXQzMigxKTsgLy8gUkVBRF9M VAogIHB1dDMyKDApOyAvLyBvcGVuX3NlcWlkCiAgcHV0MzIoc3RhdGVpZF9zZXFpZCk7IC8vIG9w ZW5fc3RhdGVpZCwgZnJvbSBwcmV2aW91cyBPUEVOCiAgZm9yKGludCBpID0gMDsgaSA8IDEyOyBp KyspCiAgICBvYnVmW29pKytdID0gc3RhdGVpZF9vdGhlcltpXTsKICBwdXQ2NCgwKTsgLy8gb2Zm c2V0CiAgcHV0NjQoMSk7IC8vIGxlbmd0aAp9Cgp2b2lkCnNlbmRfdW5sb2NrKGludCBkb3N5bSkK ewogIHB1dF9jb21wb3VuZCg1KTsKICBwdXRfc2VxdWVuY2UoKTsKICBwdXRfcm9vdGZoKCk7CiAg cHV0X2xvb2t1cCgidG1wIik7CiAgcHV0X2xvb2t1cCgibG9ja2ZpbGUiKTsKICBwdXRfdW5sb2Nr KGRvc3ltKTsKICBzZW5kX3NlbmQoKTsKICBwYXJzZV9yZXBseSgxKTsKfQoKdm9pZApwdXRfbG9j ayhpbnQgZG9zeW0pCnsKICBwdXQzMigxMik7CiAgaWYoZG9zeW0gJiYgc3ltc3RhcnQgPT0gLTEp CiAgICBzeW1zdGFydCA9IG9pOwogIHB1dDMyKDEpOyAvLyBSRUFEX0xUCiAgcHV0MzIoMCk7IC8v IHJlY2xhaW0KICBwdXQ2NCgwKTsgLy8gb2Zmc2V0CiAgcHV0NjQoMik7IC8vIGxlbmd0aAogIHB1 dDMyKDEpOyAvLyBuZXdfbG9ja19vd25lcgogIHB1dDMyKDApOyAvLyBvcGVuX3NlcWlkCiAgcHV0 MzIoc3RhdGVpZF9zZXFpZCk7IC8vIG9wZW5fc3RhdGVpZCwgZnJvbSBwcmV2aW91cyBPUEVOCiAg Zm9yKGludCBpID0gMDsgaSA8IDEyOyBpKyspCiAgICBvYnVmW29pKytdID0gc3RhdGVpZF9vdGhl cltpXTsKICBwdXQzMigwKTsgLy8gbG9ja19zZXFpZAogIHB1dDY0KGNsaWVudGlkKTsgLy8gY2xp ZW50aWQKICBwdXRfb3BhcXVlKDIyLCAiTGludXggTkZTdjQuMiB4eXp6eSIpOyAvLyBvd25lcgp9 Cgp2b2lkCnNlbmRfbG9jayhpbnQgZG9zeW0pCnsKICBwdXRfY29tcG91bmQoNSk7CiAgcHV0X3Nl cXVlbmNlKCk7CiAgcHV0X3Jvb3RmaCgpOwogIHB1dF9sb29rdXAoInRtcCIpOwogIHB1dF9sb29r dXAoImxvY2tmaWxlIik7CiAgcHV0X2xvY2soZG9zeW0pOwogIHNlbmRfc2VuZCgpOwogIHBhcnNl X3JlcGx5KDEpOwp9Cgp2b2lkCnB1dF9kaXJfZGVsZWdhdGlvbihpbnQgZG9zeW0pCnsKICBwdXQz Mig0Nik7CiAgaWYoZG9zeW0gJiYgc3ltc3RhcnQgPT0gLTEpCiAgICBzeW1zdGFydCA9IG9pOwog IHB1dDMyKDApOyAvLyBzaWduYWxfZGVsZWdfYXZhaWwKICBwdXQzMigzKTsgLy8gbm90aWZpY2F0 aW9uX3R5cGVzIGJpdG1hcCBsZW5ndGgKICBwdXQzMigweGZmZmZmZmZmKTsKICBwdXQzMigweGZm ZmZmZmZmKTsKICBwdXQzMigweGZmZmZmZmZmKTsKICBwdXQ2NCgwKTsgLy8gY2hpbGRfYXR0cl9k ZWxheQogIHB1dDMyKDApOyAvLyBjaGlsZF9hdHRyX2RlbGF5CiAgcHV0NjQoMCk7IC8vIGRpcl9h dHRyX2RlbGF5CiAgcHV0MzIoMCk7IC8vIGRpcl9hdHRyX2RlbGF5CiAgcHV0MzIoMyk7IC8vIGNo aWxkX2F0dHJpYnV0ZXMgYml0bWFwIGxlbmd0aAogIHB1dDMyKDB4ZmZmZmZmZmYpOwogIHB1dDMy KDB4ZmZmZmZmZmYpOwogIHB1dDMyKDB4ZmZmZmZmZmYpOwogIHB1dDMyKDMpOyAvLyBkaXJfYXR0 cmlidXRlcyBiaXRtYXAgbGVuZ3RoCiAgcHV0MzIoMHhmZmZmZmZmZik7CiAgcHV0MzIoMHhmZmZm ZmZmZik7CiAgcHV0MzIoMHhmZmZmZmZmZik7Cn0KCnZvaWQKc2VuZF9kaXJfZGVsZWdhdGlvbihp bnQgZG9zeW0pCnsKICBwdXRfY29tcG91bmQoNCk7CiAgcHV0X3NlcXVlbmNlKCk7CiAgcHV0X3Jv b3RmaCgpOwogIHB1dF9sb29rdXAoInRtcCIpOwogIHB1dF9kaXJfZGVsZWdhdGlvbihkb3N5bSk7 CiAgc2VuZF9zZW5kKCk7CiAgcGFyc2VfcmVwbHkoMSk7Cn0KCnZvaWQKcHV0X3ZlcmlmeShpbnQg ZG9zeW0pCnsKICBwdXQzMigzNyk7CiAgcHV0MzIoMik7CiAgaWYoZG9zeW0gJiYgc3ltc3RhcnQg PT0gLTEpCiAgICBzeW1zdGFydCA9IG9pOwogIHB1dDMyKDApOwogIHB1dDMyKDApOwogIHB1dDMy KDEwMjQpOwogIGZvcihpbnQgaSA9IDA7IGkgPCAxMDI0LzQ7IGkrKykKICAgIHB1dDMyKDB4ZmZm ZmZmZmYpOwp9Cgp2b2lkCnNlbmRfdmVyaWZ5KCkKewogIHB1dF9jb21wb3VuZCg0KTsKICBwdXRf c2VxdWVuY2UoKTsKICBwdXRfcm9vdGZoKCk7CiAgcHV0X2xvb2t1cCgidG1wIik7CiAgcHV0X3Zl cmlmeSgxKTsKICBzZW5kX3NlbmQoKTsKICBwYXJzZV9yZXBseSgxKTsKfQoKdm9pZApwdXRfc2V0 eGF0dHIoaW50IGRvc3ltKQp7CiAgcHV0MzIoNzMpOwogIGlmKGRvc3ltID09IDIpewogICAgcHV0 MzIoMCk7IC8vIFNFVFhBVFRSNF9FSVRIRVIKICAgIHVuc2lnbmVkIGludCBrbGVuID0gYWFbYWFp KytdICYgMHhmZmY7CiAgICB1bnNpZ25lZCBpbnQgdmxlbiA9IGFhW2FhaSsrXSAmIDB4ZmZmOwog ICAgZm9yKGludCBpID0gb2k7IGkrOCA8PSBzaXplb2Yob2J1ZikgJiYgYWFpIDwgTkFBOyBpICs9 IDgpCiAgICAgICoodW5zaWduZWQgbG9uZyBsb25nICopKG9idWYgKyBpKSA9IDB4NDQ0NDQ0NDQ0 NDQ0NDQ0NGxsIF4gYWFbYWFpKytdOwogICAgaWYoa2xlbiA8IDEpIGtsZW4gPSAxOwogICAgcHV0 MzIoa2xlbik7CiAgICBvaSArPSBrbGVuOwogICAgd2hpbGUoKG9pICUgNCkgIT0gMCkgb2krKzsK ICAgIHB1dDMyKHZsZW4pOwogICAgb2kgKz0gdmxlbjsKICAgIHdoaWxlKChvaSAlIDQpICE9IDAp IG9pKys7CiAgfSBlbHNlIGlmKGRvc3ltID09IDMpIHsKICAgIGludCB4b2kgPSBvaTsKICAgIHB1 dDMyKDApOyAvLyBTRVRYQVRUUjRfRUlUSEVSCiAgICBwdXQzMigyNCk7IC8vIGtsZW4KICAgIGZv cihpbnQgaSA9IDA7IGkgPCAzOyBpKyspewogICAgICAqKGxvbmcgbG9uZyAqKShvYnVmICsgb2kp ID0gMHg0NDQ0NDQ0NDQ0NDQ0NDQ0bGwgXiBhYVthYWkrK107CiAgICAgIG9pICs9IDg7CiAgICB9 CiAgICBwdXQzMigyNCk7IC8vIHZsZW4KICAgIGZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspewog ICAgICAqKGxvbmcgbG9uZyAqKShvYnVmICsgb2kpID0gMHg0NDQ0NDQ0NDQ0NDQ0NDQ0bGwgXiBh YVthYWkrK107CiAgICAgIG9pICs9IDg7CiAgICB9CiAgfSBlbHNlIHsKICAgIGludCB4b2kgPSBv aTsKICAgIHB1dDMyKDApOyAvLyBTRVRYQVRUUjRfRUlUSEVSCiAgICBwdXRfb3BhcXVlKDI0LCAi MTIzNDU2NzhhYmNkZWZnaDEyMzQ1Njc4Iik7IC8vIGtleQogICAgcHV0X29wYXF1ZSgxNiwgImFi Y2RlZmdoMTIzNDU2NzgiKTsgLy8gdmFsdWUKICAgIGlmKGRvc3ltKQogICAgICBmb3IoaW50IGkg PSB4b2k7IGkrOCA8PSBvaTsgaSArPSA4KQogICAgICAgICoobG9uZyBsb25nICopKG9idWYraSkg Xj0gYWFbYWFpKytdOwogIH0KfQoKdm9pZApzZW5kX3NldHhhdHRyKGludCBkb3N5bSkKewogIHB1 dF9jb21wb3VuZCg1KTsKICBwdXRfc2VxdWVuY2UoKTsKICBwdXRfcm9vdGZoKCk7CiAgcHV0X2xv b2t1cCgidG1wIik7CiAgc3lzKCJlY2hvIGhpID4gL3RtcC94ZmlsZSA7IGNob3duIG5vYm9keSAv dG1wL3hmaWxlIik7CiAgcHV0X2xvb2t1cCgieGZpbGUiKTsKICBwdXRfc2V0eGF0dHIoZG9zeW0p OwogIHNlbmRfc2VuZCgpOwogIHBhcnNlX3JlcGx5KDEpOwp9Cgp2b2lkCnB1dF9yZW1vdmUoY2hh ciAqbmFtZSkKewogIHB1dDMyKDI4KTsKICBwdXRfb3BhcXVlKHN0cmxlbihuYW1lKSwgbmFtZSk7 Cn0KCnZvaWQKc2VuZF9yZW1vdmUoY2hhciAqbmFtZSkKewogIHB1dF9jb21wb3VuZCg1KTsKICBw dXRfc2VxdWVuY2UoKTsKICBwdXRfcm9vdGZoKCk7CiAgcHV0X2xvb2t1cCgidG1wIik7CiAgcHV0 X3JlbW92ZShuYW1lKTsKICBzZW5kX3NlbmQoKTsKICBwYXJzZV9yZXBseSgxKTsKfQoKdm9pZApw dXRfanVuayhpbnQgb3AsIGludCB3b3JkcykKewogIHB1dDMyKG9wKTsKICBpZihzeW1zdGFydCAh PSAtMSkKICAgIHN5bXN0YXJ0ID0gb2k7CiAgZm9yKGludCBpID0gMDsgaSA8IHdvcmRzOyBpKysp CiAgICBwdXQzMigwKTsKfQoKdm9pZApzZW5kX2p1bmsoaW50IG9wLCBpbnQgd29yZHMpCnsKICBw dXRfY29tcG91bmQoNCk7CiAgcHV0X3NlcXVlbmNlKCk7CiAgcHV0X3Jvb3RmaCgpOwogIHB1dF9s b29rdXAoInRtcCIpOwogIHB1dF9qdW5rKG9wLCB3b3Jkcyk7CiAgc2VuZF9zZW5kKCk7CiAgcGFy c2VfcmVwbHkoMSk7Cn0KCnZvaWQKcHV0X2xheW91dGdldChpbnQgZG9zeW0pCnsKICBwdXQzMig1 MCk7CiAgaWYoZG9zeW0gJiYgc3ltc3RhcnQgPT0gLTEpCiAgICBzeW1zdGFydCA9IG9pOwogIHB1 dDMyKDEpOyAvLyBzaWduYWxfbGF5b3V0X2F2YWlsCiAgcHV0MzIoNCk7IC8vIGxheW91dF90eXBl LCBGTEVYRklMRQogIHB1dDMyKDMpOyAvLyBpb21vZGUsIEFOWQogIHB1dDY0KDApOyAvLyBvZmZz ZXQKICBwdXQ2NCg4KTsgLy8gbGVuZ3RoCiAgcHV0NjQoOCk7IC8vIG1pbmxlbmd0aAogIHB1dDMy KDEpOyAvLyBzdGF0ZWlkIHNlcSAtLSBzcGVjaWFsIGN1cnJlbnQgc3RhdGVpZAogIGZvcihpbnQg aSA9IDA7IGkgPCAxMjsgaSsrKQogICAgb2J1ZltvaSsrXSA9IDA7CiAgcHV0MzIoNDA5Nik7IC8v IG1heGNvdW50Cn0KCnZvaWQKc2VuZF9sYXlvdXRnZXQoaW50IGRvc3ltKQp7CiAgc3lzKCJlY2hv IDEyMzQ1Njc4OTAxMjM0NTYgPiAvdG1wL291dCIpOwogIHN5cygiY2hvd24gbm9ib2R5IC90bXAv b3V0Iik7CiAgcHV0X2NvbXBvdW5kKDUpOwogIHB1dF9zZXF1ZW5jZSgpOwogIHB1dF9yb290Zmgo KTsKICBwdXRfbG9va3VwKCJ0bXAiKTsKICBwdXRfb3Blbl9leGlzdGluZygib3V0IiwgMyk7CiAg cHV0X2xheW91dGdldChkb3N5bSk7CiAgc2VuZF9zZW5kKCk7CiAgcGFyc2VfcmVwbHkoMSk7Cn0K CnZvaWQKcHV0X2xheW91dHJldHVybihpbnQgZG9zeW0pCnsKICBwdXQzMig1MSk7CiAgaWYoZG9z eW0gJiYgc3ltc3RhcnQgPT0gLTEpCiAgICBzeW1zdGFydCA9IG9pOwogIHB1dDMyKDEpOyAvLyBy ZWNsYWltCiAgcHV0MzIoNCk7IC8vIGxheW91dF90eXBlLCBGTEVYRklMRQogIHB1dDMyKDMpOyAv LyBpb21vZGUsIEFOWQogIHB1dDMyKDEpOyAvLyByZXR1cm50eXBlLCBGSUxFCiAgcHV0NjQoMCk7 IC8vIG9mZnNldAogIHB1dDY0KDgpOyAvLyBsZW5ndGgKICBwdXQzMigxKTsgLy8gc3RhdGVpZCBz ZXEgLS0gc3BlY2lhbCBjdXJyZW50IHN0YXRlaWQKICBmb3IoaW50IGkgPSAwOyBpIDwgMTI7IGkr KykKICAgIG9idWZbb2krK10gPSAwOwogIHB1dF9vcGFxdWVfcmVwZWF0KDY0LCAneCcpOyAvLyBs cmZfYm9keTw+Cn0KCnZvaWQKc2VuZF9sYXlvdXRyZXR1cm4oaW50IGRvc3ltKQp7CiAgc3lzKCJl Y2hvIDEyMzQ1Njc4OTAxMjM0NTYgPiAvdG1wL291dCIpOwogIHN5cygiY2hvd24gbm9ib2R5IC90 bXAvb3V0Iik7CiAgcHV0X2NvbXBvdW5kKDUpOwogIHB1dF9zZXF1ZW5jZSgpOwogIHB1dF9yb290 ZmgoKTsKICBwdXRfbG9va3VwKCJ0bXAiKTsKICBwdXRfb3Blbl9leGlzdGluZygib3V0IiwgMyk7 CiAgcHV0X2xheW91dHJldHVybihkb3N5bSk7CiAgc2VuZF9zZW5kKCk7CiAgcGFyc2VfcmVwbHko MSk7Cn0KCnZvaWQKcHV0X3NlY2luZm9fbm9fbmFtZShpbnQgZG9zeW0pCnsKICBwdXQzMig1Mik7 CiAgcHV0MzIoMSk7IC8vIDA9Q1VSUkVOVF9GSCwgMT1QQVJFTlQKfQoKdm9pZApzZW5kX3NlY2lu Zm9fbm9fbmFtZShpbnQgZG9zeW0pCnsKICBzeXMoImVjaG8gMTIzNDU2Nzg5MDEyMzQ1NiA+IC90 bXAvb3V0Iik7CiAgc3lzKCJjaG93biBub2JvZHkgL3RtcC9vdXQiKTsKICBwdXRfY29tcG91bmQo NSk7CiAgcHV0X3NlcXVlbmNlKCk7CiAgcHV0X3Jvb3RmaCgpOwogIHB1dF9sb29rdXAoInRtcCIp OwogIHB1dF9vcGVuX2V4aXN0aW5nKCJvdXQiLCAzKTsKICBwdXRfc2VjaW5mb19ub19uYW1lKGRv c3ltKTsKICBzZW5kX3NlbmQoKTsKICBwYXJzZV9yZXBseSgxKTsKfQoKdm9pZApwdXRfZ2V0X2Rp cl9kZWxlZ2F0aW9uKGludCBkb3N5bSkKewogIHB1dDMyKDQ2KTsKICBpZihkb3N5bSAmJiBzeW1z dGFydCA9PSAtMSkKICAgIHN5bXN0YXJ0ID0gb2k7CiAgcHV0MzIoMSk7IC8vIHNpZ25hbF9kZWxl dF9hdmFpbAogIHB1dDMyKDMpOyAvLyBub3RpZmljYXRpb25fdHlwZXMgYml0bWFwIGxlbmd0aAog IHB1dDMyKDB4ZmZmZmZmZmYpOwogIHB1dDMyKDB4ZmZmZmZmZmYpOwogIHB1dDMyKDB4ZmZmZmZm ZmYpOwogIHB1dDY0KDApOyAvLyBjaGlsZF9hdHRyX2RlbGF5CiAgcHV0NjQoMCk7CiAgcHV0NjQo MCk7IC8vIGRpcl9hdHRyX2RlbGF5CiAgcHV0NjQoMCk7CiAgcHV0MzIoMyk7IC8vIGNoaWxkX2F0 dHJpYnV0ZXMgYml0bWFwIGxlbmd0aAogIHB1dDMyKDB4ZmZmZmZmZmYpOwogIHB1dDMyKDB4ZmZm ZmZmZmYpOwogIHB1dDMyKDB4ZmZmZmZmZmYpOwogIHB1dDMyKDMpOyAvLyBkaXJfYXR0cmlidXRl cyBiaXRtYXAgbGVuZ3RoCiAgcHV0MzIoMHhmZmZmZmZmZik7CiAgcHV0MzIoMHhmZmZmZmZmZik7 CiAgcHV0MzIoMHhmZmZmZmZmZik7Cn0KCnZvaWQKc2VuZF9nZXRfZGlyX2RlbGVnYXRpb24oaW50 IGRvc3ltKQp7CiAgcHV0X2NvbXBvdW5kKDQpOwogIHB1dF9zZXF1ZW5jZSgpOwogIHB1dF9yb290 ZmgoKTsKICBwdXRfbG9va3VwKCJ0bXAiKTsKICBwdXRfZ2V0X2Rpcl9kZWxlZ2F0aW9uKGRvc3lt KTsKICBzZW5kX3NlbmQoKTsKICBwYXJzZV9yZXBseSgxKTsKfQoKdm9pZApzZW5kX2JsYWgoKQp7 CiAgcHV0X2NvbXBvdW5kKDQpOwogIHB1dF9zZXF1ZW5jZSgpOwogIHB1dF9yb290ZmgoKTsKICBw dXRfbG9va3VwKCJ0bXAiKTsKICBzeW1zdGFydCA9IG9pOwogIGZvcihpbnQgaSA9IDA7IGkgPCAz MjsgaSsrKQogICAgcHV0MzIoMHhmZmZmZmZmZik7CiAgc2VuZF9zZW5kKCk7CiAgcGFyc2VfcmVw bHkoMSk7Cn0KCnZvaWQKcHV0X3JlYWQoaW50IGRvc3ltKQp7CiAgcHV0MzIoMjUpOwogIGlmKGRv c3ltICYmIHN5bXN0YXJ0ID09IC0xKQogICAgc3ltc3RhcnQgPSBvaTsKICBwdXQzMihzdGF0ZWlk X3NlcWlkKTsgLy8gb3Blbl9zdGF0ZWlkLCBmcm9tIHByZXZpb3VzIE9QRU4KICBmb3IoaW50IGkg PSAwOyBpIDwgMTI7IGkrKykKICAgIG9idWZbb2krK10gPSBzdGF0ZWlkX290aGVyW2ldOwogIHB1 dDY0KDApOyAvLyBvZmZzZXQKICBwdXQzMig1MTIpOyAvLyBjb3VudAp9Cgp2b2lkCnNlbmRfcmVh ZChpbnQgZG9zeW0pCnsKICBwdXRfY29tcG91bmQoNSk7CiAgcHV0X3NlcXVlbmNlKCk7CiAgcHV0 X3Jvb3RmaCgpOwogIHB1dF9sb29rdXAoInRtcCIpOwogIHN5cygicm0gLWYgL3RtcC9mb29mOyBl Y2hvIGhlbGxvID4gL3RtcC9mb29mOyBjaG93biBub2JvZHkgL3RtcC9mb29mIik7CiAgcHV0X29w ZW5fZXhpc3RpbmcoImZvb2YiLCAxKTsKICBwdXRfcmVhZChkb3N5bSk7CiAgc2VuZF9zZW5kKCk7 CiAgcGFyc2VfcmVwbHkoMSk7Cn0KCnZvaWQKcHV0X3dyaXRlKGludCBkb3N5bSkKewogIHB1dDMy KDM4KTsKICBpZihkb3N5bSAmJiBzeW1zdGFydCA9PSAtMSkKICAgIHN5bXN0YXJ0ID0gb2k7CiAg cHV0MzIoc3RhdGVpZF9zZXFpZCk7IC8vIG9wZW5fc3RhdGVpZCwgZnJvbSBwcmV2aW91cyBPUEVO CiAgZm9yKGludCBpID0gMDsgaSA8IDEyOyBpKyspCiAgICBvYnVmW29pKytdID0gc3RhdGVpZF9v dGhlcltpXTsKICBwdXQ2NCgtOTk5OSk7IC8vIG9mZnNldAogIHB1dDMyKDApOyAvLyBzdGFibGVf aG93CiAgcHV0X29wYXF1ZSg2LCAiaGVsbG9cbiIpOyAvLyBkYXRhCn0KCnZvaWQKc2VuZF93cml0 ZShpbnQgZG9zeW0pCnsKICBwdXRfY29tcG91bmQoNSk7CiAgcHV0X3NlcXVlbmNlKCk7CiAgcHV0 X3Jvb3RmaCgpOwogIHB1dF9sb29rdXAoInRtcCIpOwogIHVubGluaygiL3RtcC9uZXduZXciKTsK ICBwdXRfb3Blbl9jcmVhdGUoIm5ld25ldyIsIDApOwogIHB1dF93cml0ZShkb3N5bSk7CiAgc2Vu ZF9zZW5kKCk7CiAgcGFyc2VfcmVwbHkoMSk7Cn0KCmludAptYWluKCl7CiAgc2V0bGluZWJ1Zihz dGRvdXQpOwogIHN0cnVjdCBybGltaXQgcjsKICByLnJsaW1fY3VyID0gci5ybGltX21heCA9IDA7 CiAgc2V0cmxpbWl0KFJMSU1JVF9DT1JFLCAmcik7CgogIC8vIC9ldGMvZXhwb3J0cwogIC8vIC90 bXAgMTI3LjAuMC4xKHJ3LHN1YnRyZWVfY2hlY2spCgogIHN5cygiL2V0Yy9pbml0LmQvcnBjYmlu ZCBzdGFydCIpOwogIHN5cygiL3Vzci9zYmluL3JwYy5pZG1hcGQiKTsKICBzeXMoIm1vdW50IC10 IG5mc2QgbmZzZCAvcHJvYy9mcy9uZnNkIik7CiAgc2xlZXAoMik7CiAgc3lzKCIvdXNyL3NiaW4v cnBjLm5mc2QgLS1sZWFzZS10aW1lIDEwIC0tZ3JhY2UtdGltZSAxMCAxIik7CiAgc2xlZXAoMik7 CiAgc3lzKCIvdXNyL3NiaW4vcnBjLm1vdW50ZCAtLW1hbmFnZS1naWRzIik7CiAgc2xlZXAoMik7 CiAgc3lzKCJleHBvcnRmcyAtYXUiKTsKICBzeXMoImV4cG9ydGZzIC1mIik7CiAgc3lzKCJleHBv cnRmcyAtciIpOwogIC8vc3lzKCJleHBvcnRmcyAtdiIpOwogIC8vIHN5cygicnBjZGVidWcgLW0g bmZzZCAtcyBhbGwiKTsKICAvLyBzeXMoInJwY2RlYnVnIC1tIG5mcyAtcyBhbGwiKTsKICAvLyBz eXMoInJwY2RlYnVnIC1tIHJwYyAtcyBhbGwiKTsKICAvL3N5cygiY2F0IC9wcm9jL2ZzL25mc2Qv ZXhwb3J0cyIpOwoKICBzID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKICBpbnQg eWVzID0gMTsKICBpZihzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnll cywgc2l6ZW9mKHllcykpIDwgMCkKICAgIHBlcnJvcigiU09fUkVVU0VBRERSIik7CiAgc3RydWN0 IHNvY2thZGRyX2luIHNpbjsKICBtZW1zZXQoJnNpbiwgMCwgc2l6ZW9mKHNpbikpOwogIHNpbi5z aW5fZmFtaWx5ID0gQUZfSU5FVDsKICBzaW4uc2luX2FkZHIuc19hZGRyID0gaW5ldF9hZGRyKCIx MjcuMC4wLjEiKTsKICBmb3IoaW50IGkgPSAxMDA7IGkgPCAxMDI0OyBpKyspewogICAgc2luLnNp bl9wb3J0ID0gaHRvbnMoaSk7CiAgICBpZihiaW5kKHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2lu LCBzaXplb2Yoc2luKSkgPT0gMCl7CiAgICAgIHByaW50ZigiYm91bmQgdG8gcG9ydCAlZFxuIiwg aSk7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBzaW4uc2luX3BvcnQgPSBodG9ucygyMDQ5KTsK CiAgc3luYygpOwogIHNsZWVwKDExKTsgLy8gZ3JhY2UgcGVyaW9kCgogIGlmKGNvbm5lY3Qocywg KHN0cnVjdCBzb2NrYWRkciAqKSZzaW4sIHNpemVvZihzaW4pKSA8IDApIHsKICAgIHBlcnJvcigi Y29ubmVjdCIpOwogICAgZXhpdCgxKTsKICB9CgogIGludCBwaWQgPSBmb3JrKCk7CiAgaWYocGlk ID09IDApewogICAgc2VuZF9ub3AoKTsKICAgIAogICAgLy8gc2VuZF9leGNoYW5nZV9pZF9zeW0o KTsKICAgIHNlbmRfZXhjaGFuZ2VfaWQoMCk7CiAgICAKICAgIHNlbmRfY3JlYXRlX3Nlc3Npb24o MCk7CgogICAgc2VuZF9yZWNsYWltX2NvbXBsZXRlKCk7CiAgICAKICAgIC8vIHNlcnZlciBtYXkg bWlzcyB0aGUgZmlyc3QgdGltZSwgeWllbGRpbmcgMTAwMDggTkZTNEVSUl9ERUxBWS4KICAgIC8v IHNvIHRyaWdnZXIgdGhlIHVwY2FsbCB0byBycGMubW91bnRkIGFuZCB3YWl0IGEgYml0LgogICAg c2VuZF9sb29rdXAoKTsKICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgMTUpOwogICAg c2xlZXAoMik7CgogICAgc2VuZF9ibGFoKCk7CiAgICAvLyBzZW5kX3dyaXRlKDApOwogICAgLy9z ZW5kX3JlYWQoMCk7CgogICAgLy8gc2VuZF9zZWNpbmZvX25vX25hbWUoMCk7CgogICAgLy8gc2Vu ZF9sYXlvdXRnZXQoMCk7CiAgICAvLyBzZW5kX2xheW91dHJldHVybigwKTsKCiAgICAvL3NlbmRf dmVyaWZ5KCk7CgogICAgLy9zZW5kX2p1bmsoNTEsIDIwKTsgLy8gNTEgaXMgTEFZT1VUUkVUVVJO CgogICAgLy9zZW5kX2xpc3R4YXR0cnMoKTsKCiAgICAvL3NlbmRfcHV0ZmgoKTsKICAgIAogICAg Ly9zZW5kX29wZW5fcmVhZCgpOwogICAgCiAgICAvLyBzZW5kX29wZW5fY3JlYXRlKCJuZXdmaWxl IiwgMCk7CiAgICAvLyBzZW5kX3JlbW92ZSgibmV3ZmlsZSIpOwogICAgCiAgICAvL3NlbmRfcmVh ZGRpcigwKTsKICAgIC8vc2VuZF9yZWFkZGlyKDEpOwoKICAgIC8vc3lzKCJybSAtZiAvdG1wL2Zy b2JvenogOyB0b3VjaCAvdG1wL2Zyb2JvenogOyBjaG93biBub2JvZHkgL3RtcC9mcm9ib3p6Iik7 CiAgICAvL3NlbmRfb3Blbl9leGlzdGluZygiZnJvYm96eiIsIDMpOyAvLyBmZXRjaCBzdGF0ZWlk LCBmb3IgbG9jawogICAgLy8gc2VuZF9zZXRhdHRyKDEpOwogICAgLy9zZW5kX3NldF9hY2woMSk7 CgogICAgLy9zZW5kX2NyZWF0ZSgpOwoKICAgIC8vc3lzKCJlY2hvIHh4eHh4eHh4eHggPiAvdG1w L2xvY2tmaWxlIDsgY2htb2Qgb2d1K3J3eCAvdG1wL2xvY2tmaWxlIik7CiAgICAvL3N5cygiY2hv d24gbm9ib2R5IC90bXAvbG9ja2ZpbGUiKTsKICAgIC8vc2VuZF9vcGVuX2V4aXN0aW5nKCJsb2Nr ZmlsZSIsIDMpOyAvLyBmZXRjaCBzdGF0ZWlkLCBmb3IgbG9jawogICAgLy9zZW5kX2xvY2soMCk7 CiAgICAvL3NlbmRfbG9jaygxKTsKICAgIC8vc2VuZF91bmxvY2soMSk7CgogICAgLy9zZW5kX2Rp cl9kZWxlZ2F0aW9uKDEpOwoKICAgIC8vIHNlbmRfc2V0eGF0dHIoMik7CgogICAgc2xlZXAoMik7 CiAgICBjbG9zZShzKTsKICAgIHNsZWVwKDEpOwoKICAgIGV4aXQoMCk7CiAgfQogIGNsb3NlKHMp OwoKICBmb3IoaW50IGkgPSAwOyBpIDwgNjA7IGkrKyl7CiAgICBzbGVlcCgxKTsKICAgIGludCBz dDsKICAgIGludCByZXQgPSB3YWl0cGlkKHBpZCwgJnN0LCBXTk9IQU5HKTsKICAgIGlmKHJldCA9 PSBwaWQpCiAgICAgIGJyZWFrOwogIH0KCn0K --=-=-=--