From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp1 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id +OLOHgf8JWCdPwAA0tVLHw (envelope-from ) for ; Fri, 12 Feb 2021 03:54:47 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp1 with LMTPS id WG16Ggf8JWCnHAAAbx9fmQ (envelope-from ) for ; Fri, 12 Feb 2021 03:54:47 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 6F7539404C7 for ; Fri, 12 Feb 2021 03:54:46 +0000 (UTC) Received: from localhost ([::1]:34396 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lAPXY-0003me-19 for larch@yhetil.org; Thu, 11 Feb 2021 22:54:44 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:60570) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lAPWs-0003lP-B9 for bug-guix@gnu.org; Thu, 11 Feb 2021 22:54:03 -0500 Received: from debbugs.gnu.org ([209.51.188.43]:48157) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1lAPWs-0003vR-3J for bug-guix@gnu.org; Thu, 11 Feb 2021 22:54:02 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1lAPWr-0007ir-Vw for bug-guix@gnu.org; Thu, 11 Feb 2021 22:54:02 -0500 X-Loop: help-debbugs@gnu.org Subject: bug#46456: [core-updates] d3.v5.js source checksum changed Resent-From: Danny Milosavljevic Original-Sender: "Debbugs-submit" Resent-CC: bug-guix@gnu.org Resent-Date: Fri, 12 Feb 2021 03:54:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 46456 X-GNU-PR-Package: guix X-GNU-PR-Keywords: To: 46456@debbugs.gnu.org X-Debbugs-Original-To: Received: via spool by submit@debbugs.gnu.org id=B.161310200929644 (code B ref -1); Fri, 12 Feb 2021 03:54:01 +0000 Received: (at submit) by debbugs.gnu.org; 12 Feb 2021 03:53:29 +0000 Received: from localhost ([127.0.0.1]:59704 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lAPWL-0007i3-DD for submit@debbugs.gnu.org; Thu, 11 Feb 2021 22:53:29 -0500 Received: from lists.gnu.org ([209.51.188.17]:35164) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1lAPWJ-0007hw-JK for submit@debbugs.gnu.org; Thu, 11 Feb 2021 22:53:27 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:60488) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lAPWJ-0003P4-7E for bug-guix@gnu.org; Thu, 11 Feb 2021 22:53:27 -0500 Received: from dd26836.kasserver.com ([85.13.145.193]:53900) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lAPWF-0003YZ-4v for bug-guix@gnu.org; Thu, 11 Feb 2021 22:53:26 -0500 Received: from localhost (80-110-127-104.cgn.dynamic.surfer.at [80.110.127.104]) by dd26836.kasserver.com (Postfix) with ESMTPSA id 8724D3363970 for ; Fri, 12 Feb 2021 04:53:19 +0100 (CET) Date: Fri, 12 Feb 2021 04:53:15 +0100 From: Danny Milosavljevic Message-ID: <20210212045315.3f4e0a82@scratchpost.org> X-Mailer: Claws Mail 3.17.8 (GTK+ 2.24.32; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/ahh=buR+DkTF93fKWPzRP2H"; protocol="application/pgp-signature"; micalg=pgp-sha512 Received-SPF: none client-ip=85.13.145.193; envelope-from=dannym@scratchpost.org; helo=dd26836.kasserver.com X-Spam_score_int: -25 X-Spam_score: -2.6 X-Spam_bar: -- X-Spam_report: (-2.6 / 5.0 requ) BAYES_00=-1.9, RCVD_IN_DNSWL_LOW=-0.7, SPF_HELO_NONE=0.001, SPF_NONE=0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-guix@gnu.org List-Id: Bug reports for GNU Guix List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-guix-bounces+larch=yhetil.org@gnu.org Sender: "bug-Guix" X-Migadu-Flow: FLOW_IN X-Migadu-Spam-Score: 1.54 Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=none; spf=pass (aspmx1.migadu.com: domain of bug-guix-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=bug-guix-bounces@gnu.org X-Migadu-Queue-Id: 6F7539404C7 X-Spam-Score: 1.54 X-Migadu-Scanner: scn1.migadu.com X-TUID: K5DNKe0go5n4 --Sig_/ahh=buR+DkTF93fKWPzRP2H Content-Type: multipart/mixed; boundary="MP_/huV/jc.jjRG1tiqg+FFlax7" --MP_/huV/jc.jjRG1tiqg+FFlax7 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable Content-Disposition: inline Starting download of /gnu/store/bf496ni94ik19gdxkgp0vddkfxbid2vf-d3.v5.js =46rom https://d3js.org/d3.v5.js... downloading from https://d3js.org/d3.v5.js ... d3.v5.js = 2.22GiB/s 00:00 | 504KiB tr= ansferred sha256 hash mismatch for /gnu/store/bf496ni94ik19gdxkgp0vddkfxbid2vf-d3.v5.= js: expected hash: 0kxvx5pfagxn6nhavdwsdnzyd26g0z5dsfi1pi5dvcmb0c8ipcdn actual hash: 177ypw6mjrp2ch9lj6znibwacwrvm4ypjxflsxsnl2sigx5dcwic hash mismatch for store item '/gnu/store/bf496ni94ik19gdxkgp0vddkfxbid2vf-d= 3.v5.js' build of /gnu/store/wqv41s7q5hxmx1am1000nm66rgkbljz0-d3.v5.js.drv failed View build log at '/var/log/guix/drvs/wq/v41s7q5hxmx1am1000nm66rgkbljz0-d3.= v5.js.drv.bz2'. building /gnu/store/7adynsyb7524qxkjxymyysva7dlslbvm-d3Network_0.5.2.1.tar.= gz.drv... cannot build derivation `/gnu/store/ahvcirzbb60xxy1mk1dk1shp2yfghcyy-r-d3r-= 0.9.1.drv': 1 dependencies couldn't be built Attached is the file I got. --MP_/huV/jc.jjRG1tiqg+FFlax7 Content-Type: application/javascript Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=bf496ni94ik19gdxkgp0vddkfxbid2vf-d3.v5.js Ly8gaHR0cHM6Ly9kM2pzLm9yZyB2NS4xNi4wIENvcHlyaWdodCAyMDIwIE1pa2UgQm9zdG9jawoo ZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgewp0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcg JiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDoKdHlw ZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0 cyddLCBmYWN0b3J5KSA6CihnbG9iYWwgPSBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwu ZDMgPSBnbG9iYWwuZDMgfHwge30pKTsKfSh0aGlzLCBmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNl IHN0cmljdCc7Cgp2YXIgdmVyc2lvbiA9ICI1LjE2LjAiOwoKZnVuY3Rpb24gYXNjZW5kaW5nKGEs IGIpIHsKICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47 Cn0KCmZ1bmN0aW9uIGJpc2VjdG9yKGNvbXBhcmUpIHsKICBpZiAoY29tcGFyZS5sZW5ndGggPT09 IDEpIGNvbXBhcmUgPSBhc2NlbmRpbmdDb21wYXJhdG9yKGNvbXBhcmUpOwogIHJldHVybiB7CiAg ICBsZWZ0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsKICAgICAgaWYgKGxvID09IG51bGwpIGxv ID0gMDsKICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7CiAgICAgIHdoaWxlIChs byA8IGhpKSB7CiAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4+IDE7CiAgICAgICAgaWYgKGNv bXBhcmUoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTsKICAgICAgICBlbHNlIGhpID0gbWlk OwogICAgICB9CiAgICAgIHJldHVybiBsbzsKICAgIH0sCiAgICByaWdodDogZnVuY3Rpb24oYSwg eCwgbG8sIGhpKSB7CiAgICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7CiAgICAgIGlmIChoaSA9 PSBudWxsKSBoaSA9IGEubGVuZ3RoOwogICAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgIHZh ciBtaWQgPSBsbyArIGhpID4+PiAxOwogICAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPiAw KSBoaSA9IG1pZDsKICAgICAgICBlbHNlIGxvID0gbWlkICsgMTsKICAgICAgfQogICAgICByZXR1 cm4gbG87CiAgICB9CiAgfTsKfQoKZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihmKSB7CiAg cmV0dXJuIGZ1bmN0aW9uKGQsIHgpIHsKICAgIHJldHVybiBhc2NlbmRpbmcoZihkKSwgeCk7CiAg fTsKfQoKdmFyIGFzY2VuZGluZ0Jpc2VjdCA9IGJpc2VjdG9yKGFzY2VuZGluZyk7CnZhciBiaXNl Y3RSaWdodCA9IGFzY2VuZGluZ0Jpc2VjdC5yaWdodDsKdmFyIGJpc2VjdExlZnQgPSBhc2NlbmRp bmdCaXNlY3QubGVmdDsKCmZ1bmN0aW9uIHBhaXJzKGFycmF5LCBmKSB7CiAgaWYgKGYgPT0gbnVs bCkgZiA9IHBhaXI7CiAgdmFyIGkgPSAwLCBuID0gYXJyYXkubGVuZ3RoIC0gMSwgcCA9IGFycmF5 WzBdLCBwYWlycyA9IG5ldyBBcnJheShuIDwgMCA/IDAgOiBuKTsKICB3aGlsZSAoaSA8IG4pIHBh aXJzW2ldID0gZihwLCBwID0gYXJyYXlbKytpXSk7CiAgcmV0dXJuIHBhaXJzOwp9CgpmdW5jdGlv biBwYWlyKGEsIGIpIHsKICByZXR1cm4gW2EsIGJdOwp9CgpmdW5jdGlvbiBjcm9zcyh2YWx1ZXMw LCB2YWx1ZXMxLCByZWR1Y2UpIHsKICB2YXIgbjAgPSB2YWx1ZXMwLmxlbmd0aCwKICAgICAgbjEg PSB2YWx1ZXMxLmxlbmd0aCwKICAgICAgdmFsdWVzID0gbmV3IEFycmF5KG4wICogbjEpLAogICAg ICBpMCwKICAgICAgaTEsCiAgICAgIGksCiAgICAgIHZhbHVlMDsKCiAgaWYgKHJlZHVjZSA9PSBu dWxsKSByZWR1Y2UgPSBwYWlyOwoKICBmb3IgKGkwID0gaSA9IDA7IGkwIDwgbjA7ICsraTApIHsK ICAgIGZvciAodmFsdWUwID0gdmFsdWVzMFtpMF0sIGkxID0gMDsgaTEgPCBuMTsgKytpMSwgKytp KSB7CiAgICAgIHZhbHVlc1tpXSA9IHJlZHVjZSh2YWx1ZTAsIHZhbHVlczFbaTFdKTsKICAgIH0K ICB9CgogIHJldHVybiB2YWx1ZXM7Cn0KCmZ1bmN0aW9uIGRlc2NlbmRpbmcoYSwgYikgewogIHJl dHVybiBiIDwgYSA/IC0xIDogYiA+IGEgPyAxIDogYiA+PSBhID8gMCA6IE5hTjsKfQoKZnVuY3Rp b24gbnVtYmVyKHgpIHsKICByZXR1cm4geCA9PT0gbnVsbCA/IE5hTiA6ICt4Owp9CgpmdW5jdGlv biB2YXJpYW5jZSh2YWx1ZXMsIHZhbHVlb2YpIHsKICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsCiAg ICAgIG0gPSAwLAogICAgICBpID0gLTEsCiAgICAgIG1lYW4gPSAwLAogICAgICB2YWx1ZSwKICAg ICAgZGVsdGEsCiAgICAgIHN1bSA9IDA7CgogIGlmICh2YWx1ZW9mID09IG51bGwpIHsKICAgIHdo aWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICghaXNOYU4odmFsdWUgPSBudW1iZXIodmFsdWVzW2ld KSkpIHsKICAgICAgICBkZWx0YSA9IHZhbHVlIC0gbWVhbjsKICAgICAgICBtZWFuICs9IGRlbHRh IC8gKyttOwogICAgICAgIHN1bSArPSBkZWx0YSAqICh2YWx1ZSAtIG1lYW4pOwogICAgICB9CiAg ICB9CiAgfQoKICBlbHNlIHsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICghaXNOYU4o dmFsdWUgPSBudW1iZXIodmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpKSkgewogICAgICAg IGRlbHRhID0gdmFsdWUgLSBtZWFuOwogICAgICAgIG1lYW4gKz0gZGVsdGEgLyArK207CiAgICAg ICAgc3VtICs9IGRlbHRhICogKHZhbHVlIC0gbWVhbik7CiAgICAgIH0KICAgIH0KICB9CgogIGlm IChtID4gMSkgcmV0dXJuIHN1bSAvIChtIC0gMSk7Cn0KCmZ1bmN0aW9uIGRldmlhdGlvbihhcnJh eSwgZikgewogIHZhciB2ID0gdmFyaWFuY2UoYXJyYXksIGYpOwogIHJldHVybiB2ID8gTWF0aC5z cXJ0KHYpIDogdjsKfQoKZnVuY3Rpb24gZXh0ZW50KHZhbHVlcywgdmFsdWVvZikgewogIHZhciBu ID0gdmFsdWVzLmxlbmd0aCwKICAgICAgaSA9IC0xLAogICAgICB2YWx1ZSwKICAgICAgbWluLAog ICAgICBtYXg7CgogIGlmICh2YWx1ZW9mID09IG51bGwpIHsKICAgIHdoaWxlICgrK2kgPCBuKSB7 IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuCiAgICAgIGlmICgodmFsdWUgPSB2 YWx1ZXNbaV0pICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHsKICAgICAgICBtaW4gPSBtYXgg PSB2YWx1ZTsKICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5p bmcgdmFsdWVzLgogICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCkgewog ICAgICAgICAgICBpZiAobWluID4gdmFsdWUpIG1pbiA9IHZhbHVlOwogICAgICAgICAgICBpZiAo bWF4IDwgdmFsdWUpIG1heCA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQog ICAgfQogIH0KCiAgZWxzZSB7CiAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJz dCBjb21wYXJhYmxlIHZhbHVlLgogICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0s IGksIHZhbHVlcykpICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHsKICAgICAgICBtaW4gPSBt YXggPSB2YWx1ZTsKICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1h aW5pbmcgdmFsdWVzLgogICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBp LCB2YWx1ZXMpKSAhPSBudWxsKSB7CiAgICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0g dmFsdWU7CiAgICAgICAgICAgIGlmIChtYXggPCB2YWx1ZSkgbWF4ID0gdmFsdWU7CiAgICAgICAg ICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gW21pbiwgbWF4XTsKfQoK dmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlOwoKdmFyIHNsaWNlID0gYXJyYXkuc2xpY2U7CnZh ciBtYXAgPSBhcnJheS5tYXA7CgpmdW5jdGlvbiBjb25zdGFudCh4KSB7CiAgcmV0dXJuIGZ1bmN0 aW9uKCkgewogICAgcmV0dXJuIHg7CiAgfTsKfQoKZnVuY3Rpb24gaWRlbnRpdHkoeCkgewogIHJl dHVybiB4Owp9CgpmdW5jdGlvbiBzZXF1ZW5jZShzdGFydCwgc3RvcCwgc3RlcCkgewogIHN0YXJ0 ID0gK3N0YXJ0LCBzdG9wID0gK3N0b3AsIHN0ZXAgPSAobiA9IGFyZ3VtZW50cy5sZW5ndGgpIDwg MiA/IChzdG9wID0gc3RhcnQsIHN0YXJ0ID0gMCwgMSkgOiBuIDwgMyA/IDEgOiArc3RlcDsKCiAg dmFyIGkgPSAtMSwKICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0 KSAvIHN0ZXApKSB8IDAsCiAgICAgIHJhbmdlID0gbmV3IEFycmF5KG4pOwoKICB3aGlsZSAoKytp IDwgbikgewogICAgcmFuZ2VbaV0gPSBzdGFydCArIGkgKiBzdGVwOwogIH0KCiAgcmV0dXJuIHJh bmdlOwp9Cgp2YXIgZTEwID0gTWF0aC5zcXJ0KDUwKSwKICAgIGU1ID0gTWF0aC5zcXJ0KDEwKSwK ICAgIGUyID0gTWF0aC5zcXJ0KDIpOwoKZnVuY3Rpb24gdGlja3Moc3RhcnQsIHN0b3AsIGNvdW50 KSB7CiAgdmFyIHJldmVyc2UsCiAgICAgIGkgPSAtMSwKICAgICAgbiwKICAgICAgdGlja3MsCiAg ICAgIHN0ZXA7CgogIHN0b3AgPSArc3RvcCwgc3RhcnQgPSArc3RhcnQsIGNvdW50ID0gK2NvdW50 OwogIGlmIChzdGFydCA9PT0gc3RvcCAmJiBjb3VudCA+IDApIHJldHVybiBbc3RhcnRdOwogIGlm IChyZXZlcnNlID0gc3RvcCA8IHN0YXJ0KSBuID0gc3RhcnQsIHN0YXJ0ID0gc3RvcCwgc3RvcCA9 IG47CiAgaWYgKChzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpKSA9PT0g MCB8fCAhaXNGaW5pdGUoc3RlcCkpIHJldHVybiBbXTsKCiAgaWYgKHN0ZXAgPiAwKSB7CiAgICBz dGFydCA9IE1hdGguY2VpbChzdGFydCAvIHN0ZXApOwogICAgc3RvcCA9IE1hdGguZmxvb3Ioc3Rv cCAvIHN0ZXApOwogICAgdGlja3MgPSBuZXcgQXJyYXkobiA9IE1hdGguY2VpbChzdG9wIC0gc3Rh cnQgKyAxKSk7CiAgICB3aGlsZSAoKytpIDwgbikgdGlja3NbaV0gPSAoc3RhcnQgKyBpKSAqIHN0 ZXA7CiAgfSBlbHNlIHsKICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCAqIHN0ZXApOwogICAg c3RvcCA9IE1hdGguY2VpbChzdG9wICogc3RlcCk7CiAgICB0aWNrcyA9IG5ldyBBcnJheShuID0g TWF0aC5jZWlsKHN0YXJ0IC0gc3RvcCArIDEpKTsKICAgIHdoaWxlICgrK2kgPCBuKSB0aWNrc1tp XSA9IChzdGFydCAtIGkpIC8gc3RlcDsKICB9CgogIGlmIChyZXZlcnNlKSB0aWNrcy5yZXZlcnNl KCk7CgogIHJldHVybiB0aWNrczsKfQoKZnVuY3Rpb24gdGlja0luY3JlbWVudChzdGFydCwgc3Rv cCwgY291bnQpIHsKICB2YXIgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291 bnQpLAogICAgICBwb3dlciA9IE1hdGguZmxvb3IoTWF0aC5sb2coc3RlcCkgLyBNYXRoLkxOMTAp LAogICAgICBlcnJvciA9IHN0ZXAgLyBNYXRoLnBvdygxMCwgcG93ZXIpOwogIHJldHVybiBwb3dl ciA+PSAwCiAgICAgID8gKGVycm9yID49IGUxMCA/IDEwIDogZXJyb3IgPj0gZTUgPyA1IDogZXJy b3IgPj0gZTIgPyAyIDogMSkgKiBNYXRoLnBvdygxMCwgcG93ZXIpCiAgICAgIDogLU1hdGgucG93 KDEwLCAtcG93ZXIpIC8gKGVycm9yID49IGUxMCA/IDEwIDogZXJyb3IgPj0gZTUgPyA1IDogZXJy b3IgPj0gZTIgPyAyIDogMSk7Cn0KCmZ1bmN0aW9uIHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3Vu dCkgewogIHZhciBzdGVwMCA9IE1hdGguYWJzKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgwLCBj b3VudCksCiAgICAgIHN0ZXAxID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2coc3Rl cDApIC8gTWF0aC5MTjEwKSksCiAgICAgIGVycm9yID0gc3RlcDAgLyBzdGVwMTsKICBpZiAoZXJy b3IgPj0gZTEwKSBzdGVwMSAqPSAxMDsKICBlbHNlIGlmIChlcnJvciA+PSBlNSkgc3RlcDEgKj0g NTsKICBlbHNlIGlmIChlcnJvciA+PSBlMikgc3RlcDEgKj0gMjsKICByZXR1cm4gc3RvcCA8IHN0 YXJ0ID8gLXN0ZXAxIDogc3RlcDE7Cn0KCmZ1bmN0aW9uIHRocmVzaG9sZFN0dXJnZXModmFsdWVz KSB7CiAgcmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh2YWx1ZXMubGVuZ3RoKSAvIE1hdGguTE4y KSArIDE7Cn0KCmZ1bmN0aW9uIGhpc3RvZ3JhbSgpIHsKICB2YXIgdmFsdWUgPSBpZGVudGl0eSwK ICAgICAgZG9tYWluID0gZXh0ZW50LAogICAgICB0aHJlc2hvbGQgPSB0aHJlc2hvbGRTdHVyZ2Vz OwoKICBmdW5jdGlvbiBoaXN0b2dyYW0oZGF0YSkgewogICAgdmFyIGksCiAgICAgICAgbiA9IGRh dGEubGVuZ3RoLAogICAgICAgIHgsCiAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KG4pOwoKICAg IGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgdmFsdWVzW2ldID0gdmFsdWUoZGF0YVtp XSwgaSwgZGF0YSk7CiAgICB9CgogICAgdmFyIHh6ID0gZG9tYWluKHZhbHVlcyksCiAgICAgICAg eDAgPSB4elswXSwKICAgICAgICB4MSA9IHh6WzFdLAogICAgICAgIHR6ID0gdGhyZXNob2xkKHZh bHVlcywgeDAsIHgxKTsKCiAgICAvLyBDb252ZXJ0IG51bWJlciBvZiB0aHJlc2hvbGRzIGludG8g dW5pZm9ybSB0aHJlc2hvbGRzLgogICAgaWYgKCFBcnJheS5pc0FycmF5KHR6KSkgewogICAgICB0 eiA9IHRpY2tTdGVwKHgwLCB4MSwgdHopOwogICAgICB0eiA9IHNlcXVlbmNlKE1hdGguY2VpbCh4 MCAvIHR6KSAqIHR6LCB4MSwgdHopOyAvLyBleGNsdXNpdmUKICAgIH0KCiAgICAvLyBSZW1vdmUg YW55IHRocmVzaG9sZHMgb3V0c2lkZSB0aGUgZG9tYWluLgogICAgdmFyIG0gPSB0ei5sZW5ndGg7 CiAgICB3aGlsZSAodHpbMF0gPD0geDApIHR6LnNoaWZ0KCksIC0tbTsKICAgIHdoaWxlICh0eltt IC0gMV0gPiB4MSkgdHoucG9wKCksIC0tbTsKCiAgICB2YXIgYmlucyA9IG5ldyBBcnJheShtICsg MSksCiAgICAgICAgYmluOwoKICAgIC8vIEluaXRpYWxpemUgYmlucy4KICAgIGZvciAoaSA9IDA7 IGkgPD0gbTsgKytpKSB7CiAgICAgIGJpbiA9IGJpbnNbaV0gPSBbXTsKICAgICAgYmluLngwID0g aSA+IDAgPyB0eltpIC0gMV0gOiB4MDsKICAgICAgYmluLngxID0gaSA8IG0gPyB0eltpXSA6IHgx OwogICAgfQoKICAgIC8vIEFzc2lnbiBkYXRhIHRvIGJpbnMgYnkgdmFsdWUsIGlnbm9yaW5nIGFu eSBvdXRzaWRlIHRoZSBkb21haW4uCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAg IHggPSB2YWx1ZXNbaV07CiAgICAgIGlmICh4MCA8PSB4ICYmIHggPD0geDEpIHsKICAgICAgICBi aW5zW2Jpc2VjdFJpZ2h0KHR6LCB4LCAwLCBtKV0ucHVzaChkYXRhW2ldKTsKICAgICAgfQogICAg fQoKICAgIHJldHVybiBiaW5zOwogIH0KCiAgaGlzdG9ncmFtLnZhbHVlID0gZnVuY3Rpb24oXykg ewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWUgPSB0eXBlb2YgXyA9PT0gImZ1 bmN0aW9uIiA/IF8gOiBjb25zdGFudChfKSwgaGlzdG9ncmFtKSA6IHZhbHVlOwogIH07CgogIGhp c3RvZ3JhbS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/IChkb21haW4gPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudChbX1sw XSwgX1sxXV0pLCBoaXN0b2dyYW0pIDogZG9tYWluOwogIH07CgogIGhpc3RvZ3JhbS50aHJlc2hv bGRzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhyZXNo b2xkID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogQXJyYXkuaXNBcnJheShfKSA/IGNv bnN0YW50KHNsaWNlLmNhbGwoXykpIDogY29uc3RhbnQoXyksIGhpc3RvZ3JhbSkgOiB0aHJlc2hv bGQ7CiAgfTsKCiAgcmV0dXJuIGhpc3RvZ3JhbTsKfQoKZnVuY3Rpb24gdGhyZXNob2xkKHZhbHVl cywgcCwgdmFsdWVvZikgewogIGlmICh2YWx1ZW9mID09IG51bGwpIHZhbHVlb2YgPSBudW1iZXI7 CiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpKSByZXR1cm47CiAgaWYgKChwID0gK3ApIDw9IDAg fHwgbiA8IDIpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbMF0sIDAsIHZhbHVlcyk7CiAgaWYgKHAg Pj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpOwogIHZh ciBuLAogICAgICBpID0gKG4gLSAxKSAqIHAsCiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSwKICAg ICAgdmFsdWUwID0gK3ZhbHVlb2YodmFsdWVzW2kwXSwgaTAsIHZhbHVlcyksCiAgICAgIHZhbHVl MSA9ICt2YWx1ZW9mKHZhbHVlc1tpMCArIDFdLCBpMCArIDEsIHZhbHVlcyk7CiAgcmV0dXJuIHZh bHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7Cn0KCmZ1bmN0aW9uIGZyZWVkbWFu RGlhY29uaXModmFsdWVzLCBtaW4sIG1heCkgewogIHZhbHVlcyA9IG1hcC5jYWxsKHZhbHVlcywg bnVtYmVyKS5zb3J0KGFzY2VuZGluZyk7CiAgcmV0dXJuIE1hdGguY2VpbCgobWF4IC0gbWluKSAv ICgyICogKHRocmVzaG9sZCh2YWx1ZXMsIDAuNzUpIC0gdGhyZXNob2xkKHZhbHVlcywgMC4yNSkp ICogTWF0aC5wb3codmFsdWVzLmxlbmd0aCwgLTEgLyAzKSkpOwp9CgpmdW5jdGlvbiBzY290dCh2 YWx1ZXMsIG1pbiwgbWF4KSB7CiAgcmV0dXJuIE1hdGguY2VpbCgobWF4IC0gbWluKSAvICgzLjUg KiBkZXZpYXRpb24odmFsdWVzKSAqIE1hdGgucG93KHZhbHVlcy5sZW5ndGgsIC0xIC8gMykpKTsK fQoKZnVuY3Rpb24gbWF4KHZhbHVlcywgdmFsdWVvZikgewogIHZhciBuID0gdmFsdWVzLmxlbmd0 aCwKICAgICAgaSA9IC0xLAogICAgICB2YWx1ZSwKICAgICAgbWF4OwoKICBpZiAodmFsdWVvZiA9 PSBudWxsKSB7CiAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJh YmxlIHZhbHVlLgogICAgICBpZiAoKHZhbHVlID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIHZhbHVl ID49IHZhbHVlKSB7CiAgICAgICAgbWF4ID0gdmFsdWU7CiAgICAgICAgd2hpbGUgKCsraSA8IG4p IHsgLy8gQ29tcGFyZSB0aGUgcmVtYWluaW5nIHZhbHVlcy4KICAgICAgICAgIGlmICgodmFsdWUg PSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgdmFsdWUgPiBtYXgpIHsKICAgICAgICAgICAgbWF4ID0g dmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICBlbHNlIHsK ICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUu CiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVs bCAmJiB2YWx1ZSA+PSB2YWx1ZSkgewogICAgICAgIG1heCA9IHZhbHVlOwogICAgICAgIHdoaWxl ICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuCiAgICAgICAgICBp ZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpICE9IG51bGwgJiYgdmFs dWUgPiBtYXgpIHsKICAgICAgICAgICAgbWF4ID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAg fQogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gbWF4Owp9CgpmdW5jdGlvbiBtZWFuKHZhbHVl cywgdmFsdWVvZikgewogIHZhciBuID0gdmFsdWVzLmxlbmd0aCwKICAgICAgbSA9IG4sCiAgICAg IGkgPSAtMSwKICAgICAgdmFsdWUsCiAgICAgIHN1bSA9IDA7CgogIGlmICh2YWx1ZW9mID09IG51 bGwpIHsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICghaXNOYU4odmFsdWUgPSBudW1i ZXIodmFsdWVzW2ldKSkpIHN1bSArPSB2YWx1ZTsKICAgICAgZWxzZSAtLW07CiAgICB9CiAgfQoK ICBlbHNlIHsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICghaXNOYU4odmFsdWUgPSBu dW1iZXIodmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpKSkgc3VtICs9IHZhbHVlOwogICAg ICBlbHNlIC0tbTsKICAgIH0KICB9CgogIGlmIChtKSByZXR1cm4gc3VtIC8gbTsKfQoKZnVuY3Rp b24gbWVkaWFuKHZhbHVlcywgdmFsdWVvZikgewogIHZhciBuID0gdmFsdWVzLmxlbmd0aCwKICAg ICAgaSA9IC0xLAogICAgICB2YWx1ZSwKICAgICAgbnVtYmVycyA9IFtdOwoKICBpZiAodmFsdWVv ZiA9PSBudWxsKSB7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBpZiAoIWlzTmFOKHZhbHVl ID0gbnVtYmVyKHZhbHVlc1tpXSkpKSB7CiAgICAgICAgbnVtYmVycy5wdXNoKHZhbHVlKTsKICAg ICAgfQogICAgfQogIH0KCiAgZWxzZSB7CiAgICB3aGlsZSAoKytpIDwgbikgewogICAgICBpZiAo IWlzTmFOKHZhbHVlID0gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSkpIHsK ICAgICAgICBudW1iZXJzLnB1c2godmFsdWUpOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4g dGhyZXNob2xkKG51bWJlcnMuc29ydChhc2NlbmRpbmcpLCAwLjUpOwp9CgpmdW5jdGlvbiBtZXJn ZShhcnJheXMpIHsKICB2YXIgbiA9IGFycmF5cy5sZW5ndGgsCiAgICAgIG0sCiAgICAgIGkgPSAt MSwKICAgICAgaiA9IDAsCiAgICAgIG1lcmdlZCwKICAgICAgYXJyYXk7CgogIHdoaWxlICgrK2kg PCBuKSBqICs9IGFycmF5c1tpXS5sZW5ndGg7CiAgbWVyZ2VkID0gbmV3IEFycmF5KGopOwoKICB3 aGlsZSAoLS1uID49IDApIHsKICAgIGFycmF5ID0gYXJyYXlzW25dOwogICAgbSA9IGFycmF5Lmxl bmd0aDsKICAgIHdoaWxlICgtLW0gPj0gMCkgewogICAgICBtZXJnZWRbLS1qXSA9IGFycmF5W21d OwogICAgfQogIH0KCiAgcmV0dXJuIG1lcmdlZDsKfQoKZnVuY3Rpb24gbWluKHZhbHVlcywgdmFs dWVvZikgewogIHZhciBuID0gdmFsdWVzLmxlbmd0aCwKICAgICAgaSA9IC0xLAogICAgICB2YWx1 ZSwKICAgICAgbWluOwoKICBpZiAodmFsdWVvZiA9PSBudWxsKSB7CiAgICB3aGlsZSAoKytpIDwg bikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLgogICAgICBpZiAoKHZhbHVl ID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7CiAgICAgICAgbWluID0g dmFsdWU7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gQ29tcGFyZSB0aGUgcmVtYWluaW5n IHZhbHVlcy4KICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgbWlu ID4gdmFsdWUpIHsKICAgICAgICAgICAgbWluID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAg fQogICAgICB9CiAgICB9CiAgfQoKICBlbHNlIHsKICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZp bmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuCiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9m KHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVsbCAmJiB2YWx1ZSA+PSB2YWx1ZSkgewogICAg ICAgIG1pbiA9IHZhbHVlOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhl IHJlbWFpbmluZyB2YWx1ZXMuCiAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNb aV0sIGksIHZhbHVlcykpICE9IG51bGwgJiYgbWluID4gdmFsdWUpIHsKICAgICAgICAgICAgbWlu ID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICByZXR1 cm4gbWluOwp9CgpmdW5jdGlvbiBwZXJtdXRlKGFycmF5LCBpbmRleGVzKSB7CiAgdmFyIGkgPSBp bmRleGVzLmxlbmd0aCwgcGVybXV0ZXMgPSBuZXcgQXJyYXkoaSk7CiAgd2hpbGUgKGktLSkgcGVy bXV0ZXNbaV0gPSBhcnJheVtpbmRleGVzW2ldXTsKICByZXR1cm4gcGVybXV0ZXM7Cn0KCmZ1bmN0 aW9uIHNjYW4odmFsdWVzLCBjb21wYXJlKSB7CiAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpKSBy ZXR1cm47CiAgdmFyIG4sCiAgICAgIGkgPSAwLAogICAgICBqID0gMCwKICAgICAgeGksCiAgICAg IHhqID0gdmFsdWVzW2pdOwoKICBpZiAoY29tcGFyZSA9PSBudWxsKSBjb21wYXJlID0gYXNjZW5k aW5nOwoKICB3aGlsZSAoKytpIDwgbikgewogICAgaWYgKGNvbXBhcmUoeGkgPSB2YWx1ZXNbaV0s IHhqKSA8IDAgfHwgY29tcGFyZSh4aiwgeGopICE9PSAwKSB7CiAgICAgIHhqID0geGksIGogPSBp OwogICAgfQogIH0KCiAgaWYgKGNvbXBhcmUoeGosIHhqKSA9PT0gMCkgcmV0dXJuIGo7Cn0KCmZ1 bmN0aW9uIHNodWZmbGUoYXJyYXksIGkwLCBpMSkgewogIHZhciBtID0gKGkxID09IG51bGwgPyBh cnJheS5sZW5ndGggOiBpMSkgLSAoaTAgPSBpMCA9PSBudWxsID8gMCA6ICtpMCksCiAgICAgIHQs CiAgICAgIGk7CgogIHdoaWxlIChtKSB7CiAgICBpID0gTWF0aC5yYW5kb20oKSAqIG0tLSB8IDA7 CiAgICB0ID0gYXJyYXlbbSArIGkwXTsKICAgIGFycmF5W20gKyBpMF0gPSBhcnJheVtpICsgaTBd OwogICAgYXJyYXlbaSArIGkwXSA9IHQ7CiAgfQoKICByZXR1cm4gYXJyYXk7Cn0KCmZ1bmN0aW9u IHN1bSh2YWx1ZXMsIHZhbHVlb2YpIHsKICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsCiAgICAgIGkg PSAtMSwKICAgICAgdmFsdWUsCiAgICAgIHN1bSA9IDA7CgogIGlmICh2YWx1ZW9mID09IG51bGwp IHsKICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGlmICh2YWx1ZSA9ICt2YWx1ZXNbaV0pIHN1 bSArPSB2YWx1ZTsgLy8gTm90ZTogemVybyBhbmQgbnVsbCBhcmUgZXF1aXZhbGVudC4KICAgIH0K ICB9CgogIGVsc2UgewogICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgaWYgKHZhbHVlID0gK3Zh bHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSBzdW0gKz0gdmFsdWU7CiAgICB9CiAgfQoKICBy ZXR1cm4gc3VtOwp9CgpmdW5jdGlvbiB0cmFuc3Bvc2UobWF0cml4KSB7CiAgaWYgKCEobiA9IG1h dHJpeC5sZW5ndGgpKSByZXR1cm4gW107CiAgZm9yICh2YXIgaSA9IC0xLCBtID0gbWluKG1hdHJp eCwgbGVuZ3RoKSwgdHJhbnNwb3NlID0gbmV3IEFycmF5KG0pOyArK2kgPCBtOykgewogICAgZm9y ICh2YXIgaiA9IC0xLCBuLCByb3cgPSB0cmFuc3Bvc2VbaV0gPSBuZXcgQXJyYXkobik7ICsraiA8 IG47KSB7CiAgICAgIHJvd1tqXSA9IG1hdHJpeFtqXVtpXTsKICAgIH0KICB9CiAgcmV0dXJuIHRy YW5zcG9zZTsKfQoKZnVuY3Rpb24gbGVuZ3RoKGQpIHsKICByZXR1cm4gZC5sZW5ndGg7Cn0KCmZ1 bmN0aW9uIHppcCgpIHsKICByZXR1cm4gdHJhbnNwb3NlKGFyZ3VtZW50cyk7Cn0KCnZhciBzbGlj ZSQxID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOwoKZnVuY3Rpb24gaWRlbnRpdHkkMSh4KSB7CiAg cmV0dXJuIHg7Cn0KCnZhciB0b3AgPSAxLAogICAgcmlnaHQgPSAyLAogICAgYm90dG9tID0gMywK ICAgIGxlZnQgPSA0LAogICAgZXBzaWxvbiA9IDFlLTY7CgpmdW5jdGlvbiB0cmFuc2xhdGVYKHgp IHsKICByZXR1cm4gInRyYW5zbGF0ZSgiICsgKHggKyAwLjUpICsgIiwwKSI7Cn0KCmZ1bmN0aW9u IHRyYW5zbGF0ZVkoeSkgewogIHJldHVybiAidHJhbnNsYXRlKDAsIiArICh5ICsgMC41KSArICIp IjsKfQoKZnVuY3Rpb24gbnVtYmVyJDEoc2NhbGUpIHsKICByZXR1cm4gZnVuY3Rpb24oZCkgewog ICAgcmV0dXJuICtzY2FsZShkKTsKICB9Owp9CgpmdW5jdGlvbiBjZW50ZXIoc2NhbGUpIHsKICB2 YXIgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgc2NhbGUuYmFuZHdpZHRoKCkgLSAxKSAvIDI7IC8vIEFk anVzdCBmb3IgMC41cHggb2Zmc2V0LgogIGlmIChzY2FsZS5yb3VuZCgpKSBvZmZzZXQgPSBNYXRo LnJvdW5kKG9mZnNldCk7CiAgcmV0dXJuIGZ1bmN0aW9uKGQpIHsKICAgIHJldHVybiArc2NhbGUo ZCkgKyBvZmZzZXQ7CiAgfTsKfQoKZnVuY3Rpb24gZW50ZXJpbmcoKSB7CiAgcmV0dXJuICF0aGlz Ll9fYXhpczsKfQoKZnVuY3Rpb24gYXhpcyhvcmllbnQsIHNjYWxlKSB7CiAgdmFyIHRpY2tBcmd1 bWVudHMgPSBbXSwKICAgICAgdGlja1ZhbHVlcyA9IG51bGwsCiAgICAgIHRpY2tGb3JtYXQgPSBu dWxsLAogICAgICB0aWNrU2l6ZUlubmVyID0gNiwKICAgICAgdGlja1NpemVPdXRlciA9IDYsCiAg ICAgIHRpY2tQYWRkaW5nID0gMywKICAgICAgayA9IG9yaWVudCA9PT0gdG9wIHx8IG9yaWVudCA9 PT0gbGVmdCA/IC0xIDogMSwKICAgICAgeCA9IG9yaWVudCA9PT0gbGVmdCB8fCBvcmllbnQgPT09 IHJpZ2h0ID8gIngiIDogInkiLAogICAgICB0cmFuc2Zvcm0gPSBvcmllbnQgPT09IHRvcCB8fCBv cmllbnQgPT09IGJvdHRvbSA/IHRyYW5zbGF0ZVggOiB0cmFuc2xhdGVZOwoKICBmdW5jdGlvbiBh eGlzKGNvbnRleHQpIHsKICAgIHZhciB2YWx1ZXMgPSB0aWNrVmFsdWVzID09IG51bGwgPyAoc2Nh bGUudGlja3MgPyBzY2FsZS50aWNrcy5hcHBseShzY2FsZSwgdGlja0FyZ3VtZW50cykgOiBzY2Fs ZS5kb21haW4oKSkgOiB0aWNrVmFsdWVzLAogICAgICAgIGZvcm1hdCA9IHRpY2tGb3JtYXQgPT0g bnVsbCA/IChzY2FsZS50aWNrRm9ybWF0ID8gc2NhbGUudGlja0Zvcm1hdC5hcHBseShzY2FsZSwg dGlja0FyZ3VtZW50cykgOiBpZGVudGl0eSQxKSA6IHRpY2tGb3JtYXQsCiAgICAgICAgc3BhY2lu ZyA9IE1hdGgubWF4KHRpY2tTaXplSW5uZXIsIDApICsgdGlja1BhZGRpbmcsCiAgICAgICAgcmFu Z2UgPSBzY2FsZS5yYW5nZSgpLAogICAgICAgIHJhbmdlMCA9ICtyYW5nZVswXSArIDAuNSwKICAg ICAgICByYW5nZTEgPSArcmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gKyAwLjUsCiAgICAgICAgcG9z aXRpb24gPSAoc2NhbGUuYmFuZHdpZHRoID8gY2VudGVyIDogbnVtYmVyJDEpKHNjYWxlLmNvcHko KSksCiAgICAgICAgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVj dGlvbigpIDogY29udGV4dCwKICAgICAgICBwYXRoID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgiLmRv bWFpbiIpLmRhdGEoW251bGxdKSwKICAgICAgICB0aWNrID0gc2VsZWN0aW9uLnNlbGVjdEFsbCgi LnRpY2siKS5kYXRhKHZhbHVlcywgc2NhbGUpLm9yZGVyKCksCiAgICAgICAgdGlja0V4aXQgPSB0 aWNrLmV4aXQoKSwKICAgICAgICB0aWNrRW50ZXIgPSB0aWNrLmVudGVyKCkuYXBwZW5kKCJnIiku YXR0cigiY2xhc3MiLCAidGljayIpLAogICAgICAgIGxpbmUgPSB0aWNrLnNlbGVjdCgibGluZSIp LAogICAgICAgIHRleHQgPSB0aWNrLnNlbGVjdCgidGV4dCIpOwoKICAgIHBhdGggPSBwYXRoLm1l cmdlKHBhdGguZW50ZXIoKS5pbnNlcnQoInBhdGgiLCAiLnRpY2siKQogICAgICAgIC5hdHRyKCJj bGFzcyIsICJkb21haW4iKQogICAgICAgIC5hdHRyKCJzdHJva2UiLCAiY3VycmVudENvbG9yIikp OwoKICAgIHRpY2sgPSB0aWNrLm1lcmdlKHRpY2tFbnRlcik7CgogICAgbGluZSA9IGxpbmUubWVy Z2UodGlja0VudGVyLmFwcGVuZCgibGluZSIpCiAgICAgICAgLmF0dHIoInN0cm9rZSIsICJjdXJy ZW50Q29sb3IiKQogICAgICAgIC5hdHRyKHggKyAiMiIsIGsgKiB0aWNrU2l6ZUlubmVyKSk7Cgog ICAgdGV4dCA9IHRleHQubWVyZ2UodGlja0VudGVyLmFwcGVuZCgidGV4dCIpCiAgICAgICAgLmF0 dHIoImZpbGwiLCAiY3VycmVudENvbG9yIikKICAgICAgICAuYXR0cih4LCBrICogc3BhY2luZykK ICAgICAgICAuYXR0cigiZHkiLCBvcmllbnQgPT09IHRvcCA/ICIwZW0iIDogb3JpZW50ID09PSBi b3R0b20gPyAiMC43MWVtIiA6ICIwLjMyZW0iKSk7CgogICAgaWYgKGNvbnRleHQgIT09IHNlbGVj dGlvbikgewogICAgICBwYXRoID0gcGF0aC50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICB0aWNr ID0gdGljay50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICBsaW5lID0gbGluZS50cmFuc2l0aW9u KGNvbnRleHQpOwogICAgICB0ZXh0ID0gdGV4dC50cmFuc2l0aW9uKGNvbnRleHQpOwoKICAgICAg dGlja0V4aXQgPSB0aWNrRXhpdC50cmFuc2l0aW9uKGNvbnRleHQpCiAgICAgICAgICAuYXR0cigi b3BhY2l0eSIsIGVwc2lsb24pCiAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24o ZCkgeyByZXR1cm4gaXNGaW5pdGUoZCA9IHBvc2l0aW9uKGQpKSA/IHRyYW5zZm9ybShkKSA6IHRo aXMuZ2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iKTsgfSk7CgogICAgICB0aWNrRW50ZXIKICAgICAg ICAgIC5hdHRyKCJvcGFjaXR5IiwgZXBzaWxvbikKICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0i LCBmdW5jdGlvbihkKSB7IHZhciBwID0gdGhpcy5wYXJlbnROb2RlLl9fYXhpczsgcmV0dXJuIHRy YW5zZm9ybShwICYmIGlzRmluaXRlKHAgPSBwKGQpKSA/IHAgOiBwb3NpdGlvbihkKSk7IH0pOwog ICAgfQoKICAgIHRpY2tFeGl0LnJlbW92ZSgpOwoKICAgIHBhdGgKICAgICAgICAuYXR0cigiZCIs IG9yaWVudCA9PT0gbGVmdCB8fCBvcmllbnQgPT0gcmlnaHQKICAgICAgICAgICAgPyAodGlja1Np emVPdXRlciA/ICJNIiArIGsgKiB0aWNrU2l6ZU91dGVyICsgIiwiICsgcmFuZ2UwICsgIkgwLjVW IiArIHJhbmdlMSArICJIIiArIGsgKiB0aWNrU2l6ZU91dGVyIDogIk0wLjUsIiArIHJhbmdlMCAr ICJWIiArIHJhbmdlMSkKICAgICAgICAgICAgOiAodGlja1NpemVPdXRlciA/ICJNIiArIHJhbmdl MCArICIsIiArIGsgKiB0aWNrU2l6ZU91dGVyICsgIlYwLjVIIiArIHJhbmdlMSArICJWIiArIGsg KiB0aWNrU2l6ZU91dGVyIDogIk0iICsgcmFuZ2UwICsgIiwwLjVIIiArIHJhbmdlMSkpOwoKICAg IHRpY2sKICAgICAgICAuYXR0cigib3BhY2l0eSIsIDEpCiAgICAgICAgLmF0dHIoInRyYW5zZm9y bSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIHRyYW5zZm9ybShwb3NpdGlvbihkKSk7IH0pOwoKICAg IGxpbmUKICAgICAgICAuYXR0cih4ICsgIjIiLCBrICogdGlja1NpemVJbm5lcik7CgogICAgdGV4 dAogICAgICAgIC5hdHRyKHgsIGsgKiBzcGFjaW5nKQogICAgICAgIC50ZXh0KGZvcm1hdCk7Cgog ICAgc2VsZWN0aW9uLmZpbHRlcihlbnRlcmluZykKICAgICAgICAuYXR0cigiZmlsbCIsICJub25l IikKICAgICAgICAuYXR0cigiZm9udC1zaXplIiwgMTApCiAgICAgICAgLmF0dHIoImZvbnQtZmFt aWx5IiwgInNhbnMtc2VyaWYiKQogICAgICAgIC5hdHRyKCJ0ZXh0LWFuY2hvciIsIG9yaWVudCA9 PT0gcmlnaHQgPyAic3RhcnQiIDogb3JpZW50ID09PSBsZWZ0ID8gImVuZCIgOiAibWlkZGxlIik7 CgogICAgc2VsZWN0aW9uCiAgICAgICAgLmVhY2goZnVuY3Rpb24oKSB7IHRoaXMuX19heGlzID0g cG9zaXRpb247IH0pOwogIH0KCiAgYXhpcy5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVy biBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlID0gXywgYXhpcykgOiBzY2FsZTsKICB9OwoKICBh eGlzLnRpY2tzID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGlja0FyZ3VtZW50cyA9IHNsaWNl JDEuY2FsbChhcmd1bWVudHMpLCBheGlzOwogIH07CgogIGF4aXMudGlja0FyZ3VtZW50cyA9IGZ1 bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tBcmd1bWVudHMg PSBfID09IG51bGwgPyBbXSA6IHNsaWNlJDEuY2FsbChfKSwgYXhpcykgOiB0aWNrQXJndW1lbnRz LnNsaWNlKCk7CiAgfTsKCiAgYXhpcy50aWNrVmFsdWVzID0gZnVuY3Rpb24oXykgewogICAgcmV0 dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1ZhbHVlcyA9IF8gPT0gbnVsbCA/IG51bGwgOiBz bGljZSQxLmNhbGwoXyksIGF4aXMpIDogdGlja1ZhbHVlcyAmJiB0aWNrVmFsdWVzLnNsaWNlKCk7 CiAgfTsKCiAgYXhpcy50aWNrRm9ybWF0ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPyAodGlja0Zvcm1hdCA9IF8sIGF4aXMpIDogdGlja0Zvcm1hdDsKICB9OwoK ICBheGlzLnRpY2tTaXplID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5n dGggPyAodGlja1NpemVJbm5lciA9IHRpY2tTaXplT3V0ZXIgPSArXywgYXhpcykgOiB0aWNrU2l6 ZUlubmVyOwogIH07CgogIGF4aXMudGlja1NpemVJbm5lciA9IGZ1bmN0aW9uKF8pIHsKICAgIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tTaXplSW5uZXIgPSArXywgYXhpcykgOiB0aWNr U2l6ZUlubmVyOwogIH07CgogIGF4aXMudGlja1NpemVPdXRlciA9IGZ1bmN0aW9uKF8pIHsKICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tTaXplT3V0ZXIgPSArXywgYXhpcykgOiB0 aWNrU2l6ZU91dGVyOwogIH07CgogIGF4aXMudGlja1BhZGRpbmcgPSBmdW5jdGlvbihfKSB7CiAg ICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrUGFkZGluZyA9ICtfLCBheGlzKSA6IHRp Y2tQYWRkaW5nOwogIH07CgogIHJldHVybiBheGlzOwp9CgpmdW5jdGlvbiBheGlzVG9wKHNjYWxl KSB7CiAgcmV0dXJuIGF4aXModG9wLCBzY2FsZSk7Cn0KCmZ1bmN0aW9uIGF4aXNSaWdodChzY2Fs ZSkgewogIHJldHVybiBheGlzKHJpZ2h0LCBzY2FsZSk7Cn0KCmZ1bmN0aW9uIGF4aXNCb3R0b20o c2NhbGUpIHsKICByZXR1cm4gYXhpcyhib3R0b20sIHNjYWxlKTsKfQoKZnVuY3Rpb24gYXhpc0xl ZnQoc2NhbGUpIHsKICByZXR1cm4gYXhpcyhsZWZ0LCBzY2FsZSk7Cn0KCnZhciBub29wID0ge3Zh bHVlOiBmdW5jdGlvbigpIHt9fTsKCmZ1bmN0aW9uIGRpc3BhdGNoKCkgewogIGZvciAodmFyIGkg PSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7CiAgICBp ZiAoISh0ID0gYXJndW1lbnRzW2ldICsgIiIpIHx8ICh0IGluIF8pIHx8IC9bXHMuXS8udGVzdCh0 KSkgdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIgKyB0KTsKICAgIF9bdF0gPSBbXTsK ICB9CiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTsKfQoKZnVuY3Rpb24gRGlzcGF0Y2goXykgewog IHRoaXMuXyA9IF87Cn0KCmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcywgdHlwZXMp IHsKICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24o dCkgewogICAgdmFyIG5hbWUgPSAiIiwgaSA9IHQuaW5kZXhPZigiLiIpOwogICAgaWYgKGkgPj0g MCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTsKICAgIGlmICh0ICYm ICF0eXBlcy5oYXNPd25Qcm9wZXJ0eSh0KSkgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6 ICIgKyB0KTsKICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07CiAgfSk7Cn0KCkRpc3Bh dGNoLnByb3RvdHlwZSA9IGRpc3BhdGNoLnByb3RvdHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogRGlz cGF0Y2gsCiAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykgewogICAgdmFyIF8gPSB0 aGlzLl8sCiAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lICsgIiIsIF8pLAogICAg ICAgIHQsCiAgICAgICAgaSA9IC0xLAogICAgICAgIG4gPSBULmxlbmd0aDsKCiAgICAvLyBJZiBu byBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGNhbGxiYWNrIG9mIHRoZSBnaXZl biB0eXBlIGFuZCBuYW1lLgogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgIHdo aWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdl dChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0OwogICAgICByZXR1cm47CiAgICB9Cgog ICAgLy8gSWYgYSB0eXBlIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBn aXZlbiB0eXBlIGFuZCBuYW1lLgogICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sg d2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS4KICAgIGlm IChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIikgdGhy b3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiICsgY2FsbGJhY2spOwogICAgd2hpbGUg KCsraSA8IG4pIHsKICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0g c2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTsKICAgICAgZWxzZSBpZiAoY2FsbGJh Y2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwg bnVsbCk7CiAgICB9CgogICAgcmV0dXJuIHRoaXM7CiAgfSwKICBjb3B5OiBmdW5jdGlvbigpIHsK ICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87CiAgICBmb3IgKHZhciB0IGluIF8pIGNvcHlb dF0gPSBfW3RdLnNsaWNlKCk7CiAgICByZXR1cm4gbmV3IERpc3BhdGNoKGNvcHkpOwogIH0sCiAg Y2FsbDogZnVuY3Rpb24odHlwZSwgdGhhdCkgewogICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0 aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkg PCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdOwogICAgaWYgKCF0aGlzLl8uaGFz T3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdHlw ZSk7CiAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBu OyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7CiAgfSwKICBhcHBseTogZnVuY3Rp b24odHlwZSwgdGhhdCwgYXJncykgewogICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlw ZSkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdHlwZSk7CiAgICBmb3IgKHZh ciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ld LnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpOwogIH0KfTsKCmZ1bmN0aW9uIGdldCh0eXBlLCBuYW1l KSB7CiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkgewog ICAgaWYgKChjID0gdHlwZVtpXSkubmFtZSA9PT0gbmFtZSkgewogICAgICByZXR1cm4gYy52YWx1 ZTsKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHNldCh0eXBlLCBuYW1lLCBjYWxsYmFjaykgewogIGZv ciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgIGlmICh0eXBl W2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgdHlwZVtpXSA9IG5vb3AsIHR5cGUgPSB0eXBlLnNs aWNlKDAsIGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkgKyAxKSk7CiAgICAgIGJyZWFrOwogICAgfQog IH0KICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTog Y2FsbGJhY2t9KTsKICByZXR1cm4gdHlwZTsKfQoKdmFyIHhodG1sID0gImh0dHA6Ly93d3cudzMu b3JnLzE5OTkveGh0bWwiOwoKdmFyIG5hbWVzcGFjZXMgPSB7CiAgc3ZnOiAiaHR0cDovL3d3dy53 My5vcmcvMjAwMC9zdmciLAogIHhodG1sOiB4aHRtbCwKICB4bGluazogImh0dHA6Ly93d3cudzMu b3JnLzE5OTkveGxpbmsiLAogIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVz cGFjZSIsCiAgeG1sbnM6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIKfTsKCmZ1bmN0 aW9uIG5hbWVzcGFjZShuYW1lKSB7CiAgdmFyIHByZWZpeCA9IG5hbWUgKz0gIiIsIGkgPSBwcmVm aXguaW5kZXhPZigiOiIpOwogIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwg aSkpICE9PSAieG1sbnMiKSBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7CiAgcmV0dXJuIG5hbWVz cGFjZXMuaGFzT3duUHJvcGVydHkocHJlZml4KSA/IHtzcGFjZTogbmFtZXNwYWNlc1twcmVmaXhd LCBsb2NhbDogbmFtZX0gOiBuYW1lOwp9CgpmdW5jdGlvbiBjcmVhdG9ySW5oZXJpdChuYW1lKSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIGRvY3VtZW50ID0gdGhpcy5vd25lckRvY3Vt ZW50LAogICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJOwogICAgcmV0dXJuIHVyaSA9PT0g eGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWwK ICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSkKICAgICAgICA6IGRvY3VtZW50 LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpOwogIH07Cn0KCmZ1bmN0aW9uIGNyZWF0b3JGaXhl ZChmdWxsbmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlzLm93bmVy RG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7 CiAgfTsKfQoKZnVuY3Rpb24gY3JlYXRvcihuYW1lKSB7CiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNw YWNlKG5hbWUpOwogIHJldHVybiAoZnVsbG5hbWUubG9jYWwKICAgICAgPyBjcmVhdG9yRml4ZWQK ICAgICAgOiBjcmVhdG9ySW5oZXJpdCkoZnVsbG5hbWUpOwp9CgpmdW5jdGlvbiBub25lKCkge30K CmZ1bmN0aW9uIHNlbGVjdG9yKHNlbGVjdG9yKSB7CiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwg PyBub25lIDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVj dG9yKTsKICB9Owp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0KHNlbGVjdCkgewogIGlmICh0 eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvcihzZWxlY3QpOwoK ICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJn cm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHZhciBn cm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNb al0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAg ICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUs IG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHsKICAgICAgICBpZiAoIl9fZGF0YV9fIiBpbiBu b2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXzsKICAgICAgICBzdWJncm91cFtp XSA9IHN1Ym5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1 Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7Cn0KCmZ1bmN0aW9uIGVtcHR5KCkgewogIHJldHVybiBb XTsKfQoKZnVuY3Rpb24gc2VsZWN0b3JBbGwoc2VsZWN0b3IpIHsKICByZXR1cm4gc2VsZWN0b3Ig PT0gbnVsbCA/IGVtcHR5IDogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVj dG9yQWxsKHNlbGVjdG9yKTsKICB9Owp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0QWxsKHNl bGVjdCkgewogIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxl Y3RvckFsbChzZWxlY3QpOwoKICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBn cm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07 ICsraikgewogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgs IG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsK ICAgICAgICBzdWJncm91cHMucHVzaChzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBp LCBncm91cCkpOwogICAgICAgIHBhcmVudHMucHVzaChub2RlKTsKICAgICAgfQogICAgfQogIH0K CiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCBwYXJlbnRzKTsKfQoKZnVuY3Rpb24g bWF0Y2hlcihzZWxlY3RvcikgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB0aGlz Lm1hdGNoZXMoc2VsZWN0b3IpOwogIH07Cn0KCmZ1bmN0aW9uIHNlbGVjdGlvbl9maWx0ZXIobWF0 Y2gpIHsKICBpZiAodHlwZW9mIG1hdGNoICE9PSAiZnVuY3Rpb24iKSBtYXRjaCA9IG1hdGNoZXIo bWF0Y2gpOwoKICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVu Z3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICBm b3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBz dWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKChu b2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3Jv dXApKSB7CiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsKICAgICAgfQogICAgfQogIH0KCiAg cmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsKfQoKZnVuY3Rp b24gc3BhcnNlKHVwZGF0ZSkgewogIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7Cn0K CmZ1bmN0aW9uIHNlbGVjdGlvbl9lbnRlcigpIHsKICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlz Ll9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpOwp9Cgpm dW5jdGlvbiBFbnRlck5vZGUocGFyZW50LCBkYXR1bSkgewogIHRoaXMub3duZXJEb2N1bWVudCA9 IHBhcmVudC5vd25lckRvY3VtZW50OwogIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVz cGFjZVVSSTsKICB0aGlzLl9uZXh0ID0gbnVsbDsKICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAg dGhpcy5fX2RhdGFfXyA9IGRhdHVtOwp9CgpFbnRlck5vZGUucHJvdG90eXBlID0gewogIGNvbnN0 cnVjdG9yOiBFbnRlck5vZGUsCiAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVy biB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSwKICBpbnNl cnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5z ZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSwKICBxdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxl Y3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9LAog IHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJl bnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH0KfTsKCmZ1bmN0aW9uIGNvbnN0YW50JDEo eCkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4OwogIH07Cn0KCnZhciBrZXlQ cmVmaXggPSAiJCI7IC8vIFByb3RlY3QgYWdhaW5zdCBrZXlzIGxpa2Ug4oCcX19wcm90b19f4oCd LgoKZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQs IGRhdGEpIHsKICB2YXIgaSA9IDAsCiAgICAgIG5vZGUsCiAgICAgIGdyb3VwTGVuZ3RoID0gZ3Jv dXAubGVuZ3RoLAogICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7CgogIC8vIFB1dCBhbnkg bm9uLW51bGwgbm9kZXMgdGhhdCBmaXQgaW50byB1cGRhdGUuCiAgLy8gUHV0IGFueSBudWxsIG5v ZGVzIGludG8gZW50ZXIuCiAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLgog IGZvciAoOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7CiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7 CiAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOwogICAgICB1cGRhdGVbaV0gPSBub2RlOwog ICAgfSBlbHNlIHsKICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtp XSk7CiAgICB9CiAgfQoKICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9u4oCZdCBm aXQgaW50byBleGl0LgogIGZvciAoOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkgewogICAgaWYgKG5v ZGUgPSBncm91cFtpXSkgewogICAgICBleGl0W2ldID0gbm9kZTsKICAgIH0KICB9Cn0KCmZ1bmN0 aW9uIGJpbmRLZXkocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5 KSB7CiAgdmFyIGksCiAgICAgIG5vZGUsCiAgICAgIG5vZGVCeUtleVZhbHVlID0ge30sCiAgICAg IGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5n dGgsCiAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksCiAgICAgIGtleVZh bHVlOwoKICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS4KICAvLyBJZiBtdWx0aXBs ZSBub2RlcyBoYXZlIHRoZSBzYW1lIGtleSwgdGhlIGR1cGxpY2F0ZXMgYXJlIGFkZGVkIHRvIGV4 aXQuCiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgIGlmIChub2RlID0g Z3JvdXBbaV0pIHsKICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWUgPSBrZXlQcmVmaXggKyBr ZXkuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7CiAgICAgIGlmIChrZXlWYWx1 ZSBpbiBub2RlQnlLZXlWYWx1ZSkgewogICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICB9IGVs c2UgewogICAgICAgIG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSA9IG5vZGU7CiAgICAgIH0KICAg IH0KICB9CgogIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS4KICAvLyBJZiB0aGVy ZSBhIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5LCBqb2luIGFuZCBhZGQgaXQgdG8gdXBk YXRlLgogIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFk ZCBpdCB0byBlbnRlci4KICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7CiAgICBr ZXlWYWx1ZSA9IGtleVByZWZpeCArIGtleS5jYWxsKHBhcmVudCwgZGF0YVtpXSwgaSwgZGF0YSk7 CiAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSkgewogICAgICB1cGRhdGVb aV0gPSBub2RlOwogICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTsKICAgICAgbm9kZUJ5S2V5 VmFsdWVba2V5VmFsdWVdID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIGVudGVyW2ldID0gbmV3 IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pOwogICAgfQogIH0KCiAgLy8gQWRkIGFueSByZW1h aW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuCiAgZm9yIChp ID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAm JiAobm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVzW2ldXSA9PT0gbm9kZSkpIHsKICAgICAgZXhpdFtp XSA9IG5vZGU7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fZGF0YSh2YWx1ZSwga2V5 KSB7CiAgaWYgKCF2YWx1ZSkgewogICAgZGF0YSA9IG5ldyBBcnJheSh0aGlzLnNpemUoKSksIGog PSAtMTsKICAgIHRoaXMuZWFjaChmdW5jdGlvbihkKSB7IGRhdGFbKytqXSA9IGQ7IH0pOwogICAg cmV0dXJuIGRhdGE7CiAgfQoKICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgs CiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLAogICAgICBncm91cHMgPSB0aGlzLl9ncm91 cHM7CgogIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHZhbHVlID0gY29uc3RhbnQk MSh2YWx1ZSk7CgogIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJy YXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsg aiA8IG07ICsraikgewogICAgdmFyIHBhcmVudCA9IHBhcmVudHNbal0sCiAgICAgICAgZ3JvdXAg PSBncm91cHNbal0sCiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsCiAgICAgICAg ZGF0YSA9IHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBw YXJlbnRzKSwKICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgZW50ZXJH cm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIHVwZGF0ZUdy b3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgIGV4aXRHcm91 cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpOwoKICAgIGJpbmQocGFyZW50LCBn cm91cCwgZW50ZXJHcm91cCwgdXBkYXRlR3JvdXAsIGV4aXRHcm91cCwgZGF0YSwga2V5KTsKCiAg ICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0 ZSBub2RlLCBzdWNoIHRoYXQKICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVy aWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsCiAgICAvLyByYXRoZXIgdGhhbiBh dCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZS4KICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAw LCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7CiAgICAgIGlmIChwcmV2 aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7CiAgICAgICAgaWYgKGkwID49IGkxKSBpMSA9IGkwICsg MTsKICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0 YUxlbmd0aCk7CiAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7CiAgICAgIH0K ICAgIH0KICB9CgogIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTsKICB1 cGRhdGUuX2VudGVyID0gZW50ZXI7CiAgdXBkYXRlLl9leGl0ID0gZXhpdDsKICByZXR1cm4gdXBk YXRlOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fZXhpdCgpIHsKICByZXR1cm4gbmV3IFNlbGVjdGlv bih0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7 Cn0KCmZ1bmN0aW9uIHNlbGVjdGlvbl9qb2luKG9uZW50ZXIsIG9udXBkYXRlLCBvbmV4aXQpIHsK ICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksIHVwZGF0ZSA9IHRoaXMsIGV4aXQgPSB0aGlzLmV4 aXQoKTsKICBlbnRlciA9IHR5cGVvZiBvbmVudGVyID09PSAiZnVuY3Rpb24iID8gb25lbnRlcihl bnRlcikgOiBlbnRlci5hcHBlbmQob25lbnRlciArICIiKTsKICBpZiAob251cGRhdGUgIT0gbnVs bCkgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTsKICBpZiAob25leGl0ID09IG51bGwpIGV4aXQu cmVtb3ZlKCk7IGVsc2Ugb25leGl0KGV4aXQpOwogIHJldHVybiBlbnRlciAmJiB1cGRhdGUgPyBl bnRlci5tZXJnZSh1cGRhdGUpLm9yZGVyKCkgOiB1cGRhdGU7Cn0KCmZ1bmN0aW9uIHNlbGVjdGlv bl9tZXJnZShzZWxlY3Rpb24pIHsKCiAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3Vwcywg Z3JvdXBzMSA9IHNlbGVjdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdy b3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0w KSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0s IGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tq XSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKG5v ZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7CiAgICAgICAgbWVyZ2VbaV0gPSBub2RlOwog ICAgICB9CiAgICB9CiAgfQoKICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgIG1lcmdlc1tqXSA9 IGdyb3VwczBbal07CiAgfQoKICByZXR1cm4gbmV3IFNlbGVjdGlvbihtZXJnZXMsIHRoaXMuX3Bh cmVudHMpOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fb3JkZXIoKSB7CgogIGZvciAodmFyIGdyb3Vw cyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHsK ICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4 dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtp XSkgewogICAgICAgIGlmIChuZXh0ICYmIG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4 dCkgXiA0KSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpOwogICAgICAg IG5leHQgPSBub2RlOwogICAgICB9CiAgICB9CiAgfQoKICByZXR1cm4gdGhpczsKfQoKZnVuY3Rp b24gc2VsZWN0aW9uX3NvcnQoY29tcGFyZSkgewogIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFz Y2VuZGluZyQxOwoKICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7CiAgICByZXR1cm4gYSAm JiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7CiAgfQoKICBm b3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3Jv dXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgZm9yICh2YXIgZ3Jv dXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNb al0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGlmIChu b2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlOwogICAgICB9CiAg ICB9CiAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7CiAgfQoKICByZXR1cm4gbmV3IFNl bGVjdGlvbihzb3J0Z3JvdXBzLCB0aGlzLl9wYXJlbnRzKS5vcmRlcigpOwp9CgpmdW5jdGlvbiBh c2NlbmRpbmckMShhLCBiKSB7CiAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49 IGIgPyAwIDogTmFOOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fY2FsbCgpIHsKICB2YXIgY2FsbGJh Y2sgPSBhcmd1bWVudHNbMF07CiAgYXJndW1lbnRzWzBdID0gdGhpczsKICBjYWxsYmFjay5hcHBs eShudWxsLCBhcmd1bWVudHMpOwogIHJldHVybiB0aGlzOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb25f bm9kZXMoKSB7CiAgdmFyIG5vZGVzID0gbmV3IEFycmF5KHRoaXMuc2l6ZSgpKSwgaSA9IC0xOwog IHRoaXMuZWFjaChmdW5jdGlvbigpIHsgbm9kZXNbKytpXSA9IHRoaXM7IH0pOwogIHJldHVybiBu b2RlczsKfQoKZnVuY3Rpb24gc2VsZWN0aW9uX25vZGUoKSB7CgogIGZvciAodmFyIGdyb3VwcyA9 IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAg ICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkg PCBuOyArK2kpIHsKICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTsKICAgICAgaWYgKG5vZGUpIHJl dHVybiBub2RlOwogICAgfQogIH0KCiAgcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIHNlbGVjdGlv bl9zaXplKCkgewogIHZhciBzaXplID0gMDsKICB0aGlzLmVhY2goZnVuY3Rpb24oKSB7ICsrc2l6 ZTsgfSk7CiAgcmV0dXJuIHNpemU7Cn0KCmZ1bmN0aW9uIHNlbGVjdGlvbl9lbXB0eSgpIHsKICBy ZXR1cm4gIXRoaXMubm9kZSgpOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fZWFjaChjYWxsYmFjaykg ewoKICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxl bmd0aDsgaiA8IG07ICsraikgewogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAw LCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7CiAgICAgIGlmIChub2RlID0g Z3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApOwog ICAgfQogIH0KCiAgcmV0dXJuIHRoaXM7Cn0KCmZ1bmN0aW9uIGF0dHJSZW1vdmUobmFtZSkgewog IHJldHVybiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogIH07 Cn0KCmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkgewogIHJldHVybiBmdW5jdGlvbigp IHsKICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxv Y2FsKTsKICB9Owp9CgpmdW5jdGlvbiBhdHRyQ29uc3RhbnQobmFtZSwgdmFsdWUpIHsKICByZXR1 cm4gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgfTsK fQoKZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMoZnVsbG5hbWUsIHZhbHVlKSB7CiAgcmV0dXJuIGZ1 bmN0aW9uKCkgewogICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5h bWUubG9jYWwsIHZhbHVlKTsKICB9Owp9CgpmdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgdmFs dWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMs IGFyZ3VtZW50cyk7CiAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1l KTsKICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7CiAgfTsKfQoKZnVuY3Rpb24g YXR0ckZ1bmN0aW9uTlMoZnVsbG5hbWUsIHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewog ICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKHYgPT0gbnVs bCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwp OwogICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5s b2NhbCwgdik7CiAgfTsKfQoKZnVuY3Rpb24gc2VsZWN0aW9uX2F0dHIobmFtZSwgdmFsdWUpIHsK ICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7CgogIGlmIChhcmd1bWVudHMubGVuZ3Ro IDwgMikgewogICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTsKICAgIHJldHVybiBmdWxsbmFtZS5s b2NhbAogICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5h bWUubG9jYWwpCiAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7CiAgfQoKICBy ZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsCiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8g YXR0clJlbW92ZU5TIDogYXR0clJlbW92ZSkgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24i CiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24p CiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQp KSkoZnVsbG5hbWUsIHZhbHVlKSk7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRWaWV3KG5vZGUpIHsKICBy ZXR1cm4gKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZp ZXcpIC8vIG5vZGUgaXMgYSBOb2RlCiAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8v IG5vZGUgaXMgYSBXaW5kb3cKICAgICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBh IERvY3VtZW50Cn0KCmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHsKICByZXR1cm4gZnVuY3Rp b24oKSB7CiAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpOwogIH07Cn0KCmZ1bmN0 aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgcmV0dXJuIGZ1bmN0 aW9uKCkgewogICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkp OwogIH07Cn0KCmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1 bWVudHMpOwogICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1l KTsKICAgIGVsc2UgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2LCBwcmlvcml0eSk7CiAg fTsKfQoKZnVuY3Rpb24gc2VsZWN0aW9uX3N0eWxlKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewog IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMQogICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0g bnVsbAogICAgICAgICAgICA/IHN0eWxlUmVtb3ZlIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rp b24iCiAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvbgogICAgICAgICAgICA6IHN0eWxlQ29uc3Rh bnQpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSkpCiAgICAg IDogc3R5bGVWYWx1ZSh0aGlzLm5vZGUoKSwgbmFtZSk7Cn0KCmZ1bmN0aW9uIHN0eWxlVmFsdWUo bm9kZSwgbmFtZSkgewogIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkK ICAgICAgfHwgZGVmYXVsdFZpZXcobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5n ZXRQcm9wZXJ0eVZhbHVlKG5hbWUpOwp9CgpmdW5jdGlvbiBwcm9wZXJ0eVJlbW92ZShuYW1lKSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgZGVsZXRlIHRoaXNbbmFtZV07CiAgfTsKfQoKZnVu Y3Rpb24gcHJvcGVydHlDb25zdGFudChuYW1lLCB2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigp IHsKICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTsKICB9Owp9CgpmdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0 aW9uKG5hbWUsIHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHYgPSB2YWx1 ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKHYgPT0gbnVsbCkgZGVsZXRlIHRoaXNb bmFtZV07CiAgICBlbHNlIHRoaXNbbmFtZV0gPSB2OwogIH07Cn0KCmZ1bmN0aW9uIHNlbGVjdGlv bl9wcm9wZXJ0eShuYW1lLCB2YWx1ZSkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMQog ICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbAogICAgICAgICAgPyBwcm9wZXJ0eVJlbW92 ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyBwcm9wZXJ0eUZ1bmN0 aW9uCiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSkKICAgICAgOiB0 aGlzLm5vZGUoKVtuYW1lXTsKfQoKZnVuY3Rpb24gY2xhc3NBcnJheShzdHJpbmcpIHsKICByZXR1 cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxccysvKTsKfQoKZnVuY3Rpb24gY2xhc3NMaXN0KG5v ZGUpIHsKICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTsKfQoK ZnVuY3Rpb24gQ2xhc3NMaXN0KG5vZGUpIHsKICB0aGlzLl9ub2RlID0gbm9kZTsKICB0aGlzLl9u YW1lcyA9IGNsYXNzQXJyYXkobm9kZS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIpOwp9CgpD bGFzc0xpc3QucHJvdG90eXBlID0gewogIGFkZDogZnVuY3Rpb24obmFtZSkgewogICAgdmFyIGkg PSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpOwogICAgaWYgKGkgPCAwKSB7CiAgICAgIHRoaXMu X25hbWVzLnB1c2gobmFtZSk7CiAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIs IHRoaXMuX25hbWVzLmpvaW4oIiAiKSk7CiAgICB9CiAgfSwKICByZW1vdmU6IGZ1bmN0aW9uKG5h bWUpIHsKICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsKICAgIGlmIChpID49 IDApIHsKICAgICAgdGhpcy5fbmFtZXMuc3BsaWNlKGksIDEpOwogICAgICB0aGlzLl9ub2RlLnNl dEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOwogICAgfQogIH0sCiAg Y29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHsKICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9m KG5hbWUpID49IDA7CiAgfQp9OwoKZnVuY3Rpb24gY2xhc3NlZEFkZChub2RlLCBuYW1lcykgewog IHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7CiAg d2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTsKfQoKZnVuY3Rpb24gY2xhc3NlZFJl bW92ZShub2RlLCBuYW1lcykgewogIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEs IG4gPSBuYW1lcy5sZW5ndGg7CiAgd2hpbGUgKCsraSA8IG4pIGxpc3QucmVtb3ZlKG5hbWVzW2ld KTsKfQoKZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7 CiAgICBjbGFzc2VkQWRkKHRoaXMsIG5hbWVzKTsKICB9Owp9CgpmdW5jdGlvbiBjbGFzc2VkRmFs c2UobmFtZXMpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICBjbGFzc2VkUmVtb3ZlKHRoaXMs IG5hbWVzKTsKICB9Owp9CgpmdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgKHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykg PyBjbGFzc2VkQWRkIDogY2xhc3NlZFJlbW92ZSkodGhpcywgbmFtZXMpOwogIH07Cn0KCmZ1bmN0 aW9uIHNlbGVjdGlvbl9jbGFzc2VkKG5hbWUsIHZhbHVlKSB7CiAgdmFyIG5hbWVzID0gY2xhc3NB cnJheShuYW1lICsgIiIpOwoKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgIHZhciBs aXN0ID0gY2xhc3NMaXN0KHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwog ICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBm YWxzZTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZh bHVlID09PSAiZnVuY3Rpb24iCiAgICAgID8gY2xhc3NlZEZ1bmN0aW9uIDogdmFsdWUKICAgICAg PyBjbGFzc2VkVHJ1ZQogICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7Cn0KCmZ1 bmN0aW9uIHRleHRSZW1vdmUoKSB7CiAgdGhpcy50ZXh0Q29udGVudCA9ICIiOwp9CgpmdW5jdGlv biB0ZXh0Q29uc3RhbnQodmFsdWUpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB0aGlzLnRl eHRDb250ZW50ID0gdmFsdWU7CiAgfTsKfQoKZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1 bWVudHMpOwogICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/ICIiIDogdjsKICB9Owp9 CgpmdW5jdGlvbiBzZWxlY3Rpb25fdGV4dCh2YWx1ZSkgewogIHJldHVybiBhcmd1bWVudHMubGVu Z3RoCiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGwKICAgICAgICAgID8gdGV4dFJlbW92 ZSA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gdGV4dEZ1bmN0aW9u CiAgICAgICAgICA6IHRleHRDb25zdGFudCkodmFsdWUpKQogICAgICA6IHRoaXMubm9kZSgpLnRl eHRDb250ZW50Owp9CgpmdW5jdGlvbiBodG1sUmVtb3ZlKCkgewogIHRoaXMuaW5uZXJIVE1MID0g IiI7Cn0KCmZ1bmN0aW9uIGh0bWxDb25zdGFudCh2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigp IHsKICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7CiAgfTsKfQoKZnVuY3Rpb24gaHRtbEZ1bmN0 aW9uKHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHYgPSB2YWx1ZS5hcHBs eSh0aGlzLCBhcmd1bWVudHMpOwogICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyAiIiA6 IHY7CiAgfTsKfQoKZnVuY3Rpb24gc2VsZWN0aW9uX2h0bWwodmFsdWUpIHsKICByZXR1cm4gYXJn dW1lbnRzLmxlbmd0aAogICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICA/ IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICA/IGh0 bWxGdW5jdGlvbgogICAgICAgICAgOiBodG1sQ29uc3RhbnQpKHZhbHVlKSkKICAgICAgOiB0aGlz Lm5vZGUoKS5pbm5lckhUTUw7Cn0KCmZ1bmN0aW9uIHJhaXNlKCkgewogIGlmICh0aGlzLm5leHRT aWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7Cn0KCmZ1bmN0aW9uIHNl bGVjdGlvbl9yYWlzZSgpIHsKICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlKTsKfQoKZnVuY3Rpb24g bG93ZXIoKSB7CiAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5z ZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTsKfQoKZnVuY3Rpb24g c2VsZWN0aW9uX2xvd2VyKCkgewogIHJldHVybiB0aGlzLmVhY2gobG93ZXIpOwp9CgpmdW5jdGlv biBzZWxlY3Rpb25fYXBwZW5kKG5hbWUpIHsKICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09 ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvcihuYW1lKTsKICByZXR1cm4gdGhpcy5zZWxlY3Qo ZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhp cywgYXJndW1lbnRzKSk7CiAgfSk7Cn0KCmZ1bmN0aW9uIGNvbnN0YW50TnVsbCgpIHsKICByZXR1 cm4gbnVsbDsKfQoKZnVuY3Rpb24gc2VsZWN0aW9uX2luc2VydChuYW1lLCBiZWZvcmUpIHsKICB2 YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvcihu YW1lKSwKICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBl b2YgYmVmb3JlID09PSAiZnVuY3Rpb24iID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTsKICBy ZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZv cmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1 bWVudHMpIHx8IG51bGwpOwogIH0pOwp9CgpmdW5jdGlvbiByZW1vdmUoKSB7CiAgdmFyIHBhcmVu dCA9IHRoaXMucGFyZW50Tm9kZTsKICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhp cyk7Cn0KCmZ1bmN0aW9uIHNlbGVjdGlvbl9yZW1vdmUoKSB7CiAgcmV0dXJuIHRoaXMuZWFjaChy ZW1vdmUpOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KCkgewogIHZhciBjbG9u ZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogIHJl dHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5n KSA6IGNsb25lOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVEZWVwKCkgewogIHZhciBjbG9u ZSA9IHRoaXMuY2xvbmVOb2RlKHRydWUpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgcmV0 dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcp IDogY2xvbmU7Cn0KCmZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZShkZWVwKSB7CiAgcmV0dXJuIHRo aXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwIDogc2VsZWN0aW9uX2Nsb25lU2hh bGxvdyk7Cn0KCmZ1bmN0aW9uIHNlbGVjdGlvbl9kYXR1bSh2YWx1ZSkgewogIHJldHVybiBhcmd1 bWVudHMubGVuZ3RoCiAgICAgID8gdGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLCB2YWx1ZSkKICAg ICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXzsKfQoKdmFyIGZpbHRlckV2ZW50cyA9IHt9OwoKZXhw b3J0cy5ldmVudCA9IG51bGw7CgppZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikg ewogIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogIGlmICghKCJvbm1v dXNlZW50ZXIiIGluIGVsZW1lbnQpKSB7CiAgICBmaWx0ZXJFdmVudHMgPSB7bW91c2VlbnRlcjog Im1vdXNlb3ZlciIsIG1vdXNlbGVhdmU6ICJtb3VzZW91dCJ9OwogIH0KfQoKZnVuY3Rpb24gZmls dGVyQ29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApIHsKICBsaXN0ZW5lciA9 IGNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKTsKICByZXR1cm4gZnVuY3Rp b24oZXZlbnQpIHsKICAgIHZhciByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldDsKICAgIGlm ICghcmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGhpcyAmJiAhKHJlbGF0ZWQuY29tcGFyZURvY3Vt ZW50UG9zaXRpb24odGhpcykgJiA4KSkpIHsKICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVu dCk7CiAgICB9CiAgfTsKfQoKZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRl eCwgZ3JvdXApIHsKICByZXR1cm4gZnVuY3Rpb24oZXZlbnQxKSB7CiAgICB2YXIgZXZlbnQwID0g ZXhwb3J0cy5ldmVudDsgLy8gRXZlbnRzIGNhbiBiZSByZWVudHJhbnQgKGUuZy4sIGZvY3VzKS4K ICAgIGV4cG9ydHMuZXZlbnQgPSBldmVudDE7CiAgICB0cnkgewogICAgICBsaXN0ZW5lci5jYWxs KHRoaXMsIHRoaXMuX19kYXRhX18sIGluZGV4LCBncm91cCk7CiAgICB9IGZpbmFsbHkgewogICAg ICBleHBvcnRzLmV2ZW50ID0gZXZlbnQwOwogICAgfQogIH07Cn0KCmZ1bmN0aW9uIHBhcnNlVHlw ZW5hbWVzJDEodHlwZW5hbWVzKSB7CiAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158 XHMrLykubWFwKGZ1bmN0aW9uKHQpIHsKICAgIHZhciBuYW1lID0gIiIsIGkgPSB0LmluZGV4T2Yo Ii4iKTsKICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2Uo MCwgaSk7CiAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9OwogIH0pOwp9CgpmdW5jdGlv biBvblJlbW92ZSh0eXBlbmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBvbiA9 IHRoaXMuX19vbjsKICAgIGlmICghb24pIHJldHVybjsKICAgIGZvciAodmFyIGogPSAwLCBpID0g LTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHsKICAgICAgaWYgKG8gPSBvbltqXSwg KCF0eXBlbmFtZS50eXBlIHx8IG8udHlwZSA9PT0gdHlwZW5hbWUudHlwZSkgJiYgby5uYW1lID09 PSB0eXBlbmFtZS5uYW1lKSB7CiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlw ZSwgby5saXN0ZW5lciwgby5jYXB0dXJlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvblsrK2ld ID0gbzsKICAgICAgfQogICAgfQogICAgaWYgKCsraSkgb24ubGVuZ3RoID0gaTsKICAgIGVsc2Ug ZGVsZXRlIHRoaXMuX19vbjsKICB9Owp9CgpmdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUs IGNhcHR1cmUpIHsKICB2YXIgd3JhcCA9IGZpbHRlckV2ZW50cy5oYXNPd25Qcm9wZXJ0eSh0eXBl bmFtZS50eXBlKSA/IGZpbHRlckNvbnRleHRMaXN0ZW5lciA6IGNvbnRleHRMaXN0ZW5lcjsKICBy ZXR1cm4gZnVuY3Rpb24oZCwgaSwgZ3JvdXApIHsKICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywg bGlzdGVuZXIgPSB3cmFwKHZhbHVlLCBpLCBncm91cCk7CiAgICBpZiAob24pIGZvciAodmFyIGog PSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgIGlmICgobyA9IG9uW2pdKS50 eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkgewogICAg ICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8uY2FwdHVy ZSk7CiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxp c3RlbmVyLCBvLmNhcHR1cmUgPSBjYXB0dXJlKTsKICAgICAgICBvLnZhbHVlID0gdmFsdWU7CiAg ICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodHlw ZW5hbWUudHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpOwogICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50 eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5l ciwgY2FwdHVyZTogY2FwdHVyZX07CiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107CiAgICBl bHNlIG9uLnB1c2gobyk7CiAgfTsKfQoKZnVuY3Rpb24gc2VsZWN0aW9uX29uKHR5cGVuYW1lLCB2 YWx1ZSwgY2FwdHVyZSkgewogIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyQxKHR5cGVu YW1lICsgIiIpLCBpLCBuID0gdHlwZW5hbWVzLmxlbmd0aCwgdDsKCiAgaWYgKGFyZ3VtZW50cy5s ZW5ndGggPCAyKSB7CiAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uOwogICAgaWYgKG9uKSBm b3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikgewogICAgICBmb3Ig KGkgPSAwLCBvID0gb25bal07IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoKHQgPSB0eXBlbmFt ZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkgewogICAgICAgICAg cmV0dXJuIG8udmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm47CiAgfQoK ICBvbiA9IHZhbHVlID8gb25BZGQgOiBvblJlbW92ZTsKICBpZiAoY2FwdHVyZSA9PSBudWxsKSBj YXB0dXJlID0gZmFsc2U7CiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgdGhpcy5lYWNoKG9uKHR5 cGVuYW1lc1tpXSwgdmFsdWUsIGNhcHR1cmUpKTsKICByZXR1cm4gdGhpczsKfQoKZnVuY3Rpb24g Y3VzdG9tRXZlbnQoZXZlbnQxLCBsaXN0ZW5lciwgdGhhdCwgYXJncykgewogIHZhciBldmVudDAg PSBleHBvcnRzLmV2ZW50OwogIGV2ZW50MS5zb3VyY2VFdmVudCA9IGV4cG9ydHMuZXZlbnQ7CiAg ZXhwb3J0cy5ldmVudCA9IGV2ZW50MTsKICB0cnkgewogICAgcmV0dXJuIGxpc3RlbmVyLmFwcGx5 KHRoYXQsIGFyZ3MpOwogIH0gZmluYWxseSB7CiAgICBleHBvcnRzLmV2ZW50ID0gZXZlbnQwOwog IH0KfQoKZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChub2RlLCB0eXBlLCBwYXJhbXMpIHsKICB2YXIg d2luZG93ID0gZGVmYXVsdFZpZXcobm9kZSksCiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2 ZW50OwoKICBpZiAodHlwZW9mIGV2ZW50ID09PSAiZnVuY3Rpb24iKSB7CiAgICBldmVudCA9IG5l dyBldmVudCh0eXBlLCBwYXJhbXMpOwogIH0gZWxzZSB7CiAgICBldmVudCA9IHdpbmRvdy5kb2N1 bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTsKICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVu dCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwg PSBwYXJhbXMuZGV0YWlsOwogICAgZWxzZSBldmVudC5pbml0RXZlbnQodHlwZSwgZmFsc2UsIGZh bHNlKTsKICB9CgogIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7Cn0KCmZ1bmN0aW9uIGRpc3Bh dGNoQ29uc3RhbnQodHlwZSwgcGFyYW1zKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0 dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zKTsKICB9Owp9CgpmdW5jdGlvbiBk aXNwYXRjaEZ1bmN0aW9uKHR5cGUsIHBhcmFtcykgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAg IHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcy5hcHBseSh0aGlzLCBhcmd1 bWVudHMpKTsKICB9Owp9CgpmdW5jdGlvbiBzZWxlY3Rpb25fZGlzcGF0Y2godHlwZSwgcGFyYW1z KSB7CiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHBhcmFtcyA9PT0gImZ1bmN0aW9uIgogICAg ICA/IGRpc3BhdGNoRnVuY3Rpb24KICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJh bXMpKTsKfQoKdmFyIHJvb3QgPSBbbnVsbF07CgpmdW5jdGlvbiBTZWxlY3Rpb24oZ3JvdXBzLCBw YXJlbnRzKSB7CiAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzOwogIHRoaXMuX3BhcmVudHMgPSBwYXJl bnRzOwp9CgpmdW5jdGlvbiBzZWxlY3Rpb24oKSB7CiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oW1tk b2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCk7Cn0KClNlbGVjdGlvbi5wcm90b3R5cGUg PSBzZWxlY3Rpb24ucHJvdG90eXBlID0gewogIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sCiAgc2Vs ZWN0OiBzZWxlY3Rpb25fc2VsZWN0LAogIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCwK ICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsCiAgZGF0YTogc2VsZWN0aW9uX2RhdGEsCiAgZW50 ZXI6IHNlbGVjdGlvbl9lbnRlciwKICBleGl0OiBzZWxlY3Rpb25fZXhpdCwKICBqb2luOiBzZWxl Y3Rpb25fam9pbiwKICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLAogIG9yZGVyOiBzZWxlY3Rpb25f b3JkZXIsCiAgc29ydDogc2VsZWN0aW9uX3NvcnQsCiAgY2FsbDogc2VsZWN0aW9uX2NhbGwsCiAg bm9kZXM6IHNlbGVjdGlvbl9ub2RlcywKICBub2RlOiBzZWxlY3Rpb25fbm9kZSwKICBzaXplOiBz ZWxlY3Rpb25fc2l6ZSwKICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LAogIGVhY2g6IHNlbGVjdGlv bl9lYWNoLAogIGF0dHI6IHNlbGVjdGlvbl9hdHRyLAogIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUs CiAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSwKICBjbGFzc2VkOiBzZWxlY3Rpb25fY2xh c3NlZCwKICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCwKICBodG1sOiBzZWxlY3Rpb25faHRtbCwKICBy YWlzZTogc2VsZWN0aW9uX3JhaXNlLAogIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsCiAgYXBwZW5k OiBzZWxlY3Rpb25fYXBwZW5kLAogIGluc2VydDogc2VsZWN0aW9uX2luc2VydCwKICByZW1vdmU6 IHNlbGVjdGlvbl9yZW1vdmUsCiAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSwKICBkYXR1bTogc2Vs ZWN0aW9uX2RhdHVtLAogIG9uOiBzZWxlY3Rpb25fb24sCiAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9k aXNwYXRjaAp9OwoKZnVuY3Rpb24gc2VsZWN0KHNlbGVjdG9yKSB7CiAgcmV0dXJuIHR5cGVvZiBz ZWxlY3RvciA9PT0gInN0cmluZyIKICAgICAgPyBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQucXVl cnlTZWxlY3RvcihzZWxlY3RvcildXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pCiAgICAg IDogbmV3IFNlbGVjdGlvbihbW3NlbGVjdG9yXV0sIHJvb3QpOwp9CgpmdW5jdGlvbiBjcmVhdGUo bmFtZSkgewogIHJldHVybiBzZWxlY3QoY3JlYXRvcihuYW1lKS5jYWxsKGRvY3VtZW50LmRvY3Vt ZW50RWxlbWVudCkpOwp9Cgp2YXIgbmV4dElkID0gMDsKCmZ1bmN0aW9uIGxvY2FsKCkgewogIHJl dHVybiBuZXcgTG9jYWw7Cn0KCmZ1bmN0aW9uIExvY2FsKCkgewogIHRoaXMuXyA9ICJAIiArICgr K25leHRJZCkudG9TdHJpbmcoMzYpOwp9CgpMb2NhbC5wcm90b3R5cGUgPSBsb2NhbC5wcm90b3R5 cGUgPSB7CiAgY29uc3RydWN0b3I6IExvY2FsLAogIGdldDogZnVuY3Rpb24obm9kZSkgewogICAg dmFyIGlkID0gdGhpcy5fOwogICAgd2hpbGUgKCEoaWQgaW4gbm9kZSkpIGlmICghKG5vZGUgPSBu b2RlLnBhcmVudE5vZGUpKSByZXR1cm47CiAgICByZXR1cm4gbm9kZVtpZF07CiAgfSwKICBzZXQ6 IGZ1bmN0aW9uKG5vZGUsIHZhbHVlKSB7CiAgICByZXR1cm4gbm9kZVt0aGlzLl9dID0gdmFsdWU7 CiAgfSwKICByZW1vdmU6IGZ1bmN0aW9uKG5vZGUpIHsKICAgIHJldHVybiB0aGlzLl8gaW4gbm9k ZSAmJiBkZWxldGUgbm9kZVt0aGlzLl9dOwogIH0sCiAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewog ICAgcmV0dXJuIHRoaXMuXzsKICB9Cn07CgpmdW5jdGlvbiBzb3VyY2VFdmVudCgpIHsKICB2YXIg Y3VycmVudCA9IGV4cG9ydHMuZXZlbnQsIHNvdXJjZTsKICB3aGlsZSAoc291cmNlID0gY3VycmVu dC5zb3VyY2VFdmVudCkgY3VycmVudCA9IHNvdXJjZTsKICByZXR1cm4gY3VycmVudDsKfQoKZnVu Y3Rpb24gcG9pbnQobm9kZSwgZXZlbnQpIHsKICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1l bnQgfHwgbm9kZTsKCiAgaWYgKHN2Zy5jcmVhdGVTVkdQb2ludCkgewogICAgdmFyIHBvaW50ID0g c3ZnLmNyZWF0ZVNWR1BvaW50KCk7CiAgICBwb2ludC54ID0gZXZlbnQuY2xpZW50WCwgcG9pbnQu eSA9IGV2ZW50LmNsaWVudFk7CiAgICBwb2ludCA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShub2Rl LmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7CiAgICByZXR1cm4gW3BvaW50LngsIHBvaW50Lnld OwogIH0KCiAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIHJldHVy biBbZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIG5vZGUuY2xpZW50TGVmdCwgZXZlbnQuY2xp ZW50WSAtIHJlY3QudG9wIC0gbm9kZS5jbGllbnRUb3BdOwp9CgpmdW5jdGlvbiBtb3VzZShub2Rl KSB7CiAgdmFyIGV2ZW50ID0gc291cmNlRXZlbnQoKTsKICBpZiAoZXZlbnQuY2hhbmdlZFRvdWNo ZXMpIGV2ZW50ID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF07CiAgcmV0dXJuIHBvaW50KG5vZGUs IGV2ZW50KTsKfQoKZnVuY3Rpb24gc2VsZWN0QWxsKHNlbGVjdG9yKSB7CiAgcmV0dXJuIHR5cGVv ZiBzZWxlY3RvciA9PT0gInN0cmluZyIKICAgICAgPyBuZXcgU2VsZWN0aW9uKFtkb2N1bWVudC5x dWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKQog ICAgICA6IG5ldyBTZWxlY3Rpb24oW3NlbGVjdG9yID09IG51bGwgPyBbXSA6IHNlbGVjdG9yXSwg cm9vdCk7Cn0KCmZ1bmN0aW9uIHRvdWNoKG5vZGUsIHRvdWNoZXMsIGlkZW50aWZpZXIpIHsKICBp ZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGlkZW50aWZpZXIgPSB0b3VjaGVzLCB0b3VjaGVzID0g c291cmNlRXZlbnQoKS5jaGFuZ2VkVG91Y2hlczsKCiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0b3Vj aGVzID8gdG91Y2hlcy5sZW5ndGggOiAwLCB0b3VjaDsgaSA8IG47ICsraSkgewogICAgaWYgKCh0 b3VjaCA9IHRvdWNoZXNbaV0pLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHsKICAgICAgcmV0 dXJuIHBvaW50KG5vZGUsIHRvdWNoKTsKICAgIH0KICB9CgogIHJldHVybiBudWxsOwp9CgpmdW5j dGlvbiB0b3VjaGVzKG5vZGUsIHRvdWNoZXMpIHsKICBpZiAodG91Y2hlcyA9PSBudWxsKSB0b3Vj aGVzID0gc291cmNlRXZlbnQoKS50b3VjaGVzOwoKICBmb3IgKHZhciBpID0gMCwgbiA9IHRvdWNo ZXMgPyB0b3VjaGVzLmxlbmd0aCA6IDAsIHBvaW50cyA9IG5ldyBBcnJheShuKTsgaSA8IG47ICsr aSkgewogICAgcG9pbnRzW2ldID0gcG9pbnQobm9kZSwgdG91Y2hlc1tpXSk7CiAgfQoKICByZXR1 cm4gcG9pbnRzOwp9CgpmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKCkgewogIGV4cG9ydHMuZXZlbnQu c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7Cn0KCmZ1bmN0aW9uIG5vZXZlbnQoKSB7CiAgZXhw b3J0cy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogIGV4cG9ydHMuZXZlbnQuc3RvcEltbWVkaWF0 ZVByb3BhZ2F0aW9uKCk7Cn0KCmZ1bmN0aW9uIGRyYWdEaXNhYmxlKHZpZXcpIHsKICB2YXIgcm9v dCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAogICAgICBzZWxlY3Rpb24gPSBzZWxl Y3Qodmlldykub24oImRyYWdzdGFydC5kcmFnIiwgbm9ldmVudCwgdHJ1ZSk7CiAgaWYgKCJvbnNl bGVjdHN0YXJ0IiBpbiByb290KSB7CiAgICBzZWxlY3Rpb24ub24oInNlbGVjdHN0YXJ0LmRyYWci LCBub2V2ZW50LCB0cnVlKTsKICB9IGVsc2UgewogICAgcm9vdC5fX25vc2VsZWN0ID0gcm9vdC5z dHlsZS5Nb3pVc2VyU2VsZWN0OwogICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gIm5vbmUi OwogIH0KfQoKZnVuY3Rpb24geWVzZHJhZyh2aWV3LCBub2NsaWNrKSB7CiAgdmFyIHJvb3QgPSB2 aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZp ZXcpLm9uKCJkcmFnc3RhcnQuZHJhZyIsIG51bGwpOwogIGlmIChub2NsaWNrKSB7CiAgICBzZWxl Y3Rpb24ub24oImNsaWNrLmRyYWciLCBub2V2ZW50LCB0cnVlKTsKICAgIHNldFRpbWVvdXQoZnVu Y3Rpb24oKSB7IHNlbGVjdGlvbi5vbigiY2xpY2suZHJhZyIsIG51bGwpOyB9LCAwKTsKICB9CiAg aWYgKCJvbnNlbGVjdHN0YXJ0IiBpbiByb290KSB7CiAgICBzZWxlY3Rpb24ub24oInNlbGVjdHN0 YXJ0LmRyYWciLCBudWxsKTsKICB9IGVsc2UgewogICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0 ID0gcm9vdC5fX25vc2VsZWN0OwogICAgZGVsZXRlIHJvb3QuX19ub3NlbGVjdDsKICB9Cn0KCmZ1 bmN0aW9uIGNvbnN0YW50JDIoeCkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4 OwogIH07Cn0KCmZ1bmN0aW9uIERyYWdFdmVudCh0YXJnZXQsIHR5cGUsIHN1YmplY3QsIGlkLCBh Y3RpdmUsIHgsIHksIGR4LCBkeSwgZGlzcGF0Y2gpIHsKICB0aGlzLnRhcmdldCA9IHRhcmdldDsK ICB0aGlzLnR5cGUgPSB0eXBlOwogIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7CiAgdGhpcy5pZGVu dGlmaWVyID0gaWQ7CiAgdGhpcy5hY3RpdmUgPSBhY3RpdmU7CiAgdGhpcy54ID0geDsKICB0aGlz LnkgPSB5OwogIHRoaXMuZHggPSBkeDsKICB0aGlzLmR5ID0gZHk7CiAgdGhpcy5fID0gZGlzcGF0 Y2g7Cn0KCkRyYWdFdmVudC5wcm90b3R5cGUub24gPSBmdW5jdGlvbigpIHsKICB2YXIgdmFsdWUg PSB0aGlzLl8ub24uYXBwbHkodGhpcy5fLCBhcmd1bWVudHMpOwogIHJldHVybiB2YWx1ZSA9PT0g dGhpcy5fID8gdGhpcyA6IHZhbHVlOwp9OwoKLy8gSWdub3JlIHJpZ2h0LWNsaWNrLCBzaW5jZSB0 aGF0IHNob3VsZCBvcGVuIHRoZSBjb250ZXh0IG1lbnUuCmZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIo KSB7CiAgcmV0dXJuICFleHBvcnRzLmV2ZW50LmN0cmxLZXkgJiYgIWV4cG9ydHMuZXZlbnQuYnV0 dG9uOwp9CgpmdW5jdGlvbiBkZWZhdWx0Q29udGFpbmVyKCkgewogIHJldHVybiB0aGlzLnBhcmVu dE5vZGU7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRTdWJqZWN0KGQpIHsKICByZXR1cm4gZCA9PSBudWxs ID8ge3g6IGV4cG9ydHMuZXZlbnQueCwgeTogZXhwb3J0cy5ldmVudC55fSA6IGQ7Cn0KCmZ1bmN0 aW9uIGRlZmF1bHRUb3VjaGFibGUoKSB7CiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50 cyB8fCAoIm9udG91Y2hzdGFydCIgaW4gdGhpcyk7Cn0KCmZ1bmN0aW9uIGRyYWcoKSB7CiAgdmFy IGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIsCiAgICAgIGNvbnRhaW5lciA9IGRlZmF1bHRDb250YWlu ZXIsCiAgICAgIHN1YmplY3QgPSBkZWZhdWx0U3ViamVjdCwKICAgICAgdG91Y2hhYmxlID0gZGVm YXVsdFRvdWNoYWJsZSwKICAgICAgZ2VzdHVyZXMgPSB7fSwKICAgICAgbGlzdGVuZXJzID0gZGlz cGF0Y2goInN0YXJ0IiwgImRyYWciLCAiZW5kIiksCiAgICAgIGFjdGl2ZSA9IDAsCiAgICAgIG1v dXNlZG93bngsCiAgICAgIG1vdXNlZG93bnksCiAgICAgIG1vdXNlbW92aW5nLAogICAgICB0b3Vj aGVuZGluZywKICAgICAgY2xpY2tEaXN0YW5jZTIgPSAwOwoKICBmdW5jdGlvbiBkcmFnKHNlbGVj dGlvbikgewogICAgc2VsZWN0aW9uCiAgICAgICAgLm9uKCJtb3VzZWRvd24uZHJhZyIsIG1vdXNl ZG93bmVkKQogICAgICAuZmlsdGVyKHRvdWNoYWJsZSkKICAgICAgICAub24oInRvdWNoc3RhcnQu ZHJhZyIsIHRvdWNoc3RhcnRlZCkKICAgICAgICAub24oInRvdWNobW92ZS5kcmFnIiwgdG91Y2ht b3ZlZCkKICAgICAgICAub24oInRvdWNoZW5kLmRyYWcgdG91Y2hjYW5jZWwuZHJhZyIsIHRvdWNo ZW5kZWQpCiAgICAgICAgLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCAibm9uZSIpCiAgICAgICAgLnN0 eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCAicmdiYSgwLDAsMCwwKSIpOwogIH0K CiAgZnVuY3Rpb24gbW91c2Vkb3duZWQoKSB7CiAgICBpZiAodG91Y2hlbmRpbmcgfHwgIWZpbHRl ci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47CiAgICB2YXIgZ2VzdHVyZSA9IGJlZm9y ZXN0YXJ0KCJtb3VzZSIsIGNvbnRhaW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBtb3VzZSwg dGhpcywgYXJndW1lbnRzKTsKICAgIGlmICghZ2VzdHVyZSkgcmV0dXJuOwogICAgc2VsZWN0KGV4 cG9ydHMuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS5kcmFnIiwgbW91c2Vtb3ZlZCwgdHJ1ZSku b24oIm1vdXNldXAuZHJhZyIsIG1vdXNldXBwZWQsIHRydWUpOwogICAgZHJhZ0Rpc2FibGUoZXhw b3J0cy5ldmVudC52aWV3KTsKICAgIG5vcHJvcGFnYXRpb24oKTsKICAgIG1vdXNlbW92aW5nID0g ZmFsc2U7CiAgICBtb3VzZWRvd254ID0gZXhwb3J0cy5ldmVudC5jbGllbnRYOwogICAgbW91c2Vk b3dueSA9IGV4cG9ydHMuZXZlbnQuY2xpZW50WTsKICAgIGdlc3R1cmUoInN0YXJ0Iik7CiAgfQoK ICBmdW5jdGlvbiBtb3VzZW1vdmVkKCkgewogICAgbm9ldmVudCgpOwogICAgaWYgKCFtb3VzZW1v dmluZykgewogICAgICB2YXIgZHggPSBleHBvcnRzLmV2ZW50LmNsaWVudFggLSBtb3VzZWRvd254 LCBkeSA9IGV4cG9ydHMuZXZlbnQuY2xpZW50WSAtIG1vdXNlZG93bnk7CiAgICAgIG1vdXNlbW92 aW5nID0gZHggKiBkeCArIGR5ICogZHkgPiBjbGlja0Rpc3RhbmNlMjsKICAgIH0KICAgIGdlc3R1 cmVzLm1vdXNlKCJkcmFnIik7CiAgfQoKICBmdW5jdGlvbiBtb3VzZXVwcGVkKCkgewogICAgc2Vs ZWN0KGV4cG9ydHMuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS5kcmFnIG1vdXNldXAuZHJhZyIs IG51bGwpOwogICAgeWVzZHJhZyhleHBvcnRzLmV2ZW50LnZpZXcsIG1vdXNlbW92aW5nKTsKICAg IG5vZXZlbnQoKTsKICAgIGdlc3R1cmVzLm1vdXNlKCJlbmQiKTsKICB9CgogIGZ1bmN0aW9uIHRv dWNoc3RhcnRlZCgpIHsKICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJl dHVybjsKICAgIHZhciB0b3VjaGVzID0gZXhwb3J0cy5ldmVudC5jaGFuZ2VkVG91Y2hlcywKICAg ICAgICBjID0gY29udGFpbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgbiA9IHRv dWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlOwoKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsK ICAgICAgaWYgKGdlc3R1cmUgPSBiZWZvcmVzdGFydCh0b3VjaGVzW2ldLmlkZW50aWZpZXIsIGMs IHRvdWNoLCB0aGlzLCBhcmd1bWVudHMpKSB7CiAgICAgICAgbm9wcm9wYWdhdGlvbigpOwogICAg ICAgIGdlc3R1cmUoInN0YXJ0Iik7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHRvdWNo bW92ZWQoKSB7CiAgICB2YXIgdG91Y2hlcyA9IGV4cG9ydHMuZXZlbnQuY2hhbmdlZFRvdWNoZXMs CiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlOwoKICAgIGZvciAoaSA9IDA7 IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKGdlc3R1cmUgPSBnZXN0dXJlc1t0b3VjaGVzW2ldLmlk ZW50aWZpZXJdKSB7CiAgICAgICAgbm9ldmVudCgpOwogICAgICAgIGdlc3R1cmUoImRyYWciKTsK ICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gdG91Y2hlbmRlZCgpIHsKICAgIHZhciB0b3Vj aGVzID0gZXhwb3J0cy5ldmVudC5jaGFuZ2VkVG91Y2hlcywKICAgICAgICBuID0gdG91Y2hlcy5s ZW5ndGgsIGksIGdlc3R1cmU7CgogICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91 Y2hlbmRpbmcpOwogICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3Vj aGVuZGluZyA9IG51bGw7IH0sIDUwMCk7IC8vIEdob3N0IGNsaWNrcyBhcmUgZGVsYXllZCEKICAg IGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKGdlc3R1cmUgPSBnZXN0dXJlc1t0 b3VjaGVzW2ldLmlkZW50aWZpZXJdKSB7CiAgICAgICAgbm9wcm9wYWdhdGlvbigpOwogICAgICAg IGdlc3R1cmUoImVuZCIpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBiZWZvcmVzdGFy dChpZCwgY29udGFpbmVyLCBwb2ludCwgdGhhdCwgYXJncykgewogICAgdmFyIHAgPSBwb2ludChj b250YWluZXIsIGlkKSwgcywgZHgsIGR5LAogICAgICAgIHN1Ymxpc3RlbmVycyA9IGxpc3RlbmVy cy5jb3B5KCk7CgogICAgaWYgKCFjdXN0b21FdmVudChuZXcgRHJhZ0V2ZW50KGRyYWcsICJiZWZv cmVzdGFydCIsIHMsIGlkLCBhY3RpdmUsIHBbMF0sIHBbMV0sIDAsIDAsIHN1Ymxpc3RlbmVycyks IGZ1bmN0aW9uKCkgewogICAgICBpZiAoKGV4cG9ydHMuZXZlbnQuc3ViamVjdCA9IHMgPSBzdWJq ZWN0LmFwcGx5KHRoYXQsIGFyZ3MpKSA9PSBudWxsKSByZXR1cm4gZmFsc2U7CiAgICAgIGR4ID0g cy54IC0gcFswXSB8fCAwOwogICAgICBkeSA9IHMueSAtIHBbMV0gfHwgMDsKICAgICAgcmV0dXJu IHRydWU7CiAgICB9KSkgcmV0dXJuOwoKICAgIHJldHVybiBmdW5jdGlvbiBnZXN0dXJlKHR5cGUp IHsKICAgICAgdmFyIHAwID0gcCwgbjsKICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgY2Fz ZSAic3RhcnQiOiBnZXN0dXJlc1tpZF0gPSBnZXN0dXJlLCBuID0gYWN0aXZlKys7IGJyZWFrOwog ICAgICAgIGNhc2UgImVuZCI6IGRlbGV0ZSBnZXN0dXJlc1tpZF0sIC0tYWN0aXZlOyAvLyBub2Jy ZWFrCiAgICAgICAgY2FzZSAiZHJhZyI6IHAgPSBwb2ludChjb250YWluZXIsIGlkKSwgbiA9IGFj dGl2ZTsgYnJlYWs7CiAgICAgIH0KICAgICAgY3VzdG9tRXZlbnQobmV3IERyYWdFdmVudChkcmFn LCB0eXBlLCBzLCBpZCwgbiwgcFswXSArIGR4LCBwWzFdICsgZHksIHBbMF0gLSBwMFswXSwgcFsx XSAtIHAwWzFdLCBzdWJsaXN0ZW5lcnMpLCBzdWJsaXN0ZW5lcnMuYXBwbHksIHN1Ymxpc3RlbmVy cywgW3R5cGUsIHRoYXQsIGFyZ3NdKTsKICAgIH07CiAgfQoKICBkcmFnLmZpbHRlciA9IGZ1bmN0 aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9IHR5cGVvZiBf ID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDIoISFfKSwgZHJhZykgOiBmaWx0ZXI7CiAg fTsKCiAgZHJhZy5jb250YWluZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRz Lmxlbmd0aCA/IChjb250YWluZXIgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25z dGFudCQyKF8pLCBkcmFnKSA6IGNvbnRhaW5lcjsKICB9OwoKICBkcmFnLnN1YmplY3QgPSBmdW5j dGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdWJqZWN0ID0gdHlwZW9m IF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMihfKSwgZHJhZykgOiBzdWJqZWN0Owog IH07CgogIGRyYWcudG91Y2hhYmxlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50 cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29u c3RhbnQkMighIV8pLCBkcmFnKSA6IHRvdWNoYWJsZTsKICB9OwoKICBkcmFnLm9uID0gZnVuY3Rp b24oKSB7CiAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1 bWVudHMpOwogICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyBkcmFnIDogdmFsdWU7CiAg fTsKCiAgZHJhZy5jbGlja0Rpc3RhbmNlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIGRyYWcpIDogTWF0 aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTsKICB9OwoKICByZXR1cm4gZHJhZzsKfQoKZnVuY3Rpb24g ZGVmaW5lKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHsKICBjb25zdHJ1Y3Rvci5w cm90b3R5cGUgPSBmYWN0b3J5LnByb3RvdHlwZSA9IHByb3RvdHlwZTsKICBwcm90b3R5cGUuY29u c3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKfQoKZnVuY3Rpb24gZXh0ZW5kKHBhcmVudCwgZGVmaW5p dGlvbikgewogIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUp OwogIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRp b25ba2V5XTsKICByZXR1cm4gcHJvdG90eXBlOwp9CgpmdW5jdGlvbiBDb2xvcigpIHt9Cgp2YXIg ZGFya2VyID0gMC43Owp2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyOwoKdmFyIHJlSSA9ICJcXHMq KFsrLV0/XFxkKylcXHMqIiwKICAgIHJlTiA9ICJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VF XVsrLV0/XFxkKyk/KVxccyoiLAogICAgcmVQID0gIlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpb ZUVdWystXT9cXGQrKT8pJVxccyoiLAogICAgcmVIZXggPSAvXiMoWzAtOWEtZl17Myw4fSkkLywK ICAgIHJlUmdiSW50ZWdlciA9IG5ldyBSZWdFeHAoIl5yZ2JcXCgiICsgW3JlSSwgcmVJLCByZUld ICsgIlxcKSQiKSwKICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoIl5yZ2JcXCgiICsgW3Jl UCwgcmVQLCByZVBdICsgIlxcKSQiKSwKICAgIHJlUmdiYUludGVnZXIgPSBuZXcgUmVnRXhwKCJe cmdiYVxcKCIgKyBbcmVJLCByZUksIHJlSSwgcmVOXSArICJcXCkkIiksCiAgICByZVJnYmFQZXJj ZW50ID0gbmV3IFJlZ0V4cCgiXnJnYmFcXCgiICsgW3JlUCwgcmVQLCByZVAsIHJlTl0gKyAiXFwp JCIpLAogICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cCgiXmhzbFxcKCIgKyBbcmVOLCByZVAs IHJlUF0gKyAiXFwpJCIpLAogICAgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoIl5oc2xhXFwo IiArIFtyZU4sIHJlUCwgcmVQLCByZU5dICsgIlxcKSQiKTsKCnZhciBuYW1lZCA9IHsKICBhbGlj ZWJsdWU6IDB4ZjBmOGZmLAogIGFudGlxdWV3aGl0ZTogMHhmYWViZDcsCiAgYXF1YTogMHgwMGZm ZmYsCiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsCiAgYXp1cmU6IDB4ZjBmZmZmLAogIGJlaWdlOiAw eGY1ZjVkYywKICBiaXNxdWU6IDB4ZmZlNGM0LAogIGJsYWNrOiAweDAwMDAwMCwKICBibGFuY2hl ZGFsbW9uZDogMHhmZmViY2QsCiAgYmx1ZTogMHgwMDAwZmYsCiAgYmx1ZXZpb2xldDogMHg4YTJi ZTIsCiAgYnJvd246IDB4YTUyYTJhLAogIGJ1cmx5d29vZDogMHhkZWI4ODcsCiAgY2FkZXRibHVl OiAweDVmOWVhMCwKICBjaGFydHJldXNlOiAweDdmZmYwMCwKICBjaG9jb2xhdGU6IDB4ZDI2OTFl LAogIGNvcmFsOiAweGZmN2Y1MCwKICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsCiAgY29ybnNp bGs6IDB4ZmZmOGRjLAogIGNyaW1zb246IDB4ZGMxNDNjLAogIGN5YW46IDB4MDBmZmZmLAogIGRh cmtibHVlOiAweDAwMDA4YiwKICBkYXJrY3lhbjogMHgwMDhiOGIsCiAgZGFya2dvbGRlbnJvZDog MHhiODg2MGIsCiAgZGFya2dyYXk6IDB4YTlhOWE5LAogIGRhcmtncmVlbjogMHgwMDY0MDAsCiAg ZGFya2dyZXk6IDB4YTlhOWE5LAogIGRhcmtraGFraTogMHhiZGI3NmIsCiAgZGFya21hZ2VudGE6 IDB4OGIwMDhiLAogIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZiwKICBkYXJrb3JhbmdlOiAweGZm OGMwMCwKICBkYXJrb3JjaGlkOiAweDk5MzJjYywKICBkYXJrcmVkOiAweDhiMDAwMCwKICBkYXJr c2FsbW9uOiAweGU5OTY3YSwKICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmLAogIGRhcmtzbGF0ZWJs dWU6IDB4NDgzZDhiLAogIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLAogIGRhcmtzbGF0ZWdyZXk6 IDB4MmY0ZjRmLAogIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLAogIGRhcmt2aW9sZXQ6IDB4OTQw MGQzLAogIGRlZXBwaW5rOiAweGZmMTQ5MywKICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsCiAgZGlt Z3JheTogMHg2OTY5NjksCiAgZGltZ3JleTogMHg2OTY5NjksCiAgZG9kZ2VyYmx1ZTogMHgxZTkw ZmYsCiAgZmlyZWJyaWNrOiAweGIyMjIyMiwKICBmbG9yYWx3aGl0ZTogMHhmZmZhZjAsCiAgZm9y ZXN0Z3JlZW46IDB4MjI4YjIyLAogIGZ1Y2hzaWE6IDB4ZmYwMGZmLAogIGdhaW5zYm9ybzogMHhk Y2RjZGMsCiAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsCiAgZ29sZDogMHhmZmQ3MDAsCiAgZ29sZGVu cm9kOiAweGRhYTUyMCwKICBncmF5OiAweDgwODA4MCwKICBncmVlbjogMHgwMDgwMDAsCiAgZ3Jl ZW55ZWxsb3c6IDB4YWRmZjJmLAogIGdyZXk6IDB4ODA4MDgwLAogIGhvbmV5ZGV3OiAweGYwZmZm MCwKICBob3RwaW5rOiAweGZmNjliNCwKICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLAogIGluZGlnbzog MHg0YjAwODIsCiAgaXZvcnk6IDB4ZmZmZmYwLAogIGtoYWtpOiAweGYwZTY4YywKICBsYXZlbmRl cjogMHhlNmU2ZmEsCiAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjUsCiAgbGF3bmdyZWVuOiAweDdj ZmMwMCwKICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLAogIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTYsCiAg bGlnaHRjb3JhbDogMHhmMDgwODAsCiAgbGlnaHRjeWFuOiAweGUwZmZmZiwKICBsaWdodGdvbGRl bnJvZHllbGxvdzogMHhmYWZhZDIsCiAgbGlnaHRncmF5OiAweGQzZDNkMywKICBsaWdodGdyZWVu OiAweDkwZWU5MCwKICBsaWdodGdyZXk6IDB4ZDNkM2QzLAogIGxpZ2h0cGluazogMHhmZmI2YzEs CiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLAogIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhLAogIGxp Z2h0c2t5Ymx1ZTogMHg4N2NlZmEsCiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LAogIGxpZ2h0 c2xhdGVncmV5OiAweDc3ODg5OSwKICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsCiAgbGlnaHR5 ZWxsb3c6IDB4ZmZmZmUwLAogIGxpbWU6IDB4MDBmZjAwLAogIGxpbWVncmVlbjogMHgzMmNkMzIs CiAgbGluZW46IDB4ZmFmMGU2LAogIG1hZ2VudGE6IDB4ZmYwMGZmLAogIG1hcm9vbjogMHg4MDAw MDAsCiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsCiAgbWVkaXVtYmx1ZTogMHgwMDAwY2Qs CiAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMywKICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLAogIG1l ZGl1bXNlYWdyZWVuOiAweDNjYjM3MSwKICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLAogIG1l ZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSwKICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjLAog IG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsCiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCwKICBt aW50Y3JlYW06IDB4ZjVmZmZhLAogIG1pc3R5cm9zZTogMHhmZmU0ZTEsCiAgbW9jY2FzaW46IDB4 ZmZlNGI1LAogIG5hdmFqb3doaXRlOiAweGZmZGVhZCwKICBuYXZ5OiAweDAwMDA4MCwKICBvbGRs YWNlOiAweGZkZjVlNiwKICBvbGl2ZTogMHg4MDgwMDAsCiAgb2xpdmVkcmFiOiAweDZiOGUyMywK ICBvcmFuZ2U6IDB4ZmZhNTAwLAogIG9yYW5nZXJlZDogMHhmZjQ1MDAsCiAgb3JjaGlkOiAweGRh NzBkNiwKICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSwKICBwYWxlZ3JlZW46IDB4OThmYjk4LAog IHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLAogIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLAogIHBh cGF5YXdoaXA6IDB4ZmZlZmQ1LAogIHBlYWNocHVmZjogMHhmZmRhYjksCiAgcGVydTogMHhjZDg1 M2YsCiAgcGluazogMHhmZmMwY2IsCiAgcGx1bTogMHhkZGEwZGQsCiAgcG93ZGVyYmx1ZTogMHhi MGUwZTYsCiAgcHVycGxlOiAweDgwMDA4MCwKICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSwKICBy ZWQ6IDB4ZmYwMDAwLAogIHJvc3licm93bjogMHhiYzhmOGYsCiAgcm95YWxibHVlOiAweDQxNjll MSwKICBzYWRkbGVicm93bjogMHg4YjQ1MTMsCiAgc2FsbW9uOiAweGZhODA3MiwKICBzYW5keWJy b3duOiAweGY0YTQ2MCwKICBzZWFncmVlbjogMHgyZThiNTcsCiAgc2Vhc2hlbGw6IDB4ZmZmNWVl LAogIHNpZW5uYTogMHhhMDUyMmQsCiAgc2lsdmVyOiAweGMwYzBjMCwKICBza3libHVlOiAweDg3 Y2VlYiwKICBzbGF0ZWJsdWU6IDB4NmE1YWNkLAogIHNsYXRlZ3JheTogMHg3MDgwOTAsCiAgc2xh dGVncmV5OiAweDcwODA5MCwKICBzbm93OiAweGZmZmFmYSwKICBzcHJpbmdncmVlbjogMHgwMGZm N2YsCiAgc3RlZWxibHVlOiAweDQ2ODJiNCwKICB0YW46IDB4ZDJiNDhjLAogIHRlYWw6IDB4MDA4 MDgwLAogIHRoaXN0bGU6IDB4ZDhiZmQ4LAogIHRvbWF0bzogMHhmZjYzNDcsCiAgdHVycXVvaXNl OiAweDQwZTBkMCwKICB2aW9sZXQ6IDB4ZWU4MmVlLAogIHdoZWF0OiAweGY1ZGViMywKICB3aGl0 ZTogMHhmZmZmZmYsCiAgd2hpdGVzbW9rZTogMHhmNWY1ZjUsCiAgeWVsbG93OiAweGZmZmYwMCwK ICB5ZWxsb3dncmVlbjogMHg5YWNkMzIKfTsKCmRlZmluZShDb2xvciwgY29sb3IsIHsKICBjb3B5 OiBmdW5jdGlvbihjaGFubmVscykgewogICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMu Y29uc3RydWN0b3IsIHRoaXMsIGNoYW5uZWxzKTsKICB9LAogIGRpc3BsYXlhYmxlOiBmdW5jdGlv bigpIHsKICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7CiAgfSwKICBoZXg6IGNv bG9yX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC4KICBmb3Jt YXRIZXg6IGNvbG9yX2Zvcm1hdEhleCwKICBmb3JtYXRIc2w6IGNvbG9yX2Zvcm1hdEhzbCwKICBm b3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYiwKICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiCn0p OwoKZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkgewogIHJldHVybiB0aGlzLnJnYigpLmZvcm1h dEhleCgpOwp9CgpmdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2woKSB7CiAgcmV0dXJuIGhzbENvbnZl cnQodGhpcykuZm9ybWF0SHNsKCk7Cn0KCmZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHsKICBy ZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKTsKfQoKZnVuY3Rpb24gY29sb3IoZm9ybWF0KSB7 CiAgdmFyIG0sIGw7CiAgZm9ybWF0ID0gKGZvcm1hdCArICIiKS50cmltKCkudG9Mb3dlckNhc2Uo KTsKICByZXR1cm4gKG0gPSByZUhleC5leGVjKGZvcm1hdCkpID8gKGwgPSBtWzFdLmxlbmd0aCwg bSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbCA9PT0gNiA/IHJnYm4obSkgLy8gI2ZmMDAwMAogICAg ICA6IGwgPT09IDMgPyBuZXcgUmdiKChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAo bSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4Ziks IDEpIC8vICNmMDAKICAgICAgOiBsID09PSA4ID8gcmdiYShtID4+IDI0ICYgMHhmZiwgbSA+PiAx NiAmIDB4ZmYsIG0gPj4gOCAmIDB4ZmYsIChtICYgMHhmZikgLyAweGZmKSAvLyAjZmYwMDAwMDAK ICAgICAgOiBsID09PSA0ID8gcmdiYSgobSA+PiAxMiAmIDB4ZikgfCAobSA+PiA4ICYgMHhmMCks IChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYg MHhmMCksICgoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpKSAvIDB4ZmYpIC8vICNmMDAwCiAg ICAgIDogbnVsbCkgLy8gaW52YWxpZCBoZXgKICAgICAgOiAobSA9IHJlUmdiSW50ZWdlci5leGVj KGZvcm1hdCkpID8gbmV3IFJnYihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAw KQogICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0g KiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJn YigxMDAlLCAwJSwgMCUpCiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkg PyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKQogICAg ICA6IChtID0gcmVSZ2JhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdICogMjU1IC8g MTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAw JSwgMCUsIDAlLCAxKQogICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBo c2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAl KQogICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBt WzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpCiAg ICAgIDogbmFtZWQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4obmFtZWRbZm9ybWF0XSkg Ly8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMKICAgICAgOiBmb3Jt YXQgPT09ICJ0cmFuc3BhcmVudCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApCiAgICAgIDog bnVsbDsKfQoKZnVuY3Rpb24gcmdibihuKSB7CiAgcmV0dXJuIG5ldyBSZ2IobiA+PiAxNiAmIDB4 ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTsKfQoKZnVuY3Rpb24gcmdiYShyLCBnLCBi LCBhKSB7CiAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOOwogIHJldHVybiBuZXcgUmdiKHIs IGcsIGIsIGEpOwp9CgpmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHsKICBpZiAoIShvIGluc3RhbmNl b2YgQ29sb3IpKSBvID0gY29sb3Iobyk7CiAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYjsKICBvID0g by5yZ2IoKTsKICByZXR1cm4gbmV3IFJnYihvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpOwp9Cgpm dW5jdGlvbiByZ2IociwgZywgYiwgb3BhY2l0eSkgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3Ro ID09PSAxID8gcmdiQ29udmVydChyKSA6IG5ldyBSZ2IociwgZywgYiwgb3BhY2l0eSA9PSBudWxs ID8gMSA6IG9wYWNpdHkpOwp9CgpmdW5jdGlvbiBSZ2IociwgZywgYiwgb3BhY2l0eSkgewogIHRo aXMuciA9ICtyOwogIHRoaXMuZyA9ICtnOwogIHRoaXMuYiA9ICtiOwogIHRoaXMub3BhY2l0eSA9 ICtvcGFjaXR5Owp9CgpkZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwgewogIGJyaWdodGVy OiBmdW5jdGlvbihrKSB7CiAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhi cmlnaHRlciwgayk7CiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0 aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogIH0sCiAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAg ICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTsKICAgIHJldHVy biBuZXcgUmdiKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0 eSk7CiAgfSwKICByZ2I6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXM7CiAgfSwKICBkaXNw bGF5YWJsZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMu ciA8IDI1NS41KQogICAgICAgICYmICgtMC41IDw9IHRoaXMuZyAmJiB0aGlzLmcgPCAyNTUuNSkK ICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmIgJiYgdGhpcy5iIDwgMjU1LjUpCiAgICAgICAgJiYg KDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTsKICB9LAogIGhleDogcmdi X2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC4KICBmb3JtYXRI ZXg6IHJnYl9mb3JtYXRIZXgsCiAgZm9ybWF0UmdiOiByZ2JfZm9ybWF0UmdiLAogIHRvU3RyaW5n OiByZ2JfZm9ybWF0UmdiCn0pKTsKCmZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7CiAgcmV0dXJu ICIjIiArIGhleCh0aGlzLnIpICsgaGV4KHRoaXMuZykgKyBoZXgodGhpcy5iKTsKfQoKZnVuY3Rp b24gcmdiX2Zvcm1hdFJnYigpIHsKICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEp ID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTsKICByZXR1cm4gKGEgPT09IDEgPyAi cmdiKCIgOiAicmdiYSgiKQogICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5y b3VuZCh0aGlzLnIpIHx8IDApKSArICIsICIKICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigy NTUsIE1hdGgucm91bmQodGhpcy5nKSB8fCAwKSkgKyAiLCAiCiAgICAgICsgTWF0aC5tYXgoMCwg TWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuYikgfHwgMCkpCiAgICAgICsgKGEgPT09IDEg PyAiKSIgOiAiLCAiICsgYSArICIpIik7Cn0KCmZ1bmN0aW9uIGhleCh2YWx1ZSkgewogIHZhbHVl ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7CiAg cmV0dXJuICh2YWx1ZSA8IDE2ID8gIjAiIDogIiIpICsgdmFsdWUudG9TdHJpbmcoMTYpOwp9Cgpm dW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHsKICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47 CiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47CiAgZWxzZSBpZiAocyA8 PSAwKSBoID0gTmFOOwogIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIGEpOwp9CgpmdW5jdGlvbiBo c2xDb252ZXJ0KG8pIHsKICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5o LCBvLnMsIG8ubCwgby5vcGFjaXR5KTsKICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IpKSBvID0g Y29sb3Iobyk7CiAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDsKICBpZiAobyBpbnN0YW5jZW9mIEhz bCkgcmV0dXJuIG87CiAgbyA9IG8ucmdiKCk7CiAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgIGcg PSBvLmcgLyAyNTUsCiAgICAgIGIgPSBvLmIgLyAyNTUsCiAgICAgIG1pbiA9IE1hdGgubWluKHIs IGcsIGIpLAogICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwKICAgICAgaCA9IE5hTiwKICAg ICAgcyA9IG1heCAtIG1pbiwKICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjsKICBpZiAocykgewog ICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7CiAgICBlbHNl IGlmIChnID09PSBtYXgpIGggPSAoYiAtIHIpIC8gcyArIDI7CiAgICBlbHNlIGggPSAociAtIGcp IC8gcyArIDQ7CiAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluOwog ICAgaCAqPSA2MDsKICB9IGVsc2UgewogICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7CiAg fQogIHJldHVybiBuZXcgSHNsKGgsIHMsIGwsIG8ub3BhY2l0eSk7Cn0KCmZ1bmN0aW9uIGhzbCho LCBzLCBsLCBvcGFjaXR5KSB7CiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoc2xD b252ZXJ0KGgpIDogbmV3IEhzbChoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0 eSk7Cn0KCmZ1bmN0aW9uIEhzbChoLCBzLCBsLCBvcGFjaXR5KSB7CiAgdGhpcy5oID0gK2g7CiAg dGhpcy5zID0gK3M7CiAgdGhpcy5sID0gK2w7CiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7Cn0K CmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7CiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGsp IHsKICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTsK ICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNp dHkpOwogIH0sCiAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICBrID0gayA9PSBudWxsID8gZGFy a2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTsKICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhp cy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogIH0sCiAgcmdiOiBmdW5jdGlvbigpIHsK ICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLAogICAgICAgIHMg PSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucywKICAgICAgICBsID0gdGhp cy5sLAogICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsCiAgICAgICAg bTEgPSAyICogbCAtIG0yOwogICAgcmV0dXJuIG5ldyBSZ2IoCiAgICAgIGhzbDJyZ2IoaCA+PSAy NDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSwKICAgICAgaHNsMnJnYihoLCBtMSwgbTIp LAogICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSwKICAg ICAgdGhpcy5vcGFjaXR5CiAgICApOwogIH0sCiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewog ICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKQog ICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSkKICAgICAgICAmJiAoMCA8PSB0 aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpOwogIH0sCiAgZm9ybWF0SHNsOiBmdW5j dGlvbigpIHsKICAgIHZhciBhID0gdGhpcy5vcGFjaXR5OyBhID0gaXNOYU4oYSkgPyAxIDogTWF0 aC5tYXgoMCwgTWF0aC5taW4oMSwgYSkpOwogICAgcmV0dXJuIChhID09PSAxID8gImhzbCgiIDog ImhzbGEoIikKICAgICAgICArICh0aGlzLmggfHwgMCkgKyAiLCAiCiAgICAgICAgKyAodGhpcy5z IHx8IDApICogMTAwICsgIiUsICIKICAgICAgICArICh0aGlzLmwgfHwgMCkgKiAxMDAgKyAiJSIK ICAgICAgICArIChhID09PSAxID8gIikiIDogIiwgIiArIGEgKyAiKSIpOwogIH0KfSkpOwoKLyog RnJvbSBGdkQgMTMuMzcsIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgMyAqLwpmdW5jdGlvbiBoc2wy cmdiKGgsIG0xLCBtMikgewogIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8g NjAKICAgICAgOiBoIDwgMTgwID8gbTIKICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkg KiAoMjQwIC0gaCkgLyA2MAogICAgICA6IG0xKSAqIDI1NTsKfQoKdmFyIGRlZzJyYWQgPSBNYXRo LlBJIC8gMTgwOwp2YXIgcmFkMmRlZyA9IDE4MCAvIE1hdGguUEk7CgovLyBodHRwczovL29ic2Vy dmFibGVocS5jb20vQG1ib3N0b2NrL2xhYi1hbmQtcmdiCnZhciBLID0gMTgsCiAgICBYbiA9IDAu OTY0MjIsCiAgICBZbiA9IDEsCiAgICBabiA9IDAuODI1MjEsCiAgICB0MCA9IDQgLyAyOSwKICAg IHQxID0gNiAvIDI5LAogICAgdDIgPSAzICogdDEgKiB0MSwKICAgIHQzID0gdDEgKiB0MSAqIHQx OwoKZnVuY3Rpb24gbGFiQ29udmVydChvKSB7CiAgaWYgKG8gaW5zdGFuY2VvZiBMYWIpIHJldHVy biBuZXcgTGFiKG8ubCwgby5hLCBvLmIsIG8ub3BhY2l0eSk7CiAgaWYgKG8gaW5zdGFuY2VvZiBI Y2wpIHJldHVybiBoY2wybGFiKG8pOwogIGlmICghKG8gaW5zdGFuY2VvZiBSZ2IpKSBvID0gcmdi Q29udmVydChvKTsKICB2YXIgciA9IHJnYjJscmdiKG8uciksCiAgICAgIGcgPSByZ2IybHJnYihv LmcpLAogICAgICBiID0gcmdiMmxyZ2Ioby5iKSwKICAgICAgeSA9IHh5ejJsYWIoKDAuMjIyNTA0 NSAqIHIgKyAwLjcxNjg3ODYgKiBnICsgMC4wNjA2MTY5ICogYikgLyBZbiksIHgsIHo7CiAgaWYg KHIgPT09IGcgJiYgZyA9PT0gYikgeCA9IHogPSB5OyBlbHNlIHsKICAgIHggPSB4eXoybGFiKCgw LjQzNjA3NDcgKiByICsgMC4zODUwNjQ5ICogZyArIDAuMTQzMDgwNCAqIGIpIC8gWG4pOwogICAg eiA9IHh5ejJsYWIoKDAuMDEzOTMyMiAqIHIgKyAwLjA5NzEwNDUgKiBnICsgMC43MTQxNzMzICog YikgLyBabik7CiAgfQogIHJldHVybiBuZXcgTGFiKDExNiAqIHkgLSAxNiwgNTAwICogKHggLSB5 KSwgMjAwICogKHkgLSB6KSwgby5vcGFjaXR5KTsKfQoKZnVuY3Rpb24gZ3JheShsLCBvcGFjaXR5 KSB7CiAgcmV0dXJuIG5ldyBMYWIobCwgMCwgMCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNp dHkpOwp9CgpmdW5jdGlvbiBsYWIobCwgYSwgYiwgb3BhY2l0eSkgewogIHJldHVybiBhcmd1bWVu dHMubGVuZ3RoID09PSAxID8gbGFiQ29udmVydChsKSA6IG5ldyBMYWIobCwgYSwgYiwgb3BhY2l0 eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOwp9CgpmdW5jdGlvbiBMYWIobCwgYSwgYiwgb3BhY2l0 eSkgewogIHRoaXMubCA9ICtsOwogIHRoaXMuYSA9ICthOwogIHRoaXMuYiA9ICtiOwogIHRoaXMu b3BhY2l0eSA9ICtvcGFjaXR5Owp9CgpkZWZpbmUoTGFiLCBsYWIsIGV4dGVuZChDb2xvciwgewog IGJyaWdodGVyOiBmdW5jdGlvbihrKSB7CiAgICByZXR1cm4gbmV3IExhYih0aGlzLmwgKyBLICog KGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5hLCB0aGlzLmIsIHRoaXMub3BhY2l0eSk7CiAgfSwK ICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsKICAgIHJldHVybiBuZXcgTGFiKHRoaXMubCAtIEsgKiAo ayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTsKICB9LAog IHJnYjogZnVuY3Rpb24oKSB7CiAgICB2YXIgeSA9ICh0aGlzLmwgKyAxNikgLyAxMTYsCiAgICAg ICAgeCA9IGlzTmFOKHRoaXMuYSkgPyB5IDogeSArIHRoaXMuYSAvIDUwMCwKICAgICAgICB6ID0g aXNOYU4odGhpcy5iKSA/IHkgOiB5IC0gdGhpcy5iIC8gMjAwOwogICAgeCA9IFhuICogbGFiMnh5 eih4KTsKICAgIHkgPSBZbiAqIGxhYjJ4eXooeSk7CiAgICB6ID0gWm4gKiBsYWIyeHl6KHopOwog ICAgcmV0dXJuIG5ldyBSZ2IoCiAgICAgIGxyZ2IycmdiKCAzLjEzMzg1NjEgKiB4IC0gMS42MTY4 NjY3ICogeSAtIDAuNDkwNjE0NiAqIHopLAogICAgICBscmdiMnJnYigtMC45Nzg3Njg0ICogeCAr IDEuOTE2MTQxNSAqIHkgKyAwLjAzMzQ1NDAgKiB6KSwKICAgICAgbHJnYjJyZ2IoIDAuMDcxOTQ1 MyAqIHggLSAwLjIyODk5MTQgKiB5ICsgMS40MDUyNDI3ICogeiksCiAgICAgIHRoaXMub3BhY2l0 eQogICAgKTsKICB9Cn0pKTsKCmZ1bmN0aW9uIHh5ejJsYWIodCkgewogIHJldHVybiB0ID4gdDMg PyBNYXRoLnBvdyh0LCAxIC8gMykgOiB0IC8gdDIgKyB0MDsKfQoKZnVuY3Rpb24gbGFiMnh5eih0 KSB7CiAgcmV0dXJuIHQgPiB0MSA/IHQgKiB0ICogdCA6IHQyICogKHQgLSB0MCk7Cn0KCmZ1bmN0 aW9uIGxyZ2IycmdiKHgpIHsKICByZXR1cm4gMjU1ICogKHggPD0gMC4wMDMxMzA4ID8gMTIuOTIg KiB4IDogMS4wNTUgKiBNYXRoLnBvdyh4LCAxIC8gMi40KSAtIDAuMDU1KTsKfQoKZnVuY3Rpb24g cmdiMmxyZ2IoeCkgewogIHJldHVybiAoeCAvPSAyNTUpIDw9IDAuMDQwNDUgPyB4IC8gMTIuOTIg OiBNYXRoLnBvdygoeCArIDAuMDU1KSAvIDEuMDU1LCAyLjQpOwp9CgpmdW5jdGlvbiBoY2xDb252 ZXJ0KG8pIHsKICBpZiAobyBpbnN0YW5jZW9mIEhjbCkgcmV0dXJuIG5ldyBIY2woby5oLCBvLmMs IG8ubCwgby5vcGFjaXR5KTsKICBpZiAoIShvIGluc3RhbmNlb2YgTGFiKSkgbyA9IGxhYkNvbnZl cnQobyk7CiAgaWYgKG8uYSA9PT0gMCAmJiBvLmIgPT09IDApIHJldHVybiBuZXcgSGNsKE5hTiwg MCA8IG8ubCAmJiBvLmwgPCAxMDAgPyAwIDogTmFOLCBvLmwsIG8ub3BhY2l0eSk7CiAgdmFyIGgg PSBNYXRoLmF0YW4yKG8uYiwgby5hKSAqIHJhZDJkZWc7CiAgcmV0dXJuIG5ldyBIY2woaCA8IDAg PyBoICsgMzYwIDogaCwgTWF0aC5zcXJ0KG8uYSAqIG8uYSArIG8uYiAqIG8uYiksIG8ubCwgby5v cGFjaXR5KTsKfQoKZnVuY3Rpb24gbGNoKGwsIGMsIGgsIG9wYWNpdHkpIHsKICByZXR1cm4gYXJn dW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhjbENvbnZlcnQobCkgOiBuZXcgSGNsKGgsIGMsIGwsIG9w YWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKfQoKZnVuY3Rpb24gaGNsKGgsIGMsIGwsIG9w YWNpdHkpIHsKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhjbENvbnZlcnQoaCkg OiBuZXcgSGNsKGgsIGMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKfQoKZnVu Y3Rpb24gSGNsKGgsIGMsIGwsIG9wYWNpdHkpIHsKICB0aGlzLmggPSAraDsKICB0aGlzLmMgPSAr YzsKICB0aGlzLmwgPSArbDsKICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKfQoKZnVuY3Rpb24g aGNsMmxhYihvKSB7CiAgaWYgKGlzTmFOKG8uaCkpIHJldHVybiBuZXcgTGFiKG8ubCwgMCwgMCwg by5vcGFjaXR5KTsKICB2YXIgaCA9IG8uaCAqIGRlZzJyYWQ7CiAgcmV0dXJuIG5ldyBMYWIoby5s LCBNYXRoLmNvcyhoKSAqIG8uYywgTWF0aC5zaW4oaCkgKiBvLmMsIG8ub3BhY2l0eSk7Cn0KCmRl ZmluZShIY2wsIGhjbCwgZXh0ZW5kKENvbG9yLCB7CiAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsK ICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgKyBLICogKGsgPT0gbnVs bCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTsKICB9LAogIGRhcmtlcjogZnVuY3Rpb24oaykgewog ICAgcmV0dXJuIG5ldyBIY2wodGhpcy5oLCB0aGlzLmMsIHRoaXMubCAtIEsgKiAoayA9PSBudWxs ID8gMSA6IGspLCB0aGlzLm9wYWNpdHkpOwogIH0sCiAgcmdiOiBmdW5jdGlvbigpIHsKICAgIHJl dHVybiBoY2wybGFiKHRoaXMpLnJnYigpOwogIH0KfSkpOwoKdmFyIEEgPSAtMC4xNDg2MSwKICAg IEIgPSArMS43ODI3NywKICAgIEMgPSAtMC4yOTIyNywKICAgIEQgPSAtMC45MDY0OSwKICAgIEUg PSArMS45NzI5NCwKICAgIEVEID0gRSAqIEQsCiAgICBFQiA9IEUgKiBCLAogICAgQkNfREEgPSBC ICogQyAtIEQgKiBBOwoKZnVuY3Rpb24gY3ViZWhlbGl4Q29udmVydChvKSB7CiAgaWYgKG8gaW5z dGFuY2VvZiBDdWJlaGVsaXgpIHJldHVybiBuZXcgQ3ViZWhlbGl4KG8uaCwgby5zLCBvLmwsIG8u b3BhY2l0eSk7CiAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYikpIG8gPSByZ2JDb252ZXJ0KG8pOwog IHZhciByID0gby5yIC8gMjU1LAogICAgICBnID0gby5nIC8gMjU1LAogICAgICBiID0gby5iIC8g MjU1LAogICAgICBsID0gKEJDX0RBICogYiArIEVEICogciAtIEVCICogZykgLyAoQkNfREEgKyBF RCAtIEVCKSwKICAgICAgYmwgPSBiIC0gbCwKICAgICAgayA9IChFICogKGcgLSBsKSAtIEMgKiBi bCkgLyBELAogICAgICBzID0gTWF0aC5zcXJ0KGsgKiBrICsgYmwgKiBibCkgLyAoRSAqIGwgKiAo MSAtIGwpKSwgLy8gTmFOIGlmIGw9MCBvciBsPTEKICAgICAgaCA9IHMgPyBNYXRoLmF0YW4yKGss IGJsKSAqIHJhZDJkZWcgLSAxMjAgOiBOYU47CiAgcmV0dXJuIG5ldyBDdWJlaGVsaXgoaCA8IDAg PyBoICsgMzYwIDogaCwgcywgbCwgby5vcGFjaXR5KTsKfQoKZnVuY3Rpb24gY3ViZWhlbGl4KGgs IHMsIGwsIG9wYWNpdHkpIHsKICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGN1YmVo ZWxpeENvbnZlcnQoaCkgOiBuZXcgQ3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/ IDEgOiBvcGFjaXR5KTsKfQoKZnVuY3Rpb24gQ3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkpIHsK ICB0aGlzLmggPSAraDsKICB0aGlzLnMgPSArczsKICB0aGlzLmwgPSArbDsKICB0aGlzLm9wYWNp dHkgPSArb3BhY2l0eTsKfQoKZGVmaW5lKEN1YmVoZWxpeCwgY3ViZWhlbGl4LCBleHRlbmQoQ29s b3IsIHsKICBicmlnaHRlcjogZnVuY3Rpb24oaykgewogICAgayA9IGsgPT0gbnVsbCA/IGJyaWdo dGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspOwogICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgodGhp cy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7CiAgfSwKICBkYXJrZXI6IGZ1 bmN0aW9uKGspIHsKICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIs IGspOwogICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGss IHRoaXMub3BhY2l0eSk7CiAgfSwKICByZ2I6IGZ1bmN0aW9uKCkgewogICAgdmFyIGggPSBpc05h Tih0aGlzLmgpID8gMCA6ICh0aGlzLmggKyAxMjApICogZGVnMnJhZCwKICAgICAgICBsID0gK3Ro aXMubCwKICAgICAgICBhID0gaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMgKiBsICogKDEgLSBs KSwKICAgICAgICBjb3NoID0gTWF0aC5jb3MoaCksCiAgICAgICAgc2luaCA9IE1hdGguc2luKGgp OwogICAgcmV0dXJuIG5ldyBSZ2IoCiAgICAgIDI1NSAqIChsICsgYSAqIChBICogY29zaCArIEIg KiBzaW5oKSksCiAgICAgIDI1NSAqIChsICsgYSAqIChDICogY29zaCArIEQgKiBzaW5oKSksCiAg ICAgIDI1NSAqIChsICsgYSAqIChFICogY29zaCkpLAogICAgICB0aGlzLm9wYWNpdHkKICAgICk7 CiAgfQp9KSk7CgpmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHsKICB2YXIgdDIg PSB0MSAqIHQxLCB0MyA9IHQyICogdDE7CiAgcmV0dXJuICgoMSAtIDMgKiB0MSArIDMgKiB0MiAt IHQzKSAqIHYwCiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjEKICAgICAgKyAoMSAr IDMgKiB0MSArIDMgKiB0MiAtIDMgKiB0MykgKiB2MgogICAgICArIHQzICogdjMpIC8gNjsKfQoK ZnVuY3Rpb24gYmFzaXMkMSh2YWx1ZXMpIHsKICB2YXIgbiA9IHZhbHVlcy5sZW5ndGggLSAxOwog IHJldHVybiBmdW5jdGlvbih0KSB7CiAgICB2YXIgaSA9IHQgPD0gMCA/ICh0ID0gMCkgOiB0ID49 IDEgPyAodCA9IDEsIG4gLSAxKSA6IE1hdGguZmxvb3IodCAqIG4pLAogICAgICAgIHYxID0gdmFs dWVzW2ldLAogICAgICAgIHYyID0gdmFsdWVzW2kgKyAxXSwKICAgICAgICB2MCA9IGkgPiAwID8g dmFsdWVzW2kgLSAxXSA6IDIgKiB2MSAtIHYyLAogICAgICAgIHYzID0gaSA8IG4gLSAxID8gdmFs dWVzW2kgKyAyXSA6IDIgKiB2MiAtIHYxOwogICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICog biwgdjAsIHYxLCB2MiwgdjMpOwogIH07Cn0KCmZ1bmN0aW9uIGJhc2lzQ2xvc2VkKHZhbHVlcykg ewogIHZhciBuID0gdmFsdWVzLmxlbmd0aDsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgdmFy IGkgPSBNYXRoLmZsb29yKCgodCAlPSAxKSA8IDAgPyArK3QgOiB0KSAqIG4pLAogICAgICAgIHYw ID0gdmFsdWVzWyhpICsgbiAtIDEpICUgbl0sCiAgICAgICAgdjEgPSB2YWx1ZXNbaSAlIG5dLAog ICAgICAgIHYyID0gdmFsdWVzWyhpICsgMSkgJSBuXSwKICAgICAgICB2MyA9IHZhbHVlc1soaSAr IDIpICUgbl07CiAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2 Myk7CiAgfTsKfQoKZnVuY3Rpb24gY29uc3RhbnQkMyh4KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkg ewogICAgcmV0dXJuIHg7CiAgfTsKfQoKZnVuY3Rpb24gbGluZWFyKGEsIGQpIHsKICByZXR1cm4g ZnVuY3Rpb24odCkgewogICAgcmV0dXJuIGEgKyB0ICogZDsKICB9Owp9CgpmdW5jdGlvbiBleHBv bmVudGlhbChhLCBiLCB5KSB7CiAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgu cG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7CiAgICByZXR1cm4gTWF0aC5w b3coYSArIHQgKiBiLCB5KTsKICB9Owp9CgpmdW5jdGlvbiBodWUoYSwgYikgewogIHZhciBkID0g YiAtIGE7CiAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAz NjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudCQzKGlzTmFOKGEpID8gYiA6 IGEpOwp9CgpmdW5jdGlvbiBnYW1tYSh5KSB7CiAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9n YW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEs IGIsIHkpIDogY29uc3RhbnQkMyhpc05hTihhKSA/IGIgOiBhKTsKICB9Owp9CgpmdW5jdGlvbiBu b2dhbW1hKGEsIGIpIHsKICB2YXIgZCA9IGIgLSBhOwogIHJldHVybiBkID8gbGluZWFyKGEsIGQp IDogY29uc3RhbnQkMyhpc05hTihhKSA/IGIgOiBhKTsKfQoKdmFyIGludGVycG9sYXRlUmdiID0g KGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHsKICB2YXIgY29sb3IgPSBnYW1tYSh5KTsKCiAgZnVuY3Rp b24gcmdiJDEoc3RhcnQsIGVuZCkgewogICAgdmFyIHIgPSBjb2xvcigoc3RhcnQgPSByZ2Ioc3Rh cnQpKS5yLCAoZW5kID0gcmdiKGVuZCkpLnIpLAogICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBl bmQuZyksCiAgICAgICAgYiA9IGNvbG9yKHN0YXJ0LmIsIGVuZC5iKSwKICAgICAgICBvcGFjaXR5 ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7CiAgICByZXR1cm4gZnVuY3Rp b24odCkgewogICAgICBzdGFydC5yID0gcih0KTsKICAgICAgc3RhcnQuZyA9IGcodCk7CiAgICAg IHN0YXJ0LmIgPSBiKHQpOwogICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsKICAgICAg cmV0dXJuIHN0YXJ0ICsgIiI7CiAgICB9OwogIH0KCiAgcmdiJDEuZ2FtbWEgPSByZ2JHYW1tYTsK CiAgcmV0dXJuIHJnYiQxOwp9KSgxKTsKCmZ1bmN0aW9uIHJnYlNwbGluZShzcGxpbmUpIHsKICBy ZXR1cm4gZnVuY3Rpb24oY29sb3JzKSB7CiAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsCiAgICAg ICAgciA9IG5ldyBBcnJheShuKSwKICAgICAgICBnID0gbmV3IEFycmF5KG4pLAogICAgICAgIGIg PSBuZXcgQXJyYXkobiksCiAgICAgICAgaSwgY29sb3I7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsg KytpKSB7CiAgICAgIGNvbG9yID0gcmdiKGNvbG9yc1tpXSk7CiAgICAgIHJbaV0gPSBjb2xvci5y IHx8IDA7CiAgICAgIGdbaV0gPSBjb2xvci5nIHx8IDA7CiAgICAgIGJbaV0gPSBjb2xvci5iIHx8 IDA7CiAgICB9CiAgICByID0gc3BsaW5lKHIpOwogICAgZyA9IHNwbGluZShnKTsKICAgIGIgPSBz cGxpbmUoYik7CiAgICBjb2xvci5vcGFjaXR5ID0gMTsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7 CiAgICAgIGNvbG9yLnIgPSByKHQpOwogICAgICBjb2xvci5nID0gZyh0KTsKICAgICAgY29sb3Iu YiA9IGIodCk7CiAgICAgIHJldHVybiBjb2xvciArICIiOwogICAgfTsKICB9Owp9Cgp2YXIgcmdi QmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMkMSk7CnZhciByZ2JCYXNpc0Nsb3NlZCA9IHJnYlNwbGlu ZShiYXNpc0Nsb3NlZCk7CgpmdW5jdGlvbiBudW1iZXJBcnJheShhLCBiKSB7CiAgaWYgKCFiKSBi ID0gW107CiAgdmFyIG4gPSBhID8gTWF0aC5taW4oYi5sZW5ndGgsIGEubGVuZ3RoKSA6IDAsCiAg ICAgIGMgPSBiLnNsaWNlKCksCiAgICAgIGk7CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIGZv ciAoaSA9IDA7IGkgPCBuOyArK2kpIGNbaV0gPSBhW2ldICogKDEgLSB0KSArIGJbaV0gKiB0Owog ICAgcmV0dXJuIGM7CiAgfTsKfQoKZnVuY3Rpb24gaXNOdW1iZXJBcnJheSh4KSB7CiAgcmV0dXJu IEFycmF5QnVmZmVyLmlzVmlldyh4KSAmJiAhKHggaW5zdGFuY2VvZiBEYXRhVmlldyk7Cn0KCmZ1 bmN0aW9uIGFycmF5JDEoYSwgYikgewogIHJldHVybiAoaXNOdW1iZXJBcnJheShiKSA/IG51bWJl ckFycmF5IDogZ2VuZXJpY0FycmF5KShhLCBiKTsKfQoKZnVuY3Rpb24gZ2VuZXJpY0FycmF5KGEs IGIpIHsKICB2YXIgbmIgPSBiID8gYi5sZW5ndGggOiAwLAogICAgICBuYSA9IGEgPyBNYXRoLm1p bihuYiwgYS5sZW5ndGgpIDogMCwKICAgICAgeCA9IG5ldyBBcnJheShuYSksCiAgICAgIGMgPSBu ZXcgQXJyYXkobmIpLAogICAgICBpOwoKICBmb3IgKGkgPSAwOyBpIDwgbmE7ICsraSkgeFtpXSA9 IGludGVycG9sYXRlVmFsdWUoYVtpXSwgYltpXSk7CiAgZm9yICg7IGkgPCBuYjsgKytpKSBjW2ld ID0gYltpXTsKCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuYTsg KytpKSBjW2ldID0geFtpXSh0KTsKICAgIHJldHVybiBjOwogIH07Cn0KCmZ1bmN0aW9uIGRhdGUo YSwgYikgewogIHZhciBkID0gbmV3IERhdGU7CiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5j dGlvbih0KSB7CiAgICByZXR1cm4gZC5zZXRUaW1lKGEgKiAoMSAtIHQpICsgYiAqIHQpLCBkOwog IH07Cn0KCmZ1bmN0aW9uIGludGVycG9sYXRlTnVtYmVyKGEsIGIpIHsKICByZXR1cm4gYSA9ICth LCBiID0gK2IsIGZ1bmN0aW9uKHQpIHsKICAgIHJldHVybiBhICogKDEgLSB0KSArIGIgKiB0Owog IH07Cn0KCmZ1bmN0aW9uIG9iamVjdChhLCBiKSB7CiAgdmFyIGkgPSB7fSwKICAgICAgYyA9IHt9 LAogICAgICBrOwoKICBpZiAoYSA9PT0gbnVsbCB8fCB0eXBlb2YgYSAhPT0gIm9iamVjdCIpIGEg PSB7fTsKICBpZiAoYiA9PT0gbnVsbCB8fCB0eXBlb2YgYiAhPT0gIm9iamVjdCIpIGIgPSB7fTsK CiAgZm9yIChrIGluIGIpIHsKICAgIGlmIChrIGluIGEpIHsKICAgICAgaVtrXSA9IGludGVycG9s YXRlVmFsdWUoYVtrXSwgYltrXSk7CiAgICB9IGVsc2UgewogICAgICBjW2tdID0gYltrXTsKICAg IH0KICB9CgogIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICBmb3IgKGsgaW4gaSkgY1trXSA9IGlb a10odCk7CiAgICByZXR1cm4gYzsKICB9Owp9Cgp2YXIgcmVBID0gL1stK10/KD86XGQrXC4/XGQq fFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLAogICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291 cmNlLCAiZyIpOwoKZnVuY3Rpb24gemVybyhiKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAg cmV0dXJuIGI7CiAgfTsKfQoKZnVuY3Rpb24gb25lKGIpIHsKICByZXR1cm4gZnVuY3Rpb24odCkg ewogICAgcmV0dXJuIGIodCkgKyAiIjsKICB9Owp9CgpmdW5jdGlvbiBpbnRlcnBvbGF0ZVN0cmlu ZyhhLCBiKSB7CiAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLCAv LyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiCiAgICAgIGFtLCAvLyBjdXJyZW50IG1h dGNoIGluIGEKICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYgogICAgICBicywgLy8gc3Ry aW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnkKICAgICAgaSA9IC0xLCAv LyBpbmRleCBpbiBzCiAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vo b2xkZXJzCiAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKCiAgLy8gQ29lcmNl IGlucHV0cyB0byBzdHJpbmdzLgogIGEgPSBhICsgIiIsIGIgPSBiICsgIiI7CgogIC8vIEludGVy cG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuCiAgd2hpbGUgKChhbSA9IHJlQS5leGVj KGEpKQogICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHsKICAgIGlmICgoYnMgPSBibS5pbmRl eCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYgogICAg ICBicyA9IGIuc2xpY2UoYmksIGJzKTsKICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNv YWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgIGVsc2Ugc1srK2ldID0gYnM7CiAgICB9 CiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBh ICYgYiBtYXRjaAogICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBw cmV2aW91cyBzdHJpbmcKICAgICAgZWxzZSBzWysraV0gPSBibTsKICAgIH0gZWxzZSB7IC8vIGlu dGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzCiAgICAgIHNbKytpXSA9IG51bGw7CiAgICAg IHEucHVzaCh7aTogaSwgeDogaW50ZXJwb2xhdGVOdW1iZXIoYW0sIGJtKX0pOwogICAgfQogICAg YmkgPSByZUIubGFzdEluZGV4OwogIH0KCiAgLy8gQWRkIHJlbWFpbnMgb2YgYi4KICBpZiAoYmkg PCBiLmxlbmd0aCkgewogICAgYnMgPSBiLnNsaWNlKGJpKTsKICAgIGlmIChzW2ldKSBzW2ldICs9 IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgZWxzZSBzWysraV0gPSBi czsKICB9CgogIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNo LgogIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVq b2luIHRoZSBzdHJpbmcuCiAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IChxWzBdCiAgICAgID8gb25l KHFbMF0ueCkKICAgICAgOiB6ZXJvKGIpKQogICAgICA6IChiID0gcS5sZW5ndGgsIGZ1bmN0aW9u KHQpIHsKICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtp XSkuaV0gPSBvLngodCk7CiAgICAgICAgICByZXR1cm4gcy5qb2luKCIiKTsKICAgICAgICB9KTsK fQoKZnVuY3Rpb24gaW50ZXJwb2xhdGVWYWx1ZShhLCBiKSB7CiAgdmFyIHQgPSB0eXBlb2YgYiwg YzsKICByZXR1cm4gYiA9PSBudWxsIHx8IHQgPT09ICJib29sZWFuIiA/IGNvbnN0YW50JDMoYikK ICAgICAgOiAodCA9PT0gIm51bWJlciIgPyBpbnRlcnBvbGF0ZU51bWJlcgogICAgICA6IHQgPT09 ICJzdHJpbmciID8gKChjID0gY29sb3IoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYikgOiBp bnRlcnBvbGF0ZVN0cmluZykKICAgICAgOiBiIGluc3RhbmNlb2YgY29sb3IgPyBpbnRlcnBvbGF0 ZVJnYgogICAgICA6IGIgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZQogICAgICA6IGlzTnVtYmVyQXJy YXkoYikgPyBudW1iZXJBcnJheQogICAgICA6IEFycmF5LmlzQXJyYXkoYikgPyBnZW5lcmljQXJy YXkKICAgICAgOiB0eXBlb2YgYi52YWx1ZU9mICE9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBiLnRv U3RyaW5nICE9PSAiZnVuY3Rpb24iIHx8IGlzTmFOKGIpID8gb2JqZWN0CiAgICAgIDogaW50ZXJw b2xhdGVOdW1iZXIpKGEsIGIpOwp9CgpmdW5jdGlvbiBkaXNjcmV0ZShyYW5nZSkgewogIHZhciBu ID0gcmFuZ2UubGVuZ3RoOwogIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICByZXR1cm4gcmFuZ2Vb TWF0aC5tYXgoMCwgTWF0aC5taW4obiAtIDEsIE1hdGguZmxvb3IodCAqIG4pKSldOwogIH07Cn0K CmZ1bmN0aW9uIGh1ZSQxKGEsIGIpIHsKICB2YXIgaSA9IGh1ZSgrYSwgK2IpOwogIHJldHVybiBm dW5jdGlvbih0KSB7CiAgICB2YXIgeCA9IGkodCk7CiAgICByZXR1cm4geCAtIDM2MCAqIE1hdGgu Zmxvb3IoeCAvIDM2MCk7CiAgfTsKfQoKZnVuY3Rpb24gaW50ZXJwb2xhdGVSb3VuZChhLCBiKSB7 CiAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7CiAgICByZXR1cm4gTWF0aC5y b3VuZChhICogKDEgLSB0KSArIGIgKiB0KTsKICB9Owp9Cgp2YXIgZGVncmVlcyA9IDE4MCAvIE1h dGguUEk7Cgp2YXIgaWRlbnRpdHkkMiA9IHsKICB0cmFuc2xhdGVYOiAwLAogIHRyYW5zbGF0ZVk6 IDAsCiAgcm90YXRlOiAwLAogIHNrZXdYOiAwLAogIHNjYWxlWDogMSwKICBzY2FsZVk6IDEKfTsK CmZ1bmN0aW9uIGRlY29tcG9zZShhLCBiLCBjLCBkLCBlLCBmKSB7CiAgdmFyIHNjYWxlWCwgc2Nh bGVZLCBza2V3WDsKICBpZiAoc2NhbGVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpKSBhIC89 IHNjYWxlWCwgYiAvPSBzY2FsZVg7CiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBh ICogc2tld1gsIGQgLT0gYiAqIHNrZXdYOwogIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMg KyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZOwogIGlm IChhICogZCA8IGIgKiBjKSBhID0gLWEsIGIgPSAtYiwgc2tld1ggPSAtc2tld1gsIHNjYWxlWCA9 IC1zY2FsZVg7CiAgcmV0dXJuIHsKICAgIHRyYW5zbGF0ZVg6IGUsCiAgICB0cmFuc2xhdGVZOiBm LAogICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcywKICAgIHNrZXdYOiBNYXRo LmF0YW4oc2tld1gpICogZGVncmVlcywKICAgIHNjYWxlWDogc2NhbGVYLAogICAgc2NhbGVZOiBz Y2FsZVkKICB9Owp9Cgp2YXIgY3NzTm9kZSwKICAgIGNzc1Jvb3QsCiAgICBjc3NWaWV3LAogICAg c3ZnTm9kZTsKCmZ1bmN0aW9uIHBhcnNlQ3NzKHZhbHVlKSB7CiAgaWYgKHZhbHVlID09PSAibm9u ZSIpIHJldHVybiBpZGVudGl0eSQyOwogIGlmICghY3NzTm9kZSkgY3NzTm9kZSA9IGRvY3VtZW50 LmNyZWF0ZUVsZW1lbnQoIkRJViIpLCBjc3NSb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50 LCBjc3NWaWV3ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXc7CiAgY3NzTm9kZS5zdHlsZS50cmFuc2Zv cm0gPSB2YWx1ZTsKICB2YWx1ZSA9IGNzc1ZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShjc3NSb290LmFw cGVuZENoaWxkKGNzc05vZGUpLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKTsK ICBjc3NSb290LnJlbW92ZUNoaWxkKGNzc05vZGUpOwogIHZhbHVlID0gdmFsdWUuc2xpY2UoNywg LTEpLnNwbGl0KCIsIik7CiAgcmV0dXJuIGRlY29tcG9zZSgrdmFsdWVbMF0sICt2YWx1ZVsxXSwg K3ZhbHVlWzJdLCArdmFsdWVbM10sICt2YWx1ZVs0XSwgK3ZhbHVlWzVdKTsKfQoKZnVuY3Rpb24g cGFyc2VTdmcodmFsdWUpIHsKICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5JDI7 CiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRw Oi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsICJnIik7CiAgc3ZnTm9kZS5zZXRBdHRyaWJ1dGUoInRy YW5zZm9ybSIsIHZhbHVlKTsKICBpZiAoISh2YWx1ZSA9IHN2Z05vZGUudHJhbnNmb3JtLmJhc2VW YWwuY29uc29saWRhdGUoKSkpIHJldHVybiBpZGVudGl0eSQyOwogIHZhbHVlID0gdmFsdWUubWF0 cml4OwogIHJldHVybiBkZWNvbXBvc2UodmFsdWUuYSwgdmFsdWUuYiwgdmFsdWUuYywgdmFsdWUu ZCwgdmFsdWUuZSwgdmFsdWUuZik7Cn0KCmZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBh cnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikgewoKICBmdW5jdGlvbiBwb3Aocykgewog ICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArICIgIiA6ICIiOwogIH0KCiAgZnVuY3Rpb24g dHJhbnNsYXRlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7CiAgICBpZiAoeGEgIT09IHhiIHx8IHlh ICE9PSB5YikgewogICAgICB2YXIgaSA9IHMucHVzaCgidHJhbnNsYXRlKCIsIG51bGwsIHB4Q29t bWEsIG51bGwsIHB4UGFyZW4pOwogICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBpbnRlcnBvbGF0 ZU51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBpbnRlcnBvbGF0ZU51bWJlcih5YSwgeWIp fSk7CiAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7CiAgICAgIHMucHVzaCgidHJhbnNsYXRlKCIg KyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcm90 YXRlKGEsIGIsIHMsIHEpIHsKICAgIGlmIChhICE9PSBiKSB7CiAgICAgIGlmIChhIC0gYiA+IDE4 MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3Qg cGF0aAogICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyAicm90YXRlKCIsIG51bGwsIGRl Z1BhcmVuKSAtIDIsIHg6IGludGVycG9sYXRlTnVtYmVyKGEsIGIpfSk7CiAgICB9IGVsc2UgaWYg KGIpIHsKICAgICAgcy5wdXNoKHBvcChzKSArICJyb3RhdGUoIiArIGIgKyBkZWdQYXJlbik7CiAg ICB9CiAgfQoKICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7CiAgICBpZiAoYSAhPT0gYikg ewogICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyAic2tld1goIiwgbnVsbCwgZGVnUGFy ZW4pIC0gMiwgeDogaW50ZXJwb2xhdGVOdW1iZXIoYSwgYil9KTsKICAgIH0gZWxzZSBpZiAoYikg ewogICAgICBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIgKyBiICsgZGVnUGFyZW4pOwogICAgfQog IH0KCiAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsKICAgIGlmICh4YSAh PT0geGIgfHwgeWEgIT09IHliKSB7CiAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArICJzY2Fs ZSgiLCBudWxsLCAiLCIsIG51bGwsICIpIik7CiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IGlu dGVycG9sYXRlTnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IGludGVycG9sYXRlTnVtYmVy KHlhLCB5Yil9KTsKICAgIH0gZWxzZSBpZiAoeGIgIT09IDEgfHwgeWIgIT09IDEpIHsKICAgICAg cy5wdXNoKHBvcChzKSArICJzY2FsZSgiICsgeGIgKyAiLCIgKyB5YiArICIpIik7CiAgICB9CiAg fQoKICByZXR1cm4gZnVuY3Rpb24oYSwgYikgewogICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNv bnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzCiAgICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJw b2xhdG9ycwogICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7CiAgICB0cmFuc2xhdGUoYS50 cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBx KTsKICAgIHJvdGF0ZShhLnJvdGF0ZSwgYi5yb3RhdGUsIHMsIHEpOwogICAgc2tld1goYS5za2V3 WCwgYi5za2V3WCwgcywgcSk7CiAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVY LCBiLnNjYWxlWSwgcywgcSk7CiAgICBhID0gYiA9IG51bGw7IC8vIGdjCiAgICByZXR1cm4gZnVu Y3Rpb24odCkgewogICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87CiAgICAgIHdoaWxl ICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7CiAgICAgIHJldHVybiBzLmpvaW4o IiIpOwogICAgfTsKICB9Owp9Cgp2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRlcnBv bGF0ZVRyYW5zZm9ybShwYXJzZUNzcywgInB4LCAiLCAicHgpIiwgImRlZykiKTsKdmFyIGludGVy cG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsICIsICIs ICIpIiwgIikiKTsKCnZhciByaG8gPSBNYXRoLlNRUlQyLAogICAgcmhvMiA9IDIsCiAgICByaG80 ID0gNCwKICAgIGVwc2lsb24yID0gMWUtMTI7CgpmdW5jdGlvbiBjb3NoKHgpIHsKICByZXR1cm4g KCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjsKfQoKZnVuY3Rpb24gc2luaCh4KSB7CiAg cmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7Cn0KCmZ1bmN0aW9uIHRhbmgo eCkgewogIHJldHVybiAoKHggPSBNYXRoLmV4cCgyICogeCkpIC0gMSkgLyAoeCArIDEpOwp9Cgov LyBwMCA9IFt1eDAsIHV5MCwgdzBdCi8vIHAxID0gW3V4MSwgdXkxLCB3MV0KZnVuY3Rpb24gaW50 ZXJwb2xhdGVab29tKHAwLCBwMSkgewogIHZhciB1eDAgPSBwMFswXSwgdXkwID0gcDBbMV0sIHcw ID0gcDBbMl0sCiAgICAgIHV4MSA9IHAxWzBdLCB1eTEgPSBwMVsxXSwgdzEgPSBwMVsyXSwKICAg ICAgZHggPSB1eDEgLSB1eDAsCiAgICAgIGR5ID0gdXkxIC0gdXkwLAogICAgICBkMiA9IGR4ICog ZHggKyBkeSAqIGR5LAogICAgICBpLAogICAgICBTOwoKICAvLyBTcGVjaWFsIGNhc2UgZm9yIHUw IOKJhSB1MS4KICBpZiAoZDIgPCBlcHNpbG9uMikgewogICAgUyA9IE1hdGgubG9nKHcxIC8gdzAp IC8gcmhvOwogICAgaSA9IGZ1bmN0aW9uKHQpIHsKICAgICAgcmV0dXJuIFsKICAgICAgICB1eDAg KyB0ICogZHgsCiAgICAgICAgdXkwICsgdCAqIGR5LAogICAgICAgIHcwICogTWF0aC5leHAocmhv ICogdCAqIFMpCiAgICAgIF07CiAgICB9OwogIH0KCiAgLy8gR2VuZXJhbCBjYXNlLgogIGVsc2Ug ewogICAgdmFyIGQxID0gTWF0aC5zcXJ0KGQyKSwKICAgICAgICBiMCA9ICh3MSAqIHcxIC0gdzAg KiB3MCArIHJobzQgKiBkMikgLyAoMiAqIHcwICogcmhvMiAqIGQxKSwKICAgICAgICBiMSA9ICh3 MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSwKICAg ICAgICByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCksCiAgICAgICAg cjEgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjEgKiBiMSArIDEpIC0gYjEpOwogICAgUyA9IChyMSAt IHIwKSAvIHJobzsKICAgIGkgPSBmdW5jdGlvbih0KSB7CiAgICAgIHZhciBzID0gdCAqIFMsCiAg ICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSwKICAgICAgICAgIHUgPSB3MCAvIChyaG8yICogZDEp ICogKGNvc2hyMCAqIHRhbmgocmhvICogcyArIHIwKSAtIHNpbmgocjApKTsKICAgICAgcmV0dXJu IFsKICAgICAgICB1eDAgKyB1ICogZHgsCiAgICAgICAgdXkwICsgdSAqIGR5LAogICAgICAgIHcw ICogY29zaHIwIC8gY29zaChyaG8gKiBzICsgcjApCiAgICAgIF07CiAgICB9OwogIH0KCiAgaS5k dXJhdGlvbiA9IFMgKiAxMDAwOwoKICByZXR1cm4gaTsKfQoKZnVuY3Rpb24gaHNsJDEoaHVlKSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgIHZhciBoID0gaHVlKChzdGFydCA9 IGhzbChzdGFydCkpLmgsIChlbmQgPSBoc2woZW5kKSkuaCksCiAgICAgICAgcyA9IG5vZ2FtbWEo c3RhcnQucywgZW5kLnMpLAogICAgICAgIGwgPSBub2dhbW1hKHN0YXJ0LmwsIGVuZC5sKSwKICAg ICAgICBvcGFjaXR5ID0gbm9nYW1tYShzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7CiAgICBy ZXR1cm4gZnVuY3Rpb24odCkgewogICAgICBzdGFydC5oID0gaCh0KTsKICAgICAgc3RhcnQucyA9 IHModCk7CiAgICAgIHN0YXJ0LmwgPSBsKHQpOwogICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0 eSh0KTsKICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICB9OwogIH0KfQoKdmFyIGhzbCQyID0g aHNsJDEoaHVlKTsKdmFyIGhzbExvbmcgPSBoc2wkMShub2dhbW1hKTsKCmZ1bmN0aW9uIGxhYiQx KHN0YXJ0LCBlbmQpIHsKICB2YXIgbCA9IG5vZ2FtbWEoKHN0YXJ0ID0gbGFiKHN0YXJ0KSkubCwg KGVuZCA9IGxhYihlbmQpKS5sKSwKICAgICAgYSA9IG5vZ2FtbWEoc3RhcnQuYSwgZW5kLmEpLAog ICAgICBiID0gbm9nYW1tYShzdGFydC5iLCBlbmQuYiksCiAgICAgIG9wYWNpdHkgPSBub2dhbW1h KHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAg c3RhcnQubCA9IGwodCk7CiAgICBzdGFydC5hID0gYSh0KTsKICAgIHN0YXJ0LmIgPSBiKHQpOwog ICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICByZXR1cm4gc3RhcnQgKyAiIjsKICB9 Owp9CgpmdW5jdGlvbiBoY2wkMShodWUpIHsKICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCkg ewogICAgdmFyIGggPSBodWUoKHN0YXJ0ID0gaGNsKHN0YXJ0KSkuaCwgKGVuZCA9IGhjbChlbmQp KS5oKSwKICAgICAgICBjID0gbm9nYW1tYShzdGFydC5jLCBlbmQuYyksCiAgICAgICAgbCA9IG5v Z2FtbWEoc3RhcnQubCwgZW5kLmwpLAogICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9w YWNpdHksIGVuZC5vcGFjaXR5KTsKICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgIHN0YXJ0 LmggPSBoKHQpOwogICAgICBzdGFydC5jID0gYyh0KTsKICAgICAgc3RhcnQubCA9IGwodCk7CiAg ICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOwogICAgICByZXR1cm4gc3RhcnQgKyAiIjsK ICAgIH07CiAgfQp9Cgp2YXIgaGNsJDIgPSBoY2wkMShodWUpOwp2YXIgaGNsTG9uZyA9IGhjbCQx KG5vZ2FtbWEpOwoKZnVuY3Rpb24gY3ViZWhlbGl4JDEoaHVlKSB7CiAgcmV0dXJuIChmdW5jdGlv biBjdWJlaGVsaXhHYW1tYSh5KSB7CiAgICB5ID0gK3k7CgogICAgZnVuY3Rpb24gY3ViZWhlbGl4 JDEoc3RhcnQsIGVuZCkgewogICAgICB2YXIgaCA9IGh1ZSgoc3RhcnQgPSBjdWJlaGVsaXgoc3Rh cnQpKS5oLCAoZW5kID0gY3ViZWhlbGl4KGVuZCkpLmgpLAogICAgICAgICAgcyA9IG5vZ2FtbWEo c3RhcnQucywgZW5kLnMpLAogICAgICAgICAgbCA9IG5vZ2FtbWEoc3RhcnQubCwgZW5kLmwpLAog ICAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOwog ICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIHN0YXJ0LmggPSBoKHQpOwogICAgICAg IHN0YXJ0LnMgPSBzKHQpOwogICAgICAgIHN0YXJ0LmwgPSBsKE1hdGgucG93KHQsIHkpKTsKICAg ICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsKICAgICAgICByZXR1cm4gc3RhcnQgKyAi IjsKICAgICAgfTsKICAgIH0KCiAgICBjdWJlaGVsaXgkMS5nYW1tYSA9IGN1YmVoZWxpeEdhbW1h OwoKICAgIHJldHVybiBjdWJlaGVsaXgkMTsKICB9KSgxKTsKfQoKdmFyIGN1YmVoZWxpeCQyID0g Y3ViZWhlbGl4JDEoaHVlKTsKdmFyIGN1YmVoZWxpeExvbmcgPSBjdWJlaGVsaXgkMShub2dhbW1h KTsKCmZ1bmN0aW9uIHBpZWNld2lzZShpbnRlcnBvbGF0ZSwgdmFsdWVzKSB7CiAgdmFyIGkgPSAw LCBuID0gdmFsdWVzLmxlbmd0aCAtIDEsIHYgPSB2YWx1ZXNbMF0sIEkgPSBuZXcgQXJyYXkobiA8 IDAgPyAwIDogbik7CiAgd2hpbGUgKGkgPCBuKSBJW2ldID0gaW50ZXJwb2xhdGUodiwgdiA9IHZh bHVlc1srK2ldKTsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgdmFyIGkgPSBNYXRoLm1heCgw LCBNYXRoLm1pbihuIC0gMSwgTWF0aC5mbG9vcih0ICo9IG4pKSk7CiAgICByZXR1cm4gSVtpXSh0 IC0gaSk7CiAgfTsKfQoKZnVuY3Rpb24gcXVhbnRpemUoaW50ZXJwb2xhdG9yLCBuKSB7CiAgdmFy IHNhbXBsZXMgPSBuZXcgQXJyYXkobik7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHNh bXBsZXNbaV0gPSBpbnRlcnBvbGF0b3IoaSAvIChuIC0gMSkpOwogIHJldHVybiBzYW1wbGVzOwp9 Cgp2YXIgZnJhbWUgPSAwLCAvLyBpcyBhbiBhbmltYXRpb24gZnJhbWUgcGVuZGluZz8KICAgIHRp bWVvdXQgPSAwLCAvLyBpcyBhIHRpbWVvdXQgcGVuZGluZz8KICAgIGludGVydmFsID0gMCwgLy8g YXJlIGFueSB0aW1lcnMgYWN0aXZlPwogICAgcG9rZURlbGF5ID0gMTAwMCwgLy8gaG93IGZyZXF1 ZW50bHkgd2UgY2hlY2sgZm9yIGNsb2NrIHNrZXcKICAgIHRhc2tIZWFkLAogICAgdGFza1RhaWws CiAgICBjbG9ja0xhc3QgPSAwLAogICAgY2xvY2tOb3cgPSAwLAogICAgY2xvY2tTa2V3ID0gMCwK ICAgIGNsb2NrID0gdHlwZW9mIHBlcmZvcm1hbmNlID09PSAib2JqZWN0IiAmJiBwZXJmb3JtYW5j ZS5ub3cgPyBwZXJmb3JtYW5jZSA6IERhdGUsCiAgICBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cg PT09ICJvYmplY3QiICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPyB3aW5kb3cucmVx dWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KSA6IGZ1bmN0aW9uKGYpIHsgc2V0VGltZW91 dChmLCAxNyk7IH07CgpmdW5jdGlvbiBub3coKSB7CiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRG cmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpOwp9Cgpm dW5jdGlvbiBjbGVhck5vdygpIHsKICBjbG9ja05vdyA9IDA7Cn0KCmZ1bmN0aW9uIFRpbWVyKCkg ewogIHRoaXMuX2NhbGwgPQogIHRoaXMuX3RpbWUgPQogIHRoaXMuX25leHQgPSBudWxsOwp9CgpU aW1lci5wcm90b3R5cGUgPSB0aW1lci5wcm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IFRpbWVy LAogIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgaWYgKHR5 cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJh Y2sgaXMgbm90IGEgZnVuY3Rpb24iKTsKICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkg OiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpOwogICAgaWYgKCF0aGlzLl9u ZXh0ICYmIHRhc2tUYWlsICE9PSB0aGlzKSB7CiAgICAgIGlmICh0YXNrVGFpbCkgdGFza1RhaWwu X25leHQgPSB0aGlzOwogICAgICBlbHNlIHRhc2tIZWFkID0gdGhpczsKICAgICAgdGFza1RhaWwg PSB0aGlzOwogICAgfQogICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrOwogICAgdGhpcy5fdGltZSA9 IHRpbWU7CiAgICBzbGVlcCgpOwogIH0sCiAgc3RvcDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhp cy5fY2FsbCkgewogICAgICB0aGlzLl9jYWxsID0gbnVsbDsKICAgICAgdGhpcy5fdGltZSA9IElu ZmluaXR5OwogICAgICBzbGVlcCgpOwogICAgfQogIH0KfTsKCmZ1bmN0aW9uIHRpbWVyKGNhbGxi YWNrLCBkZWxheSwgdGltZSkgewogIHZhciB0ID0gbmV3IFRpbWVyOwogIHQucmVzdGFydChjYWxs YmFjaywgZGVsYXksIHRpbWUpOwogIHJldHVybiB0Owp9CgpmdW5jdGlvbiB0aW1lckZsdXNoKCkg ewogIG5vdygpOyAvLyBHZXQgdGhlIGN1cnJlbnQgdGltZSwgaWYgbm90IGFscmVhZHkgc2V0Lgog ICsrZnJhbWU7IC8vIFByZXRlbmQgd2XigJl2ZSBzZXQgYW4gYWxhcm0sIGlmIHdlIGhhdmVu4oCZ dCBhbHJlYWR5LgogIHZhciB0ID0gdGFza0hlYWQsIGU7CiAgd2hpbGUgKHQpIHsKICAgIGlmICgo ZSA9IGNsb2NrTm93IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKG51bGwsIGUpOwogICAg dCA9IHQuX25leHQ7CiAgfQogIC0tZnJhbWU7Cn0KCmZ1bmN0aW9uIHdha2UoKSB7CiAgY2xvY2tO b3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3OwogIGZyYW1lID0gdGlt ZW91dCA9IDA7CiAgdHJ5IHsKICAgIHRpbWVyRmx1c2goKTsKICB9IGZpbmFsbHkgewogICAgZnJh bWUgPSAwOwogICAgbmFwKCk7CiAgICBjbG9ja05vdyA9IDA7CiAgfQp9CgpmdW5jdGlvbiBwb2tl KCkgewogIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7CiAg aWYgKGRlbGF5ID4gcG9rZURlbGF5KSBjbG9ja1NrZXcgLT0gZGVsYXksIGNsb2NrTGFzdCA9IG5v dzsKfQoKZnVuY3Rpb24gbmFwKCkgewogIHZhciB0MCwgdDEgPSB0YXNrSGVhZCwgdDIsIHRpbWUg PSBJbmZpbml0eTsKICB3aGlsZSAodDEpIHsKICAgIGlmICh0MS5fY2FsbCkgewogICAgICBpZiAo dGltZSA+IHQxLl90aW1lKSB0aW1lID0gdDEuX3RpbWU7CiAgICAgIHQwID0gdDEsIHQxID0gdDEu X25leHQ7CiAgICB9IGVsc2UgewogICAgICB0MiA9IHQxLl9uZXh0LCB0MS5fbmV4dCA9IG51bGw7 CiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjsKICAgIH0KICB9 CiAgdGFza1RhaWwgPSB0MDsKICBzbGVlcCh0aW1lKTsKfQoKZnVuY3Rpb24gc2xlZXAodGltZSkg ewogIGlmIChmcmFtZSkgcmV0dXJuOyAvLyBTb29uZXN0IGFsYXJtIGFscmVhZHkgc2V0LCBvciB3 aWxsIGJlLgogIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpOwog IHZhciBkZWxheSA9IHRpbWUgLSBjbG9ja05vdzsgLy8gU3RyaWN0bHkgbGVzcyB0aGFuIGlmIHdl IHJlY29tcHV0ZWQgY2xvY2tOb3cuCiAgaWYgKGRlbGF5ID4gMjQpIHsKICAgIGlmICh0aW1lIDwg SW5maW5pdHkpIHRpbWVvdXQgPSBzZXRUaW1lb3V0KHdha2UsIHRpbWUgLSBjbG9jay5ub3coKSAt IGNsb2NrU2tldyk7CiAgICBpZiAoaW50ZXJ2YWwpIGludGVydmFsID0gY2xlYXJJbnRlcnZhbChp bnRlcnZhbCk7CiAgfSBlbHNlIHsKICAgIGlmICghaW50ZXJ2YWwpIGNsb2NrTGFzdCA9IGNsb2Nr Lm5vdygpLCBpbnRlcnZhbCA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7CiAgICBmcmFt ZSA9IDEsIHNldEZyYW1lKHdha2UpOwogIH0KfQoKZnVuY3Rpb24gdGltZW91dCQxKGNhbGxiYWNr LCBkZWxheSwgdGltZSkgewogIHZhciB0ID0gbmV3IFRpbWVyOwogIGRlbGF5ID0gZGVsYXkgPT0g bnVsbCA/IDAgOiArZGVsYXk7CiAgdC5yZXN0YXJ0KGZ1bmN0aW9uKGVsYXBzZWQpIHsKICAgIHQu c3RvcCgpOwogICAgY2FsbGJhY2soZWxhcHNlZCArIGRlbGF5KTsKICB9LCBkZWxheSwgdGltZSk7 CiAgcmV0dXJuIHQ7Cn0KCmZ1bmN0aW9uIGludGVydmFsJDEoY2FsbGJhY2ssIGRlbGF5LCB0aW1l KSB7CiAgdmFyIHQgPSBuZXcgVGltZXIsIHRvdGFsID0gZGVsYXk7CiAgaWYgKGRlbGF5ID09IG51 bGwpIHJldHVybiB0LnJlc3RhcnQoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSwgdDsKICBkZWxheSA9 ICtkZWxheSwgdGltZSA9IHRpbWUgPT0gbnVsbCA/IG5vdygpIDogK3RpbWU7CiAgdC5yZXN0YXJ0 KGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkgewogICAgZWxhcHNlZCArPSB0b3RhbDsKICAgIHQucmVz dGFydCh0aWNrLCB0b3RhbCArPSBkZWxheSwgdGltZSk7CiAgICBjYWxsYmFjayhlbGFwc2VkKTsK ICB9LCBkZWxheSwgdGltZSk7CiAgcmV0dXJuIHQ7Cn0KCnZhciBlbXB0eU9uID0gZGlzcGF0Y2go InN0YXJ0IiwgImVuZCIsICJjYW5jZWwiLCAiaW50ZXJydXB0Iik7CnZhciBlbXB0eVR3ZWVuID0g W107Cgp2YXIgQ1JFQVRFRCA9IDA7CnZhciBTQ0hFRFVMRUQgPSAxOwp2YXIgU1RBUlRJTkcgPSAy Owp2YXIgU1RBUlRFRCA9IDM7CnZhciBSVU5OSU5HID0gNDsKdmFyIEVORElORyA9IDU7CnZhciBF TkRFRCA9IDY7CgpmdW5jdGlvbiBzY2hlZHVsZShub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3Vw LCB0aW1pbmcpIHsKICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247CiAgaWYgKCFz Y2hlZHVsZXMpIG5vZGUuX190cmFuc2l0aW9uID0ge307CiAgZWxzZSBpZiAoaWQgaW4gc2NoZWR1 bGVzKSByZXR1cm47CiAgY3JlYXRlJDEobm9kZSwgaWQsIHsKICAgIG5hbWU6IG5hbWUsCiAgICBp bmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4KICAgIGdyb3VwOiBn cm91cCwgLy8gRm9yIGNvbnRleHQgZHVyaW5nIGNhbGxiYWNrLgogICAgb246IGVtcHR5T24sCiAg ICB0d2VlbjogZW1wdHlUd2VlbiwKICAgIHRpbWU6IHRpbWluZy50aW1lLAogICAgZGVsYXk6IHRp bWluZy5kZWxheSwKICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sCiAgICBlYXNlOiB0aW1p bmcuZWFzZSwKICAgIHRpbWVyOiBudWxsLAogICAgc3RhdGU6IENSRUFURUQKICB9KTsKfQoKZnVu Y3Rpb24gaW5pdChub2RlLCBpZCkgewogIHZhciBzY2hlZHVsZSA9IGdldCQxKG5vZGUsIGlkKTsK ICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBDUkVBVEVEKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRl OyBhbHJlYWR5IHNjaGVkdWxlZCIpOwogIHJldHVybiBzY2hlZHVsZTsKfQoKZnVuY3Rpb24gc2V0 JDEobm9kZSwgaWQpIHsKICB2YXIgc2NoZWR1bGUgPSBnZXQkMShub2RlLCBpZCk7CiAgaWYgKHNj aGVkdWxlLnN0YXRlID4gU1RBUlRFRCkgdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFk eSBydW5uaW5nIik7CiAgcmV0dXJuIHNjaGVkdWxlOwp9CgpmdW5jdGlvbiBnZXQkMShub2RlLCBp ZCkgewogIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uOwogIGlmICghc2NoZWR1bGUg fHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcigidHJhbnNpdGlv biBub3QgZm91bmQiKTsKICByZXR1cm4gc2NoZWR1bGU7Cn0KCmZ1bmN0aW9uIGNyZWF0ZSQxKG5v ZGUsIGlkLCBzZWxmKSB7CiAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLAogICAg ICB0d2VlbjsKCiAgLy8gSW5pdGlhbGl6ZSB0aGUgc2VsZiB0aW1lciB3aGVuIHRoZSB0cmFuc2l0 aW9uIGlzIGNyZWF0ZWQuCiAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1 bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shCiAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7CiAgc2VsZi50 aW1lciA9IHRpbWVyKHNjaGVkdWxlLCAwLCBzZWxmLnRpbWUpOwoKICBmdW5jdGlvbiBzY2hlZHVs ZShlbGFwc2VkKSB7CiAgICBzZWxmLnN0YXRlID0gU0NIRURVTEVEOwogICAgc2VsZi50aW1lci5y ZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpOwoKICAgIC8vIElmIHRoZSBlbGFw c2VkIGRlbGF5IGlzIGxlc3MgdGhhbiBvdXIgZmlyc3Qgc2xlZXAsIHN0YXJ0IGltbWVkaWF0ZWx5 LgogICAgaWYgKHNlbGYuZGVsYXkgPD0gZWxhcHNlZCkgc3RhcnQoZWxhcHNlZCAtIHNlbGYuZGVs YXkpOwogIH0KCiAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkgewogICAgdmFyIGksIGosIG4sIG87 CgogICAgLy8gSWYgdGhlIHN0YXRlIGlzIG5vdCBTQ0hFRFVMRUQsIHRoZW4gd2UgcHJldmlvdXNs eSBlcnJvcmVkIG9uIHN0YXJ0LgogICAgaWYgKHNlbGYuc3RhdGUgIT09IFNDSEVEVUxFRCkgcmV0 dXJuIHN0b3AoKTsKCiAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7CiAgICAgIG8gPSBzY2hlZHVs ZXNbaV07CiAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7CgogICAgICAv LyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1 cmluZyB0aGlzIGZyYW1lLAogICAgICAvLyBkZWZlciBzdGFydGluZyBhbiBpbnRlcnJ1cHRpbmcg dHJhbnNpdGlvbiB1bnRpbCB0aGF0IHRyYW5zaXRpb24gaGFzIGEKICAgICAgLy8gY2hhbmNlIHRv IHRpY2sgKGFuZCBwb3NzaWJseSBlbmQpOyBzZWUgZDMvZDMtdHJhbnNpdGlvbiM1NCEKICAgICAg aWYgKG8uc3RhdGUgPT09IFNUQVJURUQpIHJldHVybiB0aW1lb3V0JDEoc3RhcnQpOwoKICAgICAg Ly8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LgogICAgICBpZiAoby5z dGF0ZSA9PT0gUlVOTklORykgewogICAgICAgIG8uc3RhdGUgPSBFTkRFRDsKICAgICAgICBvLnRp bWVyLnN0b3AoKTsKICAgICAgICBvLm9uLmNhbGwoImludGVycnVwdCIsIG5vZGUsIG5vZGUuX19k YXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApOwogICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAg ICAgIH0KCiAgICAgIC8vIENhbmNlbCBhbnkgcHJlLWVtcHRlZCB0cmFuc2l0aW9ucy4KICAgICAg ZWxzZSBpZiAoK2kgPCBpZCkgewogICAgICAgIG8uc3RhdGUgPSBFTkRFRDsKICAgICAgICBvLnRp bWVyLnN0b3AoKTsKICAgICAgICBvLm9uLmNhbGwoImNhbmNlbCIsIG5vZGUsIG5vZGUuX19kYXRh X18sIG8uaW5kZXgsIG8uZ3JvdXApOwogICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAgICAg IH0KICAgIH0KCiAgICAvLyBEZWZlciB0aGUgZmlyc3QgdGljayB0byBlbmQgb2YgdGhlIGN1cnJl bnQgZnJhbWU7IHNlZSBkMy9kMyMxNTc2LgogICAgLy8gTm90ZSB0aGUgdHJhbnNpdGlvbiBtYXkg YmUgY2FuY2VsZWQgYWZ0ZXIgc3RhcnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGljayEKICAgIC8v IE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUg ZDMvZDMtdHJhbnNpdGlvbiMxNiEKICAgIC8vIEFzc3VtaW5nIHRoaXMgaXMgc3VjY2Vzc2Z1bCwg c3Vic2VxdWVudCBjYWxsYmFja3MgZ28gc3RyYWlnaHQgdG8gdGljay4KICAgIHRpbWVvdXQkMShm dW5jdGlvbigpIHsKICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFNUQVJURUQpIHsKICAgICAgICBz ZWxmLnN0YXRlID0gUlVOTklORzsKICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2Vs Zi5kZWxheSwgc2VsZi50aW1lKTsKICAgICAgICB0aWNrKGVsYXBzZWQpOwogICAgICB9CiAgICB9 KTsKCiAgICAvLyBEaXNwYXRjaCB0aGUgc3RhcnQgZXZlbnQuCiAgICAvLyBOb3RlIHRoaXMgbXVz dCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLgogICAgc2VsZi5zdGF0 ZSA9IFNUQVJUSU5HOwogICAgc2VsZi5vbi5jYWxsKCJzdGFydCIsIG5vZGUsIG5vZGUuX19kYXRh X18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApOwogICAgaWYgKHNlbGYuc3RhdGUgIT09IFNUQVJU SU5HKSByZXR1cm47IC8vIGludGVycnVwdGVkCiAgICBzZWxmLnN0YXRlID0gU1RBUlRFRDsKCiAg ICAvLyBJbml0aWFsaXplIHRoZSB0d2VlbiwgZGVsZXRpbmcgbnVsbCB0d2Vlbi4KICAgIHR3ZWVu ID0gbmV3IEFycmF5KG4gPSBzZWxmLnR3ZWVuLmxlbmd0aCk7CiAgICBmb3IgKGkgPSAwLCBqID0g LTE7IGkgPCBuOyArK2kpIHsKICAgICAgaWYgKG8gPSBzZWxmLnR3ZWVuW2ldLnZhbHVlLmNhbGwo bm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCkpIHsKICAgICAgICB0 d2VlblsrK2pdID0gbzsKICAgICAgfQogICAgfQogICAgdHdlZW4ubGVuZ3RoID0gaiArIDE7CiAg fQoKICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHsKICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYu ZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikg OiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSwKICAg ICAgICBpID0gLTEsCiAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDsKCiAgICB3aGlsZSAoKytpIDwg bikgewogICAgICB0d2VlbltpXS5jYWxsKG5vZGUsIHQpOwogICAgfQoKICAgIC8vIERpc3BhdGNo IHRoZSBlbmQgZXZlbnQuCiAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HKSB7CiAgICAgIHNl bGYub24uY2FsbCgiZW5kIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5n cm91cCk7CiAgICAgIHN0b3AoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHN0b3AoKSB7CiAgICBz ZWxmLnN0YXRlID0gRU5ERUQ7CiAgICBzZWxmLnRpbWVyLnN0b3AoKTsKICAgIGRlbGV0ZSBzY2hl ZHVsZXNbaWRdOwogICAgZm9yICh2YXIgaSBpbiBzY2hlZHVsZXMpIHJldHVybjsgLy8gZXNsaW50 LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9u OwogIH0KfQoKZnVuY3Rpb24gaW50ZXJydXB0KG5vZGUsIG5hbWUpIHsKICB2YXIgc2NoZWR1bGVz ID0gbm9kZS5fX3RyYW5zaXRpb24sCiAgICAgIHNjaGVkdWxlLAogICAgICBhY3RpdmUsCiAgICAg IGVtcHR5ID0gdHJ1ZSwKICAgICAgaTsKCiAgaWYgKCFzY2hlZHVsZXMpIHJldHVybjsKCiAgbmFt ZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgIiI7CgogIGZvciAoaSBpbiBzY2hlZHVs ZXMpIHsKICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsg ZW1wdHkgPSBmYWxzZTsgY29udGludWU7IH0KICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4g U1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7CiAgICBzY2hlZHVsZS5zdGF0ZSA9 IEVOREVEOwogICAgc2NoZWR1bGUudGltZXIuc3RvcCgpOwogICAgc2NoZWR1bGUub24uY2FsbChh Y3RpdmUgPyAiaW50ZXJydXB0IiA6ICJjYW5jZWwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hl ZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApOwogICAgZGVsZXRlIHNjaGVkdWxlc1tpXTsKICB9 CgogIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uOwp9CgpmdW5jdGlvbiBzZWxl Y3Rpb25faW50ZXJydXB0KG5hbWUpIHsKICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewog ICAgaW50ZXJydXB0KHRoaXMsIG5hbWUpOwogIH0pOwp9CgpmdW5jdGlvbiB0d2VlblJlbW92ZShp ZCwgbmFtZSkgewogIHZhciB0d2VlbjAsIHR3ZWVuMTsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAg ICB2YXIgc2NoZWR1bGUgPSBzZXQkMSh0aGlzLCBpZCksCiAgICAgICAgdHdlZW4gPSBzY2hlZHVs ZS50d2VlbjsKCiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZp b3VzIG5vZGUsCiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5k IHdl4oCZcmUgZG9uZSEKICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgIGlmICh0 d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuOwogICAgICBm b3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICBp ZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5z bGljZSgpOwogICAgICAgICAgdHdlZW4xLnNwbGljZShpLCAxKTsKICAgICAgICAgIGJyZWFrOwog ICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xOwogIH07 Cn0KCmZ1bmN0aW9uIHR3ZWVuRnVuY3Rpb24oaWQsIG5hbWUsIHZhbHVlKSB7CiAgdmFyIHR3ZWVu MCwgdHdlZW4xOwogIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBF cnJvcjsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgc2NoZWR1bGUgPSBzZXQkMSh0aGlz LCBpZCksCiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjsKCiAgICAvLyBJZiB0aGlzIG5v ZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAvLyBqdXN0IGFzc2ln biB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSEKICAgIC8vIE90aGVy d2lzZSwgY29weS1vbi13cml0ZS4KICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgIHR3 ZWVuMSA9ICh0d2VlbjAgPSB0d2Vlbikuc2xpY2UoKTsKICAgICAgZm9yICh2YXIgdCA9IHtuYW1l OiBuYW1lLCB2YWx1ZTogdmFsdWV9LCBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyAr K2kpIHsKICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHR3 ZWVuMVtpXSA9IHQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYg KGkgPT09IG4pIHR3ZWVuMS5wdXNoKHQpOwogICAgfQoKICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdl ZW4xOwogIH07Cn0KCmZ1bmN0aW9uIHRyYW5zaXRpb25fdHdlZW4obmFtZSwgdmFsdWUpIHsKICB2 YXIgaWQgPSB0aGlzLl9pZDsKCiAgbmFtZSArPSAiIjsKCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGgg PCAyKSB7CiAgICB2YXIgdHdlZW4gPSBnZXQkMSh0aGlzLm5vZGUoKSwgaWQpLnR3ZWVuOwogICAg Zm9yICh2YXIgaSA9IDAsIG4gPSB0d2Vlbi5sZW5ndGgsIHQ7IGkgPCBuOyArK2kpIHsKICAgICAg aWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICByZXR1cm4gdC52YWx1 ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICByZXR1cm4gdGhpcy5lYWNo KCh2YWx1ZSA9PSBudWxsID8gdHdlZW5SZW1vdmUgOiB0d2VlbkZ1bmN0aW9uKShpZCwgbmFtZSwg dmFsdWUpKTsKfQoKZnVuY3Rpb24gdHdlZW5WYWx1ZSh0cmFuc2l0aW9uLCBuYW1lLCB2YWx1ZSkg ewogIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkOwoKICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24o KSB7CiAgICB2YXIgc2NoZWR1bGUgPSBzZXQkMSh0aGlzLCBpZCk7CiAgICAoc2NoZWR1bGUudmFs dWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFy Z3VtZW50cyk7CiAgfSk7CgogIHJldHVybiBmdW5jdGlvbihub2RlKSB7CiAgICByZXR1cm4gZ2V0 JDEobm9kZSwgaWQpLnZhbHVlW25hbWVdOwogIH07Cn0KCmZ1bmN0aW9uIGludGVycG9sYXRlKGEs IGIpIHsKICB2YXIgYzsKICByZXR1cm4gKHR5cGVvZiBiID09PSAibnVtYmVyIiA/IGludGVycG9s YXRlTnVtYmVyCiAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gaW50ZXJwb2xhdGVSZ2IKICAg ICAgOiAoYyA9IGNvbG9yKGIpKSA/IChiID0gYywgaW50ZXJwb2xhdGVSZ2IpCiAgICAgIDogaW50 ZXJwb2xhdGVTdHJpbmcpKGEsIGIpOwp9CgpmdW5jdGlvbiBhdHRyUmVtb3ZlJDEobmFtZSkgewog IHJldHVybiBmdW5jdGlvbigpIHsKICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogIH07 Cn0KCmZ1bmN0aW9uIGF0dHJSZW1vdmVOUyQxKGZ1bGxuYW1lKSB7CiAgcmV0dXJuIGZ1bmN0aW9u KCkgewogICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUu bG9jYWwpOwogIH07Cn0KCmZ1bmN0aW9uIGF0dHJDb25zdGFudCQxKG5hbWUsIGludGVycG9sYXRl LCB2YWx1ZTEpIHsKICB2YXIgc3RyaW5nMDAsCiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIiwK ICAgICAgaW50ZXJwb2xhdGUwOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBzdHJpbmcw ID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5n MSA/IG51bGwKICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwCiAg ICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZh bHVlMSk7CiAgfTsKfQoKZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMkMShmdWxsbmFtZSwgaW50ZXJw b2xhdGUsIHZhbHVlMSkgewogIHZhciBzdHJpbmcwMCwKICAgICAgc3RyaW5nMSA9IHZhbHVlMSAr ICIiLAogICAgICBpbnRlcnBvbGF0ZTA7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHN0 cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2Nh bCk7CiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICA6IHN0cmlu ZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwCiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBp bnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgfTsKfQoKZnVuY3Rpb24g YXR0ckZ1bmN0aW9uJDEobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7CiAgdmFyIHN0cmluZzAw LAogICAgICBzdHJpbmcxMCwKICAgICAgaW50ZXJwb2xhdGUwOwogIHJldHVybiBmdW5jdGlvbigp IHsKICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTsKICAgIGlm ICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7 CiAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICBzdHJpbmcxID0gdmFs dWUxICsgIiI7CiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICA6 IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xh dGUwCiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBv bGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogIH07Cn0KCmZ1bmN0aW9uIGF0dHJG dW5jdGlvbk5TJDEoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogIHZhciBzdHJpbmcw MCwKICAgICAgc3RyaW5nMTAsCiAgICAgIGludGVycG9sYXRlMDsKICByZXR1cm4gZnVuY3Rpb24o KSB7CiAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7CiAgICBp ZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVs bG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJp YnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICBzdHJpbmcxID0gdmFs dWUxICsgIiI7CiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICA6 IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xh dGUwCiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBv bGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogIH07Cn0KCmZ1bmN0aW9uIHRyYW5z aXRpb25fYXR0cihuYW1lLCB2YWx1ZSkgewogIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1l KSwgaSA9IGZ1bGxuYW1lID09PSAidHJhbnNmb3JtIiA/IGludGVycG9sYXRlVHJhbnNmb3JtU3Zn IDogaW50ZXJwb2xhdGU7CiAgcmV0dXJuIHRoaXMuYXR0clR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1 ZSA9PT0gImZ1bmN0aW9uIgogICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5T JDEgOiBhdHRyRnVuY3Rpb24kMSkoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgImF0dHIu IiArIG5hbWUsIHZhbHVlKSkKICAgICAgOiB2YWx1ZSA9PSBudWxsID8gKGZ1bGxuYW1lLmxvY2Fs ID8gYXR0clJlbW92ZU5TJDEgOiBhdHRyUmVtb3ZlJDEpKGZ1bGxuYW1lKQogICAgICA6IChmdWxs bmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TJDEgOiBhdHRyQ29uc3RhbnQkMSkoZnVsbG5hbWUs IGksIHZhbHVlKSk7Cn0KCmZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKSB7CiAgcmV0 dXJuIGZ1bmN0aW9uKHQpIHsKICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIGkuY2FsbCh0aGlz LCB0KSk7CiAgfTsKfQoKZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHsK ICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5z cGFjZSwgZnVsbG5hbWUubG9jYWwsIGkuY2FsbCh0aGlzLCB0KSk7CiAgfTsKfQoKZnVuY3Rpb24g YXR0clR3ZWVuTlMoZnVsbG5hbWUsIHZhbHVlKSB7CiAgdmFyIHQwLCBpMDsKICBmdW5jdGlvbiB0 d2VlbigpIHsKICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlm IChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwg aSk7CiAgICByZXR1cm4gdDA7CiAgfQogIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogIHJldHVybiB0 d2VlbjsKfQoKZnVuY3Rpb24gYXR0clR3ZWVuKG5hbWUsIHZhbHVlKSB7CiAgdmFyIHQwLCBpMDsK ICBmdW5jdGlvbiB0d2VlbigpIHsKICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1l bnRzKTsKICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGUo bmFtZSwgaSk7CiAgICByZXR1cm4gdDA7CiAgfQogIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogIHJl dHVybiB0d2VlbjsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl9hdHRyVHdlZW4obmFtZSwgdmFsdWUp IHsKICB2YXIga2V5ID0gImF0dHIuIiArIG5hbWU7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAy KSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTsKICBpZiAodmFs dWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICBpZiAodHlwZW9mIHZh bHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7CiAgdmFyIGZ1bGxuYW1lID0gbmFt ZXNwYWNlKG5hbWUpOwogIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgKGZ1bGxuYW1lLmxvY2FsID8g YXR0clR3ZWVuTlMgOiBhdHRyVHdlZW4pKGZ1bGxuYW1lLCB2YWx1ZSkpOwp9CgpmdW5jdGlvbiBk ZWxheUZ1bmN0aW9uKGlkLCB2YWx1ZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIGluaXQo dGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsKfQoK ZnVuY3Rpb24gZGVsYXlDb25zdGFudChpZCwgdmFsdWUpIHsKICByZXR1cm4gdmFsdWUgPSArdmFs dWUsIGZ1bmN0aW9uKCkgewogICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSB2YWx1ZTsKICB9Owp9 CgpmdW5jdGlvbiB0cmFuc2l0aW9uX2RlbGF5KHZhbHVlKSB7CiAgdmFyIGlkID0gdGhpcy5faWQ7 CgogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFs dWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gZGVsYXlGdW5jdGlvbgogICAgICAgICAgOiBk ZWxheUNvbnN0YW50KShpZCwgdmFsdWUpKQogICAgICA6IGdldCQxKHRoaXMubm9kZSgpLCBpZCku ZGVsYXk7Cn0KCmZ1bmN0aW9uIGR1cmF0aW9uRnVuY3Rpb24oaWQsIHZhbHVlKSB7CiAgcmV0dXJu IGZ1bmN0aW9uKCkgewogICAgc2V0JDEodGhpcywgaWQpLmR1cmF0aW9uID0gK3ZhbHVlLmFwcGx5 KHRoaXMsIGFyZ3VtZW50cyk7CiAgfTsKfQoKZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwg dmFsdWUpIHsKICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkgewogICAgc2V0JDEo dGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7CiAgfTsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl9k dXJhdGlvbih2YWx1ZSkgewogIHZhciBpZCA9IHRoaXMuX2lkOwoKICByZXR1cm4gYXJndW1lbnRz Lmxlbmd0aAogICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAg ICAgICAgICA/IGR1cmF0aW9uRnVuY3Rpb24KICAgICAgICAgIDogZHVyYXRpb25Db25zdGFudCko aWQsIHZhbHVlKSkKICAgICAgOiBnZXQkMSh0aGlzLm5vZGUoKSwgaWQpLmR1cmF0aW9uOwp9Cgpm dW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7CiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0g ImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHNl dCQxKHRoaXMsIGlkKS5lYXNlID0gdmFsdWU7CiAgfTsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl9l YXNlKHZhbHVlKSB7CiAgdmFyIGlkID0gdGhpcy5faWQ7CgogIHJldHVybiBhcmd1bWVudHMubGVu Z3RoCiAgICAgID8gdGhpcy5lYWNoKGVhc2VDb25zdGFudChpZCwgdmFsdWUpKQogICAgICA6IGdl dCQxKHRoaXMubm9kZSgpLCBpZCkuZWFzZTsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl9maWx0ZXIo bWF0Y2gpIHsKICBpZiAodHlwZW9mIG1hdGNoICE9PSAiZnVuY3Rpb24iKSBtYXRjaCA9IG1hdGNo ZXIobWF0Y2gpOwoKICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMu bGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAg ICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAg PSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgaWYg KChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwg Z3JvdXApKSB7CiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsKICAgICAgfQogICAgfQogIH0K CiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5f bmFtZSwgdGhpcy5faWQpOwp9CgpmdW5jdGlvbiB0cmFuc2l0aW9uX21lcmdlKHRyYW5zaXRpb24p IHsKICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3I7Cgog IGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9n cm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRo Lm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikg ewogICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwg biA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2Rl LCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91 cDFbaV0pIHsKICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgIH0KICAgIH0KICB9CgogIGZv ciAoOyBqIDwgbTA7ICsraikgewogICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICB9CgogIHJl dHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRo aXMuX2lkKTsKfQoKZnVuY3Rpb24gc3RhcnQobmFtZSkgewogIHJldHVybiAobmFtZSArICIiKS50 cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24odCkgewogICAgdmFyIGkgPSB0Lmlu ZGV4T2YoIi4iKTsKICAgIGlmIChpID49IDApIHQgPSB0LnNsaWNlKDAsIGkpOwogICAgcmV0dXJu ICF0IHx8IHQgPT09ICJzdGFydCI7CiAgfSk7Cn0KCmZ1bmN0aW9uIG9uRnVuY3Rpb24oaWQsIG5h bWUsIGxpc3RlbmVyKSB7CiAgdmFyIG9uMCwgb24xLCBzaXQgPSBzdGFydChuYW1lKSA/IGluaXQg OiBzZXQkMTsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgc2NoZWR1bGUgPSBzaXQodGhp cywgaWQpLAogICAgICAgIG9uID0gc2NoZWR1bGUub247CgogICAgLy8gSWYgdGhpcyBub2RlIHNo YXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAvLyBqdXN0IGFzc2ln biB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSEKICAgIC8vIE90 aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgIGlmIChvbiAhPT0gb24wKSAob24xID0gKG9uMCA9 IG9uKS5jb3B5KCkpLm9uKG5hbWUsIGxpc3RlbmVyKTsKCiAgICBzY2hlZHVsZS5vbiA9IG9uMTsK ICB9Owp9CgpmdW5jdGlvbiB0cmFuc2l0aW9uX29uKG5hbWUsIGxpc3RlbmVyKSB7CiAgdmFyIGlk ID0gdGhpcy5faWQ7CgogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMgogICAgICA/IGdldCQx KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSkKICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlv bihpZCwgbmFtZSwgbGlzdGVuZXIpKTsKfQoKZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24oaWQpIHsK ICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwog ICAgZm9yICh2YXIgaSBpbiB0aGlzLl9fdHJhbnNpdGlvbikgaWYgKCtpICE9PSBpZCkgcmV0dXJu OwogICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpOwogIH07Cn0KCmZ1bmN0 aW9uIHRyYW5zaXRpb25fcmVtb3ZlKCkgewogIHJldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwg cmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl9zZWxlY3Qo c2VsZWN0KSB7CiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLAogICAgICBpZCA9IHRoaXMuX2lkOwoK ICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gImZ1bmN0aW9uIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2Vs ZWN0KTsKCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0 aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgZm9y ICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3Vi Z3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsr aSkgewogICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2Fs bChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7CiAgICAgICAgaWYgKCJfX2RhdGFf XyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgICAgc3Vi Z3JvdXBbaV0gPSBzdWJub2RlOwogICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBp ZCwgaSwgc3ViZ3JvdXAsIGdldCQxKG5vZGUsIGlkKSk7CiAgICAgIH0KICAgIH0KICB9CgogIHJl dHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsK fQoKZnVuY3Rpb24gdHJhbnNpdGlvbl9zZWxlY3RBbGwoc2VsZWN0KSB7CiAgdmFyIG5hbWUgPSB0 aGlzLl9uYW1lLAogICAgICBpZCA9IHRoaXMuX2lkOwoKICBpZiAodHlwZW9mIHNlbGVjdCAhPT0g ImZ1bmN0aW9uIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTsKCiAgZm9yICh2YXIgZ3Jv dXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBh cmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGdyb3VwID0gZ3Jv dXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAg ICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgZm9yICh2YXIgY2hpbGRyZW4gPSBzZWxl Y3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCksIGNoaWxkLCBpbmhlcml0ID0g Z2V0JDEobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykg ewogICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHsKICAgICAgICAgICAgc2NoZWR1 bGUoY2hpbGQsIG5hbWUsIGlkLCBrLCBjaGlsZHJlbiwgaW5oZXJpdCk7CiAgICAgICAgICB9CiAg ICAgICAgfQogICAgICAgIHN1Ymdyb3Vwcy5wdXNoKGNoaWxkcmVuKTsKICAgICAgICBwYXJlbnRz LnB1c2gobm9kZSk7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBuZXcgVHJhbnNpdGlvbihz dWJncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKTsKfQoKdmFyIFNlbGVjdGlvbiQxID0gc2VsZWN0 aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjsKCmZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0aW9u KCkgewogIHJldHVybiBuZXcgU2VsZWN0aW9uJDEodGhpcy5fZ3JvdXBzLCB0aGlzLl9wYXJlbnRz KTsKfQoKZnVuY3Rpb24gc3R5bGVOdWxsKG5hbWUsIGludGVycG9sYXRlKSB7CiAgdmFyIHN0cmlu ZzAwLAogICAgICBzdHJpbmcxMCwKICAgICAgaW50ZXJwb2xhdGUwOwogIHJldHVybiBmdW5jdGlv bigpIHsKICAgIHZhciBzdHJpbmcwID0gc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKSwKICAgICAgICBz dHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlVmFsdWUodGhp cywgbmFtZSkpOwogICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsCiAgICAgICAg OiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9s YXRlMAogICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJp bmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpOwogIH07Cn0KCmZ1bmN0aW9uIHN0eWxlUmVtb3ZlJDEo bmFtZSkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVy dHkobmFtZSk7CiAgfTsKfQoKZnVuY3Rpb24gc3R5bGVDb25zdGFudCQxKG5hbWUsIGludGVycG9s YXRlLCB2YWx1ZTEpIHsKICB2YXIgc3RyaW5nMDAsCiAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAi IiwKICAgICAgaW50ZXJwb2xhdGUwOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBzdHJp bmcwID0gc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKTsKICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJp bmcxID8gbnVsbAogICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAK ICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwg dmFsdWUxKTsKICB9Owp9CgpmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uJDEobmFtZSwgaW50ZXJwb2xh dGUsIHZhbHVlKSB7CiAgdmFyIHN0cmluZzAwLAogICAgICBzdHJpbmcxMCwKICAgICAgaW50ZXJw b2xhdGUwOwogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBzdHJpbmcwID0gc3R5bGVWYWx1 ZSh0aGlzLCBuYW1lKSwKICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwKICAgICAgICBzdHJp bmcxID0gdmFsdWUxICsgIiI7CiAgICBpZiAodmFsdWUxID09IG51bGwpIHN0cmluZzEgPSB2YWx1 ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGVWYWx1ZSh0aGlzLCBu YW1lKSk7CiAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICA6IHN0 cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUw CiAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0 ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogIH07Cn0KCmZ1bmN0aW9uIHN0eWxlTWF5 YmVSZW1vdmUoaWQsIG5hbWUpIHsKICB2YXIgb24wLCBvbjEsIGxpc3RlbmVyMCwga2V5ID0gInN0 eWxlLiIgKyBuYW1lLCBldmVudCA9ICJlbmQuIiArIGtleSwgcmVtb3ZlOwogIHJldHVybiBmdW5j dGlvbigpIHsKICAgIHZhciBzY2hlZHVsZSA9IHNldCQxKHRoaXMsIGlkKSwKICAgICAgICBvbiA9 IHNjaGVkdWxlLm9uLAogICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBu dWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZSQxKG5hbWUpKSA6IHVuZGVmaW5l ZDsKCiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlv dXMgbm9kZSwKICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBh bmQgd2XigJlyZSBkb25lIQogICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgaWYg KG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbiku Y29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpOwoKICAgIHNjaGVkdWxlLm9u ID0gb24xOwogIH07Cn0KCmZ1bmN0aW9uIHRyYW5zaXRpb25fc3R5bGUobmFtZSwgdmFsdWUsIHBy aW9yaXR5KSB7CiAgdmFyIGkgPSAobmFtZSArPSAiIikgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJw b2xhdGVUcmFuc2Zvcm1Dc3MgOiBpbnRlcnBvbGF0ZTsKICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ IHRoaXMKICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVOdWxsKG5hbWUsIGkpKQogICAgICAu b24oImVuZC5zdHlsZS4iICsgbmFtZSwgc3R5bGVSZW1vdmUkMShuYW1lKSkKICAgIDogdHlwZW9m IHZhbHVlID09PSAiZnVuY3Rpb24iID8gdGhpcwogICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHls ZUZ1bmN0aW9uJDEobmFtZSwgaSwgdHdlZW5WYWx1ZSh0aGlzLCAic3R5bGUuIiArIG5hbWUsIHZh bHVlKSkpCiAgICAgIC5lYWNoKHN0eWxlTWF5YmVSZW1vdmUodGhpcy5faWQsIG5hbWUpKQogICAg OiB0aGlzCiAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlQ29uc3RhbnQkMShuYW1lLCBpLCB2 YWx1ZSksIHByaW9yaXR5KQogICAgICAub24oImVuZC5zdHlsZS4iICsgbmFtZSwgbnVsbCk7Cn0K CmZ1bmN0aW9uIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpIHsKICByZXR1cm4g ZnVuY3Rpb24odCkgewogICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhp cywgdCksIHByaW9yaXR5KTsKICB9Owp9CgpmdW5jdGlvbiBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVl LCBwcmlvcml0eSkgewogIHZhciB0LCBpMDsKICBmdW5jdGlvbiB0d2VlbigpIHsKICAgIHZhciBp ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgIGlmIChpICE9PSBpMCkgdCA9IChp MCA9IGkpICYmIHN0eWxlSW50ZXJwb2xhdGUobmFtZSwgaSwgcHJpb3JpdHkpOwogICAgcmV0dXJu IHQ7CiAgfQogIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogIHJldHVybiB0d2VlbjsKfQoKZnVuY3Rp b24gdHJhbnNpdGlvbl9zdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogIHZhciBr ZXkgPSAic3R5bGUuIiArIChuYW1lICs9ICIiKTsKICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIp IHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOwogIGlmICh2YWx1 ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpOwogIGlmICh0eXBlb2YgdmFs dWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsKICByZXR1cm4gdGhpcy50d2Vlbihr ZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyAiIiA6IHByaW9y aXR5KSk7Cn0KCmZ1bmN0aW9uIHRleHRDb25zdGFudCQxKHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0 aW9uKCkgewogICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwogIH07Cn0KCmZ1bmN0aW9uIHRl eHRGdW5jdGlvbiQxKHZhbHVlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIHZhbHVl MSA9IHZhbHVlKHRoaXMpOwogICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8g IiIgOiB2YWx1ZTE7CiAgfTsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl90ZXh0KHZhbHVlKSB7CiAg cmV0dXJuIHRoaXMudHdlZW4oInRleHQiLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAg ICAgPyB0ZXh0RnVuY3Rpb24kMSh0d2VlblZhbHVlKHRoaXMsICJ0ZXh0IiwgdmFsdWUpKQogICAg ICA6IHRleHRDb25zdGFudCQxKHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICsgIiIpKTsKfQoK ZnVuY3Rpb24gdGV4dEludGVycG9sYXRlKGkpIHsKICByZXR1cm4gZnVuY3Rpb24odCkgewogICAg dGhpcy50ZXh0Q29udGVudCA9IGkuY2FsbCh0aGlzLCB0KTsKICB9Owp9CgpmdW5jdGlvbiB0ZXh0 VHdlZW4odmFsdWUpIHsKICB2YXIgdDAsIGkwOwogIGZ1bmN0aW9uIHR3ZWVuKCkgewogICAgdmFy IGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgaWYgKGkgIT09IGkwKSB0MCA9 IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZShpKTsKICAgIHJldHVybiB0MDsKICB9CiAgdHdl ZW4uX3ZhbHVlID0gdmFsdWU7CiAgcmV0dXJuIHR3ZWVuOwp9CgpmdW5jdGlvbiB0cmFuc2l0aW9u X3RleHRUd2Vlbih2YWx1ZSkgewogIHZhciBrZXkgPSAidGV4dCI7CiAgaWYgKGFyZ3VtZW50cy5s ZW5ndGggPCAxKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTsK ICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICBpZiAo dHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7CiAgcmV0dXJuIHRo aXMudHdlZW4oa2V5LCB0ZXh0VHdlZW4odmFsdWUpKTsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl90 cmFuc2l0aW9uKCkgewogIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgaWQwID0gdGhpcy5f aWQsCiAgICAgIGlkMSA9IG5ld0lkKCk7CgogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3Vw cywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHZhciBn cm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyAr K2kpIHsKICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgIHZhciBpbmhlcml0ID0g Z2V0JDEobm9kZSwgaWQwKTsKICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZDEsIGksIGdy b3VwLCB7CiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5o ZXJpdC5kdXJhdGlvbiwKICAgICAgICAgIGRlbGF5OiAwLAogICAgICAgICAgZHVyYXRpb246IGlu aGVyaXQuZHVyYXRpb24sCiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2UKICAgICAgICB9KTsK ICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5f cGFyZW50cywgbmFtZSwgaWQxKTsKfQoKZnVuY3Rpb24gdHJhbnNpdGlvbl9lbmQoKSB7CiAgdmFy IG9uMCwgb24xLCB0aGF0ID0gdGhpcywgaWQgPSB0aGF0Ll9pZCwgc2l6ZSA9IHRoYXQuc2l6ZSgp OwogIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgIHZh ciBjYW5jZWwgPSB7dmFsdWU6IHJlamVjdH0sCiAgICAgICAgZW5kID0ge3ZhbHVlOiBmdW5jdGlv bigpIHsgaWYgKC0tc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpOyB9fTsKCiAgICB0aGF0LmVhY2goZnVu Y3Rpb24oKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IHNldCQxKHRoaXMsIGlkKSwKICAgICAgICAg IG9uID0gc2NoZWR1bGUub247CgogICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0 Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0 ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgIC8vIE90aGVyd2lzZSwg Y29weS1vbi13cml0ZS4KICAgICAgaWYgKG9uICE9PSBvbjApIHsKICAgICAgICBvbjEgPSAob24w ID0gb24pLmNvcHkoKTsKICAgICAgICBvbjEuXy5jYW5jZWwucHVzaChjYW5jZWwpOwogICAgICAg IG9uMS5fLmludGVycnVwdC5wdXNoKGNhbmNlbCk7CiAgICAgICAgb24xLl8uZW5kLnB1c2goZW5k KTsKICAgICAgfQoKICAgICAgc2NoZWR1bGUub24gPSBvbjE7CiAgICB9KTsKICB9KTsKfQoKdmFy IGlkID0gMDsKCmZ1bmN0aW9uIFRyYW5zaXRpb24oZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCkg ewogIHRoaXMuX2dyb3VwcyA9IGdyb3VwczsKICB0aGlzLl9wYXJlbnRzID0gcGFyZW50czsKICB0 aGlzLl9uYW1lID0gbmFtZTsKICB0aGlzLl9pZCA9IGlkOwp9CgpmdW5jdGlvbiB0cmFuc2l0aW9u KG5hbWUpIHsKICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTsKfQoKZnVuY3Rp b24gbmV3SWQoKSB7CiAgcmV0dXJuICsraWQ7Cn0KCnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0g c2VsZWN0aW9uLnByb3RvdHlwZTsKClRyYW5zaXRpb24ucHJvdG90eXBlID0gdHJhbnNpdGlvbi5w cm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sCiAgc2VsZWN0OiB0cmFuc2l0 aW9uX3NlbGVjdCwKICBzZWxlY3RBbGw6IHRyYW5zaXRpb25fc2VsZWN0QWxsLAogIGZpbHRlcjog dHJhbnNpdGlvbl9maWx0ZXIsCiAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UsCiAgc2VsZWN0aW9u OiB0cmFuc2l0aW9uX3NlbGVjdGlvbiwKICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uX3RyYW5zaXRp b24sCiAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZS5jYWxsLAogIG5vZGVzOiBzZWxlY3Rpb25f cHJvdG90eXBlLm5vZGVzLAogIG5vZGU6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZSwKICBzaXpl OiBzZWxlY3Rpb25fcHJvdG90eXBlLnNpemUsCiAgZW1wdHk6IHNlbGVjdGlvbl9wcm90b3R5cGUu ZW1wdHksCiAgZWFjaDogc2VsZWN0aW9uX3Byb3RvdHlwZS5lYWNoLAogIG9uOiB0cmFuc2l0aW9u X29uLAogIGF0dHI6IHRyYW5zaXRpb25fYXR0ciwKICBhdHRyVHdlZW46IHRyYW5zaXRpb25fYXR0 clR3ZWVuLAogIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlLAogIHN0eWxlVHdlZW46IHRyYW5zaXRp b25fc3R5bGVUd2VlbiwKICB0ZXh0OiB0cmFuc2l0aW9uX3RleHQsCiAgdGV4dFR3ZWVuOiB0cmFu c2l0aW9uX3RleHRUd2VlbiwKICByZW1vdmU6IHRyYW5zaXRpb25fcmVtb3ZlLAogIHR3ZWVuOiB0 cmFuc2l0aW9uX3R3ZWVuLAogIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5LAogIGR1cmF0aW9uOiB0 cmFuc2l0aW9uX2R1cmF0aW9uLAogIGVhc2U6IHRyYW5zaXRpb25fZWFzZSwKICBlbmQ6IHRyYW5z aXRpb25fZW5kCn07CgpmdW5jdGlvbiBsaW5lYXIkMSh0KSB7CiAgcmV0dXJuICt0Owp9CgpmdW5j dGlvbiBxdWFkSW4odCkgewogIHJldHVybiB0ICogdDsKfQoKZnVuY3Rpb24gcXVhZE91dCh0KSB7 CiAgcmV0dXJuIHQgKiAoMiAtIHQpOwp9CgpmdW5jdGlvbiBxdWFkSW5PdXQodCkgewogIHJldHVy biAoKHQgKj0gMikgPD0gMSA/IHQgKiB0IDogLS10ICogKDIgLSB0KSArIDEpIC8gMjsKfQoKZnVu Y3Rpb24gY3ViaWNJbih0KSB7CiAgcmV0dXJuIHQgKiB0ICogdDsKfQoKZnVuY3Rpb24gY3ViaWNP dXQodCkgewogIHJldHVybiAtLXQgKiB0ICogdCArIDE7Cn0KCmZ1bmN0aW9uIGN1YmljSW5PdXQo dCkgewogIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAq IHQgKyAyKSAvIDI7Cn0KCnZhciBleHBvbmVudCA9IDM7Cgp2YXIgcG9seUluID0gKGZ1bmN0aW9u IGN1c3RvbShlKSB7CiAgZSA9ICtlOwoKICBmdW5jdGlvbiBwb2x5SW4odCkgewogICAgcmV0dXJu IE1hdGgucG93KHQsIGUpOwogIH0KCiAgcG9seUluLmV4cG9uZW50ID0gY3VzdG9tOwoKICByZXR1 cm4gcG9seUluOwp9KShleHBvbmVudCk7Cgp2YXIgcG9seU91dCA9IChmdW5jdGlvbiBjdXN0b20o ZSkgewogIGUgPSArZTsKCiAgZnVuY3Rpb24gcG9seU91dCh0KSB7CiAgICByZXR1cm4gMSAtIE1h dGgucG93KDEgLSB0LCBlKTsKICB9CgogIHBvbHlPdXQuZXhwb25lbnQgPSBjdXN0b207CgogIHJl dHVybiBwb2x5T3V0Owp9KShleHBvbmVudCk7Cgp2YXIgcG9seUluT3V0ID0gKGZ1bmN0aW9uIGN1 c3RvbShlKSB7CiAgZSA9ICtlOwoKICBmdW5jdGlvbiBwb2x5SW5PdXQodCkgewogICAgcmV0dXJu ICgodCAqPSAyKSA8PSAxID8gTWF0aC5wb3codCwgZSkgOiAyIC0gTWF0aC5wb3coMiAtIHQsIGUp KSAvIDI7CiAgfQoKICBwb2x5SW5PdXQuZXhwb25lbnQgPSBjdXN0b207CgogIHJldHVybiBwb2x5 SW5PdXQ7Cn0pKGV4cG9uZW50KTsKCnZhciBwaSA9IE1hdGguUEksCiAgICBoYWxmUGkgPSBwaSAv IDI7CgpmdW5jdGlvbiBzaW5Jbih0KSB7CiAgcmV0dXJuIDEgLSBNYXRoLmNvcyh0ICogaGFsZlBp KTsKfQoKZnVuY3Rpb24gc2luT3V0KHQpIHsKICByZXR1cm4gTWF0aC5zaW4odCAqIGhhbGZQaSk7 Cn0KCmZ1bmN0aW9uIHNpbkluT3V0KHQpIHsKICByZXR1cm4gKDEgLSBNYXRoLmNvcyhwaSAqIHQp KSAvIDI7Cn0KCmZ1bmN0aW9uIGV4cEluKHQpIHsKICByZXR1cm4gTWF0aC5wb3coMiwgMTAgKiB0 IC0gMTApOwp9CgpmdW5jdGlvbiBleHBPdXQodCkgewogIHJldHVybiAxIC0gTWF0aC5wb3coMiwg LTEwICogdCk7Cn0KCmZ1bmN0aW9uIGV4cEluT3V0KHQpIHsKICByZXR1cm4gKCh0ICo9IDIpIDw9 IDEgPyBNYXRoLnBvdygyLCAxMCAqIHQgLSAxMCkgOiAyIC0gTWF0aC5wb3coMiwgMTAgLSAxMCAq IHQpKSAvIDI7Cn0KCmZ1bmN0aW9uIGNpcmNsZUluKHQpIHsKICByZXR1cm4gMSAtIE1hdGguc3Fy dCgxIC0gdCAqIHQpOwp9CgpmdW5jdGlvbiBjaXJjbGVPdXQodCkgewogIHJldHVybiBNYXRoLnNx cnQoMSAtIC0tdCAqIHQpOwp9CgpmdW5jdGlvbiBjaXJjbGVJbk91dCh0KSB7CiAgcmV0dXJuICgo dCAqPSAyKSA8PSAxID8gMSAtIE1hdGguc3FydCgxIC0gdCAqIHQpIDogTWF0aC5zcXJ0KDEgLSAo dCAtPSAyKSAqIHQpICsgMSkgLyAyOwp9Cgp2YXIgYjEgPSA0IC8gMTEsCiAgICBiMiA9IDYgLyAx MSwKICAgIGIzID0gOCAvIDExLAogICAgYjQgPSAzIC8gNCwKICAgIGI1ID0gOSAvIDExLAogICAg YjYgPSAxMCAvIDExLAogICAgYjcgPSAxNSAvIDE2LAogICAgYjggPSAyMSAvIDIyLAogICAgYjkg PSA2MyAvIDY0LAogICAgYjAgPSAxIC8gYjEgLyBiMTsKCmZ1bmN0aW9uIGJvdW5jZUluKHQpIHsK ICByZXR1cm4gMSAtIGJvdW5jZU91dCgxIC0gdCk7Cn0KCmZ1bmN0aW9uIGJvdW5jZU91dCh0KSB7 CiAgcmV0dXJuICh0ID0gK3QpIDwgYjEgPyBiMCAqIHQgKiB0IDogdCA8IGIzID8gYjAgKiAodCAt PSBiMikgKiB0ICsgYjQgOiB0IDwgYjYgPyBiMCAqICh0IC09IGI1KSAqIHQgKyBiNyA6IGIwICog KHQgLT0gYjgpICogdCArIGI5Owp9CgpmdW5jdGlvbiBib3VuY2VJbk91dCh0KSB7CiAgcmV0dXJu ICgodCAqPSAyKSA8PSAxID8gMSAtIGJvdW5jZU91dCgxIC0gdCkgOiBib3VuY2VPdXQodCAtIDEp ICsgMSkgLyAyOwp9Cgp2YXIgb3ZlcnNob290ID0gMS43MDE1ODsKCnZhciBiYWNrSW4gPSAoZnVu Y3Rpb24gY3VzdG9tKHMpIHsKICBzID0gK3M7CgogIGZ1bmN0aW9uIGJhY2tJbih0KSB7CiAgICBy ZXR1cm4gdCAqIHQgKiAoKHMgKyAxKSAqIHQgLSBzKTsKICB9CgogIGJhY2tJbi5vdmVyc2hvb3Qg PSBjdXN0b207CgogIHJldHVybiBiYWNrSW47Cn0pKG92ZXJzaG9vdCk7Cgp2YXIgYmFja091dCA9 IChmdW5jdGlvbiBjdXN0b20ocykgewogIHMgPSArczsKCiAgZnVuY3Rpb24gYmFja091dCh0KSB7 CiAgICByZXR1cm4gLS10ICogdCAqICgocyArIDEpICogdCArIHMpICsgMTsKICB9CgogIGJhY2tP dXQub3ZlcnNob290ID0gY3VzdG9tOwoKICByZXR1cm4gYmFja091dDsKfSkob3ZlcnNob290KTsK CnZhciBiYWNrSW5PdXQgPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHsKICBzID0gK3M7CgogIGZ1bmN0 aW9uIGJhY2tJbk91dCh0KSB7CiAgICByZXR1cm4gKCh0ICo9IDIpIDwgMSA/IHQgKiB0ICogKChz ICsgMSkgKiB0IC0gcykgOiAodCAtPSAyKSAqIHQgKiAoKHMgKyAxKSAqIHQgKyBzKSArIDIpIC8g MjsKICB9CgogIGJhY2tJbk91dC5vdmVyc2hvb3QgPSBjdXN0b207CgogIHJldHVybiBiYWNrSW5P dXQ7Cn0pKG92ZXJzaG9vdCk7Cgp2YXIgdGF1ID0gMiAqIE1hdGguUEksCiAgICBhbXBsaXR1ZGUg PSAxLAogICAgcGVyaW9kID0gMC4zOwoKdmFyIGVsYXN0aWNJbiA9IChmdW5jdGlvbiBjdXN0b20o YSwgcCkgewogIHZhciBzID0gTWF0aC5hc2luKDEgLyAoYSA9IE1hdGgubWF4KDEsIGEpKSkgKiAo cCAvPSB0YXUpOwoKICBmdW5jdGlvbiBlbGFzdGljSW4odCkgewogICAgcmV0dXJuIGEgKiBNYXRo LnBvdygyLCAxMCAqIC0tdCkgKiBNYXRoLnNpbigocyAtIHQpIC8gcCk7CiAgfQoKICBlbGFzdGlj SW4uYW1wbGl0dWRlID0gZnVuY3Rpb24oYSkgeyByZXR1cm4gY3VzdG9tKGEsIHAgKiB0YXUpOyB9 OwogIGVsYXN0aWNJbi5wZXJpb2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwgcCk7 IH07CgogIHJldHVybiBlbGFzdGljSW47Cn0pKGFtcGxpdHVkZSwgcGVyaW9kKTsKCnZhciBlbGFz dGljT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShhLCBwKSB7CiAgdmFyIHMgPSBNYXRoLmFzaW4oMSAv IChhID0gTWF0aC5tYXgoMSwgYSkpKSAqIChwIC89IHRhdSk7CgogIGZ1bmN0aW9uIGVsYXN0aWNP dXQodCkgewogICAgcmV0dXJuIDEgLSBhICogTWF0aC5wb3coMiwgLTEwICogKHQgPSArdCkpICog TWF0aC5zaW4oKHQgKyBzKSAvIHApOwogIH0KCiAgZWxhc3RpY091dC5hbXBsaXR1ZGUgPSBmdW5j dGlvbihhKSB7IHJldHVybiBjdXN0b20oYSwgcCAqIHRhdSk7IH07CiAgZWxhc3RpY091dC5wZXJp b2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwgcCk7IH07CgogIHJldHVybiBlbGFz dGljT3V0Owp9KShhbXBsaXR1ZGUsIHBlcmlvZCk7Cgp2YXIgZWxhc3RpY0luT3V0ID0gKGZ1bmN0 aW9uIGN1c3RvbShhLCBwKSB7CiAgdmFyIHMgPSBNYXRoLmFzaW4oMSAvIChhID0gTWF0aC5tYXgo MSwgYSkpKSAqIChwIC89IHRhdSk7CgogIGZ1bmN0aW9uIGVsYXN0aWNJbk91dCh0KSB7CiAgICBy ZXR1cm4gKCh0ID0gdCAqIDIgLSAxKSA8IDAKICAgICAgICA/IGEgKiBNYXRoLnBvdygyLCAxMCAq IHQpICogTWF0aC5zaW4oKHMgLSB0KSAvIHApCiAgICAgICAgOiAyIC0gYSAqIE1hdGgucG93KDIs IC0xMCAqIHQpICogTWF0aC5zaW4oKHMgKyB0KSAvIHApKSAvIDI7CiAgfQoKICBlbGFzdGljSW5P dXQuYW1wbGl0dWRlID0gZnVuY3Rpb24oYSkgeyByZXR1cm4gY3VzdG9tKGEsIHAgKiB0YXUpOyB9 OwogIGVsYXN0aWNJbk91dC5wZXJpb2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwg cCk7IH07CgogIHJldHVybiBlbGFzdGljSW5PdXQ7Cn0pKGFtcGxpdHVkZSwgcGVyaW9kKTsKCnZh ciBkZWZhdWx0VGltaW5nID0gewogIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuCiAgZGVsYXk6 IDAsCiAgZHVyYXRpb246IDI1MCwKICBlYXNlOiBjdWJpY0luT3V0Cn07CgpmdW5jdGlvbiBpbmhl cml0KG5vZGUsIGlkKSB7CiAgdmFyIHRpbWluZzsKICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9f dHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkgewogICAgaWYgKCEobm9kZSA9 IG5vZGUucGFyZW50Tm9kZSkpIHsKICAgICAgcmV0dXJuIGRlZmF1bHRUaW1pbmcudGltZSA9IG5v dygpLCBkZWZhdWx0VGltaW5nOwogICAgfQogIH0KICByZXR1cm4gdGltaW5nOwp9CgpmdW5jdGlv biBzZWxlY3Rpb25fdHJhbnNpdGlvbihuYW1lKSB7CiAgdmFyIGlkLAogICAgICB0aW1pbmc7Cgog IGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikgewogICAgaWQgPSBuYW1lLl9pZCwgbmFt ZSA9IG5hbWUuX25hbWU7CiAgfSBlbHNlIHsKICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRl ZmF1bHRUaW1pbmcpLnRpbWUgPSBub3coKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBu YW1lICsgIiI7CiAgfQoKICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91 cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikgewogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91 cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAg IGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZCwg aSwgZ3JvdXAsIHRpbWluZyB8fCBpbmhlcml0KG5vZGUsIGlkKSk7CiAgICAgIH0KICAgIH0KICB9 CgogIHJldHVybiBuZXcgVHJhbnNpdGlvbihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlk KTsKfQoKc2VsZWN0aW9uLnByb3RvdHlwZS5pbnRlcnJ1cHQgPSBzZWxlY3Rpb25faW50ZXJydXB0 OwpzZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjsK CnZhciByb290JDEgPSBbbnVsbF07CgpmdW5jdGlvbiBhY3RpdmUobm9kZSwgbmFtZSkgewogIHZh ciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbiwKICAgICAgc2NoZWR1bGUsCiAgICAgIGk7 CgogIGlmIChzY2hlZHVsZXMpIHsKICAgIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFt ZSArICIiOwogICAgZm9yIChpIGluIHNjaGVkdWxlcykgewogICAgICBpZiAoKHNjaGVkdWxlID0g c2NoZWR1bGVzW2ldKS5zdGF0ZSA+IFNDSEVEVUxFRCAmJiBzY2hlZHVsZS5uYW1lID09PSBuYW1l KSB7CiAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKFtbbm9kZV1dLCByb290JDEsIG5hbWUs ICtpKTsKICAgICAgfQogICAgfQogIH0KCiAgcmV0dXJuIG51bGw7Cn0KCmZ1bmN0aW9uIGNvbnN0 YW50JDQoeCkgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4OwogIH07Cn0KCmZ1 bmN0aW9uIEJydXNoRXZlbnQodGFyZ2V0LCB0eXBlLCBzZWxlY3Rpb24pIHsKICB0aGlzLnRhcmdl dCA9IHRhcmdldDsKICB0aGlzLnR5cGUgPSB0eXBlOwogIHRoaXMuc2VsZWN0aW9uID0gc2VsZWN0 aW9uOwp9CgpmdW5jdGlvbiBub3Byb3BhZ2F0aW9uJDEoKSB7CiAgZXhwb3J0cy5ldmVudC5zdG9w SW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKfQoKZnVuY3Rpb24gbm9ldmVudCQxKCkgewogIGV4cG9y dHMuZXZlbnQucHJldmVudERlZmF1bHQoKTsKICBleHBvcnRzLmV2ZW50LnN0b3BJbW1lZGlhdGVQ cm9wYWdhdGlvbigpOwp9Cgp2YXIgTU9ERV9EUkFHID0ge25hbWU6ICJkcmFnIn0sCiAgICBNT0RF X1NQQUNFID0ge25hbWU6ICJzcGFjZSJ9LAogICAgTU9ERV9IQU5ETEUgPSB7bmFtZTogImhhbmRs ZSJ9LAogICAgTU9ERV9DRU5URVIgPSB7bmFtZTogImNlbnRlciJ9OwoKZnVuY3Rpb24gbnVtYmVy MShlKSB7CiAgcmV0dXJuIFsrZVswXSwgK2VbMV1dOwp9CgpmdW5jdGlvbiBudW1iZXIyKGUpIHsK ICByZXR1cm4gW251bWJlcjEoZVswXSksIG51bWJlcjEoZVsxXSldOwp9CgpmdW5jdGlvbiB0b3Vj aGVyKGlkZW50aWZpZXIpIHsKICByZXR1cm4gZnVuY3Rpb24odGFyZ2V0KSB7CiAgICByZXR1cm4g dG91Y2godGFyZ2V0LCBleHBvcnRzLmV2ZW50LnRvdWNoZXMsIGlkZW50aWZpZXIpOwogIH07Cn0K CnZhciBYID0gewogIG5hbWU6ICJ4IiwKICBoYW5kbGVzOiBbInciLCAiZSJdLm1hcCh0eXBlKSwK ICBpbnB1dDogZnVuY3Rpb24oeCwgZSkgeyByZXR1cm4geCA9PSBudWxsID8gbnVsbCA6IFtbK3hb MF0sIGVbMF1bMV1dLCBbK3hbMV0sIGVbMV1bMV1dXTsgfSwKICBvdXRwdXQ6IGZ1bmN0aW9uKHh5 KSB7IHJldHVybiB4eSAmJiBbeHlbMF1bMF0sIHh5WzFdWzBdXTsgfQp9OwoKdmFyIFkgPSB7CiAg bmFtZTogInkiLAogIGhhbmRsZXM6IFsibiIsICJzIl0ubWFwKHR5cGUpLAogIGlucHV0OiBmdW5j dGlvbih5LCBlKSB7IHJldHVybiB5ID09IG51bGwgPyBudWxsIDogW1tlWzBdWzBdLCAreVswXV0s IFtlWzFdWzBdLCAreVsxXV1dOyB9LAogIG91dHB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5 ICYmIFt4eVswXVsxXSwgeHlbMV1bMV1dOyB9Cn07Cgp2YXIgWFkgPSB7CiAgbmFtZTogInh5IiwK ICBoYW5kbGVzOiBbIm4iLCAidyIsICJlIiwgInMiLCAibnciLCAibmUiLCAic3ciLCAic2UiXS5t YXAodHlwZSksCiAgaW5wdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eSA9PSBudWxsID8gbnVs bCA6IG51bWJlcjIoeHkpOyB9LAogIG91dHB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5OyB9 Cn07Cgp2YXIgY3Vyc29ycyA9IHsKICBvdmVybGF5OiAiY3Jvc3NoYWlyIiwKICBzZWxlY3Rpb246 ICJtb3ZlIiwKICBuOiAibnMtcmVzaXplIiwKICBlOiAiZXctcmVzaXplIiwKICBzOiAibnMtcmVz aXplIiwKICB3OiAiZXctcmVzaXplIiwKICBudzogIm53c2UtcmVzaXplIiwKICBuZTogIm5lc3ct cmVzaXplIiwKICBzZTogIm53c2UtcmVzaXplIiwKICBzdzogIm5lc3ctcmVzaXplIgp9OwoKdmFy IGZsaXBYID0gewogIGU6ICJ3IiwKICB3OiAiZSIsCiAgbnc6ICJuZSIsCiAgbmU6ICJudyIsCiAg c2U6ICJzdyIsCiAgc3c6ICJzZSIKfTsKCnZhciBmbGlwWSA9IHsKICBuOiAicyIsCiAgczogIm4i LAogIG53OiAic3ciLAogIG5lOiAic2UiLAogIHNlOiAibmUiLAogIHN3OiAibnciCn07Cgp2YXIg c2lnbnNYID0gewogIG92ZXJsYXk6ICsxLAogIHNlbGVjdGlvbjogKzEsCiAgbjogbnVsbCwKICBl OiArMSwKICBzOiBudWxsLAogIHc6IC0xLAogIG53OiAtMSwKICBuZTogKzEsCiAgc2U6ICsxLAog IHN3OiAtMQp9OwoKdmFyIHNpZ25zWSA9IHsKICBvdmVybGF5OiArMSwKICBzZWxlY3Rpb246ICsx LAogIG46IC0xLAogIGU6IG51bGwsCiAgczogKzEsCiAgdzogbnVsbCwKICBudzogLTEsCiAgbmU6 IC0xLAogIHNlOiArMSwKICBzdzogKzEKfTsKCmZ1bmN0aW9uIHR5cGUodCkgewogIHJldHVybiB7 dHlwZTogdH07Cn0KCi8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3Bl biB0aGUgY29udGV4dCBtZW51LgpmdW5jdGlvbiBkZWZhdWx0RmlsdGVyJDEoKSB7CiAgcmV0dXJu ICFleHBvcnRzLmV2ZW50LmN0cmxLZXkgJiYgIWV4cG9ydHMuZXZlbnQuYnV0dG9uOwp9CgpmdW5j dGlvbiBkZWZhdWx0RXh0ZW50KCkgewogIHZhciBzdmcgPSB0aGlzLm93bmVyU1ZHRWxlbWVudCB8 fCB0aGlzOwogIGlmIChzdmcuaGFzQXR0cmlidXRlKCJ2aWV3Qm94IikpIHsKICAgIHN2ZyA9IHN2 Zy52aWV3Qm94LmJhc2VWYWw7CiAgICByZXR1cm4gW1tzdmcueCwgc3ZnLnldLCBbc3ZnLnggKyBz dmcud2lkdGgsIHN2Zy55ICsgc3ZnLmhlaWdodF1dOwogIH0KICByZXR1cm4gW1swLCAwXSwgW3N2 Zy53aWR0aC5iYXNlVmFsLnZhbHVlLCBzdmcuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTsKfQoKZnVu Y3Rpb24gZGVmYXVsdFRvdWNoYWJsZSQxKCkgewogIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQ b2ludHMgfHwgKCJvbnRvdWNoc3RhcnQiIGluIHRoaXMpOwp9CgovLyBMaWtlIGQzLmxvY2FsLCBi dXQgd2l0aCB0aGUgbmFtZSDigJxfX2JydXNo4oCdIHJhdGhlciB0aGFuIGF1dG8tZ2VuZXJhdGVk LgpmdW5jdGlvbiBsb2NhbCQxKG5vZGUpIHsKICB3aGlsZSAoIW5vZGUuX19icnVzaCkgaWYgKCEo bm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybjsKICByZXR1cm4gbm9kZS5fX2JydXNoOwp9 CgpmdW5jdGlvbiBlbXB0eSQxKGV4dGVudCkgewogIHJldHVybiBleHRlbnRbMF1bMF0gPT09IGV4 dGVudFsxXVswXQogICAgICB8fCBleHRlbnRbMF1bMV0gPT09IGV4dGVudFsxXVsxXTsKfQoKZnVu Y3Rpb24gYnJ1c2hTZWxlY3Rpb24obm9kZSkgewogIHZhciBzdGF0ZSA9IG5vZGUuX19icnVzaDsK ICByZXR1cm4gc3RhdGUgPyBzdGF0ZS5kaW0ub3V0cHV0KHN0YXRlLnNlbGVjdGlvbikgOiBudWxs Owp9CgpmdW5jdGlvbiBicnVzaFgoKSB7CiAgcmV0dXJuIGJydXNoJDEoWCk7Cn0KCmZ1bmN0aW9u IGJydXNoWSgpIHsKICByZXR1cm4gYnJ1c2gkMShZKTsKfQoKZnVuY3Rpb24gYnJ1c2goKSB7CiAg cmV0dXJuIGJydXNoJDEoWFkpOwp9CgpmdW5jdGlvbiBicnVzaCQxKGRpbSkgewogIHZhciBleHRl bnQgPSBkZWZhdWx0RXh0ZW50LAogICAgICBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyJDEsCiAgICAg IHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUkMSwKICAgICAga2V5cyA9IHRydWUsCiAgICAg IGxpc3RlbmVycyA9IGRpc3BhdGNoKCJzdGFydCIsICJicnVzaCIsICJlbmQiKSwKICAgICAgaGFu ZGxlU2l6ZSA9IDYsCiAgICAgIHRvdWNoZW5kaW5nOwoKICBmdW5jdGlvbiBicnVzaChncm91cCkg ewogICAgdmFyIG92ZXJsYXkgPSBncm91cAogICAgICAgIC5wcm9wZXJ0eSgiX19icnVzaCIsIGlu aXRpYWxpemUpCiAgICAgIC5zZWxlY3RBbGwoIi5vdmVybGF5IikKICAgICAgLmRhdGEoW3R5cGUo Im92ZXJsYXkiKV0pOwoKICAgIG92ZXJsYXkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKQogICAgICAg IC5hdHRyKCJjbGFzcyIsICJvdmVybGF5IikKICAgICAgICAuYXR0cigicG9pbnRlci1ldmVudHMi LCAiYWxsIikKICAgICAgICAuYXR0cigiY3Vyc29yIiwgY3Vyc29ycy5vdmVybGF5KQogICAgICAu bWVyZ2Uob3ZlcmxheSkKICAgICAgICAuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBl eHRlbnQgPSBsb2NhbCQxKHRoaXMpLmV4dGVudDsKICAgICAgICAgIHNlbGVjdCh0aGlzKQogICAg ICAgICAgICAgIC5hdHRyKCJ4IiwgZXh0ZW50WzBdWzBdKQogICAgICAgICAgICAgIC5hdHRyKCJ5 IiwgZXh0ZW50WzBdWzFdKQogICAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIGV4dGVudFsxXVsw XSAtIGV4dGVudFswXVswXSkKICAgICAgICAgICAgICAuYXR0cigiaGVpZ2h0IiwgZXh0ZW50WzFd WzFdIC0gZXh0ZW50WzBdWzFdKTsKICAgICAgICB9KTsKCiAgICBncm91cC5zZWxlY3RBbGwoIi5z ZWxlY3Rpb24iKQogICAgICAuZGF0YShbdHlwZSgic2VsZWN0aW9uIildKQogICAgICAuZW50ZXIo KS5hcHBlbmQoInJlY3QiKQogICAgICAgIC5hdHRyKCJjbGFzcyIsICJzZWxlY3Rpb24iKQogICAg ICAgIC5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzLnNlbGVjdGlvbikKICAgICAgICAuYXR0cigiZmls bCIsICIjNzc3IikKICAgICAgICAuYXR0cigiZmlsbC1vcGFjaXR5IiwgMC4zKQogICAgICAgIC5h dHRyKCJzdHJva2UiLCAiI2ZmZiIpCiAgICAgICAgLmF0dHIoInNoYXBlLXJlbmRlcmluZyIsICJj cmlzcEVkZ2VzIik7CgogICAgdmFyIGhhbmRsZSA9IGdyb3VwLnNlbGVjdEFsbCgiLmhhbmRsZSIp CiAgICAgIC5kYXRhKGRpbS5oYW5kbGVzLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGU7IH0p OwoKICAgIGhhbmRsZS5leGl0KCkucmVtb3ZlKCk7CgogICAgaGFuZGxlLmVudGVyKCkuYXBwZW5k KCJyZWN0IikKICAgICAgICAuYXR0cigiY2xhc3MiLCBmdW5jdGlvbihkKSB7IHJldHVybiAiaGFu ZGxlIGhhbmRsZS0tIiArIGQudHlwZTsgfSkKICAgICAgICAuYXR0cigiY3Vyc29yIiwgZnVuY3Rp b24oZCkgeyByZXR1cm4gY3Vyc29yc1tkLnR5cGVdOyB9KTsKCiAgICBncm91cAogICAgICAgIC5l YWNoKHJlZHJhdykKICAgICAgICAuYXR0cigiZmlsbCIsICJub25lIikKICAgICAgICAuYXR0cigi cG9pbnRlci1ldmVudHMiLCAiYWxsIikKICAgICAgICAub24oIm1vdXNlZG93bi5icnVzaCIsIHN0 YXJ0ZWQpCiAgICAgIC5maWx0ZXIodG91Y2hhYmxlKQogICAgICAgIC5vbigidG91Y2hzdGFydC5i cnVzaCIsIHN0YXJ0ZWQpCiAgICAgICAgLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLCB0b3VjaG1vdmVk KQogICAgICAgIC5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLCB0b3VjaGVu ZGVkKQogICAgICAgIC5zdHlsZSgidG91Y2gtYWN0aW9uIiwgIm5vbmUiKQogICAgICAgIC5zdHls ZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwgInJnYmEoMCwwLDAsMCkiKTsKICB9Cgog IGJydXNoLm1vdmUgPSBmdW5jdGlvbihncm91cCwgc2VsZWN0aW9uKSB7CiAgICBpZiAoZ3JvdXAu c2VsZWN0aW9uKSB7CiAgICAgIGdyb3VwCiAgICAgICAgICAub24oInN0YXJ0LmJydXNoIiwgZnVu Y3Rpb24oKSB7IGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpLnN0YXJ0KCk7 IH0pCiAgICAgICAgICAub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLCBmdW5jdGlvbigp IHsgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmVuZCgpOyB9KQogICAgICAgICAgLnR3ZWVuKCJi cnVzaCIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAg ICAgICAgICBzdGF0ZSA9IHRoYXQuX19icnVzaCwKICAgICAgICAgICAgICAgIGVtaXQgPSBlbWl0 dGVyKHRoYXQsIGFyZ3VtZW50cyksCiAgICAgICAgICAgICAgICBzZWxlY3Rpb24wID0gc3RhdGUu c2VsZWN0aW9uLAogICAgICAgICAgICAgICAgc2VsZWN0aW9uMSA9IGRpbS5pbnB1dCh0eXBlb2Yg c2VsZWN0aW9uID09PSAiZnVuY3Rpb24iID8gc2VsZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50 cykgOiBzZWxlY3Rpb24sIHN0YXRlLmV4dGVudCksCiAgICAgICAgICAgICAgICBpID0gaW50ZXJw b2xhdGVWYWx1ZShzZWxlY3Rpb24wLCBzZWxlY3Rpb24xKTsKCiAgICAgICAgICAgIGZ1bmN0aW9u IHR3ZWVuKHQpIHsKICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSB0ID09PSAxICYmIHNl bGVjdGlvbjEgPT09IG51bGwgPyBudWxsIDogaSh0KTsKICAgICAgICAgICAgICByZWRyYXcuY2Fs bCh0aGF0KTsKICAgICAgICAgICAgICBlbWl0LmJydXNoKCk7CiAgICAgICAgICAgIH0KCiAgICAg ICAgICAgIHJldHVybiBzZWxlY3Rpb24wICE9PSBudWxsICYmIHNlbGVjdGlvbjEgIT09IG51bGwg PyB0d2VlbiA6IHR3ZWVuKDEpOwogICAgICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBncm91 cAogICAgICAgICAgLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB0aGF0ID0gdGhp cywKICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsCiAgICAgICAgICAgICAgICBzdGF0 ZSA9IHRoYXQuX19icnVzaCwKICAgICAgICAgICAgICAgIHNlbGVjdGlvbjEgPSBkaW0uaW5wdXQo dHlwZW9mIHNlbGVjdGlvbiA9PT0gImZ1bmN0aW9uIiA/IHNlbGVjdGlvbi5hcHBseSh0aGF0LCBh cmdzKSA6IHNlbGVjdGlvbiwgc3RhdGUuZXh0ZW50KSwKICAgICAgICAgICAgICAgIGVtaXQgPSBl bWl0dGVyKHRoYXQsIGFyZ3MpLmJlZm9yZXN0YXJ0KCk7CgogICAgICAgICAgICBpbnRlcnJ1cHQo dGhhdCk7CiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjEgPT09IG51bGwg PyBudWxsIDogc2VsZWN0aW9uMTsKICAgICAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAg ICAgICAgIGVtaXQuc3RhcnQoKS5icnVzaCgpLmVuZCgpOwogICAgICAgICAgfSk7CiAgICB9CiAg fTsKCiAgYnJ1c2guY2xlYXIgPSBmdW5jdGlvbihncm91cCkgewogICAgYnJ1c2gubW92ZShncm91 cCwgbnVsbCk7CiAgfTsKCiAgZnVuY3Rpb24gcmVkcmF3KCkgewogICAgdmFyIGdyb3VwID0gc2Vs ZWN0KHRoaXMpLAogICAgICAgIHNlbGVjdGlvbiA9IGxvY2FsJDEodGhpcykuc2VsZWN0aW9uOwoK ICAgIGlmIChzZWxlY3Rpb24pIHsKICAgICAgZ3JvdXAuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikK ICAgICAgICAgIC5zdHlsZSgiZGlzcGxheSIsIG51bGwpCiAgICAgICAgICAuYXR0cigieCIsIHNl bGVjdGlvblswXVswXSkKICAgICAgICAgIC5hdHRyKCJ5Iiwgc2VsZWN0aW9uWzBdWzFdKQogICAg ICAgICAgLmF0dHIoIndpZHRoIiwgc2VsZWN0aW9uWzFdWzBdIC0gc2VsZWN0aW9uWzBdWzBdKQog ICAgICAgICAgLmF0dHIoImhlaWdodCIsIHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsx XSk7CgogICAgICBncm91cC5zZWxlY3RBbGwoIi5oYW5kbGUiKQogICAgICAgICAgLnN0eWxlKCJk aXNwbGF5IiwgbnVsbCkKICAgICAgICAgIC5hdHRyKCJ4IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4g ZC50eXBlW2QudHlwZS5sZW5ndGggLSAxXSA9PT0gImUiID8gc2VsZWN0aW9uWzFdWzBdIC0gaGFu ZGxlU2l6ZSAvIDIgOiBzZWxlY3Rpb25bMF1bMF0gLSBoYW5kbGVTaXplIC8gMjsgfSkKICAgICAg ICAgIC5hdHRyKCJ5IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlWzBdID09PSAicyIgPyBz ZWxlY3Rpb25bMV1bMV0gLSBoYW5kbGVTaXplIC8gMiA6IHNlbGVjdGlvblswXVsxXSAtIGhhbmRs ZVNpemUgLyAyOyB9KQogICAgICAgICAgLmF0dHIoIndpZHRoIiwgZnVuY3Rpb24oZCkgeyByZXR1 cm4gZC50eXBlID09PSAibiIgfHwgZC50eXBlID09PSAicyIgPyBzZWxlY3Rpb25bMV1bMF0gLSBz ZWxlY3Rpb25bMF1bMF0gKyBoYW5kbGVTaXplIDogaGFuZGxlU2l6ZTsgfSkKICAgICAgICAgIC5h dHRyKCJoZWlnaHQiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09ICJlIiB8fCBkLnR5 cGUgPT09ICJ3IiA/IHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsxXSArIGhhbmRsZVNp emUgOiBoYW5kbGVTaXplOyB9KTsKICAgIH0KCiAgICBlbHNlIHsKICAgICAgZ3JvdXAuc2VsZWN0 QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKQogICAgICAgICAgLnN0eWxlKCJkaXNwbGF5IiwgIm5v bmUiKQogICAgICAgICAgLmF0dHIoIngiLCBudWxsKQogICAgICAgICAgLmF0dHIoInkiLCBudWxs KQogICAgICAgICAgLmF0dHIoIndpZHRoIiwgbnVsbCkKICAgICAgICAgIC5hdHRyKCJoZWlnaHQi LCBudWxsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGVtaXR0ZXIodGhhdCwgYXJncywgY2xlYW4p IHsKICAgIHJldHVybiAoIWNsZWFuICYmIHRoYXQuX19icnVzaC5lbWl0dGVyKSB8fCBuZXcgRW1p dHRlcih0aGF0LCBhcmdzKTsKICB9CgogIGZ1bmN0aW9uIEVtaXR0ZXIodGhhdCwgYXJncykgewog ICAgdGhpcy50aGF0ID0gdGhhdDsKICAgIHRoaXMuYXJncyA9IGFyZ3M7CiAgICB0aGlzLnN0YXRl ID0gdGhhdC5fX2JydXNoOwogICAgdGhpcy5hY3RpdmUgPSAwOwogIH0KCiAgRW1pdHRlci5wcm90 b3R5cGUgPSB7CiAgICBiZWZvcmVzdGFydDogZnVuY3Rpb24oKSB7CiAgICAgIGlmICgrK3RoaXMu YWN0aXZlID09PSAxKSB0aGlzLnN0YXRlLmVtaXR0ZXIgPSB0aGlzLCB0aGlzLnN0YXJ0aW5nID0g dHJ1ZTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgc3RhcnQ6IGZ1bmN0aW9uKCkgewog ICAgICBpZiAodGhpcy5zdGFydGluZykgdGhpcy5zdGFydGluZyA9IGZhbHNlLCB0aGlzLmVtaXQo InN0YXJ0Iik7CiAgICAgIGVsc2UgdGhpcy5lbWl0KCJicnVzaCIpOwogICAgICByZXR1cm4gdGhp czsKICAgIH0sCiAgICBicnVzaDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuZW1pdCgiYnJ1c2gi KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAogICAgZW5kOiBmdW5jdGlvbigpIHsKICAgICAg aWYgKC0tdGhpcy5hY3RpdmUgPT09IDApIGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsIHRoaXMu ZW1pdCgiZW5kIik7CiAgICAgIHJldHVybiB0aGlzOwogICAgfSwKICAgIGVtaXQ6IGZ1bmN0aW9u KHR5cGUpIHsKICAgICAgY3VzdG9tRXZlbnQobmV3IEJydXNoRXZlbnQoYnJ1c2gsIHR5cGUsIGRp bS5vdXRwdXQodGhpcy5zdGF0ZS5zZWxlY3Rpb24pKSwgbGlzdGVuZXJzLmFwcGx5LCBsaXN0ZW5l cnMsIFt0eXBlLCB0aGlzLnRoYXQsIHRoaXMuYXJnc10pOwogICAgfQogIH07CgogIGZ1bmN0aW9u IHN0YXJ0ZWQoKSB7CiAgICBpZiAodG91Y2hlbmRpbmcgJiYgIWV4cG9ydHMuZXZlbnQudG91Y2hl cykgcmV0dXJuOwogICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJu OwoKICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICB0eXBlID0gZXhwb3J0cy5ldmVudC50YXJn ZXQuX19kYXRhX18udHlwZSwKICAgICAgICBtb2RlID0gKGtleXMgJiYgZXhwb3J0cy5ldmVudC5t ZXRhS2V5ID8gdHlwZSA9ICJvdmVybGF5IiA6IHR5cGUpID09PSAic2VsZWN0aW9uIiA/IE1PREVf RFJBRyA6IChrZXlzICYmIGV4cG9ydHMuZXZlbnQuYWx0S2V5ID8gTU9ERV9DRU5URVIgOiBNT0RF X0hBTkRMRSksCiAgICAgICAgc2lnblggPSBkaW0gPT09IFkgPyBudWxsIDogc2lnbnNYW3R5cGVd LAogICAgICAgIHNpZ25ZID0gZGltID09PSBYID8gbnVsbCA6IHNpZ25zWVt0eXBlXSwKICAgICAg ICBzdGF0ZSA9IGxvY2FsJDEodGhhdCksCiAgICAgICAgZXh0ZW50ID0gc3RhdGUuZXh0ZW50LAog ICAgICAgIHNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbiwKICAgICAgICBXID0gZXh0ZW50WzBd WzBdLCB3MCwgdzEsCiAgICAgICAgTiA9IGV4dGVudFswXVsxXSwgbjAsIG4xLAogICAgICAgIEUg PSBleHRlbnRbMV1bMF0sIGUwLCBlMSwKICAgICAgICBTID0gZXh0ZW50WzFdWzFdLCBzMCwgczEs CiAgICAgICAgZHggPSAwLAogICAgICAgIGR5ID0gMCwKICAgICAgICBtb3ZpbmcsCiAgICAgICAg c2hpZnRpbmcgPSBzaWduWCAmJiBzaWduWSAmJiBrZXlzICYmIGV4cG9ydHMuZXZlbnQuc2hpZnRL ZXksCiAgICAgICAgbG9ja1gsCiAgICAgICAgbG9ja1ksCiAgICAgICAgcG9pbnRlciA9IGV4cG9y dHMuZXZlbnQudG91Y2hlcyA/IHRvdWNoZXIoZXhwb3J0cy5ldmVudC5jaGFuZ2VkVG91Y2hlc1sw XS5pZGVudGlmaWVyKSA6IG1vdXNlLAogICAgICAgIHBvaW50MCA9IHBvaW50ZXIodGhhdCksCiAg ICAgICAgcG9pbnQgPSBwb2ludDAsCiAgICAgICAgZW1pdCA9IGVtaXR0ZXIodGhhdCwgYXJndW1l bnRzLCB0cnVlKS5iZWZvcmVzdGFydCgpOwoKICAgIGlmICh0eXBlID09PSAib3ZlcmxheSIpIHsK ICAgICAgaWYgKHNlbGVjdGlvbikgbW92aW5nID0gdHJ1ZTsKICAgICAgc3RhdGUuc2VsZWN0aW9u ID0gc2VsZWN0aW9uID0gWwogICAgICAgIFt3MCA9IGRpbSA9PT0gWSA/IFcgOiBwb2ludDBbMF0s IG4wID0gZGltID09PSBYID8gTiA6IHBvaW50MFsxXV0sCiAgICAgICAgW2UwID0gZGltID09PSBZ ID8gRSA6IHcwLCBzMCA9IGRpbSA9PT0gWCA/IFMgOiBuMF0KICAgICAgXTsKICAgIH0gZWxzZSB7 CiAgICAgIHcwID0gc2VsZWN0aW9uWzBdWzBdOwogICAgICBuMCA9IHNlbGVjdGlvblswXVsxXTsK ICAgICAgZTAgPSBzZWxlY3Rpb25bMV1bMF07CiAgICAgIHMwID0gc2VsZWN0aW9uWzFdWzFdOwog ICAgfQoKICAgIHcxID0gdzA7CiAgICBuMSA9IG4wOwogICAgZTEgPSBlMDsKICAgIHMxID0gczA7 CgogICAgdmFyIGdyb3VwID0gc2VsZWN0KHRoYXQpCiAgICAgICAgLmF0dHIoInBvaW50ZXItZXZl bnRzIiwgIm5vbmUiKTsKCiAgICB2YXIgb3ZlcmxheSA9IGdyb3VwLnNlbGVjdEFsbCgiLm92ZXJs YXkiKQogICAgICAgIC5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzW3R5cGVdKTsKCiAgICBpZiAoZXhw b3J0cy5ldmVudC50b3VjaGVzKSB7CiAgICAgIGVtaXQubW92ZWQgPSBtb3ZlZDsKICAgICAgZW1p dC5lbmRlZCA9IGVuZGVkOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHZpZXcgPSBzZWxlY3QoZXhw b3J0cy5ldmVudC52aWV3KQogICAgICAgICAgLm9uKCJtb3VzZW1vdmUuYnJ1c2giLCBtb3ZlZCwg dHJ1ZSkKICAgICAgICAgIC5vbigibW91c2V1cC5icnVzaCIsIGVuZGVkLCB0cnVlKTsKICAgICAg aWYgKGtleXMpIHZpZXcKICAgICAgICAgIC5vbigia2V5ZG93bi5icnVzaCIsIGtleWRvd25lZCwg dHJ1ZSkKICAgICAgICAgIC5vbigia2V5dXAuYnJ1c2giLCBrZXl1cHBlZCwgdHJ1ZSk7CgogICAg ICBkcmFnRGlzYWJsZShleHBvcnRzLmV2ZW50LnZpZXcpOwogICAgfQoKICAgIG5vcHJvcGFnYXRp b24kMSgpOwogICAgaW50ZXJydXB0KHRoYXQpOwogICAgcmVkcmF3LmNhbGwodGhhdCk7CiAgICBl bWl0LnN0YXJ0KCk7CgogICAgZnVuY3Rpb24gbW92ZWQoKSB7CiAgICAgIHZhciBwb2ludDEgPSBw b2ludGVyKHRoYXQpOwogICAgICBpZiAoc2hpZnRpbmcgJiYgIWxvY2tYICYmICFsb2NrWSkgewog ICAgICAgIGlmIChNYXRoLmFicyhwb2ludDFbMF0gLSBwb2ludFswXSkgPiBNYXRoLmFicyhwb2lu dDFbMV0gLSBwb2ludFsxXSkpIGxvY2tZID0gdHJ1ZTsKICAgICAgICBlbHNlIGxvY2tYID0gdHJ1 ZTsKICAgICAgfQogICAgICBwb2ludCA9IHBvaW50MTsKICAgICAgbW92aW5nID0gdHJ1ZTsKICAg ICAgbm9ldmVudCQxKCk7CiAgICAgIG1vdmUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb3ZlKCkg ewogICAgICB2YXIgdDsKCiAgICAgIGR4ID0gcG9pbnRbMF0gLSBwb2ludDBbMF07CiAgICAgIGR5 ID0gcG9pbnRbMV0gLSBwb2ludDBbMV07CgogICAgICBzd2l0Y2ggKG1vZGUpIHsKICAgICAgICBj YXNlIE1PREVfU1BBQ0U6CiAgICAgICAgY2FzZSBNT0RFX0RSQUc6IHsKICAgICAgICAgIGlmIChz aWduWCkgZHggPSBNYXRoLm1heChXIC0gdzAsIE1hdGgubWluKEUgLSBlMCwgZHgpKSwgdzEgPSB3 MCArIGR4LCBlMSA9IGUwICsgZHg7CiAgICAgICAgICBpZiAoc2lnblkpIGR5ID0gTWF0aC5tYXgo TiAtIG4wLCBNYXRoLm1pbihTIC0gczAsIGR5KSksIG4xID0gbjAgKyBkeSwgczEgPSBzMCArIGR5 OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgTU9ERV9IQU5ETEU6IHsK ICAgICAgICAgIGlmIChzaWduWCA8IDApIGR4ID0gTWF0aC5tYXgoVyAtIHcwLCBNYXRoLm1pbihF IC0gdzAsIGR4KSksIHcxID0gdzAgKyBkeCwgZTEgPSBlMDsKICAgICAgICAgIGVsc2UgaWYgKHNp Z25YID4gMCkgZHggPSBNYXRoLm1heChXIC0gZTAsIE1hdGgubWluKEUgLSBlMCwgZHgpKSwgdzEg PSB3MCwgZTEgPSBlMCArIGR4OwogICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgZHkgPSBNYXRoLm1h eChOIC0gbjAsIE1hdGgubWluKFMgLSBuMCwgZHkpKSwgbjEgPSBuMCArIGR5LCBzMSA9IHMwOwog ICAgICAgICAgZWxzZSBpZiAoc2lnblkgPiAwKSBkeSA9IE1hdGgubWF4KE4gLSBzMCwgTWF0aC5t aW4oUyAtIHMwLCBkeSkpLCBuMSA9IG4wLCBzMSA9IHMwICsgZHk7CiAgICAgICAgICBicmVhazsK ICAgICAgICB9CiAgICAgICAgY2FzZSBNT0RFX0NFTlRFUjogewogICAgICAgICAgaWYgKHNpZ25Y KSB3MSA9IE1hdGgubWF4KFcsIE1hdGgubWluKEUsIHcwIC0gZHggKiBzaWduWCkpLCBlMSA9IE1h dGgubWF4KFcsIE1hdGgubWluKEUsIGUwICsgZHggKiBzaWduWCkpOwogICAgICAgICAgaWYgKHNp Z25ZKSBuMSA9IE1hdGgubWF4KE4sIE1hdGgubWluKFMsIG4wIC0gZHkgKiBzaWduWSkpLCBzMSA9 IE1hdGgubWF4KE4sIE1hdGgubWluKFMsIHMwICsgZHkgKiBzaWduWSkpOwogICAgICAgICAgYnJl YWs7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoZTEgPCB3MSkgewogICAgICAgIHNpZ25Y ICo9IC0xOwogICAgICAgIHQgPSB3MCwgdzAgPSBlMCwgZTAgPSB0OwogICAgICAgIHQgPSB3MSwg dzEgPSBlMSwgZTEgPSB0OwogICAgICAgIGlmICh0eXBlIGluIGZsaXBYKSBvdmVybGF5LmF0dHIo ImN1cnNvciIsIGN1cnNvcnNbdHlwZSA9IGZsaXBYW3R5cGVdXSk7CiAgICAgIH0KCiAgICAgIGlm IChzMSA8IG4xKSB7CiAgICAgICAgc2lnblkgKj0gLTE7CiAgICAgICAgdCA9IG4wLCBuMCA9IHMw LCBzMCA9IHQ7CiAgICAgICAgdCA9IG4xLCBuMSA9IHMxLCBzMSA9IHQ7CiAgICAgICAgaWYgKHR5 cGUgaW4gZmxpcFkpIG92ZXJsYXkuYXR0cigiY3Vyc29yIiwgY3Vyc29yc1t0eXBlID0gZmxpcFlb dHlwZV1dKTsKICAgICAgfQoKICAgICAgaWYgKHN0YXRlLnNlbGVjdGlvbikgc2VsZWN0aW9uID0g c3RhdGUuc2VsZWN0aW9uOyAvLyBNYXkgYmUgc2V0IGJ5IGJydXNoLm1vdmUhCiAgICAgIGlmIChs b2NrWCkgdzEgPSBzZWxlY3Rpb25bMF1bMF0sIGUxID0gc2VsZWN0aW9uWzFdWzBdOwogICAgICBp ZiAobG9ja1kpIG4xID0gc2VsZWN0aW9uWzBdWzFdLCBzMSA9IHNlbGVjdGlvblsxXVsxXTsKCiAg ICAgIGlmIChzZWxlY3Rpb25bMF1bMF0gIT09IHcxCiAgICAgICAgICB8fCBzZWxlY3Rpb25bMF1b MV0gIT09IG4xCiAgICAgICAgICB8fCBzZWxlY3Rpb25bMV1bMF0gIT09IGUxCiAgICAgICAgICB8 fCBzZWxlY3Rpb25bMV1bMV0gIT09IHMxKSB7CiAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gW1t3 MSwgbjFdLCBbZTEsIHMxXV07CiAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAgICAgZW1p dC5icnVzaCgpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZW5kZWQoKSB7CiAgICAgIG5v cHJvcGFnYXRpb24kMSgpOwogICAgICBpZiAoZXhwb3J0cy5ldmVudC50b3VjaGVzKSB7CiAgICAg ICAgaWYgKGV4cG9ydHMuZXZlbnQudG91Y2hlcy5sZW5ndGgpIHJldHVybjsKICAgICAgICBpZiAo dG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7CiAgICAgICAgdG91Y2hlbmRp bmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIDUwMCk7 IC8vIEdob3N0IGNsaWNrcyBhcmUgZGVsYXllZCEKICAgICAgfSBlbHNlIHsKICAgICAgICB5ZXNk cmFnKGV4cG9ydHMuZXZlbnQudmlldywgbW92aW5nKTsKICAgICAgICB2aWV3Lm9uKCJrZXlkb3du LmJydXNoIGtleXVwLmJydXNoIG1vdXNlbW92ZS5icnVzaCBtb3VzZXVwLmJydXNoIiwgbnVsbCk7 CiAgICAgIH0KICAgICAgZ3JvdXAuYXR0cigicG9pbnRlci1ldmVudHMiLCAiYWxsIik7CiAgICAg IG92ZXJsYXkuYXR0cigiY3Vyc29yIiwgY3Vyc29ycy5vdmVybGF5KTsKICAgICAgaWYgKHN0YXRl LnNlbGVjdGlvbikgc2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uOyAvLyBNYXkgYmUgc2V0IGJ5 IGJydXNoLm1vdmUgKG9uIHN0YXJ0KSEKICAgICAgaWYgKGVtcHR5JDEoc2VsZWN0aW9uKSkgc3Rh dGUuc2VsZWN0aW9uID0gbnVsbCwgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAgIGVtaXQuZW5kKCk7 CiAgICB9CgogICAgZnVuY3Rpb24ga2V5ZG93bmVkKCkgewogICAgICBzd2l0Y2ggKGV4cG9ydHMu ZXZlbnQua2V5Q29kZSkgewogICAgICAgIGNhc2UgMTY6IHsgLy8gU0hJRlQKICAgICAgICAgIHNo aWZ0aW5nID0gc2lnblggJiYgc2lnblk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAg ICAgY2FzZSAxODogeyAvLyBBTFQKICAgICAgICAgIGlmIChtb2RlID09PSBNT0RFX0hBTkRMRSkg ewogICAgICAgICAgICBpZiAoc2lnblgpIGUwID0gZTEgLSBkeCAqIHNpZ25YLCB3MCA9IHcxICsg ZHggKiBzaWduWDsKICAgICAgICAgICAgaWYgKHNpZ25ZKSBzMCA9IHMxIC0gZHkgKiBzaWduWSwg bjAgPSBuMSArIGR5ICogc2lnblk7CiAgICAgICAgICAgIG1vZGUgPSBNT0RFX0NFTlRFUjsKICAg ICAgICAgICAgbW92ZSgpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQog ICAgICAgIGNhc2UgMzI6IHsgLy8gU1BBQ0U7IHRha2VzIHByaW9yaXR5IG92ZXIgQUxUCiAgICAg ICAgICBpZiAobW9kZSA9PT0gTU9ERV9IQU5ETEUgfHwgbW9kZSA9PT0gTU9ERV9DRU5URVIpIHsK ICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZTAgPSBlMSAtIGR4OyBlbHNlIGlmIChzaWduWCA+ IDApIHcwID0gdzEgLSBkeDsKICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMSAtIGR5 OyBlbHNlIGlmIChzaWduWSA+IDApIG4wID0gbjEgLSBkeTsKICAgICAgICAgICAgbW9kZSA9IE1P REVfU1BBQ0U7CiAgICAgICAgICAgIG92ZXJsYXkuYXR0cigiY3Vyc29yIiwgY3Vyc29ycy5zZWxl Y3Rpb24pOwogICAgICAgICAgICBtb3ZlKCk7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsK ICAgICAgICB9CiAgICAgICAgZGVmYXVsdDogcmV0dXJuOwogICAgICB9CiAgICAgIG5vZXZlbnQk MSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGtleXVwcGVkKCkgewogICAgICBzd2l0Y2ggKGV4cG9y dHMuZXZlbnQua2V5Q29kZSkgewogICAgICAgIGNhc2UgMTY6IHsgLy8gU0hJRlQKICAgICAgICAg IGlmIChzaGlmdGluZykgewogICAgICAgICAgICBsb2NrWCA9IGxvY2tZID0gc2hpZnRpbmcgPSBm YWxzZTsKICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAg ICAgICAgfQogICAgICAgIGNhc2UgMTg6IHsgLy8gQUxUCiAgICAgICAgICBpZiAobW9kZSA9PT0g TU9ERV9DRU5URVIpIHsKICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZTAgPSBlMTsgZWxzZSBp ZiAoc2lnblggPiAwKSB3MCA9IHcxOwogICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBzMCA9IHMx OyBlbHNlIGlmIChzaWduWSA+IDApIG4wID0gbjE7CiAgICAgICAgICAgIG1vZGUgPSBNT0RFX0hB TkRMRTsKICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAg ICAgICAgfQogICAgICAgIGNhc2UgMzI6IHsgLy8gU1BBQ0UKICAgICAgICAgIGlmIChtb2RlID09 PSBNT0RFX1NQQUNFKSB7CiAgICAgICAgICAgIGlmIChleHBvcnRzLmV2ZW50LmFsdEtleSkgewog ICAgICAgICAgICAgIGlmIChzaWduWCkgZTAgPSBlMSAtIGR4ICogc2lnblgsIHcwID0gdzEgKyBk eCAqIHNpZ25YOwogICAgICAgICAgICAgIGlmIChzaWduWSkgczAgPSBzMSAtIGR5ICogc2lnblks IG4wID0gbjEgKyBkeSAqIHNpZ25ZOwogICAgICAgICAgICAgIG1vZGUgPSBNT0RFX0NFTlRFUjsK ICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoc2lnblggPCAwKSBlMCA9IGUx OyBlbHNlIGlmIChzaWduWCA+IDApIHcwID0gdzE7CiAgICAgICAgICAgICAgaWYgKHNpZ25ZIDwg MCkgczAgPSBzMTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xOwogICAgICAgICAgICAgIG1v ZGUgPSBNT0RFX0hBTkRMRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdmVybGF5LmF0dHIo ImN1cnNvciIsIGN1cnNvcnNbdHlwZV0pOwogICAgICAgICAgICBtb3ZlKCk7CiAgICAgICAgICB9 CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZGVmYXVsdDogcmV0dXJuOwogICAg ICB9CiAgICAgIG5vZXZlbnQkMSgpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG91Y2htb3ZlZCgp IHsKICAgIGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5tb3ZlZCgpOwogIH0KCiAgZnVuY3Rpb24g dG91Y2hlbmRlZCgpIHsKICAgIGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5lbmRlZCgpOwogIH0K CiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHsKICAgIHZhciBzdGF0ZSA9IHRoaXMuX19icnVzaCB8 fCB7c2VsZWN0aW9uOiBudWxsfTsKICAgIHN0YXRlLmV4dGVudCA9IG51bWJlcjIoZXh0ZW50LmFw cGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgc3RhdGUuZGltID0gZGltOwogICAgcmV0dXJuIHN0 YXRlOwogIH0KCiAgYnJ1c2guZXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29u c3RhbnQkNChudW1iZXIyKF8pKSwgYnJ1c2gpIDogZXh0ZW50OwogIH07CgogIGJydXNoLmZpbHRl ciA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9 IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDQoISFfKSwgYnJ1c2gpIDog ZmlsdGVyOwogIH07CgogIGJydXNoLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVy biBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24i ID8gXyA6IGNvbnN0YW50JDQoISFfKSwgYnJ1c2gpIDogdG91Y2hhYmxlOwogIH07CgogIGJydXNo LmhhbmRsZVNpemUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ IChoYW5kbGVTaXplID0gK18sIGJydXNoKSA6IGhhbmRsZVNpemU7CiAgfTsKCiAgYnJ1c2gua2V5 TW9kaWZpZXJzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAo a2V5cyA9ICEhXywgYnJ1c2gpIDoga2V5czsKICB9OwoKICBicnVzaC5vbiA9IGZ1bmN0aW9uKCkg ewogICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRz KTsKICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gYnJ1c2ggOiB2YWx1ZTsKICB9OwoK ICByZXR1cm4gYnJ1c2g7Cn0KCnZhciBjb3MgPSBNYXRoLmNvczsKdmFyIHNpbiA9IE1hdGguc2lu Owp2YXIgcGkkMSA9IE1hdGguUEk7CnZhciBoYWxmUGkkMSA9IHBpJDEgLyAyOwp2YXIgdGF1JDEg PSBwaSQxICogMjsKdmFyIG1heCQxID0gTWF0aC5tYXg7CgpmdW5jdGlvbiBjb21wYXJlVmFsdWUo Y29tcGFyZSkgewogIHJldHVybiBmdW5jdGlvbihhLCBiKSB7CiAgICByZXR1cm4gY29tcGFyZSgK ICAgICAgYS5zb3VyY2UudmFsdWUgKyBhLnRhcmdldC52YWx1ZSwKICAgICAgYi5zb3VyY2UudmFs dWUgKyBiLnRhcmdldC52YWx1ZQogICAgKTsKICB9Owp9CgpmdW5jdGlvbiBjaG9yZCgpIHsKICB2 YXIgcGFkQW5nbGUgPSAwLAogICAgICBzb3J0R3JvdXBzID0gbnVsbCwKICAgICAgc29ydFN1Ymdy b3VwcyA9IG51bGwsCiAgICAgIHNvcnRDaG9yZHMgPSBudWxsOwoKICBmdW5jdGlvbiBjaG9yZCht YXRyaXgpIHsKICAgIHZhciBuID0gbWF0cml4Lmxlbmd0aCwKICAgICAgICBncm91cFN1bXMgPSBb XSwKICAgICAgICBncm91cEluZGV4ID0gc2VxdWVuY2UobiksCiAgICAgICAgc3ViZ3JvdXBJbmRl eCA9IFtdLAogICAgICAgIGNob3JkcyA9IFtdLAogICAgICAgIGdyb3VwcyA9IGNob3Jkcy5ncm91 cHMgPSBuZXcgQXJyYXkobiksCiAgICAgICAgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG4gKiBuKSwK ICAgICAgICBrLAogICAgICAgIHgsCiAgICAgICAgeDAsCiAgICAgICAgZHgsCiAgICAgICAgaSwK ICAgICAgICBqOwoKICAgIC8vIENvbXB1dGUgdGhlIHN1bS4KICAgIGsgPSAwLCBpID0gLTE7IHdo aWxlICgrK2kgPCBuKSB7CiAgICAgIHggPSAwLCBqID0gLTE7IHdoaWxlICgrK2ogPCBuKSB7CiAg ICAgICAgeCArPSBtYXRyaXhbaV1bal07CiAgICAgIH0KICAgICAgZ3JvdXBTdW1zLnB1c2goeCk7 CiAgICAgIHN1Ymdyb3VwSW5kZXgucHVzaChzZXF1ZW5jZShuKSk7CiAgICAgIGsgKz0geDsKICAg IH0KCiAgICAvLyBTb3J0IGdyb3Vwc+KApgogICAgaWYgKHNvcnRHcm91cHMpIGdyb3VwSW5kZXgu c29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgIHJldHVybiBzb3J0R3JvdXBzKGdyb3VwU3Vtc1th XSwgZ3JvdXBTdW1zW2JdKTsKICAgIH0pOwoKICAgIC8vIFNvcnQgc3ViZ3JvdXBz4oCmCiAgICBp ZiAoc29ydFN1Ymdyb3Vwcykgc3ViZ3JvdXBJbmRleC5mb3JFYWNoKGZ1bmN0aW9uKGQsIGkpIHsK ICAgICAgZC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICByZXR1cm4gc29ydFN1Ymdyb3Vw cyhtYXRyaXhbaV1bYV0sIG1hdHJpeFtpXVtiXSk7CiAgICAgIH0pOwogICAgfSk7CgogICAgLy8g Q29udmVydCB0aGUgc3VtIHRvIHNjYWxpbmcgZmFjdG9yIGZvciBbMCwgMnBpXS4KICAgIC8vIFRP RE8gQWxsb3cgc3RhcnQgYW5kIGVuZCBhbmdsZSB0byBiZSBzcGVjaWZpZWQ/CiAgICAvLyBUT0RP IEFsbG93IHBhZGRpbmcgdG8gYmUgc3BlY2lmaWVkIGFzIHBlcmNlbnRhZ2U/CiAgICBrID0gbWF4 JDEoMCwgdGF1JDEgLSBwYWRBbmdsZSAqIG4pIC8gazsKICAgIGR4ID0gayA/IHBhZEFuZ2xlIDog dGF1JDEgLyBuOwoKICAgIC8vIENvbXB1dGUgdGhlIHN0YXJ0IGFuZCBlbmQgYW5nbGUgZm9yIGVh Y2ggZ3JvdXAgYW5kIHN1Ymdyb3VwLgogICAgLy8gTm90ZTogT3BlcmEgaGFzIGEgYnVnIHJlb3Jk ZXJpbmcgb2JqZWN0IGxpdGVyYWwgcHJvcGVydGllcyEKICAgIHggPSAwLCBpID0gLTE7IHdoaWxl ICgrK2kgPCBuKSB7CiAgICAgIHgwID0geCwgaiA9IC0xOyB3aGlsZSAoKytqIDwgbikgewogICAg ICAgIHZhciBkaSA9IGdyb3VwSW5kZXhbaV0sCiAgICAgICAgICAgIGRqID0gc3ViZ3JvdXBJbmRl eFtkaV1bal0sCiAgICAgICAgICAgIHYgPSBtYXRyaXhbZGldW2RqXSwKICAgICAgICAgICAgYTAg PSB4LAogICAgICAgICAgICBhMSA9IHggKz0gdiAqIGs7CiAgICAgICAgc3ViZ3JvdXBzW2RqICog biArIGRpXSA9IHsKICAgICAgICAgIGluZGV4OiBkaSwKICAgICAgICAgIHN1YmluZGV4OiBkaiwK ICAgICAgICAgIHN0YXJ0QW5nbGU6IGEwLAogICAgICAgICAgZW5kQW5nbGU6IGExLAogICAgICAg ICAgdmFsdWU6IHYKICAgICAgICB9OwogICAgICB9CiAgICAgIGdyb3Vwc1tkaV0gPSB7CiAgICAg ICAgaW5kZXg6IGRpLAogICAgICAgIHN0YXJ0QW5nbGU6IHgwLAogICAgICAgIGVuZEFuZ2xlOiB4 LAogICAgICAgIHZhbHVlOiBncm91cFN1bXNbZGldCiAgICAgIH07CiAgICAgIHggKz0gZHg7CiAg ICB9CgogICAgLy8gR2VuZXJhdGUgY2hvcmRzIGZvciBlYWNoIChub24tZW1wdHkpIHN1Ymdyb3Vw LXN1Ymdyb3VwIGxpbmsuCiAgICBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSB7CiAgICAgIGogPSBp IC0gMTsgd2hpbGUgKCsraiA8IG4pIHsKICAgICAgICB2YXIgc291cmNlID0gc3ViZ3JvdXBzW2og KiBuICsgaV0sCiAgICAgICAgICAgIHRhcmdldCA9IHN1Ymdyb3Vwc1tpICogbiArIGpdOwogICAg ICAgIGlmIChzb3VyY2UudmFsdWUgfHwgdGFyZ2V0LnZhbHVlKSB7CiAgICAgICAgICBjaG9yZHMu cHVzaChzb3VyY2UudmFsdWUgPCB0YXJnZXQudmFsdWUKICAgICAgICAgICAgICA/IHtzb3VyY2U6 IHRhcmdldCwgdGFyZ2V0OiBzb3VyY2V9CiAgICAgICAgICAgICAgOiB7c291cmNlOiBzb3VyY2Us IHRhcmdldDogdGFyZ2V0fSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHNv cnRDaG9yZHMgPyBjaG9yZHMuc29ydChzb3J0Q2hvcmRzKSA6IGNob3JkczsKICB9CgogIGNob3Jk LnBhZEFuZ2xlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAo cGFkQW5nbGUgPSBtYXgkMSgwLCBfKSwgY2hvcmQpIDogcGFkQW5nbGU7CiAgfTsKCiAgY2hvcmQu c29ydEdyb3VwcyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8g KHNvcnRHcm91cHMgPSBfLCBjaG9yZCkgOiBzb3J0R3JvdXBzOwogIH07CgogIGNob3JkLnNvcnRT dWJncm91cHMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChz b3J0U3ViZ3JvdXBzID0gXywgY2hvcmQpIDogc29ydFN1Ymdyb3VwczsKICB9OwoKICBjaG9yZC5z b3J0Q2hvcmRzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAo XyA9PSBudWxsID8gc29ydENob3JkcyA9IG51bGwgOiAoc29ydENob3JkcyA9IGNvbXBhcmVWYWx1 ZShfKSkuXyA9IF8sIGNob3JkKSA6IHNvcnRDaG9yZHMgJiYgc29ydENob3Jkcy5fOwogIH07Cgog IHJldHVybiBjaG9yZDsKfQoKdmFyIHNsaWNlJDIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7Cgpm dW5jdGlvbiBjb25zdGFudCQ1KHgpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4g eDsKICB9Owp9Cgp2YXIgcGkkMiA9IE1hdGguUEksCiAgICB0YXUkMiA9IDIgKiBwaSQyLAogICAg ZXBzaWxvbiQxID0gMWUtNiwKICAgIHRhdUVwc2lsb24gPSB0YXUkMiAtIGVwc2lsb24kMTsKCmZ1 bmN0aW9uIFBhdGgoKSB7CiAgdGhpcy5feDAgPSB0aGlzLl95MCA9IC8vIHN0YXJ0IG9mIGN1cnJl bnQgc3VicGF0aAogIHRoaXMuX3gxID0gdGhpcy5feTEgPSBudWxsOyAvLyBlbmQgb2YgY3VycmVu dCBzdWJwYXRoCiAgdGhpcy5fID0gIiI7Cn0KCmZ1bmN0aW9uIHBhdGgoKSB7CiAgcmV0dXJuIG5l dyBQYXRoOwp9CgpQYXRoLnByb3RvdHlwZSA9IHBhdGgucHJvdG90eXBlID0gewogIGNvbnN0cnVj dG9yOiBQYXRoLAogIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkgewogICAgdGhpcy5fICs9ICJNIiAr ICh0aGlzLl94MCA9IHRoaXMuX3gxID0gK3gpICsgIiwiICsgKHRoaXMuX3kwID0gdGhpcy5feTEg PSAreSk7CiAgfSwKICBjbG9zZVBhdGg6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuX3gxICE9 PSBudWxsKSB7CiAgICAgIHRoaXMuX3gxID0gdGhpcy5feDAsIHRoaXMuX3kxID0gdGhpcy5feTA7 CiAgICAgIHRoaXMuXyArPSAiWiI7CiAgICB9CiAgfSwKICBsaW5lVG86IGZ1bmN0aW9uKHgsIHkp IHsKICAgIHRoaXMuXyArPSAiTCIgKyAodGhpcy5feDEgPSAreCkgKyAiLCIgKyAodGhpcy5feTEg PSAreSk7CiAgfSwKICBxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5jdGlvbih4MSwgeTEsIHgsIHkpIHsK ICAgIHRoaXMuXyArPSAiUSIgKyAoK3gxKSArICIsIiArICgreTEpICsgIiwiICsgKHRoaXMuX3gx ID0gK3gpICsgIiwiICsgKHRoaXMuX3kxID0gK3kpOwogIH0sCiAgYmV6aWVyQ3VydmVUbzogZnVu Y3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHsKICAgIHRoaXMuXyArPSAiQyIgKyAoK3gxKSAr ICIsIiArICgreTEpICsgIiwiICsgKCt4MikgKyAiLCIgKyAoK3kyKSArICIsIiArICh0aGlzLl94 MSA9ICt4KSArICIsIiArICh0aGlzLl95MSA9ICt5KTsKICB9LAogIGFyY1RvOiBmdW5jdGlvbih4 MSwgeTEsIHgyLCB5MiwgcikgewogICAgeDEgPSAreDEsIHkxID0gK3kxLCB4MiA9ICt4MiwgeTIg PSAreTIsIHIgPSArcjsKICAgIHZhciB4MCA9IHRoaXMuX3gxLAogICAgICAgIHkwID0gdGhpcy5f eTEsCiAgICAgICAgeDIxID0geDIgLSB4MSwKICAgICAgICB5MjEgPSB5MiAtIHkxLAogICAgICAg IHgwMSA9IHgwIC0geDEsCiAgICAgICAgeTAxID0geTAgLSB5MSwKICAgICAgICBsMDFfMiA9IHgw MSAqIHgwMSArIHkwMSAqIHkwMTsKCiAgICAvLyBJcyB0aGUgcmFkaXVzIG5lZ2F0aXZlPyBFcnJv ci4KICAgIGlmIChyIDwgMCkgdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIgKyBy KTsKCiAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgxLHkxKS4KICAgIGlmICh0 aGlzLl94MSA9PT0gbnVsbCkgewogICAgICB0aGlzLl8gKz0gIk0iICsgKHRoaXMuX3gxID0geDEp ICsgIiwiICsgKHRoaXMuX3kxID0geTEpOwogICAgfQoKICAgIC8vIE9yLCBpcyAoeDEseTEpIGNv aW5jaWRlbnQgd2l0aCAoeDAseTApPyBEbyBub3RoaW5nLgogICAgZWxzZSBpZiAoIShsMDFfMiA+ IGVwc2lsb24kMSkpOwoKICAgIC8vIE9yLCBhcmUgKHgwLHkwKSwgKHgxLHkxKSBhbmQgKHgyLHky KSBjb2xsaW5lYXI/CiAgICAvLyBFcXVpdmFsZW50bHksIGlzICh4MSx5MSkgY29pbmNpZGVudCB3 aXRoICh4Mix5Mik/CiAgICAvLyBPciwgaXMgdGhlIHJhZGl1cyB6ZXJvPyBMaW5lIHRvICh4MSx5 MSkuCiAgICBlbHNlIGlmICghKE1hdGguYWJzKHkwMSAqIHgyMSAtIHkyMSAqIHgwMSkgPiBlcHNp bG9uJDEpIHx8ICFyKSB7CiAgICAgIHRoaXMuXyArPSAiTCIgKyAodGhpcy5feDEgPSB4MSkgKyAi LCIgKyAodGhpcy5feTEgPSB5MSk7CiAgICB9CgogICAgLy8gT3RoZXJ3aXNlLCBkcmF3IGFuIGFy YyEKICAgIGVsc2UgewogICAgICB2YXIgeDIwID0geDIgLSB4MCwKICAgICAgICAgIHkyMCA9IHky IC0geTAsCiAgICAgICAgICBsMjFfMiA9IHgyMSAqIHgyMSArIHkyMSAqIHkyMSwKICAgICAgICAg IGwyMF8yID0geDIwICogeDIwICsgeTIwICogeTIwLAogICAgICAgICAgbDIxID0gTWF0aC5zcXJ0 KGwyMV8yKSwKICAgICAgICAgIGwwMSA9IE1hdGguc3FydChsMDFfMiksCiAgICAgICAgICBsID0g ciAqIE1hdGgudGFuKChwaSQyIC0gTWF0aC5hY29zKChsMjFfMiArIGwwMV8yIC0gbDIwXzIpIC8g KDIgKiBsMjEgKiBsMDEpKSkgLyAyKSwKICAgICAgICAgIHQwMSA9IGwgLyBsMDEsCiAgICAgICAg ICB0MjEgPSBsIC8gbDIxOwoKICAgICAgLy8gSWYgdGhlIHN0YXJ0IHRhbmdlbnQgaXMgbm90IGNv aW5jaWRlbnQgd2l0aCAoeDAseTApLCBsaW5lIHRvLgogICAgICBpZiAoTWF0aC5hYnModDAxIC0g MSkgPiBlcHNpbG9uJDEpIHsKICAgICAgICB0aGlzLl8gKz0gIkwiICsgKHgxICsgdDAxICogeDAx KSArICIsIiArICh5MSArIHQwMSAqIHkwMSk7CiAgICAgIH0KCiAgICAgIHRoaXMuXyArPSAiQSIg KyByICsgIiwiICsgciArICIsMCwwLCIgKyAoKyh5MDEgKiB4MjAgPiB4MDEgKiB5MjApKSArICIs IiArICh0aGlzLl94MSA9IHgxICsgdDIxICogeDIxKSArICIsIiArICh0aGlzLl95MSA9IHkxICsg dDIxICogeTIxKTsKICAgIH0KICB9LAogIGFyYzogZnVuY3Rpb24oeCwgeSwgciwgYTAsIGExLCBj Y3cpIHsKICAgIHggPSAreCwgeSA9ICt5LCByID0gK3IsIGNjdyA9ICEhY2N3OwogICAgdmFyIGR4 ID0gciAqIE1hdGguY29zKGEwKSwKICAgICAgICBkeSA9IHIgKiBNYXRoLnNpbihhMCksCiAgICAg ICAgeDAgPSB4ICsgZHgsCiAgICAgICAgeTAgPSB5ICsgZHksCiAgICAgICAgY3cgPSAxIF4gY2N3 LAogICAgICAgIGRhID0gY2N3ID8gYTAgLSBhMSA6IGExIC0gYTA7CgogICAgLy8gSXMgdGhlIHJh ZGl1cyBuZWdhdGl2ZT8gRXJyb3IuCiAgICBpZiAociA8IDApIHRocm93IG5ldyBFcnJvcigibmVn YXRpdmUgcmFkaXVzOiAiICsgcik7CgogICAgLy8gSXMgdGhpcyBwYXRoIGVtcHR5PyBNb3ZlIHRv ICh4MCx5MCkuCiAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHsKICAgICAgdGhpcy5fICs9ICJN IiArIHgwICsgIiwiICsgeTA7CiAgICB9CgogICAgLy8gT3IsIGlzICh4MCx5MCkgbm90IGNvaW5j aWRlbnQgd2l0aCB0aGUgcHJldmlvdXMgcG9pbnQ/IExpbmUgdG8gKHgwLHkwKS4KICAgIGVsc2Ug aWYgKE1hdGguYWJzKHRoaXMuX3gxIC0geDApID4gZXBzaWxvbiQxIHx8IE1hdGguYWJzKHRoaXMu X3kxIC0geTApID4gZXBzaWxvbiQxKSB7CiAgICAgIHRoaXMuXyArPSAiTCIgKyB4MCArICIsIiAr IHkwOwogICAgfQoKICAgIC8vIElzIHRoaXMgYXJjIGVtcHR5PyBXZeKAmXJlIGRvbmUuCiAgICBp ZiAoIXIpIHJldHVybjsKCiAgICAvLyBEb2VzIHRoZSBhbmdsZSBnbyB0aGUgd3Jvbmcgd2F5PyBG bGlwIHRoZSBkaXJlY3Rpb24uCiAgICBpZiAoZGEgPCAwKSBkYSA9IGRhICUgdGF1JDIgKyB0YXUk MjsKCiAgICAvLyBJcyB0aGlzIGEgY29tcGxldGUgY2lyY2xlPyBEcmF3IHR3byBhcmNzIHRvIGNv bXBsZXRlIHRoZSBjaXJjbGUuCiAgICBpZiAoZGEgPiB0YXVFcHNpbG9uKSB7CiAgICAgIHRoaXMu XyArPSAiQSIgKyByICsgIiwiICsgciArICIsMCwxLCIgKyBjdyArICIsIiArICh4IC0gZHgpICsg IiwiICsgKHkgLSBkeSkgKyAiQSIgKyByICsgIiwiICsgciArICIsMCwxLCIgKyBjdyArICIsIiAr ICh0aGlzLl94MSA9IHgwKSArICIsIiArICh0aGlzLl95MSA9IHkwKTsKICAgIH0KCiAgICAvLyBJ cyB0aGlzIGFyYyBub24tZW1wdHk/IERyYXcgYW4gYXJjIQogICAgZWxzZSBpZiAoZGEgPiBlcHNp bG9uJDEpIHsKICAgICAgdGhpcy5fICs9ICJBIiArIHIgKyAiLCIgKyByICsgIiwwLCIgKyAoKyhk YSA+PSBwaSQyKSkgKyAiLCIgKyBjdyArICIsIiArICh0aGlzLl94MSA9IHggKyByICogTWF0aC5j b3MoYTEpKSArICIsIiArICh0aGlzLl95MSA9IHkgKyByICogTWF0aC5zaW4oYTEpKTsKICAgIH0K ICB9LAogIHJlY3Q6IGZ1bmN0aW9uKHgsIHksIHcsIGgpIHsKICAgIHRoaXMuXyArPSAiTSIgKyAo dGhpcy5feDAgPSB0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MCA9IHRoaXMuX3kxID0g K3kpICsgImgiICsgKCt3KSArICJ2IiArICgraCkgKyAiaCIgKyAoLXcpICsgIloiOwogIH0sCiAg dG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuXzsKICB9Cn07CgpmdW5jdGlv biBkZWZhdWx0U291cmNlKGQpIHsKICByZXR1cm4gZC5zb3VyY2U7Cn0KCmZ1bmN0aW9uIGRlZmF1 bHRUYXJnZXQoZCkgewogIHJldHVybiBkLnRhcmdldDsKfQoKZnVuY3Rpb24gZGVmYXVsdFJhZGl1 cyhkKSB7CiAgcmV0dXJuIGQucmFkaXVzOwp9CgpmdW5jdGlvbiBkZWZhdWx0U3RhcnRBbmdsZShk KSB7CiAgcmV0dXJuIGQuc3RhcnRBbmdsZTsKfQoKZnVuY3Rpb24gZGVmYXVsdEVuZEFuZ2xlKGQp IHsKICByZXR1cm4gZC5lbmRBbmdsZTsKfQoKZnVuY3Rpb24gcmliYm9uKCkgewogIHZhciBzb3Vy Y2UgPSBkZWZhdWx0U291cmNlLAogICAgICB0YXJnZXQgPSBkZWZhdWx0VGFyZ2V0LAogICAgICBy YWRpdXMgPSBkZWZhdWx0UmFkaXVzLAogICAgICBzdGFydEFuZ2xlID0gZGVmYXVsdFN0YXJ0QW5n bGUsCiAgICAgIGVuZEFuZ2xlID0gZGVmYXVsdEVuZEFuZ2xlLAogICAgICBjb250ZXh0ID0gbnVs bDsKCiAgZnVuY3Rpb24gcmliYm9uKCkgewogICAgdmFyIGJ1ZmZlciwKICAgICAgICBhcmd2ID0g c2xpY2UkMi5jYWxsKGFyZ3VtZW50cyksCiAgICAgICAgcyA9IHNvdXJjZS5hcHBseSh0aGlzLCBh cmd2KSwKICAgICAgICB0ID0gdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3YpLAogICAgICAgIHNyID0g K3JhZGl1cy5hcHBseSh0aGlzLCAoYXJndlswXSA9IHMsIGFyZ3YpKSwKICAgICAgICBzYTAgPSBz dGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3YpIC0gaGFsZlBpJDEsCiAgICAgICAgc2ExID0gZW5k QW5nbGUuYXBwbHkodGhpcywgYXJndikgLSBoYWxmUGkkMSwKICAgICAgICBzeDAgPSBzciAqIGNv cyhzYTApLAogICAgICAgIHN5MCA9IHNyICogc2luKHNhMCksCiAgICAgICAgdHIgPSArcmFkaXVz LmFwcGx5KHRoaXMsIChhcmd2WzBdID0gdCwgYXJndikpLAogICAgICAgIHRhMCA9IHN0YXJ0QW5n bGUuYXBwbHkodGhpcywgYXJndikgLSBoYWxmUGkkMSwKICAgICAgICB0YTEgPSBlbmRBbmdsZS5h cHBseSh0aGlzLCBhcmd2KSAtIGhhbGZQaSQxOwoKICAgIGlmICghY29udGV4dCkgY29udGV4dCA9 IGJ1ZmZlciA9IHBhdGgoKTsKCiAgICBjb250ZXh0Lm1vdmVUbyhzeDAsIHN5MCk7CiAgICBjb250 ZXh0LmFyYygwLCAwLCBzciwgc2EwLCBzYTEpOwogICAgaWYgKHNhMCAhPT0gdGEwIHx8IHNhMSAh PT0gdGExKSB7IC8vIFRPRE8gc3IgIT09IHRyPwogICAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZl VG8oMCwgMCwgdHIgKiBjb3ModGEwKSwgdHIgKiBzaW4odGEwKSk7CiAgICAgIGNvbnRleHQuYXJj KDAsIDAsIHRyLCB0YTAsIHRhMSk7CiAgICB9CiAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8o MCwgMCwgc3gwLCBzeTApOwogICAgY29udGV4dC5jbG9zZVBhdGgoKTsKCiAgICBpZiAoYnVmZmVy KSByZXR1cm4gY29udGV4dCA9IG51bGwsIGJ1ZmZlciArICIiIHx8IG51bGw7CiAgfQoKICByaWJi b24ucmFkaXVzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAo cmFkaXVzID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNSgrXyksIHJp YmJvbikgOiByYWRpdXM7CiAgfTsKCiAgcmliYm9uLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihfKSB7 CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdGFydEFuZ2xlID0gdHlwZW9mIF8gPT09 ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNSgrXyksIHJpYmJvbikgOiBzdGFydEFuZ2xlOwog IH07CgogIHJpYmJvbi5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVu dHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29u c3RhbnQkNSgrXyksIHJpYmJvbikgOiBlbmRBbmdsZTsKICB9OwoKICByaWJib24uc291cmNlID0g ZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc291cmNlID0gXywg cmliYm9uKSA6IHNvdXJjZTsKICB9OwoKICByaWJib24udGFyZ2V0ID0gZnVuY3Rpb24oXykgewog ICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGFyZ2V0ID0gXywgcmliYm9uKSA6IHRhcmdl dDsKICB9OwoKICByaWJib24uY29udGV4dCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1 bWVudHMubGVuZ3RoID8gKChjb250ZXh0ID0gXyA9PSBudWxsID8gbnVsbCA6IF8pLCByaWJib24p IDogY29udGV4dDsKICB9OwoKICByZXR1cm4gcmliYm9uOwp9Cgp2YXIgcHJlZml4ID0gIiQiOwoK ZnVuY3Rpb24gTWFwKCkge30KCk1hcC5wcm90b3R5cGUgPSBtYXAkMS5wcm90b3R5cGUgPSB7CiAg Y29uc3RydWN0b3I6IE1hcCwKICBoYXM6IGZ1bmN0aW9uKGtleSkgewogICAgcmV0dXJuIChwcmVm aXggKyBrZXkpIGluIHRoaXM7CiAgfSwKICBnZXQ6IGZ1bmN0aW9uKGtleSkgewogICAgcmV0dXJu IHRoaXNbcHJlZml4ICsga2V5XTsKICB9LAogIHNldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkgewog ICAgdGhpc1twcmVmaXggKyBrZXldID0gdmFsdWU7CiAgICByZXR1cm4gdGhpczsKICB9LAogIHJl bW92ZTogZnVuY3Rpb24oa2V5KSB7CiAgICB2YXIgcHJvcGVydHkgPSBwcmVmaXggKyBrZXk7CiAg ICByZXR1cm4gcHJvcGVydHkgaW4gdGhpcyAmJiBkZWxldGUgdGhpc1twcm9wZXJ0eV07CiAgfSwK ICBjbGVhcjogZnVuY3Rpb24oKSB7CiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAo cHJvcGVydHlbMF0gPT09IHByZWZpeCkgZGVsZXRlIHRoaXNbcHJvcGVydHldOwogIH0sCiAga2V5 czogZnVuY3Rpb24oKSB7CiAgICB2YXIga2V5cyA9IFtdOwogICAgZm9yICh2YXIgcHJvcGVydHkg aW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGtleXMucHVzaChwcm9wZXJ0eS5z bGljZSgxKSk7CiAgICByZXR1cm4ga2V5czsKICB9LAogIHZhbHVlczogZnVuY3Rpb24oKSB7CiAg ICB2YXIgdmFsdWVzID0gW107CiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJv cGVydHlbMF0gPT09IHByZWZpeCkgdmFsdWVzLnB1c2godGhpc1twcm9wZXJ0eV0pOwogICAgcmV0 dXJuIHZhbHVlczsKICB9LAogIGVudHJpZXM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGVudHJpZXMg PSBbXTsKICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0g cHJlZml4KSBlbnRyaWVzLnB1c2goe2tleTogcHJvcGVydHkuc2xpY2UoMSksIHZhbHVlOiB0aGlz W3Byb3BlcnR5XX0pOwogICAgcmV0dXJuIGVudHJpZXM7CiAgfSwKICBzaXplOiBmdW5jdGlvbigp IHsKICAgIHZhciBzaXplID0gMDsKICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChw cm9wZXJ0eVswXSA9PT0gcHJlZml4KSArK3NpemU7CiAgICByZXR1cm4gc2l6ZTsKICB9LAogIGVt cHR5OiBmdW5jdGlvbigpIHsKICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9w ZXJ0eVswXSA9PT0gcHJlZml4KSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9LAog IGVhY2g6IGZ1bmN0aW9uKGYpIHsKICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChw cm9wZXJ0eVswXSA9PT0gcHJlZml4KSBmKHRoaXNbcHJvcGVydHldLCBwcm9wZXJ0eS5zbGljZSgx KSwgdGhpcyk7CiAgfQp9OwoKZnVuY3Rpb24gbWFwJDEob2JqZWN0LCBmKSB7CiAgdmFyIG1hcCA9 IG5ldyBNYXA7CgogIC8vIENvcHkgY29uc3RydWN0b3IuCiAgaWYgKG9iamVjdCBpbnN0YW5jZW9m IE1hcCkgb2JqZWN0LmVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkgeyBtYXAuc2V0KGtleSwgdmFs dWUpOyB9KTsKCiAgLy8gSW5kZXggYXJyYXkgYnkgbnVtZXJpYyBpbmRleCBvciBzcGVjaWZpZWQg a2V5IGZ1bmN0aW9uLgogIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob2JqZWN0KSkgewogICAgdmFy IGkgPSAtMSwKICAgICAgICBuID0gb2JqZWN0Lmxlbmd0aCwKICAgICAgICBvOwoKICAgIGlmIChm ID09IG51bGwpIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGksIG9iamVjdFtpXSk7CiAgICBlbHNl IHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGYobyA9IG9iamVjdFtpXSwgaSwgb2JqZWN0KSwgbyk7 CiAgfQoKICAvLyBDb252ZXJ0IG9iamVjdCB0byBtYXAuCiAgZWxzZSBpZiAob2JqZWN0KSBmb3Ig KHZhciBrZXkgaW4gb2JqZWN0KSBtYXAuc2V0KGtleSwgb2JqZWN0W2tleV0pOwoKICByZXR1cm4g bWFwOwp9CgpmdW5jdGlvbiBuZXN0KCkgewogIHZhciBrZXlzID0gW10sCiAgICAgIHNvcnRLZXlz ID0gW10sCiAgICAgIHNvcnRWYWx1ZXMsCiAgICAgIHJvbGx1cCwKICAgICAgbmVzdDsKCiAgZnVu Y3Rpb24gYXBwbHkoYXJyYXksIGRlcHRoLCBjcmVhdGVSZXN1bHQsIHNldFJlc3VsdCkgewogICAg aWYgKGRlcHRoID49IGtleXMubGVuZ3RoKSB7CiAgICAgIGlmIChzb3J0VmFsdWVzICE9IG51bGwp IGFycmF5LnNvcnQoc29ydFZhbHVlcyk7CiAgICAgIHJldHVybiByb2xsdXAgIT0gbnVsbCA/IHJv bGx1cChhcnJheSkgOiBhcnJheTsKICAgIH0KCiAgICB2YXIgaSA9IC0xLAogICAgICAgIG4gPSBh cnJheS5sZW5ndGgsCiAgICAgICAga2V5ID0ga2V5c1tkZXB0aCsrXSwKICAgICAgICBrZXlWYWx1 ZSwKICAgICAgICB2YWx1ZSwKICAgICAgICB2YWx1ZXNCeUtleSA9IG1hcCQxKCksCiAgICAgICAg dmFsdWVzLAogICAgICAgIHJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpOwoKICAgIHdoaWxlICgrK2kg PCBuKSB7CiAgICAgIGlmICh2YWx1ZXMgPSB2YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWUgPSBrZXko dmFsdWUgPSBhcnJheVtpXSkgKyAiIikpIHsKICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7CiAg ICAgIH0gZWxzZSB7CiAgICAgICAgdmFsdWVzQnlLZXkuc2V0KGtleVZhbHVlLCBbdmFsdWVdKTsK ICAgICAgfQogICAgfQoKICAgIHZhbHVlc0J5S2V5LmVhY2goZnVuY3Rpb24odmFsdWVzLCBrZXkp IHsKICAgICAgc2V0UmVzdWx0KHJlc3VsdCwga2V5LCBhcHBseSh2YWx1ZXMsIGRlcHRoLCBjcmVh dGVSZXN1bHQsIHNldFJlc3VsdCkpOwogICAgfSk7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9Cgog IGZ1bmN0aW9uIGVudHJpZXMobWFwLCBkZXB0aCkgewogICAgaWYgKCsrZGVwdGggPiBrZXlzLmxl bmd0aCkgcmV0dXJuIG1hcDsKICAgIHZhciBhcnJheSwgc29ydEtleSA9IHNvcnRLZXlzW2RlcHRo IC0gMV07CiAgICBpZiAocm9sbHVwICE9IG51bGwgJiYgZGVwdGggPj0ga2V5cy5sZW5ndGgpIGFy cmF5ID0gbWFwLmVudHJpZXMoKTsKICAgIGVsc2UgYXJyYXkgPSBbXSwgbWFwLmVhY2goZnVuY3Rp b24odiwgaykgeyBhcnJheS5wdXNoKHtrZXk6IGssIHZhbHVlczogZW50cmllcyh2LCBkZXB0aCl9 KTsgfSk7CiAgICByZXR1cm4gc29ydEtleSAhPSBudWxsID8gYXJyYXkuc29ydChmdW5jdGlvbihh LCBiKSB7IHJldHVybiBzb3J0S2V5KGEua2V5LCBiLmtleSk7IH0pIDogYXJyYXk7CiAgfQoKICBy ZXR1cm4gbmVzdCA9IHsKICAgIG9iamVjdDogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGFwcGx5 KGFycmF5LCAwLCBjcmVhdGVPYmplY3QsIHNldE9iamVjdCk7IH0sCiAgICBtYXA6IGZ1bmN0aW9u KGFycmF5KSB7IHJldHVybiBhcHBseShhcnJheSwgMCwgY3JlYXRlTWFwLCBzZXRNYXApOyB9LAog ICAgZW50cmllczogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGVudHJpZXMoYXBwbHkoYXJyYXks IDAsIGNyZWF0ZU1hcCwgc2V0TWFwKSwgMCk7IH0sCiAgICBrZXk6IGZ1bmN0aW9uKGQpIHsga2V5 cy5wdXNoKGQpOyByZXR1cm4gbmVzdDsgfSwKICAgIHNvcnRLZXlzOiBmdW5jdGlvbihvcmRlcikg eyBzb3J0S2V5c1trZXlzLmxlbmd0aCAtIDFdID0gb3JkZXI7IHJldHVybiBuZXN0OyB9LAogICAg c29ydFZhbHVlczogZnVuY3Rpb24ob3JkZXIpIHsgc29ydFZhbHVlcyA9IG9yZGVyOyByZXR1cm4g bmVzdDsgfSwKICAgIHJvbGx1cDogZnVuY3Rpb24oZikgeyByb2xsdXAgPSBmOyByZXR1cm4gbmVz dDsgfQogIH07Cn0KCmZ1bmN0aW9uIGNyZWF0ZU9iamVjdCgpIHsKICByZXR1cm4ge307Cn0KCmZ1 bmN0aW9uIHNldE9iamVjdChvYmplY3QsIGtleSwgdmFsdWUpIHsKICBvYmplY3Rba2V5XSA9IHZh bHVlOwp9CgpmdW5jdGlvbiBjcmVhdGVNYXAoKSB7CiAgcmV0dXJuIG1hcCQxKCk7Cn0KCmZ1bmN0 aW9uIHNldE1hcChtYXAsIGtleSwgdmFsdWUpIHsKICBtYXAuc2V0KGtleSwgdmFsdWUpOwp9Cgpm dW5jdGlvbiBTZXQoKSB7fQoKdmFyIHByb3RvID0gbWFwJDEucHJvdG90eXBlOwoKU2V0LnByb3Rv dHlwZSA9IHNldCQyLnByb3RvdHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogU2V0LAogIGhhczogcHJv dG8uaGFzLAogIGFkZDogZnVuY3Rpb24odmFsdWUpIHsKICAgIHZhbHVlICs9ICIiOwogICAgdGhp c1twcmVmaXggKyB2YWx1ZV0gPSB2YWx1ZTsKICAgIHJldHVybiB0aGlzOwogIH0sCiAgcmVtb3Zl OiBwcm90by5yZW1vdmUsCiAgY2xlYXI6IHByb3RvLmNsZWFyLAogIHZhbHVlczogcHJvdG8ua2V5 cywKICBzaXplOiBwcm90by5zaXplLAogIGVtcHR5OiBwcm90by5lbXB0eSwKICBlYWNoOiBwcm90 by5lYWNoCn07CgpmdW5jdGlvbiBzZXQkMihvYmplY3QsIGYpIHsKICB2YXIgc2V0ID0gbmV3IFNl dDsKCiAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2V0KSBv YmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSkgeyBzZXQuYWRkKHZhbHVlKTsgfSk7CgogIC8vIE90 aGVyd2lzZSwgYXNzdW1lIGl04oCZcyBhbiBhcnJheS4KICBlbHNlIGlmIChvYmplY3QpIHsKICAg IHZhciBpID0gLTEsIG4gPSBvYmplY3QubGVuZ3RoOwogICAgaWYgKGYgPT0gbnVsbCkgd2hpbGUg KCsraSA8IG4pIHNldC5hZGQob2JqZWN0W2ldKTsKICAgIGVsc2Ugd2hpbGUgKCsraSA8IG4pIHNl dC5hZGQoZihvYmplY3RbaV0sIGksIG9iamVjdCkpOwogIH0KCiAgcmV0dXJuIHNldDsKfQoKZnVu Y3Rpb24ga2V5cyhtYXApIHsKICB2YXIga2V5cyA9IFtdOwogIGZvciAodmFyIGtleSBpbiBtYXAp IGtleXMucHVzaChrZXkpOwogIHJldHVybiBrZXlzOwp9CgpmdW5jdGlvbiB2YWx1ZXMobWFwKSB7 CiAgdmFyIHZhbHVlcyA9IFtdOwogIGZvciAodmFyIGtleSBpbiBtYXApIHZhbHVlcy5wdXNoKG1h cFtrZXldKTsKICByZXR1cm4gdmFsdWVzOwp9CgpmdW5jdGlvbiBlbnRyaWVzKG1hcCkgewogIHZh ciBlbnRyaWVzID0gW107CiAgZm9yICh2YXIga2V5IGluIG1hcCkgZW50cmllcy5wdXNoKHtrZXk6 IGtleSwgdmFsdWU6IG1hcFtrZXldfSk7CiAgcmV0dXJuIGVudHJpZXM7Cn0KCnZhciBhcnJheSQy ID0gQXJyYXkucHJvdG90eXBlOwoKdmFyIHNsaWNlJDMgPSBhcnJheSQyLnNsaWNlOwoKZnVuY3Rp b24gYXNjZW5kaW5nJDIoYSwgYikgewogIHJldHVybiBhIC0gYjsKfQoKZnVuY3Rpb24gYXJlYShy aW5nKSB7CiAgdmFyIGkgPSAwLCBuID0gcmluZy5sZW5ndGgsIGFyZWEgPSByaW5nW24gLSAxXVsx XSAqIHJpbmdbMF1bMF0gLSByaW5nW24gLSAxXVswXSAqIHJpbmdbMF1bMV07CiAgd2hpbGUgKCsr aSA8IG4pIGFyZWEgKz0gcmluZ1tpIC0gMV1bMV0gKiByaW5nW2ldWzBdIC0gcmluZ1tpIC0gMV1b MF0gKiByaW5nW2ldWzFdOwogIHJldHVybiBhcmVhOwp9CgpmdW5jdGlvbiBjb25zdGFudCQ2KHgp IHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geDsKICB9Owp9CgpmdW5jdGlvbiBj b250YWlucyhyaW5nLCBob2xlKSB7CiAgdmFyIGkgPSAtMSwgbiA9IGhvbGUubGVuZ3RoLCBjOwog IHdoaWxlICgrK2kgPCBuKSBpZiAoYyA9IHJpbmdDb250YWlucyhyaW5nLCBob2xlW2ldKSkgcmV0 dXJuIGM7CiAgcmV0dXJuIDA7Cn0KCmZ1bmN0aW9uIHJpbmdDb250YWlucyhyaW5nLCBwb2ludCkg ewogIHZhciB4ID0gcG9pbnRbMF0sIHkgPSBwb2ludFsxXSwgY29udGFpbnMgPSAtMTsKICBmb3Ig KHZhciBpID0gMCwgbiA9IHJpbmcubGVuZ3RoLCBqID0gbiAtIDE7IGkgPCBuOyBqID0gaSsrKSB7 CiAgICB2YXIgcGkgPSByaW5nW2ldLCB4aSA9IHBpWzBdLCB5aSA9IHBpWzFdLCBwaiA9IHJpbmdb al0sIHhqID0gcGpbMF0sIHlqID0gcGpbMV07CiAgICBpZiAoc2VnbWVudENvbnRhaW5zKHBpLCBw aiwgcG9pbnQpKSByZXR1cm4gMDsKICAgIGlmICgoKHlpID4geSkgIT09ICh5aiA+IHkpKSAmJiAo KHggPCAoeGogLSB4aSkgKiAoeSAtIHlpKSAvICh5aiAtIHlpKSArIHhpKSkpIGNvbnRhaW5zID0g LWNvbnRhaW5zOwogIH0KICByZXR1cm4gY29udGFpbnM7Cn0KCmZ1bmN0aW9uIHNlZ21lbnRDb250 YWlucyhhLCBiLCBjKSB7CiAgdmFyIGk7IHJldHVybiBjb2xsaW5lYXIoYSwgYiwgYykgJiYgd2l0 aGluKGFbaSA9ICsoYVswXSA9PT0gYlswXSldLCBjW2ldLCBiW2ldKTsKfQoKZnVuY3Rpb24gY29s bGluZWFyKGEsIGIsIGMpIHsKICByZXR1cm4gKGJbMF0gLSBhWzBdKSAqIChjWzFdIC0gYVsxXSkg PT09IChjWzBdIC0gYVswXSkgKiAoYlsxXSAtIGFbMV0pOwp9CgpmdW5jdGlvbiB3aXRoaW4ocCwg cSwgcikgewogIHJldHVybiBwIDw9IHEgJiYgcSA8PSByIHx8IHIgPD0gcSAmJiBxIDw9IHA7Cn0K CmZ1bmN0aW9uIG5vb3AkMSgpIHt9Cgp2YXIgY2FzZXMgPSBbCiAgW10sCiAgW1tbMS4wLCAxLjVd LCBbMC41LCAxLjBdXV0sCiAgW1tbMS41LCAxLjBdLCBbMS4wLCAxLjVdXV0sCiAgW1tbMS41LCAx LjBdLCBbMC41LCAxLjBdXV0sCiAgW1tbMS4wLCAwLjVdLCBbMS41LCAxLjBdXV0sCiAgW1tbMS4w LCAxLjVdLCBbMC41LCAxLjBdXSwgW1sxLjAsIDAuNV0sIFsxLjUsIDEuMF1dXSwKICBbW1sxLjAs IDAuNV0sIFsxLjAsIDEuNV1dXSwKICBbW1sxLjAsIDAuNV0sIFswLjUsIDEuMF1dXSwKICBbW1sw LjUsIDEuMF0sIFsxLjAsIDAuNV1dXSwKICBbW1sxLjAsIDEuNV0sIFsxLjAsIDAuNV1dXSwKICBb W1swLjUsIDEuMF0sIFsxLjAsIDAuNV1dLCBbWzEuNSwgMS4wXSwgWzEuMCwgMS41XV1dLAogIFtb WzEuNSwgMS4wXSwgWzEuMCwgMC41XV1dLAogIFtbWzAuNSwgMS4wXSwgWzEuNSwgMS4wXV1dLAog IFtbWzEuMCwgMS41XSwgWzEuNSwgMS4wXV1dLAogIFtbWzAuNSwgMS4wXSwgWzEuMCwgMS41XV1d LAogIFtdCl07CgpmdW5jdGlvbiBjb250b3VycygpIHsKICB2YXIgZHggPSAxLAogICAgICBkeSA9 IDEsCiAgICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZFN0dXJnZXMsCiAgICAgIHNtb290aCA9IHNt b290aExpbmVhcjsKCiAgZnVuY3Rpb24gY29udG91cnModmFsdWVzKSB7CiAgICB2YXIgdHogPSB0 aHJlc2hvbGQodmFsdWVzKTsKCiAgICAvLyBDb252ZXJ0IG51bWJlciBvZiB0aHJlc2hvbGRzIGlu dG8gdW5pZm9ybSB0aHJlc2hvbGRzLgogICAgaWYgKCFBcnJheS5pc0FycmF5KHR6KSkgewogICAg ICB2YXIgZG9tYWluID0gZXh0ZW50KHZhbHVlcyksIHN0YXJ0ID0gZG9tYWluWzBdLCBzdG9wID0g ZG9tYWluWzFdOwogICAgICB0eiA9IHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCB0eik7CiAgICAgIHR6 ID0gc2VxdWVuY2UoTWF0aC5mbG9vcihzdGFydCAvIHR6KSAqIHR6LCBNYXRoLmZsb29yKHN0b3Ag LyB0eikgKiB0eiwgdHopOwogICAgfSBlbHNlIHsKICAgICAgdHogPSB0ei5zbGljZSgpLnNvcnQo YXNjZW5kaW5nJDIpOwogICAgfQoKICAgIHJldHVybiB0ei5tYXAoZnVuY3Rpb24odmFsdWUpIHsK ICAgICAgcmV0dXJuIGNvbnRvdXIodmFsdWVzLCB2YWx1ZSk7CiAgICB9KTsKICB9CgogIC8vIEFj Y3VtdWxhdGUsIHNtb290aCBjb250b3VyIHJpbmdzLCBhc3NpZ24gaG9sZXMgdG8gZXh0ZXJpb3Ig cmluZ3MuCiAgLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL21ib3N0b2NrL3NoYXBlZmls ZS9ibG9iL3YwLjYuMi9zaHAvcG9seWdvbi5qcwogIGZ1bmN0aW9uIGNvbnRvdXIodmFsdWVzLCB2 YWx1ZSkgewogICAgdmFyIHBvbHlnb25zID0gW10sCiAgICAgICAgaG9sZXMgPSBbXTsKCiAgICBp c29yaW5ncyh2YWx1ZXMsIHZhbHVlLCBmdW5jdGlvbihyaW5nKSB7CiAgICAgIHNtb290aChyaW5n LCB2YWx1ZXMsIHZhbHVlKTsKICAgICAgaWYgKGFyZWEocmluZykgPiAwKSBwb2x5Z29ucy5wdXNo KFtyaW5nXSk7CiAgICAgIGVsc2UgaG9sZXMucHVzaChyaW5nKTsKICAgIH0pOwoKICAgIGhvbGVz LmZvckVhY2goZnVuY3Rpb24oaG9sZSkgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHBvbHln b25zLmxlbmd0aCwgcG9seWdvbjsgaSA8IG47ICsraSkgewogICAgICAgIGlmIChjb250YWlucygo cG9seWdvbiA9IHBvbHlnb25zW2ldKVswXSwgaG9sZSkgIT09IC0xKSB7CiAgICAgICAgICBwb2x5 Z29uLnB1c2goaG9sZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICB9CiAgICB9 KTsKCiAgICByZXR1cm4gewogICAgICB0eXBlOiAiTXVsdGlQb2x5Z29uIiwKICAgICAgdmFsdWU6 IHZhbHVlLAogICAgICBjb29yZGluYXRlczogcG9seWdvbnMKICAgIH07CiAgfQoKICAvLyBNYXJj aGluZyBzcXVhcmVzIHdpdGggaXNvbGluZXMgc3RpdGNoZWQgaW50byByaW5ncy4KICAvLyBCYXNl ZCBvbiBodHRwczovL2dpdGh1Yi5jb20vdG9wb2pzb24vdG9wb2pzb24tY2xpZW50L2Jsb2IvdjMu MC4wL3NyYy9zdGl0Y2guanMKICBmdW5jdGlvbiBpc29yaW5ncyh2YWx1ZXMsIHZhbHVlLCBjYWxs YmFjaykgewogICAgdmFyIGZyYWdtZW50QnlTdGFydCA9IG5ldyBBcnJheSwKICAgICAgICBmcmFn bWVudEJ5RW5kID0gbmV3IEFycmF5LAogICAgICAgIHgsIHksIHQwLCB0MSwgdDIsIHQzOwoKICAg IC8vIFNwZWNpYWwgY2FzZSBmb3IgdGhlIGZpcnN0IHJvdyAoeSA9IC0xLCB0MiA9IHQzID0gMCku CiAgICB4ID0geSA9IC0xOwogICAgdDEgPSB2YWx1ZXNbMF0gPj0gdmFsdWU7CiAgICBjYXNlc1t0 MSA8PCAxXS5mb3JFYWNoKHN0aXRjaCk7CiAgICB3aGlsZSAoKyt4IDwgZHggLSAxKSB7CiAgICAg IHQwID0gdDEsIHQxID0gdmFsdWVzW3ggKyAxXSA+PSB2YWx1ZTsKICAgICAgY2FzZXNbdDAgfCB0 MSA8PCAxXS5mb3JFYWNoKHN0aXRjaCk7CiAgICB9CiAgICBjYXNlc1t0MSA8PCAwXS5mb3JFYWNo KHN0aXRjaCk7CgogICAgLy8gR2VuZXJhbCBjYXNlIGZvciB0aGUgaW50ZXJtZWRpYXRlIHJvd3Mu CiAgICB3aGlsZSAoKyt5IDwgZHkgLSAxKSB7CiAgICAgIHggPSAtMTsKICAgICAgdDEgPSB2YWx1 ZXNbeSAqIGR4ICsgZHhdID49IHZhbHVlOwogICAgICB0MiA9IHZhbHVlc1t5ICogZHhdID49IHZh bHVlOwogICAgICBjYXNlc1t0MSA8PCAxIHwgdDIgPDwgMl0uZm9yRWFjaChzdGl0Y2gpOwogICAg ICB3aGlsZSAoKyt4IDwgZHggLSAxKSB7CiAgICAgICAgdDAgPSB0MSwgdDEgPSB2YWx1ZXNbeSAq IGR4ICsgZHggKyB4ICsgMV0gPj0gdmFsdWU7CiAgICAgICAgdDMgPSB0MiwgdDIgPSB2YWx1ZXNb eSAqIGR4ICsgeCArIDFdID49IHZhbHVlOwogICAgICAgIGNhc2VzW3QwIHwgdDEgPDwgMSB8IHQy IDw8IDIgfCB0MyA8PCAzXS5mb3JFYWNoKHN0aXRjaCk7CiAgICAgIH0KICAgICAgY2FzZXNbdDEg fCB0MiA8PCAzXS5mb3JFYWNoKHN0aXRjaCk7CiAgICB9CgogICAgLy8gU3BlY2lhbCBjYXNlIGZv ciB0aGUgbGFzdCByb3cgKHkgPSBkeSAtIDEsIHQwID0gdDEgPSAwKS4KICAgIHggPSAtMTsKICAg IHQyID0gdmFsdWVzW3kgKiBkeF0gPj0gdmFsdWU7CiAgICBjYXNlc1t0MiA8PCAyXS5mb3JFYWNo KHN0aXRjaCk7CiAgICB3aGlsZSAoKyt4IDwgZHggLSAxKSB7CiAgICAgIHQzID0gdDIsIHQyID0g dmFsdWVzW3kgKiBkeCArIHggKyAxXSA+PSB2YWx1ZTsKICAgICAgY2FzZXNbdDIgPDwgMiB8IHQz IDw8IDNdLmZvckVhY2goc3RpdGNoKTsKICAgIH0KICAgIGNhc2VzW3QyIDw8IDNdLmZvckVhY2go c3RpdGNoKTsKCiAgICBmdW5jdGlvbiBzdGl0Y2gobGluZSkgewogICAgICB2YXIgc3RhcnQgPSBb bGluZVswXVswXSArIHgsIGxpbmVbMF1bMV0gKyB5XSwKICAgICAgICAgIGVuZCA9IFtsaW5lWzFd WzBdICsgeCwgbGluZVsxXVsxXSArIHldLAogICAgICAgICAgc3RhcnRJbmRleCA9IGluZGV4KHN0 YXJ0KSwKICAgICAgICAgIGVuZEluZGV4ID0gaW5kZXgoZW5kKSwKICAgICAgICAgIGYsIGc7CiAg ICAgIGlmIChmID0gZnJhZ21lbnRCeUVuZFtzdGFydEluZGV4XSkgewogICAgICAgIGlmIChnID0g ZnJhZ21lbnRCeVN0YXJ0W2VuZEluZGV4XSkgewogICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlF bmRbZi5lbmRdOwogICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlTdGFydFtnLnN0YXJ0XTsKICAg ICAgICAgIGlmIChmID09PSBnKSB7CiAgICAgICAgICAgIGYucmluZy5wdXNoKGVuZCk7CiAgICAg ICAgICAgIGNhbGxiYWNrKGYucmluZyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBm cmFnbWVudEJ5U3RhcnRbZi5zdGFydF0gPSBmcmFnbWVudEJ5RW5kW2cuZW5kXSA9IHtzdGFydDog Zi5zdGFydCwgZW5kOiBnLmVuZCwgcmluZzogZi5yaW5nLmNvbmNhdChnLnJpbmcpfTsKICAgICAg ICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlFbmRbZi5l bmRdOwogICAgICAgICAgZi5yaW5nLnB1c2goZW5kKTsKICAgICAgICAgIGZyYWdtZW50QnlFbmRb Zi5lbmQgPSBlbmRJbmRleF0gPSBmOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChmID0gZnJh Z21lbnRCeVN0YXJ0W2VuZEluZGV4XSkgewogICAgICAgIGlmIChnID0gZnJhZ21lbnRCeUVuZFtz dGFydEluZGV4XSkgewogICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlTdGFydFtmLnN0YXJ0XTsK ICAgICAgICAgIGRlbGV0ZSBmcmFnbWVudEJ5RW5kW2cuZW5kXTsKICAgICAgICAgIGlmIChmID09 PSBnKSB7CiAgICAgICAgICAgIGYucmluZy5wdXNoKGVuZCk7CiAgICAgICAgICAgIGNhbGxiYWNr KGYucmluZyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmcmFnbWVudEJ5U3RhcnRb Zy5zdGFydF0gPSBmcmFnbWVudEJ5RW5kW2YuZW5kXSA9IHtzdGFydDogZy5zdGFydCwgZW5kOiBm LmVuZCwgcmluZzogZy5yaW5nLmNvbmNhdChmLnJpbmcpfTsKICAgICAgICAgIH0KICAgICAgICB9 IGVsc2UgewogICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlTdGFydFtmLnN0YXJ0XTsKICAgICAg ICAgIGYucmluZy51bnNoaWZ0KHN0YXJ0KTsKICAgICAgICAgIGZyYWdtZW50QnlTdGFydFtmLnN0 YXJ0ID0gc3RhcnRJbmRleF0gPSBmOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBm cmFnbWVudEJ5U3RhcnRbc3RhcnRJbmRleF0gPSBmcmFnbWVudEJ5RW5kW2VuZEluZGV4XSA9IHtz dGFydDogc3RhcnRJbmRleCwgZW5kOiBlbmRJbmRleCwgcmluZzogW3N0YXJ0LCBlbmRdfTsKICAg ICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5kZXgocG9pbnQpIHsKICAgIHJldHVybiBwb2lu dFswXSAqIDIgKyBwb2ludFsxXSAqIChkeCArIDEpICogNDsKICB9CgogIGZ1bmN0aW9uIHNtb290 aExpbmVhcihyaW5nLCB2YWx1ZXMsIHZhbHVlKSB7CiAgICByaW5nLmZvckVhY2goZnVuY3Rpb24o cG9pbnQpIHsKICAgICAgdmFyIHggPSBwb2ludFswXSwKICAgICAgICAgIHkgPSBwb2ludFsxXSwK ICAgICAgICAgIHh0ID0geCB8IDAsCiAgICAgICAgICB5dCA9IHkgfCAwLAogICAgICAgICAgdjAs CiAgICAgICAgICB2MSA9IHZhbHVlc1t5dCAqIGR4ICsgeHRdOwogICAgICBpZiAoeCA+IDAgJiYg eCA8IGR4ICYmIHh0ID09PSB4KSB7CiAgICAgICAgdjAgPSB2YWx1ZXNbeXQgKiBkeCArIHh0IC0g MV07CiAgICAgICAgcG9pbnRbMF0gPSB4ICsgKHZhbHVlIC0gdjApIC8gKHYxIC0gdjApIC0gMC41 OwogICAgICB9CiAgICAgIGlmICh5ID4gMCAmJiB5IDwgZHkgJiYgeXQgPT09IHkpIHsKICAgICAg ICB2MCA9IHZhbHVlc1soeXQgLSAxKSAqIGR4ICsgeHRdOwogICAgICAgIHBvaW50WzFdID0geSAr ICh2YWx1ZSAtIHYwKSAvICh2MSAtIHYwKSAtIDAuNTsKICAgICAgfQogICAgfSk7CiAgfQoKICBj b250b3Vycy5jb250b3VyID0gY29udG91cjsKCiAgY29udG91cnMuc2l6ZSA9IGZ1bmN0aW9uKF8p IHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFtkeCwgZHldOwogICAgdmFyIF8w ID0gTWF0aC5jZWlsKF9bMF0pLCBfMSA9IE1hdGguY2VpbChfWzFdKTsKICAgIGlmICghKF8wID4g MCkgfHwgIShfMSA+IDApKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2l6ZSIpOwogICAgcmV0 dXJuIGR4ID0gXzAsIGR5ID0gXzEsIGNvbnRvdXJzOwogIH07CgogIGNvbnRvdXJzLnRocmVzaG9s ZHMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aHJlc2hv bGQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBBcnJheS5pc0FycmF5KF8pID8gY29u c3RhbnQkNihzbGljZSQzLmNhbGwoXykpIDogY29uc3RhbnQkNihfKSwgY29udG91cnMpIDogdGhy ZXNob2xkOwogIH07CgogIGNvbnRvdXJzLnNtb290aCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVy biBhcmd1bWVudHMubGVuZ3RoID8gKHNtb290aCA9IF8gPyBzbW9vdGhMaW5lYXIgOiBub29wJDEs IGNvbnRvdXJzKSA6IHNtb290aCA9PT0gc21vb3RoTGluZWFyOwogIH07CgogIHJldHVybiBjb250 b3VyczsKfQoKLy8gVE9ETyBPcHRpbWl6ZSBlZGdlIGNhc2VzLgovLyBUT0RPIE9wdGltaXplIGlu ZGV4IGNhbGN1bGF0aW9uLgovLyBUT0RPIE9wdGltaXplIGFyZ3VtZW50cy4KZnVuY3Rpb24gYmx1 clgoc291cmNlLCB0YXJnZXQsIHIpIHsKICB2YXIgbiA9IHNvdXJjZS53aWR0aCwKICAgICAgbSA9 IHNvdXJjZS5oZWlnaHQsCiAgICAgIHcgPSAociA8PCAxKSArIDE7CiAgZm9yICh2YXIgaiA9IDA7 IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGkgPSAwLCBzciA9IDA7IGkgPCBuICsgcjsgKytp KSB7CiAgICAgIGlmIChpIDwgbikgewogICAgICAgIHNyICs9IHNvdXJjZS5kYXRhW2kgKyBqICog bl07CiAgICAgIH0KICAgICAgaWYgKGkgPj0gcikgewogICAgICAgIGlmIChpID49IHcpIHsKICAg ICAgICAgIHNyIC09IHNvdXJjZS5kYXRhW2kgLSB3ICsgaiAqIG5dOwogICAgICAgIH0KICAgICAg ICB0YXJnZXQuZGF0YVtpIC0gciArIGogKiBuXSA9IHNyIC8gTWF0aC5taW4oaSArIDEsIG4gLSAx ICsgdyAtIGksIHcpOwogICAgICB9CiAgICB9CiAgfQp9CgovLyBUT0RPIE9wdGltaXplIGVkZ2Ug Y2FzZXMuCi8vIFRPRE8gT3B0aW1pemUgaW5kZXggY2FsY3VsYXRpb24uCi8vIFRPRE8gT3B0aW1p emUgYXJndW1lbnRzLgpmdW5jdGlvbiBibHVyWShzb3VyY2UsIHRhcmdldCwgcikgewogIHZhciBu ID0gc291cmNlLndpZHRoLAogICAgICBtID0gc291cmNlLmhlaWdodCwKICAgICAgdyA9IChyIDw8 IDEpICsgMTsKICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgewogICAgZm9yICh2YXIgaiA9 IDAsIHNyID0gMDsgaiA8IG0gKyByOyArK2opIHsKICAgICAgaWYgKGogPCBtKSB7CiAgICAgICAg c3IgKz0gc291cmNlLmRhdGFbaSArIGogKiBuXTsKICAgICAgfQogICAgICBpZiAoaiA+PSByKSB7 CiAgICAgICAgaWYgKGogPj0gdykgewogICAgICAgICAgc3IgLT0gc291cmNlLmRhdGFbaSArIChq IC0gdykgKiBuXTsKICAgICAgICB9CiAgICAgICAgdGFyZ2V0LmRhdGFbaSArIChqIC0gcikgKiBu XSA9IHNyIC8gTWF0aC5taW4oaiArIDEsIG0gLSAxICsgdyAtIGosIHcpOwogICAgICB9CiAgICB9 CiAgfQp9CgpmdW5jdGlvbiBkZWZhdWx0WChkKSB7CiAgcmV0dXJuIGRbMF07Cn0KCmZ1bmN0aW9u IGRlZmF1bHRZKGQpIHsKICByZXR1cm4gZFsxXTsKfQoKZnVuY3Rpb24gZGVmYXVsdFdlaWdodCgp IHsKICByZXR1cm4gMTsKfQoKZnVuY3Rpb24gZGVuc2l0eSgpIHsKICB2YXIgeCA9IGRlZmF1bHRY LAogICAgICB5ID0gZGVmYXVsdFksCiAgICAgIHdlaWdodCA9IGRlZmF1bHRXZWlnaHQsCiAgICAg IGR4ID0gOTYwLAogICAgICBkeSA9IDUwMCwKICAgICAgciA9IDIwLCAvLyBibHVyIHJhZGl1cwog ICAgICBrID0gMiwgLy8gbG9nMihncmlkIGNlbGwgc2l6ZSkKICAgICAgbyA9IHIgKiAzLCAvLyBn cmlkIG9mZnNldCwgdG8gcGFkIGZvciBibHVyCiAgICAgIG4gPSAoZHggKyBvICogMikgPj4gaywg Ly8gZ3JpZCB3aWR0aAogICAgICBtID0gKGR5ICsgbyAqIDIpID4+IGssIC8vIGdyaWQgaGVpZ2h0 CiAgICAgIHRocmVzaG9sZCA9IGNvbnN0YW50JDYoMjApOwoKICBmdW5jdGlvbiBkZW5zaXR5KGRh dGEpIHsKICAgIHZhciB2YWx1ZXMwID0gbmV3IEZsb2F0MzJBcnJheShuICogbSksCiAgICAgICAg dmFsdWVzMSA9IG5ldyBGbG9hdDMyQXJyYXkobiAqIG0pOwoKICAgIGRhdGEuZm9yRWFjaChmdW5j dGlvbihkLCBpLCBkYXRhKSB7CiAgICAgIHZhciB4aSA9ICgreChkLCBpLCBkYXRhKSArIG8pID4+ IGssCiAgICAgICAgICB5aSA9ICgreShkLCBpLCBkYXRhKSArIG8pID4+IGssCiAgICAgICAgICB3 aSA9ICt3ZWlnaHQoZCwgaSwgZGF0YSk7CiAgICAgIGlmICh4aSA+PSAwICYmIHhpIDwgbiAmJiB5 aSA+PSAwICYmIHlpIDwgbSkgewogICAgICAgIHZhbHVlczBbeGkgKyB5aSAqIG5dICs9IHdpOwog ICAgICB9CiAgICB9KTsKCiAgICAvLyBUT0RPIE9wdGltaXplLgogICAgYmx1clgoe3dpZHRoOiBu LCBoZWlnaHQ6IG0sIGRhdGE6IHZhbHVlczB9LCB7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTog dmFsdWVzMX0sIHIgPj4gayk7CiAgICBibHVyWSh7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTog dmFsdWVzMX0sIHt3aWR0aDogbiwgaGVpZ2h0OiBtLCBkYXRhOiB2YWx1ZXMwfSwgciA+PiBrKTsK ICAgIGJsdXJYKHt3aWR0aDogbiwgaGVpZ2h0OiBtLCBkYXRhOiB2YWx1ZXMwfSwge3dpZHRoOiBu LCBoZWlnaHQ6IG0sIGRhdGE6IHZhbHVlczF9LCByID4+IGspOwogICAgYmx1clkoe3dpZHRoOiBu LCBoZWlnaHQ6IG0sIGRhdGE6IHZhbHVlczF9LCB7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTog dmFsdWVzMH0sIHIgPj4gayk7CiAgICBibHVyWCh7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTog dmFsdWVzMH0sIHt3aWR0aDogbiwgaGVpZ2h0OiBtLCBkYXRhOiB2YWx1ZXMxfSwgciA+PiBrKTsK ICAgIGJsdXJZKHt3aWR0aDogbiwgaGVpZ2h0OiBtLCBkYXRhOiB2YWx1ZXMxfSwge3dpZHRoOiBu LCBoZWlnaHQ6IG0sIGRhdGE6IHZhbHVlczB9LCByID4+IGspOwoKICAgIHZhciB0eiA9IHRocmVz aG9sZCh2YWx1ZXMwKTsKCiAgICAvLyBDb252ZXJ0IG51bWJlciBvZiB0aHJlc2hvbGRzIGludG8g dW5pZm9ybSB0aHJlc2hvbGRzLgogICAgaWYgKCFBcnJheS5pc0FycmF5KHR6KSkgewogICAgICB2 YXIgc3RvcCA9IG1heCh2YWx1ZXMwKTsKICAgICAgdHogPSB0aWNrU3RlcCgwLCBzdG9wLCB0eik7 CiAgICAgIHR6ID0gc2VxdWVuY2UoMCwgTWF0aC5mbG9vcihzdG9wIC8gdHopICogdHosIHR6KTsK ICAgICAgdHouc2hpZnQoKTsKICAgIH0KCiAgICByZXR1cm4gY29udG91cnMoKQogICAgICAgIC50 aHJlc2hvbGRzKHR6KQogICAgICAgIC5zaXplKFtuLCBtXSkKICAgICAgKHZhbHVlczApCiAgICAg ICAgLm1hcCh0cmFuc2Zvcm0pOwogIH0KCiAgZnVuY3Rpb24gdHJhbnNmb3JtKGdlb21ldHJ5KSB7 CiAgICBnZW9tZXRyeS52YWx1ZSAqPSBNYXRoLnBvdygyLCAtMiAqIGspOyAvLyBEZW5zaXR5IGlu IHBvaW50cyBwZXIgc3F1YXJlIHBpeGVsLgogICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMuZm9yRWFj aCh0cmFuc2Zvcm1Qb2x5Z29uKTsKICAgIHJldHVybiBnZW9tZXRyeTsKICB9CgogIGZ1bmN0aW9u IHRyYW5zZm9ybVBvbHlnb24oY29vcmRpbmF0ZXMpIHsKICAgIGNvb3JkaW5hdGVzLmZvckVhY2go dHJhbnNmb3JtUmluZyk7CiAgfQoKICBmdW5jdGlvbiB0cmFuc2Zvcm1SaW5nKGNvb3JkaW5hdGVz KSB7CiAgICBjb29yZGluYXRlcy5mb3JFYWNoKHRyYW5zZm9ybVBvaW50KTsKICB9CgogIC8vIFRP RE8gT3B0aW1pemUuCiAgZnVuY3Rpb24gdHJhbnNmb3JtUG9pbnQoY29vcmRpbmF0ZXMpIHsKICAg IGNvb3JkaW5hdGVzWzBdID0gY29vcmRpbmF0ZXNbMF0gKiBNYXRoLnBvdygyLCBrKSAtIG87CiAg ICBjb29yZGluYXRlc1sxXSA9IGNvb3JkaW5hdGVzWzFdICogTWF0aC5wb3coMiwgaykgLSBvOwog IH0KCiAgZnVuY3Rpb24gcmVzaXplKCkgewogICAgbyA9IHIgKiAzOwogICAgbiA9IChkeCArIG8g KiAyKSA+PiBrOwogICAgbSA9IChkeSArIG8gKiAyKSA+PiBrOwogICAgcmV0dXJuIGRlbnNpdHk7 CiAgfQoKICBkZW5zaXR5LnggPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNigrXyks IGRlbnNpdHkpIDogeDsKICB9OwoKICBkZW5zaXR5LnkgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1 cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDog Y29uc3RhbnQkNigrXyksIGRlbnNpdHkpIDogeTsKICB9OwoKICBkZW5zaXR5LndlaWdodCA9IGZ1 bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdlaWdodCA9IHR5cGVv ZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDYoK18pLCBkZW5zaXR5KSA6IHdlaWdo dDsKICB9OwoKICBkZW5zaXR5LnNpemUgPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50 cy5sZW5ndGgpIHJldHVybiBbZHgsIGR5XTsKICAgIHZhciBfMCA9IE1hdGguY2VpbChfWzBdKSwg XzEgPSBNYXRoLmNlaWwoX1sxXSk7CiAgICBpZiAoIShfMCA+PSAwKSAmJiAhKF8wID49IDApKSB0 aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2l6ZSIpOwogICAgcmV0dXJuIGR4ID0gXzAsIGR5ID0g XzEsIHJlc2l6ZSgpOwogIH07CgogIGRlbnNpdHkuY2VsbFNpemUgPSBmdW5jdGlvbihfKSB7CiAg ICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiAxIDw8IGs7CiAgICBpZiAoISgoXyA9ICtf KSA+PSAxKSkgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNlbGwgc2l6ZSIpOwogICAgcmV0dXJu IGsgPSBNYXRoLmZsb29yKE1hdGgubG9nKF8pIC8gTWF0aC5MTjIpLCByZXNpemUoKTsKICB9OwoK ICBkZW5zaXR5LnRocmVzaG9sZHMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRz Lmxlbmd0aCA/ICh0aHJlc2hvbGQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBBcnJh eS5pc0FycmF5KF8pID8gY29uc3RhbnQkNihzbGljZSQzLmNhbGwoXykpIDogY29uc3RhbnQkNihf KSwgZGVuc2l0eSkgOiB0aHJlc2hvbGQ7CiAgfTsKCiAgZGVuc2l0eS5iYW5kd2lkdGggPSBmdW5j dGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBNYXRoLnNxcnQociAq IChyICsgMSkpOwogICAgaWYgKCEoKF8gPSArXykgPj0gMCkpIHRocm93IG5ldyBFcnJvcigiaW52 YWxpZCBiYW5kd2lkdGgiKTsKICAgIHJldHVybiByID0gTWF0aC5yb3VuZCgoTWF0aC5zcXJ0KDQg KiBfICogXyArIDEpIC0gMSkgLyAyKSwgcmVzaXplKCk7CiAgfTsKCiAgcmV0dXJuIGRlbnNpdHk7 Cn0KCnZhciBFT0wgPSB7fSwKICAgIEVPRiA9IHt9LAogICAgUVVPVEUgPSAzNCwKICAgIE5FV0xJ TkUgPSAxMCwKICAgIFJFVFVSTiA9IDEzOwoKZnVuY3Rpb24gb2JqZWN0Q29udmVydGVyKGNvbHVt bnMpIHsKICByZXR1cm4gbmV3IEZ1bmN0aW9uKCJkIiwgInJldHVybiB7IiArIGNvbHVtbnMubWFw KGZ1bmN0aW9uKG5hbWUsIGkpIHsKICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShuYW1lKSArICI6 IGRbIiArIGkgKyAiXSB8fCBcIlwiIjsKICB9KS5qb2luKCIsIikgKyAifSIpOwp9CgpmdW5jdGlv biBjdXN0b21Db252ZXJ0ZXIoY29sdW1ucywgZikgewogIHZhciBvYmplY3QgPSBvYmplY3RDb252 ZXJ0ZXIoY29sdW1ucyk7CiAgcmV0dXJuIGZ1bmN0aW9uKHJvdywgaSkgewogICAgcmV0dXJuIGYo b2JqZWN0KHJvdyksIGksIGNvbHVtbnMpOwogIH07Cn0KCi8vIENvbXB1dGUgdW5pcXVlIGNvbHVt bnMgaW4gb3JkZXIgb2YgZGlzY292ZXJ5LgpmdW5jdGlvbiBpbmZlckNvbHVtbnMocm93cykgewog IHZhciBjb2x1bW5TZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpLAogICAgICBjb2x1bW5zID0gW107 CgogIHJvd3MuZm9yRWFjaChmdW5jdGlvbihyb3cpIHsKICAgIGZvciAodmFyIGNvbHVtbiBpbiBy b3cpIHsKICAgICAgaWYgKCEoY29sdW1uIGluIGNvbHVtblNldCkpIHsKICAgICAgICBjb2x1bW5z LnB1c2goY29sdW1uU2V0W2NvbHVtbl0gPSBjb2x1bW4pOwogICAgICB9CiAgICB9CiAgfSk7Cgog IHJldHVybiBjb2x1bW5zOwp9CgpmdW5jdGlvbiBwYWQodmFsdWUsIHdpZHRoKSB7CiAgdmFyIHMg PSB2YWx1ZSArICIiLCBsZW5ndGggPSBzLmxlbmd0aDsKICByZXR1cm4gbGVuZ3RoIDwgd2lkdGgg PyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKDApICsgcyA6IHM7Cn0KCmZ1bmN0 aW9uIGZvcm1hdFllYXIoeWVhcikgewogIHJldHVybiB5ZWFyIDwgMCA/ICItIiArIHBhZCgteWVh ciwgNikKICAgIDogeWVhciA+IDk5OTkgPyAiKyIgKyBwYWQoeWVhciwgNikKICAgIDogcGFkKHll YXIsIDQpOwp9CgpmdW5jdGlvbiBmb3JtYXREYXRlKGRhdGUpIHsKICB2YXIgaG91cnMgPSBkYXRl LmdldFVUQ0hvdXJzKCksCiAgICAgIG1pbnV0ZXMgPSBkYXRlLmdldFVUQ01pbnV0ZXMoKSwKICAg ICAgc2Vjb25kcyA9IGRhdGUuZ2V0VVRDU2Vjb25kcygpLAogICAgICBtaWxsaXNlY29uZHMgPSBk YXRlLmdldFVUQ01pbGxpc2Vjb25kcygpOwogIHJldHVybiBpc05hTihkYXRlKSA/ICJJbnZhbGlk IERhdGUiCiAgICAgIDogZm9ybWF0WWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkpICsgIi0iICsg cGFkKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEsIDIpICsgIi0iICsgcGFkKGRhdGUuZ2V0VVRDRGF0 ZSgpLCAyKQogICAgICArIChtaWxsaXNlY29uZHMgPyAiVCIgKyBwYWQoaG91cnMsIDIpICsgIjoi ICsgcGFkKG1pbnV0ZXMsIDIpICsgIjoiICsgcGFkKHNlY29uZHMsIDIpICsgIi4iICsgcGFkKG1p bGxpc2Vjb25kcywgMykgKyAiWiIKICAgICAgOiBzZWNvbmRzID8gIlQiICsgcGFkKGhvdXJzLCAy KSArICI6IiArIHBhZChtaW51dGVzLCAyKSArICI6IiArIHBhZChzZWNvbmRzLCAyKSArICJaIgog ICAgICA6IG1pbnV0ZXMgfHwgaG91cnMgPyAiVCIgKyBwYWQoaG91cnMsIDIpICsgIjoiICsgcGFk KG1pbnV0ZXMsIDIpICsgIloiCiAgICAgIDogIiIpOwp9CgpmdW5jdGlvbiBkc3ZGb3JtYXQoZGVs aW1pdGVyKSB7CiAgdmFyIHJlRm9ybWF0ID0gbmV3IFJlZ0V4cCgiW1wiIiArIGRlbGltaXRlciAr ICJcblxyXSIpLAogICAgICBERUxJTUlURVIgPSBkZWxpbWl0ZXIuY2hhckNvZGVBdCgwKTsKCiAg ZnVuY3Rpb24gcGFyc2UodGV4dCwgZikgewogICAgdmFyIGNvbnZlcnQsIGNvbHVtbnMsIHJvd3Mg PSBwYXJzZVJvd3ModGV4dCwgZnVuY3Rpb24ocm93LCBpKSB7CiAgICAgIGlmIChjb252ZXJ0KSBy ZXR1cm4gY29udmVydChyb3csIGkgLSAxKTsKICAgICAgY29sdW1ucyA9IHJvdywgY29udmVydCA9 IGYgPyBjdXN0b21Db252ZXJ0ZXIocm93LCBmKSA6IG9iamVjdENvbnZlcnRlcihyb3cpOwogICAg fSk7CiAgICByb3dzLmNvbHVtbnMgPSBjb2x1bW5zIHx8IFtdOwogICAgcmV0dXJuIHJvd3M7CiAg fQoKICBmdW5jdGlvbiBwYXJzZVJvd3ModGV4dCwgZikgewogICAgdmFyIHJvd3MgPSBbXSwgLy8g b3V0cHV0IHJvd3MKICAgICAgICBOID0gdGV4dC5sZW5ndGgsCiAgICAgICAgSSA9IDAsIC8vIGN1 cnJlbnQgY2hhcmFjdGVyIGluZGV4CiAgICAgICAgbiA9IDAsIC8vIGN1cnJlbnQgbGluZSBudW1i ZXIKICAgICAgICB0LCAvLyBjdXJyZW50IHRva2VuCiAgICAgICAgZW9mID0gTiA8PSAwLCAvLyBj dXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPRj8KICAgICAgICBlb2wgPSBmYWxzZTsgLy8gY3Vy cmVudCB0b2tlbiBmb2xsb3dlZCBieSBFT0w/CgogICAgLy8gU3RyaXAgdGhlIHRyYWlsaW5nIG5l d2xpbmUuCiAgICBpZiAodGV4dC5jaGFyQ29kZUF0KE4gLSAxKSA9PT0gTkVXTElORSkgLS1OOwog ICAgaWYgKHRleHQuY2hhckNvZGVBdChOIC0gMSkgPT09IFJFVFVSTikgLS1OOwoKICAgIGZ1bmN0 aW9uIHRva2VuKCkgewogICAgICBpZiAoZW9mKSByZXR1cm4gRU9GOwogICAgICBpZiAoZW9sKSBy ZXR1cm4gZW9sID0gZmFsc2UsIEVPTDsKCiAgICAgIC8vIFVuZXNjYXBlIHF1b3Rlcy4KICAgICAg dmFyIGksIGogPSBJLCBjOwogICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KGopID09PSBRVU9URSkg ewogICAgICAgIHdoaWxlIChJKysgPCBOICYmIHRleHQuY2hhckNvZGVBdChJKSAhPT0gUVVPVEUg fHwgdGV4dC5jaGFyQ29kZUF0KCsrSSkgPT09IFFVT1RFKTsKICAgICAgICBpZiAoKGkgPSBJKSA+ PSBOKSBlb2YgPSB0cnVlOwogICAgICAgIGVsc2UgaWYgKChjID0gdGV4dC5jaGFyQ29kZUF0KEkr KykpID09PSBORVdMSU5FKSBlb2wgPSB0cnVlOwogICAgICAgIGVsc2UgaWYgKGMgPT09IFJFVFVS TikgeyBlb2wgPSB0cnVlOyBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSBORVdMSU5FKSArK0k7 IH0KICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqICsgMSwgaSAtIDEpLnJlcGxhY2UoLyIiL2cs ICJcIiIpOwogICAgICB9CgogICAgICAvLyBGaW5kIG5leHQgZGVsaW1pdGVyIG9yIG5ld2xpbmUu CiAgICAgIHdoaWxlIChJIDwgTikgewogICAgICAgIGlmICgoYyA9IHRleHQuY2hhckNvZGVBdChp ID0gSSsrKSkgPT09IE5FV0xJTkUpIGVvbCA9IHRydWU7CiAgICAgICAgZWxzZSBpZiAoYyA9PT0g UkVUVVJOKSB7IGVvbCA9IHRydWU7IGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IE5FV0xJTkUp ICsrSTsgfQogICAgICAgIGVsc2UgaWYgKGMgIT09IERFTElNSVRFUikgY29udGludWU7CiAgICAg ICAgcmV0dXJuIHRleHQuc2xpY2UoaiwgaSk7CiAgICAgIH0KCiAgICAgIC8vIFJldHVybiBsYXN0 IHRva2VuIGJlZm9yZSBFT0YuCiAgICAgIHJldHVybiBlb2YgPSB0cnVlLCB0ZXh0LnNsaWNlKGos IE4pOwogICAgfQoKICAgIHdoaWxlICgodCA9IHRva2VuKCkpICE9PSBFT0YpIHsKICAgICAgdmFy IHJvdyA9IFtdOwogICAgICB3aGlsZSAodCAhPT0gRU9MICYmIHQgIT09IEVPRikgcm93LnB1c2go dCksIHQgPSB0b2tlbigpOwogICAgICBpZiAoZiAmJiAocm93ID0gZihyb3csIG4rKykpID09IG51 bGwpIGNvbnRpbnVlOwogICAgICByb3dzLnB1c2gocm93KTsKICAgIH0KCiAgICByZXR1cm4gcm93 czsKICB9CgogIGZ1bmN0aW9uIHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykgewogICAgcmV0 dXJuIHJvd3MubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVu Y3Rpb24oY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlKHJvd1tjb2x1bW5dKTsK ICAgICAgfSkuam9pbihkZWxpbWl0ZXIpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXQo cm93cywgY29sdW1ucykgewogICAgaWYgKGNvbHVtbnMgPT0gbnVsbCkgY29sdW1ucyA9IGluZmVy Q29sdW1ucyhyb3dzKTsKICAgIHJldHVybiBbY29sdW1ucy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4o ZGVsaW1pdGVyKV0uY29uY2F0KHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykpLmpvaW4oIlxu Iik7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRCb2R5KHJvd3MsIGNvbHVtbnMpIHsKICAgIGlmIChj b2x1bW5zID09IG51bGwpIGNvbHVtbnMgPSBpbmZlckNvbHVtbnMocm93cyk7CiAgICByZXR1cm4g cHJlZm9ybWF0Qm9keShyb3dzLCBjb2x1bW5zKS5qb2luKCJcbiIpOwogIH0KCiAgZnVuY3Rpb24g Zm9ybWF0Um93cyhyb3dzKSB7CiAgICByZXR1cm4gcm93cy5tYXAoZm9ybWF0Um93KS5qb2luKCJc biIpOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0Um93KHJvdykgewogICAgcmV0dXJuIHJvdy5tYXAo Zm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFZhbHVl KHZhbHVlKSB7CiAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICIiCiAgICAgICAgOiB2YWx1ZSBp bnN0YW5jZW9mIERhdGUgPyBmb3JtYXREYXRlKHZhbHVlKQogICAgICAgIDogcmVGb3JtYXQudGVz dCh2YWx1ZSArPSAiIikgPyAiXCIiICsgdmFsdWUucmVwbGFjZSgvIi9nLCAiXCJcIiIpICsgIlwi IgogICAgICAgIDogdmFsdWU7CiAgfQoKICByZXR1cm4gewogICAgcGFyc2U6IHBhcnNlLAogICAg cGFyc2VSb3dzOiBwYXJzZVJvd3MsCiAgICBmb3JtYXQ6IGZvcm1hdCwKICAgIGZvcm1hdEJvZHk6 IGZvcm1hdEJvZHksCiAgICBmb3JtYXRSb3dzOiBmb3JtYXRSb3dzLAogICAgZm9ybWF0Um93OiBm b3JtYXRSb3csCiAgICBmb3JtYXRWYWx1ZTogZm9ybWF0VmFsdWUKICB9Owp9Cgp2YXIgY3N2ID0g ZHN2Rm9ybWF0KCIsIik7Cgp2YXIgY3N2UGFyc2UgPSBjc3YucGFyc2U7CnZhciBjc3ZQYXJzZVJv d3MgPSBjc3YucGFyc2VSb3dzOwp2YXIgY3N2Rm9ybWF0ID0gY3N2LmZvcm1hdDsKdmFyIGNzdkZv cm1hdEJvZHkgPSBjc3YuZm9ybWF0Qm9keTsKdmFyIGNzdkZvcm1hdFJvd3MgPSBjc3YuZm9ybWF0 Um93czsKdmFyIGNzdkZvcm1hdFJvdyA9IGNzdi5mb3JtYXRSb3c7CnZhciBjc3ZGb3JtYXRWYWx1 ZSA9IGNzdi5mb3JtYXRWYWx1ZTsKCnZhciB0c3YgPSBkc3ZGb3JtYXQoIlx0Iik7Cgp2YXIgdHN2 UGFyc2UgPSB0c3YucGFyc2U7CnZhciB0c3ZQYXJzZVJvd3MgPSB0c3YucGFyc2VSb3dzOwp2YXIg dHN2Rm9ybWF0ID0gdHN2LmZvcm1hdDsKdmFyIHRzdkZvcm1hdEJvZHkgPSB0c3YuZm9ybWF0Qm9k eTsKdmFyIHRzdkZvcm1hdFJvd3MgPSB0c3YuZm9ybWF0Um93czsKdmFyIHRzdkZvcm1hdFJvdyA9 IHRzdi5mb3JtYXRSb3c7CnZhciB0c3ZGb3JtYXRWYWx1ZSA9IHRzdi5mb3JtYXRWYWx1ZTsKCmZ1 bmN0aW9uIGF1dG9UeXBlKG9iamVjdCkgewogIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHsKICAg IHZhciB2YWx1ZSA9IG9iamVjdFtrZXldLnRyaW0oKSwgbnVtYmVyLCBtOwogICAgaWYgKCF2YWx1 ZSkgdmFsdWUgPSBudWxsOwogICAgZWxzZSBpZiAodmFsdWUgPT09ICJ0cnVlIikgdmFsdWUgPSB0 cnVlOwogICAgZWxzZSBpZiAodmFsdWUgPT09ICJmYWxzZSIpIHZhbHVlID0gZmFsc2U7CiAgICBl bHNlIGlmICh2YWx1ZSA9PT0gIk5hTiIpIHZhbHVlID0gTmFOOwogICAgZWxzZSBpZiAoIWlzTmFO KG51bWJlciA9ICt2YWx1ZSkpIHZhbHVlID0gbnVtYmVyOwogICAgZWxzZSBpZiAobSA9IHZhbHVl Lm1hdGNoKC9eKFstK11cZHsyfSk/XGR7NH0oLVxkezJ9KC1cZHsyfSk/KT8oVFxkezJ9OlxkezJ9 KDpcZHsyfShcLlxkezN9KT8pPyhafFstK11cZHsyfTpcZHsyfSk/KT8kLykpIHsKICAgICAgaWYg KGZpeHR6ICYmICEhbVs0XSAmJiAhbVs3XSkgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC8tL2csICIv IikucmVwbGFjZSgvVC8sICIgIik7CiAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpOwogICAg fQogICAgZWxzZSBjb250aW51ZTsKICAgIG9iamVjdFtrZXldID0gdmFsdWU7CiAgfQogIHJldHVy biBvYmplY3Q7Cn0KCi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1kc3YvaXNzdWVzLzQ1CnZh ciBmaXh0eiA9IG5ldyBEYXRlKCIyMDE5LTAxLTAxVDAwOjAwIikuZ2V0SG91cnMoKSB8fCBuZXcg RGF0ZSgiMjAxOS0wNy0wMVQwMDowMCIpLmdldEhvdXJzKCk7CgpmdW5jdGlvbiByZXNwb25zZUJs b2IocmVzcG9uc2UpIHsKICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9u c2Uuc3RhdHVzICsgIiAiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7CiAgcmV0dXJuIHJlc3BvbnNl LmJsb2IoKTsKfQoKZnVuY3Rpb24gYmxvYihpbnB1dCwgaW5pdCkgewogIHJldHVybiBmZXRjaChp bnB1dCwgaW5pdCkudGhlbihyZXNwb25zZUJsb2IpOwp9CgpmdW5jdGlvbiByZXNwb25zZUFycmF5 QnVmZmVyKHJlc3BvbnNlKSB7CiAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKHJl c3BvbnNlLnN0YXR1cyArICIgIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpOwogIHJldHVybiByZXNw b25zZS5hcnJheUJ1ZmZlcigpOwp9CgpmdW5jdGlvbiBidWZmZXIoaW5wdXQsIGluaXQpIHsKICBy ZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpLnRoZW4ocmVzcG9uc2VBcnJheUJ1ZmZlcik7Cn0KCmZ1 bmN0aW9uIHJlc3BvbnNlVGV4dChyZXNwb25zZSkgewogIGlmICghcmVzcG9uc2Uub2spIHRocm93 IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyAiICIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTsK ICByZXR1cm4gcmVzcG9uc2UudGV4dCgpOwp9CgpmdW5jdGlvbiB0ZXh0KGlucHV0LCBpbml0KSB7 CiAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KS50aGVuKHJlc3BvbnNlVGV4dCk7Cn0KCmZ1bmN0 aW9uIGRzdlBhcnNlKHBhcnNlKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBpbml0LCByb3cp IHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIHR5cGVvZiBpbml0ID09PSAiZnVu Y3Rpb24iKSByb3cgPSBpbml0LCBpbml0ID0gdW5kZWZpbmVkOwogICAgcmV0dXJuIHRleHQoaW5w dXQsIGluaXQpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgcmV0dXJuIHBhcnNlKHJl c3BvbnNlLCByb3cpOwogICAgfSk7CiAgfTsKfQoKZnVuY3Rpb24gZHN2KGRlbGltaXRlciwgaW5w dXQsIGluaXQsIHJvdykgewogIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBp bml0ID09PSAiZnVuY3Rpb24iKSByb3cgPSBpbml0LCBpbml0ID0gdW5kZWZpbmVkOwogIHZhciBm b3JtYXQgPSBkc3ZGb3JtYXQoZGVsaW1pdGVyKTsKICByZXR1cm4gdGV4dChpbnB1dCwgaW5pdCku dGhlbihmdW5jdGlvbihyZXNwb25zZSkgewogICAgcmV0dXJuIGZvcm1hdC5wYXJzZShyZXNwb25z ZSwgcm93KTsKICB9KTsKfQoKdmFyIGNzdiQxID0gZHN2UGFyc2UoY3N2UGFyc2UpOwp2YXIgdHN2 JDEgPSBkc3ZQYXJzZSh0c3ZQYXJzZSk7CgpmdW5jdGlvbiBpbWFnZShpbnB1dCwgaW5pdCkgewog IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgIHZhciBp bWFnZSA9IG5ldyBJbWFnZTsKICAgIGZvciAodmFyIGtleSBpbiBpbml0KSBpbWFnZVtrZXldID0g aW5pdFtrZXldOwogICAgaW1hZ2Uub25lcnJvciA9IHJlamVjdDsKICAgIGltYWdlLm9ubG9hZCA9 IGZ1bmN0aW9uKCkgeyByZXNvbHZlKGltYWdlKTsgfTsKICAgIGltYWdlLnNyYyA9IGlucHV0Owog IH0pOwp9CgpmdW5jdGlvbiByZXNwb25zZUpzb24ocmVzcG9uc2UpIHsKICBpZiAoIXJlc3BvbnNl Lm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzICsgIiAiICsgcmVzcG9uc2Uuc3Rh dHVzVGV4dCk7CiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTsKfQoKZnVuY3Rpb24ganNvbihpbnB1 dCwgaW5pdCkgewogIHJldHVybiBmZXRjaChpbnB1dCwgaW5pdCkudGhlbihyZXNwb25zZUpzb24p Owp9CgpmdW5jdGlvbiBwYXJzZXIodHlwZSkgewogIHJldHVybiBmdW5jdGlvbihpbnB1dCwgaW5p dCkgIHsKICAgIHJldHVybiB0ZXh0KGlucHV0LCBpbml0KS50aGVuKGZ1bmN0aW9uKHRleHQpIHsK ICAgICAgcmV0dXJuIChuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcodGV4dCwgdHlwZSk7 CiAgICB9KTsKICB9Owp9Cgp2YXIgeG1sID0gcGFyc2VyKCJhcHBsaWNhdGlvbi94bWwiKTsKCnZh ciBodG1sID0gcGFyc2VyKCJ0ZXh0L2h0bWwiKTsKCnZhciBzdmcgPSBwYXJzZXIoImltYWdlL3N2 Zyt4bWwiKTsKCmZ1bmN0aW9uIGNlbnRlciQxKHgsIHkpIHsKICB2YXIgbm9kZXM7CgogIGlmICh4 ID09IG51bGwpIHggPSAwOwogIGlmICh5ID09IG51bGwpIHkgPSAwOwoKICBmdW5jdGlvbiBmb3Jj ZSgpIHsKICAgIHZhciBpLAogICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgICAgbm9kZSwK ICAgICAgICBzeCA9IDAsCiAgICAgICAgc3kgPSAwOwoKICAgIGZvciAoaSA9IDA7IGkgPCBuOyAr K2kpIHsKICAgICAgbm9kZSA9IG5vZGVzW2ldLCBzeCArPSBub2RlLngsIHN5ICs9IG5vZGUueTsK ICAgIH0KCiAgICBmb3IgKHN4ID0gc3ggLyBuIC0geCwgc3kgPSBzeSAvIG4gLSB5LCBpID0gMDsg aSA8IG47ICsraSkgewogICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueCAtPSBzeCwgbm9kZS55 IC09IHN5OwogICAgfQogIH0KCiAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF8pIHsKICAg IG5vZGVzID0gXzsKICB9OwoKICBmb3JjZS54ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFy Z3VtZW50cy5sZW5ndGggPyAoeCA9ICtfLCBmb3JjZSkgOiB4OwogIH07CgogIGZvcmNlLnkgPSBm dW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gK18sIGZvcmNl KSA6IHk7CiAgfTsKCiAgcmV0dXJuIGZvcmNlOwp9CgpmdW5jdGlvbiBjb25zdGFudCQ3KHgpIHsK ICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geDsKICB9Owp9CgpmdW5jdGlvbiBqaWdn bGUoKSB7CiAgcmV0dXJuIChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIDFlLTY7Cn0KCmZ1bmN0aW9u IHRyZWVfYWRkKGQpIHsKICB2YXIgeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCksCiAgICAgIHkg PSArdGhpcy5feS5jYWxsKG51bGwsIGQpOwogIHJldHVybiBhZGQodGhpcy5jb3Zlcih4LCB5KSwg eCwgeSwgZCk7Cn0KCmZ1bmN0aW9uIGFkZCh0cmVlLCB4LCB5LCBkKSB7CiAgaWYgKGlzTmFOKHgp IHx8IGlzTmFOKHkpKSByZXR1cm4gdHJlZTsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRzCgogIHZh ciBwYXJlbnQsCiAgICAgIG5vZGUgPSB0cmVlLl9yb290LAogICAgICBsZWFmID0ge2RhdGE6IGR9 LAogICAgICB4MCA9IHRyZWUuX3gwLAogICAgICB5MCA9IHRyZWUuX3kwLAogICAgICB4MSA9IHRy ZWUuX3gxLAogICAgICB5MSA9IHRyZWUuX3kxLAogICAgICB4bSwKICAgICAgeW0sCiAgICAgIHhw LAogICAgICB5cCwKICAgICAgcmlnaHQsCiAgICAgIGJvdHRvbSwKICAgICAgaSwKICAgICAgajsK CiAgLy8gSWYgdGhlIHRyZWUgaXMgZW1wdHksIGluaXRpYWxpemUgdGhlIHJvb3QgYXMgYSBsZWFm LgogIGlmICghbm9kZSkgcmV0dXJuIHRyZWUuX3Jvb3QgPSBsZWFmLCB0cmVlOwoKICAvLyBGaW5k IHRoZSBleGlzdGluZyBsZWFmIGZvciB0aGUgbmV3IHBvaW50LCBvciBhZGQgaXQuCiAgd2hpbGUg KG5vZGUubGVuZ3RoKSB7CiAgICBpZiAocmlnaHQgPSB4ID49ICh4bSA9ICh4MCArIHgxKSAvIDIp KSB4MCA9IHhtOyBlbHNlIHgxID0geG07CiAgICBpZiAoYm90dG9tID0geSA+PSAoeW0gPSAoeTAg KyB5MSkgLyAyKSkgeTAgPSB5bTsgZWxzZSB5MSA9IHltOwogICAgaWYgKHBhcmVudCA9IG5vZGUs ICEobm9kZSA9IG5vZGVbaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHRdKSkgcmV0dXJuIHBhcmVudFtp XSA9IGxlYWYsIHRyZWU7CiAgfQoKICAvLyBJcyB0aGUgbmV3IHBvaW50IGlzIGV4YWN0bHkgY29p bmNpZGVudCB3aXRoIHRoZSBleGlzdGluZyBwb2ludD8KICB4cCA9ICt0cmVlLl94LmNhbGwobnVs bCwgbm9kZS5kYXRhKTsKICB5cCA9ICt0cmVlLl95LmNhbGwobnVsbCwgbm9kZS5kYXRhKTsKICBp ZiAoeCA9PT0geHAgJiYgeSA9PT0geXApIHJldHVybiBsZWFmLm5leHQgPSBub2RlLCBwYXJlbnQg PyBwYXJlbnRbaV0gPSBsZWFmIDogdHJlZS5fcm9vdCA9IGxlYWYsIHRyZWU7CgogIC8vIE90aGVy d2lzZSwgc3BsaXQgdGhlIGxlYWYgbm9kZSB1bnRpbCB0aGUgb2xkIGFuZCBuZXcgcG9pbnQgYXJl IHNlcGFyYXRlZC4KICBkbyB7CiAgICBwYXJlbnQgPSBwYXJlbnQgPyBwYXJlbnRbaV0gPSBuZXcg QXJyYXkoNCkgOiB0cmVlLl9yb290ID0gbmV3IEFycmF5KDQpOwogICAgaWYgKHJpZ2h0ID0geCA+ PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtOwogICAgaWYgKGJv dHRvbSA9IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTsK ICB9IHdoaWxlICgoaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHQpID09PSAoaiA9ICh5cCA+PSB5bSkg PDwgMSB8ICh4cCA+PSB4bSkpKTsKICByZXR1cm4gcGFyZW50W2pdID0gbm9kZSwgcGFyZW50W2ld ID0gbGVhZiwgdHJlZTsKfQoKZnVuY3Rpb24gYWRkQWxsKGRhdGEpIHsKICB2YXIgZCwgaSwgbiA9 IGRhdGEubGVuZ3RoLAogICAgICB4LAogICAgICB5LAogICAgICB4eiA9IG5ldyBBcnJheShuKSwK ICAgICAgeXogPSBuZXcgQXJyYXkobiksCiAgICAgIHgwID0gSW5maW5pdHksCiAgICAgIHkwID0g SW5maW5pdHksCiAgICAgIHgxID0gLUluZmluaXR5LAogICAgICB5MSA9IC1JbmZpbml0eTsKCiAg Ly8gQ29tcHV0ZSB0aGUgcG9pbnRzIGFuZCB0aGVpciBleHRlbnQuCiAgZm9yIChpID0gMDsgaSA8 IG47ICsraSkgewogICAgaWYgKGlzTmFOKHggPSArdGhpcy5feC5jYWxsKG51bGwsIGQgPSBkYXRh W2ldKSkgfHwgaXNOYU4oeSA9ICt0aGlzLl95LmNhbGwobnVsbCwgZCkpKSBjb250aW51ZTsKICAg IHh6W2ldID0geDsKICAgIHl6W2ldID0geTsKICAgIGlmICh4IDwgeDApIHgwID0geDsKICAgIGlm ICh4ID4geDEpIHgxID0geDsKICAgIGlmICh5IDwgeTApIHkwID0geTsKICAgIGlmICh5ID4geTEp IHkxID0geTsKICB9CgogIC8vIElmIHRoZXJlIHdlcmUgbm8gKHZhbGlkKSBwb2ludHMsIGFib3J0 LgogIGlmICh4MCA+IHgxIHx8IHkwID4geTEpIHJldHVybiB0aGlzOwoKICAvLyBFeHBhbmQgdGhl IHRyZWUgdG8gY292ZXIgdGhlIG5ldyBwb2ludHMuCiAgdGhpcy5jb3Zlcih4MCwgeTApLmNvdmVy KHgxLCB5MSk7CgogIC8vIEFkZCB0aGUgbmV3IHBvaW50cy4KICBmb3IgKGkgPSAwOyBpIDwgbjsg KytpKSB7CiAgICBhZGQodGhpcywgeHpbaV0sIHl6W2ldLCBkYXRhW2ldKTsKICB9CgogIHJldHVy biB0aGlzOwp9CgpmdW5jdGlvbiB0cmVlX2NvdmVyKHgsIHkpIHsKICBpZiAoaXNOYU4oeCA9ICt4 KSB8fCBpc05hTih5ID0gK3kpKSByZXR1cm4gdGhpczsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRz CgogIHZhciB4MCA9IHRoaXMuX3gwLAogICAgICB5MCA9IHRoaXMuX3kwLAogICAgICB4MSA9IHRo aXMuX3gxLAogICAgICB5MSA9IHRoaXMuX3kxOwoKICAvLyBJZiB0aGUgcXVhZHRyZWUgaGFzIG5v IGV4dGVudCwgaW5pdGlhbGl6ZSB0aGVtLgogIC8vIEludGVnZXIgZXh0ZW50IGFyZSBuZWNlc3Nh cnkgc28gdGhhdCBpZiB3ZSBsYXRlciBkb3VibGUgdGhlIGV4dGVudCwKICAvLyB0aGUgZXhpc3Rp bmcgcXVhZHJhbnQgYm91bmRhcmllcyBkb27igJl0IGNoYW5nZSBkdWUgdG8gZmxvYXRpbmcgcG9p bnQgZXJyb3IhCiAgaWYgKGlzTmFOKHgwKSkgewogICAgeDEgPSAoeDAgPSBNYXRoLmZsb29yKHgp KSArIDE7CiAgICB5MSA9ICh5MCA9IE1hdGguZmxvb3IoeSkpICsgMTsKICB9CgogIC8vIE90aGVy d2lzZSwgZG91YmxlIHJlcGVhdGVkbHkgdG8gY292ZXIuCiAgZWxzZSB7CiAgICB2YXIgeiA9IHgx IC0geDAsCiAgICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsCiAgICAgICAgcGFyZW50LAogICAgICAg IGk7CgogICAgd2hpbGUgKHgwID4geCB8fCB4ID49IHgxIHx8IHkwID4geSB8fCB5ID49IHkxKSB7 CiAgICAgIGkgPSAoeSA8IHkwKSA8PCAxIHwgKHggPCB4MCk7CiAgICAgIHBhcmVudCA9IG5ldyBB cnJheSg0KSwgcGFyZW50W2ldID0gbm9kZSwgbm9kZSA9IHBhcmVudCwgeiAqPSAyOwogICAgICBz d2l0Y2ggKGkpIHsKICAgICAgICBjYXNlIDA6IHgxID0geDAgKyB6LCB5MSA9IHkwICsgejsgYnJl YWs7CiAgICAgICAgY2FzZSAxOiB4MCA9IHgxIC0geiwgeTEgPSB5MCArIHo7IGJyZWFrOwogICAg ICAgIGNhc2UgMjogeDEgPSB4MCArIHosIHkwID0geTEgLSB6OyBicmVhazsKICAgICAgICBjYXNl IDM6IHgwID0geDEgLSB6LCB5MCA9IHkxIC0gejsgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBp ZiAodGhpcy5fcm9vdCAmJiB0aGlzLl9yb290Lmxlbmd0aCkgdGhpcy5fcm9vdCA9IG5vZGU7CiAg fQoKICB0aGlzLl94MCA9IHgwOwogIHRoaXMuX3kwID0geTA7CiAgdGhpcy5feDEgPSB4MTsKICB0 aGlzLl95MSA9IHkxOwogIHJldHVybiB0aGlzOwp9CgpmdW5jdGlvbiB0cmVlX2RhdGEoKSB7CiAg dmFyIGRhdGEgPSBbXTsKICB0aGlzLnZpc2l0KGZ1bmN0aW9uKG5vZGUpIHsKICAgIGlmICghbm9k ZS5sZW5ndGgpIGRvIGRhdGEucHVzaChub2RlLmRhdGEpOyB3aGlsZSAobm9kZSA9IG5vZGUubmV4 dCkKICB9KTsKICByZXR1cm4gZGF0YTsKfQoKZnVuY3Rpb24gdHJlZV9leHRlbnQoXykgewogIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgID8gdGhpcy5jb3ZlcigrX1swXVswXSwgK19bMF1b MV0pLmNvdmVyKCtfWzFdWzBdLCArX1sxXVsxXSkKICAgICAgOiBpc05hTih0aGlzLl94MCkgPyB1 bmRlZmluZWQgOiBbW3RoaXMuX3gwLCB0aGlzLl95MF0sIFt0aGlzLl94MSwgdGhpcy5feTFdXTsK fQoKZnVuY3Rpb24gUXVhZChub2RlLCB4MCwgeTAsIHgxLCB5MSkgewogIHRoaXMubm9kZSA9IG5v ZGU7CiAgdGhpcy54MCA9IHgwOwogIHRoaXMueTAgPSB5MDsKICB0aGlzLngxID0geDE7CiAgdGhp cy55MSA9IHkxOwp9CgpmdW5jdGlvbiB0cmVlX2ZpbmQoeCwgeSwgcmFkaXVzKSB7CiAgdmFyIGRh dGEsCiAgICAgIHgwID0gdGhpcy5feDAsCiAgICAgIHkwID0gdGhpcy5feTAsCiAgICAgIHgxLAog ICAgICB5MSwKICAgICAgeDIsCiAgICAgIHkyLAogICAgICB4MyA9IHRoaXMuX3gxLAogICAgICB5 MyA9IHRoaXMuX3kxLAogICAgICBxdWFkcyA9IFtdLAogICAgICBub2RlID0gdGhpcy5fcm9vdCwK ICAgICAgcSwKICAgICAgaTsKCiAgaWYgKG5vZGUpIHF1YWRzLnB1c2gobmV3IFF1YWQobm9kZSwg eDAsIHkwLCB4MywgeTMpKTsKICBpZiAocmFkaXVzID09IG51bGwpIHJhZGl1cyA9IEluZmluaXR5 OwogIGVsc2UgewogICAgeDAgPSB4IC0gcmFkaXVzLCB5MCA9IHkgLSByYWRpdXM7CiAgICB4MyA9 IHggKyByYWRpdXMsIHkzID0geSArIHJhZGl1czsKICAgIHJhZGl1cyAqPSByYWRpdXM7CiAgfQoK ICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7CgogICAgLy8gU3RvcCBzZWFyY2hpbmcgaWYgdGhp cyBxdWFkcmFudCBjYW7igJl0IGNvbnRhaW4gYSBjbG9zZXIgbm9kZS4KICAgIGlmICghKG5vZGUg PSBxLm5vZGUpCiAgICAgICAgfHwgKHgxID0gcS54MCkgPiB4MwogICAgICAgIHx8ICh5MSA9IHEu eTApID4geTMKICAgICAgICB8fCAoeDIgPSBxLngxKSA8IHgwCiAgICAgICAgfHwgKHkyID0gcS55 MSkgPCB5MCkgY29udGludWU7CgogICAgLy8gQmlzZWN0IHRoZSBjdXJyZW50IHF1YWRyYW50Lgog ICAgaWYgKG5vZGUubGVuZ3RoKSB7CiAgICAgIHZhciB4bSA9ICh4MSArIHgyKSAvIDIsCiAgICAg ICAgICB5bSA9ICh5MSArIHkyKSAvIDI7CgogICAgICBxdWFkcy5wdXNoKAogICAgICAgIG5ldyBR dWFkKG5vZGVbM10sIHhtLCB5bSwgeDIsIHkyKSwKICAgICAgICBuZXcgUXVhZChub2RlWzJdLCB4 MSwgeW0sIHhtLCB5MiksCiAgICAgICAgbmV3IFF1YWQobm9kZVsxXSwgeG0sIHkxLCB4MiwgeW0p LAogICAgICAgIG5ldyBRdWFkKG5vZGVbMF0sIHgxLCB5MSwgeG0sIHltKQogICAgICApOwoKICAg ICAgLy8gVmlzaXQgdGhlIGNsb3Nlc3QgcXVhZHJhbnQgZmlyc3QuCiAgICAgIGlmIChpID0gKHkg Pj0geW0pIDw8IDEgfCAoeCA+PSB4bSkpIHsKICAgICAgICBxID0gcXVhZHNbcXVhZHMubGVuZ3Ro IC0gMV07CiAgICAgICAgcXVhZHNbcXVhZHMubGVuZ3RoIC0gMV0gPSBxdWFkc1txdWFkcy5sZW5n dGggLSAxIC0gaV07CiAgICAgICAgcXVhZHNbcXVhZHMubGVuZ3RoIC0gMSAtIGldID0gcTsKICAg ICAgfQogICAgfQoKICAgIC8vIFZpc2l0IHRoaXMgcG9pbnQuIChWaXNpdGluZyBjb2luY2lkZW50 IHBvaW50cyBpc27igJl0IG5lY2Vzc2FyeSEpCiAgICBlbHNlIHsKICAgICAgdmFyIGR4ID0geCAt ICt0aGlzLl94LmNhbGwobnVsbCwgbm9kZS5kYXRhKSwKICAgICAgICAgIGR5ID0geSAtICt0aGlz Ll95LmNhbGwobnVsbCwgbm9kZS5kYXRhKSwKICAgICAgICAgIGQyID0gZHggKiBkeCArIGR5ICog ZHk7CiAgICAgIGlmIChkMiA8IHJhZGl1cykgewogICAgICAgIHZhciBkID0gTWF0aC5zcXJ0KHJh ZGl1cyA9IGQyKTsKICAgICAgICB4MCA9IHggLSBkLCB5MCA9IHkgLSBkOwogICAgICAgIHgzID0g eCArIGQsIHkzID0geSArIGQ7CiAgICAgICAgZGF0YSA9IG5vZGUuZGF0YTsKICAgICAgfQogICAg fQogIH0KCiAgcmV0dXJuIGRhdGE7Cn0KCmZ1bmN0aW9uIHRyZWVfcmVtb3ZlKGQpIHsKICBpZiAo aXNOYU4oeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCkpIHx8IGlzTmFOKHkgPSArdGhpcy5feS5j YWxsKG51bGwsIGQpKSkgcmV0dXJuIHRoaXM7IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50cwoKICB2 YXIgcGFyZW50LAogICAgICBub2RlID0gdGhpcy5fcm9vdCwKICAgICAgcmV0YWluZXIsCiAgICAg IHByZXZpb3VzLAogICAgICBuZXh0LAogICAgICB4MCA9IHRoaXMuX3gwLAogICAgICB5MCA9IHRo aXMuX3kwLAogICAgICB4MSA9IHRoaXMuX3gxLAogICAgICB5MSA9IHRoaXMuX3kxLAogICAgICB4 LAogICAgICB5LAogICAgICB4bSwKICAgICAgeW0sCiAgICAgIHJpZ2h0LAogICAgICBib3R0b20s CiAgICAgIGksCiAgICAgIGo7CgogIC8vIElmIHRoZSB0cmVlIGlzIGVtcHR5LCBpbml0aWFsaXpl IHRoZSByb290IGFzIGEgbGVhZi4KICBpZiAoIW5vZGUpIHJldHVybiB0aGlzOwoKICAvLyBGaW5k IHRoZSBsZWFmIG5vZGUgZm9yIHRoZSBwb2ludC4KICAvLyBXaGlsZSBkZXNjZW5kaW5nLCBhbHNv IHJldGFpbiB0aGUgZGVlcGVzdCBwYXJlbnQgd2l0aCBhIG5vbi1yZW1vdmVkIHNpYmxpbmcuCiAg aWYgKG5vZGUubGVuZ3RoKSB3aGlsZSAodHJ1ZSkgewogICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0g PSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtOwogICAgaWYgKGJvdHRvbSA9 IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTsKICAgIGlm ICghKHBhcmVudCA9IG5vZGUsIG5vZGUgPSBub2RlW2kgPSBib3R0b20gPDwgMSB8IHJpZ2h0XSkp IHJldHVybiB0aGlzOwogICAgaWYgKCFub2RlLmxlbmd0aCkgYnJlYWs7CiAgICBpZiAocGFyZW50 WyhpICsgMSkgJiAzXSB8fCBwYXJlbnRbKGkgKyAyKSAmIDNdIHx8IHBhcmVudFsoaSArIDMpICYg M10pIHJldGFpbmVyID0gcGFyZW50LCBqID0gaTsKICB9CgogIC8vIEZpbmQgdGhlIHBvaW50IHRv IHJlbW92ZS4KICB3aGlsZSAobm9kZS5kYXRhICE9PSBkKSBpZiAoIShwcmV2aW91cyA9IG5vZGUs IG5vZGUgPSBub2RlLm5leHQpKSByZXR1cm4gdGhpczsKICBpZiAobmV4dCA9IG5vZGUubmV4dCkg ZGVsZXRlIG5vZGUubmV4dDsKCiAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvaW5jaWRlbnQg cG9pbnRzLCByZW1vdmUganVzdCB0aGUgcG9pbnQuCiAgaWYgKHByZXZpb3VzKSByZXR1cm4gKG5l eHQgPyBwcmV2aW91cy5uZXh0ID0gbmV4dCA6IGRlbGV0ZSBwcmV2aW91cy5uZXh0KSwgdGhpczsK CiAgLy8gSWYgdGhpcyBpcyB0aGUgcm9vdCBwb2ludCwgcmVtb3ZlIGl0LgogIGlmICghcGFyZW50 KSByZXR1cm4gdGhpcy5fcm9vdCA9IG5leHQsIHRoaXM7CgogIC8vIFJlbW92ZSB0aGlzIGxlYWYu CiAgbmV4dCA/IHBhcmVudFtpXSA9IG5leHQgOiBkZWxldGUgcGFyZW50W2ldOwoKICAvLyBJZiB0 aGUgcGFyZW50IG5vdyBjb250YWlucyBleGFjdGx5IG9uZSBsZWFmLCBjb2xsYXBzZSBzdXBlcmZs dW91cyBwYXJlbnRzLgogIGlmICgobm9kZSA9IHBhcmVudFswXSB8fCBwYXJlbnRbMV0gfHwgcGFy ZW50WzJdIHx8IHBhcmVudFszXSkKICAgICAgJiYgbm9kZSA9PT0gKHBhcmVudFszXSB8fCBwYXJl bnRbMl0gfHwgcGFyZW50WzFdIHx8IHBhcmVudFswXSkKICAgICAgJiYgIW5vZGUubGVuZ3RoKSB7 CiAgICBpZiAocmV0YWluZXIpIHJldGFpbmVyW2pdID0gbm9kZTsKICAgIGVsc2UgdGhpcy5fcm9v dCA9IG5vZGU7CiAgfQoKICByZXR1cm4gdGhpczsKfQoKZnVuY3Rpb24gcmVtb3ZlQWxsKGRhdGEp IHsKICBmb3IgKHZhciBpID0gMCwgbiA9IGRhdGEubGVuZ3RoOyBpIDwgbjsgKytpKSB0aGlzLnJl bW92ZShkYXRhW2ldKTsKICByZXR1cm4gdGhpczsKfQoKZnVuY3Rpb24gdHJlZV9yb290KCkgewog IHJldHVybiB0aGlzLl9yb290Owp9CgpmdW5jdGlvbiB0cmVlX3NpemUoKSB7CiAgdmFyIHNpemUg PSAwOwogIHRoaXMudmlzaXQoZnVuY3Rpb24obm9kZSkgewogICAgaWYgKCFub2RlLmxlbmd0aCkg ZG8gKytzaXplOyB3aGlsZSAobm9kZSA9IG5vZGUubmV4dCkKICB9KTsKICByZXR1cm4gc2l6ZTsK fQoKZnVuY3Rpb24gdHJlZV92aXNpdChjYWxsYmFjaykgewogIHZhciBxdWFkcyA9IFtdLCBxLCBu b2RlID0gdGhpcy5fcm9vdCwgY2hpbGQsIHgwLCB5MCwgeDEsIHkxOwogIGlmIChub2RlKSBxdWFk cy5wdXNoKG5ldyBRdWFkKG5vZGUsIHRoaXMuX3gwLCB0aGlzLl95MCwgdGhpcy5feDEsIHRoaXMu X3kxKSk7CiAgd2hpbGUgKHEgPSBxdWFkcy5wb3AoKSkgewogICAgaWYgKCFjYWxsYmFjayhub2Rl ID0gcS5ub2RlLCB4MCA9IHEueDAsIHkwID0gcS55MCwgeDEgPSBxLngxLCB5MSA9IHEueTEpICYm IG5vZGUubGVuZ3RoKSB7CiAgICAgIHZhciB4bSA9ICh4MCArIHgxKSAvIDIsIHltID0gKHkwICsg eTEpIC8gMjsKICAgICAgaWYgKGNoaWxkID0gbm9kZVszXSkgcXVhZHMucHVzaChuZXcgUXVhZChj aGlsZCwgeG0sIHltLCB4MSwgeTEpKTsKICAgICAgaWYgKGNoaWxkID0gbm9kZVsyXSkgcXVhZHMu cHVzaChuZXcgUXVhZChjaGlsZCwgeDAsIHltLCB4bSwgeTEpKTsKICAgICAgaWYgKGNoaWxkID0g bm9kZVsxXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHkwLCB4MSwgeW0pKTsKICAg ICAgaWYgKGNoaWxkID0gbm9kZVswXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeDAsIHkw LCB4bSwgeW0pKTsKICAgIH0KICB9CiAgcmV0dXJuIHRoaXM7Cn0KCmZ1bmN0aW9uIHRyZWVfdmlz aXRBZnRlcihjYWxsYmFjaykgewogIHZhciBxdWFkcyA9IFtdLCBuZXh0ID0gW10sIHE7CiAgaWYg KHRoaXMuX3Jvb3QpIHF1YWRzLnB1c2gobmV3IFF1YWQodGhpcy5fcm9vdCwgdGhpcy5feDAsIHRo aXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpKTsKICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7 CiAgICB2YXIgbm9kZSA9IHEubm9kZTsKICAgIGlmIChub2RlLmxlbmd0aCkgewogICAgICB2YXIg Y2hpbGQsIHgwID0gcS54MCwgeTAgPSBxLnkwLCB4MSA9IHEueDEsIHkxID0gcS55MSwgeG0gPSAo eDAgKyB4MSkgLyAyLCB5bSA9ICh5MCArIHkxKSAvIDI7CiAgICAgIGlmIChjaGlsZCA9IG5vZGVb MF0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHgwLCB5MCwgeG0sIHltKSk7CiAgICAgIGlm IChjaGlsZCA9IG5vZGVbMV0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHhtLCB5MCwgeDEs IHltKSk7CiAgICAgIGlmIChjaGlsZCA9IG5vZGVbMl0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hp bGQsIHgwLCB5bSwgeG0sIHkxKSk7CiAgICAgIGlmIChjaGlsZCA9IG5vZGVbM10pIHF1YWRzLnB1 c2gobmV3IFF1YWQoY2hpbGQsIHhtLCB5bSwgeDEsIHkxKSk7CiAgICB9CiAgICBuZXh0LnB1c2go cSk7CiAgfQogIHdoaWxlIChxID0gbmV4dC5wb3AoKSkgewogICAgY2FsbGJhY2socS5ub2RlLCBx LngwLCBxLnkwLCBxLngxLCBxLnkxKTsKICB9CiAgcmV0dXJuIHRoaXM7Cn0KCmZ1bmN0aW9uIGRl ZmF1bHRYJDEoZCkgewogIHJldHVybiBkWzBdOwp9CgpmdW5jdGlvbiB0cmVlX3goXykgewogIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3ggPSBfLCB0aGlzKSA6IHRoaXMuX3g7Cn0K CmZ1bmN0aW9uIGRlZmF1bHRZJDEoZCkgewogIHJldHVybiBkWzFdOwp9CgpmdW5jdGlvbiB0cmVl X3koXykgewogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3kgPSBfLCB0aGlzKSA6 IHRoaXMuX3k7Cn0KCmZ1bmN0aW9uIHF1YWR0cmVlKG5vZGVzLCB4LCB5KSB7CiAgdmFyIHRyZWUg PSBuZXcgUXVhZHRyZWUoeCA9PSBudWxsID8gZGVmYXVsdFgkMSA6IHgsIHkgPT0gbnVsbCA/IGRl ZmF1bHRZJDEgOiB5LCBOYU4sIE5hTiwgTmFOLCBOYU4pOwogIHJldHVybiBub2RlcyA9PSBudWxs ID8gdHJlZSA6IHRyZWUuYWRkQWxsKG5vZGVzKTsKfQoKZnVuY3Rpb24gUXVhZHRyZWUoeCwgeSwg eDAsIHkwLCB4MSwgeTEpIHsKICB0aGlzLl94ID0geDsKICB0aGlzLl95ID0geTsKICB0aGlzLl94 MCA9IHgwOwogIHRoaXMuX3kwID0geTA7CiAgdGhpcy5feDEgPSB4MTsKICB0aGlzLl95MSA9IHkx OwogIHRoaXMuX3Jvb3QgPSB1bmRlZmluZWQ7Cn0KCmZ1bmN0aW9uIGxlYWZfY29weShsZWFmKSB7 CiAgdmFyIGNvcHkgPSB7ZGF0YTogbGVhZi5kYXRhfSwgbmV4dCA9IGNvcHk7CiAgd2hpbGUgKGxl YWYgPSBsZWFmLm5leHQpIG5leHQgPSBuZXh0Lm5leHQgPSB7ZGF0YTogbGVhZi5kYXRhfTsKICBy ZXR1cm4gY29weTsKfQoKdmFyIHRyZWVQcm90byA9IHF1YWR0cmVlLnByb3RvdHlwZSA9IFF1YWR0 cmVlLnByb3RvdHlwZTsKCnRyZWVQcm90by5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgdmFyIGNvcHkg PSBuZXcgUXVhZHRyZWUodGhpcy5feCwgdGhpcy5feSwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlz Ll94MSwgdGhpcy5feTEpLAogICAgICBub2RlID0gdGhpcy5fcm9vdCwKICAgICAgbm9kZXMsCiAg ICAgIGNoaWxkOwoKICBpZiAoIW5vZGUpIHJldHVybiBjb3B5OwoKICBpZiAoIW5vZGUubGVuZ3Ro KSByZXR1cm4gY29weS5fcm9vdCA9IGxlYWZfY29weShub2RlKSwgY29weTsKCiAgbm9kZXMgPSBb e3NvdXJjZTogbm9kZSwgdGFyZ2V0OiBjb3B5Ll9yb290ID0gbmV3IEFycmF5KDQpfV07CiAgd2hp bGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyArK2kp IHsKICAgICAgaWYgKGNoaWxkID0gbm9kZS5zb3VyY2VbaV0pIHsKICAgICAgICBpZiAoY2hpbGQu bGVuZ3RoKSBub2Rlcy5wdXNoKHtzb3VyY2U6IGNoaWxkLCB0YXJnZXQ6IG5vZGUudGFyZ2V0W2ld ID0gbmV3IEFycmF5KDQpfSk7CiAgICAgICAgZWxzZSBub2RlLnRhcmdldFtpXSA9IGxlYWZfY29w eShjaGlsZCk7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiBjb3B5Owp9OwoKdHJlZVByb3Rv LmFkZCA9IHRyZWVfYWRkOwp0cmVlUHJvdG8uYWRkQWxsID0gYWRkQWxsOwp0cmVlUHJvdG8uY292 ZXIgPSB0cmVlX2NvdmVyOwp0cmVlUHJvdG8uZGF0YSA9IHRyZWVfZGF0YTsKdHJlZVByb3RvLmV4 dGVudCA9IHRyZWVfZXh0ZW50Owp0cmVlUHJvdG8uZmluZCA9IHRyZWVfZmluZDsKdHJlZVByb3Rv LnJlbW92ZSA9IHRyZWVfcmVtb3ZlOwp0cmVlUHJvdG8ucmVtb3ZlQWxsID0gcmVtb3ZlQWxsOwp0 cmVlUHJvdG8ucm9vdCA9IHRyZWVfcm9vdDsKdHJlZVByb3RvLnNpemUgPSB0cmVlX3NpemU7CnRy ZWVQcm90by52aXNpdCA9IHRyZWVfdmlzaXQ7CnRyZWVQcm90by52aXNpdEFmdGVyID0gdHJlZV92 aXNpdEFmdGVyOwp0cmVlUHJvdG8ueCA9IHRyZWVfeDsKdHJlZVByb3RvLnkgPSB0cmVlX3k7Cgpm dW5jdGlvbiB4KGQpIHsKICByZXR1cm4gZC54ICsgZC52eDsKfQoKZnVuY3Rpb24geShkKSB7CiAg cmV0dXJuIGQueSArIGQudnk7Cn0KCmZ1bmN0aW9uIGNvbGxpZGUocmFkaXVzKSB7CiAgdmFyIG5v ZGVzLAogICAgICByYWRpaSwKICAgICAgc3RyZW5ndGggPSAxLAogICAgICBpdGVyYXRpb25zID0g MTsKCiAgaWYgKHR5cGVvZiByYWRpdXMgIT09ICJmdW5jdGlvbiIpIHJhZGl1cyA9IGNvbnN0YW50 JDcocmFkaXVzID09IG51bGwgPyAxIDogK3JhZGl1cyk7CgogIGZ1bmN0aW9uIGZvcmNlKCkgewog ICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgICAgdHJlZSwKICAgICAgICBub2RlLAog ICAgICAgIHhpLAogICAgICAgIHlpLAogICAgICAgIHJpLAogICAgICAgIHJpMjsKCiAgICBmb3Ig KHZhciBrID0gMDsgayA8IGl0ZXJhdGlvbnM7ICsraykgewogICAgICB0cmVlID0gcXVhZHRyZWUo bm9kZXMsIHgsIHkpLnZpc2l0QWZ0ZXIocHJlcGFyZSk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBu OyArK2kpIHsKICAgICAgICBub2RlID0gbm9kZXNbaV07CiAgICAgICAgcmkgPSByYWRpaVtub2Rl LmluZGV4XSwgcmkyID0gcmkgKiByaTsKICAgICAgICB4aSA9IG5vZGUueCArIG5vZGUudng7CiAg ICAgICAgeWkgPSBub2RlLnkgKyBub2RlLnZ5OwogICAgICAgIHRyZWUudmlzaXQoYXBwbHkpOwog ICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHkocXVhZCwgeDAsIHkwLCB4MSwgeTEpIHsK ICAgICAgdmFyIGRhdGEgPSBxdWFkLmRhdGEsIHJqID0gcXVhZC5yLCByID0gcmkgKyByajsKICAg ICAgaWYgKGRhdGEpIHsKICAgICAgICBpZiAoZGF0YS5pbmRleCA+IG5vZGUuaW5kZXgpIHsKICAg ICAgICAgIHZhciB4ID0geGkgLSBkYXRhLnggLSBkYXRhLnZ4LAogICAgICAgICAgICAgIHkgPSB5 aSAtIGRhdGEueSAtIGRhdGEudnksCiAgICAgICAgICAgICAgbCA9IHggKiB4ICsgeSAqIHk7CiAg ICAgICAgICBpZiAobCA8IHIgKiByKSB7CiAgICAgICAgICAgIGlmICh4ID09PSAwKSB4ID0gamln Z2xlKCksIGwgKz0geCAqIHg7CiAgICAgICAgICAgIGlmICh5ID09PSAwKSB5ID0gamlnZ2xlKCks IGwgKz0geSAqIHk7CiAgICAgICAgICAgIGwgPSAociAtIChsID0gTWF0aC5zcXJ0KGwpKSkgLyBs ICogc3RyZW5ndGg7CiAgICAgICAgICAgIG5vZGUudnggKz0gKHggKj0gbCkgKiAociA9IChyaiAq PSByaikgLyAocmkyICsgcmopKTsKICAgICAgICAgICAgbm9kZS52eSArPSAoeSAqPSBsKSAqIHI7 CiAgICAgICAgICAgIGRhdGEudnggLT0geCAqIChyID0gMSAtIHIpOwogICAgICAgICAgICBkYXRh LnZ5IC09IHkgKiByOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAg IH0KICAgICAgcmV0dXJuIHgwID4geGkgKyByIHx8IHgxIDwgeGkgLSByIHx8IHkwID4geWkgKyBy IHx8IHkxIDwgeWkgLSByOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcHJlcGFyZShxdWFkKSB7CiAg ICBpZiAocXVhZC5kYXRhKSByZXR1cm4gcXVhZC5yID0gcmFkaWlbcXVhZC5kYXRhLmluZGV4XTsK ICAgIGZvciAodmFyIGkgPSBxdWFkLnIgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgIGlmIChxdWFk W2ldICYmIHF1YWRbaV0uciA+IHF1YWQucikgewogICAgICAgIHF1YWQuciA9IHF1YWRbaV0ucjsK ICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHsKICAgIGlmICghbm9k ZXMpIHJldHVybjsKICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlOwogICAgcmFkaWkg PSBuZXcgQXJyYXkobik7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBub2RlID0gbm9kZXNb aV0sIHJhZGlpW25vZGUuaW5kZXhdID0gK3JhZGl1cyhub2RlLCBpLCBub2Rlcyk7CiAgfQoKICBm b3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykgewogICAgbm9kZXMgPSBfOwogICAgaW5pdGlh bGl6ZSgpOwogIH07CgogIGZvcmNlLml0ZXJhdGlvbnMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1 cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpdGVyYXRpb25zID0gK18sIGZvcmNlKSA6IGl0ZXJhdGlv bnM7CiAgfTsKCiAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJn dW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9ICtfLCBmb3JjZSkgOiBzdHJlbmd0aDsKICB9OwoK ICBmb3JjZS5yYWRpdXMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/IChyYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ3KCtf KSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiByYWRpdXM7CiAgfTsKCiAgcmV0dXJuIGZvcmNlOwp9 CgpmdW5jdGlvbiBpbmRleChkKSB7CiAgcmV0dXJuIGQuaW5kZXg7Cn0KCmZ1bmN0aW9uIGZpbmQo bm9kZUJ5SWQsIG5vZGVJZCkgewogIHZhciBub2RlID0gbm9kZUJ5SWQuZ2V0KG5vZGVJZCk7CiAg aWYgKCFub2RlKSB0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIgKyBub2RlSWQpOwogIHJldHVy biBub2RlOwp9CgpmdW5jdGlvbiBsaW5rKGxpbmtzKSB7CiAgdmFyIGlkID0gaW5kZXgsCiAgICAg IHN0cmVuZ3RoID0gZGVmYXVsdFN0cmVuZ3RoLAogICAgICBzdHJlbmd0aHMsCiAgICAgIGRpc3Rh bmNlID0gY29uc3RhbnQkNygzMCksCiAgICAgIGRpc3RhbmNlcywKICAgICAgbm9kZXMsCiAgICAg IGNvdW50LAogICAgICBiaWFzLAogICAgICBpdGVyYXRpb25zID0gMTsKCiAgaWYgKGxpbmtzID09 IG51bGwpIGxpbmtzID0gW107CgogIGZ1bmN0aW9uIGRlZmF1bHRTdHJlbmd0aChsaW5rKSB7CiAg ICByZXR1cm4gMSAvIE1hdGgubWluKGNvdW50W2xpbmsuc291cmNlLmluZGV4XSwgY291bnRbbGlu ay50YXJnZXQuaW5kZXhdKTsKICB9CgogIGZ1bmN0aW9uIGZvcmNlKGFscGhhKSB7CiAgICBmb3Ig KHZhciBrID0gMCwgbiA9IGxpbmtzLmxlbmd0aDsgayA8IGl0ZXJhdGlvbnM7ICsraykgewogICAg ICBmb3IgKHZhciBpID0gMCwgbGluaywgc291cmNlLCB0YXJnZXQsIHgsIHksIGwsIGI7IGkgPCBu OyArK2kpIHsKICAgICAgICBsaW5rID0gbGlua3NbaV0sIHNvdXJjZSA9IGxpbmsuc291cmNlLCB0 YXJnZXQgPSBsaW5rLnRhcmdldDsKICAgICAgICB4ID0gdGFyZ2V0LnggKyB0YXJnZXQudnggLSBz b3VyY2UueCAtIHNvdXJjZS52eCB8fCBqaWdnbGUoKTsKICAgICAgICB5ID0gdGFyZ2V0LnkgKyB0 YXJnZXQudnkgLSBzb3VyY2UueSAtIHNvdXJjZS52eSB8fCBqaWdnbGUoKTsKICAgICAgICBsID0g TWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpOwogICAgICAgIGwgPSAobCAtIGRpc3RhbmNlc1tpXSkg LyBsICogYWxwaGEgKiBzdHJlbmd0aHNbaV07CiAgICAgICAgeCAqPSBsLCB5ICo9IGw7CiAgICAg ICAgdGFyZ2V0LnZ4IC09IHggKiAoYiA9IGJpYXNbaV0pOwogICAgICAgIHRhcmdldC52eSAtPSB5 ICogYjsKICAgICAgICBzb3VyY2UudnggKz0geCAqIChiID0gMSAtIGIpOwogICAgICAgIHNvdXJj ZS52eSArPSB5ICogYjsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgp IHsKICAgIGlmICghbm9kZXMpIHJldHVybjsKCiAgICB2YXIgaSwKICAgICAgICBuID0gbm9kZXMu bGVuZ3RoLAogICAgICAgIG0gPSBsaW5rcy5sZW5ndGgsCiAgICAgICAgbm9kZUJ5SWQgPSBtYXAk MShub2RlcywgaWQpLAogICAgICAgIGxpbms7CgogICAgZm9yIChpID0gMCwgY291bnQgPSBuZXcg QXJyYXkobik7IGkgPCBtOyArK2kpIHsKICAgICAgbGluayA9IGxpbmtzW2ldLCBsaW5rLmluZGV4 ID0gaTsKICAgICAgaWYgKHR5cGVvZiBsaW5rLnNvdXJjZSAhPT0gIm9iamVjdCIpIGxpbmsuc291 cmNlID0gZmluZChub2RlQnlJZCwgbGluay5zb3VyY2UpOwogICAgICBpZiAodHlwZW9mIGxpbmsu dGFyZ2V0ICE9PSAib2JqZWN0IikgbGluay50YXJnZXQgPSBmaW5kKG5vZGVCeUlkLCBsaW5rLnRh cmdldCk7CiAgICAgIGNvdW50W2xpbmsuc291cmNlLmluZGV4XSA9IChjb3VudFtsaW5rLnNvdXJj ZS5pbmRleF0gfHwgMCkgKyAxOwogICAgICBjb3VudFtsaW5rLnRhcmdldC5pbmRleF0gPSAoY291 bnRbbGluay50YXJnZXQuaW5kZXhdIHx8IDApICsgMTsKICAgIH0KCiAgICBmb3IgKGkgPSAwLCBi aWFzID0gbmV3IEFycmF5KG0pOyBpIDwgbTsgKytpKSB7CiAgICAgIGxpbmsgPSBsaW5rc1tpXSwg Ymlhc1tpXSA9IGNvdW50W2xpbmsuc291cmNlLmluZGV4XSAvIChjb3VudFtsaW5rLnNvdXJjZS5p bmRleF0gKyBjb3VudFtsaW5rLnRhcmdldC5pbmRleF0pOwogICAgfQoKICAgIHN0cmVuZ3RocyA9 IG5ldyBBcnJheShtKSwgaW5pdGlhbGl6ZVN0cmVuZ3RoKCk7CiAgICBkaXN0YW5jZXMgPSBuZXcg QXJyYXkobSksIGluaXRpYWxpemVEaXN0YW5jZSgpOwogIH0KCiAgZnVuY3Rpb24gaW5pdGlhbGl6 ZVN0cmVuZ3RoKCkgewogICAgaWYgKCFub2RlcykgcmV0dXJuOwoKICAgIGZvciAodmFyIGkgPSAw LCBuID0gbGlua3MubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgIHN0cmVuZ3Roc1tpXSA9ICtz dHJlbmd0aChsaW5rc1tpXSwgaSwgbGlua3MpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdGlh bGl6ZURpc3RhbmNlKCkgewogICAgaWYgKCFub2RlcykgcmV0dXJuOwoKICAgIGZvciAodmFyIGkg PSAwLCBuID0gbGlua3MubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgIGRpc3RhbmNlc1tpXSA9 ICtkaXN0YW5jZShsaW5rc1tpXSwgaSwgbGlua3MpOwogICAgfQogIH0KCiAgZm9yY2UuaW5pdGlh bGl6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIG5vZGVzID0gXzsKICAgIGluaXRpYWxpemUoKTsKICB9 OwoKICBmb3JjZS5saW5rcyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVu Z3RoID8gKGxpbmtzID0gXywgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBsaW5rczsKICB9OwoKICBm b3JjZS5pZCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGlk ID0gXywgZm9yY2UpIDogaWQ7CiAgfTsKCiAgZm9yY2UuaXRlcmF0aW9ucyA9IGZ1bmN0aW9uKF8p IHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGl0ZXJhdGlvbnMgPSArXywgZm9yY2Up IDogaXRlcmF0aW9uczsKICB9OwoKICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHsKICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3RoID0gdHlwZW9mIF8gPT09ICJmdW5j dGlvbiIgPyBfIDogY29uc3RhbnQkNygrXyksIGluaXRpYWxpemVTdHJlbmd0aCgpLCBmb3JjZSkg OiBzdHJlbmd0aDsKICB9OwoKICBmb3JjZS5kaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRpc3RhbmNlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlv biIgPyBfIDogY29uc3RhbnQkNygrXyksIGluaXRpYWxpemVEaXN0YW5jZSgpLCBmb3JjZSkgOiBk aXN0YW5jZTsKICB9OwoKICByZXR1cm4gZm9yY2U7Cn0KCmZ1bmN0aW9uIHgkMShkKSB7CiAgcmV0 dXJuIGQueDsKfQoKZnVuY3Rpb24geSQxKGQpIHsKICByZXR1cm4gZC55Owp9Cgp2YXIgaW5pdGlh bFJhZGl1cyA9IDEwLAogICAgaW5pdGlhbEFuZ2xlID0gTWF0aC5QSSAqICgzIC0gTWF0aC5zcXJ0 KDUpKTsKCmZ1bmN0aW9uIHNpbXVsYXRpb24obm9kZXMpIHsKICB2YXIgc2ltdWxhdGlvbiwKICAg ICAgYWxwaGEgPSAxLAogICAgICBhbHBoYU1pbiA9IDAuMDAxLAogICAgICBhbHBoYURlY2F5ID0g MSAtIE1hdGgucG93KGFscGhhTWluLCAxIC8gMzAwKSwKICAgICAgYWxwaGFUYXJnZXQgPSAwLAog ICAgICB2ZWxvY2l0eURlY2F5ID0gMC42LAogICAgICBmb3JjZXMgPSBtYXAkMSgpLAogICAgICBz dGVwcGVyID0gdGltZXIoc3RlcCksCiAgICAgIGV2ZW50ID0gZGlzcGF0Y2goInRpY2siLCAiZW5k Iik7CgogIGlmIChub2RlcyA9PSBudWxsKSBub2RlcyA9IFtdOwoKICBmdW5jdGlvbiBzdGVwKCkg ewogICAgdGljaygpOwogICAgZXZlbnQuY2FsbCgidGljayIsIHNpbXVsYXRpb24pOwogICAgaWYg KGFscGhhIDwgYWxwaGFNaW4pIHsKICAgICAgc3RlcHBlci5zdG9wKCk7CiAgICAgIGV2ZW50LmNh bGwoImVuZCIsIHNpbXVsYXRpb24pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdGljayhpdGVyYXRp b25zKSB7CiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsKCiAgICBpZiAoaXRlcmF0 aW9ucyA9PT0gdW5kZWZpbmVkKSBpdGVyYXRpb25zID0gMTsKCiAgICBmb3IgKHZhciBrID0gMDsg ayA8IGl0ZXJhdGlvbnM7ICsraykgewogICAgICBhbHBoYSArPSAoYWxwaGFUYXJnZXQgLSBhbHBo YSkgKiBhbHBoYURlY2F5OwoKICAgICAgZm9yY2VzLmVhY2goZnVuY3Rpb24gKGZvcmNlKSB7CiAg ICAgICAgZm9yY2UoYWxwaGEpOwogICAgICB9KTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyAr K2kpIHsKICAgICAgICBub2RlID0gbm9kZXNbaV07CiAgICAgICAgaWYgKG5vZGUuZnggPT0gbnVs bCkgbm9kZS54ICs9IG5vZGUudnggKj0gdmVsb2NpdHlEZWNheTsKICAgICAgICBlbHNlIG5vZGUu eCA9IG5vZGUuZngsIG5vZGUudnggPSAwOwogICAgICAgIGlmIChub2RlLmZ5ID09IG51bGwpIG5v ZGUueSArPSBub2RlLnZ5ICo9IHZlbG9jaXR5RGVjYXk7CiAgICAgICAgZWxzZSBub2RlLnkgPSBu b2RlLmZ5LCBub2RlLnZ5ID0gMDsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBzaW11bGF0aW9u OwogIH0KCiAgZnVuY3Rpb24gaW5pdGlhbGl6ZU5vZGVzKCkgewogICAgZm9yICh2YXIgaSA9IDAs IG4gPSBub2Rlcy5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHsKICAgICAgbm9kZSA9IG5vZGVz W2ldLCBub2RlLmluZGV4ID0gaTsKICAgICAgaWYgKG5vZGUuZnggIT0gbnVsbCkgbm9kZS54ID0g bm9kZS5meDsKICAgICAgaWYgKG5vZGUuZnkgIT0gbnVsbCkgbm9kZS55ID0gbm9kZS5meTsKICAg ICAgaWYgKGlzTmFOKG5vZGUueCkgfHwgaXNOYU4obm9kZS55KSkgewogICAgICAgIHZhciByYWRp dXMgPSBpbml0aWFsUmFkaXVzICogTWF0aC5zcXJ0KGkpLCBhbmdsZSA9IGkgKiBpbml0aWFsQW5n bGU7CiAgICAgICAgbm9kZS54ID0gcmFkaXVzICogTWF0aC5jb3MoYW5nbGUpOwogICAgICAgIG5v ZGUueSA9IHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlKTsKICAgICAgfQogICAgICBpZiAoaXNOYU4o bm9kZS52eCkgfHwgaXNOYU4obm9kZS52eSkpIHsKICAgICAgICBub2RlLnZ4ID0gbm9kZS52eSA9 IDA7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGluaXRpYWxpemVGb3JjZShmb3JjZSkg ewogICAgaWYgKGZvcmNlLmluaXRpYWxpemUpIGZvcmNlLmluaXRpYWxpemUobm9kZXMpOwogICAg cmV0dXJuIGZvcmNlOwogIH0KCiAgaW5pdGlhbGl6ZU5vZGVzKCk7CgogIHJldHVybiBzaW11bGF0 aW9uID0gewogICAgdGljazogdGljaywKCiAgICByZXN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAg cmV0dXJuIHN0ZXBwZXIucmVzdGFydChzdGVwKSwgc2ltdWxhdGlvbjsKICAgIH0sCgogICAgc3Rv cDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzdGVwcGVyLnN0b3AoKSwgc2ltdWxhdGlvbjsK ICAgIH0sCgogICAgbm9kZXM6IGZ1bmN0aW9uKF8pIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5s ZW5ndGggPyAobm9kZXMgPSBfLCBpbml0aWFsaXplTm9kZXMoKSwgZm9yY2VzLmVhY2goaW5pdGlh bGl6ZUZvcmNlKSwgc2ltdWxhdGlvbikgOiBub2RlczsKICAgIH0sCgogICAgYWxwaGE6IGZ1bmN0 aW9uKF8pIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGEgPSArXywgc2lt dWxhdGlvbikgOiBhbHBoYTsKICAgIH0sCgogICAgYWxwaGFNaW46IGZ1bmN0aW9uKF8pIHsKICAg ICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFNaW4gPSArXywgc2ltdWxhdGlvbikg OiBhbHBoYU1pbjsKICAgIH0sCgogICAgYWxwaGFEZWNheTogZnVuY3Rpb24oXykgewogICAgICBy ZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYURlY2F5ID0gK18sIHNpbXVsYXRpb24pIDog K2FscGhhRGVjYXk7CiAgICB9LAoKICAgIGFscGhhVGFyZ2V0OiBmdW5jdGlvbihfKSB7CiAgICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFscGhhVGFyZ2V0ID0gK18sIHNpbXVsYXRpb24p IDogYWxwaGFUYXJnZXQ7CiAgICB9LAoKICAgIHZlbG9jaXR5RGVjYXk6IGZ1bmN0aW9uKF8pIHsK ICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmVsb2NpdHlEZWNheSA9IDEgLSBfLCBz aW11bGF0aW9uKSA6IDEgLSB2ZWxvY2l0eURlY2F5OwogICAgfSwKCiAgICBmb3JjZTogZnVuY3Rp b24obmFtZSwgXykgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAoKF8gPT0g bnVsbCA/IGZvcmNlcy5yZW1vdmUobmFtZSkgOiBmb3JjZXMuc2V0KG5hbWUsIGluaXRpYWxpemVG b3JjZShfKSkpLCBzaW11bGF0aW9uKSA6IGZvcmNlcy5nZXQobmFtZSk7CiAgICB9LAoKICAgIGZp bmQ6IGZ1bmN0aW9uKHgsIHksIHJhZGl1cykgewogICAgICB2YXIgaSA9IDAsCiAgICAgICAgICBu ID0gbm9kZXMubGVuZ3RoLAogICAgICAgICAgZHgsCiAgICAgICAgICBkeSwKICAgICAgICAgIGQy LAogICAgICAgICAgbm9kZSwKICAgICAgICAgIGNsb3Nlc3Q7CgogICAgICBpZiAocmFkaXVzID09 IG51bGwpIHJhZGl1cyA9IEluZmluaXR5OwogICAgICBlbHNlIHJhZGl1cyAqPSByYWRpdXM7Cgog ICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgbm9kZSA9IG5vZGVzW2ldOwog ICAgICAgIGR4ID0geCAtIG5vZGUueDsKICAgICAgICBkeSA9IHkgLSBub2RlLnk7CiAgICAgICAg ZDIgPSBkeCAqIGR4ICsgZHkgKiBkeTsKICAgICAgICBpZiAoZDIgPCByYWRpdXMpIGNsb3Nlc3Qg PSBub2RlLCByYWRpdXMgPSBkMjsKICAgICAgfQoKICAgICAgcmV0dXJuIGNsb3Nlc3Q7CiAgICB9 LAoKICAgIG9uOiBmdW5jdGlvbihuYW1lLCBfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVu Z3RoID4gMSA/IChldmVudC5vbihuYW1lLCBfKSwgc2ltdWxhdGlvbikgOiBldmVudC5vbihuYW1l KTsKICAgIH0KICB9Owp9CgpmdW5jdGlvbiBtYW55Qm9keSgpIHsKICB2YXIgbm9kZXMsCiAgICAg IG5vZGUsCiAgICAgIGFscGhhLAogICAgICBzdHJlbmd0aCA9IGNvbnN0YW50JDcoLTMwKSwKICAg ICAgc3RyZW5ndGhzLAogICAgICBkaXN0YW5jZU1pbjIgPSAxLAogICAgICBkaXN0YW5jZU1heDIg PSBJbmZpbml0eSwKICAgICAgdGhldGEyID0gMC44MTsKCiAgZnVuY3Rpb24gZm9yY2UoXykgewog ICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsIHRyZWUgPSBxdWFkdHJlZShub2RlcywgeCQxLCB5 JDEpLnZpc2l0QWZ0ZXIoYWNjdW11bGF0ZSk7CiAgICBmb3IgKGFscGhhID0gXywgaSA9IDA7IGkg PCBuOyArK2kpIG5vZGUgPSBub2Rlc1tpXSwgdHJlZS52aXNpdChhcHBseSk7CiAgfQoKICBmdW5j dGlvbiBpbml0aWFsaXplKCkgewogICAgaWYgKCFub2RlcykgcmV0dXJuOwogICAgdmFyIGksIG4g PSBub2Rlcy5sZW5ndGgsIG5vZGU7CiAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobik7CiAgICBm b3IgKGkgPSAwOyBpIDwgbjsgKytpKSBub2RlID0gbm9kZXNbaV0sIHN0cmVuZ3Roc1tub2RlLmlu ZGV4XSA9ICtzdHJlbmd0aChub2RlLCBpLCBub2Rlcyk7CiAgfQoKICBmdW5jdGlvbiBhY2N1bXVs YXRlKHF1YWQpIHsKICAgIHZhciBzdHJlbmd0aCA9IDAsIHEsIGMsIHdlaWdodCA9IDAsIHgsIHks IGk7CgogICAgLy8gRm9yIGludGVybmFsIG5vZGVzLCBhY2N1bXVsYXRlIGZvcmNlcyBmcm9tIGNo aWxkIHF1YWRyYW50cy4KICAgIGlmIChxdWFkLmxlbmd0aCkgewogICAgICBmb3IgKHggPSB5ID0g aSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICBpZiAoKHEgPSBxdWFkW2ldKSAmJiAoYyA9IE1h dGguYWJzKHEudmFsdWUpKSkgewogICAgICAgICAgc3RyZW5ndGggKz0gcS52YWx1ZSwgd2VpZ2h0 ICs9IGMsIHggKz0gYyAqIHEueCwgeSArPSBjICogcS55OwogICAgICAgIH0KICAgICAgfQogICAg ICBxdWFkLnggPSB4IC8gd2VpZ2h0OwogICAgICBxdWFkLnkgPSB5IC8gd2VpZ2h0OwogICAgfQoK ICAgIC8vIEZvciBsZWFmIG5vZGVzLCBhY2N1bXVsYXRlIGZvcmNlcyBmcm9tIGNvaW5jaWRlbnQg cXVhZHJhbnRzLgogICAgZWxzZSB7CiAgICAgIHEgPSBxdWFkOwogICAgICBxLnggPSBxLmRhdGEu eDsKICAgICAgcS55ID0gcS5kYXRhLnk7CiAgICAgIGRvIHN0cmVuZ3RoICs9IHN0cmVuZ3Roc1tx LmRhdGEuaW5kZXhdOwogICAgICB3aGlsZSAocSA9IHEubmV4dCk7CiAgICB9CgogICAgcXVhZC52 YWx1ZSA9IHN0cmVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gYXBwbHkocXVhZCwgeDEsIF8sIHgyKSB7 CiAgICBpZiAoIXF1YWQudmFsdWUpIHJldHVybiB0cnVlOwoKICAgIHZhciB4ID0gcXVhZC54IC0g bm9kZS54LAogICAgICAgIHkgPSBxdWFkLnkgLSBub2RlLnksCiAgICAgICAgdyA9IHgyIC0geDEs CiAgICAgICAgbCA9IHggKiB4ICsgeSAqIHk7CgogICAgLy8gQXBwbHkgdGhlIEJhcm5lcy1IdXQg YXBwcm94aW1hdGlvbiBpZiBwb3NzaWJsZS4KICAgIC8vIExpbWl0IGZvcmNlcyBmb3IgdmVyeSBj bG9zZSBub2RlczsgcmFuZG9taXplIGRpcmVjdGlvbiBpZiBjb2luY2lkZW50LgogICAgaWYgKHcg KiB3IC8gdGhldGEyIDwgbCkgewogICAgICBpZiAobCA8IGRpc3RhbmNlTWF4MikgewogICAgICAg IGlmICh4ID09PSAwKSB4ID0gamlnZ2xlKCksIGwgKz0geCAqIHg7CiAgICAgICAgaWYgKHkgPT09 IDApIHkgPSBqaWdnbGUoKSwgbCArPSB5ICogeTsKICAgICAgICBpZiAobCA8IGRpc3RhbmNlTWlu MikgbCA9IE1hdGguc3FydChkaXN0YW5jZU1pbjIgKiBsKTsKICAgICAgICBub2RlLnZ4ICs9IHgg KiBxdWFkLnZhbHVlICogYWxwaGEgLyBsOwogICAgICAgIG5vZGUudnkgKz0geSAqIHF1YWQudmFs dWUgKiBhbHBoYSAvIGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8g T3RoZXJ3aXNlLCBwcm9jZXNzIHBvaW50cyBkaXJlY3RseS4KICAgIGVsc2UgaWYgKHF1YWQubGVu Z3RoIHx8IGwgPj0gZGlzdGFuY2VNYXgyKSByZXR1cm47CgogICAgLy8gTGltaXQgZm9yY2VzIGZv ciB2ZXJ5IGNsb3NlIG5vZGVzOyByYW5kb21pemUgZGlyZWN0aW9uIGlmIGNvaW5jaWRlbnQuCiAg ICBpZiAocXVhZC5kYXRhICE9PSBub2RlIHx8IHF1YWQubmV4dCkgewogICAgICBpZiAoeCA9PT0g MCkgeCA9IGppZ2dsZSgpLCBsICs9IHggKiB4OwogICAgICBpZiAoeSA9PT0gMCkgeSA9IGppZ2ds ZSgpLCBsICs9IHkgKiB5OwogICAgICBpZiAobCA8IGRpc3RhbmNlTWluMikgbCA9IE1hdGguc3Fy dChkaXN0YW5jZU1pbjIgKiBsKTsKICAgIH0KCiAgICBkbyBpZiAocXVhZC5kYXRhICE9PSBub2Rl KSB7CiAgICAgIHcgPSBzdHJlbmd0aHNbcXVhZC5kYXRhLmluZGV4XSAqIGFscGhhIC8gbDsKICAg ICAgbm9kZS52eCArPSB4ICogdzsKICAgICAgbm9kZS52eSArPSB5ICogdzsKICAgIH0gd2hpbGUg KHF1YWQgPSBxdWFkLm5leHQpOwogIH0KCiAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF8p IHsKICAgIG5vZGVzID0gXzsKICAgIGluaXRpYWxpemUoKTsKICB9OwoKICBmb3JjZS5zdHJlbmd0 aCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3Ro ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNygrXyksIGluaXRpYWxp emUoKSwgZm9yY2UpIDogc3RyZW5ndGg7CiAgfTsKCiAgZm9yY2UuZGlzdGFuY2VNaW4gPSBmdW5j dGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkaXN0YW5jZU1pbjIgPSBf ICogXywgZm9yY2UpIDogTWF0aC5zcXJ0KGRpc3RhbmNlTWluMik7CiAgfTsKCiAgZm9yY2UuZGlz dGFuY2VNYXggPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChk aXN0YW5jZU1heDIgPSBfICogXywgZm9yY2UpIDogTWF0aC5zcXJ0KGRpc3RhbmNlTWF4Mik7CiAg fTsKCiAgZm9yY2UudGhldGEgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA/ICh0aGV0YTIgPSBfICogXywgZm9yY2UpIDogTWF0aC5zcXJ0KHRoZXRhMik7CiAgfTsK CiAgcmV0dXJuIGZvcmNlOwp9CgpmdW5jdGlvbiByYWRpYWwocmFkaXVzLCB4LCB5KSB7CiAgdmFy IG5vZGVzLAogICAgICBzdHJlbmd0aCA9IGNvbnN0YW50JDcoMC4xKSwKICAgICAgc3RyZW5ndGhz LAogICAgICByYWRpdXNlczsKCiAgaWYgKHR5cGVvZiByYWRpdXMgIT09ICJmdW5jdGlvbiIpIHJh ZGl1cyA9IGNvbnN0YW50JDcoK3JhZGl1cyk7CiAgaWYgKHggPT0gbnVsbCkgeCA9IDA7CiAgaWYg KHkgPT0gbnVsbCkgeSA9IDA7CgogIGZ1bmN0aW9uIGZvcmNlKGFscGhhKSB7CiAgICBmb3IgKHZh ciBpID0gMCwgbiA9IG5vZGVzLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICB2YXIgbm9kZSA9 IG5vZGVzW2ldLAogICAgICAgICAgZHggPSBub2RlLnggLSB4IHx8IDFlLTYsCiAgICAgICAgICBk eSA9IG5vZGUueSAtIHkgfHwgMWUtNiwKICAgICAgICAgIHIgPSBNYXRoLnNxcnQoZHggKiBkeCAr IGR5ICogZHkpLAogICAgICAgICAgayA9IChyYWRpdXNlc1tpXSAtIHIpICogc3RyZW5ndGhzW2ld ICogYWxwaGEgLyByOwogICAgICBub2RlLnZ4ICs9IGR4ICogazsKICAgICAgbm9kZS52eSArPSBk eSAqIGs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewogICAgaWYgKCFub2Rl cykgcmV0dXJuOwogICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGg7CiAgICBzdHJlbmd0aHMgPSBu ZXcgQXJyYXkobik7CiAgICByYWRpdXNlcyA9IG5ldyBBcnJheShuKTsKICAgIGZvciAoaSA9IDA7 IGkgPCBuOyArK2kpIHsKICAgICAgcmFkaXVzZXNbaV0gPSArcmFkaXVzKG5vZGVzW2ldLCBpLCBu b2Rlcyk7CiAgICAgIHN0cmVuZ3Roc1tpXSA9IGlzTmFOKHJhZGl1c2VzW2ldKSA/IDAgOiArc3Ry ZW5ndGgobm9kZXNbaV0sIGksIG5vZGVzKTsKICAgIH0KICB9CgogIGZvcmNlLmluaXRpYWxpemUg PSBmdW5jdGlvbihfKSB7CiAgICBub2RlcyA9IF8sIGluaXRpYWxpemUoKTsKICB9OwoKICBmb3Jj ZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8g KHN0cmVuZ3RoID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNygrXyks IGluaXRpYWxpemUoKSwgZm9yY2UpIDogc3RyZW5ndGg7CiAgfTsKCiAgZm9yY2UucmFkaXVzID0g ZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gdHlw ZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNygrXyksIGluaXRpYWxpemUoKSwg Zm9yY2UpIDogcmFkaXVzOwogIH07CgogIGZvcmNlLnggPSBmdW5jdGlvbihfKSB7CiAgICByZXR1 cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gK18sIGZvcmNlKSA6IHg7CiAgfTsKCiAgZm9yY2Uu eSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSArXywg Zm9yY2UpIDogeTsKICB9OwoKICByZXR1cm4gZm9yY2U7Cn0KCmZ1bmN0aW9uIHgkMih4KSB7CiAg dmFyIHN0cmVuZ3RoID0gY29uc3RhbnQkNygwLjEpLAogICAgICBub2RlcywKICAgICAgc3RyZW5n dGhzLAogICAgICB4ejsKCiAgaWYgKHR5cGVvZiB4ICE9PSAiZnVuY3Rpb24iKSB4ID0gY29uc3Rh bnQkNyh4ID09IG51bGwgPyAwIDogK3gpOwoKICBmdW5jdGlvbiBmb3JjZShhbHBoYSkgewogICAg Zm9yICh2YXIgaSA9IDAsIG4gPSBub2Rlcy5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHsKICAg ICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLnZ4ICs9ICh4eltpXSAtIG5vZGUueCkgKiBzdHJlbmd0 aHNbaV0gKiBhbHBoYTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7CiAgICBp ZiAoIW5vZGVzKSByZXR1cm47CiAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aDsKICAgIHN0cmVu Z3RocyA9IG5ldyBBcnJheShuKTsKICAgIHh6ID0gbmV3IEFycmF5KG4pOwogICAgZm9yIChpID0g MDsgaSA8IG47ICsraSkgewogICAgICBzdHJlbmd0aHNbaV0gPSBpc05hTih4eltpXSA9ICt4KG5v ZGVzW2ldLCBpLCBub2RlcykpID8gMCA6ICtzdHJlbmd0aChub2Rlc1tpXSwgaSwgbm9kZXMpOwog ICAgfQogIH0KCiAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIG5vZGVzID0g XzsKICAgIGluaXRpYWxpemUoKTsKICB9OwoKICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8p IHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3RoID0gdHlwZW9mIF8gPT09 ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNygrXyksIGluaXRpYWxpemUoKSwgZm9yY2UpIDog c3RyZW5ndGg7CiAgfTsKCiAgZm9yY2UueCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1 bWVudHMubGVuZ3RoID8gKHggPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFu dCQ3KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiB4OwogIH07CgogIHJldHVybiBmb3JjZTsK fQoKZnVuY3Rpb24geSQyKHkpIHsKICB2YXIgc3RyZW5ndGggPSBjb25zdGFudCQ3KDAuMSksCiAg ICAgIG5vZGVzLAogICAgICBzdHJlbmd0aHMsCiAgICAgIHl6OwoKICBpZiAodHlwZW9mIHkgIT09 ICJmdW5jdGlvbiIpIHkgPSBjb25zdGFudCQ3KHkgPT0gbnVsbCA/IDAgOiAreSk7CgogIGZ1bmN0 aW9uIGZvcmNlKGFscGhhKSB7CiAgICBmb3IgKHZhciBpID0gMCwgbiA9IG5vZGVzLmxlbmd0aCwg bm9kZTsgaSA8IG47ICsraSkgewogICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUudnkgKz0gKHl6 W2ldIC0gbm9kZS55KSAqIHN0cmVuZ3Roc1tpXSAqIGFscGhhOwogICAgfQogIH0KCiAgZnVuY3Rp b24gaW5pdGlhbGl6ZSgpIHsKICAgIGlmICghbm9kZXMpIHJldHVybjsKICAgIHZhciBpLCBuID0g bm9kZXMubGVuZ3RoOwogICAgc3RyZW5ndGhzID0gbmV3IEFycmF5KG4pOwogICAgeXogPSBuZXcg QXJyYXkobik7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIHN0cmVuZ3Roc1tp XSA9IGlzTmFOKHl6W2ldID0gK3kobm9kZXNbaV0sIGksIG5vZGVzKSkgPyAwIDogK3N0cmVuZ3Ro KG5vZGVzW2ldLCBpLCBub2Rlcyk7CiAgICB9CiAgfQoKICBmb3JjZS5pbml0aWFsaXplID0gZnVu Y3Rpb24oXykgewogICAgbm9kZXMgPSBfOwogICAgaW5pdGlhbGl6ZSgpOwogIH07CgogIGZvcmNl LnN0cmVuZ3RoID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAo c3RyZW5ndGggPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ3KCtfKSwg aW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBzdHJlbmd0aDsKICB9OwoKICBmb3JjZS55ID0gZnVuY3Rp b24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IHR5cGVvZiBfID09PSAi ZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDcoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHk7 CiAgfTsKCiAgcmV0dXJuIGZvcmNlOwp9CgovLyBDb21wdXRlcyB0aGUgZGVjaW1hbCBjb2VmZmlj aWVudCBhbmQgZXhwb25lbnQgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgeCB3aXRoCi8vIHNpZ25p ZmljYW50IGRpZ2l0cyBwLCB3aGVyZSB4IGlzIHBvc2l0aXZlIGFuZCBwIGlzIGluIFsxLCAyMV0g b3IgdW5kZWZpbmVkLgovLyBGb3IgZXhhbXBsZSwgZm9ybWF0RGVjaW1hbCgxLjIzKSByZXR1cm5z IFsiMTIzIiwgMF0uCmZ1bmN0aW9uIGZvcm1hdERlY2ltYWwoeCwgcCkgewogIGlmICgoaSA9ICh4 ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhP ZigiZSIpKSA8IDApIHJldHVybiBudWxsOyAvLyBOYU4sIMKxSW5maW5pdHkKICB2YXIgaSwgY29l ZmZpY2llbnQgPSB4LnNsaWNlKDAsIGkpOwoKICAvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRv RXhwb25lbnRpYWwgZWl0aGVyIGhhcyB0aGUgZm9ybSBcZFwuXGQrZVstK11cZCsKICAvLyAoZS5n LiwgMS4yZSszKSBvciB0aGUgZm9ybSBcZGVbLStdXGQrIChlLmcuLCAxZSszKS4KICByZXR1cm4g WwogICAgY29lZmZpY2llbnQubGVuZ3RoID4gMSA/IGNvZWZmaWNpZW50WzBdICsgY29lZmZpY2ll bnQuc2xpY2UoMikgOiBjb2VmZmljaWVudCwKICAgICt4LnNsaWNlKGkgKyAxKQogIF07Cn0KCmZ1 bmN0aW9uIGV4cG9uZW50JDEoeCkgewogIHJldHVybiB4ID0gZm9ybWF0RGVjaW1hbChNYXRoLmFi cyh4KSksIHggPyB4WzFdIDogTmFOOwp9CgpmdW5jdGlvbiBmb3JtYXRHcm91cChncm91cGluZywg dGhvdXNhbmRzKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCB3aWR0aCkgewogICAgdmFyIGkg PSB2YWx1ZS5sZW5ndGgsCiAgICAgICAgdCA9IFtdLAogICAgICAgIGogPSAwLAogICAgICAgIGcg PSBncm91cGluZ1swXSwKICAgICAgICBsZW5ndGggPSAwOwoKICAgIHdoaWxlIChpID4gMCAmJiBn ID4gMCkgewogICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEs IHdpZHRoIC0gbGVuZ3RoKTsKICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkg KyBnKSk7CiAgICAgIGlmICgobGVuZ3RoICs9IGcgKyAxKSA+IHdpZHRoKSBicmVhazsKICAgICAg ZyA9IGdyb3VwaW5nW2ogPSAoaiArIDEpICUgZ3JvdXBpbmcubGVuZ3RoXTsKICAgIH0KCiAgICBy ZXR1cm4gdC5yZXZlcnNlKCkuam9pbih0aG91c2FuZHMpOwogIH07Cn0KCmZ1bmN0aW9uIGZvcm1h dE51bWVyYWxzKG51bWVyYWxzKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICByZXR1 cm4gdmFsdWUucmVwbGFjZSgvWzAtOV0vZywgZnVuY3Rpb24oaSkgewogICAgICByZXR1cm4gbnVt ZXJhbHNbK2ldOwogICAgfSk7CiAgfTsKfQoKLy8gW1tmaWxsXWFsaWduXVtzaWduXVtzeW1ib2xd WzBdW3dpZHRoXVssXVsucHJlY2lzaW9uXVt+XVt0eXBlXQp2YXIgcmUgPSAvXig/OiguKT8oWzw+ PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0p PyQvaTsKCmZ1bmN0aW9uIGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHsKICBpZiAoIShtYXRj aCA9IHJlLmV4ZWMoc3BlY2lmaWVyKSkpIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6 ICIgKyBzcGVjaWZpZXIpOwogIHZhciBtYXRjaDsKICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmll cih7CiAgICBmaWxsOiBtYXRjaFsxXSwKICAgIGFsaWduOiBtYXRjaFsyXSwKICAgIHNpZ246IG1h dGNoWzNdLAogICAgc3ltYm9sOiBtYXRjaFs0XSwKICAgIHplcm86IG1hdGNoWzVdLAogICAgd2lk dGg6IG1hdGNoWzZdLAogICAgY29tbWE6IG1hdGNoWzddLAogICAgcHJlY2lzaW9uOiBtYXRjaFs4 XSAmJiBtYXRjaFs4XS5zbGljZSgxKSwKICAgIHRyaW06IG1hdGNoWzldLAogICAgdHlwZTogbWF0 Y2hbMTBdCiAgfSk7Cn0KCmZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUgPSBGb3JtYXRTcGVjaWZp ZXIucHJvdG90eXBlOyAvLyBpbnN0YW5jZW9mCgpmdW5jdGlvbiBGb3JtYXRTcGVjaWZpZXIoc3Bl Y2lmaWVyKSB7CiAgdGhpcy5maWxsID0gc3BlY2lmaWVyLmZpbGwgPT09IHVuZGVmaW5lZCA/ICIg IiA6IHNwZWNpZmllci5maWxsICsgIiI7CiAgdGhpcy5hbGlnbiA9IHNwZWNpZmllci5hbGlnbiA9 PT0gdW5kZWZpbmVkID8gIj4iIDogc3BlY2lmaWVyLmFsaWduICsgIiI7CiAgdGhpcy5zaWduID0g c3BlY2lmaWVyLnNpZ24gPT09IHVuZGVmaW5lZCA/ICItIiA6IHNwZWNpZmllci5zaWduICsgIiI7 CiAgdGhpcy5zeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sID09PSB1bmRlZmluZWQgPyAiIiA6IHNw ZWNpZmllci5zeW1ib2wgKyAiIjsKICB0aGlzLnplcm8gPSAhIXNwZWNpZmllci56ZXJvOwogIHRo aXMud2lkdGggPSBzcGVjaWZpZXIud2lkdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtz cGVjaWZpZXIud2lkdGg7CiAgdGhpcy5jb21tYSA9ICEhc3BlY2lmaWVyLmNvbW1hOwogIHRoaXMu cHJlY2lzaW9uID0gc3BlY2lmaWVyLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVk IDogK3NwZWNpZmllci5wcmVjaXNpb247CiAgdGhpcy50cmltID0gISFzcGVjaWZpZXIudHJpbTsK ICB0aGlzLnR5cGUgPSBzcGVjaWZpZXIudHlwZSA9PT0gdW5kZWZpbmVkID8gIiIgOiBzcGVjaWZp ZXIudHlwZSArICIiOwp9CgpGb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVu Y3Rpb24oKSB7CiAgcmV0dXJuIHRoaXMuZmlsbAogICAgICArIHRoaXMuYWxpZ24KICAgICAgKyB0 aGlzLnNpZ24KICAgICAgKyB0aGlzLnN5bWJvbAogICAgICArICh0aGlzLnplcm8gPyAiMCIgOiAi IikKICAgICAgKyAodGhpcy53aWR0aCA9PT0gdW5kZWZpbmVkID8gIiIgOiBNYXRoLm1heCgxLCB0 aGlzLndpZHRoIHwgMCkpCiAgICAgICsgKHRoaXMuY29tbWEgPyAiLCIgOiAiIikKICAgICAgKyAo dGhpcy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/ICIiIDogIi4iICsgTWF0aC5tYXgoMCwgdGhp cy5wcmVjaXNpb24gfCAwKSkKICAgICAgKyAodGhpcy50cmltID8gIn4iIDogIiIpCiAgICAgICsg dGhpcy50eXBlOwp9OwoKLy8gVHJpbXMgaW5zaWduaWZpY2FudCB6ZXJvcywgZS5nLiwgcmVwbGFj ZXMgMS4yMDAwayB3aXRoIDEuMmsuCmZ1bmN0aW9uIGZvcm1hdFRyaW0ocykgewogIG91dDogZm9y ICh2YXIgbiA9IHMubGVuZ3RoLCBpID0gMSwgaTAgPSAtMSwgaTE7IGkgPCBuOyArK2kpIHsKICAg IHN3aXRjaCAoc1tpXSkgewogICAgICBjYXNlICIuIjogaTAgPSBpMSA9IGk7IGJyZWFrOwogICAg ICBjYXNlICIwIjogaWYgKGkwID09PSAwKSBpMCA9IGk7IGkxID0gaTsgYnJlYWs7CiAgICAgIGRl ZmF1bHQ6IGlmICghK3NbaV0pIGJyZWFrIG91dDsgaWYgKGkwID4gMCkgaTAgPSAwOyBicmVhazsK ICAgIH0KICB9CiAgcmV0dXJuIGkwID4gMCA/IHMuc2xpY2UoMCwgaTApICsgcy5zbGljZShpMSAr IDEpIDogczsKfQoKdmFyIHByZWZpeEV4cG9uZW50OwoKZnVuY3Rpb24gZm9ybWF0UHJlZml4QXV0 byh4LCBwKSB7CiAgdmFyIGQgPSBmb3JtYXREZWNpbWFsKHgsIHApOwogIGlmICghZCkgcmV0dXJu IHggKyAiIjsKICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLAogICAgICBleHBvbmVudCA9IGRbMV0s CiAgICAgIGkgPSBleHBvbmVudCAtIChwcmVmaXhFeHBvbmVudCA9IE1hdGgubWF4KC04LCBNYXRo Lm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50IC8gMykpKSAqIDMpICsgMSwKICAgICAgbiA9IGNv ZWZmaWNpZW50Lmxlbmd0aDsKICByZXR1cm4gaSA9PT0gbiA/IGNvZWZmaWNpZW50CiAgICAgIDog aSA+IG4gPyBjb2VmZmljaWVudCArIG5ldyBBcnJheShpIC0gbiArIDEpLmpvaW4oIjAiKQogICAg ICA6IGkgPiAwID8gY29lZmZpY2llbnQuc2xpY2UoMCwgaSkgKyAiLiIgKyBjb2VmZmljaWVudC5z bGljZShpKQogICAgICA6ICIwLiIgKyBuZXcgQXJyYXkoMSAtIGkpLmpvaW4oIjAiKSArIGZvcm1h dERlY2ltYWwoeCwgTWF0aC5tYXgoMCwgcCArIGkgLSAxKSlbMF07IC8vIGxlc3MgdGhhbiAxeSEK fQoKZnVuY3Rpb24gZm9ybWF0Um91bmRlZCh4LCBwKSB7CiAgdmFyIGQgPSBmb3JtYXREZWNpbWFs KHgsIHApOwogIGlmICghZCkgcmV0dXJuIHggKyAiIjsKICB2YXIgY29lZmZpY2llbnQgPSBkWzBd LAogICAgICBleHBvbmVudCA9IGRbMV07CiAgcmV0dXJuIGV4cG9uZW50IDwgMCA/ICIwLiIgKyBu ZXcgQXJyYXkoLWV4cG9uZW50KS5qb2luKCIwIikgKyBjb2VmZmljaWVudAogICAgICA6IGNvZWZm aWNpZW50Lmxlbmd0aCA+IGV4cG9uZW50ICsgMSA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGV4cG9u ZW50ICsgMSkgKyAiLiIgKyBjb2VmZmljaWVudC5zbGljZShleHBvbmVudCArIDEpCiAgICAgIDog Y29lZmZpY2llbnQgKyBuZXcgQXJyYXkoZXhwb25lbnQgLSBjb2VmZmljaWVudC5sZW5ndGggKyAy KS5qb2luKCIwIik7Cn0KCnZhciBmb3JtYXRUeXBlcyA9IHsKICAiJSI6IGZ1bmN0aW9uKHgsIHAp IHsgcmV0dXJuICh4ICogMTAwKS50b0ZpeGVkKHApOyB9LAogICJiIjogZnVuY3Rpb24oeCkgeyBy ZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygyKTsgfSwKICAiYyI6IGZ1bmN0aW9uKHgpIHsg cmV0dXJuIHggKyAiIjsgfSwKICAiZCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQo eCkudG9TdHJpbmcoMTApOyB9LAogICJlIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0V4 cG9uZW50aWFsKHApOyB9LAogICJmIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0ZpeGVk KHApOyB9LAogICJnIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b1ByZWNpc2lvbihwKTsg fSwKICAibyI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoOCk7 IH0sCiAgInAiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiBmb3JtYXRSb3VuZGVkKHggKiAxMDAs IHApOyB9LAogICJyIjogZm9ybWF0Um91bmRlZCwKICAicyI6IGZvcm1hdFByZWZpeEF1dG8sCiAg IlgiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KS50b1Vw cGVyQ2FzZSgpOyB9LAogICJ4IjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50 b1N0cmluZygxNik7IH0KfTsKCmZ1bmN0aW9uIGlkZW50aXR5JDMoeCkgewogIHJldHVybiB4Owp9 Cgp2YXIgbWFwJDIgPSBBcnJheS5wcm90b3R5cGUubWFwLAogICAgcHJlZml4ZXMgPSBbInkiLCJ6 IiwiYSIsImYiLCJwIiwibiIsIlx4QjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwi WiIsIlkiXTsKCmZ1bmN0aW9uIGZvcm1hdExvY2FsZShsb2NhbGUpIHsKICB2YXIgZ3JvdXAgPSBs b2NhbGUuZ3JvdXBpbmcgPT09IHVuZGVmaW5lZCB8fCBsb2NhbGUudGhvdXNhbmRzID09PSB1bmRl ZmluZWQgPyBpZGVudGl0eSQzIDogZm9ybWF0R3JvdXAobWFwJDIuY2FsbChsb2NhbGUuZ3JvdXBp bmcsIE51bWJlciksIGxvY2FsZS50aG91c2FuZHMgKyAiIiksCiAgICAgIGN1cnJlbmN5UHJlZml4 ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyAiIiA6IGxvY2FsZS5jdXJyZW5jeVsw XSArICIiLAogICAgICBjdXJyZW5jeVN1ZmZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZp bmVkID8gIiIgOiBsb2NhbGUuY3VycmVuY3lbMV0gKyAiIiwKICAgICAgZGVjaW1hbCA9IGxvY2Fs ZS5kZWNpbWFsID09PSB1bmRlZmluZWQgPyAiLiIgOiBsb2NhbGUuZGVjaW1hbCArICIiLAogICAg ICBudW1lcmFscyA9IGxvY2FsZS5udW1lcmFscyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkkMyA6 IGZvcm1hdE51bWVyYWxzKG1hcCQyLmNhbGwobG9jYWxlLm51bWVyYWxzLCBTdHJpbmcpKSwKICAg ICAgcGVyY2VudCA9IGxvY2FsZS5wZXJjZW50ID09PSB1bmRlZmluZWQgPyAiJSIgOiBsb2NhbGUu cGVyY2VudCArICIiLAogICAgICBtaW51cyA9IGxvY2FsZS5taW51cyA9PT0gdW5kZWZpbmVkID8g Ii0iIDogbG9jYWxlLm1pbnVzICsgIiIsCiAgICAgIG5hbiA9IGxvY2FsZS5uYW4gPT09IHVuZGVm aW5lZCA/ICJOYU4iIDogbG9jYWxlLm5hbiArICIiOwoKICBmdW5jdGlvbiBuZXdGb3JtYXQoc3Bl Y2lmaWVyKSB7CiAgICBzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKTsKCiAg ICB2YXIgZmlsbCA9IHNwZWNpZmllci5maWxsLAogICAgICAgIGFsaWduID0gc3BlY2lmaWVyLmFs aWduLAogICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbiwKICAgICAgICBzeW1ib2wgPSBzcGVj aWZpZXIuc3ltYm9sLAogICAgICAgIHplcm8gPSBzcGVjaWZpZXIuemVybywKICAgICAgICB3aWR0 aCA9IHNwZWNpZmllci53aWR0aCwKICAgICAgICBjb21tYSA9IHNwZWNpZmllci5jb21tYSwKICAg ICAgICBwcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uLAogICAgICAgIHRyaW0gPSBzcGVj aWZpZXIudHJpbSwKICAgICAgICB0eXBlID0gc3BlY2lmaWVyLnR5cGU7CgogICAgLy8gVGhlICJu IiB0eXBlIGlzIGFuIGFsaWFzIGZvciAiLGciLgogICAgaWYgKHR5cGUgPT09ICJuIikgY29tbWEg PSB0cnVlLCB0eXBlID0gImciOwoKICAgIC8vIFRoZSAiIiB0eXBlLCBhbmQgYW55IGludmFsaWQg dHlwZSwgaXMgYW4gYWxpYXMgZm9yICIuMTJ+ZyIuCiAgICBlbHNlIGlmICghZm9ybWF0VHlwZXNb dHlwZV0pIHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkICYmIChwcmVjaXNpb24gPSAxMiksIHRyaW0g PSB0cnVlLCB0eXBlID0gImciOwoKICAgIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBh ZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLgogICAgaWYgKHplcm8gfHwg KGZpbGwgPT09ICIwIiAmJiBhbGlnbiA9PT0gIj0iKSkgemVybyA9IHRydWUsIGZpbGwgPSAiMCIs IGFsaWduID0gIj0iOwoKICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LgogICAg Ly8gRm9yIFNJLXByZWZpeCwgdGhlIHN1ZmZpeCBpcyBsYXppbHkgY29tcHV0ZWQuCiAgICB2YXIg cHJlZml4ID0gc3ltYm9sID09PSAiJCIgPyBjdXJyZW5jeVByZWZpeCA6IHN5bWJvbCA9PT0gIiMi ICYmIC9bYm94WF0vLnRlc3QodHlwZSkgPyAiMCIgKyB0eXBlLnRvTG93ZXJDYXNlKCkgOiAiIiwK ICAgICAgICBzdWZmaXggPSBzeW1ib2wgPT09ICIkIiA/IGN1cnJlbmN5U3VmZml4IDogL1slcF0v LnRlc3QodHlwZSkgPyBwZXJjZW50IDogIiI7CgogICAgLy8gV2hhdCBmb3JtYXQgZnVuY3Rpb24g c2hvdWxkIHdlIHVzZT8KICAgIC8vIElzIHRoaXMgYW4gaW50ZWdlciB0eXBlPwogICAgLy8gQ2Fu IHRoaXMgdHlwZSBnZW5lcmF0ZSBleHBvbmVudGlhbCBub3RhdGlvbj8KICAgIHZhciBmb3JtYXRU eXBlID0gZm9ybWF0VHlwZXNbdHlwZV0sCiAgICAgICAgbWF5YmVTdWZmaXggPSAvW2RlZmdwcnMl XS8udGVzdCh0eXBlKTsKCiAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlmIG5vdCBz cGVjaWZpZWQsCiAgICAvLyBvciBjbGFtcCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiB0byB0aGUg c3VwcG9ydGVkIHJhbmdlLgogICAgLy8gRm9yIHNpZ25pZmljYW50IHByZWNpc2lvbiwgaXQgbXVz dCBiZSBpbiBbMSwgMjFdLgogICAgLy8gRm9yIGZpeGVkIHByZWNpc2lvbiwgaXQgbXVzdCBiZSBp biBbMCwgMjBdLgogICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyA2CiAg ICAgICAgOiAvW2dwcnNdLy50ZXN0KHR5cGUpID8gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHBy ZWNpc2lvbikpCiAgICAgICAgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgcHJlY2lzaW9uKSk7 CgogICAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlKSB7CiAgICAgIHZhciB2YWx1ZVByZWZpeCA9IHBy ZWZpeCwKICAgICAgICAgIHZhbHVlU3VmZml4ID0gc3VmZml4LAogICAgICAgICAgaSwgbiwgYzsK CiAgICAgIGlmICh0eXBlID09PSAiYyIpIHsKICAgICAgICB2YWx1ZVN1ZmZpeCA9IGZvcm1hdFR5 cGUodmFsdWUpICsgdmFsdWVTdWZmaXg7CiAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgfSBlbHNl IHsKICAgICAgICB2YWx1ZSA9ICt2YWx1ZTsKCiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBzaWdu LiAtMCBpcyBub3QgbGVzcyB0aGFuIDAsIGJ1dCAxIC8gLTAgaXMhCiAgICAgICAgdmFyIHZhbHVl TmVnYXRpdmUgPSB2YWx1ZSA8IDAgfHwgMSAvIHZhbHVlIDwgMDsKCiAgICAgICAgLy8gUGVyZm9y bSB0aGUgaW5pdGlhbCBmb3JtYXR0aW5nLgogICAgICAgIHZhbHVlID0gaXNOYU4odmFsdWUpID8g bmFuIDogZm9ybWF0VHlwZShNYXRoLmFicyh2YWx1ZSksIHByZWNpc2lvbik7CgogICAgICAgIC8v IFRyaW0gaW5zaWduaWZpY2FudCB6ZXJvcy4KICAgICAgICBpZiAodHJpbSkgdmFsdWUgPSBmb3Jt YXRUcmltKHZhbHVlKTsKCiAgICAgICAgLy8gSWYgYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgdG8g emVybyBhZnRlciBmb3JtYXR0aW5nLCBhbmQgbm8gZXhwbGljaXQgcG9zaXRpdmUgc2lnbiBpcyBy ZXF1ZXN0ZWQsIGhpZGUgdGhlIHNpZ24uCiAgICAgICAgaWYgKHZhbHVlTmVnYXRpdmUgJiYgK3Zh bHVlID09PSAwICYmIHNpZ24gIT09ICIrIikgdmFsdWVOZWdhdGl2ZSA9IGZhbHNlOwoKICAgICAg ICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC4KICAgICAgICB2YWx1ZVByZWZpeCA9 ICh2YWx1ZU5lZ2F0aXZlID8gKHNpZ24gPT09ICIoIiA/IHNpZ24gOiBtaW51cykgOiBzaWduID09 PSAiLSIgfHwgc2lnbiA9PT0gIigiID8gIiIgOiBzaWduKSArIHZhbHVlUHJlZml4OwogICAgICAg IHZhbHVlU3VmZml4ID0gKHR5cGUgPT09ICJzIiA/IHByZWZpeGVzWzggKyBwcmVmaXhFeHBvbmVu dCAvIDNdIDogIiIpICsgdmFsdWVTdWZmaXggKyAodmFsdWVOZWdhdGl2ZSAmJiBzaWduID09PSAi KCIgPyAiKSIgOiAiIik7CgogICAgICAgIC8vIEJyZWFrIHRoZSBmb3JtYXR0ZWQgdmFsdWUgaW50 byB0aGUgaW50ZWdlciDigJx2YWx1ZeKAnSBwYXJ0IHRoYXQgY2FuIGJlCiAgICAgICAgLy8gZ3Jv dXBlZCwgYW5kIGZyYWN0aW9uYWwgb3IgZXhwb25lbnRpYWwg4oCcc3VmZml44oCdIHBhcnQgdGhh dCBpcyBub3QuCiAgICAgICAgaWYgKG1heWJlU3VmZml4KSB7CiAgICAgICAgICBpID0gLTEsIG4g PSB2YWx1ZS5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgICBp ZiAoYyA9IHZhbHVlLmNoYXJDb2RlQXQoaSksIDQ4ID4gYyB8fCBjID4gNTcpIHsKICAgICAgICAg ICAgICB2YWx1ZVN1ZmZpeCA9IChjID09PSA0NiA/IGRlY2ltYWwgKyB2YWx1ZS5zbGljZShpICsg MSkgOiB2YWx1ZS5zbGljZShpKSkgKyB2YWx1ZVN1ZmZpeDsKICAgICAgICAgICAgICB2YWx1ZSA9 IHZhbHVlLnNsaWNlKDAsIGkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAg ICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0 ZXIgaXMgbm90ICIwIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBiZWZvcmUgcGFkZGluZy4KICAgICAg aWYgKGNvbW1hICYmICF6ZXJvKSB2YWx1ZSA9IGdyb3VwKHZhbHVlLCBJbmZpbml0eSk7CgogICAg ICAvLyBDb21wdXRlIHRoZSBwYWRkaW5nLgogICAgICB2YXIgbGVuZ3RoID0gdmFsdWVQcmVmaXgu bGVuZ3RoICsgdmFsdWUubGVuZ3RoICsgdmFsdWVTdWZmaXgubGVuZ3RoLAogICAgICAgICAgcGFk ZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9p bihmaWxsKSA6ICIiOwoKICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzICIwIiwgZ3Jv dXBpbmcgaXMgYXBwbGllZCBhZnRlciBwYWRkaW5nLgogICAgICBpZiAoY29tbWEgJiYgemVybykg dmFsdWUgPSBncm91cChwYWRkaW5nICsgdmFsdWUsIHBhZGRpbmcubGVuZ3RoID8gd2lkdGggLSB2 YWx1ZVN1ZmZpeC5sZW5ndGggOiBJbmZpbml0eSksIHBhZGRpbmcgPSAiIjsKCiAgICAgIC8vIFJl Y29uc3RydWN0IHRoZSBmaW5hbCBvdXRwdXQgYmFzZWQgb24gdGhlIGRlc2lyZWQgYWxpZ25tZW50 LgogICAgICBzd2l0Y2ggKGFsaWduKSB7CiAgICAgICAgY2FzZSAiPCI6IHZhbHVlID0gdmFsdWVQ cmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZzsgYnJlYWs7CiAgICAgICAgY2Fz ZSAiPSI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyBwYWRkaW5nICsgdmFsdWUgKyB2YWx1ZVN1ZmZp eDsgYnJlYWs7CiAgICAgICAgY2FzZSAiXiI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5n dGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1 ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogdmFs dWUgPSBwYWRkaW5nICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhazsK ICAgICAgfQoKICAgICAgcmV0dXJuIG51bWVyYWxzKHZhbHVlKTsKICAgIH0KCiAgICBmb3JtYXQu dG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHNwZWNpZmllciArICIiOwogICAg fTsKCiAgICByZXR1cm4gZm9ybWF0OwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0UHJlZml4KHNwZWNp ZmllciwgdmFsdWUpIHsKICAgIHZhciBmID0gbmV3Rm9ybWF0KChzcGVjaWZpZXIgPSBmb3JtYXRT cGVjaWZpZXIoc3BlY2lmaWVyKSwgc3BlY2lmaWVyLnR5cGUgPSAiZiIsIHNwZWNpZmllcikpLAog ICAgICAgIGUgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCQx KHZhbHVlKSAvIDMpKSkgKiAzLAogICAgICAgIGsgPSBNYXRoLnBvdygxMCwgLWUpLAogICAgICAg IHByZWZpeCA9IHByZWZpeGVzWzggKyBlIC8gM107CiAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUp IHsKICAgICAgcmV0dXJuIGYoayAqIHZhbHVlKSArIHByZWZpeDsKICAgIH07CiAgfQoKICByZXR1 cm4gewogICAgZm9ybWF0OiBuZXdGb3JtYXQsCiAgICBmb3JtYXRQcmVmaXg6IGZvcm1hdFByZWZp eAogIH07Cn0KCnZhciBsb2NhbGU7CgpkZWZhdWx0TG9jYWxlKHsKICBkZWNpbWFsOiAiLiIsCiAg dGhvdXNhbmRzOiAiLCIsCiAgZ3JvdXBpbmc6IFszXSwKICBjdXJyZW5jeTogWyIkIiwgIiJdLAog IG1pbnVzOiAiLSIKfSk7CgpmdW5jdGlvbiBkZWZhdWx0TG9jYWxlKGRlZmluaXRpb24pIHsKICBs b2NhbGUgPSBmb3JtYXRMb2NhbGUoZGVmaW5pdGlvbik7CiAgZXhwb3J0cy5mb3JtYXQgPSBsb2Nh bGUuZm9ybWF0OwogIGV4cG9ydHMuZm9ybWF0UHJlZml4ID0gbG9jYWxlLmZvcm1hdFByZWZpeDsK ICByZXR1cm4gbG9jYWxlOwp9CgpmdW5jdGlvbiBwcmVjaXNpb25GaXhlZChzdGVwKSB7CiAgcmV0 dXJuIE1hdGgubWF4KDAsIC1leHBvbmVudCQxKE1hdGguYWJzKHN0ZXApKSk7Cn0KCmZ1bmN0aW9u IHByZWNpc2lvblByZWZpeChzdGVwLCB2YWx1ZSkgewogIHJldHVybiBNYXRoLm1heCgwLCBNYXRo Lm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCQxKHZhbHVlKSAvIDMpKSkg KiAzIC0gZXhwb25lbnQkMShNYXRoLmFicyhzdGVwKSkpOwp9CgpmdW5jdGlvbiBwcmVjaXNpb25S b3VuZChzdGVwLCBtYXgpIHsKICBzdGVwID0gTWF0aC5hYnMoc3RlcCksIG1heCA9IE1hdGguYWJz KG1heCkgLSBzdGVwOwogIHJldHVybiBNYXRoLm1heCgwLCBleHBvbmVudCQxKG1heCkgLSBleHBv bmVudCQxKHN0ZXApKSArIDE7Cn0KCi8vIEFkZHMgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB3aXRo IHR3aWNlIHRoZSBub3JtYWwgcHJlY2lzaW9uLgovLyBSZWZlcmVuY2U6IEouIFIuIFNoZXdjaHVr LCBBZGFwdGl2ZSBQcmVjaXNpb24gRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYyBhbmQKLy8gRmFz dCBSb2J1c3QgR2VvbWV0cmljIFByZWRpY2F0ZXMsIERpc2NyZXRlICYgQ29tcHV0YXRpb25hbCBH ZW9tZXRyeSAxOCgzKQovLyAzMDXigJMzNjMgKDE5OTcpLgovLyBDb2RlIGFkYXB0ZWQgZnJvbSBH ZW9ncmFwaGljTGliIGJ5IENoYXJsZXMgRi4gRi4gS2FybmV5LAovLyBodHRwOi8vZ2VvZ3JhcGhp Y2xpYi5zb3VyY2Vmb3JnZS5uZXQvCgpmdW5jdGlvbiBhZGRlcigpIHsKICByZXR1cm4gbmV3IEFk ZGVyOwp9CgpmdW5jdGlvbiBBZGRlcigpIHsKICB0aGlzLnJlc2V0KCk7Cn0KCkFkZGVyLnByb3Rv dHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogQWRkZXIsCiAgcmVzZXQ6IGZ1bmN0aW9uKCkgewogICAg dGhpcy5zID0gLy8gcm91bmRlZCB2YWx1ZQogICAgdGhpcy50ID0gMDsgLy8gZXhhY3QgZXJyb3IK ICB9LAogIGFkZDogZnVuY3Rpb24oeSkgewogICAgYWRkJDEodGVtcCwgeSwgdGhpcy50KTsKICAg IGFkZCQxKHRoaXMsIHRlbXAucywgdGhpcy5zKTsKICAgIGlmICh0aGlzLnMpIHRoaXMudCArPSB0 ZW1wLnQ7CiAgICBlbHNlIHRoaXMucyA9IHRlbXAudDsKICB9LAogIHZhbHVlT2Y6IGZ1bmN0aW9u KCkgewogICAgcmV0dXJuIHRoaXMuczsKICB9Cn07Cgp2YXIgdGVtcCA9IG5ldyBBZGRlcjsKCmZ1 bmN0aW9uIGFkZCQxKGFkZGVyLCBhLCBiKSB7CiAgdmFyIHggPSBhZGRlci5zID0gYSArIGIsCiAg ICAgIGJ2ID0geCAtIGEsCiAgICAgIGF2ID0geCAtIGJ2OwogIGFkZGVyLnQgPSAoYSAtIGF2KSAr IChiIC0gYnYpOwp9Cgp2YXIgZXBzaWxvbiQyID0gMWUtNjsKdmFyIGVwc2lsb24yJDEgPSAxZS0x MjsKdmFyIHBpJDMgPSBNYXRoLlBJOwp2YXIgaGFsZlBpJDIgPSBwaSQzIC8gMjsKdmFyIHF1YXJ0 ZXJQaSA9IHBpJDMgLyA0Owp2YXIgdGF1JDMgPSBwaSQzICogMjsKCnZhciBkZWdyZWVzJDEgPSAx ODAgLyBwaSQzOwp2YXIgcmFkaWFucyA9IHBpJDMgLyAxODA7Cgp2YXIgYWJzID0gTWF0aC5hYnM7 CnZhciBhdGFuID0gTWF0aC5hdGFuOwp2YXIgYXRhbjIgPSBNYXRoLmF0YW4yOwp2YXIgY29zJDEg PSBNYXRoLmNvczsKdmFyIGNlaWwgPSBNYXRoLmNlaWw7CnZhciBleHAgPSBNYXRoLmV4cDsKdmFy IGxvZyA9IE1hdGgubG9nOwp2YXIgcG93ID0gTWF0aC5wb3c7CnZhciBzaW4kMSA9IE1hdGguc2lu Owp2YXIgc2lnbiA9IE1hdGguc2lnbiB8fCBmdW5jdGlvbih4KSB7IHJldHVybiB4ID4gMCA/IDEg OiB4IDwgMCA/IC0xIDogMDsgfTsKdmFyIHNxcnQgPSBNYXRoLnNxcnQ7CnZhciB0YW4gPSBNYXRo LnRhbjsKCmZ1bmN0aW9uIGFjb3MoeCkgewogIHJldHVybiB4ID4gMSA/IDAgOiB4IDwgLTEgPyBw aSQzIDogTWF0aC5hY29zKHgpOwp9CgpmdW5jdGlvbiBhc2luKHgpIHsKICByZXR1cm4geCA+IDEg PyBoYWxmUGkkMiA6IHggPCAtMSA/IC1oYWxmUGkkMiA6IE1hdGguYXNpbih4KTsKfQoKZnVuY3Rp b24gaGF2ZXJzaW4oeCkgewogIHJldHVybiAoeCA9IHNpbiQxKHggLyAyKSkgKiB4Owp9CgpmdW5j dGlvbiBub29wJDIoKSB7fQoKZnVuY3Rpb24gc3RyZWFtR2VvbWV0cnkoZ2VvbWV0cnksIHN0cmVh bSkgewogIGlmIChnZW9tZXRyeSAmJiBzdHJlYW1HZW9tZXRyeVR5cGUuaGFzT3duUHJvcGVydHko Z2VvbWV0cnkudHlwZSkpIHsKICAgIHN0cmVhbUdlb21ldHJ5VHlwZVtnZW9tZXRyeS50eXBlXShn ZW9tZXRyeSwgc3RyZWFtKTsKICB9Cn0KCnZhciBzdHJlYW1PYmplY3RUeXBlID0gewogIEZlYXR1 cmU6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICBzdHJlYW1HZW9tZXRyeShvYmplY3Qu Z2VvbWV0cnksIHN0cmVhbSk7CiAgfSwKICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24ob2Jq ZWN0LCBzdHJlYW0pIHsKICAgIHZhciBmZWF0dXJlcyA9IG9iamVjdC5mZWF0dXJlcywgaSA9IC0x LCBuID0gZmVhdHVyZXMubGVuZ3RoOwogICAgd2hpbGUgKCsraSA8IG4pIHN0cmVhbUdlb21ldHJ5 KGZlYXR1cmVzW2ldLmdlb21ldHJ5LCBzdHJlYW0pOwogIH0KfTsKCnZhciBzdHJlYW1HZW9tZXRy eVR5cGUgPSB7CiAgU3BoZXJlOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgc3RyZWFt LnNwaGVyZSgpOwogIH0sCiAgUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICBv YmplY3QgPSBvYmplY3QuY29vcmRpbmF0ZXM7CiAgICBzdHJlYW0ucG9pbnQob2JqZWN0WzBdLCBv YmplY3RbMV0sIG9iamVjdFsyXSk7CiAgfSwKICBNdWx0aVBvaW50OiBmdW5jdGlvbihvYmplY3Qs IHN0cmVhbSkgewogICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0g LTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAgICB3aGlsZSAoKytpIDwgbikgb2JqZWN0ID0g Y29vcmRpbmF0ZXNbaV0sIHN0cmVhbS5wb2ludChvYmplY3RbMF0sIG9iamVjdFsxXSwgb2JqZWN0 WzJdKTsKICB9LAogIExpbmVTdHJpbmc6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICBz dHJlYW1MaW5lKG9iamVjdC5jb29yZGluYXRlcywgc3RyZWFtLCAwKTsKICB9LAogIE11bHRpTGlu ZVN0cmluZzogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHsKICAgIHZhciBjb29yZGluYXRlcyA9 IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAg d2hpbGUgKCsraSA8IG4pIHN0cmVhbUxpbmUoY29vcmRpbmF0ZXNbaV0sIHN0cmVhbSwgMCk7CiAg fSwKICBQb2x5Z29uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgc3RyZWFtUG9seWdv bihvYmplY3QuY29vcmRpbmF0ZXMsIHN0cmVhbSk7CiAgfSwKICBNdWx0aVBvbHlnb246IGZ1bmN0 aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRp bmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBu KSBzdHJlYW1Qb2x5Z29uKGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0pOwogIH0sCiAgR2VvbWV0cnlD b2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgdmFyIGdlb21ldHJpZXMg PSBvYmplY3QuZ2VvbWV0cmllcywgaSA9IC0xLCBuID0gZ2VvbWV0cmllcy5sZW5ndGg7CiAgICB3 aGlsZSAoKytpIDwgbikgc3RyZWFtR2VvbWV0cnkoZ2VvbWV0cmllc1tpXSwgc3RyZWFtKTsKICB9 Cn07CgpmdW5jdGlvbiBzdHJlYW1MaW5lKGNvb3JkaW5hdGVzLCBzdHJlYW0sIGNsb3NlZCkgewog IHZhciBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGggLSBjbG9zZWQsIGNvb3JkaW5hdGU7 CiAgc3RyZWFtLmxpbmVTdGFydCgpOwogIHdoaWxlICgrK2kgPCBuKSBjb29yZGluYXRlID0gY29v cmRpbmF0ZXNbaV0sIHN0cmVhbS5wb2ludChjb29yZGluYXRlWzBdLCBjb29yZGluYXRlWzFdLCBj b29yZGluYXRlWzJdKTsKICBzdHJlYW0ubGluZUVuZCgpOwp9CgpmdW5jdGlvbiBzdHJlYW1Qb2x5 Z29uKGNvb3JkaW5hdGVzLCBzdHJlYW0pIHsKICB2YXIgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMu bGVuZ3RoOwogIHN0cmVhbS5wb2x5Z29uU3RhcnQoKTsKICB3aGlsZSAoKytpIDwgbikgc3RyZWFt TGluZShjb29yZGluYXRlc1tpXSwgc3RyZWFtLCAxKTsKICBzdHJlYW0ucG9seWdvbkVuZCgpOwp9 CgpmdW5jdGlvbiBnZW9TdHJlYW0ob2JqZWN0LCBzdHJlYW0pIHsKICBpZiAob2JqZWN0ICYmIHN0 cmVhbU9iamVjdFR5cGUuaGFzT3duUHJvcGVydHkob2JqZWN0LnR5cGUpKSB7CiAgICBzdHJlYW1P YmplY3RUeXBlW29iamVjdC50eXBlXShvYmplY3QsIHN0cmVhbSk7CiAgfSBlbHNlIHsKICAgIHN0 cmVhbUdlb21ldHJ5KG9iamVjdCwgc3RyZWFtKTsKICB9Cn0KCnZhciBhcmVhUmluZ1N1bSA9IGFk ZGVyKCk7Cgp2YXIgYXJlYVN1bSA9IGFkZGVyKCksCiAgICBsYW1iZGEwMCwKICAgIHBoaTAwLAog ICAgbGFtYmRhMCwKICAgIGNvc1BoaTAsCiAgICBzaW5QaGkwOwoKdmFyIGFyZWFTdHJlYW0gPSB7 CiAgcG9pbnQ6IG5vb3AkMiwKICBsaW5lU3RhcnQ6IG5vb3AkMiwKICBsaW5lRW5kOiBub29wJDIs CiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIGFyZWFSaW5nU3VtLnJlc2V0KCk7CiAg ICBhcmVhU3RyZWFtLmxpbmVTdGFydCA9IGFyZWFSaW5nU3RhcnQ7CiAgICBhcmVhU3RyZWFtLmxp bmVFbmQgPSBhcmVhUmluZ0VuZDsKICB9LAogIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAg dmFyIGFyZWFSaW5nID0gK2FyZWFSaW5nU3VtOwogICAgYXJlYVN1bS5hZGQoYXJlYVJpbmcgPCAw ID8gdGF1JDMgKyBhcmVhUmluZyA6IGFyZWFSaW5nKTsKICAgIHRoaXMubGluZVN0YXJ0ID0gdGhp cy5saW5lRW5kID0gdGhpcy5wb2ludCA9IG5vb3AkMjsKICB9LAogIHNwaGVyZTogZnVuY3Rpb24o KSB7CiAgICBhcmVhU3VtLmFkZCh0YXUkMyk7CiAgfQp9OwoKZnVuY3Rpb24gYXJlYVJpbmdTdGFy dCgpIHsKICBhcmVhU3RyZWFtLnBvaW50ID0gYXJlYVBvaW50Rmlyc3Q7Cn0KCmZ1bmN0aW9uIGFy ZWFSaW5nRW5kKCkgewogIGFyZWFQb2ludChsYW1iZGEwMCwgcGhpMDApOwp9CgpmdW5jdGlvbiBh cmVhUG9pbnRGaXJzdChsYW1iZGEsIHBoaSkgewogIGFyZWFTdHJlYW0ucG9pbnQgPSBhcmVhUG9p bnQ7CiAgbGFtYmRhMDAgPSBsYW1iZGEsIHBoaTAwID0gcGhpOwogIGxhbWJkYSAqPSByYWRpYW5z LCBwaGkgKj0gcmFkaWFuczsKICBsYW1iZGEwID0gbGFtYmRhLCBjb3NQaGkwID0gY29zJDEocGhp ID0gcGhpIC8gMiArIHF1YXJ0ZXJQaSksIHNpblBoaTAgPSBzaW4kMShwaGkpOwp9CgpmdW5jdGlv biBhcmVhUG9pbnQobGFtYmRhLCBwaGkpIHsKICBsYW1iZGEgKj0gcmFkaWFucywgcGhpICo9IHJh ZGlhbnM7CiAgcGhpID0gcGhpIC8gMiArIHF1YXJ0ZXJQaTsgLy8gaGFsZiB0aGUgYW5ndWxhciBk aXN0YW5jZSBmcm9tIHNvdXRoIHBvbGUKCiAgLy8gU3BoZXJpY2FsIGV4Y2VzcyBFIGZvciBhIHNw aGVyaWNhbCB0cmlhbmdsZSB3aXRoIHZlcnRpY2VzOiBzb3V0aCBwb2xlLAogIC8vIHByZXZpb3Vz IHBvaW50LCBjdXJyZW50IHBvaW50LiAgVXNlcyBhIGZvcm11bGEgZGVyaXZlZCBmcm9tIENhZ25v bGnigJlzCiAgLy8gdGhlb3JlbS4gIFNlZSBUb2RodW50ZXIsIFNwaGVyaWNhbCBUcmlnLiAoMTg3 MSksIFNlYy4gMTAzLCBFcS4gKDIpLgogIHZhciBkTGFtYmRhID0gbGFtYmRhIC0gbGFtYmRhMCwK ICAgICAgc2RMYW1iZGEgPSBkTGFtYmRhID49IDAgPyAxIDogLTEsCiAgICAgIGFkTGFtYmRhID0g c2RMYW1iZGEgKiBkTGFtYmRhLAogICAgICBjb3NQaGkgPSBjb3MkMShwaGkpLAogICAgICBzaW5Q aGkgPSBzaW4kMShwaGkpLAogICAgICBrID0gc2luUGhpMCAqIHNpblBoaSwKICAgICAgdSA9IGNv c1BoaTAgKiBjb3NQaGkgKyBrICogY29zJDEoYWRMYW1iZGEpLAogICAgICB2ID0gayAqIHNkTGFt YmRhICogc2luJDEoYWRMYW1iZGEpOwogIGFyZWFSaW5nU3VtLmFkZChhdGFuMih2LCB1KSk7Cgog IC8vIEFkdmFuY2UgdGhlIHByZXZpb3VzIHBvaW50cy4KICBsYW1iZGEwID0gbGFtYmRhLCBjb3NQ aGkwID0gY29zUGhpLCBzaW5QaGkwID0gc2luUGhpOwp9CgpmdW5jdGlvbiBhcmVhJDEob2JqZWN0 KSB7CiAgYXJlYVN1bS5yZXNldCgpOwogIGdlb1N0cmVhbShvYmplY3QsIGFyZWFTdHJlYW0pOwog IHJldHVybiBhcmVhU3VtICogMjsKfQoKZnVuY3Rpb24gc3BoZXJpY2FsKGNhcnRlc2lhbikgewog IHJldHVybiBbYXRhbjIoY2FydGVzaWFuWzFdLCBjYXJ0ZXNpYW5bMF0pLCBhc2luKGNhcnRlc2lh blsyXSldOwp9CgpmdW5jdGlvbiBjYXJ0ZXNpYW4oc3BoZXJpY2FsKSB7CiAgdmFyIGxhbWJkYSA9 IHNwaGVyaWNhbFswXSwgcGhpID0gc3BoZXJpY2FsWzFdLCBjb3NQaGkgPSBjb3MkMShwaGkpOwog IHJldHVybiBbY29zUGhpICogY29zJDEobGFtYmRhKSwgY29zUGhpICogc2luJDEobGFtYmRhKSwg c2luJDEocGhpKV07Cn0KCmZ1bmN0aW9uIGNhcnRlc2lhbkRvdChhLCBiKSB7CiAgcmV0dXJuIGFb MF0gKiBiWzBdICsgYVsxXSAqIGJbMV0gKyBhWzJdICogYlsyXTsKfQoKZnVuY3Rpb24gY2FydGVz aWFuQ3Jvc3MoYSwgYikgewogIHJldHVybiBbYVsxXSAqIGJbMl0gLSBhWzJdICogYlsxXSwgYVsy XSAqIGJbMF0gLSBhWzBdICogYlsyXSwgYVswXSAqIGJbMV0gLSBhWzFdICogYlswXV07Cn0KCi8v IFRPRE8gcmV0dXJuIGEKZnVuY3Rpb24gY2FydGVzaWFuQWRkSW5QbGFjZShhLCBiKSB7CiAgYVsw XSArPSBiWzBdLCBhWzFdICs9IGJbMV0sIGFbMl0gKz0gYlsyXTsKfQoKZnVuY3Rpb24gY2FydGVz aWFuU2NhbGUodmVjdG9yLCBrKSB7CiAgcmV0dXJuIFt2ZWN0b3JbMF0gKiBrLCB2ZWN0b3JbMV0g KiBrLCB2ZWN0b3JbMl0gKiBrXTsKfQoKLy8gVE9ETyByZXR1cm4gZApmdW5jdGlvbiBjYXJ0ZXNp YW5Ob3JtYWxpemVJblBsYWNlKGQpIHsKICB2YXIgbCA9IHNxcnQoZFswXSAqIGRbMF0gKyBkWzFd ICogZFsxXSArIGRbMl0gKiBkWzJdKTsKICBkWzBdIC89IGwsIGRbMV0gLz0gbCwgZFsyXSAvPSBs Owp9Cgp2YXIgbGFtYmRhMCQxLCBwaGkwLCBsYW1iZGExLCBwaGkxLCAvLyBib3VuZHMKICAgIGxh bWJkYTIsIC8vIHByZXZpb3VzIGxhbWJkYS1jb29yZGluYXRlCiAgICBsYW1iZGEwMCQxLCBwaGkw MCQxLCAvLyBmaXJzdCBwb2ludAogICAgcDAsIC8vIHByZXZpb3VzIDNEIHBvaW50CiAgICBkZWx0 YVN1bSA9IGFkZGVyKCksCiAgICByYW5nZXMsCiAgICByYW5nZTsKCnZhciBib3VuZHNTdHJlYW0g PSB7CiAgcG9pbnQ6IGJvdW5kc1BvaW50LAogIGxpbmVTdGFydDogYm91bmRzTGluZVN0YXJ0LAog IGxpbmVFbmQ6IGJvdW5kc0xpbmVFbmQsCiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAg IGJvdW5kc1N0cmVhbS5wb2ludCA9IGJvdW5kc1JpbmdQb2ludDsKICAgIGJvdW5kc1N0cmVhbS5s aW5lU3RhcnQgPSBib3VuZHNSaW5nU3RhcnQ7CiAgICBib3VuZHNTdHJlYW0ubGluZUVuZCA9IGJv dW5kc1JpbmdFbmQ7CiAgICBkZWx0YVN1bS5yZXNldCgpOwogICAgYXJlYVN0cmVhbS5wb2x5Z29u U3RhcnQoKTsKICB9LAogIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgYXJlYVN0cmVhbS5w b2x5Z29uRW5kKCk7CiAgICBib3VuZHNTdHJlYW0ucG9pbnQgPSBib3VuZHNQb2ludDsKICAgIGJv dW5kc1N0cmVhbS5saW5lU3RhcnQgPSBib3VuZHNMaW5lU3RhcnQ7CiAgICBib3VuZHNTdHJlYW0u bGluZUVuZCA9IGJvdW5kc0xpbmVFbmQ7CiAgICBpZiAoYXJlYVJpbmdTdW0gPCAwKSBsYW1iZGEw JDEgPSAtKGxhbWJkYTEgPSAxODApLCBwaGkwID0gLShwaGkxID0gOTApOwogICAgZWxzZSBpZiAo ZGVsdGFTdW0gPiBlcHNpbG9uJDIpIHBoaTEgPSA5MDsKICAgIGVsc2UgaWYgKGRlbHRhU3VtIDwg LWVwc2lsb24kMikgcGhpMCA9IC05MDsKICAgIHJhbmdlWzBdID0gbGFtYmRhMCQxLCByYW5nZVsx XSA9IGxhbWJkYTE7CiAgfSwKICBzcGhlcmU6IGZ1bmN0aW9uKCkgewogICAgbGFtYmRhMCQxID0g LShsYW1iZGExID0gMTgwKSwgcGhpMCA9IC0ocGhpMSA9IDkwKTsKICB9Cn07CgpmdW5jdGlvbiBi b3VuZHNQb2ludChsYW1iZGEsIHBoaSkgewogIHJhbmdlcy5wdXNoKHJhbmdlID0gW2xhbWJkYTAk MSA9IGxhbWJkYSwgbGFtYmRhMSA9IGxhbWJkYV0pOwogIGlmIChwaGkgPCBwaGkwKSBwaGkwID0g cGhpOwogIGlmIChwaGkgPiBwaGkxKSBwaGkxID0gcGhpOwp9CgpmdW5jdGlvbiBsaW5lUG9pbnQo bGFtYmRhLCBwaGkpIHsKICB2YXIgcCA9IGNhcnRlc2lhbihbbGFtYmRhICogcmFkaWFucywgcGhp ICogcmFkaWFuc10pOwogIGlmIChwMCkgewogICAgdmFyIG5vcm1hbCA9IGNhcnRlc2lhbkNyb3Nz KHAwLCBwKSwKICAgICAgICBlcXVhdG9yaWFsID0gW25vcm1hbFsxXSwgLW5vcm1hbFswXSwgMF0s CiAgICAgICAgaW5mbGVjdGlvbiA9IGNhcnRlc2lhbkNyb3NzKGVxdWF0b3JpYWwsIG5vcm1hbCk7 CiAgICBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKGluZmxlY3Rpb24pOwogICAgaW5mbGVjdGlv biA9IHNwaGVyaWNhbChpbmZsZWN0aW9uKTsKICAgIHZhciBkZWx0YSA9IGxhbWJkYSAtIGxhbWJk YTIsCiAgICAgICAgc2lnbiA9IGRlbHRhID4gMCA/IDEgOiAtMSwKICAgICAgICBsYW1iZGFpID0g aW5mbGVjdGlvblswXSAqIGRlZ3JlZXMkMSAqIHNpZ24sCiAgICAgICAgcGhpaSwKICAgICAgICBh bnRpbWVyaWRpYW4gPSBhYnMoZGVsdGEpID4gMTgwOwogICAgaWYgKGFudGltZXJpZGlhbiBeIChz aWduICogbGFtYmRhMiA8IGxhbWJkYWkgJiYgbGFtYmRhaSA8IHNpZ24gKiBsYW1iZGEpKSB7CiAg ICAgIHBoaWkgPSBpbmZsZWN0aW9uWzFdICogZGVncmVlcyQxOwogICAgICBpZiAocGhpaSA+IHBo aTEpIHBoaTEgPSBwaGlpOwogICAgfSBlbHNlIGlmIChsYW1iZGFpID0gKGxhbWJkYWkgKyAzNjAp ICUgMzYwIC0gMTgwLCBhbnRpbWVyaWRpYW4gXiAoc2lnbiAqIGxhbWJkYTIgPCBsYW1iZGFpICYm IGxhbWJkYWkgPCBzaWduICogbGFtYmRhKSkgewogICAgICBwaGlpID0gLWluZmxlY3Rpb25bMV0g KiBkZWdyZWVzJDE7CiAgICAgIGlmIChwaGlpIDwgcGhpMCkgcGhpMCA9IHBoaWk7CiAgICB9IGVs c2UgewogICAgICBpZiAocGhpIDwgcGhpMCkgcGhpMCA9IHBoaTsKICAgICAgaWYgKHBoaSA+IHBo aTEpIHBoaTEgPSBwaGk7CiAgICB9CiAgICBpZiAoYW50aW1lcmlkaWFuKSB7CiAgICAgIGlmIChs YW1iZGEgPCBsYW1iZGEyKSB7CiAgICAgICAgaWYgKGFuZ2xlKGxhbWJkYTAkMSwgbGFtYmRhKSA+ IGFuZ2xlKGxhbWJkYTAkMSwgbGFtYmRhMSkpIGxhbWJkYTEgPSBsYW1iZGE7CiAgICAgIH0gZWxz ZSB7CiAgICAgICAgaWYgKGFuZ2xlKGxhbWJkYSwgbGFtYmRhMSkgPiBhbmdsZShsYW1iZGEwJDEs IGxhbWJkYTEpKSBsYW1iZGEwJDEgPSBsYW1iZGE7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAg IGlmIChsYW1iZGExID49IGxhbWJkYTAkMSkgewogICAgICAgIGlmIChsYW1iZGEgPCBsYW1iZGEw JDEpIGxhbWJkYTAkMSA9IGxhbWJkYTsKICAgICAgICBpZiAobGFtYmRhID4gbGFtYmRhMSkgbGFt YmRhMSA9IGxhbWJkYTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAobGFtYmRhID4gbGFtYmRh MikgewogICAgICAgICAgaWYgKGFuZ2xlKGxhbWJkYTAkMSwgbGFtYmRhKSA+IGFuZ2xlKGxhbWJk YTAkMSwgbGFtYmRhMSkpIGxhbWJkYTEgPSBsYW1iZGE7CiAgICAgICAgfSBlbHNlIHsKICAgICAg ICAgIGlmIChhbmdsZShsYW1iZGEsIGxhbWJkYTEpID4gYW5nbGUobGFtYmRhMCQxLCBsYW1iZGEx KSkgbGFtYmRhMCQxID0gbGFtYmRhOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0gZWxzZSB7 CiAgICByYW5nZXMucHVzaChyYW5nZSA9IFtsYW1iZGEwJDEgPSBsYW1iZGEsIGxhbWJkYTEgPSBs YW1iZGFdKTsKICB9CiAgaWYgKHBoaSA8IHBoaTApIHBoaTAgPSBwaGk7CiAgaWYgKHBoaSA+IHBo aTEpIHBoaTEgPSBwaGk7CiAgcDAgPSBwLCBsYW1iZGEyID0gbGFtYmRhOwp9CgpmdW5jdGlvbiBi b3VuZHNMaW5lU3RhcnQoKSB7CiAgYm91bmRzU3RyZWFtLnBvaW50ID0gbGluZVBvaW50Owp9Cgpm dW5jdGlvbiBib3VuZHNMaW5lRW5kKCkgewogIHJhbmdlWzBdID0gbGFtYmRhMCQxLCByYW5nZVsx XSA9IGxhbWJkYTE7CiAgYm91bmRzU3RyZWFtLnBvaW50ID0gYm91bmRzUG9pbnQ7CiAgcDAgPSBu dWxsOwp9CgpmdW5jdGlvbiBib3VuZHNSaW5nUG9pbnQobGFtYmRhLCBwaGkpIHsKICBpZiAocDAp IHsKICAgIHZhciBkZWx0YSA9IGxhbWJkYSAtIGxhbWJkYTI7CiAgICBkZWx0YVN1bS5hZGQoYWJz KGRlbHRhKSA+IDE4MCA/IGRlbHRhICsgKGRlbHRhID4gMCA/IDM2MCA6IC0zNjApIDogZGVsdGEp OwogIH0gZWxzZSB7CiAgICBsYW1iZGEwMCQxID0gbGFtYmRhLCBwaGkwMCQxID0gcGhpOwogIH0K ICBhcmVhU3RyZWFtLnBvaW50KGxhbWJkYSwgcGhpKTsKICBsaW5lUG9pbnQobGFtYmRhLCBwaGkp Owp9CgpmdW5jdGlvbiBib3VuZHNSaW5nU3RhcnQoKSB7CiAgYXJlYVN0cmVhbS5saW5lU3RhcnQo KTsKfQoKZnVuY3Rpb24gYm91bmRzUmluZ0VuZCgpIHsKICBib3VuZHNSaW5nUG9pbnQobGFtYmRh MDAkMSwgcGhpMDAkMSk7CiAgYXJlYVN0cmVhbS5saW5lRW5kKCk7CiAgaWYgKGFicyhkZWx0YVN1 bSkgPiBlcHNpbG9uJDIpIGxhbWJkYTAkMSA9IC0obGFtYmRhMSA9IDE4MCk7CiAgcmFuZ2VbMF0g PSBsYW1iZGEwJDEsIHJhbmdlWzFdID0gbGFtYmRhMTsKICBwMCA9IG51bGw7Cn0KCi8vIEZpbmRz IHRoZSBsZWZ0LXJpZ2h0IGRpc3RhbmNlIGJldHdlZW4gdHdvIGxvbmdpdHVkZXMuCi8vIFRoaXMg aXMgYWxtb3N0IHRoZSBzYW1lIGFzIChsYW1iZGExIC0gbGFtYmRhMCArIDM2MMKwKSAlIDM2MMKw LCBleGNlcHQgdGhhdCB3ZSB3YW50Ci8vIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIMKxMTgwwrAgdG8g YmUgMzYwwrAuCmZ1bmN0aW9uIGFuZ2xlKGxhbWJkYTAsIGxhbWJkYTEpIHsKICByZXR1cm4gKGxh bWJkYTEgLT0gbGFtYmRhMCkgPCAwID8gbGFtYmRhMSArIDM2MCA6IGxhbWJkYTE7Cn0KCmZ1bmN0 aW9uIHJhbmdlQ29tcGFyZShhLCBiKSB7CiAgcmV0dXJuIGFbMF0gLSBiWzBdOwp9CgpmdW5jdGlv biByYW5nZUNvbnRhaW5zKHJhbmdlLCB4KSB7CiAgcmV0dXJuIHJhbmdlWzBdIDw9IHJhbmdlWzFd ID8gcmFuZ2VbMF0gPD0geCAmJiB4IDw9IHJhbmdlWzFdIDogeCA8IHJhbmdlWzBdIHx8IHJhbmdl WzFdIDwgeDsKfQoKZnVuY3Rpb24gYm91bmRzKGZlYXR1cmUpIHsKICB2YXIgaSwgbiwgYSwgYiwg bWVyZ2VkLCBkZWx0YU1heCwgZGVsdGE7CgogIHBoaTEgPSBsYW1iZGExID0gLShsYW1iZGEwJDEg PSBwaGkwID0gSW5maW5pdHkpOwogIHJhbmdlcyA9IFtdOwogIGdlb1N0cmVhbShmZWF0dXJlLCBi b3VuZHNTdHJlYW0pOwoKICAvLyBGaXJzdCwgc29ydCByYW5nZXMgYnkgdGhlaXIgbWluaW11bSBs b25naXR1ZGVzLgogIGlmIChuID0gcmFuZ2VzLmxlbmd0aCkgewogICAgcmFuZ2VzLnNvcnQocmFu Z2VDb21wYXJlKTsKCiAgICAvLyBUaGVuLCBtZXJnZSBhbnkgcmFuZ2VzIHRoYXQgb3ZlcmxhcC4K ICAgIGZvciAoaSA9IDEsIGEgPSByYW5nZXNbMF0sIG1lcmdlZCA9IFthXTsgaSA8IG47ICsraSkg ewogICAgICBiID0gcmFuZ2VzW2ldOwogICAgICBpZiAocmFuZ2VDb250YWlucyhhLCBiWzBdKSB8 fCByYW5nZUNvbnRhaW5zKGEsIGJbMV0pKSB7CiAgICAgICAgaWYgKGFuZ2xlKGFbMF0sIGJbMV0p ID4gYW5nbGUoYVswXSwgYVsxXSkpIGFbMV0gPSBiWzFdOwogICAgICAgIGlmIChhbmdsZShiWzBd LCBhWzFdKSA+IGFuZ2xlKGFbMF0sIGFbMV0pKSBhWzBdID0gYlswXTsKICAgICAgfSBlbHNlIHsK ICAgICAgICBtZXJnZWQucHVzaChhID0gYik7CiAgICAgIH0KICAgIH0KCiAgICAvLyBGaW5hbGx5 LCBmaW5kIHRoZSBsYXJnZXN0IGdhcCBiZXR3ZWVuIHRoZSBtZXJnZWQgcmFuZ2VzLgogICAgLy8g VGhlIGZpbmFsIGJvdW5kaW5nIGJveCB3aWxsIGJlIHRoZSBpbnZlcnNlIG9mIHRoaXMgZ2FwLgog ICAgZm9yIChkZWx0YU1heCA9IC1JbmZpbml0eSwgbiA9IG1lcmdlZC5sZW5ndGggLSAxLCBpID0g MCwgYSA9IG1lcmdlZFtuXTsgaSA8PSBuOyBhID0gYiwgKytpKSB7CiAgICAgIGIgPSBtZXJnZWRb aV07CiAgICAgIGlmICgoZGVsdGEgPSBhbmdsZShhWzFdLCBiWzBdKSkgPiBkZWx0YU1heCkgZGVs dGFNYXggPSBkZWx0YSwgbGFtYmRhMCQxID0gYlswXSwgbGFtYmRhMSA9IGFbMV07CiAgICB9CiAg fQoKICByYW5nZXMgPSByYW5nZSA9IG51bGw7CgogIHJldHVybiBsYW1iZGEwJDEgPT09IEluZmlu aXR5IHx8IHBoaTAgPT09IEluZmluaXR5CiAgICAgID8gW1tOYU4sIE5hTl0sIFtOYU4sIE5hTl1d CiAgICAgIDogW1tsYW1iZGEwJDEsIHBoaTBdLCBbbGFtYmRhMSwgcGhpMV1dOwp9Cgp2YXIgVzAs IFcxLAogICAgWDAsIFkwLCBaMCwKICAgIFgxLCBZMSwgWjEsCiAgICBYMiwgWTIsIFoyLAogICAg bGFtYmRhMDAkMiwgcGhpMDAkMiwgLy8gZmlyc3QgcG9pbnQKICAgIHgwLCB5MCwgejA7IC8vIHBy ZXZpb3VzIHBvaW50Cgp2YXIgY2VudHJvaWRTdHJlYW0gPSB7CiAgc3BoZXJlOiBub29wJDIsCiAg cG9pbnQ6IGNlbnRyb2lkUG9pbnQsCiAgbGluZVN0YXJ0OiBjZW50cm9pZExpbmVTdGFydCwKICBs aW5lRW5kOiBjZW50cm9pZExpbmVFbmQsCiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAg IGNlbnRyb2lkU3RyZWFtLmxpbmVTdGFydCA9IGNlbnRyb2lkUmluZ1N0YXJ0OwogICAgY2VudHJv aWRTdHJlYW0ubGluZUVuZCA9IGNlbnRyb2lkUmluZ0VuZDsKICB9LAogIHBvbHlnb25FbmQ6IGZ1 bmN0aW9uKCkgewogICAgY2VudHJvaWRTdHJlYW0ubGluZVN0YXJ0ID0gY2VudHJvaWRMaW5lU3Rh cnQ7CiAgICBjZW50cm9pZFN0cmVhbS5saW5lRW5kID0gY2VudHJvaWRMaW5lRW5kOwogIH0KfTsK Ci8vIEFyaXRobWV0aWMgbWVhbiBvZiBDYXJ0ZXNpYW4gdmVjdG9ycy4KZnVuY3Rpb24gY2VudHJv aWRQb2ludChsYW1iZGEsIHBoaSkgewogIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFu czsKICB2YXIgY29zUGhpID0gY29zJDEocGhpKTsKICBjZW50cm9pZFBvaW50Q2FydGVzaWFuKGNv c1BoaSAqIGNvcyQxKGxhbWJkYSksIGNvc1BoaSAqIHNpbiQxKGxhbWJkYSksIHNpbiQxKHBoaSkp Owp9CgpmdW5jdGlvbiBjZW50cm9pZFBvaW50Q2FydGVzaWFuKHgsIHksIHopIHsKICArK1cwOwog IFgwICs9ICh4IC0gWDApIC8gVzA7CiAgWTAgKz0gKHkgLSBZMCkgLyBXMDsKICBaMCArPSAoeiAt IFowKSAvIFcwOwp9CgpmdW5jdGlvbiBjZW50cm9pZExpbmVTdGFydCgpIHsKICBjZW50cm9pZFN0 cmVhbS5wb2ludCA9IGNlbnRyb2lkTGluZVBvaW50Rmlyc3Q7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lk TGluZVBvaW50Rmlyc3QobGFtYmRhLCBwaGkpIHsKICBsYW1iZGEgKj0gcmFkaWFucywgcGhpICo9 IHJhZGlhbnM7CiAgdmFyIGNvc1BoaSA9IGNvcyQxKHBoaSk7CiAgeDAgPSBjb3NQaGkgKiBjb3Mk MShsYW1iZGEpOwogIHkwID0gY29zUGhpICogc2luJDEobGFtYmRhKTsKICB6MCA9IHNpbiQxKHBo aSk7CiAgY2VudHJvaWRTdHJlYW0ucG9pbnQgPSBjZW50cm9pZExpbmVQb2ludDsKICBjZW50cm9p ZFBvaW50Q2FydGVzaWFuKHgwLCB5MCwgejApOwp9CgpmdW5jdGlvbiBjZW50cm9pZExpbmVQb2lu dChsYW1iZGEsIHBoaSkgewogIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFuczsKICB2 YXIgY29zUGhpID0gY29zJDEocGhpKSwKICAgICAgeCA9IGNvc1BoaSAqIGNvcyQxKGxhbWJkYSks CiAgICAgIHkgPSBjb3NQaGkgKiBzaW4kMShsYW1iZGEpLAogICAgICB6ID0gc2luJDEocGhpKSwK ICAgICAgdyA9IGF0YW4yKHNxcnQoKHcgPSB5MCAqIHogLSB6MCAqIHkpICogdyArICh3ID0gejAg KiB4IC0geDAgKiB6KSAqIHcgKyAodyA9IHgwICogeSAtIHkwICogeCkgKiB3KSwgeDAgKiB4ICsg eTAgKiB5ICsgejAgKiB6KTsKICBXMSArPSB3OwogIFgxICs9IHcgKiAoeDAgKyAoeDAgPSB4KSk7 CiAgWTEgKz0gdyAqICh5MCArICh5MCA9IHkpKTsKICBaMSArPSB3ICogKHowICsgKHowID0geikp OwogIGNlbnRyb2lkUG9pbnRDYXJ0ZXNpYW4oeDAsIHkwLCB6MCk7Cn0KCmZ1bmN0aW9uIGNlbnRy b2lkTGluZUVuZCgpIHsKICBjZW50cm9pZFN0cmVhbS5wb2ludCA9IGNlbnRyb2lkUG9pbnQ7Cn0K Ci8vIFNlZSBKLiBFLiBCcm9jaywgVGhlIEluZXJ0aWEgVGVuc29yIGZvciBhIFNwaGVyaWNhbCBU cmlhbmdsZSwKLy8gSi4gQXBwbGllZCBNZWNoYW5pY3MgNDIsIDIzOSAoMTk3NSkuCmZ1bmN0aW9u IGNlbnRyb2lkUmluZ1N0YXJ0KCkgewogIGNlbnRyb2lkU3RyZWFtLnBvaW50ID0gY2VudHJvaWRS aW5nUG9pbnRGaXJzdDsKfQoKZnVuY3Rpb24gY2VudHJvaWRSaW5nRW5kKCkgewogIGNlbnRyb2lk UmluZ1BvaW50KGxhbWJkYTAwJDIsIHBoaTAwJDIpOwogIGNlbnRyb2lkU3RyZWFtLnBvaW50ID0g Y2VudHJvaWRQb2ludDsKfQoKZnVuY3Rpb24gY2VudHJvaWRSaW5nUG9pbnRGaXJzdChsYW1iZGEs IHBoaSkgewogIGxhbWJkYTAwJDIgPSBsYW1iZGEsIHBoaTAwJDIgPSBwaGk7CiAgbGFtYmRhICo9 IHJhZGlhbnMsIHBoaSAqPSByYWRpYW5zOwogIGNlbnRyb2lkU3RyZWFtLnBvaW50ID0gY2VudHJv aWRSaW5nUG9pbnQ7CiAgdmFyIGNvc1BoaSA9IGNvcyQxKHBoaSk7CiAgeDAgPSBjb3NQaGkgKiBj b3MkMShsYW1iZGEpOwogIHkwID0gY29zUGhpICogc2luJDEobGFtYmRhKTsKICB6MCA9IHNpbiQx KHBoaSk7CiAgY2VudHJvaWRQb2ludENhcnRlc2lhbih4MCwgeTAsIHowKTsKfQoKZnVuY3Rpb24g Y2VudHJvaWRSaW5nUG9pbnQobGFtYmRhLCBwaGkpIHsKICBsYW1iZGEgKj0gcmFkaWFucywgcGhp ICo9IHJhZGlhbnM7CiAgdmFyIGNvc1BoaSA9IGNvcyQxKHBoaSksCiAgICAgIHggPSBjb3NQaGkg KiBjb3MkMShsYW1iZGEpLAogICAgICB5ID0gY29zUGhpICogc2luJDEobGFtYmRhKSwKICAgICAg eiA9IHNpbiQxKHBoaSksCiAgICAgIGN4ID0geTAgKiB6IC0gejAgKiB5LAogICAgICBjeSA9IHow ICogeCAtIHgwICogeiwKICAgICAgY3ogPSB4MCAqIHkgLSB5MCAqIHgsCiAgICAgIG0gPSBzcXJ0 KGN4ICogY3ggKyBjeSAqIGN5ICsgY3ogKiBjeiksCiAgICAgIHcgPSBhc2luKG0pLCAvLyBsaW5l IHdlaWdodCA9IGFuZ2xlCiAgICAgIHYgPSBtICYmIC13IC8gbTsgLy8gYXJlYSB3ZWlnaHQgbXVs dGlwbGllcgogIFgyICs9IHYgKiBjeDsKICBZMiArPSB2ICogY3k7CiAgWjIgKz0gdiAqIGN6Owog IFcxICs9IHc7CiAgWDEgKz0gdyAqICh4MCArICh4MCA9IHgpKTsKICBZMSArPSB3ICogKHkwICsg KHkwID0geSkpOwogIFoxICs9IHcgKiAoejAgKyAoejAgPSB6KSk7CiAgY2VudHJvaWRQb2ludENh cnRlc2lhbih4MCwgeTAsIHowKTsKfQoKZnVuY3Rpb24gY2VudHJvaWQob2JqZWN0KSB7CiAgVzAg PSBXMSA9CiAgWDAgPSBZMCA9IFowID0KICBYMSA9IFkxID0gWjEgPQogIFgyID0gWTIgPSBaMiA9 IDA7CiAgZ2VvU3RyZWFtKG9iamVjdCwgY2VudHJvaWRTdHJlYW0pOwoKICB2YXIgeCA9IFgyLAog ICAgICB5ID0gWTIsCiAgICAgIHogPSBaMiwKICAgICAgbSA9IHggKiB4ICsgeSAqIHkgKyB6ICog ejsKCiAgLy8gSWYgdGhlIGFyZWEtd2VpZ2h0ZWQgY2NlbnRyb2lkIGlzIHVuZGVmaW5lZCwgZmFs bCBiYWNrIHRvIGxlbmd0aC13ZWlnaHRlZCBjY2VudHJvaWQuCiAgaWYgKG0gPCBlcHNpbG9uMiQx KSB7CiAgICB4ID0gWDEsIHkgPSBZMSwgeiA9IFoxOwogICAgLy8gSWYgdGhlIGZlYXR1cmUgaGFz IHplcm8gbGVuZ3RoLCBmYWxsIGJhY2sgdG8gYXJpdGhtZXRpYyBtZWFuIG9mIHBvaW50IHZlY3Rv cnMuCiAgICBpZiAoVzEgPCBlcHNpbG9uJDIpIHggPSBYMCwgeSA9IFkwLCB6ID0gWjA7CiAgICBt ID0geCAqIHggKyB5ICogeSArIHogKiB6OwogICAgLy8gSWYgdGhlIGZlYXR1cmUgc3RpbGwgaGFz IGFuIHVuZGVmaW5lZCBjY2VudHJvaWQsIHRoZW4gcmV0dXJuLgogICAgaWYgKG0gPCBlcHNpbG9u MiQxKSByZXR1cm4gW05hTiwgTmFOXTsKICB9CgogIHJldHVybiBbYXRhbjIoeSwgeCkgKiBkZWdy ZWVzJDEsIGFzaW4oeiAvIHNxcnQobSkpICogZGVncmVlcyQxXTsKfQoKZnVuY3Rpb24gY29uc3Rh bnQkOCh4KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHg7CiAgfTsKfQoKZnVu Y3Rpb24gY29tcG9zZShhLCBiKSB7CgogIGZ1bmN0aW9uIGNvbXBvc2UoeCwgeSkgewogICAgcmV0 dXJuIHggPSBhKHgsIHkpLCBiKHhbMF0sIHhbMV0pOwogIH0KCiAgaWYgKGEuaW52ZXJ0ICYmIGIu aW52ZXJ0KSBjb21wb3NlLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHJldHVybiB4ID0g Yi5pbnZlcnQoeCwgeSksIHggJiYgYS5pbnZlcnQoeFswXSwgeFsxXSk7CiAgfTsKCiAgcmV0dXJu IGNvbXBvc2U7Cn0KCmZ1bmN0aW9uIHJvdGF0aW9uSWRlbnRpdHkobGFtYmRhLCBwaGkpIHsKICBy ZXR1cm4gW2FicyhsYW1iZGEpID4gcGkkMyA/IGxhbWJkYSArIE1hdGgucm91bmQoLWxhbWJkYSAv IHRhdSQzKSAqIHRhdSQzIDogbGFtYmRhLCBwaGldOwp9Cgpyb3RhdGlvbklkZW50aXR5LmludmVy dCA9IHJvdGF0aW9uSWRlbnRpdHk7CgpmdW5jdGlvbiByb3RhdGVSYWRpYW5zKGRlbHRhTGFtYmRh LCBkZWx0YVBoaSwgZGVsdGFHYW1tYSkgewogIHJldHVybiAoZGVsdGFMYW1iZGEgJT0gdGF1JDMp ID8gKGRlbHRhUGhpIHx8IGRlbHRhR2FtbWEgPyBjb21wb3NlKHJvdGF0aW9uTGFtYmRhKGRlbHRh TGFtYmRhKSwgcm90YXRpb25QaGlHYW1tYShkZWx0YVBoaSwgZGVsdGFHYW1tYSkpCiAgICA6IHJv dGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSkKICAgIDogKGRlbHRhUGhpIHx8IGRlbHRhR2FtbWEg PyByb3RhdGlvblBoaUdhbW1hKGRlbHRhUGhpLCBkZWx0YUdhbW1hKQogICAgOiByb3RhdGlvbklk ZW50aXR5KTsKfQoKZnVuY3Rpb24gZm9yd2FyZFJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKGxhbWJkYSwgcGhpKSB7CiAgICByZXR1cm4gbGFtYmRhICs9IGRl bHRhTGFtYmRhLCBbbGFtYmRhID4gcGkkMyA/IGxhbWJkYSAtIHRhdSQzIDogbGFtYmRhIDwgLXBp JDMgPyBsYW1iZGEgKyB0YXUkMyA6IGxhbWJkYSwgcGhpXTsKICB9Owp9CgpmdW5jdGlvbiByb3Rh dGlvbkxhbWJkYShkZWx0YUxhbWJkYSkgewogIHZhciByb3RhdGlvbiA9IGZvcndhcmRSb3RhdGlv bkxhbWJkYShkZWx0YUxhbWJkYSk7CiAgcm90YXRpb24uaW52ZXJ0ID0gZm9yd2FyZFJvdGF0aW9u TGFtYmRhKC1kZWx0YUxhbWJkYSk7CiAgcmV0dXJuIHJvdGF0aW9uOwp9CgpmdW5jdGlvbiByb3Rh dGlvblBoaUdhbW1hKGRlbHRhUGhpLCBkZWx0YUdhbW1hKSB7CiAgdmFyIGNvc0RlbHRhUGhpID0g Y29zJDEoZGVsdGFQaGkpLAogICAgICBzaW5EZWx0YVBoaSA9IHNpbiQxKGRlbHRhUGhpKSwKICAg ICAgY29zRGVsdGFHYW1tYSA9IGNvcyQxKGRlbHRhR2FtbWEpLAogICAgICBzaW5EZWx0YUdhbW1h ID0gc2luJDEoZGVsdGFHYW1tYSk7CgogIGZ1bmN0aW9uIHJvdGF0aW9uKGxhbWJkYSwgcGhpKSB7 CiAgICB2YXIgY29zUGhpID0gY29zJDEocGhpKSwKICAgICAgICB4ID0gY29zJDEobGFtYmRhKSAq IGNvc1BoaSwKICAgICAgICB5ID0gc2luJDEobGFtYmRhKSAqIGNvc1BoaSwKICAgICAgICB6ID0g c2luJDEocGhpKSwKICAgICAgICBrID0geiAqIGNvc0RlbHRhUGhpICsgeCAqIHNpbkRlbHRhUGhp OwogICAgcmV0dXJuIFsKICAgICAgYXRhbjIoeSAqIGNvc0RlbHRhR2FtbWEgLSBrICogc2luRGVs dGFHYW1tYSwgeCAqIGNvc0RlbHRhUGhpIC0geiAqIHNpbkRlbHRhUGhpKSwKICAgICAgYXNpbihr ICogY29zRGVsdGFHYW1tYSArIHkgKiBzaW5EZWx0YUdhbW1hKQogICAgXTsKICB9CgogIHJvdGF0 aW9uLmludmVydCA9IGZ1bmN0aW9uKGxhbWJkYSwgcGhpKSB7CiAgICB2YXIgY29zUGhpID0gY29z JDEocGhpKSwKICAgICAgICB4ID0gY29zJDEobGFtYmRhKSAqIGNvc1BoaSwKICAgICAgICB5ID0g c2luJDEobGFtYmRhKSAqIGNvc1BoaSwKICAgICAgICB6ID0gc2luJDEocGhpKSwKICAgICAgICBr ID0geiAqIGNvc0RlbHRhR2FtbWEgLSB5ICogc2luRGVsdGFHYW1tYTsKICAgIHJldHVybiBbCiAg ICAgIGF0YW4yKHkgKiBjb3NEZWx0YUdhbW1hICsgeiAqIHNpbkRlbHRhR2FtbWEsIHggKiBjb3NE ZWx0YVBoaSArIGsgKiBzaW5EZWx0YVBoaSksCiAgICAgIGFzaW4oayAqIGNvc0RlbHRhUGhpIC0g eCAqIHNpbkRlbHRhUGhpKQogICAgXTsKICB9OwoKICByZXR1cm4gcm90YXRpb247Cn0KCmZ1bmN0 aW9uIHJvdGF0aW9uKHJvdGF0ZSkgewogIHJvdGF0ZSA9IHJvdGF0ZVJhZGlhbnMocm90YXRlWzBd ICogcmFkaWFucywgcm90YXRlWzFdICogcmFkaWFucywgcm90YXRlLmxlbmd0aCA+IDIgPyByb3Rh dGVbMl0gKiByYWRpYW5zIDogMCk7CgogIGZ1bmN0aW9uIGZvcndhcmQoY29vcmRpbmF0ZXMpIHsK ICAgIGNvb3JkaW5hdGVzID0gcm90YXRlKGNvb3JkaW5hdGVzWzBdICogcmFkaWFucywgY29vcmRp bmF0ZXNbMV0gKiByYWRpYW5zKTsKICAgIHJldHVybiBjb29yZGluYXRlc1swXSAqPSBkZWdyZWVz JDEsIGNvb3JkaW5hdGVzWzFdICo9IGRlZ3JlZXMkMSwgY29vcmRpbmF0ZXM7CiAgfQoKICBmb3J3 YXJkLmludmVydCA9IGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7CiAgICBjb29yZGluYXRlcyA9IHJv dGF0ZS5pbnZlcnQoY29vcmRpbmF0ZXNbMF0gKiByYWRpYW5zLCBjb29yZGluYXRlc1sxXSAqIHJh ZGlhbnMpOwogICAgcmV0dXJuIGNvb3JkaW5hdGVzWzBdICo9IGRlZ3JlZXMkMSwgY29vcmRpbmF0 ZXNbMV0gKj0gZGVncmVlcyQxLCBjb29yZGluYXRlczsKICB9OwoKICByZXR1cm4gZm9yd2FyZDsK fQoKLy8gR2VuZXJhdGVzIGEgY2lyY2xlIGNlbnRlcmVkIGF0IFswwrAsIDDCsF0sIHdpdGggYSBn aXZlbiByYWRpdXMgYW5kIHByZWNpc2lvbi4KZnVuY3Rpb24gY2lyY2xlU3RyZWFtKHN0cmVhbSwg cmFkaXVzLCBkZWx0YSwgZGlyZWN0aW9uLCB0MCwgdDEpIHsKICBpZiAoIWRlbHRhKSByZXR1cm47 CiAgdmFyIGNvc1JhZGl1cyA9IGNvcyQxKHJhZGl1cyksCiAgICAgIHNpblJhZGl1cyA9IHNpbiQx KHJhZGl1cyksCiAgICAgIHN0ZXAgPSBkaXJlY3Rpb24gKiBkZWx0YTsKICBpZiAodDAgPT0gbnVs bCkgewogICAgdDAgPSByYWRpdXMgKyBkaXJlY3Rpb24gKiB0YXUkMzsKICAgIHQxID0gcmFkaXVz IC0gc3RlcCAvIDI7CiAgfSBlbHNlIHsKICAgIHQwID0gY2lyY2xlUmFkaXVzKGNvc1JhZGl1cywg dDApOwogICAgdDEgPSBjaXJjbGVSYWRpdXMoY29zUmFkaXVzLCB0MSk7CiAgICBpZiAoZGlyZWN0 aW9uID4gMCA/IHQwIDwgdDEgOiB0MCA+IHQxKSB0MCArPSBkaXJlY3Rpb24gKiB0YXUkMzsKICB9 CiAgZm9yICh2YXIgcG9pbnQsIHQgPSB0MDsgZGlyZWN0aW9uID4gMCA/IHQgPiB0MSA6IHQgPCB0 MTsgdCAtPSBzdGVwKSB7CiAgICBwb2ludCA9IHNwaGVyaWNhbChbY29zUmFkaXVzLCAtc2luUmFk aXVzICogY29zJDEodCksIC1zaW5SYWRpdXMgKiBzaW4kMSh0KV0pOwogICAgc3RyZWFtLnBvaW50 KHBvaW50WzBdLCBwb2ludFsxXSk7CiAgfQp9CgovLyBSZXR1cm5zIHRoZSBzaWduZWQgYW5nbGUg b2YgYSBjYXJ0ZXNpYW4gcG9pbnQgcmVsYXRpdmUgdG8gW2Nvc1JhZGl1cywgMCwgMF0uCmZ1bmN0 aW9uIGNpcmNsZVJhZGl1cyhjb3NSYWRpdXMsIHBvaW50KSB7CiAgcG9pbnQgPSBjYXJ0ZXNpYW4o cG9pbnQpLCBwb2ludFswXSAtPSBjb3NSYWRpdXM7CiAgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFj ZShwb2ludCk7CiAgdmFyIHJhZGl1cyA9IGFjb3MoLXBvaW50WzFdKTsKICByZXR1cm4gKCgtcG9p bnRbMl0gPCAwID8gLXJhZGl1cyA6IHJhZGl1cykgKyB0YXUkMyAtIGVwc2lsb24kMikgJSB0YXUk MzsKfQoKZnVuY3Rpb24gY2lyY2xlKCkgewogIHZhciBjZW50ZXIgPSBjb25zdGFudCQ4KFswLCAw XSksCiAgICAgIHJhZGl1cyA9IGNvbnN0YW50JDgoOTApLAogICAgICBwcmVjaXNpb24gPSBjb25z dGFudCQ4KDYpLAogICAgICByaW5nLAogICAgICByb3RhdGUsCiAgICAgIHN0cmVhbSA9IHtwb2lu dDogcG9pbnR9OwoKICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7CiAgICByaW5nLnB1c2goeCA9IHJv dGF0ZSh4LCB5KSk7CiAgICB4WzBdICo9IGRlZ3JlZXMkMSwgeFsxXSAqPSBkZWdyZWVzJDE7CiAg fQoKICBmdW5jdGlvbiBjaXJjbGUoKSB7CiAgICB2YXIgYyA9IGNlbnRlci5hcHBseSh0aGlzLCBh cmd1bWVudHMpLAogICAgICAgIHIgPSByYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSAqIHJh ZGlhbnMsCiAgICAgICAgcCA9IHByZWNpc2lvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpICogcmFk aWFuczsKICAgIHJpbmcgPSBbXTsKICAgIHJvdGF0ZSA9IHJvdGF0ZVJhZGlhbnMoLWNbMF0gKiBy YWRpYW5zLCAtY1sxXSAqIHJhZGlhbnMsIDApLmludmVydDsKICAgIGNpcmNsZVN0cmVhbShzdHJl YW0sIHIsIHAsIDEpOwogICAgYyA9IHt0eXBlOiAiUG9seWdvbiIsIGNvb3JkaW5hdGVzOiBbcmlu Z119OwogICAgcmluZyA9IHJvdGF0ZSA9IG51bGw7CiAgICByZXR1cm4gYzsKICB9CgogIGNpcmNs ZS5jZW50ZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChj ZW50ZXIgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ4KFsrX1swXSwg K19bMV1dKSwgY2lyY2xlKSA6IGNlbnRlcjsKICB9OwoKICBjaXJjbGUucmFkaXVzID0gZnVuY3Rp b24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gdHlwZW9mIF8g PT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkOCgrXyksIGNpcmNsZSkgOiByYWRpdXM7CiAg fTsKCiAgY2lyY2xlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVu dHMubGVuZ3RoID8gKHByZWNpc2lvbiA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNv bnN0YW50JDgoK18pLCBjaXJjbGUpIDogcHJlY2lzaW9uOwogIH07CgogIHJldHVybiBjaXJjbGU7 Cn0KCmZ1bmN0aW9uIGNsaXBCdWZmZXIoKSB7CiAgdmFyIGxpbmVzID0gW10sCiAgICAgIGxpbmU7 CiAgcmV0dXJuIHsKICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGxpbmUucHVzaChb eCwgeV0pOwogICAgfSwKICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgIGxpbmVzLnB1 c2gobGluZSA9IFtdKTsKICAgIH0sCiAgICBsaW5lRW5kOiBub29wJDIsCiAgICByZWpvaW46IGZ1 bmN0aW9uKCkgewogICAgICBpZiAobGluZXMubGVuZ3RoID4gMSkgbGluZXMucHVzaChsaW5lcy5w b3AoKS5jb25jYXQobGluZXMuc2hpZnQoKSkpOwogICAgfSwKICAgIHJlc3VsdDogZnVuY3Rpb24o KSB7CiAgICAgIHZhciByZXN1bHQgPSBsaW5lczsKICAgICAgbGluZXMgPSBbXTsKICAgICAgbGlu ZSA9IG51bGw7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgfTsKfQoKZnVuY3Rpb24gcG9p bnRFcXVhbChhLCBiKSB7CiAgcmV0dXJuIGFicyhhWzBdIC0gYlswXSkgPCBlcHNpbG9uJDIgJiYg YWJzKGFbMV0gLSBiWzFdKSA8IGVwc2lsb24kMjsKfQoKZnVuY3Rpb24gSW50ZXJzZWN0aW9uKHBv aW50LCBwb2ludHMsIG90aGVyLCBlbnRyeSkgewogIHRoaXMueCA9IHBvaW50OwogIHRoaXMueiA9 IHBvaW50czsKICB0aGlzLm8gPSBvdGhlcjsgLy8gYW5vdGhlciBpbnRlcnNlY3Rpb24KICB0aGlz LmUgPSBlbnRyeTsgLy8gaXMgYW4gZW50cnk/CiAgdGhpcy52ID0gZmFsc2U7IC8vIHZpc2l0ZWQK ICB0aGlzLm4gPSB0aGlzLnAgPSBudWxsOyAvLyBuZXh0ICYgcHJldmlvdXMKfQoKLy8gQSBnZW5l cmFsaXplZCBwb2x5Z29uIGNsaXBwaW5nIGFsZ29yaXRobTogZ2l2ZW4gYSBwb2x5Z29uIHRoYXQg aGFzIGJlZW4gY3V0Ci8vIGludG8gaXRzIHZpc2libGUgbGluZSBzZWdtZW50cywgYW5kIHJlam9p bnMgdGhlIHNlZ21lbnRzIGJ5IGludGVycG9sYXRpbmcKLy8gYWxvbmcgdGhlIGNsaXAgZWRnZS4K ZnVuY3Rpb24gY2xpcFJlam9pbihzZWdtZW50cywgY29tcGFyZUludGVyc2VjdGlvbiwgc3RhcnRJ bnNpZGUsIGludGVycG9sYXRlLCBzdHJlYW0pIHsKICB2YXIgc3ViamVjdCA9IFtdLAogICAgICBj bGlwID0gW10sCiAgICAgIGksCiAgICAgIG47CgogIHNlZ21lbnRzLmZvckVhY2goZnVuY3Rpb24o c2VnbWVudCkgewogICAgaWYgKChuID0gc2VnbWVudC5sZW5ndGggLSAxKSA8PSAwKSByZXR1cm47 CiAgICB2YXIgbiwgcDAgPSBzZWdtZW50WzBdLCBwMSA9IHNlZ21lbnRbbl0sIHg7CgogICAgLy8g SWYgdGhlIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBvZiBhIHNlZ21lbnQgYXJlIGNvaW5jaWRlbnQs IHRoZW4gdHJlYXQgYXMgYQogICAgLy8gY2xvc2VkIHJpbmcuIFRPRE8gaWYgYWxsIHJpbmdzIGFy ZSBjbG9zZWQsIHRoZW4gdGhlIHdpbmRpbmcgb3JkZXIgb2YgdGhlCiAgICAvLyBleHRlcmlvciBy aW5nIHNob3VsZCBiZSBjaGVja2VkLgogICAgaWYgKHBvaW50RXF1YWwocDAsIHAxKSkgewogICAg ICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHN0cmVh bS5wb2ludCgocDAgPSBzZWdtZW50W2ldKVswXSwgcDBbMV0pOwogICAgICBzdHJlYW0ubGluZUVu ZCgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgc3ViamVjdC5wdXNoKHggPSBuZXcgSW50ZXJz ZWN0aW9uKHAwLCBzZWdtZW50LCBudWxsLCB0cnVlKSk7CiAgICBjbGlwLnB1c2goeC5vID0gbmV3 IEludGVyc2VjdGlvbihwMCwgbnVsbCwgeCwgZmFsc2UpKTsKICAgIHN1YmplY3QucHVzaCh4ID0g bmV3IEludGVyc2VjdGlvbihwMSwgc2VnbWVudCwgbnVsbCwgZmFsc2UpKTsKICAgIGNsaXAucHVz aCh4Lm8gPSBuZXcgSW50ZXJzZWN0aW9uKHAxLCBudWxsLCB4LCB0cnVlKSk7CiAgfSk7CgogIGlm ICghc3ViamVjdC5sZW5ndGgpIHJldHVybjsKCiAgY2xpcC5zb3J0KGNvbXBhcmVJbnRlcnNlY3Rp b24pOwogIGxpbmskMShzdWJqZWN0KTsKICBsaW5rJDEoY2xpcCk7CgogIGZvciAoaSA9IDAsIG4g PSBjbGlwLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgY2xpcFtpXS5lID0gc3RhcnRJbnNpZGUg PSAhc3RhcnRJbnNpZGU7CiAgfQoKICB2YXIgc3RhcnQgPSBzdWJqZWN0WzBdLAogICAgICBwb2lu dHMsCiAgICAgIHBvaW50OwoKICB3aGlsZSAoMSkgewogICAgLy8gRmluZCBmaXJzdCB1bnZpc2l0 ZWQgaW50ZXJzZWN0aW9uLgogICAgdmFyIGN1cnJlbnQgPSBzdGFydCwKICAgICAgICBpc1N1Ympl Y3QgPSB0cnVlOwogICAgd2hpbGUgKGN1cnJlbnQudikgaWYgKChjdXJyZW50ID0gY3VycmVudC5u KSA9PT0gc3RhcnQpIHJldHVybjsKICAgIHBvaW50cyA9IGN1cnJlbnQuejsKICAgIHN0cmVhbS5s aW5lU3RhcnQoKTsKICAgIGRvIHsKICAgICAgY3VycmVudC52ID0gY3VycmVudC5vLnYgPSB0cnVl OwogICAgICBpZiAoY3VycmVudC5lKSB7CiAgICAgICAgaWYgKGlzU3ViamVjdCkgewogICAgICAg ICAgZm9yIChpID0gMCwgbiA9IHBvaW50cy5sZW5ndGg7IGkgPCBuOyArK2kpIHN0cmVhbS5wb2lu dCgocG9pbnQgPSBwb2ludHNbaV0pWzBdLCBwb2ludFsxXSk7CiAgICAgICAgfSBlbHNlIHsKICAg ICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5uLngsIDEsIHN0cmVhbSk7CiAg ICAgICAgfQogICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm47CiAgICAgIH0gZWxzZSB7CiAgICAg ICAgaWYgKGlzU3ViamVjdCkgewogICAgICAgICAgcG9pbnRzID0gY3VycmVudC5wLno7CiAgICAg ICAgICBmb3IgKGkgPSBwb2ludHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHN0cmVhbS5wb2lu dCgocG9pbnQgPSBwb2ludHNbaV0pWzBdLCBwb2ludFsxXSk7CiAgICAgICAgfSBlbHNlIHsKICAg ICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5wLngsIC0xLCBzdHJlYW0pOwog ICAgICAgIH0KICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wOwogICAgICB9CiAgICAgIGN1cnJl bnQgPSBjdXJyZW50Lm87CiAgICAgIHBvaW50cyA9IGN1cnJlbnQuejsKICAgICAgaXNTdWJqZWN0 ID0gIWlzU3ViamVjdDsKICAgIH0gd2hpbGUgKCFjdXJyZW50LnYpOwogICAgc3RyZWFtLmxpbmVF bmQoKTsKICB9Cn0KCmZ1bmN0aW9uIGxpbmskMShhcnJheSkgewogIGlmICghKG4gPSBhcnJheS5s ZW5ndGgpKSByZXR1cm47CiAgdmFyIG4sCiAgICAgIGkgPSAwLAogICAgICBhID0gYXJyYXlbMF0s CiAgICAgIGI7CiAgd2hpbGUgKCsraSA8IG4pIHsKICAgIGEubiA9IGIgPSBhcnJheVtpXTsKICAg IGIucCA9IGE7CiAgICBhID0gYjsKICB9CiAgYS5uID0gYiA9IGFycmF5WzBdOwogIGIucCA9IGE7 Cn0KCnZhciBzdW0kMSA9IGFkZGVyKCk7CgpmdW5jdGlvbiBsb25naXR1ZGUocG9pbnQpIHsKICBp ZiAoYWJzKHBvaW50WzBdKSA8PSBwaSQzKQogICAgcmV0dXJuIHBvaW50WzBdOwogIGVsc2UKICAg IHJldHVybiBzaWduKHBvaW50WzBdKSAqICgoYWJzKHBvaW50WzBdKSArIHBpJDMpICUgdGF1JDMg LSBwaSQzKTsKfQoKZnVuY3Rpb24gcG9seWdvbkNvbnRhaW5zKHBvbHlnb24sIHBvaW50KSB7CiAg dmFyIGxhbWJkYSA9IGxvbmdpdHVkZShwb2ludCksCiAgICAgIHBoaSA9IHBvaW50WzFdLAogICAg ICBzaW5QaGkgPSBzaW4kMShwaGkpLAogICAgICBub3JtYWwgPSBbc2luJDEobGFtYmRhKSwgLWNv cyQxKGxhbWJkYSksIDBdLAogICAgICBhbmdsZSA9IDAsCiAgICAgIHdpbmRpbmcgPSAwOwoKICBz dW0kMS5yZXNldCgpOwoKICBpZiAoc2luUGhpID09PSAxKSBwaGkgPSBoYWxmUGkkMiArIGVwc2ls b24kMjsKICBlbHNlIGlmIChzaW5QaGkgPT09IC0xKSBwaGkgPSAtaGFsZlBpJDIgLSBlcHNpbG9u JDI7CgogIGZvciAodmFyIGkgPSAwLCBuID0gcG9seWdvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHsK ICAgIGlmICghKG0gPSAocmluZyA9IHBvbHlnb25baV0pLmxlbmd0aCkpIGNvbnRpbnVlOwogICAg dmFyIHJpbmcsCiAgICAgICAgbSwKICAgICAgICBwb2ludDAgPSByaW5nW20gLSAxXSwKICAgICAg ICBsYW1iZGEwID0gbG9uZ2l0dWRlKHBvaW50MCksCiAgICAgICAgcGhpMCA9IHBvaW50MFsxXSAv IDIgKyBxdWFydGVyUGksCiAgICAgICAgc2luUGhpMCA9IHNpbiQxKHBoaTApLAogICAgICAgIGNv c1BoaTAgPSBjb3MkMShwaGkwKTsKCiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG07ICsraiwgbGFt YmRhMCA9IGxhbWJkYTEsIHNpblBoaTAgPSBzaW5QaGkxLCBjb3NQaGkwID0gY29zUGhpMSwgcG9p bnQwID0gcG9pbnQxKSB7CiAgICAgIHZhciBwb2ludDEgPSByaW5nW2pdLAogICAgICAgICAgbGFt YmRhMSA9IGxvbmdpdHVkZShwb2ludDEpLAogICAgICAgICAgcGhpMSA9IHBvaW50MVsxXSAvIDIg KyBxdWFydGVyUGksCiAgICAgICAgICBzaW5QaGkxID0gc2luJDEocGhpMSksCiAgICAgICAgICBj b3NQaGkxID0gY29zJDEocGhpMSksCiAgICAgICAgICBkZWx0YSA9IGxhbWJkYTEgLSBsYW1iZGEw LAogICAgICAgICAgc2lnbiA9IGRlbHRhID49IDAgPyAxIDogLTEsCiAgICAgICAgICBhYnNEZWx0 YSA9IHNpZ24gKiBkZWx0YSwKICAgICAgICAgIGFudGltZXJpZGlhbiA9IGFic0RlbHRhID4gcGkk MywKICAgICAgICAgIGsgPSBzaW5QaGkwICogc2luUGhpMTsKCiAgICAgIHN1bSQxLmFkZChhdGFu MihrICogc2lnbiAqIHNpbiQxKGFic0RlbHRhKSwgY29zUGhpMCAqIGNvc1BoaTEgKyBrICogY29z JDEoYWJzRGVsdGEpKSk7CiAgICAgIGFuZ2xlICs9IGFudGltZXJpZGlhbiA/IGRlbHRhICsgc2ln biAqIHRhdSQzIDogZGVsdGE7CgogICAgICAvLyBBcmUgdGhlIGxvbmdpdHVkZXMgZWl0aGVyIHNp ZGUgb2YgdGhlIHBvaW504oCZcyBtZXJpZGlhbiAobGFtYmRhKSwKICAgICAgLy8gYW5kIGFyZSB0 aGUgbGF0aXR1ZGVzIHNtYWxsZXIgdGhhbiB0aGUgcGFyYWxsZWwgKHBoaSk/CiAgICAgIGlmIChh bnRpbWVyaWRpYW4gXiBsYW1iZGEwID49IGxhbWJkYSBeIGxhbWJkYTEgPj0gbGFtYmRhKSB7CiAg ICAgICAgdmFyIGFyYyA9IGNhcnRlc2lhbkNyb3NzKGNhcnRlc2lhbihwb2ludDApLCBjYXJ0ZXNp YW4ocG9pbnQxKSk7CiAgICAgICAgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZShhcmMpOwogICAg ICAgIHZhciBpbnRlcnNlY3Rpb24gPSBjYXJ0ZXNpYW5Dcm9zcyhub3JtYWwsIGFyYyk7CiAgICAg ICAgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZShpbnRlcnNlY3Rpb24pOwogICAgICAgIHZhciBw aGlBcmMgPSAoYW50aW1lcmlkaWFuIF4gZGVsdGEgPj0gMCA/IC0xIDogMSkgKiBhc2luKGludGVy c2VjdGlvblsyXSk7CiAgICAgICAgaWYgKHBoaSA+IHBoaUFyYyB8fCBwaGkgPT09IHBoaUFyYyAm JiAoYXJjWzBdIHx8IGFyY1sxXSkpIHsKICAgICAgICAgIHdpbmRpbmcgKz0gYW50aW1lcmlkaWFu IF4gZGVsdGEgPj0gMCA/IDEgOiAtMTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8v IEZpcnN0LCBkZXRlcm1pbmUgd2hldGhlciB0aGUgU291dGggcG9sZSBpcyBpbnNpZGUgb3Igb3V0 c2lkZToKICAvLwogIC8vIEl0IGlzIGluc2lkZSBpZjoKICAvLyAqIHRoZSBwb2x5Z29uIHdpbmRz IGFyb3VuZCBpdCBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24uCiAgLy8gKiB0aGUgcG9seWdvbiBk b2VzIG5vdCAoY3VtdWxhdGl2ZWx5KSB3aW5kIGFyb3VuZCBpdCwgYnV0IGhhcyBhIG5lZ2F0aXZl CiAgLy8gICAoY291bnRlci1jbG9ja3dpc2UpIGFyZWEuCiAgLy8KICAvLyBTZWNvbmQsIGNvdW50 IHRoZSAoc2lnbmVkKSBudW1iZXIgb2YgdGltZXMgYSBzZWdtZW50IGNyb3NzZXMgYSBsYW1iZGEK ICAvLyBmcm9tIHRoZSBwb2ludCB0byB0aGUgU291dGggcG9sZS4gIElmIGl0IGlzIHplcm8sIHRo ZW4gdGhlIHBvaW50IGlzIHRoZQogIC8vIHNhbWUgc2lkZSBhcyB0aGUgU291dGggcG9sZS4KCiAg cmV0dXJuIChhbmdsZSA8IC1lcHNpbG9uJDIgfHwgYW5nbGUgPCBlcHNpbG9uJDIgJiYgc3VtJDEg PCAtZXBzaWxvbiQyKSBeICh3aW5kaW5nICYgMSk7Cn0KCmZ1bmN0aW9uIGNsaXAocG9pbnRWaXNp YmxlLCBjbGlwTGluZSwgaW50ZXJwb2xhdGUsIHN0YXJ0KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHNp bmspIHsKICAgIHZhciBsaW5lID0gY2xpcExpbmUoc2luayksCiAgICAgICAgcmluZ0J1ZmZlciA9 IGNsaXBCdWZmZXIoKSwKICAgICAgICByaW5nU2luayA9IGNsaXBMaW5lKHJpbmdCdWZmZXIpLAog ICAgICAgIHBvbHlnb25TdGFydGVkID0gZmFsc2UsCiAgICAgICAgcG9seWdvbiwKICAgICAgICBz ZWdtZW50cywKICAgICAgICByaW5nOwoKICAgIHZhciBjbGlwID0gewogICAgICBwb2ludDogcG9p bnQsCiAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LAogICAgICBsaW5lRW5kOiBsaW5lRW5kLAog ICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGNsaXAucG9pbnQgPSBwb2lu dFJpbmc7CiAgICAgICAgY2xpcC5saW5lU3RhcnQgPSByaW5nU3RhcnQ7CiAgICAgICAgY2xpcC5s aW5lRW5kID0gcmluZ0VuZDsKICAgICAgICBzZWdtZW50cyA9IFtdOwogICAgICAgIHBvbHlnb24g PSBbXTsKICAgICAgfSwKICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgY2xp cC5wb2ludCA9IHBvaW50OwogICAgICAgIGNsaXAubGluZVN0YXJ0ID0gbGluZVN0YXJ0OwogICAg ICAgIGNsaXAubGluZUVuZCA9IGxpbmVFbmQ7CiAgICAgICAgc2VnbWVudHMgPSBtZXJnZShzZWdt ZW50cyk7CiAgICAgICAgdmFyIHN0YXJ0SW5zaWRlID0gcG9seWdvbkNvbnRhaW5zKHBvbHlnb24s IHN0YXJ0KTsKICAgICAgICBpZiAoc2VnbWVudHMubGVuZ3RoKSB7CiAgICAgICAgICBpZiAoIXBv bHlnb25TdGFydGVkKSBzaW5rLnBvbHlnb25TdGFydCgpLCBwb2x5Z29uU3RhcnRlZCA9IHRydWU7 CiAgICAgICAgICBjbGlwUmVqb2luKHNlZ21lbnRzLCBjb21wYXJlSW50ZXJzZWN0aW9uLCBzdGFy dEluc2lkZSwgaW50ZXJwb2xhdGUsIHNpbmspOwogICAgICAgIH0gZWxzZSBpZiAoc3RhcnRJbnNp ZGUpIHsKICAgICAgICAgIGlmICghcG9seWdvblN0YXJ0ZWQpIHNpbmsucG9seWdvblN0YXJ0KCks IHBvbHlnb25TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgIHNpbmsubGluZVN0YXJ0KCk7CiAgICAg ICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBzaW5rKTsKICAgICAgICAgIHNpbmsubGlu ZUVuZCgpOwogICAgICAgIH0KICAgICAgICBpZiAocG9seWdvblN0YXJ0ZWQpIHNpbmsucG9seWdv bkVuZCgpLCBwb2x5Z29uU3RhcnRlZCA9IGZhbHNlOwogICAgICAgIHNlZ21lbnRzID0gcG9seWdv biA9IG51bGw7CiAgICAgIH0sCiAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7CiAgICAgICAgc2lu ay5wb2x5Z29uU3RhcnQoKTsKICAgICAgICBzaW5rLmxpbmVTdGFydCgpOwogICAgICAgIGludGVy cG9sYXRlKG51bGwsIG51bGwsIDEsIHNpbmspOwogICAgICAgIHNpbmsubGluZUVuZCgpOwogICAg ICAgIHNpbmsucG9seWdvbkVuZCgpOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIHBvaW50 KGxhbWJkYSwgcGhpKSB7CiAgICAgIGlmIChwb2ludFZpc2libGUobGFtYmRhLCBwaGkpKSBzaW5r LnBvaW50KGxhbWJkYSwgcGhpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb2ludExpbmUobGFtYmRh LCBwaGkpIHsKICAgICAgbGluZS5wb2ludChsYW1iZGEsIHBoaSk7CiAgICB9CgogICAgZnVuY3Rp b24gbGluZVN0YXJ0KCkgewogICAgICBjbGlwLnBvaW50ID0gcG9pbnRMaW5lOwogICAgICBsaW5l LmxpbmVTdGFydCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7CiAgICAgIGNsaXAu cG9pbnQgPSBwb2ludDsKICAgICAgbGluZS5saW5lRW5kKCk7CiAgICB9CgogICAgZnVuY3Rpb24g cG9pbnRSaW5nKGxhbWJkYSwgcGhpKSB7CiAgICAgIHJpbmcucHVzaChbbGFtYmRhLCBwaGldKTsK ICAgICAgcmluZ1NpbmsucG9pbnQobGFtYmRhLCBwaGkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJp bmdTdGFydCgpIHsKICAgICAgcmluZ1NpbmsubGluZVN0YXJ0KCk7CiAgICAgIHJpbmcgPSBbXTsK ICAgIH0KCiAgICBmdW5jdGlvbiByaW5nRW5kKCkgewogICAgICBwb2ludFJpbmcocmluZ1swXVsw XSwgcmluZ1swXVsxXSk7CiAgICAgIHJpbmdTaW5rLmxpbmVFbmQoKTsKCiAgICAgIHZhciBjbGVh biA9IHJpbmdTaW5rLmNsZWFuKCksCiAgICAgICAgICByaW5nU2VnbWVudHMgPSByaW5nQnVmZmVy LnJlc3VsdCgpLAogICAgICAgICAgaSwgbiA9IHJpbmdTZWdtZW50cy5sZW5ndGgsIG0sCiAgICAg ICAgICBzZWdtZW50LAogICAgICAgICAgcG9pbnQ7CgogICAgICByaW5nLnBvcCgpOwogICAgICBw b2x5Z29uLnB1c2gocmluZyk7CiAgICAgIHJpbmcgPSBudWxsOwoKICAgICAgaWYgKCFuKSByZXR1 cm47CgogICAgICAvLyBObyBpbnRlcnNlY3Rpb25zLgogICAgICBpZiAoY2xlYW4gJiAxKSB7CiAg ICAgICAgc2VnbWVudCA9IHJpbmdTZWdtZW50c1swXTsKICAgICAgICBpZiAoKG0gPSBzZWdtZW50 Lmxlbmd0aCAtIDEpID4gMCkgewogICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgc2luay5w b2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgc2luay5saW5l U3RhcnQoKTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHNpbmsucG9pbnQoKHBv aW50ID0gc2VnbWVudFtpXSlbMF0sIHBvaW50WzFdKTsKICAgICAgICAgIHNpbmsubGluZUVuZCgp OwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIC8vIFJlam9pbiBjb25u ZWN0ZWQgc2VnbWVudHMuCiAgICAgIC8vIFRPRE8gcmV1c2UgcmluZ0J1ZmZlci5yZWpvaW4oKT8K ICAgICAgaWYgKG4gPiAxICYmIGNsZWFuICYgMikgcmluZ1NlZ21lbnRzLnB1c2gocmluZ1NlZ21l bnRzLnBvcCgpLmNvbmNhdChyaW5nU2VnbWVudHMuc2hpZnQoKSkpOwoKICAgICAgc2VnbWVudHMu cHVzaChyaW5nU2VnbWVudHMuZmlsdGVyKHZhbGlkU2VnbWVudCkpOwogICAgfQoKICAgIHJldHVy biBjbGlwOwogIH07Cn0KCmZ1bmN0aW9uIHZhbGlkU2VnbWVudChzZWdtZW50KSB7CiAgcmV0dXJu IHNlZ21lbnQubGVuZ3RoID4gMTsKfQoKLy8gSW50ZXJzZWN0aW9ucyBhcmUgc29ydGVkIGFsb25n IHRoZSBjbGlwIGVkZ2UuIEZvciBib3RoIGFudGltZXJpZGlhbiBjdXR0aW5nCi8vIGFuZCBjaXJj bGUgY2xpcHBpbmcsIHRoZSBzYW1lIGNvbXBhcmlzb24gaXMgdXNlZC4KZnVuY3Rpb24gY29tcGFy ZUludGVyc2VjdGlvbihhLCBiKSB7CiAgcmV0dXJuICgoYSA9IGEueClbMF0gPCAwID8gYVsxXSAt IGhhbGZQaSQyIC0gZXBzaWxvbiQyIDogaGFsZlBpJDIgLSBhWzFdKQogICAgICAgLSAoKGIgPSBi LngpWzBdIDwgMCA/IGJbMV0gLSBoYWxmUGkkMiAtIGVwc2lsb24kMiA6IGhhbGZQaSQyIC0gYlsx XSk7Cn0KCnZhciBjbGlwQW50aW1lcmlkaWFuID0gY2xpcCgKICBmdW5jdGlvbigpIHsgcmV0dXJu IHRydWU7IH0sCiAgY2xpcEFudGltZXJpZGlhbkxpbmUsCiAgY2xpcEFudGltZXJpZGlhbkludGVy cG9sYXRlLAogIFstcGkkMywgLWhhbGZQaSQyXQopOwoKLy8gVGFrZXMgYSBsaW5lIGFuZCBjdXRz IGludG8gdmlzaWJsZSBzZWdtZW50cy4gUmV0dXJuIHZhbHVlczogMCAtIHRoZXJlIHdlcmUKLy8g aW50ZXJzZWN0aW9ucyBvciB0aGUgbGluZSB3YXMgZW1wdHk7IDEgLSBubyBpbnRlcnNlY3Rpb25z OyAyIC0gdGhlcmUgd2VyZQovLyBpbnRlcnNlY3Rpb25zLCBhbmQgdGhlIGZpcnN0IGFuZCBsYXN0 IHNlZ21lbnRzIHNob3VsZCBiZSByZWpvaW5lZC4KZnVuY3Rpb24gY2xpcEFudGltZXJpZGlhbkxp bmUoc3RyZWFtKSB7CiAgdmFyIGxhbWJkYTAgPSBOYU4sCiAgICAgIHBoaTAgPSBOYU4sCiAgICAg IHNpZ24wID0gTmFOLAogICAgICBjbGVhbjsgLy8gbm8gaW50ZXJzZWN0aW9ucwoKICByZXR1cm4g ewogICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwog ICAgICBjbGVhbiA9IDE7CiAgICB9LAogICAgcG9pbnQ6IGZ1bmN0aW9uKGxhbWJkYTEsIHBoaTEp IHsKICAgICAgdmFyIHNpZ24xID0gbGFtYmRhMSA+IDAgPyBwaSQzIDogLXBpJDMsCiAgICAgICAg ICBkZWx0YSA9IGFicyhsYW1iZGExIC0gbGFtYmRhMCk7CiAgICAgIGlmIChhYnMoZGVsdGEgLSBw aSQzKSA8IGVwc2lsb24kMikgeyAvLyBsaW5lIGNyb3NzZXMgYSBwb2xlCiAgICAgICAgc3RyZWFt LnBvaW50KGxhbWJkYTAsIHBoaTAgPSAocGhpMCArIHBoaTEpIC8gMiA+IDAgPyBoYWxmUGkkMiA6 IC1oYWxmUGkkMik7CiAgICAgICAgc3RyZWFtLnBvaW50KHNpZ24wLCBwaGkwKTsKICAgICAgICBz dHJlYW0ubGluZUVuZCgpOwogICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICBzdHJl YW0ucG9pbnQoc2lnbjEsIHBoaTApOwogICAgICAgIHN0cmVhbS5wb2ludChsYW1iZGExLCBwaGkw KTsKICAgICAgICBjbGVhbiA9IDA7CiAgICAgIH0gZWxzZSBpZiAoc2lnbjAgIT09IHNpZ24xICYm IGRlbHRhID49IHBpJDMpIHsgLy8gbGluZSBjcm9zc2VzIGFudGltZXJpZGlhbgogICAgICAgIGlm IChhYnMobGFtYmRhMCAtIHNpZ24wKSA8IGVwc2lsb24kMikgbGFtYmRhMCAtPSBzaWduMCAqIGVw c2lsb24kMjsgLy8gaGFuZGxlIGRlZ2VuZXJhY2llcwogICAgICAgIGlmIChhYnMobGFtYmRhMSAt IHNpZ24xKSA8IGVwc2lsb24kMikgbGFtYmRhMSAtPSBzaWduMSAqIGVwc2lsb24kMjsKICAgICAg ICBwaGkwID0gY2xpcEFudGltZXJpZGlhbkludGVyc2VjdChsYW1iZGEwLCBwaGkwLCBsYW1iZGEx LCBwaGkxKTsKICAgICAgICBzdHJlYW0ucG9pbnQoc2lnbjAsIHBoaTApOwogICAgICAgIHN0cmVh bS5saW5lRW5kKCk7CiAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgIHN0cmVhbS5w b2ludChzaWduMSwgcGhpMCk7CiAgICAgICAgY2xlYW4gPSAwOwogICAgICB9CiAgICAgIHN0cmVh bS5wb2ludChsYW1iZGEwID0gbGFtYmRhMSwgcGhpMCA9IHBoaTEpOwogICAgICBzaWduMCA9IHNp Z24xOwogICAgfSwKICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICBzdHJlYW0ubGluZUVu ZCgpOwogICAgICBsYW1iZGEwID0gcGhpMCA9IE5hTjsKICAgIH0sCiAgICBjbGVhbjogZnVuY3Rp b24oKSB7CiAgICAgIHJldHVybiAyIC0gY2xlYW47IC8vIGlmIGludGVyc2VjdGlvbnMsIHJlam9p biBmaXJzdCBhbmQgbGFzdCBzZWdtZW50cwogICAgfQogIH07Cn0KCmZ1bmN0aW9uIGNsaXBBbnRp bWVyaWRpYW5JbnRlcnNlY3QobGFtYmRhMCwgcGhpMCwgbGFtYmRhMSwgcGhpMSkgewogIHZhciBj b3NQaGkwLAogICAgICBjb3NQaGkxLAogICAgICBzaW5MYW1iZGEwTGFtYmRhMSA9IHNpbiQxKGxh bWJkYTAgLSBsYW1iZGExKTsKICByZXR1cm4gYWJzKHNpbkxhbWJkYTBMYW1iZGExKSA+IGVwc2ls b24kMgogICAgICA/IGF0YW4oKHNpbiQxKHBoaTApICogKGNvc1BoaTEgPSBjb3MkMShwaGkxKSkg KiBzaW4kMShsYW1iZGExKQogICAgICAgICAgLSBzaW4kMShwaGkxKSAqIChjb3NQaGkwID0gY29z JDEocGhpMCkpICogc2luJDEobGFtYmRhMCkpCiAgICAgICAgICAvIChjb3NQaGkwICogY29zUGhp MSAqIHNpbkxhbWJkYTBMYW1iZGExKSkKICAgICAgOiAocGhpMCArIHBoaTEpIC8gMjsKfQoKZnVu Y3Rpb24gY2xpcEFudGltZXJpZGlhbkludGVycG9sYXRlKGZyb20sIHRvLCBkaXJlY3Rpb24sIHN0 cmVhbSkgewogIHZhciBwaGk7CiAgaWYgKGZyb20gPT0gbnVsbCkgewogICAgcGhpID0gZGlyZWN0 aW9uICogaGFsZlBpJDI7CiAgICBzdHJlYW0ucG9pbnQoLXBpJDMsIHBoaSk7CiAgICBzdHJlYW0u cG9pbnQoMCwgcGhpKTsKICAgIHN0cmVhbS5wb2ludChwaSQzLCBwaGkpOwogICAgc3RyZWFtLnBv aW50KHBpJDMsIDApOwogICAgc3RyZWFtLnBvaW50KHBpJDMsIC1waGkpOwogICAgc3RyZWFtLnBv aW50KDAsIC1waGkpOwogICAgc3RyZWFtLnBvaW50KC1waSQzLCAtcGhpKTsKICAgIHN0cmVhbS5w b2ludCgtcGkkMywgMCk7CiAgICBzdHJlYW0ucG9pbnQoLXBpJDMsIHBoaSk7CiAgfSBlbHNlIGlm IChhYnMoZnJvbVswXSAtIHRvWzBdKSA+IGVwc2lsb24kMikgewogICAgdmFyIGxhbWJkYSA9IGZy b21bMF0gPCB0b1swXSA/IHBpJDMgOiAtcGkkMzsKICAgIHBoaSA9IGRpcmVjdGlvbiAqIGxhbWJk YSAvIDI7CiAgICBzdHJlYW0ucG9pbnQoLWxhbWJkYSwgcGhpKTsKICAgIHN0cmVhbS5wb2ludCgw LCBwaGkpOwogICAgc3RyZWFtLnBvaW50KGxhbWJkYSwgcGhpKTsKICB9IGVsc2UgewogICAgc3Ry ZWFtLnBvaW50KHRvWzBdLCB0b1sxXSk7CiAgfQp9CgpmdW5jdGlvbiBjbGlwQ2lyY2xlKHJhZGl1 cykgewogIHZhciBjciA9IGNvcyQxKHJhZGl1cyksCiAgICAgIGRlbHRhID0gNiAqIHJhZGlhbnMs CiAgICAgIHNtYWxsUmFkaXVzID0gY3IgPiAwLAogICAgICBub3RIZW1pc3BoZXJlID0gYWJzKGNy KSA+IGVwc2lsb24kMjsgLy8gVE9ETyBvcHRpbWlzZSBmb3IgdGhpcyBjb21tb24gY2FzZQoKICBm dW5jdGlvbiBpbnRlcnBvbGF0ZShmcm9tLCB0bywgZGlyZWN0aW9uLCBzdHJlYW0pIHsKICAgIGNp cmNsZVN0cmVhbShzdHJlYW0sIHJhZGl1cywgZGVsdGEsIGRpcmVjdGlvbiwgZnJvbSwgdG8pOwog IH0KCiAgZnVuY3Rpb24gdmlzaWJsZShsYW1iZGEsIHBoaSkgewogICAgcmV0dXJuIGNvcyQxKGxh bWJkYSkgKiBjb3MkMShwaGkpID4gY3I7CiAgfQoKICAvLyBUYWtlcyBhIGxpbmUgYW5kIGN1dHMg aW50byB2aXNpYmxlIHNlZ21lbnRzLiBSZXR1cm4gdmFsdWVzIHVzZWQgZm9yIHBvbHlnb24KICAv LyBjbGlwcGluZzogMCAtIHRoZXJlIHdlcmUgaW50ZXJzZWN0aW9ucyBvciB0aGUgbGluZSB3YXMg ZW1wdHk7IDEgLSBubwogIC8vIGludGVyc2VjdGlvbnMgMiAtIHRoZXJlIHdlcmUgaW50ZXJzZWN0 aW9ucywgYW5kIHRoZSBmaXJzdCBhbmQgbGFzdCBzZWdtZW50cwogIC8vIHNob3VsZCBiZSByZWpv aW5lZC4KICBmdW5jdGlvbiBjbGlwTGluZShzdHJlYW0pIHsKICAgIHZhciBwb2ludDAsIC8vIHBy ZXZpb3VzIHBvaW50CiAgICAgICAgYzAsIC8vIGNvZGUgZm9yIHByZXZpb3VzIHBvaW50CiAgICAg ICAgdjAsIC8vIHZpc2liaWxpdHkgb2YgcHJldmlvdXMgcG9pbnQKICAgICAgICB2MDAsIC8vIHZp c2liaWxpdHkgb2YgZmlyc3QgcG9pbnQKICAgICAgICBjbGVhbjsgLy8gbm8gaW50ZXJzZWN0aW9u cwogICAgcmV0dXJuIHsKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB2MDAg PSB2MCA9IGZhbHNlOwogICAgICAgIGNsZWFuID0gMTsKICAgICAgfSwKICAgICAgcG9pbnQ6IGZ1 bmN0aW9uKGxhbWJkYSwgcGhpKSB7CiAgICAgICAgdmFyIHBvaW50MSA9IFtsYW1iZGEsIHBoaV0s CiAgICAgICAgICAgIHBvaW50MiwKICAgICAgICAgICAgdiA9IHZpc2libGUobGFtYmRhLCBwaGkp LAogICAgICAgICAgICBjID0gc21hbGxSYWRpdXMKICAgICAgICAgICAgICA/IHYgPyAwIDogY29k ZShsYW1iZGEsIHBoaSkKICAgICAgICAgICAgICA6IHYgPyBjb2RlKGxhbWJkYSArIChsYW1iZGEg PCAwID8gcGkkMyA6IC1waSQzKSwgcGhpKSA6IDA7CiAgICAgICAgaWYgKCFwb2ludDAgJiYgKHYw MCA9IHYwID0gdikpIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICAvLyBIYW5kbGUgZGVnZW5l cmFjaWVzLgogICAgICAgIC8vIFRPRE8gaWdub3JlIGlmIG5vdCBjbGlwcGluZyBwb2x5Z29ucy4K ICAgICAgICBpZiAodiAhPT0gdjApIHsKICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2lu dDAsIHBvaW50MSk7CiAgICAgICAgICBpZiAoIXBvaW50MiB8fCBwb2ludEVxdWFsKHBvaW50MCwg cG9pbnQyKSB8fCBwb2ludEVxdWFsKHBvaW50MSwgcG9pbnQyKSkgewogICAgICAgICAgICBwb2lu dDFbMF0gKz0gZXBzaWxvbiQyOwogICAgICAgICAgICBwb2ludDFbMV0gKz0gZXBzaWxvbiQyOwog ICAgICAgICAgICB2ID0gdmlzaWJsZShwb2ludDFbMF0sIHBvaW50MVsxXSk7CiAgICAgICAgICB9 CiAgICAgICAgfQogICAgICAgIGlmICh2ICE9PSB2MCkgewogICAgICAgICAgY2xlYW4gPSAwOwog ICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgLy8gb3V0c2lkZSBnb2luZyBpbgogICAgICAg ICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChw b2ludDEsIHBvaW50MCk7CiAgICAgICAgICAgIHN0cmVhbS5wb2ludChwb2ludDJbMF0sIHBvaW50 MlsxXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBpbnNpZGUgZ29pbmcgb3V0 CiAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDAsIHBvaW50MSk7CiAgICAgICAg ICAgIHN0cmVhbS5wb2ludChwb2ludDJbMF0sIHBvaW50MlsxXSk7CiAgICAgICAgICAgIHN0cmVh bS5saW5lRW5kKCk7CiAgICAgICAgICB9CiAgICAgICAgICBwb2ludDAgPSBwb2ludDI7CiAgICAg ICAgfSBlbHNlIGlmIChub3RIZW1pc3BoZXJlICYmIHBvaW50MCAmJiBzbWFsbFJhZGl1cyBeIHYp IHsKICAgICAgICAgIHZhciB0OwogICAgICAgICAgLy8gSWYgdGhlIGNvZGVzIGZvciB0d28gcG9p bnRzIGFyZSBkaWZmZXJlbnQsIG9yIGFyZSBib3RoIHplcm8sCiAgICAgICAgICAvLyBhbmQgdGhl cmUgdGhpcyBzZWdtZW50IGludGVyc2VjdHMgd2l0aCB0aGUgc21hbGwgY2lyY2xlLgogICAgICAg ICAgaWYgKCEoYyAmIGMwKSAmJiAodCA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCwgdHJ1ZSkp KSB7CiAgICAgICAgICAgIGNsZWFuID0gMDsKICAgICAgICAgICAgaWYgKHNtYWxsUmFkaXVzKSB7 CiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgIHN0cmVhbS5w b2ludCh0WzBdWzBdLCB0WzBdWzFdKTsKICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFsxXVsw XSwgdFsxXVsxXSk7CiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgICAg fSBlbHNlIHsKICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFsxXVswXSwgdFsxXVsxXSk7CiAg ICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgICAgICBzdHJlYW0ubGluZVN0 YXJ0KCk7CiAgICAgICAgICAgICAgc3RyZWFtLnBvaW50KHRbMF1bMF0sIHRbMF1bMV0pOwogICAg ICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh2ICYmICghcG9pbnQw IHx8ICFwb2ludEVxdWFsKHBvaW50MCwgcG9pbnQxKSkpIHsKICAgICAgICAgIHN0cmVhbS5wb2lu dChwb2ludDFbMF0sIHBvaW50MVsxXSk7CiAgICAgICAgfQogICAgICAgIHBvaW50MCA9IHBvaW50 MSwgdjAgPSB2LCBjMCA9IGM7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewog ICAgICAgIGlmICh2MCkgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICBwb2ludDAgPSBudWxsOwog ICAgICB9LAogICAgICAvLyBSZWpvaW4gZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHMgaWYgdGhlcmUg d2VyZSBpbnRlcnNlY3Rpb25zIGFuZCB0aGUgZmlyc3QKICAgICAgLy8gYW5kIGxhc3QgcG9pbnRz IHdlcmUgdmlzaWJsZS4KICAgICAgY2xlYW46IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBj bGVhbiB8ICgodjAwICYmIHYwKSA8PCAxKTsKICAgICAgfQogICAgfTsKICB9CgogIC8vIEludGVy c2VjdHMgdGhlIGdyZWF0IGNpcmNsZSBiZXR3ZWVuIGEgYW5kIGIgd2l0aCB0aGUgY2xpcCBjaXJj bGUuCiAgZnVuY3Rpb24gaW50ZXJzZWN0KGEsIGIsIHR3bykgewogICAgdmFyIHBhID0gY2FydGVz aWFuKGEpLAogICAgICAgIHBiID0gY2FydGVzaWFuKGIpOwoKICAgIC8vIFdlIGhhdmUgdHdvIHBs YW5lcywgbjEucCA9IGQxIGFuZCBuMi5wID0gZDIuCiAgICAvLyBGaW5kIGludGVyc2VjdGlvbiBs aW5lIHAodCkgPSBjMSBuMSArIGMyIG4yICsgdCAobjEg4qivIG4yKS4KICAgIHZhciBuMSA9IFsx LCAwLCAwXSwgLy8gbm9ybWFsCiAgICAgICAgbjIgPSBjYXJ0ZXNpYW5Dcm9zcyhwYSwgcGIpLAog ICAgICAgIG4ybjIgPSBjYXJ0ZXNpYW5Eb3QobjIsIG4yKSwKICAgICAgICBuMW4yID0gbjJbMF0s IC8vIGNhcnRlc2lhbkRvdChuMSwgbjIpLAogICAgICAgIGRldGVybWluYW50ID0gbjJuMiAtIG4x bjIgKiBuMW4yOwoKICAgIC8vIFR3byBwb2xhciBwb2ludHMuCiAgICBpZiAoIWRldGVybWluYW50 KSByZXR1cm4gIXR3byAmJiBhOwoKICAgIHZhciBjMSA9ICBjciAqIG4ybjIgLyBkZXRlcm1pbmFu dCwKICAgICAgICBjMiA9IC1jciAqIG4xbjIgLyBkZXRlcm1pbmFudCwKICAgICAgICBuMXhuMiA9 IGNhcnRlc2lhbkNyb3NzKG4xLCBuMiksCiAgICAgICAgQSA9IGNhcnRlc2lhblNjYWxlKG4xLCBj MSksCiAgICAgICAgQiA9IGNhcnRlc2lhblNjYWxlKG4yLCBjMik7CiAgICBjYXJ0ZXNpYW5BZGRJ blBsYWNlKEEsIEIpOwoKICAgIC8vIFNvbHZlIHxwKHQpfF4yID0gMS4KICAgIHZhciB1ID0gbjF4 bjIsCiAgICAgICAgdyA9IGNhcnRlc2lhbkRvdChBLCB1KSwKICAgICAgICB1dSA9IGNhcnRlc2lh bkRvdCh1LCB1KSwKICAgICAgICB0MiA9IHcgKiB3IC0gdXUgKiAoY2FydGVzaWFuRG90KEEsIEEp IC0gMSk7CgogICAgaWYgKHQyIDwgMCkgcmV0dXJuOwoKICAgIHZhciB0ID0gc3FydCh0MiksCiAg ICAgICAgcSA9IGNhcnRlc2lhblNjYWxlKHUsICgtdyAtIHQpIC8gdXUpOwogICAgY2FydGVzaWFu QWRkSW5QbGFjZShxLCBBKTsKICAgIHEgPSBzcGhlcmljYWwocSk7CgogICAgaWYgKCF0d28pIHJl dHVybiBxOwoKICAgIC8vIFR3byBpbnRlcnNlY3Rpb24gcG9pbnRzLgogICAgdmFyIGxhbWJkYTAg PSBhWzBdLAogICAgICAgIGxhbWJkYTEgPSBiWzBdLAogICAgICAgIHBoaTAgPSBhWzFdLAogICAg ICAgIHBoaTEgPSBiWzFdLAogICAgICAgIHo7CgogICAgaWYgKGxhbWJkYTEgPCBsYW1iZGEwKSB6 ID0gbGFtYmRhMCwgbGFtYmRhMCA9IGxhbWJkYTEsIGxhbWJkYTEgPSB6OwoKICAgIHZhciBkZWx0 YSA9IGxhbWJkYTEgLSBsYW1iZGEwLAogICAgICAgIHBvbGFyID0gYWJzKGRlbHRhIC0gcGkkMykg PCBlcHNpbG9uJDIsCiAgICAgICAgbWVyaWRpYW4gPSBwb2xhciB8fCBkZWx0YSA8IGVwc2lsb24k MjsKCiAgICBpZiAoIXBvbGFyICYmIHBoaTEgPCBwaGkwKSB6ID0gcGhpMCwgcGhpMCA9IHBoaTEs IHBoaTEgPSB6OwoKICAgIC8vIENoZWNrIHRoYXQgdGhlIGZpcnN0IHBvaW50IGlzIGJldHdlZW4g YSBhbmQgYi4KICAgIGlmIChtZXJpZGlhbgogICAgICAgID8gcG9sYXIKICAgICAgICAgID8gcGhp MCArIHBoaTEgPiAwIF4gcVsxXSA8IChhYnMocVswXSAtIGxhbWJkYTApIDwgZXBzaWxvbiQyID8g cGhpMCA6IHBoaTEpCiAgICAgICAgICA6IHBoaTAgPD0gcVsxXSAmJiBxWzFdIDw9IHBoaTEKICAg ICAgICA6IGRlbHRhID4gcGkkMyBeIChsYW1iZGEwIDw9IHFbMF0gJiYgcVswXSA8PSBsYW1iZGEx KSkgewogICAgICB2YXIgcTEgPSBjYXJ0ZXNpYW5TY2FsZSh1LCAoLXcgKyB0KSAvIHV1KTsKICAg ICAgY2FydGVzaWFuQWRkSW5QbGFjZShxMSwgQSk7CiAgICAgIHJldHVybiBbcSwgc3BoZXJpY2Fs KHExKV07CiAgICB9CiAgfQoKICAvLyBHZW5lcmF0ZXMgYSA0LWJpdCB2ZWN0b3IgcmVwcmVzZW50 aW5nIHRoZSBsb2NhdGlvbiBvZiBhIHBvaW50IHJlbGF0aXZlIHRvCiAgLy8gdGhlIHNtYWxsIGNp cmNsZSdzIGJvdW5kaW5nIGJveC4KICBmdW5jdGlvbiBjb2RlKGxhbWJkYSwgcGhpKSB7CiAgICB2 YXIgciA9IHNtYWxsUmFkaXVzID8gcmFkaXVzIDogcGkkMyAtIHJhZGl1cywKICAgICAgICBjb2Rl ID0gMDsKICAgIGlmIChsYW1iZGEgPCAtcikgY29kZSB8PSAxOyAvLyBsZWZ0CiAgICBlbHNlIGlm IChsYW1iZGEgPiByKSBjb2RlIHw9IDI7IC8vIHJpZ2h0CiAgICBpZiAocGhpIDwgLXIpIGNvZGUg fD0gNDsgLy8gYmVsb3cKICAgIGVsc2UgaWYgKHBoaSA+IHIpIGNvZGUgfD0gODsgLy8gYWJvdmUK ICAgIHJldHVybiBjb2RlOwogIH0KCiAgcmV0dXJuIGNsaXAodmlzaWJsZSwgY2xpcExpbmUsIGlu dGVycG9sYXRlLCBzbWFsbFJhZGl1cyA/IFswLCAtcmFkaXVzXSA6IFstcGkkMywgcmFkaXVzIC0g cGkkM10pOwp9CgpmdW5jdGlvbiBjbGlwTGluZShhLCBiLCB4MCwgeTAsIHgxLCB5MSkgewogIHZh ciBheCA9IGFbMF0sCiAgICAgIGF5ID0gYVsxXSwKICAgICAgYnggPSBiWzBdLAogICAgICBieSA9 IGJbMV0sCiAgICAgIHQwID0gMCwKICAgICAgdDEgPSAxLAogICAgICBkeCA9IGJ4IC0gYXgsCiAg ICAgIGR5ID0gYnkgLSBheSwKICAgICAgcjsKCiAgciA9IHgwIC0gYXg7CiAgaWYgKCFkeCAmJiBy ID4gMCkgcmV0dXJuOwogIHIgLz0gZHg7CiAgaWYgKGR4IDwgMCkgewogICAgaWYgKHIgPCB0MCkg cmV0dXJuOwogICAgaWYgKHIgPCB0MSkgdDEgPSByOwogIH0gZWxzZSBpZiAoZHggPiAwKSB7CiAg ICBpZiAociA+IHQxKSByZXR1cm47CiAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgfQoKICByID0g eDEgLSBheDsKICBpZiAoIWR4ICYmIHIgPCAwKSByZXR1cm47CiAgciAvPSBkeDsKICBpZiAoZHgg PCAwKSB7CiAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAg fSBlbHNlIGlmIChkeCA+IDApIHsKICAgIGlmIChyIDwgdDApIHJldHVybjsKICAgIGlmIChyIDwg dDEpIHQxID0gcjsKICB9CgogIHIgPSB5MCAtIGF5OwogIGlmICghZHkgJiYgciA+IDApIHJldHVy bjsKICByIC89IGR5OwogIGlmIChkeSA8IDApIHsKICAgIGlmIChyIDwgdDApIHJldHVybjsKICAg IGlmIChyIDwgdDEpIHQxID0gcjsKICB9IGVsc2UgaWYgKGR5ID4gMCkgewogICAgaWYgKHIgPiB0 MSkgcmV0dXJuOwogICAgaWYgKHIgPiB0MCkgdDAgPSByOwogIH0KCiAgciA9IHkxIC0gYXk7CiAg aWYgKCFkeSAmJiByIDwgMCkgcmV0dXJuOwogIHIgLz0gZHk7CiAgaWYgKGR5IDwgMCkgewogICAg aWYgKHIgPiB0MSkgcmV0dXJuOwogICAgaWYgKHIgPiB0MCkgdDAgPSByOwogIH0gZWxzZSBpZiAo ZHkgPiAwKSB7CiAgICBpZiAociA8IHQwKSByZXR1cm47CiAgICBpZiAociA8IHQxKSB0MSA9IHI7 CiAgfQoKICBpZiAodDAgPiAwKSBhWzBdID0gYXggKyB0MCAqIGR4LCBhWzFdID0gYXkgKyB0MCAq IGR5OwogIGlmICh0MSA8IDEpIGJbMF0gPSBheCArIHQxICogZHgsIGJbMV0gPSBheSArIHQxICog ZHk7CiAgcmV0dXJuIHRydWU7Cn0KCnZhciBjbGlwTWF4ID0gMWU5LCBjbGlwTWluID0gLWNsaXBN YXg7CgovLyBUT0RPIFVzZSBkMy1wb2x5Z29u4oCZcyBwb2x5Z29uQ29udGFpbnMgaGVyZSBmb3Ig dGhlIHJpbmcgY2hlY2s/Ci8vIFRPRE8gRWxpbWluYXRlIGR1cGxpY2F0ZSBidWZmZXJpbmcgaW4g Y2xpcEJ1ZmZlciBhbmQgcG9seWdvbi5wdXNoPwoKZnVuY3Rpb24gY2xpcFJlY3RhbmdsZSh4MCwg eTAsIHgxLCB5MSkgewoKICBmdW5jdGlvbiB2aXNpYmxlKHgsIHkpIHsKICAgIHJldHVybiB4MCA8 PSB4ICYmIHggPD0geDEgJiYgeTAgPD0geSAmJiB5IDw9IHkxOwogIH0KCiAgZnVuY3Rpb24gaW50 ZXJwb2xhdGUoZnJvbSwgdG8sIGRpcmVjdGlvbiwgc3RyZWFtKSB7CiAgICB2YXIgYSA9IDAsIGEx ID0gMDsKICAgIGlmIChmcm9tID09IG51bGwKICAgICAgICB8fCAoYSA9IGNvcm5lcihmcm9tLCBk aXJlY3Rpb24pKSAhPT0gKGExID0gY29ybmVyKHRvLCBkaXJlY3Rpb24pKQogICAgICAgIHx8IGNv bXBhcmVQb2ludChmcm9tLCB0bykgPCAwIF4gZGlyZWN0aW9uID4gMCkgewogICAgICBkbyBzdHJl YW0ucG9pbnQoYSA9PT0gMCB8fCBhID09PSAzID8geDAgOiB4MSwgYSA+IDEgPyB5MSA6IHkwKTsK ICAgICAgd2hpbGUgKChhID0gKGEgKyBkaXJlY3Rpb24gKyA0KSAlIDQpICE9PSBhMSk7CiAgICB9 IGVsc2UgewogICAgICBzdHJlYW0ucG9pbnQodG9bMF0sIHRvWzFdKTsKICAgIH0KICB9CgogIGZ1 bmN0aW9uIGNvcm5lcihwLCBkaXJlY3Rpb24pIHsKICAgIHJldHVybiBhYnMocFswXSAtIHgwKSA8 IGVwc2lsb24kMiA/IGRpcmVjdGlvbiA+IDAgPyAwIDogMwogICAgICAgIDogYWJzKHBbMF0gLSB4 MSkgPCBlcHNpbG9uJDIgPyBkaXJlY3Rpb24gPiAwID8gMiA6IDEKICAgICAgICA6IGFicyhwWzFd IC0geTApIDwgZXBzaWxvbiQyID8gZGlyZWN0aW9uID4gMCA/IDEgOiAwCiAgICAgICAgOiBkaXJl Y3Rpb24gPiAwID8gMyA6IDI7IC8vIGFicyhwWzFdIC0geTEpIDwgZXBzaWxvbgogIH0KCiAgZnVu Y3Rpb24gY29tcGFyZUludGVyc2VjdGlvbihhLCBiKSB7CiAgICByZXR1cm4gY29tcGFyZVBvaW50 KGEueCwgYi54KTsKICB9CgogIGZ1bmN0aW9uIGNvbXBhcmVQb2ludChhLCBiKSB7CiAgICB2YXIg Y2EgPSBjb3JuZXIoYSwgMSksCiAgICAgICAgY2IgPSBjb3JuZXIoYiwgMSk7CiAgICByZXR1cm4g Y2EgIT09IGNiID8gY2EgLSBjYgogICAgICAgIDogY2EgPT09IDAgPyBiWzFdIC0gYVsxXQogICAg ICAgIDogY2EgPT09IDEgPyBhWzBdIC0gYlswXQogICAgICAgIDogY2EgPT09IDIgPyBhWzFdIC0g YlsxXQogICAgICAgIDogYlswXSAtIGFbMF07CiAgfQoKICByZXR1cm4gZnVuY3Rpb24oc3RyZWFt KSB7CiAgICB2YXIgYWN0aXZlU3RyZWFtID0gc3RyZWFtLAogICAgICAgIGJ1ZmZlclN0cmVhbSA9 IGNsaXBCdWZmZXIoKSwKICAgICAgICBzZWdtZW50cywKICAgICAgICBwb2x5Z29uLAogICAgICAg IHJpbmcsCiAgICAgICAgeF9fLCB5X18sIHZfXywgLy8gZmlyc3QgcG9pbnQKICAgICAgICB4Xywg eV8sIHZfLCAvLyBwcmV2aW91cyBwb2ludAogICAgICAgIGZpcnN0LAogICAgICAgIGNsZWFuOwoK ICAgIHZhciBjbGlwU3RyZWFtID0gewogICAgICBwb2ludDogcG9pbnQsCiAgICAgIGxpbmVTdGFy dDogbGluZVN0YXJ0LAogICAgICBsaW5lRW5kOiBsaW5lRW5kLAogICAgICBwb2x5Z29uU3RhcnQ6 IHBvbHlnb25TdGFydCwKICAgICAgcG9seWdvbkVuZDogcG9seWdvbkVuZAogICAgfTsKCiAgICBm dW5jdGlvbiBwb2ludCh4LCB5KSB7CiAgICAgIGlmICh2aXNpYmxlKHgsIHkpKSBhY3RpdmVTdHJl YW0ucG9pbnQoeCwgeSk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9seWdvbkluc2lkZSgpIHsKICAg ICAgdmFyIHdpbmRpbmcgPSAwOwoKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBwb2x5Z29uLmxl bmd0aDsgaSA8IG47ICsraSkgewogICAgICAgIGZvciAodmFyIHJpbmcgPSBwb2x5Z29uW2ldLCBq ID0gMSwgbSA9IHJpbmcubGVuZ3RoLCBwb2ludCA9IHJpbmdbMF0sIGEwLCBhMSwgYjAgPSBwb2lu dFswXSwgYjEgPSBwb2ludFsxXTsgaiA8IG07ICsraikgewogICAgICAgICAgYTAgPSBiMCwgYTEg PSBiMSwgcG9pbnQgPSByaW5nW2pdLCBiMCA9IHBvaW50WzBdLCBiMSA9IHBvaW50WzFdOwogICAg ICAgICAgaWYgKGExIDw9IHkxKSB7IGlmIChiMSA+IHkxICYmIChiMCAtIGEwKSAqICh5MSAtIGEx KSA+IChiMSAtIGExKSAqICh4MCAtIGEwKSkgKyt3aW5kaW5nOyB9CiAgICAgICAgICBlbHNlIHsg aWYgKGIxIDw9IHkxICYmIChiMCAtIGEwKSAqICh5MSAtIGExKSA8IChiMSAtIGExKSAqICh4MCAt IGEwKSkgLS13aW5kaW5nOyB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gd2luZGlu ZzsKICAgIH0KCiAgICAvLyBCdWZmZXIgZ2VvbWV0cnkgd2l0aGluIGEgcG9seWdvbiBhbmQgdGhl biBjbGlwIGl0IGVuIG1hc3NlLgogICAgZnVuY3Rpb24gcG9seWdvblN0YXJ0KCkgewogICAgICBh Y3RpdmVTdHJlYW0gPSBidWZmZXJTdHJlYW0sIHNlZ21lbnRzID0gW10sIHBvbHlnb24gPSBbXSwg Y2xlYW4gPSB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvbHlnb25FbmQoKSB7CiAgICAgIHZh ciBzdGFydEluc2lkZSA9IHBvbHlnb25JbnNpZGUoKSwKICAgICAgICAgIGNsZWFuSW5zaWRlID0g Y2xlYW4gJiYgc3RhcnRJbnNpZGUsCiAgICAgICAgICB2aXNpYmxlID0gKHNlZ21lbnRzID0gbWVy Z2Uoc2VnbWVudHMpKS5sZW5ndGg7CiAgICAgIGlmIChjbGVhbkluc2lkZSB8fCB2aXNpYmxlKSB7 CiAgICAgICAgc3RyZWFtLnBvbHlnb25TdGFydCgpOwogICAgICAgIGlmIChjbGVhbkluc2lkZSkg ewogICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgaW50ZXJwb2xhdGUobnVs bCwgbnVsbCwgMSwgc3RyZWFtKTsKICAgICAgICAgIHN0cmVhbS5saW5lRW5kKCk7CiAgICAgICAg fQogICAgICAgIGlmICh2aXNpYmxlKSB7CiAgICAgICAgICBjbGlwUmVqb2luKHNlZ21lbnRzLCBj b21wYXJlSW50ZXJzZWN0aW9uLCBzdGFydEluc2lkZSwgaW50ZXJwb2xhdGUsIHN0cmVhbSk7CiAg ICAgICAgfQogICAgICAgIHN0cmVhbS5wb2x5Z29uRW5kKCk7CiAgICAgIH0KICAgICAgYWN0aXZl U3RyZWFtID0gc3RyZWFtLCBzZWdtZW50cyA9IHBvbHlnb24gPSByaW5nID0gbnVsbDsKICAgIH0K CiAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7CiAgICAgIGNsaXBTdHJlYW0ucG9pbnQgPSBsaW5l UG9pbnQ7CiAgICAgIGlmIChwb2x5Z29uKSBwb2x5Z29uLnB1c2gocmluZyA9IFtdKTsKICAgICAg Zmlyc3QgPSB0cnVlOwogICAgICB2XyA9IGZhbHNlOwogICAgICB4XyA9IHlfID0gTmFOOwogICAg fQoKICAgIC8vIFRPRE8gcmF0aGVyIHRoYW4gc3BlY2lhbC1jYXNlIHBvbHlnb25zLCBzaW1wbHkg aGFuZGxlIHRoZW0gc2VwYXJhdGVseS4KICAgIC8vIElkZWFsbHksIGNvaW5jaWRlbnQgaW50ZXJz ZWN0aW9uIHBvaW50cyBzaG91bGQgYmUgaml0dGVyZWQgdG8gYXZvaWQKICAgIC8vIGNsaXBwaW5n IGlzc3Vlcy4KICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7CiAgICAgIGlmIChzZWdtZW50cykgewog ICAgICAgIGxpbmVQb2ludCh4X18sIHlfXyk7CiAgICAgICAgaWYgKHZfXyAmJiB2XykgYnVmZmVy U3RyZWFtLnJlam9pbigpOwogICAgICAgIHNlZ21lbnRzLnB1c2goYnVmZmVyU3RyZWFtLnJlc3Vs dCgpKTsKICAgICAgfQogICAgICBjbGlwU3RyZWFtLnBvaW50ID0gcG9pbnQ7CiAgICAgIGlmICh2 XykgYWN0aXZlU3RyZWFtLmxpbmVFbmQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5lUG9pbnQo eCwgeSkgewogICAgICB2YXIgdiA9IHZpc2libGUoeCwgeSk7CiAgICAgIGlmIChwb2x5Z29uKSBy aW5nLnB1c2goW3gsIHldKTsKICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgeF9fID0geCwgeV9f ID0geSwgdl9fID0gdjsKICAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgICAgIGlmICh2KSB7CiAg ICAgICAgICBhY3RpdmVTdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICBhY3RpdmVTdHJlYW0u cG9pbnQoeCwgeSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmICh2ICYmIHZf KSBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIg YSA9IFt4XyA9IE1hdGgubWF4KGNsaXBNaW4sIE1hdGgubWluKGNsaXBNYXgsIHhfKSksIHlfID0g TWF0aC5tYXgoY2xpcE1pbiwgTWF0aC5taW4oY2xpcE1heCwgeV8pKV0sCiAgICAgICAgICAgICAg YiA9IFt4ID0gTWF0aC5tYXgoY2xpcE1pbiwgTWF0aC5taW4oY2xpcE1heCwgeCkpLCB5ID0gTWF0 aC5tYXgoY2xpcE1pbiwgTWF0aC5taW4oY2xpcE1heCwgeSkpXTsKICAgICAgICAgIGlmIChjbGlw TGluZShhLCBiLCB4MCwgeTAsIHgxLCB5MSkpIHsKICAgICAgICAgICAgaWYgKCF2XykgewogICAg ICAgICAgICAgIGFjdGl2ZVN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICAgICAgICBhY3RpdmVT dHJlYW0ucG9pbnQoYVswXSwgYVsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWN0aXZl U3RyZWFtLnBvaW50KGJbMF0sIGJbMV0pOwogICAgICAgICAgICBpZiAoIXYpIGFjdGl2ZVN0cmVh bS5saW5lRW5kKCk7CiAgICAgICAgICAgIGNsZWFuID0gZmFsc2U7CiAgICAgICAgICB9IGVsc2Ug aWYgKHYpIHsKICAgICAgICAgICAgYWN0aXZlU3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAg ICBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7CiAgICAgICAgICAgIGNsZWFuID0gZmFsc2U7CiAg ICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHhfID0geCwgeV8gPSB5LCB2XyA9IHY7 CiAgICB9CgogICAgcmV0dXJuIGNsaXBTdHJlYW07CiAgfTsKfQoKZnVuY3Rpb24gZXh0ZW50JDEo KSB7CiAgdmFyIHgwID0gMCwKICAgICAgeTAgPSAwLAogICAgICB4MSA9IDk2MCwKICAgICAgeTEg PSA1MDAsCiAgICAgIGNhY2hlLAogICAgICBjYWNoZVN0cmVhbSwKICAgICAgY2xpcDsKCiAgcmV0 dXJuIGNsaXAgPSB7CiAgICBzdHJlYW06IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICByZXR1cm4g Y2FjaGUgJiYgY2FjaGVTdHJlYW0gPT09IHN0cmVhbSA/IGNhY2hlIDogY2FjaGUgPSBjbGlwUmVj dGFuZ2xlKHgwLCB5MCwgeDEsIHkxKShjYWNoZVN0cmVhbSA9IHN0cmVhbSk7CiAgICB9LAogICAg ZXh0ZW50OiBmdW5jdGlvbihfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgw ID0gK19bMF1bMF0sIHkwID0gK19bMF1bMV0sIHgxID0gK19bMV1bMF0sIHkxID0gK19bMV1bMV0s IGNhY2hlID0gY2FjaGVTdHJlYW0gPSBudWxsLCBjbGlwKSA6IFtbeDAsIHkwXSwgW3gxLCB5MV1d OwogICAgfQogIH07Cn0KCnZhciBsZW5ndGhTdW0gPSBhZGRlcigpLAogICAgbGFtYmRhMCQyLAog ICAgc2luUGhpMCQxLAogICAgY29zUGhpMCQxOwoKdmFyIGxlbmd0aFN0cmVhbSA9IHsKICBzcGhl cmU6IG5vb3AkMiwKICBwb2ludDogbm9vcCQyLAogIGxpbmVTdGFydDogbGVuZ3RoTGluZVN0YXJ0 LAogIGxpbmVFbmQ6IG5vb3AkMiwKICBwb2x5Z29uU3RhcnQ6IG5vb3AkMiwKICBwb2x5Z29uRW5k OiBub29wJDIKfTsKCmZ1bmN0aW9uIGxlbmd0aExpbmVTdGFydCgpIHsKICBsZW5ndGhTdHJlYW0u cG9pbnQgPSBsZW5ndGhQb2ludEZpcnN0OwogIGxlbmd0aFN0cmVhbS5saW5lRW5kID0gbGVuZ3Ro TGluZUVuZDsKfQoKZnVuY3Rpb24gbGVuZ3RoTGluZUVuZCgpIHsKICBsZW5ndGhTdHJlYW0ucG9p bnQgPSBsZW5ndGhTdHJlYW0ubGluZUVuZCA9IG5vb3AkMjsKfQoKZnVuY3Rpb24gbGVuZ3RoUG9p bnRGaXJzdChsYW1iZGEsIHBoaSkgewogIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFu czsKICBsYW1iZGEwJDIgPSBsYW1iZGEsIHNpblBoaTAkMSA9IHNpbiQxKHBoaSksIGNvc1BoaTAk MSA9IGNvcyQxKHBoaSk7CiAgbGVuZ3RoU3RyZWFtLnBvaW50ID0gbGVuZ3RoUG9pbnQ7Cn0KCmZ1 bmN0aW9uIGxlbmd0aFBvaW50KGxhbWJkYSwgcGhpKSB7CiAgbGFtYmRhICo9IHJhZGlhbnMsIHBo aSAqPSByYWRpYW5zOwogIHZhciBzaW5QaGkgPSBzaW4kMShwaGkpLAogICAgICBjb3NQaGkgPSBj b3MkMShwaGkpLAogICAgICBkZWx0YSA9IGFicyhsYW1iZGEgLSBsYW1iZGEwJDIpLAogICAgICBj b3NEZWx0YSA9IGNvcyQxKGRlbHRhKSwKICAgICAgc2luRGVsdGEgPSBzaW4kMShkZWx0YSksCiAg ICAgIHggPSBjb3NQaGkgKiBzaW5EZWx0YSwKICAgICAgeSA9IGNvc1BoaTAkMSAqIHNpblBoaSAt IHNpblBoaTAkMSAqIGNvc1BoaSAqIGNvc0RlbHRhLAogICAgICB6ID0gc2luUGhpMCQxICogc2lu UGhpICsgY29zUGhpMCQxICogY29zUGhpICogY29zRGVsdGE7CiAgbGVuZ3RoU3VtLmFkZChhdGFu MihzcXJ0KHggKiB4ICsgeSAqIHkpLCB6KSk7CiAgbGFtYmRhMCQyID0gbGFtYmRhLCBzaW5QaGkw JDEgPSBzaW5QaGksIGNvc1BoaTAkMSA9IGNvc1BoaTsKfQoKZnVuY3Rpb24gbGVuZ3RoJDEob2Jq ZWN0KSB7CiAgbGVuZ3RoU3VtLnJlc2V0KCk7CiAgZ2VvU3RyZWFtKG9iamVjdCwgbGVuZ3RoU3Ry ZWFtKTsKICByZXR1cm4gK2xlbmd0aFN1bTsKfQoKdmFyIGNvb3JkaW5hdGVzID0gW251bGwsIG51 bGxdLAogICAgb2JqZWN0JDEgPSB7dHlwZTogIkxpbmVTdHJpbmciLCBjb29yZGluYXRlczogY29v cmRpbmF0ZXN9OwoKZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikgewogIGNvb3JkaW5hdGVzWzBdID0g YTsKICBjb29yZGluYXRlc1sxXSA9IGI7CiAgcmV0dXJuIGxlbmd0aCQxKG9iamVjdCQxKTsKfQoK dmFyIGNvbnRhaW5zT2JqZWN0VHlwZSA9IHsKICBGZWF0dXJlOiBmdW5jdGlvbihvYmplY3QsIHBv aW50KSB7CiAgICByZXR1cm4gY29udGFpbnNHZW9tZXRyeShvYmplY3QuZ2VvbWV0cnksIHBvaW50 KTsKICB9LAogIEZlYXR1cmVDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7CiAg ICB2YXIgZmVhdHVyZXMgPSBvYmplY3QuZmVhdHVyZXMsIGkgPSAtMSwgbiA9IGZlYXR1cmVzLmxl bmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoY29udGFpbnNHZW9tZXRyeShmZWF0dXJlc1tp XS5nZW9tZXRyeSwgcG9pbnQpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9Cn07 Cgp2YXIgY29udGFpbnNHZW9tZXRyeVR5cGUgPSB7CiAgU3BoZXJlOiBmdW5jdGlvbigpIHsKICAg IHJldHVybiB0cnVlOwogIH0sCiAgUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgcG9pbnQpIHsKICAg IHJldHVybiBjb250YWluc1BvaW50KG9iamVjdC5jb29yZGluYXRlcywgcG9pbnQpOwogIH0sCiAg TXVsdGlQb2ludDogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkgewogICAgdmFyIGNvb3JkaW5hdGVz ID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAg ICB3aGlsZSAoKytpIDwgbikgaWYgKGNvbnRhaW5zUG9pbnQoY29vcmRpbmF0ZXNbaV0sIHBvaW50 KSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfSwKICBMaW5lU3RyaW5nOiBmdW5j dGlvbihvYmplY3QsIHBvaW50KSB7CiAgICByZXR1cm4gY29udGFpbnNMaW5lKG9iamVjdC5jb29y ZGluYXRlcywgcG9pbnQpOwogIH0sCiAgTXVsdGlMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3Qs IHBvaW50KSB7CiAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAt MSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoY29udGFp bnNMaW5lKGNvb3JkaW5hdGVzW2ldLCBwb2ludCkpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZh bHNlOwogIH0sCiAgUG9seWdvbjogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkgewogICAgcmV0dXJu IGNvbnRhaW5zUG9seWdvbihvYmplY3QuY29vcmRpbmF0ZXMsIHBvaW50KTsKICB9LAogIE11bHRp UG9seWdvbjogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkgewogICAgdmFyIGNvb3JkaW5hdGVzID0g b2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAgICB3 aGlsZSAoKytpIDwgbikgaWYgKGNvbnRhaW5zUG9seWdvbihjb29yZGluYXRlc1tpXSwgcG9pbnQp KSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9LAogIEdlb21ldHJ5Q29sbGVjdGlv bjogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkgewogICAgdmFyIGdlb21ldHJpZXMgPSBvYmplY3Qu Z2VvbWV0cmllcywgaSA9IC0xLCBuID0gZ2VvbWV0cmllcy5sZW5ndGg7CiAgICB3aGlsZSAoKytp IDwgbikgaWYgKGNvbnRhaW5zR2VvbWV0cnkoZ2VvbWV0cmllc1tpXSwgcG9pbnQpKSByZXR1cm4g dHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9Cn07CgpmdW5jdGlvbiBjb250YWluc0dlb21ldHJ5 KGdlb21ldHJ5LCBwb2ludCkgewogIHJldHVybiBnZW9tZXRyeSAmJiBjb250YWluc0dlb21ldHJ5 VHlwZS5oYXNPd25Qcm9wZXJ0eShnZW9tZXRyeS50eXBlKQogICAgICA/IGNvbnRhaW5zR2VvbWV0 cnlUeXBlW2dlb21ldHJ5LnR5cGVdKGdlb21ldHJ5LCBwb2ludCkKICAgICAgOiBmYWxzZTsKfQoK ZnVuY3Rpb24gY29udGFpbnNQb2ludChjb29yZGluYXRlcywgcG9pbnQpIHsKICByZXR1cm4gZGlz dGFuY2UoY29vcmRpbmF0ZXMsIHBvaW50KSA9PT0gMDsKfQoKZnVuY3Rpb24gY29udGFpbnNMaW5l KGNvb3JkaW5hdGVzLCBwb2ludCkgewogIHZhciBhbywgYm8sIGFiOwogIGZvciAodmFyIGkgPSAw LCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CiAgICBibyA9IGRpc3RhbmNl KGNvb3JkaW5hdGVzW2ldLCBwb2ludCk7CiAgICBpZiAoYm8gPT09IDApIHJldHVybiB0cnVlOwog ICAgaWYgKGkgPiAwKSB7CiAgICAgIGFiID0gZGlzdGFuY2UoY29vcmRpbmF0ZXNbaV0sIGNvb3Jk aW5hdGVzW2kgLSAxXSk7CiAgICAgIGlmICgKICAgICAgICBhYiA+IDAgJiYKICAgICAgICBhbyA8 PSBhYiAmJgogICAgICAgIGJvIDw9IGFiICYmCiAgICAgICAgKGFvICsgYm8gLSBhYikgKiAoMSAt IE1hdGgucG93KChhbyAtIGJvKSAvIGFiLCAyKSkgPCBlcHNpbG9uMiQxICogYWIKICAgICAgKQog ICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgYW8gPSBibzsKICB9CiAgcmV0dXJuIGZhbHNl Owp9CgpmdW5jdGlvbiBjb250YWluc1BvbHlnb24oY29vcmRpbmF0ZXMsIHBvaW50KSB7CiAgcmV0 dXJuICEhcG9seWdvbkNvbnRhaW5zKGNvb3JkaW5hdGVzLm1hcChyaW5nUmFkaWFucyksIHBvaW50 UmFkaWFucyhwb2ludCkpOwp9CgpmdW5jdGlvbiByaW5nUmFkaWFucyhyaW5nKSB7CiAgcmV0dXJu IHJpbmcgPSByaW5nLm1hcChwb2ludFJhZGlhbnMpLCByaW5nLnBvcCgpLCByaW5nOwp9CgpmdW5j dGlvbiBwb2ludFJhZGlhbnMocG9pbnQpIHsKICByZXR1cm4gW3BvaW50WzBdICogcmFkaWFucywg cG9pbnRbMV0gKiByYWRpYW5zXTsKfQoKZnVuY3Rpb24gY29udGFpbnMkMShvYmplY3QsIHBvaW50 KSB7CiAgcmV0dXJuIChvYmplY3QgJiYgY29udGFpbnNPYmplY3RUeXBlLmhhc093blByb3BlcnR5 KG9iamVjdC50eXBlKQogICAgICA/IGNvbnRhaW5zT2JqZWN0VHlwZVtvYmplY3QudHlwZV0KICAg ICAgOiBjb250YWluc0dlb21ldHJ5KShvYmplY3QsIHBvaW50KTsKfQoKZnVuY3Rpb24gZ3JhdGlj dWxlWCh5MCwgeTEsIGR5KSB7CiAgdmFyIHkgPSBzZXF1ZW5jZSh5MCwgeTEgLSBlcHNpbG9uJDIs IGR5KS5jb25jYXQoeTEpOwogIHJldHVybiBmdW5jdGlvbih4KSB7IHJldHVybiB5Lm1hcChmdW5j dGlvbih5KSB7IHJldHVybiBbeCwgeV07IH0pOyB9Owp9CgpmdW5jdGlvbiBncmF0aWN1bGVZKHgw LCB4MSwgZHgpIHsKICB2YXIgeCA9IHNlcXVlbmNlKHgwLCB4MSAtIGVwc2lsb24kMiwgZHgpLmNv bmNhdCh4MSk7CiAgcmV0dXJuIGZ1bmN0aW9uKHkpIHsgcmV0dXJuIHgubWFwKGZ1bmN0aW9uKHgp IHsgcmV0dXJuIFt4LCB5XTsgfSk7IH07Cn0KCmZ1bmN0aW9uIGdyYXRpY3VsZSgpIHsKICB2YXIg eDEsIHgwLCBYMSwgWDAsCiAgICAgIHkxLCB5MCwgWTEsIFkwLAogICAgICBkeCA9IDEwLCBkeSA9 IGR4LCBEWCA9IDkwLCBEWSA9IDM2MCwKICAgICAgeCwgeSwgWCwgWSwKICAgICAgcHJlY2lzaW9u ID0gMi41OwoKICBmdW5jdGlvbiBncmF0aWN1bGUoKSB7CiAgICByZXR1cm4ge3R5cGU6ICJNdWx0 aUxpbmVTdHJpbmciLCBjb29yZGluYXRlczogbGluZXMoKX07CiAgfQoKICBmdW5jdGlvbiBsaW5l cygpIHsKICAgIHJldHVybiBzZXF1ZW5jZShjZWlsKFgwIC8gRFgpICogRFgsIFgxLCBEWCkubWFw KFgpCiAgICAgICAgLmNvbmNhdChzZXF1ZW5jZShjZWlsKFkwIC8gRFkpICogRFksIFkxLCBEWSku bWFwKFkpKQogICAgICAgIC5jb25jYXQoc2VxdWVuY2UoY2VpbCh4MCAvIGR4KSAqIGR4LCB4MSwg ZHgpLmZpbHRlcihmdW5jdGlvbih4KSB7IHJldHVybiBhYnMoeCAlIERYKSA+IGVwc2lsb24kMjsg fSkubWFwKHgpKQogICAgICAgIC5jb25jYXQoc2VxdWVuY2UoY2VpbCh5MCAvIGR5KSAqIGR5LCB5 MSwgZHkpLmZpbHRlcihmdW5jdGlvbih5KSB7IHJldHVybiBhYnMoeSAlIERZKSA+IGVwc2lsb24k MjsgfSkubWFwKHkpKTsKICB9CgogIGdyYXRpY3VsZS5saW5lcyA9IGZ1bmN0aW9uKCkgewogICAg cmV0dXJuIGxpbmVzKCkubWFwKGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7IHJldHVybiB7dHlwZTog IkxpbmVTdHJpbmciLCBjb29yZGluYXRlczogY29vcmRpbmF0ZXN9OyB9KTsKICB9OwoKICBncmF0 aWN1bGUub3V0bGluZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHsKICAgICAgdHlwZTogIlBv bHlnb24iLAogICAgICBjb29yZGluYXRlczogWwogICAgICAgIFgoWDApLmNvbmNhdCgKICAgICAg ICBZKFkxKS5zbGljZSgxKSwKICAgICAgICBYKFgxKS5yZXZlcnNlKCkuc2xpY2UoMSksCiAgICAg ICAgWShZMCkucmV2ZXJzZSgpLnNsaWNlKDEpKQogICAgICBdCiAgICB9OwogIH07CgogIGdyYXRp Y3VsZS5leHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJl dHVybiBncmF0aWN1bGUuZXh0ZW50TWlub3IoKTsKICAgIHJldHVybiBncmF0aWN1bGUuZXh0ZW50 TWFqb3IoXykuZXh0ZW50TWlub3IoXyk7CiAgfTsKCiAgZ3JhdGljdWxlLmV4dGVudE1ham9yID0g ZnVuY3Rpb24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW1tYMCwgWTBd LCBbWDEsIFkxXV07CiAgICBYMCA9ICtfWzBdWzBdLCBYMSA9ICtfWzFdWzBdOwogICAgWTAgPSAr X1swXVsxXSwgWTEgPSArX1sxXVsxXTsKICAgIGlmIChYMCA+IFgxKSBfID0gWDAsIFgwID0gWDEs IFgxID0gXzsKICAgIGlmIChZMCA+IFkxKSBfID0gWTAsIFkwID0gWTEsIFkxID0gXzsKICAgIHJl dHVybiBncmF0aWN1bGUucHJlY2lzaW9uKHByZWNpc2lvbik7CiAgfTsKCiAgZ3JhdGljdWxlLmV4 dGVudE1pbm9yID0gZnVuY3Rpb24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1 cm4gW1t4MCwgeTBdLCBbeDEsIHkxXV07CiAgICB4MCA9ICtfWzBdWzBdLCB4MSA9ICtfWzFdWzBd OwogICAgeTAgPSArX1swXVsxXSwgeTEgPSArX1sxXVsxXTsKICAgIGlmICh4MCA+IHgxKSBfID0g eDAsIHgwID0geDEsIHgxID0gXzsKICAgIGlmICh5MCA+IHkxKSBfID0geTAsIHkwID0geTEsIHkx ID0gXzsKICAgIHJldHVybiBncmF0aWN1bGUucHJlY2lzaW9uKHByZWNpc2lvbik7CiAgfTsKCiAg Z3JhdGljdWxlLnN0ZXAgPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgp IHJldHVybiBncmF0aWN1bGUuc3RlcE1pbm9yKCk7CiAgICByZXR1cm4gZ3JhdGljdWxlLnN0ZXBN YWpvcihfKS5zdGVwTWlub3IoXyk7CiAgfTsKCiAgZ3JhdGljdWxlLnN0ZXBNYWpvciA9IGZ1bmN0 aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFtEWCwgRFldOwogICAg RFggPSArX1swXSwgRFkgPSArX1sxXTsKICAgIHJldHVybiBncmF0aWN1bGU7CiAgfTsKCiAgZ3Jh dGljdWxlLnN0ZXBNaW5vciA9IGZ1bmN0aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRzLmxlbmd0 aCkgcmV0dXJuIFtkeCwgZHldOwogICAgZHggPSArX1swXSwgZHkgPSArX1sxXTsKICAgIHJldHVy biBncmF0aWN1bGU7CiAgfTsKCiAgZ3JhdGljdWxlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHsK ICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByZWNpc2lvbjsKICAgIHByZWNpc2lv biA9ICtfOwogICAgeCA9IGdyYXRpY3VsZVgoeTAsIHkxLCA5MCk7CiAgICB5ID0gZ3JhdGljdWxl WSh4MCwgeDEsIHByZWNpc2lvbik7CiAgICBYID0gZ3JhdGljdWxlWChZMCwgWTEsIDkwKTsKICAg IFkgPSBncmF0aWN1bGVZKFgwLCBYMSwgcHJlY2lzaW9uKTsKICAgIHJldHVybiBncmF0aWN1bGU7 CiAgfTsKCiAgcmV0dXJuIGdyYXRpY3VsZQogICAgICAuZXh0ZW50TWFqb3IoW1stMTgwLCAtOTAg KyBlcHNpbG9uJDJdLCBbMTgwLCA5MCAtIGVwc2lsb24kMl1dKQogICAgICAuZXh0ZW50TWlub3Io W1stMTgwLCAtODAgLSBlcHNpbG9uJDJdLCBbMTgwLCA4MCArIGVwc2lsb24kMl1dKTsKfQoKZnVu Y3Rpb24gZ3JhdGljdWxlMTAoKSB7CiAgcmV0dXJuIGdyYXRpY3VsZSgpKCk7Cn0KCmZ1bmN0aW9u IGludGVycG9sYXRlJDEoYSwgYikgewogIHZhciB4MCA9IGFbMF0gKiByYWRpYW5zLAogICAgICB5 MCA9IGFbMV0gKiByYWRpYW5zLAogICAgICB4MSA9IGJbMF0gKiByYWRpYW5zLAogICAgICB5MSA9 IGJbMV0gKiByYWRpYW5zLAogICAgICBjeTAgPSBjb3MkMSh5MCksCiAgICAgIHN5MCA9IHNpbiQx KHkwKSwKICAgICAgY3kxID0gY29zJDEoeTEpLAogICAgICBzeTEgPSBzaW4kMSh5MSksCiAgICAg IGt4MCA9IGN5MCAqIGNvcyQxKHgwKSwKICAgICAga3kwID0gY3kwICogc2luJDEoeDApLAogICAg ICBreDEgPSBjeTEgKiBjb3MkMSh4MSksCiAgICAgIGt5MSA9IGN5MSAqIHNpbiQxKHgxKSwKICAg ICAgZCA9IDIgKiBhc2luKHNxcnQoaGF2ZXJzaW4oeTEgLSB5MCkgKyBjeTAgKiBjeTEgKiBoYXZl cnNpbih4MSAtIHgwKSkpLAogICAgICBrID0gc2luJDEoZCk7CgogIHZhciBpbnRlcnBvbGF0ZSA9 IGQgPyBmdW5jdGlvbih0KSB7CiAgICB2YXIgQiA9IHNpbiQxKHQgKj0gZCkgLyBrLAogICAgICAg IEEgPSBzaW4kMShkIC0gdCkgLyBrLAogICAgICAgIHggPSBBICoga3gwICsgQiAqIGt4MSwKICAg ICAgICB5ID0gQSAqIGt5MCArIEIgKiBreTEsCiAgICAgICAgeiA9IEEgKiBzeTAgKyBCICogc3kx OwogICAgcmV0dXJuIFsKICAgICAgYXRhbjIoeSwgeCkgKiBkZWdyZWVzJDEsCiAgICAgIGF0YW4y KHosIHNxcnQoeCAqIHggKyB5ICogeSkpICogZGVncmVlcyQxCiAgICBdOwogIH0gOiBmdW5jdGlv bigpIHsKICAgIHJldHVybiBbeDAgKiBkZWdyZWVzJDEsIHkwICogZGVncmVlcyQxXTsKICB9OwoK ICBpbnRlcnBvbGF0ZS5kaXN0YW5jZSA9IGQ7CgogIHJldHVybiBpbnRlcnBvbGF0ZTsKfQoKZnVu Y3Rpb24gaWRlbnRpdHkkNCh4KSB7CiAgcmV0dXJuIHg7Cn0KCnZhciBhcmVhU3VtJDEgPSBhZGRl cigpLAogICAgYXJlYVJpbmdTdW0kMSA9IGFkZGVyKCksCiAgICB4MDAsCiAgICB5MDAsCiAgICB4 MCQxLAogICAgeTAkMTsKCnZhciBhcmVhU3RyZWFtJDEgPSB7CiAgcG9pbnQ6IG5vb3AkMiwKICBs aW5lU3RhcnQ6IG5vb3AkMiwKICBsaW5lRW5kOiBub29wJDIsCiAgcG9seWdvblN0YXJ0OiBmdW5j dGlvbigpIHsKICAgIGFyZWFTdHJlYW0kMS5saW5lU3RhcnQgPSBhcmVhUmluZ1N0YXJ0JDE7CiAg ICBhcmVhU3RyZWFtJDEubGluZUVuZCA9IGFyZWFSaW5nRW5kJDE7CiAgfSwKICBwb2x5Z29uRW5k OiBmdW5jdGlvbigpIHsKICAgIGFyZWFTdHJlYW0kMS5saW5lU3RhcnQgPSBhcmVhU3RyZWFtJDEu bGluZUVuZCA9IGFyZWFTdHJlYW0kMS5wb2ludCA9IG5vb3AkMjsKICAgIGFyZWFTdW0kMS5hZGQo YWJzKGFyZWFSaW5nU3VtJDEpKTsKICAgIGFyZWFSaW5nU3VtJDEucmVzZXQoKTsKICB9LAogIHJl c3VsdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgYXJlYSA9IGFyZWFTdW0kMSAvIDI7CiAgICBhcmVh U3VtJDEucmVzZXQoKTsKICAgIHJldHVybiBhcmVhOwogIH0KfTsKCmZ1bmN0aW9uIGFyZWFSaW5n U3RhcnQkMSgpIHsKICBhcmVhU3RyZWFtJDEucG9pbnQgPSBhcmVhUG9pbnRGaXJzdCQxOwp9Cgpm dW5jdGlvbiBhcmVhUG9pbnRGaXJzdCQxKHgsIHkpIHsKICBhcmVhU3RyZWFtJDEucG9pbnQgPSBh cmVhUG9pbnQkMTsKICB4MDAgPSB4MCQxID0geCwgeTAwID0geTAkMSA9IHk7Cn0KCmZ1bmN0aW9u IGFyZWFQb2ludCQxKHgsIHkpIHsKICBhcmVhUmluZ1N1bSQxLmFkZCh5MCQxICogeCAtIHgwJDEg KiB5KTsKICB4MCQxID0geCwgeTAkMSA9IHk7Cn0KCmZ1bmN0aW9uIGFyZWFSaW5nRW5kJDEoKSB7 CiAgYXJlYVBvaW50JDEoeDAwLCB5MDApOwp9Cgp2YXIgeDAkMiA9IEluZmluaXR5LAogICAgeTAk MiA9IHgwJDIsCiAgICB4MSA9IC14MCQyLAogICAgeTEgPSB4MTsKCnZhciBib3VuZHNTdHJlYW0k MSA9IHsKICBwb2ludDogYm91bmRzUG9pbnQkMSwKICBsaW5lU3RhcnQ6IG5vb3AkMiwKICBsaW5l RW5kOiBub29wJDIsCiAgcG9seWdvblN0YXJ0OiBub29wJDIsCiAgcG9seWdvbkVuZDogbm9vcCQy LAogIHJlc3VsdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgYm91bmRzID0gW1t4MCQyLCB5MCQyXSwg W3gxLCB5MV1dOwogICAgeDEgPSB5MSA9IC0oeTAkMiA9IHgwJDIgPSBJbmZpbml0eSk7CiAgICBy ZXR1cm4gYm91bmRzOwogIH0KfTsKCmZ1bmN0aW9uIGJvdW5kc1BvaW50JDEoeCwgeSkgewogIGlm ICh4IDwgeDAkMikgeDAkMiA9IHg7CiAgaWYgKHggPiB4MSkgeDEgPSB4OwogIGlmICh5IDwgeTAk MikgeTAkMiA9IHk7CiAgaWYgKHkgPiB5MSkgeTEgPSB5Owp9CgovLyBUT0RPIEVuZm9yY2UgcG9z aXRpdmUgYXJlYSBmb3IgZXh0ZXJpb3IsIG5lZ2F0aXZlIGFyZWEgZm9yIGludGVyaW9yPwoKdmFy IFgwJDEgPSAwLAogICAgWTAkMSA9IDAsCiAgICBaMCQxID0gMCwKICAgIFgxJDEgPSAwLAogICAg WTEkMSA9IDAsCiAgICBaMSQxID0gMCwKICAgIFgyJDEgPSAwLAogICAgWTIkMSA9IDAsCiAgICBa MiQxID0gMCwKICAgIHgwMCQxLAogICAgeTAwJDEsCiAgICB4MCQzLAogICAgeTAkMzsKCnZhciBj ZW50cm9pZFN0cmVhbSQxID0gewogIHBvaW50OiBjZW50cm9pZFBvaW50JDEsCiAgbGluZVN0YXJ0 OiBjZW50cm9pZExpbmVTdGFydCQxLAogIGxpbmVFbmQ6IGNlbnRyb2lkTGluZUVuZCQxLAogIHBv bHlnb25TdGFydDogZnVuY3Rpb24oKSB7CiAgICBjZW50cm9pZFN0cmVhbSQxLmxpbmVTdGFydCA9 IGNlbnRyb2lkUmluZ1N0YXJ0JDE7CiAgICBjZW50cm9pZFN0cmVhbSQxLmxpbmVFbmQgPSBjZW50 cm9pZFJpbmdFbmQkMTsKICB9LAogIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgY2VudHJv aWRTdHJlYW0kMS5wb2ludCA9IGNlbnRyb2lkUG9pbnQkMTsKICAgIGNlbnRyb2lkU3RyZWFtJDEu bGluZVN0YXJ0ID0gY2VudHJvaWRMaW5lU3RhcnQkMTsKICAgIGNlbnRyb2lkU3RyZWFtJDEubGlu ZUVuZCA9IGNlbnRyb2lkTGluZUVuZCQxOwogIH0sCiAgcmVzdWx0OiBmdW5jdGlvbigpIHsKICAg IHZhciBjZW50cm9pZCA9IFoyJDEgPyBbWDIkMSAvIFoyJDEsIFkyJDEgLyBaMiQxXQogICAgICAg IDogWjEkMSA/IFtYMSQxIC8gWjEkMSwgWTEkMSAvIFoxJDFdCiAgICAgICAgOiBaMCQxID8gW1gw JDEgLyBaMCQxLCBZMCQxIC8gWjAkMV0KICAgICAgICA6IFtOYU4sIE5hTl07CiAgICBYMCQxID0g WTAkMSA9IFowJDEgPQogICAgWDEkMSA9IFkxJDEgPSBaMSQxID0KICAgIFgyJDEgPSBZMiQxID0g WjIkMSA9IDA7CiAgICByZXR1cm4gY2VudHJvaWQ7CiAgfQp9OwoKZnVuY3Rpb24gY2VudHJvaWRQ b2ludCQxKHgsIHkpIHsKICBYMCQxICs9IHg7CiAgWTAkMSArPSB5OwogICsrWjAkMTsKfQoKZnVu Y3Rpb24gY2VudHJvaWRMaW5lU3RhcnQkMSgpIHsKICBjZW50cm9pZFN0cmVhbSQxLnBvaW50ID0g Y2VudHJvaWRQb2ludEZpcnN0TGluZTsKfQoKZnVuY3Rpb24gY2VudHJvaWRQb2ludEZpcnN0TGlu ZSh4LCB5KSB7CiAgY2VudHJvaWRTdHJlYW0kMS5wb2ludCA9IGNlbnRyb2lkUG9pbnRMaW5lOwog IGNlbnRyb2lkUG9pbnQkMSh4MCQzID0geCwgeTAkMyA9IHkpOwp9CgpmdW5jdGlvbiBjZW50cm9p ZFBvaW50TGluZSh4LCB5KSB7CiAgdmFyIGR4ID0geCAtIHgwJDMsIGR5ID0geSAtIHkwJDMsIHog PSBzcXJ0KGR4ICogZHggKyBkeSAqIGR5KTsKICBYMSQxICs9IHogKiAoeDAkMyArIHgpIC8gMjsK ICBZMSQxICs9IHogKiAoeTAkMyArIHkpIC8gMjsKICBaMSQxICs9IHo7CiAgY2VudHJvaWRQb2lu dCQxKHgwJDMgPSB4LCB5MCQzID0geSk7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkTGluZUVuZCQxKCkg ewogIGNlbnRyb2lkU3RyZWFtJDEucG9pbnQgPSBjZW50cm9pZFBvaW50JDE7Cn0KCmZ1bmN0aW9u IGNlbnRyb2lkUmluZ1N0YXJ0JDEoKSB7CiAgY2VudHJvaWRTdHJlYW0kMS5wb2ludCA9IGNlbnRy b2lkUG9pbnRGaXJzdFJpbmc7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUmluZ0VuZCQxKCkgewogIGNl bnRyb2lkUG9pbnRSaW5nKHgwMCQxLCB5MDAkMSk7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUG9pbnRG aXJzdFJpbmcoeCwgeSkgewogIGNlbnRyb2lkU3RyZWFtJDEucG9pbnQgPSBjZW50cm9pZFBvaW50 UmluZzsKICBjZW50cm9pZFBvaW50JDEoeDAwJDEgPSB4MCQzID0geCwgeTAwJDEgPSB5MCQzID0g eSk7Cn0KCmZ1bmN0aW9uIGNlbnRyb2lkUG9pbnRSaW5nKHgsIHkpIHsKICB2YXIgZHggPSB4IC0g eDAkMywKICAgICAgZHkgPSB5IC0geTAkMywKICAgICAgeiA9IHNxcnQoZHggKiBkeCArIGR5ICog ZHkpOwoKICBYMSQxICs9IHogKiAoeDAkMyArIHgpIC8gMjsKICBZMSQxICs9IHogKiAoeTAkMyAr IHkpIC8gMjsKICBaMSQxICs9IHo7CgogIHogPSB5MCQzICogeCAtIHgwJDMgKiB5OwogIFgyJDEg Kz0geiAqICh4MCQzICsgeCk7CiAgWTIkMSArPSB6ICogKHkwJDMgKyB5KTsKICBaMiQxICs9IHog KiAzOwogIGNlbnRyb2lkUG9pbnQkMSh4MCQzID0geCwgeTAkMyA9IHkpOwp9CgpmdW5jdGlvbiBQ YXRoQ29udGV4dChjb250ZXh0KSB7CiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7Cn0KClBhdGhD b250ZXh0LnByb3RvdHlwZSA9IHsKICBfcmFkaXVzOiA0LjUsCiAgcG9pbnRSYWRpdXM6IGZ1bmN0 aW9uKF8pIHsKICAgIHJldHVybiB0aGlzLl9yYWRpdXMgPSBfLCB0aGlzOwogIH0sCiAgcG9seWdv blN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2xpbmUgPSAwOwogIH0sCiAgcG9seWdvbkVu ZDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gTmFOOwogIH0sCiAgbGluZVN0YXJ0OiBm dW5jdGlvbigpIHsKICAgIHRoaXMuX3BvaW50ID0gMDsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9u KCkgewogICAgaWYgKHRoaXMuX2xpbmUgPT09IDApIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7 CiAgICB0aGlzLl9wb2ludCA9IE5hTjsKICB9LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAg ICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMDogewogICAgICAgIHRoaXMuX2Nv bnRleHQubW92ZVRvKHgsIHkpOwogICAgICAgIHRoaXMuX3BvaW50ID0gMTsKICAgICAgICBicmVh azsKICAgICAgfQogICAgICBjYXNlIDE6IHsKICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh4 LCB5KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBkZWZhdWx0OiB7CiAgICAgICAgdGhp cy5fY29udGV4dC5tb3ZlVG8oeCArIHRoaXMuX3JhZGl1cywgeSk7CiAgICAgICAgdGhpcy5fY29u dGV4dC5hcmMoeCwgeSwgdGhpcy5fcmFkaXVzLCAwLCB0YXUkMyk7CiAgICAgICAgYnJlYWs7CiAg ICAgIH0KICAgIH0KICB9LAogIHJlc3VsdDogbm9vcCQyCn07Cgp2YXIgbGVuZ3RoU3VtJDEgPSBh ZGRlcigpLAogICAgbGVuZ3RoUmluZywKICAgIHgwMCQyLAogICAgeTAwJDIsCiAgICB4MCQ0LAog ICAgeTAkNDsKCnZhciBsZW5ndGhTdHJlYW0kMSA9IHsKICBwb2ludDogbm9vcCQyLAogIGxpbmVT dGFydDogZnVuY3Rpb24oKSB7CiAgICBsZW5ndGhTdHJlYW0kMS5wb2ludCA9IGxlbmd0aFBvaW50 Rmlyc3QkMTsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKGxlbmd0aFJpbmcp IGxlbmd0aFBvaW50JDEoeDAwJDIsIHkwMCQyKTsKICAgIGxlbmd0aFN0cmVhbSQxLnBvaW50ID0g bm9vcCQyOwogIH0sCiAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIGxlbmd0aFJpbmcg PSB0cnVlOwogIH0sCiAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICBsZW5ndGhSaW5nID0g bnVsbDsKICB9LAogIHJlc3VsdDogZnVuY3Rpb24oKSB7CiAgICB2YXIgbGVuZ3RoID0gK2xlbmd0 aFN1bSQxOwogICAgbGVuZ3RoU3VtJDEucmVzZXQoKTsKICAgIHJldHVybiBsZW5ndGg7CiAgfQp9 OwoKZnVuY3Rpb24gbGVuZ3RoUG9pbnRGaXJzdCQxKHgsIHkpIHsKICBsZW5ndGhTdHJlYW0kMS5w b2ludCA9IGxlbmd0aFBvaW50JDE7CiAgeDAwJDIgPSB4MCQ0ID0geCwgeTAwJDIgPSB5MCQ0ID0g eTsKfQoKZnVuY3Rpb24gbGVuZ3RoUG9pbnQkMSh4LCB5KSB7CiAgeDAkNCAtPSB4LCB5MCQ0IC09 IHk7CiAgbGVuZ3RoU3VtJDEuYWRkKHNxcnQoeDAkNCAqIHgwJDQgKyB5MCQ0ICogeTAkNCkpOwog IHgwJDQgPSB4LCB5MCQ0ID0geTsKfQoKZnVuY3Rpb24gUGF0aFN0cmluZygpIHsKICB0aGlzLl9z dHJpbmcgPSBbXTsKfQoKUGF0aFN0cmluZy5wcm90b3R5cGUgPSB7CiAgX3JhZGl1czogNC41LAog IF9jaXJjbGU6IGNpcmNsZSQxKDQuNSksCiAgcG9pbnRSYWRpdXM6IGZ1bmN0aW9uKF8pIHsKICAg IGlmICgoXyA9ICtfKSAhPT0gdGhpcy5fcmFkaXVzKSB0aGlzLl9yYWRpdXMgPSBfLCB0aGlzLl9j aXJjbGUgPSBudWxsOwogICAgcmV0dXJuIHRoaXM7CiAgfSwKICBwb2x5Z29uU3RhcnQ6IGZ1bmN0 aW9uKCkgewogICAgdGhpcy5fbGluZSA9IDA7CiAgfSwKICBwb2x5Z29uRW5kOiBmdW5jdGlvbigp IHsKICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgfSwKICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewog ICAgdGhpcy5fcG9pbnQgPSAwOwogIH0sCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICBpZiAo dGhpcy5fbGluZSA9PT0gMCkgdGhpcy5fc3RyaW5nLnB1c2goIloiKTsKICAgIHRoaXMuX3BvaW50 ID0gTmFOOwogIH0sCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHN3aXRjaCAodGhpcy5f cG9pbnQpIHsKICAgICAgY2FzZSAwOiB7CiAgICAgICAgdGhpcy5fc3RyaW5nLnB1c2goIk0iLCB4 LCAiLCIsIHkpOwogICAgICAgIHRoaXMuX3BvaW50ID0gMTsKICAgICAgICBicmVhazsKICAgICAg fQogICAgICBjYXNlIDE6IHsKICAgICAgICB0aGlzLl9zdHJpbmcucHVzaCgiTCIsIHgsICIsIiwg eSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGVmYXVsdDogewogICAgICAgIGlmICh0 aGlzLl9jaXJjbGUgPT0gbnVsbCkgdGhpcy5fY2lyY2xlID0gY2lyY2xlJDEodGhpcy5fcmFkaXVz KTsKICAgICAgICB0aGlzLl9zdHJpbmcucHVzaCgiTSIsIHgsICIsIiwgeSwgdGhpcy5fY2lyY2xl KTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogIH0sCiAgcmVzdWx0OiBmdW5jdGlvbigp IHsKICAgIGlmICh0aGlzLl9zdHJpbmcubGVuZ3RoKSB7CiAgICAgIHZhciByZXN1bHQgPSB0aGlz Ll9zdHJpbmcuam9pbigiIik7CiAgICAgIHRoaXMuX3N0cmluZyA9IFtdOwogICAgICByZXR1cm4g cmVzdWx0OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQp9OwoKZnVu Y3Rpb24gY2lyY2xlJDEocmFkaXVzKSB7CiAgcmV0dXJuICJtMCwiICsgcmFkaXVzCiAgICAgICsg ImEiICsgcmFkaXVzICsgIiwiICsgcmFkaXVzICsgIiAwIDEsMSAwLCIgKyAtMiAqIHJhZGl1cwog ICAgICArICJhIiArIHJhZGl1cyArICIsIiArIHJhZGl1cyArICIgMCAxLDEgMCwiICsgMiAqIHJh ZGl1cwogICAgICArICJ6IjsKfQoKZnVuY3Rpb24gaW5kZXgkMShwcm9qZWN0aW9uLCBjb250ZXh0 KSB7CiAgdmFyIHBvaW50UmFkaXVzID0gNC41LAogICAgICBwcm9qZWN0aW9uU3RyZWFtLAogICAg ICBjb250ZXh0U3RyZWFtOwoKICBmdW5jdGlvbiBwYXRoKG9iamVjdCkgewogICAgaWYgKG9iamVj dCkgewogICAgICBpZiAodHlwZW9mIHBvaW50UmFkaXVzID09PSAiZnVuY3Rpb24iKSBjb250ZXh0 U3RyZWFtLnBvaW50UmFkaXVzKCtwb2ludFJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsK ICAgICAgZ2VvU3RyZWFtKG9iamVjdCwgcHJvamVjdGlvblN0cmVhbShjb250ZXh0U3RyZWFtKSk7 CiAgICB9CiAgICByZXR1cm4gY29udGV4dFN0cmVhbS5yZXN1bHQoKTsKICB9CgogIHBhdGguYXJl YSA9IGZ1bmN0aW9uKG9iamVjdCkgewogICAgZ2VvU3RyZWFtKG9iamVjdCwgcHJvamVjdGlvblN0 cmVhbShhcmVhU3RyZWFtJDEpKTsKICAgIHJldHVybiBhcmVhU3RyZWFtJDEucmVzdWx0KCk7CiAg fTsKCiAgcGF0aC5tZWFzdXJlID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICBnZW9TdHJlYW0ob2Jq ZWN0LCBwcm9qZWN0aW9uU3RyZWFtKGxlbmd0aFN0cmVhbSQxKSk7CiAgICByZXR1cm4gbGVuZ3Ro U3RyZWFtJDEucmVzdWx0KCk7CiAgfTsKCiAgcGF0aC5ib3VuZHMgPSBmdW5jdGlvbihvYmplY3Qp IHsKICAgIGdlb1N0cmVhbShvYmplY3QsIHByb2plY3Rpb25TdHJlYW0oYm91bmRzU3RyZWFtJDEp KTsKICAgIHJldHVybiBib3VuZHNTdHJlYW0kMS5yZXN1bHQoKTsKICB9OwoKICBwYXRoLmNlbnRy b2lkID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICBnZW9TdHJlYW0ob2JqZWN0LCBwcm9qZWN0aW9u U3RyZWFtKGNlbnRyb2lkU3RyZWFtJDEpKTsKICAgIHJldHVybiBjZW50cm9pZFN0cmVhbSQxLnJl c3VsdCgpOwogIH07CgogIHBhdGgucHJvamVjdGlvbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVy biBhcmd1bWVudHMubGVuZ3RoID8gKHByb2plY3Rpb25TdHJlYW0gPSBfID09IG51bGwgPyAocHJv amVjdGlvbiA9IG51bGwsIGlkZW50aXR5JDQpIDogKHByb2plY3Rpb24gPSBfKS5zdHJlYW0sIHBh dGgpIDogcHJvamVjdGlvbjsKICB9OwoKICBwYXRoLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAg ICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjb250ZXh0OwogICAgY29udGV4dFN0cmVh bSA9IF8gPT0gbnVsbCA/IChjb250ZXh0ID0gbnVsbCwgbmV3IFBhdGhTdHJpbmcpIDogbmV3IFBh dGhDb250ZXh0KGNvbnRleHQgPSBfKTsKICAgIGlmICh0eXBlb2YgcG9pbnRSYWRpdXMgIT09ICJm dW5jdGlvbiIpIGNvbnRleHRTdHJlYW0ucG9pbnRSYWRpdXMocG9pbnRSYWRpdXMpOwogICAgcmV0 dXJuIHBhdGg7CiAgfTsKCiAgcGF0aC5wb2ludFJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgIGlm ICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBvaW50UmFkaXVzOwogICAgcG9pbnRSYWRpdXMg PSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiAoY29udGV4dFN0cmVhbS5wb2ludFJhZGl1 cygrXyksICtfKTsKICAgIHJldHVybiBwYXRoOwogIH07CgogIHJldHVybiBwYXRoLnByb2plY3Rp b24ocHJvamVjdGlvbikuY29udGV4dChjb250ZXh0KTsKfQoKZnVuY3Rpb24gdHJhbnNmb3JtKG1l dGhvZHMpIHsKICByZXR1cm4gewogICAgc3RyZWFtOiB0cmFuc2Zvcm1lcihtZXRob2RzKQogIH07 Cn0KCmZ1bmN0aW9uIHRyYW5zZm9ybWVyKG1ldGhvZHMpIHsKICByZXR1cm4gZnVuY3Rpb24oc3Ry ZWFtKSB7CiAgICB2YXIgcyA9IG5ldyBUcmFuc2Zvcm1TdHJlYW07CiAgICBmb3IgKHZhciBrZXkg aW4gbWV0aG9kcykgc1trZXldID0gbWV0aG9kc1trZXldOwogICAgcy5zdHJlYW0gPSBzdHJlYW07 CiAgICByZXR1cm4gczsKICB9Owp9CgpmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW0oKSB7fQoKVHJh bnNmb3JtU3RyZWFtLnByb3RvdHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtU3RyZWFt LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7IHRoaXMuc3RyZWFtLnBvaW50KHgsIHkpOyB9LAog IHNwaGVyZTogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLnNwaGVyZSgpOyB9LAogIGxpbmVTdGFy dDogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLmxpbmVTdGFydCgpOyB9LAogIGxpbmVFbmQ6IGZ1 bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5saW5lRW5kKCk7IH0sCiAgcG9seWdvblN0YXJ0OiBmdW5j dGlvbigpIHsgdGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCk7IH0sCiAgcG9seWdvbkVuZDogZnVu Y3Rpb24oKSB7IHRoaXMuc3RyZWFtLnBvbHlnb25FbmQoKTsgfQp9OwoKZnVuY3Rpb24gZml0KHBy b2plY3Rpb24sIGZpdEJvdW5kcywgb2JqZWN0KSB7CiAgdmFyIGNsaXAgPSBwcm9qZWN0aW9uLmNs aXBFeHRlbnQgJiYgcHJvamVjdGlvbi5jbGlwRXh0ZW50KCk7CiAgcHJvamVjdGlvbi5zY2FsZSgx NTApLnRyYW5zbGF0ZShbMCwgMF0pOwogIGlmIChjbGlwICE9IG51bGwpIHByb2plY3Rpb24uY2xp cEV4dGVudChudWxsKTsKICBnZW9TdHJlYW0ob2JqZWN0LCBwcm9qZWN0aW9uLnN0cmVhbShib3Vu ZHNTdHJlYW0kMSkpOwogIGZpdEJvdW5kcyhib3VuZHNTdHJlYW0kMS5yZXN1bHQoKSk7CiAgaWYg KGNsaXAgIT0gbnVsbCkgcHJvamVjdGlvbi5jbGlwRXh0ZW50KGNsaXApOwogIHJldHVybiBwcm9q ZWN0aW9uOwp9CgpmdW5jdGlvbiBmaXRFeHRlbnQocHJvamVjdGlvbiwgZXh0ZW50LCBvYmplY3Qp IHsKICByZXR1cm4gZml0KHByb2plY3Rpb24sIGZ1bmN0aW9uKGIpIHsKICAgIHZhciB3ID0gZXh0 ZW50WzFdWzBdIC0gZXh0ZW50WzBdWzBdLAogICAgICAgIGggPSBleHRlbnRbMV1bMV0gLSBleHRl bnRbMF1bMV0sCiAgICAgICAgayA9IE1hdGgubWluKHcgLyAoYlsxXVswXSAtIGJbMF1bMF0pLCBo IC8gKGJbMV1bMV0gLSBiWzBdWzFdKSksCiAgICAgICAgeCA9ICtleHRlbnRbMF1bMF0gKyAodyAt IGsgKiAoYlsxXVswXSArIGJbMF1bMF0pKSAvIDIsCiAgICAgICAgeSA9ICtleHRlbnRbMF1bMV0g KyAoaCAtIGsgKiAoYlsxXVsxXSArIGJbMF1bMV0pKSAvIDI7CiAgICBwcm9qZWN0aW9uLnNjYWxl KDE1MCAqIGspLnRyYW5zbGF0ZShbeCwgeV0pOwogIH0sIG9iamVjdCk7Cn0KCmZ1bmN0aW9uIGZp dFNpemUocHJvamVjdGlvbiwgc2l6ZSwgb2JqZWN0KSB7CiAgcmV0dXJuIGZpdEV4dGVudChwcm9q ZWN0aW9uLCBbWzAsIDBdLCBzaXplXSwgb2JqZWN0KTsKfQoKZnVuY3Rpb24gZml0V2lkdGgocHJv amVjdGlvbiwgd2lkdGgsIG9iamVjdCkgewogIHJldHVybiBmaXQocHJvamVjdGlvbiwgZnVuY3Rp b24oYikgewogICAgdmFyIHcgPSArd2lkdGgsCiAgICAgICAgayA9IHcgLyAoYlsxXVswXSAtIGJb MF1bMF0pLAogICAgICAgIHggPSAodyAtIGsgKiAoYlsxXVswXSArIGJbMF1bMF0pKSAvIDIsCiAg ICAgICAgeSA9IC1rICogYlswXVsxXTsKICAgIHByb2plY3Rpb24uc2NhbGUoMTUwICogaykudHJh bnNsYXRlKFt4LCB5XSk7CiAgfSwgb2JqZWN0KTsKfQoKZnVuY3Rpb24gZml0SGVpZ2h0KHByb2pl Y3Rpb24sIGhlaWdodCwgb2JqZWN0KSB7CiAgcmV0dXJuIGZpdChwcm9qZWN0aW9uLCBmdW5jdGlv bihiKSB7CiAgICB2YXIgaCA9ICtoZWlnaHQsCiAgICAgICAgayA9IGggLyAoYlsxXVsxXSAtIGJb MF1bMV0pLAogICAgICAgIHggPSAtayAqIGJbMF1bMF0sCiAgICAgICAgeSA9IChoIC0gayAqIChi WzFdWzFdICsgYlswXVsxXSkpIC8gMjsKICAgIHByb2plY3Rpb24uc2NhbGUoMTUwICogaykudHJh bnNsYXRlKFt4LCB5XSk7CiAgfSwgb2JqZWN0KTsKfQoKdmFyIG1heERlcHRoID0gMTYsIC8vIG1h eGltdW0gZGVwdGggb2Ygc3ViZGl2aXNpb24KICAgIGNvc01pbkRpc3RhbmNlID0gY29zJDEoMzAg KiByYWRpYW5zKTsgLy8gY29zKG1pbmltdW0gYW5ndWxhciBkaXN0YW5jZSkKCmZ1bmN0aW9uIHJl c2FtcGxlKHByb2plY3QsIGRlbHRhMikgewogIHJldHVybiArZGVsdGEyID8gcmVzYW1wbGUkMShw cm9qZWN0LCBkZWx0YTIpIDogcmVzYW1wbGVOb25lKHByb2plY3QpOwp9CgpmdW5jdGlvbiByZXNh bXBsZU5vbmUocHJvamVjdCkgewogIHJldHVybiB0cmFuc2Zvcm1lcih7CiAgICBwb2ludDogZnVu Y3Rpb24oeCwgeSkgewogICAgICB4ID0gcHJvamVjdCh4LCB5KTsKICAgICAgdGhpcy5zdHJlYW0u cG9pbnQoeFswXSwgeFsxXSk7CiAgICB9CiAgfSk7Cn0KCmZ1bmN0aW9uIHJlc2FtcGxlJDEocHJv amVjdCwgZGVsdGEyKSB7CgogIGZ1bmN0aW9uIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRh MCwgYTAsIGIwLCBjMCwgeDEsIHkxLCBsYW1iZGExLCBhMSwgYjEsIGMxLCBkZXB0aCwgc3RyZWFt KSB7CiAgICB2YXIgZHggPSB4MSAtIHgwLAogICAgICAgIGR5ID0geTEgLSB5MCwKICAgICAgICBk MiA9IGR4ICogZHggKyBkeSAqIGR5OwogICAgaWYgKGQyID4gNCAqIGRlbHRhMiAmJiBkZXB0aC0t KSB7CiAgICAgIHZhciBhID0gYTAgKyBhMSwKICAgICAgICAgIGIgPSBiMCArIGIxLAogICAgICAg ICAgYyA9IGMwICsgYzEsCiAgICAgICAgICBtID0gc3FydChhICogYSArIGIgKiBiICsgYyAqIGMp LAogICAgICAgICAgcGhpMiA9IGFzaW4oYyAvPSBtKSwKICAgICAgICAgIGxhbWJkYTIgPSBhYnMo YWJzKGMpIC0gMSkgPCBlcHNpbG9uJDIgfHwgYWJzKGxhbWJkYTAgLSBsYW1iZGExKSA8IGVwc2ls b24kMiA/IChsYW1iZGEwICsgbGFtYmRhMSkgLyAyIDogYXRhbjIoYiwgYSksCiAgICAgICAgICBw ID0gcHJvamVjdChsYW1iZGEyLCBwaGkyKSwKICAgICAgICAgIHgyID0gcFswXSwKICAgICAgICAg IHkyID0gcFsxXSwKICAgICAgICAgIGR4MiA9IHgyIC0geDAsCiAgICAgICAgICBkeTIgPSB5MiAt IHkwLAogICAgICAgICAgZHogPSBkeSAqIGR4MiAtIGR4ICogZHkyOwogICAgICBpZiAoZHogKiBk eiAvIGQyID4gZGVsdGEyIC8vIHBlcnBlbmRpY3VsYXIgcHJvamVjdGVkIGRpc3RhbmNlCiAgICAg ICAgICB8fCBhYnMoKGR4ICogZHgyICsgZHkgKiBkeTIpIC8gZDIgLSAwLjUpID4gMC4zIC8vIG1p ZHBvaW50IGNsb3NlIHRvIGFuIGVuZAogICAgICAgICAgfHwgYTAgKiBhMSArIGIwICogYjEgKyBj MCAqIGMxIDwgY29zTWluRGlzdGFuY2UpIHsgLy8gYW5ndWxhciBkaXN0YW5jZQogICAgICAgIHJl c2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRhMCwgYTAsIGIwLCBjMCwgeDIsIHkyLCBsYW1iZGEy LCBhIC89IG0sIGIgLz0gbSwgYywgZGVwdGgsIHN0cmVhbSk7CiAgICAgICAgc3RyZWFtLnBvaW50 KHgyLCB5Mik7CiAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDIsIHkyLCBsYW1iZGEyLCBhLCBiLCBj LCB4MSwgeTEsIGxhbWJkYTEsIGExLCBiMSwgYzEsIGRlcHRoLCBzdHJlYW0pOwogICAgICB9CiAg ICB9CiAgfQogIHJldHVybiBmdW5jdGlvbihzdHJlYW0pIHsKICAgIHZhciBsYW1iZGEwMCwgeDAw LCB5MDAsIGEwMCwgYjAwLCBjMDAsIC8vIGZpcnN0IHBvaW50CiAgICAgICAgbGFtYmRhMCwgeDAs IHkwLCBhMCwgYjAsIGMwOyAvLyBwcmV2aW91cyBwb2ludAoKICAgIHZhciByZXNhbXBsZVN0cmVh bSA9IHsKICAgICAgcG9pbnQ6IHBvaW50LAogICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCwKICAg ICAgbGluZUVuZDogbGluZUVuZCwKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsgc3Ry ZWFtLnBvbHlnb25TdGFydCgpOyByZXNhbXBsZVN0cmVhbS5saW5lU3RhcnQgPSByaW5nU3RhcnQ7 IH0sCiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgeyBzdHJlYW0ucG9seWdvbkVuZCgpOyBy ZXNhbXBsZVN0cmVhbS5saW5lU3RhcnQgPSBsaW5lU3RhcnQ7IH0KICAgIH07CgogICAgZnVuY3Rp b24gcG9pbnQoeCwgeSkgewogICAgICB4ID0gcHJvamVjdCh4LCB5KTsKICAgICAgc3RyZWFtLnBv aW50KHhbMF0sIHhbMV0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmVTdGFydCgpIHsKICAgICAg eDAgPSBOYU47CiAgICAgIHJlc2FtcGxlU3RyZWFtLnBvaW50ID0gbGluZVBvaW50OwogICAgICBz dHJlYW0ubGluZVN0YXJ0KCk7CiAgICB9CgogICAgZnVuY3Rpb24gbGluZVBvaW50KGxhbWJkYSwg cGhpKSB7CiAgICAgIHZhciBjID0gY2FydGVzaWFuKFtsYW1iZGEsIHBoaV0pLCBwID0gcHJvamVj dChsYW1iZGEsIHBoaSk7CiAgICAgIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRhMCwgYTAs IGIwLCBjMCwgeDAgPSBwWzBdLCB5MCA9IHBbMV0sIGxhbWJkYTAgPSBsYW1iZGEsIGEwID0gY1sw XSwgYjAgPSBjWzFdLCBjMCA9IGNbMl0sIG1heERlcHRoLCBzdHJlYW0pOwogICAgICBzdHJlYW0u cG9pbnQoeDAsIHkwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5lRW5kKCkgewogICAgICByZXNh bXBsZVN0cmVhbS5wb2ludCA9IHBvaW50OwogICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgfQoK ICAgIGZ1bmN0aW9uIHJpbmdTdGFydCgpIHsKICAgICAgbGluZVN0YXJ0KCk7CiAgICAgIHJlc2Ft cGxlU3RyZWFtLnBvaW50ID0gcmluZ1BvaW50OwogICAgICByZXNhbXBsZVN0cmVhbS5saW5lRW5k ID0gcmluZ0VuZDsKICAgIH0KCiAgICBmdW5jdGlvbiByaW5nUG9pbnQobGFtYmRhLCBwaGkpIHsK ICAgICAgbGluZVBvaW50KGxhbWJkYTAwID0gbGFtYmRhLCBwaGkpLCB4MDAgPSB4MCwgeTAwID0g eTAsIGEwMCA9IGEwLCBiMDAgPSBiMCwgYzAwID0gYzA7CiAgICAgIHJlc2FtcGxlU3RyZWFtLnBv aW50ID0gbGluZVBvaW50OwogICAgfQoKICAgIGZ1bmN0aW9uIHJpbmdFbmQoKSB7CiAgICAgIHJl c2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRhMCwgYTAsIGIwLCBjMCwgeDAwLCB5MDAsIGxhbWJk YTAwLCBhMDAsIGIwMCwgYzAwLCBtYXhEZXB0aCwgc3RyZWFtKTsKICAgICAgcmVzYW1wbGVTdHJl YW0ubGluZUVuZCA9IGxpbmVFbmQ7CiAgICAgIGxpbmVFbmQoKTsKICAgIH0KCiAgICByZXR1cm4g cmVzYW1wbGVTdHJlYW07CiAgfTsKfQoKdmFyIHRyYW5zZm9ybVJhZGlhbnMgPSB0cmFuc2Zvcm1l cih7CiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHRoaXMuc3RyZWFtLnBvaW50KHggKiBy YWRpYW5zLCB5ICogcmFkaWFucyk7CiAgfQp9KTsKCmZ1bmN0aW9uIHRyYW5zZm9ybVJvdGF0ZShy b3RhdGUpIHsKICByZXR1cm4gdHJhbnNmb3JtZXIoewogICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkp IHsKICAgICAgdmFyIHIgPSByb3RhdGUoeCwgeSk7CiAgICAgIHJldHVybiB0aGlzLnN0cmVhbS5w b2ludChyWzBdLCByWzFdKTsKICAgIH0KICB9KTsKfQoKZnVuY3Rpb24gc2NhbGVUcmFuc2xhdGUo aywgZHgsIGR5LCBzeCwgc3kpIHsKICBmdW5jdGlvbiB0cmFuc2Zvcm0oeCwgeSkgewogICAgeCAq PSBzeDsgeSAqPSBzeTsKICAgIHJldHVybiBbZHggKyBrICogeCwgZHkgLSBrICogeV07CiAgfQog IHRyYW5zZm9ybS5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICByZXR1cm4gWyh4IC0gZHgp IC8gayAqIHN4LCAoZHkgLSB5KSAvIGsgKiBzeV07CiAgfTsKICByZXR1cm4gdHJhbnNmb3JtOwp9 CgpmdW5jdGlvbiBzY2FsZVRyYW5zbGF0ZVJvdGF0ZShrLCBkeCwgZHksIHN4LCBzeSwgYWxwaGEp IHsKICB2YXIgY29zQWxwaGEgPSBjb3MkMShhbHBoYSksCiAgICAgIHNpbkFscGhhID0gc2luJDEo YWxwaGEpLAogICAgICBhID0gY29zQWxwaGEgKiBrLAogICAgICBiID0gc2luQWxwaGEgKiBrLAog ICAgICBhaSA9IGNvc0FscGhhIC8gaywKICAgICAgYmkgPSBzaW5BbHBoYSAvIGssCiAgICAgIGNp ID0gKHNpbkFscGhhICogZHkgLSBjb3NBbHBoYSAqIGR4KSAvIGssCiAgICAgIGZpID0gKHNpbkFs cGhhICogZHggKyBjb3NBbHBoYSAqIGR5KSAvIGs7CiAgZnVuY3Rpb24gdHJhbnNmb3JtKHgsIHkp IHsKICAgIHggKj0gc3g7IHkgKj0gc3k7CiAgICByZXR1cm4gW2EgKiB4IC0gYiAqIHkgKyBkeCwg ZHkgLSBiICogeCAtIGEgKiB5XTsKICB9CiAgdHJhbnNmb3JtLmludmVydCA9IGZ1bmN0aW9uKHgs IHkpIHsKICAgIHJldHVybiBbc3ggKiAoYWkgKiB4IC0gYmkgKiB5ICsgY2kpLCBzeSAqIChmaSAt IGJpICogeCAtIGFpICogeSldOwogIH07CiAgcmV0dXJuIHRyYW5zZm9ybTsKfQoKZnVuY3Rpb24g cHJvamVjdGlvbihwcm9qZWN0KSB7CiAgcmV0dXJuIHByb2plY3Rpb25NdXRhdG9yKGZ1bmN0aW9u KCkgeyByZXR1cm4gcHJvamVjdDsgfSkoKTsKfQoKZnVuY3Rpb24gcHJvamVjdGlvbk11dGF0b3Io cHJvamVjdEF0KSB7CiAgdmFyIHByb2plY3QsCiAgICAgIGsgPSAxNTAsIC8vIHNjYWxlCiAgICAg IHggPSA0ODAsIHkgPSAyNTAsIC8vIHRyYW5zbGF0ZQogICAgICBsYW1iZGEgPSAwLCBwaGkgPSAw LCAvLyBjZW50ZXIKICAgICAgZGVsdGFMYW1iZGEgPSAwLCBkZWx0YVBoaSA9IDAsIGRlbHRhR2Ft bWEgPSAwLCByb3RhdGUsIC8vIHByZS1yb3RhdGUKICAgICAgYWxwaGEgPSAwLCAvLyBwb3N0LXJv dGF0ZSBhbmdsZQogICAgICBzeCA9IDEsIC8vIHJlZmxlY3RYCiAgICAgIHN5ID0gMSwgLy8gcmVm bGVjdFgKICAgICAgdGhldGEgPSBudWxsLCBwcmVjbGlwID0gY2xpcEFudGltZXJpZGlhbiwgLy8g cHJlLWNsaXAgYW5nbGUKICAgICAgeDAgPSBudWxsLCB5MCwgeDEsIHkxLCBwb3N0Y2xpcCA9IGlk ZW50aXR5JDQsIC8vIHBvc3QtY2xpcCBleHRlbnQKICAgICAgZGVsdGEyID0gMC41LCAvLyBwcmVj aXNpb24KICAgICAgcHJvamVjdFJlc2FtcGxlLAogICAgICBwcm9qZWN0VHJhbnNmb3JtLAogICAg ICBwcm9qZWN0Um90YXRlVHJhbnNmb3JtLAogICAgICBjYWNoZSwKICAgICAgY2FjaGVTdHJlYW07 CgogIGZ1bmN0aW9uIHByb2plY3Rpb24ocG9pbnQpIHsKICAgIHJldHVybiBwcm9qZWN0Um90YXRl VHJhbnNmb3JtKHBvaW50WzBdICogcmFkaWFucywgcG9pbnRbMV0gKiByYWRpYW5zKTsKICB9Cgog IGZ1bmN0aW9uIGludmVydChwb2ludCkgewogICAgcG9pbnQgPSBwcm9qZWN0Um90YXRlVHJhbnNm b3JtLmludmVydChwb2ludFswXSwgcG9pbnRbMV0pOwogICAgcmV0dXJuIHBvaW50ICYmIFtwb2lu dFswXSAqIGRlZ3JlZXMkMSwgcG9pbnRbMV0gKiBkZWdyZWVzJDFdOwogIH0KCiAgcHJvamVjdGlv bi5zdHJlYW0gPSBmdW5jdGlvbihzdHJlYW0pIHsKICAgIHJldHVybiBjYWNoZSAmJiBjYWNoZVN0 cmVhbSA9PT0gc3RyZWFtID8gY2FjaGUgOiBjYWNoZSA9IHRyYW5zZm9ybVJhZGlhbnModHJhbnNm b3JtUm90YXRlKHJvdGF0ZSkocHJlY2xpcChwcm9qZWN0UmVzYW1wbGUocG9zdGNsaXAoY2FjaGVT dHJlYW0gPSBzdHJlYW0pKSkpKTsKICB9OwoKICBwcm9qZWN0aW9uLnByZWNsaXAgPSBmdW5jdGlv bihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcmVjbGlwID0gXywgdGhldGEg PSB1bmRlZmluZWQsIHJlc2V0KCkpIDogcHJlY2xpcDsKICB9OwoKICBwcm9qZWN0aW9uLnBvc3Rj bGlwID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9zdGNs aXAgPSBfLCB4MCA9IHkwID0geDEgPSB5MSA9IG51bGwsIHJlc2V0KCkpIDogcG9zdGNsaXA7CiAg fTsKCiAgcHJvamVjdGlvbi5jbGlwQW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJn dW1lbnRzLmxlbmd0aCA/IChwcmVjbGlwID0gK18gPyBjbGlwQ2lyY2xlKHRoZXRhID0gXyAqIHJh ZGlhbnMpIDogKHRoZXRhID0gbnVsbCwgY2xpcEFudGltZXJpZGlhbiksIHJlc2V0KCkpIDogdGhl dGEgKiBkZWdyZWVzJDE7CiAgfTsKCiAgcHJvamVjdGlvbi5jbGlwRXh0ZW50ID0gZnVuY3Rpb24o XykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9zdGNsaXAgPSBfID09IG51bGwg PyAoeDAgPSB5MCA9IHgxID0geTEgPSBudWxsLCBpZGVudGl0eSQ0KSA6IGNsaXBSZWN0YW5nbGUo eDAgPSArX1swXVswXSwgeTAgPSArX1swXVsxXSwgeDEgPSArX1sxXVswXSwgeTEgPSArX1sxXVsx XSksIHJlc2V0KCkpIDogeDAgPT0gbnVsbCA/IG51bGwgOiBbW3gwLCB5MF0sIFt4MSwgeTFdXTsK ICB9OwoKICBwcm9qZWN0aW9uLnNjYWxlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPyAoayA9ICtfLCByZWNlbnRlcigpKSA6IGs7CiAgfTsKCiAgcHJvamVjdGlv bi50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ ICh4ID0gK19bMF0sIHkgPSArX1sxXSwgcmVjZW50ZXIoKSkgOiBbeCwgeV07CiAgfTsKCiAgcHJv amVjdGlvbi5jZW50ZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/IChsYW1iZGEgPSBfWzBdICUgMzYwICogcmFkaWFucywgcGhpID0gX1sxXSAlIDM2MCAqIHJh ZGlhbnMsIHJlY2VudGVyKCkpIDogW2xhbWJkYSAqIGRlZ3JlZXMkMSwgcGhpICogZGVncmVlcyQx XTsKICB9OwoKICBwcm9qZWN0aW9uLnJvdGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBh cmd1bWVudHMubGVuZ3RoID8gKGRlbHRhTGFtYmRhID0gX1swXSAlIDM2MCAqIHJhZGlhbnMsIGRl bHRhUGhpID0gX1sxXSAlIDM2MCAqIHJhZGlhbnMsIGRlbHRhR2FtbWEgPSBfLmxlbmd0aCA+IDIg PyBfWzJdICUgMzYwICogcmFkaWFucyA6IDAsIHJlY2VudGVyKCkpIDogW2RlbHRhTGFtYmRhICog ZGVncmVlcyQxLCBkZWx0YVBoaSAqIGRlZ3JlZXMkMSwgZGVsdGFHYW1tYSAqIGRlZ3JlZXMkMV07 CiAgfTsKCiAgcHJvamVjdGlvbi5hbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1 bWVudHMubGVuZ3RoID8gKGFscGhhID0gXyAlIDM2MCAqIHJhZGlhbnMsIHJlY2VudGVyKCkpIDog YWxwaGEgKiBkZWdyZWVzJDE7CiAgfTsKCiAgcHJvamVjdGlvbi5yZWZsZWN0WCA9IGZ1bmN0aW9u KF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN4ID0gXyA/IC0xIDogMSwgcmVj ZW50ZXIoKSkgOiBzeCA8IDA7CiAgfTsKCiAgcHJvamVjdGlvbi5yZWZsZWN0WSA9IGZ1bmN0aW9u KF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN5ID0gXyA/IC0xIDogMSwgcmVj ZW50ZXIoKSkgOiBzeSA8IDA7CiAgfTsKCiAgcHJvamVjdGlvbi5wcmVjaXNpb24gPSBmdW5jdGlv bihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcm9qZWN0UmVzYW1wbGUgPSBy ZXNhbXBsZShwcm9qZWN0VHJhbnNmb3JtLCBkZWx0YTIgPSBfICogXyksIHJlc2V0KCkpIDogc3Fy dChkZWx0YTIpOwogIH07CgogIHByb2plY3Rpb24uZml0RXh0ZW50ID0gZnVuY3Rpb24oZXh0ZW50 LCBvYmplY3QpIHsKICAgIHJldHVybiBmaXRFeHRlbnQocHJvamVjdGlvbiwgZXh0ZW50LCBvYmpl Y3QpOwogIH07CgogIHByb2plY3Rpb24uZml0U2l6ZSA9IGZ1bmN0aW9uKHNpemUsIG9iamVjdCkg ewogICAgcmV0dXJuIGZpdFNpemUocHJvamVjdGlvbiwgc2l6ZSwgb2JqZWN0KTsKICB9OwoKICBw cm9qZWN0aW9uLmZpdFdpZHRoID0gZnVuY3Rpb24od2lkdGgsIG9iamVjdCkgewogICAgcmV0dXJu IGZpdFdpZHRoKHByb2plY3Rpb24sIHdpZHRoLCBvYmplY3QpOwogIH07CgogIHByb2plY3Rpb24u Zml0SGVpZ2h0ID0gZnVuY3Rpb24oaGVpZ2h0LCBvYmplY3QpIHsKICAgIHJldHVybiBmaXRIZWln aHQocHJvamVjdGlvbiwgaGVpZ2h0LCBvYmplY3QpOwogIH07CgogIGZ1bmN0aW9uIHJlY2VudGVy KCkgewogICAgdmFyIGNlbnRlciA9IHNjYWxlVHJhbnNsYXRlUm90YXRlKGssIDAsIDAsIHN4LCBz eSwgYWxwaGEpLmFwcGx5KG51bGwsIHByb2plY3QobGFtYmRhLCBwaGkpKSwKICAgICAgICB0cmFu c2Zvcm0gPSAoYWxwaGEgPyBzY2FsZVRyYW5zbGF0ZVJvdGF0ZSA6IHNjYWxlVHJhbnNsYXRlKShr LCB4IC0gY2VudGVyWzBdLCB5IC0gY2VudGVyWzFdLCBzeCwgc3ksIGFscGhhKTsKICAgIHJvdGF0 ZSA9IHJvdGF0ZVJhZGlhbnMoZGVsdGFMYW1iZGEsIGRlbHRhUGhpLCBkZWx0YUdhbW1hKTsKICAg IHByb2plY3RUcmFuc2Zvcm0gPSBjb21wb3NlKHByb2plY3QsIHRyYW5zZm9ybSk7CiAgICBwcm9q ZWN0Um90YXRlVHJhbnNmb3JtID0gY29tcG9zZShyb3RhdGUsIHByb2plY3RUcmFuc2Zvcm0pOwog ICAgcHJvamVjdFJlc2FtcGxlID0gcmVzYW1wbGUocHJvamVjdFRyYW5zZm9ybSwgZGVsdGEyKTsK ICAgIHJldHVybiByZXNldCgpOwogIH0KCiAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICBjYWNoZSA9 IGNhY2hlU3RyZWFtID0gbnVsbDsKICAgIHJldHVybiBwcm9qZWN0aW9uOwogIH0KCiAgcmV0dXJu IGZ1bmN0aW9uKCkgewogICAgcHJvamVjdCA9IHByb2plY3RBdC5hcHBseSh0aGlzLCBhcmd1bWVu dHMpOwogICAgcHJvamVjdGlvbi5pbnZlcnQgPSBwcm9qZWN0LmludmVydCAmJiBpbnZlcnQ7CiAg ICByZXR1cm4gcmVjZW50ZXIoKTsKICB9Owp9CgpmdW5jdGlvbiBjb25pY1Byb2plY3Rpb24ocHJv amVjdEF0KSB7CiAgdmFyIHBoaTAgPSAwLAogICAgICBwaGkxID0gcGkkMyAvIDMsCiAgICAgIG0g PSBwcm9qZWN0aW9uTXV0YXRvcihwcm9qZWN0QXQpLAogICAgICBwID0gbShwaGkwLCBwaGkxKTsK CiAgcC5wYXJhbGxlbHMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/IG0ocGhpMCA9IF9bMF0gKiByYWRpYW5zLCBwaGkxID0gX1sxXSAqIHJhZGlhbnMpIDogW3Bo aTAgKiBkZWdyZWVzJDEsIHBoaTEgKiBkZWdyZWVzJDFdOwogIH07CgogIHJldHVybiBwOwp9Cgpm dW5jdGlvbiBjeWxpbmRyaWNhbEVxdWFsQXJlYVJhdyhwaGkwKSB7CiAgdmFyIGNvc1BoaTAgPSBj b3MkMShwaGkwKTsKCiAgZnVuY3Rpb24gZm9yd2FyZChsYW1iZGEsIHBoaSkgewogICAgcmV0dXJu IFtsYW1iZGEgKiBjb3NQaGkwLCBzaW4kMShwaGkpIC8gY29zUGhpMF07CiAgfQoKICBmb3J3YXJk LmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHJldHVybiBbeCAvIGNvc1BoaTAsIGFzaW4o eSAqIGNvc1BoaTApXTsKICB9OwoKICByZXR1cm4gZm9yd2FyZDsKfQoKZnVuY3Rpb24gY29uaWNF cXVhbEFyZWFSYXcoeTAsIHkxKSB7CiAgdmFyIHN5MCA9IHNpbiQxKHkwKSwgbiA9IChzeTAgKyBz aW4kMSh5MSkpIC8gMjsKCiAgLy8gQXJlIHRoZSBwYXJhbGxlbHMgc3ltbWV0cmljYWwgYXJvdW5k IHRoZSBFcXVhdG9yPwogIGlmIChhYnMobikgPCBlcHNpbG9uJDIpIHJldHVybiBjeWxpbmRyaWNh bEVxdWFsQXJlYVJhdyh5MCk7CgogIHZhciBjID0gMSArIHN5MCAqICgyICogbiAtIHN5MCksIHIw ID0gc3FydChjKSAvIG47CgogIGZ1bmN0aW9uIHByb2plY3QoeCwgeSkgewogICAgdmFyIHIgPSBz cXJ0KGMgLSAyICogbiAqIHNpbiQxKHkpKSAvIG47CiAgICByZXR1cm4gW3IgKiBzaW4kMSh4ICo9 IG4pLCByMCAtIHIgKiBjb3MkMSh4KV07CiAgfQoKICBwcm9qZWN0LmludmVydCA9IGZ1bmN0aW9u KHgsIHkpIHsKICAgIHZhciByMHkgPSByMCAtIHksCiAgICAgICAgbCA9IGF0YW4yKHgsIGFicyhy MHkpKSAqIHNpZ24ocjB5KTsKICAgIGlmIChyMHkgKiBuIDwgMCkKICAgICAgbCAtPSBwaSQzICog c2lnbih4KSAqIHNpZ24ocjB5KTsKICAgIHJldHVybiBbbCAvIG4sIGFzaW4oKGMgLSAoeCAqIHgg KyByMHkgKiByMHkpICogbiAqIG4pIC8gKDIgKiBuKSldOwogIH07CgogIHJldHVybiBwcm9qZWN0 Owp9CgpmdW5jdGlvbiBjb25pY0VxdWFsQXJlYSgpIHsKICByZXR1cm4gY29uaWNQcm9qZWN0aW9u KGNvbmljRXF1YWxBcmVhUmF3KQogICAgICAuc2NhbGUoMTU1LjQyNCkKICAgICAgLmNlbnRlcihb MCwgMzMuNjQ0Ml0pOwp9CgpmdW5jdGlvbiBhbGJlcnMoKSB7CiAgcmV0dXJuIGNvbmljRXF1YWxB cmVhKCkKICAgICAgLnBhcmFsbGVscyhbMjkuNSwgNDUuNV0pCiAgICAgIC5zY2FsZSgxMDcwKQog ICAgICAudHJhbnNsYXRlKFs0ODAsIDI1MF0pCiAgICAgIC5yb3RhdGUoWzk2LCAwXSkKICAgICAg LmNlbnRlcihbLTAuNiwgMzguN10pOwp9CgovLyBUaGUgcHJvamVjdGlvbnMgbXVzdCBoYXZlIG11 dHVhbGx5IGV4Y2x1c2l2ZSBjbGlwIHJlZ2lvbnMgb24gdGhlIHNwaGVyZSwKLy8gYXMgdGhpcyB3 aWxsIGF2b2lkIGVtaXR0aW5nIGludGVybGVhdmluZyBsaW5lcyBhbmQgcG9seWdvbnMuCmZ1bmN0 aW9uIG11bHRpcGxleChzdHJlYW1zKSB7CiAgdmFyIG4gPSBzdHJlYW1zLmxlbmd0aDsKICByZXR1 cm4gewogICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsgdmFyIGkgPSAtMTsgd2hpbGUgKCsraSA8 IG4pIHN0cmVhbXNbaV0ucG9pbnQoeCwgeSk7IH0sCiAgICBzcGhlcmU6IGZ1bmN0aW9uKCkgeyB2 YXIgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgc3RyZWFtc1tpXS5zcGhlcmUoKTsgfSwKICAgIGxp bmVTdGFydDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1z W2ldLmxpbmVTdGFydCgpOyB9LAogICAgbGluZUVuZDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7 IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLmxpbmVFbmQoKTsgfSwKICAgIHBvbHlnb25TdGFy dDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLnBv bHlnb25TdGFydCgpOyB9LAogICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7 IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLnBvbHlnb25FbmQoKTsgfQogIH07Cn0KCi8vIEEg Y29tcG9zaXRlIHByb2plY3Rpb24gZm9yIHRoZSBVbml0ZWQgU3RhdGVzLCBjb25maWd1cmVkIGJ5 IGRlZmF1bHQgZm9yCi8vIDk2MMOXNTAwLiBUaGUgcHJvamVjdGlvbiBhbHNvIHdvcmtzIHF1aXRl IHdlbGwgYXQgOTYww5c2MDAgaWYgeW91IGNoYW5nZSB0aGUKLy8gc2NhbGUgdG8gMTI4NSBhbmQg YWRqdXN0IHRoZSB0cmFuc2xhdGUgYWNjb3JkaW5nbHkuIFRoZSBzZXQgb2Ygc3RhbmRhcmQKLy8g cGFyYWxsZWxzIGZvciBlYWNoIHJlZ2lvbiBjb21lcyBmcm9tIFVTR1MsIHdoaWNoIGlzIHB1Ymxp c2hlZCBoZXJlOgovLyBodHRwOi8vZWdzYy51c2dzLmdvdi9pc2IvcHVicy9NYXBQcm9qZWN0aW9u cy9wcm9qZWN0aW9ucy5odG1sI2FsYmVycwpmdW5jdGlvbiBhbGJlcnNVc2EoKSB7CiAgdmFyIGNh Y2hlLAogICAgICBjYWNoZVN0cmVhbSwKICAgICAgbG93ZXI0OCA9IGFsYmVycygpLCBsb3dlcjQ4 UG9pbnQsCiAgICAgIGFsYXNrYSA9IGNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTQsIDBdKS5j ZW50ZXIoWy0yLCA1OC41XSkucGFyYWxsZWxzKFs1NSwgNjVdKSwgYWxhc2thUG9pbnQsIC8vIEVQ U0c6MzMzOAogICAgICBoYXdhaWkgPSBjb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbMTU3LCAwXSku Y2VudGVyKFstMywgMTkuOV0pLnBhcmFsbGVscyhbOCwgMThdKSwgaGF3YWlpUG9pbnQsIC8vIEVT Ukk6MTAyMDA3CiAgICAgIHBvaW50LCBwb2ludFN0cmVhbSA9IHtwb2ludDogZnVuY3Rpb24oeCwg eSkgeyBwb2ludCA9IFt4LCB5XTsgfX07CgogIGZ1bmN0aW9uIGFsYmVyc1VzYShjb29yZGluYXRl cykgewogICAgdmFyIHggPSBjb29yZGluYXRlc1swXSwgeSA9IGNvb3JkaW5hdGVzWzFdOwogICAg cmV0dXJuIHBvaW50ID0gbnVsbCwKICAgICAgICAobG93ZXI0OFBvaW50LnBvaW50KHgsIHkpLCBw b2ludCkKICAgICAgICB8fCAoYWxhc2thUG9pbnQucG9pbnQoeCwgeSksIHBvaW50KQogICAgICAg IHx8IChoYXdhaWlQb2ludC5wb2ludCh4LCB5KSwgcG9pbnQpOwogIH0KCiAgYWxiZXJzVXNhLmlu dmVydCA9IGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7CiAgICB2YXIgayA9IGxvd2VyNDguc2NhbGUo KSwKICAgICAgICB0ID0gbG93ZXI0OC50cmFuc2xhdGUoKSwKICAgICAgICB4ID0gKGNvb3JkaW5h dGVzWzBdIC0gdFswXSkgLyBrLAogICAgICAgIHkgPSAoY29vcmRpbmF0ZXNbMV0gLSB0WzFdKSAv IGs7CiAgICByZXR1cm4gKHkgPj0gMC4xMjAgJiYgeSA8IDAuMjM0ICYmIHggPj0gLTAuNDI1ICYm IHggPCAtMC4yMTQgPyBhbGFza2EKICAgICAgICA6IHkgPj0gMC4xNjYgJiYgeSA8IDAuMjM0ICYm IHggPj0gLTAuMjE0ICYmIHggPCAtMC4xMTUgPyBoYXdhaWkKICAgICAgICA6IGxvd2VyNDgpLmlu dmVydChjb29yZGluYXRlcyk7CiAgfTsKCiAgYWxiZXJzVXNhLnN0cmVhbSA9IGZ1bmN0aW9uKHN0 cmVhbSkgewogICAgcmV0dXJuIGNhY2hlICYmIGNhY2hlU3RyZWFtID09PSBzdHJlYW0gPyBjYWNo ZSA6IGNhY2hlID0gbXVsdGlwbGV4KFtsb3dlcjQ4LnN0cmVhbShjYWNoZVN0cmVhbSA9IHN0cmVh bSksIGFsYXNrYS5zdHJlYW0oc3RyZWFtKSwgaGF3YWlpLnN0cmVhbShzdHJlYW0pXSk7CiAgfTsK CiAgYWxiZXJzVXNhLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHsKICAgIGlmICghYXJndW1lbnRz Lmxlbmd0aCkgcmV0dXJuIGxvd2VyNDgucHJlY2lzaW9uKCk7CiAgICBsb3dlcjQ4LnByZWNpc2lv bihfKSwgYWxhc2thLnByZWNpc2lvbihfKSwgaGF3YWlpLnByZWNpc2lvbihfKTsKICAgIHJldHVy biByZXNldCgpOwogIH07CgogIGFsYmVyc1VzYS5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIGlm ICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxvd2VyNDguc2NhbGUoKTsKICAgIGxvd2VyNDgu c2NhbGUoXyksIGFsYXNrYS5zY2FsZShfICogMC4zNSksIGhhd2FpaS5zY2FsZShfKTsKICAgIHJl dHVybiBhbGJlcnNVc2EudHJhbnNsYXRlKGxvd2VyNDgudHJhbnNsYXRlKCkpOwogIH07CgogIGFs YmVyc1VzYS50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5n dGgpIHJldHVybiBsb3dlcjQ4LnRyYW5zbGF0ZSgpOwogICAgdmFyIGsgPSBsb3dlcjQ4LnNjYWxl KCksIHggPSArX1swXSwgeSA9ICtfWzFdOwoKICAgIGxvd2VyNDhQb2ludCA9IGxvd2VyNDgKICAg ICAgICAudHJhbnNsYXRlKF8pCiAgICAgICAgLmNsaXBFeHRlbnQoW1t4IC0gMC40NTUgKiBrLCB5 IC0gMC4yMzggKiBrXSwgW3ggKyAwLjQ1NSAqIGssIHkgKyAwLjIzOCAqIGtdXSkKICAgICAgICAu c3RyZWFtKHBvaW50U3RyZWFtKTsKCiAgICBhbGFza2FQb2ludCA9IGFsYXNrYQogICAgICAgIC50 cmFuc2xhdGUoW3ggLSAwLjMwNyAqIGssIHkgKyAwLjIwMSAqIGtdKQogICAgICAgIC5jbGlwRXh0 ZW50KFtbeCAtIDAuNDI1ICogayArIGVwc2lsb24kMiwgeSArIDAuMTIwICogayArIGVwc2lsb24k Ml0sIFt4IC0gMC4yMTQgKiBrIC0gZXBzaWxvbiQyLCB5ICsgMC4yMzQgKiBrIC0gZXBzaWxvbiQy XV0pCiAgICAgICAgLnN0cmVhbShwb2ludFN0cmVhbSk7CgogICAgaGF3YWlpUG9pbnQgPSBoYXdh aWkKICAgICAgICAudHJhbnNsYXRlKFt4IC0gMC4yMDUgKiBrLCB5ICsgMC4yMTIgKiBrXSkKICAg ICAgICAuY2xpcEV4dGVudChbW3ggLSAwLjIxNCAqIGsgKyBlcHNpbG9uJDIsIHkgKyAwLjE2NiAq IGsgKyBlcHNpbG9uJDJdLCBbeCAtIDAuMTE1ICogayAtIGVwc2lsb24kMiwgeSArIDAuMjM0ICog ayAtIGVwc2lsb24kMl1dKQogICAgICAgIC5zdHJlYW0ocG9pbnRTdHJlYW0pOwoKICAgIHJldHVy biByZXNldCgpOwogIH07CgogIGFsYmVyc1VzYS5maXRFeHRlbnQgPSBmdW5jdGlvbihleHRlbnQs IG9iamVjdCkgewogICAgcmV0dXJuIGZpdEV4dGVudChhbGJlcnNVc2EsIGV4dGVudCwgb2JqZWN0 KTsKICB9OwoKICBhbGJlcnNVc2EuZml0U2l6ZSA9IGZ1bmN0aW9uKHNpemUsIG9iamVjdCkgewog ICAgcmV0dXJuIGZpdFNpemUoYWxiZXJzVXNhLCBzaXplLCBvYmplY3QpOwogIH07CgogIGFsYmVy c1VzYS5maXRXaWR0aCA9IGZ1bmN0aW9uKHdpZHRoLCBvYmplY3QpIHsKICAgIHJldHVybiBmaXRX aWR0aChhbGJlcnNVc2EsIHdpZHRoLCBvYmplY3QpOwogIH07CgogIGFsYmVyc1VzYS5maXRIZWln aHQgPSBmdW5jdGlvbihoZWlnaHQsIG9iamVjdCkgewogICAgcmV0dXJuIGZpdEhlaWdodChhbGJl cnNVc2EsIGhlaWdodCwgb2JqZWN0KTsKICB9OwoKICBmdW5jdGlvbiByZXNldCgpIHsKICAgIGNh Y2hlID0gY2FjaGVTdHJlYW0gPSBudWxsOwogICAgcmV0dXJuIGFsYmVyc1VzYTsKICB9CgogIHJl dHVybiBhbGJlcnNVc2Euc2NhbGUoMTA3MCk7Cn0KCmZ1bmN0aW9uIGF6aW11dGhhbFJhdyhzY2Fs ZSkgewogIHJldHVybiBmdW5jdGlvbih4LCB5KSB7CiAgICB2YXIgY3ggPSBjb3MkMSh4KSwKICAg ICAgICBjeSA9IGNvcyQxKHkpLAogICAgICAgIGsgPSBzY2FsZShjeCAqIGN5KTsKICAgIHJldHVy biBbCiAgICAgIGsgKiBjeSAqIHNpbiQxKHgpLAogICAgICBrICogc2luJDEoeSkKICAgIF07CiAg fQp9CgpmdW5jdGlvbiBhemltdXRoYWxJbnZlcnQoYW5nbGUpIHsKICByZXR1cm4gZnVuY3Rpb24o eCwgeSkgewogICAgdmFyIHogPSBzcXJ0KHggKiB4ICsgeSAqIHkpLAogICAgICAgIGMgPSBhbmds ZSh6KSwKICAgICAgICBzYyA9IHNpbiQxKGMpLAogICAgICAgIGNjID0gY29zJDEoYyk7CiAgICBy ZXR1cm4gWwogICAgICBhdGFuMih4ICogc2MsIHogKiBjYyksCiAgICAgIGFzaW4oeiAmJiB5ICog c2MgLyB6KQogICAgXTsKICB9Cn0KCnZhciBhemltdXRoYWxFcXVhbEFyZWFSYXcgPSBhemltdXRo YWxSYXcoZnVuY3Rpb24oY3hjeSkgewogIHJldHVybiBzcXJ0KDIgLyAoMSArIGN4Y3kpKTsKfSk7 CgphemltdXRoYWxFcXVhbEFyZWFSYXcuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0KGZ1bmN0aW9u KHopIHsKICByZXR1cm4gMiAqIGFzaW4oeiAvIDIpOwp9KTsKCmZ1bmN0aW9uIGF6aW11dGhhbEVx dWFsQXJlYSgpIHsKICByZXR1cm4gcHJvamVjdGlvbihhemltdXRoYWxFcXVhbEFyZWFSYXcpCiAg ICAgIC5zY2FsZSgxMjQuNzUpCiAgICAgIC5jbGlwQW5nbGUoMTgwIC0gMWUtMyk7Cn0KCnZhciBh emltdXRoYWxFcXVpZGlzdGFudFJhdyA9IGF6aW11dGhhbFJhdyhmdW5jdGlvbihjKSB7CiAgcmV0 dXJuIChjID0gYWNvcyhjKSkgJiYgYyAvIHNpbiQxKGMpOwp9KTsKCmF6aW11dGhhbEVxdWlkaXN0 YW50UmF3LmludmVydCA9IGF6aW11dGhhbEludmVydChmdW5jdGlvbih6KSB7CiAgcmV0dXJuIHo7 Cn0pOwoKZnVuY3Rpb24gYXppbXV0aGFsRXF1aWRpc3RhbnQoKSB7CiAgcmV0dXJuIHByb2plY3Rp b24oYXppbXV0aGFsRXF1aWRpc3RhbnRSYXcpCiAgICAgIC5zY2FsZSg3OS40MTg4KQogICAgICAu Y2xpcEFuZ2xlKDE4MCAtIDFlLTMpOwp9CgpmdW5jdGlvbiBtZXJjYXRvclJhdyhsYW1iZGEsIHBo aSkgewogIHJldHVybiBbbGFtYmRhLCBsb2codGFuKChoYWxmUGkkMiArIHBoaSkgLyAyKSldOwp9 CgptZXJjYXRvclJhdy5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgcmV0dXJuIFt4LCAyICog YXRhbihleHAoeSkpIC0gaGFsZlBpJDJdOwp9OwoKZnVuY3Rpb24gbWVyY2F0b3IoKSB7CiAgcmV0 dXJuIG1lcmNhdG9yUHJvamVjdGlvbihtZXJjYXRvclJhdykKICAgICAgLnNjYWxlKDk2MSAvIHRh dSQzKTsKfQoKZnVuY3Rpb24gbWVyY2F0b3JQcm9qZWN0aW9uKHByb2plY3QpIHsKICB2YXIgbSA9 IHByb2plY3Rpb24ocHJvamVjdCksCiAgICAgIGNlbnRlciA9IG0uY2VudGVyLAogICAgICBzY2Fs ZSA9IG0uc2NhbGUsCiAgICAgIHRyYW5zbGF0ZSA9IG0udHJhbnNsYXRlLAogICAgICBjbGlwRXh0 ZW50ID0gbS5jbGlwRXh0ZW50LAogICAgICB4MCA9IG51bGwsIHkwLCB4MSwgeTE7IC8vIGNsaXAg ZXh0ZW50CgogIG0uc2NhbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA/IChzY2FsZShfKSwgcmVjbGlwKCkpIDogc2NhbGUoKTsKICB9OwoKICBtLnRyYW5zbGF0 ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zbGF0 ZShfKSwgcmVjbGlwKCkpIDogdHJhbnNsYXRlKCk7CiAgfTsKCiAgbS5jZW50ZXIgPSBmdW5jdGlv bihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjZW50ZXIoXyksIHJlY2xpcCgp KSA6IGNlbnRlcigpOwogIH07CgogIG0uY2xpcEV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKChfID09IG51bGwgPyB4MCA9IHkwID0geDEgPSB5MSA9 IG51bGwgOiAoeDAgPSArX1swXVswXSwgeTAgPSArX1swXVsxXSwgeDEgPSArX1sxXVswXSwgeTEg PSArX1sxXVsxXSkpLCByZWNsaXAoKSkgOiB4MCA9PSBudWxsID8gbnVsbCA6IFtbeDAsIHkwXSwg W3gxLCB5MV1dOwogIH07CgogIGZ1bmN0aW9uIHJlY2xpcCgpIHsKICAgIHZhciBrID0gcGkkMyAq IHNjYWxlKCksCiAgICAgICAgdCA9IG0ocm90YXRpb24obS5yb3RhdGUoKSkuaW52ZXJ0KFswLCAw XSkpOwogICAgcmV0dXJuIGNsaXBFeHRlbnQoeDAgPT0gbnVsbAogICAgICAgID8gW1t0WzBdIC0g aywgdFsxXSAtIGtdLCBbdFswXSArIGssIHRbMV0gKyBrXV0gOiBwcm9qZWN0ID09PSBtZXJjYXRv clJhdwogICAgICAgID8gW1tNYXRoLm1heCh0WzBdIC0gaywgeDApLCB5MF0sIFtNYXRoLm1pbih0 WzBdICsgaywgeDEpLCB5MV1dCiAgICAgICAgOiBbW3gwLCBNYXRoLm1heCh0WzFdIC0gaywgeTAp XSwgW3gxLCBNYXRoLm1pbih0WzFdICsgaywgeTEpXV0pOwogIH0KCiAgcmV0dXJuIHJlY2xpcCgp Owp9CgpmdW5jdGlvbiB0YW55KHkpIHsKICByZXR1cm4gdGFuKChoYWxmUGkkMiArIHkpIC8gMik7 Cn0KCmZ1bmN0aW9uIGNvbmljQ29uZm9ybWFsUmF3KHkwLCB5MSkgewogIHZhciBjeTAgPSBjb3Mk MSh5MCksCiAgICAgIG4gPSB5MCA9PT0geTEgPyBzaW4kMSh5MCkgOiBsb2coY3kwIC8gY29zJDEo eTEpKSAvIGxvZyh0YW55KHkxKSAvIHRhbnkoeTApKSwKICAgICAgZiA9IGN5MCAqIHBvdyh0YW55 KHkwKSwgbikgLyBuOwoKICBpZiAoIW4pIHJldHVybiBtZXJjYXRvclJhdzsKCiAgZnVuY3Rpb24g cHJvamVjdCh4LCB5KSB7CiAgICBpZiAoZiA+IDApIHsgaWYgKHkgPCAtaGFsZlBpJDIgKyBlcHNp bG9uJDIpIHkgPSAtaGFsZlBpJDIgKyBlcHNpbG9uJDI7IH0KICAgIGVsc2UgeyBpZiAoeSA+IGhh bGZQaSQyIC0gZXBzaWxvbiQyKSB5ID0gaGFsZlBpJDIgLSBlcHNpbG9uJDI7IH0KICAgIHZhciBy ID0gZiAvIHBvdyh0YW55KHkpLCBuKTsKICAgIHJldHVybiBbciAqIHNpbiQxKG4gKiB4KSwgZiAt IHIgKiBjb3MkMShuICogeCldOwogIH0KCiAgcHJvamVjdC5pbnZlcnQgPSBmdW5jdGlvbih4LCB5 KSB7CiAgICB2YXIgZnkgPSBmIC0geSwgciA9IHNpZ24obikgKiBzcXJ0KHggKiB4ICsgZnkgKiBm eSksCiAgICAgIGwgPSBhdGFuMih4LCBhYnMoZnkpKSAqIHNpZ24oZnkpOwogICAgaWYgKGZ5ICog biA8IDApCiAgICAgIGwgLT0gcGkkMyAqIHNpZ24oeCkgKiBzaWduKGZ5KTsKICAgIHJldHVybiBb bCAvIG4sIDIgKiBhdGFuKHBvdyhmIC8gciwgMSAvIG4pKSAtIGhhbGZQaSQyXTsKICB9OwoKICBy ZXR1cm4gcHJvamVjdDsKfQoKZnVuY3Rpb24gY29uaWNDb25mb3JtYWwoKSB7CiAgcmV0dXJuIGNv bmljUHJvamVjdGlvbihjb25pY0NvbmZvcm1hbFJhdykKICAgICAgLnNjYWxlKDEwOS41KQogICAg ICAucGFyYWxsZWxzKFszMCwgMzBdKTsKfQoKZnVuY3Rpb24gZXF1aXJlY3Rhbmd1bGFyUmF3KGxh bWJkYSwgcGhpKSB7CiAgcmV0dXJuIFtsYW1iZGEsIHBoaV07Cn0KCmVxdWlyZWN0YW5ndWxhclJh dy5pbnZlcnQgPSBlcXVpcmVjdGFuZ3VsYXJSYXc7CgpmdW5jdGlvbiBlcXVpcmVjdGFuZ3VsYXIo KSB7CiAgcmV0dXJuIHByb2plY3Rpb24oZXF1aXJlY3Rhbmd1bGFyUmF3KQogICAgICAuc2NhbGUo MTUyLjYzKTsKfQoKZnVuY3Rpb24gY29uaWNFcXVpZGlzdGFudFJhdyh5MCwgeTEpIHsKICB2YXIg Y3kwID0gY29zJDEoeTApLAogICAgICBuID0geTAgPT09IHkxID8gc2luJDEoeTApIDogKGN5MCAt IGNvcyQxKHkxKSkgLyAoeTEgLSB5MCksCiAgICAgIGcgPSBjeTAgLyBuICsgeTA7CgogIGlmIChh YnMobikgPCBlcHNpbG9uJDIpIHJldHVybiBlcXVpcmVjdGFuZ3VsYXJSYXc7CgogIGZ1bmN0aW9u IHByb2plY3QoeCwgeSkgewogICAgdmFyIGd5ID0gZyAtIHksIG54ID0gbiAqIHg7CiAgICByZXR1 cm4gW2d5ICogc2luJDEobngpLCBnIC0gZ3kgKiBjb3MkMShueCldOwogIH0KCiAgcHJvamVjdC5p bnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICB2YXIgZ3kgPSBnIC0geSwKICAgICAgICBsID0g YXRhbjIoeCwgYWJzKGd5KSkgKiBzaWduKGd5KTsKICAgIGlmIChneSAqIG4gPCAwKQogICAgICBs IC09IHBpJDMgKiBzaWduKHgpICogc2lnbihneSk7CiAgICByZXR1cm4gW2wgLyBuLCBnIC0gc2ln bihuKSAqIHNxcnQoeCAqIHggKyBneSAqIGd5KV07CiAgfTsKCiAgcmV0dXJuIHByb2plY3Q7Cn0K CmZ1bmN0aW9uIGNvbmljRXF1aWRpc3RhbnQoKSB7CiAgcmV0dXJuIGNvbmljUHJvamVjdGlvbihj b25pY0VxdWlkaXN0YW50UmF3KQogICAgICAuc2NhbGUoMTMxLjE1NCkKICAgICAgLmNlbnRlcihb MCwgMTMuOTM4OV0pOwp9Cgp2YXIgQTEgPSAxLjM0MDI2NCwKICAgIEEyID0gLTAuMDgxMTA2LAog ICAgQTMgPSAwLjAwMDg5MywKICAgIEE0ID0gMC4wMDM3OTYsCiAgICBNID0gc3FydCgzKSAvIDIs CiAgICBpdGVyYXRpb25zID0gMTI7CgpmdW5jdGlvbiBlcXVhbEVhcnRoUmF3KGxhbWJkYSwgcGhp KSB7CiAgdmFyIGwgPSBhc2luKE0gKiBzaW4kMShwaGkpKSwgbDIgPSBsICogbCwgbDYgPSBsMiAq IGwyICogbDI7CiAgcmV0dXJuIFsKICAgIGxhbWJkYSAqIGNvcyQxKGwpIC8gKE0gKiAoQTEgKyAz ICogQTIgKiBsMiArIGw2ICogKDcgKiBBMyArIDkgKiBBNCAqIGwyKSkpLAogICAgbCAqIChBMSAr IEEyICogbDIgKyBsNiAqIChBMyArIEE0ICogbDIpKQogIF07Cn0KCmVxdWFsRWFydGhSYXcuaW52 ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogIHZhciBsID0geSwgbDIgPSBsICogbCwgbDYgPSBsMiAq IGwyICogbDI7CiAgZm9yICh2YXIgaSA9IDAsIGRlbHRhLCBmeSwgZnB5OyBpIDwgaXRlcmF0aW9u czsgKytpKSB7CiAgICBmeSA9IGwgKiAoQTEgKyBBMiAqIGwyICsgbDYgKiAoQTMgKyBBNCAqIGwy KSkgLSB5OwogICAgZnB5ID0gQTEgKyAzICogQTIgKiBsMiArIGw2ICogKDcgKiBBMyArIDkgKiBB NCAqIGwyKTsKICAgIGwgLT0gZGVsdGEgPSBmeSAvIGZweSwgbDIgPSBsICogbCwgbDYgPSBsMiAq IGwyICogbDI7CiAgICBpZiAoYWJzKGRlbHRhKSA8IGVwc2lsb24yJDEpIGJyZWFrOwogIH0KICBy ZXR1cm4gWwogICAgTSAqIHggKiAoQTEgKyAzICogQTIgKiBsMiArIGw2ICogKDcgKiBBMyArIDkg KiBBNCAqIGwyKSkgLyBjb3MkMShsKSwKICAgIGFzaW4oc2luJDEobCkgLyBNKQogIF07Cn07Cgpm dW5jdGlvbiBlcXVhbEVhcnRoKCkgewogIHJldHVybiBwcm9qZWN0aW9uKGVxdWFsRWFydGhSYXcp CiAgICAgIC5zY2FsZSgxNzcuMTU4KTsKfQoKZnVuY3Rpb24gZ25vbW9uaWNSYXcoeCwgeSkgewog IHZhciBjeSA9IGNvcyQxKHkpLCBrID0gY29zJDEoeCkgKiBjeTsKICByZXR1cm4gW2N5ICogc2lu JDEoeCkgLyBrLCBzaW4kMSh5KSAvIGtdOwp9Cgpnbm9tb25pY1Jhdy5pbnZlcnQgPSBhemltdXRo YWxJbnZlcnQoYXRhbik7CgpmdW5jdGlvbiBnbm9tb25pYygpIHsKICByZXR1cm4gcHJvamVjdGlv bihnbm9tb25pY1JhdykKICAgICAgLnNjYWxlKDE0NC4wNDkpCiAgICAgIC5jbGlwQW5nbGUoNjAp Owp9CgpmdW5jdGlvbiBpZGVudGl0eSQ1KCkgewogIHZhciBrID0gMSwgdHggPSAwLCB0eSA9IDAs IHN4ID0gMSwgc3kgPSAxLCAvLyBzY2FsZSwgdHJhbnNsYXRlIGFuZCByZWZsZWN0CiAgICAgIGFs cGhhID0gMCwgY2EsIHNhLCAvLyBhbmdsZQogICAgICB4MCA9IG51bGwsIHkwLCB4MSwgeTEsIC8v IGNsaXAgZXh0ZW50CiAgICAgIGt4ID0gMSwga3kgPSAxLAogICAgICB0cmFuc2Zvcm0gPSB0cmFu c2Zvcm1lcih7CiAgICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICAgIHZhciBw ID0gcHJvamVjdGlvbihbeCwgeV0pOwogICAgICAgICAgdGhpcy5zdHJlYW0ucG9pbnQocFswXSwg cFsxXSk7CiAgICAgICAgfQogICAgICB9KSwKICAgICAgcG9zdGNsaXAgPSBpZGVudGl0eSQ0LAog ICAgICBjYWNoZSwKICAgICAgY2FjaGVTdHJlYW07CgogIGZ1bmN0aW9uIHJlc2V0KCkgewogICAg a3ggPSBrICogc3g7CiAgICBreSA9IGsgKiBzeTsKICAgIGNhY2hlID0gY2FjaGVTdHJlYW0gPSBu dWxsOwogICAgcmV0dXJuIHByb2plY3Rpb247CiAgfQoKICBmdW5jdGlvbiBwcm9qZWN0aW9uIChw KSB7CiAgICB2YXIgeCA9IHBbMF0gKiBreCwgeSA9IHBbMV0gKiBreTsKICAgIGlmIChhbHBoYSkg ewogICAgICB2YXIgdCA9IHkgKiBjYSAtIHggKiBzYTsKICAgICAgeCA9IHggKiBjYSArIHkgKiBz YTsKICAgICAgeSA9IHQ7CiAgICB9ICAgIAogICAgcmV0dXJuIFt4ICsgdHgsIHkgKyB0eV07CiAg fQogIHByb2plY3Rpb24uaW52ZXJ0ID0gZnVuY3Rpb24ocCkgewogICAgdmFyIHggPSBwWzBdIC0g dHgsIHkgPSBwWzFdIC0gdHk7CiAgICBpZiAoYWxwaGEpIHsKICAgICAgdmFyIHQgPSB5ICogY2Eg KyB4ICogc2E7CiAgICAgIHggPSB4ICogY2EgLSB5ICogc2E7CiAgICAgIHkgPSB0OwogICAgfQog ICAgcmV0dXJuIFt4IC8ga3gsIHkgLyBreV07CiAgfTsKICBwcm9qZWN0aW9uLnN0cmVhbSA9IGZ1 bmN0aW9uKHN0cmVhbSkgewogICAgcmV0dXJuIGNhY2hlICYmIGNhY2hlU3RyZWFtID09PSBzdHJl YW0gPyBjYWNoZSA6IGNhY2hlID0gdHJhbnNmb3JtKHBvc3RjbGlwKGNhY2hlU3RyZWFtID0gc3Ry ZWFtKSk7CiAgfTsKICBwcm9qZWN0aW9uLnBvc3RjbGlwID0gZnVuY3Rpb24oXykgewogICAgcmV0 dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9zdGNsaXAgPSBfLCB4MCA9IHkwID0geDEgPSB5MSA9 IG51bGwsIHJlc2V0KCkpIDogcG9zdGNsaXA7CiAgfTsKICBwcm9qZWN0aW9uLmNsaXBFeHRlbnQg PSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb3N0Y2xpcCA9 IF8gPT0gbnVsbCA/ICh4MCA9IHkwID0geDEgPSB5MSA9IG51bGwsIGlkZW50aXR5JDQpIDogY2xp cFJlY3RhbmdsZSh4MCA9ICtfWzBdWzBdLCB5MCA9ICtfWzBdWzFdLCB4MSA9ICtfWzFdWzBdLCB5 MSA9ICtfWzFdWzFdKSwgcmVzZXQoKSkgOiB4MCA9PSBudWxsID8gbnVsbCA6IFtbeDAsIHkwXSwg W3gxLCB5MV1dOwogIH07CiAgcHJvamVjdGlvbi5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGsgPSArXywgcmVzZXQoKSkgOiBrOwogIH07CiAgcHJv amVjdGlvbi50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA/ICh0eCA9ICtfWzBdLCB0eSA9ICtfWzFdLCByZXNldCgpKSA6IFt0eCwgdHldOwogIH07 CiAgcHJvamVjdGlvbi5hbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMu bGVuZ3RoID8gKGFscGhhID0gXyAlIDM2MCAqIHJhZGlhbnMsIHNhID0gc2luJDEoYWxwaGEpLCBj YSA9IGNvcyQxKGFscGhhKSwgcmVzZXQoKSkgOiBhbHBoYSAqIGRlZ3JlZXMkMTsKICB9OwogIHBy b2plY3Rpb24ucmVmbGVjdFggPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA/IChzeCA9IF8gPyAtMSA6IDEsIHJlc2V0KCkpIDogc3ggPCAwOwogIH07CiAgcHJvamVj dGlvbi5yZWZsZWN0WSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3Ro ID8gKHN5ID0gXyA/IC0xIDogMSwgcmVzZXQoKSkgOiBzeSA8IDA7CiAgfTsKICBwcm9qZWN0aW9u LmZpdEV4dGVudCA9IGZ1bmN0aW9uKGV4dGVudCwgb2JqZWN0KSB7CiAgICByZXR1cm4gZml0RXh0 ZW50KHByb2plY3Rpb24sIGV4dGVudCwgb2JqZWN0KTsKICB9OwogIHByb2plY3Rpb24uZml0U2l6 ZSA9IGZ1bmN0aW9uKHNpemUsIG9iamVjdCkgewogICAgcmV0dXJuIGZpdFNpemUocHJvamVjdGlv biwgc2l6ZSwgb2JqZWN0KTsKICB9OwogIHByb2plY3Rpb24uZml0V2lkdGggPSBmdW5jdGlvbih3 aWR0aCwgb2JqZWN0KSB7CiAgICByZXR1cm4gZml0V2lkdGgocHJvamVjdGlvbiwgd2lkdGgsIG9i amVjdCk7CiAgfTsKICBwcm9qZWN0aW9uLmZpdEhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCwgb2Jq ZWN0KSB7CiAgICByZXR1cm4gZml0SGVpZ2h0KHByb2plY3Rpb24sIGhlaWdodCwgb2JqZWN0KTsK ICB9OwoKICByZXR1cm4gcHJvamVjdGlvbjsKfQoKZnVuY3Rpb24gbmF0dXJhbEVhcnRoMVJhdyhs YW1iZGEsIHBoaSkgewogIHZhciBwaGkyID0gcGhpICogcGhpLCBwaGk0ID0gcGhpMiAqIHBoaTI7 CiAgcmV0dXJuIFsKICAgIGxhbWJkYSAqICgwLjg3MDcgLSAwLjEzMTk3OSAqIHBoaTIgKyBwaGk0 ICogKC0wLjAxMzc5MSArIHBoaTQgKiAoMC4wMDM5NzEgKiBwaGkyIC0gMC4wMDE1MjkgKiBwaGk0 KSkpLAogICAgcGhpICogKDEuMDA3MjI2ICsgcGhpMiAqICgwLjAxNTA4NSArIHBoaTQgKiAoLTAu MDQ0NDc1ICsgMC4wMjg4NzQgKiBwaGkyIC0gMC4wMDU5MTYgKiBwaGk0KSkpCiAgXTsKfQoKbmF0 dXJhbEVhcnRoMVJhdy5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgdmFyIHBoaSA9IHksIGkg PSAyNSwgZGVsdGE7CiAgZG8gewogICAgdmFyIHBoaTIgPSBwaGkgKiBwaGksIHBoaTQgPSBwaGky ICogcGhpMjsKICAgIHBoaSAtPSBkZWx0YSA9IChwaGkgKiAoMS4wMDcyMjYgKyBwaGkyICogKDAu MDE1MDg1ICsgcGhpNCAqICgtMC4wNDQ0NzUgKyAwLjAyODg3NCAqIHBoaTIgLSAwLjAwNTkxNiAq IHBoaTQpKSkgLSB5KSAvCiAgICAgICAgKDEuMDA3MjI2ICsgcGhpMiAqICgwLjAxNTA4NSAqIDMg KyBwaGk0ICogKC0wLjA0NDQ3NSAqIDcgKyAwLjAyODg3NCAqIDkgKiBwaGkyIC0gMC4wMDU5MTYg KiAxMSAqIHBoaTQpKSk7CiAgfSB3aGlsZSAoYWJzKGRlbHRhKSA+IGVwc2lsb24kMiAmJiAtLWkg PiAwKTsKICByZXR1cm4gWwogICAgeCAvICgwLjg3MDcgKyAocGhpMiA9IHBoaSAqIHBoaSkgKiAo LTAuMTMxOTc5ICsgcGhpMiAqICgtMC4wMTM3OTEgKyBwaGkyICogcGhpMiAqIHBoaTIgKiAoMC4w MDM5NzEgLSAwLjAwMTUyOSAqIHBoaTIpKSkpLAogICAgcGhpCiAgXTsKfTsKCmZ1bmN0aW9uIG5h dHVyYWxFYXJ0aDEoKSB7CiAgcmV0dXJuIHByb2plY3Rpb24obmF0dXJhbEVhcnRoMVJhdykKICAg ICAgLnNjYWxlKDE3NS4yOTUpOwp9CgpmdW5jdGlvbiBvcnRob2dyYXBoaWNSYXcoeCwgeSkgewog IHJldHVybiBbY29zJDEoeSkgKiBzaW4kMSh4KSwgc2luJDEoeSldOwp9CgpvcnRob2dyYXBoaWNS YXcuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0KGFzaW4pOwoKZnVuY3Rpb24gb3J0aG9ncmFwaGlj KCkgewogIHJldHVybiBwcm9qZWN0aW9uKG9ydGhvZ3JhcGhpY1JhdykKICAgICAgLnNjYWxlKDI0 OS41KQogICAgICAuY2xpcEFuZ2xlKDkwICsgZXBzaWxvbiQyKTsKfQoKZnVuY3Rpb24gc3RlcmVv Z3JhcGhpY1Jhdyh4LCB5KSB7CiAgdmFyIGN5ID0gY29zJDEoeSksIGsgPSAxICsgY29zJDEoeCkg KiBjeTsKICByZXR1cm4gW2N5ICogc2luJDEoeCkgLyBrLCBzaW4kMSh5KSAvIGtdOwp9CgpzdGVy ZW9ncmFwaGljUmF3LmludmVydCA9IGF6aW11dGhhbEludmVydChmdW5jdGlvbih6KSB7CiAgcmV0 dXJuIDIgKiBhdGFuKHopOwp9KTsKCmZ1bmN0aW9uIHN0ZXJlb2dyYXBoaWMoKSB7CiAgcmV0dXJu IHByb2plY3Rpb24oc3RlcmVvZ3JhcGhpY1JhdykKICAgICAgLnNjYWxlKDI1MCkKICAgICAgLmNs aXBBbmdsZSgxNDIpOwp9CgpmdW5jdGlvbiB0cmFuc3ZlcnNlTWVyY2F0b3JSYXcobGFtYmRhLCBw aGkpIHsKICByZXR1cm4gW2xvZyh0YW4oKGhhbGZQaSQyICsgcGhpKSAvIDIpKSwgLWxhbWJkYV07 Cn0KCnRyYW5zdmVyc2VNZXJjYXRvclJhdy5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgcmV0 dXJuIFsteSwgMiAqIGF0YW4oZXhwKHgpKSAtIGhhbGZQaSQyXTsKfTsKCmZ1bmN0aW9uIHRyYW5z dmVyc2VNZXJjYXRvcigpIHsKICB2YXIgbSA9IG1lcmNhdG9yUHJvamVjdGlvbih0cmFuc3ZlcnNl TWVyY2F0b3JSYXcpLAogICAgICBjZW50ZXIgPSBtLmNlbnRlciwKICAgICAgcm90YXRlID0gbS5y b3RhdGU7CgogIG0uY2VudGVyID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5s ZW5ndGggPyBjZW50ZXIoWy1fWzFdLCBfWzBdXSkgOiAoXyA9IGNlbnRlcigpLCBbX1sxXSwgLV9b MF1dKTsKICB9OwoKICBtLnJvdGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVu dHMubGVuZ3RoID8gcm90YXRlKFtfWzBdLCBfWzFdLCBfLmxlbmd0aCA+IDIgPyBfWzJdICsgOTAg OiA5MF0pIDogKF8gPSByb3RhdGUoKSwgW19bMF0sIF9bMV0sIF9bMl0gLSA5MF0pOwogIH07Cgog IHJldHVybiByb3RhdGUoWzAsIDAsIDkwXSkKICAgICAgLnNjYWxlKDE1OS4xNTUpOwp9CgpmdW5j dGlvbiBkZWZhdWx0U2VwYXJhdGlvbihhLCBiKSB7CiAgcmV0dXJuIGEucGFyZW50ID09PSBiLnBh cmVudCA/IDEgOiAyOwp9CgpmdW5jdGlvbiBtZWFuWChjaGlsZHJlbikgewogIHJldHVybiBjaGls ZHJlbi5yZWR1Y2UobWVhblhSZWR1Y2UsIDApIC8gY2hpbGRyZW4ubGVuZ3RoOwp9CgpmdW5jdGlv biBtZWFuWFJlZHVjZSh4LCBjKSB7CiAgcmV0dXJuIHggKyBjLng7Cn0KCmZ1bmN0aW9uIG1heFko Y2hpbGRyZW4pIHsKICByZXR1cm4gMSArIGNoaWxkcmVuLnJlZHVjZShtYXhZUmVkdWNlLCAwKTsK fQoKZnVuY3Rpb24gbWF4WVJlZHVjZSh5LCBjKSB7CiAgcmV0dXJuIE1hdGgubWF4KHksIGMueSk7 Cn0KCmZ1bmN0aW9uIGxlYWZMZWZ0KG5vZGUpIHsKICB2YXIgY2hpbGRyZW47CiAgd2hpbGUgKGNo aWxkcmVuID0gbm9kZS5jaGlsZHJlbikgbm9kZSA9IGNoaWxkcmVuWzBdOwogIHJldHVybiBub2Rl Owp9CgpmdW5jdGlvbiBsZWFmUmlnaHQobm9kZSkgewogIHZhciBjaGlsZHJlbjsKICB3aGlsZSAo Y2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKSBub2RlID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3Ro IC0gMV07CiAgcmV0dXJuIG5vZGU7Cn0KCmZ1bmN0aW9uIGNsdXN0ZXIoKSB7CiAgdmFyIHNlcGFy YXRpb24gPSBkZWZhdWx0U2VwYXJhdGlvbiwKICAgICAgZHggPSAxLAogICAgICBkeSA9IDEsCiAg ICAgIG5vZGVTaXplID0gZmFsc2U7CgogIGZ1bmN0aW9uIGNsdXN0ZXIocm9vdCkgewogICAgdmFy IHByZXZpb3VzTm9kZSwKICAgICAgICB4ID0gMDsKCiAgICAvLyBGaXJzdCB3YWxrLCBjb21wdXRp bmcgdGhlIGluaXRpYWwgeCAmIHkgdmFsdWVzLgogICAgcm9vdC5lYWNoQWZ0ZXIoZnVuY3Rpb24o bm9kZSkgewogICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgICBpZiAoY2hp bGRyZW4pIHsKICAgICAgICBub2RlLnggPSBtZWFuWChjaGlsZHJlbik7CiAgICAgICAgbm9kZS55 ID0gbWF4WShjaGlsZHJlbik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZS54ID0gcHJldmlv dXNOb2RlID8geCArPSBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzTm9kZSkgOiAwOwogICAgICAg IG5vZGUueSA9IDA7CiAgICAgICAgcHJldmlvdXNOb2RlID0gbm9kZTsKICAgICAgfQogICAgfSk7 CgogICAgdmFyIGxlZnQgPSBsZWFmTGVmdChyb290KSwKICAgICAgICByaWdodCA9IGxlYWZSaWdo dChyb290KSwKICAgICAgICB4MCA9IGxlZnQueCAtIHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8g MiwKICAgICAgICB4MSA9IHJpZ2h0LnggKyBzZXBhcmF0aW9uKHJpZ2h0LCBsZWZ0KSAvIDI7Cgog ICAgLy8gU2Vjb25kIHdhbGssIG5vcm1hbGl6aW5nIHggJiB5IHRvIHRoZSBkZXNpcmVkIHNpemUu CiAgICByZXR1cm4gcm9vdC5lYWNoQWZ0ZXIobm9kZVNpemUgPyBmdW5jdGlvbihub2RlKSB7CiAg ICAgIG5vZGUueCA9IChub2RlLnggLSByb290LngpICogZHg7CiAgICAgIG5vZGUueSA9IChyb290 LnkgLSBub2RlLnkpICogZHk7CiAgICB9IDogZnVuY3Rpb24obm9kZSkgewogICAgICBub2RlLngg PSAobm9kZS54IC0geDApIC8gKHgxIC0geDApICogZHg7CiAgICAgIG5vZGUueSA9ICgxIC0gKHJv b3QueSA/IG5vZGUueSAvIHJvb3QueSA6IDEpKSAqIGR5OwogICAgfSk7CiAgfQoKICBjbHVzdGVy LnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ IChzZXBhcmF0aW9uID0geCwgY2x1c3RlcikgOiBzZXBhcmF0aW9uOwogIH07CgogIGNsdXN0ZXIu c2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVT aXplID0gZmFsc2UsIGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIGNsdXN0ZXIpIDogKG5vZGVTaXpl ID8gbnVsbCA6IFtkeCwgZHldKTsKICB9OwoKICBjbHVzdGVyLm5vZGVTaXplID0gZnVuY3Rpb24o eCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSB0cnVlLCBkeCA9 ICt4WzBdLCBkeSA9ICt4WzFdLCBjbHVzdGVyKSA6IChub2RlU2l6ZSA/IFtkeCwgZHldIDogbnVs bCk7CiAgfTsKCiAgcmV0dXJuIGNsdXN0ZXI7Cn0KCmZ1bmN0aW9uIGNvdW50KG5vZGUpIHsKICB2 YXIgc3VtID0gMCwKICAgICAgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuLAogICAgICBpID0gY2hp bGRyZW4gJiYgY2hpbGRyZW4ubGVuZ3RoOwogIGlmICghaSkgc3VtID0gMTsKICBlbHNlIHdoaWxl ICgtLWkgPj0gMCkgc3VtICs9IGNoaWxkcmVuW2ldLnZhbHVlOwogIG5vZGUudmFsdWUgPSBzdW07 Cn0KCmZ1bmN0aW9uIG5vZGVfY291bnQoKSB7CiAgcmV0dXJuIHRoaXMuZWFjaEFmdGVyKGNvdW50 KTsKfQoKZnVuY3Rpb24gbm9kZV9lYWNoKGNhbGxiYWNrKSB7CiAgdmFyIG5vZGUgPSB0aGlzLCBj dXJyZW50LCBuZXh0ID0gW25vZGVdLCBjaGlsZHJlbiwgaSwgbjsKICBkbyB7CiAgICBjdXJyZW50 ID0gbmV4dC5yZXZlcnNlKCksIG5leHQgPSBbXTsKICAgIHdoaWxlIChub2RlID0gY3VycmVudC5w b3AoKSkgewogICAgICBjYWxsYmFjayhub2RlKSwgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwog ICAgICBpZiAoY2hpbGRyZW4pIGZvciAoaSA9IDAsIG4gPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBu OyArK2kpIHsKICAgICAgICBuZXh0LnB1c2goY2hpbGRyZW5baV0pOwogICAgICB9CiAgICB9CiAg fSB3aGlsZSAobmV4dC5sZW5ndGgpOwogIHJldHVybiB0aGlzOwp9CgpmdW5jdGlvbiBub2RlX2Vh Y2hCZWZvcmUoY2FsbGJhY2spIHsKICB2YXIgbm9kZSA9IHRoaXMsIG5vZGVzID0gW25vZGVdLCBj aGlsZHJlbiwgaTsKICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7CiAgICBjYWxsYmFjayhu b2RlKSwgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgaWYgKGNoaWxkcmVuKSBmb3IgKGkg PSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICBub2Rlcy5wdXNoKGNo aWxkcmVuW2ldKTsKICAgIH0KICB9CiAgcmV0dXJuIHRoaXM7Cn0KCmZ1bmN0aW9uIG5vZGVfZWFj aEFmdGVyKGNhbGxiYWNrKSB7CiAgdmFyIG5vZGUgPSB0aGlzLCBub2RlcyA9IFtub2RlXSwgbmV4 dCA9IFtdLCBjaGlsZHJlbiwgaSwgbjsKICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7CiAg ICBuZXh0LnB1c2gobm9kZSksIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgIGlmIChjaGls ZHJlbikgZm9yIChpID0gMCwgbiA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAg ICBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTsKICAgIH0KICB9CiAgd2hpbGUgKG5vZGUgPSBuZXh0 LnBvcCgpKSB7CiAgICBjYWxsYmFjayhub2RlKTsKICB9CiAgcmV0dXJuIHRoaXM7Cn0KCmZ1bmN0 aW9uIG5vZGVfc3VtKHZhbHVlKSB7CiAgcmV0dXJuIHRoaXMuZWFjaEFmdGVyKGZ1bmN0aW9uKG5v ZGUpIHsKICAgIHZhciBzdW0gPSArdmFsdWUobm9kZS5kYXRhKSB8fCAwLAogICAgICAgIGNoaWxk cmVuID0gbm9kZS5jaGlsZHJlbiwKICAgICAgICBpID0gY2hpbGRyZW4gJiYgY2hpbGRyZW4ubGVu Z3RoOwogICAgd2hpbGUgKC0taSA+PSAwKSBzdW0gKz0gY2hpbGRyZW5baV0udmFsdWU7CiAgICBu b2RlLnZhbHVlID0gc3VtOwogIH0pOwp9CgpmdW5jdGlvbiBub2RlX3NvcnQoY29tcGFyZSkgewog IHJldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkgewogICAgaWYgKG5vZGUuY2hp bGRyZW4pIHsKICAgICAgbm9kZS5jaGlsZHJlbi5zb3J0KGNvbXBhcmUpOwogICAgfQogIH0pOwp9 CgpmdW5jdGlvbiBub2RlX3BhdGgoZW5kKSB7CiAgdmFyIHN0YXJ0ID0gdGhpcywKICAgICAgYW5j ZXN0b3IgPSBsZWFzdENvbW1vbkFuY2VzdG9yKHN0YXJ0LCBlbmQpLAogICAgICBub2RlcyA9IFtz dGFydF07CiAgd2hpbGUgKHN0YXJ0ICE9PSBhbmNlc3RvcikgewogICAgc3RhcnQgPSBzdGFydC5w YXJlbnQ7CiAgICBub2Rlcy5wdXNoKHN0YXJ0KTsKICB9CiAgdmFyIGsgPSBub2Rlcy5sZW5ndGg7 CiAgd2hpbGUgKGVuZCAhPT0gYW5jZXN0b3IpIHsKICAgIG5vZGVzLnNwbGljZShrLCAwLCBlbmQp OwogICAgZW5kID0gZW5kLnBhcmVudDsKICB9CiAgcmV0dXJuIG5vZGVzOwp9CgpmdW5jdGlvbiBs ZWFzdENvbW1vbkFuY2VzdG9yKGEsIGIpIHsKICBpZiAoYSA9PT0gYikgcmV0dXJuIGE7CiAgdmFy IGFOb2RlcyA9IGEuYW5jZXN0b3JzKCksCiAgICAgIGJOb2RlcyA9IGIuYW5jZXN0b3JzKCksCiAg ICAgIGMgPSBudWxsOwogIGEgPSBhTm9kZXMucG9wKCk7CiAgYiA9IGJOb2Rlcy5wb3AoKTsKICB3 aGlsZSAoYSA9PT0gYikgewogICAgYyA9IGE7CiAgICBhID0gYU5vZGVzLnBvcCgpOwogICAgYiA9 IGJOb2Rlcy5wb3AoKTsKICB9CiAgcmV0dXJuIGM7Cn0KCmZ1bmN0aW9uIG5vZGVfYW5jZXN0b3Jz KCkgewogIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV07CiAgd2hpbGUgKG5vZGUgPSBu b2RlLnBhcmVudCkgewogICAgbm9kZXMucHVzaChub2RlKTsKICB9CiAgcmV0dXJuIG5vZGVzOwp9 CgpmdW5jdGlvbiBub2RlX2Rlc2NlbmRhbnRzKCkgewogIHZhciBub2RlcyA9IFtdOwogIHRoaXMu ZWFjaChmdW5jdGlvbihub2RlKSB7CiAgICBub2Rlcy5wdXNoKG5vZGUpOwogIH0pOwogIHJldHVy biBub2RlczsKfQoKZnVuY3Rpb24gbm9kZV9sZWF2ZXMoKSB7CiAgdmFyIGxlYXZlcyA9IFtdOwog IHRoaXMuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7CiAgICBpZiAoIW5vZGUuY2hpbGRyZW4p IHsKICAgICAgbGVhdmVzLnB1c2gobm9kZSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIGxlYXZlczsK fQoKZnVuY3Rpb24gbm9kZV9saW5rcygpIHsKICB2YXIgcm9vdCA9IHRoaXMsIGxpbmtzID0gW107 CiAgcm9vdC5lYWNoKGZ1bmN0aW9uKG5vZGUpIHsKICAgIGlmIChub2RlICE9PSByb290KSB7IC8v IERvbuKAmXQgaW5jbHVkZSB0aGUgcm9vdOKAmXMgcGFyZW50LCBpZiBhbnkuCiAgICAgIGxpbmtz LnB1c2goe3NvdXJjZTogbm9kZS5wYXJlbnQsIHRhcmdldDogbm9kZX0pOwogICAgfQogIH0pOwog IHJldHVybiBsaW5rczsKfQoKZnVuY3Rpb24gaGllcmFyY2h5KGRhdGEsIGNoaWxkcmVuKSB7CiAg dmFyIHJvb3QgPSBuZXcgTm9kZShkYXRhKSwKICAgICAgdmFsdWVkID0gK2RhdGEudmFsdWUgJiYg KHJvb3QudmFsdWUgPSBkYXRhLnZhbHVlKSwKICAgICAgbm9kZSwKICAgICAgbm9kZXMgPSBbcm9v dF0sCiAgICAgIGNoaWxkLAogICAgICBjaGlsZHMsCiAgICAgIGksCiAgICAgIG47CgogIGlmIChj aGlsZHJlbiA9PSBudWxsKSBjaGlsZHJlbiA9IGRlZmF1bHRDaGlsZHJlbjsKCiAgd2hpbGUgKG5v ZGUgPSBub2Rlcy5wb3AoKSkgewogICAgaWYgKHZhbHVlZCkgbm9kZS52YWx1ZSA9ICtub2RlLmRh dGEudmFsdWU7CiAgICBpZiAoKGNoaWxkcyA9IGNoaWxkcmVuKG5vZGUuZGF0YSkpICYmIChuID0g Y2hpbGRzLmxlbmd0aCkpIHsKICAgICAgbm9kZS5jaGlsZHJlbiA9IG5ldyBBcnJheShuKTsKICAg ICAgZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgbm9kZXMucHVzaChjaGls ZCA9IG5vZGUuY2hpbGRyZW5baV0gPSBuZXcgTm9kZShjaGlsZHNbaV0pKTsKICAgICAgICBjaGls ZC5wYXJlbnQgPSBub2RlOwogICAgICAgIGNoaWxkLmRlcHRoID0gbm9kZS5kZXB0aCArIDE7CiAg ICAgIH0KICAgIH0KICB9CgogIHJldHVybiByb290LmVhY2hCZWZvcmUoY29tcHV0ZUhlaWdodCk7 Cn0KCmZ1bmN0aW9uIG5vZGVfY29weSgpIHsKICByZXR1cm4gaGllcmFyY2h5KHRoaXMpLmVhY2hC ZWZvcmUoY29weURhdGEpOwp9CgpmdW5jdGlvbiBkZWZhdWx0Q2hpbGRyZW4oZCkgewogIHJldHVy biBkLmNoaWxkcmVuOwp9CgpmdW5jdGlvbiBjb3B5RGF0YShub2RlKSB7CiAgbm9kZS5kYXRhID0g bm9kZS5kYXRhLmRhdGE7Cn0KCmZ1bmN0aW9uIGNvbXB1dGVIZWlnaHQobm9kZSkgewogIHZhciBo ZWlnaHQgPSAwOwogIGRvIG5vZGUuaGVpZ2h0ID0gaGVpZ2h0OwogIHdoaWxlICgobm9kZSA9IG5v ZGUucGFyZW50KSAmJiAobm9kZS5oZWlnaHQgPCArK2hlaWdodCkpOwp9CgpmdW5jdGlvbiBOb2Rl KGRhdGEpIHsKICB0aGlzLmRhdGEgPSBkYXRhOwogIHRoaXMuZGVwdGggPQogIHRoaXMuaGVpZ2h0 ID0gMDsKICB0aGlzLnBhcmVudCA9IG51bGw7Cn0KCk5vZGUucHJvdG90eXBlID0gaGllcmFyY2h5 LnByb3RvdHlwZSA9IHsKICBjb25zdHJ1Y3RvcjogTm9kZSwKICBjb3VudDogbm9kZV9jb3VudCwK ICBlYWNoOiBub2RlX2VhY2gsCiAgZWFjaEFmdGVyOiBub2RlX2VhY2hBZnRlciwKICBlYWNoQmVm b3JlOiBub2RlX2VhY2hCZWZvcmUsCiAgc3VtOiBub2RlX3N1bSwKICBzb3J0OiBub2RlX3NvcnQs CiAgcGF0aDogbm9kZV9wYXRoLAogIGFuY2VzdG9yczogbm9kZV9hbmNlc3RvcnMsCiAgZGVzY2Vu ZGFudHM6IG5vZGVfZGVzY2VuZGFudHMsCiAgbGVhdmVzOiBub2RlX2xlYXZlcywKICBsaW5rczog bm9kZV9saW5rcywKICBjb3B5OiBub2RlX2NvcHkKfTsKCnZhciBzbGljZSQ0ID0gQXJyYXkucHJv dG90eXBlLnNsaWNlOwoKZnVuY3Rpb24gc2h1ZmZsZSQxKGFycmF5KSB7CiAgdmFyIG0gPSBhcnJh eS5sZW5ndGgsCiAgICAgIHQsCiAgICAgIGk7CgogIHdoaWxlIChtKSB7CiAgICBpID0gTWF0aC5y YW5kb20oKSAqIG0tLSB8IDA7CiAgICB0ID0gYXJyYXlbbV07CiAgICBhcnJheVttXSA9IGFycmF5 W2ldOwogICAgYXJyYXlbaV0gPSB0OwogIH0KCiAgcmV0dXJuIGFycmF5Owp9CgpmdW5jdGlvbiBl bmNsb3NlKGNpcmNsZXMpIHsKICB2YXIgaSA9IDAsIG4gPSAoY2lyY2xlcyA9IHNodWZmbGUkMShz bGljZSQ0LmNhbGwoY2lyY2xlcykpKS5sZW5ndGgsIEIgPSBbXSwgcCwgZTsKCiAgd2hpbGUgKGkg PCBuKSB7CiAgICBwID0gY2lyY2xlc1tpXTsKICAgIGlmIChlICYmIGVuY2xvc2VzV2VhayhlLCBw KSkgKytpOwogICAgZWxzZSBlID0gZW5jbG9zZUJhc2lzKEIgPSBleHRlbmRCYXNpcyhCLCBwKSks IGkgPSAwOwogIH0KCiAgcmV0dXJuIGU7Cn0KCmZ1bmN0aW9uIGV4dGVuZEJhc2lzKEIsIHApIHsK ICB2YXIgaSwgajsKCiAgaWYgKGVuY2xvc2VzV2Vha0FsbChwLCBCKSkgcmV0dXJuIFtwXTsKCiAg Ly8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBCIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudC4K ICBmb3IgKGkgPSAwOyBpIDwgQi5sZW5ndGg7ICsraSkgewogICAgaWYgKGVuY2xvc2VzTm90KHAs IEJbaV0pCiAgICAgICAgJiYgZW5jbG9zZXNXZWFrQWxsKGVuY2xvc2VCYXNpczIoQltpXSwgcCks IEIpKSB7CiAgICAgIHJldHVybiBbQltpXSwgcF07CiAgICB9CiAgfQoKICAvLyBJZiB3ZSBnZXQg aGVyZSB0aGVuIEIgbXVzdCBoYXZlIGF0IGxlYXN0IHR3byBlbGVtZW50cy4KICBmb3IgKGkgPSAw OyBpIDwgQi5sZW5ndGggLSAxOyArK2kpIHsKICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgQi5sZW5n dGg7ICsraikgewogICAgICBpZiAoZW5jbG9zZXNOb3QoZW5jbG9zZUJhc2lzMihCW2ldLCBCW2pd KSwgcCkKICAgICAgICAgICYmIGVuY2xvc2VzTm90KGVuY2xvc2VCYXNpczIoQltpXSwgcCksIEJb al0pCiAgICAgICAgICAmJiBlbmNsb3Nlc05vdChlbmNsb3NlQmFzaXMyKEJbal0sIHApLCBCW2ld KQogICAgICAgICAgJiYgZW5jbG9zZXNXZWFrQWxsKGVuY2xvc2VCYXNpczMoQltpXSwgQltqXSwg cCksIEIpKSB7CiAgICAgICAgcmV0dXJuIFtCW2ldLCBCW2pdLCBwXTsKICAgICAgfQogICAgfQog IH0KCiAgLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZy4KICB0 aHJvdyBuZXcgRXJyb3I7Cn0KCmZ1bmN0aW9uIGVuY2xvc2VzTm90KGEsIGIpIHsKICB2YXIgZHIg PSBhLnIgLSBiLnIsIGR4ID0gYi54IC0gYS54LCBkeSA9IGIueSAtIGEueTsKICByZXR1cm4gZHIg PCAwIHx8IGRyICogZHIgPCBkeCAqIGR4ICsgZHkgKiBkeTsKfQoKZnVuY3Rpb24gZW5jbG9zZXNX ZWFrKGEsIGIpIHsKICB2YXIgZHIgPSBhLnIgLSBiLnIgKyAxZS02LCBkeCA9IGIueCAtIGEueCwg ZHkgPSBiLnkgLSBhLnk7CiAgcmV0dXJuIGRyID4gMCAmJiBkciAqIGRyID4gZHggKiBkeCArIGR5 ICogZHk7Cn0KCmZ1bmN0aW9uIGVuY2xvc2VzV2Vha0FsbChhLCBCKSB7CiAgZm9yICh2YXIgaSA9 IDA7IGkgPCBCLmxlbmd0aDsgKytpKSB7CiAgICBpZiAoIWVuY2xvc2VzV2VhayhhLCBCW2ldKSkg ewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgfQogIHJldHVybiB0cnVlOwp9CgpmdW5jdGlv biBlbmNsb3NlQmFzaXMoQikgewogIHN3aXRjaCAoQi5sZW5ndGgpIHsKICAgIGNhc2UgMTogcmV0 dXJuIGVuY2xvc2VCYXNpczEoQlswXSk7CiAgICBjYXNlIDI6IHJldHVybiBlbmNsb3NlQmFzaXMy KEJbMF0sIEJbMV0pOwogICAgY2FzZSAzOiByZXR1cm4gZW5jbG9zZUJhc2lzMyhCWzBdLCBCWzFd LCBCWzJdKTsKICB9Cn0KCmZ1bmN0aW9uIGVuY2xvc2VCYXNpczEoYSkgewogIHJldHVybiB7CiAg ICB4OiBhLngsCiAgICB5OiBhLnksCiAgICByOiBhLnIKICB9Owp9CgpmdW5jdGlvbiBlbmNsb3Nl QmFzaXMyKGEsIGIpIHsKICB2YXIgeDEgPSBhLngsIHkxID0gYS55LCByMSA9IGEuciwKICAgICAg eDIgPSBiLngsIHkyID0gYi55LCByMiA9IGIuciwKICAgICAgeDIxID0geDIgLSB4MSwgeTIxID0g eTIgLSB5MSwgcjIxID0gcjIgLSByMSwKICAgICAgbCA9IE1hdGguc3FydCh4MjEgKiB4MjEgKyB5 MjEgKiB5MjEpOwogIHJldHVybiB7CiAgICB4OiAoeDEgKyB4MiArIHgyMSAvIGwgKiByMjEpIC8g MiwKICAgIHk6ICh5MSArIHkyICsgeTIxIC8gbCAqIHIyMSkgLyAyLAogICAgcjogKGwgKyByMSAr IHIyKSAvIDIKICB9Owp9CgpmdW5jdGlvbiBlbmNsb3NlQmFzaXMzKGEsIGIsIGMpIHsKICB2YXIg eDEgPSBhLngsIHkxID0gYS55LCByMSA9IGEuciwKICAgICAgeDIgPSBiLngsIHkyID0gYi55LCBy MiA9IGIuciwKICAgICAgeDMgPSBjLngsIHkzID0gYy55LCByMyA9IGMuciwKICAgICAgYTIgPSB4 MSAtIHgyLAogICAgICBhMyA9IHgxIC0geDMsCiAgICAgIGIyID0geTEgLSB5MiwKICAgICAgYjMg PSB5MSAtIHkzLAogICAgICBjMiA9IHIyIC0gcjEsCiAgICAgIGMzID0gcjMgLSByMSwKICAgICAg ZDEgPSB4MSAqIHgxICsgeTEgKiB5MSAtIHIxICogcjEsCiAgICAgIGQyID0gZDEgLSB4MiAqIHgy IC0geTIgKiB5MiArIHIyICogcjIsCiAgICAgIGQzID0gZDEgLSB4MyAqIHgzIC0geTMgKiB5MyAr IHIzICogcjMsCiAgICAgIGFiID0gYTMgKiBiMiAtIGEyICogYjMsCiAgICAgIHhhID0gKGIyICog ZDMgLSBiMyAqIGQyKSAvIChhYiAqIDIpIC0geDEsCiAgICAgIHhiID0gKGIzICogYzIgLSBiMiAq IGMzKSAvIGFiLAogICAgICB5YSA9IChhMyAqIGQyIC0gYTIgKiBkMykgLyAoYWIgKiAyKSAtIHkx LAogICAgICB5YiA9IChhMiAqIGMzIC0gYTMgKiBjMikgLyBhYiwKICAgICAgQSA9IHhiICogeGIg KyB5YiAqIHliIC0gMSwKICAgICAgQiA9IDIgKiAocjEgKyB4YSAqIHhiICsgeWEgKiB5YiksCiAg ICAgIEMgPSB4YSAqIHhhICsgeWEgKiB5YSAtIHIxICogcjEsCiAgICAgIHIgPSAtKEEgPyAoQiAr IE1hdGguc3FydChCICogQiAtIDQgKiBBICogQykpIC8gKDIgKiBBKSA6IEMgLyBCKTsKICByZXR1 cm4gewogICAgeDogeDEgKyB4YSArIHhiICogciwKICAgIHk6IHkxICsgeWEgKyB5YiAqIHIsCiAg ICByOiByCiAgfTsKfQoKZnVuY3Rpb24gcGxhY2UoYiwgYSwgYykgewogIHZhciBkeCA9IGIueCAt IGEueCwgeCwgYTIsCiAgICAgIGR5ID0gYi55IC0gYS55LCB5LCBiMiwKICAgICAgZDIgPSBkeCAq IGR4ICsgZHkgKiBkeTsKICBpZiAoZDIpIHsKICAgIGEyID0gYS5yICsgYy5yLCBhMiAqPSBhMjsK ICAgIGIyID0gYi5yICsgYy5yLCBiMiAqPSBiMjsKICAgIGlmIChhMiA+IGIyKSB7CiAgICAgIHgg PSAoZDIgKyBiMiAtIGEyKSAvICgyICogZDIpOwogICAgICB5ID0gTWF0aC5zcXJ0KE1hdGgubWF4 KDAsIGIyIC8gZDIgLSB4ICogeCkpOwogICAgICBjLnggPSBiLnggLSB4ICogZHggLSB5ICogZHk7 CiAgICAgIGMueSA9IGIueSAtIHggKiBkeSArIHkgKiBkeDsKICAgIH0gZWxzZSB7CiAgICAgIHgg PSAoZDIgKyBhMiAtIGIyKSAvICgyICogZDIpOwogICAgICB5ID0gTWF0aC5zcXJ0KE1hdGgubWF4 KDAsIGEyIC8gZDIgLSB4ICogeCkpOwogICAgICBjLnggPSBhLnggKyB4ICogZHggLSB5ICogZHk7 CiAgICAgIGMueSA9IGEueSArIHggKiBkeSArIHkgKiBkeDsKICAgIH0KICB9IGVsc2UgewogICAg Yy54ID0gYS54ICsgYy5yOwogICAgYy55ID0gYS55OwogIH0KfQoKZnVuY3Rpb24gaW50ZXJzZWN0 cyhhLCBiKSB7CiAgdmFyIGRyID0gYS5yICsgYi5yIC0gMWUtNiwgZHggPSBiLnggLSBhLngsIGR5 ID0gYi55IC0gYS55OwogIHJldHVybiBkciA+IDAgJiYgZHIgKiBkciA+IGR4ICogZHggKyBkeSAq IGR5Owp9CgpmdW5jdGlvbiBzY29yZShub2RlKSB7CiAgdmFyIGEgPSBub2RlLl8sCiAgICAgIGIg PSBub2RlLm5leHQuXywKICAgICAgYWIgPSBhLnIgKyBiLnIsCiAgICAgIGR4ID0gKGEueCAqIGIu ciArIGIueCAqIGEucikgLyBhYiwKICAgICAgZHkgPSAoYS55ICogYi5yICsgYi55ICogYS5yKSAv IGFiOwogIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTsKfQoKZnVuY3Rpb24gTm9kZSQxKGNpcmNs ZSkgewogIHRoaXMuXyA9IGNpcmNsZTsKICB0aGlzLm5leHQgPSBudWxsOwogIHRoaXMucHJldmlv dXMgPSBudWxsOwp9CgpmdW5jdGlvbiBwYWNrRW5jbG9zZShjaXJjbGVzKSB7CiAgaWYgKCEobiA9 IGNpcmNsZXMubGVuZ3RoKSkgcmV0dXJuIDA7CgogIHZhciBhLCBiLCBjLCBuLCBhYSwgY2EsIGks IGosIGssIHNqLCBzazsKCiAgLy8gUGxhY2UgdGhlIGZpcnN0IGNpcmNsZS4KICBhID0gY2lyY2xl c1swXSwgYS54ID0gMCwgYS55ID0gMDsKICBpZiAoIShuID4gMSkpIHJldHVybiBhLnI7CgogIC8v IFBsYWNlIHRoZSBzZWNvbmQgY2lyY2xlLgogIGIgPSBjaXJjbGVzWzFdLCBhLnggPSAtYi5yLCBi LnggPSBhLnIsIGIueSA9IDA7CiAgaWYgKCEobiA+IDIpKSByZXR1cm4gYS5yICsgYi5yOwoKICAv LyBQbGFjZSB0aGUgdGhpcmQgY2lyY2xlLgogIHBsYWNlKGIsIGEsIGMgPSBjaXJjbGVzWzJdKTsK CiAgLy8gSW5pdGlhbGl6ZSB0aGUgZnJvbnQtY2hhaW4gdXNpbmcgdGhlIGZpcnN0IHRocmVlIGNp cmNsZXMgYSwgYiBhbmQgYy4KICBhID0gbmV3IE5vZGUkMShhKSwgYiA9IG5ldyBOb2RlJDEoYiks IGMgPSBuZXcgTm9kZSQxKGMpOwogIGEubmV4dCA9IGMucHJldmlvdXMgPSBiOwogIGIubmV4dCA9 IGEucHJldmlvdXMgPSBjOwogIGMubmV4dCA9IGIucHJldmlvdXMgPSBhOwoKICAvLyBBdHRlbXB0 IHRvIHBsYWNlIGVhY2ggcmVtYWluaW5nIGNpcmNsZeKApgogIHBhY2s6IGZvciAoaSA9IDM7IGkg PCBuOyArK2kpIHsKICAgIHBsYWNlKGEuXywgYi5fLCBjID0gY2lyY2xlc1tpXSksIGMgPSBuZXcg Tm9kZSQxKGMpOwoKICAgIC8vIEZpbmQgdGhlIGNsb3Nlc3QgaW50ZXJzZWN0aW5nIGNpcmNsZSBv biB0aGUgZnJvbnQtY2hhaW4sIGlmIGFueS4KICAgIC8vIOKAnENsb3NlbmVzc+KAnSBpcyBkZXRl cm1pbmVkIGJ5IGxpbmVhciBkaXN0YW5jZSBhbG9uZyB0aGUgZnJvbnQtY2hhaW4uCiAgICAvLyDi gJxBaGVhZOKAnSBvciDigJxiZWhpbmTigJ0gaXMgbGlrZXdpc2UgZGV0ZXJtaW5lZCBieSBsaW5l YXIgZGlzdGFuY2UuCiAgICBqID0gYi5uZXh0LCBrID0gYS5wcmV2aW91cywgc2ogPSBiLl8uciwg c2sgPSBhLl8ucjsKICAgIGRvIHsKICAgICAgaWYgKHNqIDw9IHNrKSB7CiAgICAgICAgaWYgKGlu dGVyc2VjdHMoai5fLCBjLl8pKSB7CiAgICAgICAgICBiID0gaiwgYS5uZXh0ID0gYiwgYi5wcmV2 aW91cyA9IGEsIC0taTsKICAgICAgICAgIGNvbnRpbnVlIHBhY2s7CiAgICAgICAgfQogICAgICAg IHNqICs9IGouXy5yLCBqID0gai5uZXh0OwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChpbnRl cnNlY3RzKGsuXywgYy5fKSkgewogICAgICAgICAgYSA9IGssIGEubmV4dCA9IGIsIGIucHJldmlv dXMgPSBhLCAtLWk7CiAgICAgICAgICBjb250aW51ZSBwYWNrOwogICAgICAgIH0KICAgICAgICBz ayArPSBrLl8uciwgayA9IGsucHJldmlvdXM7CiAgICAgIH0KICAgIH0gd2hpbGUgKGogIT09IGsu bmV4dCk7CgogICAgLy8gU3VjY2VzcyEgSW5zZXJ0IHRoZSBuZXcgY2lyY2xlIGMgYmV0d2VlbiBh IGFuZCBiLgogICAgYy5wcmV2aW91cyA9IGEsIGMubmV4dCA9IGIsIGEubmV4dCA9IGIucHJldmlv dXMgPSBiID0gYzsKCiAgICAvLyBDb21wdXRlIHRoZSBuZXcgY2xvc2VzdCBjaXJjbGUgcGFpciB0 byB0aGUgY2VudHJvaWQuCiAgICBhYSA9IHNjb3JlKGEpOwogICAgd2hpbGUgKChjID0gYy5uZXh0 KSAhPT0gYikgewogICAgICBpZiAoKGNhID0gc2NvcmUoYykpIDwgYWEpIHsKICAgICAgICBhID0g YywgYWEgPSBjYTsKICAgICAgfQogICAgfQogICAgYiA9IGEubmV4dDsKICB9CgogIC8vIENvbXB1 dGUgdGhlIGVuY2xvc2luZyBjaXJjbGUgb2YgdGhlIGZyb250IGNoYWluLgogIGEgPSBbYi5fXSwg YyA9IGI7IHdoaWxlICgoYyA9IGMubmV4dCkgIT09IGIpIGEucHVzaChjLl8pOyBjID0gZW5jbG9z ZShhKTsKCiAgLy8gVHJhbnNsYXRlIHRoZSBjaXJjbGVzIHRvIHB1dCB0aGUgZW5jbG9zaW5nIGNp cmNsZSBhcm91bmQgdGhlIG9yaWdpbi4KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBhID0gY2ly Y2xlc1tpXSwgYS54IC09IGMueCwgYS55IC09IGMueTsKCiAgcmV0dXJuIGMucjsKfQoKZnVuY3Rp b24gc2libGluZ3MoY2lyY2xlcykgewogIHBhY2tFbmNsb3NlKGNpcmNsZXMpOwogIHJldHVybiBj aXJjbGVzOwp9CgpmdW5jdGlvbiBvcHRpb25hbChmKSB7CiAgcmV0dXJuIGYgPT0gbnVsbCA/IG51 bGwgOiByZXF1aXJlZChmKTsKfQoKZnVuY3Rpb24gcmVxdWlyZWQoZikgewogIGlmICh0eXBlb2Yg ZiAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogIHJldHVybiBmOwp9CgpmdW5jdGlv biBjb25zdGFudFplcm8oKSB7CiAgcmV0dXJuIDA7Cn0KCmZ1bmN0aW9uIGNvbnN0YW50JDkoeCkg ewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB4OwogIH07Cn0KCmZ1bmN0aW9uIGRl ZmF1bHRSYWRpdXMkMShkKSB7CiAgcmV0dXJuIE1hdGguc3FydChkLnZhbHVlKTsKfQoKZnVuY3Rp b24gaW5kZXgkMigpIHsKICB2YXIgcmFkaXVzID0gbnVsbCwKICAgICAgZHggPSAxLAogICAgICBk eSA9IDEsCiAgICAgIHBhZGRpbmcgPSBjb25zdGFudFplcm87CgogIGZ1bmN0aW9uIHBhY2socm9v dCkgewogICAgcm9vdC54ID0gZHggLyAyLCByb290LnkgPSBkeSAvIDI7CiAgICBpZiAocmFkaXVz KSB7CiAgICAgIHJvb3QuZWFjaEJlZm9yZShyYWRpdXNMZWFmKHJhZGl1cykpCiAgICAgICAgICAu ZWFjaEFmdGVyKHBhY2tDaGlsZHJlbihwYWRkaW5nLCAwLjUpKQogICAgICAgICAgLmVhY2hCZWZv cmUodHJhbnNsYXRlQ2hpbGQoMSkpOwogICAgfSBlbHNlIHsKICAgICAgcm9vdC5lYWNoQmVmb3Jl KHJhZGl1c0xlYWYoZGVmYXVsdFJhZGl1cyQxKSkKICAgICAgICAgIC5lYWNoQWZ0ZXIocGFja0No aWxkcmVuKGNvbnN0YW50WmVybywgMSkpCiAgICAgICAgICAuZWFjaEFmdGVyKHBhY2tDaGlsZHJl bihwYWRkaW5nLCByb290LnIgLyBNYXRoLm1pbihkeCwgZHkpKSkKICAgICAgICAgIC5lYWNoQmVm b3JlKHRyYW5zbGF0ZUNoaWxkKE1hdGgubWluKGR4LCBkeSkgLyAoMiAqIHJvb3QucikpKTsKICAg IH0KICAgIHJldHVybiByb290OwogIH0KCiAgcGFjay5yYWRpdXMgPSBmdW5jdGlvbih4KSB7CiAg ICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYWRpdXMgPSBvcHRpb25hbCh4KSwgcGFjaykg OiByYWRpdXM7CiAgfTsKCiAgcGFjay5zaXplID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFy Z3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgcGFjaykgOiBbZHgsIGR5 XTsKICB9OwoKICBwYWNrLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1l bnRzLmxlbmd0aCA/IChwYWRkaW5nID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29u c3RhbnQkOSgreCksIHBhY2spIDogcGFkZGluZzsKICB9OwoKICByZXR1cm4gcGFjazsKfQoKZnVu Y3Rpb24gcmFkaXVzTGVhZihyYWRpdXMpIHsKICByZXR1cm4gZnVuY3Rpb24obm9kZSkgewogICAg aWYgKCFub2RlLmNoaWxkcmVuKSB7CiAgICAgIG5vZGUuciA9IE1hdGgubWF4KDAsICtyYWRpdXMo bm9kZSkgfHwgMCk7CiAgICB9CiAgfTsKfQoKZnVuY3Rpb24gcGFja0NoaWxkcmVuKHBhZGRpbmcs IGspIHsKICByZXR1cm4gZnVuY3Rpb24obm9kZSkgewogICAgaWYgKGNoaWxkcmVuID0gbm9kZS5j aGlsZHJlbikgewogICAgICB2YXIgY2hpbGRyZW4sCiAgICAgICAgICBpLAogICAgICAgICAgbiA9 IGNoaWxkcmVuLmxlbmd0aCwKICAgICAgICAgIHIgPSBwYWRkaW5nKG5vZGUpICogayB8fCAwLAog ICAgICAgICAgZTsKCiAgICAgIGlmIChyKSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjaGlsZHJl bltpXS5yICs9IHI7CiAgICAgIGUgPSBwYWNrRW5jbG9zZShjaGlsZHJlbik7CiAgICAgIGlmIChy KSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjaGlsZHJlbltpXS5yIC09IHI7CiAgICAgIG5vZGUu ciA9IGUgKyByOwogICAgfQogIH07Cn0KCmZ1bmN0aW9uIHRyYW5zbGF0ZUNoaWxkKGspIHsKICBy ZXR1cm4gZnVuY3Rpb24obm9kZSkgewogICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50OwogICAg bm9kZS5yICo9IGs7CiAgICBpZiAocGFyZW50KSB7CiAgICAgIG5vZGUueCA9IHBhcmVudC54ICsg ayAqIG5vZGUueDsKICAgICAgbm9kZS55ID0gcGFyZW50LnkgKyBrICogbm9kZS55OwogICAgfQog IH07Cn0KCmZ1bmN0aW9uIHJvdW5kTm9kZShub2RlKSB7CiAgbm9kZS54MCA9IE1hdGgucm91bmQo bm9kZS54MCk7CiAgbm9kZS55MCA9IE1hdGgucm91bmQobm9kZS55MCk7CiAgbm9kZS54MSA9IE1h dGgucm91bmQobm9kZS54MSk7CiAgbm9kZS55MSA9IE1hdGgucm91bmQobm9kZS55MSk7Cn0KCmZ1 bmN0aW9uIHRyZWVtYXBEaWNlKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsKICB2YXIgbm9kZXMg PSBwYXJlbnQuY2hpbGRyZW4sCiAgICAgIG5vZGUsCiAgICAgIGkgPSAtMSwKICAgICAgbiA9IG5v ZGVzLmxlbmd0aCwKICAgICAgayA9IHBhcmVudC52YWx1ZSAmJiAoeDEgLSB4MCkgLyBwYXJlbnQu dmFsdWU7CgogIHdoaWxlICgrK2kgPCBuKSB7CiAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueTAg PSB5MCwgbm9kZS55MSA9IHkxOwogICAgbm9kZS54MCA9IHgwLCBub2RlLngxID0geDAgKz0gbm9k ZS52YWx1ZSAqIGs7CiAgfQp9CgpmdW5jdGlvbiBwYXJ0aXRpb24oKSB7CiAgdmFyIGR4ID0gMSwK ICAgICAgZHkgPSAxLAogICAgICBwYWRkaW5nID0gMCwKICAgICAgcm91bmQgPSBmYWxzZTsKCiAg ZnVuY3Rpb24gcGFydGl0aW9uKHJvb3QpIHsKICAgIHZhciBuID0gcm9vdC5oZWlnaHQgKyAxOwog ICAgcm9vdC54MCA9CiAgICByb290LnkwID0gcGFkZGluZzsKICAgIHJvb3QueDEgPSBkeDsKICAg IHJvb3QueTEgPSBkeSAvIG47CiAgICByb290LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKGR5LCBu KSk7CiAgICBpZiAocm91bmQpIHJvb3QuZWFjaEJlZm9yZShyb3VuZE5vZGUpOwogICAgcmV0dXJu IHJvb3Q7CiAgfQoKICBmdW5jdGlvbiBwb3NpdGlvbk5vZGUoZHksIG4pIHsKICAgIHJldHVybiBm dW5jdGlvbihub2RlKSB7CiAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7CiAgICAgICAgdHJlZW1h cERpY2Uobm9kZSwgbm9kZS54MCwgZHkgKiAobm9kZS5kZXB0aCArIDEpIC8gbiwgbm9kZS54MSwg ZHkgKiAobm9kZS5kZXB0aCArIDIpIC8gbik7CiAgICAgIH0KICAgICAgdmFyIHgwID0gbm9kZS54 MCwKICAgICAgICAgIHkwID0gbm9kZS55MCwKICAgICAgICAgIHgxID0gbm9kZS54MSAtIHBhZGRp bmcsCiAgICAgICAgICB5MSA9IG5vZGUueTEgLSBwYWRkaW5nOwogICAgICBpZiAoeDEgPCB4MCkg eDAgPSB4MSA9ICh4MCArIHgxKSAvIDI7CiAgICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkw ICsgeTEpIC8gMjsKICAgICAgbm9kZS54MCA9IHgwOwogICAgICBub2RlLnkwID0geTA7CiAgICAg IG5vZGUueDEgPSB4MTsKICAgICAgbm9kZS55MSA9IHkxOwogICAgfTsKICB9CgogIHBhcnRpdGlv bi5yb3VuZCA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJv dW5kID0gISF4LCBwYXJ0aXRpb24pIDogcm91bmQ7CiAgfTsKCiAgcGFydGl0aW9uLnNpemUgPSBm dW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBk eSA9ICt4WzFdLCBwYXJ0aXRpb24pIDogW2R4LCBkeV07CiAgfTsKCiAgcGFydGl0aW9uLnBhZGRp bmcgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5n ID0gK3gsIHBhcnRpdGlvbikgOiBwYWRkaW5nOwogIH07CgogIHJldHVybiBwYXJ0aXRpb247Cn0K CnZhciBrZXlQcmVmaXgkMSA9ICIkIiwgLy8gUHJvdGVjdCBhZ2FpbnN0IGtleXMgbGlrZSDigJxf X3Byb3RvX1/igJ0uCiAgICBwcmVyb290ID0ge2RlcHRoOiAtMX0sCiAgICBhbWJpZ3VvdXMgPSB7 fTsKCmZ1bmN0aW9uIGRlZmF1bHRJZChkKSB7CiAgcmV0dXJuIGQuaWQ7Cn0KCmZ1bmN0aW9uIGRl ZmF1bHRQYXJlbnRJZChkKSB7CiAgcmV0dXJuIGQucGFyZW50SWQ7Cn0KCmZ1bmN0aW9uIHN0cmF0 aWZ5KCkgewogIHZhciBpZCA9IGRlZmF1bHRJZCwKICAgICAgcGFyZW50SWQgPSBkZWZhdWx0UGFy ZW50SWQ7CgogIGZ1bmN0aW9uIHN0cmF0aWZ5KGRhdGEpIHsKICAgIHZhciBkLAogICAgICAgIGks CiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLAogICAgICAgIHJvb3QsCiAgICAgICAgcGFyZW50LAog ICAgICAgIG5vZGUsCiAgICAgICAgbm9kZXMgPSBuZXcgQXJyYXkobiksCiAgICAgICAgbm9kZUlk LAogICAgICAgIG5vZGVLZXksCiAgICAgICAgbm9kZUJ5S2V5ID0ge307CgogICAgZm9yIChpID0g MDsgaSA8IG47ICsraSkgewogICAgICBkID0gZGF0YVtpXSwgbm9kZSA9IG5vZGVzW2ldID0gbmV3 IE5vZGUoZCk7CiAgICAgIGlmICgobm9kZUlkID0gaWQoZCwgaSwgZGF0YSkpICE9IG51bGwgJiYg KG5vZGVJZCArPSAiIikpIHsKICAgICAgICBub2RlS2V5ID0ga2V5UHJlZml4JDEgKyAobm9kZS5p ZCA9IG5vZGVJZCk7CiAgICAgICAgbm9kZUJ5S2V5W25vZGVLZXldID0gbm9kZUtleSBpbiBub2Rl QnlLZXkgPyBhbWJpZ3VvdXMgOiBub2RlOwogICAgICB9CiAgICB9CgogICAgZm9yIChpID0gMDsg aSA8IG47ICsraSkgewogICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGVJZCA9IHBhcmVudElkKGRh dGFbaV0sIGksIGRhdGEpOwogICAgICBpZiAobm9kZUlkID09IG51bGwgfHwgIShub2RlSWQgKz0g IiIpKSB7CiAgICAgICAgaWYgKHJvb3QpIHRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMi KTsKICAgICAgICByb290ID0gbm9kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXJlbnQgPSBu b2RlQnlLZXlba2V5UHJlZml4JDEgKyBub2RlSWRdOwogICAgICAgIGlmICghcGFyZW50KSB0aHJv dyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIgKyBub2RlSWQpOwogICAgICAgIGlmIChwYXJlbnQgPT09 IGFtYmlndW91cykgdGhyb3cgbmV3IEVycm9yKCJhbWJpZ3VvdXM6ICIgKyBub2RlSWQpOwogICAg ICAgIGlmIChwYXJlbnQuY2hpbGRyZW4pIHBhcmVudC5jaGlsZHJlbi5wdXNoKG5vZGUpOwogICAg ICAgIGVsc2UgcGFyZW50LmNoaWxkcmVuID0gW25vZGVdOwogICAgICAgIG5vZGUucGFyZW50ID0g cGFyZW50OwogICAgICB9CiAgICB9CgogICAgaWYgKCFyb290KSB0aHJvdyBuZXcgRXJyb3IoIm5v IHJvb3QiKTsKICAgIHJvb3QucGFyZW50ID0gcHJlcm9vdDsKICAgIHJvb3QuZWFjaEJlZm9yZShm dW5jdGlvbihub2RlKSB7IG5vZGUuZGVwdGggPSBub2RlLnBhcmVudC5kZXB0aCArIDE7IC0tbjsg fSkuZWFjaEJlZm9yZShjb21wdXRlSGVpZ2h0KTsKICAgIHJvb3QucGFyZW50ID0gbnVsbDsKICAg IGlmIChuID4gMCkgdGhyb3cgbmV3IEVycm9yKCJjeWNsZSIpOwoKICAgIHJldHVybiByb290Owog IH0KCiAgc3RyYXRpZnkuaWQgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA/IChpZCA9IHJlcXVpcmVkKHgpLCBzdHJhdGlmeSkgOiBpZDsKICB9OwoKICBzdHJhdGlm eS5wYXJlbnRJZCA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8g KHBhcmVudElkID0gcmVxdWlyZWQoeCksIHN0cmF0aWZ5KSA6IHBhcmVudElkOwogIH07CgogIHJl dHVybiBzdHJhdGlmeTsKfQoKZnVuY3Rpb24gZGVmYXVsdFNlcGFyYXRpb24kMShhLCBiKSB7CiAg cmV0dXJuIGEucGFyZW50ID09PSBiLnBhcmVudCA/IDEgOiAyOwp9CgovLyBmdW5jdGlvbiByYWRp YWxTZXBhcmF0aW9uKGEsIGIpIHsKLy8gICByZXR1cm4gKGEucGFyZW50ID09PSBiLnBhcmVudCA/ IDEgOiAyKSAvIGEuZGVwdGg7Ci8vIH0KCi8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB0cmF2 ZXJzZSB0aGUgbGVmdCBjb250b3VyIG9mIGEgc3VidHJlZSAob3IKLy8gc3ViZm9yZXN0KS4gSXQg cmV0dXJucyB0aGUgc3VjY2Vzc29yIG9mIHYgb24gdGhpcyBjb250b3VyLiBUaGlzIHN1Y2Nlc3Nv ciBpcwovLyBlaXRoZXIgZ2l2ZW4gYnkgdGhlIGxlZnRtb3N0IGNoaWxkIG9mIHYgb3IgYnkgdGhl IHRocmVhZCBvZiB2LiBUaGUgZnVuY3Rpb24KLy8gcmV0dXJucyBudWxsIGlmIGFuZCBvbmx5IGlm IHYgaXMgb24gdGhlIGhpZ2hlc3QgbGV2ZWwgb2YgaXRzIHN1YnRyZWUuCmZ1bmN0aW9uIG5leHRM ZWZ0KHYpIHsKICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuOwogIHJldHVybiBjaGlsZHJlbiA/ IGNoaWxkcmVuWzBdIDogdi50Owp9CgovLyBUaGlzIGZ1bmN0aW9uIHdvcmtzIGFuYWxvZ291c2x5 IHRvIG5leHRMZWZ0LgpmdW5jdGlvbiBuZXh0UmlnaHQodikgewogIHZhciBjaGlsZHJlbiA9IHYu Y2hpbGRyZW47CiAgcmV0dXJuIGNoaWxkcmVuID8gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0g MV0gOiB2LnQ7Cn0KCi8vIFNoaWZ0cyB0aGUgY3VycmVudCBzdWJ0cmVlIHJvb3RlZCBhdCB3Ky4g VGhpcyBpcyBkb25lIGJ5IGluY3JlYXNpbmcKLy8gcHJlbGltKHcrKSBhbmQgbW9kKHcrKSBieSBz aGlmdC4KZnVuY3Rpb24gbW92ZVN1YnRyZWUod20sIHdwLCBzaGlmdCkgewogIHZhciBjaGFuZ2Ug PSBzaGlmdCAvICh3cC5pIC0gd20uaSk7CiAgd3AuYyAtPSBjaGFuZ2U7CiAgd3AucyArPSBzaGlm dDsKICB3bS5jICs9IGNoYW5nZTsKICB3cC56ICs9IHNoaWZ0OwogIHdwLm0gKz0gc2hpZnQ7Cn0K Ci8vIEFsbCBvdGhlciBzaGlmdHMsIGFwcGxpZWQgdG8gdGhlIHNtYWxsZXIgc3VidHJlZXMgYmV0 d2VlbiB3LSBhbmQgdyssIGFyZQovLyBwZXJmb3JtZWQgYnkgdGhpcyBmdW5jdGlvbi4gVG8gcHJl cGFyZSB0aGUgc2hpZnRzLCB3ZSBoYXZlIHRvIGFkanVzdAovLyBjaGFuZ2UodyspLCBzaGlmdCh3 KyksIGFuZCBjaGFuZ2Uody0pLgpmdW5jdGlvbiBleGVjdXRlU2hpZnRzKHYpIHsKICB2YXIgc2hp ZnQgPSAwLAogICAgICBjaGFuZ2UgPSAwLAogICAgICBjaGlsZHJlbiA9IHYuY2hpbGRyZW4sCiAg ICAgIGkgPSBjaGlsZHJlbi5sZW5ndGgsCiAgICAgIHc7CiAgd2hpbGUgKC0taSA+PSAwKSB7CiAg ICB3ID0gY2hpbGRyZW5baV07CiAgICB3LnogKz0gc2hpZnQ7CiAgICB3Lm0gKz0gc2hpZnQ7CiAg ICBzaGlmdCArPSB3LnMgKyAoY2hhbmdlICs9IHcuYyk7CiAgfQp9CgovLyBJZiB2aS3igJlzIGFu Y2VzdG9yIGlzIGEgc2libGluZyBvZiB2LCByZXR1cm5zIHZpLeKAmXMgYW5jZXN0b3IuIE90aGVy d2lzZSwKLy8gcmV0dXJucyB0aGUgc3BlY2lmaWVkIChkZWZhdWx0KSBhbmNlc3Rvci4KZnVuY3Rp b24gbmV4dEFuY2VzdG9yKHZpbSwgdiwgYW5jZXN0b3IpIHsKICByZXR1cm4gdmltLmEucGFyZW50 ID09PSB2LnBhcmVudCA/IHZpbS5hIDogYW5jZXN0b3I7Cn0KCmZ1bmN0aW9uIFRyZWVOb2RlKG5v ZGUsIGkpIHsKICB0aGlzLl8gPSBub2RlOwogIHRoaXMucGFyZW50ID0gbnVsbDsKICB0aGlzLmNo aWxkcmVuID0gbnVsbDsKICB0aGlzLkEgPSBudWxsOyAvLyBkZWZhdWx0IGFuY2VzdG9yCiAgdGhp cy5hID0gdGhpczsgLy8gYW5jZXN0b3IKICB0aGlzLnogPSAwOyAvLyBwcmVsaW0KICB0aGlzLm0g PSAwOyAvLyBtb2QKICB0aGlzLmMgPSAwOyAvLyBjaGFuZ2UKICB0aGlzLnMgPSAwOyAvLyBzaGlm dAogIHRoaXMudCA9IG51bGw7IC8vIHRocmVhZAogIHRoaXMuaSA9IGk7IC8vIG51bWJlcgp9CgpU cmVlTm9kZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE5vZGUucHJvdG90eXBlKTsKCmZ1bmN0 aW9uIHRyZWVSb290KHJvb3QpIHsKICB2YXIgdHJlZSA9IG5ldyBUcmVlTm9kZShyb290LCAwKSwK ICAgICAgbm9kZSwKICAgICAgbm9kZXMgPSBbdHJlZV0sCiAgICAgIGNoaWxkLAogICAgICBjaGls ZHJlbiwKICAgICAgaSwKICAgICAgbjsKCiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkgewog ICAgaWYgKGNoaWxkcmVuID0gbm9kZS5fLmNoaWxkcmVuKSB7CiAgICAgIG5vZGUuY2hpbGRyZW4g PSBuZXcgQXJyYXkobiA9IGNoaWxkcmVuLmxlbmd0aCk7CiAgICAgIGZvciAoaSA9IG4gLSAxOyBp ID49IDA7IC0taSkgewogICAgICAgIG5vZGVzLnB1c2goY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ld ID0gbmV3IFRyZWVOb2RlKGNoaWxkcmVuW2ldLCBpKSk7CiAgICAgICAgY2hpbGQucGFyZW50ID0g bm9kZTsKICAgICAgfQogICAgfQogIH0KCiAgKHRyZWUucGFyZW50ID0gbmV3IFRyZWVOb2RlKG51 bGwsIDApKS5jaGlsZHJlbiA9IFt0cmVlXTsKICByZXR1cm4gdHJlZTsKfQoKLy8gTm9kZS1saW5r IHRyZWUgZGlhZ3JhbSB1c2luZyB0aGUgUmVpbmdvbGQtVGlsZm9yZCAidGlkeSIgYWxnb3JpdGht CmZ1bmN0aW9uIHRyZWUoKSB7CiAgdmFyIHNlcGFyYXRpb24gPSBkZWZhdWx0U2VwYXJhdGlvbiQx LAogICAgICBkeCA9IDEsCiAgICAgIGR5ID0gMSwKICAgICAgbm9kZVNpemUgPSBudWxsOwoKICBm dW5jdGlvbiB0cmVlKHJvb3QpIHsKICAgIHZhciB0ID0gdHJlZVJvb3Qocm9vdCk7CgogICAgLy8g Q29tcHV0ZSB0aGUgbGF5b3V0IHVzaW5nIEJ1Y2hoZWltIGV0IGFsLuKAmXMgYWxnb3JpdGhtLgog ICAgdC5lYWNoQWZ0ZXIoZmlyc3RXYWxrKSwgdC5wYXJlbnQubSA9IC10Lno7CiAgICB0LmVhY2hC ZWZvcmUoc2Vjb25kV2Fsayk7CgogICAgLy8gSWYgYSBmaXhlZCBub2RlIHNpemUgaXMgc3BlY2lm aWVkLCBzY2FsZSB4IGFuZCB5LgogICAgaWYgKG5vZGVTaXplKSByb290LmVhY2hCZWZvcmUoc2l6 ZU5vZGUpOwoKICAgIC8vIElmIGEgZml4ZWQgdHJlZSBzaXplIGlzIHNwZWNpZmllZCwgc2NhbGUg eCBhbmQgeSBiYXNlZCBvbiB0aGUgZXh0ZW50LgogICAgLy8gQ29tcHV0ZSB0aGUgbGVmdC1tb3N0 LCByaWdodC1tb3N0LCBhbmQgZGVwdGgtbW9zdCBub2RlcyBmb3IgZXh0ZW50cy4KICAgIGVsc2Ug ewogICAgICB2YXIgbGVmdCA9IHJvb3QsCiAgICAgICAgICByaWdodCA9IHJvb3QsCiAgICAgICAg ICBib3R0b20gPSByb290OwogICAgICByb290LmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkgewog ICAgICAgIGlmIChub2RlLnggPCBsZWZ0LngpIGxlZnQgPSBub2RlOwogICAgICAgIGlmIChub2Rl LnggPiByaWdodC54KSByaWdodCA9IG5vZGU7CiAgICAgICAgaWYgKG5vZGUuZGVwdGggPiBib3R0 b20uZGVwdGgpIGJvdHRvbSA9IG5vZGU7CiAgICAgIH0pOwogICAgICB2YXIgcyA9IGxlZnQgPT09 IHJpZ2h0ID8gMSA6IHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiwKICAgICAgICAgIHR4ID0g cyAtIGxlZnQueCwKICAgICAgICAgIGt4ID0gZHggLyAocmlnaHQueCArIHMgKyB0eCksCiAgICAg ICAgICBreSA9IGR5IC8gKGJvdHRvbS5kZXB0aCB8fCAxKTsKICAgICAgcm9vdC5lYWNoQmVmb3Jl KGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICBub2RlLnggPSAobm9kZS54ICsgdHgpICoga3g7CiAg ICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIGt5OwogICAgICB9KTsKICAgIH0KCiAgICByZXR1 cm4gcm9vdDsKICB9CgogIC8vIENvbXB1dGVzIGEgcHJlbGltaW5hcnkgeC1jb29yZGluYXRlIGZv ciB2LiBCZWZvcmUgdGhhdCwgRklSU1QgV0FMSyBpcwogIC8vIGFwcGxpZWQgcmVjdXJzaXZlbHkg dG8gdGhlIGNoaWxkcmVuIG9mIHYsIGFzIHdlbGwgYXMgdGhlIGZ1bmN0aW9uCiAgLy8gQVBQT1JU SU9OLiBBZnRlciBzcGFjaW5nIG91dCB0aGUgY2hpbGRyZW4gYnkgY2FsbGluZyBFWEVDVVRFIFNI SUZUUywgdGhlCiAgLy8gbm9kZSB2IGlzIHBsYWNlZCB0byB0aGUgbWlkcG9pbnQgb2YgaXRzIG91 dGVybW9zdCBjaGlsZHJlbi4KICBmdW5jdGlvbiBmaXJzdFdhbGsodikgewogICAgdmFyIGNoaWxk cmVuID0gdi5jaGlsZHJlbiwKICAgICAgICBzaWJsaW5ncyA9IHYucGFyZW50LmNoaWxkcmVuLAog ICAgICAgIHcgPSB2LmkgPyBzaWJsaW5nc1t2LmkgLSAxXSA6IG51bGw7CiAgICBpZiAoY2hpbGRy ZW4pIHsKICAgICAgZXhlY3V0ZVNoaWZ0cyh2KTsKICAgICAgdmFyIG1pZHBvaW50ID0gKGNoaWxk cmVuWzBdLnogKyBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXS56KSAvIDI7CiAgICAgIGlm ICh3KSB7CiAgICAgICAgdi56ID0gdy56ICsgc2VwYXJhdGlvbih2Ll8sIHcuXyk7CiAgICAgICAg di5tID0gdi56IC0gbWlkcG9pbnQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdi56ID0gbWlkcG9p bnQ7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodykgewogICAgICB2LnogPSB3LnogKyBzZXBhcmF0 aW9uKHYuXywgdy5fKTsKICAgIH0KICAgIHYucGFyZW50LkEgPSBhcHBvcnRpb24odiwgdywgdi5w YXJlbnQuQSB8fCBzaWJsaW5nc1swXSk7CiAgfQoKICAvLyBDb21wdXRlcyBhbGwgcmVhbCB4LWNv b3JkaW5hdGVzIGJ5IHN1bW1pbmcgdXAgdGhlIG1vZGlmaWVycyByZWN1cnNpdmVseS4KICBmdW5j dGlvbiBzZWNvbmRXYWxrKHYpIHsKICAgIHYuXy54ID0gdi56ICsgdi5wYXJlbnQubTsKICAgIHYu bSArPSB2LnBhcmVudC5tOwogIH0KCiAgLy8gVGhlIGNvcmUgb2YgdGhlIGFsZ29yaXRobS4gSGVy ZSwgYSBuZXcgc3VidHJlZSBpcyBjb21iaW5lZCB3aXRoIHRoZQogIC8vIHByZXZpb3VzIHN1YnRy ZWVzLiBUaHJlYWRzIGFyZSB1c2VkIHRvIHRyYXZlcnNlIHRoZSBpbnNpZGUgYW5kIG91dHNpZGUK ICAvLyBjb250b3VycyBvZiB0aGUgbGVmdCBhbmQgcmlnaHQgc3VidHJlZSB1cCB0byB0aGUgaGln aGVzdCBjb21tb24gbGV2ZWwuIFRoZQogIC8vIHZlcnRpY2VzIHVzZWQgZm9yIHRoZSB0cmF2ZXJz YWxzIGFyZSB2aSssIHZpLSwgdm8tLCBhbmQgdm8rLCB3aGVyZSB0aGUKICAvLyBzdXBlcnNjcmlw dCBvIG1lYW5zIG91dHNpZGUgYW5kIGkgbWVhbnMgaW5zaWRlLCB0aGUgc3Vic2NyaXB0IC0gbWVh bnMgbGVmdAogIC8vIHN1YnRyZWUgYW5kICsgbWVhbnMgcmlnaHQgc3VidHJlZS4gRm9yIHN1bW1p bmcgdXAgdGhlIG1vZGlmaWVycyBhbG9uZyB0aGUKICAvLyBjb250b3VyLCB3ZSB1c2UgcmVzcGVj dGl2ZSB2YXJpYWJsZXMgc2krLCBzaS0sIHNvLSwgYW5kIHNvKy4gV2hlbmV2ZXIgdHdvCiAgLy8g bm9kZXMgb2YgdGhlIGluc2lkZSBjb250b3VycyBjb25mbGljdCwgd2UgY29tcHV0ZSB0aGUgbGVm dCBvbmUgb2YgdGhlCiAgLy8gZ3JlYXRlc3QgdW5jb21tb24gYW5jZXN0b3JzIHVzaW5nIHRoZSBm dW5jdGlvbiBBTkNFU1RPUiBhbmQgY2FsbCBNT1ZFCiAgLy8gU1VCVFJFRSB0byBzaGlmdCB0aGUg c3VidHJlZSBhbmQgcHJlcGFyZSB0aGUgc2hpZnRzIG9mIHNtYWxsZXIgc3VidHJlZXMuCiAgLy8g RmluYWxseSwgd2UgYWRkIGEgbmV3IHRocmVhZCAoaWYgbmVjZXNzYXJ5KS4KICBmdW5jdGlvbiBh cHBvcnRpb24odiwgdywgYW5jZXN0b3IpIHsKICAgIGlmICh3KSB7CiAgICAgIHZhciB2aXAgPSB2 LAogICAgICAgICAgdm9wID0gdiwKICAgICAgICAgIHZpbSA9IHcsCiAgICAgICAgICB2b20gPSB2 aXAucGFyZW50LmNoaWxkcmVuWzBdLAogICAgICAgICAgc2lwID0gdmlwLm0sCiAgICAgICAgICBz b3AgPSB2b3AubSwKICAgICAgICAgIHNpbSA9IHZpbS5tLAogICAgICAgICAgc29tID0gdm9tLm0s CiAgICAgICAgICBzaGlmdDsKICAgICAgd2hpbGUgKHZpbSA9IG5leHRSaWdodCh2aW0pLCB2aXAg PSBuZXh0TGVmdCh2aXApLCB2aW0gJiYgdmlwKSB7CiAgICAgICAgdm9tID0gbmV4dExlZnQodm9t KTsKICAgICAgICB2b3AgPSBuZXh0UmlnaHQodm9wKTsKICAgICAgICB2b3AuYSA9IHY7CiAgICAg ICAgc2hpZnQgPSB2aW0ueiArIHNpbSAtIHZpcC56IC0gc2lwICsgc2VwYXJhdGlvbih2aW0uXywg dmlwLl8pOwogICAgICAgIGlmIChzaGlmdCA+IDApIHsKICAgICAgICAgIG1vdmVTdWJ0cmVlKG5l eHRBbmNlc3Rvcih2aW0sIHYsIGFuY2VzdG9yKSwgdiwgc2hpZnQpOwogICAgICAgICAgc2lwICs9 IHNoaWZ0OwogICAgICAgICAgc29wICs9IHNoaWZ0OwogICAgICAgIH0KICAgICAgICBzaW0gKz0g dmltLm07CiAgICAgICAgc2lwICs9IHZpcC5tOwogICAgICAgIHNvbSArPSB2b20ubTsKICAgICAg ICBzb3AgKz0gdm9wLm07CiAgICAgIH0KICAgICAgaWYgKHZpbSAmJiAhbmV4dFJpZ2h0KHZvcCkp IHsKICAgICAgICB2b3AudCA9IHZpbTsKICAgICAgICB2b3AubSArPSBzaW0gLSBzb3A7CiAgICAg IH0KICAgICAgaWYgKHZpcCAmJiAhbmV4dExlZnQodm9tKSkgewogICAgICAgIHZvbS50ID0gdmlw OwogICAgICAgIHZvbS5tICs9IHNpcCAtIHNvbTsKICAgICAgICBhbmNlc3RvciA9IHY7CiAgICAg IH0KICAgIH0KICAgIHJldHVybiBhbmNlc3RvcjsKICB9CgogIGZ1bmN0aW9uIHNpemVOb2RlKG5v ZGUpIHsKICAgIG5vZGUueCAqPSBkeDsKICAgIG5vZGUueSA9IG5vZGUuZGVwdGggKiBkeTsKICB9 CgogIHRyZWUuc2VwYXJhdGlvbiA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMu bGVuZ3RoID8gKHNlcGFyYXRpb24gPSB4LCB0cmVlKSA6IHNlcGFyYXRpb247CiAgfTsKCiAgdHJl ZS5zaXplID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9k ZVNpemUgPSBmYWxzZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgdHJlZSkgOiAobm9kZVNpemUg PyBudWxsIDogW2R4LCBkeV0pOwogIH07CgogIHRyZWUubm9kZVNpemUgPSBmdW5jdGlvbih4KSB7 CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlU2l6ZSA9IHRydWUsIGR4ID0gK3hb MF0sIGR5ID0gK3hbMV0sIHRyZWUpIDogKG5vZGVTaXplID8gW2R4LCBkeV0gOiBudWxsKTsKICB9 OwoKICByZXR1cm4gdHJlZTsKfQoKZnVuY3Rpb24gdHJlZW1hcFNsaWNlKHBhcmVudCwgeDAsIHkw LCB4MSwgeTEpIHsKICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sCiAgICAgIG5vZGUsCiAg ICAgIGkgPSAtMSwKICAgICAgbiA9IG5vZGVzLmxlbmd0aCwKICAgICAgayA9IHBhcmVudC52YWx1 ZSAmJiAoeTEgLSB5MCkgLyBwYXJlbnQudmFsdWU7CgogIHdoaWxlICgrK2kgPCBuKSB7CiAgICBu b2RlID0gbm9kZXNbaV0sIG5vZGUueDAgPSB4MCwgbm9kZS54MSA9IHgxOwogICAgbm9kZS55MCA9 IHkwLCBub2RlLnkxID0geTAgKz0gbm9kZS52YWx1ZSAqIGs7CiAgfQp9Cgp2YXIgcGhpID0gKDEg KyBNYXRoLnNxcnQoNSkpIC8gMjsKCmZ1bmN0aW9uIHNxdWFyaWZ5UmF0aW8ocmF0aW8sIHBhcmVu dCwgeDAsIHkwLCB4MSwgeTEpIHsKICB2YXIgcm93cyA9IFtdLAogICAgICBub2RlcyA9IHBhcmVu dC5jaGlsZHJlbiwKICAgICAgcm93LAogICAgICBub2RlVmFsdWUsCiAgICAgIGkwID0gMCwKICAg ICAgaTEgPSAwLAogICAgICBuID0gbm9kZXMubGVuZ3RoLAogICAgICBkeCwgZHksCiAgICAgIHZh bHVlID0gcGFyZW50LnZhbHVlLAogICAgICBzdW1WYWx1ZSwKICAgICAgbWluVmFsdWUsCiAgICAg IG1heFZhbHVlLAogICAgICBuZXdSYXRpbywKICAgICAgbWluUmF0aW8sCiAgICAgIGFscGhhLAog ICAgICBiZXRhOwoKICB3aGlsZSAoaTAgPCBuKSB7CiAgICBkeCA9IHgxIC0geDAsIGR5ID0geTEg LSB5MDsKCiAgICAvLyBGaW5kIHRoZSBuZXh0IG5vbi1lbXB0eSBub2RlLgogICAgZG8gc3VtVmFs dWUgPSBub2Rlc1tpMSsrXS52YWx1ZTsgd2hpbGUgKCFzdW1WYWx1ZSAmJiBpMSA8IG4pOwogICAg bWluVmFsdWUgPSBtYXhWYWx1ZSA9IHN1bVZhbHVlOwogICAgYWxwaGEgPSBNYXRoLm1heChkeSAv IGR4LCBkeCAvIGR5KSAvICh2YWx1ZSAqIHJhdGlvKTsKICAgIGJldGEgPSBzdW1WYWx1ZSAqIHN1 bVZhbHVlICogYWxwaGE7CiAgICBtaW5SYXRpbyA9IE1hdGgubWF4KG1heFZhbHVlIC8gYmV0YSwg YmV0YSAvIG1pblZhbHVlKTsKCiAgICAvLyBLZWVwIGFkZGluZyBub2RlcyB3aGlsZSB0aGUgYXNw ZWN0IHJhdGlvIG1haW50YWlucyBvciBpbXByb3Zlcy4KICAgIGZvciAoOyBpMSA8IG47ICsraTEp IHsKICAgICAgc3VtVmFsdWUgKz0gbm9kZVZhbHVlID0gbm9kZXNbaTFdLnZhbHVlOwogICAgICBp ZiAobm9kZVZhbHVlIDwgbWluVmFsdWUpIG1pblZhbHVlID0gbm9kZVZhbHVlOwogICAgICBpZiAo bm9kZVZhbHVlID4gbWF4VmFsdWUpIG1heFZhbHVlID0gbm9kZVZhbHVlOwogICAgICBiZXRhID0g c3VtVmFsdWUgKiBzdW1WYWx1ZSAqIGFscGhhOwogICAgICBuZXdSYXRpbyA9IE1hdGgubWF4KG1h eFZhbHVlIC8gYmV0YSwgYmV0YSAvIG1pblZhbHVlKTsKICAgICAgaWYgKG5ld1JhdGlvID4gbWlu UmF0aW8pIHsgc3VtVmFsdWUgLT0gbm9kZVZhbHVlOyBicmVhazsgfQogICAgICBtaW5SYXRpbyA9 IG5ld1JhdGlvOwogICAgfQoKICAgIC8vIFBvc2l0aW9uIGFuZCByZWNvcmQgdGhlIHJvdyBvcmll bnRhdGlvbi4KICAgIHJvd3MucHVzaChyb3cgPSB7dmFsdWU6IHN1bVZhbHVlLCBkaWNlOiBkeCA8 IGR5LCBjaGlsZHJlbjogbm9kZXMuc2xpY2UoaTAsIGkxKX0pOwogICAgaWYgKHJvdy5kaWNlKSB0 cmVlbWFwRGljZShyb3csIHgwLCB5MCwgeDEsIHZhbHVlID8geTAgKz0gZHkgKiBzdW1WYWx1ZSAv IHZhbHVlIDogeTEpOwogICAgZWxzZSB0cmVlbWFwU2xpY2Uocm93LCB4MCwgeTAsIHZhbHVlID8g eDAgKz0gZHggKiBzdW1WYWx1ZSAvIHZhbHVlIDogeDEsIHkxKTsKICAgIHZhbHVlIC09IHN1bVZh bHVlLCBpMCA9IGkxOwogIH0KCiAgcmV0dXJuIHJvd3M7Cn0KCnZhciBzcXVhcmlmeSA9IChmdW5j dGlvbiBjdXN0b20ocmF0aW8pIHsKCiAgZnVuY3Rpb24gc3F1YXJpZnkocGFyZW50LCB4MCwgeTAs IHgxLCB5MSkgewogICAgc3F1YXJpZnlSYXRpbyhyYXRpbywgcGFyZW50LCB4MCwgeTAsIHgxLCB5 MSk7CiAgfQoKICBzcXVhcmlmeS5yYXRpbyA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBjdXN0 b20oKHggPSAreCkgPiAxID8geCA6IDEpOwogIH07CgogIHJldHVybiBzcXVhcmlmeTsKfSkocGhp KTsKCmZ1bmN0aW9uIGluZGV4JDMoKSB7CiAgdmFyIHRpbGUgPSBzcXVhcmlmeSwKICAgICAgcm91 bmQgPSBmYWxzZSwKICAgICAgZHggPSAxLAogICAgICBkeSA9IDEsCiAgICAgIHBhZGRpbmdTdGFj ayA9IFswXSwKICAgICAgcGFkZGluZ0lubmVyID0gY29uc3RhbnRaZXJvLAogICAgICBwYWRkaW5n VG9wID0gY29uc3RhbnRaZXJvLAogICAgICBwYWRkaW5nUmlnaHQgPSBjb25zdGFudFplcm8sCiAg ICAgIHBhZGRpbmdCb3R0b20gPSBjb25zdGFudFplcm8sCiAgICAgIHBhZGRpbmdMZWZ0ID0gY29u c3RhbnRaZXJvOwoKICBmdW5jdGlvbiB0cmVlbWFwKHJvb3QpIHsKICAgIHJvb3QueDAgPQogICAg cm9vdC55MCA9IDA7CiAgICByb290LngxID0gZHg7CiAgICByb290LnkxID0gZHk7CiAgICByb290 LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKTsKICAgIHBhZGRpbmdTdGFjayA9IFswXTsKICAgIGlm IChyb3VuZCkgcm9vdC5lYWNoQmVmb3JlKHJvdW5kTm9kZSk7CiAgICByZXR1cm4gcm9vdDsKICB9 CgogIGZ1bmN0aW9uIHBvc2l0aW9uTm9kZShub2RlKSB7CiAgICB2YXIgcCA9IHBhZGRpbmdTdGFj a1tub2RlLmRlcHRoXSwKICAgICAgICB4MCA9IG5vZGUueDAgKyBwLAogICAgICAgIHkwID0gbm9k ZS55MCArIHAsCiAgICAgICAgeDEgPSBub2RlLngxIC0gcCwKICAgICAgICB5MSA9IG5vZGUueTEg LSBwOwogICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyOwogICAgaWYgKHkx IDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyOwogICAgbm9kZS54MCA9IHgwOwogICAgbm9k ZS55MCA9IHkwOwogICAgbm9kZS54MSA9IHgxOwogICAgbm9kZS55MSA9IHkxOwogICAgaWYgKG5v ZGUuY2hpbGRyZW4pIHsKICAgICAgcCA9IHBhZGRpbmdTdGFja1tub2RlLmRlcHRoICsgMV0gPSBw YWRkaW5nSW5uZXIobm9kZSkgLyAyOwogICAgICB4MCArPSBwYWRkaW5nTGVmdChub2RlKSAtIHA7 CiAgICAgIHkwICs9IHBhZGRpbmdUb3Aobm9kZSkgLSBwOwogICAgICB4MSAtPSBwYWRkaW5nUmln aHQobm9kZSkgLSBwOwogICAgICB5MSAtPSBwYWRkaW5nQm90dG9tKG5vZGUpIC0gcDsKICAgICAg aWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyOwogICAgICBpZiAoeTEgPCB5MCkg eTAgPSB5MSA9ICh5MCArIHkxKSAvIDI7CiAgICAgIHRpbGUobm9kZSwgeDAsIHkwLCB4MSwgeTEp OwogICAgfQogIH0KCiAgdHJlZW1hcC5yb3VuZCA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBh cmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISF4LCB0cmVlbWFwKSA6IHJvdW5kOwogIH07Cgog IHRyZWVtYXAuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3Ro ID8gKGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIHRyZWVtYXApIDogW2R4LCBkeV07CiAgfTsKCiAg dHJlZW1hcC50aWxlID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgg PyAodGlsZSA9IHJlcXVpcmVkKHgpLCB0cmVlbWFwKSA6IHRpbGU7CiAgfTsKCiAgdHJlZW1hcC5w YWRkaW5nID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0cmVl bWFwLnBhZGRpbmdJbm5lcih4KS5wYWRkaW5nT3V0ZXIoeCkgOiB0cmVlbWFwLnBhZGRpbmdJbm5l cigpOwogIH07CgogIHRyZWVtYXAucGFkZGluZ0lubmVyID0gZnVuY3Rpb24oeCkgewogICAgcmV0 dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gdHlwZW9mIHggPT09ICJmdW5j dGlvbiIgPyB4IDogY29uc3RhbnQkOSgreCksIHRyZWVtYXApIDogcGFkZGluZ0lubmVyOwogIH07 CgogIHRyZWVtYXAucGFkZGluZ091dGVyID0gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPyB0cmVlbWFwLnBhZGRpbmdUb3AoeCkucGFkZGluZ1JpZ2h0KHgpLnBhZGRp bmdCb3R0b20oeCkucGFkZGluZ0xlZnQoeCkgOiB0cmVlbWFwLnBhZGRpbmdUb3AoKTsKICB9OwoK ICB0cmVlbWFwLnBhZGRpbmdUb3AgPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRz Lmxlbmd0aCA/IChwYWRkaW5nVG9wID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29u c3RhbnQkOSgreCksIHRyZWVtYXApIDogcGFkZGluZ1RvcDsKICB9OwoKICB0cmVlbWFwLnBhZGRp bmdSaWdodCA9IGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBh ZGRpbmdSaWdodCA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGNvbnN0YW50JDkoK3gp LCB0cmVlbWFwKSA6IHBhZGRpbmdSaWdodDsKICB9OwoKICB0cmVlbWFwLnBhZGRpbmdCb3R0b20g PSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nQm90 dG9tID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29uc3RhbnQkOSgreCksIHRyZWVt YXApIDogcGFkZGluZ0JvdHRvbTsKICB9OwoKICB0cmVlbWFwLnBhZGRpbmdMZWZ0ID0gZnVuY3Rp b24oeCkgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0xlZnQgPSB0eXBl b2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBjb25zdGFudCQ5KCt4KSwgdHJlZW1hcCkgOiBwYWRk aW5nTGVmdDsKICB9OwoKICByZXR1cm4gdHJlZW1hcDsKfQoKZnVuY3Rpb24gYmluYXJ5KHBhcmVu dCwgeDAsIHkwLCB4MSwgeTEpIHsKICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sCiAgICAg IGksIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgIHN1bSwgc3VtcyA9IG5ldyBBcnJheShuICsgMSk7 CgogIGZvciAoc3Vtc1swXSA9IHN1bSA9IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICBzdW1zW2kg KyAxXSA9IHN1bSArPSBub2Rlc1tpXS52YWx1ZTsKICB9CgogIHBhcnRpdGlvbigwLCBuLCBwYXJl bnQudmFsdWUsIHgwLCB5MCwgeDEsIHkxKTsKCiAgZnVuY3Rpb24gcGFydGl0aW9uKGksIGosIHZh bHVlLCB4MCwgeTAsIHgxLCB5MSkgewogICAgaWYgKGkgPj0gaiAtIDEpIHsKICAgICAgdmFyIG5v ZGUgPSBub2Rlc1tpXTsKICAgICAgbm9kZS54MCA9IHgwLCBub2RlLnkwID0geTA7CiAgICAgIG5v ZGUueDEgPSB4MSwgbm9kZS55MSA9IHkxOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIHZh bHVlT2Zmc2V0ID0gc3Vtc1tpXSwKICAgICAgICB2YWx1ZVRhcmdldCA9ICh2YWx1ZSAvIDIpICsg dmFsdWVPZmZzZXQsCiAgICAgICAgayA9IGkgKyAxLAogICAgICAgIGhpID0gaiAtIDE7CgogICAg d2hpbGUgKGsgPCBoaSkgewogICAgICB2YXIgbWlkID0gayArIGhpID4+PiAxOwogICAgICBpZiAo c3Vtc1ttaWRdIDwgdmFsdWVUYXJnZXQpIGsgPSBtaWQgKyAxOwogICAgICBlbHNlIGhpID0gbWlk OwogICAgfQoKICAgIGlmICgodmFsdWVUYXJnZXQgLSBzdW1zW2sgLSAxXSkgPCAoc3Vtc1trXSAt IHZhbHVlVGFyZ2V0KSAmJiBpICsgMSA8IGspIC0tazsKCiAgICB2YXIgdmFsdWVMZWZ0ID0gc3Vt c1trXSAtIHZhbHVlT2Zmc2V0LAogICAgICAgIHZhbHVlUmlnaHQgPSB2YWx1ZSAtIHZhbHVlTGVm dDsKCiAgICBpZiAoKHgxIC0geDApID4gKHkxIC0geTApKSB7CiAgICAgIHZhciB4ayA9ICh4MCAq IHZhbHVlUmlnaHQgKyB4MSAqIHZhbHVlTGVmdCkgLyB2YWx1ZTsKICAgICAgcGFydGl0aW9uKGks IGssIHZhbHVlTGVmdCwgeDAsIHkwLCB4aywgeTEpOwogICAgICBwYXJ0aXRpb24oaywgaiwgdmFs dWVSaWdodCwgeGssIHkwLCB4MSwgeTEpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHlrID0gKHkw ICogdmFsdWVSaWdodCArIHkxICogdmFsdWVMZWZ0KSAvIHZhbHVlOwogICAgICBwYXJ0aXRpb24o aSwgaywgdmFsdWVMZWZ0LCB4MCwgeTAsIHgxLCB5ayk7CiAgICAgIHBhcnRpdGlvbihrLCBqLCB2 YWx1ZVJpZ2h0LCB4MCwgeWssIHgxLCB5MSk7CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBzbGljZURp Y2UocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkgewogIChwYXJlbnQuZGVwdGggJiAxID8gdHJlZW1h cFNsaWNlIDogdHJlZW1hcERpY2UpKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpOwp9Cgp2YXIgcmVz cXVhcmlmeSA9IChmdW5jdGlvbiBjdXN0b20ocmF0aW8pIHsKCiAgZnVuY3Rpb24gcmVzcXVhcmlm eShwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7CiAgICBpZiAoKHJvd3MgPSBwYXJlbnQuX3NxdWFy aWZ5KSAmJiAocm93cy5yYXRpbyA9PT0gcmF0aW8pKSB7CiAgICAgIHZhciByb3dzLAogICAgICAg ICAgcm93LAogICAgICAgICAgbm9kZXMsCiAgICAgICAgICBpLAogICAgICAgICAgaiA9IC0xLAog ICAgICAgICAgbiwKICAgICAgICAgIG0gPSByb3dzLmxlbmd0aCwKICAgICAgICAgIHZhbHVlID0g cGFyZW50LnZhbHVlOwoKICAgICAgd2hpbGUgKCsraiA8IG0pIHsKICAgICAgICByb3cgPSByb3dz W2pdLCBub2RlcyA9IHJvdy5jaGlsZHJlbjsKICAgICAgICBmb3IgKGkgPSByb3cudmFsdWUgPSAw LCBuID0gbm9kZXMubGVuZ3RoOyBpIDwgbjsgKytpKSByb3cudmFsdWUgKz0gbm9kZXNbaV0udmFs dWU7CiAgICAgICAgaWYgKHJvdy5kaWNlKSB0cmVlbWFwRGljZShyb3csIHgwLCB5MCwgeDEsIHkw ICs9ICh5MSAtIHkwKSAqIHJvdy52YWx1ZSAvIHZhbHVlKTsKICAgICAgICBlbHNlIHRyZWVtYXBT bGljZShyb3csIHgwLCB5MCwgeDAgKz0gKHgxIC0geDApICogcm93LnZhbHVlIC8gdmFsdWUsIHkx KTsKICAgICAgICB2YWx1ZSAtPSByb3cudmFsdWU7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAg IHBhcmVudC5fc3F1YXJpZnkgPSByb3dzID0gc3F1YXJpZnlSYXRpbyhyYXRpbywgcGFyZW50LCB4 MCwgeTAsIHgxLCB5MSk7CiAgICAgIHJvd3MucmF0aW8gPSByYXRpbzsKICAgIH0KICB9CgogIHJl c3F1YXJpZnkucmF0aW8gPSBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4gY3VzdG9tKCh4ID0gK3gp ID4gMSA/IHggOiAxKTsKICB9OwoKICByZXR1cm4gcmVzcXVhcmlmeTsKfSkocGhpKTsKCmZ1bmN0 aW9uIGFyZWEkMihwb2x5Z29uKSB7CiAgdmFyIGkgPSAtMSwKICAgICAgbiA9IHBvbHlnb24ubGVu Z3RoLAogICAgICBhLAogICAgICBiID0gcG9seWdvbltuIC0gMV0sCiAgICAgIGFyZWEgPSAwOwoK ICB3aGlsZSAoKytpIDwgbikgewogICAgYSA9IGI7CiAgICBiID0gcG9seWdvbltpXTsKICAgIGFy ZWEgKz0gYVsxXSAqIGJbMF0gLSBhWzBdICogYlsxXTsKICB9CgogIHJldHVybiBhcmVhIC8gMjsK fQoKZnVuY3Rpb24gY2VudHJvaWQkMShwb2x5Z29uKSB7CiAgdmFyIGkgPSAtMSwKICAgICAgbiA9 IHBvbHlnb24ubGVuZ3RoLAogICAgICB4ID0gMCwKICAgICAgeSA9IDAsCiAgICAgIGEsCiAgICAg IGIgPSBwb2x5Z29uW24gLSAxXSwKICAgICAgYywKICAgICAgayA9IDA7CgogIHdoaWxlICgrK2kg PCBuKSB7CiAgICBhID0gYjsKICAgIGIgPSBwb2x5Z29uW2ldOwogICAgayArPSBjID0gYVswXSAq IGJbMV0gLSBiWzBdICogYVsxXTsKICAgIHggKz0gKGFbMF0gKyBiWzBdKSAqIGM7CiAgICB5ICs9 IChhWzFdICsgYlsxXSkgKiBjOwogIH0KCiAgcmV0dXJuIGsgKj0gMywgW3ggLyBrLCB5IC8ga107 Cn0KCi8vIFJldHVybnMgdGhlIDJEIGNyb3NzIHByb2R1Y3Qgb2YgQUIgYW5kIEFDIHZlY3RvcnMs IGkuZS4sIHRoZSB6LWNvbXBvbmVudCBvZgovLyB0aGUgM0QgY3Jvc3MgcHJvZHVjdCBpbiBhIHF1 YWRyYW50IEkgQ2FydGVzaWFuIGNvb3JkaW5hdGUgc3lzdGVtICgreCBpcwovLyByaWdodCwgK3kg aXMgdXApLiBSZXR1cm5zIGEgcG9zaXRpdmUgdmFsdWUgaWYgQUJDIGlzIGNvdW50ZXItY2xvY2t3 aXNlLAovLyBuZWdhdGl2ZSBpZiBjbG9ja3dpc2UsIGFuZCB6ZXJvIGlmIHRoZSBwb2ludHMgYXJl IGNvbGxpbmVhci4KZnVuY3Rpb24gY3Jvc3MkMShhLCBiLCBjKSB7CiAgcmV0dXJuIChiWzBdIC0g YVswXSkgKiAoY1sxXSAtIGFbMV0pIC0gKGJbMV0gLSBhWzFdKSAqIChjWzBdIC0gYVswXSk7Cn0K CmZ1bmN0aW9uIGxleGljb2dyYXBoaWNPcmRlcihhLCBiKSB7CiAgcmV0dXJuIGFbMF0gLSBiWzBd IHx8IGFbMV0gLSBiWzFdOwp9CgovLyBDb21wdXRlcyB0aGUgdXBwZXIgY29udmV4IGh1bGwgcGVy IHRoZSBtb25vdG9uZSBjaGFpbiBhbGdvcml0aG0uCi8vIEFzc3VtZXMgcG9pbnRzLmxlbmd0aCA+ PSAzLCBpcyBzb3J0ZWQgYnkgeCwgdW5pcXVlIGluIHkuCi8vIFJldHVybnMgYW4gYXJyYXkgb2Yg aW5kaWNlcyBpbnRvIHBvaW50cyBpbiBsZWZ0LXRvLXJpZ2h0IG9yZGVyLgpmdW5jdGlvbiBjb21w dXRlVXBwZXJIdWxsSW5kZXhlcyhwb2ludHMpIHsKICB2YXIgbiA9IHBvaW50cy5sZW5ndGgsCiAg ICAgIGluZGV4ZXMgPSBbMCwgMV0sCiAgICAgIHNpemUgPSAyOwoKICBmb3IgKHZhciBpID0gMjsg aSA8IG47ICsraSkgewogICAgd2hpbGUgKHNpemUgPiAxICYmIGNyb3NzJDEocG9pbnRzW2luZGV4 ZXNbc2l6ZSAtIDJdXSwgcG9pbnRzW2luZGV4ZXNbc2l6ZSAtIDFdXSwgcG9pbnRzW2ldKSA8PSAw KSAtLXNpemU7CiAgICBpbmRleGVzW3NpemUrK10gPSBpOwogIH0KCiAgcmV0dXJuIGluZGV4ZXMu c2xpY2UoMCwgc2l6ZSk7IC8vIHJlbW92ZSBwb3BwZWQgcG9pbnRzCn0KCmZ1bmN0aW9uIGh1bGwo cG9pbnRzKSB7CiAgaWYgKChuID0gcG9pbnRzLmxlbmd0aCkgPCAzKSByZXR1cm4gbnVsbDsKCiAg dmFyIGksCiAgICAgIG4sCiAgICAgIHNvcnRlZFBvaW50cyA9IG5ldyBBcnJheShuKSwKICAgICAg ZmxpcHBlZFBvaW50cyA9IG5ldyBBcnJheShuKTsKCiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkg c29ydGVkUG9pbnRzW2ldID0gWytwb2ludHNbaV1bMF0sICtwb2ludHNbaV1bMV0sIGldOwogIHNv cnRlZFBvaW50cy5zb3J0KGxleGljb2dyYXBoaWNPcmRlcik7CiAgZm9yIChpID0gMDsgaSA8IG47 ICsraSkgZmxpcHBlZFBvaW50c1tpXSA9IFtzb3J0ZWRQb2ludHNbaV1bMF0sIC1zb3J0ZWRQb2lu dHNbaV1bMV1dOwoKICB2YXIgdXBwZXJJbmRleGVzID0gY29tcHV0ZVVwcGVySHVsbEluZGV4ZXMo c29ydGVkUG9pbnRzKSwKICAgICAgbG93ZXJJbmRleGVzID0gY29tcHV0ZVVwcGVySHVsbEluZGV4 ZXMoZmxpcHBlZFBvaW50cyk7CgogIC8vIENvbnN0cnVjdCB0aGUgaHVsbCBwb2x5Z29uLCByZW1v dmluZyBwb3NzaWJsZSBkdXBsaWNhdGUgZW5kcG9pbnRzLgogIHZhciBza2lwTGVmdCA9IGxvd2Vy SW5kZXhlc1swXSA9PT0gdXBwZXJJbmRleGVzWzBdLAogICAgICBza2lwUmlnaHQgPSBsb3dlcklu ZGV4ZXNbbG93ZXJJbmRleGVzLmxlbmd0aCAtIDFdID09PSB1cHBlckluZGV4ZXNbdXBwZXJJbmRl eGVzLmxlbmd0aCAtIDFdLAogICAgICBodWxsID0gW107CgogIC8vIEFkZCB1cHBlciBodWxsIGlu IHJpZ2h0LXRvLWwgb3JkZXIuCiAgLy8gVGhlbiBhZGQgbG93ZXIgaHVsbCBpbiBsZWZ0LXRvLXJp Z2h0IG9yZGVyLgogIGZvciAoaSA9IHVwcGVySW5kZXhlcy5sZW5ndGggLSAxOyBpID49IDA7IC0t aSkgaHVsbC5wdXNoKHBvaW50c1tzb3J0ZWRQb2ludHNbdXBwZXJJbmRleGVzW2ldXVsyXV0pOwog IGZvciAoaSA9ICtza2lwTGVmdDsgaSA8IGxvd2VySW5kZXhlcy5sZW5ndGggLSBza2lwUmlnaHQ7 ICsraSkgaHVsbC5wdXNoKHBvaW50c1tzb3J0ZWRQb2ludHNbbG93ZXJJbmRleGVzW2ldXVsyXV0p OwoKICByZXR1cm4gaHVsbDsKfQoKZnVuY3Rpb24gY29udGFpbnMkMihwb2x5Z29uLCBwb2ludCkg ewogIHZhciBuID0gcG9seWdvbi5sZW5ndGgsCiAgICAgIHAgPSBwb2x5Z29uW24gLSAxXSwKICAg ICAgeCA9IHBvaW50WzBdLCB5ID0gcG9pbnRbMV0sCiAgICAgIHgwID0gcFswXSwgeTAgPSBwWzFd LAogICAgICB4MSwgeTEsCiAgICAgIGluc2lkZSA9IGZhbHNlOwoKICBmb3IgKHZhciBpID0gMDsg aSA8IG47ICsraSkgewogICAgcCA9IHBvbHlnb25baV0sIHgxID0gcFswXSwgeTEgPSBwWzFdOwog ICAgaWYgKCgoeTEgPiB5KSAhPT0gKHkwID4geSkpICYmICh4IDwgKHgwIC0geDEpICogKHkgLSB5 MSkgLyAoeTAgLSB5MSkgKyB4MSkpIGluc2lkZSA9ICFpbnNpZGU7CiAgICB4MCA9IHgxLCB5MCA9 IHkxOwogIH0KCiAgcmV0dXJuIGluc2lkZTsKfQoKZnVuY3Rpb24gbGVuZ3RoJDIocG9seWdvbikg ewogIHZhciBpID0gLTEsCiAgICAgIG4gPSBwb2x5Z29uLmxlbmd0aCwKICAgICAgYiA9IHBvbHln b25bbiAtIDFdLAogICAgICB4YSwKICAgICAgeWEsCiAgICAgIHhiID0gYlswXSwKICAgICAgeWIg PSBiWzFdLAogICAgICBwZXJpbWV0ZXIgPSAwOwoKICB3aGlsZSAoKytpIDwgbikgewogICAgeGEg PSB4YjsKICAgIHlhID0geWI7CiAgICBiID0gcG9seWdvbltpXTsKICAgIHhiID0gYlswXTsKICAg IHliID0gYlsxXTsKICAgIHhhIC09IHhiOwogICAgeWEgLT0geWI7CiAgICBwZXJpbWV0ZXIgKz0g TWF0aC5zcXJ0KHhhICogeGEgKyB5YSAqIHlhKTsKICB9CgogIHJldHVybiBwZXJpbWV0ZXI7Cn0K CmZ1bmN0aW9uIGRlZmF1bHRTb3VyY2UkMSgpIHsKICByZXR1cm4gTWF0aC5yYW5kb20oKTsKfQoK dmFyIHVuaWZvcm0gPSAoZnVuY3Rpb24gc291cmNlUmFuZG9tVW5pZm9ybShzb3VyY2UpIHsKICBm dW5jdGlvbiByYW5kb21Vbmlmb3JtKG1pbiwgbWF4KSB7CiAgICBtaW4gPSBtaW4gPT0gbnVsbCA/ IDAgOiArbWluOwogICAgbWF4ID0gbWF4ID09IG51bGwgPyAxIDogK21heDsKICAgIGlmIChhcmd1 bWVudHMubGVuZ3RoID09PSAxKSBtYXggPSBtaW4sIG1pbiA9IDA7CiAgICBlbHNlIG1heCAtPSBt aW47CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBzb3VyY2UoKSAqIG1heCAr IG1pbjsKICAgIH07CiAgfQoKICByYW5kb21Vbmlmb3JtLnNvdXJjZSA9IHNvdXJjZVJhbmRvbVVu aWZvcm07CgogIHJldHVybiByYW5kb21Vbmlmb3JtOwp9KShkZWZhdWx0U291cmNlJDEpOwoKdmFy IG5vcm1hbCA9IChmdW5jdGlvbiBzb3VyY2VSYW5kb21Ob3JtYWwoc291cmNlKSB7CiAgZnVuY3Rp b24gcmFuZG9tTm9ybWFsKG11LCBzaWdtYSkgewogICAgdmFyIHgsIHI7CiAgICBtdSA9IG11ID09 IG51bGwgPyAwIDogK211OwogICAgc2lnbWEgPSBzaWdtYSA9PSBudWxsID8gMSA6ICtzaWdtYTsK ICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHk7CgogICAgICAvLyBJZiBhdmFpbGFi bGUsIHVzZSB0aGUgc2Vjb25kIHByZXZpb3VzbHktZ2VuZXJhdGVkIHVuaWZvcm0gcmFuZG9tLgog ICAgICBpZiAoeCAhPSBudWxsKSB5ID0geCwgeCA9IG51bGw7CgogICAgICAvLyBPdGhlcndpc2Us IGdlbmVyYXRlIGEgbmV3IHggYW5kIHkuCiAgICAgIGVsc2UgZG8gewogICAgICAgIHggPSBzb3Vy Y2UoKSAqIDIgLSAxOwogICAgICAgIHkgPSBzb3VyY2UoKSAqIDIgLSAxOwogICAgICAgIHIgPSB4 ICogeCArIHkgKiB5OwogICAgICB9IHdoaWxlICghciB8fCByID4gMSk7CgogICAgICByZXR1cm4g bXUgKyBzaWdtYSAqIHkgKiBNYXRoLnNxcnQoLTIgKiBNYXRoLmxvZyhyKSAvIHIpOwogICAgfTsK ICB9CgogIHJhbmRvbU5vcm1hbC5zb3VyY2UgPSBzb3VyY2VSYW5kb21Ob3JtYWw7CgogIHJldHVy biByYW5kb21Ob3JtYWw7Cn0pKGRlZmF1bHRTb3VyY2UkMSk7Cgp2YXIgbG9nTm9ybWFsID0gKGZ1 bmN0aW9uIHNvdXJjZVJhbmRvbUxvZ05vcm1hbChzb3VyY2UpIHsKICBmdW5jdGlvbiByYW5kb21M b2dOb3JtYWwoKSB7CiAgICB2YXIgcmFuZG9tTm9ybWFsID0gbm9ybWFsLnNvdXJjZShzb3VyY2Up LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIHJl dHVybiBNYXRoLmV4cChyYW5kb21Ob3JtYWwoKSk7CiAgICB9OwogIH0KCiAgcmFuZG9tTG9nTm9y bWFsLnNvdXJjZSA9IHNvdXJjZVJhbmRvbUxvZ05vcm1hbDsKCiAgcmV0dXJuIHJhbmRvbUxvZ05v cm1hbDsKfSkoZGVmYXVsdFNvdXJjZSQxKTsKCnZhciBpcndpbkhhbGwgPSAoZnVuY3Rpb24gc291 cmNlUmFuZG9tSXJ3aW5IYWxsKHNvdXJjZSkgewogIGZ1bmN0aW9uIHJhbmRvbUlyd2luSGFsbChu KSB7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIHN1bSA9IDAsIGkgPSAw OyBpIDwgbjsgKytpKSBzdW0gKz0gc291cmNlKCk7CiAgICAgIHJldHVybiBzdW07CiAgICB9Owog IH0KCiAgcmFuZG9tSXJ3aW5IYWxsLnNvdXJjZSA9IHNvdXJjZVJhbmRvbUlyd2luSGFsbDsKCiAg cmV0dXJuIHJhbmRvbUlyd2luSGFsbDsKfSkoZGVmYXVsdFNvdXJjZSQxKTsKCnZhciBiYXRlcyA9 IChmdW5jdGlvbiBzb3VyY2VSYW5kb21CYXRlcyhzb3VyY2UpIHsKICBmdW5jdGlvbiByYW5kb21C YXRlcyhuKSB7CiAgICB2YXIgcmFuZG9tSXJ3aW5IYWxsID0gaXJ3aW5IYWxsLnNvdXJjZShzb3Vy Y2UpKG4pOwogICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gcmFuZG9tSXJ3aW5I YWxsKCkgLyBuOwogICAgfTsKICB9CgogIHJhbmRvbUJhdGVzLnNvdXJjZSA9IHNvdXJjZVJhbmRv bUJhdGVzOwoKICByZXR1cm4gcmFuZG9tQmF0ZXM7Cn0pKGRlZmF1bHRTb3VyY2UkMSk7Cgp2YXIg ZXhwb25lbnRpYWwkMSA9IChmdW5jdGlvbiBzb3VyY2VSYW5kb21FeHBvbmVudGlhbChzb3VyY2Up IHsKICBmdW5jdGlvbiByYW5kb21FeHBvbmVudGlhbChsYW1iZGEpIHsKICAgIHJldHVybiBmdW5j dGlvbigpIHsKICAgICAgcmV0dXJuIC1NYXRoLmxvZygxIC0gc291cmNlKCkpIC8gbGFtYmRhOwog ICAgfTsKICB9CgogIHJhbmRvbUV4cG9uZW50aWFsLnNvdXJjZSA9IHNvdXJjZVJhbmRvbUV4cG9u ZW50aWFsOwoKICByZXR1cm4gcmFuZG9tRXhwb25lbnRpYWw7Cn0pKGRlZmF1bHRTb3VyY2UkMSk7 CgpmdW5jdGlvbiBpbml0UmFuZ2UoZG9tYWluLCByYW5nZSkgewogIHN3aXRjaCAoYXJndW1lbnRz Lmxlbmd0aCkgewogICAgY2FzZSAwOiBicmVhazsKICAgIGNhc2UgMTogdGhpcy5yYW5nZShkb21h aW4pOyBicmVhazsKICAgIGRlZmF1bHQ6IHRoaXMucmFuZ2UocmFuZ2UpLmRvbWFpbihkb21haW4p OyBicmVhazsKICB9CiAgcmV0dXJuIHRoaXM7Cn0KCmZ1bmN0aW9uIGluaXRJbnRlcnBvbGF0b3Io ZG9tYWluLCBpbnRlcnBvbGF0b3IpIHsKICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHsKICAg IGNhc2UgMDogYnJlYWs7CiAgICBjYXNlIDE6IHRoaXMuaW50ZXJwb2xhdG9yKGRvbWFpbik7IGJy ZWFrOwogICAgZGVmYXVsdDogdGhpcy5pbnRlcnBvbGF0b3IoaW50ZXJwb2xhdG9yKS5kb21haW4o ZG9tYWluKTsgYnJlYWs7CiAgfQogIHJldHVybiB0aGlzOwp9Cgp2YXIgYXJyYXkkMyA9IEFycmF5 LnByb3RvdHlwZTsKCnZhciBtYXAkMyA9IGFycmF5JDMubWFwOwp2YXIgc2xpY2UkNSA9IGFycmF5 JDMuc2xpY2U7Cgp2YXIgaW1wbGljaXQgPSB7bmFtZTogImltcGxpY2l0In07CgpmdW5jdGlvbiBv cmRpbmFsKCkgewogIHZhciBpbmRleCA9IG1hcCQxKCksCiAgICAgIGRvbWFpbiA9IFtdLAogICAg ICByYW5nZSA9IFtdLAogICAgICB1bmtub3duID0gaW1wbGljaXQ7CgogIGZ1bmN0aW9uIHNjYWxl KGQpIHsKICAgIHZhciBrZXkgPSBkICsgIiIsIGkgPSBpbmRleC5nZXQoa2V5KTsKICAgIGlmICgh aSkgewogICAgICBpZiAodW5rbm93biAhPT0gaW1wbGljaXQpIHJldHVybiB1bmtub3duOwogICAg ICBpbmRleC5zZXQoa2V5LCBpID0gZG9tYWluLnB1c2goZCkpOwogICAgfQogICAgcmV0dXJuIHJh bmdlWyhpIC0gMSkgJSByYW5nZS5sZW5ndGhdOwogIH0KCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rp b24oXykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7 CiAgICBkb21haW4gPSBbXSwgaW5kZXggPSBtYXAkMSgpOwogICAgdmFyIGkgPSAtMSwgbiA9IF8u bGVuZ3RoLCBkLCBrZXk7CiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFpbmRleC5oYXMoa2V5ID0g KGQgPSBfW2ldKSArICIiKSkgaW5kZXguc2V0KGtleSwgZG9tYWluLnB1c2goZCkpOwogICAgcmV0 dXJuIHNjYWxlOwogIH07CgogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJu IGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBzbGljZSQ1LmNhbGwoXyksIHNjYWxlKSA6IHJh bmdlLnNsaWNlKCk7CiAgfTsKCiAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHsKICAgIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duOwog IH07CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBvcmRpbmFsKGRvbWFp biwgcmFuZ2UpLnVua25vd24odW5rbm93bik7CiAgfTsKCiAgaW5pdFJhbmdlLmFwcGx5KHNjYWxl LCBhcmd1bWVudHMpOwoKICByZXR1cm4gc2NhbGU7Cn0KCmZ1bmN0aW9uIGJhbmQoKSB7CiAgdmFy IHNjYWxlID0gb3JkaW5hbCgpLnVua25vd24odW5kZWZpbmVkKSwKICAgICAgZG9tYWluID0gc2Nh bGUuZG9tYWluLAogICAgICBvcmRpbmFsUmFuZ2UgPSBzY2FsZS5yYW5nZSwKICAgICAgcmFuZ2Ug PSBbMCwgMV0sCiAgICAgIHN0ZXAsCiAgICAgIGJhbmR3aWR0aCwKICAgICAgcm91bmQgPSBmYWxz ZSwKICAgICAgcGFkZGluZ0lubmVyID0gMCwKICAgICAgcGFkZGluZ091dGVyID0gMCwKICAgICAg YWxpZ24gPSAwLjU7CgogIGRlbGV0ZSBzY2FsZS51bmtub3duOwoKICBmdW5jdGlvbiByZXNjYWxl KCkgewogICAgdmFyIG4gPSBkb21haW4oKS5sZW5ndGgsCiAgICAgICAgcmV2ZXJzZSA9IHJhbmdl WzFdIDwgcmFuZ2VbMF0sCiAgICAgICAgc3RhcnQgPSByYW5nZVtyZXZlcnNlIC0gMF0sCiAgICAg ICAgc3RvcCA9IHJhbmdlWzEgLSByZXZlcnNlXTsKICAgIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAv IE1hdGgubWF4KDEsIG4gLSBwYWRkaW5nSW5uZXIgKyBwYWRkaW5nT3V0ZXIgKiAyKTsKICAgIGlm IChyb3VuZCkgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7CiAgICBzdGFydCArPSAoc3RvcCAtIHN0 YXJ0IC0gc3RlcCAqIChuIC0gcGFkZGluZ0lubmVyKSkgKiBhbGlnbjsKICAgIGJhbmR3aWR0aCA9 IHN0ZXAgKiAoMSAtIHBhZGRpbmdJbm5lcik7CiAgICBpZiAocm91bmQpIHN0YXJ0ID0gTWF0aC5y b3VuZChzdGFydCksIGJhbmR3aWR0aCA9IE1hdGgucm91bmQoYmFuZHdpZHRoKTsKICAgIHZhciB2 YWx1ZXMgPSBzZXF1ZW5jZShuKS5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gc3RhcnQgKyBzdGVw ICogaTsgfSk7CiAgICByZXR1cm4gb3JkaW5hbFJhbmdlKHJldmVyc2UgPyB2YWx1ZXMucmV2ZXJz ZSgpIDogdmFsdWVzKTsKICB9CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbihfKSwgcmVzY2FsZSgpKSA6IGRvbWFpbigp OwogIH07CgogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50 cy5sZW5ndGggPyAocmFuZ2UgPSBbK19bMF0sICtfWzFdXSwgcmVzY2FsZSgpKSA6IHJhbmdlLnNs aWNlKCk7CiAgfTsKCiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVy biByYW5nZSA9IFsrX1swXSwgK19bMV1dLCByb3VuZCA9IHRydWUsIHJlc2NhbGUoKTsKICB9OwoK ICBzY2FsZS5iYW5kd2lkdGggPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBiYW5kd2lkdGg7CiAg fTsKCiAgc2NhbGUuc3RlcCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHN0ZXA7CiAgfTsKCiAg c2NhbGUucm91bmQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ IChyb3VuZCA9ICEhXywgcmVzY2FsZSgpKSA6IHJvdW5kOwogIH07CgogIHNjYWxlLnBhZGRpbmcg PSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5u ZXIgPSBNYXRoLm1pbigxLCBwYWRkaW5nT3V0ZXIgPSArXyksIHJlc2NhbGUoKSkgOiBwYWRkaW5n SW5uZXI7CiAgfTsKCiAgc2NhbGUucGFkZGluZ0lubmVyID0gZnVuY3Rpb24oXykgewogICAgcmV0 dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gTWF0aC5taW4oMSwgXyksIHJl c2NhbGUoKSkgOiBwYWRkaW5nSW5uZXI7CiAgfTsKCiAgc2NhbGUucGFkZGluZ091dGVyID0gZnVu Y3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ091dGVyID0g K18sIHJlc2NhbGUoKSkgOiBwYWRkaW5nT3V0ZXI7CiAgfTsKCiAgc2NhbGUuYWxpZ24gPSBmdW5j dGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbGlnbiA9IE1hdGgubWF4 KDAsIE1hdGgubWluKDEsIF8pKSwgcmVzY2FsZSgpKSA6IGFsaWduOwogIH07CgogIHNjYWxlLmNv cHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBiYW5kKGRvbWFpbigpLCByYW5nZSkKICAgICAg ICAucm91bmQocm91bmQpCiAgICAgICAgLnBhZGRpbmdJbm5lcihwYWRkaW5nSW5uZXIpCiAgICAg ICAgLnBhZGRpbmdPdXRlcihwYWRkaW5nT3V0ZXIpCiAgICAgICAgLmFsaWduKGFsaWduKTsKICB9 OwoKICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KHJlc2NhbGUoKSwgYXJndW1lbnRzKTsKfQoKZnVu Y3Rpb24gcG9pbnRpc2goc2NhbGUpIHsKICB2YXIgY29weSA9IHNjYWxlLmNvcHk7CgogIHNjYWxl LnBhZGRpbmcgPSBzY2FsZS5wYWRkaW5nT3V0ZXI7CiAgZGVsZXRlIHNjYWxlLnBhZGRpbmdJbm5l cjsKICBkZWxldGUgc2NhbGUucGFkZGluZ091dGVyOwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24o KSB7CiAgICByZXR1cm4gcG9pbnRpc2goY29weSgpKTsKICB9OwoKICByZXR1cm4gc2NhbGU7Cn0K CmZ1bmN0aW9uIHBvaW50JDEoKSB7CiAgcmV0dXJuIHBvaW50aXNoKGJhbmQuYXBwbHkobnVsbCwg YXJndW1lbnRzKS5wYWRkaW5nSW5uZXIoMSkpOwp9CgpmdW5jdGlvbiBjb25zdGFudCRhKHgpIHsK ICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4geDsKICB9Owp9CgpmdW5jdGlvbiBudW1i ZXIkMih4KSB7CiAgcmV0dXJuICt4Owp9Cgp2YXIgdW5pdCA9IFswLCAxXTsKCmZ1bmN0aW9uIGlk ZW50aXR5JDYoeCkgewogIHJldHVybiB4Owp9CgpmdW5jdGlvbiBub3JtYWxpemUoYSwgYikgewog IHJldHVybiAoYiAtPSAoYSA9ICthKSkKICAgICAgPyBmdW5jdGlvbih4KSB7IHJldHVybiAoeCAt IGEpIC8gYjsgfQogICAgICA6IGNvbnN0YW50JGEoaXNOYU4oYikgPyBOYU4gOiAwLjUpOwp9Cgpm dW5jdGlvbiBjbGFtcGVyKGRvbWFpbikgewogIHZhciBhID0gZG9tYWluWzBdLCBiID0gZG9tYWlu W2RvbWFpbi5sZW5ndGggLSAxXSwgdDsKICBpZiAoYSA+IGIpIHQgPSBhLCBhID0gYiwgYiA9IHQ7 CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgubWF4KGEsIE1hdGgubWluKGIsIHgp KTsgfTsKfQoKLy8gbm9ybWFsaXplKGEsIGIpKHgpIHRha2VzIGEgZG9tYWluIHZhbHVlIHggaW4g W2EsYl0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHQgaW4gWzAsMV0u Ci8vIGludGVycG9sYXRlKGEsIGIpKHQpIHRha2VzIGEgcGFyYW1ldGVyIHQgaW4gWzAsMV0gYW5k IHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcmFuZ2UgdmFsdWUgeCBpbiBbYSxiXS4KZnVuY3Rp b24gYmltYXAoZG9tYWluLCByYW5nZSwgaW50ZXJwb2xhdGUpIHsKICB2YXIgZDAgPSBkb21haW5b MF0sIGQxID0gZG9tYWluWzFdLCByMCA9IHJhbmdlWzBdLCByMSA9IHJhbmdlWzFdOwogIGlmIChk MSA8IGQwKSBkMCA9IG5vcm1hbGl6ZShkMSwgZDApLCByMCA9IGludGVycG9sYXRlKHIxLCByMCk7 CiAgZWxzZSBkMCA9IG5vcm1hbGl6ZShkMCwgZDEpLCByMCA9IGludGVycG9sYXRlKHIwLCByMSk7 CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHIwKGQwKHgpKTsgfTsKfQoKZnVuY3Rpb24g cG9seW1hcChkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSkgewogIHZhciBqID0gTWF0aC5taW4o ZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoKSAtIDEsCiAgICAgIGQgPSBuZXcgQXJyYXkoaiks CiAgICAgIHIgPSBuZXcgQXJyYXkoaiksCiAgICAgIGkgPSAtMTsKCiAgLy8gUmV2ZXJzZSBkZXNj ZW5kaW5nIGRvbWFpbnMuCiAgaWYgKGRvbWFpbltqXSA8IGRvbWFpblswXSkgewogICAgZG9tYWlu ID0gZG9tYWluLnNsaWNlKCkucmV2ZXJzZSgpOwogICAgcmFuZ2UgPSByYW5nZS5zbGljZSgpLnJl dmVyc2UoKTsKICB9CgogIHdoaWxlICgrK2kgPCBqKSB7CiAgICBkW2ldID0gbm9ybWFsaXplKGRv bWFpbltpXSwgZG9tYWluW2kgKyAxXSk7CiAgICByW2ldID0gaW50ZXJwb2xhdGUocmFuZ2VbaV0s IHJhbmdlW2kgKyAxXSk7CiAgfQoKICByZXR1cm4gZnVuY3Rpb24oeCkgewogICAgdmFyIGkgPSBi aXNlY3RSaWdodChkb21haW4sIHgsIDEsIGopIC0gMTsKICAgIHJldHVybiByW2ldKGRbaV0oeCkp OwogIH07Cn0KCmZ1bmN0aW9uIGNvcHkoc291cmNlLCB0YXJnZXQpIHsKICByZXR1cm4gdGFyZ2V0 CiAgICAgIC5kb21haW4oc291cmNlLmRvbWFpbigpKQogICAgICAucmFuZ2Uoc291cmNlLnJhbmdl KCkpCiAgICAgIC5pbnRlcnBvbGF0ZShzb3VyY2UuaW50ZXJwb2xhdGUoKSkKICAgICAgLmNsYW1w KHNvdXJjZS5jbGFtcCgpKQogICAgICAudW5rbm93bihzb3VyY2UudW5rbm93bigpKTsKfQoKZnVu Y3Rpb24gdHJhbnNmb3JtZXIkMSgpIHsKICB2YXIgZG9tYWluID0gdW5pdCwKICAgICAgcmFuZ2Ug PSB1bml0LAogICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlVmFsdWUsCiAgICAgIHRyYW5z Zm9ybSwKICAgICAgdW50cmFuc2Zvcm0sCiAgICAgIHVua25vd24sCiAgICAgIGNsYW1wID0gaWRl bnRpdHkkNiwKICAgICAgcGllY2V3aXNlLAogICAgICBvdXRwdXQsCiAgICAgIGlucHV0OwoKICBm dW5jdGlvbiByZXNjYWxlKCkgewogICAgcGllY2V3aXNlID0gTWF0aC5taW4oZG9tYWluLmxlbmd0 aCwgcmFuZ2UubGVuZ3RoKSA+IDIgPyBwb2x5bWFwIDogYmltYXA7CiAgICBvdXRwdXQgPSBpbnB1 dCA9IG51bGw7CiAgICByZXR1cm4gc2NhbGU7CiAgfQoKICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAg ICByZXR1cm4gaXNOYU4oeCA9ICt4KSA/IHVua25vd24gOiAob3V0cHV0IHx8IChvdXRwdXQgPSBw aWVjZXdpc2UoZG9tYWluLm1hcCh0cmFuc2Zvcm0pLCByYW5nZSwgaW50ZXJwb2xhdGUpKSkodHJh bnNmb3JtKGNsYW1wKHgpKSk7CiAgfQoKICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih5KSB7CiAg ICByZXR1cm4gY2xhbXAodW50cmFuc2Zvcm0oKGlucHV0IHx8IChpbnB1dCA9IHBpZWNld2lzZShy YW5nZSwgZG9tYWluLm1hcCh0cmFuc2Zvcm0pLCBpbnRlcnBvbGF0ZU51bWJlcikpKSh5KSkpOwog IH07CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMu bGVuZ3RoID8gKGRvbWFpbiA9IG1hcCQzLmNhbGwoXywgbnVtYmVyJDIpLCBjbGFtcCA9PT0gaWRl bnRpdHkkNiB8fCAoY2xhbXAgPSBjbGFtcGVyKGRvbWFpbikpLCByZXNjYWxlKCkpIDogZG9tYWlu LnNsaWNlKCk7CiAgfTsKCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4g YXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IHNsaWNlJDUuY2FsbChfKSwgcmVzY2FsZSgpKSA6 IHJhbmdlLnNsaWNlKCk7CiAgfTsKCiAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHsK ICAgIHJldHVybiByYW5nZSA9IHNsaWNlJDUuY2FsbChfKSwgaW50ZXJwb2xhdGUgPSBpbnRlcnBv bGF0ZVJvdW5kLCByZXNjYWxlKCk7CiAgfTsKCiAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbihfKSB7 CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGFtcCA9IF8gPyBjbGFtcGVyKGRvbWFp bikgOiBpZGVudGl0eSQ2LCBzY2FsZSkgOiBjbGFtcCAhPT0gaWRlbnRpdHkkNjsKICB9OwoKICBz Y2FsZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVu Z3RoID8gKGludGVycG9sYXRlID0gXywgcmVzY2FsZSgpKSA6IGludGVycG9sYXRlOwogIH07Cgog IHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogdW5rbm93bjsKICB9OwoKICByZXR1cm4gZnVuY3Rp b24odCwgdSkgewogICAgdHJhbnNmb3JtID0gdCwgdW50cmFuc2Zvcm0gPSB1OwogICAgcmV0dXJu IHJlc2NhbGUoKTsKICB9Owp9CgpmdW5jdGlvbiBjb250aW51b3VzKHRyYW5zZm9ybSwgdW50cmFu c2Zvcm0pIHsKICByZXR1cm4gdHJhbnNmb3JtZXIkMSgpKHRyYW5zZm9ybSwgdW50cmFuc2Zvcm0p Owp9CgpmdW5jdGlvbiB0aWNrRm9ybWF0KHN0YXJ0LCBzdG9wLCBjb3VudCwgc3BlY2lmaWVyKSB7 CiAgdmFyIHN0ZXAgPSB0aWNrU3RlcChzdGFydCwgc3RvcCwgY291bnQpLAogICAgICBwcmVjaXNp b247CiAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciA9PSBudWxsID8gIixm IiA6IHNwZWNpZmllcik7CiAgc3dpdGNoIChzcGVjaWZpZXIudHlwZSkgewogICAgY2FzZSAicyI6 IHsKICAgICAgdmFyIHZhbHVlID0gTWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLCBNYXRoLmFicyhz dG9wKSk7CiAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHBy ZWNpc2lvbiA9IHByZWNpc2lvblByZWZpeChzdGVwLCB2YWx1ZSkpKSBzcGVjaWZpZXIucHJlY2lz aW9uID0gcHJlY2lzaW9uOwogICAgICByZXR1cm4gZXhwb3J0cy5mb3JtYXRQcmVmaXgoc3BlY2lm aWVyLCB2YWx1ZSk7CiAgICB9CiAgICBjYXNlICIiOgogICAgY2FzZSAiZSI6CiAgICBjYXNlICJn IjoKICAgIGNhc2UgInAiOgogICAgY2FzZSAiciI6IHsKICAgICAgaWYgKHNwZWNpZmllci5wcmVj aXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gcHJlY2lzaW9uUm91bmQoc3RlcCwg TWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLCBNYXRoLmFicyhzdG9wKSkpKSkgc3BlY2lmaWVyLnBy ZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlwZSA9PT0gImUiKTsKICAgICAgYnJl YWs7CiAgICB9CiAgICBjYXNlICJmIjoKICAgIGNhc2UgIiUiOiB7CiAgICAgIGlmIChzcGVjaWZp ZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvbkZpeGVk KHN0ZXApKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlw ZSA9PT0gIiUiKSAqIDI7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICByZXR1cm4gZXhwb3J0cy5m b3JtYXQoc3BlY2lmaWVyKTsKfQoKZnVuY3Rpb24gbGluZWFyaXNoKHNjYWxlKSB7CiAgdmFyIGRv bWFpbiA9IHNjYWxlLmRvbWFpbjsKCiAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihjb3VudCkgewog ICAgdmFyIGQgPSBkb21haW4oKTsKICAgIHJldHVybiB0aWNrcyhkWzBdLCBkW2QubGVuZ3RoIC0g MV0sIGNvdW50ID09IG51bGwgPyAxMCA6IGNvdW50KTsKICB9OwoKICBzY2FsZS50aWNrRm9ybWF0 ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikgewogICAgdmFyIGQgPSBkb21haW4oKTsKICAg IHJldHVybiB0aWNrRm9ybWF0KGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgY291bnQgPT0gbnVsbCA/ IDEwIDogY291bnQsIHNwZWNpZmllcik7CiAgfTsKCiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGNv dW50KSB7CiAgICBpZiAoY291bnQgPT0gbnVsbCkgY291bnQgPSAxMDsKCiAgICB2YXIgZCA9IGRv bWFpbigpLAogICAgICAgIGkwID0gMCwKICAgICAgICBpMSA9IGQubGVuZ3RoIC0gMSwKICAgICAg ICBzdGFydCA9IGRbaTBdLAogICAgICAgIHN0b3AgPSBkW2kxXSwKICAgICAgICBzdGVwOwoKICAg IGlmIChzdG9wIDwgc3RhcnQpIHsKICAgICAgc3RlcCA9IHN0YXJ0LCBzdGFydCA9IHN0b3AsIHN0 b3AgPSBzdGVwOwogICAgICBzdGVwID0gaTAsIGkwID0gaTEsIGkxID0gc3RlcDsKICAgIH0KCiAg ICBzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpOwoKICAgIGlmIChzdGVw ID4gMCkgewogICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc3RhcnQgLyBzdGVwKSAqIHN0ZXA7CiAg ICAgIHN0b3AgPSBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcDsKICAgICAgc3RlcCA9IHRp Y2tJbmNyZW1lbnQoc3RhcnQsIHN0b3AsIGNvdW50KTsKICAgIH0gZWxzZSBpZiAoc3RlcCA8IDAp IHsKICAgICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgKiBzdGVwKSAvIHN0ZXA7CiAgICAgIHN0 b3AgPSBNYXRoLmZsb29yKHN0b3AgKiBzdGVwKSAvIHN0ZXA7CiAgICAgIHN0ZXAgPSB0aWNrSW5j cmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCk7CiAgICB9CgogICAgaWYgKHN0ZXAgPiAwKSB7CiAg ICAgIGRbaTBdID0gTWF0aC5mbG9vcihzdGFydCAvIHN0ZXApICogc3RlcDsKICAgICAgZFtpMV0g PSBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcDsKICAgICAgZG9tYWluKGQpOwogICAgfSBl bHNlIGlmIChzdGVwIDwgMCkgewogICAgICBkW2kwXSA9IE1hdGguY2VpbChzdGFydCAqIHN0ZXAp IC8gc3RlcDsKICAgICAgZFtpMV0gPSBNYXRoLmZsb29yKHN0b3AgKiBzdGVwKSAvIHN0ZXA7CiAg ICAgIGRvbWFpbihkKTsKICAgIH0KCiAgICByZXR1cm4gc2NhbGU7CiAgfTsKCiAgcmV0dXJuIHNj YWxlOwp9CgpmdW5jdGlvbiBsaW5lYXIkMigpIHsKICB2YXIgc2NhbGUgPSBjb250aW51b3VzKGlk ZW50aXR5JDYsIGlkZW50aXR5JDYpOwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICBy ZXR1cm4gY29weShzY2FsZSwgbGluZWFyJDIoKSk7CiAgfTsKCiAgaW5pdFJhbmdlLmFwcGx5KHNj YWxlLCBhcmd1bWVudHMpOwoKICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTsKfQoKZnVuY3Rpb24g aWRlbnRpdHkkNyhkb21haW4pIHsKICB2YXIgdW5rbm93bjsKCiAgZnVuY3Rpb24gc2NhbGUoeCkg ewogICAgcmV0dXJuIGlzTmFOKHggPSAreCkgPyB1bmtub3duIDogeDsKICB9CgogIHNjYWxlLmlu dmVydCA9IHNjYWxlOwoKICBzY2FsZS5kb21haW4gPSBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8p IHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IG1hcCQzLmNhbGwoXywg bnVtYmVyJDIpLCBzY2FsZSkgOiBkb21haW4uc2xpY2UoKTsKICB9OwoKICBzY2FsZS51bmtub3du ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9 IF8sIHNjYWxlKSA6IHVua25vd247CiAgfTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewog ICAgcmV0dXJuIGlkZW50aXR5JDcoZG9tYWluKS51bmtub3duKHVua25vd24pOwogIH07CgogIGRv bWFpbiA9IGFyZ3VtZW50cy5sZW5ndGggPyBtYXAkMy5jYWxsKGRvbWFpbiwgbnVtYmVyJDIpIDog WzAsIDFdOwoKICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTsKfQoKZnVuY3Rpb24gbmljZShkb21h aW4sIGludGVydmFsKSB7CiAgZG9tYWluID0gZG9tYWluLnNsaWNlKCk7CgogIHZhciBpMCA9IDAs CiAgICAgIGkxID0gZG9tYWluLmxlbmd0aCAtIDEsCiAgICAgIHgwID0gZG9tYWluW2kwXSwKICAg ICAgeDEgPSBkb21haW5baTFdLAogICAgICB0OwoKICBpZiAoeDEgPCB4MCkgewogICAgdCA9IGkw LCBpMCA9IGkxLCBpMSA9IHQ7CiAgICB0ID0geDAsIHgwID0geDEsIHgxID0gdDsKICB9CgogIGRv bWFpbltpMF0gPSBpbnRlcnZhbC5mbG9vcih4MCk7CiAgZG9tYWluW2kxXSA9IGludGVydmFsLmNl aWwoeDEpOwogIHJldHVybiBkb21haW47Cn0KCmZ1bmN0aW9uIHRyYW5zZm9ybUxvZyh4KSB7CiAg cmV0dXJuIE1hdGgubG9nKHgpOwp9CgpmdW5jdGlvbiB0cmFuc2Zvcm1FeHAoeCkgewogIHJldHVy biBNYXRoLmV4cCh4KTsKfQoKZnVuY3Rpb24gdHJhbnNmb3JtTG9nbih4KSB7CiAgcmV0dXJuIC1N YXRoLmxvZygteCk7Cn0KCmZ1bmN0aW9uIHRyYW5zZm9ybUV4cG4oeCkgewogIHJldHVybiAtTWF0 aC5leHAoLXgpOwp9CgpmdW5jdGlvbiBwb3cxMCh4KSB7CiAgcmV0dXJuIGlzRmluaXRlKHgpID8g KygiMWUiICsgeCkgOiB4IDwgMCA/IDAgOiB4Owp9CgpmdW5jdGlvbiBwb3dwKGJhc2UpIHsKICBy ZXR1cm4gYmFzZSA9PT0gMTAgPyBwb3cxMAogICAgICA6IGJhc2UgPT09IE1hdGguRSA/IE1hdGgu ZXhwCiAgICAgIDogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5wb3coYmFzZSwgeCk7IH07Cn0K CmZ1bmN0aW9uIGxvZ3AoYmFzZSkgewogIHJldHVybiBiYXNlID09PSBNYXRoLkUgPyBNYXRoLmxv ZwogICAgICA6IGJhc2UgPT09IDEwICYmIE1hdGgubG9nMTAKICAgICAgfHwgYmFzZSA9PT0gMiAm JiBNYXRoLmxvZzIKICAgICAgfHwgKGJhc2UgPSBNYXRoLmxvZyhiYXNlKSwgZnVuY3Rpb24oeCkg eyByZXR1cm4gTWF0aC5sb2coeCkgLyBiYXNlOyB9KTsKfQoKZnVuY3Rpb24gcmVmbGVjdChmKSB7 CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiAtZigteCk7CiAgfTsKfQoKZnVuY3Rp b24gbG9nZ2lzaCh0cmFuc2Zvcm0pIHsKICB2YXIgc2NhbGUgPSB0cmFuc2Zvcm0odHJhbnNmb3Jt TG9nLCB0cmFuc2Zvcm1FeHApLAogICAgICBkb21haW4gPSBzY2FsZS5kb21haW4sCiAgICAgIGJh c2UgPSAxMCwKICAgICAgbG9ncywKICAgICAgcG93czsKCiAgZnVuY3Rpb24gcmVzY2FsZSgpIHsK ICAgIGxvZ3MgPSBsb2dwKGJhc2UpLCBwb3dzID0gcG93cChiYXNlKTsKICAgIGlmIChkb21haW4o KVswXSA8IDApIHsKICAgICAgbG9ncyA9IHJlZmxlY3QobG9ncyksIHBvd3MgPSByZWZsZWN0KHBv d3MpOwogICAgICB0cmFuc2Zvcm0odHJhbnNmb3JtTG9nbiwgdHJhbnNmb3JtRXhwbik7CiAgICB9 IGVsc2UgewogICAgICB0cmFuc2Zvcm0odHJhbnNmb3JtTG9nLCB0cmFuc2Zvcm1FeHApOwogICAg fQogICAgcmV0dXJuIHNjYWxlOwogIH0KCiAgc2NhbGUuYmFzZSA9IGZ1bmN0aW9uKF8pIHsKICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhc2UgPSArXywgcmVzY2FsZSgpKSA6IGJhc2U7 CiAgfTsKCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50 cy5sZW5ndGggPyAoZG9tYWluKF8pLCByZXNjYWxlKCkpIDogZG9tYWluKCk7CiAgfTsKCiAgc2Nh bGUudGlja3MgPSBmdW5jdGlvbihjb3VudCkgewogICAgdmFyIGQgPSBkb21haW4oKSwKICAgICAg ICB1ID0gZFswXSwKICAgICAgICB2ID0gZFtkLmxlbmd0aCAtIDFdLAogICAgICAgIHI7CgogICAg aWYgKHIgPSB2IDwgdSkgaSA9IHUsIHUgPSB2LCB2ID0gaTsKCiAgICB2YXIgaSA9IGxvZ3ModSks CiAgICAgICAgaiA9IGxvZ3ModiksCiAgICAgICAgcCwKICAgICAgICBrLAogICAgICAgIHQsCiAg ICAgICAgbiA9IGNvdW50ID09IG51bGwgPyAxMCA6ICtjb3VudCwKICAgICAgICB6ID0gW107Cgog ICAgaWYgKCEoYmFzZSAlIDEpICYmIGogLSBpIDwgbikgewogICAgICBpID0gTWF0aC5yb3VuZChp KSAtIDEsIGogPSBNYXRoLnJvdW5kKGopICsgMTsKICAgICAgaWYgKHUgPiAwKSBmb3IgKDsgaSA8 IGo7ICsraSkgewogICAgICAgIGZvciAoayA9IDEsIHAgPSBwb3dzKGkpOyBrIDwgYmFzZTsgKytr KSB7CiAgICAgICAgICB0ID0gcCAqIGs7CiAgICAgICAgICBpZiAodCA8IHUpIGNvbnRpbnVlOwog ICAgICAgICAgaWYgKHQgPiB2KSBicmVhazsKICAgICAgICAgIHoucHVzaCh0KTsKICAgICAgICB9 CiAgICAgIH0gZWxzZSBmb3IgKDsgaSA8IGo7ICsraSkgewogICAgICAgIGZvciAoayA9IGJhc2Ug LSAxLCBwID0gcG93cyhpKTsgayA+PSAxOyAtLWspIHsKICAgICAgICAgIHQgPSBwICogazsKICAg ICAgICAgIGlmICh0IDwgdSkgY29udGludWU7CiAgICAgICAgICBpZiAodCA+IHYpIGJyZWFrOwog ICAgICAgICAgei5wdXNoKHQpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAg eiA9IHRpY2tzKGksIGosIE1hdGgubWluKGogLSBpLCBuKSkubWFwKHBvd3MpOwogICAgfQoKICAg IHJldHVybiByID8gei5yZXZlcnNlKCkgOiB6OwogIH07CgogIHNjYWxlLnRpY2tGb3JtYXQgPSBm dW5jdGlvbihjb3VudCwgc3BlY2lmaWVyKSB7CiAgICBpZiAoc3BlY2lmaWVyID09IG51bGwpIHNw ZWNpZmllciA9IGJhc2UgPT09IDEwID8gIi4wZSIgOiAiLCI7CiAgICBpZiAodHlwZW9mIHNwZWNp ZmllciAhPT0gImZ1bmN0aW9uIikgc3BlY2lmaWVyID0gZXhwb3J0cy5mb3JtYXQoc3BlY2lmaWVy KTsKICAgIGlmIChjb3VudCA9PT0gSW5maW5pdHkpIHJldHVybiBzcGVjaWZpZXI7CiAgICBpZiAo Y291bnQgPT0gbnVsbCkgY291bnQgPSAxMDsKICAgIHZhciBrID0gTWF0aC5tYXgoMSwgYmFzZSAq IGNvdW50IC8gc2NhbGUudGlja3MoKS5sZW5ndGgpOyAvLyBUT0RPIGZhc3QgZXN0aW1hdGU/CiAg ICByZXR1cm4gZnVuY3Rpb24oZCkgewogICAgICB2YXIgaSA9IGQgLyBwb3dzKE1hdGgucm91bmQo bG9ncyhkKSkpOwogICAgICBpZiAoaSAqIGJhc2UgPCBiYXNlIC0gMC41KSBpICo9IGJhc2U7CiAg ICAgIHJldHVybiBpIDw9IGsgPyBzcGVjaWZpZXIoZCkgOiAiIjsKICAgIH07CiAgfTsKCiAgc2Nh bGUubmljZSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGRvbWFpbihuaWNlKGRvbWFpbigpLCB7 CiAgICAgIGZsb29yOiBmdW5jdGlvbih4KSB7IHJldHVybiBwb3dzKE1hdGguZmxvb3IobG9ncyh4 KSkpOyB9LAogICAgICBjZWlsOiBmdW5jdGlvbih4KSB7IHJldHVybiBwb3dzKE1hdGguY2VpbChs b2dzKHgpKSk7IH0KICAgIH0pKTsKICB9OwoKICByZXR1cm4gc2NhbGU7Cn0KCmZ1bmN0aW9uIGxv ZyQxKCkgewogIHZhciBzY2FsZSA9IGxvZ2dpc2godHJhbnNmb3JtZXIkMSgpKS5kb21haW4oWzEs IDEwXSk7CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBjb3B5KHNjYWxl LCBsb2ckMSgpKS5iYXNlKHNjYWxlLmJhc2UoKSk7CiAgfTsKCiAgaW5pdFJhbmdlLmFwcGx5KHNj YWxlLCBhcmd1bWVudHMpOwoKICByZXR1cm4gc2NhbGU7Cn0KCmZ1bmN0aW9uIHRyYW5zZm9ybVN5 bWxvZyhjKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKICAgIHJldHVybiBNYXRoLnNpZ24oeCkg KiBNYXRoLmxvZzFwKE1hdGguYWJzKHggLyBjKSk7CiAgfTsKfQoKZnVuY3Rpb24gdHJhbnNmb3Jt U3ltZXhwKGMpIHsKICByZXR1cm4gZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIE1hdGguc2lnbih4 KSAqIE1hdGguZXhwbTEoTWF0aC5hYnMoeCkpICogYzsKICB9Owp9CgpmdW5jdGlvbiBzeW1sb2dp c2godHJhbnNmb3JtKSB7CiAgdmFyIGMgPSAxLCBzY2FsZSA9IHRyYW5zZm9ybSh0cmFuc2Zvcm1T eW1sb2coYyksIHRyYW5zZm9ybVN5bWV4cChjKSk7CgogIHNjYWxlLmNvbnN0YW50ID0gZnVuY3Rp b24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0cmFuc2Zvcm0odHJhbnNmb3Jt U3ltbG9nKGMgPSArXyksIHRyYW5zZm9ybVN5bWV4cChjKSkgOiBjOwogIH07CgogIHJldHVybiBs aW5lYXJpc2goc2NhbGUpOwp9CgpmdW5jdGlvbiBzeW1sb2coKSB7CiAgdmFyIHNjYWxlID0gc3lt bG9naXNoKHRyYW5zZm9ybWVyJDEoKSk7CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAg IHJldHVybiBjb3B5KHNjYWxlLCBzeW1sb2coKSkuY29uc3RhbnQoc2NhbGUuY29uc3RhbnQoKSk7 CiAgfTsKCiAgcmV0dXJuIGluaXRSYW5nZS5hcHBseShzY2FsZSwgYXJndW1lbnRzKTsKfQoKZnVu Y3Rpb24gdHJhbnNmb3JtUG93KGV4cG9uZW50KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKICAg IHJldHVybiB4IDwgMCA/IC1NYXRoLnBvdygteCwgZXhwb25lbnQpIDogTWF0aC5wb3coeCwgZXhw b25lbnQpOwogIH07Cn0KCmZ1bmN0aW9uIHRyYW5zZm9ybVNxcnQoeCkgewogIHJldHVybiB4IDwg MCA/IC1NYXRoLnNxcnQoLXgpIDogTWF0aC5zcXJ0KHgpOwp9CgpmdW5jdGlvbiB0cmFuc2Zvcm1T cXVhcmUoeCkgewogIHJldHVybiB4IDwgMCA/IC14ICogeCA6IHggKiB4Owp9CgpmdW5jdGlvbiBw b3dpc2godHJhbnNmb3JtKSB7CiAgdmFyIHNjYWxlID0gdHJhbnNmb3JtKGlkZW50aXR5JDYsIGlk ZW50aXR5JDYpLAogICAgICBleHBvbmVudCA9IDE7CgogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAg ICByZXR1cm4gZXhwb25lbnQgPT09IDEgPyB0cmFuc2Zvcm0oaWRlbnRpdHkkNiwgaWRlbnRpdHkk NikKICAgICAgICA6IGV4cG9uZW50ID09PSAwLjUgPyB0cmFuc2Zvcm0odHJhbnNmb3JtU3FydCwg dHJhbnNmb3JtU3F1YXJlKQogICAgICAgIDogdHJhbnNmb3JtKHRyYW5zZm9ybVBvdyhleHBvbmVu dCksIHRyYW5zZm9ybVBvdygxIC8gZXhwb25lbnQpKTsKICB9CgogIHNjYWxlLmV4cG9uZW50ID0g ZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXhwb25lbnQgPSAr XywgcmVzY2FsZSgpKSA6IGV4cG9uZW50OwogIH07CgogIHJldHVybiBsaW5lYXJpc2goc2NhbGUp Owp9CgpmdW5jdGlvbiBwb3ckMSgpIHsKICB2YXIgc2NhbGUgPSBwb3dpc2godHJhbnNmb3JtZXIk MSgpKTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGNvcHkoc2NhbGUs IHBvdyQxKCkpLmV4cG9uZW50KHNjYWxlLmV4cG9uZW50KCkpOwogIH07CgogIGluaXRSYW5nZS5h cHBseShzY2FsZSwgYXJndW1lbnRzKTsKCiAgcmV0dXJuIHNjYWxlOwp9CgpmdW5jdGlvbiBzcXJ0 JDEoKSB7CiAgcmV0dXJuIHBvdyQxLmFwcGx5KG51bGwsIGFyZ3VtZW50cykuZXhwb25lbnQoMC41 KTsKfQoKZnVuY3Rpb24gcXVhbnRpbGUoKSB7CiAgdmFyIGRvbWFpbiA9IFtdLAogICAgICByYW5n ZSA9IFtdLAogICAgICB0aHJlc2hvbGRzID0gW10sCiAgICAgIHVua25vd247CgogIGZ1bmN0aW9u IHJlc2NhbGUoKSB7CiAgICB2YXIgaSA9IDAsIG4gPSBNYXRoLm1heCgxLCByYW5nZS5sZW5ndGgp OwogICAgdGhyZXNob2xkcyA9IG5ldyBBcnJheShuIC0gMSk7CiAgICB3aGlsZSAoKytpIDwgbikg dGhyZXNob2xkc1tpIC0gMV0gPSB0aHJlc2hvbGQoZG9tYWluLCBpIC8gbik7CiAgICByZXR1cm4g c2NhbGU7CiAgfQoKICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICByZXR1cm4gaXNOYU4oeCA9ICt4 KSA/IHVua25vd24gOiByYW5nZVtiaXNlY3RSaWdodCh0aHJlc2hvbGRzLCB4KV07CiAgfQoKICBz Y2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7CiAgICB2YXIgaSA9IHJhbmdlLmluZGV4 T2YoeSk7CiAgICByZXR1cm4gaSA8IDAgPyBbTmFOLCBOYU5dIDogWwogICAgICBpID4gMCA/IHRo cmVzaG9sZHNbaSAtIDFdIDogZG9tYWluWzBdLAogICAgICBpIDwgdGhyZXNob2xkcy5sZW5ndGgg PyB0aHJlc2hvbGRzW2ldIDogZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXQogICAgXTsKICB9OwoK ICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgp IHJldHVybiBkb21haW4uc2xpY2UoKTsKICAgIGRvbWFpbiA9IFtdOwogICAgZm9yICh2YXIgaSA9 IDAsIG4gPSBfLmxlbmd0aCwgZDsgaSA8IG47ICsraSkgaWYgKGQgPSBfW2ldLCBkICE9IG51bGwg JiYgIWlzTmFOKGQgPSArZCkpIGRvbWFpbi5wdXNoKGQpOwogICAgZG9tYWluLnNvcnQoYXNjZW5k aW5nKTsKICAgIHJldHVybiByZXNjYWxlKCk7CiAgfTsKCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlv bihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IHNsaWNlJDUuY2Fs bChfKSwgcmVzY2FsZSgpKSA6IHJhbmdlLnNsaWNlKCk7CiAgfTsKCiAgc2NhbGUudW5rbm93biA9 IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBf LCBzY2FsZSkgOiB1bmtub3duOwogIH07CgogIHNjYWxlLnF1YW50aWxlcyA9IGZ1bmN0aW9uKCkg ewogICAgcmV0dXJuIHRocmVzaG9sZHMuc2xpY2UoKTsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVu Y3Rpb24oKSB7CiAgICByZXR1cm4gcXVhbnRpbGUoKQogICAgICAgIC5kb21haW4oZG9tYWluKQog ICAgICAgIC5yYW5nZShyYW5nZSkKICAgICAgICAudW5rbm93bih1bmtub3duKTsKICB9OwoKICBy ZXR1cm4gaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpOwp9CgpmdW5jdGlvbiBxdWFu dGl6ZSQxKCkgewogIHZhciB4MCA9IDAsCiAgICAgIHgxID0gMSwKICAgICAgbiA9IDEsCiAgICAg IGRvbWFpbiA9IFswLjVdLAogICAgICByYW5nZSA9IFswLCAxXSwKICAgICAgdW5rbm93bjsKCiAg ZnVuY3Rpb24gc2NhbGUoeCkgewogICAgcmV0dXJuIHggPD0geCA/IHJhbmdlW2Jpc2VjdFJpZ2h0 KGRvbWFpbiwgeCwgMCwgbildIDogdW5rbm93bjsKICB9CgogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7 CiAgICB2YXIgaSA9IC0xOwogICAgZG9tYWluID0gbmV3IEFycmF5KG4pOwogICAgd2hpbGUgKCsr aSA8IG4pIGRvbWFpbltpXSA9ICgoaSArIDEpICogeDEgLSAoaSAtIG4pICogeDApIC8gKG4gKyAx KTsKICAgIHJldHVybiBzY2FsZTsKICB9CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsK ICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gK19bMF0sIHgxID0gK19bMV0sIHJl c2NhbGUoKSkgOiBbeDAsIHgxXTsKICB9OwoKICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsK ICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG4gPSAocmFuZ2UgPSBzbGljZSQ1LmNhbGwo XykpLmxlbmd0aCAtIDEsIHJlc2NhbGUoKSkgOiByYW5nZS5zbGljZSgpOwogIH07CgogIHNjYWxl LmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHsKICAgIHZhciBpID0gcmFuZ2UuaW5kZXhPZih5 KTsKICAgIHJldHVybiBpIDwgMCA/IFtOYU4sIE5hTl0KICAgICAgICA6IGkgPCAxID8gW3gwLCBk b21haW5bMF1dCiAgICAgICAgOiBpID49IG4gPyBbZG9tYWluW24gLSAxXSwgeDFdCiAgICAgICAg OiBbZG9tYWluW2kgLSAxXSwgZG9tYWluW2ldXTsKICB9OwoKICBzY2FsZS51bmtub3duID0gZnVu Y3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNj YWxlKSA6IHNjYWxlOwogIH07CgogIHNjYWxlLnRocmVzaG9sZHMgPSBmdW5jdGlvbigpIHsKICAg IHJldHVybiBkb21haW4uc2xpY2UoKTsKICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7 CiAgICByZXR1cm4gcXVhbnRpemUkMSgpCiAgICAgICAgLmRvbWFpbihbeDAsIHgxXSkKICAgICAg ICAucmFuZ2UocmFuZ2UpCiAgICAgICAgLnVua25vd24odW5rbm93bik7CiAgfTsKCiAgcmV0dXJu IGluaXRSYW5nZS5hcHBseShsaW5lYXJpc2goc2NhbGUpLCBhcmd1bWVudHMpOwp9CgpmdW5jdGlv biB0aHJlc2hvbGQkMSgpIHsKICB2YXIgZG9tYWluID0gWzAuNV0sCiAgICAgIHJhbmdlID0gWzAs IDFdLAogICAgICB1bmtub3duLAogICAgICBuID0gMTsKCiAgZnVuY3Rpb24gc2NhbGUoeCkgewog ICAgcmV0dXJuIHggPD0geCA/IHJhbmdlW2Jpc2VjdFJpZ2h0KGRvbWFpbiwgeCwgMCwgbildIDog dW5rbm93bjsKICB9CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBh cmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IHNsaWNlJDUuY2FsbChfKSwgbiA9IE1hdGgubWlu KGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCAtIDEpLCBzY2FsZSkgOiBkb21haW4uc2xpY2Uo KTsKICB9OwoKICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVu dHMubGVuZ3RoID8gKHJhbmdlID0gc2xpY2UkNS5jYWxsKF8pLCBuID0gTWF0aC5taW4oZG9tYWlu Lmxlbmd0aCwgcmFuZ2UubGVuZ3RoIC0gMSksIHNjYWxlKSA6IHJhbmdlLnNsaWNlKCk7CiAgfTsK CiAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkgewogICAgdmFyIGkgPSByYW5nZS5p bmRleE9mKHkpOwogICAgcmV0dXJuIFtkb21haW5baSAtIDFdLCBkb21haW5baV1dOwogIH07Cgog IHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogdW5rbm93bjsKICB9OwoKICBzY2FsZS5jb3B5ID0g ZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhyZXNob2xkJDEoKQogICAgICAgIC5kb21haW4oZG9t YWluKQogICAgICAgIC5yYW5nZShyYW5nZSkKICAgICAgICAudW5rbm93bih1bmtub3duKTsKICB9 OwoKICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpOwp9Cgp2YXIgdDAk MSA9IG5ldyBEYXRlLAogICAgdDEkMSA9IG5ldyBEYXRlOwoKZnVuY3Rpb24gbmV3SW50ZXJ2YWwo Zmxvb3JpLCBvZmZzZXRpLCBjb3VudCwgZmllbGQpIHsKCiAgZnVuY3Rpb24gaW50ZXJ2YWwoZGF0 ZSkgewogICAgcmV0dXJuIGZsb29yaShkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMCA/IG5l dyBEYXRlIDogbmV3IERhdGUoK2RhdGUpKSwgZGF0ZTsKICB9CgogIGludGVydmFsLmZsb29yID0g ZnVuY3Rpb24oZGF0ZSkgewogICAgcmV0dXJuIGZsb29yaShkYXRlID0gbmV3IERhdGUoK2RhdGUp KSwgZGF0ZTsKICB9OwoKICBpbnRlcnZhbC5jZWlsID0gZnVuY3Rpb24oZGF0ZSkgewogICAgcmV0 dXJuIGZsb29yaShkYXRlID0gbmV3IERhdGUoZGF0ZSAtIDEpKSwgb2Zmc2V0aShkYXRlLCAxKSwg Zmxvb3JpKGRhdGUpLCBkYXRlOwogIH07CgogIGludGVydmFsLnJvdW5kID0gZnVuY3Rpb24oZGF0 ZSkgewogICAgdmFyIGQwID0gaW50ZXJ2YWwoZGF0ZSksCiAgICAgICAgZDEgPSBpbnRlcnZhbC5j ZWlsKGRhdGUpOwogICAgcmV0dXJuIGRhdGUgLSBkMCA8IGQxIC0gZGF0ZSA/IGQwIDogZDE7CiAg fTsKCiAgaW50ZXJ2YWwub2Zmc2V0ID0gZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgcmV0dXJu IG9mZnNldGkoZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKSwgc3RlcCA9PSBudWxsID8gMSA6IE1hdGgu Zmxvb3Ioc3RlcCkpLCBkYXRlOwogIH07CgogIGludGVydmFsLnJhbmdlID0gZnVuY3Rpb24oc3Rh cnQsIHN0b3AsIHN0ZXApIHsKICAgIHZhciByYW5nZSA9IFtdLCBwcmV2aW91czsKICAgIHN0YXJ0 ID0gaW50ZXJ2YWwuY2VpbChzdGFydCk7CiAgICBzdGVwID0gc3RlcCA9PSBudWxsID8gMSA6IE1h dGguZmxvb3Ioc3RlcCk7CiAgICBpZiAoIShzdGFydCA8IHN0b3ApIHx8ICEoc3RlcCA+IDApKSBy ZXR1cm4gcmFuZ2U7IC8vIGFsc28gaGFuZGxlcyBJbnZhbGlkIERhdGUKICAgIGRvIHJhbmdlLnB1 c2gocHJldmlvdXMgPSBuZXcgRGF0ZSgrc3RhcnQpKSwgb2Zmc2V0aShzdGFydCwgc3RlcCksIGZs b29yaShzdGFydCk7CiAgICB3aGlsZSAocHJldmlvdXMgPCBzdGFydCAmJiBzdGFydCA8IHN0b3Ap OwogICAgcmV0dXJuIHJhbmdlOwogIH07CgogIGludGVydmFsLmZpbHRlciA9IGZ1bmN0aW9uKHRl c3QpIHsKICAgIHJldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICAgIGlmIChk YXRlID49IGRhdGUpIHdoaWxlIChmbG9vcmkoZGF0ZSksICF0ZXN0KGRhdGUpKSBkYXRlLnNldFRp bWUoZGF0ZSAtIDEpOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBpZiAoZGF0 ZSA+PSBkYXRlKSB7CiAgICAgICAgaWYgKHN0ZXAgPCAwKSB3aGlsZSAoKytzdGVwIDw9IDApIHsK ICAgICAgICAgIHdoaWxlIChvZmZzZXRpKGRhdGUsIC0xKSwgIXRlc3QoZGF0ZSkpIHt9IC8vIGVz bGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHkKICAgICAgICB9IGVsc2Ugd2hpbGUgKC0tc3RlcCA+ PSAwKSB7CiAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCArMSksICF0ZXN0KGRhdGUpKSB7 fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5CiAgICAgICAgfQogICAgICB9CiAgICB9 KTsKICB9OwoKICBpZiAoY291bnQpIHsKICAgIGludGVydmFsLmNvdW50ID0gZnVuY3Rpb24oc3Rh cnQsIGVuZCkgewogICAgICB0MCQxLnNldFRpbWUoK3N0YXJ0KSwgdDEkMS5zZXRUaW1lKCtlbmQp OwogICAgICBmbG9vcmkodDAkMSksIGZsb29yaSh0MSQxKTsKICAgICAgcmV0dXJuIE1hdGguZmxv b3IoY291bnQodDAkMSwgdDEkMSkpOwogICAgfTsKCiAgICBpbnRlcnZhbC5ldmVyeSA9IGZ1bmN0 aW9uKHN0ZXApIHsKICAgICAgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7CiAgICAgIHJldHVybiAh aXNGaW5pdGUoc3RlcCkgfHwgIShzdGVwID4gMCkgPyBudWxsCiAgICAgICAgICA6ICEoc3RlcCA+ IDEpID8gaW50ZXJ2YWwKICAgICAgICAgIDogaW50ZXJ2YWwuZmlsdGVyKGZpZWxkCiAgICAgICAg ICAgICAgPyBmdW5jdGlvbihkKSB7IHJldHVybiBmaWVsZChkKSAlIHN0ZXAgPT09IDA7IH0KICAg ICAgICAgICAgICA6IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGludGVydmFsLmNvdW50KDAsIGQpICUg c3RlcCA9PT0gMDsgfSk7CiAgICB9OwogIH0KCiAgcmV0dXJuIGludGVydmFsOwp9Cgp2YXIgbWls bGlzZWNvbmQgPSBuZXdJbnRlcnZhbChmdW5jdGlvbigpIHsKICAvLyBub29wCn0sIGZ1bmN0aW9u KGRhdGUsIHN0ZXApIHsKICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwKTsKfSwgZnVuY3Rpb24o c3RhcnQsIGVuZCkgewogIHJldHVybiBlbmQgLSBzdGFydDsKfSk7CgovLyBBbiBvcHRpbWl6ZWQg aW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2ltcGxlIGNhc2UuCm1pbGxpc2Vjb25kLmV2ZXJ5ID0g ZnVuY3Rpb24oaykgewogIGsgPSBNYXRoLmZsb29yKGspOwogIGlmICghaXNGaW5pdGUoaykgfHwg IShrID4gMCkpIHJldHVybiBudWxsOwogIGlmICghKGsgPiAxKSkgcmV0dXJuIG1pbGxpc2Vjb25k OwogIHJldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICBkYXRlLnNldFRpbWUo TWF0aC5mbG9vcihkYXRlIC8gaykgKiBrKTsKICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAg ICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogayk7CiAgfSwgZnVuY3Rpb24oc3RhcnQsIGVu ZCkgewogICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBrOwogIH0pOwp9Owp2YXIgbWlsbGlzZWNv bmRzID0gbWlsbGlzZWNvbmQucmFuZ2U7Cgp2YXIgZHVyYXRpb25TZWNvbmQgPSAxZTM7CnZhciBk dXJhdGlvbk1pbnV0ZSA9IDZlNDsKdmFyIGR1cmF0aW9uSG91ciA9IDM2ZTU7CnZhciBkdXJhdGlv bkRheSA9IDg2NGU1Owp2YXIgZHVyYXRpb25XZWVrID0gNjA0OGU1OwoKdmFyIHNlY29uZCA9IG5l d0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICBkYXRlLnNldFRpbWUoZGF0ZSAtIGRhdGUuZ2V0 TWlsbGlzZWNvbmRzKCkpOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRUaW1l KCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uU2Vjb25kKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkg ewogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25TZWNvbmQ7Cn0sIGZ1bmN0aW9uKGRh dGUpIHsKICByZXR1cm4gZGF0ZS5nZXRVVENTZWNvbmRzKCk7Cn0pOwp2YXIgc2Vjb25kcyA9IHNl Y29uZC5yYW5nZTsKCnZhciBtaW51dGUgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAg ZGF0ZS5zZXRUaW1lKGRhdGUgLSBkYXRlLmdldE1pbGxpc2Vjb25kcygpIC0gZGF0ZS5nZXRTZWNv bmRzKCkgKiBkdXJhdGlvblNlY29uZCk7Cn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICBkYXRl LnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25NaW51dGUpOwp9LCBmdW5jdGlvbihzdGFy dCwgZW5kKSB7CiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbk1pbnV0ZTsKfSwgZnVu Y3Rpb24oZGF0ZSkgewogIHJldHVybiBkYXRlLmdldE1pbnV0ZXMoKTsKfSk7CnZhciBtaW51dGVz ID0gbWludXRlLnJhbmdlOwoKdmFyIGhvdXIgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7 CiAgZGF0ZS5zZXRUaW1lKGRhdGUgLSBkYXRlLmdldE1pbGxpc2Vjb25kcygpIC0gZGF0ZS5nZXRT ZWNvbmRzKCkgKiBkdXJhdGlvblNlY29uZCAtIGRhdGUuZ2V0TWludXRlcygpICogZHVyYXRpb25N aW51dGUpOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsg c3RlcCAqIGR1cmF0aW9uSG91cik7Cn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICByZXR1cm4g KGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uSG91cjsKfSwgZnVuY3Rpb24oZGF0ZSkgewogIHJldHVy biBkYXRlLmdldEhvdXJzKCk7Cn0pOwp2YXIgaG91cnMgPSBob3VyLnJhbmdlOwoKdmFyIGRheSA9 IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDAp Owp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgp ICsgc3RlcCk7Cn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICByZXR1cm4gKGVuZCAtIHN0YXJ0 IC0gKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpIC0gc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkg KiBkdXJhdGlvbk1pbnV0ZSkgLyBkdXJhdGlvbkRheTsKfSwgZnVuY3Rpb24oZGF0ZSkgewogIHJl dHVybiBkYXRlLmdldERhdGUoKSAtIDE7Cn0pOwp2YXIgZGF5cyA9IGRheS5yYW5nZTsKCmZ1bmN0 aW9uIHdlZWtkYXkoaSkgewogIHJldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAg ICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSAoZGF0ZS5nZXREYXkoKSArIDcgLSBpKSAl IDcpOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICB9LCBmdW5jdGlvbihkYXRlLCBz dGVwKSB7CiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwICogNyk7CiAgfSwg ZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgcmV0dXJuIChlbmQgLSBzdGFydCAtIChlbmQuZ2V0 VGltZXpvbmVPZmZzZXQoKSAtIHN0YXJ0LmdldFRpbWV6b25lT2Zmc2V0KCkpICogZHVyYXRpb25N aW51dGUpIC8gZHVyYXRpb25XZWVrOwogIH0pOwp9Cgp2YXIgc3VuZGF5ID0gd2Vla2RheSgwKTsK dmFyIG1vbmRheSA9IHdlZWtkYXkoMSk7CnZhciB0dWVzZGF5ID0gd2Vla2RheSgyKTsKdmFyIHdl ZG5lc2RheSA9IHdlZWtkYXkoMyk7CnZhciB0aHVyc2RheSA9IHdlZWtkYXkoNCk7CnZhciBmcmlk YXkgPSB3ZWVrZGF5KDUpOwp2YXIgc2F0dXJkYXkgPSB3ZWVrZGF5KDYpOwoKdmFyIHN1bmRheXMg PSBzdW5kYXkucmFuZ2U7CnZhciBtb25kYXlzID0gbW9uZGF5LnJhbmdlOwp2YXIgdHVlc2RheXMg PSB0dWVzZGF5LnJhbmdlOwp2YXIgd2VkbmVzZGF5cyA9IHdlZG5lc2RheS5yYW5nZTsKdmFyIHRo dXJzZGF5cyA9IHRodXJzZGF5LnJhbmdlOwp2YXIgZnJpZGF5cyA9IGZyaWRheS5yYW5nZTsKdmFy IHNhdHVyZGF5cyA9IHNhdHVyZGF5LnJhbmdlOwoKdmFyIG1vbnRoID0gbmV3SW50ZXJ2YWwoZnVu Y3Rpb24oZGF0ZSkgewogIGRhdGUuc2V0RGF0ZSgxKTsKICBkYXRlLnNldEhvdXJzKDAsIDAsIDAs IDApOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1v bnRoKCkgKyBzdGVwKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogIHJldHVybiBlbmQuZ2V0 TW9udGgoKSAtIHN0YXJ0LmdldE1vbnRoKCkgKyAoZW5kLmdldEZ1bGxZZWFyKCkgLSBzdGFydC5n ZXRGdWxsWWVhcigpKSAqIDEyOwp9LCBmdW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0 TW9udGgoKTsKfSk7CnZhciBtb250aHMgPSBtb250aC5yYW5nZTsKCnZhciB5ZWFyID0gbmV3SW50 ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogIGRhdGUuc2V0TW9udGgoMCwgMSk7CiAgZGF0ZS5zZXRI b3VycygwLCAwLCAwLCAwKTsKfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogIGRhdGUuc2V0RnVs bFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpICsgc3RlcCk7Cn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQp IHsKICByZXR1cm4gZW5kLmdldEZ1bGxZZWFyKCkgLSBzdGFydC5nZXRGdWxsWWVhcigpOwp9LCBm dW5jdGlvbihkYXRlKSB7CiAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKTsKfSk7CgovLyBBbiBv cHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2ltcGxlIGNhc2UuCnllYXIuZXZlcnkg PSBmdW5jdGlvbihrKSB7CiAgcmV0dXJuICFpc0Zpbml0ZShrID0gTWF0aC5mbG9vcihrKSkgfHwg IShrID4gMCkgPyBudWxsIDogbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgZGF0ZS5z ZXRGdWxsWWVhcihNYXRoLmZsb29yKGRhdGUuZ2V0RnVsbFllYXIoKSAvIGspICogayk7CiAgICBk YXRlLnNldE1vbnRoKDAsIDEpOwogICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICB9LCBm dW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFll YXIoKSArIHN0ZXAgKiBrKTsKICB9KTsKfTsKdmFyIHllYXJzID0geWVhci5yYW5nZTsKCnZhciB1 dGNNaW51dGUgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgZGF0ZS5zZXRVVENTZWNv bmRzKDAsIDApOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRUaW1lKCtkYXRl ICsgc3RlcCAqIGR1cmF0aW9uTWludXRlKTsKfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogIHJl dHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25NaW51dGU7Cn0sIGZ1bmN0aW9uKGRhdGUpIHsK ICByZXR1cm4gZGF0ZS5nZXRVVENNaW51dGVzKCk7Cn0pOwp2YXIgdXRjTWludXRlcyA9IHV0Y01p bnV0ZS5yYW5nZTsKCnZhciB1dGNIb3VyID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewog IGRhdGUuc2V0VVRDTWludXRlcygwLCAwLCAwKTsKfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewog IGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbkhvdXIpOwp9LCBmdW5jdGlvbihz dGFydCwgZW5kKSB7CiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkhvdXI7Cn0sIGZ1 bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRVVENIb3VycygpOwp9KTsKdmFyIHV0Y0hv dXJzID0gdXRjSG91ci5yYW5nZTsKCnZhciB1dGNEYXkgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihk YXRlKSB7CiAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKfSwgZnVuY3Rpb24oZGF0ZSwg c3RlcCkgewogIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIHN0ZXApOwp9LCBm dW5jdGlvbihzdGFydCwgZW5kKSB7CiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkRh eTsKfSwgZnVuY3Rpb24oZGF0ZSkgewogIHJldHVybiBkYXRlLmdldFVUQ0RhdGUoKSAtIDE7Cn0p Owp2YXIgdXRjRGF5cyA9IHV0Y0RheS5yYW5nZTsKCmZ1bmN0aW9uIHV0Y1dlZWtkYXkoaSkgewog IHJldHVybiBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICBkYXRlLnNldFVUQ0RhdGUo ZGF0ZS5nZXRVVENEYXRlKCkgLSAoZGF0ZS5nZXRVVENEYXkoKSArIDcgLSBpKSAlIDcpOwogICAg ZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7 CiAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBzdGVwICogNyk7CiAgfSwg ZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlv bldlZWs7CiAgfSk7Cn0KCnZhciB1dGNTdW5kYXkgPSB1dGNXZWVrZGF5KDApOwp2YXIgdXRjTW9u ZGF5ID0gdXRjV2Vla2RheSgxKTsKdmFyIHV0Y1R1ZXNkYXkgPSB1dGNXZWVrZGF5KDIpOwp2YXIg dXRjV2VkbmVzZGF5ID0gdXRjV2Vla2RheSgzKTsKdmFyIHV0Y1RodXJzZGF5ID0gdXRjV2Vla2Rh eSg0KTsKdmFyIHV0Y0ZyaWRheSA9IHV0Y1dlZWtkYXkoNSk7CnZhciB1dGNTYXR1cmRheSA9IHV0 Y1dlZWtkYXkoNik7Cgp2YXIgdXRjU3VuZGF5cyA9IHV0Y1N1bmRheS5yYW5nZTsKdmFyIHV0Y01v bmRheXMgPSB1dGNNb25kYXkucmFuZ2U7CnZhciB1dGNUdWVzZGF5cyA9IHV0Y1R1ZXNkYXkucmFu Z2U7CnZhciB1dGNXZWRuZXNkYXlzID0gdXRjV2VkbmVzZGF5LnJhbmdlOwp2YXIgdXRjVGh1cnNk YXlzID0gdXRjVGh1cnNkYXkucmFuZ2U7CnZhciB1dGNGcmlkYXlzID0gdXRjRnJpZGF5LnJhbmdl Owp2YXIgdXRjU2F0dXJkYXlzID0gdXRjU2F0dXJkYXkucmFuZ2U7Cgp2YXIgdXRjTW9udGggPSBu ZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgZGF0ZS5zZXRVVENEYXRlKDEpOwogIGRhdGUu c2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7Cn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICBkYXRl LnNldFVUQ01vbnRoKGRhdGUuZ2V0VVRDTW9udGgoKSArIHN0ZXApOwp9LCBmdW5jdGlvbihzdGFy dCwgZW5kKSB7CiAgcmV0dXJuIGVuZC5nZXRVVENNb250aCgpIC0gc3RhcnQuZ2V0VVRDTW9udGgo KSArIChlbmQuZ2V0VVRDRnVsbFllYXIoKSAtIHN0YXJ0LmdldFVUQ0Z1bGxZZWFyKCkpICogMTI7 Cn0sIGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRVVENNb250aCgpOwp9KTsKdmFy IHV0Y01vbnRocyA9IHV0Y01vbnRoLnJhbmdlOwoKdmFyIHV0Y1llYXIgPSBuZXdJbnRlcnZhbChm dW5jdGlvbihkYXRlKSB7CiAgZGF0ZS5zZXRVVENNb250aCgwLCAxKTsKICBkYXRlLnNldFVUQ0hv dXJzKDAsIDAsIDAsIDApOwp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgZGF0ZS5zZXRVVENG dWxsWWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgKyBzdGVwKTsKfSwgZnVuY3Rpb24oc3RhcnQs IGVuZCkgewogIHJldHVybiBlbmQuZ2V0VVRDRnVsbFllYXIoKSAtIHN0YXJ0LmdldFVUQ0Z1bGxZ ZWFyKCk7Cn0sIGZ1bmN0aW9uKGRhdGUpIHsKICByZXR1cm4gZGF0ZS5nZXRVVENGdWxsWWVhcigp Owp9KTsKCi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2Fz ZS4KdXRjWWVhci5ldmVyeSA9IGZ1bmN0aW9uKGspIHsKICByZXR1cm4gIWlzRmluaXRlKGsgPSBN YXRoLmZsb29yKGspKSB8fCAhKGsgPiAwKSA/IG51bGwgOiBuZXdJbnRlcnZhbChmdW5jdGlvbihk YXRlKSB7CiAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3IoZGF0ZS5nZXRVVENGdWxs WWVhcigpIC8gaykgKiBrKTsKICAgIGRhdGUuc2V0VVRDTW9udGgoMCwgMSk7CiAgICBkYXRlLnNl dFVUQ0hvdXJzKDAsIDAsIDAsIDApOwogIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgIGRh dGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgc3RlcCAqIGspOwogIH0p Owp9Owp2YXIgdXRjWWVhcnMgPSB1dGNZZWFyLnJhbmdlOwoKZnVuY3Rpb24gbG9jYWxEYXRlKGQp IHsKICBpZiAoMCA8PSBkLnkgJiYgZC55IDwgMTAwKSB7CiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRl KC0xLCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKTsKICAgIGRhdGUuc2V0RnVsbFllYXIo ZC55KTsKICAgIHJldHVybiBkYXRlOwogIH0KICByZXR1cm4gbmV3IERhdGUoZC55LCBkLm0sIGQu ZCwgZC5ILCBkLk0sIGQuUywgZC5MKTsKfQoKZnVuY3Rpb24gdXRjRGF0ZShkKSB7CiAgaWYgKDAg PD0gZC55ICYmIGQueSA8IDEwMCkgewogICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQygt MSwgZC5tLCBkLmQsIGQuSCwgZC5NLCBkLlMsIGQuTCkpOwogICAgZGF0ZS5zZXRVVENGdWxsWWVh cihkLnkpOwogICAgcmV0dXJuIGRhdGU7CiAgfQogIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhk LnksIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpKTsKfQoKZnVuY3Rpb24gbmV3RGF0ZSh5 LCBtLCBkKSB7CiAgcmV0dXJuIHt5OiB5LCBtOiBtLCBkOiBkLCBIOiAwLCBNOiAwLCBTOiAwLCBM OiAwfTsKfQoKZnVuY3Rpb24gZm9ybWF0TG9jYWxlJDEobG9jYWxlKSB7CiAgdmFyIGxvY2FsZV9k YXRlVGltZSA9IGxvY2FsZS5kYXRlVGltZSwKICAgICAgbG9jYWxlX2RhdGUgPSBsb2NhbGUuZGF0 ZSwKICAgICAgbG9jYWxlX3RpbWUgPSBsb2NhbGUudGltZSwKICAgICAgbG9jYWxlX3BlcmlvZHMg PSBsb2NhbGUucGVyaW9kcywKICAgICAgbG9jYWxlX3dlZWtkYXlzID0gbG9jYWxlLmRheXMsCiAg ICAgIGxvY2FsZV9zaG9ydFdlZWtkYXlzID0gbG9jYWxlLnNob3J0RGF5cywKICAgICAgbG9jYWxl X21vbnRocyA9IGxvY2FsZS5tb250aHMsCiAgICAgIGxvY2FsZV9zaG9ydE1vbnRocyA9IGxvY2Fs ZS5zaG9ydE1vbnRoczsKCiAgdmFyIHBlcmlvZFJlID0gZm9ybWF0UmUobG9jYWxlX3BlcmlvZHMp LAogICAgICBwZXJpb2RMb29rdXAgPSBmb3JtYXRMb29rdXAobG9jYWxlX3BlcmlvZHMpLAogICAg ICB3ZWVrZGF5UmUgPSBmb3JtYXRSZShsb2NhbGVfd2Vla2RheXMpLAogICAgICB3ZWVrZGF5TG9v a3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV93ZWVrZGF5cyksCiAgICAgIHNob3J0V2Vla2RheVJl ID0gZm9ybWF0UmUobG9jYWxlX3Nob3J0V2Vla2RheXMpLAogICAgICBzaG9ydFdlZWtkYXlMb29r dXAgPSBmb3JtYXRMb29rdXAobG9jYWxlX3Nob3J0V2Vla2RheXMpLAogICAgICBtb250aFJlID0g Zm9ybWF0UmUobG9jYWxlX21vbnRocyksCiAgICAgIG1vbnRoTG9va3VwID0gZm9ybWF0TG9va3Vw KGxvY2FsZV9tb250aHMpLAogICAgICBzaG9ydE1vbnRoUmUgPSBmb3JtYXRSZShsb2NhbGVfc2hv cnRNb250aHMpLAogICAgICBzaG9ydE1vbnRoTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9z aG9ydE1vbnRocyk7CgogIHZhciBmb3JtYXRzID0gewogICAgImEiOiBmb3JtYXRTaG9ydFdlZWtk YXksCiAgICAiQSI6IGZvcm1hdFdlZWtkYXksCiAgICAiYiI6IGZvcm1hdFNob3J0TW9udGgsCiAg ICAiQiI6IGZvcm1hdE1vbnRoLAogICAgImMiOiBudWxsLAogICAgImQiOiBmb3JtYXREYXlPZk1v bnRoLAogICAgImUiOiBmb3JtYXREYXlPZk1vbnRoLAogICAgImYiOiBmb3JtYXRNaWNyb3NlY29u ZHMsCiAgICAiSCI6IGZvcm1hdEhvdXIyNCwKICAgICJJIjogZm9ybWF0SG91cjEyLAogICAgImoi OiBmb3JtYXREYXlPZlllYXIsCiAgICAiTCI6IGZvcm1hdE1pbGxpc2Vjb25kcywKICAgICJtIjog Zm9ybWF0TW9udGhOdW1iZXIsCiAgICAiTSI6IGZvcm1hdE1pbnV0ZXMsCiAgICAicCI6IGZvcm1h dFBlcmlvZCwKICAgICJxIjogZm9ybWF0UXVhcnRlciwKICAgICJRIjogZm9ybWF0VW5peFRpbWVz dGFtcCwKICAgICJzIjogZm9ybWF0VW5peFRpbWVzdGFtcFNlY29uZHMsCiAgICAiUyI6IGZvcm1h dFNlY29uZHMsCiAgICAidSI6IGZvcm1hdFdlZWtkYXlOdW1iZXJNb25kYXksCiAgICAiVSI6IGZv cm1hdFdlZWtOdW1iZXJTdW5kYXksCiAgICAiViI6IGZvcm1hdFdlZWtOdW1iZXJJU08sCiAgICAi dyI6IGZvcm1hdFdlZWtkYXlOdW1iZXJTdW5kYXksCiAgICAiVyI6IGZvcm1hdFdlZWtOdW1iZXJN b25kYXksCiAgICAieCI6IG51bGwsCiAgICAiWCI6IG51bGwsCiAgICAieSI6IGZvcm1hdFllYXIk MSwKICAgICJZIjogZm9ybWF0RnVsbFllYXIsCiAgICAiWiI6IGZvcm1hdFpvbmUsCiAgICAiJSI6 IGZvcm1hdExpdGVyYWxQZXJjZW50CiAgfTsKCiAgdmFyIHV0Y0Zvcm1hdHMgPSB7CiAgICAiYSI6 IGZvcm1hdFVUQ1Nob3J0V2Vla2RheSwKICAgICJBIjogZm9ybWF0VVRDV2Vla2RheSwKICAgICJi IjogZm9ybWF0VVRDU2hvcnRNb250aCwKICAgICJCIjogZm9ybWF0VVRDTW9udGgsCiAgICAiYyI6 IG51bGwsCiAgICAiZCI6IGZvcm1hdFVUQ0RheU9mTW9udGgsCiAgICAiZSI6IGZvcm1hdFVUQ0Rh eU9mTW9udGgsCiAgICAiZiI6IGZvcm1hdFVUQ01pY3Jvc2Vjb25kcywKICAgICJIIjogZm9ybWF0 VVRDSG91cjI0LAogICAgIkkiOiBmb3JtYXRVVENIb3VyMTIsCiAgICAiaiI6IGZvcm1hdFVUQ0Rh eU9mWWVhciwKICAgICJMIjogZm9ybWF0VVRDTWlsbGlzZWNvbmRzLAogICAgIm0iOiBmb3JtYXRV VENNb250aE51bWJlciwKICAgICJNIjogZm9ybWF0VVRDTWludXRlcywKICAgICJwIjogZm9ybWF0 VVRDUGVyaW9kLAogICAgInEiOiBmb3JtYXRVVENRdWFydGVyLAogICAgIlEiOiBmb3JtYXRVbml4 VGltZXN0YW1wLAogICAgInMiOiBmb3JtYXRVbml4VGltZXN0YW1wU2Vjb25kcywKICAgICJTIjog Zm9ybWF0VVRDU2Vjb25kcywKICAgICJ1IjogZm9ybWF0VVRDV2Vla2RheU51bWJlck1vbmRheSwK ICAgICJVIjogZm9ybWF0VVRDV2Vla051bWJlclN1bmRheSwKICAgICJWIjogZm9ybWF0VVRDV2Vl a051bWJlcklTTywKICAgICJ3IjogZm9ybWF0VVRDV2Vla2RheU51bWJlclN1bmRheSwKICAgICJX IjogZm9ybWF0VVRDV2Vla051bWJlck1vbmRheSwKICAgICJ4IjogbnVsbCwKICAgICJYIjogbnVs bCwKICAgICJ5IjogZm9ybWF0VVRDWWVhciwKICAgICJZIjogZm9ybWF0VVRDRnVsbFllYXIsCiAg ICAiWiI6IGZvcm1hdFVUQ1pvbmUsCiAgICAiJSI6IGZvcm1hdExpdGVyYWxQZXJjZW50CiAgfTsK CiAgdmFyIHBhcnNlcyA9IHsKICAgICJhIjogcGFyc2VTaG9ydFdlZWtkYXksCiAgICAiQSI6IHBh cnNlV2Vla2RheSwKICAgICJiIjogcGFyc2VTaG9ydE1vbnRoLAogICAgIkIiOiBwYXJzZU1vbnRo LAogICAgImMiOiBwYXJzZUxvY2FsZURhdGVUaW1lLAogICAgImQiOiBwYXJzZURheU9mTW9udGgs CiAgICAiZSI6IHBhcnNlRGF5T2ZNb250aCwKICAgICJmIjogcGFyc2VNaWNyb3NlY29uZHMsCiAg ICAiSCI6IHBhcnNlSG91cjI0LAogICAgIkkiOiBwYXJzZUhvdXIyNCwKICAgICJqIjogcGFyc2VE YXlPZlllYXIsCiAgICAiTCI6IHBhcnNlTWlsbGlzZWNvbmRzLAogICAgIm0iOiBwYXJzZU1vbnRo TnVtYmVyLAogICAgIk0iOiBwYXJzZU1pbnV0ZXMsCiAgICAicCI6IHBhcnNlUGVyaW9kLAogICAg InEiOiBwYXJzZVF1YXJ0ZXIsCiAgICAiUSI6IHBhcnNlVW5peFRpbWVzdGFtcCwKICAgICJzIjog cGFyc2VVbml4VGltZXN0YW1wU2Vjb25kcywKICAgICJTIjogcGFyc2VTZWNvbmRzLAogICAgInUi OiBwYXJzZVdlZWtkYXlOdW1iZXJNb25kYXksCiAgICAiVSI6IHBhcnNlV2Vla051bWJlclN1bmRh eSwKICAgICJWIjogcGFyc2VXZWVrTnVtYmVySVNPLAogICAgInciOiBwYXJzZVdlZWtkYXlOdW1i ZXJTdW5kYXksCiAgICAiVyI6IHBhcnNlV2Vla051bWJlck1vbmRheSwKICAgICJ4IjogcGFyc2VM b2NhbGVEYXRlLAogICAgIlgiOiBwYXJzZUxvY2FsZVRpbWUsCiAgICAieSI6IHBhcnNlWWVhciwK ICAgICJZIjogcGFyc2VGdWxsWWVhciwKICAgICJaIjogcGFyc2Vab25lLAogICAgIiUiOiBwYXJz ZUxpdGVyYWxQZXJjZW50CiAgfTsKCiAgLy8gVGhlc2UgcmVjdXJzaXZlIGRpcmVjdGl2ZSBkZWZp bml0aW9ucyBtdXN0IGJlIGRlZmVycmVkLgogIGZvcm1hdHMueCA9IG5ld0Zvcm1hdChsb2NhbGVf ZGF0ZSwgZm9ybWF0cyk7CiAgZm9ybWF0cy5YID0gbmV3Rm9ybWF0KGxvY2FsZV90aW1lLCBmb3Jt YXRzKTsKICBmb3JtYXRzLmMgPSBuZXdGb3JtYXQobG9jYWxlX2RhdGVUaW1lLCBmb3JtYXRzKTsK ICB1dGNGb3JtYXRzLnggPSBuZXdGb3JtYXQobG9jYWxlX2RhdGUsIHV0Y0Zvcm1hdHMpOwogIHV0 Y0Zvcm1hdHMuWCA9IG5ld0Zvcm1hdChsb2NhbGVfdGltZSwgdXRjRm9ybWF0cyk7CiAgdXRjRm9y bWF0cy5jID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlVGltZSwgdXRjRm9ybWF0cyk7CgogIGZ1bmN0 aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIsIGZvcm1hdHMpIHsKICAgIHJldHVybiBmdW5jdGlvbihk YXRlKSB7CiAgICAgIHZhciBzdHJpbmcgPSBbXSwKICAgICAgICAgIGkgPSAtMSwKICAgICAgICAg IGogPSAwLAogICAgICAgICAgbiA9IHNwZWNpZmllci5sZW5ndGgsCiAgICAgICAgICBjLAogICAg ICAgICAgcGFkLAogICAgICAgICAgZm9ybWF0OwoKICAgICAgaWYgKCEoZGF0ZSBpbnN0YW5jZW9m IERhdGUpKSBkYXRlID0gbmV3IERhdGUoK2RhdGUpOwoKICAgICAgd2hpbGUgKCsraSA8IG4pIHsK ICAgICAgICBpZiAoc3BlY2lmaWVyLmNoYXJDb2RlQXQoaSkgPT09IDM3KSB7CiAgICAgICAgICBz dHJpbmcucHVzaChzcGVjaWZpZXIuc2xpY2UoaiwgaSkpOwogICAgICAgICAgaWYgKChwYWQgPSBw YWRzW2MgPSBzcGVjaWZpZXIuY2hhckF0KCsraSldKSAhPSBudWxsKSBjID0gc3BlY2lmaWVyLmNo YXJBdCgrK2kpOwogICAgICAgICAgZWxzZSBwYWQgPSBjID09PSAiZSIgPyAiICIgOiAiMCI7CiAg ICAgICAgICBpZiAoZm9ybWF0ID0gZm9ybWF0c1tjXSkgYyA9IGZvcm1hdChkYXRlLCBwYWQpOwog ICAgICAgICAgc3RyaW5nLnB1c2goYyk7CiAgICAgICAgICBqID0gaSArIDE7CiAgICAgICAgfQog ICAgICB9CgogICAgICBzdHJpbmcucHVzaChzcGVjaWZpZXIuc2xpY2UoaiwgaSkpOwogICAgICBy ZXR1cm4gc3RyaW5nLmpvaW4oIiIpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIG5ld1BhcnNlKHNw ZWNpZmllciwgWikgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykgewogICAgICB2YXIgZCA9 IG5ld0RhdGUoMTkwMCwgdW5kZWZpbmVkLCAxKSwKICAgICAgICAgIGkgPSBwYXJzZVNwZWNpZmll cihkLCBzcGVjaWZpZXIsIHN0cmluZyArPSAiIiwgMCksCiAgICAgICAgICB3ZWVrLCBkYXkkMTsK ICAgICAgaWYgKGkgIT0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIG51bGw7CgogICAgICAvLyBJZiBh IFVOSVggdGltZXN0YW1wIGlzIHNwZWNpZmllZCwgcmV0dXJuIGl0LgogICAgICBpZiAoIlEiIGlu IGQpIHJldHVybiBuZXcgRGF0ZShkLlEpOwogICAgICBpZiAoInMiIGluIGQpIHJldHVybiBuZXcg RGF0ZShkLnMgKiAxMDAwICsgKCJMIiBpbiBkID8gZC5MIDogMCkpOwoKICAgICAgLy8gSWYgdGhp cyBpcyB1dGNQYXJzZSwgbmV2ZXIgdXNlIHRoZSBsb2NhbCB0aW1lem9uZS4KICAgICAgaWYgKFog JiYgISgiWiIgaW4gZCkpIGQuWiA9IDA7CgogICAgICAvLyBUaGUgYW0tcG0gZmxhZyBpcyAwIGZv ciBBTSwgYW5kIDEgZm9yIFBNLgogICAgICBpZiAoInAiIGluIGQpIGQuSCA9IGQuSCAlIDEyICsg ZC5wICogMTI7CgogICAgICAvLyBJZiB0aGUgbW9udGggd2FzIG5vdCBzcGVjaWZpZWQsIGluaGVy aXQgZnJvbSB0aGUgcXVhcnRlci4KICAgICAgaWYgKGQubSA9PT0gdW5kZWZpbmVkKSBkLm0gPSAi cSIgaW4gZCA/IGQucSA6IDA7CgogICAgICAvLyBDb252ZXJ0IGRheS1vZi13ZWVrIGFuZCB3ZWVr LW9mLXllYXIgdG8gZGF5LW9mLXllYXIuCiAgICAgIGlmICgiViIgaW4gZCkgewogICAgICAgIGlm IChkLlYgPCAxIHx8IGQuViA+IDUzKSByZXR1cm4gbnVsbDsKICAgICAgICBpZiAoISgidyIgaW4g ZCkpIGQudyA9IDE7CiAgICAgICAgaWYgKCJaIiBpbiBkKSB7CiAgICAgICAgICB3ZWVrID0gdXRj RGF0ZShuZXdEYXRlKGQueSwgMCwgMSkpLCBkYXkkMSA9IHdlZWsuZ2V0VVRDRGF5KCk7CiAgICAg ICAgICB3ZWVrID0gZGF5JDEgPiA0IHx8IGRheSQxID09PSAwID8gdXRjTW9uZGF5LmNlaWwod2Vl aykgOiB1dGNNb25kYXkod2Vlayk7CiAgICAgICAgICB3ZWVrID0gdXRjRGF5Lm9mZnNldCh3ZWVr LCAoZC5WIC0gMSkgKiA3KTsKICAgICAgICAgIGQueSA9IHdlZWsuZ2V0VVRDRnVsbFllYXIoKTsK ICAgICAgICAgIGQubSA9IHdlZWsuZ2V0VVRDTW9udGgoKTsKICAgICAgICAgIGQuZCA9IHdlZWsu Z2V0VVRDRGF0ZSgpICsgKGQudyArIDYpICUgNzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAg d2VlayA9IGxvY2FsRGF0ZShuZXdEYXRlKGQueSwgMCwgMSkpLCBkYXkkMSA9IHdlZWsuZ2V0RGF5 KCk7CiAgICAgICAgICB3ZWVrID0gZGF5JDEgPiA0IHx8IGRheSQxID09PSAwID8gbW9uZGF5LmNl aWwod2VlaykgOiBtb25kYXkod2Vlayk7CiAgICAgICAgICB3ZWVrID0gZGF5Lm9mZnNldCh3ZWVr LCAoZC5WIC0gMSkgKiA3KTsKICAgICAgICAgIGQueSA9IHdlZWsuZ2V0RnVsbFllYXIoKTsKICAg ICAgICAgIGQubSA9IHdlZWsuZ2V0TW9udGgoKTsKICAgICAgICAgIGQuZCA9IHdlZWsuZ2V0RGF0 ZSgpICsgKGQudyArIDYpICUgNzsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIlciIGluIGQg fHwgIlUiIGluIGQpIHsKICAgICAgICBpZiAoISgidyIgaW4gZCkpIGQudyA9ICJ1IiBpbiBkID8g ZC51ICUgNyA6ICJXIiBpbiBkID8gMSA6IDA7CiAgICAgICAgZGF5JDEgPSAiWiIgaW4gZCA/IHV0 Y0RhdGUobmV3RGF0ZShkLnksIDAsIDEpKS5nZXRVVENEYXkoKSA6IGxvY2FsRGF0ZShuZXdEYXRl KGQueSwgMCwgMSkpLmdldERheSgpOwogICAgICAgIGQubSA9IDA7CiAgICAgICAgZC5kID0gIlci IGluIGQgPyAoZC53ICsgNikgJSA3ICsgZC5XICogNyAtIChkYXkkMSArIDUpICUgNyA6IGQudyAr IGQuVSAqIDcgLSAoZGF5JDEgKyA2KSAlIDc7CiAgICAgIH0KCiAgICAgIC8vIElmIGEgdGltZSB6 b25lIGlzIHNwZWNpZmllZCwgYWxsIGZpZWxkcyBhcmUgaW50ZXJwcmV0ZWQgYXMgVVRDIGFuZCB0 aGVuCiAgICAgIC8vIG9mZnNldCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0aW1lIHpvbmUu CiAgICAgIGlmICgiWiIgaW4gZCkgewogICAgICAgIGQuSCArPSBkLlogLyAxMDAgfCAwOwogICAg ICAgIGQuTSArPSBkLlogJSAxMDA7CiAgICAgICAgcmV0dXJuIHV0Y0RhdGUoZCk7CiAgICAgIH0K CiAgICAgIC8vIE90aGVyd2lzZSwgYWxsIGZpZWxkcyBhcmUgaW4gbG9jYWwgdGltZS4KICAgICAg cmV0dXJuIGxvY2FsRGF0ZShkKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBwYXJzZVNwZWNpZmll cihkLCBzcGVjaWZpZXIsIHN0cmluZywgaikgewogICAgdmFyIGkgPSAwLAogICAgICAgIG4gPSBz cGVjaWZpZXIubGVuZ3RoLAogICAgICAgIG0gPSBzdHJpbmcubGVuZ3RoLAogICAgICAgIGMsCiAg ICAgICAgcGFyc2U7CgogICAgd2hpbGUgKGkgPCBuKSB7CiAgICAgIGlmIChqID49IG0pIHJldHVy biAtMTsKICAgICAgYyA9IHNwZWNpZmllci5jaGFyQ29kZUF0KGkrKyk7CiAgICAgIGlmIChjID09 PSAzNykgewogICAgICAgIGMgPSBzcGVjaWZpZXIuY2hhckF0KGkrKyk7CiAgICAgICAgcGFyc2Ug PSBwYXJzZXNbYyBpbiBwYWRzID8gc3BlY2lmaWVyLmNoYXJBdChpKyspIDogY107CiAgICAgICAg aWYgKCFwYXJzZSB8fCAoKGogPSBwYXJzZShkLCBzdHJpbmcsIGopKSA8IDApKSByZXR1cm4gLTE7 CiAgICAgIH0gZWxzZSBpZiAoYyAhPSBzdHJpbmcuY2hhckNvZGVBdChqKyspKSB7CiAgICAgICAg cmV0dXJuIC0xOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGo7CiAgfQoKICBmdW5jdGlvbiBw YXJzZVBlcmlvZChkLCBzdHJpbmcsIGkpIHsKICAgIHZhciBuID0gcGVyaW9kUmUuZXhlYyhzdHJp bmcuc2xpY2UoaSkpOwogICAgcmV0dXJuIG4gPyAoZC5wID0gcGVyaW9kTG9va3VwW25bMF0udG9M b3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICB9CgogIGZ1bmN0aW9uIHBhcnNl U2hvcnRXZWVrZGF5KGQsIHN0cmluZywgaSkgewogICAgdmFyIG4gPSBzaG9ydFdlZWtkYXlSZS5l eGVjKHN0cmluZy5zbGljZShpKSk7CiAgICByZXR1cm4gbiA/IChkLncgPSBzaG9ydFdlZWtkYXlM b29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KCiAg ZnVuY3Rpb24gcGFyc2VXZWVrZGF5KGQsIHN0cmluZywgaSkgewogICAgdmFyIG4gPSB3ZWVrZGF5 UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgcmV0dXJuIG4gPyAoZC53ID0gd2Vla2RheUxv b2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgfQoKICBm dW5jdGlvbiBwYXJzZVNob3J0TW9udGgoZCwgc3RyaW5nLCBpKSB7CiAgICB2YXIgbiA9IHNob3J0 TW9udGhSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICByZXR1cm4gbiA/IChkLm0gPSBzaG9y dE1vbnRoTG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsK ICB9CgogIGZ1bmN0aW9uIHBhcnNlTW9udGgoZCwgc3RyaW5nLCBpKSB7CiAgICB2YXIgbiA9IG1v bnRoUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgcmV0dXJuIG4gPyAoZC5tID0gbW9udGhM b29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogIH0KCiAg ZnVuY3Rpb24gcGFyc2VMb2NhbGVEYXRlVGltZShkLCBzdHJpbmcsIGkpIHsKICAgIHJldHVybiBw YXJzZVNwZWNpZmllcihkLCBsb2NhbGVfZGF0ZVRpbWUsIHN0cmluZywgaSk7CiAgfQoKICBmdW5j dGlvbiBwYXJzZUxvY2FsZURhdGUoZCwgc3RyaW5nLCBpKSB7CiAgICByZXR1cm4gcGFyc2VTcGVj aWZpZXIoZCwgbG9jYWxlX2RhdGUsIHN0cmluZywgaSk7CiAgfQoKICBmdW5jdGlvbiBwYXJzZUxv Y2FsZVRpbWUoZCwgc3RyaW5nLCBpKSB7CiAgICByZXR1cm4gcGFyc2VTcGVjaWZpZXIoZCwgbG9j YWxlX3RpbWUsIHN0cmluZywgaSk7CiAgfQoKICBmdW5jdGlvbiBmb3JtYXRTaG9ydFdlZWtkYXko ZCkgewogICAgcmV0dXJuIGxvY2FsZV9zaG9ydFdlZWtkYXlzW2QuZ2V0RGF5KCldOwogIH0KCiAg ZnVuY3Rpb24gZm9ybWF0V2Vla2RheShkKSB7CiAgICByZXR1cm4gbG9jYWxlX3dlZWtkYXlzW2Qu Z2V0RGF5KCldOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0U2hvcnRNb250aChkKSB7CiAgICByZXR1 cm4gbG9jYWxlX3Nob3J0TW9udGhzW2QuZ2V0TW9udGgoKV07CiAgfQoKICBmdW5jdGlvbiBmb3Jt YXRNb250aChkKSB7CiAgICByZXR1cm4gbG9jYWxlX21vbnRoc1tkLmdldE1vbnRoKCldOwogIH0K CiAgZnVuY3Rpb24gZm9ybWF0UGVyaW9kKGQpIHsKICAgIHJldHVybiBsb2NhbGVfcGVyaW9kc1sr KGQuZ2V0SG91cnMoKSA+PSAxMildOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0UXVhcnRlcihkKSB7 CiAgICByZXR1cm4gMSArIH5+KGQuZ2V0TW9udGgoKSAvIDMpOwogIH0KCiAgZnVuY3Rpb24gZm9y bWF0VVRDU2hvcnRXZWVrZGF5KGQpIHsKICAgIHJldHVybiBsb2NhbGVfc2hvcnRXZWVrZGF5c1tk LmdldFVUQ0RheSgpXTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtkYXkoZCkgewogICAg cmV0dXJuIGxvY2FsZV93ZWVrZGF5c1tkLmdldFVUQ0RheSgpXTsKICB9CgogIGZ1bmN0aW9uIGZv cm1hdFVUQ1Nob3J0TW9udGgoZCkgewogICAgcmV0dXJuIGxvY2FsZV9zaG9ydE1vbnRoc1tkLmdl dFVUQ01vbnRoKCldOwogIH0KCiAgZnVuY3Rpb24gZm9ybWF0VVRDTW9udGgoZCkgewogICAgcmV0 dXJuIGxvY2FsZV9tb250aHNbZC5nZXRVVENNb250aCgpXTsKICB9CgogIGZ1bmN0aW9uIGZvcm1h dFVUQ1BlcmlvZChkKSB7CiAgICByZXR1cm4gbG9jYWxlX3BlcmlvZHNbKyhkLmdldFVUQ0hvdXJz KCkgPj0gMTIpXTsKICB9CgogIGZ1bmN0aW9uIGZvcm1hdFVUQ1F1YXJ0ZXIoZCkgewogICAgcmV0 dXJuIDEgKyB+fihkLmdldFVUQ01vbnRoKCkgLyAzKTsKICB9CgogIHJldHVybiB7CiAgICBmb3Jt YXQ6IGZ1bmN0aW9uKHNwZWNpZmllcikgewogICAgICB2YXIgZiA9IG5ld0Zvcm1hdChzcGVjaWZp ZXIgKz0gIiIsIGZvcm1hdHMpOwogICAgICBmLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVy biBzcGVjaWZpZXI7IH07CiAgICAgIHJldHVybiBmOwogICAgfSwKICAgIHBhcnNlOiBmdW5jdGlv bihzcGVjaWZpZXIpIHsKICAgICAgdmFyIHAgPSBuZXdQYXJzZShzcGVjaWZpZXIgKz0gIiIsIGZh bHNlKTsKICAgICAgcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3BlY2lmaWVyOyB9 OwogICAgICByZXR1cm4gcDsKICAgIH0sCiAgICB1dGNGb3JtYXQ6IGZ1bmN0aW9uKHNwZWNpZmll cikgewogICAgICB2YXIgZiA9IG5ld0Zvcm1hdChzcGVjaWZpZXIgKz0gIiIsIHV0Y0Zvcm1hdHMp OwogICAgICBmLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07CiAg ICAgIHJldHVybiBmOwogICAgfSwKICAgIHV0Y1BhcnNlOiBmdW5jdGlvbihzcGVjaWZpZXIpIHsK ICAgICAgdmFyIHAgPSBuZXdQYXJzZShzcGVjaWZpZXIgKz0gIiIsIHRydWUpOwogICAgICBwLnRv U3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07CiAgICAgIHJldHVybiBw OwogICAgfQogIH07Cn0KCnZhciBwYWRzID0geyItIjogIiIsICJfIjogIiAiLCAiMCI6ICIwIn0s CiAgICBudW1iZXJSZSA9IC9eXHMqXGQrLywgLy8gbm90ZTogaWdub3JlcyBuZXh0IGRpcmVjdGl2 ZQogICAgcGVyY2VudFJlID0gL14lLywKICAgIHJlcXVvdGVSZSA9IC9bXFxeJCorP3xbXF0oKS57 fV0vZzsKCmZ1bmN0aW9uIHBhZCQxKHZhbHVlLCBmaWxsLCB3aWR0aCkgewogIHZhciBzaWduID0g dmFsdWUgPCAwID8gIi0iIDogIiIsCiAgICAgIHN0cmluZyA9IChzaWduID8gLXZhbHVlIDogdmFs dWUpICsgIiIsCiAgICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7CiAgcmV0dXJuIHNpZ24gKyAo bGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwp ICsgc3RyaW5nIDogc3RyaW5nKTsKfQoKZnVuY3Rpb24gcmVxdW90ZShzKSB7CiAgcmV0dXJuIHMu cmVwbGFjZShyZXF1b3RlUmUsICJcXCQmIik7Cn0KCmZ1bmN0aW9uIGZvcm1hdFJlKG5hbWVzKSB7 CiAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgbmFtZXMubWFwKHJlcXVvdGUpLmpvaW4oInwi KSArICIpIiwgImkiKTsKfQoKZnVuY3Rpb24gZm9ybWF0TG9va3VwKG5hbWVzKSB7CiAgdmFyIG1h cCA9IHt9LCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7CiAgd2hpbGUgKCsraSA8IG4pIG1hcFtu YW1lc1tpXS50b0xvd2VyQ2FzZSgpXSA9IGk7CiAgcmV0dXJuIG1hcDsKfQoKZnVuY3Rpb24gcGFy c2VXZWVrZGF5TnVtYmVyU3VuZGF5KGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUu ZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTsKICByZXR1cm4gbiA/IChkLncgPSArblswXSwg aSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZVdlZWtkYXlOdW1iZXJNb25k YXkoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShp LCBpICsgMSkpOwogIHJldHVybiBuID8gKGQudSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDog LTE7Cn0KCmZ1bmN0aW9uIHBhcnNlV2Vla051bWJlclN1bmRheShkLCBzdHJpbmcsIGkpIHsKICB2 YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgcmV0dXJuIG4g PyAoZC5VID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VX ZWVrTnVtYmVySVNPKGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJp bmcuc2xpY2UoaSwgaSArIDIpKTsKICByZXR1cm4gbiA/IChkLlYgPSArblswXSwgaSArIG5bMF0u bGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZVdlZWtOdW1iZXJNb25kYXkoZCwgc3RyaW5n LCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwog IHJldHVybiBuID8gKGQuVyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7Cn0KCmZ1bmN0 aW9uIHBhcnNlRnVsbFllYXIoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVj KHN0cmluZy5zbGljZShpLCBpICsgNCkpOwogIHJldHVybiBuID8gKGQueSA9ICtuWzBdLCBpICsg blswXS5sZW5ndGgpIDogLTE7Cn0KCmZ1bmN0aW9uIHBhcnNlWWVhcihkLCBzdHJpbmcsIGkpIHsK ICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgcmV0dXJu IG4gPyAoZC55ID0gK25bMF0gKyAoK25bMF0gPiA2OCA/IDE5MDAgOiAyMDAwKSwgaSArIG5bMF0u bGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZVpvbmUoZCwgc3RyaW5nLCBpKSB7CiAgdmFy IG4gPSAvXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhzdHJpbmcuc2xpY2UoaSwg aSArIDYpKTsKICByZXR1cm4gbiA/IChkLlogPSBuWzFdID8gMCA6IC0oblsyXSArIChuWzNdIHx8 ICIwMCIpKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZVF1YXJ0ZXIo ZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBp ICsgMSkpOwogIHJldHVybiBuID8gKGQucSA9IG5bMF0gKiAzIC0gMywgaSArIG5bMF0ubGVuZ3Ro KSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZU1vbnRoTnVtYmVyKGQsIHN0cmluZywgaSkgewogIHZh ciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICByZXR1cm4gbiA/ IChkLm0gPSBuWzBdIC0gMSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJz ZURheU9mTW9udGgoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmlu Zy5zbGljZShpLCBpICsgMikpOwogIHJldHVybiBuID8gKGQuZCA9ICtuWzBdLCBpICsgblswXS5s ZW5ndGgpIDogLTE7Cn0KCmZ1bmN0aW9uIHBhcnNlRGF5T2ZZZWFyKGQsIHN0cmluZywgaSkgewog IHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTsKICByZXR1cm4g biA/IChkLm0gPSAwLCBkLmQgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5j dGlvbiBwYXJzZUhvdXIyNChkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IG51bWJlclJlLmV4ZWMo c3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgcmV0dXJuIG4gPyAoZC5IID0gK25bMF0sIGkgKyBu WzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VNaW51dGVzKGQsIHN0cmluZywgaSkg ewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICByZXR1 cm4gbiA/IChkLk0gPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBw YXJzZVNlY29uZHMoZCwgc3RyaW5nLCBpKSB7CiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmlu Zy5zbGljZShpLCBpICsgMikpOwogIHJldHVybiBuID8gKGQuUyA9ICtuWzBdLCBpICsgblswXS5s ZW5ndGgpIDogLTE7Cn0KCmZ1bmN0aW9uIHBhcnNlTWlsbGlzZWNvbmRzKGQsIHN0cmluZywgaSkg ewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTsKICByZXR1 cm4gbiA/IChkLkwgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBw YXJzZU1pY3Jvc2Vjb25kcyhkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IG51bWJlclJlLmV4ZWMo c3RyaW5nLnNsaWNlKGksIGkgKyA2KSk7CiAgcmV0dXJuIG4gPyAoZC5MID0gTWF0aC5mbG9vcihu WzBdIC8gMTAwMCksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKfQoKZnVuY3Rpb24gcGFyc2VMaXRl cmFsUGVyY2VudChkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IHBlcmNlbnRSZS5leGVjKHN0cmlu Zy5zbGljZShpLCBpICsgMSkpOwogIHJldHVybiBuID8gaSArIG5bMF0ubGVuZ3RoIDogLTE7Cn0K CmZ1bmN0aW9uIHBhcnNlVW5peFRpbWVzdGFtcChkLCBzdHJpbmcsIGkpIHsKICB2YXIgbiA9IG51 bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICByZXR1cm4gbiA/IChkLlEgPSArblswXSwg aSArIG5bMF0ubGVuZ3RoKSA6IC0xOwp9CgpmdW5jdGlvbiBwYXJzZVVuaXhUaW1lc3RhbXBTZWNv bmRzKGQsIHN0cmluZywgaSkgewogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2Uo aSkpOwogIHJldHVybiBuID8gKGQucyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7Cn0K CmZ1bmN0aW9uIGZvcm1hdERheU9mTW9udGgoZCwgcCkgewogIHJldHVybiBwYWQkMShkLmdldERh dGUoKSwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdEhvdXIyNChkLCBwKSB7CiAgcmV0dXJuIHBh ZCQxKGQuZ2V0SG91cnMoKSwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdEhvdXIxMihkLCBwKSB7 CiAgcmV0dXJuIHBhZCQxKGQuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTsKfQoKZnVuY3Rp b24gZm9ybWF0RGF5T2ZZZWFyKGQsIHApIHsKICByZXR1cm4gcGFkJDEoMSArIGRheS5jb3VudCh5 ZWFyKGQpLCBkKSwgcCwgMyk7Cn0KCmZ1bmN0aW9uIGZvcm1hdE1pbGxpc2Vjb25kcyhkLCBwKSB7 CiAgcmV0dXJuIHBhZCQxKGQuZ2V0TWlsbGlzZWNvbmRzKCksIHAsIDMpOwp9CgpmdW5jdGlvbiBm b3JtYXRNaWNyb3NlY29uZHMoZCwgcCkgewogIHJldHVybiBmb3JtYXRNaWxsaXNlY29uZHMoZCwg cCkgKyAiMDAwIjsKfQoKZnVuY3Rpb24gZm9ybWF0TW9udGhOdW1iZXIoZCwgcCkgewogIHJldHVy biBwYWQkMShkLmdldE1vbnRoKCkgKyAxLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0TWludXRl cyhkLCBwKSB7CiAgcmV0dXJuIHBhZCQxKGQuZ2V0TWludXRlcygpLCBwLCAyKTsKfQoKZnVuY3Rp b24gZm9ybWF0U2Vjb25kcyhkLCBwKSB7CiAgcmV0dXJuIHBhZCQxKGQuZ2V0U2Vjb25kcygpLCBw LCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0V2Vla2RheU51bWJlck1vbmRheShkKSB7CiAgdmFyIGRh eSA9IGQuZ2V0RGF5KCk7CiAgcmV0dXJuIGRheSA9PT0gMCA/IDcgOiBkYXk7Cn0KCmZ1bmN0aW9u IGZvcm1hdFdlZWtOdW1iZXJTdW5kYXkoZCwgcCkgewogIHJldHVybiBwYWQkMShzdW5kYXkuY291 bnQoeWVhcihkKSAtIDEsIGQpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlcklT TyhkLCBwKSB7CiAgdmFyIGRheSA9IGQuZ2V0RGF5KCk7CiAgZCA9IChkYXkgPj0gNCB8fCBkYXkg PT09IDApID8gdGh1cnNkYXkoZCkgOiB0aHVyc2RheS5jZWlsKGQpOwogIHJldHVybiBwYWQkMSh0 aHVyc2RheS5jb3VudCh5ZWFyKGQpLCBkKSArICh5ZWFyKGQpLmdldERheSgpID09PSA0KSwgcCwg Mik7Cn0KCmZ1bmN0aW9uIGZvcm1hdFdlZWtkYXlOdW1iZXJTdW5kYXkoZCkgewogIHJldHVybiBk LmdldERheSgpOwp9CgpmdW5jdGlvbiBmb3JtYXRXZWVrTnVtYmVyTW9uZGF5KGQsIHApIHsKICBy ZXR1cm4gcGFkJDEobW9uZGF5LmNvdW50KHllYXIoZCkgLSAxLCBkKSwgcCwgMik7Cn0KCmZ1bmN0 aW9uIGZvcm1hdFllYXIkMShkLCBwKSB7CiAgcmV0dXJuIHBhZCQxKGQuZ2V0RnVsbFllYXIoKSAl IDEwMCwgcCwgMik7Cn0KCmZ1bmN0aW9uIGZvcm1hdEZ1bGxZZWFyKGQsIHApIHsKICByZXR1cm4g cGFkJDEoZC5nZXRGdWxsWWVhcigpICUgMTAwMDAsIHAsIDQpOwp9CgpmdW5jdGlvbiBmb3JtYXRa b25lKGQpIHsKICB2YXIgeiA9IGQuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICByZXR1cm4gKHogPiAw ID8gIi0iIDogKHogKj0gLTEsICIrIikpCiAgICAgICsgcGFkJDEoeiAvIDYwIHwgMCwgIjAiLCAy KQogICAgICArIHBhZCQxKHogJSA2MCwgIjAiLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDRGF5 T2ZNb250aChkLCBwKSB7CiAgcmV0dXJuIHBhZCQxKGQuZ2V0VVRDRGF0ZSgpLCBwLCAyKTsKfQoK ZnVuY3Rpb24gZm9ybWF0VVRDSG91cjI0KGQsIHApIHsKICByZXR1cm4gcGFkJDEoZC5nZXRVVENI b3VycygpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDSG91cjEyKGQsIHApIHsKICByZXR1 cm4gcGFkJDEoZC5nZXRVVENIb3VycygpICUgMTIgfHwgMTIsIHAsIDIpOwp9CgpmdW5jdGlvbiBm b3JtYXRVVENEYXlPZlllYXIoZCwgcCkgewogIHJldHVybiBwYWQkMSgxICsgdXRjRGF5LmNvdW50 KHV0Y1llYXIoZCksIGQpLCBwLCAzKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDTWlsbGlzZWNvbmRz KGQsIHApIHsKICByZXR1cm4gcGFkJDEoZC5nZXRVVENNaWxsaXNlY29uZHMoKSwgcCwgMyk7Cn0K CmZ1bmN0aW9uIGZvcm1hdFVUQ01pY3Jvc2Vjb25kcyhkLCBwKSB7CiAgcmV0dXJuIGZvcm1hdFVU Q01pbGxpc2Vjb25kcyhkLCBwKSArICIwMDAiOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENNb250aE51 bWJlcihkLCBwKSB7CiAgcmV0dXJuIHBhZCQxKGQuZ2V0VVRDTW9udGgoKSArIDEsIHAsIDIpOwp9 CgpmdW5jdGlvbiBmb3JtYXRVVENNaW51dGVzKGQsIHApIHsKICByZXR1cm4gcGFkJDEoZC5nZXRV VENNaW51dGVzKCksIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENTZWNvbmRzKGQsIHApIHsK ICByZXR1cm4gcGFkJDEoZC5nZXRVVENTZWNvbmRzKCksIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3Jt YXRVVENXZWVrZGF5TnVtYmVyTW9uZGF5KGQpIHsKICB2YXIgZG93ID0gZC5nZXRVVENEYXkoKTsK ICByZXR1cm4gZG93ID09PSAwID8gNyA6IGRvdzsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDV2Vla051 bWJlclN1bmRheShkLCBwKSB7CiAgcmV0dXJuIHBhZCQxKHV0Y1N1bmRheS5jb3VudCh1dGNZZWFy KGQpIC0gMSwgZCksIHAsIDIpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENXZWVrTnVtYmVySVNPKGQs IHApIHsKICB2YXIgZGF5ID0gZC5nZXRVVENEYXkoKTsKICBkID0gKGRheSA+PSA0IHx8IGRheSA9 PT0gMCkgPyB1dGNUaHVyc2RheShkKSA6IHV0Y1RodXJzZGF5LmNlaWwoZCk7CiAgcmV0dXJuIHBh ZCQxKHV0Y1RodXJzZGF5LmNvdW50KHV0Y1llYXIoZCksIGQpICsgKHV0Y1llYXIoZCkuZ2V0VVRD RGF5KCkgPT09IDQpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDV2Vla2RheU51bWJlclN1 bmRheShkKSB7CiAgcmV0dXJuIGQuZ2V0VVRDRGF5KCk7Cn0KCmZ1bmN0aW9uIGZvcm1hdFVUQ1dl ZWtOdW1iZXJNb25kYXkoZCwgcCkgewogIHJldHVybiBwYWQkMSh1dGNNb25kYXkuY291bnQodXRj WWVhcihkKSAtIDEsIGQpLCBwLCAyKTsKfQoKZnVuY3Rpb24gZm9ybWF0VVRDWWVhcihkLCBwKSB7 CiAgcmV0dXJuIHBhZCQxKGQuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMCwgcCwgMik7Cn0KCmZ1bmN0 aW9uIGZvcm1hdFVUQ0Z1bGxZZWFyKGQsIHApIHsKICByZXR1cm4gcGFkJDEoZC5nZXRVVENGdWxs WWVhcigpICUgMTAwMDAsIHAsIDQpOwp9CgpmdW5jdGlvbiBmb3JtYXRVVENab25lKCkgewogIHJl dHVybiAiKzAwMDAiOwp9CgpmdW5jdGlvbiBmb3JtYXRMaXRlcmFsUGVyY2VudCgpIHsKICByZXR1 cm4gIiUiOwp9CgpmdW5jdGlvbiBmb3JtYXRVbml4VGltZXN0YW1wKGQpIHsKICByZXR1cm4gK2Q7 Cn0KCmZ1bmN0aW9uIGZvcm1hdFVuaXhUaW1lc3RhbXBTZWNvbmRzKGQpIHsKICByZXR1cm4gTWF0 aC5mbG9vcigrZCAvIDEwMDApOwp9Cgp2YXIgbG9jYWxlJDE7CgpkZWZhdWx0TG9jYWxlJDEoewog IGRhdGVUaW1lOiAiJXgsICVYIiwKICBkYXRlOiAiJS1tLyUtZC8lWSIsCiAgdGltZTogIiUtSTol TTolUyAlcCIsCiAgcGVyaW9kczogWyJBTSIsICJQTSJdLAogIGRheXM6IFsiU3VuZGF5IiwgIk1v bmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0 dXJkYXkiXSwKICBzaG9ydERheXM6IFsiU3VuIiwgIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIs ICJGcmkiLCAiU2F0Il0sCiAgbW9udGhzOiBbIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2gi LCAiQXByaWwiLCAiTWF5IiwgIkp1bmUiLCAiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwg Ik9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiXSwKICBzaG9ydE1vbnRoczogWyJKYW4i LCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIs ICJPY3QiLCAiTm92IiwgIkRlYyJdCn0pOwoKZnVuY3Rpb24gZGVmYXVsdExvY2FsZSQxKGRlZmlu aXRpb24pIHsKICBsb2NhbGUkMSA9IGZvcm1hdExvY2FsZSQxKGRlZmluaXRpb24pOwogIGV4cG9y dHMudGltZUZvcm1hdCA9IGxvY2FsZSQxLmZvcm1hdDsKICBleHBvcnRzLnRpbWVQYXJzZSA9IGxv Y2FsZSQxLnBhcnNlOwogIGV4cG9ydHMudXRjRm9ybWF0ID0gbG9jYWxlJDEudXRjRm9ybWF0Owog IGV4cG9ydHMudXRjUGFyc2UgPSBsb2NhbGUkMS51dGNQYXJzZTsKICByZXR1cm4gbG9jYWxlJDE7 Cn0KCnZhciBpc29TcGVjaWZpZXIgPSAiJVktJW0tJWRUJUg6JU06JVMuJUxaIjsKCmZ1bmN0aW9u IGZvcm1hdElzb05hdGl2ZShkYXRlKSB7CiAgcmV0dXJuIGRhdGUudG9JU09TdHJpbmcoKTsKfQoK dmFyIGZvcm1hdElzbyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nCiAgICA/IGZvcm1hdElz b05hdGl2ZQogICAgOiBleHBvcnRzLnV0Y0Zvcm1hdChpc29TcGVjaWZpZXIpOwoKZnVuY3Rpb24g cGFyc2VJc29OYXRpdmUoc3RyaW5nKSB7CiAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzdHJpbmcpOwog IHJldHVybiBpc05hTihkYXRlKSA/IG51bGwgOiBkYXRlOwp9Cgp2YXIgcGFyc2VJc28gPSArbmV3 IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpCiAgICA/IHBhcnNlSXNvTmF0aXZlCiAg ICA6IGV4cG9ydHMudXRjUGFyc2UoaXNvU3BlY2lmaWVyKTsKCnZhciBkdXJhdGlvblNlY29uZCQx ID0gMTAwMCwKICAgIGR1cmF0aW9uTWludXRlJDEgPSBkdXJhdGlvblNlY29uZCQxICogNjAsCiAg ICBkdXJhdGlvbkhvdXIkMSA9IGR1cmF0aW9uTWludXRlJDEgKiA2MCwKICAgIGR1cmF0aW9uRGF5 JDEgPSBkdXJhdGlvbkhvdXIkMSAqIDI0LAogICAgZHVyYXRpb25XZWVrJDEgPSBkdXJhdGlvbkRh eSQxICogNywKICAgIGR1cmF0aW9uTW9udGggPSBkdXJhdGlvbkRheSQxICogMzAsCiAgICBkdXJh dGlvblllYXIgPSBkdXJhdGlvbkRheSQxICogMzY1OwoKZnVuY3Rpb24gZGF0ZSQxKHQpIHsKICBy ZXR1cm4gbmV3IERhdGUodCk7Cn0KCmZ1bmN0aW9uIG51bWJlciQzKHQpIHsKICByZXR1cm4gdCBp bnN0YW5jZW9mIERhdGUgPyArdCA6ICtuZXcgRGF0ZSgrdCk7Cn0KCmZ1bmN0aW9uIGNhbGVuZGFy KHllYXIsIG1vbnRoLCB3ZWVrLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29u ZCwgZm9ybWF0KSB7CiAgdmFyIHNjYWxlID0gY29udGludW91cyhpZGVudGl0eSQ2LCBpZGVudGl0 eSQ2KSwKICAgICAgaW52ZXJ0ID0gc2NhbGUuaW52ZXJ0LAogICAgICBkb21haW4gPSBzY2FsZS5k b21haW47CgogIHZhciBmb3JtYXRNaWxsaXNlY29uZCA9IGZvcm1hdCgiLiVMIiksCiAgICAgIGZv cm1hdFNlY29uZCA9IGZvcm1hdCgiOiVTIiksCiAgICAgIGZvcm1hdE1pbnV0ZSA9IGZvcm1hdCgi JUk6JU0iKSwKICAgICAgZm9ybWF0SG91ciA9IGZvcm1hdCgiJUkgJXAiKSwKICAgICAgZm9ybWF0 RGF5ID0gZm9ybWF0KCIlYSAlZCIpLAogICAgICBmb3JtYXRXZWVrID0gZm9ybWF0KCIlYiAlZCIp LAogICAgICBmb3JtYXRNb250aCA9IGZvcm1hdCgiJUIiKSwKICAgICAgZm9ybWF0WWVhciA9IGZv cm1hdCgiJVkiKTsKCiAgdmFyIHRpY2tJbnRlcnZhbHMgPSBbCiAgICBbc2Vjb25kLCAgMSwgICAg ICBkdXJhdGlvblNlY29uZCQxXSwKICAgIFtzZWNvbmQsICA1LCAgNSAqIGR1cmF0aW9uU2Vjb25k JDFdLAogICAgW3NlY29uZCwgMTUsIDE1ICogZHVyYXRpb25TZWNvbmQkMV0sCiAgICBbc2Vjb25k LCAzMCwgMzAgKiBkdXJhdGlvblNlY29uZCQxXSwKICAgIFttaW51dGUsICAxLCAgICAgIGR1cmF0 aW9uTWludXRlJDFdLAogICAgW21pbnV0ZSwgIDUsICA1ICogZHVyYXRpb25NaW51dGUkMV0sCiAg ICBbbWludXRlLCAxNSwgMTUgKiBkdXJhdGlvbk1pbnV0ZSQxXSwKICAgIFttaW51dGUsIDMwLCAz MCAqIGR1cmF0aW9uTWludXRlJDFdLAogICAgWyAgaG91ciwgIDEsICAgICAgZHVyYXRpb25Ib3Vy JDEgIF0sCiAgICBbICBob3VyLCAgMywgIDMgKiBkdXJhdGlvbkhvdXIkMSAgXSwKICAgIFsgIGhv dXIsICA2LCAgNiAqIGR1cmF0aW9uSG91ciQxICBdLAogICAgWyAgaG91ciwgMTIsIDEyICogZHVy YXRpb25Ib3VyJDEgIF0sCiAgICBbICAgZGF5LCAgMSwgICAgICBkdXJhdGlvbkRheSQxICAgXSwK ICAgIFsgICBkYXksICAyLCAgMiAqIGR1cmF0aW9uRGF5JDEgICBdLAogICAgWyAgd2VlaywgIDEs ICAgICAgZHVyYXRpb25XZWVrJDEgIF0sCiAgICBbIG1vbnRoLCAgMSwgICAgICBkdXJhdGlvbk1v bnRoIF0sCiAgICBbIG1vbnRoLCAgMywgIDMgKiBkdXJhdGlvbk1vbnRoIF0sCiAgICBbICB5ZWFy LCAgMSwgICAgICBkdXJhdGlvblllYXIgIF0KICBdOwoKICBmdW5jdGlvbiB0aWNrRm9ybWF0KGRh dGUpIHsKICAgIHJldHVybiAoc2Vjb25kKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1pbGxpc2Vjb25k CiAgICAgICAgOiBtaW51dGUoZGF0ZSkgPCBkYXRlID8gZm9ybWF0U2Vjb25kCiAgICAgICAgOiBo b3VyKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1pbnV0ZQogICAgICAgIDogZGF5KGRhdGUpIDwgZGF0 ZSA/IGZvcm1hdEhvdXIKICAgICAgICA6IG1vbnRoKGRhdGUpIDwgZGF0ZSA/ICh3ZWVrKGRhdGUp IDwgZGF0ZSA/IGZvcm1hdERheSA6IGZvcm1hdFdlZWspCiAgICAgICAgOiB5ZWFyKGRhdGUpIDwg ZGF0ZSA/IGZvcm1hdE1vbnRoCiAgICAgICAgOiBmb3JtYXRZZWFyKShkYXRlKTsKICB9CgogIGZ1 bmN0aW9uIHRpY2tJbnRlcnZhbChpbnRlcnZhbCwgc3RhcnQsIHN0b3AsIHN0ZXApIHsKICAgIGlm IChpbnRlcnZhbCA9PSBudWxsKSBpbnRlcnZhbCA9IDEwOwoKICAgIC8vIElmIGEgZGVzaXJlZCB0 aWNrIGNvdW50IGlzIHNwZWNpZmllZCwgcGljayBhIHJlYXNvbmFibGUgdGljayBpbnRlcnZhbAog ICAgLy8gYmFzZWQgb24gdGhlIGV4dGVudCBvZiB0aGUgZG9tYWluIGFuZCBhIHJvdWdoIGVzdGlt YXRlIG9mIHRpY2sgc2l6ZS4KICAgIC8vIE90aGVyd2lzZSwgYXNzdW1lIGludGVydmFsIGlzIGFs cmVhZHkgYSB0aW1lIGludGVydmFsIGFuZCB1c2UgaXQuCiAgICBpZiAodHlwZW9mIGludGVydmFs ID09PSAibnVtYmVyIikgewogICAgICB2YXIgdGFyZ2V0ID0gTWF0aC5hYnMoc3RvcCAtIHN0YXJ0 KSAvIGludGVydmFsLAogICAgICAgICAgaSA9IGJpc2VjdG9yKGZ1bmN0aW9uKGkpIHsgcmV0dXJu IGlbMl07IH0pLnJpZ2h0KHRpY2tJbnRlcnZhbHMsIHRhcmdldCk7CiAgICAgIGlmIChpID09PSB0 aWNrSW50ZXJ2YWxzLmxlbmd0aCkgewogICAgICAgIHN0ZXAgPSB0aWNrU3RlcChzdGFydCAvIGR1 cmF0aW9uWWVhciwgc3RvcCAvIGR1cmF0aW9uWWVhciwgaW50ZXJ2YWwpOwogICAgICAgIGludGVy dmFsID0geWVhcjsKICAgICAgfSBlbHNlIGlmIChpKSB7CiAgICAgICAgaSA9IHRpY2tJbnRlcnZh bHNbdGFyZ2V0IC8gdGlja0ludGVydmFsc1tpIC0gMV1bMl0gPCB0aWNrSW50ZXJ2YWxzW2ldWzJd IC8gdGFyZ2V0ID8gaSAtIDEgOiBpXTsKICAgICAgICBzdGVwID0gaVsxXTsKICAgICAgICBpbnRl cnZhbCA9IGlbMF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RlcCA9IE1hdGgubWF4KHRpY2tT dGVwKHN0YXJ0LCBzdG9wLCBpbnRlcnZhbCksIDEpOwogICAgICAgIGludGVydmFsID0gbWlsbGlz ZWNvbmQ7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc3RlcCA9PSBudWxsID8gaW50ZXJ2YWwg OiBpbnRlcnZhbC5ldmVyeShzdGVwKTsKICB9CgogIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHkp IHsKICAgIHJldHVybiBuZXcgRGF0ZShpbnZlcnQoeSkpOwogIH07CgogIHNjYWxlLmRvbWFpbiA9 IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gZG9tYWluKG1hcCQz LmNhbGwoXywgbnVtYmVyJDMpKSA6IGRvbWFpbigpLm1hcChkYXRlJDEpOwogIH07CgogIHNjYWxl LnRpY2tzID0gZnVuY3Rpb24oaW50ZXJ2YWwsIHN0ZXApIHsKICAgIHZhciBkID0gZG9tYWluKCks CiAgICAgICAgdDAgPSBkWzBdLAogICAgICAgIHQxID0gZFtkLmxlbmd0aCAtIDFdLAogICAgICAg IHIgPSB0MSA8IHQwLAogICAgICAgIHQ7CiAgICBpZiAocikgdCA9IHQwLCB0MCA9IHQxLCB0MSA9 IHQ7CiAgICB0ID0gdGlja0ludGVydmFsKGludGVydmFsLCB0MCwgdDEsIHN0ZXApOwogICAgdCA9 IHQgPyB0LnJhbmdlKHQwLCB0MSArIDEpIDogW107IC8vIGluY2x1c2l2ZSBzdG9wCiAgICByZXR1 cm4gciA/IHQucmV2ZXJzZSgpIDogdDsKICB9OwoKICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rp b24oY291bnQsIHNwZWNpZmllcikgewogICAgcmV0dXJuIHNwZWNpZmllciA9PSBudWxsID8gdGlj a0Zvcm1hdCA6IGZvcm1hdChzcGVjaWZpZXIpOwogIH07CgogIHNjYWxlLm5pY2UgPSBmdW5jdGlv bihpbnRlcnZhbCwgc3RlcCkgewogICAgdmFyIGQgPSBkb21haW4oKTsKICAgIHJldHVybiAoaW50 ZXJ2YWwgPSB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgc3Rl cCkpCiAgICAgICAgPyBkb21haW4obmljZShkLCBpbnRlcnZhbCkpCiAgICAgICAgOiBzY2FsZTsK ICB9OwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gY29weShzY2FsZSwg Y2FsZW5kYXIoeWVhciwgbW9udGgsIHdlZWssIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1p bGxpc2Vjb25kLCBmb3JtYXQpKTsKICB9OwoKICByZXR1cm4gc2NhbGU7Cn0KCmZ1bmN0aW9uIHRp bWUoKSB7CiAgcmV0dXJuIGluaXRSYW5nZS5hcHBseShjYWxlbmRhcih5ZWFyLCBtb250aCwgc3Vu ZGF5LCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCwgZXhwb3J0cy50aW1l Rm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDIwMDAsIDAsIDEpLCBuZXcgRGF0ZSgyMDAwLCAwLCAy KV0pLCBhcmd1bWVudHMpOwp9CgpmdW5jdGlvbiB1dGNUaW1lKCkgewogIHJldHVybiBpbml0UmFu Z2UuYXBwbHkoY2FsZW5kYXIodXRjWWVhciwgdXRjTW9udGgsIHV0Y1N1bmRheSwgdXRjRGF5LCB1 dGNIb3VyLCB1dGNNaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQsIGV4cG9ydHMudXRjRm9ybWF0 KS5kb21haW4oW0RhdGUuVVRDKDIwMDAsIDAsIDEpLCBEYXRlLlVUQygyMDAwLCAwLCAyKV0pLCBh cmd1bWVudHMpOwp9CgpmdW5jdGlvbiB0cmFuc2Zvcm1lciQyKCkgewogIHZhciB4MCA9IDAsCiAg ICAgIHgxID0gMSwKICAgICAgdDAsCiAgICAgIHQxLAogICAgICBrMTAsCiAgICAgIHRyYW5zZm9y bSwKICAgICAgaW50ZXJwb2xhdG9yID0gaWRlbnRpdHkkNiwKICAgICAgY2xhbXAgPSBmYWxzZSwK ICAgICAgdW5rbm93bjsKCiAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgcmV0dXJuIGlzTmFOKHgg PSAreCkgPyB1bmtub3duIDogaW50ZXJwb2xhdG9yKGsxMCA9PT0gMCA/IDAuNSA6ICh4ID0gKHRy YW5zZm9ybSh4KSAtIHQwKSAqIGsxMCwgY2xhbXAgPyBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB4 KSkgOiB4KSk7CiAgfQoKICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4g YXJndW1lbnRzLmxlbmd0aCA/ICh0MCA9IHRyYW5zZm9ybSh4MCA9ICtfWzBdKSwgdDEgPSB0cmFu c2Zvcm0oeDEgPSArX1sxXSksIGsxMCA9IHQwID09PSB0MSA/IDAgOiAxIC8gKHQxIC0gdDApLCBz Y2FsZSkgOiBbeDAsIHgxXTsKICB9OwoKICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHsKICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsYW1wID0gISFfLCBzY2FsZSkgOiBjbGFtcDsK ICB9OwoKICBzY2FsZS5pbnRlcnBvbGF0b3IgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJn dW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0b3IgPSBfLCBzY2FsZSkgOiBpbnRlcnBvbGF0b3I7 CiAgfTsKCiAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVu dHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duOwogIH07CgogIHJldHVy biBmdW5jdGlvbih0KSB7CiAgICB0cmFuc2Zvcm0gPSB0LCB0MCA9IHQoeDApLCB0MSA9IHQoeDEp LCBrMTAgPSB0MCA9PT0gdDEgPyAwIDogMSAvICh0MSAtIHQwKTsKICAgIHJldHVybiBzY2FsZTsK ICB9Owp9CgpmdW5jdGlvbiBjb3B5JDEoc291cmNlLCB0YXJnZXQpIHsKICByZXR1cm4gdGFyZ2V0 CiAgICAgIC5kb21haW4oc291cmNlLmRvbWFpbigpKQogICAgICAuaW50ZXJwb2xhdG9yKHNvdXJj ZS5pbnRlcnBvbGF0b3IoKSkKICAgICAgLmNsYW1wKHNvdXJjZS5jbGFtcCgpKQogICAgICAudW5r bm93bihzb3VyY2UudW5rbm93bigpKTsKfQoKZnVuY3Rpb24gc2VxdWVudGlhbCgpIHsKICB2YXIg c2NhbGUgPSBsaW5lYXJpc2godHJhbnNmb3JtZXIkMigpKGlkZW50aXR5JDYpKTsKCiAgc2NhbGUu Y29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGNvcHkkMShzY2FsZSwgc2VxdWVudGlhbCgp KTsKICB9OwoKICByZXR1cm4gaW5pdEludGVycG9sYXRvci5hcHBseShzY2FsZSwgYXJndW1lbnRz KTsKfQoKZnVuY3Rpb24gc2VxdWVudGlhbExvZygpIHsKICB2YXIgc2NhbGUgPSBsb2dnaXNoKHRy YW5zZm9ybWVyJDIoKSkuZG9tYWluKFsxLCAxMF0pOwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24o KSB7CiAgICByZXR1cm4gY29weSQxKHNjYWxlLCBzZXF1ZW50aWFsTG9nKCkpLmJhc2Uoc2NhbGUu YmFzZSgpKTsKICB9OwoKICByZXR1cm4gaW5pdEludGVycG9sYXRvci5hcHBseShzY2FsZSwgYXJn dW1lbnRzKTsKfQoKZnVuY3Rpb24gc2VxdWVudGlhbFN5bWxvZygpIHsKICB2YXIgc2NhbGUgPSBz eW1sb2dpc2godHJhbnNmb3JtZXIkMigpKTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewog ICAgcmV0dXJuIGNvcHkkMShzY2FsZSwgc2VxdWVudGlhbFN5bWxvZygpKS5jb25zdGFudChzY2Fs ZS5jb25zdGFudCgpKTsKICB9OwoKICByZXR1cm4gaW5pdEludGVycG9sYXRvci5hcHBseShzY2Fs ZSwgYXJndW1lbnRzKTsKfQoKZnVuY3Rpb24gc2VxdWVudGlhbFBvdygpIHsKICB2YXIgc2NhbGUg PSBwb3dpc2godHJhbnNmb3JtZXIkMigpKTsKCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewog ICAgcmV0dXJuIGNvcHkkMShzY2FsZSwgc2VxdWVudGlhbFBvdygpKS5leHBvbmVudChzY2FsZS5l eHBvbmVudCgpKTsKICB9OwoKICByZXR1cm4gaW5pdEludGVycG9sYXRvci5hcHBseShzY2FsZSwg YXJndW1lbnRzKTsKfQoKZnVuY3Rpb24gc2VxdWVudGlhbFNxcnQoKSB7CiAgcmV0dXJuIHNlcXVl bnRpYWxQb3cuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5leHBvbmVudCgwLjUpOwp9CgpmdW5jdGlv biBzZXF1ZW50aWFsUXVhbnRpbGUoKSB7CiAgdmFyIGRvbWFpbiA9IFtdLAogICAgICBpbnRlcnBv bGF0b3IgPSBpZGVudGl0eSQ2OwoKICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICBpZiAoIWlzTmFO KHggPSAreCkpIHJldHVybiBpbnRlcnBvbGF0b3IoKGJpc2VjdFJpZ2h0KGRvbWFpbiwgeCkgLSAx KSAvIChkb21haW4ubGVuZ3RoIC0gMSkpOwogIH0KCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24o XykgewogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7CiAg ICBkb21haW4gPSBbXTsKICAgIGZvciAodmFyIGkgPSAwLCBuID0gXy5sZW5ndGgsIGQ7IGkgPCBu OyArK2kpIGlmIChkID0gX1tpXSwgZCAhPSBudWxsICYmICFpc05hTihkID0gK2QpKSBkb21haW4u cHVzaChkKTsKICAgIGRvbWFpbi5zb3J0KGFzY2VuZGluZyk7CiAgICByZXR1cm4gc2NhbGU7CiAg fTsKCiAgc2NhbGUuaW50ZXJwb2xhdG9yID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdG9yID0gXywgc2NhbGUpIDogaW50ZXJwb2xhdG9yOwog IH07CgogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBzZXF1ZW50aWFsUXVh bnRpbGUoaW50ZXJwb2xhdG9yKS5kb21haW4oZG9tYWluKTsKICB9OwoKICByZXR1cm4gaW5pdElu dGVycG9sYXRvci5hcHBseShzY2FsZSwgYXJndW1lbnRzKTsKfQoKZnVuY3Rpb24gdHJhbnNmb3Jt ZXIkMygpIHsKICB2YXIgeDAgPSAwLAogICAgICB4MSA9IDAuNSwKICAgICAgeDIgPSAxLAogICAg ICB0MCwKICAgICAgdDEsCiAgICAgIHQyLAogICAgICBrMTAsCiAgICAgIGsyMSwKICAgICAgaW50 ZXJwb2xhdG9yID0gaWRlbnRpdHkkNiwKICAgICAgdHJhbnNmb3JtLAogICAgICBjbGFtcCA9IGZh bHNlLAogICAgICB1bmtub3duOwoKICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICByZXR1cm4gaXNO YU4oeCA9ICt4KSA/IHVua25vd24gOiAoeCA9IDAuNSArICgoeCA9ICt0cmFuc2Zvcm0oeCkpIC0g dDEpICogKHggPCB0MSA/IGsxMCA6IGsyMSksIGludGVycG9sYXRvcihjbGFtcCA/IE1hdGgubWF4 KDAsIE1hdGgubWluKDEsIHgpKSA6IHgpKTsKICB9CgogIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9u KF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHQwID0gdHJhbnNmb3JtKHgwID0g K19bMF0pLCB0MSA9IHRyYW5zZm9ybSh4MSA9ICtfWzFdKSwgdDIgPSB0cmFuc2Zvcm0oeDIgPSAr X1syXSksIGsxMCA9IHQwID09PSB0MSA/IDAgOiAwLjUgLyAodDEgLSB0MCksIGsyMSA9IHQxID09 PSB0MiA/IDAgOiAwLjUgLyAodDIgLSB0MSksIHNjYWxlKSA6IFt4MCwgeDEsIHgyXTsKICB9OwoK ICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3Ro ID8gKGNsYW1wID0gISFfLCBzY2FsZSkgOiBjbGFtcDsKICB9OwoKICBzY2FsZS5pbnRlcnBvbGF0 b3IgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBv bGF0b3IgPSBfLCBzY2FsZSkgOiBpbnRlcnBvbGF0b3I7CiAgfTsKCiAgc2NhbGUudW5rbm93biA9 IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBf LCBzY2FsZSkgOiB1bmtub3duOwogIH07CgogIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICB0cmFu c2Zvcm0gPSB0LCB0MCA9IHQoeDApLCB0MSA9IHQoeDEpLCB0MiA9IHQoeDIpLCBrMTAgPSB0MCA9 PT0gdDEgPyAwIDogMC41IC8gKHQxIC0gdDApLCBrMjEgPSB0MSA9PT0gdDIgPyAwIDogMC41IC8g KHQyIC0gdDEpOwogICAgcmV0dXJuIHNjYWxlOwogIH07Cn0KCmZ1bmN0aW9uIGRpdmVyZ2luZygp IHsKICB2YXIgc2NhbGUgPSBsaW5lYXJpc2godHJhbnNmb3JtZXIkMygpKGlkZW50aXR5JDYpKTsK CiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGNvcHkkMShzY2FsZSwgZGl2 ZXJnaW5nKCkpOwogIH07CgogIHJldHVybiBpbml0SW50ZXJwb2xhdG9yLmFwcGx5KHNjYWxlLCBh cmd1bWVudHMpOwp9CgpmdW5jdGlvbiBkaXZlcmdpbmdMb2coKSB7CiAgdmFyIHNjYWxlID0gbG9n Z2lzaCh0cmFuc2Zvcm1lciQzKCkpLmRvbWFpbihbMC4xLCAxLCAxMF0pOwoKICBzY2FsZS5jb3B5 ID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gY29weSQxKHNjYWxlLCBkaXZlcmdpbmdMb2coKSku YmFzZShzY2FsZS5iYXNlKCkpOwogIH07CgogIHJldHVybiBpbml0SW50ZXJwb2xhdG9yLmFwcGx5 KHNjYWxlLCBhcmd1bWVudHMpOwp9CgpmdW5jdGlvbiBkaXZlcmdpbmdTeW1sb2coKSB7CiAgdmFy IHNjYWxlID0gc3ltbG9naXNoKHRyYW5zZm9ybWVyJDMoKSk7CgogIHNjYWxlLmNvcHkgPSBmdW5j dGlvbigpIHsKICAgIHJldHVybiBjb3B5JDEoc2NhbGUsIGRpdmVyZ2luZ1N5bWxvZygpKS5jb25z dGFudChzY2FsZS5jb25zdGFudCgpKTsKICB9OwoKICByZXR1cm4gaW5pdEludGVycG9sYXRvci5h cHBseShzY2FsZSwgYXJndW1lbnRzKTsKfQoKZnVuY3Rpb24gZGl2ZXJnaW5nUG93KCkgewogIHZh ciBzY2FsZSA9IHBvd2lzaCh0cmFuc2Zvcm1lciQzKCkpOwoKICBzY2FsZS5jb3B5ID0gZnVuY3Rp b24oKSB7CiAgICByZXR1cm4gY29weSQxKHNjYWxlLCBkaXZlcmdpbmdQb3coKSkuZXhwb25lbnQo c2NhbGUuZXhwb25lbnQoKSk7CiAgfTsKCiAgcmV0dXJuIGluaXRJbnRlcnBvbGF0b3IuYXBwbHko c2NhbGUsIGFyZ3VtZW50cyk7Cn0KCmZ1bmN0aW9uIGRpdmVyZ2luZ1NxcnQoKSB7CiAgcmV0dXJu IGRpdmVyZ2luZ1Bvdy5hcHBseShudWxsLCBhcmd1bWVudHMpLmV4cG9uZW50KDAuNSk7Cn0KCmZ1 bmN0aW9uIGNvbG9ycyhzcGVjaWZpZXIpIHsKICB2YXIgbiA9IHNwZWNpZmllci5sZW5ndGggLyA2 IHwgMCwgY29sb3JzID0gbmV3IEFycmF5KG4pLCBpID0gMDsKICB3aGlsZSAoaSA8IG4pIGNvbG9y c1tpXSA9ICIjIiArIHNwZWNpZmllci5zbGljZShpICogNiwgKytpICogNik7CiAgcmV0dXJuIGNv bG9yczsKfQoKdmFyIGNhdGVnb3J5MTAgPSBjb2xvcnMoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2Mjcy ODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpOwoKdmFyIEFjY2VudCA9IGNv bG9ycygiN2ZjOTdmYmVhZWQ0ZmRjMDg2ZmZmZjk5Mzg2Y2IwZjAwMjdmYmY1YjE3NjY2NjY2Iik7 Cgp2YXIgRGFyazIgPSBjb2xvcnMoIjFiOWU3N2Q5NWYwMjc1NzBiM2U3Mjk4YTY2YTYxZWU2YWIw MmE2NzYxZDY2NjY2NiIpOwoKdmFyIFBhaXJlZCA9IGNvbG9ycygiYTZjZWUzMWY3OGI0YjJkZjhh MzNhMDJjZmI5YTk5ZTMxYTFjZmRiZjZmZmY3ZjAwY2FiMmQ2NmEzZDlhZmZmZjk5YjE1OTI4Iik7 Cgp2YXIgUGFzdGVsMSA9IGNvbG9ycygiZmJiNGFlYjNjZGUzY2NlYmM1ZGVjYmU0ZmVkOWE2ZmZm ZmNjZTVkOGJkZmRkYWVjZjJmMmYyIik7Cgp2YXIgUGFzdGVsMiA9IGNvbG9ycygiYjNlMmNkZmRj ZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIik7Cgp2YXIgU2V0MSA9IGNv bG9ycygiZTQxYTFjMzc3ZWI4NGRhZjRhOTg0ZWEzZmY3ZjAwZmZmZjMzYTY1NjI4Zjc4MWJmOTk5 OTk5Iik7Cgp2YXIgU2V0MiA9IGNvbG9ycygiNjZjMmE1ZmM4ZDYyOGRhMGNiZTc4YWMzYTZkODU0 ZmZkOTJmZTVjNDk0YjNiM2IzIik7Cgp2YXIgU2V0MyA9IGNvbG9ycygiOGRkM2M3ZmZmZmIzYmVi YWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZm Iik7Cgp2YXIgVGFibGVhdTEwID0gY29sb3JzKCI0ZTc5YTdmMjhlMmNlMTU3NTk3NmI3YjI1OWEx NGZlZGM5NDlhZjdhYTFmZjlkYTc5Yzc1NWZiYWIwYWIiKTsKCmZ1bmN0aW9uIHJhbXAoc2NoZW1l KSB7CiAgcmV0dXJuIHJnYkJhc2lzKHNjaGVtZVtzY2hlbWUubGVuZ3RoIC0gMV0pOwp9Cgp2YXIg c2NoZW1lID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAiZDhiMzY1ZjVmNWY1NWFiNGFjIiwKICAi YTY2MTFhZGZjMjdkODBjZGMxMDE4NTcxIiwKICAiYTY2MTFhZGZjMjdkZjVmNWY1ODBjZGMxMDE4 NTcxIiwKICAiOGM1MTBhZDhiMzY1ZjZlOGMzYzdlYWU1NWFiNGFjMDE2NjVlIiwKICAiOGM1MTBh ZDhiMzY1ZjZlOGMzZjVmNWY1YzdlYWU1NWFiNGFjMDE2NjVlIiwKICAiOGM1MTBhYmY4MTJkZGZj MjdkZjZlOGMzYzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwKICAiOGM1MTBhYmY4MTJkZGZjMjdk ZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwKICAiNTQzMDA1OGM1MTBhYmY4 MTJkZGZjMjdkZjZlOGMzYzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlMDAzYzMwIiwKICAiNTQzMDA1 OGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlMDAz YzMwIgopLm1hcChjb2xvcnMpOwoKdmFyIEJyQkcgPSByYW1wKHNjaGVtZSk7Cgp2YXIgc2NoZW1l JDEgPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICJhZjhkYzNmN2Y3Zjc3ZmJmN2IiLAogICI3YjMy OTRjMmE1Y2ZhNmRiYTAwMDg4MzciLAogICI3YjMyOTRjMmE1Y2ZmN2Y3ZjdhNmRiYTAwMDg4Mzci LAogICI3NjJhODNhZjhkYzNlN2Q0ZThkOWYwZDM3ZmJmN2IxYjc4MzciLAogICI3NjJhODNhZjhk YzNlN2Q0ZThmN2Y3ZjdkOWYwZDM3ZmJmN2IxYjc4MzciLAogICI3NjJhODM5OTcwYWJjMmE1Y2Zl N2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLAogICI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0 ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLAogICI0MDAwNGI3NjJhODM5OTcwYWJj MmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiLAogICI0MDAwNGI3NjJh ODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIi CikubWFwKGNvbG9ycyk7Cgp2YXIgUFJHbiA9IHJhbXAoc2NoZW1lJDEpOwoKdmFyIHNjaGVtZSQy ID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAiZTlhM2M5ZjdmN2Y3YTFkNzZhIiwKICAiZDAxYzhi ZjFiNmRhYjhlMTg2NGRhYzI2IiwKICAiZDAxYzhiZjFiNmRhZjdmN2Y3YjhlMTg2NGRhYzI2IiwK ICAiYzUxYjdkZTlhM2M5ZmRlMGVmZTZmNWQwYTFkNzZhNGQ5MjIxIiwKICAiYzUxYjdkZTlhM2M5 ZmRlMGVmZjdmN2Y3ZTZmNWQwYTFkNzZhNGQ5MjIxIiwKICAiYzUxYjdkZGU3N2FlZjFiNmRhZmRl MGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwKICAiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVm ZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwKICAiOGUwMTUyYzUxYjdkZGU3N2FlZjFi NmRhZmRlMGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5IiwKICAiOGUwMTUyYzUxYjdk ZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5Igop Lm1hcChjb2xvcnMpOwoKdmFyIFBpWUcgPSByYW1wKHNjaGVtZSQyKTsKCnZhciBzY2hlbWUkMyA9 IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgIjk5OGVjM2Y3ZjdmN2YxYTM0MCIsCiAgIjVlM2M5OWIy YWJkMmZkYjg2M2U2NjEwMSIsCiAgIjVlM2M5OWIyYWJkMmY3ZjdmN2ZkYjg2M2U2NjEwMSIsCiAg IjU0Mjc4ODk5OGVjM2Q4ZGFlYmZlZTBiNmYxYTM0MGIzNTgwNiIsCiAgIjU0Mjc4ODk5OGVjM2Q4 ZGFlYmY3ZjdmN2ZlZTBiNmYxYTM0MGIzNTgwNiIsCiAgIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFl YmZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNiIsCiAgIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmY3 ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNiIsCiAgIjJkMDA0YjU0Mjc4ODgwNzNhY2IyYWJk MmQ4ZGFlYmZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNjdmM2IwOCIsCiAgIjJkMDA0YjU0Mjc4ODgw NzNhY2IyYWJkMmQ4ZGFlYmY3ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNjdmM2IwOCIKKS5t YXAoY29sb3JzKTsKCnZhciBQdU9yID0gcmFtcChzY2hlbWUkMyk7Cgp2YXIgc2NoZW1lJDQgPSBu ZXcgQXJyYXkoMykuY29uY2F0KAogICJlZjhhNjJmN2Y3Zjc2N2E5Y2YiLAogICJjYTAwMjBmNGE1 ODI5MmM1ZGUwNTcxYjAiLAogICJjYTAwMjBmNGE1ODJmN2Y3Zjc5MmM1ZGUwNTcxYjAiLAogICJi MjE4MmJlZjhhNjJmZGRiYzdkMWU1ZjA2N2E5Y2YyMTY2YWMiLAogICJiMjE4MmJlZjhhNjJmZGRi YzdmN2Y3ZjdkMWU1ZjA2N2E5Y2YyMTY2YWMiLAogICJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdk MWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLAogICJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3 ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLAogICI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJm ZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiLAogICI2NzAwMWZiMjE4MmJkNjYw NGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiCikubWFw KGNvbG9ycyk7Cgp2YXIgUmRCdSA9IHJhbXAoc2NoZW1lJDQpOwoKdmFyIHNjaGVtZSQ1ID0gbmV3 IEFycmF5KDMpLmNvbmNhdCgKICAiZWY4YTYyZmZmZmZmOTk5OTk5IiwKICAiY2EwMDIwZjRhNTgy YmFiYWJhNDA0MDQwIiwKICAiY2EwMDIwZjRhNTgyZmZmZmZmYmFiYWJhNDA0MDQwIiwKICAiYjIx ODJiZWY4YTYyZmRkYmM3ZTBlMGUwOTk5OTk5NGQ0ZDRkIiwKICAiYjIxODJiZWY4YTYyZmRkYmM3 ZmZmZmZmZTBlMGUwOTk5OTk5NGQ0ZDRkIiwKICAiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZTBl MGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwKICAiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZm ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwKICAiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRk YmM3ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhIiwKICAiNjcwMDFmYjIxODJiZDY2MDRk ZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhIgopLm1hcChj b2xvcnMpOwoKdmFyIFJkR3kgPSByYW1wKHNjaGVtZSQ1KTsKCnZhciBzY2hlbWUkNiA9IG5ldyBB cnJheSgzKS5jb25jYXQoCiAgImZjOGQ1OWZmZmZiZjkxYmZkYiIsCiAgImQ3MTkxY2ZkYWU2MWFi ZDllOTJjN2JiNiIsCiAgImQ3MTkxY2ZkYWU2MWZmZmZiZmFiZDllOTJjN2JiNiIsCiAgImQ3MzAy N2ZjOGQ1OWZlZTA5MGUwZjNmODkxYmZkYjQ1NzViNCIsCiAgImQ3MzAyN2ZjOGQ1OWZlZTA5MGZm ZmZiZmUwZjNmODkxYmZkYjQ1NzViNCIsCiAgImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGUwZjNm OGFiZDllOTc0YWRkMTQ1NzViNCIsCiAgImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGZmZmZiZmUw ZjNmOGFiZDllOTc0YWRkMTQ1NzViNCIsCiAgImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5 MGUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNDMxMzY5NSIsCiAgImE1MDAyNmQ3MzAyN2Y0NmQ0M2Zk YWU2MWZlZTA5MGZmZmZiZmUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNDMxMzY5NSIKKS5tYXAoY29s b3JzKTsKCnZhciBSZFlsQnUgPSByYW1wKHNjaGVtZSQ2KTsKCnZhciBzY2hlbWUkNyA9IG5ldyBB cnJheSgzKS5jb25jYXQoCiAgImZjOGQ1OWZmZmZiZjkxY2Y2MCIsCiAgImQ3MTkxY2ZkYWU2MWE2 ZDk2YTFhOTY0MSIsCiAgImQ3MTkxY2ZkYWU2MWZmZmZiZmE2ZDk2YTFhOTY0MSIsCiAgImQ3MzAy N2ZjOGQ1OWZlZTA4YmQ5ZWY4YjkxY2Y2MDFhOTg1MCIsCiAgImQ3MzAyN2ZjOGQ1OWZlZTA4YmZm ZmZiZmQ5ZWY4YjkxY2Y2MDFhOTg1MCIsCiAgImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmQ5ZWY4 YmE2ZDk2YTY2YmQ2MzFhOTg1MCIsCiAgImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmQ5 ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MCIsCiAgImE1MDAyNmQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4 YmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MDAwNjgzNyIsCiAgImE1MDAyNmQ3MzAyN2Y0NmQ0M2Zk YWU2MWZlZTA4YmZmZmZiZmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MDAwNjgzNyIKKS5tYXAoY29s b3JzKTsKCnZhciBSZFlsR24gPSByYW1wKHNjaGVtZSQ3KTsKCnZhciBzY2hlbWUkOCA9IG5ldyBB cnJheSgzKS5jb25jYXQoCiAgImZjOGQ1OWZmZmZiZjk5ZDU5NCIsCiAgImQ3MTkxY2ZkYWU2MWFi ZGRhNDJiODNiYSIsCiAgImQ3MTkxY2ZkYWU2MWZmZmZiZmFiZGRhNDJiODNiYSIsCiAgImQ1M2U0 ZmZjOGQ1OWZlZTA4YmU2ZjU5ODk5ZDU5NDMyODhiZCIsCiAgImQ1M2U0ZmZjOGQ1OWZlZTA4YmZm ZmZiZmU2ZjU5ODk5ZDU5NDMyODhiZCIsCiAgImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmU2ZjU5 OGFiZGRhNDY2YzJhNTMyODhiZCIsCiAgImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmU2 ZjU5OGFiZGRhNDY2YzJhNTMyODhiZCIsCiAgIjllMDE0MmQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4 YmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZDVlNGZhMiIsCiAgIjllMDE0MmQ1M2U0ZmY0NmQ0M2Zk YWU2MWZlZTA4YmZmZmZiZmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZDVlNGZhMiIKKS5tYXAoY29s b3JzKTsKCnZhciBTcGVjdHJhbCA9IHJhbXAoc2NoZW1lJDgpOwoKdmFyIHNjaGVtZSQ5ID0gbmV3 IEFycmF5KDMpLmNvbmNhdCgKICAiZTVmNWY5OTlkOGM5MmNhMjVmIiwKICAiZWRmOGZiYjJlMmUy NjZjMmE0MjM4YjQ1IiwKICAiZWRmOGZiYjJlMmUyNjZjMmE0MmNhMjVmMDA2ZDJjIiwKICAiZWRm OGZiY2NlY2U2OTlkOGM5NjZjMmE0MmNhMjVmMDA2ZDJjIiwKICAiZWRmOGZiY2NlY2U2OTlkOGM5 NjZjMmE0NDFhZTc2MjM4YjQ1MDA1ODI0IiwKICAiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZj MmE0NDFhZTc2MjM4YjQ1MDA1ODI0IiwKICAiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZjMmE0 NDFhZTc2MjM4YjQ1MDA2ZDJjMDA0NDFiIgopLm1hcChjb2xvcnMpOwoKdmFyIEJ1R24gPSByYW1w KHNjaGVtZSQ5KTsKCnZhciBzY2hlbWUkYSA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgImUwZWNm NDllYmNkYTg4NTZhNyIsCiAgImVkZjhmYmIzY2RlMzhjOTZjNjg4NDE5ZCIsCiAgImVkZjhmYmIz Y2RlMzhjOTZjNjg4NTZhNzgxMGY3YyIsCiAgImVkZjhmYmJmZDNlNjllYmNkYThjOTZjNjg4NTZh NzgxMGY3YyIsCiAgImVkZjhmYmJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDZlMDE2YiIs CiAgImY3ZmNmZGUwZWNmNGJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDZlMDE2YiIsCiAg ImY3ZmNmZGUwZWNmNGJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDgxMGY3YzRkMDA0YiIK KS5tYXAoY29sb3JzKTsKCnZhciBCdVB1ID0gcmFtcChzY2hlbWUkYSk7Cgp2YXIgc2NoZW1lJGIg PSBuZXcgQXJyYXkoMykuY29uY2F0KAogICJlMGYzZGJhOGRkYjU0M2EyY2EiLAogICJmMGY5ZThi YWU0YmM3YmNjYzQyYjhjYmUiLAogICJmMGY5ZThiYWU0YmM3YmNjYzQ0M2EyY2EwODY4YWMiLAog ICJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0M2EyY2EwODY4YWMiLAogICJmMGY5ZThjY2ViYzVh OGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLAogICJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRk YjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLAogICJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3 YmNjYzQ0ZWIzZDMyYjhjYmUwODY4YWMwODQwODEiCikubWFwKGNvbG9ycyk7Cgp2YXIgR25CdSA9 IHJhbXAoc2NoZW1lJGIpOwoKdmFyIHNjaGVtZSRjID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAi ZmVlOGM4ZmRiYjg0ZTM0YTMzIiwKICAiZmVmMGQ5ZmRjYzhhZmM4ZDU5ZDczMDFmIiwKICAiZmVm MGQ5ZmRjYzhhZmM4ZDU5ZTM0YTMzYjMwMDAwIiwKICAiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5 ZTM0YTMzYjMwMDAwIiwKICAiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmOTkw MDAwIiwKICAiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmOTkwMDAw IiwKICAiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmYjMwMDAwN2Yw MDAwIgopLm1hcChjb2xvcnMpOwoKdmFyIE9yUmQgPSByYW1wKHNjaGVtZSRjKTsKCnZhciBzY2hl bWUkZCA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgImVjZTJmMGE2YmRkYjFjOTA5OSIsCiAgImY2 ZWZmN2JkYzllMTY3YTljZjAyODE4YSIsCiAgImY2ZWZmN2JkYzllMTY3YTljZjFjOTA5OTAxNmM1 OSIsCiAgImY2ZWZmN2QwZDFlNmE2YmRkYjY3YTljZjFjOTA5OTAxNmM1OSIsCiAgImY2ZWZmN2Qw ZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNjQ1MCIsCiAgImZmZjdmYmVjZTJmMGQwZDFl NmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNjQ1MCIsCiAgImZmZjdmYmVjZTJmMGQwZDFlNmE2 YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNmM1OTAxNDYzNiIKKS5tYXAoY29sb3JzKTsKCnZhciBQ dUJ1R24gPSByYW1wKHNjaGVtZSRkKTsKCnZhciBzY2hlbWUkZSA9IG5ldyBBcnJheSgzKS5jb25j YXQoCiAgImVjZTdmMmE2YmRkYjJiOGNiZSIsCiAgImYxZWVmNmJkYzllMTc0YTljZjA1NzBiMCIs CiAgImYxZWVmNmJkYzllMTc0YTljZjJiOGNiZTA0NWE4ZCIsCiAgImYxZWVmNmQwZDFlNmE2YmRk Yjc0YTljZjJiOGNiZTA0NWE4ZCIsCiAgImYxZWVmNmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1 NzBiMDAzNGU3YiIsCiAgImZmZjdmYmVjZTdmMmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBi MDAzNGU3YiIsCiAgImZmZjdmYmVjZTdmMmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDA0 NWE4ZDAyMzg1OCIKKS5tYXAoY29sb3JzKTsKCnZhciBQdUJ1ID0gcmFtcChzY2hlbWUkZSk7Cgp2 YXIgc2NoZW1lJGYgPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICJlN2UxZWZjOTk0YzdkZDFjNzci LAogICJmMWVlZjZkN2I1ZDhkZjY1YjBjZTEyNTYiLAogICJmMWVlZjZkN2I1ZDhkZjY1YjBkZDFj Nzc5ODAwNDMiLAogICJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBkZDFjNzc5ODAwNDMiLAogICJm MWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLAogICJmN2Y0ZjllN2Ux ZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLAogICJmN2Y0ZjllN2UxZWZk NGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5ODAwNDM2NzAwMWYiCikubWFwKGNvbG9ycyk7 Cgp2YXIgUHVSZCA9IHJhbXAoc2NoZW1lJGYpOwoKdmFyIHNjaGVtZSRnID0gbmV3IEFycmF5KDMp LmNvbmNhdCgKICAiZmRlMGRkZmE5ZmI1YzUxYjhhIiwKICAiZmVlYmUyZmJiNGI5Zjc2OGExYWUw MTdlIiwKICAiZmVlYmUyZmJiNGI5Zjc2OGExYzUxYjhhN2EwMTc3IiwKICAiZmVlYmUyZmNjNWMw ZmE5ZmI1Zjc2OGExYzUxYjhhN2EwMTc3IiwKICAiZmVlYmUyZmNjNWMwZmE5ZmI1Zjc2OGExZGQz NDk3YWUwMTdlN2EwMTc3IiwKICAiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3 YWUwMTdlN2EwMTc3IiwKICAiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUw MTdlN2EwMTc3NDkwMDZhIgopLm1hcChjb2xvcnMpOwoKdmFyIFJkUHUgPSByYW1wKHNjaGVtZSRn KTsKCnZhciBzY2hlbWUkaCA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgImVkZjhiMTdmY2RiYjJj N2ZiOCIsCiAgImZmZmZjY2ExZGFiNDQxYjZjNDIyNWVhOCIsCiAgImZmZmZjY2ExZGFiNDQxYjZj NDJjN2ZiODI1MzQ5NCIsCiAgImZmZmZjY2M3ZTliNDdmY2RiYjQxYjZjNDJjN2ZiODI1MzQ5NCIs CiAgImZmZmZjY2M3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODBjMmM4NCIsCiAgImZmZmZk OWVkZjhiMWM3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODBjMmM4NCIsCiAgImZmZmZkOWVk ZjhiMWM3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODI1MzQ5NDA4MWQ1OCIKKS5tYXAoY29s b3JzKTsKCnZhciBZbEduQnUgPSByYW1wKHNjaGVtZSRoKTsKCnZhciBzY2hlbWUkaSA9IG5ldyBB cnJheSgzKS5jb25jYXQoCiAgImY3ZmNiOWFkZGQ4ZTMxYTM1NCIsCiAgImZmZmZjY2MyZTY5OTc4 YzY3OTIzODQ0MyIsCiAgImZmZmZjY2MyZTY5OTc4YzY3OTMxYTM1NDAwNjgzNyIsCiAgImZmZmZj Y2Q5ZjBhM2FkZGQ4ZTc4YzY3OTMxYTM1NDAwNjgzNyIsCiAgImZmZmZjY2Q5ZjBhM2FkZGQ4ZTc4 YzY3OTQxYWI1ZDIzODQ0MzAwNWEzMiIsCiAgImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3 OTQxYWI1ZDIzODQ0MzAwNWEzMiIsCiAgImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3OTQx YWI1ZDIzODQ0MzAwNjgzNzAwNDUyOSIKKS5tYXAoY29sb3JzKTsKCnZhciBZbEduID0gcmFtcChz Y2hlbWUkaSk7Cgp2YXIgc2NoZW1lJGogPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICJmZmY3YmNm ZWM0NGZkOTVmMGUiLAogICJmZmZmZDRmZWQ5OGVmZTk5MjljYzRjMDIiLAogICJmZmZmZDRmZWQ5 OGVmZTk5MjlkOTVmMGU5OTM0MDQiLAogICJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjlkOTVmMGU5 OTM0MDQiLAogICJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLAog ICJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLAogICJm ZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI5OTM0MDQ2NjI1MDYiCiku bWFwKGNvbG9ycyk7Cgp2YXIgWWxPckJyID0gcmFtcChzY2hlbWUkaik7Cgp2YXIgc2NoZW1lJGsg PSBuZXcgQXJyYXkoMykuY29uY2F0KAogICJmZmVkYTBmZWIyNGNmMDNiMjAiLAogICJmZmZmYjJm ZWNjNWNmZDhkM2NlMzFhMWMiLAogICJmZmZmYjJmZWNjNWNmZDhkM2NmMDNiMjBiZDAwMjYiLAog ICJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmMDNiMjBiZDAwMjYiLAogICJmZmZmYjJmZWQ5NzZm ZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLAogICJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIy NGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLAogICJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNm ZDhkM2NmYzRlMmFlMzFhMWNiZDAwMjY4MDAwMjYiCikubWFwKGNvbG9ycyk7Cgp2YXIgWWxPclJk ID0gcmFtcChzY2hlbWUkayk7Cgp2YXIgc2NoZW1lJGwgPSBuZXcgQXJyYXkoMykuY29uY2F0KAog ICJkZWViZjc5ZWNhZTEzMTgyYmQiLAogICJlZmYzZmZiZGQ3ZTc2YmFlZDYyMTcxYjUiLAogICJl ZmYzZmZiZGQ3ZTc2YmFlZDYzMTgyYmQwODUxOWMiLAogICJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFl ZDYzMTgyYmQwODUxOWMiLAogICJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUw ODQ1OTQiLAogICJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1 OTQiLAogICJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODUxOWMw ODMwNmIiCikubWFwKGNvbG9ycyk7Cgp2YXIgQmx1ZXMgPSByYW1wKHNjaGVtZSRsKTsKCnZhciBz Y2hlbWUkbSA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgImU1ZjVlMGExZDk5YjMxYTM1NCIsCiAg ImVkZjhlOWJhZTRiMzc0YzQ3NjIzOGI0NSIsCiAgImVkZjhlOWJhZTRiMzc0YzQ3NjMxYTM1NDAw NmQyYyIsCiAgImVkZjhlOWM3ZTljMGExZDk5Yjc0YzQ3NjMxYTM1NDAwNmQyYyIsCiAgImVkZjhl OWM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNWEzMiIsCiAgImY3ZmNmNWU1ZjVlMGM3 ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNWEzMiIsCiAgImY3ZmNmNWU1ZjVlMGM3ZTlj MGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNmQyYzAwNDQxYiIKKS5tYXAoY29sb3JzKTsKCnZh ciBHcmVlbnMgPSByYW1wKHNjaGVtZSRtKTsKCnZhciBzY2hlbWUkbiA9IG5ldyBBcnJheSgzKS5j b25jYXQoCiAgImYwZjBmMGJkYmRiZDYzNjM2MyIsCiAgImY3ZjdmN2NjY2NjYzk2OTY5NjUyNTI1 MiIsCiAgImY3ZjdmN2NjY2NjYzk2OTY5NjYzNjM2MzI1MjUyNSIsCiAgImY3ZjdmN2Q5ZDlkOWJk YmRiZDk2OTY5NjYzNjM2MzI1MjUyNSIsCiAgImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjczNzM3 MzUyNTI1MjI1MjUyNSIsCiAgImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUy NTI1MjI1MjUyNSIsCiAgImZmZmZmZmYwZjBmMGQ5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1 MjI1MjUyNTAwMDAwMCIKKS5tYXAoY29sb3JzKTsKCnZhciBHcmV5cyA9IHJhbXAoc2NoZW1lJG4p OwoKdmFyIHNjaGVtZSRvID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAiZWZlZGY1YmNiZGRjNzU2 YmIxIiwKICAiZjJmMGY3Y2JjOWUyOWU5YWM4NmE1MWEzIiwKICAiZjJmMGY3Y2JjOWUyOWU5YWM4 NzU2YmIxNTQyNzhmIiwKICAiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4NzU2YmIxNTQyNzhmIiwK ICAiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNGExNDg2IiwKICAiZmNmYmZk ZWZlZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNGExNDg2IiwKICAiZmNmYmZkZWZl ZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNTQyNzhmM2YwMDdkIgopLm1hcChjb2xv cnMpOwoKdmFyIFB1cnBsZXMgPSByYW1wKHNjaGVtZSRvKTsKCnZhciBzY2hlbWUkcCA9IG5ldyBB cnJheSgzKS5jb25jYXQoCiAgImZlZTBkMmZjOTI3MmRlMmQyNiIsCiAgImZlZTVkOWZjYWU5MWZi NmE0YWNiMTgxZCIsCiAgImZlZTVkOWZjYWU5MWZiNmE0YWRlMmQyNmE1MGYxNSIsCiAgImZlZTVk OWZjYmJhMWZjOTI3MmZiNmE0YWRlMmQyNmE1MGYxNSIsCiAgImZlZTVkOWZjYmJhMWZjOTI3MmZi NmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsCiAgImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0 YWVmM2IyY2NiMTgxZDk5MDAwZCIsCiAgImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVm M2IyY2NiMTgxZGE1MGYxNTY3MDAwZCIKKS5tYXAoY29sb3JzKTsKCnZhciBSZWRzID0gcmFtcChz Y2hlbWUkcCk7Cgp2YXIgc2NoZW1lJHEgPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICJmZWU2Y2Vm ZGFlNmJlNjU1MGQiLAogICJmZWVkZGVmZGJlODVmZDhkM2NkOTQ3MDEiLAogICJmZWVkZGVmZGJl ODVmZDhkM2NlNjU1MGRhNjM2MDMiLAogICJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NlNjU1MGRh NjM2MDMiLAogICJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLAog ICJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLAogICJm ZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDFhNjM2MDM3ZjI3MDQiCiku bWFwKGNvbG9ycyk7Cgp2YXIgT3JhbmdlcyA9IHJhbXAoc2NoZW1lJHEpOwoKZnVuY3Rpb24gY2l2 aWRpcyh0KSB7CiAgdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHQpKTsKICByZXR1cm4gInJn YigiCiAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKC00LjU0IC0g dCAqICgzNS4zNCAtIHQgKiAoMjM4MS43MyAtIHQgKiAoNjQwMi43IC0gdCAqICg3MDI0LjcyIC0g dCAqIDI3MTAuNTcpKSkpKSkpICsgIiwgIgogICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1 NSwgTWF0aC5yb3VuZCgzMi40OSArIHQgKiAoMTcwLjczICsgdCAqICg1Mi44MiAtIHQgKiAoMTMx LjQ2IC0gdCAqICgxNzYuNTggLSB0ICogNjcuMzcpKSkpKSkpICsgIiwgIgogICAgICArIE1hdGgu bWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCg4MS4yNCArIHQgKiAoNDQyLjM2IC0gdCAq ICgyNDgyLjQzIC0gdCAqICg2MTY3LjI0IC0gdCAqICg2NjE0Ljk0IC0gdCAqIDI0NzUuNjcpKSkp KSkpCiAgICAgICsgIikiOwp9Cgp2YXIgY3ViZWhlbGl4JDMgPSBjdWJlaGVsaXhMb25nKGN1YmVo ZWxpeCgzMDAsIDAuNSwgMC4wKSwgY3ViZWhlbGl4KC0yNDAsIDAuNSwgMS4wKSk7Cgp2YXIgd2Fy bSA9IGN1YmVoZWxpeExvbmcoY3ViZWhlbGl4KC0xMDAsIDAuNzUsIDAuMzUpLCBjdWJlaGVsaXgo ODAsIDEuNTAsIDAuOCkpOwoKdmFyIGNvb2wgPSBjdWJlaGVsaXhMb25nKGN1YmVoZWxpeCgyNjAs IDAuNzUsIDAuMzUpLCBjdWJlaGVsaXgoODAsIDEuNTAsIDAuOCkpOwoKdmFyIGMgPSBjdWJlaGVs aXgoKTsKCmZ1bmN0aW9uIHJhaW5ib3codCkgewogIGlmICh0IDwgMCB8fCB0ID4gMSkgdCAtPSBN YXRoLmZsb29yKHQpOwogIHZhciB0cyA9IE1hdGguYWJzKHQgLSAwLjUpOwogIGMuaCA9IDM2MCAq IHQgLSAxMDA7CiAgYy5zID0gMS41IC0gMS41ICogdHM7CiAgYy5sID0gMC44IC0gMC45ICogdHM7 CiAgcmV0dXJuIGMgKyAiIjsKfQoKdmFyIGMkMSA9IHJnYigpLAogICAgcGlfMV8zID0gTWF0aC5Q SSAvIDMsCiAgICBwaV8yXzMgPSBNYXRoLlBJICogMiAvIDM7CgpmdW5jdGlvbiBzaW5lYm93KHQp IHsKICB2YXIgeDsKICB0ID0gKDAuNSAtIHQpICogTWF0aC5QSTsKICBjJDEuciA9IDI1NSAqICh4 ID0gTWF0aC5zaW4odCkpICogeDsKICBjJDEuZyA9IDI1NSAqICh4ID0gTWF0aC5zaW4odCArIHBp XzFfMykpICogeDsKICBjJDEuYiA9IDI1NSAqICh4ID0gTWF0aC5zaW4odCArIHBpXzJfMykpICog eDsKICByZXR1cm4gYyQxICsgIiI7Cn0KCmZ1bmN0aW9uIHR1cmJvKHQpIHsKICB0ID0gTWF0aC5t YXgoMCwgTWF0aC5taW4oMSwgdCkpOwogIHJldHVybiAicmdiKCIKICAgICAgKyBNYXRoLm1heCgw LCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoMzQuNjEgKyB0ICogKDExNzIuMzMgLSB0ICogKDEw NzkzLjU2IC0gdCAqICgzMzMwMC4xMiAtIHQgKiAoMzgzOTQuNDkgLSB0ICogMTQ4MjUuMDUpKSkp KSkpICsgIiwgIgogICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCgy My4zMSArIHQgKiAoNTU3LjMzICsgdCAqICgxMjI1LjMzIC0gdCAqICgzNTc0Ljk2IC0gdCAqICgx MDczLjc3ICsgdCAqIDcwNy41NikpKSkpKSkgKyAiLCAiCiAgICAgICsgTWF0aC5tYXgoMCwgTWF0 aC5taW4oMjU1LCBNYXRoLnJvdW5kKDI3LjIgKyB0ICogKDMyMTEuMSAtIHQgKiAoMTUzMjcuOTcg LSB0ICogKDI3ODE0IC0gdCAqICgyMjU2OS4xOCAtIHQgKiA2ODM4LjY2KSkpKSkpKQogICAgICAr ICIpIjsKfQoKZnVuY3Rpb24gcmFtcCQxKHJhbmdlKSB7CiAgdmFyIG4gPSByYW5nZS5sZW5ndGg7 CiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgIHJldHVybiByYW5nZVtNYXRoLm1heCgwLCBNYXRo Lm1pbihuIC0gMSwgTWF0aC5mbG9vcih0ICogbikpKV07CiAgfTsKfQoKdmFyIHZpcmlkaXMgPSBy YW1wJDEoY29sb3JzKCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0 NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4 NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0 ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMw N2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0 MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3 ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIz YjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVj OGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUz MTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZm OGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUy YTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgx OGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUy MzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDky OGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGEx ZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0 ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEy N2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2 N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0 MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1 Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2 OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQz NGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5 OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRk MmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBj YWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0 MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFm YmU3MjNmZGU3MjUiKSk7Cgp2YXIgbWFnbWEgPSByYW1wJDEoY29sb3JzKCIwMDAwMDQwMTAwMDUw MTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1 MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIx MDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEw NDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgy OTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEw NmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0 OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1 N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2 NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIx ODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4 NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJi ODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2Vh MzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1 N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZj MjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQx NmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5Njhk ZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2 NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNm MzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2 NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFm Yzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlh NmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRm ZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJk ODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBm ZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUw YTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJm Y2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmYiKSk7Cgp2YXIgaW5mZXJu byA9IHJhbXAkMShjb2xvcnMoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwYTAyMDIwYzAy MDIwZTAzMDIxMDA0MDMxMjA0MDMxNDA1MDQxNzA2MDQxOTA3MDUxYjA4MDUxZDA5MDYxZjBhMDcy MjBiMDcyNDBjMDgyNjBkMDgyOTBlMDkyYjEwMDkyZDExMGEzMDEyMGEzMjE0MGIzNDE1MGIzNzE2 MGIzOTE4MGMzYzE5MGMzZTFiMGM0MTFjMGM0MzFlMGM0NTFmMGM0ODIxMGM0YTIzMGM0YzI0MGM0 ZjI2MGM1MTI4MGI1MzI5MGI1NTJiMGI1NzJkMGI1OTJmMGE1YjMxMGE1YzMyMGE1ZTM0MGE1ZjM2 MDk2MTM4MDk2MjM5MDk2MzNiMDk2NDNkMDk2NTNlMDk2NjQwMGE2NzQyMGE2ODQ0MGE2ODQ1MGE2 OTQ3MGI2YTQ5MGI2YTRhMGM2YjRjMGM2YjRkMGQ2YzRmMGQ2YzUxMGU2YzUyMGU2ZDU0MGY2ZDU1 MGY2ZDU3MTA2ZTU5MTA2ZTVhMTE2ZTVjMTI2ZTVkMTI2ZTVmMTM2ZTYxMTM2ZTYyMTQ2ZTY0MTU2 ZTY1MTU2ZTY3MTY2ZTY5MTY2ZTZhMTc2ZTZjMTg2ZTZkMTg2ZTZmMTk2ZTcxMTk2ZTcyMWE2ZTc0 MWE2ZTc1MWI2ZTc3MWM2ZDc4MWM2ZDdhMWQ2ZDdjMWQ2ZDdkMWU2ZDdmMWU2YzgwMWY2YzgyMjA2 Yzg0MjA2Yjg1MjE2Yjg3MjE2Yjg4MjI2YThhMjI2YThjMjM2OThkMjM2OThmMjQ2OTkwMjU2ODky MjU2ODkzMjY2Nzk1MjY2Nzk3Mjc2Njk4Mjc2NjlhMjg2NTliMjk2NDlkMjk2NDlmMmE2M2EwMmE2 M2EyMmI2MmEzMmM2MWE1MmM2MGE2MmQ2MGE4MmU1ZmE5MmU1ZWFiMmY1ZWFkMzA1ZGFlMzA1Y2Iw MzE1YmIxMzI1YWIzMzI1YWI0MzM1OWI2MzQ1OGI3MzU1N2I5MzU1NmJhMzY1NWJjMzc1NGJkMzg1 M2JmMzk1MmMwM2E1MWMxM2E1MGMzM2I0ZmM0M2M0ZWM2M2Q0ZGM3M2U0Y2M4M2Y0YmNhNDA0YWNi NDE0OWNjNDI0OGNlNDM0N2NmNDQ0NmQwNDU0NWQyNDY0NGQzNDc0M2Q0NDg0MmQ1NGE0MWQ3NGIz ZmQ4NGMzZWQ5NGQzZGRhNGUzY2RiNTAzYmRkNTEzYWRlNTIzOGRmNTMzN2UwNTUzNmUxNTYzNWUy NTczNGUzNTkzM2U0NWEzMWU1NWMzMGU2NWQyZmU3NWUyZWU4NjAyZGU5NjEyYmVhNjMyYWViNjQy OWViNjYyOGVjNjcyNmVkNjkyNWVlNmEyNGVmNmMyM2VmNmUyMWYwNmYyMGYxNzExZmYxNzMxZGYy NzQxY2YzNzYxYmYzNzgxOWY0NzkxOGY1N2IxN2Y1N2QxNWY2N2UxNGY2ODAxM2Y3ODIxMmY3ODQx MGY4ODUwZmY4ODcwZWY4ODkwY2Y5OGIwYmY5OGMwYWY5OGUwOWZhOTAwOGZhOTIwN2ZhOTQwN2Zi OTYwNmZiOTcwNmZiOTkwNmZiOWIwNmZiOWQwN2ZjOWYwN2ZjYTEwOGZjYTMwOWZjYTUwYWZjYTYw Y2ZjYTgwZGZjYWEwZmZjYWMxMWZjYWUxMmZjYjAxNGZjYjIxNmZjYjQxOGZiYjYxYWZiYjgxZGZi YmExZmZiYmMyMWZiYmUyM2ZhYzAyNmZhYzIyOGZhYzQyYWZhYzYyZGY5YzcyZmY5YzkzMmY5Y2Iz NWY4Y2QzN2Y4Y2YzYWY3ZDEzZGY3ZDM0MGY2ZDU0M2Y2ZDc0NmY1ZDk0OWY1ZGI0Y2Y0ZGQ0ZmY0 ZGY1M2Y0ZTE1NmYzZTM1YWYzZTU1ZGYyZTY2MWYyZTg2NWYyZWE2OWYxZWM2ZGYxZWQ3MWYxZWY3 NWYxZjE3OWYyZjI3ZGYyZjQ4MmYzZjU4NmYzZjY4YWY0Zjg4ZWY1Zjk5MmY2ZmE5NmY4ZmI5YWY5 ZmM5ZGZhZmRhMWZjZmZhNCIpKTsKCnZhciBwbGFzbWEgPSByYW1wJDEoY29sb3JzKCIwZDA4ODcx MDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1 OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkz ODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAz OWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1 ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAw YTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3 NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1 YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5 MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4 OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZh YTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJl OGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODVi ZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQz N2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNk MTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4 NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNl MTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZm NWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJl ZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3 NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJm ODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmEx MzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJm ZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJk MmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZm Y2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRj MjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdm NGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7CgpmdW5j dGlvbiBjb25zdGFudCRiKHgpIHsKICByZXR1cm4gZnVuY3Rpb24gY29uc3RhbnQoKSB7CiAgICBy ZXR1cm4geDsKICB9Owp9Cgp2YXIgYWJzJDEgPSBNYXRoLmFiczsKdmFyIGF0YW4yJDEgPSBNYXRo LmF0YW4yOwp2YXIgY29zJDIgPSBNYXRoLmNvczsKdmFyIG1heCQyID0gTWF0aC5tYXg7CnZhciBt aW4kMSA9IE1hdGgubWluOwp2YXIgc2luJDIgPSBNYXRoLnNpbjsKdmFyIHNxcnQkMiA9IE1hdGgu c3FydDsKCnZhciBlcHNpbG9uJDMgPSAxZS0xMjsKdmFyIHBpJDQgPSBNYXRoLlBJOwp2YXIgaGFs ZlBpJDMgPSBwaSQ0IC8gMjsKdmFyIHRhdSQ0ID0gMiAqIHBpJDQ7CgpmdW5jdGlvbiBhY29zJDEo eCkgewogIHJldHVybiB4ID4gMSA/IDAgOiB4IDwgLTEgPyBwaSQ0IDogTWF0aC5hY29zKHgpOwp9 CgpmdW5jdGlvbiBhc2luJDEoeCkgewogIHJldHVybiB4ID49IDEgPyBoYWxmUGkkMyA6IHggPD0g LTEgPyAtaGFsZlBpJDMgOiBNYXRoLmFzaW4oeCk7Cn0KCmZ1bmN0aW9uIGFyY0lubmVyUmFkaXVz KGQpIHsKICByZXR1cm4gZC5pbm5lclJhZGl1czsKfQoKZnVuY3Rpb24gYXJjT3V0ZXJSYWRpdXMo ZCkgewogIHJldHVybiBkLm91dGVyUmFkaXVzOwp9CgpmdW5jdGlvbiBhcmNTdGFydEFuZ2xlKGQp IHsKICByZXR1cm4gZC5zdGFydEFuZ2xlOwp9CgpmdW5jdGlvbiBhcmNFbmRBbmdsZShkKSB7CiAg cmV0dXJuIGQuZW5kQW5nbGU7Cn0KCmZ1bmN0aW9uIGFyY1BhZEFuZ2xlKGQpIHsKICByZXR1cm4g ZCAmJiBkLnBhZEFuZ2xlOyAvLyBOb3RlOiBvcHRpb25hbCEKfQoKZnVuY3Rpb24gaW50ZXJzZWN0 KHgwLCB5MCwgeDEsIHkxLCB4MiwgeTIsIHgzLCB5MykgewogIHZhciB4MTAgPSB4MSAtIHgwLCB5 MTAgPSB5MSAtIHkwLAogICAgICB4MzIgPSB4MyAtIHgyLCB5MzIgPSB5MyAtIHkyLAogICAgICB0 ID0geTMyICogeDEwIC0geDMyICogeTEwOwogIGlmICh0ICogdCA8IGVwc2lsb24kMykgcmV0dXJu OwogIHQgPSAoeDMyICogKHkwIC0geTIpIC0geTMyICogKHgwIC0geDIpKSAvIHQ7CiAgcmV0dXJu IFt4MCArIHQgKiB4MTAsIHkwICsgdCAqIHkxMF07Cn0KCi8vIENvbXB1dGUgcGVycGVuZGljdWxh ciBvZmZzZXQgbGluZSBvZiBsZW5ndGggcmMuCi8vIGh0dHA6Ly9tYXRod29ybGQud29sZnJhbS5j b20vQ2lyY2xlLUxpbmVJbnRlcnNlY3Rpb24uaHRtbApmdW5jdGlvbiBjb3JuZXJUYW5nZW50cyh4 MCwgeTAsIHgxLCB5MSwgcjEsIHJjLCBjdykgewogIHZhciB4MDEgPSB4MCAtIHgxLAogICAgICB5 MDEgPSB5MCAtIHkxLAogICAgICBsbyA9IChjdyA/IHJjIDogLXJjKSAvIHNxcnQkMih4MDEgKiB4 MDEgKyB5MDEgKiB5MDEpLAogICAgICBveCA9IGxvICogeTAxLAogICAgICBveSA9IC1sbyAqIHgw MSwKICAgICAgeDExID0geDAgKyBveCwKICAgICAgeTExID0geTAgKyBveSwKICAgICAgeDEwID0g eDEgKyBveCwKICAgICAgeTEwID0geTEgKyBveSwKICAgICAgeDAwID0gKHgxMSArIHgxMCkgLyAy LAogICAgICB5MDAgPSAoeTExICsgeTEwKSAvIDIsCiAgICAgIGR4ID0geDEwIC0geDExLAogICAg ICBkeSA9IHkxMCAtIHkxMSwKICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSwKICAgICAgciA9 IHIxIC0gcmMsCiAgICAgIEQgPSB4MTEgKiB5MTAgLSB4MTAgKiB5MTEsCiAgICAgIGQgPSAoZHkg PCAwID8gLTEgOiAxKSAqIHNxcnQkMihtYXgkMigwLCByICogciAqIGQyIC0gRCAqIEQpKSwKICAg ICAgY3gwID0gKEQgKiBkeSAtIGR4ICogZCkgLyBkMiwKICAgICAgY3kwID0gKC1EICogZHggLSBk eSAqIGQpIC8gZDIsCiAgICAgIGN4MSA9IChEICogZHkgKyBkeCAqIGQpIC8gZDIsCiAgICAgIGN5 MSA9ICgtRCAqIGR4ICsgZHkgKiBkKSAvIGQyLAogICAgICBkeDAgPSBjeDAgLSB4MDAsCiAgICAg IGR5MCA9IGN5MCAtIHkwMCwKICAgICAgZHgxID0gY3gxIC0geDAwLAogICAgICBkeTEgPSBjeTEg LSB5MDA7CgogIC8vIFBpY2sgdGhlIGNsb3NlciBvZiB0aGUgdHdvIGludGVyc2VjdGlvbiBwb2lu dHMuCiAgLy8gVE9ETyBJcyB0aGVyZSBhIGZhc3RlciB3YXkgdG8gZGV0ZXJtaW5lIHdoaWNoIGlu dGVyc2VjdGlvbiB0byB1c2U/CiAgaWYgKGR4MCAqIGR4MCArIGR5MCAqIGR5MCA+IGR4MSAqIGR4 MSArIGR5MSAqIGR5MSkgY3gwID0gY3gxLCBjeTAgPSBjeTE7CgogIHJldHVybiB7CiAgICBjeDog Y3gwLAogICAgY3k6IGN5MCwKICAgIHgwMTogLW94LAogICAgeTAxOiAtb3ksCiAgICB4MTE6IGN4 MCAqIChyMSAvIHIgLSAxKSwKICAgIHkxMTogY3kwICogKHIxIC8gciAtIDEpCiAgfTsKfQoKZnVu Y3Rpb24gYXJjKCkgewogIHZhciBpbm5lclJhZGl1cyA9IGFyY0lubmVyUmFkaXVzLAogICAgICBv dXRlclJhZGl1cyA9IGFyY091dGVyUmFkaXVzLAogICAgICBjb3JuZXJSYWRpdXMgPSBjb25zdGFu dCRiKDApLAogICAgICBwYWRSYWRpdXMgPSBudWxsLAogICAgICBzdGFydEFuZ2xlID0gYXJjU3Rh cnRBbmdsZSwKICAgICAgZW5kQW5nbGUgPSBhcmNFbmRBbmdsZSwKICAgICAgcGFkQW5nbGUgPSBh cmNQYWRBbmdsZSwKICAgICAgY29udGV4dCA9IG51bGw7CgogIGZ1bmN0aW9uIGFyYygpIHsKICAg IHZhciBidWZmZXIsCiAgICAgICAgciwKICAgICAgICByMCA9ICtpbm5lclJhZGl1cy5hcHBseSh0 aGlzLCBhcmd1bWVudHMpLAogICAgICAgIHIxID0gK291dGVyUmFkaXVzLmFwcGx5KHRoaXMsIGFy Z3VtZW50cyksCiAgICAgICAgYTAgPSBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykg LSBoYWxmUGkkMywKICAgICAgICBhMSA9IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykg LSBoYWxmUGkkMywKICAgICAgICBkYSA9IGFicyQxKGExIC0gYTApLAogICAgICAgIGN3ID0gYTEg PiBhMDsKCiAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBwYXRoKCk7CgogICAg Ly8gRW5zdXJlIHRoYXQgdGhlIG91dGVyIHJhZGl1cyBpcyBhbHdheXMgbGFyZ2VyIHRoYW4gdGhl IGlubmVyIHJhZGl1cy4KICAgIGlmIChyMSA8IHIwKSByID0gcjEsIHIxID0gcjAsIHIwID0gcjsK CiAgICAvLyBJcyBpdCBhIHBvaW50PwogICAgaWYgKCEocjEgPiBlcHNpbG9uJDMpKSBjb250ZXh0 Lm1vdmVUbygwLCAwKTsKCiAgICAvLyBPciBpcyBpdCBhIGNpcmNsZSBvciBhbm51bHVzPwogICAg ZWxzZSBpZiAoZGEgPiB0YXUkNCAtIGVwc2lsb24kMykgewogICAgICBjb250ZXh0Lm1vdmVUbyhy MSAqIGNvcyQyKGEwKSwgcjEgKiBzaW4kMihhMCkpOwogICAgICBjb250ZXh0LmFyYygwLCAwLCBy MSwgYTAsIGExLCAhY3cpOwogICAgICBpZiAocjAgPiBlcHNpbG9uJDMpIHsKICAgICAgICBjb250 ZXh0Lm1vdmVUbyhyMCAqIGNvcyQyKGExKSwgcjAgKiBzaW4kMihhMSkpOwogICAgICAgIGNvbnRl eHQuYXJjKDAsIDAsIHIwLCBhMSwgYTAsIGN3KTsKICAgICAgfQogICAgfQoKICAgIC8vIE9yIGlz IGl0IGEgY2lyY3VsYXIgb3IgYW5udWxhciBzZWN0b3I/CiAgICBlbHNlIHsKICAgICAgdmFyIGEw MSA9IGEwLAogICAgICAgICAgYTExID0gYTEsCiAgICAgICAgICBhMDAgPSBhMCwKICAgICAgICAg IGExMCA9IGExLAogICAgICAgICAgZGEwID0gZGEsCiAgICAgICAgICBkYTEgPSBkYSwKICAgICAg ICAgIGFwID0gcGFkQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAvIDIsCiAgICAgICAgICBy cCA9IChhcCA+IGVwc2lsb24kMykgJiYgKHBhZFJhZGl1cyA/ICtwYWRSYWRpdXMuYXBwbHkodGhp cywgYXJndW1lbnRzKSA6IHNxcnQkMihyMCAqIHIwICsgcjEgKiByMSkpLAogICAgICAgICAgcmMg PSBtaW4kMShhYnMkMShyMSAtIHIwKSAvIDIsICtjb3JuZXJSYWRpdXMuYXBwbHkodGhpcywgYXJn dW1lbnRzKSksCiAgICAgICAgICByYzAgPSByYywKICAgICAgICAgIHJjMSA9IHJjLAogICAgICAg ICAgdDAsCiAgICAgICAgICB0MTsKCiAgICAgIC8vIEFwcGx5IHBhZGRpbmc/IE5vdGUgdGhhdCBz aW5jZSByMSDiiaUgcjAsIGRhMSDiiaUgZGEwLgogICAgICBpZiAocnAgPiBlcHNpbG9uJDMpIHsK ICAgICAgICB2YXIgcDAgPSBhc2luJDEocnAgLyByMCAqIHNpbiQyKGFwKSksCiAgICAgICAgICAg IHAxID0gYXNpbiQxKHJwIC8gcjEgKiBzaW4kMihhcCkpOwogICAgICAgIGlmICgoZGEwIC09IHAw ICogMikgPiBlcHNpbG9uJDMpIHAwICo9IChjdyA/IDEgOiAtMSksIGEwMCArPSBwMCwgYTEwIC09 IHAwOwogICAgICAgIGVsc2UgZGEwID0gMCwgYTAwID0gYTEwID0gKGEwICsgYTEpIC8gMjsKICAg ICAgICBpZiAoKGRhMSAtPSBwMSAqIDIpID4gZXBzaWxvbiQzKSBwMSAqPSAoY3cgPyAxIDogLTEp LCBhMDEgKz0gcDEsIGExMSAtPSBwMTsKICAgICAgICBlbHNlIGRhMSA9IDAsIGEwMSA9IGExMSA9 IChhMCArIGExKSAvIDI7CiAgICAgIH0KCiAgICAgIHZhciB4MDEgPSByMSAqIGNvcyQyKGEwMSks CiAgICAgICAgICB5MDEgPSByMSAqIHNpbiQyKGEwMSksCiAgICAgICAgICB4MTAgPSByMCAqIGNv cyQyKGExMCksCiAgICAgICAgICB5MTAgPSByMCAqIHNpbiQyKGExMCk7CgogICAgICAvLyBBcHBs eSByb3VuZGVkIGNvcm5lcnM/CiAgICAgIGlmIChyYyA+IGVwc2lsb24kMykgewogICAgICAgIHZh ciB4MTEgPSByMSAqIGNvcyQyKGExMSksCiAgICAgICAgICAgIHkxMSA9IHIxICogc2luJDIoYTEx KSwKICAgICAgICAgICAgeDAwID0gcjAgKiBjb3MkMihhMDApLAogICAgICAgICAgICB5MDAgPSBy MCAqIHNpbiQyKGEwMCksCiAgICAgICAgICAgIG9jOwoKICAgICAgICAvLyBSZXN0cmljdCB0aGUg Y29ybmVyIHJhZGl1cyBhY2NvcmRpbmcgdG8gdGhlIHNlY3RvciBhbmdsZS4KICAgICAgICBpZiAo ZGEgPCBwaSQ0ICYmIChvYyA9IGludGVyc2VjdCh4MDEsIHkwMSwgeDAwLCB5MDAsIHgxMSwgeTEx LCB4MTAsIHkxMCkpKSB7CiAgICAgICAgICB2YXIgYXggPSB4MDEgLSBvY1swXSwKICAgICAgICAg ICAgICBheSA9IHkwMSAtIG9jWzFdLAogICAgICAgICAgICAgIGJ4ID0geDExIC0gb2NbMF0sCiAg ICAgICAgICAgICAgYnkgPSB5MTEgLSBvY1sxXSwKICAgICAgICAgICAgICBrYyA9IDEgLyBzaW4k MihhY29zJDEoKGF4ICogYnggKyBheSAqIGJ5KSAvIChzcXJ0JDIoYXggKiBheCArIGF5ICogYXkp ICogc3FydCQyKGJ4ICogYnggKyBieSAqIGJ5KSkpIC8gMiksCiAgICAgICAgICAgICAgbGMgPSBz cXJ0JDIob2NbMF0gKiBvY1swXSArIG9jWzFdICogb2NbMV0pOwogICAgICAgICAgcmMwID0gbWlu JDEocmMsIChyMCAtIGxjKSAvIChrYyAtIDEpKTsKICAgICAgICAgIHJjMSA9IG1pbiQxKHJjLCAo cjEgLSBsYykgLyAoa2MgKyAxKSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBJcyB0aGUg c2VjdG9yIGNvbGxhcHNlZCB0byBhIGxpbmU/CiAgICAgIGlmICghKGRhMSA+IGVwc2lsb24kMykp IGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKTsKCiAgICAgIC8vIERvZXMgdGhlIHNlY3RvcuKAmXMg b3V0ZXIgcmluZyBoYXZlIHJvdW5kZWQgY29ybmVycz8KICAgICAgZWxzZSBpZiAocmMxID4gZXBz aWxvbiQzKSB7CiAgICAgICAgdDAgPSBjb3JuZXJUYW5nZW50cyh4MDAsIHkwMCwgeDAxLCB5MDEs IHIxLCByYzEsIGN3KTsKICAgICAgICB0MSA9IGNvcm5lclRhbmdlbnRzKHgxMSwgeTExLCB4MTAs IHkxMCwgcjEsIHJjMSwgY3cpOwoKICAgICAgICBjb250ZXh0Lm1vdmVUbyh0MC5jeCArIHQwLngw MSwgdDAuY3kgKyB0MC55MDEpOwoKICAgICAgICAvLyBIYXZlIHRoZSBjb3JuZXJzIG1lcmdlZD8K ICAgICAgICBpZiAocmMxIDwgcmMpIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMxLCBhdGFu MiQxKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIkMSh0MS55MDEsIHQxLngwMSksICFjdyk7CgogICAg ICAgIC8vIE90aGVyd2lzZSwgZHJhdyB0aGUgdHdvIGNvcm5lcnMgYW5kIHRoZSByaW5nLgogICAg ICAgIGVsc2UgewogICAgICAgICAgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzEsIGF0YW4y JDEodDAueTAxLCB0MC54MDEpLCBhdGFuMiQxKHQwLnkxMSwgdDAueDExKSwgIWN3KTsKICAgICAg ICAgIGNvbnRleHQuYXJjKDAsIDAsIHIxLCBhdGFuMiQxKHQwLmN5ICsgdDAueTExLCB0MC5jeCAr IHQwLngxMSksIGF0YW4yJDEodDEuY3kgKyB0MS55MTEsIHQxLmN4ICsgdDEueDExKSwgIWN3KTsK ICAgICAgICAgIGNvbnRleHQuYXJjKHQxLmN4LCB0MS5jeSwgcmMxLCBhdGFuMiQxKHQxLnkxMSwg dDEueDExKSwgYXRhbjIkMSh0MS55MDEsIHQxLngwMSksICFjdyk7CiAgICAgICAgfQogICAgICB9 CgogICAgICAvLyBPciBpcyB0aGUgb3V0ZXIgcmluZyBqdXN0IGEgY2lyY3VsYXIgYXJjPwogICAg ICBlbHNlIGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKSwgY29udGV4dC5hcmMoMCwgMCwgcjEsIGEw MSwgYTExLCAhY3cpOwoKICAgICAgLy8gSXMgdGhlcmUgbm8gaW5uZXIgcmluZywgYW5kIGl04oCZ cyBhIGNpcmN1bGFyIHNlY3Rvcj8KICAgICAgLy8gT3IgcGVyaGFwcyBpdOKAmXMgYW4gYW5udWxh ciBzZWN0b3IgY29sbGFwc2VkIGR1ZSB0byBwYWRkaW5nPwogICAgICBpZiAoIShyMCA+IGVwc2ls b24kMykgfHwgIShkYTAgPiBlcHNpbG9uJDMpKSBjb250ZXh0LmxpbmVUbyh4MTAsIHkxMCk7Cgog ICAgICAvLyBEb2VzIHRoZSBzZWN0b3LigJlzIGlubmVyIHJpbmcgKG9yIHBvaW50KSBoYXZlIHJv dW5kZWQgY29ybmVycz8KICAgICAgZWxzZSBpZiAocmMwID4gZXBzaWxvbiQzKSB7CiAgICAgICAg dDAgPSBjb3JuZXJUYW5nZW50cyh4MTAsIHkxMCwgeDExLCB5MTEsIHIwLCAtcmMwLCBjdyk7CiAg ICAgICAgdDEgPSBjb3JuZXJUYW5nZW50cyh4MDEsIHkwMSwgeDAwLCB5MDAsIHIwLCAtcmMwLCBj dyk7CgogICAgICAgIGNvbnRleHQubGluZVRvKHQwLmN4ICsgdDAueDAxLCB0MC5jeSArIHQwLnkw MSk7CgogICAgICAgIC8vIEhhdmUgdGhlIGNvcm5lcnMgbWVyZ2VkPwogICAgICAgIGlmIChyYzAg PCByYykgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzAsIGF0YW4yJDEodDAueTAxLCB0MC54 MDEpLCBhdGFuMiQxKHQxLnkwMSwgdDEueDAxKSwgIWN3KTsKCiAgICAgICAgLy8gT3RoZXJ3aXNl LCBkcmF3IHRoZSB0d28gY29ybmVycyBhbmQgdGhlIHJpbmcuCiAgICAgICAgZWxzZSB7CiAgICAg ICAgICBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMCwgYXRhbjIkMSh0MC55MDEsIHQwLngw MSksIGF0YW4yJDEodDAueTExLCB0MC54MTEpLCAhY3cpOwogICAgICAgICAgY29udGV4dC5hcmMo MCwgMCwgcjAsIGF0YW4yJDEodDAuY3kgKyB0MC55MTEsIHQwLmN4ICsgdDAueDExKSwgYXRhbjIk MSh0MS5jeSArIHQxLnkxMSwgdDEuY3ggKyB0MS54MTEpLCBjdyk7CiAgICAgICAgICBjb250ZXh0 LmFyYyh0MS5jeCwgdDEuY3ksIHJjMCwgYXRhbjIkMSh0MS55MTEsIHQxLngxMSksIGF0YW4yJDEo dDEueTAxLCB0MS54MDEpLCAhY3cpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gT3IgaXMg dGhlIGlubmVyIHJpbmcganVzdCBhIGNpcmN1bGFyIGFyYz8KICAgICAgZWxzZSBjb250ZXh0LmFy YygwLCAwLCByMCwgYTEwLCBhMDAsIGN3KTsKICAgIH0KCiAgICBjb250ZXh0LmNsb3NlUGF0aCgp OwoKICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwg bnVsbDsKICB9CgogIGFyYy5jZW50cm9pZCA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHIgPSAoK2lu bmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKyArb3V0ZXJSYWRpdXMuYXBwbHkodGhp cywgYXJndW1lbnRzKSkgLyAyLAogICAgICAgIGEgPSAoK3N0YXJ0QW5nbGUuYXBwbHkodGhpcywg YXJndW1lbnRzKSArICtlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIgLSBwaSQ0 IC8gMjsKICAgIHJldHVybiBbY29zJDIoYSkgKiByLCBzaW4kMihhKSAqIHJdOwogIH07CgogIGFy Yy5pbm5lclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3Ro ID8gKGlubmVyUmFkaXVzID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQk YigrXyksIGFyYykgOiBpbm5lclJhZGl1czsKICB9OwoKICBhcmMub3V0ZXJSYWRpdXMgPSBmdW5j dGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChvdXRlclJhZGl1cyA9IHR5 cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBhcmMpIDogb3V0ZXJS YWRpdXM7CiAgfTsKCiAgYXJjLmNvcm5lclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVy biBhcmd1bWVudHMubGVuZ3RoID8gKGNvcm5lclJhZGl1cyA9IHR5cGVvZiBfID09PSAiZnVuY3Rp b24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBhcmMpIDogY29ybmVyUmFkaXVzOwogIH07CgogIGFy Yy5wYWRSYWRpdXMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ IChwYWRSYWRpdXMgPSBfID09IG51bGwgPyBudWxsIDogdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIg PyBfIDogY29uc3RhbnQkYigrXyksIGFyYykgOiBwYWRSYWRpdXM7CiAgfTsKCiAgYXJjLnN0YXJ0 QW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdGFy dEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGFy YykgOiBzdGFydEFuZ2xlOwogIH07CgogIGFyYy5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5j dGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGFyYykgOiBlbmRBbmdsZTsKICB9OwoKICBhcmMu cGFkQW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChw YWRBbmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBh cmMpIDogcGFkQW5nbGU7CiAgfTsKCiAgYXJjLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICBy ZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBf KSwgYXJjKSA6IGNvbnRleHQ7CiAgfTsKCiAgcmV0dXJuIGFyYzsKfQoKZnVuY3Rpb24gTGluZWFy KGNvbnRleHQpIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKfQoKTGluZWFyLnByb3RvdHlw ZSA9IHsKICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IDA7CiAgfSwK ICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgfSwKICBsaW5l U3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fcG9pbnQgPSAwOwogIH0sCiAgbGluZUVuZDog ZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0 aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICB0aGlzLl9s aW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgfSwKICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAg eCA9ICt4LCB5ID0gK3k7CiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMDog dGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkg OiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7CiAgICAgIGNhc2UgMTogdGhpcy5f cG9pbnQgPSAyOyAvLyBwcm9jZWVkCiAgICAgIGRlZmF1bHQ6IHRoaXMuX2NvbnRleHQubGluZVRv KHgsIHkpOyBicmVhazsKICAgIH0KICB9Cn07CgpmdW5jdGlvbiBjdXJ2ZUxpbmVhcihjb250ZXh0 KSB7CiAgcmV0dXJuIG5ldyBMaW5lYXIoY29udGV4dCk7Cn0KCmZ1bmN0aW9uIHgkMyhwKSB7CiAg cmV0dXJuIHBbMF07Cn0KCmZ1bmN0aW9uIHkkMyhwKSB7CiAgcmV0dXJuIHBbMV07Cn0KCmZ1bmN0 aW9uIGxpbmUoKSB7CiAgdmFyIHggPSB4JDMsCiAgICAgIHkgPSB5JDMsCiAgICAgIGRlZmluZWQg PSBjb25zdGFudCRiKHRydWUpLAogICAgICBjb250ZXh0ID0gbnVsbCwKICAgICAgY3VydmUgPSBj dXJ2ZUxpbmVhciwKICAgICAgb3V0cHV0ID0gbnVsbDsKCiAgZnVuY3Rpb24gbGluZShkYXRhKSB7 CiAgICB2YXIgaSwKICAgICAgICBuID0gZGF0YS5sZW5ndGgsCiAgICAgICAgZCwKICAgICAgICBk ZWZpbmVkMCA9IGZhbHNlLAogICAgICAgIGJ1ZmZlcjsKCiAgICBpZiAoY29udGV4dCA9PSBudWxs KSBvdXRwdXQgPSBjdXJ2ZShidWZmZXIgPSBwYXRoKCkpOwoKICAgIGZvciAoaSA9IDA7IGkgPD0g bjsgKytpKSB7CiAgICAgIGlmICghKGkgPCBuICYmIGRlZmluZWQoZCA9IGRhdGFbaV0sIGksIGRh dGEpKSA9PT0gZGVmaW5lZDApIHsKICAgICAgICBpZiAoZGVmaW5lZDAgPSAhZGVmaW5lZDApIG91 dHB1dC5saW5lU3RhcnQoKTsKICAgICAgICBlbHNlIG91dHB1dC5saW5lRW5kKCk7CiAgICAgIH0K ICAgICAgaWYgKGRlZmluZWQwKSBvdXRwdXQucG9pbnQoK3goZCwgaSwgZGF0YSksICt5KGQsIGks IGRhdGEpKTsKICAgIH0KCiAgICBpZiAoYnVmZmVyKSByZXR1cm4gb3V0cHV0ID0gbnVsbCwgYnVm ZmVyICsgIiIgfHwgbnVsbDsKICB9CgogIGxpbmUueCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVy biBhcmd1bWVudHMubGVuZ3RoID8gKHggPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBj b25zdGFudCRiKCtfKSwgbGluZSkgOiB4OwogIH07CgogIGxpbmUueSA9IGZ1bmN0aW9uKF8pIHsK ICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9u IiA/IF8gOiBjb25zdGFudCRiKCtfKSwgbGluZSkgOiB5OwogIH07CgogIGxpbmUuZGVmaW5lZCA9 IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRlZmluZWQgPSB0 eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCEhXyksIGxpbmUpIDogZGVm aW5lZDsKICB9OwoKICBsaW5lLmN1cnZlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3Vt ZW50cy5sZW5ndGggPyAoY3VydmUgPSBfLCBjb250ZXh0ICE9IG51bGwgJiYgKG91dHB1dCA9IGN1 cnZlKGNvbnRleHQpKSwgbGluZSkgOiBjdXJ2ZTsKICB9OwoKICBsaW5lLmNvbnRleHQgPSBmdW5j dGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChfID09IG51bGwgPyBjb250 ZXh0ID0gb3V0cHV0ID0gbnVsbCA6IG91dHB1dCA9IGN1cnZlKGNvbnRleHQgPSBfKSwgbGluZSkg OiBjb250ZXh0OwogIH07CgogIHJldHVybiBsaW5lOwp9CgpmdW5jdGlvbiBhcmVhJDMoKSB7CiAg dmFyIHgwID0geCQzLAogICAgICB4MSA9IG51bGwsCiAgICAgIHkwID0gY29uc3RhbnQkYigwKSwK ICAgICAgeTEgPSB5JDMsCiAgICAgIGRlZmluZWQgPSBjb25zdGFudCRiKHRydWUpLAogICAgICBj b250ZXh0ID0gbnVsbCwKICAgICAgY3VydmUgPSBjdXJ2ZUxpbmVhciwKICAgICAgb3V0cHV0ID0g bnVsbDsKCiAgZnVuY3Rpb24gYXJlYShkYXRhKSB7CiAgICB2YXIgaSwKICAgICAgICBqLAogICAg ICAgIGssCiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLAogICAgICAgIGQsCiAgICAgICAgZGVmaW5l ZDAgPSBmYWxzZSwKICAgICAgICBidWZmZXIsCiAgICAgICAgeDB6ID0gbmV3IEFycmF5KG4pLAog ICAgICAgIHkweiA9IG5ldyBBcnJheShuKTsKCiAgICBpZiAoY29udGV4dCA9PSBudWxsKSBvdXRw dXQgPSBjdXJ2ZShidWZmZXIgPSBwYXRoKCkpOwoKICAgIGZvciAoaSA9IDA7IGkgPD0gbjsgKytp KSB7CiAgICAgIGlmICghKGkgPCBuICYmIGRlZmluZWQoZCA9IGRhdGFbaV0sIGksIGRhdGEpKSA9 PT0gZGVmaW5lZDApIHsKICAgICAgICBpZiAoZGVmaW5lZDAgPSAhZGVmaW5lZDApIHsKICAgICAg ICAgIGogPSBpOwogICAgICAgICAgb3V0cHV0LmFyZWFTdGFydCgpOwogICAgICAgICAgb3V0cHV0 LmxpbmVTdGFydCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvdXRwdXQubGluZUVuZCgp OwogICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpOwogICAgICAgICAgZm9yIChrID0gaSAtIDE7 IGsgPj0gajsgLS1rKSB7CiAgICAgICAgICAgIG91dHB1dC5wb2ludCh4MHpba10sIHkweltrXSk7 CiAgICAgICAgICB9CiAgICAgICAgICBvdXRwdXQubGluZUVuZCgpOwogICAgICAgICAgb3V0cHV0 LmFyZWFFbmQoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGRlZmluZWQwKSB7CiAgICAg ICAgeDB6W2ldID0gK3gwKGQsIGksIGRhdGEpLCB5MHpbaV0gPSAreTAoZCwgaSwgZGF0YSk7CiAg ICAgICAgb3V0cHV0LnBvaW50KHgxID8gK3gxKGQsIGksIGRhdGEpIDogeDB6W2ldLCB5MSA/ICt5 MShkLCBpLCBkYXRhKSA6IHkweltpXSk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoYnVmZmVyKSBy ZXR1cm4gb3V0cHV0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwgbnVsbDsKICB9CgogIGZ1bmN0aW9u IGFyZWFsaW5lKCkgewogICAgcmV0dXJuIGxpbmUoKS5kZWZpbmVkKGRlZmluZWQpLmN1cnZlKGN1 cnZlKS5jb250ZXh0KGNvbnRleHQpOwogIH0KCiAgYXJlYS54ID0gZnVuY3Rpb24oXykgewogICAg cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/ IF8gOiBjb25zdGFudCRiKCtfKSwgeDEgPSBudWxsLCBhcmVhKSA6IHgwOwogIH07CgogIGFyZWEu eDAgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9IHR5 cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBhcmVhKSA6IHgwOwog IH07CgogIGFyZWEueDEgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/ICh4MSA9IF8gPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8g OiBjb25zdGFudCRiKCtfKSwgYXJlYSkgOiB4MTsKICB9OwoKICBhcmVhLnkgPSBmdW5jdGlvbihf KSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5MCA9IHR5cGVvZiBfID09PSAiZnVu Y3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCB5MSA9IG51bGwsIGFyZWEpIDogeTA7CiAgfTsK CiAgYXJlYS55MCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8g KHkwID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGFyZWEp IDogeTA7CiAgfTsKCiAgYXJlYS55MSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVu dHMubGVuZ3RoID8gKHkxID0gXyA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBfID09PSAiZnVuY3Rp b24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBhcmVhKSA6IHkxOwogIH07CgogIGFyZWEubGluZVgw ID0KICBhcmVhLmxpbmVZMCA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGFyZWFsaW5lKCkueCh4 MCkueSh5MCk7CiAgfTsKCiAgYXJlYS5saW5lWTEgPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBh cmVhbGluZSgpLngoeDApLnkoeTEpOwogIH07CgogIGFyZWEubGluZVgxID0gZnVuY3Rpb24oKSB7 CiAgICByZXR1cm4gYXJlYWxpbmUoKS54KHgxKS55KHkwKTsKICB9OwoKICBhcmVhLmRlZmluZWQg PSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWZpbmVkID0g dHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYighIV8pLCBhcmVhKSA6IGRl ZmluZWQ7CiAgfTsKCiAgYXJlYS5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1 bWVudHMubGVuZ3RoID8gKGN1cnZlID0gXywgY29udGV4dCAhPSBudWxsICYmIChvdXRwdXQgPSBj dXJ2ZShjb250ZXh0KSksIGFyZWEpIDogY3VydmU7CiAgfTsKCiAgYXJlYS5jb250ZXh0ID0gZnVu Y3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gY29u dGV4dCA9IG91dHB1dCA9IG51bGwgOiBvdXRwdXQgPSBjdXJ2ZShjb250ZXh0ID0gXyksIGFyZWEp IDogY29udGV4dDsKICB9OwoKICByZXR1cm4gYXJlYTsKfQoKZnVuY3Rpb24gZGVzY2VuZGluZyQx KGEsIGIpIHsKICByZXR1cm4gYiA8IGEgPyAtMSA6IGIgPiBhID8gMSA6IGIgPj0gYSA/IDAgOiBO YU47Cn0KCmZ1bmN0aW9uIGlkZW50aXR5JDgoZCkgewogIHJldHVybiBkOwp9CgpmdW5jdGlvbiBw aWUoKSB7CiAgdmFyIHZhbHVlID0gaWRlbnRpdHkkOCwKICAgICAgc29ydFZhbHVlcyA9IGRlc2Nl bmRpbmckMSwKICAgICAgc29ydCA9IG51bGwsCiAgICAgIHN0YXJ0QW5nbGUgPSBjb25zdGFudCRi KDApLAogICAgICBlbmRBbmdsZSA9IGNvbnN0YW50JGIodGF1JDQpLAogICAgICBwYWRBbmdsZSA9 IGNvbnN0YW50JGIoMCk7CgogIGZ1bmN0aW9uIHBpZShkYXRhKSB7CiAgICB2YXIgaSwKICAgICAg ICBuID0gZGF0YS5sZW5ndGgsCiAgICAgICAgaiwKICAgICAgICBrLAogICAgICAgIHN1bSA9IDAs CiAgICAgICAgaW5kZXggPSBuZXcgQXJyYXkobiksCiAgICAgICAgYXJjcyA9IG5ldyBBcnJheShu KSwKICAgICAgICBhMCA9ICtzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCiAgICAg ICAgZGEgPSBNYXRoLm1pbih0YXUkNCwgTWF0aC5tYXgoLXRhdSQ0LCBlbmRBbmdsZS5hcHBseSh0 aGlzLCBhcmd1bWVudHMpIC0gYTApKSwKICAgICAgICBhMSwKICAgICAgICBwID0gTWF0aC5taW4o TWF0aC5hYnMoZGEpIC8gbiwgcGFkQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSksCiAgICAg ICAgcGEgPSBwICogKGRhIDwgMCA/IC0xIDogMSksCiAgICAgICAgdjsKCiAgICBmb3IgKGkgPSAw OyBpIDwgbjsgKytpKSB7CiAgICAgIGlmICgodiA9IGFyY3NbaW5kZXhbaV0gPSBpXSA9ICt2YWx1 ZShkYXRhW2ldLCBpLCBkYXRhKSkgPiAwKSB7CiAgICAgICAgc3VtICs9IHY7CiAgICAgIH0KICAg IH0KCiAgICAvLyBPcHRpb25hbGx5IHNvcnQgdGhlIGFyY3MgYnkgcHJldmlvdXNseS1jb21wdXRl ZCB2YWx1ZXMgb3IgYnkgZGF0YS4KICAgIGlmIChzb3J0VmFsdWVzICE9IG51bGwpIGluZGV4LnNv cnQoZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gc29ydFZhbHVlcyhhcmNzW2ldLCBhcmNzW2pdKTsg fSk7CiAgICBlbHNlIGlmIChzb3J0ICE9IG51bGwpIGluZGV4LnNvcnQoZnVuY3Rpb24oaSwgaikg eyByZXR1cm4gc29ydChkYXRhW2ldLCBkYXRhW2pdKTsgfSk7CgogICAgLy8gQ29tcHV0ZSB0aGUg YXJjcyEgVGhleSBhcmUgc3RvcmVkIGluIHRoZSBvcmlnaW5hbCBkYXRhJ3Mgb3JkZXIuCiAgICBm b3IgKGkgPSAwLCBrID0gc3VtID8gKGRhIC0gbiAqIHBhKSAvIHN1bSA6IDA7IGkgPCBuOyArK2ks IGEwID0gYTEpIHsKICAgICAgaiA9IGluZGV4W2ldLCB2ID0gYXJjc1tqXSwgYTEgPSBhMCArICh2 ID4gMCA/IHYgKiBrIDogMCkgKyBwYSwgYXJjc1tqXSA9IHsKICAgICAgICBkYXRhOiBkYXRhW2pd LAogICAgICAgIGluZGV4OiBpLAogICAgICAgIHZhbHVlOiB2LAogICAgICAgIHN0YXJ0QW5nbGU6 IGEwLAogICAgICAgIGVuZEFuZ2xlOiBhMSwKICAgICAgICBwYWRBbmdsZTogcAogICAgICB9Owog ICAgfQoKICAgIHJldHVybiBhcmNzOwogIH0KCiAgcGllLnZhbHVlID0gZnVuY3Rpb24oXykgewog ICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0 aW9uIiA/IF8gOiBjb25zdGFudCRiKCtfKSwgcGllKSA6IHZhbHVlOwogIH07CgogIHBpZS5zb3J0 VmFsdWVzID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc29y dFZhbHVlcyA9IF8sIHNvcnQgPSBudWxsLCBwaWUpIDogc29ydFZhbHVlczsKICB9OwoKICBwaWUu c29ydCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvcnQg PSBfLCBzb3J0VmFsdWVzID0gbnVsbCwgcGllKSA6IHNvcnQ7CiAgfTsKCiAgcGllLnN0YXJ0QW5n bGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdGFydEFu Z2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIHBpZSkg OiBzdGFydEFuZ2xlOwogIH07CgogIHBpZS5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJl dHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlv biIgPyBfIDogY29uc3RhbnQkYigrXyksIHBpZSkgOiBlbmRBbmdsZTsKICB9OwoKICBwaWUucGFk QW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRB bmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBwaWUp IDogcGFkQW5nbGU7CiAgfTsKCiAgcmV0dXJuIHBpZTsKfQoKdmFyIGN1cnZlUmFkaWFsTGluZWFy ID0gY3VydmVSYWRpYWwoY3VydmVMaW5lYXIpOwoKZnVuY3Rpb24gUmFkaWFsKGN1cnZlKSB7CiAg dGhpcy5fY3VydmUgPSBjdXJ2ZTsKfQoKUmFkaWFsLnByb3RvdHlwZSA9IHsKICBhcmVhU3RhcnQ6 IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fY3VydmUuYXJlYVN0YXJ0KCk7CiAgfSwKICBhcmVhRW5k OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2N1cnZlLmFyZWFFbmQoKTsKICB9LAogIGxpbmVTdGFy dDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9jdXJ2ZS5saW5lU3RhcnQoKTsKICB9LAogIGxpbmVF bmQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fY3VydmUubGluZUVuZCgpOwogIH0sCiAgcG9pbnQ6 IGZ1bmN0aW9uKGEsIHIpIHsKICAgIHRoaXMuX2N1cnZlLnBvaW50KHIgKiBNYXRoLnNpbihhKSwg ciAqIC1NYXRoLmNvcyhhKSk7CiAgfQp9OwoKZnVuY3Rpb24gY3VydmVSYWRpYWwoY3VydmUpIHsK CiAgZnVuY3Rpb24gcmFkaWFsKGNvbnRleHQpIHsKICAgIHJldHVybiBuZXcgUmFkaWFsKGN1cnZl KGNvbnRleHQpKTsKICB9CgogIHJhZGlhbC5fY3VydmUgPSBjdXJ2ZTsKCiAgcmV0dXJuIHJhZGlh bDsKfQoKZnVuY3Rpb24gbGluZVJhZGlhbChsKSB7CiAgdmFyIGMgPSBsLmN1cnZlOwoKICBsLmFu Z2xlID0gbC54LCBkZWxldGUgbC54OwogIGwucmFkaXVzID0gbC55LCBkZWxldGUgbC55OwoKICBs LmN1cnZlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1 cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7CiAgfTsKCiAgcmV0dXJuIGw7Cn0KCmZ1bmN0aW9u IGxpbmVSYWRpYWwkMSgpIHsKICByZXR1cm4gbGluZVJhZGlhbChsaW5lKCkuY3VydmUoY3VydmVS YWRpYWxMaW5lYXIpKTsKfQoKZnVuY3Rpb24gYXJlYVJhZGlhbCgpIHsKICB2YXIgYSA9IGFyZWEk MygpLmN1cnZlKGN1cnZlUmFkaWFsTGluZWFyKSwKICAgICAgYyA9IGEuY3VydmUsCiAgICAgIHgw ID0gYS5saW5lWDAsCiAgICAgIHgxID0gYS5saW5lWDEsCiAgICAgIHkwID0gYS5saW5lWTAsCiAg ICAgIHkxID0gYS5saW5lWTE7CgogIGEuYW5nbGUgPSBhLngsIGRlbGV0ZSBhLng7CiAgYS5zdGFy dEFuZ2xlID0gYS54MCwgZGVsZXRlIGEueDA7CiAgYS5lbmRBbmdsZSA9IGEueDEsIGRlbGV0ZSBh LngxOwogIGEucmFkaXVzID0gYS55LCBkZWxldGUgYS55OwogIGEuaW5uZXJSYWRpdXMgPSBhLnkw LCBkZWxldGUgYS55MDsKICBhLm91dGVyUmFkaXVzID0gYS55MSwgZGVsZXRlIGEueTE7CiAgYS5s aW5lU3RhcnRBbmdsZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh4MCgpKTsgfSwg ZGVsZXRlIGEubGluZVgwOwogIGEubGluZUVuZEFuZ2xlID0gZnVuY3Rpb24oKSB7IHJldHVybiBs aW5lUmFkaWFsKHgxKCkpOyB9LCBkZWxldGUgYS5saW5lWDE7CiAgYS5saW5lSW5uZXJSYWRpdXMg PSBmdW5jdGlvbigpIHsgcmV0dXJuIGxpbmVSYWRpYWwoeTAoKSk7IH0sIGRlbGV0ZSBhLmxpbmVZ MDsKICBhLmxpbmVPdXRlclJhZGl1cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh5 MSgpKTsgfSwgZGVsZXRlIGEubGluZVkxOwoKICBhLmN1cnZlID0gZnVuY3Rpb24oXykgewogICAg cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7 CiAgfTsKCiAgcmV0dXJuIGE7Cn0KCmZ1bmN0aW9uIHBvaW50UmFkaWFsKHgsIHkpIHsKICByZXR1 cm4gWyh5ID0gK3kpICogTWF0aC5jb3MoeCAtPSBNYXRoLlBJIC8gMiksIHkgKiBNYXRoLnNpbih4 KV07Cn0KCnZhciBzbGljZSQ2ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOwoKZnVuY3Rpb24gbGlu a1NvdXJjZShkKSB7CiAgcmV0dXJuIGQuc291cmNlOwp9CgpmdW5jdGlvbiBsaW5rVGFyZ2V0KGQp IHsKICByZXR1cm4gZC50YXJnZXQ7Cn0KCmZ1bmN0aW9uIGxpbmskMihjdXJ2ZSkgewogIHZhciBz b3VyY2UgPSBsaW5rU291cmNlLAogICAgICB0YXJnZXQgPSBsaW5rVGFyZ2V0LAogICAgICB4ID0g eCQzLAogICAgICB5ID0geSQzLAogICAgICBjb250ZXh0ID0gbnVsbDsKCiAgZnVuY3Rpb24gbGlu aygpIHsKICAgIHZhciBidWZmZXIsIGFyZ3YgPSBzbGljZSQ2LmNhbGwoYXJndW1lbnRzKSwgcyA9 IHNvdXJjZS5hcHBseSh0aGlzLCBhcmd2KSwgdCA9IHRhcmdldC5hcHBseSh0aGlzLCBhcmd2KTsK ICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IHBhdGgoKTsKICAgIGN1cnZlKGNv bnRleHQsICt4LmFwcGx5KHRoaXMsIChhcmd2WzBdID0gcywgYXJndikpLCAreS5hcHBseSh0aGlz LCBhcmd2KSwgK3guYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSB0LCBhcmd2KSksICt5LmFwcGx5KHRo aXMsIGFyZ3YpKTsKICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVy ICsgIiIgfHwgbnVsbDsKICB9CgogIGxpbmsuc291cmNlID0gZnVuY3Rpb24oXykgewogICAgcmV0 dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc291cmNlID0gXywgbGluaykgOiBzb3VyY2U7CiAgfTsK CiAgbGluay50YXJnZXQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/ICh0YXJnZXQgPSBfLCBsaW5rKSA6IHRhcmdldDsKICB9OwoKICBsaW5rLnggPSBmdW5jdGlv bihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09ICJm dW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGxpbmspIDogeDsKICB9OwoKICBsaW5rLnkg PSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9m IF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGxpbmspIDogeTsKICB9OwoK ICBsaW5rLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/ICgoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfKSwgbGluaykgOiBjb250ZXh0Owog IH07CgogIHJldHVybiBsaW5rOwp9CgpmdW5jdGlvbiBjdXJ2ZUhvcml6b250YWwoY29udGV4dCwg eDAsIHkwLCB4MSwgeTEpIHsKICBjb250ZXh0Lm1vdmVUbyh4MCwgeTApOwogIGNvbnRleHQuYmV6 aWVyQ3VydmVUbyh4MCA9ICh4MCArIHgxKSAvIDIsIHkwLCB4MCwgeTEsIHgxLCB5MSk7Cn0KCmZ1 bmN0aW9uIGN1cnZlVmVydGljYWwoY29udGV4dCwgeDAsIHkwLCB4MSwgeTEpIHsKICBjb250ZXh0 Lm1vdmVUbyh4MCwgeTApOwogIGNvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCwgeTAgPSAoeTAgKyB5 MSkgLyAyLCB4MSwgeTAsIHgxLCB5MSk7Cn0KCmZ1bmN0aW9uIGN1cnZlUmFkaWFsJDEoY29udGV4 dCwgeDAsIHkwLCB4MSwgeTEpIHsKICB2YXIgcDAgPSBwb2ludFJhZGlhbCh4MCwgeTApLAogICAg ICBwMSA9IHBvaW50UmFkaWFsKHgwLCB5MCA9ICh5MCArIHkxKSAvIDIpLAogICAgICBwMiA9IHBv aW50UmFkaWFsKHgxLCB5MCksCiAgICAgIHAzID0gcG9pbnRSYWRpYWwoeDEsIHkxKTsKICBjb250 ZXh0Lm1vdmVUbyhwMFswXSwgcDBbMV0pOwogIGNvbnRleHQuYmV6aWVyQ3VydmVUbyhwMVswXSwg cDFbMV0sIHAyWzBdLCBwMlsxXSwgcDNbMF0sIHAzWzFdKTsKfQoKZnVuY3Rpb24gbGlua0hvcml6 b250YWwoKSB7CiAgcmV0dXJuIGxpbmskMihjdXJ2ZUhvcml6b250YWwpOwp9CgpmdW5jdGlvbiBs aW5rVmVydGljYWwoKSB7CiAgcmV0dXJuIGxpbmskMihjdXJ2ZVZlcnRpY2FsKTsKfQoKZnVuY3Rp b24gbGlua1JhZGlhbCgpIHsKICB2YXIgbCA9IGxpbmskMihjdXJ2ZVJhZGlhbCQxKTsKICBsLmFu Z2xlID0gbC54LCBkZWxldGUgbC54OwogIGwucmFkaXVzID0gbC55LCBkZWxldGUgbC55OwogIHJl dHVybiBsOwp9Cgp2YXIgY2lyY2xlJDIgPSB7CiAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6 ZSkgewogICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIHBpJDQpOwogICAgY29udGV4dC5tb3Zl VG8ociwgMCk7CiAgICBjb250ZXh0LmFyYygwLCAwLCByLCAwLCB0YXUkNCk7CiAgfQp9OwoKdmFy IGNyb3NzJDIgPSB7CiAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6ZSkgewogICAgdmFyIHIg PSBNYXRoLnNxcnQoc2l6ZSAvIDUpIC8gMjsKICAgIGNvbnRleHQubW92ZVRvKC0zICogciwgLXIp OwogICAgY29udGV4dC5saW5lVG8oLXIsIC1yKTsKICAgIGNvbnRleHQubGluZVRvKC1yLCAtMyAq IHIpOwogICAgY29udGV4dC5saW5lVG8ociwgLTMgKiByKTsKICAgIGNvbnRleHQubGluZVRvKHIs IC1yKTsKICAgIGNvbnRleHQubGluZVRvKDMgKiByLCAtcik7CiAgICBjb250ZXh0LmxpbmVUbygz ICogciwgcik7CiAgICBjb250ZXh0LmxpbmVUbyhyLCByKTsKICAgIGNvbnRleHQubGluZVRvKHIs IDMgKiByKTsKICAgIGNvbnRleHQubGluZVRvKC1yLCAzICogcik7CiAgICBjb250ZXh0LmxpbmVU bygtciwgcik7CiAgICBjb250ZXh0LmxpbmVUbygtMyAqIHIsIHIpOwogICAgY29udGV4dC5jbG9z ZVBhdGgoKTsKICB9Cn07Cgp2YXIgdGFuMzAgPSBNYXRoLnNxcnQoMSAvIDMpLAogICAgdGFuMzBf MiA9IHRhbjMwICogMjsKCnZhciBkaWFtb25kID0gewogIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQs IHNpemUpIHsKICAgIHZhciB5ID0gTWF0aC5zcXJ0KHNpemUgLyB0YW4zMF8yKSwKICAgICAgICB4 ID0geSAqIHRhbjMwOwogICAgY29udGV4dC5tb3ZlVG8oMCwgLXkpOwogICAgY29udGV4dC5saW5l VG8oeCwgMCk7CiAgICBjb250ZXh0LmxpbmVUbygwLCB5KTsKICAgIGNvbnRleHQubGluZVRvKC14 LCAwKTsKICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7CiAgfQp9OwoKdmFyIGthID0gMC44OTA4MTMw OTE1MjkyODUyMjgxMCwKICAgIGtyID0gTWF0aC5zaW4ocGkkNCAvIDEwKSAvIE1hdGguc2luKDcg KiBwaSQ0IC8gMTApLAogICAga3ggPSBNYXRoLnNpbih0YXUkNCAvIDEwKSAqIGtyLAogICAga3kg PSAtTWF0aC5jb3ModGF1JDQgLyAxMCkgKiBrcjsKCnZhciBzdGFyID0gewogIGRyYXc6IGZ1bmN0 aW9uKGNvbnRleHQsIHNpemUpIHsKICAgIHZhciByID0gTWF0aC5zcXJ0KHNpemUgKiBrYSksCiAg ICAgICAgeCA9IGt4ICogciwKICAgICAgICB5ID0ga3kgKiByOwogICAgY29udGV4dC5tb3ZlVG8o MCwgLXIpOwogICAgY29udGV4dC5saW5lVG8oeCwgeSk7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8 IDU7ICsraSkgewogICAgICB2YXIgYSA9IHRhdSQ0ICogaSAvIDUsCiAgICAgICAgICBjID0gTWF0 aC5jb3MoYSksCiAgICAgICAgICBzID0gTWF0aC5zaW4oYSk7CiAgICAgIGNvbnRleHQubGluZVRv KHMgKiByLCAtYyAqIHIpOwogICAgICBjb250ZXh0LmxpbmVUbyhjICogeCAtIHMgKiB5LCBzICog eCArIGMgKiB5KTsKICAgIH0KICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7CiAgfQp9OwoKdmFyIHNx dWFyZSA9IHsKICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7CiAgICB2YXIgdyA9IE1h dGguc3FydChzaXplKSwKICAgICAgICB4ID0gLXcgLyAyOwogICAgY29udGV4dC5yZWN0KHgsIHgs IHcsIHcpOwogIH0KfTsKCnZhciBzcXJ0MyA9IE1hdGguc3FydCgzKTsKCnZhciB0cmlhbmdsZSA9 IHsKICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7CiAgICB2YXIgeSA9IC1NYXRoLnNx cnQoc2l6ZSAvIChzcXJ0MyAqIDMpKTsKICAgIGNvbnRleHQubW92ZVRvKDAsIHkgKiAyKTsKICAg IGNvbnRleHQubGluZVRvKC1zcXJ0MyAqIHksIC15KTsKICAgIGNvbnRleHQubGluZVRvKHNxcnQz ICogeSwgLXkpOwogICAgY29udGV4dC5jbG9zZVBhdGgoKTsKICB9Cn07Cgp2YXIgYyQyID0gLTAu NSwKICAgIHMgPSBNYXRoLnNxcnQoMykgLyAyLAogICAgayA9IDEgLyBNYXRoLnNxcnQoMTIpLAog ICAgYSA9IChrIC8gMiArIDEpICogMzsKCnZhciB3eWUgPSB7CiAgZHJhdzogZnVuY3Rpb24oY29u dGV4dCwgc2l6ZSkgewogICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIGEpLAogICAgICAgIHgw ID0gciAvIDIsCiAgICAgICAgeTAgPSByICogaywKICAgICAgICB4MSA9IHgwLAogICAgICAgIHkx ID0gciAqIGsgKyByLAogICAgICAgIHgyID0gLXgxLAogICAgICAgIHkyID0geTE7CiAgICBjb250 ZXh0Lm1vdmVUbyh4MCwgeTApOwogICAgY29udGV4dC5saW5lVG8oeDEsIHkxKTsKICAgIGNvbnRl eHQubGluZVRvKHgyLCB5Mik7CiAgICBjb250ZXh0LmxpbmVUbyhjJDIgKiB4MCAtIHMgKiB5MCwg cyAqIHgwICsgYyQyICogeTApOwogICAgY29udGV4dC5saW5lVG8oYyQyICogeDEgLSBzICogeTEs IHMgKiB4MSArIGMkMiAqIHkxKTsKICAgIGNvbnRleHQubGluZVRvKGMkMiAqIHgyIC0gcyAqIHky LCBzICogeDIgKyBjJDIgKiB5Mik7CiAgICBjb250ZXh0LmxpbmVUbyhjJDIgKiB4MCArIHMgKiB5 MCwgYyQyICogeTAgLSBzICogeDApOwogICAgY29udGV4dC5saW5lVG8oYyQyICogeDEgKyBzICog eTEsIGMkMiAqIHkxIC0gcyAqIHgxKTsKICAgIGNvbnRleHQubGluZVRvKGMkMiAqIHgyICsgcyAq IHkyLCBjJDIgKiB5MiAtIHMgKiB4Mik7CiAgICBjb250ZXh0LmNsb3NlUGF0aCgpOwogIH0KfTsK CnZhciBzeW1ib2xzID0gWwogIGNpcmNsZSQyLAogIGNyb3NzJDIsCiAgZGlhbW9uZCwKICBzcXVh cmUsCiAgc3RhciwKICB0cmlhbmdsZSwKICB3eWUKXTsKCmZ1bmN0aW9uIHN5bWJvbCgpIHsKICB2 YXIgdHlwZSA9IGNvbnN0YW50JGIoY2lyY2xlJDIpLAogICAgICBzaXplID0gY29uc3RhbnQkYig2 NCksCiAgICAgIGNvbnRleHQgPSBudWxsOwoKICBmdW5jdGlvbiBzeW1ib2woKSB7CiAgICB2YXIg YnVmZmVyOwogICAgaWYgKCFjb250ZXh0KSBjb250ZXh0ID0gYnVmZmVyID0gcGF0aCgpOwogICAg dHlwZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLmRyYXcoY29udGV4dCwgK3NpemUuYXBwbHkodGhp cywgYXJndW1lbnRzKSk7CiAgICBpZiAoYnVmZmVyKSByZXR1cm4gY29udGV4dCA9IG51bGwsIGJ1 ZmZlciArICIiIHx8IG51bGw7CiAgfQoKICBzeW1ib2wudHlwZSA9IGZ1bmN0aW9uKF8pIHsKICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHR5cGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9u IiA/IF8gOiBjb25zdGFudCRiKF8pLCBzeW1ib2wpIDogdHlwZTsKICB9OwoKICBzeW1ib2wuc2l6 ZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNpemUgPSB0 eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCtfKSwgc3ltYm9sKSA6IHNp emU7CiAgfTsKCiAgc3ltYm9sLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJn dW1lbnRzLmxlbmd0aCA/IChjb250ZXh0ID0gXyA9PSBudWxsID8gbnVsbCA6IF8sIHN5bWJvbCkg OiBjb250ZXh0OwogIH07CgogIHJldHVybiBzeW1ib2w7Cn0KCmZ1bmN0aW9uIG5vb3AkMygpIHt9 CgpmdW5jdGlvbiBwb2ludCQyKHRoYXQsIHgsIHkpIHsKICB0aGF0Ll9jb250ZXh0LmJlemllckN1 cnZlVG8oCiAgICAoMiAqIHRoYXQuX3gwICsgdGhhdC5feDEpIC8gMywKICAgICgyICogdGhhdC5f eTAgKyB0aGF0Ll95MSkgLyAzLAogICAgKHRoYXQuX3gwICsgMiAqIHRoYXQuX3gxKSAvIDMsCiAg ICAodGhhdC5feTAgKyAyICogdGhhdC5feTEpIC8gMywKICAgICh0aGF0Ll94MCArIDQgKiB0aGF0 Ll94MSArIHgpIC8gNiwKICAgICh0aGF0Ll95MCArIDQgKiB0aGF0Ll95MSArIHkpIC8gNgogICk7 Cn0KCmZ1bmN0aW9uIEJhc2lzKGNvbnRleHQpIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsK fQoKQmFzaXMucHJvdG90eXBlID0gewogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlz Ll9saW5lID0gMDsKICB9LAogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9 IE5hTjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl94MCA9IHRoaXMu X3gxID0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSBOYU47CiAgICB0aGlzLl9wb2ludCA9IDA7 CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsK ICAgICAgY2FzZSAzOiBwb2ludCQyKHRoaXMsIHRoaXMuX3gxLCB0aGlzLl95MSk7IC8vIHByb2Nl ZWQKICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSwgdGhpcy5feTEp OyBicmVhazsKICAgIH0KICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYm IHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIHRoaXMu X2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICB9LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAg ICB4ID0gK3gsIHkgPSAreTsKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAw OiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5 KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhazsKICAgICAgY2FzZSAxOiB0aGlz Ll9wb2ludCA9IDI7IGJyZWFrOwogICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5f Y29udGV4dC5saW5lVG8oKDUgKiB0aGlzLl94MCArIHRoaXMuX3gxKSAvIDYsICg1ICogdGhpcy5f eTAgKyB0aGlzLl95MSkgLyA2KTsgLy8gcHJvY2VlZAogICAgICBkZWZhdWx0OiBwb2ludCQyKHRo aXMsIHgsIHkpOyBicmVhazsKICAgIH0KICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gx ID0geDsKICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTsKICB9Cn07CgpmdW5j dGlvbiBiYXNpcyQyKGNvbnRleHQpIHsKICByZXR1cm4gbmV3IEJhc2lzKGNvbnRleHQpOwp9Cgpm dW5jdGlvbiBCYXNpc0Nsb3NlZChjb250ZXh0KSB7CiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7 Cn0KCkJhc2lzQ2xvc2VkLnByb3RvdHlwZSA9IHsKICBhcmVhU3RhcnQ6IG5vb3AkMywKICBhcmVh RW5kOiBub29wJDMsCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3gwID0gdGhp cy5feDEgPSB0aGlzLl94MiA9IHRoaXMuX3gzID0gdGhpcy5feDQgPQogICAgdGhpcy5feTAgPSB0 aGlzLl95MSA9IHRoaXMuX3kyID0gdGhpcy5feTMgPSB0aGlzLl95NCA9IE5hTjsKICAgIHRoaXMu X3BvaW50ID0gMDsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgc3dpdGNoICh0aGlz Ll9wb2ludCkgewogICAgICBjYXNlIDE6IHsKICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0 aGlzLl94MiwgdGhpcy5feTIpOwogICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAg ICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAyOiB7CiAgICAgICAgdGhpcy5fY29udGV4 dC5tb3ZlVG8oKHRoaXMuX3gyICsgMiAqIHRoaXMuX3gzKSAvIDMsICh0aGlzLl95MiArIDIgKiB0 aGlzLl95MykgLyAzKTsKICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMgKyAy ICogdGhpcy5feDIpIC8gMywgKHRoaXMuX3kzICsgMiAqIHRoaXMuX3kyKSAvIDMpOwogICAgICAg IHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAg Y2FzZSAzOiB7CiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94MiwgdGhpcy5feTIpOwogICAgICAg IHRoaXMucG9pbnQodGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICB0aGlzLnBvaW50KHRoaXMu X3g0LCB0aGlzLl95NCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9LAogIHBvaW50 OiBmdW5jdGlvbih4LCB5KSB7CiAgICB4ID0gK3gsIHkgPSAreTsKICAgIHN3aXRjaCAodGhpcy5f cG9pbnQpIHsKICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX3gyID0geCwgdGhp cy5feTIgPSB5OyBicmVhazsKICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IHRoaXMuX3gz ID0geCwgdGhpcy5feTMgPSB5OyBicmVhazsKICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7 IHRoaXMuX3g0ID0geCwgdGhpcy5feTQgPSB5OyB0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5f eDAgKyA0ICogdGhpcy5feDEgKyB4KSAvIDYsICh0aGlzLl95MCArIDQgKiB0aGlzLl95MSArIHkp IC8gNik7IGJyZWFrOwogICAgICBkZWZhdWx0OiBwb2ludCQyKHRoaXMsIHgsIHkpOyBicmVhazsK ICAgIH0KICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0geDsKICAgIHRoaXMuX3kw ID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTsKICB9Cn07CgpmdW5jdGlvbiBiYXNpc0Nsb3NlZCQx KGNvbnRleHQpIHsKICByZXR1cm4gbmV3IEJhc2lzQ2xvc2VkKGNvbnRleHQpOwp9CgpmdW5jdGlv biBCYXNpc09wZW4oY29udGV4dCkgewogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Owp9CgpCYXNp c09wZW4ucHJvdG90eXBlID0gewogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9s aW5lID0gMDsKICB9LAogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IE5h TjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl94MCA9IHRoaXMuX3gx ID0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSBOYU47CiAgICB0aGlzLl9wb2ludCA9IDA7CiAg fSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9s aW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgo KTsKICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICB9LAogIHBvaW50OiBmdW5jdGlv bih4LCB5KSB7CiAgICB4ID0gK3gsIHkgPSAreTsKICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsK ICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJyZWFrOwogICAgICBjYXNlIDE6IHRoaXMu X3BvaW50ID0gMjsgYnJlYWs7CiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB2YXIgeDAg PSAodGhpcy5feDAgKyA0ICogdGhpcy5feDEgKyB4KSAvIDYsIHkwID0gKHRoaXMuX3kwICsgNCAq IHRoaXMuX3kxICsgeSkgLyA2OyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeDAs IHkwKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgwLCB5MCk7IGJyZWFrOwogICAgICBjYXNlIDM6 IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZAogICAgICBkZWZhdWx0OiBwb2ludCQyKHRoaXMs IHgsIHkpOyBicmVhazsKICAgIH0KICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0g eDsKICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTsKICB9Cn07CgpmdW5jdGlv biBiYXNpc09wZW4oY29udGV4dCkgewogIHJldHVybiBuZXcgQmFzaXNPcGVuKGNvbnRleHQpOwp9 CgpmdW5jdGlvbiBCdW5kbGUoY29udGV4dCwgYmV0YSkgewogIHRoaXMuX2Jhc2lzID0gbmV3IEJh c2lzKGNvbnRleHQpOwogIHRoaXMuX2JldGEgPSBiZXRhOwp9CgpCdW5kbGUucHJvdG90eXBlID0g ewogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl94ID0gW107CiAgICB0aGlzLl95 ID0gW107CiAgICB0aGlzLl9iYXNpcy5saW5lU3RhcnQoKTsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0 aW9uKCkgewogICAgdmFyIHggPSB0aGlzLl94LAogICAgICAgIHkgPSB0aGlzLl95LAogICAgICAg IGogPSB4Lmxlbmd0aCAtIDE7CgogICAgaWYgKGogPiAwKSB7CiAgICAgIHZhciB4MCA9IHhbMF0s CiAgICAgICAgICB5MCA9IHlbMF0sCiAgICAgICAgICBkeCA9IHhbal0gLSB4MCwKICAgICAgICAg IGR5ID0geVtqXSAtIHkwLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgdDsKCiAgICAgIHdo aWxlICgrK2kgPD0gaikgewogICAgICAgIHQgPSBpIC8gajsKICAgICAgICB0aGlzLl9iYXNpcy5w b2ludCgKICAgICAgICAgIHRoaXMuX2JldGEgKiB4W2ldICsgKDEgLSB0aGlzLl9iZXRhKSAqICh4 MCArIHQgKiBkeCksCiAgICAgICAgICB0aGlzLl9iZXRhICogeVtpXSArICgxIC0gdGhpcy5fYmV0 YSkgKiAoeTAgKyB0ICogZHkpCiAgICAgICAgKTsKICAgICAgfQogICAgfQoKICAgIHRoaXMuX3gg PSB0aGlzLl95ID0gbnVsbDsKICAgIHRoaXMuX2Jhc2lzLmxpbmVFbmQoKTsKICB9LAogIHBvaW50 OiBmdW5jdGlvbih4LCB5KSB7CiAgICB0aGlzLl94LnB1c2goK3gpOwogICAgdGhpcy5feS5wdXNo KCt5KTsKICB9Cn07Cgp2YXIgYnVuZGxlID0gKGZ1bmN0aW9uIGN1c3RvbShiZXRhKSB7CgogIGZ1 bmN0aW9uIGJ1bmRsZShjb250ZXh0KSB7CiAgICByZXR1cm4gYmV0YSA9PT0gMSA/IG5ldyBCYXNp cyhjb250ZXh0KSA6IG5ldyBCdW5kbGUoY29udGV4dCwgYmV0YSk7CiAgfQoKICBidW5kbGUuYmV0 YSA9IGZ1bmN0aW9uKGJldGEpIHsKICAgIHJldHVybiBjdXN0b20oK2JldGEpOwogIH07CgogIHJl dHVybiBidW5kbGU7Cn0pKDAuODUpOwoKZnVuY3Rpb24gcG9pbnQkMyh0aGF0LCB4LCB5KSB7CiAg dGhhdC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKAogICAgdGhhdC5feDEgKyB0aGF0Ll9rICogKHRo YXQuX3gyIC0gdGhhdC5feDApLAogICAgdGhhdC5feTEgKyB0aGF0Ll9rICogKHRoYXQuX3kyIC0g dGhhdC5feTApLAogICAgdGhhdC5feDIgKyB0aGF0Ll9rICogKHRoYXQuX3gxIC0geCksCiAgICB0 aGF0Ll95MiArIHRoYXQuX2sgKiAodGhhdC5feTEgLSB5KSwKICAgIHRoYXQuX3gyLAogICAgdGhh dC5feTIKICApOwp9CgpmdW5jdGlvbiBDYXJkaW5hbChjb250ZXh0LCB0ZW5zaW9uKSB7CiAgdGhp cy5fY29udGV4dCA9IGNvbnRleHQ7CiAgdGhpcy5fayA9ICgxIC0gdGVuc2lvbikgLyA2Owp9CgpD YXJkaW5hbC5wcm90b3R5cGUgPSB7CiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMu X2xpbmUgPSAwOwogIH0sCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0g TmFOOwogIH0sCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3gwID0gdGhpcy5f eDEgPSB0aGlzLl94MiA9CiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47 CiAgICB0aGlzLl9wb2ludCA9IDA7CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIHN3 aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0 aGlzLl94MiwgdGhpcy5feTIpOyBicmVhazsKICAgICAgY2FzZSAzOiBwb2ludCQzKHRoaXMsIHRo aXMuX3gxLCB0aGlzLl95MSk7IGJyZWFrOwogICAgfQogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRo aXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3Nl UGF0aCgpOwogICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOwogIH0sCiAgcG9pbnQ6IGZ1 bmN0aW9uKHgsIHkpIHsKICAgIHggPSAreCwgeSA9ICt5OwogICAgc3dpdGNoICh0aGlzLl9wb2lu dCkgewogICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2Nv bnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrOwog ICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgdGhpcy5feDEgPSB4LCB0aGlzLl95MSA9IHk7 IGJyZWFrOwogICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgLy8gcHJvY2VlZAogICAgICBk ZWZhdWx0OiBwb2ludCQzKHRoaXMsIHgsIHkpOyBicmVhazsKICAgIH0KICAgIHRoaXMuX3gwID0g dGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsKICAgIHRoaXMuX3kw ID0gdGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTsKICB9Cn07Cgp2 YXIgY2FyZGluYWwgPSAoZnVuY3Rpb24gY3VzdG9tKHRlbnNpb24pIHsKCiAgZnVuY3Rpb24gY2Fy ZGluYWwoY29udGV4dCkgewogICAgcmV0dXJuIG5ldyBDYXJkaW5hbChjb250ZXh0LCB0ZW5zaW9u KTsKICB9CgogIGNhcmRpbmFsLnRlbnNpb24gPSBmdW5jdGlvbih0ZW5zaW9uKSB7CiAgICByZXR1 cm4gY3VzdG9tKCt0ZW5zaW9uKTsKICB9OwoKICByZXR1cm4gY2FyZGluYWw7Cn0pKDApOwoKZnVu Y3Rpb24gQ2FyZGluYWxDbG9zZWQoY29udGV4dCwgdGVuc2lvbikgewogIHRoaXMuX2NvbnRleHQg PSBjb250ZXh0OwogIHRoaXMuX2sgPSAoMSAtIHRlbnNpb24pIC8gNjsKfQoKQ2FyZGluYWxDbG9z ZWQucHJvdG90eXBlID0gewogIGFyZWFTdGFydDogbm9vcCQzLAogIGFyZWFFbmQ6IG5vb3AkMywK ICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMu X3gyID0gdGhpcy5feDMgPSB0aGlzLl94NCA9IHRoaXMuX3g1ID0KICAgIHRoaXMuX3kwID0gdGhp cy5feTEgPSB0aGlzLl95MiA9IHRoaXMuX3kzID0gdGhpcy5feTQgPSB0aGlzLl95NSA9IE5hTjsK ICAgIHRoaXMuX3BvaW50ID0gMDsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgc3dp dGNoICh0aGlzLl9wb2ludCkgewogICAgICBjYXNlIDE6IHsKICAgICAgICB0aGlzLl9jb250ZXh0 Lm1vdmVUbyh0aGlzLl94MywgdGhpcy5feTMpOwogICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQ YXRoKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAyOiB7CiAgICAgICAgdGhp cy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICB0aGlzLl9jb250 ZXh0LmNsb3NlUGF0aCgpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgMzogewog ICAgICAgIHRoaXMucG9pbnQodGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICB0aGlzLnBvaW50 KHRoaXMuX3g0LCB0aGlzLl95NCk7CiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NSwgdGhpcy5f eTUpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfSwKICBwb2ludDogZnVuY3Rpb24o eCwgeSkgewogICAgeCA9ICt4LCB5ID0gK3k7CiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAg ICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl94MyA9IHgsIHRoaXMuX3kzID0geTsg YnJlYWs7CiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl9jb250ZXh0Lm1vdmVU byh0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geSk7IGJyZWFrOwogICAgICBjYXNlIDI6IHRoaXMu X3BvaW50ID0gMzsgdGhpcy5feDUgPSB4LCB0aGlzLl95NSA9IHk7IGJyZWFrOwogICAgICBkZWZh dWx0OiBwb2ludCQzKHRoaXMsIHgsIHkpOyBicmVhazsKICAgIH0KICAgIHRoaXMuX3gwID0gdGhp cy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsKICAgIHRoaXMuX3kwID0g dGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTsKICB9Cn07Cgp2YXIg Y2FyZGluYWxDbG9zZWQgPSAoZnVuY3Rpb24gY3VzdG9tKHRlbnNpb24pIHsKCiAgZnVuY3Rpb24g Y2FyZGluYWwoY29udGV4dCkgewogICAgcmV0dXJuIG5ldyBDYXJkaW5hbENsb3NlZChjb250ZXh0 LCB0ZW5zaW9uKTsKICB9CgogIGNhcmRpbmFsLnRlbnNpb24gPSBmdW5jdGlvbih0ZW5zaW9uKSB7 CiAgICByZXR1cm4gY3VzdG9tKCt0ZW5zaW9uKTsKICB9OwoKICByZXR1cm4gY2FyZGluYWw7Cn0p KDApOwoKZnVuY3Rpb24gQ2FyZGluYWxPcGVuKGNvbnRleHQsIHRlbnNpb24pIHsKICB0aGlzLl9j b250ZXh0ID0gY29udGV4dDsKICB0aGlzLl9rID0gKDEgLSB0ZW5zaW9uKSAvIDY7Cn0KCkNhcmRp bmFsT3Blbi5wcm90b3R5cGUgPSB7CiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMu X2xpbmUgPSAwOwogIH0sCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0g TmFOOwogIH0sCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3gwID0gdGhpcy5f eDEgPSB0aGlzLl94MiA9CiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47 CiAgICB0aGlzLl9wb2ludCA9IDA7CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIGlm ICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkg dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGlu ZTsKICB9LAogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICB4ID0gK3gsIHkgPSAreTsKICAg IHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJy ZWFrOwogICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7CiAgICAgIGNhc2UgMjog dGhpcy5fcG9pbnQgPSAzOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5f eDIsIHRoaXMuX3kyKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7 IGJyZWFrOwogICAgICBjYXNlIDM6IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZAogICAgICBk ZWZhdWx0OiBwb2ludCQzKHRoaXMsIHgsIHkpOyBicmVhazsKICAgIH0KICAgIHRoaXMuX3gwID0g dGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsKICAgIHRoaXMuX3kw ID0gdGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTsKICB9Cn07Cgp2 YXIgY2FyZGluYWxPcGVuID0gKGZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKSB7CgogIGZ1bmN0aW9u IGNhcmRpbmFsKGNvbnRleHQpIHsKICAgIHJldHVybiBuZXcgQ2FyZGluYWxPcGVuKGNvbnRleHQs IHRlbnNpb24pOwogIH0KCiAgY2FyZGluYWwudGVuc2lvbiA9IGZ1bmN0aW9uKHRlbnNpb24pIHsK ICAgIHJldHVybiBjdXN0b20oK3RlbnNpb24pOwogIH07CgogIHJldHVybiBjYXJkaW5hbDsKfSko MCk7CgpmdW5jdGlvbiBwb2ludCQ0KHRoYXQsIHgsIHkpIHsKICB2YXIgeDEgPSB0aGF0Ll94MSwK ICAgICAgeTEgPSB0aGF0Ll95MSwKICAgICAgeDIgPSB0aGF0Ll94MiwKICAgICAgeTIgPSB0aGF0 Ll95MjsKCiAgaWYgKHRoYXQuX2wwMV9hID4gZXBzaWxvbiQzKSB7CiAgICB2YXIgYSA9IDIgKiB0 aGF0Ll9sMDFfMmEgKyAzICogdGhhdC5fbDAxX2EgKiB0aGF0Ll9sMTJfYSArIHRoYXQuX2wxMl8y YSwKICAgICAgICBuID0gMyAqIHRoYXQuX2wwMV9hICogKHRoYXQuX2wwMV9hICsgdGhhdC5fbDEy X2EpOwogICAgeDEgPSAoeDEgKiBhIC0gdGhhdC5feDAgKiB0aGF0Ll9sMTJfMmEgKyB0aGF0Ll94 MiAqIHRoYXQuX2wwMV8yYSkgLyBuOwogICAgeTEgPSAoeTEgKiBhIC0gdGhhdC5feTAgKiB0aGF0 Ll9sMTJfMmEgKyB0aGF0Ll95MiAqIHRoYXQuX2wwMV8yYSkgLyBuOwogIH0KCiAgaWYgKHRoYXQu X2wyM19hID4gZXBzaWxvbiQzKSB7CiAgICB2YXIgYiA9IDIgKiB0aGF0Ll9sMjNfMmEgKyAzICog dGhhdC5fbDIzX2EgKiB0aGF0Ll9sMTJfYSArIHRoYXQuX2wxMl8yYSwKICAgICAgICBtID0gMyAq IHRoYXQuX2wyM19hICogKHRoYXQuX2wyM19hICsgdGhhdC5fbDEyX2EpOwogICAgeDIgPSAoeDIg KiBiICsgdGhhdC5feDEgKiB0aGF0Ll9sMjNfMmEgLSB4ICogdGhhdC5fbDEyXzJhKSAvIG07CiAg ICB5MiA9ICh5MiAqIGIgKyB0aGF0Ll95MSAqIHRoYXQuX2wyM18yYSAtIHkgKiB0aGF0Ll9sMTJf MmEpIC8gbTsKICB9CgogIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh4MSwgeTEsIHgyLCB5 MiwgdGhhdC5feDIsIHRoYXQuX3kyKTsKfQoKZnVuY3Rpb24gQ2F0bXVsbFJvbShjb250ZXh0LCBh bHBoYSkgewogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0OwogIHRoaXMuX2FscGhhID0gYWxwaGE7 Cn0KCkNhdG11bGxSb20ucHJvdG90eXBlID0gewogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAg ICB0aGlzLl9saW5lID0gMDsKICB9LAogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5f bGluZSA9IE5hTjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLl94MCA9 IHRoaXMuX3gxID0gdGhpcy5feDIgPQogICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3ky ID0gTmFOOwogICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hID0KICAg IHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYSA9CiAgICB0aGlzLl9w b2ludCA9IDA7CiAgfSwKICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgIHN3aXRjaCAodGhpcy5f cG9pbnQpIHsKICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MiwgdGhp cy5feTIpOyBicmVhazsKICAgICAgY2FzZSAzOiB0aGlzLnBvaW50KHRoaXMuX3gyLCB0aGlzLl95 Mik7IGJyZWFrOwogICAgfQogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAg JiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgdGhp cy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOwogIH0sCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsK ICAgIHggPSAreCwgeSA9ICt5OwoKICAgIGlmICh0aGlzLl9wb2ludCkgewogICAgICB2YXIgeDIz ID0gdGhpcy5feDIgLSB4LAogICAgICAgICAgeTIzID0gdGhpcy5feTIgLSB5OwogICAgICB0aGlz Ll9sMjNfYSA9IE1hdGguc3FydCh0aGlzLl9sMjNfMmEgPSBNYXRoLnBvdyh4MjMgKiB4MjMgKyB5 MjMgKiB5MjMsIHRoaXMuX2FscGhhKSk7CiAgICB9CgogICAgc3dpdGNoICh0aGlzLl9wb2ludCkg ewogICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRl eHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrOwogICAg ICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7CiAgICAgIGNhc2UgMjogdGhpcy5fcG9p bnQgPSAzOyAvLyBwcm9jZWVkCiAgICAgIGRlZmF1bHQ6IHBvaW50JDQodGhpcywgeCwgeSk7IGJy ZWFrOwogICAgfQoKICAgIHRoaXMuX2wwMV9hID0gdGhpcy5fbDEyX2EsIHRoaXMuX2wxMl9hID0g dGhpcy5fbDIzX2E7CiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8y YSA9IHRoaXMuX2wyM18yYTsKICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhp cy5feDIsIHRoaXMuX3gyID0geDsKICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0g dGhpcy5feTIsIHRoaXMuX3kyID0geTsKICB9Cn07Cgp2YXIgY2F0bXVsbFJvbSA9IChmdW5jdGlv biBjdXN0b20oYWxwaGEpIHsKCiAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7CiAgICBy ZXR1cm4gYWxwaGEgPyBuZXcgQ2F0bXVsbFJvbShjb250ZXh0LCBhbHBoYSkgOiBuZXcgQ2FyZGlu YWwoY29udGV4dCwgMCk7CiAgfQoKICBjYXRtdWxsUm9tLmFscGhhID0gZnVuY3Rpb24oYWxwaGEp IHsKICAgIHJldHVybiBjdXN0b20oK2FscGhhKTsKICB9OwoKICByZXR1cm4gY2F0bXVsbFJvbTsK fSkoMC41KTsKCmZ1bmN0aW9uIENhdG11bGxSb21DbG9zZWQoY29udGV4dCwgYWxwaGEpIHsKICB0 aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICB0aGlzLl9hbHBoYSA9IGFscGhhOwp9CgpDYXRtdWxs Um9tQ2xvc2VkLnByb3RvdHlwZSA9IHsKICBhcmVhU3RhcnQ6IG5vb3AkMywKICBhcmVhRW5kOiBu b29wJDMsCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3gwID0gdGhpcy5feDEg PSB0aGlzLl94MiA9IHRoaXMuX3gzID0gdGhpcy5feDQgPSB0aGlzLl94NSA9CiAgICB0aGlzLl95 MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSB0aGlzLl95MyA9IHRoaXMuX3k0ID0gdGhpcy5feTUg PSBOYU47CiAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hID0gdGhpcy5fbDIzX2EgPQogICAg dGhpcy5fbDAxXzJhID0gdGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhID0KICAgIHRoaXMuX3Bv aW50ID0gMDsKICB9LAogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgc3dpdGNoICh0aGlzLl9w b2ludCkgewogICAgICBjYXNlIDE6IHsKICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlz Ll94MywgdGhpcy5feTMpOwogICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAg ICAgYnJlYWs7CiAgICAgIH0KICAgICAgY2FzZSAyOiB7CiAgICAgICAgdGhpcy5fY29udGV4dC5s aW5lVG8odGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0 aCgpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGNhc2UgMzogewogICAgICAgIHRoaXMu cG9pbnQodGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g0LCB0 aGlzLl95NCk7CiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NSwgdGhpcy5feTUpOwogICAgICAg IGJyZWFrOwogICAgICB9CiAgICB9CiAgfSwKICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAg eCA9ICt4LCB5ID0gK3k7CgogICAgaWYgKHRoaXMuX3BvaW50KSB7CiAgICAgIHZhciB4MjMgPSB0 aGlzLl94MiAtIHgsCiAgICAgICAgICB5MjMgPSB0aGlzLl95MiAtIHk7CiAgICAgIHRoaXMuX2wy M19hID0gTWF0aC5zcXJ0KHRoaXMuX2wyM18yYSA9IE1hdGgucG93KHgyMyAqIHgyMyArIHkyMyAq IHkyMywgdGhpcy5fYWxwaGEpKTsKICAgIH0KCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAg ICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl94MyA9IHgsIHRoaXMuX3kzID0geTsg YnJlYWs7CiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl9jb250ZXh0Lm1vdmVU byh0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geSk7IGJyZWFrOwogICAgICBjYXNlIDI6IHRoaXMu X3BvaW50ID0gMzsgdGhpcy5feDUgPSB4LCB0aGlzLl95NSA9IHk7IGJyZWFrOwogICAgICBkZWZh dWx0OiBwb2ludCQ0KHRoaXMsIHgsIHkpOyBicmVhazsKICAgIH0KCiAgICB0aGlzLl9sMDFfYSA9 IHRoaXMuX2wxMl9hLCB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hOwogICAgdGhpcy5fbDAxXzJh ID0gdGhpcy5fbDEyXzJhLCB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmE7CiAgICB0aGlzLl94 MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7CiAgICB0aGlz Ll95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7CiAgfQp9 OwoKdmFyIGNhdG11bGxSb21DbG9zZWQgPSAoZnVuY3Rpb24gY3VzdG9tKGFscGhhKSB7CgogIGZ1 bmN0aW9uIGNhdG11bGxSb20oY29udGV4dCkgewogICAgcmV0dXJuIGFscGhhID8gbmV3IENhdG11 bGxSb21DbG9zZWQoY29udGV4dCwgYWxwaGEpIDogbmV3IENhcmRpbmFsQ2xvc2VkKGNvbnRleHQs IDApOwogIH0KCiAgY2F0bXVsbFJvbS5hbHBoYSA9IGZ1bmN0aW9uKGFscGhhKSB7CiAgICByZXR1 cm4gY3VzdG9tKCthbHBoYSk7CiAgfTsKCiAgcmV0dXJuIGNhdG11bGxSb207Cn0pKDAuNSk7Cgpm dW5jdGlvbiBDYXRtdWxsUm9tT3Blbihjb250ZXh0LCBhbHBoYSkgewogIHRoaXMuX2NvbnRleHQg PSBjb250ZXh0OwogIHRoaXMuX2FscGhhID0gYWxwaGE7Cn0KCkNhdG11bGxSb21PcGVuLnByb3Rv dHlwZSA9IHsKICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IDA7CiAg fSwKICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgfSwKICBs aW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gy ID0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IE5hTjsKICAgIHRoaXMuX2ww MV9hID0gdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYSA9CiAgICB0aGlzLl9sMDFfMmEgPSB0aGlz Ll9sMTJfMmEgPSB0aGlzLl9sMjNfMmEgPQogICAgdGhpcy5fcG9pbnQgPSAwOwogIH0sCiAgbGlu ZUVuZDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0g MCAmJiB0aGlzLl9wb2ludCA9PT0gMykpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICB0 aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgfSwKICBwb2ludDogZnVuY3Rpb24oeCwgeSkg ewogICAgeCA9ICt4LCB5ID0gK3k7CgogICAgaWYgKHRoaXMuX3BvaW50KSB7CiAgICAgIHZhciB4 MjMgPSB0aGlzLl94MiAtIHgsCiAgICAgICAgICB5MjMgPSB0aGlzLl95MiAtIHk7CiAgICAgIHRo aXMuX2wyM19hID0gTWF0aC5zcXJ0KHRoaXMuX2wyM18yYSA9IE1hdGgucG93KHgyMyAqIHgyMyAr IHkyMyAqIHkyMywgdGhpcy5fYWxwaGEpKTsKICAgIH0KCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50 KSB7CiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyBicmVhazsKICAgICAgY2FzZSAxOiB0 aGlzLl9wb2ludCA9IDI7IGJyZWFrOwogICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhp cy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95MikgOiB0aGlz Ll9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhazsKICAgICAgY2FzZSAz OiB0aGlzLl9wb2ludCA9IDQ7IC8vIHByb2NlZWQKICAgICAgZGVmYXVsdDogcG9pbnQkNCh0aGlz LCB4LCB5KTsgYnJlYWs7CiAgICB9CgogICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhp cy5fbDEyX2EgPSB0aGlzLl9sMjNfYTsKICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSwg dGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhOwogICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhp cy5feDEgPSB0aGlzLl94MiwgdGhpcy5feDIgPSB4OwogICAgdGhpcy5feTAgPSB0aGlzLl95MSwg dGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5OwogIH0KfTsKCnZhciBjYXRtdWxsUm9t T3BlbiA9IChmdW5jdGlvbiBjdXN0b20oYWxwaGEpIHsKCiAgZnVuY3Rpb24gY2F0bXVsbFJvbShj b250ZXh0KSB7CiAgICByZXR1cm4gYWxwaGEgPyBuZXcgQ2F0bXVsbFJvbU9wZW4oY29udGV4dCwg YWxwaGEpIDogbmV3IENhcmRpbmFsT3Blbihjb250ZXh0LCAwKTsKICB9CgogIGNhdG11bGxSb20u YWxwaGEgPSBmdW5jdGlvbihhbHBoYSkgewogICAgcmV0dXJuIGN1c3RvbSgrYWxwaGEpOwogIH07 CgogIHJldHVybiBjYXRtdWxsUm9tOwp9KSgwLjUpOwoKZnVuY3Rpb24gTGluZWFyQ2xvc2VkKGNv bnRleHQpIHsKICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKfQoKTGluZWFyQ2xvc2VkLnByb3Rv dHlwZSA9IHsKICBhcmVhU3RhcnQ6IG5vb3AkMywKICBhcmVhRW5kOiBub29wJDMsCiAgbGluZVN0 YXJ0OiBmdW5jdGlvbigpIHsKICAgIHRoaXMuX3BvaW50ID0gMDsKICB9LAogIGxpbmVFbmQ6IGZ1 bmN0aW9uKCkgewogICAgaWYgKHRoaXMuX3BvaW50KSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgp OwogIH0sCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHggPSAreCwgeSA9ICt5OwogICAg aWYgKHRoaXMuX3BvaW50KSB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KTsKICAgIGVsc2UgdGhp cy5fcG9pbnQgPSAxLCB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsKICB9Cn07CgpmdW5jdGlv biBsaW5lYXJDbG9zZWQoY29udGV4dCkgewogIHJldHVybiBuZXcgTGluZWFyQ2xvc2VkKGNvbnRl eHQpOwp9CgpmdW5jdGlvbiBzaWduJDEoeCkgewogIHJldHVybiB4IDwgMCA/IC0xIDogMTsKfQoK Ly8gQ2FsY3VsYXRlIHRoZSBzbG9wZXMgb2YgdGhlIHRhbmdlbnRzIChIZXJtaXRlLXR5cGUgaW50 ZXJwb2xhdGlvbikgYmFzZWQgb24KLy8gdGhlIGZvbGxvd2luZyBwYXBlcjogU3RlZmZlbiwgTS4g MTk5MC4gQSBTaW1wbGUgTWV0aG9kIGZvciBNb25vdG9uaWMKLy8gSW50ZXJwb2xhdGlvbiBpbiBP bmUgRGltZW5zaW9uLiBBc3Ryb25vbXkgYW5kIEFzdHJvcGh5c2ljcywgVm9sLiAyMzksIE5PLgov LyBOT1YoSUkpLCBQLiA0NDMsIDE5OTAuCmZ1bmN0aW9uIHNsb3BlMyh0aGF0LCB4MiwgeTIpIHsK ICB2YXIgaDAgPSB0aGF0Ll94MSAtIHRoYXQuX3gwLAogICAgICBoMSA9IHgyIC0gdGhhdC5feDEs CiAgICAgIHMwID0gKHRoYXQuX3kxIC0gdGhhdC5feTApIC8gKGgwIHx8IGgxIDwgMCAmJiAtMCks CiAgICAgIHMxID0gKHkyIC0gdGhhdC5feTEpIC8gKGgxIHx8IGgwIDwgMCAmJiAtMCksCiAgICAg IHAgPSAoczAgKiBoMSArIHMxICogaDApIC8gKGgwICsgaDEpOwogIHJldHVybiAoc2lnbiQxKHMw KSArIHNpZ24kMShzMSkpICogTWF0aC5taW4oTWF0aC5hYnMoczApLCBNYXRoLmFicyhzMSksIDAu NSAqIE1hdGguYWJzKHApKSB8fCAwOwp9CgovLyBDYWxjdWxhdGUgYSBvbmUtc2lkZWQgc2xvcGUu CmZ1bmN0aW9uIHNsb3BlMih0aGF0LCB0KSB7CiAgdmFyIGggPSB0aGF0Ll94MSAtIHRoYXQuX3gw OwogIHJldHVybiBoID8gKDMgKiAodGhhdC5feTEgLSB0aGF0Ll95MCkgLyBoIC0gdCkgLyAyIDog dDsKfQoKLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N1Ymlj X0hlcm1pdGVfc3BsaW5lI1JlcHJlc2VudGF0aW9ucwovLyAieW91IGNhbiBleHByZXNzIGN1Ymlj IEhlcm1pdGUgaW50ZXJwb2xhdGlvbiBpbiB0ZXJtcyBvZiBjdWJpYyBCw6l6aWVyIGN1cnZlcwov LyB3aXRoIHJlc3BlY3QgdG8gdGhlIGZvdXIgdmFsdWVzIHAwLCBwMCArIG0wIC8gMywgcDEgLSBt MSAvIDMsIHAxIi4KZnVuY3Rpb24gcG9pbnQkNSh0aGF0LCB0MCwgdDEpIHsKICB2YXIgeDAgPSB0 aGF0Ll94MCwKICAgICAgeTAgPSB0aGF0Ll95MCwKICAgICAgeDEgPSB0aGF0Ll94MSwKICAgICAg eTEgPSB0aGF0Ll95MSwKICAgICAgZHggPSAoeDEgLSB4MCkgLyAzOwogIHRoYXQuX2NvbnRleHQu YmV6aWVyQ3VydmVUbyh4MCArIGR4LCB5MCArIGR4ICogdDAsIHgxIC0gZHgsIHkxIC0gZHggKiB0 MSwgeDEsIHkxKTsKfQoKZnVuY3Rpb24gTW9ub3RvbmVYKGNvbnRleHQpIHsKICB0aGlzLl9jb250 ZXh0ID0gY29udGV4dDsKfQoKTW9ub3RvbmVYLnByb3RvdHlwZSA9IHsKICBhcmVhU3RhcnQ6IGZ1 bmN0aW9uKCkgewogICAgdGhpcy5fbGluZSA9IDA7CiAgfSwKICBhcmVhRW5kOiBmdW5jdGlvbigp IHsKICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgfSwKICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewog ICAgdGhpcy5feDAgPSB0aGlzLl94MSA9CiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0KICAgIHRo aXMuX3QwID0gTmFOOwogICAgdGhpcy5fcG9pbnQgPSAwOwogIH0sCiAgbGluZUVuZDogZnVuY3Rp b24oKSB7CiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMjogdGhpcy5fY29u dGV4dC5saW5lVG8odGhpcy5feDEsIHRoaXMuX3kxKTsgYnJlYWs7CiAgICAgIGNhc2UgMzogcG9p bnQkNSh0aGlzLCB0aGlzLl90MCwgc2xvcGUyKHRoaXMsIHRoaXMuX3QwKSk7IGJyZWFrOwogICAg fQogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQg PT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgdGhpcy5fbGluZSA9IDEgLSB0 aGlzLl9saW5lOwogIH0sCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHZhciB0MSA9IE5h TjsKCiAgICB4ID0gK3gsIHkgPSAreTsKICAgIGlmICh4ID09PSB0aGlzLl94MSAmJiB5ID09PSB0 aGlzLl95MSkgcmV0dXJuOyAvLyBJZ25vcmUgY29pbmNpZGVudCBwb2ludHMuCiAgICBzd2l0Y2gg KHRoaXMuX3BvaW50KSB7CiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5l ID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5 KTsgYnJlYWs7CiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhazsKICAgICAgY2Fz ZSAyOiB0aGlzLl9wb2ludCA9IDM7IHBvaW50JDUodGhpcywgc2xvcGUyKHRoaXMsIHQxID0gc2xv cGUzKHRoaXMsIHgsIHkpKSwgdDEpOyBicmVhazsKICAgICAgZGVmYXVsdDogcG9pbnQkNSh0aGlz LCB0aGlzLl90MCwgdDEgPSBzbG9wZTModGhpcywgeCwgeSkpOyBicmVhazsKICAgIH0KCiAgICB0 aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7CiAgICB0aGlzLl95MCA9IHRoaXMuX3kx LCB0aGlzLl95MSA9IHk7CiAgICB0aGlzLl90MCA9IHQxOwogIH0KfTsKCmZ1bmN0aW9uIE1vbm90 b25lWShjb250ZXh0KSB7CiAgdGhpcy5fY29udGV4dCA9IG5ldyBSZWZsZWN0Q29udGV4dChjb250 ZXh0KTsKfQoKKE1vbm90b25lWS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE1vbm90b25lWC5w cm90b3R5cGUpKS5wb2ludCA9IGZ1bmN0aW9uKHgsIHkpIHsKICBNb25vdG9uZVgucHJvdG90eXBl LnBvaW50LmNhbGwodGhpcywgeSwgeCk7Cn07CgpmdW5jdGlvbiBSZWZsZWN0Q29udGV4dChjb250 ZXh0KSB7CiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7Cn0KClJlZmxlY3RDb250ZXh0LnByb3Rv dHlwZSA9IHsKICBtb3ZlVG86IGZ1bmN0aW9uKHgsIHkpIHsgdGhpcy5fY29udGV4dC5tb3ZlVG8o eSwgeCk7IH0sCiAgY2xvc2VQYXRoOiBmdW5jdGlvbigpIHsgdGhpcy5fY29udGV4dC5jbG9zZVBh dGgoKTsgfSwKICBsaW5lVG86IGZ1bmN0aW9uKHgsIHkpIHsgdGhpcy5fY29udGV4dC5saW5lVG8o eSwgeCk7IH0sCiAgYmV6aWVyQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgsIHkp IHsgdGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHkxLCB4MSwgeTIsIHgyLCB5LCB4KTsgfQp9 OwoKZnVuY3Rpb24gbW9ub3RvbmVYKGNvbnRleHQpIHsKICByZXR1cm4gbmV3IE1vbm90b25lWChj b250ZXh0KTsKfQoKZnVuY3Rpb24gbW9ub3RvbmVZKGNvbnRleHQpIHsKICByZXR1cm4gbmV3IE1v bm90b25lWShjb250ZXh0KTsKfQoKZnVuY3Rpb24gTmF0dXJhbChjb250ZXh0KSB7CiAgdGhpcy5f Y29udGV4dCA9IGNvbnRleHQ7Cn0KCk5hdHVyYWwucHJvdG90eXBlID0gewogIGFyZWFTdGFydDog ZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gMDsKICB9LAogIGFyZWFFbmQ6IGZ1bmN0aW9u KCkgewogICAgdGhpcy5fbGluZSA9IE5hTjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7 CiAgICB0aGlzLl94ID0gW107CiAgICB0aGlzLl95ID0gW107CiAgfSwKICBsaW5lRW5kOiBmdW5j dGlvbigpIHsKICAgIHZhciB4ID0gdGhpcy5feCwKICAgICAgICB5ID0gdGhpcy5feSwKICAgICAg ICBuID0geC5sZW5ndGg7CgogICAgaWYgKG4pIHsKICAgICAgdGhpcy5fbGluZSA/IHRoaXMuX2Nv bnRleHQubGluZVRvKHhbMF0sIHlbMF0pIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeFswXSwgeVsw XSk7CiAgICAgIGlmIChuID09PSAyKSB7CiAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeFsx XSwgeVsxXSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHB4ID0gY29udHJvbFBvaW50cyh4 KSwKICAgICAgICAgICAgcHkgPSBjb250cm9sUG9pbnRzKHkpOwogICAgICAgIGZvciAodmFyIGkw ID0gMCwgaTEgPSAxOyBpMSA8IG47ICsraTAsICsraTEpIHsKICAgICAgICAgIHRoaXMuX2NvbnRl eHQuYmV6aWVyQ3VydmVUbyhweFswXVtpMF0sIHB5WzBdW2kwXSwgcHhbMV1baTBdLCBweVsxXVtp MF0sIHhbaTFdLCB5W2kxXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKHRoaXMu X2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgbiA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xv c2VQYXRoKCk7CiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgICB0aGlzLl94ID0g dGhpcy5feSA9IG51bGw7CiAgfSwKICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgdGhpcy5f eC5wdXNoKCt4KTsKICAgIHRoaXMuX3kucHVzaCgreSk7CiAgfQp9OwoKLy8gU2VlIGh0dHBzOi8v d3d3LnBhcnRpY2xlaW5jZWxsLmNvbS8yMDEyL2Jlemllci1zcGxpbmVzLyBmb3IgZGVyaXZhdGlv bi4KZnVuY3Rpb24gY29udHJvbFBvaW50cyh4KSB7CiAgdmFyIGksCiAgICAgIG4gPSB4Lmxlbmd0 aCAtIDEsCiAgICAgIG0sCiAgICAgIGEgPSBuZXcgQXJyYXkobiksCiAgICAgIGIgPSBuZXcgQXJy YXkobiksCiAgICAgIHIgPSBuZXcgQXJyYXkobik7CiAgYVswXSA9IDAsIGJbMF0gPSAyLCByWzBd ID0geFswXSArIDIgKiB4WzFdOwogIGZvciAoaSA9IDE7IGkgPCBuIC0gMTsgKytpKSBhW2ldID0g MSwgYltpXSA9IDQsIHJbaV0gPSA0ICogeFtpXSArIDIgKiB4W2kgKyAxXTsKICBhW24gLSAxXSA9 IDIsIGJbbiAtIDFdID0gNywgcltuIC0gMV0gPSA4ICogeFtuIC0gMV0gKyB4W25dOwogIGZvciAo aSA9IDE7IGkgPCBuOyArK2kpIG0gPSBhW2ldIC8gYltpIC0gMV0sIGJbaV0gLT0gbSwgcltpXSAt PSBtICogcltpIC0gMV07CiAgYVtuIC0gMV0gPSByW24gLSAxXSAvIGJbbiAtIDFdOwogIGZvciAo aSA9IG4gLSAyOyBpID49IDA7IC0taSkgYVtpXSA9IChyW2ldIC0gYVtpICsgMV0pIC8gYltpXTsK ICBiW24gLSAxXSA9ICh4W25dICsgYVtuIC0gMV0pIC8gMjsKICBmb3IgKGkgPSAwOyBpIDwgbiAt IDE7ICsraSkgYltpXSA9IDIgKiB4W2kgKyAxXSAtIGFbaSArIDFdOwogIHJldHVybiBbYSwgYl07 Cn0KCmZ1bmN0aW9uIG5hdHVyYWwoY29udGV4dCkgewogIHJldHVybiBuZXcgTmF0dXJhbChjb250 ZXh0KTsKfQoKZnVuY3Rpb24gU3RlcChjb250ZXh0LCB0KSB7CiAgdGhpcy5fY29udGV4dCA9IGNv bnRleHQ7CiAgdGhpcy5fdCA9IHQ7Cn0KClN0ZXAucHJvdG90eXBlID0gewogIGFyZWFTdGFydDog ZnVuY3Rpb24oKSB7CiAgICB0aGlzLl9saW5lID0gMDsKICB9LAogIGFyZWFFbmQ6IGZ1bmN0aW9u KCkgewogICAgdGhpcy5fbGluZSA9IE5hTjsKICB9LAogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7 CiAgICB0aGlzLl94ID0gdGhpcy5feSA9IE5hTjsKICAgIHRoaXMuX3BvaW50ID0gMDsKICB9LAog IGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKDAgPCB0aGlzLl90ICYmIHRoaXMuX3QgPCAx ICYmIHRoaXMuX3BvaW50ID09PSAyKSB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94LCB0aGlz Ll95KTsKICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3Bv aW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgIGlmICh0aGlzLl9saW5l ID49IDApIHRoaXMuX3QgPSAxIC0gdGhpcy5fdCwgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5l OwogIH0sCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgIHggPSAreCwgeSA9ICt5OwogICAg c3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhp cy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3Zl VG8oeCwgeSk7IGJyZWFrOwogICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgLy8gcHJvY2Vl ZAogICAgICBkZWZhdWx0OiB7CiAgICAgICAgaWYgKHRoaXMuX3QgPD0gMCkgewogICAgICAgICAg dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCwgeSk7CiAgICAgICAgICB0aGlzLl9jb250ZXh0 LmxpbmVUbyh4LCB5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHgxID0gdGhpcy5f eCAqICgxIC0gdGhpcy5fdCkgKyB4ICogdGhpcy5fdDsKICAgICAgICAgIHRoaXMuX2NvbnRleHQu bGluZVRvKHgxLCB0aGlzLl95KTsKICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHgxLCB5 KTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHRoaXMuX3ggPSB4 LCB0aGlzLl95ID0geTsKICB9Cn07CgpmdW5jdGlvbiBzdGVwKGNvbnRleHQpIHsKICByZXR1cm4g bmV3IFN0ZXAoY29udGV4dCwgMC41KTsKfQoKZnVuY3Rpb24gc3RlcEJlZm9yZShjb250ZXh0KSB7 CiAgcmV0dXJuIG5ldyBTdGVwKGNvbnRleHQsIDApOwp9CgpmdW5jdGlvbiBzdGVwQWZ0ZXIoY29u dGV4dCkgewogIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAxKTsKfQoKZnVuY3Rpb24gbm9uZSQx KHNlcmllcywgb3JkZXIpIHsKICBpZiAoISgobiA9IHNlcmllcy5sZW5ndGgpID4gMSkpIHJldHVy bjsKICBmb3IgKHZhciBpID0gMSwgaiwgczAsIHMxID0gc2VyaWVzW29yZGVyWzBdXSwgbiwgbSA9 IHMxLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgczAgPSBzMSwgczEgPSBzZXJpZXNbb3JkZXJb aV1dOwogICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgewogICAgICBzMVtqXVsxXSArPSBzMVtq XVswXSA9IGlzTmFOKHMwW2pdWzFdKSA/IHMwW2pdWzBdIDogczBbal1bMV07CiAgICB9CiAgfQp9 CgpmdW5jdGlvbiBub25lJDIoc2VyaWVzKSB7CiAgdmFyIG4gPSBzZXJpZXMubGVuZ3RoLCBvID0g bmV3IEFycmF5KG4pOwogIHdoaWxlICgtLW4gPj0gMCkgb1tuXSA9IG47CiAgcmV0dXJuIG87Cn0K CmZ1bmN0aW9uIHN0YWNrVmFsdWUoZCwga2V5KSB7CiAgcmV0dXJuIGRba2V5XTsKfQoKZnVuY3Rp b24gc3RhY2soKSB7CiAgdmFyIGtleXMgPSBjb25zdGFudCRiKFtdKSwKICAgICAgb3JkZXIgPSBu b25lJDIsCiAgICAgIG9mZnNldCA9IG5vbmUkMSwKICAgICAgdmFsdWUgPSBzdGFja1ZhbHVlOwoK ICBmdW5jdGlvbiBzdGFjayhkYXRhKSB7CiAgICB2YXIga3ogPSBrZXlzLmFwcGx5KHRoaXMsIGFy Z3VtZW50cyksCiAgICAgICAgaSwKICAgICAgICBtID0gZGF0YS5sZW5ndGgsCiAgICAgICAgbiA9 IGt6Lmxlbmd0aCwKICAgICAgICBzeiA9IG5ldyBBcnJheShuKSwKICAgICAgICBvejsKCiAgICBm b3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIGZvciAodmFyIGtpID0ga3pbaV0sIHNpID0g c3pbaV0gPSBuZXcgQXJyYXkobSksIGogPSAwLCBzaWo7IGogPCBtOyArK2opIHsKICAgICAgICBz aVtqXSA9IHNpaiA9IFswLCArdmFsdWUoZGF0YVtqXSwga2ksIGosIGRhdGEpXTsKICAgICAgICBz aWouZGF0YSA9IGRhdGFbal07CiAgICAgIH0KICAgICAgc2kua2V5ID0ga2k7CiAgICB9CgogICAg Zm9yIChpID0gMCwgb3ogPSBvcmRlcihzeik7IGkgPCBuOyArK2kpIHsKICAgICAgc3pbb3pbaV1d LmluZGV4ID0gaTsKICAgIH0KCiAgICBvZmZzZXQoc3osIG96KTsKICAgIHJldHVybiBzejsKICB9 CgogIHN0YWNrLmtleXMgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/IChrZXlzID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYihzbGlj ZSQ2LmNhbGwoXykpLCBzdGFjaykgOiBrZXlzOwogIH07CgogIHN0YWNrLnZhbHVlID0gZnVuY3Rp b24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWUgPSB0eXBlb2YgXyA9 PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCtfKSwgc3RhY2spIDogdmFsdWU7CiAgfTsK CiAgc3RhY2sub3JkZXIgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0 aCA/IChvcmRlciA9IF8gPT0gbnVsbCA/IG5vbmUkMiA6IHR5cGVvZiBfID09PSAiZnVuY3Rpb24i ID8gXyA6IGNvbnN0YW50JGIoc2xpY2UkNi5jYWxsKF8pKSwgc3RhY2spIDogb3JkZXI7CiAgfTsK CiAgc3RhY2sub2Zmc2V0ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5n dGggPyAob2Zmc2V0ID0gXyA9PSBudWxsID8gbm9uZSQxIDogXywgc3RhY2spIDogb2Zmc2V0Owog IH07CgogIHJldHVybiBzdGFjazsKfQoKZnVuY3Rpb24gZXhwYW5kKHNlcmllcywgb3JkZXIpIHsK ICBpZiAoISgobiA9IHNlcmllcy5sZW5ndGgpID4gMCkpIHJldHVybjsKICBmb3IgKHZhciBpLCBu LCBqID0gMCwgbSA9IHNlcmllc1swXS5sZW5ndGgsIHk7IGogPCBtOyArK2opIHsKICAgIGZvciAo eSA9IGkgPSAwOyBpIDwgbjsgKytpKSB5ICs9IHNlcmllc1tpXVtqXVsxXSB8fCAwOwogICAgaWYg KHkpIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHNlcmllc1tpXVtqXVsxXSAvPSB5OwogIH0KICBu b25lJDEoc2VyaWVzLCBvcmRlcik7Cn0KCmZ1bmN0aW9uIGRpdmVyZ2luZyQxKHNlcmllcywgb3Jk ZXIpIHsKICBpZiAoISgobiA9IHNlcmllcy5sZW5ndGgpID4gMCkpIHJldHVybjsKICBmb3IgKHZh ciBpLCBqID0gMCwgZCwgZHksIHlwLCB5biwgbiwgbSA9IHNlcmllc1tvcmRlclswXV0ubGVuZ3Ro OyBqIDwgbTsgKytqKSB7CiAgICBmb3IgKHlwID0geW4gPSAwLCBpID0gMDsgaSA8IG47ICsraSkg ewogICAgICBpZiAoKGR5ID0gKGQgPSBzZXJpZXNbb3JkZXJbaV1dW2pdKVsxXSAtIGRbMF0pID4g MCkgewogICAgICAgIGRbMF0gPSB5cCwgZFsxXSA9IHlwICs9IGR5OwogICAgICB9IGVsc2UgaWYg KGR5IDwgMCkgewogICAgICAgIGRbMV0gPSB5biwgZFswXSA9IHluICs9IGR5OwogICAgICB9IGVs c2UgewogICAgICAgIGRbMF0gPSAwLCBkWzFdID0gZHk7CiAgICAgIH0KICAgIH0KICB9Cn0KCmZ1 bmN0aW9uIHNpbGhvdWV0dGUoc2VyaWVzLCBvcmRlcikgewogIGlmICghKChuID0gc2VyaWVzLmxl bmd0aCkgPiAwKSkgcmV0dXJuOwogIGZvciAodmFyIGogPSAwLCBzMCA9IHNlcmllc1tvcmRlclsw XV0sIG4sIG0gPSBzMC5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgIGZvciAodmFyIGkgPSAwLCB5 ID0gMDsgaSA8IG47ICsraSkgeSArPSBzZXJpZXNbaV1bal1bMV0gfHwgMDsKICAgIHMwW2pdWzFd ICs9IHMwW2pdWzBdID0gLXkgLyAyOwogIH0KICBub25lJDEoc2VyaWVzLCBvcmRlcik7Cn0KCmZ1 bmN0aW9uIHdpZ2dsZShzZXJpZXMsIG9yZGVyKSB7CiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3Ro KSA+IDApIHx8ICEoKG0gPSAoczAgPSBzZXJpZXNbb3JkZXJbMF1dKS5sZW5ndGgpID4gMCkpIHJl dHVybjsKICBmb3IgKHZhciB5ID0gMCwgaiA9IDEsIHMwLCBtLCBuOyBqIDwgbTsgKytqKSB7CiAg ICBmb3IgKHZhciBpID0gMCwgczEgPSAwLCBzMiA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgdmFy IHNpID0gc2VyaWVzW29yZGVyW2ldXSwKICAgICAgICAgIHNpajAgPSBzaVtqXVsxXSB8fCAwLAog ICAgICAgICAgc2lqMSA9IHNpW2ogLSAxXVsxXSB8fCAwLAogICAgICAgICAgczMgPSAoc2lqMCAt IHNpajEpIC8gMjsKICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBpOyArK2spIHsKICAgICAgICB2 YXIgc2sgPSBzZXJpZXNbb3JkZXJba11dLAogICAgICAgICAgICBza2owID0gc2tbal1bMV0gfHwg MCwKICAgICAgICAgICAgc2tqMSA9IHNrW2ogLSAxXVsxXSB8fCAwOwogICAgICAgIHMzICs9IHNr ajAgLSBza2oxOwogICAgICB9CiAgICAgIHMxICs9IHNpajAsIHMyICs9IHMzICogc2lqMDsKICAg IH0KICAgIHMwW2ogLSAxXVsxXSArPSBzMFtqIC0gMV1bMF0gPSB5OwogICAgaWYgKHMxKSB5IC09 IHMyIC8gczE7CiAgfQogIHMwW2ogLSAxXVsxXSArPSBzMFtqIC0gMV1bMF0gPSB5OwogIG5vbmUk MShzZXJpZXMsIG9yZGVyKTsKfQoKZnVuY3Rpb24gYXBwZWFyYW5jZShzZXJpZXMpIHsKICB2YXIg cGVha3MgPSBzZXJpZXMubWFwKHBlYWspOwogIHJldHVybiBub25lJDIoc2VyaWVzKS5zb3J0KGZ1 bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHBlYWtzW2FdIC0gcGVha3NbYl07IH0pOwp9CgpmdW5jdGlv biBwZWFrKHNlcmllcykgewogIHZhciBpID0gLTEsIGogPSAwLCBuID0gc2VyaWVzLmxlbmd0aCwg dmksIHZqID0gLUluZmluaXR5OwogIHdoaWxlICgrK2kgPCBuKSBpZiAoKHZpID0gK3Nlcmllc1tp XVsxXSkgPiB2aikgdmogPSB2aSwgaiA9IGk7CiAgcmV0dXJuIGo7Cn0KCmZ1bmN0aW9uIGFzY2Vu ZGluZyQzKHNlcmllcykgewogIHZhciBzdW1zID0gc2VyaWVzLm1hcChzdW0kMik7CiAgcmV0dXJu IG5vbmUkMihzZXJpZXMpLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gc3Vtc1thXSAtIHN1 bXNbYl07IH0pOwp9CgpmdW5jdGlvbiBzdW0kMihzZXJpZXMpIHsKICB2YXIgcyA9IDAsIGkgPSAt MSwgbiA9IHNlcmllcy5sZW5ndGgsIHY7CiAgd2hpbGUgKCsraSA8IG4pIGlmICh2ID0gK3Nlcmll c1tpXVsxXSkgcyArPSB2OwogIHJldHVybiBzOwp9CgpmdW5jdGlvbiBkZXNjZW5kaW5nJDIoc2Vy aWVzKSB7CiAgcmV0dXJuIGFzY2VuZGluZyQzKHNlcmllcykucmV2ZXJzZSgpOwp9CgpmdW5jdGlv biBpbnNpZGVPdXQoc2VyaWVzKSB7CiAgdmFyIG4gPSBzZXJpZXMubGVuZ3RoLAogICAgICBpLAog ICAgICBqLAogICAgICBzdW1zID0gc2VyaWVzLm1hcChzdW0kMiksCiAgICAgIG9yZGVyID0gYXBw ZWFyYW5jZShzZXJpZXMpLAogICAgICB0b3AgPSAwLAogICAgICBib3R0b20gPSAwLAogICAgICB0 b3BzID0gW10sCiAgICAgIGJvdHRvbXMgPSBbXTsKCiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkg ewogICAgaiA9IG9yZGVyW2ldOwogICAgaWYgKHRvcCA8IGJvdHRvbSkgewogICAgICB0b3AgKz0g c3Vtc1tqXTsKICAgICAgdG9wcy5wdXNoKGopOwogICAgfSBlbHNlIHsKICAgICAgYm90dG9tICs9 IHN1bXNbal07CiAgICAgIGJvdHRvbXMucHVzaChqKTsKICAgIH0KICB9CgogIHJldHVybiBib3R0 b21zLnJldmVyc2UoKS5jb25jYXQodG9wcyk7Cn0KCmZ1bmN0aW9uIHJldmVyc2Uoc2VyaWVzKSB7 CiAgcmV0dXJuIG5vbmUkMihzZXJpZXMpLnJldmVyc2UoKTsKfQoKZnVuY3Rpb24gY29uc3RhbnQk Yyh4KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHg7CiAgfTsKfQoKZnVuY3Rp b24geCQ0KGQpIHsKICByZXR1cm4gZFswXTsKfQoKZnVuY3Rpb24geSQ0KGQpIHsKICByZXR1cm4g ZFsxXTsKfQoKZnVuY3Rpb24gUmVkQmxhY2tUcmVlKCkgewogIHRoaXMuXyA9IG51bGw7IC8vIHJv b3Qgbm9kZQp9CgpmdW5jdGlvbiBSZWRCbGFja05vZGUobm9kZSkgewogIG5vZGUuVSA9IC8vIHBh cmVudCBub2RlCiAgbm9kZS5DID0gLy8gY29sb3IgLSB0cnVlIGZvciByZWQsIGZhbHNlIGZvciBi bGFjawogIG5vZGUuTCA9IC8vIGxlZnQgbm9kZQogIG5vZGUuUiA9IC8vIHJpZ2h0IG5vZGUKICBu b2RlLlAgPSAvLyBwcmV2aW91cyBub2RlCiAgbm9kZS5OID0gbnVsbDsgLy8gbmV4dCBub2RlCn0K ClJlZEJsYWNrVHJlZS5wcm90b3R5cGUgPSB7CiAgY29uc3RydWN0b3I6IFJlZEJsYWNrVHJlZSwK CiAgaW5zZXJ0OiBmdW5jdGlvbihhZnRlciwgbm9kZSkgewogICAgdmFyIHBhcmVudCwgZ3JhbmRw YSwgdW5jbGU7CgogICAgaWYgKGFmdGVyKSB7CiAgICAgIG5vZGUuUCA9IGFmdGVyOwogICAgICBu b2RlLk4gPSBhZnRlci5OOwogICAgICBpZiAoYWZ0ZXIuTikgYWZ0ZXIuTi5QID0gbm9kZTsKICAg ICAgYWZ0ZXIuTiA9IG5vZGU7CiAgICAgIGlmIChhZnRlci5SKSB7CiAgICAgICAgYWZ0ZXIgPSBh ZnRlci5SOwogICAgICAgIHdoaWxlIChhZnRlci5MKSBhZnRlciA9IGFmdGVyLkw7CiAgICAgICAg YWZ0ZXIuTCA9IG5vZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWZ0ZXIuUiA9IG5vZGU7CiAg ICAgIH0KICAgICAgcGFyZW50ID0gYWZ0ZXI7CiAgICB9IGVsc2UgaWYgKHRoaXMuXykgewogICAg ICBhZnRlciA9IFJlZEJsYWNrRmlyc3QodGhpcy5fKTsKICAgICAgbm9kZS5QID0gbnVsbDsKICAg ICAgbm9kZS5OID0gYWZ0ZXI7CiAgICAgIGFmdGVyLlAgPSBhZnRlci5MID0gbm9kZTsKICAgICAg cGFyZW50ID0gYWZ0ZXI7CiAgICB9IGVsc2UgewogICAgICBub2RlLlAgPSBub2RlLk4gPSBudWxs OwogICAgICB0aGlzLl8gPSBub2RlOwogICAgICBwYXJlbnQgPSBudWxsOwogICAgfQogICAgbm9k ZS5MID0gbm9kZS5SID0gbnVsbDsKICAgIG5vZGUuVSA9IHBhcmVudDsKICAgIG5vZGUuQyA9IHRy dWU7CgogICAgYWZ0ZXIgPSBub2RlOwogICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQuQykgewog ICAgICBncmFuZHBhID0gcGFyZW50LlU7CiAgICAgIGlmIChwYXJlbnQgPT09IGdyYW5kcGEuTCkg ewogICAgICAgIHVuY2xlID0gZ3JhbmRwYS5SOwogICAgICAgIGlmICh1bmNsZSAmJiB1bmNsZS5D KSB7CiAgICAgICAgICBwYXJlbnQuQyA9IHVuY2xlLkMgPSBmYWxzZTsKICAgICAgICAgIGdyYW5k cGEuQyA9IHRydWU7CiAgICAgICAgICBhZnRlciA9IGdyYW5kcGE7CiAgICAgICAgfSBlbHNlIHsK ICAgICAgICAgIGlmIChhZnRlciA9PT0gcGFyZW50LlIpIHsKICAgICAgICAgICAgUmVkQmxhY2tS b3RhdGVMZWZ0KHRoaXMsIHBhcmVudCk7CiAgICAgICAgICAgIGFmdGVyID0gcGFyZW50OwogICAg ICAgICAgICBwYXJlbnQgPSBhZnRlci5VOwogICAgICAgICAgfQogICAgICAgICAgcGFyZW50LkMg PSBmYWxzZTsKICAgICAgICAgIGdyYW5kcGEuQyA9IHRydWU7CiAgICAgICAgICBSZWRCbGFja1Jv dGF0ZVJpZ2h0KHRoaXMsIGdyYW5kcGEpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAg ICB1bmNsZSA9IGdyYW5kcGEuTDsKICAgICAgICBpZiAodW5jbGUgJiYgdW5jbGUuQykgewogICAg ICAgICAgcGFyZW50LkMgPSB1bmNsZS5DID0gZmFsc2U7CiAgICAgICAgICBncmFuZHBhLkMgPSB0 cnVlOwogICAgICAgICAgYWZ0ZXIgPSBncmFuZHBhOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAg ICBpZiAoYWZ0ZXIgPT09IHBhcmVudC5MKSB7CiAgICAgICAgICAgIFJlZEJsYWNrUm90YXRlUmln aHQodGhpcywgcGFyZW50KTsKICAgICAgICAgICAgYWZ0ZXIgPSBwYXJlbnQ7CiAgICAgICAgICAg IHBhcmVudCA9IGFmdGVyLlU7CiAgICAgICAgICB9CiAgICAgICAgICBwYXJlbnQuQyA9IGZhbHNl OwogICAgICAgICAgZ3JhbmRwYS5DID0gdHJ1ZTsKICAgICAgICAgIFJlZEJsYWNrUm90YXRlTGVm dCh0aGlzLCBncmFuZHBhKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcGFyZW50ID0gYWZ0ZXIu VTsKICAgIH0KICAgIHRoaXMuXy5DID0gZmFsc2U7CiAgfSwKCiAgcmVtb3ZlOiBmdW5jdGlvbihu b2RlKSB7CiAgICBpZiAobm9kZS5OKSBub2RlLk4uUCA9IG5vZGUuUDsKICAgIGlmIChub2RlLlAp IG5vZGUuUC5OID0gbm9kZS5OOwogICAgbm9kZS5OID0gbm9kZS5QID0gbnVsbDsKCiAgICB2YXIg cGFyZW50ID0gbm9kZS5VLAogICAgICAgIHNpYmxpbmcsCiAgICAgICAgbGVmdCA9IG5vZGUuTCwK ICAgICAgICByaWdodCA9IG5vZGUuUiwKICAgICAgICBuZXh0LAogICAgICAgIHJlZDsKCiAgICBp ZiAoIWxlZnQpIG5leHQgPSByaWdodDsKICAgIGVsc2UgaWYgKCFyaWdodCkgbmV4dCA9IGxlZnQ7 CiAgICBlbHNlIG5leHQgPSBSZWRCbGFja0ZpcnN0KHJpZ2h0KTsKCiAgICBpZiAocGFyZW50KSB7 CiAgICAgIGlmIChwYXJlbnQuTCA9PT0gbm9kZSkgcGFyZW50LkwgPSBuZXh0OwogICAgICBlbHNl IHBhcmVudC5SID0gbmV4dDsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuXyA9IG5leHQ7CiAgICB9 CgogICAgaWYgKGxlZnQgJiYgcmlnaHQpIHsKICAgICAgcmVkID0gbmV4dC5DOwogICAgICBuZXh0 LkMgPSBub2RlLkM7CiAgICAgIG5leHQuTCA9IGxlZnQ7CiAgICAgIGxlZnQuVSA9IG5leHQ7CiAg ICAgIGlmIChuZXh0ICE9PSByaWdodCkgewogICAgICAgIHBhcmVudCA9IG5leHQuVTsKICAgICAg ICBuZXh0LlUgPSBub2RlLlU7CiAgICAgICAgbm9kZSA9IG5leHQuUjsKICAgICAgICBwYXJlbnQu TCA9IG5vZGU7CiAgICAgICAgbmV4dC5SID0gcmlnaHQ7CiAgICAgICAgcmlnaHQuVSA9IG5leHQ7 CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmV4dC5VID0gcGFyZW50OwogICAgICAgIHBhcmVudCA9 IG5leHQ7CiAgICAgICAgbm9kZSA9IG5leHQuUjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAg cmVkID0gbm9kZS5DOwogICAgICBub2RlID0gbmV4dDsKICAgIH0KCiAgICBpZiAobm9kZSkgbm9k ZS5VID0gcGFyZW50OwogICAgaWYgKHJlZCkgcmV0dXJuOwogICAgaWYgKG5vZGUgJiYgbm9kZS5D KSB7IG5vZGUuQyA9IGZhbHNlOyByZXR1cm47IH0KCiAgICBkbyB7CiAgICAgIGlmIChub2RlID09 PSB0aGlzLl8pIGJyZWFrOwogICAgICBpZiAobm9kZSA9PT0gcGFyZW50LkwpIHsKICAgICAgICBz aWJsaW5nID0gcGFyZW50LlI7CiAgICAgICAgaWYgKHNpYmxpbmcuQykgewogICAgICAgICAgc2li bGluZy5DID0gZmFsc2U7CiAgICAgICAgICBwYXJlbnQuQyA9IHRydWU7CiAgICAgICAgICBSZWRC bGFja1JvdGF0ZUxlZnQodGhpcywgcGFyZW50KTsKICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnQu UjsKICAgICAgICB9CiAgICAgICAgaWYgKChzaWJsaW5nLkwgJiYgc2libGluZy5MLkMpCiAgICAg ICAgICAgIHx8IChzaWJsaW5nLlIgJiYgc2libGluZy5SLkMpKSB7CiAgICAgICAgICBpZiAoIXNp YmxpbmcuUiB8fCAhc2libGluZy5SLkMpIHsKICAgICAgICAgICAgc2libGluZy5MLkMgPSBmYWxz ZTsKICAgICAgICAgICAgc2libGluZy5DID0gdHJ1ZTsKICAgICAgICAgICAgUmVkQmxhY2tSb3Rh dGVSaWdodCh0aGlzLCBzaWJsaW5nKTsKICAgICAgICAgICAgc2libGluZyA9IHBhcmVudC5SOwog ICAgICAgICAgfQogICAgICAgICAgc2libGluZy5DID0gcGFyZW50LkM7CiAgICAgICAgICBwYXJl bnQuQyA9IHNpYmxpbmcuUi5DID0gZmFsc2U7CiAgICAgICAgICBSZWRCbGFja1JvdGF0ZUxlZnQo dGhpcywgcGFyZW50KTsKICAgICAgICAgIG5vZGUgPSB0aGlzLl87CiAgICAgICAgICBicmVhazsK ICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2libGluZyA9IHBhcmVudC5MOwogICAg ICAgIGlmIChzaWJsaW5nLkMpIHsKICAgICAgICAgIHNpYmxpbmcuQyA9IGZhbHNlOwogICAgICAg ICAgcGFyZW50LkMgPSB0cnVlOwogICAgICAgICAgUmVkQmxhY2tSb3RhdGVSaWdodCh0aGlzLCBw YXJlbnQpOwogICAgICAgICAgc2libGluZyA9IHBhcmVudC5MOwogICAgICAgIH0KICAgICAgICBp ZiAoKHNpYmxpbmcuTCAmJiBzaWJsaW5nLkwuQykKICAgICAgICAgIHx8IChzaWJsaW5nLlIgJiYg c2libGluZy5SLkMpKSB7CiAgICAgICAgICBpZiAoIXNpYmxpbmcuTCB8fCAhc2libGluZy5MLkMp IHsKICAgICAgICAgICAgc2libGluZy5SLkMgPSBmYWxzZTsKICAgICAgICAgICAgc2libGluZy5D ID0gdHJ1ZTsKICAgICAgICAgICAgUmVkQmxhY2tSb3RhdGVMZWZ0KHRoaXMsIHNpYmxpbmcpOwog ICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50Lkw7CiAgICAgICAgICB9CiAgICAgICAgICBzaWJs aW5nLkMgPSBwYXJlbnQuQzsKICAgICAgICAgIHBhcmVudC5DID0gc2libGluZy5MLkMgPSBmYWxz ZTsKICAgICAgICAgIFJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgcGFyZW50KTsKICAgICAgICAg IG5vZGUgPSB0aGlzLl87CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAg c2libGluZy5DID0gdHJ1ZTsKICAgICAgbm9kZSA9IHBhcmVudDsKICAgICAgcGFyZW50ID0gcGFy ZW50LlU7CiAgICB9IHdoaWxlICghbm9kZS5DKTsKCiAgICBpZiAobm9kZSkgbm9kZS5DID0gZmFs c2U7CiAgfQp9OwoKZnVuY3Rpb24gUmVkQmxhY2tSb3RhdGVMZWZ0KHRyZWUsIG5vZGUpIHsKICB2 YXIgcCA9IG5vZGUsCiAgICAgIHEgPSBub2RlLlIsCiAgICAgIHBhcmVudCA9IHAuVTsKCiAgaWYg KHBhcmVudCkgewogICAgaWYgKHBhcmVudC5MID09PSBwKSBwYXJlbnQuTCA9IHE7CiAgICBlbHNl IHBhcmVudC5SID0gcTsKICB9IGVsc2UgewogICAgdHJlZS5fID0gcTsKICB9CgogIHEuVSA9IHBh cmVudDsKICBwLlUgPSBxOwogIHAuUiA9IHEuTDsKICBpZiAocC5SKSBwLlIuVSA9IHA7CiAgcS5M ID0gcDsKfQoKZnVuY3Rpb24gUmVkQmxhY2tSb3RhdGVSaWdodCh0cmVlLCBub2RlKSB7CiAgdmFy IHAgPSBub2RlLAogICAgICBxID0gbm9kZS5MLAogICAgICBwYXJlbnQgPSBwLlU7CgogIGlmIChw YXJlbnQpIHsKICAgIGlmIChwYXJlbnQuTCA9PT0gcCkgcGFyZW50LkwgPSBxOwogICAgZWxzZSBw YXJlbnQuUiA9IHE7CiAgfSBlbHNlIHsKICAgIHRyZWUuXyA9IHE7CiAgfQoKICBxLlUgPSBwYXJl bnQ7CiAgcC5VID0gcTsKICBwLkwgPSBxLlI7CiAgaWYgKHAuTCkgcC5MLlUgPSBwOwogIHEuUiA9 IHA7Cn0KCmZ1bmN0aW9uIFJlZEJsYWNrRmlyc3Qobm9kZSkgewogIHdoaWxlIChub2RlLkwpIG5v ZGUgPSBub2RlLkw7CiAgcmV0dXJuIG5vZGU7Cn0KCmZ1bmN0aW9uIGNyZWF0ZUVkZ2UobGVmdCwg cmlnaHQsIHYwLCB2MSkgewogIHZhciBlZGdlID0gW251bGwsIG51bGxdLAogICAgICBpbmRleCA9 IGVkZ2VzLnB1c2goZWRnZSkgLSAxOwogIGVkZ2UubGVmdCA9IGxlZnQ7CiAgZWRnZS5yaWdodCA9 IHJpZ2h0OwogIGlmICh2MCkgc2V0RWRnZUVuZChlZGdlLCBsZWZ0LCByaWdodCwgdjApOwogIGlm ICh2MSkgc2V0RWRnZUVuZChlZGdlLCByaWdodCwgbGVmdCwgdjEpOwogIGNlbGxzW2xlZnQuaW5k ZXhdLmhhbGZlZGdlcy5wdXNoKGluZGV4KTsKICBjZWxsc1tyaWdodC5pbmRleF0uaGFsZmVkZ2Vz LnB1c2goaW5kZXgpOwogIHJldHVybiBlZGdlOwp9CgpmdW5jdGlvbiBjcmVhdGVCb3JkZXJFZGdl KGxlZnQsIHYwLCB2MSkgewogIHZhciBlZGdlID0gW3YwLCB2MV07CiAgZWRnZS5sZWZ0ID0gbGVm dDsKICByZXR1cm4gZWRnZTsKfQoKZnVuY3Rpb24gc2V0RWRnZUVuZChlZGdlLCBsZWZ0LCByaWdo dCwgdmVydGV4KSB7CiAgaWYgKCFlZGdlWzBdICYmICFlZGdlWzFdKSB7CiAgICBlZGdlWzBdID0g dmVydGV4OwogICAgZWRnZS5sZWZ0ID0gbGVmdDsKICAgIGVkZ2UucmlnaHQgPSByaWdodDsKICB9 IGVsc2UgaWYgKGVkZ2UubGVmdCA9PT0gcmlnaHQpIHsKICAgIGVkZ2VbMV0gPSB2ZXJ0ZXg7CiAg fSBlbHNlIHsKICAgIGVkZ2VbMF0gPSB2ZXJ0ZXg7CiAgfQp9CgovLyBMaWFuZ+KAk0JhcnNreSBs aW5lIGNsaXBwaW5nLgpmdW5jdGlvbiBjbGlwRWRnZShlZGdlLCB4MCwgeTAsIHgxLCB5MSkgewog IHZhciBhID0gZWRnZVswXSwKICAgICAgYiA9IGVkZ2VbMV0sCiAgICAgIGF4ID0gYVswXSwKICAg ICAgYXkgPSBhWzFdLAogICAgICBieCA9IGJbMF0sCiAgICAgIGJ5ID0gYlsxXSwKICAgICAgdDAg PSAwLAogICAgICB0MSA9IDEsCiAgICAgIGR4ID0gYnggLSBheCwKICAgICAgZHkgPSBieSAtIGF5 LAogICAgICByOwoKICByID0geDAgLSBheDsKICBpZiAoIWR4ICYmIHIgPiAwKSByZXR1cm47CiAg ciAvPSBkeDsKICBpZiAoZHggPCAwKSB7CiAgICBpZiAociA8IHQwKSByZXR1cm47CiAgICBpZiAo ciA8IHQxKSB0MSA9IHI7CiAgfSBlbHNlIGlmIChkeCA+IDApIHsKICAgIGlmIChyID4gdDEpIHJl dHVybjsKICAgIGlmIChyID4gdDApIHQwID0gcjsKICB9CgogIHIgPSB4MSAtIGF4OwogIGlmICgh ZHggJiYgciA8IDApIHJldHVybjsKICByIC89IGR4OwogIGlmIChkeCA8IDApIHsKICAgIGlmIChy ID4gdDEpIHJldHVybjsKICAgIGlmIChyID4gdDApIHQwID0gcjsKICB9IGVsc2UgaWYgKGR4ID4g MCkgewogICAgaWYgKHIgPCB0MCkgcmV0dXJuOwogICAgaWYgKHIgPCB0MSkgdDEgPSByOwogIH0K CiAgciA9IHkwIC0gYXk7CiAgaWYgKCFkeSAmJiByID4gMCkgcmV0dXJuOwogIHIgLz0gZHk7CiAg aWYgKGR5IDwgMCkgewogICAgaWYgKHIgPCB0MCkgcmV0dXJuOwogICAgaWYgKHIgPCB0MSkgdDEg PSByOwogIH0gZWxzZSBpZiAoZHkgPiAwKSB7CiAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICBp ZiAociA+IHQwKSB0MCA9IHI7CiAgfQoKICByID0geTEgLSBheTsKICBpZiAoIWR5ICYmIHIgPCAw KSByZXR1cm47CiAgciAvPSBkeTsKICBpZiAoZHkgPCAwKSB7CiAgICBpZiAociA+IHQxKSByZXR1 cm47CiAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgfSBlbHNlIGlmIChkeSA+IDApIHsKICAgIGlm IChyIDwgdDApIHJldHVybjsKICAgIGlmIChyIDwgdDEpIHQxID0gcjsKICB9CgogIGlmICghKHQw ID4gMCkgJiYgISh0MSA8IDEpKSByZXR1cm4gdHJ1ZTsgLy8gVE9ETyBCZXR0ZXIgY2hlY2s/Cgog IGlmICh0MCA+IDApIGVkZ2VbMF0gPSBbYXggKyB0MCAqIGR4LCBheSArIHQwICogZHldOwogIGlm ICh0MSA8IDEpIGVkZ2VbMV0gPSBbYXggKyB0MSAqIGR4LCBheSArIHQxICogZHldOwogIHJldHVy biB0cnVlOwp9CgpmdW5jdGlvbiBjb25uZWN0RWRnZShlZGdlLCB4MCwgeTAsIHgxLCB5MSkgewog IHZhciB2MSA9IGVkZ2VbMV07CiAgaWYgKHYxKSByZXR1cm4gdHJ1ZTsKCiAgdmFyIHYwID0gZWRn ZVswXSwKICAgICAgbGVmdCA9IGVkZ2UubGVmdCwKICAgICAgcmlnaHQgPSBlZGdlLnJpZ2h0LAog ICAgICBseCA9IGxlZnRbMF0sCiAgICAgIGx5ID0gbGVmdFsxXSwKICAgICAgcnggPSByaWdodFsw XSwKICAgICAgcnkgPSByaWdodFsxXSwKICAgICAgZnggPSAobHggKyByeCkgLyAyLAogICAgICBm eSA9IChseSArIHJ5KSAvIDIsCiAgICAgIGZtLAogICAgICBmYjsKCiAgaWYgKHJ5ID09PSBseSkg ewogICAgaWYgKGZ4IDwgeDAgfHwgZnggPj0geDEpIHJldHVybjsKICAgIGlmIChseCA+IHJ4KSB7 CiAgICAgIGlmICghdjApIHYwID0gW2Z4LCB5MF07CiAgICAgIGVsc2UgaWYgKHYwWzFdID49IHkx KSByZXR1cm47CiAgICAgIHYxID0gW2Z4LCB5MV07CiAgICB9IGVsc2UgewogICAgICBpZiAoIXYw KSB2MCA9IFtmeCwgeTFdOwogICAgICBlbHNlIGlmICh2MFsxXSA8IHkwKSByZXR1cm47CiAgICAg IHYxID0gW2Z4LCB5MF07CiAgICB9CiAgfSBlbHNlIHsKICAgIGZtID0gKGx4IC0gcngpIC8gKHJ5 IC0gbHkpOwogICAgZmIgPSBmeSAtIGZtICogZng7CiAgICBpZiAoZm0gPCAtMSB8fCBmbSA+IDEp IHsKICAgICAgaWYgKGx4ID4gcngpIHsKICAgICAgICBpZiAoIXYwKSB2MCA9IFsoeTAgLSBmYikg LyBmbSwgeTBdOwogICAgICAgIGVsc2UgaWYgKHYwWzFdID49IHkxKSByZXR1cm47CiAgICAgICAg djEgPSBbKHkxIC0gZmIpIC8gZm0sIHkxXTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIXYw KSB2MCA9IFsoeTEgLSBmYikgLyBmbSwgeTFdOwogICAgICAgIGVsc2UgaWYgKHYwWzFdIDwgeTAp IHJldHVybjsKICAgICAgICB2MSA9IFsoeTAgLSBmYikgLyBmbSwgeTBdOwogICAgICB9CiAgICB9 IGVsc2UgewogICAgICBpZiAobHkgPCByeSkgewogICAgICAgIGlmICghdjApIHYwID0gW3gwLCBm bSAqIHgwICsgZmJdOwogICAgICAgIGVsc2UgaWYgKHYwWzBdID49IHgxKSByZXR1cm47CiAgICAg ICAgdjEgPSBbeDEsIGZtICogeDEgKyBmYl07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCF2 MCkgdjAgPSBbeDEsIGZtICogeDEgKyBmYl07CiAgICAgICAgZWxzZSBpZiAodjBbMF0gPCB4MCkg cmV0dXJuOwogICAgICAgIHYxID0gW3gwLCBmbSAqIHgwICsgZmJdOwogICAgICB9CiAgICB9CiAg fQoKICBlZGdlWzBdID0gdjA7CiAgZWRnZVsxXSA9IHYxOwogIHJldHVybiB0cnVlOwp9CgpmdW5j dGlvbiBjbGlwRWRnZXMoeDAsIHkwLCB4MSwgeTEpIHsKICB2YXIgaSA9IGVkZ2VzLmxlbmd0aCwK ICAgICAgZWRnZTsKCiAgd2hpbGUgKGktLSkgewogICAgaWYgKCFjb25uZWN0RWRnZShlZGdlID0g ZWRnZXNbaV0sIHgwLCB5MCwgeDEsIHkxKQogICAgICAgIHx8ICFjbGlwRWRnZShlZGdlLCB4MCwg eTAsIHgxLCB5MSkKICAgICAgICB8fCAhKE1hdGguYWJzKGVkZ2VbMF1bMF0gLSBlZGdlWzFdWzBd KSA+IGVwc2lsb24kNAogICAgICAgICAgICB8fCBNYXRoLmFicyhlZGdlWzBdWzFdIC0gZWRnZVsx XVsxXSkgPiBlcHNpbG9uJDQpKSB7CiAgICAgIGRlbGV0ZSBlZGdlc1tpXTsKICAgIH0KICB9Cn0K CmZ1bmN0aW9uIGNyZWF0ZUNlbGwoc2l0ZSkgewogIHJldHVybiBjZWxsc1tzaXRlLmluZGV4XSA9 IHsKICAgIHNpdGU6IHNpdGUsCiAgICBoYWxmZWRnZXM6IFtdCiAgfTsKfQoKZnVuY3Rpb24gY2Vs bEhhbGZlZGdlQW5nbGUoY2VsbCwgZWRnZSkgewogIHZhciBzaXRlID0gY2VsbC5zaXRlLAogICAg ICB2YSA9IGVkZ2UubGVmdCwKICAgICAgdmIgPSBlZGdlLnJpZ2h0OwogIGlmIChzaXRlID09PSB2 YikgdmIgPSB2YSwgdmEgPSBzaXRlOwogIGlmICh2YikgcmV0dXJuIE1hdGguYXRhbjIodmJbMV0g LSB2YVsxXSwgdmJbMF0gLSB2YVswXSk7CiAgaWYgKHNpdGUgPT09IHZhKSB2YSA9IGVkZ2VbMV0s IHZiID0gZWRnZVswXTsKICBlbHNlIHZhID0gZWRnZVswXSwgdmIgPSBlZGdlWzFdOwogIHJldHVy biBNYXRoLmF0YW4yKHZhWzBdIC0gdmJbMF0sIHZiWzFdIC0gdmFbMV0pOwp9CgpmdW5jdGlvbiBj ZWxsSGFsZmVkZ2VTdGFydChjZWxsLCBlZGdlKSB7CiAgcmV0dXJuIGVkZ2VbKyhlZGdlLmxlZnQg IT09IGNlbGwuc2l0ZSldOwp9CgpmdW5jdGlvbiBjZWxsSGFsZmVkZ2VFbmQoY2VsbCwgZWRnZSkg ewogIHJldHVybiBlZGdlWysoZWRnZS5sZWZ0ID09PSBjZWxsLnNpdGUpXTsKfQoKZnVuY3Rpb24g c29ydENlbGxIYWxmZWRnZXMoKSB7CiAgZm9yICh2YXIgaSA9IDAsIG4gPSBjZWxscy5sZW5ndGgs IGNlbGwsIGhhbGZlZGdlcywgaiwgbTsgaSA8IG47ICsraSkgewogICAgaWYgKChjZWxsID0gY2Vs bHNbaV0pICYmIChtID0gKGhhbGZlZGdlcyA9IGNlbGwuaGFsZmVkZ2VzKS5sZW5ndGgpKSB7CiAg ICAgIHZhciBpbmRleCA9IG5ldyBBcnJheShtKSwKICAgICAgICAgIGFycmF5ID0gbmV3IEFycmF5 KG0pOwogICAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSBpbmRleFtqXSA9IGosIGFycmF5W2pd ID0gY2VsbEhhbGZlZGdlQW5nbGUoY2VsbCwgZWRnZXNbaGFsZmVkZ2VzW2pdXSk7CiAgICAgIGlu ZGV4LnNvcnQoZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gYXJyYXlbal0gLSBhcnJheVtpXTsgfSk7 CiAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIGFycmF5W2pdID0gaGFsZmVkZ2VzW2luZGV4 W2pdXTsKICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgaGFsZmVkZ2VzW2pdID0gYXJyYXlb al07CiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjbGlwQ2VsbHMoeDAsIHkwLCB4MSwgeTEpIHsKICB2 YXIgbkNlbGxzID0gY2VsbHMubGVuZ3RoLAogICAgICBpQ2VsbCwKICAgICAgY2VsbCwKICAgICAg c2l0ZSwKICAgICAgaUhhbGZlZGdlLAogICAgICBoYWxmZWRnZXMsCiAgICAgIG5IYWxmZWRnZXMs CiAgICAgIHN0YXJ0LAogICAgICBzdGFydFgsCiAgICAgIHN0YXJ0WSwKICAgICAgZW5kLAogICAg ICBlbmRYLAogICAgICBlbmRZLAogICAgICBjb3ZlciA9IHRydWU7CgogIGZvciAoaUNlbGwgPSAw OyBpQ2VsbCA8IG5DZWxsczsgKytpQ2VsbCkgewogICAgaWYgKGNlbGwgPSBjZWxsc1tpQ2VsbF0p IHsKICAgICAgc2l0ZSA9IGNlbGwuc2l0ZTsKICAgICAgaGFsZmVkZ2VzID0gY2VsbC5oYWxmZWRn ZXM7CiAgICAgIGlIYWxmZWRnZSA9IGhhbGZlZGdlcy5sZW5ndGg7CgogICAgICAvLyBSZW1vdmUg YW55IGRhbmdsaW5nIGNsaXBwZWQgZWRnZXMuCiAgICAgIHdoaWxlIChpSGFsZmVkZ2UtLSkgewog ICAgICAgIGlmICghZWRnZXNbaGFsZmVkZ2VzW2lIYWxmZWRnZV1dKSB7CiAgICAgICAgICBoYWxm ZWRnZXMuc3BsaWNlKGlIYWxmZWRnZSwgMSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBJ bnNlcnQgYW55IGJvcmRlciBlZGdlcyBhcyBuZWNlc3NhcnkuCiAgICAgIGlIYWxmZWRnZSA9IDAs IG5IYWxmZWRnZXMgPSBoYWxmZWRnZXMubGVuZ3RoOwogICAgICB3aGlsZSAoaUhhbGZlZGdlIDwg bkhhbGZlZGdlcykgewogICAgICAgIGVuZCA9IGNlbGxIYWxmZWRnZUVuZChjZWxsLCBlZGdlc1to YWxmZWRnZXNbaUhhbGZlZGdlXV0pLCBlbmRYID0gZW5kWzBdLCBlbmRZID0gZW5kWzFdOwogICAg ICAgIHN0YXJ0ID0gY2VsbEhhbGZlZGdlU3RhcnQoY2VsbCwgZWRnZXNbaGFsZmVkZ2VzWysraUhh bGZlZGdlICUgbkhhbGZlZGdlc11dKSwgc3RhcnRYID0gc3RhcnRbMF0sIHN0YXJ0WSA9IHN0YXJ0 WzFdOwogICAgICAgIGlmIChNYXRoLmFicyhlbmRYIC0gc3RhcnRYKSA+IGVwc2lsb24kNCB8fCBN YXRoLmFicyhlbmRZIC0gc3RhcnRZKSA+IGVwc2lsb24kNCkgewogICAgICAgICAgaGFsZmVkZ2Vz LnNwbGljZShpSGFsZmVkZ2UsIDAsIGVkZ2VzLnB1c2goY3JlYXRlQm9yZGVyRWRnZShzaXRlLCBl bmQsCiAgICAgICAgICAgICAgTWF0aC5hYnMoZW5kWCAtIHgwKSA8IGVwc2lsb24kNCAmJiB5MSAt IGVuZFkgPiBlcHNpbG9uJDQgPyBbeDAsIE1hdGguYWJzKHN0YXJ0WCAtIHgwKSA8IGVwc2lsb24k NCA/IHN0YXJ0WSA6IHkxXQogICAgICAgICAgICAgIDogTWF0aC5hYnMoZW5kWSAtIHkxKSA8IGVw c2lsb24kNCAmJiB4MSAtIGVuZFggPiBlcHNpbG9uJDQgPyBbTWF0aC5hYnMoc3RhcnRZIC0geTEp IDwgZXBzaWxvbiQ0ID8gc3RhcnRYIDogeDEsIHkxXQogICAgICAgICAgICAgIDogTWF0aC5hYnMo ZW5kWCAtIHgxKSA8IGVwc2lsb24kNCAmJiBlbmRZIC0geTAgPiBlcHNpbG9uJDQgPyBbeDEsIE1h dGguYWJzKHN0YXJ0WCAtIHgxKSA8IGVwc2lsb24kNCA/IHN0YXJ0WSA6IHkwXQogICAgICAgICAg ICAgIDogTWF0aC5hYnMoZW5kWSAtIHkwKSA8IGVwc2lsb24kNCAmJiBlbmRYIC0geDAgPiBlcHNp bG9uJDQgPyBbTWF0aC5hYnMoc3RhcnRZIC0geTApIDwgZXBzaWxvbiQ0ID8gc3RhcnRYIDogeDAs IHkwXQogICAgICAgICAgICAgIDogbnVsbCkpIC0gMSk7CiAgICAgICAgICArK25IYWxmZWRnZXM7 CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAobkhhbGZlZGdlcykgY292ZXIgPSBmYWxzZTsK ICAgIH0KICB9CgogIC8vIElmIHRoZXJlIHdlcmVu4oCZdCBhbnkgZWRnZXMsIGhhdmUgdGhlIGNs b3Nlc3Qgc2l0ZSBjb3ZlciB0aGUgZXh0ZW50LgogIC8vIEl0IGRvZXNu4oCZdCBtYXR0ZXIgd2hp Y2ggY29ybmVyIG9mIHRoZSBleHRlbnQgd2UgbWVhc3VyZSEKICBpZiAoY292ZXIpIHsKICAgIHZh ciBkeCwgZHksIGQyLCBkYyA9IEluZmluaXR5OwoKICAgIGZvciAoaUNlbGwgPSAwLCBjb3ZlciA9 IG51bGw7IGlDZWxsIDwgbkNlbGxzOyArK2lDZWxsKSB7CiAgICAgIGlmIChjZWxsID0gY2VsbHNb aUNlbGxdKSB7CiAgICAgICAgc2l0ZSA9IGNlbGwuc2l0ZTsKICAgICAgICBkeCA9IHNpdGVbMF0g LSB4MDsKICAgICAgICBkeSA9IHNpdGVbMV0gLSB5MDsKICAgICAgICBkMiA9IGR4ICogZHggKyBk eSAqIGR5OwogICAgICAgIGlmIChkMiA8IGRjKSBkYyA9IGQyLCBjb3ZlciA9IGNlbGw7CiAgICAg IH0KICAgIH0KCiAgICBpZiAoY292ZXIpIHsKICAgICAgdmFyIHYwMCA9IFt4MCwgeTBdLCB2MDEg PSBbeDAsIHkxXSwgdjExID0gW3gxLCB5MV0sIHYxMCA9IFt4MSwgeTBdOwogICAgICBjb3Zlci5o YWxmZWRnZXMucHVzaCgKICAgICAgICBlZGdlcy5wdXNoKGNyZWF0ZUJvcmRlckVkZ2Uoc2l0ZSA9 IGNvdmVyLnNpdGUsIHYwMCwgdjAxKSkgLSAxLAogICAgICAgIGVkZ2VzLnB1c2goY3JlYXRlQm9y ZGVyRWRnZShzaXRlLCB2MDEsIHYxMSkpIC0gMSwKICAgICAgICBlZGdlcy5wdXNoKGNyZWF0ZUJv cmRlckVkZ2Uoc2l0ZSwgdjExLCB2MTApKSAtIDEsCiAgICAgICAgZWRnZXMucHVzaChjcmVhdGVC b3JkZXJFZGdlKHNpdGUsIHYxMCwgdjAwKSkgLSAxCiAgICAgICk7CiAgICB9CiAgfQoKICAvLyBM YXN0bHkgZGVsZXRlIGFueSBjZWxscyB3aXRoIG5vIGVkZ2VzOyB0aGVzZSB3ZXJlIGVudGlyZWx5 IGNsaXBwZWQuCiAgZm9yIChpQ2VsbCA9IDA7IGlDZWxsIDwgbkNlbGxzOyArK2lDZWxsKSB7CiAg ICBpZiAoY2VsbCA9IGNlbGxzW2lDZWxsXSkgewogICAgICBpZiAoIWNlbGwuaGFsZmVkZ2VzLmxl bmd0aCkgewogICAgICAgIGRlbGV0ZSBjZWxsc1tpQ2VsbF07CiAgICAgIH0KICAgIH0KICB9Cn0K CnZhciBjaXJjbGVQb29sID0gW107Cgp2YXIgZmlyc3RDaXJjbGU7CgpmdW5jdGlvbiBDaXJjbGUo KSB7CiAgUmVkQmxhY2tOb2RlKHRoaXMpOwogIHRoaXMueCA9CiAgdGhpcy55ID0KICB0aGlzLmFy YyA9CiAgdGhpcy5zaXRlID0KICB0aGlzLmN5ID0gbnVsbDsKfQoKZnVuY3Rpb24gYXR0YWNoQ2ly Y2xlKGFyYykgewogIHZhciBsQXJjID0gYXJjLlAsCiAgICAgIHJBcmMgPSBhcmMuTjsKCiAgaWYg KCFsQXJjIHx8ICFyQXJjKSByZXR1cm47CgogIHZhciBsU2l0ZSA9IGxBcmMuc2l0ZSwKICAgICAg Y1NpdGUgPSBhcmMuc2l0ZSwKICAgICAgclNpdGUgPSByQXJjLnNpdGU7CgogIGlmIChsU2l0ZSA9 PT0gclNpdGUpIHJldHVybjsKCiAgdmFyIGJ4ID0gY1NpdGVbMF0sCiAgICAgIGJ5ID0gY1NpdGVb MV0sCiAgICAgIGF4ID0gbFNpdGVbMF0gLSBieCwKICAgICAgYXkgPSBsU2l0ZVsxXSAtIGJ5LAog ICAgICBjeCA9IHJTaXRlWzBdIC0gYngsCiAgICAgIGN5ID0gclNpdGVbMV0gLSBieTsKCiAgdmFy IGQgPSAyICogKGF4ICogY3kgLSBheSAqIGN4KTsKICBpZiAoZCA+PSAtZXBzaWxvbjIkMikgcmV0 dXJuOwoKICB2YXIgaGEgPSBheCAqIGF4ICsgYXkgKiBheSwKICAgICAgaGMgPSBjeCAqIGN4ICsg Y3kgKiBjeSwKICAgICAgeCA9IChjeSAqIGhhIC0gYXkgKiBoYykgLyBkLAogICAgICB5ID0gKGF4 ICogaGMgLSBjeCAqIGhhKSAvIGQ7CgogIHZhciBjaXJjbGUgPSBjaXJjbGVQb29sLnBvcCgpIHx8 IG5ldyBDaXJjbGU7CiAgY2lyY2xlLmFyYyA9IGFyYzsKICBjaXJjbGUuc2l0ZSA9IGNTaXRlOwog IGNpcmNsZS54ID0geCArIGJ4OwogIGNpcmNsZS55ID0gKGNpcmNsZS5jeSA9IHkgKyBieSkgKyBN YXRoLnNxcnQoeCAqIHggKyB5ICogeSk7IC8vIHkgYm90dG9tCgogIGFyYy5jaXJjbGUgPSBjaXJj bGU7CgogIHZhciBiZWZvcmUgPSBudWxsLAogICAgICBub2RlID0gY2lyY2xlcy5fOwoKICB3aGls ZSAobm9kZSkgewogICAgaWYgKGNpcmNsZS55IDwgbm9kZS55IHx8IChjaXJjbGUueSA9PT0gbm9k ZS55ICYmIGNpcmNsZS54IDw9IG5vZGUueCkpIHsKICAgICAgaWYgKG5vZGUuTCkgbm9kZSA9IG5v ZGUuTDsKICAgICAgZWxzZSB7IGJlZm9yZSA9IG5vZGUuUDsgYnJlYWs7IH0KICAgIH0gZWxzZSB7 CiAgICAgIGlmIChub2RlLlIpIG5vZGUgPSBub2RlLlI7CiAgICAgIGVsc2UgeyBiZWZvcmUgPSBu b2RlOyBicmVhazsgfQogICAgfQogIH0KCiAgY2lyY2xlcy5pbnNlcnQoYmVmb3JlLCBjaXJjbGUp OwogIGlmICghYmVmb3JlKSBmaXJzdENpcmNsZSA9IGNpcmNsZTsKfQoKZnVuY3Rpb24gZGV0YWNo Q2lyY2xlKGFyYykgewogIHZhciBjaXJjbGUgPSBhcmMuY2lyY2xlOwogIGlmIChjaXJjbGUpIHsK ICAgIGlmICghY2lyY2xlLlApIGZpcnN0Q2lyY2xlID0gY2lyY2xlLk47CiAgICBjaXJjbGVzLnJl bW92ZShjaXJjbGUpOwogICAgY2lyY2xlUG9vbC5wdXNoKGNpcmNsZSk7CiAgICBSZWRCbGFja05v ZGUoY2lyY2xlKTsKICAgIGFyYy5jaXJjbGUgPSBudWxsOwogIH0KfQoKdmFyIGJlYWNoUG9vbCA9 IFtdOwoKZnVuY3Rpb24gQmVhY2goKSB7CiAgUmVkQmxhY2tOb2RlKHRoaXMpOwogIHRoaXMuZWRn ZSA9CiAgdGhpcy5zaXRlID0KICB0aGlzLmNpcmNsZSA9IG51bGw7Cn0KCmZ1bmN0aW9uIGNyZWF0 ZUJlYWNoKHNpdGUpIHsKICB2YXIgYmVhY2ggPSBiZWFjaFBvb2wucG9wKCkgfHwgbmV3IEJlYWNo OwogIGJlYWNoLnNpdGUgPSBzaXRlOwogIHJldHVybiBiZWFjaDsKfQoKZnVuY3Rpb24gZGV0YWNo QmVhY2goYmVhY2gpIHsKICBkZXRhY2hDaXJjbGUoYmVhY2gpOwogIGJlYWNoZXMucmVtb3ZlKGJl YWNoKTsKICBiZWFjaFBvb2wucHVzaChiZWFjaCk7CiAgUmVkQmxhY2tOb2RlKGJlYWNoKTsKfQoK ZnVuY3Rpb24gcmVtb3ZlQmVhY2goYmVhY2gpIHsKICB2YXIgY2lyY2xlID0gYmVhY2guY2lyY2xl LAogICAgICB4ID0gY2lyY2xlLngsCiAgICAgIHkgPSBjaXJjbGUuY3ksCiAgICAgIHZlcnRleCA9 IFt4LCB5XSwKICAgICAgcHJldmlvdXMgPSBiZWFjaC5QLAogICAgICBuZXh0ID0gYmVhY2guTiwK ICAgICAgZGlzYXBwZWFyaW5nID0gW2JlYWNoXTsKCiAgZGV0YWNoQmVhY2goYmVhY2gpOwoKICB2 YXIgbEFyYyA9IHByZXZpb3VzOwogIHdoaWxlIChsQXJjLmNpcmNsZQogICAgICAmJiBNYXRoLmFi cyh4IC0gbEFyYy5jaXJjbGUueCkgPCBlcHNpbG9uJDQKICAgICAgJiYgTWF0aC5hYnMoeSAtIGxB cmMuY2lyY2xlLmN5KSA8IGVwc2lsb24kNCkgewogICAgcHJldmlvdXMgPSBsQXJjLlA7CiAgICBk aXNhcHBlYXJpbmcudW5zaGlmdChsQXJjKTsKICAgIGRldGFjaEJlYWNoKGxBcmMpOwogICAgbEFy YyA9IHByZXZpb3VzOwogIH0KCiAgZGlzYXBwZWFyaW5nLnVuc2hpZnQobEFyYyk7CiAgZGV0YWNo Q2lyY2xlKGxBcmMpOwoKICB2YXIgckFyYyA9IG5leHQ7CiAgd2hpbGUgKHJBcmMuY2lyY2xlCiAg ICAgICYmIE1hdGguYWJzKHggLSByQXJjLmNpcmNsZS54KSA8IGVwc2lsb24kNAogICAgICAmJiBN YXRoLmFicyh5IC0gckFyYy5jaXJjbGUuY3kpIDwgZXBzaWxvbiQ0KSB7CiAgICBuZXh0ID0gckFy Yy5OOwogICAgZGlzYXBwZWFyaW5nLnB1c2gockFyYyk7CiAgICBkZXRhY2hCZWFjaChyQXJjKTsK ICAgIHJBcmMgPSBuZXh0OwogIH0KCiAgZGlzYXBwZWFyaW5nLnB1c2gockFyYyk7CiAgZGV0YWNo Q2lyY2xlKHJBcmMpOwoKICB2YXIgbkFyY3MgPSBkaXNhcHBlYXJpbmcubGVuZ3RoLAogICAgICBp QXJjOwogIGZvciAoaUFyYyA9IDE7IGlBcmMgPCBuQXJjczsgKytpQXJjKSB7CiAgICByQXJjID0g ZGlzYXBwZWFyaW5nW2lBcmNdOwogICAgbEFyYyA9IGRpc2FwcGVhcmluZ1tpQXJjIC0gMV07CiAg ICBzZXRFZGdlRW5kKHJBcmMuZWRnZSwgbEFyYy5zaXRlLCByQXJjLnNpdGUsIHZlcnRleCk7CiAg fQoKICBsQXJjID0gZGlzYXBwZWFyaW5nWzBdOwogIHJBcmMgPSBkaXNhcHBlYXJpbmdbbkFyY3Mg LSAxXTsKICByQXJjLmVkZ2UgPSBjcmVhdGVFZGdlKGxBcmMuc2l0ZSwgckFyYy5zaXRlLCBudWxs LCB2ZXJ0ZXgpOwoKICBhdHRhY2hDaXJjbGUobEFyYyk7CiAgYXR0YWNoQ2lyY2xlKHJBcmMpOwp9 CgpmdW5jdGlvbiBhZGRCZWFjaChzaXRlKSB7CiAgdmFyIHggPSBzaXRlWzBdLAogICAgICBkaXJl Y3RyaXggPSBzaXRlWzFdLAogICAgICBsQXJjLAogICAgICByQXJjLAogICAgICBkeGwsCiAgICAg IGR4ciwKICAgICAgbm9kZSA9IGJlYWNoZXMuXzsKCiAgd2hpbGUgKG5vZGUpIHsKICAgIGR4bCA9 IGxlZnRCcmVha1BvaW50KG5vZGUsIGRpcmVjdHJpeCkgLSB4OwogICAgaWYgKGR4bCA+IGVwc2ls b24kNCkgbm9kZSA9IG5vZGUuTDsgZWxzZSB7CiAgICAgIGR4ciA9IHggLSByaWdodEJyZWFrUG9p bnQobm9kZSwgZGlyZWN0cml4KTsKICAgICAgaWYgKGR4ciA+IGVwc2lsb24kNCkgewogICAgICAg IGlmICghbm9kZS5SKSB7CiAgICAgICAgICBsQXJjID0gbm9kZTsKICAgICAgICAgIGJyZWFrOwog ICAgICAgIH0KICAgICAgICBub2RlID0gbm9kZS5SOwogICAgICB9IGVsc2UgewogICAgICAgIGlm IChkeGwgPiAtZXBzaWxvbiQ0KSB7CiAgICAgICAgICBsQXJjID0gbm9kZS5QOwogICAgICAgICAg ckFyYyA9IG5vZGU7CiAgICAgICAgfSBlbHNlIGlmIChkeHIgPiAtZXBzaWxvbiQ0KSB7CiAgICAg ICAgICBsQXJjID0gbm9kZTsKICAgICAgICAgIHJBcmMgPSBub2RlLk47CiAgICAgICAgfSBlbHNl IHsKICAgICAgICAgIGxBcmMgPSByQXJjID0gbm9kZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7 CiAgICAgIH0KICAgIH0KICB9CgogIGNyZWF0ZUNlbGwoc2l0ZSk7CiAgdmFyIG5ld0FyYyA9IGNy ZWF0ZUJlYWNoKHNpdGUpOwogIGJlYWNoZXMuaW5zZXJ0KGxBcmMsIG5ld0FyYyk7CgogIGlmICgh bEFyYyAmJiAhckFyYykgcmV0dXJuOwoKICBpZiAobEFyYyA9PT0gckFyYykgewogICAgZGV0YWNo Q2lyY2xlKGxBcmMpOwogICAgckFyYyA9IGNyZWF0ZUJlYWNoKGxBcmMuc2l0ZSk7CiAgICBiZWFj aGVzLmluc2VydChuZXdBcmMsIHJBcmMpOwogICAgbmV3QXJjLmVkZ2UgPSByQXJjLmVkZ2UgPSBj cmVhdGVFZGdlKGxBcmMuc2l0ZSwgbmV3QXJjLnNpdGUpOwogICAgYXR0YWNoQ2lyY2xlKGxBcmMp OwogICAgYXR0YWNoQ2lyY2xlKHJBcmMpOwogICAgcmV0dXJuOwogIH0KCiAgaWYgKCFyQXJjKSB7 IC8vICYmIGxBcmMKICAgIG5ld0FyYy5lZGdlID0gY3JlYXRlRWRnZShsQXJjLnNpdGUsIG5ld0Fy Yy5zaXRlKTsKICAgIHJldHVybjsKICB9CgogIC8vIGVsc2UgbEFyYyAhPT0gckFyYwogIGRldGFj aENpcmNsZShsQXJjKTsKICBkZXRhY2hDaXJjbGUockFyYyk7CgogIHZhciBsU2l0ZSA9IGxBcmMu c2l0ZSwKICAgICAgYXggPSBsU2l0ZVswXSwKICAgICAgYXkgPSBsU2l0ZVsxXSwKICAgICAgYngg PSBzaXRlWzBdIC0gYXgsCiAgICAgIGJ5ID0gc2l0ZVsxXSAtIGF5LAogICAgICByU2l0ZSA9IHJB cmMuc2l0ZSwKICAgICAgY3ggPSByU2l0ZVswXSAtIGF4LAogICAgICBjeSA9IHJTaXRlWzFdIC0g YXksCiAgICAgIGQgPSAyICogKGJ4ICogY3kgLSBieSAqIGN4KSwKICAgICAgaGIgPSBieCAqIGJ4 ICsgYnkgKiBieSwKICAgICAgaGMgPSBjeCAqIGN4ICsgY3kgKiBjeSwKICAgICAgdmVydGV4ID0g WyhjeSAqIGhiIC0gYnkgKiBoYykgLyBkICsgYXgsIChieCAqIGhjIC0gY3ggKiBoYikgLyBkICsg YXldOwoKICBzZXRFZGdlRW5kKHJBcmMuZWRnZSwgbFNpdGUsIHJTaXRlLCB2ZXJ0ZXgpOwogIG5l d0FyYy5lZGdlID0gY3JlYXRlRWRnZShsU2l0ZSwgc2l0ZSwgbnVsbCwgdmVydGV4KTsKICByQXJj LmVkZ2UgPSBjcmVhdGVFZGdlKHNpdGUsIHJTaXRlLCBudWxsLCB2ZXJ0ZXgpOwogIGF0dGFjaENp cmNsZShsQXJjKTsKICBhdHRhY2hDaXJjbGUockFyYyk7Cn0KCmZ1bmN0aW9uIGxlZnRCcmVha1Bv aW50KGFyYywgZGlyZWN0cml4KSB7CiAgdmFyIHNpdGUgPSBhcmMuc2l0ZSwKICAgICAgcmZvY3gg PSBzaXRlWzBdLAogICAgICByZm9jeSA9IHNpdGVbMV0sCiAgICAgIHBieTIgPSByZm9jeSAtIGRp cmVjdHJpeDsKCiAgaWYgKCFwYnkyKSByZXR1cm4gcmZvY3g7CgogIHZhciBsQXJjID0gYXJjLlA7 CiAgaWYgKCFsQXJjKSByZXR1cm4gLUluZmluaXR5OwoKICBzaXRlID0gbEFyYy5zaXRlOwogIHZh ciBsZm9jeCA9IHNpdGVbMF0sCiAgICAgIGxmb2N5ID0gc2l0ZVsxXSwKICAgICAgcGxieTIgPSBs Zm9jeSAtIGRpcmVjdHJpeDsKCiAgaWYgKCFwbGJ5MikgcmV0dXJuIGxmb2N4OwoKICB2YXIgaGwg PSBsZm9jeCAtIHJmb2N4LAogICAgICBhYnkyID0gMSAvIHBieTIgLSAxIC8gcGxieTIsCiAgICAg IGIgPSBobCAvIHBsYnkyOwoKICBpZiAoYWJ5MikgcmV0dXJuICgtYiArIE1hdGguc3FydChiICog YiAtIDIgKiBhYnkyICogKGhsICogaGwgLyAoLTIgKiBwbGJ5MikgLSBsZm9jeSArIHBsYnkyIC8g MiArIHJmb2N5IC0gcGJ5MiAvIDIpKSkgLyBhYnkyICsgcmZvY3g7CgogIHJldHVybiAocmZvY3gg KyBsZm9jeCkgLyAyOwp9CgpmdW5jdGlvbiByaWdodEJyZWFrUG9pbnQoYXJjLCBkaXJlY3RyaXgp IHsKICB2YXIgckFyYyA9IGFyYy5OOwogIGlmIChyQXJjKSByZXR1cm4gbGVmdEJyZWFrUG9pbnQo ckFyYywgZGlyZWN0cml4KTsKICB2YXIgc2l0ZSA9IGFyYy5zaXRlOwogIHJldHVybiBzaXRlWzFd ID09PSBkaXJlY3RyaXggPyBzaXRlWzBdIDogSW5maW5pdHk7Cn0KCnZhciBlcHNpbG9uJDQgPSAx ZS02Owp2YXIgZXBzaWxvbjIkMiA9IDFlLTEyOwp2YXIgYmVhY2hlczsKdmFyIGNlbGxzOwp2YXIg Y2lyY2xlczsKdmFyIGVkZ2VzOwoKZnVuY3Rpb24gdHJpYW5nbGVBcmVhKGEsIGIsIGMpIHsKICBy ZXR1cm4gKGFbMF0gLSBjWzBdKSAqIChiWzFdIC0gYVsxXSkgLSAoYVswXSAtIGJbMF0pICogKGNb MV0gLSBhWzFdKTsKfQoKZnVuY3Rpb24gbGV4aWNvZ3JhcGhpYyhhLCBiKSB7CiAgcmV0dXJuIGJb MV0gLSBhWzFdCiAgICAgIHx8IGJbMF0gLSBhWzBdOwp9CgpmdW5jdGlvbiBEaWFncmFtKHNpdGVz LCBleHRlbnQpIHsKICB2YXIgc2l0ZSA9IHNpdGVzLnNvcnQobGV4aWNvZ3JhcGhpYykucG9wKCks CiAgICAgIHgsCiAgICAgIHksCiAgICAgIGNpcmNsZTsKCiAgZWRnZXMgPSBbXTsKICBjZWxscyA9 IG5ldyBBcnJheShzaXRlcy5sZW5ndGgpOwogIGJlYWNoZXMgPSBuZXcgUmVkQmxhY2tUcmVlOwog IGNpcmNsZXMgPSBuZXcgUmVkQmxhY2tUcmVlOwoKICB3aGlsZSAodHJ1ZSkgewogICAgY2lyY2xl ID0gZmlyc3RDaXJjbGU7CiAgICBpZiAoc2l0ZSAmJiAoIWNpcmNsZSB8fCBzaXRlWzFdIDwgY2ly Y2xlLnkgfHwgKHNpdGVbMV0gPT09IGNpcmNsZS55ICYmIHNpdGVbMF0gPCBjaXJjbGUueCkpKSB7 CiAgICAgIGlmIChzaXRlWzBdICE9PSB4IHx8IHNpdGVbMV0gIT09IHkpIHsKICAgICAgICBhZGRC ZWFjaChzaXRlKTsKICAgICAgICB4ID0gc2l0ZVswXSwgeSA9IHNpdGVbMV07CiAgICAgIH0KICAg ICAgc2l0ZSA9IHNpdGVzLnBvcCgpOwogICAgfSBlbHNlIGlmIChjaXJjbGUpIHsKICAgICAgcmVt b3ZlQmVhY2goY2lyY2xlLmFyYyk7CiAgICB9IGVsc2UgewogICAgICBicmVhazsKICAgIH0KICB9 CgogIHNvcnRDZWxsSGFsZmVkZ2VzKCk7CgogIGlmIChleHRlbnQpIHsKICAgIHZhciB4MCA9ICtl eHRlbnRbMF1bMF0sCiAgICAgICAgeTAgPSArZXh0ZW50WzBdWzFdLAogICAgICAgIHgxID0gK2V4 dGVudFsxXVswXSwKICAgICAgICB5MSA9ICtleHRlbnRbMV1bMV07CiAgICBjbGlwRWRnZXMoeDAs IHkwLCB4MSwgeTEpOwogICAgY2xpcENlbGxzKHgwLCB5MCwgeDEsIHkxKTsKICB9CgogIHRoaXMu ZWRnZXMgPSBlZGdlczsKICB0aGlzLmNlbGxzID0gY2VsbHM7CgogIGJlYWNoZXMgPQogIGNpcmNs ZXMgPQogIGVkZ2VzID0KICBjZWxscyA9IG51bGw7Cn0KCkRpYWdyYW0ucHJvdG90eXBlID0gewog IGNvbnN0cnVjdG9yOiBEaWFncmFtLAoKICBwb2x5Z29uczogZnVuY3Rpb24oKSB7CiAgICB2YXIg ZWRnZXMgPSB0aGlzLmVkZ2VzOwoKICAgIHJldHVybiB0aGlzLmNlbGxzLm1hcChmdW5jdGlvbihj ZWxsKSB7CiAgICAgIHZhciBwb2x5Z29uID0gY2VsbC5oYWxmZWRnZXMubWFwKGZ1bmN0aW9uKGkp IHsgcmV0dXJuIGNlbGxIYWxmZWRnZVN0YXJ0KGNlbGwsIGVkZ2VzW2ldKTsgfSk7CiAgICAgIHBv bHlnb24uZGF0YSA9IGNlbGwuc2l0ZS5kYXRhOwogICAgICByZXR1cm4gcG9seWdvbjsKICAgIH0p OwogIH0sCgogIHRyaWFuZ2xlczogZnVuY3Rpb24oKSB7CiAgICB2YXIgdHJpYW5nbGVzID0gW10s CiAgICAgICAgZWRnZXMgPSB0aGlzLmVkZ2VzOwoKICAgIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5j dGlvbihjZWxsLCBpKSB7CiAgICAgIGlmICghKG0gPSAoaGFsZmVkZ2VzID0gY2VsbC5oYWxmZWRn ZXMpLmxlbmd0aCkpIHJldHVybjsKICAgICAgdmFyIHNpdGUgPSBjZWxsLnNpdGUsCiAgICAgICAg ICBoYWxmZWRnZXMsCiAgICAgICAgICBqID0gLTEsCiAgICAgICAgICBtLAogICAgICAgICAgczAs CiAgICAgICAgICBlMSA9IGVkZ2VzW2hhbGZlZGdlc1ttIC0gMV1dLAogICAgICAgICAgczEgPSBl MS5sZWZ0ID09PSBzaXRlID8gZTEucmlnaHQgOiBlMS5sZWZ0OwoKICAgICAgd2hpbGUgKCsraiA8 IG0pIHsKICAgICAgICBzMCA9IHMxOwogICAgICAgIGUxID0gZWRnZXNbaGFsZmVkZ2VzW2pdXTsK ICAgICAgICBzMSA9IGUxLmxlZnQgPT09IHNpdGUgPyBlMS5yaWdodCA6IGUxLmxlZnQ7CiAgICAg ICAgaWYgKHMwICYmIHMxICYmIGkgPCBzMC5pbmRleCAmJiBpIDwgczEuaW5kZXggJiYgdHJpYW5n bGVBcmVhKHNpdGUsIHMwLCBzMSkgPCAwKSB7CiAgICAgICAgICB0cmlhbmdsZXMucHVzaChbc2l0 ZS5kYXRhLCBzMC5kYXRhLCBzMS5kYXRhXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAg ICByZXR1cm4gdHJpYW5nbGVzOwogIH0sCgogIGxpbmtzOiBmdW5jdGlvbigpIHsKICAgIHJldHVy biB0aGlzLmVkZ2VzLmZpbHRlcihmdW5jdGlvbihlZGdlKSB7CiAgICAgIHJldHVybiBlZGdlLnJp Z2h0OwogICAgfSkubWFwKGZ1bmN0aW9uKGVkZ2UpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBz b3VyY2U6IGVkZ2UubGVmdC5kYXRhLAogICAgICAgIHRhcmdldDogZWRnZS5yaWdodC5kYXRhCiAg ICAgIH07CiAgICB9KTsKICB9LAoKICBmaW5kOiBmdW5jdGlvbih4LCB5LCByYWRpdXMpIHsKICAg IHZhciB0aGF0ID0gdGhpcywgaTAsIGkxID0gdGhhdC5fZm91bmQgfHwgMCwgbiA9IHRoYXQuY2Vs bHMubGVuZ3RoLCBjZWxsOwoKICAgIC8vIFVzZSB0aGUgcHJldmlvdXNseS1mb3VuZCBjZWxsLCBv ciBzdGFydCB3aXRoIGFuIGFyYml0cmFyeSBvbmUuCiAgICB3aGlsZSAoIShjZWxsID0gdGhhdC5j ZWxsc1tpMV0pKSBpZiAoKytpMSA+PSBuKSByZXR1cm4gbnVsbDsKICAgIHZhciBkeCA9IHggLSBj ZWxsLnNpdGVbMF0sIGR5ID0geSAtIGNlbGwuc2l0ZVsxXSwgZDIgPSBkeCAqIGR4ICsgZHkgKiBk eTsKCiAgICAvLyBUcmF2ZXJzZSB0aGUgaGFsZi1lZGdlcyB0byBmaW5kIGEgY2xvc2VyIGNlbGws IGlmIGFueS4KICAgIGRvIHsKICAgICAgY2VsbCA9IHRoYXQuY2VsbHNbaTAgPSBpMV0sIGkxID0g bnVsbDsKICAgICAgY2VsbC5oYWxmZWRnZXMuZm9yRWFjaChmdW5jdGlvbihlKSB7CiAgICAgICAg dmFyIGVkZ2UgPSB0aGF0LmVkZ2VzW2VdLCB2ID0gZWRnZS5sZWZ0OwogICAgICAgIGlmICgodiA9 PT0gY2VsbC5zaXRlIHx8ICF2KSAmJiAhKHYgPSBlZGdlLnJpZ2h0KSkgcmV0dXJuOwogICAgICAg IHZhciB2eCA9IHggLSB2WzBdLCB2eSA9IHkgLSB2WzFdLCB2MiA9IHZ4ICogdnggKyB2eSAqIHZ5 OwogICAgICAgIGlmICh2MiA8IGQyKSBkMiA9IHYyLCBpMSA9IHYuaW5kZXg7CiAgICAgIH0pOwog ICAgfSB3aGlsZSAoaTEgIT09IG51bGwpOwoKICAgIHRoYXQuX2ZvdW5kID0gaTA7CgogICAgcmV0 dXJuIHJhZGl1cyA9PSBudWxsIHx8IGQyIDw9IHJhZGl1cyAqIHJhZGl1cyA/IGNlbGwuc2l0ZSA6 IG51bGw7CiAgfQp9OwoKZnVuY3Rpb24gdm9yb25vaSgpIHsKICB2YXIgeCA9IHgkNCwKICAgICAg eSA9IHkkNCwKICAgICAgZXh0ZW50ID0gbnVsbDsKCiAgZnVuY3Rpb24gdm9yb25vaShkYXRhKSB7 CiAgICByZXR1cm4gbmV3IERpYWdyYW0oZGF0YS5tYXAoZnVuY3Rpb24oZCwgaSkgewogICAgICB2 YXIgcyA9IFtNYXRoLnJvdW5kKHgoZCwgaSwgZGF0YSkgLyBlcHNpbG9uJDQpICogZXBzaWxvbiQ0 LCBNYXRoLnJvdW5kKHkoZCwgaSwgZGF0YSkgLyBlcHNpbG9uJDQpICogZXBzaWxvbiQ0XTsKICAg ICAgcy5pbmRleCA9IGk7CiAgICAgIHMuZGF0YSA9IGQ7CiAgICAgIHJldHVybiBzOwogICAgfSks IGV4dGVudCk7CiAgfQoKICB2b3Jvbm9pLnBvbHlnb25zID0gZnVuY3Rpb24oZGF0YSkgewogICAg cmV0dXJuIHZvcm9ub2koZGF0YSkucG9seWdvbnMoKTsKICB9OwoKICB2b3Jvbm9pLmxpbmtzID0g ZnVuY3Rpb24oZGF0YSkgewogICAgcmV0dXJuIHZvcm9ub2koZGF0YSkubGlua3MoKTsKICB9OwoK ICB2b3Jvbm9pLnRyaWFuZ2xlcyA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgIHJldHVybiB2b3Jvbm9p KGRhdGEpLnRyaWFuZ2xlcygpOwogIH07CgogIHZvcm9ub2kueCA9IGZ1bmN0aW9uKF8pIHsKICAg IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/ IF8gOiBjb25zdGFudCRjKCtfKSwgdm9yb25vaSkgOiB4OwogIH07CgogIHZvcm9ub2kueSA9IGZ1 bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkgPSB0eXBlb2YgXyA9 PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRjKCtfKSwgdm9yb25vaSkgOiB5OwogIH07Cgog IHZvcm9ub2kuZXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5n dGggPyAoZXh0ZW50ID0gXyA9PSBudWxsID8gbnVsbCA6IFtbK19bMF1bMF0sICtfWzBdWzFdXSwg WytfWzFdWzBdLCArX1sxXVsxXV1dLCB2b3Jvbm9pKSA6IGV4dGVudCAmJiBbW2V4dGVudFswXVsw XSwgZXh0ZW50WzBdWzFdXSwgW2V4dGVudFsxXVswXSwgZXh0ZW50WzFdWzFdXV07CiAgfTsKCiAg dm9yb25vaS5zaXplID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgg PyAoZXh0ZW50ID0gXyA9PSBudWxsID8gbnVsbCA6IFtbMCwgMF0sIFsrX1swXSwgK19bMV1dXSwg dm9yb25vaSkgOiBleHRlbnQgJiYgW2V4dGVudFsxXVswXSAtIGV4dGVudFswXVswXSwgZXh0ZW50 WzFdWzFdIC0gZXh0ZW50WzBdWzFdXTsKICB9OwoKICByZXR1cm4gdm9yb25vaTsKfQoKZnVuY3Rp b24gY29uc3RhbnQkZCh4KSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHg7CiAg fTsKfQoKZnVuY3Rpb24gWm9vbUV2ZW50KHRhcmdldCwgdHlwZSwgdHJhbnNmb3JtKSB7CiAgdGhp cy50YXJnZXQgPSB0YXJnZXQ7CiAgdGhpcy50eXBlID0gdHlwZTsKICB0aGlzLnRyYW5zZm9ybSA9 IHRyYW5zZm9ybTsKfQoKZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHsKICB0aGlzLmsgPSBr OwogIHRoaXMueCA9IHg7CiAgdGhpcy55ID0geTsKfQoKVHJhbnNmb3JtLnByb3RvdHlwZSA9IHsK ICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLAogIHNjYWxlOiBmdW5jdGlvbihrKSB7CiAgICByZXR1 cm4gayA9PT0gMSA/IHRoaXMgOiBuZXcgVHJhbnNmb3JtKHRoaXMuayAqIGssIHRoaXMueCwgdGhp cy55KTsKICB9LAogIHRyYW5zbGF0ZTogZnVuY3Rpb24oeCwgeSkgewogICAgcmV0dXJuIHggPT09 IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rLCB0aGlzLnggKyB0aGlz LmsgKiB4LCB0aGlzLnkgKyB0aGlzLmsgKiB5KTsKICB9LAogIGFwcGx5OiBmdW5jdGlvbihwb2lu dCkgewogICAgcmV0dXJuIFtwb2ludFswXSAqIHRoaXMuayArIHRoaXMueCwgcG9pbnRbMV0gKiB0 aGlzLmsgKyB0aGlzLnldOwogIH0sCiAgYXBwbHlYOiBmdW5jdGlvbih4KSB7CiAgICByZXR1cm4g eCAqIHRoaXMuayArIHRoaXMueDsKICB9LAogIGFwcGx5WTogZnVuY3Rpb24oeSkgewogICAgcmV0 dXJuIHkgKiB0aGlzLmsgKyB0aGlzLnk7CiAgfSwKICBpbnZlcnQ6IGZ1bmN0aW9uKGxvY2F0aW9u KSB7CiAgICByZXR1cm4gWyhsb2NhdGlvblswXSAtIHRoaXMueCkgLyB0aGlzLmssIChsb2NhdGlv blsxXSAtIHRoaXMueSkgLyB0aGlzLmtdOwogIH0sCiAgaW52ZXJ0WDogZnVuY3Rpb24oeCkgewog ICAgcmV0dXJuICh4IC0gdGhpcy54KSAvIHRoaXMuazsKICB9LAogIGludmVydFk6IGZ1bmN0aW9u KHkpIHsKICAgIHJldHVybiAoeSAtIHRoaXMueSkgLyB0aGlzLms7CiAgfSwKICByZXNjYWxlWDog ZnVuY3Rpb24oeCkgewogICAgcmV0dXJuIHguY29weSgpLmRvbWFpbih4LnJhbmdlKCkubWFwKHRo aXMuaW52ZXJ0WCwgdGhpcykubWFwKHguaW52ZXJ0LCB4KSk7CiAgfSwKICByZXNjYWxlWTogZnVu Y3Rpb24oeSkgewogICAgcmV0dXJuIHkuY29weSgpLmRvbWFpbih5LnJhbmdlKCkubWFwKHRoaXMu aW52ZXJ0WSwgdGhpcykubWFwKHkuaW52ZXJ0LCB5KSk7CiAgfSwKICB0b1N0cmluZzogZnVuY3Rp b24oKSB7CiAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgdGhpcy54ICsgIiwiICsgdGhpcy55ICsg Iikgc2NhbGUoIiArIHRoaXMuayArICIpIjsKICB9Cn07Cgp2YXIgaWRlbnRpdHkkOSA9IG5ldyBU cmFuc2Zvcm0oMSwgMCwgMCk7Cgp0cmFuc2Zvcm0kMS5wcm90b3R5cGUgPSBUcmFuc2Zvcm0ucHJv dG90eXBlOwoKZnVuY3Rpb24gdHJhbnNmb3JtJDEobm9kZSkgewogIHdoaWxlICghbm9kZS5fX3pv b20pIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm4gaWRlbnRpdHkkOTsKICBy ZXR1cm4gbm9kZS5fX3pvb207Cn0KCmZ1bmN0aW9uIG5vcHJvcGFnYXRpb24kMigpIHsKICBleHBv cnRzLmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwp9CgpmdW5jdGlvbiBub2V2ZW50 JDIoKSB7CiAgZXhwb3J0cy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogIGV4cG9ydHMuZXZlbnQu c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7Cn0KCi8vIElnbm9yZSByaWdodC1jbGljaywgc2lu Y2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LgpmdW5jdGlvbiBkZWZhdWx0Rmls dGVyJDIoKSB7CiAgcmV0dXJuICFleHBvcnRzLmV2ZW50LmN0cmxLZXkgJiYgIWV4cG9ydHMuZXZl bnQuYnV0dG9uOwp9CgpmdW5jdGlvbiBkZWZhdWx0RXh0ZW50JDEoKSB7CiAgdmFyIGUgPSB0aGlz OwogIGlmIChlIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgewogICAgZSA9IGUub3duZXJTVkdFbGVt ZW50IHx8IGU7CiAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoInZpZXdCb3giKSkgewogICAgICBlID0g ZS52aWV3Qm94LmJhc2VWYWw7CiAgICAgIHJldHVybiBbW2UueCwgZS55XSwgW2UueCArIGUud2lk dGgsIGUueSArIGUuaGVpZ2h0XV07CiAgICB9CiAgICByZXR1cm4gW1swLCAwXSwgW2Uud2lkdGgu YmFzZVZhbC52YWx1ZSwgZS5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dOwogIH0KICByZXR1cm4gW1sw LCAwXSwgW2UuY2xpZW50V2lkdGgsIGUuY2xpZW50SGVpZ2h0XV07Cn0KCmZ1bmN0aW9uIGRlZmF1 bHRUcmFuc2Zvcm0oKSB7CiAgcmV0dXJuIHRoaXMuX196b29tIHx8IGlkZW50aXR5JDk7Cn0KCmZ1 bmN0aW9uIGRlZmF1bHRXaGVlbERlbHRhKCkgewogIHJldHVybiAtZXhwb3J0cy5ldmVudC5kZWx0 YVkgKiAoZXhwb3J0cy5ldmVudC5kZWx0YU1vZGUgPT09IDEgPyAwLjA1IDogZXhwb3J0cy5ldmVu dC5kZWx0YU1vZGUgPyAxIDogMC4wMDIpOwp9CgpmdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlJDIo KSB7CiAgcmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyB8fCAoIm9udG91Y2hzdGFydCIg aW4gdGhpcyk7Cn0KCmZ1bmN0aW9uIGRlZmF1bHRDb25zdHJhaW4odHJhbnNmb3JtLCBleHRlbnQs IHRyYW5zbGF0ZUV4dGVudCkgewogIHZhciBkeDAgPSB0cmFuc2Zvcm0uaW52ZXJ0WChleHRlbnRb MF1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzBdLAogICAgICBkeDEgPSB0cmFuc2Zvcm0uaW52 ZXJ0WChleHRlbnRbMV1bMF0pIC0gdHJhbnNsYXRlRXh0ZW50WzFdWzBdLAogICAgICBkeTAgPSB0 cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMF1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzFdLAog ICAgICBkeTEgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMV1bMV0pIC0gdHJhbnNsYXRlRXh0 ZW50WzFdWzFdOwogIHJldHVybiB0cmFuc2Zvcm0udHJhbnNsYXRlKAogICAgZHgxID4gZHgwID8g KGR4MCArIGR4MSkgLyAyIDogTWF0aC5taW4oMCwgZHgwKSB8fCBNYXRoLm1heCgwLCBkeDEpLAog ICAgZHkxID4gZHkwID8gKGR5MCArIGR5MSkgLyAyIDogTWF0aC5taW4oMCwgZHkwKSB8fCBNYXRo Lm1heCgwLCBkeTEpCiAgKTsKfQoKZnVuY3Rpb24gem9vbSgpIHsKICB2YXIgZmlsdGVyID0gZGVm YXVsdEZpbHRlciQyLAogICAgICBleHRlbnQgPSBkZWZhdWx0RXh0ZW50JDEsCiAgICAgIGNvbnN0 cmFpbiA9IGRlZmF1bHRDb25zdHJhaW4sCiAgICAgIHdoZWVsRGVsdGEgPSBkZWZhdWx0V2hlZWxE ZWx0YSwKICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSQyLAogICAgICBzY2FsZUV4 dGVudCA9IFswLCBJbmZpbml0eV0sCiAgICAgIHRyYW5zbGF0ZUV4dGVudCA9IFtbLUluZmluaXR5 LCAtSW5maW5pdHldLCBbSW5maW5pdHksIEluZmluaXR5XV0sCiAgICAgIGR1cmF0aW9uID0gMjUw LAogICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlWm9vbSwKICAgICAgbGlzdGVuZXJzID0g ZGlzcGF0Y2goInN0YXJ0IiwgInpvb20iLCAiZW5kIiksCiAgICAgIHRvdWNoc3RhcnRpbmcsCiAg ICAgIHRvdWNoZW5kaW5nLAogICAgICB0b3VjaERlbGF5ID0gNTAwLAogICAgICB3aGVlbERlbGF5 ID0gMTUwLAogICAgICBjbGlja0Rpc3RhbmNlMiA9IDA7CgogIGZ1bmN0aW9uIHpvb20oc2VsZWN0 aW9uKSB7CiAgICBzZWxlY3Rpb24KICAgICAgICAucHJvcGVydHkoIl9fem9vbSIsIGRlZmF1bHRU cmFuc2Zvcm0pCiAgICAgICAgLm9uKCJ3aGVlbC56b29tIiwgd2hlZWxlZCkKICAgICAgICAub24o Im1vdXNlZG93bi56b29tIiwgbW91c2Vkb3duZWQpCiAgICAgICAgLm9uKCJkYmxjbGljay56b29t IiwgZGJsY2xpY2tlZCkKICAgICAgLmZpbHRlcih0b3VjaGFibGUpCiAgICAgICAgLm9uKCJ0b3Vj aHN0YXJ0Lnpvb20iLCB0b3VjaHN0YXJ0ZWQpCiAgICAgICAgLm9uKCJ0b3VjaG1vdmUuem9vbSIs IHRvdWNobW92ZWQpCiAgICAgICAgLm9uKCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb20i LCB0b3VjaGVuZGVkKQogICAgICAgIC5zdHlsZSgidG91Y2gtYWN0aW9uIiwgIm5vbmUiKQogICAg ICAgIC5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwgInJnYmEoMCwwLDAsMCki KTsKICB9CgogIHpvb20udHJhbnNmb3JtID0gZnVuY3Rpb24oY29sbGVjdGlvbiwgdHJhbnNmb3Jt LCBwb2ludCkgewogICAgdmFyIHNlbGVjdGlvbiA9IGNvbGxlY3Rpb24uc2VsZWN0aW9uID8gY29s bGVjdGlvbi5zZWxlY3Rpb24oKSA6IGNvbGxlY3Rpb247CiAgICBzZWxlY3Rpb24ucHJvcGVydHko Il9fem9vbSIsIGRlZmF1bHRUcmFuc2Zvcm0pOwogICAgaWYgKGNvbGxlY3Rpb24gIT09IHNlbGVj dGlvbikgewogICAgICBzY2hlZHVsZShjb2xsZWN0aW9uLCB0cmFuc2Zvcm0sIHBvaW50KTsKICAg IH0gZWxzZSB7CiAgICAgIHNlbGVjdGlvbi5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCkgewog ICAgICAgIGdlc3R1cmUodGhpcywgYXJndW1lbnRzKQogICAgICAgICAgICAuc3RhcnQoKQogICAg ICAgICAgICAuem9vbShudWxsLCB0eXBlb2YgdHJhbnNmb3JtID09PSAiZnVuY3Rpb24iID8gdHJh bnNmb3JtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB0cmFuc2Zvcm0pCiAgICAgICAgICAgIC5l bmQoKTsKICAgICAgfSk7CiAgICB9CiAgfTsKCiAgem9vbS5zY2FsZUJ5ID0gZnVuY3Rpb24oc2Vs ZWN0aW9uLCBrLCBwKSB7CiAgICB6b29tLnNjYWxlVG8oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHsK ICAgICAgdmFyIGswID0gdGhpcy5fX3pvb20uaywKICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09 ICJmdW5jdGlvbiIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrOwogICAgICByZXR1cm4g azAgKiBrMTsKICAgIH0sIHApOwogIH07CgogIHpvb20uc2NhbGVUbyA9IGZ1bmN0aW9uKHNlbGVj dGlvbiwgaywgcCkgewogICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHsK ICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgIHQw ID0gdGhpcy5fX3pvb20sCiAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDog dHlwZW9mIHAgPT09ICJmdW5jdGlvbiIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwLAog ICAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLAogICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0g ImZ1bmN0aW9uIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7CiAgICAgIHJldHVybiBj b25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGUsIHRyYW5zbGF0ZUV4 dGVudCk7CiAgICB9LCBwKTsKICB9OwoKICB6b29tLnRyYW5zbGF0ZUJ5ID0gZnVuY3Rpb24oc2Vs ZWN0aW9uLCB4LCB5KSB7CiAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkg ewogICAgICByZXR1cm4gY29uc3RyYWluKHRoaXMuX196b29tLnRyYW5zbGF0ZSgKICAgICAgICB0 eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHguYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHgsCiAg ICAgICAgdHlwZW9mIHkgPT09ICJmdW5jdGlvbiIgPyB5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykg OiB5CiAgICAgICksIGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0cmFuc2xhdGVFeHRl bnQpOwogICAgfSk7CiAgfTsKCiAgem9vbS50cmFuc2xhdGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlv biwgeCwgeSwgcCkgewogICAgem9vbS50cmFuc2Zvcm0oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHsK ICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgIHQg PSB0aGlzLl9fem9vbSwKICAgICAgICAgIHAwID0gcCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0 eXBlb2YgcCA9PT0gImZ1bmN0aW9uIiA/IHAuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHA7CiAg ICAgIHJldHVybiBjb25zdHJhaW4oaWRlbnRpdHkkOS50cmFuc2xhdGUocDBbMF0sIHAwWzFdKS5z Y2FsZSh0LmspLnRyYW5zbGF0ZSgKICAgICAgICB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IC14 LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteCwKICAgICAgICB0eXBlb2YgeSA9PT0gImZ1bmN0 aW9uIiA/IC15LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteQogICAgICApLCBlLCB0cmFuc2xh dGVFeHRlbnQpOwogICAgfSwgcCk7CiAgfTsKCiAgZnVuY3Rpb24gc2NhbGUodHJhbnNmb3JtLCBr KSB7CiAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50 WzFdLCBrKSk7CiAgICByZXR1cm4gayA9PT0gdHJhbnNmb3JtLmsgPyB0cmFuc2Zvcm0gOiBuZXcg VHJhbnNmb3JtKGssIHRyYW5zZm9ybS54LCB0cmFuc2Zvcm0ueSk7CiAgfQoKICBmdW5jdGlvbiB0 cmFuc2xhdGUodHJhbnNmb3JtLCBwMCwgcDEpIHsKICAgIHZhciB4ID0gcDBbMF0gLSBwMVswXSAq IHRyYW5zZm9ybS5rLCB5ID0gcDBbMV0gLSBwMVsxXSAqIHRyYW5zZm9ybS5rOwogICAgcmV0dXJu IHggPT09IHRyYW5zZm9ybS54ICYmIHkgPT09IHRyYW5zZm9ybS55ID8gdHJhbnNmb3JtIDogbmV3 IFRyYW5zZm9ybSh0cmFuc2Zvcm0uaywgeCwgeSk7CiAgfQoKICBmdW5jdGlvbiBjZW50cm9pZChl eHRlbnQpIHsKICAgIHJldHVybiBbKCtleHRlbnRbMF1bMF0gKyArZXh0ZW50WzFdWzBdKSAvIDIs ICgrZXh0ZW50WzBdWzFdICsgK2V4dGVudFsxXVsxXSkgLyAyXTsKICB9CgogIGZ1bmN0aW9uIHNj aGVkdWxlKHRyYW5zaXRpb24sIHRyYW5zZm9ybSwgcG9pbnQpIHsKICAgIHRyYW5zaXRpb24KICAg ICAgICAub24oInN0YXJ0Lnpvb20iLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVu dHMpLnN0YXJ0KCk7IH0pCiAgICAgICAgLm9uKCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbSIsIGZ1 bmN0aW9uKCkgeyBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykuZW5kKCk7IH0pCiAgICAgICAgLnR3 ZWVuKCJ6b29tIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAg ICAgICAgICAgYXJncyA9IGFyZ3VtZW50cywKICAgICAgICAgICAgICBnID0gZ2VzdHVyZSh0aGF0 LCBhcmdzKSwKICAgICAgICAgICAgICBlID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpLAogICAg ICAgICAgICAgIHAgPSBwb2ludCA9PSBudWxsID8gY2VudHJvaWQoZSkgOiB0eXBlb2YgcG9pbnQg PT09ICJmdW5jdGlvbiIgPyBwb2ludC5hcHBseSh0aGF0LCBhcmdzKSA6IHBvaW50LAogICAgICAg ICAgICAgIHcgPSBNYXRoLm1heChlWzFdWzBdIC0gZVswXVswXSwgZVsxXVsxXSAtIGVbMF1bMV0p LAogICAgICAgICAgICAgIGEgPSB0aGF0Ll9fem9vbSwKICAgICAgICAgICAgICBiID0gdHlwZW9m IHRyYW5zZm9ybSA9PT0gImZ1bmN0aW9uIiA/IHRyYW5zZm9ybS5hcHBseSh0aGF0LCBhcmdzKSA6 IHRyYW5zZm9ybSwKICAgICAgICAgICAgICBpID0gaW50ZXJwb2xhdGUoYS5pbnZlcnQocCkuY29u Y2F0KHcgLyBhLmspLCBiLmludmVydChwKS5jb25jYXQodyAvIGIuaykpOwogICAgICAgICAgcmV0 dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgICAgaWYgKHQgPT09IDEpIHQgPSBiOyAvLyBBdm9p ZCByb3VuZGluZyBlcnJvciBvbiBlbmQuCiAgICAgICAgICAgIGVsc2UgeyB2YXIgbCA9IGkodCks IGsgPSB3IC8gbFsyXTsgdCA9IG5ldyBUcmFuc2Zvcm0oaywgcFswXSAtIGxbMF0gKiBrLCBwWzFd IC0gbFsxXSAqIGspOyB9CiAgICAgICAgICAgIGcuem9vbShudWxsLCB0KTsKICAgICAgICAgIH07 CiAgICAgICAgfSk7CiAgfQoKICBmdW5jdGlvbiBnZXN0dXJlKHRoYXQsIGFyZ3MsIGNsZWFuKSB7 CiAgICByZXR1cm4gKCFjbGVhbiAmJiB0aGF0Ll9fem9vbWluZykgfHwgbmV3IEdlc3R1cmUodGhh dCwgYXJncyk7CiAgfQoKICBmdW5jdGlvbiBHZXN0dXJlKHRoYXQsIGFyZ3MpIHsKICAgIHRoaXMu dGhhdCA9IHRoYXQ7CiAgICB0aGlzLmFyZ3MgPSBhcmdzOwogICAgdGhpcy5hY3RpdmUgPSAwOwog ICAgdGhpcy5leHRlbnQgPSBleHRlbnQuYXBwbHkodGhhdCwgYXJncyk7CiAgICB0aGlzLnRhcHMg PSAwOwogIH0KCiAgR2VzdHVyZS5wcm90b3R5cGUgPSB7CiAgICBzdGFydDogZnVuY3Rpb24oKSB7 CiAgICAgIGlmICgrK3RoaXMuYWN0aXZlID09PSAxKSB7CiAgICAgICAgdGhpcy50aGF0Ll9fem9v bWluZyA9IHRoaXM7CiAgICAgICAgdGhpcy5lbWl0KCJzdGFydCIpOwogICAgICB9CiAgICAgIHJl dHVybiB0aGlzOwogICAgfSwKICAgIHpvb206IGZ1bmN0aW9uKGtleSwgdHJhbnNmb3JtKSB7CiAg ICAgIGlmICh0aGlzLm1vdXNlICYmIGtleSAhPT0gIm1vdXNlIikgdGhpcy5tb3VzZVsxXSA9IHRy YW5zZm9ybS5pbnZlcnQodGhpcy5tb3VzZVswXSk7CiAgICAgIGlmICh0aGlzLnRvdWNoMCAmJiBr ZXkgIT09ICJ0b3VjaCIpIHRoaXMudG91Y2gwWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRv dWNoMFswXSk7CiAgICAgIGlmICh0aGlzLnRvdWNoMSAmJiBrZXkgIT09ICJ0b3VjaCIpIHRoaXMu dG91Y2gxWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRvdWNoMVswXSk7CiAgICAgIHRoaXMu dGhhdC5fX3pvb20gPSB0cmFuc2Zvcm07CiAgICAgIHRoaXMuZW1pdCgiem9vbSIpOwogICAgICBy ZXR1cm4gdGhpczsKICAgIH0sCiAgICBlbmQ6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoLS10aGlz LmFjdGl2ZSA9PT0gMCkgewogICAgICAgIGRlbGV0ZSB0aGlzLnRoYXQuX196b29taW5nOwogICAg ICAgIHRoaXMuZW1pdCgiZW5kIik7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9LAog ICAgZW1pdDogZnVuY3Rpb24odHlwZSkgewogICAgICBjdXN0b21FdmVudChuZXcgWm9vbUV2ZW50 KHpvb20sIHR5cGUsIHRoaXMudGhhdC5fX3pvb20pLCBsaXN0ZW5lcnMuYXBwbHksIGxpc3RlbmVy cywgW3R5cGUsIHRoaXMudGhhdCwgdGhpcy5hcmdzXSk7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24g d2hlZWxlZCgpIHsKICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVy bjsKICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgIHQgPSB0aGlz Ll9fem9vbSwKICAgICAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNj YWxlRXh0ZW50WzFdLCB0LmsgKiBNYXRoLnBvdygyLCB3aGVlbERlbHRhLmFwcGx5KHRoaXMsIGFy Z3VtZW50cykpKSksCiAgICAgICAgcCA9IG1vdXNlKHRoaXMpOwoKICAgIC8vIElmIHRoZSBtb3Vz ZSBpcyBpbiB0aGUgc2FtZSBsb2NhdGlvbiBhcyBiZWZvcmUsIHJldXNlIGl0LgogICAgLy8gSWYg dGhlcmUgd2VyZSByZWNlbnQgd2hlZWwgZXZlbnRzLCByZXNldCB0aGUgd2hlZWwgaWRsZSB0aW1l b3V0LgogICAgaWYgKGcud2hlZWwpIHsKICAgICAgaWYgKGcubW91c2VbMF1bMF0gIT09IHBbMF0g fHwgZy5tb3VzZVswXVsxXSAhPT0gcFsxXSkgewogICAgICAgIGcubW91c2VbMV0gPSB0LmludmVy dChnLm1vdXNlWzBdID0gcCk7CiAgICAgIH0KICAgICAgY2xlYXJUaW1lb3V0KGcud2hlZWwpOwog ICAgfQoKICAgIC8vIElmIHRoaXMgd2hlZWwgZXZlbnQgd29u4oCZdCB0cmlnZ2VyIGEgdHJhbnNm b3JtIGNoYW5nZSwgaWdub3JlIGl0LgogICAgZWxzZSBpZiAodC5rID09PSBrKSByZXR1cm47Cgog ICAgLy8gT3RoZXJ3aXNlLCBjYXB0dXJlIHRoZSBtb3VzZSBwb2ludCBhbmQgbG9jYXRpb24gYXQg dGhlIHN0YXJ0LgogICAgZWxzZSB7CiAgICAgIGcubW91c2UgPSBbcCwgdC5pbnZlcnQocCldOwog ICAgICBpbnRlcnJ1cHQodGhpcyk7CiAgICAgIGcuc3RhcnQoKTsKICAgIH0KCiAgICBub2V2ZW50 JDIoKTsKICAgIGcud2hlZWwgPSBzZXRUaW1lb3V0KHdoZWVsaWRsZWQsIHdoZWVsRGVsYXkpOwog ICAgZy56b29tKCJtb3VzZSIsIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodCwgayksIGcubW91 c2VbMF0sIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7CgogICAgZnVu Y3Rpb24gd2hlZWxpZGxlZCgpIHsKICAgICAgZy53aGVlbCA9IG51bGw7CiAgICAgIGcuZW5kKCk7 CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtb3VzZWRvd25lZCgpIHsKICAgIGlmICh0b3VjaGVuZGlu ZyB8fCAhZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjsKICAgIHZhciBnID0g Z2VzdHVyZSh0aGlzLCBhcmd1bWVudHMsIHRydWUpLAogICAgICAgIHYgPSBzZWxlY3QoZXhwb3J0 cy5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLnpvb20iLCBtb3VzZW1vdmVkLCB0cnVlKS5vbigi bW91c2V1cC56b29tIiwgbW91c2V1cHBlZCwgdHJ1ZSksCiAgICAgICAgcCA9IG1vdXNlKHRoaXMp LAogICAgICAgIHgwID0gZXhwb3J0cy5ldmVudC5jbGllbnRYLAogICAgICAgIHkwID0gZXhwb3J0 cy5ldmVudC5jbGllbnRZOwoKICAgIGRyYWdEaXNhYmxlKGV4cG9ydHMuZXZlbnQudmlldyk7CiAg ICBub3Byb3BhZ2F0aW9uJDIoKTsKICAgIGcubW91c2UgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0 KHApXTsKICAgIGludGVycnVwdCh0aGlzKTsKICAgIGcuc3RhcnQoKTsKCiAgICBmdW5jdGlvbiBt b3VzZW1vdmVkKCkgewogICAgICBub2V2ZW50JDIoKTsKICAgICAgaWYgKCFnLm1vdmVkKSB7CiAg ICAgICAgdmFyIGR4ID0gZXhwb3J0cy5ldmVudC5jbGllbnRYIC0geDAsIGR5ID0gZXhwb3J0cy5l dmVudC5jbGllbnRZIC0geTA7CiAgICAgICAgZy5tb3ZlZCA9IGR4ICogZHggKyBkeSAqIGR5ID4g Y2xpY2tEaXN0YW5jZTI7CiAgICAgIH0KICAgICAgZy56b29tKCJtb3VzZSIsIGNvbnN0cmFpbih0 cmFuc2xhdGUoZy50aGF0Ll9fem9vbSwgZy5tb3VzZVswXSA9IG1vdXNlKGcudGhhdCksIGcubW91 c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7CiAgICB9CgogICAgZnVuY3Rpb24g bW91c2V1cHBlZCgpIHsKICAgICAgdi5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIiwg bnVsbCk7CiAgICAgIHllc2RyYWcoZXhwb3J0cy5ldmVudC52aWV3LCBnLm1vdmVkKTsKICAgICAg bm9ldmVudCQyKCk7CiAgICAgIGcuZW5kKCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkYmxjbGlj a2VkKCkgewogICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuOwog ICAgdmFyIHQwID0gdGhpcy5fX3pvb20sCiAgICAgICAgcDAgPSBtb3VzZSh0aGlzKSwKICAgICAg ICBwMSA9IHQwLmludmVydChwMCksCiAgICAgICAgazEgPSB0MC5rICogKGV4cG9ydHMuZXZlbnQu c2hpZnRLZXkgPyAwLjUgOiAyKSwKICAgICAgICB0MSA9IGNvbnN0cmFpbih0cmFuc2xhdGUoc2Nh bGUodDAsIGsxKSwgcDAsIHAxKSwgZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHRyYW5z bGF0ZUV4dGVudCk7CgogICAgbm9ldmVudCQyKCk7CiAgICBpZiAoZHVyYXRpb24gPiAwKSBzZWxl Y3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5jYWxsKHNjaGVkdWxlLCB0 MSwgcDApOwogICAgZWxzZSBzZWxlY3QodGhpcykuY2FsbCh6b29tLnRyYW5zZm9ybSwgdDEpOwog IH0KCiAgZnVuY3Rpb24gdG91Y2hzdGFydGVkKCkgewogICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhp cywgYXJndW1lbnRzKSkgcmV0dXJuOwogICAgdmFyIHRvdWNoZXMgPSBleHBvcnRzLmV2ZW50LnRv dWNoZXMsCiAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLAogICAgICAgIGcgPSBnZXN0dXJlKHRo aXMsIGFyZ3VtZW50cywgZXhwb3J0cy5ldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPT09IG4p LAogICAgICAgIHN0YXJ0ZWQsIGksIHQsIHA7CgogICAgbm9wcm9wYWdhdGlvbiQyKCk7CiAgICBm b3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gdG91Y2go dGhpcywgdG91Y2hlcywgdC5pZGVudGlmaWVyKTsKICAgICAgcCA9IFtwLCB0aGlzLl9fem9vbS5p bnZlcnQocCksIHQuaWRlbnRpZmllcl07CiAgICAgIGlmICghZy50b3VjaDApIGcudG91Y2gwID0g cCwgc3RhcnRlZCA9IHRydWUsIGcudGFwcyA9IDEgKyAhIXRvdWNoc3RhcnRpbmc7CiAgICAgIGVs c2UgaWYgKCFnLnRvdWNoMSAmJiBnLnRvdWNoMFsyXSAhPT0gcFsyXSkgZy50b3VjaDEgPSBwLCBn LnRhcHMgPSAwOwogICAgfQoKICAgIGlmICh0b3VjaHN0YXJ0aW5nKSB0b3VjaHN0YXJ0aW5nID0g Y2xlYXJUaW1lb3V0KHRvdWNoc3RhcnRpbmcpOwoKICAgIGlmIChzdGFydGVkKSB7CiAgICAgIGlm IChnLnRhcHMgPCAyKSB0b3VjaHN0YXJ0aW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91 Y2hzdGFydGluZyA9IG51bGw7IH0sIHRvdWNoRGVsYXkpOwogICAgICBpbnRlcnJ1cHQodGhpcyk7 CiAgICAgIGcuc3RhcnQoKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRvdWNobW92ZWQoKSB7CiAg ICBpZiAoIXRoaXMuX196b29taW5nKSByZXR1cm47CiAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywg YXJndW1lbnRzKSwKICAgICAgICB0b3VjaGVzID0gZXhwb3J0cy5ldmVudC5jaGFuZ2VkVG91Y2hl cywKICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQsIHAsIGw7CgogICAgbm9ldmVudCQy KCk7CiAgICBpZiAodG91Y2hzdGFydGluZykgdG91Y2hzdGFydGluZyA9IGNsZWFyVGltZW91dCh0 b3VjaHN0YXJ0aW5nKTsKICAgIGcudGFwcyA9IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytp KSB7CiAgICAgIHQgPSB0b3VjaGVzW2ldLCBwID0gdG91Y2godGhpcywgdG91Y2hlcywgdC5pZGVu dGlmaWVyKTsKICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZp ZXIpIGcudG91Y2gwWzBdID0gcDsKICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFb Ml0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDFbMF0gPSBwOwogICAgfQogICAgdCA9IGcudGhh dC5fX3pvb207CiAgICBpZiAoZy50b3VjaDEpIHsKICAgICAgdmFyIHAwID0gZy50b3VjaDBbMF0s IGwwID0gZy50b3VjaDBbMV0sCiAgICAgICAgICBwMSA9IGcudG91Y2gxWzBdLCBsMSA9IGcudG91 Y2gxWzFdLAogICAgICAgICAgZHAgPSAoZHAgPSBwMVswXSAtIHAwWzBdKSAqIGRwICsgKGRwID0g cDFbMV0gLSBwMFsxXSkgKiBkcCwKICAgICAgICAgIGRsID0gKGRsID0gbDFbMF0gLSBsMFswXSkg KiBkbCArIChkbCA9IGwxWzFdIC0gbDBbMV0pICogZGw7CiAgICAgIHQgPSBzY2FsZSh0LCBNYXRo LnNxcnQoZHAgLyBkbCkpOwogICAgICBwID0gWyhwMFswXSArIHAxWzBdKSAvIDIsIChwMFsxXSAr IHAxWzFdKSAvIDJdOwogICAgICBsID0gWyhsMFswXSArIGwxWzBdKSAvIDIsIChsMFsxXSArIGwx WzFdKSAvIDJdOwogICAgfQogICAgZWxzZSBpZiAoZy50b3VjaDApIHAgPSBnLnRvdWNoMFswXSwg bCA9IGcudG91Y2gwWzFdOwogICAgZWxzZSByZXR1cm47CiAgICBnLnpvb20oInRvdWNoIiwgY29u c3RyYWluKHRyYW5zbGF0ZSh0LCBwLCBsKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpOwog IH0KCiAgZnVuY3Rpb24gdG91Y2hlbmRlZCgpIHsKICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJl dHVybjsKICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgIHRvdWNo ZXMgPSBleHBvcnRzLmV2ZW50LmNoYW5nZWRUb3VjaGVzLAogICAgICAgIG4gPSB0b3VjaGVzLmxl bmd0aCwgaSwgdDsKCiAgICBub3Byb3BhZ2F0aW9uJDIoKTsKICAgIGlmICh0b3VjaGVuZGluZykg Y2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTsKICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChm dW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTsKICAgIGZvciAo aSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgdCA9IHRvdWNoZXNbaV07CiAgICAgIGlmIChnLnRv dWNoMCAmJiBnLnRvdWNoMFsyXSA9PT0gdC5pZGVudGlmaWVyKSBkZWxldGUgZy50b3VjaDA7CiAg ICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGRl bGV0ZSBnLnRvdWNoMTsKICAgIH0KICAgIGlmIChnLnRvdWNoMSAmJiAhZy50b3VjaDApIGcudG91 Y2gwID0gZy50b3VjaDEsIGRlbGV0ZSBnLnRvdWNoMTsKICAgIGlmIChnLnRvdWNoMCkgZy50b3Vj aDBbMV0gPSB0aGlzLl9fem9vbS5pbnZlcnQoZy50b3VjaDBbMF0pOwogICAgZWxzZSB7CiAgICAg IGcuZW5kKCk7CiAgICAgIC8vIElmIHRoaXMgd2FzIGEgZGJsdGFwLCByZXJvdXRlIHRvIHRoZSAo b3B0aW9uYWwpIGRibGNsaWNrLnpvb20gaGFuZGxlci4KICAgICAgaWYgKGcudGFwcyA9PT0gMikg ewogICAgICAgIHZhciBwID0gc2VsZWN0KHRoaXMpLm9uKCJkYmxjbGljay56b29tIik7CiAgICAg ICAgaWYgKHApIHAuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfQogICAgfQogIH0KCiAg em9vbS53aGVlbERlbHRhID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5n dGggPyAod2hlZWxEZWx0YSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50 JGQoK18pLCB6b29tKSA6IHdoZWVsRGVsdGE7CiAgfTsKCiAgem9vbS5maWx0ZXIgPSBmdW5jdGlv bihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9 PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRkKCEhXyksIHpvb20pIDogZmlsdGVyOwogIH07 CgogIHpvb20udG91Y2hhYmxlID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5s ZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3Rh bnQkZCghIV8pLCB6b29tKSA6IHRvdWNoYWJsZTsKICB9OwoKICB6b29tLmV4dGVudCA9IGZ1bmN0 aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IHR5cGVvZiBf ID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGQoW1srX1swXVswXSwgK19bMF1bMV1dLCBb K19bMV1bMF0sICtfWzFdWzFdXV0pLCB6b29tKSA6IGV4dGVudDsKICB9OwoKICB6b29tLnNjYWxl RXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2Nh bGVFeHRlbnRbMF0gPSArX1swXSwgc2NhbGVFeHRlbnRbMV0gPSArX1sxXSwgem9vbSkgOiBbc2Nh bGVFeHRlbnRbMF0sIHNjYWxlRXh0ZW50WzFdXTsKICB9OwoKICB6b29tLnRyYW5zbGF0ZUV4dGVu dCA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zbGF0 ZUV4dGVudFswXVswXSA9ICtfWzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMF0gPSArX1sxXVsw XSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdID0gK19bMF1bMV0sIHRyYW5zbGF0ZUV4dGVudFsxXVsx XSA9ICtfWzFdWzFdLCB6b29tKSA6IFtbdHJhbnNsYXRlRXh0ZW50WzBdWzBdLCB0cmFuc2xhdGVF eHRlbnRbMF1bMV1dLCBbdHJhbnNsYXRlRXh0ZW50WzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1b MV1dXTsKICB9OwoKICB6b29tLmNvbnN0cmFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBh cmd1bWVudHMubGVuZ3RoID8gKGNvbnN0cmFpbiA9IF8sIHpvb20pIDogY29uc3RyYWluOwogIH07 CgogIHpvb20uZHVyYXRpb24gPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxl bmd0aCA/IChkdXJhdGlvbiA9ICtfLCB6b29tKSA6IGR1cmF0aW9uOwogIH07CgogIHpvb20uaW50 ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChp bnRlcnBvbGF0ZSA9IF8sIHpvb20pIDogaW50ZXJwb2xhdGU7CiAgfTsKCiAgem9vbS5vbiA9IGZ1 bmN0aW9uKCkgewogICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywg YXJndW1lbnRzKTsKICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gem9vbSA6IHZhbHVl OwogIH07CgogIHpvb20uY2xpY2tEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHsKICAgIHJldHVybiBh cmd1bWVudHMubGVuZ3RoID8gKGNsaWNrRGlzdGFuY2UyID0gKF8gPSArXykgKiBfLCB6b29tKSA6 IE1hdGguc3FydChjbGlja0Rpc3RhbmNlMik7CiAgfTsKCiAgcmV0dXJuIHpvb207Cn0KCmV4cG9y dHMuRm9ybWF0U3BlY2lmaWVyID0gRm9ybWF0U3BlY2lmaWVyOwpleHBvcnRzLmFjdGl2ZSA9IGFj dGl2ZTsKZXhwb3J0cy5hcmMgPSBhcmM7CmV4cG9ydHMuYXJlYSA9IGFyZWEkMzsKZXhwb3J0cy5h cmVhUmFkaWFsID0gYXJlYVJhZGlhbDsKZXhwb3J0cy5hc2NlbmRpbmcgPSBhc2NlbmRpbmc7CmV4 cG9ydHMuYXV0b1R5cGUgPSBhdXRvVHlwZTsKZXhwb3J0cy5heGlzQm90dG9tID0gYXhpc0JvdHRv bTsKZXhwb3J0cy5heGlzTGVmdCA9IGF4aXNMZWZ0OwpleHBvcnRzLmF4aXNSaWdodCA9IGF4aXNS aWdodDsKZXhwb3J0cy5heGlzVG9wID0gYXhpc1RvcDsKZXhwb3J0cy5iaXNlY3QgPSBiaXNlY3RS aWdodDsKZXhwb3J0cy5iaXNlY3RMZWZ0ID0gYmlzZWN0TGVmdDsKZXhwb3J0cy5iaXNlY3RSaWdo dCA9IGJpc2VjdFJpZ2h0OwpleHBvcnRzLmJpc2VjdG9yID0gYmlzZWN0b3I7CmV4cG9ydHMuYmxv YiA9IGJsb2I7CmV4cG9ydHMuYnJ1c2ggPSBicnVzaDsKZXhwb3J0cy5icnVzaFNlbGVjdGlvbiA9 IGJydXNoU2VsZWN0aW9uOwpleHBvcnRzLmJydXNoWCA9IGJydXNoWDsKZXhwb3J0cy5icnVzaFkg PSBicnVzaFk7CmV4cG9ydHMuYnVmZmVyID0gYnVmZmVyOwpleHBvcnRzLmNob3JkID0gY2hvcmQ7 CmV4cG9ydHMuY2xpZW50UG9pbnQgPSBwb2ludDsKZXhwb3J0cy5jbHVzdGVyID0gY2x1c3RlcjsK ZXhwb3J0cy5jb2xvciA9IGNvbG9yOwpleHBvcnRzLmNvbnRvdXJEZW5zaXR5ID0gZGVuc2l0eTsK ZXhwb3J0cy5jb250b3VycyA9IGNvbnRvdXJzOwpleHBvcnRzLmNyZWF0ZSA9IGNyZWF0ZTsKZXhw b3J0cy5jcmVhdG9yID0gY3JlYXRvcjsKZXhwb3J0cy5jcm9zcyA9IGNyb3NzOwpleHBvcnRzLmNz diA9IGNzdiQxOwpleHBvcnRzLmNzdkZvcm1hdCA9IGNzdkZvcm1hdDsKZXhwb3J0cy5jc3ZGb3Jt YXRCb2R5ID0gY3N2Rm9ybWF0Qm9keTsKZXhwb3J0cy5jc3ZGb3JtYXRSb3cgPSBjc3ZGb3JtYXRS b3c7CmV4cG9ydHMuY3N2Rm9ybWF0Um93cyA9IGNzdkZvcm1hdFJvd3M7CmV4cG9ydHMuY3N2Rm9y bWF0VmFsdWUgPSBjc3ZGb3JtYXRWYWx1ZTsKZXhwb3J0cy5jc3ZQYXJzZSA9IGNzdlBhcnNlOwpl eHBvcnRzLmNzdlBhcnNlUm93cyA9IGNzdlBhcnNlUm93czsKZXhwb3J0cy5jdWJlaGVsaXggPSBj dWJlaGVsaXg7CmV4cG9ydHMuY3VydmVCYXNpcyA9IGJhc2lzJDI7CmV4cG9ydHMuY3VydmVCYXNp c0Nsb3NlZCA9IGJhc2lzQ2xvc2VkJDE7CmV4cG9ydHMuY3VydmVCYXNpc09wZW4gPSBiYXNpc09w ZW47CmV4cG9ydHMuY3VydmVCdW5kbGUgPSBidW5kbGU7CmV4cG9ydHMuY3VydmVDYXJkaW5hbCA9 IGNhcmRpbmFsOwpleHBvcnRzLmN1cnZlQ2FyZGluYWxDbG9zZWQgPSBjYXJkaW5hbENsb3NlZDsK ZXhwb3J0cy5jdXJ2ZUNhcmRpbmFsT3BlbiA9IGNhcmRpbmFsT3BlbjsKZXhwb3J0cy5jdXJ2ZUNh dG11bGxSb20gPSBjYXRtdWxsUm9tOwpleHBvcnRzLmN1cnZlQ2F0bXVsbFJvbUNsb3NlZCA9IGNh dG11bGxSb21DbG9zZWQ7CmV4cG9ydHMuY3VydmVDYXRtdWxsUm9tT3BlbiA9IGNhdG11bGxSb21P cGVuOwpleHBvcnRzLmN1cnZlTGluZWFyID0gY3VydmVMaW5lYXI7CmV4cG9ydHMuY3VydmVMaW5l YXJDbG9zZWQgPSBsaW5lYXJDbG9zZWQ7CmV4cG9ydHMuY3VydmVNb25vdG9uZVggPSBtb25vdG9u ZVg7CmV4cG9ydHMuY3VydmVNb25vdG9uZVkgPSBtb25vdG9uZVk7CmV4cG9ydHMuY3VydmVOYXR1 cmFsID0gbmF0dXJhbDsKZXhwb3J0cy5jdXJ2ZVN0ZXAgPSBzdGVwOwpleHBvcnRzLmN1cnZlU3Rl cEFmdGVyID0gc3RlcEFmdGVyOwpleHBvcnRzLmN1cnZlU3RlcEJlZm9yZSA9IHN0ZXBCZWZvcmU7 CmV4cG9ydHMuY3VzdG9tRXZlbnQgPSBjdXN0b21FdmVudDsKZXhwb3J0cy5kZXNjZW5kaW5nID0g ZGVzY2VuZGluZzsKZXhwb3J0cy5kZXZpYXRpb24gPSBkZXZpYXRpb247CmV4cG9ydHMuZGlzcGF0 Y2ggPSBkaXNwYXRjaDsKZXhwb3J0cy5kcmFnID0gZHJhZzsKZXhwb3J0cy5kcmFnRGlzYWJsZSA9 IGRyYWdEaXNhYmxlOwpleHBvcnRzLmRyYWdFbmFibGUgPSB5ZXNkcmFnOwpleHBvcnRzLmRzdiA9 IGRzdjsKZXhwb3J0cy5kc3ZGb3JtYXQgPSBkc3ZGb3JtYXQ7CmV4cG9ydHMuZWFzZUJhY2sgPSBi YWNrSW5PdXQ7CmV4cG9ydHMuZWFzZUJhY2tJbiA9IGJhY2tJbjsKZXhwb3J0cy5lYXNlQmFja0lu T3V0ID0gYmFja0luT3V0OwpleHBvcnRzLmVhc2VCYWNrT3V0ID0gYmFja091dDsKZXhwb3J0cy5l YXNlQm91bmNlID0gYm91bmNlT3V0OwpleHBvcnRzLmVhc2VCb3VuY2VJbiA9IGJvdW5jZUluOwpl eHBvcnRzLmVhc2VCb3VuY2VJbk91dCA9IGJvdW5jZUluT3V0OwpleHBvcnRzLmVhc2VCb3VuY2VP dXQgPSBib3VuY2VPdXQ7CmV4cG9ydHMuZWFzZUNpcmNsZSA9IGNpcmNsZUluT3V0OwpleHBvcnRz LmVhc2VDaXJjbGVJbiA9IGNpcmNsZUluOwpleHBvcnRzLmVhc2VDaXJjbGVJbk91dCA9IGNpcmNs ZUluT3V0OwpleHBvcnRzLmVhc2VDaXJjbGVPdXQgPSBjaXJjbGVPdXQ7CmV4cG9ydHMuZWFzZUN1 YmljID0gY3ViaWNJbk91dDsKZXhwb3J0cy5lYXNlQ3ViaWNJbiA9IGN1YmljSW47CmV4cG9ydHMu ZWFzZUN1YmljSW5PdXQgPSBjdWJpY0luT3V0OwpleHBvcnRzLmVhc2VDdWJpY091dCA9IGN1Ymlj T3V0OwpleHBvcnRzLmVhc2VFbGFzdGljID0gZWxhc3RpY091dDsKZXhwb3J0cy5lYXNlRWxhc3Rp Y0luID0gZWxhc3RpY0luOwpleHBvcnRzLmVhc2VFbGFzdGljSW5PdXQgPSBlbGFzdGljSW5PdXQ7 CmV4cG9ydHMuZWFzZUVsYXN0aWNPdXQgPSBlbGFzdGljT3V0OwpleHBvcnRzLmVhc2VFeHAgPSBl eHBJbk91dDsKZXhwb3J0cy5lYXNlRXhwSW4gPSBleHBJbjsKZXhwb3J0cy5lYXNlRXhwSW5PdXQg PSBleHBJbk91dDsKZXhwb3J0cy5lYXNlRXhwT3V0ID0gZXhwT3V0OwpleHBvcnRzLmVhc2VMaW5l YXIgPSBsaW5lYXIkMTsKZXhwb3J0cy5lYXNlUG9seSA9IHBvbHlJbk91dDsKZXhwb3J0cy5lYXNl UG9seUluID0gcG9seUluOwpleHBvcnRzLmVhc2VQb2x5SW5PdXQgPSBwb2x5SW5PdXQ7CmV4cG9y dHMuZWFzZVBvbHlPdXQgPSBwb2x5T3V0OwpleHBvcnRzLmVhc2VRdWFkID0gcXVhZEluT3V0Owpl eHBvcnRzLmVhc2VRdWFkSW4gPSBxdWFkSW47CmV4cG9ydHMuZWFzZVF1YWRJbk91dCA9IHF1YWRJ bk91dDsKZXhwb3J0cy5lYXNlUXVhZE91dCA9IHF1YWRPdXQ7CmV4cG9ydHMuZWFzZVNpbiA9IHNp bkluT3V0OwpleHBvcnRzLmVhc2VTaW5JbiA9IHNpbkluOwpleHBvcnRzLmVhc2VTaW5Jbk91dCA9 IHNpbkluT3V0OwpleHBvcnRzLmVhc2VTaW5PdXQgPSBzaW5PdXQ7CmV4cG9ydHMuZW50cmllcyA9 IGVudHJpZXM7CmV4cG9ydHMuZXh0ZW50ID0gZXh0ZW50OwpleHBvcnRzLmZvcmNlQ2VudGVyID0g Y2VudGVyJDE7CmV4cG9ydHMuZm9yY2VDb2xsaWRlID0gY29sbGlkZTsKZXhwb3J0cy5mb3JjZUxp bmsgPSBsaW5rOwpleHBvcnRzLmZvcmNlTWFueUJvZHkgPSBtYW55Qm9keTsKZXhwb3J0cy5mb3Jj ZVJhZGlhbCA9IHJhZGlhbDsKZXhwb3J0cy5mb3JjZVNpbXVsYXRpb24gPSBzaW11bGF0aW9uOwpl eHBvcnRzLmZvcmNlWCA9IHgkMjsKZXhwb3J0cy5mb3JjZVkgPSB5JDI7CmV4cG9ydHMuZm9ybWF0 RGVmYXVsdExvY2FsZSA9IGRlZmF1bHRMb2NhbGU7CmV4cG9ydHMuZm9ybWF0TG9jYWxlID0gZm9y bWF0TG9jYWxlOwpleHBvcnRzLmZvcm1hdFNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcjsKZXhw b3J0cy5nZW9BbGJlcnMgPSBhbGJlcnM7CmV4cG9ydHMuZ2VvQWxiZXJzVXNhID0gYWxiZXJzVXNh OwpleHBvcnRzLmdlb0FyZWEgPSBhcmVhJDE7CmV4cG9ydHMuZ2VvQXppbXV0aGFsRXF1YWxBcmVh ID0gYXppbXV0aGFsRXF1YWxBcmVhOwpleHBvcnRzLmdlb0F6aW11dGhhbEVxdWFsQXJlYVJhdyA9 IGF6aW11dGhhbEVxdWFsQXJlYVJhdzsKZXhwb3J0cy5nZW9BemltdXRoYWxFcXVpZGlzdGFudCA9 IGF6aW11dGhhbEVxdWlkaXN0YW50OwpleHBvcnRzLmdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3 ID0gYXppbXV0aGFsRXF1aWRpc3RhbnRSYXc7CmV4cG9ydHMuZ2VvQm91bmRzID0gYm91bmRzOwpl eHBvcnRzLmdlb0NlbnRyb2lkID0gY2VudHJvaWQ7CmV4cG9ydHMuZ2VvQ2lyY2xlID0gY2lyY2xl OwpleHBvcnRzLmdlb0NsaXBBbnRpbWVyaWRpYW4gPSBjbGlwQW50aW1lcmlkaWFuOwpleHBvcnRz Lmdlb0NsaXBDaXJjbGUgPSBjbGlwQ2lyY2xlOwpleHBvcnRzLmdlb0NsaXBFeHRlbnQgPSBleHRl bnQkMTsKZXhwb3J0cy5nZW9DbGlwUmVjdGFuZ2xlID0gY2xpcFJlY3RhbmdsZTsKZXhwb3J0cy5n ZW9Db25pY0NvbmZvcm1hbCA9IGNvbmljQ29uZm9ybWFsOwpleHBvcnRzLmdlb0NvbmljQ29uZm9y bWFsUmF3ID0gY29uaWNDb25mb3JtYWxSYXc7CmV4cG9ydHMuZ2VvQ29uaWNFcXVhbEFyZWEgPSBj b25pY0VxdWFsQXJlYTsKZXhwb3J0cy5nZW9Db25pY0VxdWFsQXJlYVJhdyA9IGNvbmljRXF1YWxB cmVhUmF3OwpleHBvcnRzLmdlb0NvbmljRXF1aWRpc3RhbnQgPSBjb25pY0VxdWlkaXN0YW50Owpl eHBvcnRzLmdlb0NvbmljRXF1aWRpc3RhbnRSYXcgPSBjb25pY0VxdWlkaXN0YW50UmF3OwpleHBv cnRzLmdlb0NvbnRhaW5zID0gY29udGFpbnMkMTsKZXhwb3J0cy5nZW9EaXN0YW5jZSA9IGRpc3Rh bmNlOwpleHBvcnRzLmdlb0VxdWFsRWFydGggPSBlcXVhbEVhcnRoOwpleHBvcnRzLmdlb0VxdWFs RWFydGhSYXcgPSBlcXVhbEVhcnRoUmF3OwpleHBvcnRzLmdlb0VxdWlyZWN0YW5ndWxhciA9IGVx dWlyZWN0YW5ndWxhcjsKZXhwb3J0cy5nZW9FcXVpcmVjdGFuZ3VsYXJSYXcgPSBlcXVpcmVjdGFu Z3VsYXJSYXc7CmV4cG9ydHMuZ2VvR25vbW9uaWMgPSBnbm9tb25pYzsKZXhwb3J0cy5nZW9Hbm9t b25pY1JhdyA9IGdub21vbmljUmF3OwpleHBvcnRzLmdlb0dyYXRpY3VsZSA9IGdyYXRpY3VsZTsK ZXhwb3J0cy5nZW9HcmF0aWN1bGUxMCA9IGdyYXRpY3VsZTEwOwpleHBvcnRzLmdlb0lkZW50aXR5 ID0gaWRlbnRpdHkkNTsKZXhwb3J0cy5nZW9JbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlJDE7CmV4 cG9ydHMuZ2VvTGVuZ3RoID0gbGVuZ3RoJDE7CmV4cG9ydHMuZ2VvTWVyY2F0b3IgPSBtZXJjYXRv cjsKZXhwb3J0cy5nZW9NZXJjYXRvclJhdyA9IG1lcmNhdG9yUmF3OwpleHBvcnRzLmdlb05hdHVy YWxFYXJ0aDEgPSBuYXR1cmFsRWFydGgxOwpleHBvcnRzLmdlb05hdHVyYWxFYXJ0aDFSYXcgPSBu YXR1cmFsRWFydGgxUmF3OwpleHBvcnRzLmdlb09ydGhvZ3JhcGhpYyA9IG9ydGhvZ3JhcGhpYzsK ZXhwb3J0cy5nZW9PcnRob2dyYXBoaWNSYXcgPSBvcnRob2dyYXBoaWNSYXc7CmV4cG9ydHMuZ2Vv UGF0aCA9IGluZGV4JDE7CmV4cG9ydHMuZ2VvUHJvamVjdGlvbiA9IHByb2plY3Rpb247CmV4cG9y dHMuZ2VvUHJvamVjdGlvbk11dGF0b3IgPSBwcm9qZWN0aW9uTXV0YXRvcjsKZXhwb3J0cy5nZW9S b3RhdGlvbiA9IHJvdGF0aW9uOwpleHBvcnRzLmdlb1N0ZXJlb2dyYXBoaWMgPSBzdGVyZW9ncmFw aGljOwpleHBvcnRzLmdlb1N0ZXJlb2dyYXBoaWNSYXcgPSBzdGVyZW9ncmFwaGljUmF3OwpleHBv cnRzLmdlb1N0cmVhbSA9IGdlb1N0cmVhbTsKZXhwb3J0cy5nZW9UcmFuc2Zvcm0gPSB0cmFuc2Zv cm07CmV4cG9ydHMuZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yID0gdHJhbnN2ZXJzZU1lcmNhdG9yOwpl eHBvcnRzLmdlb1RyYW5zdmVyc2VNZXJjYXRvclJhdyA9IHRyYW5zdmVyc2VNZXJjYXRvclJhdzsK ZXhwb3J0cy5ncmF5ID0gZ3JheTsKZXhwb3J0cy5oY2wgPSBoY2w7CmV4cG9ydHMuaGllcmFyY2h5 ID0gaGllcmFyY2h5OwpleHBvcnRzLmhpc3RvZ3JhbSA9IGhpc3RvZ3JhbTsKZXhwb3J0cy5oc2wg PSBoc2w7CmV4cG9ydHMuaHRtbCA9IGh0bWw7CmV4cG9ydHMuaW1hZ2UgPSBpbWFnZTsKZXhwb3J0 cy5pbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlVmFsdWU7CmV4cG9ydHMuaW50ZXJwb2xhdGVBcnJh eSA9IGFycmF5JDE7CmV4cG9ydHMuaW50ZXJwb2xhdGVCYXNpcyA9IGJhc2lzJDE7CmV4cG9ydHMu aW50ZXJwb2xhdGVCYXNpc0Nsb3NlZCA9IGJhc2lzQ2xvc2VkOwpleHBvcnRzLmludGVycG9sYXRl Qmx1ZXMgPSBCbHVlczsKZXhwb3J0cy5pbnRlcnBvbGF0ZUJyQkcgPSBCckJHOwpleHBvcnRzLmlu dGVycG9sYXRlQnVHbiA9IEJ1R247CmV4cG9ydHMuaW50ZXJwb2xhdGVCdVB1ID0gQnVQdTsKZXhw b3J0cy5pbnRlcnBvbGF0ZUNpdmlkaXMgPSBjaXZpZGlzOwpleHBvcnRzLmludGVycG9sYXRlQ29v bCA9IGNvb2w7CmV4cG9ydHMuaW50ZXJwb2xhdGVDdWJlaGVsaXggPSBjdWJlaGVsaXgkMjsKZXhw b3J0cy5pbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQgPSBjdWJlaGVsaXgkMzsKZXhwb3J0cy5p bnRlcnBvbGF0ZUN1YmVoZWxpeExvbmcgPSBjdWJlaGVsaXhMb25nOwpleHBvcnRzLmludGVycG9s YXRlRGF0ZSA9IGRhdGU7CmV4cG9ydHMuaW50ZXJwb2xhdGVEaXNjcmV0ZSA9IGRpc2NyZXRlOwpl eHBvcnRzLmludGVycG9sYXRlR25CdSA9IEduQnU7CmV4cG9ydHMuaW50ZXJwb2xhdGVHcmVlbnMg PSBHcmVlbnM7CmV4cG9ydHMuaW50ZXJwb2xhdGVHcmV5cyA9IEdyZXlzOwpleHBvcnRzLmludGVy cG9sYXRlSGNsID0gaGNsJDI7CmV4cG9ydHMuaW50ZXJwb2xhdGVIY2xMb25nID0gaGNsTG9uZzsK ZXhwb3J0cy5pbnRlcnBvbGF0ZUhzbCA9IGhzbCQyOwpleHBvcnRzLmludGVycG9sYXRlSHNsTG9u ZyA9IGhzbExvbmc7CmV4cG9ydHMuaW50ZXJwb2xhdGVIdWUgPSBodWUkMTsKZXhwb3J0cy5pbnRl cnBvbGF0ZUluZmVybm8gPSBpbmZlcm5vOwpleHBvcnRzLmludGVycG9sYXRlTGFiID0gbGFiJDE7 CmV4cG9ydHMuaW50ZXJwb2xhdGVNYWdtYSA9IG1hZ21hOwpleHBvcnRzLmludGVycG9sYXRlTnVt YmVyID0gaW50ZXJwb2xhdGVOdW1iZXI7CmV4cG9ydHMuaW50ZXJwb2xhdGVOdW1iZXJBcnJheSA9 IG51bWJlckFycmF5OwpleHBvcnRzLmludGVycG9sYXRlT2JqZWN0ID0gb2JqZWN0OwpleHBvcnRz LmludGVycG9sYXRlT3JSZCA9IE9yUmQ7CmV4cG9ydHMuaW50ZXJwb2xhdGVPcmFuZ2VzID0gT3Jh bmdlczsKZXhwb3J0cy5pbnRlcnBvbGF0ZVBSR24gPSBQUkduOwpleHBvcnRzLmludGVycG9sYXRl UGlZRyA9IFBpWUc7CmV4cG9ydHMuaW50ZXJwb2xhdGVQbGFzbWEgPSBwbGFzbWE7CmV4cG9ydHMu aW50ZXJwb2xhdGVQdUJ1ID0gUHVCdTsKZXhwb3J0cy5pbnRlcnBvbGF0ZVB1QnVHbiA9IFB1QnVH bjsKZXhwb3J0cy5pbnRlcnBvbGF0ZVB1T3IgPSBQdU9yOwpleHBvcnRzLmludGVycG9sYXRlUHVS ZCA9IFB1UmQ7CmV4cG9ydHMuaW50ZXJwb2xhdGVQdXJwbGVzID0gUHVycGxlczsKZXhwb3J0cy5p bnRlcnBvbGF0ZVJhaW5ib3cgPSByYWluYm93OwpleHBvcnRzLmludGVycG9sYXRlUmRCdSA9IFJk QnU7CmV4cG9ydHMuaW50ZXJwb2xhdGVSZEd5ID0gUmRHeTsKZXhwb3J0cy5pbnRlcnBvbGF0ZVJk UHUgPSBSZFB1OwpleHBvcnRzLmludGVycG9sYXRlUmRZbEJ1ID0gUmRZbEJ1OwpleHBvcnRzLmlu dGVycG9sYXRlUmRZbEduID0gUmRZbEduOwpleHBvcnRzLmludGVycG9sYXRlUmVkcyA9IFJlZHM7 CmV4cG9ydHMuaW50ZXJwb2xhdGVSZ2IgPSBpbnRlcnBvbGF0ZVJnYjsKZXhwb3J0cy5pbnRlcnBv bGF0ZVJnYkJhc2lzID0gcmdiQmFzaXM7CmV4cG9ydHMuaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3Nl ZCA9IHJnYkJhc2lzQ2xvc2VkOwpleHBvcnRzLmludGVycG9sYXRlUm91bmQgPSBpbnRlcnBvbGF0 ZVJvdW5kOwpleHBvcnRzLmludGVycG9sYXRlU2luZWJvdyA9IHNpbmVib3c7CmV4cG9ydHMuaW50 ZXJwb2xhdGVTcGVjdHJhbCA9IFNwZWN0cmFsOwpleHBvcnRzLmludGVycG9sYXRlU3RyaW5nID0g aW50ZXJwb2xhdGVTdHJpbmc7CmV4cG9ydHMuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRl cnBvbGF0ZVRyYW5zZm9ybUNzczsKZXhwb3J0cy5pbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGlu dGVycG9sYXRlVHJhbnNmb3JtU3ZnOwpleHBvcnRzLmludGVycG9sYXRlVHVyYm8gPSB0dXJibzsK ZXhwb3J0cy5pbnRlcnBvbGF0ZVZpcmlkaXMgPSB2aXJpZGlzOwpleHBvcnRzLmludGVycG9sYXRl V2FybSA9IHdhcm07CmV4cG9ydHMuaW50ZXJwb2xhdGVZbEduID0gWWxHbjsKZXhwb3J0cy5pbnRl cnBvbGF0ZVlsR25CdSA9IFlsR25CdTsKZXhwb3J0cy5pbnRlcnBvbGF0ZVlsT3JCciA9IFlsT3JC cjsKZXhwb3J0cy5pbnRlcnBvbGF0ZVlsT3JSZCA9IFlsT3JSZDsKZXhwb3J0cy5pbnRlcnBvbGF0 ZVpvb20gPSBpbnRlcnBvbGF0ZVpvb207CmV4cG9ydHMuaW50ZXJydXB0ID0gaW50ZXJydXB0Owpl eHBvcnRzLmludGVydmFsID0gaW50ZXJ2YWwkMTsKZXhwb3J0cy5pc29Gb3JtYXQgPSBmb3JtYXRJ c287CmV4cG9ydHMuaXNvUGFyc2UgPSBwYXJzZUlzbzsKZXhwb3J0cy5qc29uID0ganNvbjsKZXhw b3J0cy5rZXlzID0ga2V5czsKZXhwb3J0cy5sYWIgPSBsYWI7CmV4cG9ydHMubGNoID0gbGNoOwpl eHBvcnRzLmxpbmUgPSBsaW5lOwpleHBvcnRzLmxpbmVSYWRpYWwgPSBsaW5lUmFkaWFsJDE7CmV4 cG9ydHMubGlua0hvcml6b250YWwgPSBsaW5rSG9yaXpvbnRhbDsKZXhwb3J0cy5saW5rUmFkaWFs ID0gbGlua1JhZGlhbDsKZXhwb3J0cy5saW5rVmVydGljYWwgPSBsaW5rVmVydGljYWw7CmV4cG9y dHMubG9jYWwgPSBsb2NhbDsKZXhwb3J0cy5tYXAgPSBtYXAkMTsKZXhwb3J0cy5tYXRjaGVyID0g bWF0Y2hlcjsKZXhwb3J0cy5tYXggPSBtYXg7CmV4cG9ydHMubWVhbiA9IG1lYW47CmV4cG9ydHMu bWVkaWFuID0gbWVkaWFuOwpleHBvcnRzLm1lcmdlID0gbWVyZ2U7CmV4cG9ydHMubWluID0gbWlu OwpleHBvcnRzLm1vdXNlID0gbW91c2U7CmV4cG9ydHMubmFtZXNwYWNlID0gbmFtZXNwYWNlOwpl eHBvcnRzLm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzOwpleHBvcnRzLm5lc3QgPSBuZXN0OwpleHBv cnRzLm5vdyA9IG5vdzsKZXhwb3J0cy5wYWNrID0gaW5kZXgkMjsKZXhwb3J0cy5wYWNrRW5jbG9z ZSA9IGVuY2xvc2U7CmV4cG9ydHMucGFja1NpYmxpbmdzID0gc2libGluZ3M7CmV4cG9ydHMucGFp cnMgPSBwYWlyczsKZXhwb3J0cy5wYXJ0aXRpb24gPSBwYXJ0aXRpb247CmV4cG9ydHMucGF0aCA9 IHBhdGg7CmV4cG9ydHMucGVybXV0ZSA9IHBlcm11dGU7CmV4cG9ydHMucGllID0gcGllOwpleHBv cnRzLnBpZWNld2lzZSA9IHBpZWNld2lzZTsKZXhwb3J0cy5wb2ludFJhZGlhbCA9IHBvaW50UmFk aWFsOwpleHBvcnRzLnBvbHlnb25BcmVhID0gYXJlYSQyOwpleHBvcnRzLnBvbHlnb25DZW50cm9p ZCA9IGNlbnRyb2lkJDE7CmV4cG9ydHMucG9seWdvbkNvbnRhaW5zID0gY29udGFpbnMkMjsKZXhw b3J0cy5wb2x5Z29uSHVsbCA9IGh1bGw7CmV4cG9ydHMucG9seWdvbkxlbmd0aCA9IGxlbmd0aCQy OwpleHBvcnRzLnByZWNpc2lvbkZpeGVkID0gcHJlY2lzaW9uRml4ZWQ7CmV4cG9ydHMucHJlY2lz aW9uUHJlZml4ID0gcHJlY2lzaW9uUHJlZml4OwpleHBvcnRzLnByZWNpc2lvblJvdW5kID0gcHJl Y2lzaW9uUm91bmQ7CmV4cG9ydHMucXVhZHRyZWUgPSBxdWFkdHJlZTsKZXhwb3J0cy5xdWFudGls ZSA9IHRocmVzaG9sZDsKZXhwb3J0cy5xdWFudGl6ZSA9IHF1YW50aXplOwpleHBvcnRzLnJhZGlh bEFyZWEgPSBhcmVhUmFkaWFsOwpleHBvcnRzLnJhZGlhbExpbmUgPSBsaW5lUmFkaWFsJDE7CmV4 cG9ydHMucmFuZG9tQmF0ZXMgPSBiYXRlczsKZXhwb3J0cy5yYW5kb21FeHBvbmVudGlhbCA9IGV4 cG9uZW50aWFsJDE7CmV4cG9ydHMucmFuZG9tSXJ3aW5IYWxsID0gaXJ3aW5IYWxsOwpleHBvcnRz LnJhbmRvbUxvZ05vcm1hbCA9IGxvZ05vcm1hbDsKZXhwb3J0cy5yYW5kb21Ob3JtYWwgPSBub3Jt YWw7CmV4cG9ydHMucmFuZG9tVW5pZm9ybSA9IHVuaWZvcm07CmV4cG9ydHMucmFuZ2UgPSBzZXF1 ZW5jZTsKZXhwb3J0cy5yZ2IgPSByZ2I7CmV4cG9ydHMucmliYm9uID0gcmliYm9uOwpleHBvcnRz LnNjYWxlQmFuZCA9IGJhbmQ7CmV4cG9ydHMuc2NhbGVEaXZlcmdpbmcgPSBkaXZlcmdpbmc7CmV4 cG9ydHMuc2NhbGVEaXZlcmdpbmdMb2cgPSBkaXZlcmdpbmdMb2c7CmV4cG9ydHMuc2NhbGVEaXZl cmdpbmdQb3cgPSBkaXZlcmdpbmdQb3c7CmV4cG9ydHMuc2NhbGVEaXZlcmdpbmdTcXJ0ID0gZGl2 ZXJnaW5nU3FydDsKZXhwb3J0cy5zY2FsZURpdmVyZ2luZ1N5bWxvZyA9IGRpdmVyZ2luZ1N5bWxv ZzsKZXhwb3J0cy5zY2FsZUlkZW50aXR5ID0gaWRlbnRpdHkkNzsKZXhwb3J0cy5zY2FsZUltcGxp Y2l0ID0gaW1wbGljaXQ7CmV4cG9ydHMuc2NhbGVMaW5lYXIgPSBsaW5lYXIkMjsKZXhwb3J0cy5z Y2FsZUxvZyA9IGxvZyQxOwpleHBvcnRzLnNjYWxlT3JkaW5hbCA9IG9yZGluYWw7CmV4cG9ydHMu c2NhbGVQb2ludCA9IHBvaW50JDE7CmV4cG9ydHMuc2NhbGVQb3cgPSBwb3ckMTsKZXhwb3J0cy5z Y2FsZVF1YW50aWxlID0gcXVhbnRpbGU7CmV4cG9ydHMuc2NhbGVRdWFudGl6ZSA9IHF1YW50aXpl JDE7CmV4cG9ydHMuc2NhbGVTZXF1ZW50aWFsID0gc2VxdWVudGlhbDsKZXhwb3J0cy5zY2FsZVNl cXVlbnRpYWxMb2cgPSBzZXF1ZW50aWFsTG9nOwpleHBvcnRzLnNjYWxlU2VxdWVudGlhbFBvdyA9 IHNlcXVlbnRpYWxQb3c7CmV4cG9ydHMuc2NhbGVTZXF1ZW50aWFsUXVhbnRpbGUgPSBzZXF1ZW50 aWFsUXVhbnRpbGU7CmV4cG9ydHMuc2NhbGVTZXF1ZW50aWFsU3FydCA9IHNlcXVlbnRpYWxTcXJ0 OwpleHBvcnRzLnNjYWxlU2VxdWVudGlhbFN5bWxvZyA9IHNlcXVlbnRpYWxTeW1sb2c7CmV4cG9y dHMuc2NhbGVTcXJ0ID0gc3FydCQxOwpleHBvcnRzLnNjYWxlU3ltbG9nID0gc3ltbG9nOwpleHBv cnRzLnNjYWxlVGhyZXNob2xkID0gdGhyZXNob2xkJDE7CmV4cG9ydHMuc2NhbGVUaW1lID0gdGlt ZTsKZXhwb3J0cy5zY2FsZVV0YyA9IHV0Y1RpbWU7CmV4cG9ydHMuc2NhbiA9IHNjYW47CmV4cG9y dHMuc2NoZW1lQWNjZW50ID0gQWNjZW50OwpleHBvcnRzLnNjaGVtZUJsdWVzID0gc2NoZW1lJGw7 CmV4cG9ydHMuc2NoZW1lQnJCRyA9IHNjaGVtZTsKZXhwb3J0cy5zY2hlbWVCdUduID0gc2NoZW1l JDk7CmV4cG9ydHMuc2NoZW1lQnVQdSA9IHNjaGVtZSRhOwpleHBvcnRzLnNjaGVtZUNhdGVnb3J5 MTAgPSBjYXRlZ29yeTEwOwpleHBvcnRzLnNjaGVtZURhcmsyID0gRGFyazI7CmV4cG9ydHMuc2No ZW1lR25CdSA9IHNjaGVtZSRiOwpleHBvcnRzLnNjaGVtZUdyZWVucyA9IHNjaGVtZSRtOwpleHBv cnRzLnNjaGVtZUdyZXlzID0gc2NoZW1lJG47CmV4cG9ydHMuc2NoZW1lT3JSZCA9IHNjaGVtZSRj OwpleHBvcnRzLnNjaGVtZU9yYW5nZXMgPSBzY2hlbWUkcTsKZXhwb3J0cy5zY2hlbWVQUkduID0g c2NoZW1lJDE7CmV4cG9ydHMuc2NoZW1lUGFpcmVkID0gUGFpcmVkOwpleHBvcnRzLnNjaGVtZVBh c3RlbDEgPSBQYXN0ZWwxOwpleHBvcnRzLnNjaGVtZVBhc3RlbDIgPSBQYXN0ZWwyOwpleHBvcnRz LnNjaGVtZVBpWUcgPSBzY2hlbWUkMjsKZXhwb3J0cy5zY2hlbWVQdUJ1ID0gc2NoZW1lJGU7CmV4 cG9ydHMuc2NoZW1lUHVCdUduID0gc2NoZW1lJGQ7CmV4cG9ydHMuc2NoZW1lUHVPciA9IHNjaGVt ZSQzOwpleHBvcnRzLnNjaGVtZVB1UmQgPSBzY2hlbWUkZjsKZXhwb3J0cy5zY2hlbWVQdXJwbGVz ID0gc2NoZW1lJG87CmV4cG9ydHMuc2NoZW1lUmRCdSA9IHNjaGVtZSQ0OwpleHBvcnRzLnNjaGVt ZVJkR3kgPSBzY2hlbWUkNTsKZXhwb3J0cy5zY2hlbWVSZFB1ID0gc2NoZW1lJGc7CmV4cG9ydHMu c2NoZW1lUmRZbEJ1ID0gc2NoZW1lJDY7CmV4cG9ydHMuc2NoZW1lUmRZbEduID0gc2NoZW1lJDc7 CmV4cG9ydHMuc2NoZW1lUmVkcyA9IHNjaGVtZSRwOwpleHBvcnRzLnNjaGVtZVNldDEgPSBTZXQx OwpleHBvcnRzLnNjaGVtZVNldDIgPSBTZXQyOwpleHBvcnRzLnNjaGVtZVNldDMgPSBTZXQzOwpl eHBvcnRzLnNjaGVtZVNwZWN0cmFsID0gc2NoZW1lJDg7CmV4cG9ydHMuc2NoZW1lVGFibGVhdTEw ID0gVGFibGVhdTEwOwpleHBvcnRzLnNjaGVtZVlsR24gPSBzY2hlbWUkaTsKZXhwb3J0cy5zY2hl bWVZbEduQnUgPSBzY2hlbWUkaDsKZXhwb3J0cy5zY2hlbWVZbE9yQnIgPSBzY2hlbWUkajsKZXhw b3J0cy5zY2hlbWVZbE9yUmQgPSBzY2hlbWUkazsKZXhwb3J0cy5zZWxlY3QgPSBzZWxlY3Q7CmV4 cG9ydHMuc2VsZWN0QWxsID0gc2VsZWN0QWxsOwpleHBvcnRzLnNlbGVjdGlvbiA9IHNlbGVjdGlv bjsKZXhwb3J0cy5zZWxlY3RvciA9IHNlbGVjdG9yOwpleHBvcnRzLnNlbGVjdG9yQWxsID0gc2Vs ZWN0b3JBbGw7CmV4cG9ydHMuc2V0ID0gc2V0JDI7CmV4cG9ydHMuc2h1ZmZsZSA9IHNodWZmbGU7 CmV4cG9ydHMuc3RhY2sgPSBzdGFjazsKZXhwb3J0cy5zdGFja09mZnNldERpdmVyZ2luZyA9IGRp dmVyZ2luZyQxOwpleHBvcnRzLnN0YWNrT2Zmc2V0RXhwYW5kID0gZXhwYW5kOwpleHBvcnRzLnN0 YWNrT2Zmc2V0Tm9uZSA9IG5vbmUkMTsKZXhwb3J0cy5zdGFja09mZnNldFNpbGhvdWV0dGUgPSBz aWxob3VldHRlOwpleHBvcnRzLnN0YWNrT2Zmc2V0V2lnZ2xlID0gd2lnZ2xlOwpleHBvcnRzLnN0 YWNrT3JkZXJBcHBlYXJhbmNlID0gYXBwZWFyYW5jZTsKZXhwb3J0cy5zdGFja09yZGVyQXNjZW5k aW5nID0gYXNjZW5kaW5nJDM7CmV4cG9ydHMuc3RhY2tPcmRlckRlc2NlbmRpbmcgPSBkZXNjZW5k aW5nJDI7CmV4cG9ydHMuc3RhY2tPcmRlckluc2lkZU91dCA9IGluc2lkZU91dDsKZXhwb3J0cy5z dGFja09yZGVyTm9uZSA9IG5vbmUkMjsKZXhwb3J0cy5zdGFja09yZGVyUmV2ZXJzZSA9IHJldmVy c2U7CmV4cG9ydHMuc3RyYXRpZnkgPSBzdHJhdGlmeTsKZXhwb3J0cy5zdHlsZSA9IHN0eWxlVmFs dWU7CmV4cG9ydHMuc3VtID0gc3VtOwpleHBvcnRzLnN2ZyA9IHN2ZzsKZXhwb3J0cy5zeW1ib2wg PSBzeW1ib2w7CmV4cG9ydHMuc3ltYm9sQ2lyY2xlID0gY2lyY2xlJDI7CmV4cG9ydHMuc3ltYm9s Q3Jvc3MgPSBjcm9zcyQyOwpleHBvcnRzLnN5bWJvbERpYW1vbmQgPSBkaWFtb25kOwpleHBvcnRz LnN5bWJvbFNxdWFyZSA9IHNxdWFyZTsKZXhwb3J0cy5zeW1ib2xTdGFyID0gc3RhcjsKZXhwb3J0 cy5zeW1ib2xUcmlhbmdsZSA9IHRyaWFuZ2xlOwpleHBvcnRzLnN5bWJvbFd5ZSA9IHd5ZTsKZXhw b3J0cy5zeW1ib2xzID0gc3ltYm9sczsKZXhwb3J0cy50ZXh0ID0gdGV4dDsKZXhwb3J0cy50aHJl c2hvbGRGcmVlZG1hbkRpYWNvbmlzID0gZnJlZWRtYW5EaWFjb25pczsKZXhwb3J0cy50aHJlc2hv bGRTY290dCA9IHNjb3R0OwpleHBvcnRzLnRocmVzaG9sZFN0dXJnZXMgPSB0aHJlc2hvbGRTdHVy Z2VzOwpleHBvcnRzLnRpY2tGb3JtYXQgPSB0aWNrRm9ybWF0OwpleHBvcnRzLnRpY2tJbmNyZW1l bnQgPSB0aWNrSW5jcmVtZW50OwpleHBvcnRzLnRpY2tTdGVwID0gdGlja1N0ZXA7CmV4cG9ydHMu dGlja3MgPSB0aWNrczsKZXhwb3J0cy50aW1lRGF5ID0gZGF5OwpleHBvcnRzLnRpbWVEYXlzID0g ZGF5czsKZXhwb3J0cy50aW1lRm9ybWF0RGVmYXVsdExvY2FsZSA9IGRlZmF1bHRMb2NhbGUkMTsK ZXhwb3J0cy50aW1lRm9ybWF0TG9jYWxlID0gZm9ybWF0TG9jYWxlJDE7CmV4cG9ydHMudGltZUZy aWRheSA9IGZyaWRheTsKZXhwb3J0cy50aW1lRnJpZGF5cyA9IGZyaWRheXM7CmV4cG9ydHMudGlt ZUhvdXIgPSBob3VyOwpleHBvcnRzLnRpbWVIb3VycyA9IGhvdXJzOwpleHBvcnRzLnRpbWVJbnRl cnZhbCA9IG5ld0ludGVydmFsOwpleHBvcnRzLnRpbWVNaWxsaXNlY29uZCA9IG1pbGxpc2Vjb25k OwpleHBvcnRzLnRpbWVNaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHM7CmV4cG9ydHMudGltZU1p bnV0ZSA9IG1pbnV0ZTsKZXhwb3J0cy50aW1lTWludXRlcyA9IG1pbnV0ZXM7CmV4cG9ydHMudGlt ZU1vbmRheSA9IG1vbmRheTsKZXhwb3J0cy50aW1lTW9uZGF5cyA9IG1vbmRheXM7CmV4cG9ydHMu dGltZU1vbnRoID0gbW9udGg7CmV4cG9ydHMudGltZU1vbnRocyA9IG1vbnRoczsKZXhwb3J0cy50 aW1lU2F0dXJkYXkgPSBzYXR1cmRheTsKZXhwb3J0cy50aW1lU2F0dXJkYXlzID0gc2F0dXJkYXlz OwpleHBvcnRzLnRpbWVTZWNvbmQgPSBzZWNvbmQ7CmV4cG9ydHMudGltZVNlY29uZHMgPSBzZWNv bmRzOwpleHBvcnRzLnRpbWVTdW5kYXkgPSBzdW5kYXk7CmV4cG9ydHMudGltZVN1bmRheXMgPSBz dW5kYXlzOwpleHBvcnRzLnRpbWVUaHVyc2RheSA9IHRodXJzZGF5OwpleHBvcnRzLnRpbWVUaHVy c2RheXMgPSB0aHVyc2RheXM7CmV4cG9ydHMudGltZVR1ZXNkYXkgPSB0dWVzZGF5OwpleHBvcnRz LnRpbWVUdWVzZGF5cyA9IHR1ZXNkYXlzOwpleHBvcnRzLnRpbWVXZWRuZXNkYXkgPSB3ZWRuZXNk YXk7CmV4cG9ydHMudGltZVdlZG5lc2RheXMgPSB3ZWRuZXNkYXlzOwpleHBvcnRzLnRpbWVXZWVr ID0gc3VuZGF5OwpleHBvcnRzLnRpbWVXZWVrcyA9IHN1bmRheXM7CmV4cG9ydHMudGltZVllYXIg PSB5ZWFyOwpleHBvcnRzLnRpbWVZZWFycyA9IHllYXJzOwpleHBvcnRzLnRpbWVvdXQgPSB0aW1l b3V0JDE7CmV4cG9ydHMudGltZXIgPSB0aW1lcjsKZXhwb3J0cy50aW1lckZsdXNoID0gdGltZXJG bHVzaDsKZXhwb3J0cy50b3VjaCA9IHRvdWNoOwpleHBvcnRzLnRvdWNoZXMgPSB0b3VjaGVzOwpl eHBvcnRzLnRyYW5zaXRpb24gPSB0cmFuc2l0aW9uOwpleHBvcnRzLnRyYW5zcG9zZSA9IHRyYW5z cG9zZTsKZXhwb3J0cy50cmVlID0gdHJlZTsKZXhwb3J0cy50cmVlbWFwID0gaW5kZXgkMzsKZXhw b3J0cy50cmVlbWFwQmluYXJ5ID0gYmluYXJ5OwpleHBvcnRzLnRyZWVtYXBEaWNlID0gdHJlZW1h cERpY2U7CmV4cG9ydHMudHJlZW1hcFJlc3F1YXJpZnkgPSByZXNxdWFyaWZ5OwpleHBvcnRzLnRy ZWVtYXBTbGljZSA9IHRyZWVtYXBTbGljZTsKZXhwb3J0cy50cmVlbWFwU2xpY2VEaWNlID0gc2xp Y2VEaWNlOwpleHBvcnRzLnRyZWVtYXBTcXVhcmlmeSA9IHNxdWFyaWZ5OwpleHBvcnRzLnRzdiA9 IHRzdiQxOwpleHBvcnRzLnRzdkZvcm1hdCA9IHRzdkZvcm1hdDsKZXhwb3J0cy50c3ZGb3JtYXRC b2R5ID0gdHN2Rm9ybWF0Qm9keTsKZXhwb3J0cy50c3ZGb3JtYXRSb3cgPSB0c3ZGb3JtYXRSb3c7 CmV4cG9ydHMudHN2Rm9ybWF0Um93cyA9IHRzdkZvcm1hdFJvd3M7CmV4cG9ydHMudHN2Rm9ybWF0 VmFsdWUgPSB0c3ZGb3JtYXRWYWx1ZTsKZXhwb3J0cy50c3ZQYXJzZSA9IHRzdlBhcnNlOwpleHBv cnRzLnRzdlBhcnNlUm93cyA9IHRzdlBhcnNlUm93czsKZXhwb3J0cy51dGNEYXkgPSB1dGNEYXk7 CmV4cG9ydHMudXRjRGF5cyA9IHV0Y0RheXM7CmV4cG9ydHMudXRjRnJpZGF5ID0gdXRjRnJpZGF5 OwpleHBvcnRzLnV0Y0ZyaWRheXMgPSB1dGNGcmlkYXlzOwpleHBvcnRzLnV0Y0hvdXIgPSB1dGNI b3VyOwpleHBvcnRzLnV0Y0hvdXJzID0gdXRjSG91cnM7CmV4cG9ydHMudXRjTWlsbGlzZWNvbmQg PSBtaWxsaXNlY29uZDsKZXhwb3J0cy51dGNNaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHM7CmV4 cG9ydHMudXRjTWludXRlID0gdXRjTWludXRlOwpleHBvcnRzLnV0Y01pbnV0ZXMgPSB1dGNNaW51 dGVzOwpleHBvcnRzLnV0Y01vbmRheSA9IHV0Y01vbmRheTsKZXhwb3J0cy51dGNNb25kYXlzID0g dXRjTW9uZGF5czsKZXhwb3J0cy51dGNNb250aCA9IHV0Y01vbnRoOwpleHBvcnRzLnV0Y01vbnRo cyA9IHV0Y01vbnRoczsKZXhwb3J0cy51dGNTYXR1cmRheSA9IHV0Y1NhdHVyZGF5OwpleHBvcnRz LnV0Y1NhdHVyZGF5cyA9IHV0Y1NhdHVyZGF5czsKZXhwb3J0cy51dGNTZWNvbmQgPSBzZWNvbmQ7 CmV4cG9ydHMudXRjU2Vjb25kcyA9IHNlY29uZHM7CmV4cG9ydHMudXRjU3VuZGF5ID0gdXRjU3Vu ZGF5OwpleHBvcnRzLnV0Y1N1bmRheXMgPSB1dGNTdW5kYXlzOwpleHBvcnRzLnV0Y1RodXJzZGF5 ID0gdXRjVGh1cnNkYXk7CmV4cG9ydHMudXRjVGh1cnNkYXlzID0gdXRjVGh1cnNkYXlzOwpleHBv cnRzLnV0Y1R1ZXNkYXkgPSB1dGNUdWVzZGF5OwpleHBvcnRzLnV0Y1R1ZXNkYXlzID0gdXRjVHVl c2RheXM7CmV4cG9ydHMudXRjV2VkbmVzZGF5ID0gdXRjV2VkbmVzZGF5OwpleHBvcnRzLnV0Y1dl ZG5lc2RheXMgPSB1dGNXZWRuZXNkYXlzOwpleHBvcnRzLnV0Y1dlZWsgPSB1dGNTdW5kYXk7CmV4 cG9ydHMudXRjV2Vla3MgPSB1dGNTdW5kYXlzOwpleHBvcnRzLnV0Y1llYXIgPSB1dGNZZWFyOwpl eHBvcnRzLnV0Y1llYXJzID0gdXRjWWVhcnM7CmV4cG9ydHMudmFsdWVzID0gdmFsdWVzOwpleHBv cnRzLnZhcmlhbmNlID0gdmFyaWFuY2U7CmV4cG9ydHMudmVyc2lvbiA9IHZlcnNpb247CmV4cG9y dHMudm9yb25vaSA9IHZvcm9ub2k7CmV4cG9ydHMud2luZG93ID0gZGVmYXVsdFZpZXc7CmV4cG9y dHMueG1sID0geG1sOwpleHBvcnRzLnppcCA9IHppcDsKZXhwb3J0cy56b29tID0gem9vbTsKZXhw b3J0cy56b29tSWRlbnRpdHkgPSBpZGVudGl0eSQ5OwpleHBvcnRzLnpvb21UcmFuc2Zvcm0gPSB0 cmFuc2Zvcm0kMTsKCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScs IHsgdmFsdWU6IHRydWUgfSk7Cgp9KSk7Cg== --MP_/huV/jc.jjRG1tiqg+FFlax7-- --Sig_/ahh=buR+DkTF93fKWPzRP2H Content-Type: application/pgp-signature Content-Description: OpenPGP digital signature -----BEGIN PGP SIGNATURE----- iQEzBAEBCgAdFiEEds7GsXJ0tGXALbPZ5xo1VCwwuqUFAmAl+6wACgkQ5xo1VCww uqV1FQf9F2LyGN1RB+8PwdL76vp1FqmPhlzYpX5WnKmDuj+68UiaH0lWLaS+Thb+ GF41AYGvXJq0X4YfRSayPZxKSwaM0tLc3z6vr8lfyhaNjiD3Z9OLiKHaNrO4FgRZ 429iXu1ZdNKfpr4xla/1NKmh0lL+IDxBebjB4VdCbWziKJ//gJvINHtXL+sorMbt 6aXoPdbnqt3DobwfT8GGJM6HhqfTJmfFb8UngCL5X0ZMAZb9S7970KZUooC9RlY/ +rULoKozoS8dC9MhTyP+0qte5LflpqWr9egLBIJbVB7rhuyxI4cf1D2HPajWpyt6 GJ6MUNsQUvW/SysR9NUGIBBSBOG7Pw== =zhbT -----END PGP SIGNATURE----- --Sig_/ahh=buR+DkTF93fKWPzRP2H--