Skip to content

Instantly share code, notes, and snippets.

@e-chankov
Last active June 29, 2016 05:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save e-chankov/79ea39f08d7d0ef0b55744464dd0980b to your computer and use it in GitHub Desktop.
Save e-chankov/79ea39f08d7d0ef0b55744464dd0980b to your computer and use it in GitHub Desktop.
Contribution of national football leagues to Euro 2016 squads
license: gpl-3.0

The chart shows how many players in each team of UEFA Euro 2016 play in national football leagues of those countries.

The data was extracted from UEFA Euro 2016 squads Wikipedia page using httr, htmltab and XML R packages. The nationality for each club reflects the national association (not the league). We have changed this rule. Players from "Swansea city" and "Cardiff city" clubs are counted as players of the English association football league. Then we selected only such players that play in clubs of 24 national leagues of the participants of Euro 2016. Contribution of each national league to Euro 2016 squads are shown JavaScript visualization library D3 via R package chorddiag.

There are two additional charts.

This diagram is plotted without counting players of national teams from home leagues.

This diagram is focused on the 7-top leagues.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uCiAgLy8gQHBhcmFtIHRhcmdldCBUaGUgb2JqZWN0IHRoYXQgd2lsbCBiZSAidGhpcyIgZm9yIGVhY2ggZnVuY3Rpb24KICAvLyAgIGV4ZWN1dGlvbi4KICAvLyBAcGFyYW0gYXJncyBBcnJheSBvZiBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbnMuIChUaGUKICAvLyAgIHNhbWUgYXJndW1lbnRzIHdpbGwgYmUgcGFzc2VkIHRvIGFsbCBmdW5jdGlvbnMuKQogIGZ1bmN0aW9uIGV2YWxBbmRSdW4odGFza3MsIHRhcmdldCwgYXJncykgewogICAgaWYgKHRhc2tzKSB7CiAgICAgIGZvckVhY2godGFza3MsIGZ1bmN0aW9uKHRhc2spIHsKICAgICAgICB2YXIgdGFza0Z1bmMgPSBldmFsKCIoIiArIHRhc2sgKyAiKSIpOwogICAgICAgIGlmICh0eXBlb2YodGFza0Z1bmMpICE9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlRhc2sgbXVzdCBiZSBhIGZ1bmN0aW9uISBTb3VyY2U6XG4iICsgdGFzayk7CiAgICAgICAgfQogICAgICAgIHRhc2tGdW5jLmFwcGx5KHRhcmdldCwgYXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgfTsKCiAgICAgIC8vIE9ubHkgb3ZlcnJpZGUgcmVzaXplIGlmIGJpbmRpbmdEZWYgaW1wbGVtZW50cyBpdAogICAgICBpZiAoYmluZGluZ0RlZi5yZXNpemUpIHsKICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICAgIC8vIFNoaW55IGNhbiBjYWxsIHJlc2l6ZSBiZWZvcmUgaW5pdGlhbGl6ZS9yZW5kZXJWYWx1ZSBoYXZlIGJlZW4KICAgICAgICAgIC8vIGNhbGxlZCwgd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlIGZvciB3aWRnZXRzLgogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgewogICAgICAgICAgICBiaW5kaW5nRGVmLnJlc2l6ZShlbCwgd2lkdGgsIGhlaWdodCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7CiAgICB9CiAgfTsKCiAgdmFyIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgZnVuY3Rpb24gc2NoZWR1bGVTdGF0aWNSZW5kZXIoKSB7CiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgewogICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9LCAxKTsKICAgIH0KICB9CgogIC8vIFJlbmRlciBzdGF0aWMgd2lkZ2V0cyBhZnRlciB0aGUgZG9jdW1lbnQgZmluaXNoZXMgbG9hZGluZwogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzCiAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGJpbmRpbmdzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107CiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7CiAgICAgIHZhciBtYXRjaGVzID0gYmluZGluZy5maW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7CiAgICAgIGZvckVhY2gobWF0Y2hlcywgZnVuY3Rpb24oZWwpIHsKICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOwoKICAgICAgICBpZiAoaGFzQ2xhc3MoZWwsICJodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUgKyAiIGh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCI7CgogICAgICAgIHZhciBpbml0UmVzdWx0OwogICAgICAgIGlmIChiaW5kaW5nLmluaXRpYWxpemUpIHsKICAgICAgICAgIGluaXRSZXN1bHQgPSBiaW5kaW5nLmluaXRpYWxpemUoZWwsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICk7CiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsKICAgICAgICAgIHZhciBsYXN0U2l6ZSA9IHt9OwogICAgICAgICAgdmFyIHJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBzaXplID0gewogICAgICAgICAgICAgIHc6IHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgICBoOiBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSAwICYmIHNpemUuaCA9PT0gMCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgbGFzdFNpemUgPSBzaXplOwogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOwogICAgICAgICAgfTsKCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsKCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgY2FzZXMgd2hlcmUgd2UncmUgcnVubmluZyBpbiBhIFNoaW55CiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dAogICAgICAgICAgLy8gcmF0aGVyIGEgc2ltcGxlIHN0YXRpYyB3aWRnZXQuIE9uZSBleGFtcGxlIG9mIHRoaXMgaXMKICAgICAgICAgIC8vIGFuIHJtYXJrZG93biBkb2N1bWVudCB0aGF0IGhhcyBydW50aW1lOnNoaW55IGFuZCB3aWRnZXQKICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8KICAgICAgICAgIC8vIGNhbGwgcmVzaXplIGhhbmRsZXJzIGZvciBTaGlueSBvdXRwdXRzLCBub3QgZm9yIHN0YXRpYwogICAgICAgICAgLy8gd2lkZ2V0cywgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oInNob3duLmh0bWx3aWRnZXRzIHNob3duLmJzLnRhYi5odG1sd2lkZ2V0cyIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgICB3aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5vbigiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlIHNwZWNpZmljIGNhc2Ugb2YgaW9zbGlkZXMsIHdoaWNoCiAgICAgICAgICAvLyBmbGlwcyBzbGlkZXMgYmV0d2VlbiBkaXNwbGF5Om5vbmUgYW5kIGRpc3BsYXk6YmxvY2suCiAgICAgICAgICAvLyBJZGVhbGx5IHdlIHdvdWxkIG5vdCBoYXZlIHRvIGhhdmUgaW9zbGlkZS1zcGVjaWZpYyBjb2RlCiAgICAgICAgICAvLyBoZXJlLCBidXQgcmF0aGVyIGhhdmUgaW9zbGlkZXMgcmFpc2UgYSBnZW5lcmljIGV2ZW50LAogICAgICAgICAgLy8gYnV0IHRoZSBybWFya2Rvd24gcGFja2FnZSBqdXN0IHdlbnQgdG8gQ1JBTiBzbyB0aGUKICAgICAgICAgIC8vIHdpbmRvdyB0byBnZXR0aW5nIHRoYXQgZml4ZWQgbWF5IGJlIGxvbmcuCiAgICAgICAgICBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgICAgICAgICAgLy8gSXQncyBPSyB0byBsaW1pdCB0aGlzIHRvIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyCiAgICAgICAgICAgIC8vIGJyb3dzZXJzIGJlY2F1c2UgaW9zbGlkZXMgaXRzZWxmIG9ubHkgc3VwcG9ydHMKICAgICAgICAgICAgLy8gc3VjaCBicm93c2Vycy4KICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWVudGVyIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVsZWF2ZSIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFyIHNjcmlwdERhdGEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJzY3JpcHRbZGF0YS1mb3I9JyIgKyBlbC5pZCArICInXVt0eXBlPSdhcHBsaWNhdGlvbi9qc29uJ10iKTsKICAgICAgICBpZiAoc2NyaXB0RGF0YSkgewogICAgICAgICAgdmFyIGRhdGEgPSBKU09OLnBhcnNlKHNjcmlwdERhdGEudGV4dENvbnRlbnQgfHwgc2NyaXB0RGF0YS50ZXh0KTsKICAgICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgICBpZiAoIShkYXRhLmV2YWxzIGluc3RhbmNlb2YgQXJyYXkpKSBkYXRhLmV2YWxzID0gW2RhdGEuZXZhbHNdOwogICAgICAgICAgZm9yICh2YXIgayA9IDA7IGRhdGEuZXZhbHMgJiYgayA8IGRhdGEuZXZhbHMubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1trXSk7CiAgICAgICAgICB9CiAgICAgICAgICBiaW5kaW5nLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGluaXRSZXN1bHQpOwogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBpbml0UmVzdWx0LCBbZWwsIGRhdGEueF0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKCiAgICBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKTsKICB9CgogIC8vIFdhaXQgdW50aWwgYWZ0ZXIgdGhlIGRvY3VtZW50IGhhcyBsb2FkZWQgdG8gcmVuZGVyIHRoZSB3aWRnZXRzLgogIGlmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKSB7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24oKSB7CiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBhcmd1bWVudHMuY2FsbGVlLCBmYWxzZSk7CiAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgIH0sIGZhbHNlKTsKICB9IGVsc2UgaWYgKGRvY3VtZW50LmF0dGFjaEV2ZW50KSB7CiAgICBkb2N1bWVudC5hdHRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgZnVuY3Rpb24oKSB7CiAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAiY29tcGxldGUiKSB7CiAgICAgICAgZG9jdW1lbnQuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGFyZ3VtZW50cy5jYWxsZWUpOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfQogICAgfSk7CiAgfQoKCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEF0dGFjaG1lbnRVcmwgPSBmdW5jdGlvbihkZXBuYW1lLCBrZXkpIHsKICAgIC8vIElmIG5vIGtleSwgZGVmYXVsdCB0byB0aGUgZmlyc3QgaXRlbQogICAgaWYgKHR5cGVvZihrZXkpID09PSAidW5kZWZpbmVkIikKICAgICAga2V5ID0gMTsKCiAgICB2YXIgbGluayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRlcG5hbWUgKyAiLSIgKyBrZXkgKyAiLWF0dGFjaG1lbnQiKTsKICAgIGlmICghbGluaykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIkF0dGFjaG1lbnQgIiArIGRlcG5hbWUgKyAiLyIgKyBrZXkgKyAiIG5vdCBmb3VuZCBpbiBkb2N1bWVudCIpOwogICAgfQogICAgcmV0dXJuIGxpbmsuZ2V0QXR0cmlidXRlKCJocmVmIik7CiAgfTsKCiAgd2luZG93LkhUTUxXaWRnZXRzLmRhdGFmcmFtZVRvRDMgPSBmdW5jdGlvbihkZikgewogICAgdmFyIG5hbWVzID0gW107CiAgICB2YXIgbGVuZ3RoOwogICAgZm9yICh2YXIgbmFtZSBpbiBkZikgewogICAgICAgIGlmIChkZi5oYXNPd25Qcm9wZXJ0eShuYW1lKSkKICAgICAgICAgICAgbmFtZXMucHVzaChuYW1lKTsKICAgICAgICBpZiAodHlwZW9mKGRmW25hbWVdKSAhPT0gIm9iamVjdCIgfHwgdHlwZW9mKGRmW25hbWVdLmxlbmd0aCkgPT09ICJ1bmRlZmluZWQiKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyIpOwogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mKGxlbmd0aCkgIT09ICJ1bmRlZmluZWQiICYmIGxlbmd0aCAhPT0gZGZbbmFtZV0ubGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQWxsIGZpZWxkcyBtdXN0IGJlIGFycmF5cyBvZiB0aGUgc2FtZSBsZW5ndGgiKTsKICAgICAgICB9CiAgICAgICAgbGVuZ3RoID0gZGZbbmFtZV0ubGVuZ3RoOwogICAgfQogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBpdGVtOwogICAgZm9yICh2YXIgcm93ID0gMDsgcm93IDwgbGVuZ3RoOyByb3crKykgewogICAgICAgIGl0ZW0gPSB7fTsKICAgICAgICBmb3IgKHZhciBjb2wgPSAwOyBjb2wgPCBuYW1lcy5sZW5ndGg7IGNvbCsrKSB7CiAgICAgICAgICAgIGl0ZW1bbmFtZXNbY29sXV0gPSBkZltuYW1lc1tjb2xdXVtyb3ddOwogICAgICAgIH0KICAgICAgICByZXN1bHRzLnB1c2goaXRlbSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMudHJhbnNwb3NlQXJyYXkyRCA9IGZ1bmN0aW9uKGFycmF5KSB7CiAgICAgIGlmIChhcnJheS5sZW5ndGggPT09IDApIHJldHVybiBhcnJheTsKICAgICAgdmFyIG5ld0FycmF5ID0gYXJyYXlbMF0ubWFwKGZ1bmN0aW9uKGNvbCwgaSkgewogICAgICAgICAgcmV0dXJuIGFycmF5Lm1hcChmdW5jdGlvbihyb3cpIHsKICAgICAgICAgICAgICByZXR1cm4gcm93W2ldCiAgICAgICAgICB9KQogICAgICB9KTsKICAgICAgcmV0dXJuIG5ld0FycmF5OwogIH07CiAgLy8gU3BsaXQgdmFsdWUgYXQgc3BsaXRDaGFyLCBidXQgYWxsb3cgc3BsaXRDaGFyIHRvIGJlIGVzY2FwZWQKICAvLyB1c2luZyBlc2NhcGVDaGFyLiBBbnkgb3RoZXIgY2hhcmFjdGVycyBlc2NhcGVkIGJ5IGVzY2FwZUNoYXIKICAvLyB3aWxsIGJlIGluY2x1ZGVkIGFzIHVzdWFsIChpbmNsdWRpbmcgZXNjYXBlQ2hhciBpdHNlbGYpLgogIGZ1bmN0aW9uIHNwbGl0V2l0aEVzY2FwZSh2YWx1ZSwgc3BsaXRDaGFyLCBlc2NhcGVDaGFyKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgIHZhciBjdXJyZW50UmVzdWx0ID0gIiI7CiAgICBmb3IgKHZhciBwb3MgPSAwOyBwb3MgPCB2YWx1ZS5sZW5ndGg7IHBvcysrKSB7CiAgICAgIGlmICghZXNjYXBlTW9kZSkgewogICAgICAgIGlmICh2YWx1ZVtwb3NdID09PSBzcGxpdENoYXIpIHsKICAgICAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlW3Bvc10gPT09IGVzY2FwZUNoYXIpIHsKICAgICAgICAgIGVzY2FwZU1vZGUgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICBlc2NhcGVNb2RlID0gZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGlmIChjdXJyZW50UmVzdWx0ICE9PSAiIikgewogICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9CiAgLy8gRnVuY3Rpb24gYXV0aG9yZWQgYnkgWWlodWkvSkogQWxsYWlyZQogIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlciA9IGZ1bmN0aW9uKG8sIG1lbWJlcikgewogICAgdmFyIHBhcnRzID0gc3BsaXRXaXRoRXNjYXBlKG1lbWJlciwgJy4nLCAnXFwnKTsKICAgIGZvciAodmFyIGkgPSAwLCBsID0gcGFydHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgIHZhciBwYXJ0ID0gcGFydHNbaV07CiAgICAgIC8vIHBhcnQgbWF5IGJlIGEgY2hhcmFjdGVyIG9yICdudW1lcmljJyBtZW1iZXIgbmFtZQogICAgICBpZiAobyAhPT0gbnVsbCAmJiB0eXBlb2YgbyA9PT0gIm9iamVjdCIgJiYgcGFydCBpbiBvKSB7CiAgICAgICAgaWYgKGkgPT0gKGwgLSAxKSkgeyAvLyBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgbGluZSB0aGVuIGV2YWx1bGF0ZQogICAgICAgICAgaWYgKHR5cGVvZiBvW3BhcnRdID09PSAic3RyaW5nIikKICAgICAgICAgICAgb1twYXJ0XSA9IGV2YWwoIigiICsgb1twYXJ0XSArICIpIik7CiAgICAgICAgfSBlbHNlIHsgLy8gb3RoZXJ3aXNlIGNvbnRpbnVlIHRvIG5leHQgZW1iZWRkZWQgb2JqZWN0CiAgICAgICAgICBvID0gb1twYXJ0XTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9OwoKICAvLyBSZXRyaWV2ZSB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mIGFuCiAgLy8gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggYW4gZWxlbWVudCwgb3IgbnVsbCBpZiBub25lLgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKGVsKSB7CiAgICByZXR1cm4gZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpOwogIH07CgogIC8vIEZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBzY29wZSB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLAogIC8vIGFuZCByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YKICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGVsZW1lbnQsIGlmIGFueS4gSWYgbm8gZWxlbWVudCBtYXRjaGVzIHRoZQogIC8vIHNlbGVjdG9yLCBvciB0aGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCBoYXMgbm8gSFRNTFdpZGdldAogIC8vIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlbiBudWxsIGlzIHJldHVybmVkLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIGVsID0gc2NvcGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICBpZiAoZWwgPT09IG51bGwpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKGVsKTsKICAgIH0KICB9OwoKICAvLyBGaW5kcyBhbGwgZWxlbWVudHMgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yLCBhbmQKICAvLyByZXR1cm5zIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlcyAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlcyBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50cywgaW4gYW4gYXJyYXkuIElmIGVsZW1lbnRzIHRoYXQKICAvLyBtYXRjaCB0aGUgc2VsZWN0b3IgZG9uJ3QgaGF2ZSBhbiBhc3NvY2lhdGVkIEhUTUxXaWRnZXQKICAvLyBpbnN0YW5jZSwgdGhlIHJldHVybmVkIGFycmF5IHdpbGwgY29udGFpbiBudWxscy4KICAvLwogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4KICB3aW5kb3cuSFRNTFdpZGdldHMuZmluZEFsbCA9IGZ1bmN0aW9uKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICBzZWxlY3RvciA9IHNjb3BlOwogICAgICBzY29wZSA9IGRvY3VtZW50OwogICAgfQoKICAgIHZhciBub2RlcyA9IHNjb3BlLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgcmVzdWx0cy5wdXNoKHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShub2Rlc1tpXSkpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgdmFyIHBvc3RSZW5kZXJIYW5kbGVycyA9IFtdOwogIGZ1bmN0aW9uIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpIHsKICAgIHdoaWxlIChwb3N0UmVuZGVySGFuZGxlcnMubGVuZ3RoKSB7CiAgICAgIHZhciBoYW5kbGVyID0gcG9zdFJlbmRlckhhbmRsZXJzLnNoaWZ0KCk7CiAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgaGFuZGxlcigpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZWdpc3RlciB0aGUgZ2l2ZW4gY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCBhZnRlciB0aGUKICAvLyBuZXh0IHRpbWUgc3RhdGljIHdpZGdldHMgYXJlIHJlbmRlcmVkLgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5hZGRQb3N0UmVuZGVySGFuZGxlciA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICBwb3N0UmVuZGVySGFuZGxlcnMucHVzaChjYWxsYmFjayk7CiAgfTsKCiAgLy8gVGFrZXMgYSBuZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbiwgYW5kIHJldHVybnMgYW4KICAvLyBvbGQtc3R5bGUgY2xhc3MtYm91bmQgZGVmaW5pdGlvbi4gVGhpcyBzYXZlcyB1cyBmcm9tIGhhdmluZwogIC8vIHRvIHJld3JpdGUgYWxsIHRoZSBsb2dpYyBpbiB0aGlzIGZpbGUgdG8gYWNjb21vZGF0ZSBib3RoCiAgLy8gdHlwZXMgb2YgZGVmaW5pdGlvbnMuCiAgZnVuY3Rpb24gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmbikgewogICAgdmFyIHJlc3VsdCA9IHsKICAgICAgbmFtZTogZGVmbi5uYW1lLAogICAgICB0eXBlOiBkZWZuLnR5cGUsCiAgICAgIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgcmV0dXJuIGRlZm4uZmFjdG9yeShlbCwgd2lkdGgsIGhlaWdodCk7CiAgICAgIH0sCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVuZGVyVmFsdWUoeCk7CiAgICAgIH0sCiAgICAgIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKICAgICAgfQogICAgfTsKCiAgICBpZiAoZGVmbi5maW5kKQogICAgICByZXN1bHQuZmluZCA9IGRlZm4uZmluZDsKICAgIGlmIChkZWZuLnJlbmRlckVycm9yKQogICAgICByZXN1bHQucmVuZGVyRXJyb3IgPSBkZWZuLnJlbmRlckVycm9yOwogICAgaWYgKGRlZm4uY2xlYXJFcnJvcikKICAgICAgcmVzdWx0LmNsZWFyRXJyb3IgPSBkZWZuLmNsZWFyRXJyb3I7CgogICAgcmV0dXJuIHJlc3VsdDsKICB9Cn0pKCk7Cgo="></script>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbiYmKG4ub3duZXJEb2N1bWVudHx8bi5kb2N1bWVudHx8bikuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIHQobil7cmV0dXJuIG4mJihuLm93bmVyRG9jdW1lbnQmJm4ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8bi5kb2N1bWVudCYmbnx8bi5kZWZhdWx0Vmlldyl9ZnVuY3Rpb24gZShuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOk5hTn1mdW5jdGlvbiByKG4pe3JldHVybiBudWxsPT09bj9OYU46K259ZnVuY3Rpb24gdShuKXtyZXR1cm4haXNOYU4obil9ZnVuY3Rpb24gaShuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24odFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiBhKG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiBvKG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBsKG4sdCl7Zm9yKHZhciBlIGluIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse3ZhbHVlOnRbZV0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGMoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBzKG4pe3JldHVybihuKz0iIik9PT14YXx8blswXT09PWJhP2JhK246bn1mdW5jdGlvbiBmKG4pe3JldHVybihuKz0iIilbMF09PT1iYT9uLnNsaWNlKDEpOm59ZnVuY3Rpb24gaChuKXtyZXR1cm4gcyhuKWluIHRoaXMuX31mdW5jdGlvbiBnKG4pe3JldHVybihuPXMobikpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW25dfWZ1bmN0aW9uIHAoKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaChmKHQpKTtyZXR1cm4gbn1mdW5jdGlvbiB2KCl7dmFyIG49MDtmb3IodmFyIHQgaW4gdGhpcy5fKSsrbjtyZXR1cm4gbn1mdW5jdGlvbiBkKCl7Zm9yKHZhciBuIGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBtKCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24geShuKXtyZXR1cm4gbn1mdW5jdGlvbiBNKG4sdCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lLmFwcGx5KHQsYXJndW1lbnRzKTtyZXR1cm4gcj09PXQ/bjpyfX1mdW5jdGlvbiB4KG4sdCl7aWYodCBpbiBuKXJldHVybiB0O3Q9dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2Zvcih2YXIgZT0wLHI9X2EubGVuZ3RoO3I+ZTsrK2Upe3ZhciB1PV9hW2VdK3Q7aWYodSBpbiBuKXJldHVybiB1fX1mdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIF8oKXt9ZnVuY3Rpb24gdyhuKXtmdW5jdGlvbiB0KCl7Zm9yKHZhciB0LHI9ZSx1PS0xLGk9ci5sZW5ndGg7Kyt1PGk7KSh0PXJbdV0ub24pJiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbn12YXIgZT1bXSxyPW5ldyBjO3JldHVybiB0Lm9uPWZ1bmN0aW9uKHQsdSl7dmFyIGksYT1yLmdldCh0KTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP2EmJmEub246KGEmJihhLm9uPW51bGwsZT1lLnNsaWNlKDAsaT1lLmluZGV4T2YoYSkpLmNvbmNhdChlLnNsaWNlKGkrMSkpLHIucmVtb3ZlKHQpKSx1JiZlLnB1c2goci5zZXQodCx7b246dX0pKSxuKX0sdH1mdW5jdGlvbiBTKCl7b2EuZXZlbnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBrKCl7Zm9yKHZhciBuLHQ9b2EuZXZlbnQ7bj10LnNvdXJjZUV2ZW50Oyl0PW47cmV0dXJuIHR9ZnVuY3Rpb24gTihuKXtmb3IodmFyIHQ9bmV3IF8sZT0wLHI9YXJndW1lbnRzLmxlbmd0aDsrK2U8cjspdFthcmd1bWVudHNbZV1dPXcodCk7cmV0dXJuIHQub2Y9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dHJ5e3ZhciBpPXUuc291cmNlRXZlbnQ9b2EuZXZlbnQ7dS50YXJnZXQ9bixvYS5ldmVudD11LHRbdS50eXBlXS5hcHBseShlLHIpfWZpbmFsbHl7b2EuZXZlbnQ9aX19fSx0fWZ1bmN0aW9uIEUobil7cmV0dXJuIFNhKG4sQWEpLG59ZnVuY3Rpb24gQShuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIGthKG4sdGhpcyl9fWZ1bmN0aW9uIEMobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiBOYShuLHRoaXMpfX1mdW5jdGlvbiB6KG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCl9ZnVuY3Rpb24gdSgpe3RoaXMuc2V0QXR0cmlidXRlKG4sdCl9ZnVuY3Rpb24gaSgpe3RoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLHQpfWZ1bmN0aW9uIGEoKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pOnRoaXMuc2V0QXR0cmlidXRlKG4sZSl9ZnVuY3Rpb24gbygpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLGUpfXJldHVybiBuPW9hLm5zLnF1YWxpZnkobiksbnVsbD09dD9uLmxvY2FsP3I6ZToiZnVuY3Rpb24iPT10eXBlb2YgdD9uLmxvY2FsP286YTpuLmxvY2FsP2k6dX1mdW5jdGlvbiBMKG4pe3JldHVybiBuLnRyaW0oKS5yZXBsYWNlKC9ccysvZywiICIpfWZ1bmN0aW9uIHEobil7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58XFxzKykiK29hLnJlcXVvdGUobikrIig/Olxccyt8JCkiLCJnIil9ZnVuY3Rpb24gVChuKXtyZXR1cm4obisiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIFIobix0KXtmdW5jdGlvbiBlKCl7Zm9yKHZhciBlPS0xOysrZTx1OyluW2VdKHRoaXMsdCl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgZT0tMSxyPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpOysrZTx1OyluW2VdKHRoaXMscil9bj1UKG4pLm1hcChEKTt2YXIgdT1uLmxlbmd0aDtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9yOmV9ZnVuY3Rpb24gRChuKXt2YXIgdD1xKG4pO3JldHVybiBmdW5jdGlvbihlLHIpe2lmKHU9ZS5jbGFzc0xpc3QpcmV0dXJuIHI/dS5hZGQobik6dS5yZW1vdmUobik7dmFyIHU9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiO3I/KHQubGFzdEluZGV4PTAsdC50ZXN0KHUpfHxlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLEwodSsiICIrbikpKTplLnNldEF0dHJpYnV0ZSgiY2xhc3MiLEwodS5yZXBsYWNlKHQsIiAiKSkpfX1mdW5jdGlvbiBQKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiB1KCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHQsZSl9ZnVuY3Rpb24gaSgpe3ZhciByPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4scixlKX1yZXR1cm4gbnVsbD09dD9yOiJmdW5jdGlvbiI9PXR5cGVvZiB0P2k6dX1mdW5jdGlvbiBVKG4sdCl7ZnVuY3Rpb24gZSgpe2RlbGV0ZSB0aGlzW25dfWZ1bmN0aW9uIHIoKXt0aGlzW25dPXR9ZnVuY3Rpb24gdSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbbl06dGhpc1tuXT1lfXJldHVybiBudWxsPT10P2U6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dTpyfWZ1bmN0aW9uIGoobil7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlPT09Q2EmJnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PUNhP3QuY3JlYXRlRWxlbWVudChuKTp0LmNyZWF0ZUVsZW1lbnROUyhlLG4pfWZ1bmN0aW9uIGUoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49b2EubnMucXVhbGlmeShuKSkubG9jYWw/ZTp0fWZ1bmN0aW9uIEYoKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7biYmbi5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBIKG4pe3JldHVybntfX2RhdGFfXzpufX1mdW5jdGlvbiBPKG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBFYSh0aGlzLG4pfX1mdW5jdGlvbiBJKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RofHwobj1lKSxmdW5jdGlvbih0LGUpe3JldHVybiB0JiZlP24odC5fX2RhdGFfXyxlLl9fZGF0YV9fKTohdC0hZX19ZnVuY3Rpb24gWShuLHQpe2Zvcih2YXIgZT0wLHI9bi5sZW5ndGg7cj5lO2UrKylmb3IodmFyIHUsaT1uW2VdLGE9MCxvPWkubGVuZ3RoO28+YTthKyspKHU9aVthXSkmJnQodSxhLGUpO3JldHVybiBufWZ1bmN0aW9uIFoobil7cmV0dXJuIFNhKG4sTGEpLG59ZnVuY3Rpb24gVihuKXt2YXIgdCxlO3JldHVybiBmdW5jdGlvbihyLHUsaSl7dmFyIGEsbz1uW2ldLnVwZGF0ZSxsPW8ubGVuZ3RoO2ZvcihpIT1lJiYoZT1pLHQ9MCksdT49dCYmKHQ9dSsxKTshKGE9b1t0XSkmJisrdDxsOyk7cmV0dXJuIGF9fWZ1bmN0aW9uIFgobix0LGUpe2Z1bmN0aW9uIHIoKXt2YXIgdD10aGlzW2FdO3QmJih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobix0LHQuJCksZGVsZXRlIHRoaXNbYV0pfWZ1bmN0aW9uIHUoKXt2YXIgdT1sKHQsY2EoYXJndW1lbnRzKSk7ci5jYWxsKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihuLHRoaXNbYV09dSx1LiQ9ZSksdS5fPXR9ZnVuY3Rpb24gaSgpe3ZhciB0LGU9bmV3IFJlZ0V4cCgiXl9fb24oW14uXSspIitvYS5yZXF1b3RlKG4pKyIkIik7Zm9yKHZhciByIGluIHRoaXMpaWYodD1yLm1hdGNoKGUpKXt2YXIgdT10aGlzW3JdO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0WzFdLHUsdS4kKSxkZWxldGUgdGhpc1tyXX19dmFyIGE9Il9fb24iK24sbz1uLmluZGV4T2YoIi4iKSxsPSQ7bz4wJiYobj1uLnNsaWNlKDAsbykpO3ZhciBjPXFhLmdldChuKTtyZXR1cm4gYyYmKG49YyxsPUIpLG8/dD91OnI6dD9iOml9ZnVuY3Rpb24gJChuLHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1vYS5ldmVudDtvYS5ldmVudD1lLHRbMF09dGhpcy5fX2RhdGFfXzt0cnl7bi5hcHBseSh0aGlzLHQpfWZpbmFsbHl7b2EuZXZlbnQ9cn19fWZ1bmN0aW9uIEIobix0KXt2YXIgZT0kKG4sdCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMscj1uLnJlbGF0ZWRUYXJnZXQ7ciYmKHI9PT10fHw4JnIuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkpfHxlLmNhbGwodCxuKX19ZnVuY3Rpb24gVyhlKXt2YXIgcj0iLmRyYWdzdXBwcmVzcy0iKyArK1JhLHU9ImNsaWNrIityLGk9b2Euc2VsZWN0KHQoZSkpLm9uKCJ0b3VjaG1vdmUiK3IsUykub24oImRyYWdzdGFydCIrcixTKS5vbigic2VsZWN0c3RhcnQiK3IsUyk7aWYobnVsbD09VGEmJihUYT0ib25zZWxlY3RzdGFydCJpbiBlPyExOngoZS5zdHlsZSwidXNlclNlbGVjdCIpKSxUYSl7dmFyIGE9bihlKS5zdHlsZSxvPWFbVGFdO2FbVGFdPSJub25lIn1yZXR1cm4gZnVuY3Rpb24obil7aWYoaS5vbihyLG51bGwpLFRhJiYoYVtUYV09byksbil7dmFyIHQ9ZnVuY3Rpb24oKXtpLm9uKHUsbnVsbCl9O2kub24odSxmdW5jdGlvbigpe1MoKSx0KCl9LCEwKSxzZXRUaW1lb3V0KHQsMCl9fX1mdW5jdGlvbiBKKG4sZSl7ZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIHI9bi5vd25lclNWR0VsZW1lbnR8fG47aWYoci5jcmVhdGVTVkdQb2ludCl7dmFyIHU9ci5jcmVhdGVTVkdQb2ludCgpO2lmKDA+RGEpe3ZhciBpPXQobik7aWYoaS5zY3JvbGxYfHxpLnNjcm9sbFkpe3I9b2Euc2VsZWN0KCJib2R5IikuYXBwZW5kKCJzdmciKS5zdHlsZSh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjoibm9uZSJ9LCJpbXBvcnRhbnQiKTt2YXIgYT1yWzBdWzBdLmdldFNjcmVlbkNUTSgpO0RhPSEoYS5mfHxhLmUpLHIucmVtb3ZlKCl9fXJldHVybiBEYT8odS54PWUucGFnZVgsdS55PWUucGFnZVkpOih1Lng9ZS5jbGllbnRYLHUueT1lLmNsaWVudFkpLHU9dS5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFt1LngsdS55XX12YXIgbz1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltlLmNsaWVudFgtby5sZWZ0LW4uY2xpZW50TGVmdCxlLmNsaWVudFktby50b3Atbi5jbGllbnRUb3BdfWZ1bmN0aW9uIEcoKXtyZXR1cm4gb2EuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcn1mdW5jdGlvbiBLKG4pe3JldHVybiBuPjA/MTowPm4/LTE6MH1mdW5jdGlvbiBRKG4sdCxlKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS1uWzFdKS0odFsxXS1uWzFdKSooZVswXS1uWzBdKX1mdW5jdGlvbiBubihuKXtyZXR1cm4gbj4xPzA6LTE+bj9qYTpNYXRoLmFjb3Mobil9ZnVuY3Rpb24gdG4obil7cmV0dXJuIG4+MT9PYTotMT5uPy1PYTpNYXRoLmFzaW4obil9ZnVuY3Rpb24gZW4obil7cmV0dXJuKChuPU1hdGguZXhwKG4pKS0xL24pLzJ9ZnVuY3Rpb24gcm4obil7cmV0dXJuKChuPU1hdGguZXhwKG4pKSsxL24pLzJ9ZnVuY3Rpb24gdW4obil7cmV0dXJuKChuPU1hdGguZXhwKDIqbikpLTEpLyhuKzEpfWZ1bmN0aW9uIGFuKG4pe3JldHVybihuPU1hdGguc2luKG4vMikpKm59ZnVuY3Rpb24gb24oKXt9ZnVuY3Rpb24gbG4obix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbG4/KHRoaXMuaD0rbix0aGlzLnM9K3Qsdm9pZCh0aGlzLmw9K2UpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIGxuP25ldyBsbihuLmgsbi5zLG4ubCk6X24oIiIrbix3bixsbik6bmV3IGxuKG4sdCxlKX1mdW5jdGlvbiBjbihuLHQsZSl7ZnVuY3Rpb24gcihuKXtyZXR1cm4gbj4zNjA/bi09MzYwOjA+biYmKG4rPTM2MCksNjA+bj9pKyhhLWkpKm4vNjA6MTgwPm4/YToyNDA+bj9pKyhhLWkpKigyNDAtbikvNjA6aX1mdW5jdGlvbiB1KG4pe3JldHVybiBNYXRoLnJvdW5kKDI1NSpyKG4pKX12YXIgaSxhO3JldHVybiBuPWlzTmFOKG4pPzA6KG4lPTM2MCk8MD9uKzM2MDpuLHQ9aXNOYU4odCk/MDowPnQ/MDp0PjE/MTp0LGU9MD5lPzA6ZT4xPzE6ZSxhPS41Pj1lP2UqKDErdCk6ZSt0LWUqdCxpPTIqZS1hLG5ldyB5bih1KG4rMTIwKSx1KG4pLHUobi0xMjApKX1mdW5jdGlvbiBzbihuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBzbj8odGhpcy5oPStuLHRoaXMuYz0rdCx2b2lkKHRoaXMubD0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2Ygc24/bmV3IHNuKG4uaCxuLmMsbi5sKTpuIGluc3RhbmNlb2YgaG4/cG4obi5sLG4uYSxuLmIpOnBuKChuPVNuKChuPW9hLnJnYihuKSkucixuLmcsbi5iKSkubCxuLmEsbi5iKTpuZXcgc24obix0LGUpfWZ1bmN0aW9uIGZuKG4sdCxlKXtyZXR1cm4gaXNOYU4obikmJihuPTApLGlzTmFOKHQpJiYodD0wKSxuZXcgaG4oZSxNYXRoLmNvcyhuKj1JYSkqdCxNYXRoLnNpbihuKSp0KX1mdW5jdGlvbiBobihuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBobj8odGhpcy5sPStuLHRoaXMuYT0rdCx2b2lkKHRoaXMuYj0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgaG4/bmV3IGhuKG4ubCxuLmEsbi5iKTpuIGluc3RhbmNlb2Ygc24/Zm4obi5oLG4uYyxuLmwpOlNuKChuPXluKG4pKS5yLG4uZyxuLmIpOm5ldyBobihuLHQsZSl9ZnVuY3Rpb24gZ24obix0LGUpe3ZhciByPShuKzE2KS8xMTYsdT1yK3QvNTAwLGk9ci1lLzIwMDtyZXR1cm4gdT12bih1KSpRYSxyPXZuKHIpKm5vLGk9dm4oaSkqdG8sbmV3IHluKG1uKDMuMjQwNDU0Mip1LTEuNTM3MTM4NSpyLS40OTg1MzE0KmkpLG1uKC0uOTY5MjY2KnUrMS44NzYwMTA4KnIrLjA0MTU1NippKSxtbiguMDU1NjQzNCp1LS4yMDQwMjU5KnIrMS4wNTcyMjUyKmkpKX1mdW5jdGlvbiBwbihuLHQsZSl7cmV0dXJuIG4+MD9uZXcgc24oTWF0aC5hdGFuMihlLHQpKllhLE1hdGguc3FydCh0KnQrZSplKSxuKTpuZXcgc24oTmFOLE5hTixuKX1mdW5jdGlvbiB2bihuKXtyZXR1cm4gbj4uMjA2ODkzMDM0P24qbipuOihuLTQvMjkpLzcuNzg3MDM3fWZ1bmN0aW9uIGRuKG4pe3JldHVybiBuPi4wMDg4NTY/TWF0aC5wb3cobiwxLzMpOjcuNzg3MDM3Km4rNC8yOX1mdW5jdGlvbiBtbihuKXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqKC4wMDMwND49bj8xMi45MipuOjEuMDU1Kk1hdGgucG93KG4sMS8yLjQpLS4wNTUpKX1mdW5jdGlvbiB5bihuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiB5bj8odGhpcy5yPX5+bix0aGlzLmc9fn50LHZvaWQodGhpcy5iPX5+ZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgeW4/bmV3IHluKG4ucixuLmcsbi5iKTpfbigiIituLHluLGNuKTpuZXcgeW4obix0LGUpfWZ1bmN0aW9uIE1uKG4pe3JldHVybiBuZXcgeW4obj4+MTYsbj4+OCYyNTUsMjU1Jm4pfWZ1bmN0aW9uIHhuKG4pe3JldHVybiBNbihuKSsiIn1mdW5jdGlvbiBibihuKXtyZXR1cm4gMTY+bj8iMCIrTWF0aC5tYXgoMCxuKS50b1N0cmluZygxNik6TWF0aC5taW4oMjU1LG4pLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBfbihuLHQsZSl7dmFyIHIsdSxpLGE9MCxvPTAsbD0wO2lmKHI9LyhbYS16XSspXCgoLiopXCkvLmV4ZWMobj1uLnRvTG93ZXJDYXNlKCkpKXN3aXRjaCh1PXJbMl0uc3BsaXQoIiwiKSxyWzFdKXtjYXNlImhzbCI6cmV0dXJuIGUocGFyc2VGbG9hdCh1WzBdKSxwYXJzZUZsb2F0KHVbMV0pLzEwMCxwYXJzZUZsb2F0KHVbMl0pLzEwMCk7Y2FzZSJyZ2IiOnJldHVybiB0KE5uKHVbMF0pLE5uKHVbMV0pLE5uKHVbMl0pKX1yZXR1cm4oaT11by5nZXQobikpP3QoaS5yLGkuZyxpLmIpOihudWxsPT1ufHwiIyIhPT1uLmNoYXJBdCgwKXx8aXNOYU4oaT1wYXJzZUludChuLnNsaWNlKDEpLDE2KSl8fCg0PT09bi5sZW5ndGg/KGE9KDM4NDAmaSk+PjQsYT1hPj40fGEsbz0yNDAmaSxvPW8+PjR8byxsPTE1JmksbD1sPDw0fGwpOjc9PT1uLmxlbmd0aCYmKGE9KDE2NzExNjgwJmkpPj4xNixvPSg2NTI4MCZpKT4+OCxsPTI1NSZpKSksdChhLG8sbCkpfWZ1bmN0aW9uIHduKG4sdCxlKXt2YXIgcix1LGk9TWF0aC5taW4obi89MjU1LHQvPTI1NSxlLz0yNTUpLGE9TWF0aC5tYXgobix0LGUpLG89YS1pLGw9KGEraSkvMjtyZXR1cm4gbz8odT0uNT5sP28vKGEraSk6by8oMi1hLWkpLHI9bj09YT8odC1lKS9vKyhlPnQ/NjowKTp0PT1hPyhlLW4pL28rMjoobi10KS9vKzQscio9NjApOihyPU5hTix1PWw+MCYmMT5sPzA6ciksbmV3IGxuKHIsdSxsKX1mdW5jdGlvbiBTbihuLHQsZSl7bj1rbihuKSx0PWtuKHQpLGU9a24oZSk7dmFyIHI9ZG4oKC40MTI0NTY0Km4rLjM1NzU3NjEqdCsuMTgwNDM3NSplKS9RYSksdT1kbigoLjIxMjY3MjkqbisuNzE1MTUyMip0Ky4wNzIxNzUqZSkvbm8pLGk9ZG4oKC4wMTkzMzM5Km4rLjExOTE5Mip0Ky45NTAzMDQxKmUpL3RvKTtyZXR1cm4gaG4oMTE2KnUtMTYsNTAwKihyLXUpLDIwMCoodS1pKSl9ZnVuY3Rpb24ga24obil7cmV0dXJuKG4vPTI1NSk8PS4wNDA0NT9uLzEyLjkyOk1hdGgucG93KChuKy4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gTm4obil7dmFyIHQ9cGFyc2VGbG9hdChuKTtyZXR1cm4iJSI9PT1uLmNoYXJBdChuLmxlbmd0aC0xKT9NYXRoLnJvdW5kKDIuNTUqdCk6dH1mdW5jdGlvbiBFbihuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIG59fWZ1bmN0aW9uIEFuKG4pe3JldHVybiBmdW5jdGlvbih0LGUscil7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPW51bGwpLENuKHQsZSxuLHIpfX1mdW5jdGlvbiBDbihuLHQsZSxyKXtmdW5jdGlvbiB1KCl7dmFyIG4sdD1sLnN0YXR1cztpZighdCYmTG4obCl8fHQ+PTIwMCYmMzAwPnR8fDMwND09PXQpe3RyeXtuPWUuY2FsbChpLGwpfWNhdGNoKHIpe3JldHVybiB2b2lkIGEuZXJyb3IuY2FsbChpLHIpfWEubG9hZC5jYWxsKGksbil9ZWxzZSBhLmVycm9yLmNhbGwoaSxsKX12YXIgaT17fSxhPW9hLmRpc3BhdGNoKCJiZWZvcmVzZW5kIiwicHJvZ3Jlc3MiLCJsb2FkIiwiZXJyb3IiKSxvPXt9LGw9bmV3IFhNTEh0dHBSZXF1ZXN0LGM9bnVsbDtyZXR1cm4hdGhpcy5YRG9tYWluUmVxdWVzdHx8IndpdGhDcmVkZW50aWFscyJpbiBsfHwhL14oaHR0cChzKT86KT9cL1wvLy50ZXN0KG4pfHwobD1uZXcgWERvbWFpblJlcXVlc3QpLCJvbmxvYWQiaW4gbD9sLm9ubG9hZD1sLm9uZXJyb3I9dTpsLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2wucmVhZHlTdGF0ZT4zJiZ1KCl9LGwub25wcm9ncmVzcz1mdW5jdGlvbihuKXt2YXIgdD1vYS5ldmVudDtvYS5ldmVudD1uO3RyeXthLnByb2dyZXNzLmNhbGwoaSxsKX1maW5hbGx5e29hLmV2ZW50PXR9fSxpLmhlYWRlcj1mdW5jdGlvbihuLHQpe3JldHVybiBuPShuKyIiKS50b0xvd2VyQ2FzZSgpLGFyZ3VtZW50cy5sZW5ndGg8Mj9vW25dOihudWxsPT10P2RlbGV0ZSBvW25dOm9bbl09dCsiIixpKX0saS5taW1lVHlwZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1udWxsPT1uP251bGw6bisiIixpKTp0fSxpLnJlc3BvbnNlVHlwZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLGkpOmN9LGkucmVzcG9uc2U9ZnVuY3Rpb24obil7cmV0dXJuIGU9bixpfSxbImdldCIsInBvc3QiXS5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lbbl09ZnVuY3Rpb24oKXtyZXR1cm4gaS5zZW5kLmFwcGx5KGksW25dLmNvbmNhdChjYShhcmd1bWVudHMpKSl9fSksaS5zZW5kPWZ1bmN0aW9uKGUscix1KXtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIHImJih1PXIscj1udWxsKSxsLm9wZW4oZSxuLCEwKSxudWxsPT10fHwiYWNjZXB0ImluIG98fChvLmFjY2VwdD10KyIsKi8qIiksbC5zZXRSZXF1ZXN0SGVhZGVyKWZvcih2YXIgcyBpbiBvKWwuc2V0UmVxdWVzdEhlYWRlcihzLG9bc10pO3JldHVybiBudWxsIT10JiZsLm92ZXJyaWRlTWltZVR5cGUmJmwub3ZlcnJpZGVNaW1lVHlwZSh0KSxudWxsIT1jJiYobC5yZXNwb25zZVR5cGU9YyksbnVsbCE9dSYmaS5vbigiZXJyb3IiLHUpLm9uKCJsb2FkIixmdW5jdGlvbihuKXt1KG51bGwsbil9KSxhLmJlZm9yZXNlbmQuY2FsbChpLGwpLGwuc2VuZChudWxsPT1yP251bGw6ciksaX0saS5hYm9ydD1mdW5jdGlvbigpe3JldHVybiBsLmFib3J0KCksaX0sb2EucmViaW5kKGksYSwib24iKSxudWxsPT1yP2k6aS5nZXQoem4ocikpfWZ1bmN0aW9uIHpuKG4pe3JldHVybiAxPT09bi5sZW5ndGg/ZnVuY3Rpb24odCxlKXtuKG51bGw9PXQ/ZTpudWxsKX06bn1mdW5jdGlvbiBMbihuKXt2YXIgdD1uLnJlc3BvbnNlVHlwZTtyZXR1cm4gdCYmInRleHQiIT09dD9uLnJlc3BvbnNlOm4ucmVzcG9uc2VUZXh0fWZ1bmN0aW9uIHFuKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoOzI+ciYmKHQ9MCksMz5yJiYoZT1EYXRlLm5vdygpKTt2YXIgdT1lK3QsaT17YzpuLHQ6dSxuOm51bGx9O3JldHVybiBhbz9hby5uPWk6aW89aSxhbz1pLG9vfHwobG89Y2xlYXJUaW1lb3V0KGxvKSxvbz0xLGNvKFRuKSksaX1mdW5jdGlvbiBUbigpe3ZhciBuPVJuKCksdD1EbigpLW47dD4yND8oaXNGaW5pdGUodCkmJihjbGVhclRpbWVvdXQobG8pLGxvPXNldFRpbWVvdXQoVG4sdCkpLG9vPTApOihvbz0xLGNvKFRuKSl9ZnVuY3Rpb24gUm4oKXtmb3IodmFyIG49RGF0ZS5ub3coKSx0PWlvO3Q7KW4+PXQudCYmdC5jKG4tdC50KSYmKHQuYz1udWxsKSx0PXQubjtyZXR1cm4gbn1mdW5jdGlvbiBEbigpe2Zvcih2YXIgbix0PWlvLGU9MS8wO3Q7KXQuYz8odC50PGUmJihlPXQudCksdD0obj10KS5uKTp0PW4/bi5uPXQubjppbz10Lm47cmV0dXJuIGFvPW4sZX1mdW5jdGlvbiBQbihuLHQpe3JldHVybiB0LShuP01hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIFVuKG4sdCl7dmFyIGU9TWF0aC5wb3coMTAsMypNYSg4LXQpKTtyZXR1cm57c2NhbGU6dD44P2Z1bmN0aW9uKG4pe3JldHVybiBuL2V9OmZ1bmN0aW9uKG4pe3JldHVybiBuKmV9LHN5bWJvbDpufX1mdW5jdGlvbiBqbihuKXt2YXIgdD1uLmRlY2ltYWwsZT1uLnRob3VzYW5kcyxyPW4uZ3JvdXBpbmcsdT1uLmN1cnJlbmN5LGk9ciYmZT9mdW5jdGlvbihuLHQpe2Zvcih2YXIgdT1uLmxlbmd0aCxpPVtdLGE9MCxvPXJbMF0sbD0wO3U+MCYmbz4wJiYobCtvKzE+dCYmKG89TWF0aC5tYXgoMSx0LWwpKSxpLnB1c2gobi5zdWJzdHJpbmcodS09byx1K28pKSwhKChsKz1vKzEpPnQpKTspbz1yW2E9KGErMSklci5sZW5ndGhdO3JldHVybiBpLnJldmVyc2UoKS5qb2luKGUpfTp5O3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1mby5leGVjKG4pLHI9ZVsxXXx8IiAiLGE9ZVsyXXx8Ij4iLG89ZVszXXx8Ii0iLGw9ZVs0XXx8IiIsYz1lWzVdLHM9K2VbNl0sZj1lWzddLGg9ZVs4XSxnPWVbOV0scD0xLHY9IiIsZD0iIixtPSExLHk9ITA7c3dpdGNoKGgmJihoPStoLnN1YnN0cmluZygxKSksKGN8fCIwIj09PXImJiI9Ij09PWEpJiYoYz1yPSIwIixhPSI9IiksZyl7Y2FzZSJuIjpmPSEwLGc9ImciO2JyZWFrO2Nhc2UiJSI6cD0xMDAsZD0iJSIsZz0iZiI7YnJlYWs7Y2FzZSJwIjpwPTEwMCxkPSIlIixnPSJyIjticmVhaztjYXNlImIiOmNhc2UibyI6Y2FzZSJ4IjpjYXNlIlgiOiIjIj09PWwmJih2PSIwIitnLnRvTG93ZXJDYXNlKCkpO2Nhc2UiYyI6eT0hMTtjYXNlImQiOm09ITAsaD0wO2JyZWFrO2Nhc2UicyI6cD0tMSxnPSJyIn0iJCI9PT1sJiYodj11WzBdLGQ9dVsxXSksInIiIT1nfHxofHwoZz0iZyIpLG51bGwhPWgmJigiZyI9PWc/aD1NYXRoLm1heCgxLE1hdGgubWluKDIxLGgpKTooImUiPT1nfHwiZiI9PWcpJiYoaD1NYXRoLm1heCgwLE1hdGgubWluKDIwLGgpKSkpLGc9aG8uZ2V0KGcpfHxGbjt2YXIgTT1jJiZmO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1kO2lmKG0mJm4lMSlyZXR1cm4iIjt2YXIgdT0wPm58fDA9PT1uJiYwPjEvbj8obj0tbiwiLSIpOiItIj09PW8/IiI6bztpZigwPnApe3ZhciBsPW9hLmZvcm1hdFByZWZpeChuLGgpO249bC5zY2FsZShuKSxlPWwuc3ltYm9sK2R9ZWxzZSBuKj1wO249ZyhuLGgpO3ZhciB4LGIsXz1uLmxhc3RJbmRleE9mKCIuIik7aWYoMD5fKXt2YXIgdz15P24ubGFzdEluZGV4T2YoImUiKTotMTswPnc/KHg9bixiPSIiKTooeD1uLnN1YnN0cmluZygwLHcpLGI9bi5zdWJzdHJpbmcodykpfWVsc2UgeD1uLnN1YnN0cmluZygwLF8pLGI9dCtuLnN1YnN0cmluZyhfKzEpOyFjJiZmJiYoeD1pKHgsMS8wKSk7dmFyIFM9di5sZW5ndGgreC5sZW5ndGgrYi5sZW5ndGgrKE0/MDp1Lmxlbmd0aCksaz1zPlM/bmV3IEFycmF5KFM9cy1TKzEpLmpvaW4ocik6IiI7cmV0dXJuIE0mJih4PWkoayt4LGsubGVuZ3RoP3MtYi5sZW5ndGg6MS8wKSksdSs9dixuPXgrYiwoIjwiPT09YT91K24razoiPiI9PT1hP2srdStuOiJeIj09PWE/ay5zdWJzdHJpbmcoMCxTPj49MSkrdStuK2suc3Vic3RyaW5nKFMpOnUrKE0/bjprK24pKStlfX19ZnVuY3Rpb24gRm4obil7cmV0dXJuIG4rIiJ9ZnVuY3Rpb24gSG4oKXt0aGlzLl89bmV3IERhdGUoYXJndW1lbnRzLmxlbmd0aD4xP0RhdGUuVVRDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHNbMF0pfWZ1bmN0aW9uIE9uKG4sdCxlKXtmdW5jdGlvbiByKHQpe3ZhciBlPW4odCkscj1pKGUsMSk7cmV0dXJuIHItdD50LWU/ZTpyfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIHQoZT1uKG5ldyBwbyhlLTEpKSwxKSxlfWZ1bmN0aW9uIGkobixlKXtyZXR1cm4gdChuPW5ldyBwbygrbiksZSksbn1mdW5jdGlvbiBhKG4scixpKXt2YXIgYT11KG4pLG89W107aWYoaT4xKWZvcig7cj5hOyllKGEpJWl8fG8ucHVzaChuZXcgRGF0ZSgrYSkpLHQoYSwxKTtlbHNlIGZvcig7cj5hOylvLnB1c2gobmV3IERhdGUoK2EpKSx0KGEsMSk7cmV0dXJuIG99ZnVuY3Rpb24gbyhuLHQsZSl7dHJ5e3BvPUhuO3ZhciByPW5ldyBIbjtyZXR1cm4gci5fPW4sYShyLHQsZSl9ZmluYWxseXtwbz1EYXRlfX1uLmZsb29yPW4sbi5yb3VuZD1yLG4uY2VpbD11LG4ub2Zmc2V0PWksbi5yYW5nZT1hO3ZhciBsPW4udXRjPUluKG4pO3JldHVybiBsLmZsb29yPWwsbC5yb3VuZD1JbihyKSxsLmNlaWw9SW4odSksbC5vZmZzZXQ9SW4oaSksbC5yYW5nZT1vLG59ZnVuY3Rpb24gSW4obil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dHJ5e3BvPUhuO3ZhciByPW5ldyBIbjtyZXR1cm4gci5fPXQsbihyLGUpLl99ZmluYWxseXtwbz1EYXRlfX19ZnVuY3Rpb24gWW4obil7ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiB0KHQpe2Zvcih2YXIgZSx1LGksYT1bXSxvPS0xLGw9MDsrK288cjspMzc9PT1uLmNoYXJDb2RlQXQobykmJihhLnB1c2gobi5zbGljZShsLG8pKSxudWxsIT0odT1tb1tlPW4uY2hhckF0KCsrbyldKSYmKGU9bi5jaGFyQXQoKytvKSksKGk9QVtlXSkmJihlPWkodCxudWxsPT11PyJlIj09PWU/IiAiOiIwIjp1KSksYS5wdXNoKGUpLGw9bysxKTtyZXR1cm4gYS5wdXNoKG4uc2xpY2UobCxvKSksYS5qb2luKCIiKX12YXIgcj1uLmxlbmd0aDtyZXR1cm4gdC5wYXJzZT1mdW5jdGlvbih0KXt2YXIgcj17eToxOTAwLG06MCxkOjEsSDowLE06MCxTOjAsTDowLFo6bnVsbH0sdT1lKHIsbix0LDApO2lmKHUhPXQubGVuZ3RoKXJldHVybiBudWxsOyJwImluIHImJihyLkg9ci5IJTEyKzEyKnIucCk7dmFyIGk9bnVsbCE9ci5aJiZwbyE9PUhuLGE9bmV3KGk/SG46cG8pO3JldHVybiJqImluIHI/YS5zZXRGdWxsWWVhcihyLnksMCxyLmopOiJXImluIHJ8fCJVImluIHI/KCJ3ImluIHJ8fChyLnc9IlciaW4gcj8xOjApLGEuc2V0RnVsbFllYXIoci55LDAsMSksYS5zZXRGdWxsWWVhcihyLnksMCwiVyJpbiByPyhyLncrNiklNys3KnIuVy0oYS5nZXREYXkoKSs1KSU3OnIudys3KnIuVS0oYS5nZXREYXkoKSs2KSU3KSk6YS5zZXRGdWxsWWVhcihyLnksci5tLHIuZCksYS5zZXRIb3VycyhyLkgrKHIuWi8xMDB8MCksci5NK3IuWiUxMDAsci5TLHIuTCksaT9hLl86YX0sdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBufSx0fWZ1bmN0aW9uIGUobix0LGUscil7Zm9yKHZhciB1LGksYSxvPTAsbD10Lmxlbmd0aCxjPWUubGVuZ3RoO2w+bzspe2lmKHI+PWMpcmV0dXJuLTE7aWYodT10LmNoYXJDb2RlQXQobysrKSwzNz09PXUpe2lmKGE9dC5jaGFyQXQobysrKSxpPUNbYSBpbiBtbz90LmNoYXJBdChvKyspOmFdLCFpfHwocj1pKG4sZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKHUhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfWZ1bmN0aW9uIHIobix0LGUpe18ubGFzdEluZGV4PTA7dmFyIHI9Xy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLnc9dy5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1KG4sdCxlKXt4Lmxhc3RJbmRleD0wO3ZhciByPXguZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi53PWIuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gaShuLHQsZSl7Ti5sYXN0SW5kZXg9MDt2YXIgcj1OLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4ubT1FLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGEobix0LGUpe1MubGFzdEluZGV4PTA7dmFyIHI9Uy5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLm09ay5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvKG4sdCxyKXtyZXR1cm4gZShuLEEuYy50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gbChuLHQscil7cmV0dXJuIGUobixBLngudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIGMobix0LHIpe3JldHVybiBlKG4sQS5YLnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBzKG4sdCxlKXt2YXIgcj1NLmdldCh0LnNsaWNlKGUsZSs9MikudG9Mb3dlckNhc2UoKSk7cmV0dXJuIG51bGw9PXI/LTE6KG4ucD1yLGUpfXZhciBmPW4uZGF0ZVRpbWUsaD1uLmRhdGUsZz1uLnRpbWUscD1uLnBlcmlvZHMsdj1uLmRheXMsZD1uLnNob3J0RGF5cyxtPW4ubW9udGhzLHk9bi5zaG9ydE1vbnRoczt0LnV0Yz1mdW5jdGlvbihuKXtmdW5jdGlvbiBlKG4pe3RyeXtwbz1Ibjt2YXIgdD1uZXcgcG87cmV0dXJuIHQuXz1uLHIodCl9ZmluYWxseXtwbz1EYXRlfX12YXIgcj10KG4pO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4pe3RyeXtwbz1Ibjt2YXIgdD1yLnBhcnNlKG4pO3JldHVybiB0JiZ0Ll99ZmluYWxseXtwbz1EYXRlfX0sZS50b1N0cmluZz1yLnRvU3RyaW5nLGV9LHQubXVsdGk9dC51dGMubXVsdGk9Y3Q7dmFyIE09b2EubWFwKCkseD1Wbih2KSxiPVhuKHYpLF89Vm4oZCksdz1YbihkKSxTPVZuKG0pLGs9WG4obSksTj1Wbih5KSxFPVhuKHkpO3AuZm9yRWFjaChmdW5jdGlvbihuLHQpe00uc2V0KG4udG9Mb3dlckNhc2UoKSx0KX0pO3ZhciBBPXthOmZ1bmN0aW9uKG4pe3JldHVybiBkW24uZ2V0RGF5KCldfSxBOmZ1bmN0aW9uKG4pe3JldHVybiB2W24uZ2V0RGF5KCldfSxiOmZ1bmN0aW9uKG4pe3JldHVybiB5W24uZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24obil7cmV0dXJuIG1bbi5nZXRNb250aCgpXX0sYzp0KGYpLGQ6ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4obi5nZXREYXRlKCksdCwyKX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldERhdGUoKSx0LDIpfSxIOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuKG4uZ2V0SG91cnMoKSx0LDIpfSxJOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuKG4uZ2V0SG91cnMoKSUxMnx8MTIsdCwyKX0sajpmdW5jdGlvbihuLHQpe3JldHVybiBabigxK2dvLmRheU9mWWVhcihuKSx0LDMpfSxMOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuKG4uZ2V0TWlsbGlzZWNvbmRzKCksdCwzKX0sbTpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldE1vbnRoKCkrMSx0LDIpfSxNOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuKG4uZ2V0TWludXRlcygpLHQsMil9LHA6ZnVuY3Rpb24obil7cmV0dXJuIHBbKyhuLmdldEhvdXJzKCk+PTEyKV19LFM6ZnVuY3Rpb24obix0KXtyZXR1cm4gWm4obi5nZXRTZWNvbmRzKCksdCwyKX0sVTpmdW5jdGlvbihuLHQpe3JldHVybiBabihnby5zdW5kYXlPZlllYXIobiksdCwyKX0sdzpmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXkoKX0sVzpmdW5jdGlvbihuLHQpe3JldHVybiBabihnby5tb25kYXlPZlllYXIobiksdCwyKX0seDp0KGgpLFg6dChnKSx5OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFpuKG4uZ2V0RnVsbFllYXIoKSUxMDAsdCwyKX0sWTpmdW5jdGlvbihuLHQpe3JldHVybiBabihuLmdldEZ1bGxZZWFyKCklMWU0LHQsNCl9LFo6b3QsIiUiOmZ1bmN0aW9uKCl7cmV0dXJuIiUifX0sQz17YTpyLEE6dSxiOmksQjphLGM6byxkOnR0LGU6dHQsSDpydCxJOnJ0LGo6ZXQsTDphdCxtOm50LE06dXQscDpzLFM6aXQsVTpCbix3OiRuLFc6V24seDpsLFg6Yyx5OkduLFk6Sm4sWjpLbiwiJSI6bHR9O3JldHVybiB0fWZ1bmN0aW9uIFpuKG4sdCxlKXt2YXIgcj0wPm4/Ii0iOiIiLHU9KHI/LW46bikrIiIsaT11Lmxlbmd0aDtyZXR1cm4gcisoZT5pP25ldyBBcnJheShlLWkrMSkuam9pbih0KSt1OnUpfWZ1bmN0aW9uIFZuKG4pe3JldHVybiBuZXcgUmVnRXhwKCJeKD86IituLm1hcChvYS5yZXF1b3RlKS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gWG4obil7Zm9yKHZhciB0PW5ldyBjLGU9LTEscj1uLmxlbmd0aDsrK2U8cjspdC5zZXQobltlXS50b0xvd2VyQ2FzZSgpLGUpO3JldHVybiB0fWZ1bmN0aW9uICRuKG4sdCxlKXt5by5sYXN0SW5kZXg9MDt2YXIgcj15by5leGVjKHQuc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8obi53PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEJuKG4sdCxlKXt5by5sYXN0SW5kZXg9MDt2YXIgcj15by5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLlU9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gV24obix0LGUpe3lvLmxhc3RJbmRleD0wO3ZhciByPXlvLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4uVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKbihuLHQsZSl7eW8ubGFzdEluZGV4PTA7dmFyIHI9eW8uZXhlYyh0LnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KG4ueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBHbihuLHQsZSl7eW8ubGFzdEluZGV4PTA7dmFyIHI9eW8uZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4ueT1RbigrclswXSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gS24obix0LGUpe3JldHVybi9eWystXVxkezR9JC8udGVzdCh0PXQuc2xpY2UoZSxlKzUpKT8obi5aPS10LGUrNSk6LTF9ZnVuY3Rpb24gUW4obil7cmV0dXJuIG4rKG4+Njg/MTkwMDoyZTMpfWZ1bmN0aW9uIG50KG4sdCxlKXt5by5sYXN0SW5kZXg9MDt2YXIgcj15by5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5tPXJbMF0tMSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0dChuLHQsZSl7eW8ubGFzdEluZGV4PTA7dmFyIHI9eW8uZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uZD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBldChuLHQsZSl7eW8ubGFzdEluZGV4PTA7dmFyIHI9eW8uZXhlYyh0LnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KG4uaj0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBydChuLHQsZSl7eW8ubGFzdEluZGV4PTA7dmFyIHI9eW8uZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uSD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1dChuLHQsZSl7eW8ubGFzdEluZGV4PTA7dmFyIHI9eW8uZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uTT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpdChuLHQsZSl7eW8ubGFzdEluZGV4PTA7dmFyIHI9eW8uZXhlYyh0LnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KG4uUz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBhdChuLHQsZSl7eW8ubGFzdEluZGV4PTA7dmFyIHI9eW8uZXhlYyh0LnNsaWNlKGUsZSszKSk7cmV0dXJuIHI/KG4uTD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvdChuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCksZT10PjA/Ii0iOiIrIixyPU1hKHQpLzYwfDAsdT1NYSh0KSU2MDtyZXR1cm4gZStabihyLCIwIiwyKStabih1LCIwIiwyKX1mdW5jdGlvbiBsdChuLHQsZSl7TW8ubGFzdEluZGV4PTA7dmFyIHI9TW8uZXhlYyh0LnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/ZStyWzBdLmxlbmd0aDotMX1mdW5jdGlvbiBjdChuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT0tMTsrK2U8dDspbltlXVswXT10aGlzKG5bZV1bMF0pO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxyPW5bZV07IXJbMV0odCk7KXI9blsrK2VdO3JldHVybiByWzBdKHQpfX1mdW5jdGlvbiBzdCgpe31mdW5jdGlvbiBmdChuLHQsZSl7dmFyIHI9ZS5zPW4rdCx1PXItbixpPXItdTtlLnQ9bi1pKyh0LXUpfWZ1bmN0aW9uIGh0KG4sdCl7biYmd28uaGFzT3duUHJvcGVydHkobi50eXBlKSYmd29bbi50eXBlXShuLHQpfWZ1bmN0aW9uIGd0KG4sdCxlKXt2YXIgcix1PS0xLGk9bi5sZW5ndGgtZTtmb3IodC5saW5lU3RhcnQoKTsrK3U8aTspcj1uW3VdLHQucG9pbnQoclswXSxyWzFdLHJbMl0pO3QubGluZUVuZCgpfWZ1bmN0aW9uIHB0KG4sdCl7dmFyIGU9LTEscj1uLmxlbmd0aDtmb3IodC5wb2x5Z29uU3RhcnQoKTsrK2U8cjspZ3QobltlXSx0LDEpO3QucG9seWdvbkVuZCgpfWZ1bmN0aW9uIHZ0KCl7ZnVuY3Rpb24gbihuLHQpe24qPUlhLHQ9dCpJYS8yK2phLzQ7dmFyIGU9bi1yLGE9ZT49MD8xOi0xLG89YSplLGw9TWF0aC5jb3ModCksYz1NYXRoLnNpbih0KSxzPWkqYyxmPXUqbCtzKk1hdGguY29zKG8pLGg9cyphKk1hdGguc2luKG8pO2tvLmFkZChNYXRoLmF0YW4yKGgsZikpLHI9bix1PWwsaT1jfXZhciB0LGUscix1LGk7Tm8ucG9pbnQ9ZnVuY3Rpb24oYSxvKXtOby5wb2ludD1uLHI9KHQ9YSkqSWEsdT1NYXRoLmNvcyhvPShlPW8pKklhLzIramEvNCksaT1NYXRoLnNpbihvKX0sTm8ubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gZHQobil7dmFyIHQ9blswXSxlPW5bMV0scj1NYXRoLmNvcyhlKTtyZXR1cm5bcipNYXRoLmNvcyh0KSxyKk1hdGguc2luKHQpLE1hdGguc2luKGUpXX1mdW5jdGlvbiBtdChuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdK25bMl0qdFsyXX1mdW5jdGlvbiB5dChuLHQpe3JldHVybltuWzFdKnRbMl0tblsyXSp0WzFdLG5bMl0qdFswXS1uWzBdKnRbMl0sblswXSp0WzFdLW5bMV0qdFswXV19ZnVuY3Rpb24gTXQobix0KXtuWzBdKz10WzBdLG5bMV0rPXRbMV0sblsyXSs9dFsyXX1mdW5jdGlvbiB4dChuLHQpe3JldHVybltuWzBdKnQsblsxXSp0LG5bMl0qdF19ZnVuY3Rpb24gYnQobil7dmFyIHQ9TWF0aC5zcXJ0KG5bMF0qblswXStuWzFdKm5bMV0rblsyXSpuWzJdKTtuWzBdLz10LG5bMV0vPXQsblsyXS89dH1mdW5jdGlvbiBfdChuKXtyZXR1cm5bTWF0aC5hdGFuMihuWzFdLG5bMF0pLHRuKG5bMl0pXX1mdW5jdGlvbiB3dChuLHQpe3JldHVybiBNYShuWzBdLXRbMF0pPFBhJiZNYShuWzFdLXRbMV0pPFBhfWZ1bmN0aW9uIFN0KG4sdCl7bio9SWE7dmFyIGU9TWF0aC5jb3ModCo9SWEpO2t0KGUqTWF0aC5jb3MobiksZSpNYXRoLnNpbihuKSxNYXRoLnNpbih0KSl9ZnVuY3Rpb24ga3Qobix0LGUpeysrRW8sQ28rPShuLUNvKS9Fbyx6bys9KHQtem8pL0VvLExvKz0oZS1MbykvRW99ZnVuY3Rpb24gTnQoKXtmdW5jdGlvbiBuKG4sdSl7bio9SWE7dmFyIGk9TWF0aC5jb3ModSo9SWEpLGE9aSpNYXRoLmNvcyhuKSxvPWkqTWF0aC5zaW4obiksbD1NYXRoLnNpbih1KSxjPU1hdGguYXRhbjIoTWF0aC5zcXJ0KChjPWUqbC1yKm8pKmMrKGM9ciphLXQqbCkqYysoYz10Km8tZSphKSpjKSx0KmErZSpvK3IqbCk7QW8rPWMscW8rPWMqKHQrKHQ9YSkpLFRvKz1jKihlKyhlPW8pKSxSbys9Yyoocisocj1sKSksa3QodCxlLHIpfXZhciB0LGUscjtqby5wb2ludD1mdW5jdGlvbih1LGkpe3UqPUlhO3ZhciBhPU1hdGguY29zKGkqPUlhKTt0PWEqTWF0aC5jb3ModSksZT1hKk1hdGguc2luKHUpLHI9TWF0aC5zaW4oaSksam8ucG9pbnQ9bixrdCh0LGUscil9fWZ1bmN0aW9uIEV0KCl7am8ucG9pbnQ9U3R9ZnVuY3Rpb24gQXQoKXtmdW5jdGlvbiBuKG4sdCl7bio9SWE7dmFyIGU9TWF0aC5jb3ModCo9SWEpLGE9ZSpNYXRoLmNvcyhuKSxvPWUqTWF0aC5zaW4obiksbD1NYXRoLnNpbih0KSxjPXUqbC1pKm8scz1pKmEtcipsLGY9cipvLXUqYSxoPU1hdGguc3FydChjKmMrcypzK2YqZiksZz1yKmErdSpvK2kqbCxwPWgmJi1ubihnKS9oLHY9TWF0aC5hdGFuMihoLGcpO0RvKz1wKmMsUG8rPXAqcyxVbys9cCpmLEFvKz12LHFvKz12KihyKyhyPWEpKSxUbys9dioodSsodT1vKSksUm8rPXYqKGkrKGk9bCkpLGt0KHIsdSxpKX12YXIgdCxlLHIsdSxpO2pvLnBvaW50PWZ1bmN0aW9uKGEsbyl7dD1hLGU9byxqby5wb2ludD1uLGEqPUlhO3ZhciBsPU1hdGguY29zKG8qPUlhKTtyPWwqTWF0aC5jb3MoYSksdT1sKk1hdGguc2luKGEpLGk9TWF0aC5zaW4obyksa3Qocix1LGkpfSxqby5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpLGpvLmxpbmVFbmQ9RXQsam8ucG9pbnQ9U3R9fWZ1bmN0aW9uIEN0KG4sdCl7ZnVuY3Rpb24gZShlLHIpe3JldHVybiBlPW4oZSxyKSx0KGVbMF0sZVsxXSl9cmV0dXJuIG4uaW52ZXJ0JiZ0LmludmVydCYmKGUuaW52ZXJ0PWZ1bmN0aW9uKGUscil7cmV0dXJuIGU9dC5pbnZlcnQoZSxyKSxlJiZuLmludmVydChlWzBdLGVbMV0pfSksZX1mdW5jdGlvbiB6dCgpe3JldHVybiEwfWZ1bmN0aW9uIEx0KG4sdCxlLHIsdSl7dmFyIGk9W10sYT1bXTtpZihuLmZvckVhY2goZnVuY3Rpb24obil7aWYoISgodD1uLmxlbmd0aC0xKTw9MCkpe3ZhciB0LGU9blswXSxyPW5bdF07aWYod3QoZSxyKSl7dS5saW5lU3RhcnQoKTtmb3IodmFyIG89MDt0Pm87KytvKXUucG9pbnQoKGU9bltvXSlbMF0sZVsxXSk7cmV0dXJuIHZvaWQgdS5saW5lRW5kKCl9dmFyIGw9bmV3IFR0KGUsbixudWxsLCEwKSxjPW5ldyBUdChlLG51bGwsbCwhMSk7bC5vPWMsaS5wdXNoKGwpLGEucHVzaChjKSxsPW5ldyBUdChyLG4sbnVsbCwhMSksYz1uZXcgVHQocixudWxsLGwsITApLGwubz1jLGkucHVzaChsKSxhLnB1c2goYyl9fSksYS5zb3J0KHQpLHF0KGkpLHF0KGEpLGkubGVuZ3RoKXtmb3IodmFyIG89MCxsPWUsYz1hLmxlbmd0aDtjPm87KytvKWFbb10uZT1sPSFsO2Zvcih2YXIgcyxmLGg9aVswXTs7KXtmb3IodmFyIGc9aCxwPSEwO2cudjspaWYoKGc9Zy5uKT09PWgpcmV0dXJuO3M9Zy56LHUubGluZVN0YXJ0KCk7ZG97aWYoZy52PWcuby52PSEwLGcuZSl7aWYocClmb3IodmFyIG89MCxjPXMubGVuZ3RoO2M+bzsrK28pdS5wb2ludCgoZj1zW29dKVswXSxmWzFdKTtlbHNlIHIoZy54LGcubi54LDEsdSk7Zz1nLm59ZWxzZXtpZihwKXtzPWcucC56O2Zvcih2YXIgbz1zLmxlbmd0aC0xO28+PTA7LS1vKXUucG9pbnQoKGY9c1tvXSlbMF0sZlsxXSl9ZWxzZSByKGcueCxnLnAueCwtMSx1KTtnPWcucH1nPWcubyxzPWcueixwPSFwfXdoaWxlKCFnLnYpO3UubGluZUVuZCgpfX19ZnVuY3Rpb24gcXQobil7aWYodD1uLmxlbmd0aCl7Zm9yKHZhciB0LGUscj0wLHU9blswXTsrK3I8dDspdS5uPWU9bltyXSxlLnA9dSx1PWU7dS5uPWU9blswXSxlLnA9dX19ZnVuY3Rpb24gVHQobix0LGUscil7dGhpcy54PW4sdGhpcy56PXQsdGhpcy5vPWUsdGhpcy5lPXIsdGhpcy52PSExLHRoaXMubj10aGlzLnA9bnVsbH1mdW5jdGlvbiBSdChuLHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odSxpKXtmdW5jdGlvbiBhKHQsZSl7dmFyIHI9dSh0LGUpO24odD1yWzBdLGU9clsxXSkmJmkucG9pbnQodCxlKX1mdW5jdGlvbiBvKG4sdCl7dmFyIGU9dShuLHQpO2QucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiBsKCl7eS5wb2ludD1vLGQubGluZVN0YXJ0KCl9ZnVuY3Rpb24gYygpe3kucG9pbnQ9YSxkLmxpbmVFbmQoKX1mdW5jdGlvbiBzKG4sdCl7di5wdXNoKFtuLHRdKTt2YXIgZT11KG4sdCk7eC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGYoKXt4LmxpbmVTdGFydCgpLHY9W119ZnVuY3Rpb24gaCgpe3ModlswXVswXSx2WzBdWzFdKSx4LmxpbmVFbmQoKTt2YXIgbix0PXguY2xlYW4oKSxlPU0uYnVmZmVyKCkscj1lLmxlbmd0aDtpZih2LnBvcCgpLHAucHVzaCh2KSx2PW51bGwscilpZigxJnQpe249ZVswXTt2YXIgdSxyPW4ubGVuZ3RoLTEsYT0tMTtpZihyPjApe2ZvcihifHwoaS5wb2x5Z29uU3RhcnQoKSxiPSEwKSxpLmxpbmVTdGFydCgpOysrYTxyOylpLnBvaW50KCh1PW5bYV0pWzBdLHVbMV0pO2kubGluZUVuZCgpfX1lbHNlIHI+MSYmMiZ0JiZlLnB1c2goZS5wb3AoKS5jb25jYXQoZS5zaGlmdCgpKSksZy5wdXNoKGUuZmlsdGVyKER0KSl9dmFyIGcscCx2LGQ9dChpKSxtPXUuaW52ZXJ0KHJbMF0sclsxXSkseT17cG9pbnQ6YSxsaW5lU3RhcnQ6bCxsaW5lRW5kOmMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7eS5wb2ludD1zLHkubGluZVN0YXJ0PWYseS5saW5lRW5kPWgsZz1bXSxwPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7eS5wb2ludD1hLHkubGluZVN0YXJ0PWwseS5saW5lRW5kPWMsZz1vYS5tZXJnZShnKTt2YXIgbj1PdChtLHApO2cubGVuZ3RoPyhifHwoaS5wb2x5Z29uU3RhcnQoKSxiPSEwKSxMdChnLFV0LG4sZSxpKSk6biYmKGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSksYiYmKGkucG9seWdvbkVuZCgpLGI9ITEpLGc9cD1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtpLnBvbHlnb25TdGFydCgpLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSxpLnBvbHlnb25FbmQoKX19LE09UHQoKSx4PXQoTSksYj0hMTtyZXR1cm4geX19ZnVuY3Rpb24gRHQobil7cmV0dXJuIG4ubGVuZ3RoPjF9ZnVuY3Rpb24gUHQoKXt2YXIgbix0PVtdO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LnB1c2gobj1bXSl9LHBvaW50OmZ1bmN0aW9uKHQsZSl7bi5wdXNoKFt0LGVdKX0sbGluZUVuZDpiLGJ1ZmZlcjpmdW5jdGlvbigpe3ZhciBlPXQ7cmV0dXJuIHQ9W10sbj1udWxsLGV9LHJlam9pbjpmdW5jdGlvbigpe3QubGVuZ3RoPjEmJnQucHVzaCh0LnBvcCgpLmNvbmNhdCh0LnNoaWZ0KCkpKX19fWZ1bmN0aW9uIFV0KG4sdCl7cmV0dXJuKChuPW4ueClbMF08MD9uWzFdLU9hLVBhOk9hLW5bMV0pLSgodD10LngpWzBdPDA/dFsxXS1PYS1QYTpPYS10WzFdKX1mdW5jdGlvbiBqdChuKXt2YXIgdCxlPU5hTixyPU5hTix1PU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5saW5lU3RhcnQoKSx0PTF9LHBvaW50OmZ1bmN0aW9uKGksYSl7dmFyIG89aT4wP2phOi1qYSxsPU1hKGktZSk7TWEobC1qYSk8UGE/KG4ucG9pbnQoZSxyPShyK2EpLzI+MD9PYTotT2EpLG4ucG9pbnQodSxyKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQobyxyKSxuLnBvaW50KGksciksdD0wKTp1IT09byYmbD49amEmJihNYShlLXUpPFBhJiYoZS09dSpQYSksTWEoaS1vKTxQYSYmKGktPW8qUGEpLHI9RnQoZSxyLGksYSksbi5wb2ludCh1LHIpLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChvLHIpLHQ9MCksbi5wb2ludChlPWkscj1hKSx1PW99LGxpbmVFbmQ6ZnVuY3Rpb24oKXtuLmxpbmVFbmQoKSxlPXI9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLXR9fX1mdW5jdGlvbiBGdChuLHQsZSxyKXt2YXIgdSxpLGE9TWF0aC5zaW4obi1lKTtyZXR1cm4gTWEoYSk+UGE/TWF0aC5hdGFuKChNYXRoLnNpbih0KSooaT1NYXRoLmNvcyhyKSkqTWF0aC5zaW4oZSktTWF0aC5zaW4ocikqKHU9TWF0aC5jb3ModCkpKk1hdGguc2luKG4pKS8odSppKmEpKToodCtyKS8yfWZ1bmN0aW9uIEh0KG4sdCxlLHIpe3ZhciB1O2lmKG51bGw9PW4pdT1lKk9hLHIucG9pbnQoLWphLHUpLHIucG9pbnQoMCx1KSxyLnBvaW50KGphLHUpLHIucG9pbnQoamEsMCksci5wb2ludChqYSwtdSksci5wb2ludCgwLC11KSxyLnBvaW50KC1qYSwtdSksci5wb2ludCgtamEsMCksci5wb2ludCgtamEsdSk7ZWxzZSBpZihNYShuWzBdLXRbMF0pPlBhKXt2YXIgaT1uWzBdPHRbMF0/amE6LWphO3U9ZSppLzIsci5wb2ludCgtaSx1KSxyLnBvaW50KDAsdSksci5wb2ludChpLHUpfWVsc2Ugci5wb2ludCh0WzBdLHRbMV0pfWZ1bmN0aW9uIE90KG4sdCl7dmFyIGU9blswXSxyPW5bMV0sdT1bTWF0aC5zaW4oZSksLU1hdGguY29zKGUpLDBdLGk9MCxhPTA7a28ucmVzZXQoKTtmb3IodmFyIG89MCxsPXQubGVuZ3RoO2w+bzsrK28pe3ZhciBjPXRbb10scz1jLmxlbmd0aDtpZihzKWZvcih2YXIgZj1jWzBdLGg9ZlswXSxnPWZbMV0vMitqYS80LHA9TWF0aC5zaW4oZyksdj1NYXRoLmNvcyhnKSxkPTE7Oyl7ZD09PXMmJihkPTApLG49Y1tkXTt2YXIgbT1uWzBdLHk9blsxXS8yK2phLzQsTT1NYXRoLnNpbih5KSx4PU1hdGguY29zKHkpLGI9bS1oLF89Yj49MD8xOi0xLHc9XypiLFM9dz5qYSxrPXAqTTtpZihrby5hZGQoTWF0aC5hdGFuMihrKl8qTWF0aC5zaW4odyksdip4K2sqTWF0aC5jb3ModykpKSxpKz1TP2IrXypGYTpiLFNeaD49ZV5tPj1lKXt2YXIgTj15dChkdChmKSxkdChuKSk7YnQoTik7dmFyIEU9eXQodSxOKTtidChFKTt2YXIgQT0oU15iPj0wPy0xOjEpKnRuKEVbMl0pOyhyPkF8fHI9PT1BJiYoTlswXXx8TlsxXSkpJiYoYSs9U15iPj0wPzE6LTEpfWlmKCFkKyspYnJlYWs7aD1tLHA9TSx2PXgsZj1ufX1yZXR1cm4oLVBhPml8fFBhPmkmJjA+a28pXjEmYX1mdW5jdGlvbiBJdChuKXtmdW5jdGlvbiB0KG4sdCl7cmV0dXJuIE1hdGguY29zKG4pKk1hdGguY29zKHQpPml9ZnVuY3Rpb24gZShuKXt2YXIgZSxpLGwsYyxzO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtjPWw9ITEscz0xfSxwb2ludDpmdW5jdGlvbihmLGgpe3ZhciBnLHA9W2YsaF0sdj10KGYsaCksZD1hP3Y/MDp1KGYsaCk6dj91KGYrKDA+Zj9qYTotamEpLGgpOjA7aWYoIWUmJihjPWw9dikmJm4ubGluZVN0YXJ0KCksdiE9PWwmJihnPXIoZSxwKSwod3QoZSxnKXx8d3QocCxnKSkmJihwWzBdKz1QYSxwWzFdKz1QYSx2PXQocFswXSxwWzFdKSkpLHYhPT1sKXM9MCx2PyhuLmxpbmVTdGFydCgpLGc9cihwLGUpLG4ucG9pbnQoZ1swXSxnWzFdKSk6KGc9cihlLHApLG4ucG9pbnQoZ1swXSxnWzFdKSxuLmxpbmVFbmQoKSksZT1nO2Vsc2UgaWYobyYmZSYmYV52KXt2YXIgbTtkJml8fCEobT1yKHAsZSwhMCkpfHwocz0wLGE/KG4ubGluZVN0YXJ0KCksbi5wb2ludChtWzBdWzBdLG1bMF1bMV0pLG4ucG9pbnQobVsxXVswXSxtWzFdWzFdKSxuLmxpbmVFbmQoKSk6KG4ucG9pbnQobVsxXVswXSxtWzFdWzFdKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQobVswXVswXSxtWzBdWzFdKSkpfSF2fHxlJiZ3dChlLHApfHxuLnBvaW50KHBbMF0scFsxXSksZT1wLGw9dixpPWR9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtsJiZuLmxpbmVFbmQoKSxlPW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIHN8KGMmJmwpPDwxfX19ZnVuY3Rpb24gcihuLHQsZSl7dmFyIHI9ZHQobiksdT1kdCh0KSxhPVsxLDAsMF0sbz15dChyLHUpLGw9bXQobyxvKSxjPW9bMF0scz1sLWMqYztpZighcylyZXR1cm4hZSYmbjt2YXIgZj1pKmwvcyxoPS1pKmMvcyxnPXl0KGEsbykscD14dChhLGYpLHY9eHQobyxoKTtNdChwLHYpO3ZhciBkPWcsbT1tdChwLGQpLHk9bXQoZCxkKSxNPW0qbS15KihtdChwLHApLTEpO2lmKCEoMD5NKSl7dmFyIHg9TWF0aC5zcXJ0KE0pLGI9eHQoZCwoLW0teCkveSk7aWYoTXQoYixwKSxiPV90KGIpLCFlKXJldHVybiBiO3ZhciBfLHc9blswXSxTPXRbMF0saz1uWzFdLE49dFsxXTt3PlMmJihfPXcsdz1TLFM9Xyk7dmFyIEU9Uy13LEE9TWEoRS1qYSk8UGEsQz1BfHxQYT5FO2lmKCFBJiZrPk4mJihfPWssaz1OLE49XyksQz9BP2srTj4wXmJbMV08KE1hKGJbMF0tdyk8UGE/azpOKTprPD1iWzFdJiZiWzFdPD1OOkU+amFeKHc8PWJbMF0mJmJbMF08PVMpKXt2YXIgej14dChkLCgtbSt4KS95KTtyZXR1cm4gTXQoeixwKSxbYixfdCh6KV19fX1mdW5jdGlvbiB1KHQsZSl7dmFyIHI9YT9uOmphLW4sdT0wO3JldHVybi1yPnQ/dXw9MTp0PnImJih1fD0yKSwtcj5lP3V8PTQ6ZT5yJiYodXw9OCksdX12YXIgaT1NYXRoLmNvcyhuKSxhPWk+MCxvPU1hKGkpPlBhLGw9dmUobiw2KklhKTtyZXR1cm4gUnQodCxlLGwsYT9bMCwtbl06Wy1qYSxuLWphXSl9ZnVuY3Rpb24gWXQobix0LGUscil7cmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciBpLGE9dS5hLG89dS5iLGw9YS54LGM9YS55LHM9by54LGY9by55LGg9MCxnPTEscD1zLWwsdj1mLWM7aWYoaT1uLWwscHx8IShpPjApKXtpZihpLz1wLDA+cCl7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfWVsc2UgaWYocD4wKXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9aWYoaT1lLWwscHx8ISgwPmkpKXtpZihpLz1wLDA+cCl7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWVsc2UgaWYocD4wKXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9aWYoaT10LWMsdnx8IShpPjApKXtpZihpLz12LDA+dil7aWYoaD5pKXJldHVybjtnPmkmJihnPWkpfWVsc2UgaWYodj4wKXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9aWYoaT1yLWMsdnx8ISgwPmkpKXtpZihpLz12LDA+dil7aWYoaT5nKXJldHVybjtpPmgmJihoPWkpfWVsc2UgaWYodj4wKXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9cmV0dXJuIGg+MCYmKHUuYT17eDpsK2gqcCx5OmMraCp2fSksMT5nJiYodS5iPXt4OmwrZypwLHk6YytnKnZ9KSx1fX19fX19ZnVuY3Rpb24gWnQobix0LGUscil7ZnVuY3Rpb24gdShyLHUpe3JldHVybiBNYShyWzBdLW4pPFBhP3U+MD8wOjM6TWEoclswXS1lKTxQYT91PjA/MjoxOk1hKHJbMV0tdCk8UGE/dT4wPzE6MDp1PjA/MzoyfWZ1bmN0aW9uIGkobix0KXtyZXR1cm4gYShuLngsdC54KX1mdW5jdGlvbiBhKG4sdCl7dmFyIGU9dShuLDEpLHI9dSh0LDEpO3JldHVybiBlIT09cj9lLXI6MD09PWU/dFsxXS1uWzFdOjE9PT1lP25bMF0tdFswXToyPT09ZT9uWzFdLXRbMV06dFswXS1uWzBdfXJldHVybiBmdW5jdGlvbihvKXtmdW5jdGlvbiBsKG4pe2Zvcih2YXIgdD0wLGU9ZC5sZW5ndGgscj1uWzFdLHU9MDtlPnU7Kyt1KWZvcih2YXIgaSxhPTEsbz1kW3VdLGw9by5sZW5ndGgsYz1vWzBdO2w+YTsrK2EpaT1vW2FdLGNbMV08PXI/aVsxXT5yJiZRKGMsaSxuKT4wJiYrK3Q6aVsxXTw9ciYmUShjLGksbik8MCYmLS10LGM9aTtyZXR1cm4gMCE9PXR9ZnVuY3Rpb24gYyhpLG8sbCxjKXt2YXIgcz0wLGY9MDtpZihudWxsPT1pfHwocz11KGksbCkpIT09KGY9dShvLGwpKXx8YShpLG8pPDBebD4wKXtkbyBjLnBvaW50KDA9PT1zfHwzPT09cz9uOmUscz4xP3I6dCk7d2hpbGUoKHM9KHMrbCs0KSU0KSE9PWYpfWVsc2UgYy5wb2ludChvWzBdLG9bMV0pfWZ1bmN0aW9uIHModSxpKXtyZXR1cm4gdT49biYmZT49dSYmaT49dCYmcj49aX1mdW5jdGlvbiBmKG4sdCl7cyhuLHQpJiZvLnBvaW50KG4sdCl9ZnVuY3Rpb24gaCgpe0MucG9pbnQ9cCxkJiZkLnB1c2gobT1bXSksUz0hMCx3PSExLGI9Xz1OYU59ZnVuY3Rpb24gZygpe3YmJihwKHksTSkseCYmdyYmRS5yZWpvaW4oKSx2LnB1c2goRS5idWZmZXIoKSkpLEMucG9pbnQ9Zix3JiZvLmxpbmVFbmQoKX1mdW5jdGlvbiBwKG4sdCl7bj1NYXRoLm1heCgtSG8sTWF0aC5taW4oSG8sbikpLHQ9TWF0aC5tYXgoLUhvLE1hdGgubWluKEhvLHQpKTt2YXIgZT1zKG4sdCk7aWYoZCYmbS5wdXNoKFtuLHRdKSxTKXk9bixNPXQseD1lLFM9ITEsZSYmKG8ubGluZVN0YXJ0KCksby5wb2ludChuLHQpKTtlbHNlIGlmKGUmJncpby5wb2ludChuLHQpO2Vsc2V7dmFyIHI9e2E6e3g6Yix5Ol99LGI6e3g6bix5OnR9fTtBKHIpPyh3fHwoby5saW5lU3RhcnQoKSxvLnBvaW50KHIuYS54LHIuYS55KSksby5wb2ludChyLmIueCxyLmIueSksZXx8by5saW5lRW5kKCksaz0hMSk6ZSYmKG8ubGluZVN0YXJ0KCksby5wb2ludChuLHQpLGs9ITEpfWI9bixfPXQsdz1lfXZhciB2LGQsbSx5LE0seCxiLF8sdyxTLGssTj1vLEU9UHQoKSxBPVl0KG4sdCxlLHIpLEM9e3BvaW50OmYsbGluZVN0YXJ0OmgsbGluZUVuZDpnLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe289RSx2PVtdLGQ9W10saz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe289Tix2PW9hLm1lcmdlKHYpO3ZhciB0PWwoW24scl0pLGU9ayYmdCx1PXYubGVuZ3RoOyhlfHx1KSYmKG8ucG9seWdvblN0YXJ0KCksZSYmKG8ubGluZVN0YXJ0KCksYyhudWxsLG51bGwsMSxvKSxvLmxpbmVFbmQoKSksdSYmTHQodixpLHQsYyxvKSxvLnBvbHlnb25FbmQoKSksdj1kPW09bnVsbH19O3JldHVybiBDfX1mdW5jdGlvbiBWdChuKXt2YXIgdD0wLGU9amEvMyxyPW9lKG4pLHU9cih0LGUpO3JldHVybiB1LnBhcmFsbGVscz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9yKHQ9blswXSpqYS8xODAsZT1uWzFdKmphLzE4MCk6W3QvamEqMTgwLGUvamEqMTgwXX0sdX1mdW5jdGlvbiBYdChuLHQpe2Z1bmN0aW9uIGUobix0KXt2YXIgZT1NYXRoLnNxcnQoaS0yKnUqTWF0aC5zaW4odCkpL3U7cmV0dXJuW2UqTWF0aC5zaW4obio9dSksYS1lKk1hdGguY29zKG4pXX12YXIgcj1NYXRoLnNpbihuKSx1PShyK01hdGguc2luKHQpKS8yLGk9MStyKigyKnUtciksYT1NYXRoLnNxcnQoaSkvdTtyZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1hLXQ7cmV0dXJuW01hdGguYXRhbjIobixlKS91LHRuKChpLShuKm4rZSplKSp1KnUpLygyKnUpKV19LGV9ZnVuY3Rpb24gJHQoKXtmdW5jdGlvbiBuKG4sdCl7SW8rPXUqbi1yKnQscj1uLHU9dH12YXIgdCxlLHIsdTskby5wb2ludD1mdW5jdGlvbihpLGEpeyRvLnBvaW50PW4sdD1yPWksZT11PWF9LCRvLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIEJ0KG4sdCl7WW8+biYmKFlvPW4pLG4+Vm8mJihWbz1uKSxabz50JiYoWm89dCksdD5YbyYmKFhvPXQpfWZ1bmN0aW9uIFd0KCl7ZnVuY3Rpb24gbihuLHQpe2EucHVzaCgiTSIsbiwiLCIsdCxpKX1mdW5jdGlvbiB0KG4sdCl7YS5wdXNoKCJNIixuLCIsIix0KSxvLnBvaW50PWV9ZnVuY3Rpb24gZShuLHQpe2EucHVzaCgiTCIsbiwiLCIsdCl9ZnVuY3Rpb24gcigpe28ucG9pbnQ9bn1mdW5jdGlvbiB1KCl7YS5wdXNoKCJaIil9dmFyIGk9SnQoNC41KSxhPVtdLG89e3BvaW50Om4sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7by5wb2ludD10fSxsaW5lRW5kOnIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7by5saW5lRW5kPXV9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtvLmxpbmVFbmQ9cixvLnBvaW50PW59LHBvaW50UmFkaXVzOmZ1bmN0aW9uKG4pe3JldHVybiBpPUp0KG4pLG99LHJlc3VsdDpmdW5jdGlvbigpe2lmKGEubGVuZ3RoKXt2YXIgbj1hLmpvaW4oIiIpO3JldHVybiBhPVtdLG59fX07cmV0dXJuIG99ZnVuY3Rpb24gSnQobil7cmV0dXJuIm0wLCIrbisiYSIrbisiLCIrbisiIDAgMSwxIDAsIistMipuKyJhIituKyIsIituKyIgMCAxLDEgMCwiKzIqbisieiJ9ZnVuY3Rpb24gR3Qobix0KXtDbys9bix6bys9dCwrK0xvfWZ1bmN0aW9uIEt0KCl7ZnVuY3Rpb24gbihuLHIpe3ZhciB1PW4tdCxpPXItZSxhPU1hdGguc3FydCh1KnUraSppKTtxbys9YSoodCtuKS8yLFRvKz1hKihlK3IpLzIsUm8rPWEsR3QodD1uLGU9cil9dmFyIHQsZTtXby5wb2ludD1mdW5jdGlvbihyLHUpe1dvLnBvaW50PW4sR3QodD1yLGU9dSl9fWZ1bmN0aW9uIFF0KCl7V28ucG9pbnQ9R3R9ZnVuY3Rpb24gbmUoKXtmdW5jdGlvbiBuKG4sdCl7dmFyIGU9bi1yLGk9dC11LGE9TWF0aC5zcXJ0KGUqZStpKmkpO3FvKz1hKihyK24pLzIsVG8rPWEqKHUrdCkvMixSbys9YSxhPXUqbi1yKnQsRG8rPWEqKHIrbiksUG8rPWEqKHUrdCksVW8rPTMqYSxHdChyPW4sdT10KX12YXIgdCxlLHIsdTtXby5wb2ludD1mdW5jdGlvbihpLGEpe1dvLnBvaW50PW4sR3QodD1yPWksZT11PWEpfSxXby5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpfX1mdW5jdGlvbiB0ZShuKXtmdW5jdGlvbiB0KHQsZSl7bi5tb3ZlVG8odCthLGUpLG4uYXJjKHQsZSxhLDAsRmEpfWZ1bmN0aW9uIGUodCxlKXtuLm1vdmVUbyh0LGUpLG8ucG9pbnQ9cn1mdW5jdGlvbiByKHQsZSl7bi5saW5lVG8odCxlKX1mdW5jdGlvbiB1KCl7by5wb2ludD10fWZ1bmN0aW9uIGkoKXtuLmNsb3NlUGF0aCgpfXZhciBhPTQuNSxvPXtwb2ludDp0LGxpbmVTdGFydDpmdW5jdGlvbigpe28ucG9pbnQ9ZX0sbGluZUVuZDp1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe28ubGluZUVuZD1pfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7by5saW5lRW5kPXUsby5wb2ludD10fSxwb2ludFJhZGl1czpmdW5jdGlvbihuKXtyZXR1cm4gYT1uLG99LHJlc3VsdDpifTtyZXR1cm4gb31mdW5jdGlvbiBlZShuKXtmdW5jdGlvbiB0KG4pe3JldHVybihvP3I6ZSkobil9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gaWUodCxmdW5jdGlvbihlLHIpe2U9bihlLHIpLHQucG9pbnQoZVswXSxlWzFdKX0pfWZ1bmN0aW9uIHIodCl7ZnVuY3Rpb24gZShlLHIpe2U9bihlLHIpLHQucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiByKCl7TT1OYU4sUy5wb2ludD1pLHQubGluZVN0YXJ0KCl9ZnVuY3Rpb24gaShlLHIpe3ZhciBpPWR0KFtlLHJdKSxhPW4oZSxyKTt1KE0seCx5LGIsXyx3LE09YVswXSx4PWFbMV0seT1lLGI9aVswXSxfPWlbMV0sdz1pWzJdLG8sdCksdC5wb2ludChNLHgpfWZ1bmN0aW9uIGEoKXtTLnBvaW50PWUsdC5saW5lRW5kKCl9ZnVuY3Rpb24gbCgpewpyKCksUy5wb2ludD1jLFMubGluZUVuZD1zfWZ1bmN0aW9uIGMobix0KXtpKGY9bixoPXQpLGc9TSxwPXgsdj1iLGQ9XyxtPXcsUy5wb2ludD1pfWZ1bmN0aW9uIHMoKXt1KE0seCx5LGIsXyx3LGcscCxmLHYsZCxtLG8sdCksUy5saW5lRW5kPWEsYSgpfXZhciBmLGgsZyxwLHYsZCxtLHksTSx4LGIsXyx3LFM9e3BvaW50OmUsbGluZVN0YXJ0OnIsbGluZUVuZDphLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3QucG9seWdvblN0YXJ0KCksUy5saW5lU3RhcnQ9bH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpLFMubGluZVN0YXJ0PXJ9fTtyZXR1cm4gU31mdW5jdGlvbiB1KHQsZSxyLG8sbCxjLHMsZixoLGcscCx2LGQsbSl7dmFyIHk9cy10LE09Zi1lLHg9eSp5K00qTTtpZih4PjQqaSYmZC0tKXt2YXIgYj1vK2csXz1sK3Asdz1jK3YsUz1NYXRoLnNxcnQoYipiK18qXyt3KncpLGs9TWF0aC5hc2luKHcvPVMpLE49TWEoTWEodyktMSk8UGF8fE1hKHItaCk8UGE/KHIraCkvMjpNYXRoLmF0YW4yKF8sYiksRT1uKE4sayksQT1FWzBdLEM9RVsxXSx6PUEtdCxMPUMtZSxxPU0qei15Kkw7KHEqcS94Pml8fE1hKCh5KnorTSpMKS94LS41KT4uM3x8YT5vKmcrbCpwK2MqdikmJih1KHQsZSxyLG8sbCxjLEEsQyxOLGIvPVMsXy89Uyx3LGQsbSksbS5wb2ludChBLEMpLHUoQSxDLE4sYixfLHcscyxmLGgsZyxwLHYsZCxtKSl9fXZhciBpPS41LGE9TWF0aC5jb3MoMzAqSWEpLG89MTY7cmV0dXJuIHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPShpPW4qbik+MCYmMTYsdCk6TWF0aC5zcXJ0KGkpfSx0fWZ1bmN0aW9uIHJlKG4pe3ZhciB0PWVlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oW3QqWWEsZSpZYV0pfSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBsZSh0KG4pKX19ZnVuY3Rpb24gdWUobil7dGhpcy5zdHJlYW09bn1mdW5jdGlvbiBpZShuLHQpe3JldHVybntwb2ludDp0LHNwaGVyZTpmdW5jdGlvbigpe24uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtuLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpfX19ZnVuY3Rpb24gYWUobil7cmV0dXJuIG9lKGZ1bmN0aW9uKCl7cmV0dXJuIG59KSgpfWZ1bmN0aW9uIG9lKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuIG49byhuWzBdKklhLG5bMV0qSWEpLFtuWzBdKmgrbCxjLW5bMV0qaF19ZnVuY3Rpb24gZShuKXtyZXR1cm4gbj1vLmludmVydCgoblswXS1sKS9oLChjLW5bMV0pL2gpLG4mJltuWzBdKllhLG5bMV0qWWFdfWZ1bmN0aW9uIHIoKXtvPUN0KGE9ZmUobSxNLHgpLGkpO3ZhciBuPWkodixkKTtyZXR1cm4gbD1nLW5bMF0qaCxjPXArblsxXSpoLHUoKX1mdW5jdGlvbiB1KCl7cmV0dXJuIHMmJihzLnZhbGlkPSExLHM9bnVsbCksdH12YXIgaSxhLG8sbCxjLHMsZj1lZShmdW5jdGlvbihuLHQpe3JldHVybiBuPWkobix0KSxbblswXSpoK2wsYy1uWzFdKmhdfSksaD0xNTAsZz00ODAscD0yNTAsdj0wLGQ9MCxtPTAsTT0wLHg9MCxiPUZvLF89eSx3PW51bGwsUz1udWxsO3JldHVybiB0LnN0cmVhbT1mdW5jdGlvbihuKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEpLHM9bGUoYihhLGYoXyhuKSkpKSxzLnZhbGlkPSEwLHN9LHQuY2xpcEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPW51bGw9PW4/KHc9bixGbyk6SXQoKHc9K24pKklhKSx1KCkpOnd9LHQuY2xpcEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz1uLF89bj9adChuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKTp5LHUoKSk6U30sdC5zY2FsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rbixyKCkpOmh9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPStuWzBdLHA9K25bMV0scigpKTpbZyxwXX0sdC5jZW50ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9blswXSUzNjAqSWEsZD1uWzFdJTM2MCpJYSxyKCkpOlt2KllhLGQqWWFdfSx0LnJvdGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1uWzBdJTM2MCpJYSxNPW5bMV0lMzYwKklhLHg9bi5sZW5ndGg+Mj9uWzJdJTM2MCpJYTowLHIoKSk6W20qWWEsTSpZYSx4KllhXX0sb2EucmViaW5kKHQsZiwicHJlY2lzaW9uIiksZnVuY3Rpb24oKXtyZXR1cm4gaT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmludmVydD1pLmludmVydCYmZSxyKCl9fWZ1bmN0aW9uIGxlKG4pe3JldHVybiBpZShuLGZ1bmN0aW9uKHQsZSl7bi5wb2ludCh0KklhLGUqSWEpfSl9ZnVuY3Rpb24gY2Uobix0KXtyZXR1cm5bbix0XX1mdW5jdGlvbiBzZShuLHQpe3JldHVybltuPmphP24tRmE6LWphPm4/bitGYTpuLHRdfWZ1bmN0aW9uIGZlKG4sdCxlKXtyZXR1cm4gbj90fHxlP0N0KGdlKG4pLHBlKHQsZSkpOmdlKG4pOnR8fGU/cGUodCxlKTpzZX1mdW5jdGlvbiBoZShuKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdCs9bixbdD5qYT90LUZhOi1qYT50P3QrRmE6dCxlXX19ZnVuY3Rpb24gZ2Uobil7dmFyIHQ9aGUobik7cmV0dXJuIHQuaW52ZXJ0PWhlKC1uKSx0fWZ1bmN0aW9uIHBlKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguY29zKHQpLG89TWF0aC5jb3MobikqZSxsPU1hdGguc2luKG4pKmUsYz1NYXRoLnNpbih0KSxzPWMqcitvKnU7cmV0dXJuW01hdGguYXRhbjIobCppLXMqYSxvKnItYyp1KSx0bihzKmkrbCphKV19dmFyIHI9TWF0aC5jb3MobiksdT1NYXRoLnNpbihuKSxpPU1hdGguY29zKHQpLGE9TWF0aC5zaW4odCk7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9TWF0aC5jb3ModCksbz1NYXRoLmNvcyhuKSplLGw9TWF0aC5zaW4obikqZSxjPU1hdGguc2luKHQpLHM9YyppLWwqYTtyZXR1cm5bTWF0aC5hdGFuMihsKmkrYyphLG8qcitzKnUpLHRuKHMqci1vKnUpXX0sZX1mdW5jdGlvbiB2ZShuLHQpe3ZhciBlPU1hdGguY29zKG4pLHI9TWF0aC5zaW4obik7cmV0dXJuIGZ1bmN0aW9uKHUsaSxhLG8pe3ZhciBsPWEqdDtudWxsIT11Pyh1PWRlKGUsdSksaT1kZShlLGkpLChhPjA/aT51OnU+aSkmJih1Kz1hKkZhKSk6KHU9bithKkZhLGk9bi0uNSpsKTtmb3IodmFyIGMscz11O2E+MD9zPmk6aT5zO3MtPWwpby5wb2ludCgoYz1fdChbZSwtcipNYXRoLmNvcyhzKSwtcipNYXRoLnNpbihzKV0pKVswXSxjWzFdKX19ZnVuY3Rpb24gZGUobix0KXt2YXIgZT1kdCh0KTtlWzBdLT1uLGJ0KGUpO3ZhciByPW5uKC1lWzFdKTtyZXR1cm4oKC1lWzJdPDA/LXI6cikrMipNYXRoLlBJLVBhKSUoMipNYXRoLlBJKX1mdW5jdGlvbiBtZShuLHQsZSl7dmFyIHI9b2EucmFuZ2Uobix0LVBhLGUpLmNvbmNhdCh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKHQpe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIHllKG4sdCxlKXt2YXIgcj1vYS5yYW5nZShuLHQtUGEsZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gTWUobil7cmV0dXJuIG4uc291cmNlfWZ1bmN0aW9uIHhlKG4pe3JldHVybiBuLnRhcmdldH1mdW5jdGlvbiBiZShuLHQsZSxyKXt2YXIgdT1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpLGE9TWF0aC5jb3Mociksbz1NYXRoLnNpbihyKSxsPXUqTWF0aC5jb3MobiksYz11Kk1hdGguc2luKG4pLHM9YSpNYXRoLmNvcyhlKSxmPWEqTWF0aC5zaW4oZSksaD0yKk1hdGguYXNpbihNYXRoLnNxcnQoYW4oci10KSt1KmEqYW4oZS1uKSkpLGc9MS9NYXRoLnNpbihoKSxwPWg/ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zaW4obio9aCkqZyxlPU1hdGguc2luKGgtbikqZyxyPWUqbCt0KnMsdT1lKmMrdCpmLGE9ZSppK3QqbztyZXR1cm5bTWF0aC5hdGFuMih1LHIpKllhLE1hdGguYXRhbjIoYSxNYXRoLnNxcnQocipyK3UqdSkpKllhXX06ZnVuY3Rpb24oKXtyZXR1cm5bbipZYSx0KllhXX07cmV0dXJuIHAuZGlzdGFuY2U9aCxwfWZ1bmN0aW9uIF9lKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBpPU1hdGguc2luKHUqPUlhKSxhPU1hdGguY29zKHUpLG89TWEoKG4qPUlhKS10KSxsPU1hdGguY29zKG8pO0pvKz1NYXRoLmF0YW4yKE1hdGguc3FydCgobz1hKk1hdGguc2luKG8pKSpvKyhvPXIqaS1lKmEqbCkqbyksZSppK3IqYSpsKSx0PW4sZT1pLHI9YX12YXIgdCxlLHI7R28ucG9pbnQ9ZnVuY3Rpb24odSxpKXt0PXUqSWEsZT1NYXRoLnNpbihpKj1JYSkscj1NYXRoLmNvcyhpKSxHby5wb2ludD1ufSxHby5saW5lRW5kPWZ1bmN0aW9uKCl7R28ucG9pbnQ9R28ubGluZUVuZD1ifX1mdW5jdGlvbiB3ZShuLHQpe2Z1bmN0aW9uIGUodCxlKXt2YXIgcj1NYXRoLmNvcyh0KSx1PU1hdGguY29zKGUpLGk9bihyKnUpO3JldHVybltpKnUqTWF0aC5zaW4odCksaSpNYXRoLnNpbihlKV19cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sZSl7dmFyIHI9TWF0aC5zcXJ0KG4qbitlKmUpLHU9dChyKSxpPU1hdGguc2luKHUpLGE9TWF0aC5jb3ModSk7cmV0dXJuW01hdGguYXRhbjIobippLHIqYSksTWF0aC5hc2luKHImJmUqaS9yKV19LGV9ZnVuY3Rpb24gU2Uobix0KXtmdW5jdGlvbiBlKG4sdCl7YT4wPy1PYStQYT50JiYodD0tT2ErUGEpOnQ+T2EtUGEmJih0PU9hLVBhKTt2YXIgZT1hL01hdGgucG93KHUodCksaSk7cmV0dXJuW2UqTWF0aC5zaW4oaSpuKSxhLWUqTWF0aC5jb3MoaSpuKV19dmFyIHI9TWF0aC5jb3MobiksdT1mdW5jdGlvbihuKXtyZXR1cm4gTWF0aC50YW4oamEvNCtuLzIpfSxpPW49PT10P01hdGguc2luKG4pOk1hdGgubG9nKHIvTWF0aC5jb3ModCkpL01hdGgubG9nKHUodCkvdShuKSksYT1yKk1hdGgucG93KHUobiksaSkvaTtyZXR1cm4gaT8oZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1hLXQscj1LKGkpKk1hdGguc3FydChuKm4rZSplKTtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL2ksMipNYXRoLmF0YW4oTWF0aC5wb3coYS9yLDEvaSkpLU9hXX0sZSk6TmV9ZnVuY3Rpb24ga2Uobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9aS10O3JldHVybltlKk1hdGguc2luKHUqbiksaS1lKk1hdGguY29zKHUqbildfXZhciByPU1hdGguY29zKG4pLHU9bj09PXQ/TWF0aC5zaW4obik6KHItTWF0aC5jb3ModCkpLyh0LW4pLGk9ci91K247cmV0dXJuIE1hKHUpPFBhP2NlOihlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPWktdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsaS1LKHUpKk1hdGguc3FydChuKm4rZSplKV19LGUpfWZ1bmN0aW9uIE5lKG4sdCl7cmV0dXJuW24sTWF0aC5sb2coTWF0aC50YW4oamEvNCt0LzIpKV19ZnVuY3Rpb24gRWUobil7dmFyIHQsZT1hZShuKSxyPWUuc2NhbGUsdT1lLnRyYW5zbGF0ZSxpPWUuY2xpcEV4dGVudDtyZXR1cm4gZS5zY2FsZT1mdW5jdGlvbigpe3ZhciBuPXIuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBuPT09ZT90P2UuY2xpcEV4dGVudChudWxsKTplOm59LGUudHJhbnNsYXRlPWZ1bmN0aW9uKCl7dmFyIG49dS5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3ZhciBhPWkuYXBwbHkoZSxhcmd1bWVudHMpO2lmKGE9PT1lKXtpZih0PW51bGw9PW4pe3ZhciBvPWphKnIoKSxsPXUoKTtpKFtbbFswXS1vLGxbMV0tb10sW2xbMF0rbyxsWzFdK29dXSl9fWVsc2UgdCYmKGE9bnVsbCk7cmV0dXJuIGF9LGUuY2xpcEV4dGVudChudWxsKX1mdW5jdGlvbiBBZShuLHQpe3JldHVybltNYXRoLmxvZyhNYXRoLnRhbihqYS80K3QvMikpLC1uXX1mdW5jdGlvbiBDZShuKXtyZXR1cm4gblswXX1mdW5jdGlvbiB6ZShuKXtyZXR1cm4gblsxXX1mdW5jdGlvbiBMZShuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1bMCwxXSxyPTIsdT0yO3Q+dTt1Kyspe2Zvcig7cj4xJiZRKG5bZVtyLTJdXSxuW2Vbci0xXV0sblt1XSk8PTA7KS0tcjtlW3IrK109dX1yZXR1cm4gZS5zbGljZSgwLHIpfWZ1bmN0aW9uIHFlKG4sdCl7cmV0dXJuIG5bMF0tdFswXXx8blsxXS10WzFdfWZ1bmN0aW9uIFRlKG4sdCxlKXtyZXR1cm4oZVswXS10WzBdKSooblsxXS10WzFdKTwoZVsxXS10WzFdKSooblswXS10WzBdKX1mdW5jdGlvbiBSZShuLHQsZSxyKXt2YXIgdT1uWzBdLGk9ZVswXSxhPXRbMF0tdSxvPXJbMF0taSxsPW5bMV0sYz1lWzFdLHM9dFsxXS1sLGY9clsxXS1jLGg9KG8qKGwtYyktZioodS1pKSkvKGYqYS1vKnMpO3JldHVyblt1K2gqYSxsK2gqc119ZnVuY3Rpb24gRGUobil7dmFyIHQ9blswXSxlPW5bbi5sZW5ndGgtMV07cmV0dXJuISh0WzBdLWVbMF18fHRbMV0tZVsxXSl9ZnVuY3Rpb24gUGUoKXtycih0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gVWUobil7dmFyIHQ9Y2wucG9wKCl8fG5ldyBQZTtyZXR1cm4gdC5zaXRlPW4sdH1mdW5jdGlvbiBqZShuKXtCZShuKSxhbC5yZW1vdmUobiksY2wucHVzaChuKSxycihuKX1mdW5jdGlvbiBGZShuKXt2YXIgdD1uLmNpcmNsZSxlPXQueCxyPXQuY3ksdT17eDplLHk6cn0saT1uLlAsYT1uLk4sbz1bbl07amUobik7Zm9yKHZhciBsPWk7bC5jaXJjbGUmJk1hKGUtbC5jaXJjbGUueCk8UGEmJk1hKHItbC5jaXJjbGUuY3kpPFBhOylpPWwuUCxvLnVuc2hpZnQobCksamUobCksbD1pO28udW5zaGlmdChsKSxCZShsKTtmb3IodmFyIGM9YTtjLmNpcmNsZSYmTWEoZS1jLmNpcmNsZS54KTxQYSYmTWEoci1jLmNpcmNsZS5jeSk8UGE7KWE9Yy5OLG8ucHVzaChjKSxqZShjKSxjPWE7by5wdXNoKGMpLEJlKGMpO3ZhciBzLGY9by5sZW5ndGg7Zm9yKHM9MTtmPnM7KytzKWM9b1tzXSxsPW9bcy0xXSxucihjLmVkZ2UsbC5zaXRlLGMuc2l0ZSx1KTtsPW9bMF0sYz1vW2YtMV0sYy5lZGdlPUtlKGwuc2l0ZSxjLnNpdGUsbnVsbCx1KSwkZShsKSwkZShjKX1mdW5jdGlvbiBIZShuKXtmb3IodmFyIHQsZSxyLHUsaT1uLngsYT1uLnksbz1hbC5fO287KWlmKHI9T2UobyxhKS1pLHI+UGEpbz1vLkw7ZWxzZXtpZih1PWktSWUobyxhKSwhKHU+UGEpKXtyPi1QYT8odD1vLlAsZT1vKTp1Pi1QYT8odD1vLGU9by5OKTp0PWU9bzticmVha31pZighby5SKXt0PW87YnJlYWt9bz1vLlJ9dmFyIGw9VWUobik7aWYoYWwuaW5zZXJ0KHQsbCksdHx8ZSl7aWYodD09PWUpcmV0dXJuIEJlKHQpLGU9VWUodC5zaXRlKSxhbC5pbnNlcnQobCxlKSxsLmVkZ2U9ZS5lZGdlPUtlKHQuc2l0ZSxsLnNpdGUpLCRlKHQpLHZvaWQgJGUoZSk7aWYoIWUpcmV0dXJuIHZvaWQobC5lZGdlPUtlKHQuc2l0ZSxsLnNpdGUpKTtCZSh0KSxCZShlKTt2YXIgYz10LnNpdGUscz1jLngsZj1jLnksaD1uLngtcyxnPW4ueS1mLHA9ZS5zaXRlLHY9cC54LXMsZD1wLnktZixtPTIqKGgqZC1nKnYpLHk9aCpoK2cqZyxNPXYqditkKmQseD17eDooZCp5LWcqTSkvbStzLHk6KGgqTS12KnkpL20rZn07bnIoZS5lZGdlLGMscCx4KSxsLmVkZ2U9S2UoYyxuLG51bGwseCksZS5lZGdlPUtlKG4scCxudWxsLHgpLCRlKHQpLCRlKGUpfX1mdW5jdGlvbiBPZShuLHQpe3ZhciBlPW4uc2l0ZSxyPWUueCx1PWUueSxpPXUtdDtpZighaSlyZXR1cm4gcjt2YXIgYT1uLlA7aWYoIWEpcmV0dXJuLSgxLzApO2U9YS5zaXRlO3ZhciBvPWUueCxsPWUueSxjPWwtdDtpZighYylyZXR1cm4gbzt2YXIgcz1vLXIsZj0xL2ktMS9jLGg9cy9jO3JldHVybiBmPygtaCtNYXRoLnNxcnQoaCpoLTIqZioocypzLygtMipjKS1sK2MvMit1LWkvMikpKS9mK3I6KHIrbykvMn1mdW5jdGlvbiBJZShuLHQpe3ZhciBlPW4uTjtpZihlKXJldHVybiBPZShlLHQpO3ZhciByPW4uc2l0ZTtyZXR1cm4gci55PT09dD9yLng6MS8wfWZ1bmN0aW9uIFllKG4pe3RoaXMuc2l0ZT1uLHRoaXMuZWRnZXM9W119ZnVuY3Rpb24gWmUobil7Zm9yKHZhciB0LGUscix1LGksYSxvLGwsYyxzLGY9blswXVswXSxoPW5bMV1bMF0sZz1uWzBdWzFdLHA9blsxXVsxXSx2PWlsLGQ9di5sZW5ndGg7ZC0tOylpZihpPXZbZF0saSYmaS5wcmVwYXJlKCkpZm9yKG89aS5lZGdlcyxsPW8ubGVuZ3RoLGE9MDtsPmE7KXM9b1thXS5lbmQoKSxyPXMueCx1PXMueSxjPW9bKythJWxdLnN0YXJ0KCksdD1jLngsZT1jLnksKE1hKHItdCk+UGF8fE1hKHUtZSk+UGEpJiYoby5zcGxpY2UoYSwwLG5ldyB0cihRZShpLnNpdGUscyxNYShyLWYpPFBhJiZwLXU+UGE/e3g6Zix5Ok1hKHQtZik8UGE/ZTpwfTpNYSh1LXApPFBhJiZoLXI+UGE/e3g6TWEoZS1wKTxQYT90OmgseTpwfTpNYShyLWgpPFBhJiZ1LWc+UGE/e3g6aCx5Ok1hKHQtaCk8UGE/ZTpnfTpNYSh1LWcpPFBhJiZyLWY+UGE/e3g6TWEoZS1nKTxQYT90OmYseTpnfTpudWxsKSxpLnNpdGUsbnVsbCkpLCsrbCl9ZnVuY3Rpb24gVmUobix0KXtyZXR1cm4gdC5hbmdsZS1uLmFuZ2xlfWZ1bmN0aW9uIFhlKCl7cnIodGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uICRlKG4pe3ZhciB0PW4uUCxlPW4uTjtpZih0JiZlKXt2YXIgcj10LnNpdGUsdT1uLnNpdGUsaT1lLnNpdGU7aWYociE9PWkpe3ZhciBhPXUueCxvPXUueSxsPXIueC1hLGM9ci55LW8scz1pLngtYSxmPWkueS1vLGg9MioobCpmLWMqcyk7aWYoIShoPj0tVWEpKXt2YXIgZz1sKmwrYypjLHA9cypzK2YqZix2PShmKmctYypwKS9oLGQ9KGwqcC1zKmcpL2gsZj1kK28sbT1zbC5wb3AoKXx8bmV3IFhlO20uYXJjPW4sbS5zaXRlPXUsbS54PXYrYSxtLnk9ZitNYXRoLnNxcnQodip2K2QqZCksbS5jeT1mLG4uY2lyY2xlPW07Zm9yKHZhciB5PW51bGwsTT1sbC5fO007KWlmKG0ueTxNLnl8fG0ueT09PU0ueSYmbS54PD1NLngpe2lmKCFNLkwpe3k9TS5QO2JyZWFrfU09TS5MfWVsc2V7aWYoIU0uUil7eT1NO2JyZWFrfU09TS5SfWxsLmluc2VydCh5LG0pLHl8fChvbD1tKX19fX1mdW5jdGlvbiBCZShuKXt2YXIgdD1uLmNpcmNsZTt0JiYodC5QfHwob2w9dC5OKSxsbC5yZW1vdmUodCksc2wucHVzaCh0KSxycih0KSxuLmNpcmNsZT1udWxsKX1mdW5jdGlvbiBXZShuKXtmb3IodmFyIHQsZT11bCxyPVl0KG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0pLHU9ZS5sZW5ndGg7dS0tOyl0PWVbdV0sKCFKZSh0LG4pfHwhcih0KXx8TWEodC5hLngtdC5iLngpPFBhJiZNYSh0LmEueS10LmIueSk8UGEpJiYodC5hPXQuYj1udWxsLGUuc3BsaWNlKHUsMSkpfWZ1bmN0aW9uIEplKG4sdCl7dmFyIGU9bi5iO2lmKGUpcmV0dXJuITA7dmFyIHIsdSxpPW4uYSxhPXRbMF1bMF0sbz10WzFdWzBdLGw9dFswXVsxXSxjPXRbMV1bMV0scz1uLmwsZj1uLnIsaD1zLngsZz1zLnkscD1mLngsdj1mLnksZD0oaCtwKS8yLG09KGcrdikvMjtpZih2PT09Zyl7aWYoYT5kfHxkPj1vKXJldHVybjtpZihoPnApe2lmKGkpe2lmKGkueT49YylyZXR1cm59ZWxzZSBpPXt4OmQseTpsfTtlPXt4OmQseTpjfX1lbHNle2lmKGkpe2lmKGkueTxsKXJldHVybn1lbHNlIGk9e3g6ZCx5OmN9O2U9e3g6ZCx5Omx9fX1lbHNlIGlmKHI9KGgtcCkvKHYtZyksdT1tLXIqZCwtMT5yfHxyPjEpaWYoaD5wKXtpZihpKXtpZihpLnk+PWMpcmV0dXJufWVsc2UgaT17eDoobC11KS9yLHk6bH07ZT17eDooYy11KS9yLHk6Y319ZWxzZXtpZihpKXtpZihpLnk8bClyZXR1cm59ZWxzZSBpPXt4OihjLXUpL3IseTpjfTtlPXt4OihsLXUpL3IseTpsfX1lbHNlIGlmKHY+Zyl7aWYoaSl7aWYoaS54Pj1vKXJldHVybn1lbHNlIGk9e3g6YSx5OnIqYSt1fTtlPXt4Om8seTpyKm8rdX19ZWxzZXtpZihpKXtpZihpLng8YSlyZXR1cm59ZWxzZSBpPXt4Om8seTpyKm8rdX07ZT17eDphLHk6ciphK3V9fXJldHVybiBuLmE9aSxuLmI9ZSwhMH1mdW5jdGlvbiBHZShuLHQpe3RoaXMubD1uLHRoaXMucj10LHRoaXMuYT10aGlzLmI9bnVsbH1mdW5jdGlvbiBLZShuLHQsZSxyKXt2YXIgdT1uZXcgR2Uobix0KTtyZXR1cm4gdWwucHVzaCh1KSxlJiZucih1LG4sdCxlKSxyJiZucih1LHQsbixyKSxpbFtuLmldLmVkZ2VzLnB1c2gobmV3IHRyKHUsbix0KSksaWxbdC5pXS5lZGdlcy5wdXNoKG5ldyB0cih1LHQsbikpLHV9ZnVuY3Rpb24gUWUobix0LGUpe3ZhciByPW5ldyBHZShuLG51bGwpO3JldHVybiByLmE9dCxyLmI9ZSx1bC5wdXNoKHIpLHJ9ZnVuY3Rpb24gbnIobix0LGUscil7bi5hfHxuLmI/bi5sPT09ZT9uLmI9cjpuLmE9cjoobi5hPXIsbi5sPXQsbi5yPWUpfWZ1bmN0aW9uIHRyKG4sdCxlKXt2YXIgcj1uLmEsdT1uLmI7dGhpcy5lZGdlPW4sdGhpcy5zaXRlPXQsdGhpcy5hbmdsZT1lP01hdGguYXRhbjIoZS55LXQueSxlLngtdC54KTpuLmw9PT10P01hdGguYXRhbjIodS54LXIueCxyLnktdS55KTpNYXRoLmF0YW4yKHIueC11LngsdS55LXIueSl9ZnVuY3Rpb24gZXIoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBycihuKXtuLlU9bi5DPW4uTD1uLlI9bi5QPW4uTj1udWxsfWZ1bmN0aW9uIHVyKG4sdCl7dmFyIGU9dCxyPXQuUix1PWUuVTt1P3UuTD09PWU/dS5MPXI6dS5SPXI6bi5fPXIsci5VPXUsZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBpcihuLHQpe3ZhciBlPXQscj10LkwsdT1lLlU7dT91Lkw9PT1lP3UuTD1yOnUuUj1yOm4uXz1yLHIuVT11LGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gYXIobil7Zm9yKDtuLkw7KW49bi5MO3JldHVybiBufWZ1bmN0aW9uIG9yKG4sdCl7dmFyIGUscix1LGk9bi5zb3J0KGxyKS5wb3AoKTtmb3IodWw9W10saWw9bmV3IEFycmF5KG4ubGVuZ3RoKSxhbD1uZXcgZXIsbGw9bmV3IGVyOzspaWYodT1vbCxpJiYoIXV8fGkueTx1Lnl8fGkueT09PXUueSYmaS54PHUueCkpKGkueCE9PWV8fGkueSE9PXIpJiYoaWxbaS5pXT1uZXcgWWUoaSksSGUoaSksZT1pLngscj1pLnkpLGk9bi5wb3AoKTtlbHNle2lmKCF1KWJyZWFrO0ZlKHUuYXJjKX10JiYoV2UodCksWmUodCkpO3ZhciBhPXtjZWxsczppbCxlZGdlczp1bH07cmV0dXJuIGFsPWxsPXVsPWlsPW51bGwsYX1mdW5jdGlvbiBscihuLHQpe3JldHVybiB0Lnktbi55fHx0Lngtbi54fWZ1bmN0aW9uIGNyKG4sdCxlKXtyZXR1cm4obi54LWUueCkqKHQueS1uLnkpLShuLngtdC54KSooZS55LW4ueSl9ZnVuY3Rpb24gc3Iobil7cmV0dXJuIG4ueH1mdW5jdGlvbiBmcihuKXtyZXR1cm4gbi55fWZ1bmN0aW9uIGhyKCl7cmV0dXJue2xlYWY6ITAsbm9kZXM6W10scG9pbnQ6bnVsbCx4Om51bGwseTpudWxsfX1mdW5jdGlvbiBncihuLHQsZSxyLHUsaSl7aWYoIW4odCxlLHIsdSxpKSl7dmFyIGE9LjUqKGUrdSksbz0uNSoocitpKSxsPXQubm9kZXM7bFswXSYmZ3IobixsWzBdLGUscixhLG8pLGxbMV0mJmdyKG4sbFsxXSxhLHIsdSxvKSxsWzJdJiZncihuLGxbMl0sZSxvLGEsaSksbFszXSYmZ3IobixsWzNdLGEsbyx1LGkpfX1mdW5jdGlvbiBwcihuLHQsZSxyLHUsaSxhKXt2YXIgbyxsPTEvMDtyZXR1cm4gZnVuY3Rpb24gYyhuLHMsZixoLGcpe2lmKCEocz5pfHxmPmF8fHI+aHx8dT5nKSl7aWYocD1uLnBvaW50KXt2YXIgcCx2PXQtbi54LGQ9ZS1uLnksbT12KnYrZCpkO2lmKGw+bSl7dmFyIHk9TWF0aC5zcXJ0KGw9bSk7cj10LXksdT1lLXksaT10K3ksYT1lK3ksbz1wfX1mb3IodmFyIE09bi5ub2Rlcyx4PS41KihzK2gpLGI9LjUqKGYrZyksXz10Pj14LHc9ZT49YixTPXc8PDF8XyxrPVMrNDtrPlM7KytTKWlmKG49TVszJlNdKXN3aXRjaCgzJlMpe2Nhc2UgMDpjKG4scyxmLHgsYik7YnJlYWs7Y2FzZSAxOmMobix4LGYsaCxiKTticmVhaztjYXNlIDI6YyhuLHMsYix4LGcpO2JyZWFrO2Nhc2UgMzpjKG4seCxiLGgsZyl9fX0obixyLHUsaSxhKSxvfWZ1bmN0aW9uIHZyKG4sdCl7bj1vYS5yZ2IobiksdD1vYS5yZ2IodCk7dmFyIGU9bi5yLHI9bi5nLHU9bi5iLGk9dC5yLWUsYT10LmctcixvPXQuYi11O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4iIyIrYm4oTWF0aC5yb3VuZChlK2kqbikpK2JuKE1hdGgucm91bmQocithKm4pKStibihNYXRoLnJvdW5kKHUrbypuKSl9fWZ1bmN0aW9uIGRyKG4sdCl7dmFyIGUscj17fSx1PXt9O2ZvcihlIGluIG4pZSBpbiB0P3JbZV09TXIobltlXSx0W2VdKTp1W2VdPW5bZV07Zm9yKGUgaW4gdCllIGluIG58fCh1W2VdPXRbZV0pO3JldHVybiBmdW5jdGlvbihuKXtmb3IoZSBpbiByKXVbZV09cltlXShuKTtyZXR1cm4gdX19ZnVuY3Rpb24gbXIobix0KXtyZXR1cm4gbj0rbix0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBuKigxLWUpK3QqZX19ZnVuY3Rpb24geXIobix0KXt2YXIgZSxyLHUsaT1obC5sYXN0SW5kZXg9Z2wubGFzdEluZGV4PTAsYT0tMSxvPVtdLGw9W107Zm9yKG4rPSIiLHQrPSIiOyhlPWhsLmV4ZWMobikpJiYocj1nbC5leGVjKHQpKTspKHU9ci5pbmRleCk+aSYmKHU9dC5zbGljZShpLHUpLG9bYV0/b1thXSs9dTpvWysrYV09dSksKGU9ZVswXSk9PT0ocj1yWzBdKT9vW2FdP29bYV0rPXI6b1srK2FdPXI6KG9bKythXT1udWxsLGwucHVzaCh7aTphLHg6bXIoZSxyKX0pKSxpPWdsLmxhc3RJbmRleDtyZXR1cm4gaTx0Lmxlbmd0aCYmKHU9dC5zbGljZShpKSxvW2FdP29bYV0rPXU6b1srK2FdPXUpLG8ubGVuZ3RoPDI/bFswXT8odD1sWzBdLngsZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9KTpmdW5jdGlvbigpe3JldHVybiB0fToodD1sLmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIGUscj0wO3Q+cjsrK3Ipb1soZT1sW3JdKS5pXT1lLngobik7cmV0dXJuIG8uam9pbigiIil9KX1mdW5jdGlvbiBNcihuLHQpe2Zvcih2YXIgZSxyPW9hLmludGVycG9sYXRvcnMubGVuZ3RoOy0tcj49MCYmIShlPW9hLmludGVycG9sYXRvcnNbcl0obix0KSk7KTtyZXR1cm4gZX1mdW5jdGlvbiB4cihuLHQpe3ZhciBlLHI9W10sdT1bXSxpPW4ubGVuZ3RoLGE9dC5sZW5ndGgsbz1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk7Zm9yKGU9MDtvPmU7KytlKXIucHVzaChNcihuW2VdLHRbZV0pKTtmb3IoO2k+ZTsrK2UpdVtlXT1uW2VdO2Zvcig7YT5lOysrZSl1W2VdPXRbZV07cmV0dXJuIGZ1bmN0aW9uKG4pe2ZvcihlPTA7bz5lOysrZSl1W2VdPXJbZV0obik7cmV0dXJuIHV9fWZ1bmN0aW9uIGJyKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD49dD8wOnQ+PTE/MTpuKHQpfX1mdW5jdGlvbiBfcihuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDEtbigxLXQpfX1mdW5jdGlvbiB3cihuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuLjUqKC41PnQ/bigyKnQpOjItbigyLTIqdCkpfX1mdW5jdGlvbiBTcihuKXtyZXR1cm4gbipufWZ1bmN0aW9uIGtyKG4pe3JldHVybiBuKm4qbn1mdW5jdGlvbiBOcihuKXtpZigwPj1uKXJldHVybiAwO2lmKG4+PTEpcmV0dXJuIDE7dmFyIHQ9bipuLGU9dCpuO3JldHVybiA0KiguNT5uP2U6Myoobi10KStlLS43NSl9ZnVuY3Rpb24gRXIobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBBcihuKXtyZXR1cm4gMS1NYXRoLmNvcyhuKk9hKX1mdW5jdGlvbiBDcihuKXtyZXR1cm4gTWF0aC5wb3coMiwxMCoobi0xKSl9ZnVuY3Rpb24genIobil7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtbipuKX1mdW5jdGlvbiBMcihuLHQpe3ZhciBlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PS40NSksYXJndW1lbnRzLmxlbmd0aD9lPXQvRmEqTWF0aC5hc2luKDEvbik6KG49MSxlPXQvNCksZnVuY3Rpb24ocil7cmV0dXJuIDErbipNYXRoLnBvdygyLC0xMCpyKSpNYXRoLnNpbigoci1lKSpGYS90KX19ZnVuY3Rpb24gcXIobil7cmV0dXJuIG58fChuPTEuNzAxNTgpLGZ1bmN0aW9uKHQpe3JldHVybiB0KnQqKChuKzEpKnQtbil9fWZ1bmN0aW9uIFRyKG4pe3JldHVybiAxLzIuNzU+bj83LjU2MjUqbipuOjIvMi43NT5uPzcuNTYyNSoobi09MS41LzIuNzUpKm4rLjc1OjIuNS8yLjc1Pm4/Ny41NjI1KihuLT0yLjI1LzIuNzUpKm4rLjkzNzU6Ny41NjI1KihuLT0yLjYyNS8yLjc1KSpuKy45ODQzNzV9ZnVuY3Rpb24gUnIobix0KXtuPW9hLmhjbChuKSx0PW9hLmhjbCh0KTt2YXIgZT1uLmgscj1uLmMsdT1uLmwsaT10LmgtZSxhPXQuYy1yLG89dC5sLXU7cmV0dXJuIGlzTmFOKGEpJiYoYT0wLHI9aXNOYU4ocik/dC5jOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGZuKGUraSpuLHIrYSpuLHUrbypuKSsiIn19ZnVuY3Rpb24gRHIobix0KXtuPW9hLmhzbChuKSx0PW9hLmhzbCh0KTt2YXIgZT1uLmgscj1uLnMsdT1uLmwsaT10LmgtZSxhPXQucy1yLG89dC5sLXU7cmV0dXJuIGlzTmFOKGEpJiYoYT0wLHI9aXNOYU4ocik/dC5zOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGNuKGUraSpuLHIrYSpuLHUrbypuKSsiIn19ZnVuY3Rpb24gUHIobix0KXtuPW9hLmxhYihuKSx0PW9hLmxhYih0KTt2YXIgZT1uLmwscj1uLmEsdT1uLmIsaT10LmwtZSxhPXQuYS1yLG89dC5iLXU7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBnbihlK2kqbixyK2Eqbix1K28qbikrIiJ9fWZ1bmN0aW9uIFVyKG4sdCl7cmV0dXJuIHQtPW4sZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQobit0KmUpfX1mdW5jdGlvbiBqcihuKXt2YXIgdD1bbi5hLG4uYl0sZT1bbi5jLG4uZF0scj1Icih0KSx1PUZyKHQsZSksaT1IcihPcihlLHQsLXUpKXx8MDt0WzBdKmVbMV08ZVswXSp0WzFdJiYodFswXSo9LTEsdFsxXSo9LTEscio9LTEsdSo9LTEpLHRoaXMucm90YXRlPShyP01hdGguYXRhbjIodFsxXSx0WzBdKTpNYXRoLmF0YW4yKC1lWzBdLGVbMV0pKSpZYSx0aGlzLnRyYW5zbGF0ZT1bbi5lLG4uZl0sdGhpcy5zY2FsZT1bcixpXSx0aGlzLnNrZXc9aT9NYXRoLmF0YW4yKHUsaSkqWWE6MH1mdW5jdGlvbiBGcihuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdfWZ1bmN0aW9uIEhyKG4pe3ZhciB0PU1hdGguc3FydChGcihuLG4pKTtyZXR1cm4gdCYmKG5bMF0vPXQsblsxXS89dCksdH1mdW5jdGlvbiBPcihuLHQsZSl7cmV0dXJuIG5bMF0rPWUqdFswXSxuWzFdKz1lKnRbMV0sbn1mdW5jdGlvbiBJcihuKXtyZXR1cm4gbi5sZW5ndGg/bi5wb3AoKSsiLCI6IiJ9ZnVuY3Rpb24gWXIobix0LGUscil7aWYoblswXSE9PXRbMF18fG5bMV0hPT10WzFdKXt2YXIgdT1lLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsIiwiLG51bGwsIikiKTtyLnB1c2goe2k6dS00LHg6bXIoblswXSx0WzBdKX0se2k6dS0yLHg6bXIoblsxXSx0WzFdKX0pfWVsc2UodFswXXx8dFsxXSkmJmUucHVzaCgidHJhbnNsYXRlKCIrdCsiKSIpfWZ1bmN0aW9uIFpyKG4sdCxlLHIpe24hPT10PyhuLXQ+MTgwP3QrPTM2MDp0LW4+MTgwJiYobis9MzYwKSxyLnB1c2goe2k6ZS5wdXNoKElyKGUpKyJyb3RhdGUoIixudWxsLCIpIiktMix4Om1yKG4sdCl9KSk6dCYmZS5wdXNoKElyKGUpKyJyb3RhdGUoIit0KyIpIil9ZnVuY3Rpb24gVnIobix0LGUscil7biE9PXQ/ci5wdXNoKHtpOmUucHVzaChJcihlKSsic2tld1goIixudWxsLCIpIiktMix4Om1yKG4sdCl9KTp0JiZlLnB1c2goSXIoZSkrInNrZXdYKCIrdCsiKSIpfWZ1bmN0aW9uIFhyKG4sdCxlLHIpe2lmKG5bMF0hPT10WzBdfHxuWzFdIT09dFsxXSl7dmFyIHU9ZS5wdXNoKElyKGUpKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTtyLnB1c2goe2k6dS00LHg6bXIoblswXSx0WzBdKX0se2k6dS0yLHg6bXIoblsxXSx0WzFdKX0pfWVsc2UoMSE9PXRbMF18fDEhPT10WzFdKSYmZS5wdXNoKElyKGUpKyJzY2FsZSgiK3QrIikiKX1mdW5jdGlvbiAkcihuLHQpe3ZhciBlPVtdLHI9W107cmV0dXJuIG49b2EudHJhbnNmb3JtKG4pLHQ9b2EudHJhbnNmb3JtKHQpLFlyKG4udHJhbnNsYXRlLHQudHJhbnNsYXRlLGUsciksWnIobi5yb3RhdGUsdC5yb3RhdGUsZSxyKSxWcihuLnNrZXcsdC5za2V3LGUsciksWHIobi5zY2FsZSx0LnNjYWxlLGUsciksbj10PW51bGwsZnVuY3Rpb24obil7Zm9yKHZhciB0LHU9LTEsaT1yLmxlbmd0aDsrK3U8aTspZVsodD1yW3VdKS5pXT10Lngobik7cmV0dXJuIGUuam9pbigiIil9fWZ1bmN0aW9uIEJyKG4sdCl7cmV0dXJuIHQ9KHQtPW49K24pfHwxL3QsZnVuY3Rpb24oZSl7cmV0dXJuKGUtbikvdH19ZnVuY3Rpb24gV3Iobix0KXtyZXR1cm4gdD0odC09bj0rbil8fDEvdCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigxLChlLW4pL3QpKX19ZnVuY3Rpb24gSnIobil7Zm9yKHZhciB0PW4uc291cmNlLGU9bi50YXJnZXQscj1Lcih0LGUpLHU9W3RdO3QhPT1yOyl0PXQucGFyZW50LHUucHVzaCh0KTtmb3IodmFyIGk9dS5sZW5ndGg7ZSE9PXI7KXUuc3BsaWNlKGksMCxlKSxlPWUucGFyZW50O3JldHVybiB1fWZ1bmN0aW9uIEdyKG4pe2Zvcih2YXIgdD1bXSxlPW4ucGFyZW50O251bGwhPWU7KXQucHVzaChuKSxuPWUsZT1lLnBhcmVudDtyZXR1cm4gdC5wdXNoKG4pLHR9ZnVuY3Rpb24gS3Iobix0KXtpZihuPT09dClyZXR1cm4gbjtmb3IodmFyIGU9R3Iobikscj1Hcih0KSx1PWUucG9wKCksaT1yLnBvcCgpLGE9bnVsbDt1PT09aTspYT11LHU9ZS5wb3AoKSxpPXIucG9wKCk7cmV0dXJuIGF9ZnVuY3Rpb24gUXIobil7bi5maXhlZHw9Mn1mdW5jdGlvbiBudShuKXtuLmZpeGVkJj0tN31mdW5jdGlvbiB0dShuKXtuLmZpeGVkfD00LG4ucHg9bi54LG4ucHk9bi55fWZ1bmN0aW9uIGV1KG4pe24uZml4ZWQmPS01fWZ1bmN0aW9uIHJ1KG4sdCxlKXt2YXIgcj0wLHU9MDtpZihuLmNoYXJnZT0wLCFuLmxlYWYpZm9yKHZhciBpLGE9bi5ub2RlcyxvPWEubGVuZ3RoLGw9LTE7KytsPG87KWk9YVtsXSxudWxsIT1pJiYocnUoaSx0LGUpLG4uY2hhcmdlKz1pLmNoYXJnZSxyKz1pLmNoYXJnZSppLmN4LHUrPWkuY2hhcmdlKmkuY3kpO2lmKG4ucG9pbnQpe24ubGVhZnx8KG4ucG9pbnQueCs9TWF0aC5yYW5kb20oKS0uNSxuLnBvaW50LnkrPU1hdGgucmFuZG9tKCktLjUpO3ZhciBjPXQqZVtuLnBvaW50LmluZGV4XTtuLmNoYXJnZSs9bi5wb2ludENoYXJnZT1jLHIrPWMqbi5wb2ludC54LHUrPWMqbi5wb2ludC55fW4uY3g9ci9uLmNoYXJnZSxuLmN5PXUvbi5jaGFyZ2V9ZnVuY3Rpb24gdXUobix0KXtyZXR1cm4gb2EucmViaW5kKG4sdCwic29ydCIsImNoaWxkcmVuIiwidmFsdWUiKSxuLm5vZGVzPW4sbi5saW5rcz1zdSxufWZ1bmN0aW9uIGl1KG4sdCl7Zm9yKHZhciBlPVtuXTtudWxsIT0obj1lLnBvcCgpKTspaWYodChuKSwodT1uLmNoaWxkcmVuKSYmKHI9dS5sZW5ndGgpKWZvcih2YXIgcix1Oy0tcj49MDspZS5wdXNoKHVbcl0pfWZ1bmN0aW9uIGF1KG4sdCl7Zm9yKHZhciBlPVtuXSxyPVtdO251bGwhPShuPWUucG9wKCkpOylpZihyLnB1c2gobiksKGk9bi5jaGlsZHJlbikmJih1PWkubGVuZ3RoKSlmb3IodmFyIHUsaSxhPS0xOysrYTx1OyllLnB1c2goaVthXSk7Zm9yKDtudWxsIT0obj1yLnBvcCgpKTspdChuKX1mdW5jdGlvbiBvdShuKXtyZXR1cm4gbi5jaGlsZHJlbn1mdW5jdGlvbiBsdShuKXtyZXR1cm4gbi52YWx1ZX1mdW5jdGlvbiBjdShuLHQpe3JldHVybiB0LnZhbHVlLW4udmFsdWV9ZnVuY3Rpb24gc3Uobil7cmV0dXJuIG9hLm1lcmdlKG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLmNoaWxkcmVufHxbXSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6bix0YXJnZXQ6dH19KX0pKX1mdW5jdGlvbiBmdShuKXtyZXR1cm4gbi54fWZ1bmN0aW9uIGh1KG4pe3JldHVybiBuLnl9ZnVuY3Rpb24gZ3Uobix0LGUpe24ueTA9dCxuLnk9ZX1mdW5jdGlvbiBwdShuKXtyZXR1cm4gb2EucmFuZ2Uobi5sZW5ndGgpfWZ1bmN0aW9uIHZ1KG4pe2Zvcih2YXIgdD0tMSxlPW5bMF0ubGVuZ3RoLHI9W107Kyt0PGU7KXJbdF09MDtyZXR1cm4gcn1mdW5jdGlvbiBkdShuKXtmb3IodmFyIHQsZT0xLHI9MCx1PW5bMF1bMV0saT1uLmxlbmd0aDtpPmU7KytlKSh0PW5bZV1bMV0pPnUmJihyPWUsdT10KTtyZXR1cm4gcn1mdW5jdGlvbiBtdShuKXtyZXR1cm4gbi5yZWR1Y2UoeXUsMCl9ZnVuY3Rpb24geXUobix0KXtyZXR1cm4gbit0WzFdfWZ1bmN0aW9uIE11KG4sdCl7cmV0dXJuIHh1KG4sTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMisxKSl9ZnVuY3Rpb24geHUobix0KXtmb3IodmFyIGU9LTEscj0rblswXSx1PShuWzFdLXIpL3QsaT1bXTsrK2U8PXQ7KWlbZV09dSplK3I7cmV0dXJuIGl9ZnVuY3Rpb24gYnUobil7cmV0dXJuW29hLm1pbihuKSxvYS5tYXgobildfWZ1bmN0aW9uIF91KG4sdCl7cmV0dXJuIG4udmFsdWUtdC52YWx1ZX1mdW5jdGlvbiB3dShuLHQpe3ZhciBlPW4uX3BhY2tfbmV4dDtuLl9wYWNrX25leHQ9dCx0Ll9wYWNrX3ByZXY9bix0Ll9wYWNrX25leHQ9ZSxlLl9wYWNrX3ByZXY9dH1mdW5jdGlvbiBTdShuLHQpe24uX3BhY2tfbmV4dD10LHQuX3BhY2tfcHJldj1ufWZ1bmN0aW9uIGt1KG4sdCl7dmFyIGU9dC54LW4ueCxyPXQueS1uLnksdT1uLnIrdC5yO3JldHVybi45OTkqdSp1PmUqZStyKnJ9ZnVuY3Rpb24gTnUobil7ZnVuY3Rpb24gdChuKXtzPU1hdGgubWluKG4ueC1uLnIscyksZj1NYXRoLm1heChuLngrbi5yLGYpLGg9TWF0aC5taW4obi55LW4ucixoKSxnPU1hdGgubWF4KG4ueStuLnIsZyl9aWYoKGU9bi5jaGlsZHJlbikmJihjPWUubGVuZ3RoKSl7dmFyIGUscix1LGksYSxvLGwsYyxzPTEvMCxmPS0oMS8wKSxoPTEvMCxnPS0oMS8wKTtpZihlLmZvckVhY2goRXUpLHI9ZVswXSxyLng9LXIucixyLnk9MCx0KHIpLGM+MSYmKHU9ZVsxXSx1Lng9dS5yLHUueT0wLHQodSksYz4yKSlmb3IoaT1lWzJdLHp1KHIsdSxpKSx0KGkpLHd1KHIsaSksci5fcGFja19wcmV2PWksd3UoaSx1KSx1PXIuX3BhY2tfbmV4dCxhPTM7Yz5hO2ErKyl7enUocix1LGk9ZVthXSk7dmFyIHA9MCx2PTEsZD0xO2ZvcihvPXUuX3BhY2tfbmV4dDtvIT09dTtvPW8uX3BhY2tfbmV4dCx2KyspaWYoa3UobyxpKSl7cD0xO2JyZWFrfWlmKDE9PXApZm9yKGw9ci5fcGFja19wcmV2O2whPT1vLl9wYWNrX3ByZXYmJiFrdShsLGkpO2w9bC5fcGFja19wcmV2LGQrKyk7cD8oZD52fHx2PT1kJiZ1LnI8ci5yP1N1KHIsdT1vKTpTdShyPWwsdSksYS0tKTood3UocixpKSx1PWksdChpKSl9dmFyIG09KHMrZikvMix5PShoK2cpLzIsTT0wO2ZvcihhPTA7Yz5hO2ErKylpPWVbYV0saS54LT1tLGkueS09eSxNPU1hdGgubWF4KE0saS5yK01hdGguc3FydChpLngqaS54K2kueSppLnkpKTtuLnI9TSxlLmZvckVhY2goQXUpfX1mdW5jdGlvbiBFdShuKXtuLl9wYWNrX25leHQ9bi5fcGFja19wcmV2PW59ZnVuY3Rpb24gQXUobil7ZGVsZXRlIG4uX3BhY2tfbmV4dCxkZWxldGUgbi5fcGFja19wcmV2fWZ1bmN0aW9uIEN1KG4sdCxlLHIpe3ZhciB1PW4uY2hpbGRyZW47aWYobi54PXQrPXIqbi54LG4ueT1lKz1yKm4ueSxuLnIqPXIsdSlmb3IodmFyIGk9LTEsYT11Lmxlbmd0aDsrK2k8YTspQ3UodVtpXSx0LGUscil9ZnVuY3Rpb24genUobix0LGUpe3ZhciByPW4ucitlLnIsdT10Lngtbi54LGk9dC55LW4ueTtpZihyJiYodXx8aSkpe3ZhciBhPXQucitlLnIsbz11KnUraSppO2EqPWEscio9cjt2YXIgbD0uNSsoci1hKS8oMipvKSxjPU1hdGguc3FydChNYXRoLm1heCgwLDIqYSoocitvKS0oci09bykqci1hKmEpKS8oMipvKTtlLng9bi54K2wqdStjKmksZS55PW4ueStsKmktYyp1fWVsc2UgZS54PW4ueCtyLGUueT1uLnl9ZnVuY3Rpb24gTHUobix0KXtyZXR1cm4gbi5wYXJlbnQ9PXQucGFyZW50PzE6Mn1mdW5jdGlvbiBxdShuKXt2YXIgdD1uLmNoaWxkcmVuO3JldHVybiB0Lmxlbmd0aD90WzBdOm4udH1mdW5jdGlvbiBUdShuKXt2YXIgdCxlPW4uY2hpbGRyZW47cmV0dXJuKHQ9ZS5sZW5ndGgpP2VbdC0xXTpuLnR9ZnVuY3Rpb24gUnUobix0LGUpe3ZhciByPWUvKHQuaS1uLmkpO3QuYy09cix0LnMrPWUsbi5jKz1yLHQueis9ZSx0Lm0rPWV9ZnVuY3Rpb24gRHUobil7Zm9yKHZhciB0LGU9MCxyPTAsdT1uLmNoaWxkcmVuLGk9dS5sZW5ndGg7LS1pPj0wOyl0PXVbaV0sdC56Kz1lLHQubSs9ZSxlKz10LnMrKHIrPXQuYyl9ZnVuY3Rpb24gUHUobix0LGUpe3JldHVybiBuLmEucGFyZW50PT09dC5wYXJlbnQ/bi5hOmV9ZnVuY3Rpb24gVXUobil7cmV0dXJuIDErb2EubWF4KG4sZnVuY3Rpb24obil7cmV0dXJuIG4ueX0pfWZ1bmN0aW9uIGp1KG4pe3JldHVybiBuLnJlZHVjZShmdW5jdGlvbihuLHQpe3JldHVybiBuK3QueH0sMCkvbi5sZW5ndGh9ZnVuY3Rpb24gRnUobil7dmFyIHQ9bi5jaGlsZHJlbjtyZXR1cm4gdCYmdC5sZW5ndGg/RnUodFswXSk6bn1mdW5jdGlvbiBIdShuKXt2YXIgdCxlPW4uY2hpbGRyZW47cmV0dXJuIGUmJih0PWUubGVuZ3RoKT9IdShlW3QtMV0pOm59ZnVuY3Rpb24gT3Uobil7cmV0dXJue3g6bi54LHk6bi55LGR4Om4uZHgsZHk6bi5keX19ZnVuY3Rpb24gSXUobix0KXt2YXIgZT1uLngrdFszXSxyPW4ueSt0WzBdLHU9bi5keC10WzFdLXRbM10saT1uLmR5LXRbMF0tdFsyXTtyZXR1cm4gMD51JiYoZSs9dS8yLHU9MCksMD5pJiYocis9aS8yLGk9MCkse3g6ZSx5OnIsZHg6dSxkeTppfX1mdW5jdGlvbiBZdShuKXt2YXIgdD1uWzBdLGU9bltuLmxlbmd0aC0xXTtyZXR1cm4gZT50P1t0LGVdOltlLHRdfWZ1bmN0aW9uIFp1KG4pe3JldHVybiBuLnJhbmdlRXh0ZW50P24ucmFuZ2VFeHRlbnQoKTpZdShuLnJhbmdlKCkpfWZ1bmN0aW9uIFZ1KG4sdCxlLHIpe3ZhciB1PWUoblswXSxuWzFdKSxpPXIodFswXSx0WzFdKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGkodShuKSl9fWZ1bmN0aW9uIFh1KG4sdCl7dmFyIGUscj0wLHU9bi5sZW5ndGgtMSxpPW5bcl0sYT1uW3VdO3JldHVybiBpPmEmJihlPXIscj11LHU9ZSxlPWksaT1hLGE9ZSksbltyXT10LmZsb29yKGkpLG5bdV09dC5jZWlsKGEpLG59ZnVuY3Rpb24gJHUobil7cmV0dXJuIG4/e2Zsb29yOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmZsb29yKHQvbikqbn0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5jZWlsKHQvbikqbn19OlNsfWZ1bmN0aW9uIEJ1KG4sdCxlLHIpe3ZhciB1PVtdLGk9W10sYT0wLG89TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpLTE7Zm9yKG5bb108blswXSYmKG49bi5zbGljZSgpLnJldmVyc2UoKSx0PXQuc2xpY2UoKS5yZXZlcnNlKCkpOysrYTw9bzspdS5wdXNoKGUoblthLTFdLG5bYV0pKSxpLnB1c2gocih0W2EtMV0sdFthXSkpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1vYS5iaXNlY3Qobix0LDEsbyktMTtyZXR1cm4gaVtlXSh1W2VdKHQpKX19ZnVuY3Rpb24gV3Uobix0LGUscil7ZnVuY3Rpb24gdSgpe3ZhciB1PU1hdGgubWluKG4ubGVuZ3RoLHQubGVuZ3RoKT4yP0J1OlZ1LGw9cj9XcjpCcjtyZXR1cm4gYT11KG4sdCxsLGUpLG89dSh0LG4sbCxNciksaX1mdW5jdGlvbiBpKG4pe3JldHVybiBhKG4pfXZhciBhLG87cmV0dXJuIGkuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiBvKG4pfSxpLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10Lm1hcChOdW1iZXIpLHUoKSk6bn0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLHUoKSk6dH0saS5yYW5nZVJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBpLnJhbmdlKG4pLmludGVycG9sYXRlKFVyKX0saS5jbGFtcD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHUoKSk6cn0saS5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHUoKSk6ZX0saS50aWNrcz1mdW5jdGlvbih0KXtyZXR1cm4gUXUobix0KX0saS50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5pKG4sdCxlKX0saS5uaWNlPWZ1bmN0aW9uKHQpe3JldHVybiBHdShuLHQpLHUoKX0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFd1KG4sdCxlLHIpfSx1KCl9ZnVuY3Rpb24gSnUobix0KXtyZXR1cm4gb2EucmViaW5kKG4sdCwicmFuZ2UiLCJyYW5nZVJvdW5kIiwiaW50ZXJwb2xhdGUiLCJjbGFtcCIpfWZ1bmN0aW9uIEd1KG4sdCl7cmV0dXJuIFh1KG4sJHUoS3Uobix0KVsyXSkpLFh1KG4sJHUoS3Uobix0KVsyXSkpLG59ZnVuY3Rpb24gS3Uobix0KXtudWxsPT10JiYodD0xMCk7dmFyIGU9WXUobikscj1lWzFdLWVbMF0sdT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIvdCkvTWF0aC5MTjEwKSksaT10L3IqdTtyZXR1cm4uMTU+PWk/dSo9MTA6LjM1Pj1pP3UqPTU6Ljc1Pj1pJiYodSo9MiksZVswXT1NYXRoLmNlaWwoZVswXS91KSp1LGVbMV09TWF0aC5mbG9vcihlWzFdL3UpKnUrLjUqdSxlWzJdPXUsZX1mdW5jdGlvbiBRdShuLHQpe3JldHVybiBvYS5yYW5nZS5hcHBseShvYSxLdShuLHQpKX1mdW5jdGlvbiBuaShuLHQsZSl7dmFyIHI9S3Uobix0KTtpZihlKXt2YXIgdT1mby5leGVjKGUpO2lmKHUuc2hpZnQoKSwicyI9PT11WzhdKXt2YXIgaT1vYS5mb3JtYXRQcmVmaXgoTWF0aC5tYXgoTWEoclswXSksTWEoclsxXSkpKTtyZXR1cm4gdVs3XXx8KHVbN109Ii4iK3RpKGkuc2NhbGUoclsyXSkpKSx1WzhdPSJmIixlPW9hLmZvcm1hdCh1LmpvaW4oIiIpKSxmdW5jdGlvbihuKXtyZXR1cm4gZShpLnNjYWxlKG4pKStpLnN5bWJvbH19dVs3XXx8KHVbN109Ii4iK2VpKHVbOF0scikpLGU9dS5qb2luKCIiKX1lbHNlIGU9IiwuIit0aShyWzJdKSsiZiI7cmV0dXJuIG9hLmZvcm1hdChlKX1mdW5jdGlvbiB0aShuKXtyZXR1cm4tTWF0aC5mbG9vcihNYXRoLmxvZyhuKS9NYXRoLkxOMTArLjAxKX1mdW5jdGlvbiBlaShuLHQpe3ZhciBlPXRpKHRbMl0pO3JldHVybiBuIGluIGtsP01hdGguYWJzKGUtdGkoTWF0aC5tYXgoTWEodFswXSksTWEodFsxXSkpKSkrICsoImUiIT09bik6ZS0yKigiJSI9PT1uKX1mdW5jdGlvbiByaShuLHQsZSxyKXtmdW5jdGlvbiB1KG4pe3JldHVybihlP01hdGgubG9nKDA+bj8wOm4pOi1NYXRoLmxvZyhuPjA/MDotbikpL01hdGgubG9nKHQpfWZ1bmN0aW9uIGkobil7cmV0dXJuIGU/TWF0aC5wb3codCxuKTotTWF0aC5wb3codCwtbil9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gbih1KHQpKX1yZXR1cm4gYS5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGkobi5pbnZlcnQodCkpfSxhLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10WzBdPj0wLG4uZG9tYWluKChyPXQubWFwKE51bWJlcikpLm1hcCh1KSksYSk6cn0sYS5iYXNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlLG4uZG9tYWluKHIubWFwKHUpKSxhKTp0fSxhLm5pY2U9ZnVuY3Rpb24oKXt2YXIgdD1YdShyLm1hcCh1KSxlP01hdGg6RWwpO3JldHVybiBuLmRvbWFpbih0KSxyPXQubWFwKGkpLGF9LGEudGlja3M9ZnVuY3Rpb24oKXt2YXIgbj1ZdShyKSxhPVtdLG89blswXSxsPW5bMV0sYz1NYXRoLmZsb29yKHUobykpLHM9TWF0aC5jZWlsKHUobCkpLGY9dCUxPzI6dDtpZihpc0Zpbml0ZShzLWMpKXtpZihlKXtmb3IoO3M+YztjKyspZm9yKHZhciBoPTE7Zj5oO2grKylhLnB1c2goaShjKSpoKTthLnB1c2goaShjKSl9ZWxzZSBmb3IoYS5wdXNoKGkoYykpO2MrKzxzOylmb3IodmFyIGg9Zi0xO2g+MDtoLS0pYS5wdXNoKGkoYykqaCk7Zm9yKGM9MDthW2NdPG87YysrKTtmb3Iocz1hLmxlbmd0aDthW3MtMV0+bDtzLS0pO2E9YS5zbGljZShjLHMpfXJldHVybiBhfSxhLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gTmw7YXJndW1lbnRzLmxlbmd0aDwyP2U9Tmw6ImZ1bmN0aW9uIiE9dHlwZW9mIGUmJihlPW9hLmZvcm1hdChlKSk7dmFyIHI9TWF0aC5tYXgoMSx0Km4vYS50aWNrcygpLmxlbmd0aCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBhPW4vaShNYXRoLnJvdW5kKHUobikpKTtyZXR1cm4gdC0uNT5hKnQmJihhKj10KSxyPj1hP2Uobik6IiJ9fSxhLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gcmkobi5jb3B5KCksdCxlLHIpfSxKdShhLG4pfWZ1bmN0aW9uIHVpKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKHUodCkpfXZhciB1PWlpKHQpLGk9aWkoMS90KTtyZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGkobi5pbnZlcnQodCkpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obi5kb21haW4oKGU9dC5tYXAoTnVtYmVyKSkubWFwKHUpKSxyKTplfSxyLnRpY2tzPWZ1bmN0aW9uKG4pe3JldHVybiBRdShlLG4pfSxyLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gbmkoZSxuLHQpfSxyLm5pY2U9ZnVuY3Rpb24obil7cmV0dXJuIHIuZG9tYWluKEd1KGUsbikpfSxyLmV4cG9uZW50PWZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWlpKHQ9YSksaT1paSgxL3QpLG4uZG9tYWluKGUubWFwKHUpKSxyKTp0fSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdWkobi5jb3B5KCksdCxlKX0sSnUocixuKX1mdW5jdGlvbiBpaShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDA+dD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX19ZnVuY3Rpb24gYWkobix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBpWygodS5nZXQoZSl8fCgicmFuZ2UiPT09dC50P3Uuc2V0KGUsbi5wdXNoKGUpKTpOYU4pKS0xKSVpLmxlbmd0aF19ZnVuY3Rpb24gcih0LGUpe3JldHVybiBvYS5yYW5nZShuLmxlbmd0aCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiB0K2Uqbn0pfXZhciB1LGksYTtyZXR1cm4gZS5kb21haW49ZnVuY3Rpb24ocil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG47bj1bXSx1PW5ldyBjO2Zvcih2YXIgaSxhPS0xLG89ci5sZW5ndGg7KythPG87KXUuaGFzKGk9clthXSl8fHUuc2V0KGksbi5wdXNoKGkpKTtyZXR1cm4gZVt0LnRdLmFwcGx5KGUsdC5hKX0sZS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLGE9MCx0PXt0OiJyYW5nZSIsYTphcmd1bWVudHN9LGUpOml9LGUucmFuZ2VQb2ludHM9ZnVuY3Rpb24odSxvKXthcmd1bWVudHMubGVuZ3RoPDImJihvPTApO3ZhciBsPXVbMF0sYz11WzFdLHM9bi5sZW5ndGg8Mj8obD0obCtjKS8yLDApOihjLWwpLyhuLmxlbmd0aC0xK28pO3JldHVybiBpPXIobCtzKm8vMixzKSxhPTAsdD17dDoicmFuZ2VQb2ludHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlUm91bmRQb2ludHM9ZnVuY3Rpb24odSxvKXthcmd1bWVudHMubGVuZ3RoPDImJihvPTApO3ZhciBsPXVbMF0sYz11WzFdLHM9bi5sZW5ndGg8Mj8obD1jPU1hdGgucm91bmQoKGwrYykvMiksMCk6KGMtbCkvKG4ubGVuZ3RoLTErbyl8MDtyZXR1cm4gaT1yKGwrTWF0aC5yb3VuZChzKm8vMisoYy1sLShuLmxlbmd0aC0xK28pKnMpLzIpLHMpLGE9MCx0PXt0OiJyYW5nZVJvdW5kUG9pbnRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZUJhbmRzPWZ1bmN0aW9uKHUsbyxsKXthcmd1bWVudHMubGVuZ3RoPDImJihvPTApLGFyZ3VtZW50cy5sZW5ndGg8MyYmKGw9byk7dmFyIGM9dVsxXTx1WzBdLHM9dVtjLTBdLGY9dVsxLWNdLGg9KGYtcykvKG4ubGVuZ3RoLW8rMipsKTtyZXR1cm4gaT1yKHMraCpsLGgpLGMmJmkucmV2ZXJzZSgpLGE9aCooMS1vKSx0PXt0OiJyYW5nZUJhbmRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZVJvdW5kQmFuZHM9ZnVuY3Rpb24odSxvLGwpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKG89MCksYXJndW1lbnRzLmxlbmd0aDwzJiYobD1vKTt2YXIgYz11WzFdPHVbMF0scz11W2MtMF0sZj11WzEtY10saD1NYXRoLmZsb29yKChmLXMpLyhuLmxlbmd0aC1vKzIqbCkpO3JldHVybiBpPXIocytNYXRoLnJvdW5kKChmLXMtKG4ubGVuZ3RoLW8pKmgpLzIpLGgpLGMmJmkucmV2ZXJzZSgpLGE9TWF0aC5yb3VuZChoKigxLW8pKSx0PXt0OiJyYW5nZVJvdW5kQmFuZHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiBhfSxlLnJhbmdlRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIFl1KHQuYVswXSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBhaShuLHQpfSxlLmRvbWFpbihuKX1mdW5jdGlvbiBvaShuLHQpe2Z1bmN0aW9uIGkoKXt2YXIgZT0wLHI9dC5sZW5ndGg7Zm9yKG89W107KytlPHI7KW9bZS0xXT1vYS5xdWFudGlsZShuLGUvcik7cmV0dXJuIGF9ZnVuY3Rpb24gYShuKXtyZXR1cm4gaXNOYU4obj0rbik/dm9pZCAwOnRbb2EuYmlzZWN0KG8sbildfXZhciBvO3JldHVybiBhLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10Lm1hcChyKS5maWx0ZXIodSkuc29ydChlKSxpKCkpOm59LGEucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKCkpOnR9LGEucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG99LGEuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlPXQuaW5kZXhPZihlKSwwPmU/W05hTixOYU5dOltlPjA/b1tlLTFdOm5bMF0sZTxvLmxlbmd0aD9vW2VdOm5bbi5sZW5ndGgtMV1dfSxhLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gb2kobix0KX0saSgpfWZ1bmN0aW9uIGxpKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBlW01hdGgubWF4KDAsTWF0aC5taW4oYSxNYXRoLmZsb29yKGkqKHQtbikpKSldfWZ1bmN0aW9uIHUoKXtyZXR1cm4gaT1lLmxlbmd0aC8odC1uKSxhPWUubGVuZ3RoLTEscn12YXIgaSxhO3JldHVybiByLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rZVswXSx0PStlW2UubGVuZ3RoLTFdLHUoKSk6W24sdF19LHIucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix1KCkpOmV9LHIuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0PWUuaW5kZXhPZih0KSx0PTA+dD9OYU46dC9pK24sW3QsdCsxL2ldfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbGkobix0LGUpfSx1KCl9ZnVuY3Rpb24gY2kobix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBlPj1lP3Rbb2EuYmlzZWN0KG4sZSldOnZvaWQgMH1yZXR1cm4gZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlKTpufSxlLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sZSk6dH0sZS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5pbmRleE9mKGUpLFtuW2UtMV0sbltlXV19LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBjaShuLHQpfSxlfWZ1bmN0aW9uIHNpKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuK259cmV0dXJuIHQuaW52ZXJ0PXQsdC5kb21haW49dC5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLm1hcCh0KSx0KTpufSx0LnRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBRdShuLHQpfSx0LnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbmkobix0LGUpfSx0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gc2kobil9LHR9ZnVuY3Rpb24gZmkoKXtyZXR1cm4gMH1mdW5jdGlvbiBoaShuKXtyZXR1cm4gbi5pbm5lclJhZGl1c31mdW5jdGlvbiBnaShuKXtyZXR1cm4gbi5vdXRlclJhZGl1c31mdW5jdGlvbiBwaShuKXtyZXR1cm4gbi5zdGFydEFuZ2xlfWZ1bmN0aW9uIHZpKG4pe3JldHVybiBuLmVuZEFuZ2xlfWZ1bmN0aW9uIGRpKG4pe3JldHVybiBuJiZuLnBhZEFuZ2xlfWZ1bmN0aW9uIG1pKG4sdCxlLHIpe3JldHVybihuLWUpKnQtKHQtcikqbj4wPzA6MX1mdW5jdGlvbiB5aShuLHQsZSxyLHUpe3ZhciBpPW5bMF0tdFswXSxhPW5bMV0tdFsxXSxvPSh1P3I6LXIpL01hdGguc3FydChpKmkrYSphKSxsPW8qYSxjPS1vKmkscz1uWzBdK2wsZj1uWzFdK2MsaD10WzBdK2wsZz10WzFdK2MscD0ocytoKS8yLHY9KGYrZykvMixkPWgtcyxtPWctZix5PWQqZCttKm0sTT1lLXIseD1zKmctaCpmLGI9KDA+bT8tMToxKSpNYXRoLnNxcnQoTWF0aC5tYXgoMCxNKk0qeS14KngpKSxfPSh4Km0tZCpiKS95LHc9KC14KmQtbSpiKS95LFM9KHgqbStkKmIpL3ksaz0oLXgqZCttKmIpL3ksTj1fLXAsRT13LXYsQT1TLXAsQz1rLXY7cmV0dXJuIE4qTitFKkU+QSpBK0MqQyYmKF89Uyx3PWspLFtbXy1sLHctY10sW18qZS9NLHcqZS9NXV19ZnVuY3Rpb24gTWkobil7ZnVuY3Rpb24gdCh0KXtmdW5jdGlvbiBhKCl7Yy5wdXNoKCJNIixpKG4ocyksbykpfWZvcih2YXIgbCxjPVtdLHM9W10sZj0tMSxoPXQubGVuZ3RoLGc9RW4oZSkscD1FbihyKTsrK2Y8aDspdS5jYWxsKHRoaXMsbD10W2ZdLGYpP3MucHVzaChbK2cuY2FsbCh0aGlzLGwsZiksK3AuY2FsbCh0aGlzLGwsZildKTpzLmxlbmd0aCYmKGEoKSxzPVtdKTtyZXR1cm4gcy5sZW5ndGgmJmEoKSxjLmxlbmd0aD9jLmpvaW4oIiIpOm51bGx9dmFyIGU9Q2Uscj16ZSx1PXp0LGk9eGksYT1pLmtleSxvPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0LmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bix0KTp1fSx0LmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiBuP2k9bjooaT1UbC5nZXQobil8fHhpKS5rZXksdCk6YX0sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sdCk6b30sdH1mdW5jdGlvbiB4aShuKXtyZXR1cm4gbi5sZW5ndGg+MT9uLmpvaW4oIkwiKTpuKyJaIn1mdW5jdGlvbiBiaShuKXtyZXR1cm4gbi5qb2luKCJMIikrIloifWZ1bmN0aW9uIF9pKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIkgiLChyWzBdKyhyPW5bdF0pWzBdKS8yLCJWIixyWzFdKTtyZXR1cm4gZT4xJiZ1LnB1c2goIkgiLHJbMF0pLHUuam9pbigiIil9ZnVuY3Rpb24gd2kobil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiViIsKHI9blt0XSlbMV0sIkgiLHJbMF0pO3JldHVybiB1LmpvaW4oIiIpfWZ1bmN0aW9uIFNpKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIkgiLChyPW5bdF0pWzBdLCJWIixyWzFdKTtyZXR1cm4gdS5qb2luKCIiKX1mdW5jdGlvbiBraShuLHQpe3JldHVybiBuLmxlbmd0aDw0P3hpKG4pOm5bMV0rQWkobi5zbGljZSgxLC0xKSxDaShuLHQpKX1mdW5jdGlvbiBOaShuLHQpe3JldHVybiBuLmxlbmd0aDwzP2JpKG4pOm5bMF0rQWkoKG4ucHVzaChuWzBdKSxuKSxDaShbbltuLmxlbmd0aC0yXV0uY29uY2F0KG4sW25bMV1dKSx0KSl9ZnVuY3Rpb24gRWkobix0KXtyZXR1cm4gbi5sZW5ndGg8Mz94aShuKTpuWzBdK0FpKG4sQ2kobix0KSl9ZnVuY3Rpb24gQWkobix0KXtpZih0Lmxlbmd0aDwxfHxuLmxlbmd0aCE9dC5sZW5ndGgmJm4ubGVuZ3RoIT10Lmxlbmd0aCsyKXJldHVybiB4aShuKTt2YXIgZT1uLmxlbmd0aCE9dC5sZW5ndGgscj0iIix1PW5bMF0saT1uWzFdLGE9dFswXSxvPWEsbD0xO2lmKGUmJihyKz0iUSIrKGlbMF0tMiphWzBdLzMpKyIsIisoaVsxXS0yKmFbMV0vMykrIiwiK2lbMF0rIiwiK2lbMV0sdT1uWzFdLGw9MiksdC5sZW5ndGg+MSl7bz10WzFdLGk9bltsXSxsKysscis9IkMiKyh1WzBdK2FbMF0pKyIsIisodVsxXSthWzFdKSsiLCIrKGlbMF0tb1swXSkrIiwiKyhpWzFdLW9bMV0pKyIsIitpWzBdKyIsIitpWzFdO2Zvcih2YXIgYz0yO2M8dC5sZW5ndGg7YysrLGwrKylpPW5bbF0sbz10W2NdLHIrPSJTIisoaVswXS1vWzBdKSsiLCIrKGlbMV0tb1sxXSkrIiwiK2lbMF0rIiwiK2lbMV19aWYoZSl7dmFyIHM9bltsXTtyKz0iUSIrKGlbMF0rMipvWzBdLzMpKyIsIisoaVsxXSsyKm9bMV0vMykrIiwiK3NbMF0rIiwiK3NbMV19cmV0dXJuIHJ9ZnVuY3Rpb24gQ2kobix0KXtmb3IodmFyIGUscj1bXSx1PSgxLXQpLzIsaT1uWzBdLGE9blsxXSxvPTEsbD1uLmxlbmd0aDsrK288bDspZT1pLGk9YSxhPW5bb10sci5wdXNoKFt1KihhWzBdLWVbMF0pLHUqKGFbMV0tZVsxXSldKTtyZXR1cm4gcn1mdW5jdGlvbiB6aShuKXtpZihuLmxlbmd0aDwzKXJldHVybiB4aShuKTt2YXIgdD0xLGU9bi5sZW5ndGgscj1uWzBdLHU9clswXSxpPXJbMV0sYT1bdSx1LHUsKHI9blsxXSlbMF1dLG89W2ksaSxpLHJbMV1dLGw9W3UsIiwiLGksIkwiLFJpKFBsLGEpLCIsIixSaShQbCxvKV07Zm9yKG4ucHVzaChuW2UtMV0pOysrdDw9ZTspcj1uW3RdLGEuc2hpZnQoKSxhLnB1c2goclswXSksby5zaGlmdCgpLG8ucHVzaChyWzFdKSxEaShsLGEsbyk7cmV0dXJuIG4ucG9wKCksbC5wdXNoKCJMIixyKSxsLmpvaW4oIiIpfWZ1bmN0aW9uIExpKG4pe2lmKG4ubGVuZ3RoPDQpcmV0dXJuIHhpKG4pO2Zvcih2YXIgdCxlPVtdLHI9LTEsdT1uLmxlbmd0aCxpPVswXSxhPVswXTsrK3I8MzspdD1uW3JdLGkucHVzaCh0WzBdKSxhLnB1c2godFsxXSk7Zm9yKGUucHVzaChSaShQbCxpKSsiLCIrUmkoUGwsYSkpLC0tcjsrK3I8dTspdD1uW3JdLGkuc2hpZnQoKSxpLnB1c2godFswXSksYS5zaGlmdCgpLGEucHVzaCh0WzFdKSxEaShlLGksYSk7cmV0dXJuIGUuam9pbigiIil9ZnVuY3Rpb24gcWkobil7Zm9yKHZhciB0LGUscj0tMSx1PW4ubGVuZ3RoLGk9dSs0LGE9W10sbz1bXTsrK3I8NDspZT1uW3IldV0sYS5wdXNoKGVbMF0pLG8ucHVzaChlWzFdKTtmb3IodD1bUmkoUGwsYSksIiwiLFJpKFBsLG8pXSwtLXI7KytyPGk7KWU9bltyJXVdLGEuc2hpZnQoKSxhLnB1c2goZVswXSksby5zaGlmdCgpLG8ucHVzaChlWzFdKSxEaSh0LGEsbyk7cmV0dXJuIHQuam9pbigiIil9ZnVuY3Rpb24gVGkobix0KXt2YXIgZT1uLmxlbmd0aC0xO2lmKGUpZm9yKHZhciByLHUsaT1uWzBdWzBdLGE9blswXVsxXSxvPW5bZV1bMF0taSxsPW5bZV1bMV0tYSxjPS0xOysrYzw9ZTspcj1uW2NdLHU9Yy9lLHJbMF09dCpyWzBdKygxLXQpKihpK3UqbyksclsxXT10KnJbMV0rKDEtdCkqKGErdSpsKTtyZXR1cm4gemkobil9ZnVuY3Rpb24gUmkobix0KXtyZXR1cm4gblswXSp0WzBdK25bMV0qdFsxXStuWzJdKnRbMl0rblszXSp0WzNdfWZ1bmN0aW9uIERpKG4sdCxlKXtuLnB1c2goIkMiLFJpKFJsLHQpLCIsIixSaShSbCxlKSwiLCIsUmkoRGwsdCksIiwiLFJpKERsLGUpLCIsIixSaShQbCx0KSwiLCIsUmkoUGwsZSkpfWZ1bmN0aW9uIFBpKG4sdCl7cmV0dXJuKHRbMV0tblsxXSkvKHRbMF0tblswXSl9ZnVuY3Rpb24gVWkobil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aC0xLHI9W10sdT1uWzBdLGk9blsxXSxhPXJbMF09UGkodSxpKTsrK3Q8ZTspclt0XT0oYSsoYT1QaSh1PWksaT1uW3QrMV0pKSkvMjtyZXR1cm4gclt0XT1hLHJ9ZnVuY3Rpb24gamkobil7Zm9yKHZhciB0LGUscix1LGk9W10sYT1VaShuKSxvPS0xLGw9bi5sZW5ndGgtMTsrK288bDspdD1QaShuW29dLG5bbysxXSksTWEodCk8UGE/YVtvXT1hW28rMV09MDooZT1hW29dL3Qscj1hW28rMV0vdCx1PWUqZStyKnIsdT45JiYodT0zKnQvTWF0aC5zcXJ0KHUpLGFbb109dSplLGFbbysxXT11KnIpKTtmb3Iobz0tMTsrK288PWw7KXU9KG5bTWF0aC5taW4obCxvKzEpXVswXS1uW01hdGgubWF4KDAsby0xKV1bMF0pLyg2KigxK2Fbb10qYVtvXSkpLGkucHVzaChbdXx8MCxhW29dKnV8fDBdKTtyZXR1cm4gaX1mdW5jdGlvbiBGaShuKXtyZXR1cm4gbi5sZW5ndGg8Mz94aShuKTpuWzBdK0FpKG4samkobikpfWZ1bmN0aW9uIEhpKG4pe2Zvcih2YXIgdCxlLHIsdT0tMSxpPW4ubGVuZ3RoOysrdTxpOyl0PW5bdV0sZT10WzBdLHI9dFsxXS1PYSx0WzBdPWUqTWF0aC5jb3MociksdFsxXT1lKk1hdGguc2luKHIpO3JldHVybiBufWZ1bmN0aW9uIE9pKG4pe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gbCgpe3YucHVzaCgiTSIsbyhuKG0pLGYpLHMsYyhuKGQucmV2ZXJzZSgpKSxmKSwiWiIpfWZvcih2YXIgaCxnLHAsdj1bXSxkPVtdLG09W10seT0tMSxNPXQubGVuZ3RoLHg9RW4oZSksYj1Fbih1KSxfPWU9PT1yP2Z1bmN0aW9uKCl7CnJldHVybiBnfTpFbihyKSx3PXU9PT1pP2Z1bmN0aW9uKCl7cmV0dXJuIHB9OkVuKGkpOysreTxNOylhLmNhbGwodGhpcyxoPXRbeV0seSk/KGQucHVzaChbZz0reC5jYWxsKHRoaXMsaCx5KSxwPStiLmNhbGwodGhpcyxoLHkpXSksbS5wdXNoKFsrXy5jYWxsKHRoaXMsaCx5KSwrdy5jYWxsKHRoaXMsaCx5KV0pKTpkLmxlbmd0aCYmKGwoKSxkPVtdLG09W10pO3JldHVybiBkLmxlbmd0aCYmbCgpLHYubGVuZ3RoP3Yuam9pbigiIik6bnVsbH12YXIgZT1DZSxyPUNlLHU9MCxpPXplLGE9enQsbz14aSxsPW8ua2V5LGM9byxzPSJMIixmPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9cj1uLHQpOnJ9LHQueDA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0LngxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWk9bix0KTppfSx0LnkwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sdCk6dX0sdC55MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLHQpOml9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1uLHQpOmF9LHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bz1uOihvPVRsLmdldChuKXx8eGkpLmtleSxjPW8ucmV2ZXJzZXx8byxzPW8uY2xvc2VkPyJNIjoiTCIsdCk6bH0sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPW4sdCk6Zn0sdH1mdW5jdGlvbiBJaShuKXtyZXR1cm4gbi5yYWRpdXN9ZnVuY3Rpb24gWWkobil7cmV0dXJuW24ueCxuLnldfWZ1bmN0aW9uIFppKG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dFswXSxyPXRbMV0tT2E7cmV0dXJuW2UqTWF0aC5jb3MociksZSpNYXRoLnNpbihyKV19fWZ1bmN0aW9uIFZpKCl7cmV0dXJuIDY0fWZ1bmN0aW9uIFhpKCl7cmV0dXJuImNpcmNsZSJ9ZnVuY3Rpb24gJGkobil7dmFyIHQ9TWF0aC5zcXJ0KG4vamEpO3JldHVybiJNMCwiK3QrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrLXQrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrdCsiWiJ9ZnVuY3Rpb24gQmkobil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQsZSxyOyh0PXRoaXNbbl0pJiYocj10W2U9dC5hY3RpdmVdKSYmKHIudGltZXIuYz1udWxsLHIudGltZXIudD1OYU4sLS10LmNvdW50P2RlbGV0ZSB0W2VdOmRlbGV0ZSB0aGlzW25dLHQuYWN0aXZlKz0uNSxyLmV2ZW50JiZyLmV2ZW50LmludGVycnVwdC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxyLmluZGV4KSl9fWZ1bmN0aW9uIFdpKG4sdCxlKXtyZXR1cm4gU2EobixZbCksbi5uYW1lc3BhY2U9dCxuLmlkPWUsbn1mdW5jdGlvbiBKaShuLHQsZSxyKXt2YXIgdT1uLmlkLGk9bi5uYW1lc3BhY2U7cmV0dXJuIFkobiwiZnVuY3Rpb24iPT10eXBlb2YgZT9mdW5jdGlvbihuLGEsbyl7bltpXVt1XS50d2Vlbi5zZXQodCxyKGUuY2FsbChuLG4uX19kYXRhX18sYSxvKSkpfTooZT1yKGUpLGZ1bmN0aW9uKG4pe25baV1bdV0udHdlZW4uc2V0KHQsZSl9KSl9ZnVuY3Rpb24gR2kobil7cmV0dXJuIG51bGw9PW4mJihuPSIiKSxmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9bn19ZnVuY3Rpb24gS2kobil7cmV0dXJuIG51bGw9PW4/Il9fdHJhbnNpdGlvbl9fIjoiX190cmFuc2l0aW9uXyIrbisiX18ifWZ1bmN0aW9uIFFpKG4sdCxlLHIsdSl7ZnVuY3Rpb24gaShuKXt2YXIgdD12LmRlbGF5O3JldHVybiBzLnQ9dCtsLG4+PXQ/YShuLXQpOnZvaWQocy5jPWEpfWZ1bmN0aW9uIGEoZSl7dmFyIHU9cC5hY3RpdmUsaT1wW3VdO2kmJihpLnRpbWVyLmM9bnVsbCxpLnRpbWVyLnQ9TmFOLC0tcC5jb3VudCxkZWxldGUgcFt1XSxpLmV2ZW50JiZpLmV2ZW50LmludGVycnVwdC5jYWxsKG4sbi5fX2RhdGFfXyxpLmluZGV4KSk7Zm9yKHZhciBhIGluIHApaWYocj4rYSl7dmFyIGM9cFthXTtjLnRpbWVyLmM9bnVsbCxjLnRpbWVyLnQ9TmFOLC0tcC5jb3VudCxkZWxldGUgcFthXX1zLmM9byxxbihmdW5jdGlvbigpe3JldHVybiBzLmMmJm8oZXx8MSkmJihzLmM9bnVsbCxzLnQ9TmFOKSwxfSwwLGwpLHAuYWN0aXZlPXIsdi5ldmVudCYmdi5ldmVudC5zdGFydC5jYWxsKG4sbi5fX2RhdGFfXyx0KSxnPVtdLHYudHdlZW4uZm9yRWFjaChmdW5jdGlvbihlLHIpeyhyPXIuY2FsbChuLG4uX19kYXRhX18sdCkpJiZnLnB1c2gocil9KSxoPXYuZWFzZSxmPXYuZHVyYXRpb259ZnVuY3Rpb24gbyh1KXtmb3IodmFyIGk9dS9mLGE9aChpKSxvPWcubGVuZ3RoO28+MDspZ1stLW9dLmNhbGwobixhKTtyZXR1cm4gaT49MT8odi5ldmVudCYmdi5ldmVudC5lbmQuY2FsbChuLG4uX19kYXRhX18sdCksLS1wLmNvdW50P2RlbGV0ZSBwW3JdOmRlbGV0ZSBuW2VdLDEpOnZvaWQgMH12YXIgbCxzLGYsaCxnLHA9bltlXXx8KG5bZV09e2FjdGl2ZTowLGNvdW50OjB9KSx2PXBbcl07dnx8KGw9dS50aW1lLHM9cW4oaSwwLGwpLHY9cFtyXT17dHdlZW46bmV3IGMsdGltZTpsLHRpbWVyOnMsZGVsYXk6dS5kZWxheSxkdXJhdGlvbjp1LmR1cmF0aW9uLGVhc2U6dS5lYXNlLGluZGV4OnR9LHU9bnVsbCwrK3AuY291bnQpfWZ1bmN0aW9uIG5hKG4sdCxlKXtuLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7dmFyIHI9dChuKTtyZXR1cm4idHJhbnNsYXRlKCIrKGlzRmluaXRlKHIpP3I6ZShuKSkrIiwwKSJ9KX1mdW5jdGlvbiB0YShuLHQsZSl7bi5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3ZhciByPXQobik7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKGlzRmluaXRlKHIpP3I6ZShuKSkrIikifSl9ZnVuY3Rpb24gZWEobil7cmV0dXJuIG4udG9JU09TdHJpbmcoKX1mdW5jdGlvbiByYShuLHQsZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbih0KX1mdW5jdGlvbiB1KG4sZSl7dmFyIHI9blsxXS1uWzBdLHU9ci9lLGk9b2EuYmlzZWN0KEtsLHUpO3JldHVybiBpPT1LbC5sZW5ndGg/W3QueWVhcixLdShuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gbi8zMTUzNmU2fSksZSlbMl1dOmk/dFt1L0tsW2ktMV08S2xbaV0vdT9pLTE6aV06W3RjLEt1KG4sZSlbMl1dfXJldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdWEobi5pbnZlcnQodCkpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obi5kb21haW4odCkscik6bi5kb21haW4oKS5tYXAodWEpfSxyLm5pY2U9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiFpc05hTihlKSYmIW4ucmFuZ2UoZSx1YSgrZSsxKSx0KS5sZW5ndGh9dmFyIGk9ci5kb21haW4oKSxhPVl1KGkpLG89bnVsbD09bj91KGEsMTApOiJudW1iZXIiPT10eXBlb2YgbiYmdShhLG4pO3JldHVybiBvJiYobj1vWzBdLHQ9b1sxXSksci5kb21haW4oWHUoaSx0PjE/e2Zsb29yOmZ1bmN0aW9uKHQpe2Zvcig7ZSh0PW4uZmxvb3IodCkpOyl0PXVhKHQtMSk7cmV0dXJuIHR9LGNlaWw6ZnVuY3Rpb24odCl7Zm9yKDtlKHQ9bi5jZWlsKHQpKTspdD11YSgrdCsxKTtyZXR1cm4gdH19Om4pKX0sci50aWNrcz1mdW5jdGlvbihuLHQpe3ZhciBlPVl1KHIuZG9tYWluKCkpLGk9bnVsbD09bj91KGUsMTApOiJudW1iZXIiPT10eXBlb2Ygbj91KGUsbik6IW4ucmFuZ2UmJlt7cmFuZ2U6bn0sdF07cmV0dXJuIGkmJihuPWlbMF0sdD1pWzFdKSxuLnJhbmdlKGVbMF0sdWEoK2VbMV0rMSksMT50PzE6dCl9LHIudGlja0Zvcm1hdD1mdW5jdGlvbigpe3JldHVybiBlfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gcmEobi5jb3B5KCksdCxlKX0sSnUocixuKX1mdW5jdGlvbiB1YShuKXtyZXR1cm4gbmV3IERhdGUobil9ZnVuY3Rpb24gaWEobil7cmV0dXJuIEpTT04ucGFyc2Uobi5yZXNwb25zZVRleHQpfWZ1bmN0aW9uIGFhKG4pe3ZhciB0PXNhLmNyZWF0ZVJhbmdlKCk7cmV0dXJuIHQuc2VsZWN0Tm9kZShzYS5ib2R5KSx0LmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudChuLnJlc3BvbnNlVGV4dCl9dmFyIG9hPXt2ZXJzaW9uOiIzLjUuMTYifSxsYT1bXS5zbGljZSxjYT1mdW5jdGlvbihuKXtyZXR1cm4gbGEuY2FsbChuKX0sc2E9dGhpcy5kb2N1bWVudDtpZihzYSl0cnl7Y2Eoc2EuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlfWNhdGNoKGZhKXtjYT1mdW5jdGlvbihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1uZXcgQXJyYXkodCk7dC0tOyllW3RdPW5bdF07cmV0dXJuIGV9fWlmKERhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KSxzYSl0cnl7c2EuY3JlYXRlRWxlbWVudCgiRElWIikuc3R5bGUuc2V0UHJvcGVydHkoIm9wYWNpdHkiLDAsIiIpfWNhdGNoKGhhKXt2YXIgZ2E9dGhpcy5FbGVtZW50LnByb3RvdHlwZSxwYT1nYS5zZXRBdHRyaWJ1dGUsdmE9Z2Euc2V0QXR0cmlidXRlTlMsZGE9dGhpcy5DU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZSxtYT1kYS5zZXRQcm9wZXJ0eTtnYS5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24obix0KXtwYS5jYWxsKHRoaXMsbix0KyIiKX0sZ2Euc2V0QXR0cmlidXRlTlM9ZnVuY3Rpb24obix0LGUpe3ZhLmNhbGwodGhpcyxuLHQsZSsiIil9LGRhLnNldFByb3BlcnR5PWZ1bmN0aW9uKG4sdCxlKXttYS5jYWxsKHRoaXMsbix0KyIiLGUpfX1vYS5hc2NlbmRpbmc9ZSxvYS5kZXNjZW5kaW5nPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4+dD8tMTp0Pm4/MTp0Pj1uPzA6TmFOfSxvYS5taW49ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9blt1XSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmZT5yJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJmU+ciYmKGU9cil9cmV0dXJuIGV9LG9hLm1heD1mdW5jdGlvbihuLHQpe3ZhciBlLHIsdT0tMSxpPW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IoOysrdTxpOylpZihudWxsIT0ocj1uW3VdKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7Kyt1PGk7KW51bGwhPShyPW5bdV0pJiZyPmUmJihlPXIpfWVsc2V7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj5lJiYoZT1yKX1yZXR1cm4gZX0sb2EuZXh0ZW50PWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1LGk9LTEsYT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK2k8YTspaWYobnVsbCE9KHI9bltpXSkmJnI+PXIpe2U9dT1yO2JyZWFrfWZvcig7KytpPGE7KW51bGwhPShyPW5baV0pJiYoZT5yJiYoZT1yKSxyPnUmJih1PXIpKX1lbHNle2Zvcig7KytpPGE7KWlmKG51bGwhPShyPXQuY2FsbChuLG5baV0saSkpJiZyPj1yKXtlPXU9cjticmVha31mb3IoOysraTxhOyludWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9cmV0dXJuW2UsdV19LG9hLnN1bT1mdW5jdGlvbihuLHQpe3ZhciBlLHI9MCxpPW4ubGVuZ3RoLGE9LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2E8aTspdShlPStuW2FdKSYmKHIrPWUpO2Vsc2UgZm9yKDsrK2E8aTspdShlPSt0LmNhbGwobixuW2FdLGEpKSYmKHIrPWUpO3JldHVybiByfSxvYS5tZWFuPWZ1bmN0aW9uKG4sdCl7dmFyIGUsaT0wLGE9bi5sZW5ndGgsbz0tMSxsPWE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK288YTspdShlPXIobltvXSkpP2krPWU6LS1sO2Vsc2UgZm9yKDsrK288YTspdShlPXIodC5jYWxsKG4sbltvXSxvKSkpP2krPWU6LS1sO3JldHVybiBsP2kvbDp2b2lkIDB9LG9hLnF1YW50aWxlPWZ1bmN0aW9uKG4sdCl7dmFyIGU9KG4ubGVuZ3RoLTEpKnQrMSxyPU1hdGguZmxvb3IoZSksdT0rbltyLTFdLGk9ZS1yO3JldHVybiBpP3UraSoobltyXS11KTp1fSxvYS5tZWRpYW49ZnVuY3Rpb24obix0KXt2YXIgaSxhPVtdLG89bi5sZW5ndGgsbD0tMTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrbDxvOyl1KGk9cihuW2xdKSkmJmEucHVzaChpKTtlbHNlIGZvcig7KytsPG87KXUoaT1yKHQuY2FsbChuLG5bbF0sbCkpKSYmYS5wdXNoKGkpO3JldHVybiBhLmxlbmd0aD9vYS5xdWFudGlsZShhLnNvcnQoZSksLjUpOnZvaWQgMH0sb2EudmFyaWFuY2U9ZnVuY3Rpb24obix0KXt2YXIgZSxpLGE9bi5sZW5ndGgsbz0wLGw9MCxjPS0xLHM9MDtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrYzxhOyl1KGU9cihuW2NdKSkmJihpPWUtbyxvKz1pLysrcyxsKz1pKihlLW8pKTtlbHNlIGZvcig7KytjPGE7KXUoZT1yKHQuY2FsbChuLG5bY10sYykpKSYmKGk9ZS1vLG8rPWkvKytzLGwrPWkqKGUtbykpO3JldHVybiBzPjE/bC8ocy0xKTp2b2lkIDB9LG9hLmRldmlhdGlvbj1mdW5jdGlvbigpe3ZhciBuPW9hLnZhcmlhbmNlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbj9NYXRoLnNxcnQobik6bn07dmFyIHlhPWkoZSk7b2EuYmlzZWN0TGVmdD15YS5sZWZ0LG9hLmJpc2VjdD1vYS5iaXNlY3RSaWdodD15YS5yaWdodCxvYS5iaXNlY3Rvcj1mdW5jdGlvbihuKXtyZXR1cm4gaSgxPT09bi5sZW5ndGg/ZnVuY3Rpb24odCxyKXtyZXR1cm4gZShuKHQpLHIpfTpuKX0sb2Euc2h1ZmZsZT1mdW5jdGlvbihuLHQsZSl7KGk9YXJndW1lbnRzLmxlbmd0aCk8MyYmKGU9bi5sZW5ndGgsMj5pJiYodD0wKSk7Zm9yKHZhciByLHUsaT1lLXQ7aTspdT1NYXRoLnJhbmRvbSgpKmktLXwwLHI9bltpK3RdLG5baSt0XT1uW3UrdF0sblt1K3RdPXI7cmV0dXJuIG59LG9hLnBlcm11dGU9ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9dC5sZW5ndGgscj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPW5bdFtlXV07cmV0dXJuIHJ9LG9hLnBhaXJzPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlPTAscj1uLmxlbmd0aC0xLHU9blswXSxpPW5ldyBBcnJheSgwPnI/MDpyKTtyPmU7KWlbZV09W3Q9dSx1PW5bKytlXV07cmV0dXJuIGl9LG9hLnRyYW5zcG9zZT1mdW5jdGlvbihuKXtpZighKHU9bi5sZW5ndGgpKXJldHVybltdO2Zvcih2YXIgdD0tMSxlPW9hLm1pbihuLGEpLHI9bmV3IEFycmF5KGUpOysrdDxlOylmb3IodmFyIHUsaT0tMSxvPXJbdF09bmV3IEFycmF5KHUpOysraTx1OylvW2ldPW5baV1bdF07cmV0dXJuIHJ9LG9hLnppcD1mdW5jdGlvbigpe3JldHVybiBvYS50cmFuc3Bvc2UoYXJndW1lbnRzKX0sb2Eua2V5cz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2goZSk7cmV0dXJuIHR9LG9hLnZhbHVlcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2gobltlXSk7cmV0dXJuIHR9LG9hLmVudHJpZXM9ZnVuY3Rpb24obil7dmFyIHQ9W107Zm9yKHZhciBlIGluIG4pdC5wdXNoKHtrZXk6ZSx2YWx1ZTpuW2VdfSk7cmV0dXJuIHR9LG9hLm1lcmdlPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHIsdT1uLmxlbmd0aCxpPS0xLGE9MDsrK2k8dTspYSs9bltpXS5sZW5ndGg7Zm9yKGU9bmV3IEFycmF5KGEpOy0tdT49MDspZm9yKHI9blt1XSx0PXIubGVuZ3RoOy0tdD49MDspZVstLWFdPXJbdF07cmV0dXJuIGV9O3ZhciBNYT1NYXRoLmFicztvYS5yYW5nZT1mdW5jdGlvbihuLHQsZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwzJiYoZT0xLGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9bixuPTApKSwodC1uKS9lPT09MS8wKXRocm93IG5ldyBFcnJvcigiaW5maW5pdGUgcmFuZ2UiKTt2YXIgcix1PVtdLGk9byhNYShlKSksYT0tMTtpZihuKj1pLHQqPWksZSo9aSwwPmUpZm9yKDsocj1uK2UqKythKT50Oyl1LnB1c2goci9pKTtlbHNlIGZvcig7KHI9bitlKisrYSk8dDspdS5wdXNoKHIvaSk7cmV0dXJuIHV9LG9hLm1hcD1mdW5jdGlvbihuLHQpe3ZhciBlPW5ldyBjO2lmKG4gaW5zdGFuY2VvZiBjKW4uZm9yRWFjaChmdW5jdGlvbihuLHQpe2Uuc2V0KG4sdCl9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkobikpe3ZhciByLHU9LTEsaT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrdTxpOyllLnNldCh1LG5bdV0pO2Vsc2UgZm9yKDsrK3U8aTspZS5zZXQodC5jYWxsKG4scj1uW3VdLHUpLHIpfWVsc2UgZm9yKHZhciBhIGluIG4pZS5zZXQoYSxuW2FdKTtyZXR1cm4gZX07dmFyIHhhPSJfX3Byb3RvX18iLGJhPSJceDAwIjtsKGMse2hhczpoLGdldDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fW3MobildfSxzZXQ6ZnVuY3Rpb24obix0KXtyZXR1cm4gdGhpcy5fW3MobildPXR9LHJlbW92ZTpnLGtleXM6cCx2YWx1ZXM6ZnVuY3Rpb24oKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaCh0aGlzLl9bdF0pO3JldHVybiBufSxlbnRyaWVzOmZ1bmN0aW9uKCl7dmFyIG49W107Zm9yKHZhciB0IGluIHRoaXMuXyluLnB1c2goe2tleTpmKHQpLHZhbHVlOnRoaXMuX1t0XX0pO3JldHVybiBufSxzaXplOnYsZW1wdHk6ZCxmb3JFYWNoOmZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5jYWxsKHRoaXMsZih0KSx0aGlzLl9bdF0pfX0pLG9hLm5lc3Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQsYSxvKXtpZihvPj1pLmxlbmd0aClyZXR1cm4gcj9yLmNhbGwodSxhKTplP2Euc29ydChlKTphO2Zvcih2YXIgbCxzLGYsaCxnPS0xLHA9YS5sZW5ndGgsdj1pW28rK10sZD1uZXcgYzsrK2c8cDspKGg9ZC5nZXQobD12KHM9YVtnXSkpKT9oLnB1c2gocyk6ZC5zZXQobCxbc10pO3JldHVybiB0PyhzPXQoKSxmPWZ1bmN0aW9uKGUscil7cy5zZXQoZSxuKHQscixvKSl9KToocz17fSxmPWZ1bmN0aW9uKGUscil7c1tlXT1uKHQscixvKX0pLGQuZm9yRWFjaChmKSxzfWZ1bmN0aW9uIHQobixlKXtpZihlPj1pLmxlbmd0aClyZXR1cm4gbjt2YXIgcj1bXSx1PWFbZSsrXTtyZXR1cm4gbi5mb3JFYWNoKGZ1bmN0aW9uKG4sdSl7ci5wdXNoKHtrZXk6bix2YWx1ZXM6dCh1LGUpfSl9KSx1P3Iuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiB1KG4ua2V5LHQua2V5KX0pOnJ9dmFyIGUscix1PXt9LGk9W10sYT1bXTtyZXR1cm4gdS5tYXA9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbihlLHQsMCl9LHUuZW50cmllcz1mdW5jdGlvbihlKXtyZXR1cm4gdChuKG9hLm1hcCxlLDApLDApfSx1LmtleT1mdW5jdGlvbihuKXtyZXR1cm4gaS5wdXNoKG4pLHV9LHUuc29ydEtleXM9ZnVuY3Rpb24obil7cmV0dXJuIGFbaS5sZW5ndGgtMV09bix1fSx1LnNvcnRWYWx1ZXM9ZnVuY3Rpb24obil7cmV0dXJuIGU9bix1fSx1LnJvbGx1cD1mdW5jdGlvbihuKXtyZXR1cm4gcj1uLHV9LHV9LG9hLnNldD1mdW5jdGlvbihuKXt2YXIgdD1uZXcgbTtpZihuKWZvcih2YXIgZT0wLHI9bi5sZW5ndGg7cj5lOysrZSl0LmFkZChuW2VdKTtyZXR1cm4gdH0sbChtLHtoYXM6aCxhZGQ6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX1tzKG4rPSIiKV09ITAsbn0scmVtb3ZlOmcsdmFsdWVzOnAsc2l6ZTp2LGVtcHR5OmQsZm9yRWFjaDpmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gdGhpcy5fKW4uY2FsbCh0aGlzLGYodCkpfX0pLG9hLmJlaGF2aW9yPXt9LG9hLnJlYmluZD1mdW5jdGlvbihuLHQpe2Zvcih2YXIgZSxyPTEsdT1hcmd1bWVudHMubGVuZ3RoOysrcjx1OyluW2U9YXJndW1lbnRzW3JdXT1NKG4sdCx0W2VdKTtyZXR1cm4gbn07dmFyIF9hPVsid2Via2l0IiwibXMiLCJtb3oiLCJNb3oiLCJvIiwiTyJdO29hLmRpc3BhdGNoPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPW5ldyBfLHQ9LTEsZT1hcmd1bWVudHMubGVuZ3RoOysrdDxlOyluW2FyZ3VtZW50c1t0XV09dyhuKTtyZXR1cm4gbn0sXy5wcm90b3R5cGUub249ZnVuY3Rpb24obix0KXt2YXIgZT1uLmluZGV4T2YoIi4iKSxyPSIiO2lmKGU+PTAmJihyPW4uc2xpY2UoZSsxKSxuPW4uc2xpY2UoMCxlKSksbilyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP3RoaXNbbl0ub24ocik6dGhpc1tuXS5vbihyLHQpO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoKXtpZihudWxsPT10KWZvcihuIGluIHRoaXMpdGhpcy5oYXNPd25Qcm9wZXJ0eShuKSYmdGhpc1tuXS5vbihyLG51bGwpO3JldHVybiB0aGlzfX0sb2EuZXZlbnQ9bnVsbCxvYS5yZXF1b3RlPWZ1bmN0aW9uKG4pe3JldHVybiBuLnJlcGxhY2Uod2EsIlxcJCYiKX07dmFyIHdhPS9bXFxcXlwkXCpcK1w/XHxcW1xdXChcKVwuXHtcfV0vZyxTYT17fS5fX3Byb3RvX18/ZnVuY3Rpb24obix0KXtuLl9fcHJvdG9fXz10fTpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZSBpbiB0KW5bZV09dFtlXX0sa2E9ZnVuY3Rpb24obix0KXtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yKG4pfSxOYT1mdW5jdGlvbihuLHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3JBbGwobil9LEVhPWZ1bmN0aW9uKG4sdCl7dmFyIGU9bi5tYXRjaGVzfHxuW3gobiwibWF0Y2hlc1NlbGVjdG9yIildO3JldHVybihFYT1mdW5jdGlvbihuLHQpe3JldHVybiBlLmNhbGwobix0KX0pKG4sdCl9OyJmdW5jdGlvbiI9PXR5cGVvZiBTaXp6bGUmJihrYT1mdW5jdGlvbihuLHQpe3JldHVybiBTaXp6bGUobix0KVswXXx8bnVsbH0sTmE9U2l6emxlLEVhPVNpenpsZS5tYXRjaGVzU2VsZWN0b3IpLG9hLnNlbGVjdGlvbj1mdW5jdGlvbigpe3JldHVybiBvYS5zZWxlY3Qoc2EuZG9jdW1lbnRFbGVtZW50KX07dmFyIEFhPW9hLnNlbGVjdGlvbi5wcm90b3R5cGU9W107QWEuc2VsZWN0PWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1LGk9W107bj1BKG4pO2Zvcih2YXIgYT0tMSxvPXRoaXMubGVuZ3RoOysrYTxvOyl7aS5wdXNoKHQ9W10pLHQucGFyZW50Tm9kZT0ocj10aGlzW2FdKS5wYXJlbnROb2RlO2Zvcih2YXIgbD0tMSxjPXIubGVuZ3RoOysrbDxjOykodT1yW2xdKT8odC5wdXNoKGU9bi5jYWxsKHUsdS5fX2RhdGFfXyxsLGEpKSxlJiYiX19kYXRhX18iaW4gdSYmKGUuX19kYXRhX189dS5fX2RhdGFfXykpOnQucHVzaChudWxsKX1yZXR1cm4gRShpKX0sQWEuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0LGUscj1bXTtuPUMobik7Zm9yKHZhciB1PS0xLGk9dGhpcy5sZW5ndGg7Kyt1PGk7KWZvcih2YXIgYT10aGlzW3VdLG89LTEsbD1hLmxlbmd0aDsrK288bDspKGU9YVtvXSkmJihyLnB1c2godD1jYShuLmNhbGwoZSxlLl9fZGF0YV9fLG8sdSkpKSx0LnBhcmVudE5vZGU9ZSk7cmV0dXJuIEUocil9O3ZhciBDYT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsemE9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOkNhLHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIn07b2EubnM9e3ByZWZpeDp6YSxxdWFsaWZ5OmZ1bmN0aW9uKG4pe3ZhciB0PW4uaW5kZXhPZigiOiIpLGU9bjtyZXR1cm4gdD49MCYmInhtbG5zIiE9PShlPW4uc2xpY2UoMCx0KSkmJihuPW4uc2xpY2UodCsxKSksemEuaGFzT3duUHJvcGVydHkoZSk/e3NwYWNlOnphW2VdLGxvY2FsOm59Om59fSxBYS5hdHRyPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpO3JldHVybiBuPW9hLm5zLnF1YWxpZnkobiksbi5sb2NhbD9lLmdldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCk6ZS5nZXRBdHRyaWJ1dGUobil9Zm9yKHQgaW4gbil0aGlzLmVhY2goeih0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKHoobix0KSl9LEFhLmNsYXNzZWQ9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGU9dGhpcy5ub2RlKCkscj0obj1UKG4pKS5sZW5ndGgsdT0tMTtpZih0PWUuY2xhc3NMaXN0KXtmb3IoOysrdTxyOylpZighdC5jb250YWlucyhuW3VdKSlyZXR1cm4hMX1lbHNlIGZvcih0PWUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOysrdTxyOylpZighcShuW3VdKS50ZXN0KHQpKXJldHVybiExO3JldHVybiEwfWZvcih0IGluIG4pdGhpcy5lYWNoKFIodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaChSKG4sdCkpfSxBYS5zdHlsZT1mdW5jdGlvbihuLGUscil7dmFyIHU9YXJndW1lbnRzLmxlbmd0aDtpZigzPnUpe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj51JiYoZT0iIik7Zm9yKHIgaW4gbil0aGlzLmVhY2goUChyLG5bcl0sZSkpO3JldHVybiB0aGlzfWlmKDI+dSl7dmFyIGk9dGhpcy5ub2RlKCk7cmV0dXJuIHQoaSkuZ2V0Q29tcHV0ZWRTdHlsZShpLG51bGwpLmdldFByb3BlcnR5VmFsdWUobil9cj0iIn1yZXR1cm4gdGhpcy5lYWNoKFAobixlLHIpKX0sQWEucHJvcGVydHk9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gdGhpcy5ub2RlKClbbl07Zm9yKHQgaW4gbil0aGlzLmVhY2goVSh0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKFUobix0KSl9LEFhLnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT10PyIiOnR9Om51bGw9PW4/ZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PSIifTpmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9bn0pOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxBYS5odG1sPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PXQ/IiI6dH06bnVsbD09bj9mdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPSIifTpmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPW59KTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LEFhLmFwcGVuZD1mdW5jdGlvbihuKXtyZXR1cm4gbj1qKG4pLHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LEFhLmluc2VydD1mdW5jdGlvbihuLHQpe3JldHVybiBuPWoobiksdD1BKHQpLHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pfSxBYS5yZW1vdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKEYpfSxBYS5kYXRhPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuLGUpe3ZhciByLHUsaSxhPW4ubGVuZ3RoLGY9ZS5sZW5ndGgsaD1NYXRoLm1pbihhLGYpLGc9bmV3IEFycmF5KGYpLHA9bmV3IEFycmF5KGYpLHY9bmV3IEFycmF5KGEpO2lmKHQpe3ZhciBkLG09bmV3IGMseT1uZXcgQXJyYXkoYSk7Zm9yKHI9LTE7KytyPGE7KSh1PW5bcl0pJiYobS5oYXMoZD10LmNhbGwodSx1Ll9fZGF0YV9fLHIpKT92W3JdPXU6bS5zZXQoZCx1KSx5W3JdPWQpO2ZvcihyPS0xOysrcjxmOykodT1tLmdldChkPXQuY2FsbChlLGk9ZVtyXSxyKSkpP3UhPT0hMCYmKGdbcl09dSx1Ll9fZGF0YV9fPWkpOnBbcl09SChpKSxtLnNldChkLCEwKTtmb3Iocj0tMTsrK3I8YTspciBpbiB5JiZtLmdldCh5W3JdKSE9PSEwJiYodltyXT1uW3JdKX1lbHNle2ZvcihyPS0xOysrcjxoOyl1PW5bcl0saT1lW3JdLHU/KHUuX19kYXRhX189aSxnW3JdPXUpOnBbcl09SChpKTtmb3IoO2Y+cjsrK3IpcFtyXT1IKGVbcl0pO2Zvcig7YT5yOysrcil2W3JdPW5bcl19cC51cGRhdGU9ZyxwLnBhcmVudE5vZGU9Zy5wYXJlbnROb2RlPXYucGFyZW50Tm9kZT1uLnBhcmVudE5vZGUsby5wdXNoKHApLGwucHVzaChnKSxzLnB1c2godil9dmFyIHIsdSxpPS0xLGE9dGhpcy5sZW5ndGg7aWYoIWFyZ3VtZW50cy5sZW5ndGgpe2ZvcihuPW5ldyBBcnJheShhPShyPXRoaXNbMF0pLmxlbmd0aCk7KytpPGE7KSh1PXJbaV0pJiYobltpXT11Ll9fZGF0YV9fKTtyZXR1cm4gbn12YXIgbz1aKFtdKSxsPUUoW10pLHM9RShbXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pZm9yKDsrK2k8YTspZShyPXRoaXNbaV0sbi5jYWxsKHIsci5wYXJlbnROb2RlLl9fZGF0YV9fLGkpKTtlbHNlIGZvcig7KytpPGE7KWUocj10aGlzW2ldLG4pO3JldHVybiBsLmVudGVyPWZ1bmN0aW9uKCl7cmV0dXJuIG99LGwuZXhpdD1mdW5jdGlvbigpe3JldHVybiBzfSxsfSxBYS5kYXR1bT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsbik6dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iKX0sQWEuZmlsdGVyPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PVtdOyJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1PKG4pKTtmb3IodmFyIGk9MCxhPXRoaXMubGVuZ3RoO2E+aTtpKyspe3UucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9KGU9dGhpc1tpXSkucGFyZW50Tm9kZTtmb3IodmFyIG89MCxsPWUubGVuZ3RoO2w+bztvKyspKHI9ZVtvXSkmJm4uY2FsbChyLHIuX19kYXRhX18sbyxpKSYmdC5wdXNoKHIpfXJldHVybiBFKHUpfSxBYS5vcmRlcj1mdW5jdGlvbigpe2Zvcih2YXIgbj0tMSx0PXRoaXMubGVuZ3RoOysrbjx0Oylmb3IodmFyIGUscj10aGlzW25dLHU9ci5sZW5ndGgtMSxpPXJbdV07LS11Pj0wOykoZT1yW3VdKSYmKGkmJmkhPT1lLm5leHRTaWJsaW5nJiZpLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsaSksaT1lKTtyZXR1cm4gdGhpc30sQWEuc29ydD1mdW5jdGlvbihuKXtuPUkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2Zvcih2YXIgdD0tMSxlPXRoaXMubGVuZ3RoOysrdDxlOyl0aGlzW3RdLnNvcnQobik7cmV0dXJuIHRoaXMub3JkZXIoKX0sQWEuZWFjaD1mdW5jdGlvbihuKXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKHQsZSxyKXtuLmNhbGwodCx0Ll9fZGF0YV9fLGUscil9KX0sQWEuY2FsbD1mdW5jdGlvbihuKXt2YXIgdD1jYShhcmd1bWVudHMpO3JldHVybiBuLmFwcGx5KHRbMF09dGhpcyx0KSx0aGlzfSxBYS5lbXB0eT1mdW5jdGlvbigpe3JldHVybiF0aGlzLm5vZGUoKX0sQWEubm9kZT1mdW5jdGlvbigpe2Zvcih2YXIgbj0wLHQ9dGhpcy5sZW5ndGg7dD5uO24rKylmb3IodmFyIGU9dGhpc1tuXSxyPTAsdT1lLmxlbmd0aDt1PnI7cisrKXt2YXIgaT1lW3JdO2lmKGkpcmV0dXJuIGl9cmV0dXJuIG51bGx9LEFhLnNpemU9ZnVuY3Rpb24oKXt2YXIgbj0wO3JldHVybiBZKHRoaXMsZnVuY3Rpb24oKXsrK259KSxufTt2YXIgTGE9W107b2Euc2VsZWN0aW9uLmVudGVyPVosb2Euc2VsZWN0aW9uLmVudGVyLnByb3RvdHlwZT1MYSxMYS5hcHBlbmQ9QWEuYXBwZW5kLExhLmVtcHR5PUFhLmVtcHR5LExhLm5vZGU9QWEubm9kZSxMYS5jYWxsPUFhLmNhbGwsTGEuc2l6ZT1BYS5zaXplLExhLnNlbGVjdD1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHUsaSxhPVtdLG89LTEsbD10aGlzLmxlbmd0aDsrK288bDspe3I9KHU9dGhpc1tvXSkudXBkYXRlLGEucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9dS5wYXJlbnROb2RlO2Zvcih2YXIgYz0tMSxzPXUubGVuZ3RoOysrYzxzOykoaT11W2NdKT8odC5wdXNoKHJbY109ZT1uLmNhbGwodS5wYXJlbnROb2RlLGkuX19kYXRhX18sYyxvKSksZS5fX2RhdGFfXz1pLl9fZGF0YV9fKTp0LnB1c2gobnVsbCl9cmV0dXJuIEUoYSl9LExhLmluc2VydD1mdW5jdGlvbihuLHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PVYodGhpcykpLEFhLmluc2VydC5jYWxsKHRoaXMsbix0KX0sb2Euc2VsZWN0PWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8oZT1ba2EodCxzYSldLGUucGFyZW50Tm9kZT1zYS5kb2N1bWVudEVsZW1lbnQpOihlPVt0XSxlLnBhcmVudE5vZGU9bih0KSksRShbZV0pfSxvYS5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQ7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuPyh0PWNhKE5hKG4sc2EpKSx0LnBhcmVudE5vZGU9c2EuZG9jdW1lbnRFbGVtZW50KToodD1jYShuKSx0LnBhcmVudE5vZGU9bnVsbCksRShbdF0pfSxBYS5vbj1mdW5jdGlvbihuLHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDtpZigzPnIpe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj5yJiYodD0hMSk7Zm9yKGUgaW4gbil0aGlzLmVhY2goWChlLG5bZV0sdCkpO3JldHVybiB0aGlzfWlmKDI+cilyZXR1cm4ocj10aGlzLm5vZGUoKVsiX19vbiIrbl0pJiZyLl87ZT0hMX1yZXR1cm4gdGhpcy5lYWNoKFgobix0LGUpKX07dmFyIHFhPW9hLm1hcCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KTtzYSYmcWEuZm9yRWFjaChmdW5jdGlvbihuKXsib24iK24gaW4gc2EmJnFhLnJlbW92ZShuKX0pO3ZhciBUYSxSYT0wO29hLm1vdXNlPWZ1bmN0aW9uKG4pe3JldHVybiBKKG4saygpKX07dmFyIERhPXRoaXMubmF2aWdhdG9yJiYvV2ViS2l0Ly50ZXN0KHRoaXMubmF2aWdhdG9yLnVzZXJBZ2VudCk/LTE6MDtvYS50b3VjaD1mdW5jdGlvbihuLHQsZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwzJiYoZT10LHQ9aygpLmNoYW5nZWRUb3VjaGVzKSx0KWZvcih2YXIgcix1PTAsaT10Lmxlbmd0aDtpPnU7Kyt1KWlmKChyPXRbdV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBKKG4scil9LG9hLmJlaGF2aW9yLmRyYWc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dGhpcy5vbigibW91c2Vkb3duLmRyYWciLGkpLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLGEpfWZ1bmN0aW9uIGUobix0LGUsaSxhKXtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiBvKCl7dmFyIG4sZSxyPXQoaCx2KTtyJiYobj1yWzBdLU1bMF0sZT1yWzFdLU1bMV0scHw9bnxlLE09cixnKHt0eXBlOiJkcmFnIix4OnJbMF0rY1swXSx5OnJbMV0rY1sxXSxkeDpuLGR5OmV9KSl9ZnVuY3Rpb24gbCgpe3QoaCx2KSYmKG0ub24oaStkLG51bGwpLm9uKGErZCxudWxsKSx5KHApLGcoe3R5cGU6ImRyYWdlbmQifSkpfXZhciBjLHM9dGhpcyxmPW9hLmV2ZW50LnRhcmdldC5jb3JyZXNwb25kaW5nRWxlbWVudHx8b2EuZXZlbnQudGFyZ2V0LGg9cy5wYXJlbnROb2RlLGc9ci5vZihzLGFyZ3VtZW50cykscD0wLHY9bigpLGQ9Ii5kcmFnIisobnVsbD09dj8iIjoiLSIrdiksbT1vYS5zZWxlY3QoZShmKSkub24oaStkLG8pLm9uKGErZCxsKSx5PVcoZiksTT10KGgsdik7dT8oYz11LmFwcGx5KHMsYXJndW1lbnRzKSxjPVtjLngtTVswXSxjLnktTVsxXV0pOmM9WzAsMF0sZyh7dHlwZToiZHJhZ3N0YXJ0In0pfX12YXIgcj1OKG4sImRyYWciLCJkcmFnc3RhcnQiLCJkcmFnZW5kIiksdT1udWxsLGk9ZShiLG9hLm1vdXNlLHQsIm1vdXNlbW92ZSIsIm1vdXNldXAiKSxhPWUoRyxvYS50b3VjaCx5LCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIpO3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG9hLnJlYmluZChuLHIsIm9uIil9LG9hLnRvdWNoZXM9ZnVuY3Rpb24obix0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD1rKCkudG91Y2hlcyksdD9jYSh0KS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9SihuLHQpO3JldHVybiBlLmlkZW50aWZpZXI9dC5pZGVudGlmaWVyLGV9KTpbXX07dmFyIFBhPTFlLTYsVWE9UGEqUGEsamE9TWF0aC5QSSxGYT0yKmphLEhhPUZhLVBhLE9hPWphLzIsSWE9amEvMTgwLFlhPTE4MC9qYSxaYT1NYXRoLlNRUlQyLFZhPTIsWGE9NDtvYS5pbnRlcnBvbGF0ZVpvb209ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9blswXSxpPW5bMV0sYT1uWzJdLG89dFswXSxsPXRbMV0sYz10WzJdLHM9by11LGY9bC1pLGg9cypzK2YqZjtpZihVYT5oKXI9TWF0aC5sb2coYy9hKS9aYSxlPWZ1bmN0aW9uKG4pe3JldHVyblt1K24qcyxpK24qZixhKk1hdGguZXhwKFphKm4qcildfTtlbHNle3ZhciBnPU1hdGguc3FydChoKSxwPShjKmMtYSphK1hhKmgpLygyKmEqVmEqZyksdj0oYypjLWEqYS1YYSpoKS8oMipjKlZhKmcpLGQ9TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKSxtPU1hdGgubG9nKE1hdGguc3FydCh2KnYrMSktdik7cj0obS1kKS9aYSxlPWZ1bmN0aW9uKG4pe3ZhciB0PW4qcixlPXJuKGQpLG89YS8oVmEqZykqKGUqdW4oWmEqdCtkKS1lbihkKSk7cmV0dXJuW3UrbypzLGkrbypmLGEqZS9ybihaYSp0K2QpXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX0sb2EuYmVoYXZpb3Iuem9vbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7bi5vbihMLGYpLm9uKEJhKyIuem9vbSIsZykub24oImRibGNsaWNrLnpvb20iLHApLm9uKFIsaCl9ZnVuY3Rpb24gZShuKXtyZXR1cm5bKG5bMF0tay54KS9rLmssKG5bMV0tay55KS9rLmtdfWZ1bmN0aW9uIHIobil7cmV0dXJuW25bMF0qay5rK2sueCxuWzFdKmsuaytrLnldfWZ1bmN0aW9uIHUobil7ay5rPU1hdGgubWF4KEFbMF0sTWF0aC5taW4oQVsxXSxuKSl9ZnVuY3Rpb24gaShuLHQpe3Q9cih0KSxrLngrPW5bMF0tdFswXSxrLnkrPW5bMV0tdFsxXX1mdW5jdGlvbiBhKHQsZSxyLGEpe3QuX19jaGFydF9fPXt4OmsueCx5OmsueSxrOmsua30sdShNYXRoLnBvdygyLGEpKSxpKGQ9ZSxyKSx0PW9hLnNlbGVjdCh0KSxDPjAmJih0PXQudHJhbnNpdGlvbigpLmR1cmF0aW9uKEMpKSx0LmNhbGwobi5ldmVudCl9ZnVuY3Rpb24gbygpe2ImJmIuZG9tYWluKHgucmFuZ2UoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4tay54KS9rLmt9KS5tYXAoeC5pbnZlcnQpKSx3JiZ3LmRvbWFpbihfLnJhbmdlKCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLWsueSkvay5rfSkubWFwKF8uaW52ZXJ0KSl9ZnVuY3Rpb24gbChuKXt6Kyt8fG4oe3R5cGU6Inpvb21zdGFydCJ9KX1mdW5jdGlvbiBjKG4pe28oKSxuKHt0eXBlOiJ6b29tIixzY2FsZTprLmssdHJhbnNsYXRlOltrLngsay55XX0pfWZ1bmN0aW9uIHMobil7LS16fHwobih7dHlwZToiem9vbWVuZCJ9KSxkPW51bGwpfWZ1bmN0aW9uIGYoKXtmdW5jdGlvbiBuKCl7bz0xLGkob2EubW91c2UodSksaCksYyhhKX1mdW5jdGlvbiByKCl7Zi5vbihxLG51bGwpLm9uKFQsbnVsbCksZyhvKSxzKGEpfXZhciB1PXRoaXMsYT1ELm9mKHUsYXJndW1lbnRzKSxvPTAsZj1vYS5zZWxlY3QodCh1KSkub24ocSxuKS5vbihULHIpLGg9ZShvYS5tb3VzZSh1KSksZz1XKHUpO0lsLmNhbGwodSksbChhKX1mdW5jdGlvbiBoKCl7ZnVuY3Rpb24gbigpe3ZhciBuPW9hLnRvdWNoZXMocCk7cmV0dXJuIGc9ay5rLG4uZm9yRWFjaChmdW5jdGlvbihuKXtuLmlkZW50aWZpZXIgaW4gZCYmKGRbbi5pZGVudGlmaWVyXT1lKG4pKX0pLG59ZnVuY3Rpb24gdCgpe3ZhciB0PW9hLmV2ZW50LnRhcmdldDtvYS5zZWxlY3QodCkub24oeCxyKS5vbihiLG8pLF8ucHVzaCh0KTtmb3IodmFyIGU9b2EuZXZlbnQuY2hhbmdlZFRvdWNoZXMsdT0wLGk9ZS5sZW5ndGg7aT51OysrdSlkW2VbdV0uaWRlbnRpZmllcl09bnVsbDt2YXIgbD1uKCksYz1EYXRlLm5vdygpO2lmKDE9PT1sLmxlbmd0aCl7aWYoNTAwPmMtTSl7dmFyIHM9bFswXTthKHAscyxkW3MuaWRlbnRpZmllcl0sTWF0aC5mbG9vcihNYXRoLmxvZyhrLmspL01hdGguTE4yKSsxKSxTKCl9TT1jfWVsc2UgaWYobC5sZW5ndGg+MSl7dmFyIHM9bFswXSxmPWxbMV0saD1zWzBdLWZbMF0sZz1zWzFdLWZbMV07bT1oKmgrZypnfX1mdW5jdGlvbiByKCl7dmFyIG4sdCxlLHIsYT1vYS50b3VjaGVzKHApO0lsLmNhbGwocCk7Zm9yKHZhciBvPTAsbD1hLmxlbmd0aDtsPm87KytvLHI9bnVsbClpZihlPWFbb10scj1kW2UuaWRlbnRpZmllcl0pe2lmKHQpYnJlYWs7bj1lLHQ9cn1pZihyKXt2YXIgcz0ocz1lWzBdLW5bMF0pKnMrKHM9ZVsxXS1uWzFdKSpzLGY9bSYmTWF0aC5zcXJ0KHMvbSk7bj1bKG5bMF0rZVswXSkvMiwoblsxXStlWzFdKS8yXSx0PVsodFswXStyWzBdKS8yLCh0WzFdK3JbMV0pLzJdLHUoZipnKX1NPW51bGwsaShuLHQpLGModil9ZnVuY3Rpb24gbygpe2lmKG9hLmV2ZW50LnRvdWNoZXMubGVuZ3RoKXtmb3IodmFyIHQ9b2EuZXZlbnQuY2hhbmdlZFRvdWNoZXMsZT0wLHI9dC5sZW5ndGg7cj5lOysrZSlkZWxldGUgZFt0W2VdLmlkZW50aWZpZXJdO2Zvcih2YXIgdSBpbiBkKXJldHVybiB2b2lkIG4oKX1vYS5zZWxlY3RBbGwoXykub24oeSxudWxsKSx3Lm9uKEwsZikub24oUixoKSxOKCkscyh2KX12YXIgZyxwPXRoaXMsdj1ELm9mKHAsYXJndW1lbnRzKSxkPXt9LG09MCx5PSIuem9vbS0iK29hLmV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIseD0idG91Y2htb3ZlIit5LGI9InRvdWNoZW5kIit5LF89W10sdz1vYS5zZWxlY3QocCksTj1XKHApO3QoKSxsKHYpLHcub24oTCxudWxsKS5vbihSLHQpfWZ1bmN0aW9uIGcoKXt2YXIgbj1ELm9mKHRoaXMsYXJndW1lbnRzKTt5P2NsZWFyVGltZW91dCh5KTooSWwuY2FsbCh0aGlzKSx2PWUoZD1tfHxvYS5tb3VzZSh0aGlzKSksbChuKSkseT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eT1udWxsLHMobil9LDUwKSxTKCksdShNYXRoLnBvdygyLC4wMDIqJGEoKSkqay5rKSxpKGQsdiksYyhuKX1mdW5jdGlvbiBwKCl7dmFyIG49b2EubW91c2UodGhpcyksdD1NYXRoLmxvZyhrLmspL01hdGguTE4yO2EodGhpcyxuLGUobiksb2EuZXZlbnQuc2hpZnRLZXk/TWF0aC5jZWlsKHQpLTE6TWF0aC5mbG9vcih0KSsxKX12YXIgdixkLG0seSxNLHgsYixfLHcsaz17eDowLHk6MCxrOjF9LEU9Wzk2MCw1MDBdLEE9V2EsQz0yNTAsej0wLEw9Im1vdXNlZG93bi56b29tIixxPSJtb3VzZW1vdmUuem9vbSIsVD0ibW91c2V1cC56b29tIixSPSJ0b3VjaHN0YXJ0Lnpvb20iLEQ9TihuLCJ6b29tc3RhcnQiLCJ6b29tIiwiem9vbWVuZCIpO3JldHVybiBCYXx8KEJhPSJvbndoZWVsImluIHNhPygkYT1mdW5jdGlvbigpe3JldHVybi1vYS5ldmVudC5kZWx0YVkqKG9hLmV2ZW50LmRlbHRhTW9kZT8xMjA6MSl9LCJ3aGVlbCIpOiJvbm1vdXNld2hlZWwiaW4gc2E/KCRhPWZ1bmN0aW9uKCl7cmV0dXJuIG9hLmV2ZW50LndoZWVsRGVsdGF9LCJtb3VzZXdoZWVsIik6KCRhPWZ1bmN0aW9uKCl7cmV0dXJuLW9hLmV2ZW50LmRldGFpbH0sIk1vek1vdXNlUGl4ZWxTY3JvbGwiKSksbi5ldmVudD1mdW5jdGlvbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1ELm9mKHRoaXMsYXJndW1lbnRzKSx0PWs7SGw/b2Euc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC56b29tIixmdW5jdGlvbigpe2s9dGhpcy5fX2NoYXJ0X198fHt4OjAseTowLGs6MX0sbChuKX0pLnR3ZWVuKCJ6b29tOnpvb20iLGZ1bmN0aW9uKCl7dmFyIGU9RVswXSxyPUVbMV0sdT1kP2RbMF06ZS8yLGk9ZD9kWzFdOnIvMixhPW9hLmludGVycG9sYXRlWm9vbShbKHUtay54KS9rLmssKGktay55KS9rLmssZS9rLmtdLFsodS10LngpL3QuaywoaS10LnkpL3QuayxlL3Qua10pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj1hKHQpLG89ZS9yWzJdO3RoaXMuX19jaGFydF9fPWs9e3g6dS1yWzBdKm8seTppLXJbMV0qbyxrOm99LGMobil9fSkuZWFjaCgiaW50ZXJydXB0Lnpvb20iLGZ1bmN0aW9uKCl7cyhuKX0pLmVhY2goImVuZC56b29tIixmdW5jdGlvbigpe3Mobil9KToodGhpcy5fX2NoYXJ0X189ayxsKG4pLGMobikscyhuKSl9KX0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGs9e3g6K3RbMF0seTordFsxXSxrOmsua30sbygpLG4pOltrLngsay55XX0sbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDprLngseTprLnksazpudWxsfSx1KCt0KSxvKCksbik6ay5rfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhBPW51bGw9PXQ/V2E6Wyt0WzBdLCt0WzFdXSxuKTpBfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT10JiZbK3RbMF0sK3RbMV1dLG4pOm19LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT10JiZbK3RbMF0sK3RbMV1dLG4pOkV9LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEM9K3Qsbik6Q30sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPXQseD10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6Yn0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PXQsXz10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6d30sb2EucmViaW5kKG4sRCwib24iKX07dmFyICRhLEJhLFdhPVswLDEvMF07b2EuY29sb3I9b24sb24ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9LG9hLmhzbD1sbjt2YXIgSmE9bG4ucHJvdG90eXBlPW5ldyBvbjtKYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IGxuKHRoaXMuaCx0aGlzLnMsdGhpcy5sL24pfSxKYS5kYXJrZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyBsbih0aGlzLmgsdGhpcy5zLG4qdGhpcy5sKX0sSmEucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGNuKHRoaXMuaCx0aGlzLnMsdGhpcy5sKX0sb2EuaGNsPXNuO3ZhciBHYT1zbi5wcm90b3R5cGU9bmV3IG9uO0dhLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgc24odGhpcy5oLHRoaXMuYyxNYXRoLm1pbigxMDAsdGhpcy5sK0thKihhcmd1bWVudHMubGVuZ3RoP246MSkpKX0sR2EuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgc24odGhpcy5oLHRoaXMuYyxNYXRoLm1heCgwLHRoaXMubC1LYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LEdhLnJnYj1mdW5jdGlvbigpe3JldHVybiBmbih0aGlzLmgsdGhpcy5jLHRoaXMubCkucmdiKCl9LG9hLmxhYj1objt2YXIgS2E9MTgsUWE9Ljk1MDQ3LG5vPTEsdG89MS4wODg4Myxlbz1obi5wcm90b3R5cGU9bmV3IG9uO2VvLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgaG4oTWF0aC5taW4oMTAwLHRoaXMubCtLYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSx0aGlzLmEsdGhpcy5iKX0sZW8uZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgaG4oTWF0aC5tYXgoMCx0aGlzLmwtS2EqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LGVvLnJnYj1mdW5jdGlvbigpe3JldHVybiBnbih0aGlzLmwsdGhpcy5hLHRoaXMuYil9LG9hLnJnYj15bjt2YXIgcm89eW4ucHJvdG90eXBlPW5ldyBvbjtyby5icmlnaHRlcj1mdW5jdGlvbihuKXtuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKTt2YXIgdD10aGlzLnIsZT10aGlzLmcscj10aGlzLmIsdT0zMDtyZXR1cm4gdHx8ZXx8cj8odCYmdT50JiYodD11KSxlJiZ1PmUmJihlPXUpLHImJnU+ciYmKHI9dSksbmV3IHluKE1hdGgubWluKDI1NSx0L24pLE1hdGgubWluKDI1NSxlL24pLE1hdGgubWluKDI1NSxyL24pKSk6bmV3IHluKHUsdSx1KX0scm8uZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgeW4obip0aGlzLnIsbip0aGlzLmcsbip0aGlzLmIpfSxyby5oc2w9ZnVuY3Rpb24oKXtyZXR1cm4gd24odGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxyby50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIjIitibih0aGlzLnIpK2JuKHRoaXMuZykrYm4odGhpcy5iKX07dmFyIHVvPW9hLm1hcCh7YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSk7dW8uZm9yRWFjaChmdW5jdGlvbihuLHQpe3VvLnNldChuLE1uKHQpKX0pLG9hLmZ1bmN0b3I9RW4sb2EueGhyPUFuKHkpLG9hLmRzdj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlLGkpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGk9ZSxlPW51bGwpO3ZhciBhPUNuKG4sdCxudWxsPT1lP3I6dShlKSxpKTtyZXR1cm4gYS5yb3c9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/YS5yZXNwb25zZShudWxsPT0oZT1uKT9yOnUobikpOmV9LGF9ZnVuY3Rpb24gcihuKXtyZXR1cm4gZS5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gdShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUucGFyc2UodC5yZXNwb25zZVRleHQsbil9fWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQubWFwKGEpLmpvaW4obil9ZnVuY3Rpb24gYShuKXtyZXR1cm4gby50ZXN0KG4pPyciJytuLnJlcGxhY2UoL1wiL2csJyIiJykrJyInOm59dmFyIG89bmV3IFJlZ0V4cCgnWyInK24rIlxuXSIpLGw9bi5jaGFyQ29kZUF0KDApO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4sdCl7dmFyIHI7cmV0dXJuIGUucGFyc2VSb3dzKG4sZnVuY3Rpb24obixlKXtpZihyKXJldHVybiByKG4sZS0xKTt2YXIgdT1uZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobikrIjogZFsiK3QrIl0ifSkuam9pbigiLCIpKyJ9Iik7cj10P2Z1bmN0aW9uKG4sZSl7cmV0dXJuIHQodShuKSxlKX06dX0pfSxlLnBhcnNlUm93cz1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXtpZihzPj1jKXJldHVybiBhO2lmKHUpcmV0dXJuIHU9ITEsaTt2YXIgdD1zO2lmKDM0PT09bi5jaGFyQ29kZUF0KHQpKXtmb3IodmFyIGU9dDtlKys8YzspaWYoMzQ9PT1uLmNoYXJDb2RlQXQoZSkpe2lmKDM0IT09bi5jaGFyQ29kZUF0KGUrMSkpYnJlYWs7KytlfXM9ZSsyO3ZhciByPW4uY2hhckNvZGVBdChlKzEpO3JldHVybiAxMz09PXI/KHU9ITAsMTA9PT1uLmNoYXJDb2RlQXQoZSsyKSYmKytzKToxMD09PXImJih1PSEwKSxuLnNsaWNlKHQrMSxlKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDtjPnM7KXt2YXIgcj1uLmNoYXJDb2RlQXQocysrKSxvPTE7aWYoMTA9PT1yKXU9ITA7ZWxzZSBpZigxMz09PXIpdT0hMCwxMD09PW4uY2hhckNvZGVBdChzKSYmKCsrcywrK28pO2Vsc2UgaWYociE9PWwpY29udGludWU7cmV0dXJuIG4uc2xpY2UodCxzLW8pfXJldHVybiBuLnNsaWNlKHQpfWZvcih2YXIgcix1LGk9e30sYT17fSxvPVtdLGM9bi5sZW5ndGgscz0wLGY9MDsocj1lKCkpIT09YTspe2Zvcih2YXIgaD1bXTtyIT09aSYmciE9PWE7KWgucHVzaChyKSxyPWUoKTt0JiZudWxsPT0oaD10KGgsZisrKSl8fG8ucHVzaChoKX1yZXR1cm4gb30sZS5mb3JtYXQ9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0WzBdKSlyZXR1cm4gZS5mb3JtYXRSb3dzKHQpO3ZhciByPW5ldyBtLHU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gbilyLmhhcyh0KXx8dS5wdXNoKHIuYWRkKHQpKX0pLFt1Lm1hcChhKS5qb2luKG4pXS5jb25jYXQodC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHUubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBhKHRbbl0pfSkuam9pbihuKX0pKS5qb2luKCJcbiIpfSxlLmZvcm1hdFJvd3M9ZnVuY3Rpb24obil7cmV0dXJuIG4ubWFwKGkpLmpvaW4oIlxuIil9LGV9LG9hLmNzdj1vYS5kc3YoIiwiLCJ0ZXh0L2NzdiIpLG9hLnRzdj1vYS5kc3YoIgkiLCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIik7dmFyIGlvLGFvLG9vLGxvLGNvPXRoaXNbeCh0aGlzLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKV18fGZ1bmN0aW9uKG4pe3NldFRpbWVvdXQobiwxNyl9O29hLnRpbWVyPWZ1bmN0aW9uKCl7cW4uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvYS50aW1lci5mbHVzaD1mdW5jdGlvbigpe1JuKCksRG4oKX0sb2Eucm91bmQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gdD9NYXRoLnJvdW5kKG4qKHQ9TWF0aC5wb3coMTAsdCkpKS90Ok1hdGgucm91bmQobil9O3ZhciBzbz1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIlx4YjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXS5tYXAoVW4pO29hLmZvcm1hdFByZWZpeD1mdW5jdGlvbihuLHQpe3ZhciBlPTA7cmV0dXJuKG49K24pJiYoMD5uJiYobio9LTEpLHQmJihuPW9hLnJvdW5kKG4sUG4obix0KSkpLGU9MStNYXRoLmZsb29yKDFlLTEyK01hdGgubG9nKG4pL01hdGguTE4xMCksZT1NYXRoLm1heCgtMjQsTWF0aC5taW4oMjQsMypNYXRoLmZsb29yKChlLTEpLzMpKSkpLHNvWzgrZS8zXX07dmFyIGZvPS8oPzooW157XSk/KFs8Pj1eXSkpPyhbK1wtIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLi0/XGQrKT8oW2EteiVdKT8vaSxobz1vYS5tYXAoe2I6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24obil7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobil9LG86ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoOCl9LHg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpfSxYOmZ1bmN0aW9uKG4pe3JldHVybiBuLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSxnOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4udG9QcmVjaXNpb24odCl9LGU6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0V4cG9uZW50aWFsKHQpfSxmOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4udG9GaXhlZCh0KX0scjpmdW5jdGlvbihuLHQpe3JldHVybihuPW9hLnJvdW5kKG4sUG4obix0KSkpLnRvRml4ZWQoTWF0aC5tYXgoMCxNYXRoLm1pbigyMCxQbihuKigxKzFlLTE1KSx0KSkpKX19KSxnbz1vYS50aW1lPXt9LHBvPURhdGU7SG4ucHJvdG90eXBlPXtnZXREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXRlKCl9LGdldERheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDRGF5KCl9LGdldEZ1bGxZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENGdWxsWWVhcigpfSxnZXRIb3VyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDSG91cnMoKX0sZ2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaWxsaXNlY29uZHMoKX0sZ2V0TWludXRlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTWludXRlcygpfSxnZXRNb250aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTW9udGgoKX0sZ2V0U2Vjb25kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDU2Vjb25kcygpfSxnZXRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRUaW1lKCl9LGdldFRpbWV6b25lT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLnZhbHVlT2YoKX0sc2V0RGF0ZTpmdW5jdGlvbigpe3ZvLnNldFVUQ0RhdGUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldERheTpmdW5jdGlvbigpe3ZvLnNldFVUQ0RheS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RnVsbFllYXI6ZnVuY3Rpb24oKXt2by5zZXRVVENGdWxsWWVhci5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0SG91cnM6ZnVuY3Rpb24oKXt2by5zZXRVVENIb3Vycy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7dm8uc2V0VVRDTWlsbGlzZWNvbmRzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaW51dGVzOmZ1bmN0aW9uKCl7dm8uc2V0VVRDTWludXRlcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TW9udGg6ZnVuY3Rpb24oKXt2by5zZXRVVENNb250aC5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0U2Vjb25kczpmdW5jdGlvbigpe3ZvLnNldFVUQ1NlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldFRpbWU6ZnVuY3Rpb24oKXt2by5zZXRUaW1lLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfX07dmFyIHZvPURhdGUucHJvdG90eXBlO2dvLnllYXI9T24oZnVuY3Rpb24obil7cmV0dXJuIG49Z28uZGF5KG4pLG4uc2V0TW9udGgoMCwxKSxufSxmdW5jdGlvbihuLHQpe24uc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpK3QpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRGdWxsWWVhcigpfSksZ28ueWVhcnM9Z28ueWVhci5yYW5nZSxnby55ZWFycy51dGM9Z28ueWVhci51dGMucmFuZ2UsZ28uZGF5PU9uKGZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBwbygyZTMsMCk7cmV0dXJuIHQuc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSxuLmdldERhdGUoKSksdH0sZnVuY3Rpb24obix0KXtuLnNldERhdGUobi5nZXREYXRlKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERhdGUoKS0xfSksZ28uZGF5cz1nby5kYXkucmFuZ2UsZ28uZGF5cy51dGM9Z28uZGF5LnV0Yy5yYW5nZSxnby5kYXlPZlllYXI9ZnVuY3Rpb24obil7dmFyIHQ9Z28ueWVhcihuKTtyZXR1cm4gTWF0aC5mbG9vcigobi10LTZlNCoobi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkpLzg2NGU1KX0sWyJzdW5kYXkiLCJtb25kYXkiLCJ0dWVzZGF5Iiwid2VkbmVzZGF5IiwidGh1cnNkYXkiLCJmcmlkYXkiLCJzYXR1cmRheSJdLmZvckVhY2goZnVuY3Rpb24obix0KXt0PTctdDt2YXIgZT1nb1tuXT1PbihmdW5jdGlvbihuKXtyZXR1cm4obj1nby5kYXkobikpLnNldERhdGUobi5nZXREYXRlKCktKG4uZ2V0RGF5KCkrdCklNyksbn0sZnVuY3Rpb24obix0KXtuLnNldERhdGUobi5nZXREYXRlKCkrNypNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7dmFyIGU9Z28ueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoZ28uZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpLShlIT09dCl9KTtnb1tuKyJzIl09ZS5yYW5nZSxnb1tuKyJzIl0udXRjPWUudXRjLnJhbmdlLGdvW24rIk9mWWVhciJdPWZ1bmN0aW9uKG4pe3ZhciBlPWdvLnllYXIobikuZ2V0RGF5KCk7cmV0dXJuIE1hdGguZmxvb3IoKGdvLmRheU9mWWVhcihuKSsoZSt0KSU3KS83KX19KSxnby53ZWVrPWdvLnN1bmRheSxnby53ZWVrcz1nby5zdW5kYXkucmFuZ2UsZ28ud2Vla3MudXRjPWdvLnN1bmRheS51dGMucmFuZ2UsZ28ud2Vla09mWWVhcj1nby5zdW5kYXlPZlllYXI7dmFyIG1vPXsiLSI6IiIsXzoiICIsMDoiMCJ9LHlvPS9eXHMqXGQrLyxNbz0vXiUvO29hLmxvY2FsZT1mdW5jdGlvbihuKXtyZXR1cm57bnVtYmVyRm9ybWF0OmpuKG4pLHRpbWVGb3JtYXQ6WW4obil9fTt2YXIgeG89b2EubG9jYWxlKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXSxkYXRlVGltZToiJWEgJWIgJWUgJVggJVkiLGRhdGU6IiVtLyVkLyVZIix0aW1lOiIlSDolTTolUyIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSwKc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sbW9udGhzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydE1vbnRoczpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdfSk7b2EuZm9ybWF0PXhvLm51bWJlckZvcm1hdCxvYS5nZW89e30sc3QucHJvdG90eXBlPXtzOjAsdDowLGFkZDpmdW5jdGlvbihuKXtmdChuLHRoaXMudCxibyksZnQoYm8ucyx0aGlzLnMsdGhpcyksdGhpcy5zP3RoaXMudCs9Ym8udDp0aGlzLnM9Ym8udH0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIGJvPW5ldyBzdDtvYS5nZW8uc3RyZWFtPWZ1bmN0aW9uKG4sdCl7biYmX28uaGFzT3duUHJvcGVydHkobi50eXBlKT9fb1tuLnR5cGVdKG4sdCk6aHQobix0KX07dmFyIF9vPXtGZWF0dXJlOmZ1bmN0aW9uKG4sdCl7aHQobi5nZW9tZXRyeSx0KX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5mZWF0dXJlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KWh0KGVbcl0uZ2VvbWV0cnksdCl9fSx3bz17U3BoZXJlOmZ1bmN0aW9uKG4sdCl7dC5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24obix0KXtuPW4uY29vcmRpbmF0ZXMsdC5wb2ludChuWzBdLG5bMV0sblsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KW49ZVtyXSx0LnBvaW50KG5bMF0sblsxXSxuWzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbihuLHQpe2d0KG4uY29vcmRpbmF0ZXMsdCwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylndChlW3JdLHQsMCl9LFBvbHlnb246ZnVuY3Rpb24obix0KXtwdChuLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KXB0KGVbcl0sdCl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmdlb21ldHJpZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylodChlW3JdLHQpfX07b2EuZ2VvLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIFNvPTAsb2EuZ2VvLnN0cmVhbShuLE5vKSxTb307dmFyIFNvLGtvPW5ldyBzdCxObz17c3BoZXJlOmZ1bmN0aW9uKCl7U28rPTQqamF9LHBvaW50OmIsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2tvLnJlc2V0KCksTm8ubGluZVN0YXJ0PXZ0fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIG49MiprbztTbys9MD5uPzQqamErbjpuLE5vLmxpbmVTdGFydD1Oby5saW5lRW5kPU5vLnBvaW50PWJ9fTtvYS5nZW8uYm91bmRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe00ucHVzaCh4PVtzPW4saD1uXSksZj50JiYoZj10KSx0PmcmJihnPXQpfWZ1bmN0aW9uIHQodCxlKXt2YXIgcj1kdChbdCpJYSxlKklhXSk7aWYobSl7dmFyIHU9eXQobSxyKSxpPVt1WzFdLC11WzBdLDBdLGE9eXQoaSx1KTtidChhKSxhPV90KGEpO3ZhciBsPXQtcCxjPWw+MD8xOi0xLHY9YVswXSpZYSpjLGQ9TWEobCk+MTgwO2lmKGReKHY+YypwJiZjKnQ+dikpe3ZhciB5PWFbMV0qWWE7eT5nJiYoZz15KX1lbHNlIGlmKHY9KHYrMzYwKSUzNjAtMTgwLGReKHY+YypwJiZjKnQ+dikpe3ZhciB5PS1hWzFdKllhO2Y+eSYmKGY9eSl9ZWxzZSBmPmUmJihmPWUpLGU+ZyYmKGc9ZSk7ZD9wPnQ/byhzLHQpPm8ocyxoKSYmKGg9dCk6byh0LGgpPm8ocyxoKSYmKHM9dCk6aD49cz8ocz50JiYocz10KSx0PmgmJihoPXQpKTp0PnA/byhzLHQpPm8ocyxoKSYmKGg9dCk6byh0LGgpPm8ocyxoKSYmKHM9dCl9ZWxzZSBuKHQsZSk7bT1yLHA9dH1mdW5jdGlvbiBlKCl7Yi5wb2ludD10fWZ1bmN0aW9uIHIoKXt4WzBdPXMseFsxXT1oLGIucG9pbnQ9bixtPW51bGx9ZnVuY3Rpb24gdShuLGUpe2lmKG0pe3ZhciByPW4tcDt5Kz1NYShyKT4xODA/cisocj4wPzM2MDotMzYwKTpyfWVsc2Ugdj1uLGQ9ZTtOby5wb2ludChuLGUpLHQobixlKX1mdW5jdGlvbiBpKCl7Tm8ubGluZVN0YXJ0KCl9ZnVuY3Rpb24gYSgpe3UodixkKSxOby5saW5lRW5kKCksTWEoeSk+UGEmJihzPS0oaD0xODApKSx4WzBdPXMseFsxXT1oLG09bnVsbH1mdW5jdGlvbiBvKG4sdCl7cmV0dXJuKHQtPW4pPDA/dCszNjA6dH1mdW5jdGlvbiBsKG4sdCl7cmV0dXJuIG5bMF0tdFswXX1mdW5jdGlvbiBjKG4sdCl7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgcyxmLGgsZyxwLHYsZCxtLHksTSx4LGI9e3BvaW50Om4sbGluZVN0YXJ0OmUsbGluZUVuZDpyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2IucG9pbnQ9dSxiLmxpbmVTdGFydD1pLGIubGluZUVuZD1hLHk9MCxOby5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe05vLnBvbHlnb25FbmQoKSxiLnBvaW50PW4sYi5saW5lU3RhcnQ9ZSxiLmxpbmVFbmQ9ciwwPmtvPyhzPS0oaD0xODApLGY9LShnPTkwKSk6eT5QYT9nPTkwOi1QYT55JiYoZj0tOTApLHhbMF09cyx4WzFdPWh9fTtyZXR1cm4gZnVuY3Rpb24obil7Zz1oPS0ocz1mPTEvMCksTT1bXSxvYS5nZW8uc3RyZWFtKG4sYik7dmFyIHQ9TS5sZW5ndGg7aWYodCl7TS5zb3J0KGwpO2Zvcih2YXIgZSxyPTEsdT1NWzBdLGk9W3VdO3Q+cjsrK3IpZT1NW3JdLGMoZVswXSx1KXx8YyhlWzFdLHUpPyhvKHVbMF0sZVsxXSk+byh1WzBdLHVbMV0pJiYodVsxXT1lWzFdKSxvKGVbMF0sdVsxXSk+byh1WzBdLHVbMV0pJiYodVswXT1lWzBdKSk6aS5wdXNoKHU9ZSk7Zm9yKHZhciBhLGUscD0tKDEvMCksdD1pLmxlbmd0aC0xLHI9MCx1PWlbdF07dD49cjt1PWUsKytyKWU9aVtyXSwoYT1vKHVbMV0sZVswXSkpPnAmJihwPWEscz1lWzBdLGg9dVsxXSl9cmV0dXJuIE09eD1udWxsLHM9PT0xLzB8fGY9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbcyxmXSxbaCxnXV19fSgpLG9hLmdlby5jZW50cm9pZD1mdW5jdGlvbihuKXtFbz1Bbz1Dbz16bz1Mbz1xbz1Ubz1Sbz1Ebz1Qbz1Vbz0wLG9hLmdlby5zdHJlYW0obixqbyk7dmFyIHQ9RG8sZT1QbyxyPVVvLHU9dCp0K2UqZStyKnI7cmV0dXJuIFVhPnUmJih0PXFvLGU9VG8scj1SbyxQYT5BbyYmKHQ9Q28sZT16byxyPUxvKSx1PXQqdCtlKmUrcipyLFVhPnUpP1tOYU4sTmFOXTpbTWF0aC5hdGFuMihlLHQpKllhLHRuKHIvTWF0aC5zcXJ0KHUpKSpZYV19O3ZhciBFbyxBbyxDbyx6byxMbyxxbyxUbyxSbyxEbyxQbyxVbyxqbz17c3BoZXJlOmIscG9pbnQ6U3QsbGluZVN0YXJ0Ok50LGxpbmVFbmQ6RXQscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7am8ubGluZVN0YXJ0PUF0fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7am8ubGluZVN0YXJ0PU50fX0sRm89UnQoenQsanQsSHQsWy1qYSwtamEvMl0pLEhvPTFlOTtvYS5nZW8uY2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciBuLHQsZSxyLHUsaSxhPXtzdHJlYW06ZnVuY3Rpb24obil7cmV0dXJuIHUmJih1LnZhbGlkPSExKSx1PWkobiksdS52YWxpZD0hMCx1fSxleHRlbnQ6ZnVuY3Rpb24obyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9WnQobj0rb1swXVswXSx0PStvWzBdWzFdLGU9K29bMV1bMF0scj0rb1sxXVsxXSksdSYmKHUudmFsaWQ9ITEsdT1udWxsKSxhKTpbW24sdF0sW2Uscl1dfX07cmV0dXJuIGEuZXh0ZW50KFtbMCwwXSxbOTYwLDUwMF1dKX0sKG9hLmdlby5jb25pY0VxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiBWdChYdCl9KS5yYXc9WHQsb2EuZ2VvLmFsYmVycz1mdW5jdGlvbigpe3JldHVybiBvYS5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKX0sb2EuZ2VvLmFsYmVyc1VzYT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7dmFyIGk9blswXSxhPW5bMV07cmV0dXJuIHQ9bnVsbCxlKGksYSksdHx8KHIoaSxhKSx0KXx8dShpLGEpLHR9dmFyIHQsZSxyLHUsaT1vYS5nZW8uYWxiZXJzKCksYT1vYS5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLG89b2EuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGw9e3BvaW50OmZ1bmN0aW9uKG4sZSl7dD1bbixlXX19O3JldHVybiBuLmludmVydD1mdW5jdGlvbihuKXt2YXIgdD1pLnNjYWxlKCksZT1pLnRyYW5zbGF0ZSgpLHI9KG5bMF0tZVswXSkvdCx1PShuWzFdLWVbMV0pL3Q7cmV0dXJuKHU+PS4xMiYmLjIzND51JiZyPj0tLjQyNSYmLS4yMTQ+cj9hOnU+PS4xNjYmJi4yMzQ+dSYmcj49LS4yMTQmJi0uMTE1PnI/bzppKS5pbnZlcnQobil9LG4uc3RyZWFtPWZ1bmN0aW9uKG4pe3ZhciB0PWkuc3RyZWFtKG4pLGU9YS5zdHJlYW0obikscj1vLnN0cmVhbShuKTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obix1KXt0LnBvaW50KG4sdSksZS5wb2ludChuLHUpLHIucG9pbnQobix1KX0sc3BoZXJlOmZ1bmN0aW9uKCl7dC5zcGhlcmUoKSxlLnNwaGVyZSgpLHIuc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksZS5saW5lU3RhcnQoKSxyLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dC5saW5lRW5kKCksZS5saW5lRW5kKCksci5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3QucG9seWdvblN0YXJ0KCksZS5wb2x5Z29uU3RhcnQoKSxyLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCksZS5wb2x5Z29uRW5kKCksci5wb2x5Z29uRW5kKCl9fX0sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkucHJlY2lzaW9uKHQpLGEucHJlY2lzaW9uKHQpLG8ucHJlY2lzaW9uKHQpLG4pOmkucHJlY2lzaW9uKCl9LG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkuc2NhbGUodCksYS5zY2FsZSguMzUqdCksby5zY2FsZSh0KSxuLnRyYW5zbGF0ZShpLnRyYW5zbGF0ZSgpKSk6aS5zY2FsZSgpfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gaS50cmFuc2xhdGUoKTt2YXIgYz1pLnNjYWxlKCkscz0rdFswXSxmPSt0WzFdO3JldHVybiBlPWkudHJhbnNsYXRlKHQpLmNsaXBFeHRlbnQoW1tzLS40NTUqYyxmLS4yMzgqY10sW3MrLjQ1NSpjLGYrLjIzOCpjXV0pLnN0cmVhbShsKS5wb2ludCxyPWEudHJhbnNsYXRlKFtzLS4zMDcqYyxmKy4yMDEqY10pLmNsaXBFeHRlbnQoW1tzLS40MjUqYytQYSxmKy4xMipjK1BhXSxbcy0uMjE0KmMtUGEsZisuMjM0KmMtUGFdXSkuc3RyZWFtKGwpLnBvaW50LHU9by50cmFuc2xhdGUoW3MtLjIwNSpjLGYrLjIxMipjXSkuY2xpcEV4dGVudChbW3MtLjIxNCpjK1BhLGYrLjE2NipjK1BhXSxbcy0uMTE1KmMtUGEsZisuMjM0KmMtUGFdXSkuc3RyZWFtKGwpLnBvaW50LG59LG4uc2NhbGUoMTA3MCl9O3ZhciBPbyxJbyxZbyxabyxWbyxYbywkbz17cG9pbnQ6YixsaW5lU3RhcnQ6YixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7SW89MCwkby5saW5lU3RhcnQ9JHR9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXskby5saW5lU3RhcnQ9JG8ubGluZUVuZD0kby5wb2ludD1iLE9vKz1NYShJby8yKX19LEJvPXtwb2ludDpCdCxsaW5lU3RhcnQ6YixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmIscG9seWdvbkVuZDpifSxXbz17cG9pbnQ6R3QsbGluZVN0YXJ0Okt0LGxpbmVFbmQ6UXQscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7V28ubGluZVN0YXJ0PW5lfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7V28ucG9pbnQ9R3QsV28ubGluZVN0YXJ0PUt0LFdvLmxpbmVFbmQ9UXR9fTtvYS5nZW8ucGF0aD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIG4mJigiZnVuY3Rpb24iPT10eXBlb2YgbyYmaS5wb2ludFJhZGl1cygrby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGEmJmEudmFsaWR8fChhPXUoaSkpLG9hLmdlby5zdHJlYW0obixhKSksaS5yZXN1bHQoKX1mdW5jdGlvbiB0KCl7cmV0dXJuIGE9bnVsbCxufXZhciBlLHIsdSxpLGEsbz00LjU7cmV0dXJuIG4uYXJlYT1mdW5jdGlvbihuKXtyZXR1cm4gT289MCxvYS5nZW8uc3RyZWFtKG4sdSgkbykpLE9vfSxuLmNlbnRyb2lkPWZ1bmN0aW9uKG4pe3JldHVybiBDbz16bz1Mbz1xbz1Ubz1Sbz1Ebz1Qbz1Vbz0wLG9hLmdlby5zdHJlYW0obix1KFdvKSksVW8/W0RvL1VvLFBvL1VvXTpSbz9bcW8vUm8sVG8vUm9dOkxvP1tDby9Mbyx6by9Mb106W05hTixOYU5dfSxuLmJvdW5kcz1mdW5jdGlvbihuKXtyZXR1cm4gVm89WG89LShZbz1abz0xLzApLG9hLmdlby5zdHJlYW0obix1KEJvKSksW1tZbyxab10sW1ZvLFhvXV19LG4ucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0oZT1uKT9uLnN0cmVhbXx8cmUobik6eSx0KCkpOmV9LG4uY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT0ocj1uKT9uZXcgV3Q6bmV3IHRlKG4pLCJmdW5jdGlvbiIhPXR5cGVvZiBvJiZpLnBvaW50UmFkaXVzKG8pLHQoKSk6cn0sbi5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OihpLnBvaW50UmFkaXVzKCt0KSwrdCksbik6b30sbi5wcm9qZWN0aW9uKG9hLmdlby5hbGJlcnNVc2EoKSkuY29udGV4dChudWxsKX0sb2EuZ2VvLnRyYW5zZm9ybT1mdW5jdGlvbihuKXtyZXR1cm57c3RyZWFtOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyB1ZSh0KTtmb3IodmFyIHIgaW4gbillW3JdPW5bcl07cmV0dXJuIGV9fX0sdWUucHJvdG90eXBlPXtwb2ludDpmdW5jdGlvbihuLHQpe3RoaXMuc3RyZWFtLnBvaW50KG4sdCl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fSxvYS5nZW8ucHJvamVjdGlvbj1hZSxvYS5nZW8ucHJvamVjdGlvbk11dGF0b3I9b2UsKG9hLmdlby5lcXVpcmVjdGFuZ3VsYXI9ZnVuY3Rpb24oKXtyZXR1cm4gYWUoY2UpfSkucmF3PWNlLmludmVydD1jZSxvYS5nZW8ucm90YXRpb249ZnVuY3Rpb24obil7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdD1uKHRbMF0qSWEsdFsxXSpJYSksdFswXSo9WWEsdFsxXSo9WWEsdH1yZXR1cm4gbj1mZShuWzBdJTM2MCpJYSxuWzFdKklhLG4ubGVuZ3RoPjI/blsyXSpJYTowKSx0LmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdD1uLmludmVydCh0WzBdKklhLHRbMV0qSWEpLHRbMF0qPVlhLHRbMV0qPVlhLHR9LHR9LHNlLmludmVydD1jZSxvYS5nZW8uY2lyY2xlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOnIsdD1mZSgtblswXSpJYSwtblsxXSpJYSwwKS5pbnZlcnQsdT1bXTtyZXR1cm4gZShudWxsLG51bGwsMSx7cG9pbnQ6ZnVuY3Rpb24obixlKXt1LnB1c2gobj10KG4sZSkpLG5bMF0qPVlhLG5bMV0qPVlhfX0pLHt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbdV19fXZhciB0LGUscj1bMCwwXSx1PTY7cmV0dXJuIG4ub3JpZ2luPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi5hbmdsZT1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT12ZSgodD0rcikqSWEsdSpJYSksbik6dH0sbi5wcmVjaXNpb249ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dmUodCpJYSwodT0rcikqSWEpLG4pOnV9LG4uYW5nbGUoOTApfSxvYS5nZW8uZGlzdGFuY2U9ZnVuY3Rpb24obix0KXt2YXIgZSxyPSh0WzBdLW5bMF0pKklhLHU9blsxXSpJYSxpPXRbMV0qSWEsYT1NYXRoLnNpbihyKSxvPU1hdGguY29zKHIpLGw9TWF0aC5zaW4odSksYz1NYXRoLmNvcyh1KSxzPU1hdGguc2luKGkpLGY9TWF0aC5jb3MoaSk7cmV0dXJuIE1hdGguYXRhbjIoTWF0aC5zcXJ0KChlPWYqYSkqZSsoZT1jKnMtbCpmKm8pKmUpLGwqcytjKmYqbyl9LG9hLmdlby5ncmF0aWN1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dCgpfX1mdW5jdGlvbiB0KCl7cmV0dXJuIG9hLnJhbmdlKE1hdGguY2VpbChpL2QpKmQsdSxkKS5tYXAoaCkuY29uY2F0KG9hLnJhbmdlKE1hdGguY2VpbChjL20pKm0sbCxtKS5tYXAoZykpLmNvbmNhdChvYS5yYW5nZShNYXRoLmNlaWwoci9wKSpwLGUscCkuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBNYShuJWQpPlBhfSkubWFwKHMpKS5jb25jYXQob2EucmFuZ2UoTWF0aC5jZWlsKG8vdikqdixhLHYpLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gTWEobiVtKT5QYX0pLm1hcChmKSl9dmFyIGUscix1LGksYSxvLGwsYyxzLGYsaCxnLHA9MTAsdj1wLGQ9OTAsbT0zNjAseT0yLjU7cmV0dXJuIG4ubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6bn19KX0sbi5vdXRsaW5lPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltoKGkpLmNvbmNhdChnKGwpLnNsaWNlKDEpLGgodSkucmV2ZXJzZSgpLnNsaWNlKDEpLGcoYykucmV2ZXJzZSgpLnNsaWNlKDEpKV19fSxuLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uLm1ham9yRXh0ZW50KHQpLm1pbm9yRXh0ZW50KHQpOm4ubWlub3JFeHRlbnQoKX0sbi5tYWpvckV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdFswXVswXSx1PSt0WzFdWzBdLGM9K3RbMF1bMV0sbD0rdFsxXVsxXSxpPnUmJih0PWksaT11LHU9dCksYz5sJiYodD1jLGM9bCxsPXQpLG4ucHJlY2lzaW9uKHkpKTpbW2ksY10sW3UsbF1dfSxuLm1pbm9yRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sbz0rdFswXVsxXSxhPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSxvPmEmJih0PW8sbz1hLGE9dCksbi5wcmVjaXNpb24oeSkpOltbcixvXSxbZSxhXV19LG4uc3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uLm1ham9yU3RlcCh0KS5taW5vclN0ZXAodCk6bi5taW5vclN0ZXAoKX0sbi5tYWpvclN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9K3RbMF0sbT0rdFsxXSxuKTpbZCxtXX0sbi5taW5vclN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9K3RbMF0sdj0rdFsxXSxuKTpbcCx2XX0sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K3Qscz1tZShvLGEsOTApLGY9eWUocixlLHkpLGg9bWUoYyxsLDkwKSxnPXllKGksdSx5KSxuKTp5fSxuLm1ham9yRXh0ZW50KFtbLTE4MCwtOTArUGFdLFsxODAsOTAtUGFdXSkubWlub3JFeHRlbnQoW1stMTgwLC04MC1QYV0sWzE4MCw4MCtQYV1dKX0sb2EuZ2VvLmdyZWF0QXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpbdHx8ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZXx8dS5hcHBseSh0aGlzLGFyZ3VtZW50cyldfX12YXIgdCxlLHI9TWUsdT14ZTtyZXR1cm4gbi5kaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiBvYS5nZW8uZGlzdGFuY2UodHx8ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZXx8dS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxuLnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/bnVsbDplLG4pOnJ9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsZT0iZnVuY3Rpb24iPT10eXBlb2YgdD9udWxsOnQsbik6dX0sbi5wcmVjaXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uOjB9LG59LG9hLmdlby5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuLHQpe3JldHVybiBiZShuWzBdKklhLG5bMV0qSWEsdFswXSpJYSx0WzFdKklhKX0sb2EuZ2VvLmxlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gSm89MCxvYS5nZW8uc3RyZWFtKG4sR28pLEpvfTt2YXIgSm8sR289e3NwaGVyZTpiLHBvaW50OmIsbGluZVN0YXJ0Ol9lLGxpbmVFbmQ6Yixwb2x5Z29uU3RhcnQ6Yixwb2x5Z29uRW5kOmJ9LEtvPXdlKGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnNxcnQoMi8oMStuKSl9LGZ1bmN0aW9uKG4pe3JldHVybiAyKk1hdGguYXNpbihuLzIpfSk7KG9hLmdlby5hemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gYWUoS28pfSkucmF3PUtvO3ZhciBRbz13ZShmdW5jdGlvbihuKXt2YXIgdD1NYXRoLmFjb3Mobik7cmV0dXJuIHQmJnQvTWF0aC5zaW4odCl9LHkpOyhvYS5nZW8uYXppbXV0aGFsRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gYWUoUW8pfSkucmF3PVFvLChvYS5nZW8uY29uaWNDb25mb3JtYWw9ZnVuY3Rpb24oKXtyZXR1cm4gVnQoU2UpfSkucmF3PVNlLChvYS5nZW8uY29uaWNFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiBWdChrZSl9KS5yYXc9a2U7dmFyIG5sPXdlKGZ1bmN0aW9uKG4pe3JldHVybiAxL259LE1hdGguYXRhbik7KG9hLmdlby5nbm9tb25pYz1mdW5jdGlvbigpe3JldHVybiBhZShubCl9KS5yYXc9bmwsTmUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuW24sMipNYXRoLmF0YW4oTWF0aC5leHAodCkpLU9hXX0sKG9hLmdlby5tZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBFZShOZSl9KS5yYXc9TmU7dmFyIHRsPXdlKGZ1bmN0aW9uKCl7cmV0dXJuIDF9LE1hdGguYXNpbik7KG9hLmdlby5vcnRob2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gYWUodGwpfSkucmF3PXRsO3ZhciBlbD13ZShmdW5jdGlvbihuKXtyZXR1cm4gMS8oMStuKX0sZnVuY3Rpb24obil7cmV0dXJuIDIqTWF0aC5hdGFuKG4pfSk7KG9hLmdlby5zdGVyZW9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIGFlKGVsKX0pLnJhdz1lbCxBZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm5bLXQsMipNYXRoLmF0YW4oTWF0aC5leHAobikpLU9hXX0sKG9hLmdlby50cmFuc3ZlcnNlTWVyY2F0b3I9ZnVuY3Rpb24oKXt2YXIgbj1FZShBZSksdD1uLmNlbnRlcixlPW4ucm90YXRlO3JldHVybiBuLmNlbnRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj90KFstblsxXSxuWzBdXSk6KG49dCgpLFtuWzFdLC1uWzBdXSl9LG4ucm90YXRlPWZ1bmN0aW9uKG4pe3JldHVybiBuP2UoW25bMF0sblsxXSxuLmxlbmd0aD4yP25bMl0rOTA6OTBdKToobj1lKCksW25bMF0sblsxXSxuWzJdLTkwXSl9LGUoWzAsMCw5MF0pfSkucmF3PUFlLG9hLmdlb209e30sb2EuZ2VvbS5odWxsPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQobil7aWYobi5sZW5ndGg8MylyZXR1cm5bXTt2YXIgdCx1PUVuKGUpLGk9RW4ociksYT1uLmxlbmd0aCxvPVtdLGw9W107Zm9yKHQ9MDthPnQ7dCsrKW8ucHVzaChbK3UuY2FsbCh0aGlzLG5bdF0sdCksK2kuY2FsbCh0aGlzLG5bdF0sdCksdF0pO2ZvcihvLnNvcnQocWUpLHQ9MDthPnQ7dCsrKWwucHVzaChbb1t0XVswXSwtb1t0XVsxXV0pO3ZhciBjPUxlKG8pLHM9TGUobCksZj1zWzBdPT09Y1swXSxoPXNbcy5sZW5ndGgtMV09PT1jW2MubGVuZ3RoLTFdLGc9W107Zm9yKHQ9Yy5sZW5ndGgtMTt0Pj0wOy0tdClnLnB1c2gobltvW2NbdF1dWzJdXSk7Zm9yKHQ9K2Y7dDxzLmxlbmd0aC1oOysrdClnLnB1c2gobltvW3NbdF1dWzJdXSk7cmV0dXJuIGd9dmFyIGU9Q2Uscj16ZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90KG4pOih0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0KX0sb2EuZ2VvbS5wb2x5Z29uPWZ1bmN0aW9uKG4pe3JldHVybiBTYShuLHJsKSxufTt2YXIgcmw9b2EuZ2VvbS5wb2x5Z29uLnByb3RvdHlwZT1bXTtybC5hcmVhPWZ1bmN0aW9uKCl7Zm9yKHZhciBuLHQ9LTEsZT10aGlzLmxlbmd0aCxyPXRoaXNbZS0xXSx1PTA7Kyt0PGU7KW49cixyPXRoaXNbdF0sdSs9blsxXSpyWzBdLW5bMF0qclsxXTtyZXR1cm4uNSp1fSxybC5jZW50cm9pZD1mdW5jdGlvbihuKXt2YXIgdCxlLHI9LTEsdT10aGlzLmxlbmd0aCxpPTAsYT0wLG89dGhpc1t1LTFdO2Zvcihhcmd1bWVudHMubGVuZ3RofHwobj0tMS8oNip0aGlzLmFyZWEoKSkpOysrcjx1Oyl0PW8sbz10aGlzW3JdLGU9dFswXSpvWzFdLW9bMF0qdFsxXSxpKz0odFswXStvWzBdKSplLGErPSh0WzFdK29bMV0pKmU7cmV0dXJuW2kqbixhKm5dfSxybC5jbGlwPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHIsdSxpLGEsbz1EZShuKSxsPS0xLGM9dGhpcy5sZW5ndGgtRGUodGhpcykscz10aGlzW2MtMV07KytsPGM7KXtmb3IodD1uLnNsaWNlKCksbi5sZW5ndGg9MCx1PXRoaXNbbF0saT10WyhyPXQubGVuZ3RoLW8pLTFdLGU9LTE7KytlPHI7KWE9dFtlXSxUZShhLHMsdSk/KFRlKGkscyx1KXx8bi5wdXNoKFJlKGksYSxzLHUpKSxuLnB1c2goYSkpOlRlKGkscyx1KSYmbi5wdXNoKFJlKGksYSxzLHUpKSxpPWE7byYmbi5wdXNoKG5bMF0pLHM9dX1yZXR1cm4gbn07dmFyIHVsLGlsLGFsLG9sLGxsLGNsPVtdLHNsPVtdO1llLnByb3RvdHlwZS5wcmVwYXJlPWZ1bmN0aW9uKCl7Zm9yKHZhciBuLHQ9dGhpcy5lZGdlcyxlPXQubGVuZ3RoO2UtLTspbj10W2VdLmVkZ2Usbi5iJiZuLmF8fHQuc3BsaWNlKGUsMSk7cmV0dXJuIHQuc29ydChWZSksdC5sZW5ndGh9LHRyLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmE6dGhpcy5lZGdlLmJ9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2UubD09PXRoaXMuc2l0ZT90aGlzLmVkZ2UuYjp0aGlzLmVkZ2UuYX19LGVyLnByb3RvdHlwZT17aW5zZXJ0OmZ1bmN0aW9uKG4sdCl7dmFyIGUscix1O2lmKG4pe2lmKHQuUD1uLHQuTj1uLk4sbi5OJiYobi5OLlA9dCksbi5OPXQsbi5SKXtmb3Iobj1uLlI7bi5MOyluPW4uTDtuLkw9dH1lbHNlIG4uUj10O2U9bn1lbHNlIHRoaXMuXz8obj1hcih0aGlzLl8pLHQuUD1udWxsLHQuTj1uLG4uUD1uLkw9dCxlPW4pOih0LlA9dC5OPW51bGwsdGhpcy5fPXQsZT1udWxsKTtmb3IodC5MPXQuUj1udWxsLHQuVT1lLHQuQz0hMCxuPXQ7ZSYmZS5DOylyPWUuVSxlPT09ci5MPyh1PXIuUix1JiZ1LkM/KGUuQz11LkM9ITEsci5DPSEwLG49cik6KG49PT1lLlImJih1cih0aGlzLGUpLG49ZSxlPW4uVSksZS5DPSExLHIuQz0hMCxpcih0aGlzLHIpKSk6KHU9ci5MLHUmJnUuQz8oZS5DPXUuQz0hMSxyLkM9ITAsbj1yKToobj09PWUuTCYmKGlyKHRoaXMsZSksbj1lLGU9bi5VKSxlLkM9ITEsci5DPSEwLHVyKHRoaXMscikpKSxlPW4uVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKG4pe24uTiYmKG4uTi5QPW4uUCksbi5QJiYobi5QLk49bi5OKSxuLk49bi5QPW51bGw7dmFyIHQsZSxyLHU9bi5VLGk9bi5MLGE9bi5SO2lmKGU9aT9hP2FyKGEpOmk6YSx1P3UuTD09PW4/dS5MPWU6dS5SPWU6dGhpcy5fPWUsaSYmYT8ocj1lLkMsZS5DPW4uQyxlLkw9aSxpLlU9ZSxlIT09YT8odT1lLlUsZS5VPW4uVSxuPWUuUix1Lkw9bixlLlI9YSxhLlU9ZSk6KGUuVT11LHU9ZSxuPWUuUikpOihyPW4uQyxuPWUpLG4mJihuLlU9dSksIXIpe2lmKG4mJm4uQylyZXR1cm4gdm9pZChuLkM9ITEpO2Rve2lmKG49PT10aGlzLl8pYnJlYWs7aWYobj09PXUuTCl7aWYodD11LlIsdC5DJiYodC5DPSExLHUuQz0hMCx1cih0aGlzLHUpLHQ9dS5SKSx0LkwmJnQuTC5DfHx0LlImJnQuUi5DKXt0LlImJnQuUi5DfHwodC5MLkM9ITEsdC5DPSEwLGlyKHRoaXMsdCksdD11LlIpLHQuQz11LkMsdS5DPXQuUi5DPSExLHVyKHRoaXMsdSksbj10aGlzLl87YnJlYWt9fWVsc2UgaWYodD11LkwsdC5DJiYodC5DPSExLHUuQz0hMCxpcih0aGlzLHUpLHQ9dS5MKSx0LkwmJnQuTC5DfHx0LlImJnQuUi5DKXt0LkwmJnQuTC5DfHwodC5SLkM9ITEsdC5DPSEwLHVyKHRoaXMsdCksdD11LkwpLHQuQz11LkMsdS5DPXQuTC5DPSExLGlyKHRoaXMsdSksbj10aGlzLl87YnJlYWt9dC5DPSEwLG49dSx1PXUuVX13aGlsZSghbi5DKTtuJiYobi5DPSExKX19fSxvYS5nZW9tLnZvcm9ub2k9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdChuKXt2YXIgdD1uZXcgQXJyYXkobi5sZW5ndGgpLHI9b1swXVswXSx1PW9bMF1bMV0saT1vWzFdWzBdLGE9b1sxXVsxXTtyZXR1cm4gb3IoZShuKSxvKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUsbyl7dmFyIGw9ZS5lZGdlcyxjPWUuc2l0ZSxzPXRbb109bC5sZW5ndGg/bC5tYXAoZnVuY3Rpb24obil7dmFyIHQ9bi5zdGFydCgpO3JldHVyblt0LngsdC55XX0pOmMueD49ciYmYy54PD1pJiZjLnk+PXUmJmMueTw9YT9bW3IsYV0sW2ksYV0sW2ksdV0sW3IsdV1dOltdO3MucG9pbnQ9bltvXX0pLHR9ZnVuY3Rpb24gZShuKXtyZXR1cm4gbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm57eDpNYXRoLnJvdW5kKGkobix0KS9QYSkqUGEseTpNYXRoLnJvdW5kKGEobix0KS9QYSkqUGEsaTp0fX0pfXZhciByPUNlLHU9emUsaT1yLGE9dSxvPWZsO3JldHVybiBuP3Qobik6KHQubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIG9yKGUobikpLmVkZ2VzLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gbi5sJiZuLnJ9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTpuW3QubC5pXSx0YXJnZXQ6blt0LnIuaV19fSl9LHQudHJpYW5nbGVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO3JldHVybiBvcihlKG4pKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUscil7Zm9yKHZhciB1LGksYT1lLnNpdGUsbz1lLmVkZ2VzLnNvcnQoVmUpLGw9LTEsYz1vLmxlbmd0aCxzPW9bYy0xXS5lZGdlLGY9cy5sPT09YT9zLnI6cy5sOysrbDxjOyl1PXMsaT1mLHM9b1tsXS5lZGdlLGY9cy5sPT09YT9zLnI6cy5sLHI8aS5pJiZyPGYuaSYmY3IoYSxpLGYpPDAmJnQucHVzaChbbltyXSxuW2kuaV0sbltmLmldXSl9KSx0fSx0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9RW4ocj1uKSx0KTpyfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9RW4odT1uKSx0KTp1fSx0LmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09bj9mbDpuLHQpOm89PT1mbD9udWxsOm99LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90LmNsaXBFeHRlbnQobiYmW1swLDBdLG5dKTpvPT09Zmw/bnVsbDpvJiZvWzFdfSx0KX07dmFyIGZsPVtbLTFlNiwtMWU2XSxbMWU2LDFlNl1dO29hLmdlb20uZGVsYXVuYXk9ZnVuY3Rpb24obil7cmV0dXJuIG9hLmdlb20udm9yb25vaSgpLnRyaWFuZ2xlcyhuKX0sb2EuZ2VvbS5xdWFkdHJlZT1mdW5jdGlvbihuLHQsZSxyLHUpe2Z1bmN0aW9uIGkobil7ZnVuY3Rpb24gaShuLHQsZSxyLHUsaSxhLG8pe2lmKCFpc05hTihlKSYmIWlzTmFOKHIpKWlmKG4ubGVhZil7dmFyIGw9bi54LHM9bi55O2lmKG51bGwhPWwpaWYoTWEobC1lKStNYShzLXIpPC4wMSljKG4sdCxlLHIsdSxpLGEsbyk7ZWxzZXt2YXIgZj1uLnBvaW50O24ueD1uLnk9bi5wb2ludD1udWxsLGMobixmLGwscyx1LGksYSxvKSxjKG4sdCxlLHIsdSxpLGEsbyl9ZWxzZSBuLng9ZSxuLnk9cixuLnBvaW50PXR9ZWxzZSBjKG4sdCxlLHIsdSxpLGEsbyl9ZnVuY3Rpb24gYyhuLHQsZSxyLHUsYSxvLGwpe3ZhciBjPS41Kih1K28pLHM9LjUqKGErbCksZj1lPj1jLGg9cj49cyxnPWg8PDF8ZjtuLmxlYWY9ITEsbj1uLm5vZGVzW2ddfHwobi5ub2Rlc1tnXT1ocigpKSxmP3U9YzpvPWMsaD9hPXM6bD1zLGkobix0LGUscix1LGEsbyxsKX12YXIgcyxmLGgsZyxwLHYsZCxtLHksTT1FbihvKSx4PUVuKGwpO2lmKG51bGwhPXQpdj10LGQ9ZSxtPXIseT11O2Vsc2UgaWYobT15PS0odj1kPTEvMCksZj1bXSxoPVtdLHA9bi5sZW5ndGgsYSlmb3IoZz0wO3A+ZzsrK2cpcz1uW2ddLHMueDx2JiYodj1zLngpLHMueTxkJiYoZD1zLnkpLHMueD5tJiYobT1zLngpLHMueT55JiYoeT1zLnkpLGYucHVzaChzLngpLGgucHVzaChzLnkpO2Vsc2UgZm9yKGc9MDtwPmc7KytnKXt2YXIgYj0rTShzPW5bZ10sZyksXz0reChzLGcpO3Y+YiYmKHY9YiksZD5fJiYoZD1fKSxiPm0mJihtPWIpLF8+eSYmKHk9XyksZi5wdXNoKGIpLGgucHVzaChfKX12YXIgdz1tLXYsUz15LWQ7dz5TP3k9ZCt3Om09ditTO3ZhciBrPWhyKCk7aWYoay5hZGQ9ZnVuY3Rpb24obil7aShrLG4sK00obiwrK2cpLCt4KG4sZyksdixkLG0seSl9LGsudmlzaXQ9ZnVuY3Rpb24obil7Z3IobixrLHYsZCxtLHkpfSxrLmZpbmQ9ZnVuY3Rpb24obil7cmV0dXJuIHByKGssblswXSxuWzFdLHYsZCxtLHkpfSxnPS0xLG51bGw9PXQpe2Zvcig7KytnPHA7KWkoayxuW2ddLGZbZ10saFtnXSx2LGQsbSx5KTstLWd9ZWxzZSBuLmZvckVhY2goay5hZGQpO3JldHVybiBmPWg9bj1zPW51bGwsa312YXIgYSxvPUNlLGw9emU7cmV0dXJuKGE9YXJndW1lbnRzLmxlbmd0aCk/KG89c3IsbD1mciwzPT09YSYmKHU9ZSxyPXQsZT10PTApLGkobikpOihpLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bixpKTpvfSxpLnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bixpKTpsfSxpLmV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj90PWU9cj11PW51bGw6KHQ9K25bMF1bMF0sZT0rblswXVsxXSxyPStuWzFdWzBdLHU9K25bMV1bMV0pLGkpOm51bGw9PXQ/bnVsbDpbW3QsZV0sW3IsdV1dfSxpLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9dT1udWxsOih0PWU9MCxyPStuWzBdLHU9K25bMV0pLGkpOm51bGw9PXQ/bnVsbDpbci10LHUtZV19LGkpfSxvYS5pbnRlcnBvbGF0ZVJnYj12cixvYS5pbnRlcnBvbGF0ZU9iamVjdD1kcixvYS5pbnRlcnBvbGF0ZU51bWJlcj1tcixvYS5pbnRlcnBvbGF0ZVN0cmluZz15cjt2YXIgaGw9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLGdsPW5ldyBSZWdFeHAoaGwuc291cmNlLCJnIik7b2EuaW50ZXJwb2xhdGU9TXIsb2EuaW50ZXJwb2xhdG9ycz1bZnVuY3Rpb24obix0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4oInN0cmluZyI9PT1lP3VvLmhhcyh0LnRvTG93ZXJDYXNlKCkpfHwvXigjfHJnYlwofGhzbFwoKS9pLnRlc3QodCk/dnI6eXI6dCBpbnN0YW5jZW9mIG9uP3ZyOkFycmF5LmlzQXJyYXkodCk/eHI6Im9iamVjdCI9PT1lJiZpc05hTih0KT9kcjptcikobix0KX1dLG9hLmludGVycG9sYXRlQXJyYXk9eHI7dmFyIHBsPWZ1bmN0aW9uKCl7cmV0dXJuIHl9LHZsPW9hLm1hcCh7bGluZWFyOnBsLHBvbHk6RXIscXVhZDpmdW5jdGlvbigpe3JldHVybiBTcn0sY3ViaWM6ZnVuY3Rpb24oKXtyZXR1cm4ga3J9LHNpbjpmdW5jdGlvbigpe3JldHVybiBBcn0sZXhwOmZ1bmN0aW9uKCl7cmV0dXJuIENyfSxjaXJjbGU6ZnVuY3Rpb24oKXtyZXR1cm4genJ9LGVsYXN0aWM6THIsYmFjazpxcixib3VuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gVHJ9fSksZGw9b2EubWFwKHsiaW4iOnksb3V0Ol9yLCJpbi1vdXQiOndyLCJvdXQtaW4iOmZ1bmN0aW9uKG4pe3JldHVybiB3cihfcihuKSl9fSk7b2EuZWFzZT1mdW5jdGlvbihuKXt2YXIgdD1uLmluZGV4T2YoIi0iKSxlPXQ+PTA/bi5zbGljZSgwLHQpOm4scj10Pj0wP24uc2xpY2UodCsxKToiaW4iO3JldHVybiBlPXZsLmdldChlKXx8cGwscj1kbC5nZXQocil8fHksYnIocihlLmFwcGx5KG51bGwsbGEuY2FsbChhcmd1bWVudHMsMSkpKSl9LG9hLmludGVycG9sYXRlSGNsPVJyLG9hLmludGVycG9sYXRlSHNsPURyLG9hLmludGVycG9sYXRlTGFiPVByLG9hLmludGVycG9sYXRlUm91bmQ9VXIsb2EudHJhbnNmb3JtPWZ1bmN0aW9uKG4pe3ZhciB0PXNhLmNyZWF0ZUVsZW1lbnROUyhvYS5ucy5wcmVmaXguc3ZnLCJnIik7cmV0dXJuKG9hLnRyYW5zZm9ybT1mdW5jdGlvbihuKXtpZihudWxsIT1uKXt0LnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIixuKTt2YXIgZT10LnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCl9cmV0dXJuIG5ldyBqcihlP2UubWF0cml4Om1sKX0pKG4pfSxqci5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy50cmFuc2xhdGUrIilyb3RhdGUoIit0aGlzLnJvdGF0ZSsiKXNrZXdYKCIrdGhpcy5za2V3KyIpc2NhbGUoIit0aGlzLnNjYWxlKyIpIn07dmFyIG1sPXthOjEsYjowLGM6MCxkOjEsZTowLGY6MH07b2EuaW50ZXJwb2xhdGVUcmFuc2Zvcm09JHIsb2EubGF5b3V0PXt9LG9hLmxheW91dC5idW5kbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKHZhciB0PVtdLGU9LTEscj1uLmxlbmd0aDsrK2U8cjspdC5wdXNoKEpyKG5bZV0pKTtyZXR1cm4gdH19LG9hLmxheW91dC5jaG9yZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbixjLGYsaCxnLHA9e30sdj1bXSxkPW9hLnJhbmdlKGkpLG09W107Zm9yKGU9W10scj1bXSxuPTAsaD0tMTsrK2g8aTspe2ZvcihjPTAsZz0tMTsrK2c8aTspYys9dVtoXVtnXTt2LnB1c2goYyksbS5wdXNoKG9hLnJhbmdlKGkpKSxuKz1jfWZvcihhJiZkLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gYSh2W25dLHZbdF0pfSksbyYmbS5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7bi5zb3J0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIG8odVt0XVtuXSx1W3RdW2VdKX0pfSksbj0oRmEtcyppKS9uLGM9MCxoPS0xOysraDxpOyl7Zm9yKGY9YyxnPS0xOysrZzxpOyl7dmFyIHk9ZFtoXSxNPW1beV1bZ10seD11W3ldW01dLGI9YyxfPWMrPXgqbjtwW3krIi0iK01dPXtpbmRleDp5LHN1YmluZGV4Ok0sc3RhcnRBbmdsZTpiLGVuZEFuZ2xlOl8sdmFsdWU6eH19clt5XT17aW5kZXg6eSxzdGFydEFuZ2xlOmYsZW5kQW5nbGU6Yyx2YWx1ZTp2W3ldfSxjKz1zfWZvcihoPS0xOysraDxpOylmb3IoZz1oLTE7KytnPGk7KXt2YXIgdz1wW2grIi0iK2ddLFM9cFtnKyItIitoXTsody52YWx1ZXx8Uy52YWx1ZSkmJmUucHVzaCh3LnZhbHVlPFMudmFsdWU/e3NvdXJjZTpTLHRhcmdldDp3fTp7c291cmNlOncsdGFyZ2V0OlN9KX1sJiZ0KCl9ZnVuY3Rpb24gdCgpe2Uuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiBsKChuLnNvdXJjZS52YWx1ZStuLnRhcmdldC52YWx1ZSkvMiwodC5zb3VyY2UudmFsdWUrdC50YXJnZXQudmFsdWUpLzIpfSl9dmFyIGUscix1LGksYSxvLGwsYz17fSxzPTA7cmV0dXJuIGMubWF0cml4PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSh1PW4pJiZ1Lmxlbmd0aCxlPXI9bnVsbCxjKTp1fSxjLnBhZGRpbmc9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bixlPXI9bnVsbCxjKTpzfSxjLnNvcnRHcm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bixlPXI9bnVsbCxjKTphfSxjLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bixlPW51bGwsYyk6b30sYy5zb3J0Q2hvcmRzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4sZSYmdCgpLGMpOmx9LGMuY2hvcmRzPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fG4oKSxlfSxjLmdyb3Vwcz1mdW5jdGlvbigpe3JldHVybiByfHxuKCkscn0sY30sb2EubGF5b3V0LmZvcmNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIsdSl7aWYodC5wb2ludCE9PW4pe3ZhciBpPXQuY3gtbi54LGE9dC5jeS1uLnksbz11LWUsbD1pKmkrYSphO2lmKGw+bypvL20pe2lmKHY+bCl7dmFyIGM9dC5jaGFyZ2UvbDtuLnB4LT1pKmMsbi5weS09YSpjfXJldHVybiEwfWlmKHQucG9pbnQmJmwmJnY+bCl7dmFyIGM9dC5wb2ludENoYXJnZS9sO24ucHgtPWkqYyxuLnB5LT1hKmN9fXJldHVybiF0LmNoYXJnZX19ZnVuY3Rpb24gdChuKXtuLnB4PW9hLmV2ZW50Lngsbi5weT1vYS5ldmVudC55LGwucmVzdW1lKCl9dmFyIGUscix1LGksYSxvLGw9e30sYz1vYS5kaXNwYXRjaCgic3RhcnQiLCJ0aWNrIiwiZW5kIikscz1bMSwxXSxmPS45LGg9eWwsZz1NbCxwPS0zMCx2PXhsLGQ9LjEsbT0uNjQsTT1bXSx4PVtdO3JldHVybiBsLnRpY2s9ZnVuY3Rpb24oKXtpZigodSo9Ljk5KTwuMDA1KXJldHVybiBlPW51bGwsYy5lbmQoe3R5cGU6ImVuZCIsYWxwaGE6dT0wfSksITA7dmFyIHQscixsLGgsZyx2LG0seSxiLF89TS5sZW5ndGgsdz14Lmxlbmd0aDtmb3Iocj0wO3c+cjsrK3IpbD14W3JdLGg9bC5zb3VyY2UsZz1sLnRhcmdldCx5PWcueC1oLngsYj1nLnktaC55LCh2PXkqeStiKmIpJiYodj11KmFbcl0qKCh2PU1hdGguc3FydCh2KSktaVtyXSkvdix5Kj12LGIqPXYsZy54LT15KihtPWgud2VpZ2h0K2cud2VpZ2h0P2gud2VpZ2h0LyhoLndlaWdodCtnLndlaWdodCk6LjUpLGcueS09YiptLGgueCs9eSoobT0xLW0pLGgueSs9YiptKTtpZigobT11KmQpJiYoeT1zWzBdLzIsYj1zWzFdLzIscj0tMSxtKSlmb3IoOysrcjxfOylsPU1bcl0sbC54Kz0oeS1sLngpKm0sbC55Kz0oYi1sLnkpKm07aWYocClmb3IocnUodD1vYS5nZW9tLnF1YWR0cmVlKE0pLHUsbykscj0tMTsrK3I8XzspKGw9TVtyXSkuZml4ZWR8fHQudmlzaXQobihsKSk7Zm9yKHI9LTE7KytyPF87KWw9TVtyXSxsLmZpeGVkPyhsLng9bC5weCxsLnk9bC5weSk6KGwueC09KGwucHgtKGwucHg9bC54KSkqZixsLnktPShsLnB5LShsLnB5PWwueSkpKmYpO2MudGljayh7dHlwZToidGljayIsYWxwaGE6dX0pfSxsLm5vZGVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPW4sbCk6TX0sbC5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD1uLGwpOnh9LGwuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1uLGwpOnN9LGwubGlua0Rpc3RhbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sbCk6aH0sbC5kaXN0YW5jZT1sLmxpbmtEaXN0YW5jZSxsLmxpbmtTdHJlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGwpOmd9LGwuZnJpY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9K24sbCk6Zn0sbC5jaGFyZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixsKTpwfSxsLmNoYXJnZURpc3RhbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PW4qbixsKTpNYXRoLnNxcnQodil9LGwuZ3Jhdml0eT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0rbixsKTpkfSxsLnRoZXRhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPW4qbixsKTpNYXRoLnNxcnQobSl9LGwuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K24sdT9uPjA/dT1uOihlLmM9bnVsbCxlLnQ9TmFOLGU9bnVsbCxjLmVuZCh7dHlwZToiZW5kIixhbHBoYTp1PTB9KSk6bj4wJiYoYy5zdGFydCh7dHlwZToic3RhcnQiLGFscGhhOnU9bn0pLGU9cW4obC50aWNrKSksbCk6dX0sbC5zdGFydD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixyKXtpZighZSl7Zm9yKGU9bmV3IEFycmF5KHUpLGw9MDt1Pmw7KytsKWVbbF09W107Zm9yKGw9MDtjPmw7KytsKXt2YXIgaT14W2xdO2VbaS5zb3VyY2UuaW5kZXhdLnB1c2goaS50YXJnZXQpLGVbaS50YXJnZXQuaW5kZXhdLnB1c2goaS5zb3VyY2UpfX1mb3IodmFyIGEsbz1lW3RdLGw9LTEscz1vLmxlbmd0aDsrK2w8czspaWYoIWlzTmFOKGE9b1tsXVtuXSkpcmV0dXJuIGE7cmV0dXJuIE1hdGgucmFuZG9tKCkqcn12YXIgdCxlLHIsdT1NLmxlbmd0aCxjPXgubGVuZ3RoLGY9c1swXSx2PXNbMV07Zm9yKHQ9MDt1PnQ7Kyt0KShyPU1bdF0pLmluZGV4PXQsci53ZWlnaHQ9MDtmb3IodD0wO2M+dDsrK3Qpcj14W3RdLCJudW1iZXIiPT10eXBlb2Ygci5zb3VyY2UmJihyLnNvdXJjZT1NW3Iuc291cmNlXSksIm51bWJlciI9PXR5cGVvZiByLnRhcmdldCYmKHIudGFyZ2V0PU1bci50YXJnZXRdKSwrK3Iuc291cmNlLndlaWdodCwrK3IudGFyZ2V0LndlaWdodDtmb3IodD0wO3U+dDsrK3Qpcj1NW3RdLGlzTmFOKHIueCkmJihyLng9bigieCIsZikpLGlzTmFOKHIueSkmJihyLnk9bigieSIsdikpLGlzTmFOKHIucHgpJiYoci5weD1yLngpLGlzTmFOKHIucHkpJiYoci5weT1yLnkpO2lmKGk9W10sImZ1bmN0aW9uIj09dHlwZW9mIGgpZm9yKHQ9MDtjPnQ7Kyt0KWlbdF09K2guY2FsbCh0aGlzLHhbdF0sdCk7ZWxzZSBmb3IodD0wO2M+dDsrK3QpaVt0XT1oO2lmKGE9W10sImZ1bmN0aW9uIj09dHlwZW9mIGcpZm9yKHQ9MDtjPnQ7Kyt0KWFbdF09K2cuY2FsbCh0aGlzLHhbdF0sdCk7ZWxzZSBmb3IodD0wO2M+dDsrK3QpYVt0XT1nO2lmKG89W10sImZ1bmN0aW9uIj09dHlwZW9mIHApZm9yKHQ9MDt1PnQ7Kyt0KW9bdF09K3AuY2FsbCh0aGlzLE1bdF0sdCk7ZWxzZSBmb3IodD0wO3U+dDsrK3Qpb1t0XT1wO3JldHVybiBsLnJlc3VtZSgpfSxsLnJlc3VtZT1mdW5jdGlvbigpe3JldHVybiBsLmFscGhhKC4xKX0sbC5zdG9wPWZ1bmN0aW9uKCl7cmV0dXJuIGwuYWxwaGEoMCl9LGwuZHJhZz1mdW5jdGlvbigpe3JldHVybiByfHwocj1vYS5iZWhhdmlvci5kcmFnKCkub3JpZ2luKHkpLm9uKCJkcmFnc3RhcnQuZm9yY2UiLFFyKS5vbigiZHJhZy5mb3JjZSIsdCkub24oImRyYWdlbmQuZm9yY2UiLG51KSksYXJndW1lbnRzLmxlbmd0aD92b2lkIHRoaXMub24oIm1vdXNlb3Zlci5mb3JjZSIsdHUpLm9uKCJtb3VzZW91dC5mb3JjZSIsZXUpLmNhbGwocik6cn0sb2EucmViaW5kKGwsYywib24iKX07dmFyIHlsPTIwLE1sPTEseGw9MS8wO29hLmxheW91dC5oaWVyYXJjaHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHUpe3ZhciBpLGE9W3VdLG89W107Zm9yKHUuZGVwdGg9MDtudWxsIT0oaT1hLnBvcCgpKTspaWYoby5wdXNoKGkpLChjPWUuY2FsbChuLGksaS5kZXB0aCkpJiYobD1jLmxlbmd0aCkpe2Zvcih2YXIgbCxjLHM7LS1sPj0wOylhLnB1c2gocz1jW2xdKSxzLnBhcmVudD1pLHMuZGVwdGg9aS5kZXB0aCsxO3ImJihpLnZhbHVlPTApLGkuY2hpbGRyZW49Y31lbHNlIHImJihpLnZhbHVlPStyLmNhbGwobixpLGkuZGVwdGgpfHwwKSxkZWxldGUgaS5jaGlsZHJlbjtyZXR1cm4gYXUodSxmdW5jdGlvbihuKXt2YXIgZSx1O3QmJihlPW4uY2hpbGRyZW4pJiZlLnNvcnQodCksciYmKHU9bi5wYXJlbnQpJiYodS52YWx1ZSs9bi52YWx1ZSl9KSxvfXZhciB0PWN1LGU9b3Uscj1sdTtyZXR1cm4gbi5zb3J0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi5jaGlsZHJlbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4udmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLnJldmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIHImJihpdSh0LGZ1bmN0aW9uKG4pe24uY2hpbGRyZW4mJihuLnZhbHVlPTApfSksYXUodCxmdW5jdGlvbih0KXt2YXIgZTt0LmNoaWxkcmVufHwodC52YWx1ZT0rci5jYWxsKG4sdCx0LmRlcHRoKXx8MCksKGU9dC5wYXJlbnQpJiYoZS52YWx1ZSs9dC52YWx1ZSl9KSksdH0sbn0sb2EubGF5b3V0LnBhcnRpdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxlLHIsdSl7dmFyIGk9dC5jaGlsZHJlbjtpZih0Lng9ZSx0Lnk9dC5kZXB0aCp1LHQuZHg9cix0LmR5PXUsaSYmKGE9aS5sZW5ndGgpKXt2YXIgYSxvLGwsYz0tMTtmb3Iocj10LnZhbHVlP3IvdC52YWx1ZTowOysrYzxhOyluKG89aVtjXSxlLGw9by52YWx1ZSpyLHUpLGUrPWx9fWZ1bmN0aW9uIHQobil7dmFyIGU9bi5jaGlsZHJlbixyPTA7aWYoZSYmKHU9ZS5sZW5ndGgpKWZvcih2YXIgdSxpPS0xOysraTx1OylyPU1hdGgubWF4KHIsdChlW2ldKSk7cmV0dXJuIDErcn1mdW5jdGlvbiBlKGUsaSl7dmFyIGE9ci5jYWxsKHRoaXMsZSxpKTtyZXR1cm4gbihhWzBdLDAsdVswXSx1WzFdL3QoYVswXSkpLGF9dmFyIHI9b2EubGF5b3V0LmhpZXJhcmNoeSgpLHU9WzEsMV07cmV0dXJuIGUuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLGUpOnV9LHV1KGUscil9LG9hLmxheW91dC5waWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKGEpe3ZhciBvLGw9YS5sZW5ndGgsYz1hLm1hcChmdW5jdGlvbihlLHIpe3JldHVybit0LmNhbGwobixlLHIpfSkscz0rKCJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOnIpLGY9KCJmdW5jdGlvbiI9PXR5cGVvZiB1P3UuYXBwbHkodGhpcyxhcmd1bWVudHMpOnUpLXMsaD1NYXRoLm1pbihNYXRoLmFicyhmKS9sLCsoImZ1bmN0aW9uIj09dHlwZW9mIGk/aS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6aSkpLGc9aCooMD5mPy0xOjEpLHA9b2Euc3VtKGMpLHY9cD8oZi1sKmcpL3A6MCxkPW9hLnJhbmdlKGwpLG09W107cmV0dXJuIG51bGwhPWUmJmQuc29ydChlPT09Ymw/ZnVuY3Rpb24obix0KXtyZXR1cm4gY1t0XS1jW25dfTpmdW5jdGlvbihuLHQpe3JldHVybiBlKGFbbl0sYVt0XSl9KSxkLmZvckVhY2goZnVuY3Rpb24obil7bVtuXT17ZGF0YTphW25dLHZhbHVlOm89Y1tuXSxzdGFydEFuZ2xlOnMsZW5kQW5nbGU6cys9byp2K2cscGFkQW5nbGU6aH19KSxtfXZhciB0PU51bWJlcixlPWJsLHI9MCx1PUZhLGk9MDtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4uc29ydD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbn07dmFyIGJsPXt9O29hLmxheW91dC5zdGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obyxsKXtpZighKGg9by5sZW5ndGgpKXJldHVybiBvO3ZhciBjPW8ubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuIHQuY2FsbChuLGUscil9KSxzPWMubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0LGUpe3JldHVybltpLmNhbGwobix0LGUpLGEuY2FsbChuLHQsZSldfSl9KSxmPWUuY2FsbChuLHMsbCk7Yz1vYS5wZXJtdXRlKGMsZikscz1vYS5wZXJtdXRlKHMsZik7dmFyIGgsZyxwLHYsZD1yLmNhbGwobixzLGwpLG09Y1swXS5sZW5ndGg7Zm9yKHA9MDttPnA7KytwKWZvcih1LmNhbGwobixjWzBdW3BdLHY9ZFtwXSxzWzBdW3BdWzFdKSxnPTE7aD5nOysrZyl1LmNhbGwobixjW2ddW3BdLHYrPXNbZy0xXVtwXVsxXSxzW2ddW3BdWzFdKTtyZXR1cm4gb312YXIgdD15LGU9cHUscj12dSx1PWd1LGk9ZnUsYT1odTtyZXR1cm4gbi52YWx1ZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLm9yZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6X2wuZ2V0KHQpfHxwdSxuKTplfSxuLm9mZnNldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OndsLmdldCh0KXx8dnUsbik6cn0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbik6YX0sbi5vdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxufTt2YXIgX2w9b2EubWFwKHsiaW5zaWRlLW91dCI6ZnVuY3Rpb24obil7dmFyIHQsZSxyPW4ubGVuZ3RoLHU9bi5tYXAoZHUpLGk9bi5tYXAobXUpLGE9b2EucmFuZ2Uocikuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiB1W25dLXVbdF19KSxvPTAsbD0wLGM9W10scz1bXTtmb3IodD0wO3I+dDsrK3QpZT1hW3RdLGw+bz8obys9aVtlXSxjLnB1c2goZSkpOihsKz1pW2VdLHMucHVzaChlKSk7cmV0dXJuIHMucmV2ZXJzZSgpLmNvbmNhdChjKX0scmV2ZXJzZTpmdW5jdGlvbihuKXtyZXR1cm4gb2EucmFuZ2Uobi5sZW5ndGgpLnJldmVyc2UoKX0sImRlZmF1bHQiOnB1fSksd2w9b2EubWFwKHtzaWxob3VldHRlOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PW4ubGVuZ3RoLGk9blswXS5sZW5ndGgsYT1bXSxvPTAsbD1bXTtmb3IoZT0wO2k+ZTsrK2Upe2Zvcih0PTAscj0wO3U+dDt0Kyspcis9blt0XVtlXVsxXTtyPm8mJihvPXIpLGEucHVzaChyKX1mb3IoZT0wO2k+ZTsrK2UpbFtlXT0oby1hW2VdKS8yO3JldHVybiBsfSx3aWdnbGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaSxhLG8sbCxjLHM9bi5sZW5ndGgsZj1uWzBdLGg9Zi5sZW5ndGgsZz1bXTtmb3IoZ1swXT1sPWM9MCxlPTE7aD5lOysrZSl7Zm9yKHQ9MCx1PTA7cz50OysrdCl1Kz1uW3RdW2VdWzFdO2Zvcih0PTAsaT0wLG89ZltlXVswXS1mW2UtMV1bMF07cz50OysrdCl7Zm9yKHI9MCxhPShuW3RdW2VdWzFdLW5bdF1bZS0xXVsxXSkvKDIqbyk7dD5yOysrcilhKz0obltyXVtlXVsxXS1uW3JdW2UtMV1bMV0pL287aSs9YSpuW3RdW2VdWzFdfWdbZV09bC09dT9pL3UqbzowLGM+bCYmKGM9bCl9Zm9yKGU9MDtoPmU7KytlKWdbZV0tPWM7cmV0dXJuIGd9LGV4cGFuZDpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1uLmxlbmd0aCxpPW5bMF0ubGVuZ3RoLGE9MS91LG89W107Zm9yKGU9MDtpPmU7KytlKXtmb3IodD0wLHI9MDt1PnQ7dCsrKXIrPW5bdF1bZV1bMV07aWYocilmb3IodD0wO3U+dDt0Kyspblt0XVtlXVsxXS89cjtlbHNlIGZvcih0PTA7dT50O3QrKyluW3RdW2VdWzFdPWF9Zm9yKGU9MDtpPmU7KytlKW9bZV09MDtyZXR1cm4gb30semVybzp2dX0pO29hLmxheW91dC5oaXN0b2dyYW09ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7Zm9yKHZhciBhLG8sbD1bXSxjPW4ubWFwKGUsdGhpcykscz1yLmNhbGwodGhpcyxjLGkpLGY9dS5jYWxsKHRoaXMscyxjLGkpLGk9LTEsaD1jLmxlbmd0aCxnPWYubGVuZ3RoLTEscD10PzE6MS9oOysraTxnOylhPWxbaV09W10sYS5keD1mW2krMV0tKGEueD1mW2ldKSxhLnk9MDtpZihnPjApZm9yKGk9LTE7KytpPGg7KW89Y1tpXSxvPj1zWzBdJiZvPD1zWzFdJiYoYT1sW29hLmJpc2VjdChmLG8sMSxnKS0xXSxhLnkrPXAsYS5wdXNoKG5baV0pKTtyZXR1cm4gbH12YXIgdD0hMCxlPU51bWJlcixyPWJ1LHU9TXU7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUVuKHQpLG4pOnJ9LG4uYmlucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0ibnVtYmVyIj09dHlwZW9mIHQ/ZnVuY3Rpb24obil7cmV0dXJuIHh1KG4sdCl9OkVuKHQpLG4pOnV9LG4uZnJlcXVlbmN5PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSEhZSxuKTp0fSxufSxvYS5sYXlvdXQucGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXt2YXIgYT1lLmNhbGwodGhpcyxuLGkpLG89YVswXSxsPXVbMF0sYz11WzFdLHM9bnVsbD09dD9NYXRoLnNxcnQ6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiB0fTtpZihvLng9by55PTAsYXUobyxmdW5jdGlvbihuKXtuLnI9K3Mobi52YWx1ZSl9KSxhdShvLE51KSxyKXt2YXIgZj1yKih0PzE6TWF0aC5tYXgoMipvLnIvbCwyKm8uci9jKSkvMjthdShvLGZ1bmN0aW9uKG4pe24ucis9Zn0pLGF1KG8sTnUpLGF1KG8sZnVuY3Rpb24obil7bi5yLT1mfSl9cmV0dXJuIEN1KG8sbC8yLGMvMix0PzE6MS9NYXRoLm1heCgyKm8uci9sLDIqby5yL2MpKSxhfXZhciB0LGU9b2EubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQoX3UpLHI9MCx1PVsxLDFdO3JldHVybiBuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1udWxsPT1lfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9lOitlLG4pOnR9LG4ucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSx1dShuLGUpfSxvYS5sYXlvdXQudHJlZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXt2YXIgcz1hLmNhbGwodGhpcyxuLHUpLGY9c1swXSxoPXQoZik7aWYoYXUoaCxlKSxoLnBhcmVudC5tPS1oLnosaXUoaCxyKSxjKWl1KGYsaSk7ZWxzZXt2YXIgZz1mLHA9Zix2PWY7aXUoZixmdW5jdGlvbihuKXtuLng8Zy54JiYoZz1uKSxuLng+cC54JiYocD1uKSxuLmRlcHRoPnYuZGVwdGgmJih2PW4pfSk7dmFyIGQ9byhnLHApLzItZy54LG09bFswXS8ocC54K28ocCxnKS8yK2QpLHk9bFsxXS8odi5kZXB0aHx8MSk7aXUoZixmdW5jdGlvbihuKXtuLng9KG4ueCtkKSptLG4ueT1uLmRlcHRoKnl9KX1yZXR1cm4gc31mdW5jdGlvbiB0KG4pe2Zvcih2YXIgdCxlPXtBOm51bGwsY2hpbGRyZW46W25dfSxyPVtlXTtudWxsIT0odD1yLnBvcCgpKTspZm9yKHZhciB1LGk9dC5jaGlsZHJlbixhPTAsbz1pLmxlbmd0aDtvPmE7KythKXIucHVzaCgoaVthXT11PXtfOmlbYV0scGFyZW50OnQsY2hpbGRyZW46KHU9aVthXS5jaGlsZHJlbikmJnUuc2xpY2UoKXx8W10sQTpudWxsLGE6bnVsbCx6OjAsbTowLGM6MCxzOjAsdDpudWxsLGk6YX0pLmE9dSk7cmV0dXJuIGUuY2hpbGRyZW5bMF19ZnVuY3Rpb24gZShuKXt2YXIgdD1uLmNoaWxkcmVuLGU9bi5wYXJlbnQuY2hpbGRyZW4scj1uLmk/ZVtuLmktMV06bnVsbDtpZih0Lmxlbmd0aCl7RHUobik7dmFyIGk9KHRbMF0ueit0W3QubGVuZ3RoLTFdLnopLzI7cj8obi56PXIueitvKG4uXyxyLl8pLG4ubT1uLnotaSk6bi56PWl9ZWxzZSByJiYobi56PXIueitvKG4uXyxyLl8pKTtuLnBhcmVudC5BPXUobixyLG4ucGFyZW50LkF8fGVbMF0pfWZ1bmN0aW9uIHIobil7bi5fLng9bi56K24ucGFyZW50Lm0sbi5tKz1uLnBhcmVudC5tfWZ1bmN0aW9uIHUobix0LGUpe2lmKHQpe2Zvcih2YXIgcix1PW4saT1uLGE9dCxsPXUucGFyZW50LmNoaWxkcmVuWzBdLGM9dS5tLHM9aS5tLGY9YS5tLGg9bC5tO2E9VHUoYSksdT1xdSh1KSxhJiZ1OylsPXF1KGwpLGk9VHUoaSksaS5hPW4scj1hLnorZi11LnotYytvKGEuXyx1Ll8pLHI+MCYmKFJ1KFB1KGEsbixlKSxuLHIpLGMrPXIscys9ciksZis9YS5tLGMrPXUubSxoKz1sLm0scys9aS5tO2EmJiFUdShpKSYmKGkudD1hLGkubSs9Zi1zKSx1JiYhcXUobCkmJihsLnQ9dSxsLm0rPWMtaCxlPW4pfXJldHVybiBlfWZ1bmN0aW9uIGkobil7bi54Kj1sWzBdLG4ueT1uLmRlcHRoKmxbMV19dmFyIGE9b2EubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCksbz1MdSxsPVsxLDFdLGM9bnVsbDtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQsbik6b30sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW51bGw9PShsPXQpP2k6bnVsbCxuKTpjP251bGw6bH0sbi5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1udWxsPT0obD10KT9udWxsOmksbik6Yz9sOm51bGx9LHV1KG4sYSl9LG9hLmxheW91dC5jbHVzdGVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciBhLG89dC5jYWxsKHRoaXMsbixpKSxsPW9bMF0sYz0wO2F1KGwsZnVuY3Rpb24obil7dmFyIHQ9bi5jaGlsZHJlbjt0JiZ0Lmxlbmd0aD8obi54PWp1KHQpLG4ueT1VdSh0KSk6KG4ueD1hP2MrPWUobixhKTowLG4ueT0wLGE9bil9KTt2YXIgcz1GdShsKSxmPUh1KGwpLGg9cy54LWUocyxmKS8yLGc9Zi54K2UoZixzKS8yO3JldHVybiBhdShsLHU/ZnVuY3Rpb24obil7bi54PShuLngtbC54KSpyWzBdLG4ueT0obC55LW4ueSkqclsxXX06ZnVuY3Rpb24obil7bi54PShuLngtaCkvKGctaCkqclswXSxuLnk9KDEtKGwueT9uLnkvbC55OjEpKSpyWzFdfSksb312YXIgdD1vYS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxlPUx1LHI9WzEsMV0sdT0hMTtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PShyPXQpLG4pOnU/bnVsbDpyfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGwhPShyPXQpLG4pOnU/cjpudWxsfSx1dShuLHQpfSxvYS5sYXlvdXQudHJlZW1hcD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix0KXtmb3IodmFyIGUscix1PS0xLGk9bi5sZW5ndGg7Kyt1PGk7KXI9KGU9blt1XSkudmFsdWUqKDA+dD8wOnQpLGUuYXJlYT1pc05hTihyKXx8MD49cj8wOnJ9ZnVuY3Rpb24gdChlKXt2YXIgaT1lLmNoaWxkcmVuO2lmKGkmJmkubGVuZ3RoKXt2YXIgYSxvLGwsYz1mKGUpLHM9W10saD1pLnNsaWNlKCkscD0xLzAsdj0ic2xpY2UiPT09Zz9jLmR4OiJkaWNlIj09PWc/Yy5keToic2xpY2UtZGljZSI9PT1nPzEmZS5kZXB0aD9jLmR5OmMuZHg6TWF0aC5taW4oYy5keCxjLmR5KTtmb3IobihoLGMuZHgqYy5keS9lLnZhbHVlKSxzLmFyZWE9MDsobD1oLmxlbmd0aCk+MDspcy5wdXNoKGE9aFtsLTFdKSxzLmFyZWErPWEuYXJlYSwic3F1YXJpZnkiIT09Z3x8KG89cihzLHYpKTw9cD8oaC5wb3AoKSxwPW8pOihzLmFyZWEtPXMucG9wKCkuYXJlYSx1KHMsdixjLCExKSx2PU1hdGgubWluKGMuZHgsYy5keSkscy5sZW5ndGg9cy5hcmVhPTAscD0xLzApO3MubGVuZ3RoJiYodShzLHYsYywhMCkscy5sZW5ndGg9cy5hcmVhPTApLGkuZm9yRWFjaCh0KX19ZnVuY3Rpb24gZSh0KXt2YXIgcj10LmNoaWxkcmVuO2lmKHImJnIubGVuZ3RoKXt2YXIgaSxhPWYodCksbz1yLnNsaWNlKCksbD1bXTtmb3IobihvLGEuZHgqYS5keS90LnZhbHVlKSxsLmFyZWE9MDtpPW8ucG9wKCk7KWwucHVzaChpKSxsLmFyZWErPWkuYXJlYSxudWxsIT1pLnomJih1KGwsaS56P2EuZHg6YS5keSxhLCFvLmxlbmd0aCksbC5sZW5ndGg9bC5hcmVhPTApO3IuZm9yRWFjaChlKX19ZnVuY3Rpb24gcihuLHQpe2Zvcih2YXIgZSxyPW4uYXJlYSx1PTAsaT0xLzAsYT0tMSxvPW4ubGVuZ3RoOysrYTxvOykoZT1uW2FdLmFyZWEpJiYoaT5lJiYoaT1lKSxlPnUmJih1PWUpKTtyZXR1cm4gcio9cix0Kj10LHI/TWF0aC5tYXgodCp1KnAvcixyLyh0KmkqcCkpOjEvMH1mdW5jdGlvbiB1KG4sdCxlLHIpe3ZhciB1LGk9LTEsYT1uLmxlbmd0aCxvPWUueCxjPWUueSxzPXQ/bChuLmFyZWEvdCk6MDsKaWYodD09ZS5keCl7Zm9yKChyfHxzPmUuZHkpJiYocz1lLmR5KTsrK2k8YTspdT1uW2ldLHUueD1vLHUueT1jLHUuZHk9cyxvKz11LmR4PU1hdGgubWluKGUueCtlLmR4LW8scz9sKHUuYXJlYS9zKTowKTt1Lno9ITAsdS5keCs9ZS54K2UuZHgtbyxlLnkrPXMsZS5keS09c31lbHNle2Zvcigocnx8cz5lLmR4KSYmKHM9ZS5keCk7KytpPGE7KXU9bltpXSx1Lng9byx1Lnk9Yyx1LmR4PXMsYys9dS5keT1NYXRoLm1pbihlLnkrZS5keS1jLHM/bCh1LmFyZWEvcyk6MCk7dS56PSExLHUuZHkrPWUueStlLmR5LWMsZS54Kz1zLGUuZHgtPXN9fWZ1bmN0aW9uIGkocil7dmFyIHU9YXx8byhyKSxpPXVbMF07cmV0dXJuIGkueD1pLnk9MCxpLnZhbHVlPyhpLmR4PWNbMF0saS5keT1jWzFdKTppLmR4PWkuZHk9MCxhJiZvLnJldmFsdWUoaSksbihbaV0saS5keCppLmR5L2kudmFsdWUpLChhP2U6dCkoaSksaCYmKGE9dSksdX12YXIgYSxvPW9hLmxheW91dC5oaWVyYXJjaHkoKSxsPU1hdGgucm91bmQsYz1bMSwxXSxzPW51bGwsZj1PdSxoPSExLGc9InNxdWFyaWZ5IixwPS41KigxK01hdGguc3FydCg1KSk7cmV0dXJuIGkuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLGkpOmN9LGkucGFkZGluZz1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KHQpe3ZhciBlPW4uY2FsbChpLHQsdC5kZXB0aCk7cmV0dXJuIG51bGw9PWU/T3UodCk6SXUodCwibnVtYmVyIj09dHlwZW9mIGU/W2UsZSxlLGVdOmUpfWZ1bmN0aW9uIGUodCl7cmV0dXJuIEl1KHQsbil9aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHM7dmFyIHI7cmV0dXJuIGY9bnVsbD09KHM9bik/T3U6ImZ1bmN0aW9uIj09KHI9dHlwZW9mIG4pP3Q6Im51bWJlciI9PT1yPyhuPVtuLG4sbixuXSxlKTplLGl9LGkucm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bj9NYXRoLnJvdW5kOk51bWJlcixpKTpsIT1OdW1iZXJ9LGkuc3RpY2t5PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPW4sYT1udWxsLGkpOmh9LGkucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9bixpKTpwfSxpLm1vZGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9bisiIixpKTpnfSx1dShpLG8pfSxvYS5yYW5kb209e25vcm1hbDpmdW5jdGlvbihuLHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIDI+ZSYmKHQ9MSksMT5lJiYobj0wKSxmdW5jdGlvbigpe3ZhciBlLHIsdTtkbyBlPTIqTWF0aC5yYW5kb20oKS0xLHI9MipNYXRoLnJhbmRvbSgpLTEsdT1lKmUrcipyO3doaWxlKCF1fHx1PjEpO3JldHVybiBuK3QqZSpNYXRoLnNxcnQoLTIqTWF0aC5sb2codSkvdSl9fSxsb2dOb3JtYWw6ZnVuY3Rpb24oKXt2YXIgbj1vYS5yYW5kb20ubm9ybWFsLmFwcGx5KG9hLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKG4oKSl9fSxiYXRlczpmdW5jdGlvbihuKXt2YXIgdD1vYS5yYW5kb20uaXJ3aW5IYWxsKG4pO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KCkvbn19LGlyd2luSGFsbDpmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7bj5lO2UrKyl0Kz1NYXRoLnJhbmRvbSgpO3JldHVybiB0fX19LG9hLnNjYWxlPXt9O3ZhciBTbD17Zmxvb3I6eSxjZWlsOnl9O29hLnNjYWxlLmxpbmVhcj1mdW5jdGlvbigpe3JldHVybiBXdShbMCwxXSxbMCwxXSxNciwhMSl9O3ZhciBrbD17czoxLGc6MSxwOjEscjoxLGU6MX07b2Euc2NhbGUubG9nPWZ1bmN0aW9uKCl7cmV0dXJuIHJpKG9hLnNjYWxlLmxpbmVhcigpLmRvbWFpbihbMCwxXSksMTAsITAsWzEsMTBdKX07dmFyIE5sPW9hLmZvcm1hdCgiLjBlIiksRWw9e2Zsb29yOmZ1bmN0aW9uKG4pe3JldHVybi1NYXRoLmNlaWwoLW4pfSxjZWlsOmZ1bmN0aW9uKG4pe3JldHVybi1NYXRoLmZsb29yKC1uKX19O29hLnNjYWxlLnBvdz1mdW5jdGlvbigpe3JldHVybiB1aShvYS5zY2FsZS5saW5lYXIoKSwxLFswLDFdKX0sb2Euc2NhbGUuc3FydD1mdW5jdGlvbigpe3JldHVybiBvYS5zY2FsZS5wb3coKS5leHBvbmVudCguNSl9LG9hLnNjYWxlLm9yZGluYWw9ZnVuY3Rpb24oKXtyZXR1cm4gYWkoW10se3Q6InJhbmdlIixhOltbXV19KX0sb2Euc2NhbGUuY2F0ZWdvcnkxMD1mdW5jdGlvbigpe3JldHVybiBvYS5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoQWwpfSxvYS5zY2FsZS5jYXRlZ29yeTIwPWZ1bmN0aW9uKCl7cmV0dXJuIG9hLnNjYWxlLm9yZGluYWwoKS5yYW5nZShDbCl9LG9hLnNjYWxlLmNhdGVnb3J5MjBiPWZ1bmN0aW9uKCl7cmV0dXJuIG9hLnNjYWxlLm9yZGluYWwoKS5yYW5nZSh6bCl9LG9hLnNjYWxlLmNhdGVnb3J5MjBjPWZ1bmN0aW9uKCl7cmV0dXJuIG9hLnNjYWxlLm9yZGluYWwoKS5yYW5nZShMbCl9O3ZhciBBbD1bMjA2MjI2MCwxNjc0NDIwNiwyOTI0NTg4LDE0MDM0NzI4LDk3MjU4ODUsOTE5NzEzMSwxNDkwNzMzMCw4MzU1NzExLDEyMzY5MTg2LDE1NTYxNzVdLm1hcCh4biksQ2w9WzIwNjIyNjAsMTE0NTQ0NDAsMTY3NDQyMDYsMTY3NTk2NzIsMjkyNDU4OCwxMDAxODY5OCwxNDAzNDcyOCwxNjc1MDc0Miw5NzI1ODg1LDEyOTU1ODYxLDkxOTcxMzEsMTI4ODUxNDAsMTQ5MDczMzAsMTYyMzQxOTQsODM1NTcxMSwxMzA5MjgwNywxMjM2OTE4NiwxNDQwODU4OSwxNTU2MTc1LDEwNDEwNzI1XS5tYXAoeG4pLHpsPVszNzUwNzc3LDUzOTU2MTksNzA0MDcxOSwxMDI2NDI4Niw2NTE5MDk3LDkyMTY1OTQsMTE5MTUxMTUsMTM1NTY2MzYsOTIwMjk5MywxMjQyNjgwOSwxNTE4NjUxNCwxNTE5MDkzMiw4NjY2MTY5LDExMzU2NDkwLDE0MDQ5NjQzLDE1MTc3MzcyLDgwNzc2ODMsMTA4MzQzMjQsMTM1Mjg1MDksMTQ1ODk2NTRdLm1hcCh4biksTGw9WzMyNDQ3MzMsNzA1NzExMCwxMDQwNjYyNSwxMzAzMjQzMSwxNTA5NTA1MywxNjYxNjc2NCwxNjYyNTI1OSwxNjYzNDAxOCwzMjUzMDc2LDc2NTI0NzAsMTA2MDcwMDMsMTMxMDE1MDQsNzY5NTI4MSwxMDM5NDMxMiwxMjM2OTM3MiwxNDM0Mjg5MSw2NTEzNTA3LDk4Njg5NTAsMTI0MzQ4NzcsMTQyNzcwODFdLm1hcCh4bik7b2Euc2NhbGUucXVhbnRpbGU9ZnVuY3Rpb24oKXtyZXR1cm4gb2koW10sW10pfSxvYS5zY2FsZS5xdWFudGl6ZT1mdW5jdGlvbigpe3JldHVybiBsaSgwLDEsWzAsMV0pfSxvYS5zY2FsZS50aHJlc2hvbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gY2koWy41XSxbMCwxXSl9LG9hLnNjYWxlLmlkZW50aXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHNpKFswLDFdKX0sb2Euc3ZnPXt9LG9hLnN2Zy5hcmM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG49TWF0aC5tYXgoMCwrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGM9TWF0aC5tYXgoMCwrci5hcHBseSh0aGlzLGFyZ3VtZW50cykpLHM9YS5hcHBseSh0aGlzLGFyZ3VtZW50cyktT2EsZj1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1PYSxoPU1hdGguYWJzKGYtcyksZz1zPmY/MDoxO2lmKG4+YyYmKHA9YyxjPW4sbj1wKSxoPj1IYSlyZXR1cm4gdChjLGcpKyhuP3QobiwxLWcpOiIiKSsiWiI7dmFyIHAsdixkLG0seSxNLHgsYixfLHcsUyxrLE49MCxFPTAsQT1bXTtpZigobT0oK2wuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwKS8yKSYmKGQ9aT09PXFsP01hdGguc3FydChuKm4rYypjKToraS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZ3x8KEUqPS0xKSxjJiYoRT10bihkL2MqTWF0aC5zaW4obSkpKSxuJiYoTj10bihkL24qTWF0aC5zaW4obSkpKSksYyl7eT1jKk1hdGguY29zKHMrRSksTT1jKk1hdGguc2luKHMrRSkseD1jKk1hdGguY29zKGYtRSksYj1jKk1hdGguc2luKGYtRSk7dmFyIEM9TWF0aC5hYnMoZi1zLTIqRSk8PWphPzA6MTtpZihFJiZtaSh5LE0seCxiKT09PWdeQyl7dmFyIHo9KHMrZikvMjt5PWMqTWF0aC5jb3MoeiksTT1jKk1hdGguc2luKHopLHg9Yj1udWxsfX1lbHNlIHk9TT0wO2lmKG4pe189bipNYXRoLmNvcyhmLU4pLHc9bipNYXRoLnNpbihmLU4pLFM9bipNYXRoLmNvcyhzK04pLGs9bipNYXRoLnNpbihzK04pO3ZhciBMPU1hdGguYWJzKHMtZisyKk4pPD1qYT8wOjE7aWYoTiYmbWkoXyx3LFMsayk9PT0xLWdeTCl7dmFyIHE9KHMrZikvMjtfPW4qTWF0aC5jb3MocSksdz1uKk1hdGguc2luKHEpLFM9az1udWxsfX1lbHNlIF89dz0wO2lmKGg+UGEmJihwPU1hdGgubWluKE1hdGguYWJzKGMtbikvMiwrdS5hcHBseSh0aGlzLGFyZ3VtZW50cykpKT4uMDAxKXt2PWM+bl5nPzA6MTt2YXIgVD1wLFI9cDtpZihqYT5oKXt2YXIgRD1udWxsPT1TP1tfLHddOm51bGw9PXg/W3ksTV06UmUoW3ksTV0sW1Msa10sW3gsYl0sW18sd10pLFA9eS1EWzBdLFU9TS1EWzFdLGo9eC1EWzBdLEY9Yi1EWzFdLEg9MS9NYXRoLnNpbihNYXRoLmFjb3MoKFAqaitVKkYpLyhNYXRoLnNxcnQoUCpQK1UqVSkqTWF0aC5zcXJ0KGoqaitGKkYpKSkvMiksTz1NYXRoLnNxcnQoRFswXSpEWzBdK0RbMV0qRFsxXSk7Uj1NYXRoLm1pbihwLChuLU8pLyhILTEpKSxUPU1hdGgubWluKHAsKGMtTykvKEgrMSkpfWlmKG51bGwhPXgpe3ZhciBJPXlpKG51bGw9PVM/W18sd106W1Msa10sW3ksTV0sYyxULGcpLFk9eWkoW3gsYl0sW18sd10sYyxULGcpO3A9PT1UP0EucHVzaCgiTSIsSVswXSwiQSIsVCwiLCIsVCwiIDAgMCwiLHYsIiAiLElbMV0sIkEiLGMsIiwiLGMsIiAwICIsMS1nXm1pKElbMV1bMF0sSVsxXVsxXSxZWzFdWzBdLFlbMV1bMV0pLCIsIixnLCIgIixZWzFdLCJBIixULCIsIixULCIgMCAwLCIsdiwiICIsWVswXSk6QS5wdXNoKCJNIixJWzBdLCJBIixULCIsIixULCIgMCAxLCIsdiwiICIsWVswXSl9ZWxzZSBBLnB1c2goIk0iLHksIiwiLE0pO2lmKG51bGwhPVMpe3ZhciBaPXlpKFt5LE1dLFtTLGtdLG4sLVIsZyksVj15aShbXyx3XSxudWxsPT14P1t5LE1dOlt4LGJdLG4sLVIsZyk7cD09PVI/QS5wdXNoKCJMIixWWzBdLCJBIixSLCIsIixSLCIgMCAwLCIsdiwiICIsVlsxXSwiQSIsbiwiLCIsbiwiIDAgIixnXm1pKFZbMV1bMF0sVlsxXVsxXSxaWzFdWzBdLFpbMV1bMV0pLCIsIiwxLWcsIiAiLFpbMV0sIkEiLFIsIiwiLFIsIiAwIDAsIix2LCIgIixaWzBdKTpBLnB1c2goIkwiLFZbMF0sIkEiLFIsIiwiLFIsIiAwIDAsIix2LCIgIixaWzBdKX1lbHNlIEEucHVzaCgiTCIsXywiLCIsdyl9ZWxzZSBBLnB1c2goIk0iLHksIiwiLE0pLG51bGwhPXgmJkEucHVzaCgiQSIsYywiLCIsYywiIDAgIixDLCIsIixnLCIgIix4LCIsIixiKSxBLnB1c2goIkwiLF8sIiwiLHcpLG51bGwhPVMmJkEucHVzaCgiQSIsbiwiLCIsbiwiIDAgIixMLCIsIiwxLWcsIiAiLFMsIiwiLGspO3JldHVybiBBLnB1c2goIloiKSxBLmpvaW4oIiIpfWZ1bmN0aW9uIHQobix0KXtyZXR1cm4iTTAsIituKyJBIituKyIsIituKyIgMCAxLCIrdCsiIDAsIistbisiQSIrbisiLCIrbisiIDAgMSwiK3QrIiAwLCIrbn12YXIgZT1oaSxyPWdpLHU9ZmksaT1xbCxhPXBpLG89dmksbD1kaTtyZXR1cm4gbi5pbm5lclJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1Fbih0KSxuKTplfSxuLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUVuKHQpLG4pOnJ9LG4uY29ybmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PUVuKHQpLG4pOnV9LG4ucGFkUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQ9PXFsP3FsOkVuKHQpLG4pOml9LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1Fbih0KSxuKTphfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUVuKHQpLG4pOm99LG4ucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9RW4odCksbik6bH0sbi5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBuPSgrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMix0PSgrYS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1PYTtyZXR1cm5bTWF0aC5jb3ModCkqbixNYXRoLnNpbih0KSpuXX0sbn07dmFyIHFsPSJhdXRvIjtvYS5zdmcubGluZT1mdW5jdGlvbigpe3JldHVybiBNaSh5KX07dmFyIFRsPW9hLm1hcCh7bGluZWFyOnhpLCJsaW5lYXItY2xvc2VkIjpiaSxzdGVwOl9pLCJzdGVwLWJlZm9yZSI6d2ksInN0ZXAtYWZ0ZXIiOlNpLGJhc2lzOnppLCJiYXNpcy1vcGVuIjpMaSwiYmFzaXMtY2xvc2VkIjpxaSxidW5kbGU6VGksY2FyZGluYWw6RWksImNhcmRpbmFsLW9wZW4iOmtpLCJjYXJkaW5hbC1jbG9zZWQiOk5pLG1vbm90b25lOkZpfSk7VGwuZm9yRWFjaChmdW5jdGlvbihuLHQpe3Qua2V5PW4sdC5jbG9zZWQ9Ly1jbG9zZWQkLy50ZXN0KG4pfSk7dmFyIFJsPVswLDIvMywxLzMsMF0sRGw9WzAsMS8zLDIvMywwXSxQbD1bMCwxLzYsMi8zLDEvNl07b2Euc3ZnLmxpbmUucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49TWkoSGkpO3JldHVybiBuLnJhZGl1cz1uLngsZGVsZXRlIG4ueCxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG59LHdpLnJldmVyc2U9U2ksU2kucmV2ZXJzZT13aSxvYS5zdmcuYXJlYT1mdW5jdGlvbigpe3JldHVybiBPaSh5KX0sb2Euc3ZnLmFyZWEucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49T2koSGkpO3JldHVybiBuLnJhZGl1cz1uLngsZGVsZXRlIG4ueCxuLmlubmVyUmFkaXVzPW4ueDAsZGVsZXRlIG4ueDAsbi5vdXRlclJhZGl1cz1uLngxLGRlbGV0ZSBuLngxLG4uYW5nbGU9bi55LGRlbGV0ZSBuLnksbi5zdGFydEFuZ2xlPW4ueTAsZGVsZXRlIG4ueTAsbi5lbmRBbmdsZT1uLnkxLGRlbGV0ZSBuLnkxLG59LG9hLnN2Zy5jaG9yZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixvKXt2YXIgbD10KHRoaXMsaSxuLG8pLGM9dCh0aGlzLGEsbixvKTtyZXR1cm4iTSIrbC5wMCtyKGwucixsLnAxLGwuYTEtbC5hMCkrKGUobCxjKT91KGwucixsLnAxLGwucixsLnAwKTp1KGwucixsLnAxLGMucixjLnAwKStyKGMucixjLnAxLGMuYTEtYy5hMCkrdShjLnIsYy5wMSxsLnIsbC5wMCkpKyJaIn1mdW5jdGlvbiB0KG4sdCxlLHIpe3ZhciB1PXQuY2FsbChuLGUsciksaT1vLmNhbGwobix1LHIpLGE9bC5jYWxsKG4sdSxyKS1PYSxzPWMuY2FsbChuLHUsciktT2E7cmV0dXJue3I6aSxhMDphLGExOnMscDA6W2kqTWF0aC5jb3MoYSksaSpNYXRoLnNpbihhKV0scDE6W2kqTWF0aC5jb3MocyksaSpNYXRoLnNpbihzKV19fWZ1bmN0aW9uIGUobix0KXtyZXR1cm4gbi5hMD09dC5hMCYmbi5hMT09dC5hMX1mdW5jdGlvbiByKG4sdCxlKXtyZXR1cm4iQSIrbisiLCIrbisiIDAgIisgKyhlPmphKSsiLDEgIit0fWZ1bmN0aW9uIHUobix0LGUscil7cmV0dXJuIlEgMCwwICIrcn12YXIgaT1NZSxhPXhlLG89SWksbD1waSxjPXZpO3JldHVybiBuLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1Fbih0KSxuKTpvfSxuLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1Fbih0KSxuKTppfSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1Fbih0KSxuKTphfSxuLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9RW4odCksbik6bH0sbi5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1Fbih0KSxuKTpjfSxufSxvYS5zdmcuZGlhZ29uYWw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sdSl7dmFyIGk9dC5jYWxsKHRoaXMsbix1KSxhPWUuY2FsbCh0aGlzLG4sdSksbz0oaS55K2EueSkvMixsPVtpLHt4OmkueCx5Om99LHt4OmEueCx5Om99LGFdO3JldHVybiBsPWwubWFwKHIpLCJNIitsWzBdKyJDIitsWzFdKyIgIitsWzJdKyIgIitsWzNdfXZhciB0PU1lLGU9eGUscj1ZaTtyZXR1cm4gbi5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9RW4oZSksbik6dH0sbi50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9RW4odCksbik6ZX0sbi5wcm9qZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbn0sb2Euc3ZnLmRpYWdvbmFsLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPW9hLnN2Zy5kaWFnb25hbCgpLHQ9WWksZT1uLnByb2plY3Rpb247cmV0dXJuIG4ucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKFppKHQ9bikpOnR9LG59LG9hLnN2Zy5zeW1ib2w9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4scil7cmV0dXJuKFVsLmdldCh0LmNhbGwodGhpcyxuLHIpKXx8JGkpKGUuY2FsbCh0aGlzLG4scikpfXZhciB0PVhpLGU9Vmk7cmV0dXJuIG4udHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1FbihlKSxuKTp0fSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9RW4odCksbik6ZX0sbn07dmFyIFVsPW9hLm1hcCh7Y2lyY2xlOiRpLGNyb3NzOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuLzUpLzI7cmV0dXJuIk0iKy0zKnQrIiwiKy10KyJIIistdCsiViIrLTMqdCsiSCIrdCsiViIrLXQrIkgiKzMqdCsiViIrdCsiSCIrdCsiViIrMyp0KyJIIistdCsiViIrdCsiSCIrLTMqdCsiWiJ9LGRpYW1vbmQ6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vKDIqRmwpKSxlPXQqRmw7cmV0dXJuIk0wLCIrLXQrIkwiK2UrIiwwIDAsIit0KyIgIistZSsiLDBaIn0sc3F1YXJlOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuKS8yO3JldHVybiJNIistdCsiLCIrLXQrIkwiK3QrIiwiKy10KyIgIit0KyIsIit0KyIgIistdCsiLCIrdCsiWiJ9LCJ0cmlhbmdsZS1kb3duIjpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi9qbCksZT10KmpsLzI7cmV0dXJuIk0wLCIrZSsiTCIrdCsiLCIrLWUrIiAiKy10KyIsIistZSsiWiJ9LCJ0cmlhbmdsZS11cCI6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vamwpLGU9dCpqbC8yO3JldHVybiJNMCwiKy1lKyJMIit0KyIsIitlKyIgIistdCsiLCIrZSsiWiJ9fSk7b2Euc3ZnLnN5bWJvbFR5cGVzPVVsLmtleXMoKTt2YXIgamw9TWF0aC5zcXJ0KDMpLEZsPU1hdGgudGFuKDMwKklhKTtBYS50cmFuc2l0aW9uPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHI9SGx8fCsrWmwsdT1LaShuKSxpPVtdLGE9T2x8fHt0aW1lOkRhdGUubm93KCksZWFzZTpOcixkZWxheTowLGR1cmF0aW9uOjI1MH0sbz0tMSxsPXRoaXMubGVuZ3RoOysrbzxsOyl7aS5wdXNoKHQ9W10pO2Zvcih2YXIgYz10aGlzW29dLHM9LTEsZj1jLmxlbmd0aDsrK3M8ZjspKGU9Y1tzXSkmJlFpKGUscyx1LHIsYSksdC5wdXNoKGUpfXJldHVybiBXaShpLHUscil9LEFhLmludGVycnVwdD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5lYWNoKG51bGw9PW4/SWw6QmkoS2kobikpKX07dmFyIEhsLE9sLElsPUJpKEtpKCkpLFlsPVtdLFpsPTA7WWwuY2FsbD1BYS5jYWxsLFlsLmVtcHR5PUFhLmVtcHR5LFlsLm5vZGU9QWEubm9kZSxZbC5zaXplPUFhLnNpemUsb2EudHJhbnNpdGlvbj1mdW5jdGlvbihuLHQpe3JldHVybiBuJiZuLnRyYW5zaXRpb24/SGw/bi50cmFuc2l0aW9uKHQpOm46b2Euc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuKX0sb2EudHJhbnNpdGlvbi5wcm90b3R5cGU9WWwsWWwuc2VsZWN0PWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PXRoaXMuaWQsaT10aGlzLm5hbWVzcGFjZSxhPVtdO249QShuKTtmb3IodmFyIG89LTEsbD10aGlzLmxlbmd0aDsrK288bDspe2EucHVzaCh0PVtdKTtmb3IodmFyIGM9dGhpc1tvXSxzPS0xLGY9Yy5sZW5ndGg7KytzPGY7KShyPWNbc10pJiYoZT1uLmNhbGwocixyLl9fZGF0YV9fLHMsbykpPygiX19kYXRhX18iaW4gciYmKGUuX19kYXRhX189ci5fX2RhdGFfXyksUWkoZSxzLGksdSxyW2ldW3VdKSx0LnB1c2goZSkpOnQucHVzaChudWxsKX1yZXR1cm4gV2koYSxpLHUpfSxZbC5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaSxhPXRoaXMuaWQsbz10aGlzLm5hbWVzcGFjZSxsPVtdO249QyhuKTtmb3IodmFyIGM9LTEscz10aGlzLmxlbmd0aDsrK2M8czspZm9yKHZhciBmPXRoaXNbY10saD0tMSxnPWYubGVuZ3RoOysraDxnOylpZihyPWZbaF0pe2k9cltvXVthXSxlPW4uY2FsbChyLHIuX19kYXRhX18saCxjKSxsLnB1c2godD1bXSk7Zm9yKHZhciBwPS0xLHY9ZS5sZW5ndGg7KytwPHY7KSh1PWVbcF0pJiZRaSh1LHAsbyxhLGkpLHQucHVzaCh1KX1yZXR1cm4gV2kobCxvLGEpfSxZbC5maWx0ZXI9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9W107ImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPU8obikpO2Zvcih2YXIgaT0wLGE9dGhpcy5sZW5ndGg7YT5pO2krKyl7dS5wdXNoKHQ9W10pO2Zvcih2YXIgZT10aGlzW2ldLG89MCxsPWUubGVuZ3RoO2w+bztvKyspKHI9ZVtvXSkmJm4uY2FsbChyLHIuX19kYXRhX18sbyxpKSYmdC5wdXNoKHIpfXJldHVybiBXaSh1LHRoaXMubmFtZXNwYWNlLHRoaXMuaWQpfSxZbC50d2Vlbj1mdW5jdGlvbihuLHQpe3ZhciBlPXRoaXMuaWQscj10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP3RoaXMubm9kZSgpW3JdW2VdLnR3ZWVuLmdldChuKTpZKHRoaXMsbnVsbD09dD9mdW5jdGlvbih0KXt0W3JdW2VdLnR3ZWVuLnJlbW92ZShuKX06ZnVuY3Rpb24odSl7dVtyXVtlXS50d2Vlbi5zZXQobix0KX0pfSxZbC5hdHRyPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG8pfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG8uc3BhY2Usby5sb2NhbCl9ZnVuY3Rpb24gdShuKXtyZXR1cm4gbnVsbD09bj9lOihuKz0iIixmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5nZXRBdHRyaWJ1dGUobyk7cmV0dXJuIGUhPT1uJiYodD1hKGUsbiksZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGUobyx0KG4pKX0pfSl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbnVsbD09bj9yOihuKz0iIixmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5nZXRBdHRyaWJ1dGVOUyhvLnNwYWNlLG8ubG9jYWwpO3JldHVybiBlIT09biYmKHQ9YShlLG4pLGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlMoby5zcGFjZSxvLmxvY2FsLHQobikpfSl9KX1pZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih0IGluIG4pdGhpcy5hdHRyKHQsblt0XSk7cmV0dXJuIHRoaXN9dmFyIGE9InRyYW5zZm9ybSI9PW4/JHI6TXIsbz1vYS5ucy5xdWFsaWZ5KG4pO3JldHVybiBKaSh0aGlzLCJhdHRyLiIrbix0LG8ubG9jYWw/aTp1KX0sWWwuYXR0clR3ZWVuPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuLGUpe3ZhciByPXQuY2FsbCh0aGlzLG4sZSx0aGlzLmdldEF0dHJpYnV0ZSh1KSk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlKHUscihuKSl9fWZ1bmN0aW9uIHIobixlKXt2YXIgcj10LmNhbGwodGhpcyxuLGUsdGhpcy5nZXRBdHRyaWJ1dGVOUyh1LnNwYWNlLHUubG9jYWwpKTtyZXR1cm4gciYmZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGVOUyh1LnNwYWNlLHUubG9jYWwscihuKSl9fXZhciB1PW9hLm5zLnF1YWxpZnkobik7cmV0dXJuIHRoaXMudHdlZW4oImF0dHIuIituLHUubG9jYWw/cjplKX0sWWwuc3R5bGU9ZnVuY3Rpb24obixlLHIpe2Z1bmN0aW9uIHUoKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG4pfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIG51bGw9PWU/dTooZSs9IiIsZnVuY3Rpb24oKXt2YXIgdSxpPXQodGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUobik7cmV0dXJuIGkhPT1lJiYodT1NcihpLGUpLGZ1bmN0aW9uKHQpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobix1KHQpLHIpfSl9KX12YXIgYT1hcmd1bWVudHMubGVuZ3RoO2lmKDM+YSl7aWYoInN0cmluZyIhPXR5cGVvZiBuKXsyPmEmJihlPSIiKTtmb3IociBpbiBuKXRoaXMuc3R5bGUocixuW3JdLGUpO3JldHVybiB0aGlzfXI9IiJ9cmV0dXJuIEppKHRoaXMsInN0eWxlLiIrbixlLGkpfSxZbC5zdHlsZVR3ZWVuPWZ1bmN0aW9uKG4sZSxyKXtmdW5jdGlvbiB1KHUsaSl7dmFyIGE9ZS5jYWxsKHRoaXMsdSxpLHQodGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUobikpO3JldHVybiBhJiZmdW5jdGlvbih0KXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4sYSh0KSxyKX19cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9IiIpLHRoaXMudHdlZW4oInN0eWxlLiIrbix1KX0sWWwudGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gSmkodGhpcywidGV4dCIsbixHaSl9LFlsLnJlbW92ZT1mdW5jdGlvbigpe3ZhciBuPXRoaXMubmFtZXNwYWNlO3JldHVybiB0aGlzLmVhY2goImVuZC50cmFuc2l0aW9uIixmdW5jdGlvbigpe3ZhciB0O3RoaXNbbl0uY291bnQ8MiYmKHQ9dGhpcy5wYXJlbnROb2RlKSYmdC5yZW1vdmVDaGlsZCh0aGlzKX0pfSxZbC5lYXNlPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQsZT10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP3RoaXMubm9kZSgpW2VdW3RdLmVhc2U6KCJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1vYS5lYXNlLmFwcGx5KG9hLGFyZ3VtZW50cykpLFkodGhpcyxmdW5jdGlvbihyKXtyW2VdW3RdLmVhc2U9bn0pKX0sWWwuZGVsYXk9ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZGVsYXk6WSh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHIsdSxpKXtyW2VdW3RdLmRlbGF5PStuLmNhbGwocixyLl9fZGF0YV9fLHUsaSl9OihuPStuLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZGVsYXk9bn0pKX0sWWwuZHVyYXRpb249ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZHVyYXRpb246WSh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHIsdSxpKXtyW2VdW3RdLmR1cmF0aW9uPU1hdGgubWF4KDEsbi5jYWxsKHIsci5fX2RhdGFfXyx1LGkpKX06KG49TWF0aC5tYXgoMSxuKSxmdW5jdGlvbihyKXtyW2VdW3RdLmR1cmF0aW9uPW59KSl9LFlsLmVhY2g9ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgdT1PbCxpPUhsO3RyeXtIbD1lLFkodGhpcyxmdW5jdGlvbih0LHUsaSl7T2w9dFtyXVtlXSxuLmNhbGwodCx0Ll9fZGF0YV9fLHUsaSl9KX1maW5hbGx5e09sPXUsSGw9aX19ZWxzZSBZKHRoaXMsZnVuY3Rpb24odSl7dmFyIGk9dVtyXVtlXTsoaS5ldmVudHx8KGkuZXZlbnQ9b2EuZGlzcGF0Y2goInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IikpKS5vbihuLHQpfSk7cmV0dXJuIHRoaXN9LFlsLnRyYW5zaXRpb249ZnVuY3Rpb24oKXtmb3IodmFyIG4sdCxlLHIsdT10aGlzLmlkLGk9KytabCxhPXRoaXMubmFtZXNwYWNlLG89W10sbD0wLGM9dGhpcy5sZW5ndGg7Yz5sO2wrKyl7by5wdXNoKG49W10pO2Zvcih2YXIgdD10aGlzW2xdLHM9MCxmPXQubGVuZ3RoO2Y+cztzKyspKGU9dFtzXSkmJihyPWVbYV1bdV0sUWkoZSxzLGEsaSx7dGltZTpyLnRpbWUsZWFzZTpyLmVhc2UsZGVsYXk6ci5kZWxheStyLmR1cmF0aW9uLGR1cmF0aW9uOnIuZHVyYXRpb259KSksbi5wdXNoKGUpfXJldHVybiBXaShvLGEsaSl9LG9hLnN2Zy5heGlzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbixjPW9hLnNlbGVjdCh0aGlzKSxzPXRoaXMuX19jaGFydF9ffHxlLGY9dGhpcy5fX2NoYXJ0X189ZS5jb3B5KCksaD1udWxsPT1sP2YudGlja3M/Zi50aWNrcy5hcHBseShmLG8pOmYuZG9tYWluKCk6bCxnPW51bGw9PXQ/Zi50aWNrRm9ybWF0P2YudGlja0Zvcm1hdC5hcHBseShmLG8pOnk6dCxwPWMuc2VsZWN0QWxsKCIudGljayIpLmRhdGEoaCxmKSx2PXAuZW50ZXIoKS5pbnNlcnQoImciLCIuZG9tYWluIikuYXR0cigiY2xhc3MiLCJ0aWNrIikuc3R5bGUoIm9wYWNpdHkiLFBhKSxkPW9hLnRyYW5zaXRpb24ocC5leGl0KCkpLnN0eWxlKCJvcGFjaXR5IixQYSkucmVtb3ZlKCksbT1vYS50cmFuc2l0aW9uKHAub3JkZXIoKSkuc3R5bGUoIm9wYWNpdHkiLDEpLE09TWF0aC5tYXgodSwwKSthLHg9WnUoZiksYj1jLnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoWzBdKSxfPShiLmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJkb21haW4iKSxvYS50cmFuc2l0aW9uKGIpKTt2LmFwcGVuZCgibGluZSIpLHYuYXBwZW5kKCJ0ZXh0Iik7dmFyIHcsUyxrLE4sRT12LnNlbGVjdCgibGluZSIpLEE9bS5zZWxlY3QoImxpbmUiKSxDPXAuc2VsZWN0KCJ0ZXh0IikudGV4dChnKSx6PXYuc2VsZWN0KCJ0ZXh0IiksTD1tLnNlbGVjdCgidGV4dCIpLHE9InRvcCI9PT1yfHwibGVmdCI9PT1yPy0xOjE7aWYoImJvdHRvbSI9PT1yfHwidG9wIj09PXI/KG49bmEsdz0ieCIsaz0ieSIsUz0ieDIiLE49InkyIixDLmF0dHIoImR5IiwwPnE/IjBlbSI6Ii43MWVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIiksXy5hdHRyKCJkIiwiTSIreFswXSsiLCIrcSppKyJWMEgiK3hbMV0rIlYiK3EqaSkpOihuPXRhLHc9InkiLGs9IngiLFM9InkyIixOPSJ4MiIsQy5hdHRyKCJkeSIsIi4zMmVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwwPnE/ImVuZCI6InN0YXJ0IiksXy5hdHRyKCJkIiwiTSIrcSppKyIsIit4WzBdKyJIMFYiK3hbMV0rIkgiK3EqaSkpLEUuYXR0cihOLHEqdSksei5hdHRyKGsscSpNKSxBLmF0dHIoUywwKS5hdHRyKE4scSp1KSxMLmF0dHIodywwKS5hdHRyKGsscSpNKSxmLnJhbmdlQmFuZCl7dmFyIFQ9ZixSPVQucmFuZ2VCYW5kKCkvMjtzPWY9ZnVuY3Rpb24obil7cmV0dXJuIFQobikrUn19ZWxzZSBzLnJhbmdlQmFuZD9zPWY6ZC5jYWxsKG4sZixzKTt2LmNhbGwobixzLGYpLG0uY2FsbChuLGYsZil9KX12YXIgdCxlPW9hLnNjYWxlLmxpbmVhcigpLHI9VmwsdT02LGk9NixhPTMsbz1bMTBdLGw9bnVsbDtyZXR1cm4gbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4ub3JpZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQgaW4gWGw/dCsiIjpWbCxuKTpyfSxuLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89Y2EoYXJndW1lbnRzKSxuKTpvfSxuLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCxuKTpsfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIGU/KHU9K3QsaT0rYXJndW1lbnRzW2UtMV0sbik6dX0sbi5pbm5lclRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LG4pOnV9LG4ub3V0ZXJUaWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKTppfSxuLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LG4pOmF9LG4udGlja1N1YmRpdmlkZT1mdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoJiZufSxufTt2YXIgVmw9ImJvdHRvbSIsWGw9e3RvcDoxLHJpZ2h0OjEsYm90dG9tOjEsbGVmdDoxfTtvYS5zdmcuYnJ1c2g9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQpe3QuZWFjaChmdW5jdGlvbigpe3ZhciB0PW9hLnNlbGVjdCh0aGlzKS5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2giLGkpLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIixpKSxhPXQuc2VsZWN0QWxsKCIuYmFja2dyb3VuZCIpLmRhdGEoWzBdKTthLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJiYWNrZ3JvdW5kIikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKS5zdHlsZSgiY3Vyc29yIiwiY3Jvc3NoYWlyIiksdC5zZWxlY3RBbGwoIi5leHRlbnQiKS5kYXRhKFswXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImV4dGVudCIpLnN0eWxlKCJjdXJzb3IiLCJtb3ZlIik7dmFyIG89dC5zZWxlY3RBbGwoIi5yZXNpemUiKS5kYXRhKHYseSk7by5leGl0KCkucmVtb3ZlKCksby5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIixmdW5jdGlvbihuKXtyZXR1cm4icmVzaXplICIrbn0pLnN0eWxlKCJjdXJzb3IiLGZ1bmN0aW9uKG4pe3JldHVybiAkbFtuXX0pLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLGZ1bmN0aW9uKG4pe3JldHVybi9bZXddJC8udGVzdChuKT8tMzpudWxsfSkuYXR0cigieSIsZnVuY3Rpb24obil7cmV0dXJuL15bbnNdLy50ZXN0KG4pPy0zOm51bGx9KS5hdHRyKCJ3aWR0aCIsNikuYXR0cigiaGVpZ2h0Iiw2KS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpLG8uc3R5bGUoImRpc3BsYXkiLG4uZW1wdHkoKT8ibm9uZSI6bnVsbCk7dmFyIGwsZj1vYS50cmFuc2l0aW9uKHQpLGg9b2EudHJhbnNpdGlvbihhKTtjJiYobD1adShjKSxoLmF0dHIoIngiLGxbMF0pLmF0dHIoIndpZHRoIixsWzFdLWxbMF0pLHIoZikpLHMmJihsPVp1KHMpLGguYXR0cigieSIsbFswXSkuYXR0cigiaGVpZ2h0IixsWzFdLWxbMF0pLHUoZikpLGUoZil9KX1mdW5jdGlvbiBlKG4pe24uc2VsZWN0QWxsKCIucmVzaXplIikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXtyZXR1cm4idHJhbnNsYXRlKCIrZlsrL2UkLy50ZXN0KG4pXSsiLCIraFsrL15zLy50ZXN0KG4pXSsiKSJ9KX1mdW5jdGlvbiByKG4pe24uc2VsZWN0KCIuZXh0ZW50IikuYXR0cigieCIsZlswXSksbi5zZWxlY3RBbGwoIi5leHRlbnQsLm4+cmVjdCwucz5yZWN0IikuYXR0cigid2lkdGgiLGZbMV0tZlswXSl9ZnVuY3Rpb24gdShuKXtuLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoInkiLGhbMF0pLG4uc2VsZWN0QWxsKCIuZXh0ZW50LC5lPnJlY3QsLnc+cmVjdCIpLmF0dHIoImhlaWdodCIsaFsxXS1oWzBdKX1mdW5jdGlvbiBpKCl7ZnVuY3Rpb24gaSgpezMyPT1vYS5ldmVudC5rZXlDb2RlJiYoQ3x8KE09bnVsbCxMWzBdLT1mWzFdLExbMV0tPWhbMV0sQz0yKSxTKCkpfWZ1bmN0aW9uIHYoKXszMj09b2EuZXZlbnQua2V5Q29kZSYmMj09QyYmKExbMF0rPWZbMV0sTFsxXSs9aFsxXSxDPTAsUygpKX1mdW5jdGlvbiBkKCl7dmFyIG49b2EubW91c2UoYiksdD0hMTt4JiYoblswXSs9eFswXSxuWzFdKz14WzFdKSxDfHwob2EuZXZlbnQuYWx0S2V5PyhNfHwoTT1bKGZbMF0rZlsxXSkvMiwoaFswXStoWzFdKS8yXSksTFswXT1mWysoblswXTxNWzBdKV0sTFsxXT1oWysoblsxXTxNWzFdKV0pOk09bnVsbCksRSYmbShuLGMsMCkmJihyKGspLHQ9ITApLEEmJm0obixzLDEpJiYodShrKSx0PSEwKSx0JiYoZShrKSx3KHt0eXBlOiJicnVzaCIsbW9kZTpDPyJtb3ZlIjoicmVzaXplIn0pKX1mdW5jdGlvbiBtKG4sdCxlKXt2YXIgcix1LGk9WnUodCksbD1pWzBdLGM9aVsxXSxzPUxbZV0sdj1lP2g6ZixkPXZbMV0tdlswXTtyZXR1cm4gQyYmKGwtPXMsYy09ZCtzKSxyPShlP3A6Zyk/TWF0aC5tYXgobCxNYXRoLm1pbihjLG5bZV0pKTpuW2VdLEM/dT0ocis9cykrZDooTSYmKHM9TWF0aC5tYXgobCxNYXRoLm1pbihjLDIqTVtlXS1yKSkpLHI+cz8odT1yLHI9cyk6dT1zKSx2WzBdIT1yfHx2WzFdIT11PyhlP289bnVsbDphPW51bGwsdlswXT1yLHZbMV09dSwhMCk6dm9pZCAwfWZ1bmN0aW9uIHkoKXtkKCksay5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsbi5lbXB0eSgpPyJub25lIjpudWxsKSxvYS5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIixudWxsKSxxLm9uKCJtb3VzZW1vdmUuYnJ1c2giLG51bGwpLm9uKCJtb3VzZXVwLmJydXNoIixudWxsKS5vbigidG91Y2htb3ZlLmJydXNoIixudWxsKS5vbigidG91Y2hlbmQuYnJ1c2giLG51bGwpLm9uKCJrZXlkb3duLmJydXNoIixudWxsKS5vbigia2V5dXAuYnJ1c2giLG51bGwpLHooKSx3KHt0eXBlOiJicnVzaGVuZCJ9KX12YXIgTSx4LGI9dGhpcyxfPW9hLnNlbGVjdChvYS5ldmVudC50YXJnZXQpLHc9bC5vZihiLGFyZ3VtZW50cyksaz1vYS5zZWxlY3QoYiksTj1fLmRhdHVtKCksRT0hL14obnxzKSQvLnRlc3QoTikmJmMsQT0hL14oZXx3KSQvLnRlc3QoTikmJnMsQz1fLmNsYXNzZWQoImV4dGVudCIpLHo9VyhiKSxMPW9hLm1vdXNlKGIpLHE9b2Euc2VsZWN0KHQoYikpLm9uKCJrZXlkb3duLmJydXNoIixpKS5vbigia2V5dXAuYnJ1c2giLHYpO2lmKG9hLmV2ZW50LmNoYW5nZWRUb3VjaGVzP3Eub24oInRvdWNobW92ZS5icnVzaCIsZCkub24oInRvdWNoZW5kLmJydXNoIix5KTpxLm9uKCJtb3VzZW1vdmUuYnJ1c2giLGQpLm9uKCJtb3VzZXVwLmJydXNoIix5KSxrLmludGVycnVwdCgpLnNlbGVjdEFsbCgiKiIpLmludGVycnVwdCgpLEMpTFswXT1mWzBdLUxbMF0sTFsxXT1oWzBdLUxbMV07ZWxzZSBpZihOKXt2YXIgVD0rL3ckLy50ZXN0KE4pLFI9Ky9ebi8udGVzdChOKTt4PVtmWzEtVF0tTFswXSxoWzEtUl0tTFsxXV0sTFswXT1mW1RdLExbMV09aFtSXX1lbHNlIG9hLmV2ZW50LmFsdEtleSYmKE09TC5zbGljZSgpKTtrLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsbnVsbCksb2Euc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsXy5zdHlsZSgiY3Vyc29yIikpLHcoe3R5cGU6ImJydXNoc3RhcnQifSksZCgpfXZhciBhLG8sbD1OKG4sImJydXNoc3RhcnQiLCJicnVzaCIsImJydXNoZW5kIiksYz1udWxsLHM9bnVsbCxmPVswLDBdLGg9WzAsMF0sZz0hMCxwPSEwLHY9QmxbMF07cmV0dXJuIG4uZXZlbnQ9ZnVuY3Rpb24obil7bi5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49bC5vZih0aGlzLGFyZ3VtZW50cyksdD17eDpmLHk6aCxpOmEsajpvfSxlPXRoaXMuX19jaGFydF9ffHx0O3RoaXMuX19jaGFydF9fPXQsSGw/b2Euc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC5icnVzaCIsZnVuY3Rpb24oKXthPWUuaSxvPWUuaixmPWUueCxoPWUueSxuKHt0eXBlOiJicnVzaHN0YXJ0In0pfSkudHdlZW4oImJydXNoOmJydXNoIixmdW5jdGlvbigpe3ZhciBlPXhyKGYsdC54KSxyPXhyKGgsdC55KTtyZXR1cm4gYT1vPW51bGwsZnVuY3Rpb24odSl7Zj10Lng9ZSh1KSxoPXQueT1yKHUpLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSl9fSkuZWFjaCgiZW5kLmJydXNoIixmdW5jdGlvbigpe2E9dC5pLG89dC5qLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSksbih7dHlwZToiYnJ1c2hlbmQifSl9KToobih7dHlwZToiYnJ1c2hzdGFydCJ9KSxuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLG4oe3R5cGU6ImJydXNoZW5kIn0pKX0pfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9dCx2PUJsWyFjPDwxfCFzXSxuKTpjfSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9dCx2PUJsWyFjPDwxfCFzXSxuKTpzfSxuLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjJiZzPyhnPSEhdFswXSxwPSEhdFsxXSk6Yz9nPSEhdDpzJiYocD0hIXQpLG4pOmMmJnM/W2cscF06Yz9nOnM/cDpudWxsfSxuLmV4dGVudD1mdW5jdGlvbih0KXt2YXIgZSxyLHUsaSxsO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjJiYoZT10WzBdLHI9dFsxXSxzJiYoZT1lWzBdLHI9clswXSksYT1bZSxyXSxjLmludmVydCYmKGU9YyhlKSxyPWMocikpLGU+ciYmKGw9ZSxlPXIscj1sKSwoZSE9ZlswXXx8ciE9ZlsxXSkmJihmPVtlLHJdKSkscyYmKHU9dFswXSxpPXRbMV0sYyYmKHU9dVsxXSxpPWlbMV0pLG89W3UsaV0scy5pbnZlcnQmJih1PXModSksaT1zKGkpKSx1PmkmJihsPXUsdT1pLGk9bCksKHUhPWhbMF18fGkhPWhbMV0pJiYoaD1bdSxpXSkpLG4pOihjJiYoYT8oZT1hWzBdLHI9YVsxXSk6KGU9ZlswXSxyPWZbMV0sYy5pbnZlcnQmJihlPWMuaW52ZXJ0KGUpLHI9Yy5pbnZlcnQocikpLGU+ciYmKGw9ZSxlPXIscj1sKSkpLHMmJihvPyh1PW9bMF0saT1vWzFdKToodT1oWzBdLGk9aFsxXSxzLmludmVydCYmKHU9cy5pbnZlcnQodSksaT1zLmludmVydChpKSksdT5pJiYobD11LHU9aSxpPWwpKSksYyYmcz9bW2UsdV0sW3IsaV1dOmM/W2Uscl06cyYmW3UsaV0pfSxuLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIG4uZW1wdHkoKXx8KGY9WzAsMF0saD1bMCwwXSxhPW89bnVsbCksbn0sbi5lbXB0eT1mdW5jdGlvbigpe3JldHVybiEhYyYmZlswXT09ZlsxXXx8ISFzJiZoWzBdPT1oWzFdfSxvYS5yZWJpbmQobixsLCJvbiIpfTt2YXIgJGw9e246Im5zLXJlc2l6ZSIsZToiZXctcmVzaXplIixzOiJucy1yZXNpemUiLHc6ImV3LXJlc2l6ZSIsbnc6Im53c2UtcmVzaXplIixuZToibmVzdy1yZXNpemUiLHNlOiJud3NlLXJlc2l6ZSIsc3c6Im5lc3ctcmVzaXplIn0sQmw9W1sibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0sWyJlIiwidyJdLFsibiIsInMiXSxbXV0sV2w9Z28uZm9ybWF0PXhvLnRpbWVGb3JtYXQsSmw9V2wudXRjLEdsPUpsKCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKTtXbC5pc289RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcmJituZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIik/ZWE6R2wsZWEucGFyc2U9ZnVuY3Rpb24obil7dmFyIHQ9bmV3IERhdGUobik7cmV0dXJuIGlzTmFOKHQpP251bGw6dH0sZWEudG9TdHJpbmc9R2wudG9TdHJpbmcsZ28uc2Vjb25kPU9uKGZ1bmN0aW9uKG4pe3JldHVybiBuZXcgcG8oMWUzKk1hdGguZmxvb3Iobi8xZTMpKX0sZnVuY3Rpb24obix0KXtuLnNldFRpbWUobi5nZXRUaW1lKCkrMWUzKk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRTZWNvbmRzKCl9KSxnby5zZWNvbmRzPWdvLnNlY29uZC5yYW5nZSxnby5zZWNvbmRzLnV0Yz1nby5zZWNvbmQudXRjLnJhbmdlLGdvLm1pbnV0ZT1PbihmdW5jdGlvbihuKXtyZXR1cm4gbmV3IHBvKDZlNCpNYXRoLmZsb29yKG4vNmU0KSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzZlNCpNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWludXRlcygpfSksZ28ubWludXRlcz1nby5taW51dGUucmFuZ2UsZ28ubWludXRlcy51dGM9Z28ubWludXRlLnV0Yy5yYW5nZSxnby5ob3VyPU9uKGZ1bmN0aW9uKG4pe3ZhciB0PW4uZ2V0VGltZXpvbmVPZmZzZXQoKS82MDtyZXR1cm4gbmV3IHBvKDM2ZTUqKE1hdGguZmxvb3Iobi8zNmU1LXQpK3QpKX0sZnVuY3Rpb24obix0KXtuLnNldFRpbWUobi5nZXRUaW1lKCkrMzZlNSpNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0SG91cnMoKX0pLGdvLmhvdXJzPWdvLmhvdXIucmFuZ2UsZ28uaG91cnMudXRjPWdvLmhvdXIudXRjLnJhbmdlLGdvLm1vbnRoPU9uKGZ1bmN0aW9uKG4pe3JldHVybiBuPWdvLmRheShuKSxuLnNldERhdGUoMSksbn0sZnVuY3Rpb24obix0KXtuLnNldE1vbnRoKG4uZ2V0TW9udGgoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TW9udGgoKX0pLGdvLm1vbnRocz1nby5tb250aC5yYW5nZSxnby5tb250aHMudXRjPWdvLm1vbnRoLnV0Yy5yYW5nZTt2YXIgS2w9WzFlMyw1ZTMsMTVlMywzZTQsNmU0LDNlNSw5ZTUsMThlNSwzNmU1LDEwOGU1LDIxNmU1LDQzMmU1LDg2NGU1LDE3MjhlNSw2MDQ4ZTUsMjU5MmU2LDc3NzZlNiwzMTUzNmU2XSxRbD1bW2dvLnNlY29uZCwxXSxbZ28uc2Vjb25kLDVdLFtnby5zZWNvbmQsMTVdLFtnby5zZWNvbmQsMzBdLFtnby5taW51dGUsMV0sW2dvLm1pbnV0ZSw1XSxbZ28ubWludXRlLDE1XSxbZ28ubWludXRlLDMwXSxbZ28uaG91ciwxXSxbZ28uaG91ciwzXSxbZ28uaG91ciw2XSxbZ28uaG91ciwxMl0sW2dvLmRheSwxXSxbZ28uZGF5LDJdLFtnby53ZWVrLDFdLFtnby5tb250aCwxXSxbZ28ubW9udGgsM10sW2dvLnllYXIsMV1dLG5jPVdsLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0U2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0SG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpJiYxIT1uLmdldERhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiAxIT1uLmdldERhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1vbnRoKCl9XSxbIiVZIix6dF1dKSx0Yz17cmFuZ2U6ZnVuY3Rpb24obix0LGUpe3JldHVybiBvYS5yYW5nZShNYXRoLmNlaWwobi9lKSplLCt0LGUpLm1hcCh1YSl9LGZsb29yOnksY2VpbDp5fTtRbC55ZWFyPWdvLnllYXIsZ28uc2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gcmEob2Euc2NhbGUubGluZWFyKCksUWwsbmMpfTt2YXIgZWM9UWwubWFwKGZ1bmN0aW9uKG4pe3JldHVybltuWzBdLnV0YyxuWzFdXX0pLHJjPUpsLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDU2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDSG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ0RheSgpJiYxIT1uLmdldFVUQ0RhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiAxIT1uLmdldFVUQ0RhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCl9XSxbIiVZIix6dF1dKTtlYy55ZWFyPWdvLnllYXIudXRjLGdvLnNjYWxlLnV0Yz1mdW5jdGlvbigpe3JldHVybiByYShvYS5zY2FsZS5saW5lYXIoKSxlYyxyYyl9LG9hLnRleHQ9QW4oZnVuY3Rpb24obil7cmV0dXJuIG4ucmVzcG9uc2VUZXh0fSksb2EuanNvbj1mdW5jdGlvbihuLHQpe3JldHVybiBDbihuLCJhcHBsaWNhdGlvbi9qc29uIixpYSx0KX0sb2EuaHRtbD1mdW5jdGlvbihuLHQpe3JldHVybiBDbihuLCJ0ZXh0L2h0bWwiLGFhLHQpfSxvYS54bWw9QW4oZnVuY3Rpb24obil7cmV0dXJuIG4ucmVzcG9uc2VYTUx9KSwiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kPyh0aGlzLmQzPW9hLGRlZmluZShvYSkpOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1vYTp0aGlzLmQzPW9hfSgpOw=="></script>
<script src="data:application/x-javascript;base64,Ly8gZDMudGlwCi8vIENvcHlyaWdodCAoYykgMjAxMyBKdXN0aW4gUGFsbWVyCi8vCi8vIFRvb2x0aXBzIGZvciBkMy5qcyBTVkcgdmlzdWFsaXphdGlvbnMKCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZSB3aXRoIGQzIGFzIGEgZGVwZW5kZW5jeS4KICAgIGRlZmluZShbJ2QzJ10sIGZhY3RvcnkpOwogIH0gZWxzZSBpZiAodHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgIC8vIENvbW1vbkpTCiAgICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGQzKSB7CiAgICAgIGQzLnRpcCA9IGZhY3RvcnkoZDMpOwogICAgICByZXR1cm4gZDMudGlwOwogICAgfTsKICB9IGVsc2UgewogICAgLy8gQnJvd3NlciBnbG9iYWwuCiAgICByb290LmQzLnRpcCA9IGZhY3Rvcnkocm9vdC5kMyk7CiAgfQp9KHRoaXMsIGZ1bmN0aW9uIChkMykgewoKICAvLyBQdWJsaWMgLSBjb250cnVjdHMgYSBuZXcgdG9vbHRpcAogIC8vCiAgLy8gUmV0dXJucyBhIHRpcAogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIHZhciBkaXJlY3Rpb24gPSBkM190aXBfZGlyZWN0aW9uLAogICAgICAgIG9mZnNldCAgICA9IGQzX3RpcF9vZmZzZXQsCiAgICAgICAgaHRtbCAgICAgID0gZDNfdGlwX2h0bWwsCiAgICAgICAgbm9kZSAgICAgID0gaW5pdE5vZGUoKSwKICAgICAgICBzdmcgICAgICAgPSBudWxsLAogICAgICAgIHBvaW50ICAgICA9IG51bGwsCiAgICAgICAgdGFyZ2V0ICAgID0gbnVsbDsKCiAgICBmdW5jdGlvbiB0aXAodmlzKSB7CiAgICAgIHN2ZyA9IGdldFNWR05vZGUodmlzKTsKICAgICAgcG9pbnQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTsKICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub2RlKTsKICAgIH0KCiAgICAvLyBQdWJsaWMgLSBzaG93IHRoZSB0b29sdGlwIG9uIHRoZSBzY3JlZW4KICAgIC8vCiAgICAvLyBSZXR1cm5zIGEgdGlwCiAgICB0aXAuc2hvdyA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgIGlmKGFyZ3NbYXJncy5sZW5ndGggLSAxXSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHRhcmdldCA9IGFyZ3MucG9wKCk7CgogICAgICB2YXIgY29udGVudCA9IGh0bWwuYXBwbHkodGhpcywgYXJncyksCiAgICAgICAgICBwb2Zmc2V0ID0gb2Zmc2V0LmFwcGx5KHRoaXMsIGFyZ3MpLAogICAgICAgICAgZGlyICAgICA9IGRpcmVjdGlvbi5hcHBseSh0aGlzLCBhcmdzKSwKICAgICAgICAgIG5vZGVsICAgPSBnZXROb2RlRWwoKSwKICAgICAgICAgIGkgICAgICAgPSBkaXJlY3Rpb25zLmxlbmd0aCwKICAgICAgICAgIGNvb3JkcywKICAgICAgICAgIHNjcm9sbFRvcCAgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wLAogICAgICAgICAgc2Nyb2xsTGVmdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0IHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdDsKCiAgICAgIG5vZGVsLmh0bWwoY29udGVudCkKICAgICAgICAuc3R5bGUoeyBvcGFjaXR5OiAxLCAncG9pbnRlci1ldmVudHMnOiAnYWxsJyB9KTsKCiAgICAgIHdoaWxlKGktLSkgbm9kZWwuY2xhc3NlZChkaXJlY3Rpb25zW2ldLCBmYWxzZSk7CiAgICAgIGNvb3JkcyA9IGRpcmVjdGlvbl9jYWxsYmFja3MuZ2V0KGRpcikuYXBwbHkodGhpcyk7CiAgICAgIG5vZGVsLmNsYXNzZWQoZGlyLCB0cnVlKS5zdHlsZSh7CiAgICAgICAgLy90b3A6IChjb29yZHMudG9wICsgIHBvZmZzZXRbMF0pICsgc2Nyb2xsVG9wICsgJ3B4JywKICAgICAgICAvL2xlZnQ6IChjb29yZHMubGVmdCArIHBvZmZzZXRbMV0pICsgc2Nyb2xsTGVmdCArICdweCcKICAgICAgICB0b3A6IChjb29yZHMudG9wICsgIHBvZmZzZXRbMF0pICsgJ3B4JywKICAgICAgICBsZWZ0OiAoY29vcmRzLmxlZnQgKyBwb2Zmc2V0WzFdKSArICdweCcKICAgICAgfSk7CgogICAgICByZXR1cm4gdGlwOwogICAgfTsKCiAgICAvLyBQdWJsaWMgLSBoaWRlIHRoZSB0b29sdGlwCiAgICAvLwogICAgLy8gUmV0dXJucyBhIHRpcAogICAgdGlwLmhpZGUgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIG5vZGVsID0gZ2V0Tm9kZUVsKCk7CiAgICAgIG5vZGVsLnN0eWxlKHsgb3BhY2l0eTogMCwgJ3BvaW50ZXItZXZlbnRzJzogJ25vbmUnIH0pOwogICAgICByZXR1cm4gdGlwOwogICAgfTsKCiAgICAvLyBQdWJsaWM6IFByb3h5IGF0dHIgY2FsbHMgdG8gdGhlIGQzIHRpcCBjb250YWluZXIuICBTZXRzIG9yIGdldHMgYXR0cmlidXRlIHZhbHVlLgogICAgLy8KICAgIC8vIG4gLSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKICAgIC8vIHYgLSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlCiAgICAvLwogICAgLy8gUmV0dXJucyB0aXAgb3IgYXR0cmlidXRlIHZhbHVlCiAgICB0aXAuYXR0ciA9IGZ1bmN0aW9uKG4sIHYpIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyICYmIHR5cGVvZiBuID09PSAnc3RyaW5nJykgewogICAgICAgIHJldHVybiBnZXROb2RlRWwoKS5hdHRyKG4pOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBhcmdzID0gIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7CiAgICAgICAgZDMuc2VsZWN0aW9uLnByb3RvdHlwZS5hdHRyLmFwcGx5KGdldE5vZGVFbCgpLCBhcmdzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRpcDsKICAgIH07CgogICAgLy8gUHVibGljOiBQcm94eSBzdHlsZSBjYWxscyB0byB0aGUgZDMgdGlwIGNvbnRhaW5lci4gIFNldHMgb3IgZ2V0cyBhIHN0eWxlIHZhbHVlLgogICAgLy8KICAgIC8vIG4gLSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgLy8gdiAtIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQogICAgLy8KICAgIC8vIFJldHVybnMgdGlwIG9yIHN0eWxlIHByb3BlcnR5IHZhbHVlCiAgICB0aXAuc3R5bGUgPSBmdW5jdGlvbihuLCB2KSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMiAmJiB0eXBlb2YgbiA9PT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm4gZ2V0Tm9kZUVsKCkuc3R5bGUobik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGFyZ3MgPSAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICBkMy5zZWxlY3Rpb24ucHJvdG90eXBlLnN0eWxlLmFwcGx5KGdldE5vZGVFbCgpLCBhcmdzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRpcDsKICAgIH07CgogICAgLy8gUHVibGljOiBTZXQgb3IgZ2V0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHRvb2x0aXAKICAgIC8vCiAgICAvLyB2IC0gT25lIG9mIG4obm9ydGgpLCBzKHNvdXRoKSwgZShlYXN0KSwgb3Igdyh3ZXN0KSwgbncobm9ydGh3ZXN0KSwKICAgIC8vICAgICBzdyhzb3V0aHdlc3QpLCBuZShub3J0aGVhc3QpIG9yIHNlKHNvdXRoZWFzdCkKICAgIC8vCiAgICAvLyBSZXR1cm5zIHRpcCBvciBkaXJlY3Rpb24KICAgIHRpcC5kaXJlY3Rpb24gPSBmdW5jdGlvbih2KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRpcmVjdGlvbjsKICAgICAgZGlyZWN0aW9uID0gdiA9PT0gbnVsbCA/IHYgOiBkMy5mdW5jdG9yKHYpOwoKICAgICAgcmV0dXJuIHRpcDsKICAgIH07CgogICAgLy8gUHVibGljOiBTZXRzIG9yIGdldHMgdGhlIG9mZnNldCBvZiB0aGUgdGlwCiAgICAvLwogICAgLy8gdiAtIEFycmF5IG9mIFt4LCB5XSBvZmZzZXQKICAgIC8vCiAgICAvLyBSZXR1cm5zIG9mZnNldCBvcgogICAgdGlwLm9mZnNldCA9IGZ1bmN0aW9uKHYpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gb2Zmc2V0OwogICAgICBvZmZzZXQgPSB2ID09PSBudWxsID8gdiA6IGQzLmZ1bmN0b3Iodik7CgogICAgICByZXR1cm4gdGlwOwogICAgfTsKCiAgICAvLyBQdWJsaWM6IHNldHMgb3IgZ2V0cyB0aGUgaHRtbCB2YWx1ZSBvZiB0aGUgdG9vbHRpcAogICAgLy8KICAgIC8vIHYgLSBTdHJpbmcgdmFsdWUgb2YgdGhlIHRpcAogICAgLy8KICAgIC8vIFJldHVybnMgaHRtbCB2YWx1ZSBvciB0aXAKICAgIHRpcC5odG1sID0gZnVuY3Rpb24odikgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBodG1sOwogICAgICBodG1sID0gdiA9PT0gbnVsbCA/IHYgOiBkMy5mdW5jdG9yKHYpOwoKICAgICAgcmV0dXJuIHRpcDsKICAgIH07CgogICAgLy8gUHVibGljOiBkZXN0cm95cyB0aGUgdG9vbHRpcCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBET00KICAgIC8vCiAgICAvLyBSZXR1cm5zIGEgdGlwCiAgICB0aXAuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICBpZihub2RlKSB7CiAgICAgICAgZ2V0Tm9kZUVsKCkucmVtb3ZlKCk7CiAgICAgICAgbm9kZSA9IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHRpcDsKICAgIH07CgogICAgZnVuY3Rpb24gZDNfdGlwX2RpcmVjdGlvbigpIHsgcmV0dXJuICduJzsgfQogICAgZnVuY3Rpb24gZDNfdGlwX29mZnNldCgpIHsgcmV0dXJuIFswLCAwXTsgfQogICAgZnVuY3Rpb24gZDNfdGlwX2h0bWwoKSB7IHJldHVybiAnICc7IH0KCiAgICB2YXIgZGlyZWN0aW9uX2NhbGxiYWNrcyA9IGQzLm1hcCh7CiAgICAgIG46ICBkaXJlY3Rpb25fbiwKICAgICAgczogIGRpcmVjdGlvbl9zLAogICAgICBlOiAgZGlyZWN0aW9uX2UsCiAgICAgIHc6ICBkaXJlY3Rpb25fdywKICAgICAgbnc6IGRpcmVjdGlvbl9udywKICAgICAgbmU6IGRpcmVjdGlvbl9uZSwKICAgICAgc3c6IGRpcmVjdGlvbl9zdywKICAgICAgc2U6IGRpcmVjdGlvbl9zZSwKICAgICAgbXQ6IGRpcmVjdGlvbl9tdCwKICAgICAgbTogIGRpcmVjdGlvbl9tCiAgICB9KSwKCiAgICBkaXJlY3Rpb25zID0gZGlyZWN0aW9uX2NhbGxiYWNrcy5rZXlzKCk7CgogICAgLy8gbXQgLSBtb3VzZXRpcAogICAgZnVuY3Rpb24gZGlyZWN0aW9uX210KCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRvcDogZDMuZXZlbnQucGFnZVksCiAgICAgICAgICAgIGxlZnQ6IGQzLmV2ZW50LnBhZ2VYCiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXJlY3Rpb25fbigpIHsKICAgICAgdmFyIGJib3ggPSBnZXRTY3JlZW5CQm94KCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9wOiAgYmJveC5uLnkgLSBub2RlLm9mZnNldEhlaWdodCwKICAgICAgICBsZWZ0OiBiYm94Lm4ueCAtIG5vZGUub2Zmc2V0V2lkdGggLyAyCiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZGlyZWN0aW9uX3MoKSB7CiAgICAgIHZhciBiYm94ID0gZ2V0U2NyZWVuQkJveCgpOwogICAgICByZXR1cm4gewogICAgICAgIHRvcDogIGJib3gucy55LAogICAgICAgIGxlZnQ6IGJib3gucy54IC0gbm9kZS5vZmZzZXRXaWR0aCAvIDIKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXJlY3Rpb25fZSgpIHsKICAgICAgdmFyIGJib3ggPSBnZXRTY3JlZW5CQm94KCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9wOiAgYmJveC5lLnkgLSBub2RlLm9mZnNldEhlaWdodCAvIDIsCiAgICAgICAgbGVmdDogYmJveC5lLngKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXJlY3Rpb25fdygpIHsKICAgICAgdmFyIGJib3ggPSBnZXRTY3JlZW5CQm94KCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9wOiAgYmJveC53LnkgLSBub2RlLm9mZnNldEhlaWdodCAvIDIsCiAgICAgICAgbGVmdDogYmJveC53LnggLSBub2RlLm9mZnNldFdpZHRoCiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZGlyZWN0aW9uX253KCkgewogICAgICB2YXIgYmJveCA9IGdldFNjcmVlbkJCb3goKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b3A6ICBiYm94Lm53LnkgLSBub2RlLm9mZnNldEhlaWdodCwKICAgICAgICBsZWZ0OiBiYm94Lm53LnggLSBub2RlLm9mZnNldFdpZHRoCiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZGlyZWN0aW9uX25lKCkgewogICAgICB2YXIgYmJveCA9IGdldFNjcmVlbkJCb3goKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b3A6ICBiYm94Lm5lLnkgLSBub2RlLm9mZnNldEhlaWdodCwKICAgICAgICBsZWZ0OiBiYm94Lm5lLngKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXJlY3Rpb25fc3coKSB7CiAgICAgIHZhciBiYm94ID0gZ2V0U2NyZWVuQkJveCgpOwogICAgICByZXR1cm4gewogICAgICAgIHRvcDogIGJib3guc3cueSwKICAgICAgICBsZWZ0OiBiYm94LnN3LnggLSBub2RlLm9mZnNldFdpZHRoCiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZGlyZWN0aW9uX3NlKCkgewogICAgICB2YXIgYmJveCA9IGdldFNjcmVlbkJCb3goKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b3A6ICBiYm94LnNlLnksCiAgICAgICAgbGVmdDogYmJveC5zZS54CiAgICAgIH07CiAgICB9CgogICAgLy8gbWlkZGxlIG9mIHRoZSBiYm94CiAgICBmdW5jdGlvbiBkaXJlY3Rpb25fbSgpIHsKICAgICAgdmFyIGJib3ggPSBnZXRTY3JlZW5CQm94KCk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9wOiAgYmJveC5uZS55ICsgKGJib3guc3cueSAtIGJib3gubmUueSkgLyAyLAogICAgICAgIGxlZnQ6IGJib3gubncueCArIChiYm94Lm5lLnggLSBiYm94Lm53LngpIC8gMgogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGluaXROb2RlKCkgewogICAgICB2YXIgbm9kZSA9IGQzLnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7CiAgICAgIG5vZGUuc3R5bGUoewogICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgIHRvcDogMCwKICAgICAgICBvcGFjaXR5OiAwLAogICAgICAgICdwb2ludGVyLWV2ZW50cyc6ICdub25lJywKICAgICAgICAnYm94LXNpemluZyc6ICdib3JkZXItYm94JwogICAgICB9KTsKCiAgICAgIHJldHVybiBub2RlLm5vZGUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRTVkdOb2RlKGVsKSB7CiAgICAgIGVsID0gZWwubm9kZSgpOwogICAgICBpZihlbC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdmcnKQogICAgICAgIHJldHVybiBlbDsKCiAgICAgIHJldHVybiBlbC5vd25lclNWR0VsZW1lbnQ7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0Tm9kZUVsKCkgewogICAgICBpZihub2RlID09PSBudWxsKSB7CiAgICAgICAgbm9kZSA9IGluaXROb2RlKCk7CiAgICAgICAgLy8gcmUtYWRkIG5vZGUgdG8gRE9NCiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgfQogICAgICByZXR1cm4gZDMuc2VsZWN0KG5vZGUpOwogICAgfQoKICAgIC8vIFByaXZhdGUgLSBnZXRzIHRoZSBzY3JlZW4gY29vcmRpbmF0ZXMgb2YgYSBzaGFwZQogICAgLy8KICAgIC8vIEdpdmVuIGEgc2hhcGUgb24gdGhlIHNjcmVlbiwgd2lsbCByZXR1cm4gYW4gU1ZHUG9pbnQgZm9yIHRoZSBkaXJlY3Rpb25zCiAgICAvLyBuKG5vcnRoKSwgcyhzb3V0aCksIGUoZWFzdCksIHcod2VzdCksIG5lKG5vcnRoZWFzdCksIHNlKHNvdXRoZWFzdCksIG53KG5vcnRod2VzdCksCiAgICAvLyBzdyhzb3V0aHdlc3QpLgogICAgLy8KICAgIC8vICAgICstKy0rCiAgICAvLyAgICB8ICAgfAogICAgLy8gICAgKyAgICsKICAgIC8vICAgIHwgICB8CiAgICAvLyAgICArLSstKwogICAgLy8KICAgIC8vIFJldHVybnMgYW4gT2JqZWN0IHtuLCBzLCBlLCB3LCBudywgc3csIG5lLCBzZX0KICAgIGZ1bmN0aW9uIGdldFNjcmVlbkJCb3goKSB7CiAgICAgIHZhciB0YXJnZXRlbCAgID0gdGFyZ2V0IHx8IGQzLmV2ZW50LnRhcmdldDsKCiAgICAgIHdoaWxlICgndW5kZWZpbmVkJyA9PT0gdHlwZW9mIHRhcmdldGVsLmdldFNjcmVlbkNUTSAmJiAndW5kZWZpbmVkJyA9PT0gdGFyZ2V0ZWwucGFyZW50Tm9kZSkgewogICAgICAgICAgdGFyZ2V0ZWwgPSB0YXJnZXRlbC5wYXJlbnROb2RlOwogICAgICB9CgogICAgICB2YXIgYmJveCAgICAgICA9IHt9LAogICAgICAgICAgbWF0cml4ICAgICA9IHRhcmdldGVsLmdldFNjcmVlbkNUTSgpLAogICAgICAgICAgdGJib3ggICAgICA9IHRhcmdldGVsLmdldEJCb3goKSwKICAgICAgICAgIHdpZHRoICAgICAgPSB0YmJveC53aWR0aCwKICAgICAgICAgIGhlaWdodCAgICAgPSB0YmJveC5oZWlnaHQsCiAgICAgICAgICB4ICAgICAgICAgID0gdGJib3gueCwKICAgICAgICAgIHkgICAgICAgICAgPSB0YmJveC55OwoKICAgICAgcG9pbnQueCA9IHg7CiAgICAgIHBvaW50LnkgPSB5OwogICAgICBiYm94Lm53ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG1hdHJpeCk7CiAgICAgIHBvaW50LnggKz0gd2lkdGg7CiAgICAgIGJib3gubmUgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obWF0cml4KTsKICAgICAgcG9pbnQueSArPSBoZWlnaHQ7CiAgICAgIGJib3guc2UgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obWF0cml4KTsKICAgICAgcG9pbnQueCAtPSB3aWR0aDsKICAgICAgYmJveC5zdyA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXgpOwogICAgICBwb2ludC55IC09IGhlaWdodCAvIDI7CiAgICAgIGJib3gudyAgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obWF0cml4KTsKICAgICAgcG9pbnQueCArPSB3aWR0aDsKICAgICAgYmJveC5lID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG1hdHJpeCk7CiAgICAgIHBvaW50LnggLT0gd2lkdGggLyAyOwogICAgICBwb2ludC55IC09IGhlaWdodCAvIDI7CiAgICAgIGJib3gubiA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXgpOwogICAgICBwb2ludC55ICs9IGhlaWdodDsKICAgICAgYmJveC5zID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG1hdHJpeCk7CgogICAgICByZXR1cm4gYmJveDsKICAgIH0KCiAgICByZXR1cm4gdGlwOwogIH07Cgp9KSk7Cg=="></script>
<link href="data:text/css;charset=utf-8,%2Ed3%2Dtip%20%7B%0Aline%2Dheight%3A%201%3B%0A%0Apadding%3A%2012px%3B%0Abackground%3A%20rgba%280%2C%200%2C%200%2C%200%2E7%29%3B%0Acolor%3A%20%23fff%3B%0Aborder%2Dradius%3A%202px%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKCiAgbmFtZTogJ2Nob3JkZGlhZycsCiAgdHlwZTogJ291dHB1dCcsCgogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CgogICAgZDMuc2VsZWN0KGVsKS5hcHBlbmQoInN2ZyIpCiAgICAgICAgICAgICAgICAgLmF0dHIoIndpZHRoIiwgd2lkdGgpCiAgICAgICAgICAgICAgICAgLmF0dHIoImhlaWdodCIsIGhlaWdodCk7CgogICAgcmV0dXJuIGQzLmxheW91dC5jaG9yZCgpOwoKICB9LAoKICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCBjaG9yZCkgewoKICAgIGQzLnNlbGVjdChlbCkuc2VsZWN0KCJzdmciKQogICAgICAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIHdpZHRoKQogICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCBoZWlnaHQpOwoKICAgIHRoaXMucmVuZGVyVmFsdWUoZWwsIGNob3JkLnBhcmFtcywgY2hvcmQpOwoKICB9LAoKICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oZWwsIHBhcmFtcywgY2hvcmQpIHsKCiAgICAvLyBzYXZlIHBhcmFtcyBmb3IgcmVmZXJlbmNlIGZyb20gcmVzaXplIG1ldGhvZAogICAgY2hvcmQucGFyYW1zID0gcGFyYW1zOwoKICAgIHZhciBtYXRyaXggPSBwYXJhbXMubWF0cml4LAogICAgICAgIG9wdGlvbnMgPSBwYXJhbXMub3B0aW9uczsKCiAgICAvLyBnZXQgd2lkdGggYW5kIGhlaWdodCwgY2FsY3VsYXRlIG1pbiBmb3IgdXNlIGluIGRpYWdyYW0gc2l6ZQogICAgdmFyIHdpZHRoID0gZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgaGVpZ2h0ID0gZWwub2Zmc2V0SGVpZ2h0LAogICAgICAgIGQgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KTsKCiAgICB2YXIgdHlwZSA9IG9wdGlvbnMudHlwZSwKICAgICAgICBtYXJnaW4gPSBvcHRpb25zLm1hcmdpbiwKICAgICAgICBzaG93R3JvdXBuYW1lcyA9IG9wdGlvbnMuc2hvd0dyb3VwbmFtZXMsCiAgICAgICAgZ3JvdXBOYW1lcyA9IG9wdGlvbnMuZ3JvdXBOYW1lcywKICAgICAgICBncm91cENvbG9ycyA9IG9wdGlvbnMuZ3JvdXBDb2xvcnMsCiAgICAgICAgZ3JvdXBUaGlja25lc3MgPSBvcHRpb25zLmdyb3VwVGhpY2tuZXNzLAogICAgICAgIGdyb3VwUGFkZGluZyA9IG9wdGlvbnMuZ3JvdXBQYWRkaW5nLAogICAgICAgIGdyb3VwbmFtZVBhZGRpbmcgPSBvcHRpb25zLmdyb3VwbmFtZVBhZGRpbmcsCiAgICAgICAgZ3JvdXBuYW1lRm9udHNpemUgPSBvcHRpb25zLmdyb3VwbmFtZUZvbnRzaXplLAogICAgICAgIGdyb3VwZWRnZUNvbG9yID0gb3B0aW9ucy5ncm91cGVkZ2VDb2xvciwKICAgICAgICBjaG9yZGVkZ2VDb2xvciA9IG9wdGlvbnMuY2hvcmRlZGdlQ29sb3IsCiAgICAgICAgY2F0ZWdvcnlOYW1lcyA9IG9wdGlvbnMuY2F0ZWdvcnlOYW1lcywKICAgICAgICBjYXRlZ29yeW5hbWVQYWRkaW5nID0gb3B0aW9ucy5jYXRlZ29yeW5hbWVQYWRkaW5nLAogICAgICAgIGNhdGVnb3J5bmFtZUZvbnRzaXplID0gb3B0aW9ucy5jYXRlZ29yeW5hbWVGb250c2l6ZSwKICAgICAgICBzaG93VGlja3MgPSBvcHRpb25zLnNob3dUaWNrcywKICAgICAgICB0aWNrSW50ZXJ2YWwgPSBvcHRpb25zLnRpY2tJbnRlcnZhbCwKICAgICAgICB0aWNrbGFiZWxGb250c2l6ZSA9IG9wdGlvbnMudGlja2xhYmVsRm9udHNpemUsCiAgICAgICAgZmFkZUxldmVsID0gb3B0aW9ucy5mYWRlTGV2ZWwsCiAgICAgICAgc2hvd1Rvb2x0aXBzID0gb3B0aW9ucy5zaG93VG9vbHRpcHMsCiAgICAgICAgdG9vbHRpcE5hbWVzID0gb3B0aW9ucy50b29sdGlwTmFtZXMsCiAgICAgICAgdG9vbHRpcEZvbnRzaXplID0gb3B0aW9ucy50b29sdGlwRm9udHNpemUsCiAgICAgICAgdG9vbHRpcFVuaXQgPSBvcHRpb25zLnRvb2x0aXBVbml0LAogICAgICAgIHRvb2x0aXBHcm91cENvbm5lY3RvciA9IG9wdGlvbnMudG9vbHRpcEdyb3VwQ29ubmVjdG9yLAogICAgICAgIHByZWNpc2lvbiA9IG9wdGlvbnMucHJlY2lzaW9uOwoKICAgIGQzLnNlbGVjdChlbCkuc2VsZWN0QWxsKCJkaXYuZDMtdGlwIikucmVtb3ZlKCk7CgogICAgaWYgKHNob3dUb29sdGlwcykgewogICAgICAgIHZhciBjaG9yZFRpcCA9IGQzLnRpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnZDMtdGlwJykKICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1zaXplIiwgdG9vbHRpcEZvbnRzaXplICsgInB4IikKICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1mYW1pbHkiLCAic2Fucy1zZXJpZiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uKCdtdCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0KFsxMCwgMTBdKQogICAgICAgICAgICAgICAgICAgICAgICAgLmh0bWwoZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGV4ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGQuc291cmNlLmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gZC50YXJnZXQuaW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpaiA9IHNpZ0ZpZ3MobWF0cml4W2ldW2pdLCBwcmVjaXNpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2amkgPSBzaWdGaWdzKG1hdHJpeFtqXVtpXSwgcHJlY2lzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlyMSA9IHRvb2x0aXBOYW1lc1tpXSArIHRvb2x0aXBHcm91cENvbm5lY3RvciArIHRvb2x0aXBOYW1lc1tqXSArICI6ICIgKyB2aWogKyB0b29sdGlwVW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyMiA9IHRvb2x0aXBOYW1lc1tqXSArIHRvb2x0aXBHcm91cENvbm5lY3RvciArIHRvb2x0aXBOYW1lc1tpXSArICI6ICIgKyB2amkgKyB0b29sdGlwVW5pdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAiZGlyZWN0aW9uYWwiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IGopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXIxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpcjEgKyAiPC9icj4iICsgZGlyMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAiYmlwYXJ0aXRlIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgdmFyIGdyb3VwVGlwID0gZDMudGlwKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdkMy10aXAnKQogICAgICAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCJmb250LXNpemUiLCB0b29sdGlwRm9udHNpemUgKyAicHgiKQogICAgICAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCJmb250LWZhbWlseSIsICJzYW5zLXNlcmlmIikKICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24oJ210JykKICAgICAgICAgICAgICAgICAgICAgICAgIC5vZmZzZXQoWzEwLCAxMF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAuaHRtbChmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gc2lnRmlncyhkLnZhbHVlLCBwcmVjaXNpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b29sdGlwTmFtZXNbZC5pbmRleF0gKyAiICh0b3RhbCk6ICIgKyB2YWx1ZSArIHRvb2x0aXBVbml0OwogICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICB9CgogICAgdmFyIHN2Z0NvbnRhaW5lciA9IGQzLnNlbGVjdChlbCkuc2VsZWN0KCJzdmciKTsKICAgIHN2Z0NvbnRhaW5lci5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTsKCiAgICAvLyBhcHBseSBjaG9yZCBzZXR0aW5ncyBhbmQgZGF0YQogICAgY2hvcmQucGFkZGluZyhncm91cFBhZGRpbmcpCiAgICAgICAgIC5zb3J0U3ViZ3JvdXBzKGQzLmRlc2NlbmRpbmcpCiAgICAgICAgIC5tYXRyaXgobWF0cml4KTsKCiAgICAvLyBjYWxjdWxhdGUgb3V0ZXIgYW5kIGlubmVyIHJhZGl1cyBmb3IgY2hvcmQgZGlhZ3JhbQogICAgdmFyIG91dGVyUmFkaXVzID0gKGQgLSAyICogbWFyZ2luKSAvIDIsCiAgICAgICAgaW5uZXJSYWRpdXMgPSBvdXRlclJhZGl1cyAqICgxIC0gZ3JvdXBUaGlja25lc3MpOwoKICAgIC8vIGNyZWF0ZSBvcmRpbmFsIGNvbG9yIGZpbGwgc2NhbGUgZnJvbSBncm91cENvbG9ycwogICAgdmFyIGZpbGxTY2FsZSA9IGQzLnNjYWxlLm9yZGluYWwoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRvbWFpbihkMy5yYW5nZShtYXRyaXgubGVuZ3RoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yYW5nZShncm91cENvbG9ycyk7CgogICAgLy8gY2FsY3VsYXRlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHRyYW5zbGF0aW9uIHZhbHVlcwogICAgdmFyIHhUcmFuc2xhdGUgPSBNYXRoLm1heCh3aWR0aCAvIDIsIG91dGVyUmFkaXVzICsgbWFyZ2luKSwKICAgICAgICB5VHJhbnNsYXRlID0gTWF0aC5tYXgoaGVpZ2h0IC8gMiwgb3V0ZXJSYWRpdXMgKyBtYXJnaW4pOwoKICAgIHZhciBzdmcgPSBzdmdDb250YWluZXIuYXBwZW5kKCJnIik7CiAgICBzdmcuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgeFRyYW5zbGF0ZSArICIsIiArIHlUcmFuc2xhdGUgKyAiKSIpOwoKICAgIGlmIChzaG93VG9vbHRpcHMpIHsKICAgICAgIHN2Zy5jYWxsKGNob3JkVGlwKQogICAgICAgICAgLmNhbGwoZ3JvdXBUaXApOwogICAgfQoKICAgIC8vIGNyZWF0ZSBncm91cHMKICAgIHZhciBncm91cHMgPSBzdmcuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCAiZ3JvdXBzIikKICAgICAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCJwYXRoIikKICAgICAgICAgICAgICAgICAgICAuZGF0YShjaG9yZC5ncm91cHMpCiAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiaWQiLCBmdW5jdGlvbihkLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZ3JvdXAtIiArIGdyb3VwTmFtZXNbaV07CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgLy8gc3R5bGUgZ3JvdXBzIGFuZCBkZWZpbmUgbW91c2UgZXZlbnRzCiAgICBncm91cHMuc3R5bGUoImZpbGwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBmaWxsU2NhbGUoZC5pbmRleCk7IH0pCiAgICAgICAgICAuc3R5bGUoInN0cm9rZSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGZpbGxTY2FsZShkLmluZGV4KTsgfSkKICAgICAgICAgIC5hdHRyKCJkIiwgZDMuc3ZnLmFyYygpLmlubmVyUmFkaXVzKGlubmVyUmFkaXVzKS5vdXRlclJhZGl1cyhvdXRlclJhZGl1cykpCiAgICAgICAgICAub24oIm1vdXNlb3ZlciIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICBpZiAoc2hvd1Rvb2x0aXBzKSBncm91cFRpcC5zaG93KGQpOwogICAgICAgICAgICAgIHJldHVybiBncm91cEZhZGUoZCwgZmFkZUxldmVsKTsKICAgICAgICAgIH0pCiAgICAgICAgICAub24oIm1vdXNlb3V0IiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgIGlmIChzaG93VG9vbHRpcHMpIGdyb3VwVGlwLmhpZGUoZCk7CiAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwRmFkZShkLCAxKTsKICAgICAgICAgIH0pOwoKICAgIGlmIChncm91cGVkZ2VDb2xvcikgewogICAgICAgIGdyb3Vwcy5zdHlsZSgic3Ryb2tlIiwgZ3JvdXBlZGdlQ29sb3IpOwogICAgfSBlbHNlIHsKICAgICAgICBncm91cHMuc3R5bGUoInN0cm9rZSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGZpbGxTY2FsZShkLmluZGV4KTsgfSk7CiAgICB9CgogICAgaWYgKHNob3dUaWNrcykgewogICAgICAgIC8vIGNyZWF0ZSB0aWNrcyBmb3IgZ3JvdXBzCiAgICAgICAgdmFyIHRpY2tzID0gc3ZnLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwgInRpY2tzIikKICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCJnIikKICAgICAgICAgICAgICAgICAgICAgICAuZGF0YShjaG9yZC5ncm91cHMpCiAgICAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCJnIikgLy8uYXR0cigiY2xhc3MiLCAidGlja3MiKQogICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJpZCIsIGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ0aWNrcy0iICsgZ3JvdXBOYW1lc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoImciKQogICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKGdyb3VwVGlja3MpCiAgICAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCAidGljayIpCiAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJyb3RhdGUoIiArIChkLmFuZ2xlICogMTgwIC8gTWF0aC5QSSAtIDkwKSArICIpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidHJhbnNsYXRlKCIgKyBvdXRlclJhZGl1cyArICIsIDApIjsKICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgLy8gYWRkIHRpY2sgbWFya3MKICAgICAgICB0aWNrcy5hcHBlbmQoImxpbmUiKQogICAgICAgICAgICAgLmF0dHIoIngxIiwgMSkKICAgICAgICAgICAgIC5hdHRyKCJ5MSIsIDApCiAgICAgICAgICAgICAuYXR0cigieDIiLCA1KQogICAgICAgICAgICAgLmF0dHIoInkyIiwgMCkKICAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlIiwgIiMwMDAiKTsKCiAgICAgICAgLy8gYWRkIHRpY2sgbGFiZWxzCiAgICAgICAgdGlja3MuYXBwZW5kKCJ0ZXh0IikKICAgICAgICAgICAgIC5hdHRyKCJ4IiwgMCkKICAgICAgICAgICAgIC5hdHRyKCJkeSIsICIuMzVlbSIpCiAgICAgICAgICAgICAuc3R5bGUoImZvbnQtc2l6ZSIsIHRpY2tsYWJlbEZvbnRzaXplICsgInB4IikKICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1mYW1pbHkiLCAic2Fucy1zZXJpZiIpCiAgICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5hbmdsZSA+IE1hdGguUEkgPyAicm90YXRlKDE4MCl0cmFuc2xhdGUoLTgpIiA6ICJ0cmFuc2xhdGUoOCkiOyB9KQogICAgICAgICAgICAgLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuYW5nbGUgPiBNYXRoLlBJID8gImVuZCIgOiAic3RhcnQiOyB9KQogICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5sYWJlbDsgfSk7CiAgICB9CgogICAgLy8gY3JlYXRlIGNob3JkcwogICAgdmFyIGNob3JkcyA9IHN2Zy5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsICJjaG9yZHMiKQogICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoInBhdGgiKQogICAgICAgICAgICAgICAgICAgIC5kYXRhKGNob3JkLmNob3JkcykKICAgICAgICAgICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJpZCIsIGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjaG9yZC0iICsgZ3JvdXBOYW1lc1tkLnNvdXJjZS5pbmRleF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi0iICsgZ3JvdXBOYW1lc1tkLnRhcmdldC5pbmRleF07CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuYXR0cigiZCIsIGQzLnN2Zy5jaG9yZCgpLnJhZGl1cyhpbm5lclJhZGl1cykpOwoKICAgIC8vIHN0eWxlIGNob3JkcyBhbmQgZGVmaW5lIG1vdXNlIGV2ZW50cwogICAgY2hvcmRzLnN0eWxlKCJmaWxsIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZmlsbFNjYWxlKGQudGFyZ2V0LmluZGV4KTsgfSkKICAgICAgICAgIC5zdHlsZSgic3Ryb2tlIiwgY2hvcmRlZGdlQ29sb3IpCiAgICAgICAgICAuc3R5bGUoImZpbGwtb3BhY2l0eSIsIDAuNjcpCiAgICAgICAgICAuc3R5bGUoInN0cm9rZS13aWR0aCIsICIwLjVweCIpCiAgICAgICAgICAuc3R5bGUoIm9wYWNpdHkiLCAxKQogICAgICAgICAgLm9uKCJtb3VzZW92ZXIiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgaWYgKHNob3dUb29sdGlwcykgY2hvcmRUaXAuc2hvdyhkKTsKICAgICAgICAgICAgICByZXR1cm4gY2hvcmRGYWRlKGQsIGZhZGVMZXZlbCk7CiAgICAgICAgICB9KQogICAgICAgICAgLm9uKCJtb3VzZW91dCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICBpZiAoc2hvd1Rvb2x0aXBzKSBjaG9yZFRpcC5oaWRlKGQpOwogICAgICAgICAgICAgIHJldHVybiBjaG9yZEZhZGUoZCwgMSk7CiAgICAgICAgICB9KTsKCiAgICAvLyBjcmVhdGUgZ3JvdXAgbGFiZWxzCiAgICBpZiAoc2hvd0dyb3VwbmFtZXMpIHsKICAgICAgICB2YXIgbmFtZXMgPSBzdmcuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCAibmFtZXMiKQogICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoImciKQogICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKGNob3JkLmdyb3VwcykKICAgICAgICAgICAgICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsICJuYW1lIikKICAgICAgICAgICAgICAgICAgICAgICAub24oIm1vdXNlb3ZlciIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwRmFkZShkLCBmYWRlTGV2ZWwpOwogICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgLm9uKCJtb3VzZW91dCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwRmFkZShkLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoImciKQogICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKGdyb3VwTGFiZWxzKQogICAgICAgICAgICAgICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImlkIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImxhYmVsLSIgKyBkLmxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJyb3RhdGUoIiArIChkLmFuZ2xlICogMTgwIC8gTWF0aC5QSSAtIDkwKSArICIpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRyYW5zbGF0ZSgiICsgKG91dGVyUmFkaXVzICsgZC5wYWRkaW5nKSArICIsIDApIjsKICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICBuYW1lcy5hcHBlbmQoInRleHQiKQogICAgICAgICAgICAuYXR0cigieCIsIDApCiAgICAgICAgICAgIC5hdHRyKCJkeSIsICIuMzVlbSIpCiAgICAgICAgICAgIC5zdHlsZSgiZm9udC1zaXplIiwgZ3JvdXBuYW1lRm9udHNpemUgKyAicHgiKQogICAgICAgICAgICAuc3R5bGUoImZvbnQtZmFtaWx5IiwgInNhbnMtc2VyaWYiKQogICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGQuaGFuZHNpZGUgPT0gImxlZnQiID8gInJvdGF0ZSgxODApIiA6IG51bGw7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5zdHlsZSgidGV4dC1hbmNob3IiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmhhbmRzaWRlID09ICJsZWZ0IiA/ICJlbmQiIDogInN0YXJ0IjsgfSkKICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5sYWJlbDsgfSkKICAgICAgICAgICAgLmF0dHIoImlkIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5sYWJlbDsgfSk7CiAgICB9CgogICAgaWYgKGNhdGVnb3J5TmFtZXMpIHsKICAgICAgICB2YXIgY2F0ZWdvcmllcyA9IHN2Zy5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsICJjYXRlZ29yaWVzIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoImciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEoY2F0ZWdvcnlOYW1lcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwgImNhdGVnb3J5IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoImciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEoY2F0ZWdvcnlMYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoImciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCJmaWxsIiwgImJsYWNrIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJpZCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImxhYmVsLSIgKyBkLmxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJyb3RhdGUoIiArIChkLmFuZ2xlICogMTgwIC8gTWF0aC5QSSkgKyAiKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidHJhbnNsYXRlKCIgKyAob3V0ZXJSYWRpdXMgKyBjYXRlZ29yeW5hbWVQYWRkaW5nKSArICIsIDApIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICBjYXRlZ29yaWVzLmFwcGVuZCgidGV4dCIpCiAgICAgICAgICAgICAgICAgIC5hdHRyKCJ4IiwgMCkKICAgICAgICAgICAgICAgICAgLmF0dHIoImR5IiwgIi4zNWVtIikKICAgICAgICAgICAgICAgICAgLnN0eWxlKCJmb250LXNpemUiLCBjYXRlZ29yeW5hbWVGb250c2l6ZSArICJweCIpCiAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1mYW1pbHkiLCAic2Fucy1zZXJpZiIpCiAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC13ZWlnaHQiLCAiYm9sZCIpCiAgICAgICAgICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkLCBpKSB7IHJldHVybiBpID8gInJvdGF0ZSgyNzApIiA6ICJyb3RhdGUoOTApIjsgfSkKICAgICAgICAgICAgICAgICAgLnN0eWxlKCJ0ZXh0LWFuY2hvciIsICJtaWRkbGUiKQogICAgICAgICAgICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkLmxhYmVsOyB9KQogICAgICAgICAgICAgICAgICAuYXR0cigiaWQiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmxhYmVsOyB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYXRlZ29yeUxhYmVscyhkLCBpKSB7CiAgICAgICAgcmV0dXJuIFt7CiAgICAgICAgICBhbmdsZTogaSAqIE1hdGguUEksCiAgICAgICAgICBsYWJlbDogZAogICAgICAgIH1dOwogICAgfQoKICAgIC8vIHJldHVybnMgYW4gYXJyYXkgb2YgdGljayBhbmdsZXMgYW5kIGxhYmVscywgZ2l2ZW4gYSBncm91cAogICAgZnVuY3Rpb24gZ3JvdXBUaWNrcyhkKSB7CiAgICAgIHZhciBrID0gKGQuZW5kQW5nbGUgLSBkLnN0YXJ0QW5nbGUpIC8gZC52YWx1ZTsKICAgICAgcmV0dXJuIGQzLnJhbmdlKDAsIGQudmFsdWUsIHRpY2tJbnRlcnZhbCkubWFwKGZ1bmN0aW9uKHYsIGkpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgYW5nbGU6IHYgKiBrICsgZC5zdGFydEFuZ2xlLAogICAgICAgICAgbGFiZWw6IGkgJSA1ID8gbnVsbCA6IHYKICAgICAgICB9OwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBncm91cExhYmVscyhkKSB7CiAgICAgIHZhciBhID0gKGQuc3RhcnRBbmdsZSArIGQuZW5kQW5nbGUpIC8gMjsKICAgICAgcmV0dXJuIFt7CiAgICAgICAgICBhbmdsZTogYSwKICAgICAgICAgIGhhbmRzaWRlOiAoYSA8IE1hdGguUEkpID8gInJpZ2h0IiA6ICJsZWZ0IiwKICAgICAgICAgIGxhYmVsOiBncm91cE5hbWVzW2QuaW5kZXhdLAogICAgICAgICAgcGFkZGluZzogZ3JvdXBuYW1lUGFkZGluZ1tkLmluZGV4XQogICAgICAgIH1dOwogICAgfQoKICAgIC8vIHJldHVybnMgYW4gZXZlbnQgaGFuZGxlciBmb3IgZmFkaW5nIGFsbCBjaG9yZHMgbm90IGJlbG9uZ2luZyB0byBhCiAgICAvLyBzcGVjaWZpYyBncm91cAogICAgZnVuY3Rpb24gZ3JvdXBGYWRlKGcsIG9wYWNpdHkpIHsKICAgICAgICBzdmcuc2VsZWN0QWxsKCIuY2hvcmRzIHBhdGgiKQogICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuc291cmNlLmluZGV4ICE9IGcuaW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkLnRhcmdldC5pbmRleCAhPSBnLmluZGV4OyB9KQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIG9wYWNpdHkpOwogICAgfQoKICAgIC8vIHJldHVybnMgYW4gZXZlbnQgaGFuZGxlciBmb3IgZmFkaW5nIGFsbCBjaG9yZHMgZXhjZXB0IGZvciB0aGUgb25lCiAgICAvLyBnaXZlbgogICAgZnVuY3Rpb24gY2hvcmRGYWRlKGcsIG9wYWNpdHkpIHsKICAgICAgICBzdmcuc2VsZWN0QWxsKCIuY2hvcmRzIHBhdGgiKQogICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuc291cmNlLmluZGV4ICE9IGcuc291cmNlLmluZGV4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZC50YXJnZXQuaW5kZXggIT0gZy50YXJnZXQuaW5kZXg7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLnN0eWxlKCJvcGFjaXR5Iiwgb3BhY2l0eSk7CiAgICB9CgogICAgLy8gcm91bmQgdG8gc2lnbmlmaWNhbnQgZmlndXJlcyAvIGRpZ2l0cwogICAgZnVuY3Rpb24gc2lnRmlncyhuLCBzaWcpIHsKICAgICAgICBpZiAobiA9PSAwKSB7IHJldHVybiBufQogICAgICAgIGlmIChzaWcgPT0gIm51bGwiKSB7IHNpZyA9IDc7IH0KICAgICAgICB2YXIgbXVsdCA9IE1hdGgucG93KDEwLCBzaWcgLSBNYXRoLmZsb29yKE1hdGgubG9nKG4pIC8gTWF0aC5MTjEwKSAtIDEpOwogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG4gKiBtdWx0KSAvIG11bHQ7CiAgICB9CgogIH0gIC8vIGVuZCByZW5kZXJWYWx1ZSBmdW5jdGlvbgoKfSk7Cgo="></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKCiAgbmFtZTogJ2Nob3JkZGlhZycsCiAgdHlwZTogJ291dHB1dCcsCgogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CgogICAgZDMuc2VsZWN0KGVsKS5hcHBlbmQoInN2ZyIpCiAgICAgICAgICAgICAgICAgLmF0dHIoIndpZHRoIiwgd2lkdGgpCiAgICAgICAgICAgICAgICAgLmF0dHIoImhlaWdodCIsIGhlaWdodCk7CgogICAgcmV0dXJuIGQzLmxheW91dC5jaG9yZCgpOwoKICB9LAoKICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCBjaG9yZCkgewoKICAgIGQzLnNlbGVjdChlbCkuc2VsZWN0KCJzdmciKQogICAgICAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIHdpZHRoKQogICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCBoZWlnaHQpOwoKICAgIHRoaXMucmVuZGVyVmFsdWUoZWwsIGNob3JkLnBhcmFtcywgY2hvcmQpOwoKICB9LAoKICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oZWwsIHBhcmFtcywgY2hvcmQpIHsKCiAgICAvLyBzYXZlIHBhcmFtcyBmb3IgcmVmZXJlbmNlIGZyb20gcmVzaXplIG1ldGhvZAogICAgY2hvcmQucGFyYW1zID0gcGFyYW1zOwoKICAgIHZhciBtYXRyaXggPSBwYXJhbXMubWF0cml4LAogICAgICAgIG9wdGlvbnMgPSBwYXJhbXMub3B0aW9uczsKCiAgICAvLyBnZXQgd2lkdGggYW5kIGhlaWdodCwgY2FsY3VsYXRlIG1pbiBmb3IgdXNlIGluIGRpYWdyYW0gc2l6ZQogICAgdmFyIHdpZHRoID0gZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgaGVpZ2h0ID0gZWwub2Zmc2V0SGVpZ2h0LAogICAgICAgIGQgPSBNYXRoLm1pbih3aWR0aCwgaGVpZ2h0KTsKCiAgICB2YXIgdHlwZSA9IG9wdGlvbnMudHlwZSwKICAgICAgICBtYXJnaW4gPSBvcHRpb25zLm1hcmdpbiwKICAgICAgICBzaG93R3JvdXBuYW1lcyA9IG9wdGlvbnMuc2hvd0dyb3VwbmFtZXMsCiAgICAgICAgZ3JvdXBOYW1lcyA9IG9wdGlvbnMuZ3JvdXBOYW1lcywKICAgICAgICBncm91cENvbG9ycyA9IG9wdGlvbnMuZ3JvdXBDb2xvcnMsCiAgICAgICAgZ3JvdXBUaGlja25lc3MgPSBvcHRpb25zLmdyb3VwVGhpY2tuZXNzLAogICAgICAgIGdyb3VwUGFkZGluZyA9IG9wdGlvbnMuZ3JvdXBQYWRkaW5nLAogICAgICAgIGdyb3VwbmFtZVBhZGRpbmcgPSBvcHRpb25zLmdyb3VwbmFtZVBhZGRpbmcsCiAgICAgICAgZ3JvdXBuYW1lRm9udHNpemUgPSBvcHRpb25zLmdyb3VwbmFtZUZvbnRzaXplLAogICAgICAgIGdyb3VwZWRnZUNvbG9yID0gb3B0aW9ucy5ncm91cGVkZ2VDb2xvciwKICAgICAgICBjaG9yZGVkZ2VDb2xvciA9IG9wdGlvbnMuY2hvcmRlZGdlQ29sb3IsCiAgICAgICAgY2F0ZWdvcnlOYW1lcyA9IG9wdGlvbnMuY2F0ZWdvcnlOYW1lcywKICAgICAgICBjYXRlZ29yeW5hbWVQYWRkaW5nID0gb3B0aW9ucy5jYXRlZ29yeW5hbWVQYWRkaW5nLAogICAgICAgIGNhdGVnb3J5bmFtZUZvbnRzaXplID0gb3B0aW9ucy5jYXRlZ29yeW5hbWVGb250c2l6ZSwKICAgICAgICBzaG93VGlja3MgPSBvcHRpb25zLnNob3dUaWNrcywKICAgICAgICB0aWNrSW50ZXJ2YWwgPSBvcHRpb25zLnRpY2tJbnRlcnZhbCwKICAgICAgICB0aWNrbGFiZWxGb250c2l6ZSA9IG9wdGlvbnMudGlja2xhYmVsRm9udHNpemUsCiAgICAgICAgZmFkZUxldmVsID0gb3B0aW9ucy5mYWRlTGV2ZWwsCiAgICAgICAgc2hvd1Rvb2x0aXBzID0gb3B0aW9ucy5zaG93VG9vbHRpcHMsCiAgICAgICAgdG9vbHRpcE5hbWVzID0gb3B0aW9ucy50b29sdGlwTmFtZXMsCiAgICAgICAgdG9vbHRpcEZvbnRzaXplID0gb3B0aW9ucy50b29sdGlwRm9udHNpemUsCiAgICAgICAgdG9vbHRpcFVuaXQgPSBvcHRpb25zLnRvb2x0aXBVbml0LAogICAgICAgIHRvb2x0aXBHcm91cENvbm5lY3RvciA9IG9wdGlvbnMudG9vbHRpcEdyb3VwQ29ubmVjdG9yLAogICAgICAgIHByZWNpc2lvbiA9IG9wdGlvbnMucHJlY2lzaW9uOwoKICAgIGQzLnNlbGVjdChlbCkuc2VsZWN0QWxsKCJkaXYuZDMtdGlwIikucmVtb3ZlKCk7CgogICAgaWYgKHNob3dUb29sdGlwcykgewogICAgICAgIHZhciBjaG9yZFRpcCA9IGQzLnRpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnZDMtdGlwJykKICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1zaXplIiwgdG9vbHRpcEZvbnRzaXplICsgInB4IikKICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1mYW1pbHkiLCAic2Fucy1zZXJpZiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uKCdtdCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0KFsxMCwgMTBdKQogICAgICAgICAgICAgICAgICAgICAgICAgLmh0bWwoZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGV4ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGQuc291cmNlLmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gZC50YXJnZXQuaW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpaiA9IHNpZ0ZpZ3MobWF0cml4W2ldW2pdLCBwcmVjaXNpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2amkgPSBzaWdGaWdzKG1hdHJpeFtqXVtpXSwgcHJlY2lzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlyMSA9IHRvb2x0aXBOYW1lc1tpXSArIHRvb2x0aXBHcm91cENvbm5lY3RvciArIHRvb2x0aXBOYW1lc1tqXSArICI6ICIgKyB2aWogKyB0b29sdGlwVW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyMiA9IHRvb2x0aXBOYW1lc1tqXSArIHRvb2x0aXBHcm91cENvbm5lY3RvciArIHRvb2x0aXBOYW1lc1tpXSArICI6ICIgKyB2amkgKyB0b29sdGlwVW5pdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAiZGlyZWN0aW9uYWwiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IGopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXIxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpcjEgKyAiPC9icj4iICsgZGlyMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAiYmlwYXJ0aXRlIikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgdmFyIGdyb3VwVGlwID0gZDMudGlwKCkKICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdkMy10aXAnKQogICAgICAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCJmb250LXNpemUiLCB0b29sdGlwRm9udHNpemUgKyAicHgiKQogICAgICAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCJmb250LWZhbWlseSIsICJzYW5zLXNlcmlmIikKICAgICAgICAgICAgICAgICAgICAgICAgIC5kaXJlY3Rpb24oJ210JykKICAgICAgICAgICAgICAgICAgICAgICAgIC5vZmZzZXQoWzEwLCAxMF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAuaHRtbChmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gc2lnRmlncyhkLnZhbHVlLCBwcmVjaXNpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b29sdGlwTmFtZXNbZC5pbmRleF0gKyAiICh0b3RhbCk6ICIgKyB2YWx1ZSArIHRvb2x0aXBVbml0OwogICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICB9CgogICAgdmFyIHN2Z0NvbnRhaW5lciA9IGQzLnNlbGVjdChlbCkuc2VsZWN0KCJzdmciKTsKICAgIHN2Z0NvbnRhaW5lci5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTsKCiAgICAvLyBhcHBseSBjaG9yZCBzZXR0aW5ncyBhbmQgZGF0YQogICAgY2hvcmQucGFkZGluZyhncm91cFBhZGRpbmcpCiAgICAgICAgIC5zb3J0U3ViZ3JvdXBzKGQzLmRlc2NlbmRpbmcpCiAgICAgICAgIC5tYXRyaXgobWF0cml4KTsKCiAgICAvLyBjYWxjdWxhdGUgb3V0ZXIgYW5kIGlubmVyIHJhZGl1cyBmb3IgY2hvcmQgZGlhZ3JhbQogICAgdmFyIG91dGVyUmFkaXVzID0gKGQgLSAyICogbWFyZ2luKSAvIDIsCiAgICAgICAgaW5uZXJSYWRpdXMgPSBvdXRlclJhZGl1cyAqICgxIC0gZ3JvdXBUaGlja25lc3MpOwoKICAgIC8vIGNyZWF0ZSBvcmRpbmFsIGNvbG9yIGZpbGwgc2NhbGUgZnJvbSBncm91cENvbG9ycwogICAgdmFyIGZpbGxTY2FsZSA9IGQzLnNjYWxlLm9yZGluYWwoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRvbWFpbihkMy5yYW5nZShtYXRyaXgubGVuZ3RoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yYW5nZShncm91cENvbG9ycyk7CgogICAgLy8gY2FsY3VsYXRlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIHRyYW5zbGF0aW9uIHZhbHVlcwogICAgdmFyIHhUcmFuc2xhdGUgPSBNYXRoLm1heCh3aWR0aCAvIDIsIG91dGVyUmFkaXVzICsgbWFyZ2luKSwKICAgICAgICB5VHJhbnNsYXRlID0gTWF0aC5tYXgoaGVpZ2h0IC8gMiwgb3V0ZXJSYWRpdXMgKyBtYXJnaW4pOwoKICAgIHZhciBzdmcgPSBzdmdDb250YWluZXIuYXBwZW5kKCJnIik7CiAgICBzdmcuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgeFRyYW5zbGF0ZSArICIsIiArIHlUcmFuc2xhdGUgKyAiKSIpOwoKICAgIGlmIChzaG93VG9vbHRpcHMpIHsKICAgICAgIHN2Zy5jYWxsKGNob3JkVGlwKQogICAgICAgICAgLmNhbGwoZ3JvdXBUaXApOwogICAgfQoKICAgIC8vIGNyZWF0ZSBncm91cHMKICAgIHZhciBncm91cHMgPSBzdmcuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCAiZ3JvdXBzIikKICAgICAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCJwYXRoIikKICAgICAgICAgICAgICAgICAgICAuZGF0YShjaG9yZC5ncm91cHMpCiAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiaWQiLCBmdW5jdGlvbihkLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZ3JvdXAtIiArIGdyb3VwTmFtZXNbaV07CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgLy8gc3R5bGUgZ3JvdXBzIGFuZCBkZWZpbmUgbW91c2UgZXZlbnRzCiAgICBncm91cHMuc3R5bGUoImZpbGwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBmaWxsU2NhbGUoZC5pbmRleCk7IH0pCiAgICAgICAgICAuc3R5bGUoInN0cm9rZSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGZpbGxTY2FsZShkLmluZGV4KTsgfSkKICAgICAgICAgIC5hdHRyKCJkIiwgZDMuc3ZnLmFyYygpLmlubmVyUmFkaXVzKGlubmVyUmFkaXVzKS5vdXRlclJhZGl1cyhvdXRlclJhZGl1cykpCiAgICAgICAgICAub24oIm1vdXNlb3ZlciIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICBpZiAoc2hvd1Rvb2x0aXBzKSBncm91cFRpcC5zaG93KGQpOwogICAgICAgICAgICAgIHJldHVybiBncm91cEZhZGUoZCwgZmFkZUxldmVsKTsKICAgICAgICAgIH0pCiAgICAgICAgICAub24oIm1vdXNlb3V0IiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgIGlmIChzaG93VG9vbHRpcHMpIGdyb3VwVGlwLmhpZGUoZCk7CiAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwRmFkZShkLCAxKTsKICAgICAgICAgIH0pOwoKICAgIGlmIChncm91cGVkZ2VDb2xvcikgewogICAgICAgIGdyb3Vwcy5zdHlsZSgic3Ryb2tlIiwgZ3JvdXBlZGdlQ29sb3IpOwogICAgfSBlbHNlIHsKICAgICAgICBncm91cHMuc3R5bGUoInN0cm9rZSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGZpbGxTY2FsZShkLmluZGV4KTsgfSk7CiAgICB9CgogICAgaWYgKHNob3dUaWNrcykgewogICAgICAgIC8vIGNyZWF0ZSB0aWNrcyBmb3IgZ3JvdXBzCiAgICAgICAgdmFyIHRpY2tzID0gc3ZnLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwgInRpY2tzIikKICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCJnIikKICAgICAgICAgICAgICAgICAgICAgICAuZGF0YShjaG9yZC5ncm91cHMpCiAgICAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCJnIikgLy8uYXR0cigiY2xhc3MiLCAidGlja3MiKQogICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJpZCIsIGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ0aWNrcy0iICsgZ3JvdXBOYW1lc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoImciKQogICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKGdyb3VwVGlja3MpCiAgICAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCAidGljayIpCiAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJyb3RhdGUoIiArIChkLmFuZ2xlICogMTgwIC8gTWF0aC5QSSAtIDkwKSArICIpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidHJhbnNsYXRlKCIgKyBvdXRlclJhZGl1cyArICIsIDApIjsKICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgLy8gYWRkIHRpY2sgbWFya3MKICAgICAgICB0aWNrcy5hcHBlbmQoImxpbmUiKQogICAgICAgICAgICAgLmF0dHIoIngxIiwgMSkKICAgICAgICAgICAgIC5hdHRyKCJ5MSIsIDApCiAgICAgICAgICAgICAuYXR0cigieDIiLCA1KQogICAgICAgICAgICAgLmF0dHIoInkyIiwgMCkKICAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlIiwgIiMwMDAiKTsKCiAgICAgICAgLy8gYWRkIHRpY2sgbGFiZWxzCiAgICAgICAgdGlja3MuYXBwZW5kKCJ0ZXh0IikKICAgICAgICAgICAgIC5hdHRyKCJ4IiwgMCkKICAgICAgICAgICAgIC5hdHRyKCJkeSIsICIuMzVlbSIpCiAgICAgICAgICAgICAuc3R5bGUoImZvbnQtc2l6ZSIsIHRpY2tsYWJlbEZvbnRzaXplICsgInB4IikKICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1mYW1pbHkiLCAic2Fucy1zZXJpZiIpCiAgICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5hbmdsZSA+IE1hdGguUEkgPyAicm90YXRlKDE4MCl0cmFuc2xhdGUoLTgpIiA6ICJ0cmFuc2xhdGUoOCkiOyB9KQogICAgICAgICAgICAgLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuYW5nbGUgPiBNYXRoLlBJID8gImVuZCIgOiAic3RhcnQiOyB9KQogICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5sYWJlbDsgfSk7CiAgICB9CgogICAgLy8gY3JlYXRlIGNob3JkcwogICAgdmFyIGNob3JkcyA9IHN2Zy5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsICJjaG9yZHMiKQogICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoInBhdGgiKQogICAgICAgICAgICAgICAgICAgIC5kYXRhKGNob3JkLmNob3JkcykKICAgICAgICAgICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJpZCIsIGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjaG9yZC0iICsgZ3JvdXBOYW1lc1tkLnNvdXJjZS5pbmRleF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIi0iICsgZ3JvdXBOYW1lc1tkLnRhcmdldC5pbmRleF07CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuYXR0cigiZCIsIGQzLnN2Zy5jaG9yZCgpLnJhZGl1cyhpbm5lclJhZGl1cykpOwoKICAgIC8vIHN0eWxlIGNob3JkcyBhbmQgZGVmaW5lIG1vdXNlIGV2ZW50cwogICAgY2hvcmRzLnN0eWxlKCJmaWxsIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZmlsbFNjYWxlKGQudGFyZ2V0LmluZGV4KTsgfSkKICAgICAgICAgIC5zdHlsZSgic3Ryb2tlIiwgY2hvcmRlZGdlQ29sb3IpCiAgICAgICAgICAuc3R5bGUoImZpbGwtb3BhY2l0eSIsIDAuNjcpCiAgICAgICAgICAuc3R5bGUoInN0cm9rZS13aWR0aCIsICIwLjVweCIpCiAgICAgICAgICAuc3R5bGUoIm9wYWNpdHkiLCAxKQogICAgICAgICAgLm9uKCJtb3VzZW92ZXIiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgaWYgKHNob3dUb29sdGlwcykgY2hvcmRUaXAuc2hvdyhkKTsKICAgICAgICAgICAgICByZXR1cm4gY2hvcmRGYWRlKGQsIGZhZGVMZXZlbCk7CiAgICAgICAgICB9KQogICAgICAgICAgLm9uKCJtb3VzZW91dCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICBpZiAoc2hvd1Rvb2x0aXBzKSBjaG9yZFRpcC5oaWRlKGQpOwogICAgICAgICAgICAgIHJldHVybiBjaG9yZEZhZGUoZCwgMSk7CiAgICAgICAgICB9KTsKCiAgICAvLyBjcmVhdGUgZ3JvdXAgbGFiZWxzCiAgICBpZiAoc2hvd0dyb3VwbmFtZXMpIHsKICAgICAgICB2YXIgbmFtZXMgPSBzdmcuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCAibmFtZXMiKQogICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoImciKQogICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKGNob3JkLmdyb3VwcykKICAgICAgICAgICAgICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsICJuYW1lIikKICAgICAgICAgICAgICAgICAgICAgICAub24oIm1vdXNlb3ZlciIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwRmFkZShkLCBmYWRlTGV2ZWwpOwogICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgLm9uKCJtb3VzZW91dCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwRmFkZShkLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoImciKQogICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKGdyb3VwTGFiZWxzKQogICAgICAgICAgICAgICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImlkIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImxhYmVsLSIgKyBkLmxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJyb3RhdGUoIiArIChkLmFuZ2xlICogMTgwIC8gTWF0aC5QSSAtIDkwKSArICIpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRyYW5zbGF0ZSgiICsgKG91dGVyUmFkaXVzICsgZC5wYWRkaW5nKSArICIsIDApIjsKICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICBuYW1lcy5hcHBlbmQoInRleHQiKQogICAgICAgICAgICAuYXR0cigieCIsIDApCiAgICAgICAgICAgIC5hdHRyKCJkeSIsICIuMzVlbSIpCiAgICAgICAgICAgIC5zdHlsZSgiZm9udC1zaXplIiwgZ3JvdXBuYW1lRm9udHNpemUgKyAicHgiKQogICAgICAgICAgICAuc3R5bGUoImZvbnQtZmFtaWx5IiwgInNhbnMtc2VyaWYiKQogICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGQuaGFuZHNpZGUgPT0gImxlZnQiID8gInJvdGF0ZSgxODApIiA6IG51bGw7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5zdHlsZSgidGV4dC1hbmNob3IiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmhhbmRzaWRlID09ICJsZWZ0IiA/ICJlbmQiIDogInN0YXJ0IjsgfSkKICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5sYWJlbDsgfSkKICAgICAgICAgICAgLmF0dHIoImlkIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5sYWJlbDsgfSk7CiAgICB9CgogICAgaWYgKGNhdGVnb3J5TmFtZXMpIHsKICAgICAgICB2YXIgY2F0ZWdvcmllcyA9IHN2Zy5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsICJjYXRlZ29yaWVzIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoImciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEoY2F0ZWdvcnlOYW1lcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwgImNhdGVnb3J5IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoImciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEoY2F0ZWdvcnlMYWJlbHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoImciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCJmaWxsIiwgImJsYWNrIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJpZCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImxhYmVsLSIgKyBkLmxhYmVsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJyb3RhdGUoIiArIChkLmFuZ2xlICogMTgwIC8gTWF0aC5QSSkgKyAiKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAidHJhbnNsYXRlKCIgKyAob3V0ZXJSYWRpdXMgKyBjYXRlZ29yeW5hbWVQYWRkaW5nKSArICIsIDApIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICBjYXRlZ29yaWVzLmFwcGVuZCgidGV4dCIpCiAgICAgICAgICAgICAgICAgIC5hdHRyKCJ4IiwgMCkKICAgICAgICAgICAgICAgICAgLmF0dHIoImR5IiwgIi4zNWVtIikKICAgICAgICAgICAgICAgICAgLnN0eWxlKCJmb250LXNpemUiLCBjYXRlZ29yeW5hbWVGb250c2l6ZSArICJweCIpCiAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1mYW1pbHkiLCAic2Fucy1zZXJpZiIpCiAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC13ZWlnaHQiLCAiYm9sZCIpCiAgICAgICAgICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkLCBpKSB7IHJldHVybiBpID8gInJvdGF0ZSgyNzApIiA6ICJyb3RhdGUoOTApIjsgfSkKICAgICAgICAgICAgICAgICAgLnN0eWxlKCJ0ZXh0LWFuY2hvciIsICJtaWRkbGUiKQogICAgICAgICAgICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkLmxhYmVsOyB9KQogICAgICAgICAgICAgICAgICAuYXR0cigiaWQiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmxhYmVsOyB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYXRlZ29yeUxhYmVscyhkLCBpKSB7CiAgICAgICAgcmV0dXJuIFt7CiAgICAgICAgICBhbmdsZTogaSAqIE1hdGguUEksCiAgICAgICAgICBsYWJlbDogZAogICAgICAgIH1dOwogICAgfQoKICAgIC8vIHJldHVybnMgYW4gYXJyYXkgb2YgdGljayBhbmdsZXMgYW5kIGxhYmVscywgZ2l2ZW4gYSBncm91cAogICAgZnVuY3Rpb24gZ3JvdXBUaWNrcyhkKSB7CiAgICAgIHZhciBrID0gKGQuZW5kQW5nbGUgLSBkLnN0YXJ0QW5nbGUpIC8gZC52YWx1ZTsKICAgICAgcmV0dXJuIGQzLnJhbmdlKDAsIGQudmFsdWUsIHRpY2tJbnRlcnZhbCkubWFwKGZ1bmN0aW9uKHYsIGkpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgYW5nbGU6IHYgKiBrICsgZC5zdGFydEFuZ2xlLAogICAgICAgICAgbGFiZWw6IGkgJSA1ID8gbnVsbCA6IHYKICAgICAgICB9OwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBncm91cExhYmVscyhkKSB7CiAgICAgIHZhciBhID0gKGQuc3RhcnRBbmdsZSArIGQuZW5kQW5nbGUpIC8gMjsKICAgICAgcmV0dXJuIFt7CiAgICAgICAgICBhbmdsZTogYSwKICAgICAgICAgIGhhbmRzaWRlOiAoYSA8IE1hdGguUEkpID8gInJpZ2h0IiA6ICJsZWZ0IiwKICAgICAgICAgIGxhYmVsOiBncm91cE5hbWVzW2QuaW5kZXhdLAogICAgICAgICAgcGFkZGluZzogZ3JvdXBuYW1lUGFkZGluZ1tkLmluZGV4XQogICAgICAgIH1dOwogICAgfQoKICAgIC8vIHJldHVybnMgYW4gZXZlbnQgaGFuZGxlciBmb3IgZmFkaW5nIGFsbCBjaG9yZHMgbm90IGJlbG9uZ2luZyB0byBhCiAgICAvLyBzcGVjaWZpYyBncm91cAogICAgZnVuY3Rpb24gZ3JvdXBGYWRlKGcsIG9wYWNpdHkpIHsKICAgICAgICBzdmcuc2VsZWN0QWxsKCIuY2hvcmRzIHBhdGgiKQogICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuc291cmNlLmluZGV4ICE9IGcuaW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkLnRhcmdldC5pbmRleCAhPSBnLmluZGV4OyB9KQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIG9wYWNpdHkpOwogICAgfQoKICAgIC8vIHJldHVybnMgYW4gZXZlbnQgaGFuZGxlciBmb3IgZmFkaW5nIGFsbCBjaG9yZHMgZXhjZXB0IGZvciB0aGUgb25lCiAgICAvLyBnaXZlbgogICAgZnVuY3Rpb24gY2hvcmRGYWRlKGcsIG9wYWNpdHkpIHsKICAgICAgICBzdmcuc2VsZWN0QWxsKCIuY2hvcmRzIHBhdGgiKQogICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuc291cmNlLmluZGV4ICE9IGcuc291cmNlLmluZGV4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgZC50YXJnZXQuaW5kZXggIT0gZy50YXJnZXQuaW5kZXg7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLnN0eWxlKCJvcGFjaXR5Iiwgb3BhY2l0eSk7CiAgICB9CgogICAgLy8gcm91bmQgdG8gc2lnbmlmaWNhbnQgZmlndXJlcyAvIGRpZ2l0cwogICAgZnVuY3Rpb24gc2lnRmlncyhuLCBzaWcpIHsKICAgICAgICBpZiAobiA9PSAwKSB7IHJldHVybiBufQogICAgICAgIGlmIChzaWcgPT0gIm51bGwiKSB7IHNpZyA9IDc7IH0KICAgICAgICB2YXIgbXVsdCA9IE1hdGgucG93KDEwLCBzaWcgLSBNYXRoLmZsb29yKE1hdGgubG9nKG4pIC8gTWF0aC5MTjEwKSAtIDEpOwogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG4gKiBtdWx0KSAvIG11bHQ7CiAgICB9CgogIH0gIC8vIGVuZCByZW5kZXJWYWx1ZSBmdW5jdGlvbgoKfSk7Cgo="></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget_container">
<div id="htmlwidget-9716" class="chorddiag html-widget" style="width:960px;height:960px;">
</div>
</div>
<script type="application/json" data-for="htmlwidget-9716">{"x":{"matrix":[[23,3,3,0,6,0,11,0,2,2,4,0,0,2,2,1,11,1,0,4,3,22,18,20],[0,14,0,3,1,1,1,0,2,11,3,4,2,1,2,0,0,2,2,15,2,0,0,0],[0,1,18,0,1,0,3,0,6,2,0,0,7,0,2,2,2,4,5,0,2,0,0,0],[0,2,0,17,0,0,0,1,0,1,4,1,0,3,2,2,1,1,1,0,0,0,0,0],[0,3,0,1,14,0,2,1,1,0,0,0,4,3,1,2,2,0,0,0,0,0,0,1],[0,0,0,0,0,22,0,3,0,0,0,0,1,0,2,0,1,2,0,0,1,0,0,0],[0,0,2,0,0,0,5,0,1,2,1,0,1,5,1,0,1,0,2,0,1,0,0,0],[0,0,0,0,0,0,0,17,0,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0],[0,0,0,0,0,0,0,0,10,0,0,4,0,0,0,0,0,1,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,5,2,0,0,0,1,0,0,0,4,2,1,0,0,0],[0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,4,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,1,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,6,1,0,1,0,0,2,0,0,0,0,0],[0,0,0,0,1,0,0,0,0,0,0,0,0,8,1,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,7,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,1,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,3,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]],"options":{"type":"directional","width":960,"height":960,"margin":80,"showGroupnames":true,"groupNames":["England","Germany","Italy","Turkey","Spain","Russia","France","Ukraine","Poland","Switzerland","Czechia","Hungary","Croatia","Portugal","Sweden","Romania","Belgium","Slovakia","Albania","Austria","Iceland","Ireland","N. Ireland","Wales"],"groupColors":["#E41A1C","#A73C52","#6B5F88","#3780B3","#3F918C","#47A266","#53A651","#6D8470","#87638F","#A5548D","#C96555","#ED761C","#FF9508","#FFC11A","#FFEE2C","#EBDA30","#CC9F2C","#AD6428","#BB614F","#D77083","#F37FB8","#DA88B3","#B990A6","#999999"],"groupThickness":0.05,"groupPadding":0.0349065850398866,"groupnamePadding":[5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],"groupnameFontsize":12,"groupedgeColor":null,"chordedgeColor":"#808080","categoryNames":null,"categorynamePadding":100,"categorynameFontsize":28,"showTicks":false,"tickInterval":1,"ticklabelFontsize":10,"fadeLevel":0.1,"showTooltips":true,"tooltipNames":["England","Germany","Italy","Turkey","Spain","Russia","France","Ukraine","Poland","Switzerland","Czechia","Hungary","Croatia","Portugal","Sweden","Romania","Belgium","Slovakia","Albania","Austria","Iceland","Ireland","N. Ireland","Wales"],"tooltipFontsize":12,"tooltipUnit":"","tooltipGroupConnector":" &#x25B6; ","precision":"null"}},"evals":[],"jsHooks":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-9716">{"viewer":{"width":960,"height":960,"padding":0,"fill":false},"browser":{"width":960,"height":960,"padding":0,"fill":false}}</script>
</body>
</html>
library("httr") # to html parsing (version 1.2.0)
library("htmltab") # easy tool to get html tables (version 0.7.0)
library("data.table") # to data manipulation (version 1.9.6)
library("XML") # to work with xml nodes (version 3.98-1.4)
library("chorddiag") # provide d3 chordiagramm (version 0.0.1)
# R version 3.2.4
euro.2016.squads.url <- "https://en.wikipedia.org/wiki/UEFA_Euro_2016_squads"
wiki.page <- GET(euro.2016.squads.url)
temp.file <- content(wiki.page, "text")
temp.html <- htmlTreeParse(temp.file, useInternalNodes = TRUE)
leagues <- xpathSApply(temp.html, "//table[@class='sortable wikitable plainrowheaders']//span[@class='flagicon']/a", xmlAttrs)
leagues <- leagues["title",]
leagues[leagues=="Republic of Ireland"] <- "Ireland"
leagues[leagues=="Northern Ireland"] <- "N. Ireland"
leagues[leagues=="Czech Republic"] <- "Czechia"
national.teams <- xpathSApply(temp.html, "//h3//span[@class='mw-headline']", xmlValue)[1:24]
national.teams[national.teams=="Republic of Ireland"] <- "Ireland"
national.teams[national.teams=="Northern Ireland"] <- "N. Ireland"
national.teams[national.teams=="Czech Republic"] <- "Czechia"
players <- lapply(1:24, function(i)
data.table(htmltab(temp.html, which = i), squad = national.teams[i]))
players <- rbindlist(players)
players[,league_country:=leagues]
# Swansea City and Cardiff City teams play in English football leagues
players[Club %in% c("Swansea City", "Cardiff City"), league_country := "England"]
setkey(players, squad, league_country)
squad.league.db <- players[, list(value = length(Player)), by = key(players)]
cntries <- sort(national.teams)
setnames(squad.league.db, 1:2, c("to_cntry", "from_cntry"))
squad.league.db <- squad.league.db[from_cntry %in% cntries]
setkey(squad.league.db, from_cntry, to_cntry)
# initialize adjacency matrix
adjmat <- data.table(expand.grid(from_cntry = cntries,
to_cntry = cntries))
setkey(adjmat, from_cntry, to_cntry)
adjmat <- squad.league.db[adjmat]
adjmat[is.na(value), value:=0L]
adjmat <- t(matrix(adjmat[,value], nrow=length(cntries)))
colnames(adjmat) <- rownames(adjmat) <- cntries
ord <- order(-rowSums(adjmat))
adjmat <- adjmat[ord,ord]
# set number of colors needed
colorCount <- length(cntries)
# makes function to create palette
getPalette <- grDevices::colorRampPalette(RColorBrewer::brewer.pal(9, "Set1"))
diag.colors <- getPalette(colorCount)
names(diag.colors) <- colnames(adjmat)
chorddiag(adjmat, showTicks =FALSE, margin = 80,
groupnameFontsize = 12,
groupnamePadding = 5,
groupThickness = .05,
groupColors = unname(diag.colors),
width = 820, height = 820
)
adjmat2 <- adjmat
diag(adjmat2) <- 0
ord2 <- order(-rowSums(adjmat2))
adjmat2 <- adjmat2[ord2, ord2]
chorddiag(adjmat2, showTicks =FALSE, margin = 80,
groupnameFontsize = 12,
groupnamePadding = 5,
groupThickness = .05,
groupColors = unname(diag.colors[colnames(adjmat2)]),
width = 820, height = 820
)
adjmat.restricted <- adjmat2[1:7, 1:7]
diag(adjmat.restricted) <- 0
chorddiag(adjmat.restricted,
showTicks =FALSE, margin = 80,
groupnameFontsize = 12,
groupnamePadding = 5,
groupThickness = .05,
groupColors = unname(diag.colors[colnames(adjmat.restricted)]),
width = 820, height = 820
)
@dubovoyd
Copy link

Great Job! Already have read your story on habrahabr, awesome diagrams, all clear and informative! Really cool!

@e-chankov
Copy link
Author

Thank you for your appreciation :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment