Skip to content

Instantly share code, notes, and snippets.

@cfljam
Created October 31, 2019 17:58
Show Gist options
  • Save cfljam/419fccc5b530bbf678d5a99eff5f0e5b to your computer and use it in GitHub Desktop.
Save cfljam/419fccc5b530bbf678d5a99eff5f0e5b to your computer and use it in GitHub Desktop.
GistR Demo
This file has been truncated, but you can view the full file.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>plotly</title>
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gdHJ5RXZhbCh0YXNrKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gQXR0ZW1wdCBldmFsKCkgYm90aCB3aXRoIGFuZCB3aXRob3V0IGVuY2xvc2luZyBpbiBwYXJlbnRoZXNlcy4KICAvLyBOb3RlIHRoYXQgZW5jbG9zaW5nIGNvZXJjZXMgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbnRvCiAgLy8gYW4gZXhwcmVzc2lvbiB0aGF0IGV2YWwoKSBjYW4gcGFyc2UKICAvLyAob3RoZXJ3aXNlLCBhIFN5bnRheEVycm9yIGlzIHRocm93bikKICBmdW5jdGlvbiB0cnlFdmFsKGNvZGUpIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgdHJ5IHsKICAgICAgcmVzdWx0ID0gZXZhbChjb2RlKTsKICAgIH0gY2F0Y2goZXJyb3IpIHsKICAgICAgaWYgKCFlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgIH0KICAgICAgdHJ5IHsKICAgICAgICByZXN1bHQgPSBldmFsKCIoIiArIGNvZGUgKyAiKSIpOwogICAgICB9IGNhdGNoKGUpIHsKICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7CiAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBmdW5jdGlvbiBpbml0U2l6aW5nKGVsKSB7CiAgICB2YXIgc2l6aW5nID0gc2l6aW5nUG9saWN5KGVsKTsKICAgIGlmICghc2l6aW5nKQogICAgICByZXR1cm47CgogICAgdmFyIGNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJodG1sd2lkZ2V0X2NvbnRhaW5lciIpOwogICAgaWYgKCFjZWwpCiAgICAgIHJldHVybjsKCiAgICBpZiAodHlwZW9mKHNpemluZy5wYWRkaW5nKSAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5tYXJnaW4gPSAiMCI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucGFkZGluZyA9IHBhZGRpbmdUb0Nzcyh1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKSk7CiAgICB9CgogICAgaWYgKHNpemluZy5maWxsKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS53aWR0aCA9ICIxMDAlIjsKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS53aWR0aCA9ICIxMDAlIjsKICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLmhlaWdodCA9ICIxMDAlIjsKICAgICAgaWYgKGNlbCkgewogICAgICAgIGNlbC5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAgICAgdmFyIHBhZCA9IHVucGFja1BhZGRpbmcoc2l6aW5nLnBhZGRpbmcpOwogICAgICAgIGNlbC5zdHlsZS50b3AgPSBwYWQudG9wICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUucmlnaHQgPSBwYWQucmlnaHQgKyAicHgiOwogICAgICAgIGNlbC5zdHlsZS5ib3R0b20gPSBwYWQuYm90dG9tICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUubGVmdCA9IHBhZC5sZWZ0ICsgInB4IjsKICAgICAgICBlbC5zdHlsZS53aWR0aCA9ICIxMDAlIjsKICAgICAgICBlbC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIH0KCiAgICAgIHJldHVybiB7CiAgICAgICAgZ2V0V2lkdGg6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBjZWwub2Zmc2V0SGVpZ2h0OyB9CiAgICAgIH07CgogICAgfSBlbHNlIHsKICAgICAgZWwuc3R5bGUud2lkdGggPSBweChzaXppbmcud2lkdGgpOwogICAgICBlbC5zdHlsZS5oZWlnaHQgPSBweChzaXppbmcuaGVpZ2h0KTsKCiAgICAgIHJldHVybiB7CiAgICAgICAgZ2V0V2lkdGg6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZWwub2Zmc2V0V2lkdGg7IH0sCiAgICAgICAgZ2V0SGVpZ2h0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwogICAgfQogIH0KCiAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgZm9yIG1ldGhvZHMKICB2YXIgZGVmYXVsdHMgPSB7CiAgICBmaW5kOiBmdW5jdGlvbihzY29wZSkgewogICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbChzY29wZSwgIi4iICsgdGhpcy5uYW1lKTsKICAgIH0sCiAgICByZW5kZXJFcnJvcjogZnVuY3Rpb24oZWwsIGVycikgewogICAgICB2YXIgJGVsID0gJChlbCk7CgogICAgICB0aGlzLmNsZWFyRXJyb3IoZWwpOwoKICAgICAgLy8gQWRkIGFsbCB0aGVzZSBlcnJvciBjbGFzc2VzLCBhcyBTaGlueSBkb2VzCiAgICAgIHZhciBlcnJDbGFzcyA9ICJzaGlueS1vdXRwdXQtZXJyb3IiOwogICAgICBpZiAoZXJyLnR5cGUgIT09IG51bGwpIHsKICAgICAgICAvLyB1c2UgdGhlIGNsYXNzZXMgb2YgdGhlIGVycm9yIGNvbmRpdGlvbiBhcyBDU1MgY2xhc3MgbmFtZXMKICAgICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiAiICsgJC5tYXAoYXNBcnJheShlcnIudHlwZSksIGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgIHJldHVybiBlcnJDbGFzcyArICItIiArIHR5cGU7CiAgICAgICAgfSkuam9pbigiICIpOwogICAgICB9CiAgICAgIGVyckNsYXNzID0gZXJyQ2xhc3MgKyAiIGh0bWx3aWRnZXRzLWVycm9yIjsKCiAgICAgIC8vIElzIGVsIGlubGluZSBvciBibG9jaz8gSWYgaW5saW5lIG9yIGlubGluZS1ibG9jaywganVzdCBkaXNwbGF5Om5vbmUgaXQKICAgICAgLy8gYW5kIGFkZCBhbiBpbmxpbmUgZXJyb3IuCiAgICAgIHZhciBkaXNwbGF5ID0gJGVsLmNzcygiZGlzcGxheSIpOwogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBkaXNwbGF5KTsKCiAgICAgIGlmIChkaXNwbGF5ID09PSAiaW5saW5lIiB8fCBkaXNwbGF5ID09PSAiaW5saW5lLWJsb2NrIikgewogICAgICAgICRlbC5oaWRlKCk7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yU3BhbiA9ICQoIjxzcGFuPiIpLmFkZENsYXNzKGVyckNsYXNzKTsKICAgICAgICAgIGVycm9yU3Bhbi50ZXh0KGVyci5tZXNzYWdlKTsKICAgICAgICAgICRlbC5hZnRlcihlcnJvclNwYW4pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChkaXNwbGF5ID09PSAiYmxvY2siKSB7CiAgICAgICAgLy8gSWYgYmxvY2ssIGFkZCBhbiBlcnJvciBqdXN0IGFmdGVyIHRoZSBlbCwgc2V0IHZpc2liaWxpdHk6bm9uZSBvbiB0aGUKICAgICAgICAvLyBlbCwgYW5kIHBvc2l0aW9uIHRoZSBlcnJvciB0byBiZSBvbiB0b3Agb2YgdGhlIGVsLgogICAgICAgIC8vIE1hcmsgaXQgd2l0aCBhIHVuaXF1ZSBJRCBhbmQgQ1NTIGNsYXNzIHNvIHdlIGNhbiByZW1vdmUgaXQgbGF0ZXIuCiAgICAgICAgJGVsLmNzcygidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsKICAgICAgICBpZiAoZXJyLm1lc3NhZ2UgIT09ICIiKSB7CiAgICAgICAgICB2YXIgZXJyb3JEaXYgPSAkKCI8ZGl2PiIpLmFkZENsYXNzKGVyckNsYXNzKS5jc3MoInBvc2l0aW9uIiwgImFic29sdXRlIikKICAgICAgICAgICAgLmNzcygidG9wIiwgZWwub2Zmc2V0VG9wKQogICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgLy8gc2V0dGluZyB3aWR0aCBjYW4gcHVzaCBvdXQgdGhlIHBhZ2Ugc2l6ZSwgZm9yY2luZyBvdGhlcndpc2UKICAgICAgICAgICAgLy8gdW5uZWNlc3Nhcnkgc2Nyb2xsYmFycyB0byBhcHBlYXIgYW5kIG1ha2luZyBpdCBpbXBvc3NpYmxlIGZvcgogICAgICAgICAgICAvLyB0aGUgZWxlbWVudCB0byBzaHJpbms7IHNvIHVzZSBtYXgtd2lkdGggaW5zdGVhZAogICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAuY3NzKCJoZWlnaHQiLCBlbC5vZmZzZXRIZWlnaHQpOwogICAgICAgICAgZXJyb3JEaXYudGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JEaXYpOwoKICAgICAgICAgIC8vIFJlYWxseSBkdW1iIHdheSB0byBrZWVwIHRoZSBzaXplL3Bvc2l0aW9uIG9mIHRoZSBlcnJvciBpbiBzeW5jIHdpdGgKICAgICAgICAgIC8vIHRoZSBwYXJlbnQgZWxlbWVudCBhcyB0aGUgd2luZG93IGlzIHJlc2l6ZWQgb3Igd2hhdGV2ZXIuCiAgICAgICAgICB2YXIgaW50SWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKCFlcnJvckRpdlswXS5wYXJlbnRFbGVtZW50KSB7CiAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRJZCk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yRGl2CiAgICAgICAgICAgICAgLmNzcygidG9wIiwgZWwub2Zmc2V0VG9wKQogICAgICAgICAgICAgIC5jc3MoImxlZnQiLCBlbC5vZmZzZXRMZWZ0KQogICAgICAgICAgICAgIC5jc3MoIm1heFdpZHRoIiwgZWwub2Zmc2V0V2lkdGgpCiAgICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIH0sIDUwMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgY2xlYXJFcnJvcjogZnVuY3Rpb24oZWwpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwogICAgICB2YXIgZGlzcGxheSA9ICRlbC5kYXRhKCJyZXN0b3JlLWRpc3BsYXktbW9kZSIpOwogICAgICAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiLCBudWxsKTsKCiAgICAgIGlmIChkaXNwbGF5ID09PSAiaW5saW5lIiB8fCBkaXNwbGF5ID09PSAiaW5saW5lLWJsb2NrIikgewogICAgICAgIGlmIChkaXNwbGF5KQogICAgICAgICAgJGVsLmNzcygiZGlzcGxheSIsIGRpc3BsYXkpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIil7CiAgICAgICAgJGVsLmNzcygidmlzaWJpbGl0eSIsICJpbmhlcml0Iik7CiAgICAgICAgJChlbC5uZXh0U2libGluZykuZmlsdGVyKCIuaHRtbHdpZGdldHMtZXJyb3IiKS5yZW1vdmUoKTsKICAgICAgfQogICAgfSwKICAgIHNpemluZzoge30KICB9OwoKICAvLyBDYWxsZWQgYnkgd2lkZ2V0IGJpbmRpbmdzIHRvIHJlZ2lzdGVyIGEgbmV3IHR5cGUgb2Ygd2lkZ2V0LiBUaGUgZGVmaW5pdGlvbgogIC8vIG9iamVjdCBjYW4gY29udGFpbiB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CiAgLy8gLSBuYW1lIChyZXF1aXJlZCkgLSBBIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBiaW5kaW5nIG5hbWUsIHdoaWNoIHdpbGwgYmUKICAvLyAgIHVzZWQgYnkgZGVmYXVsdCBhcyB0aGUgQ1NTIGNsYXNzbmFtZSB0byBsb29rIGZvci4KICAvLyAtIGluaXRpYWxpemUgKG9wdGlvbmFsKSAtIEEgZnVuY3Rpb24oZWwpIHRoYXQgd2lsbCBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIHdpZGdldCBlbGVtZW50OyBpZiBhIHZhbHVlIGlzIHJldHVybmVkLCBpdCB3aWxsIGJlIHBhc3NlZCBhcyB0aGUgdGhpcmQKICAvLyAgIHZhbHVlIHRvIHJlbmRlclZhbHVlLgogIC8vIC0gcmVuZGVyVmFsdWUgKHJlcXVpcmVkKSAtIEEgZnVuY3Rpb24oZWwsIGRhdGEsIGluaXRWYWx1ZSkgdGhhdCB3aWxsIGJlCiAgLy8gICBjYWxsZWQgd2l0aCBkYXRhLiBTdGF0aWMgY29udGV4dHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBvbmNlIHBlcgogIC8vICAgZWxlbWVudDsgU2hpbnkgYXBwcyB3aWxsIGNhdXNlIHRoaXMgdG8gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHBlcgogIC8vICAgZWxlbWVudCwgYXMgdGhlIGRhdGEgY2hhbmdlcy4KICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0ID0gZnVuY3Rpb24oZGVmaW5pdGlvbikgewogICAgaWYgKCFkZWZpbml0aW9uLm5hbWUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgbmFtZSIpOwogICAgfQogICAgaWYgKCFkZWZpbml0aW9uLnR5cGUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgdHlwZSIpOwogICAgfQogICAgLy8gQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCBvdXRwdXQgd2lkZ2V0cwogICAgaWYgKGRlZmluaXRpb24udHlwZSAhPT0gIm91dHB1dCIpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgd2lkZ2V0IHR5cGUgJyIgKyBkZWZpbml0aW9uLnR5cGUgKyAiJyIpOwogICAgfQogICAgLy8gVE9ETzogVmVyaWZ5IHRoYXQgLm5hbWUgaXMgYSB2YWxpZCBDU1MgY2xhc3NuYW1lCgogICAgLy8gU3VwcG9ydCBuZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMuIE9sZC1zdHlsZSBjbGFzcy1ib3VuZAogICAgLy8gZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0ICJvYmplY3QiIHBlciB3aWRnZXQgcGVyIHR5cGUvY2xhc3Mgb2YKICAgIC8vIHdpZGdldDsgdGhlIHJlbmRlclZhbHVlIGFuZCByZXNpemUgbWV0aG9kcyBvbiBzdWNoIHdpZGdldCBvYmplY3RzCiAgICAvLyB0YWtlIGVsIGFuZCBpbnN0YW5jZSBhcmd1bWVudHMsIGJlY2F1c2UgdGhlIHdpZGdldCBvYmplY3QgY2FuJ3QKICAgIC8vIHN0b3JlIHRoZW0uIE5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucyBoYXZlIG9uZSB3aWRnZXQKICAgIC8vIG9iamVjdCBwZXIgd2lkZ2V0IGluc3RhbmNlOyB0aGUgZGVmaW5pdGlvbiB0aGF0J3MgcGFzc2VkIGluIGRvZXNuJ3QKICAgIC8vIHByb3ZpZGUgcmVuZGVyVmFsdWUgb3IgcmVzaXplIG1ldGhvZHMgYXQgYWxsLCBqdXN0IHRoZSBzaW5nbGUgbWV0aG9kCiAgICAvLyAgIGZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpCiAgICAvLyB3aGljaCByZXR1cm5zIGFuIG9iamVjdCB0aGF0IGhhcyByZW5kZXJWYWx1ZSh4KSBhbmQgcmVzaXplKHcsIGgpLgogICAgLy8gVGhpcyBlbmFibGVzIGEgZmFyIG1vcmUgbmF0dXJhbCBwcm9ncmFtbWluZyBzdHlsZSBmb3IgdGhlIHdpZGdldAogICAgLy8gYXV0aG9yLCB3aG8gY2FuIHN0b3JlIHBlci1pbnN0YW5jZSBzdGF0ZSB1c2luZyBlaXRoZXIgT08tc3R5bGUKICAgIC8vIGluc3RhbmNlIGZpZWxkcyBvciBmdW5jdGlvbmFsLXN0eWxlIGNsb3N1cmUgdmFyaWFibGVzIChJIGd1ZXNzIHRoaXMKICAgIC8vIGlzIGluIGNvbnRyYXN0IHRvIHdoYXQgY2FuIG9ubHkgYmUgY2FsbGVkIEMtc3R5bGUgcHNldWRvLU9PIHdoaWNoIGlzCiAgICAvLyB3aGF0IHdlIHJlcXVpcmVkIGJlZm9yZSkuCiAgICBpZiAoZGVmaW5pdGlvbi5mYWN0b3J5KSB7CiAgICAgIGRlZmluaXRpb24gPSBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZpbml0aW9uKTsKICAgIH0KCiAgICBpZiAoIWRlZmluaXRpb24ucmVuZGVyVmFsdWUpIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJXaWRnZXQgbXVzdCBoYXZlIGEgcmVuZGVyVmFsdWUgZnVuY3Rpb24iKTsKICAgIH0KCiAgICAvLyBGb3Igc3RhdGljIHJlbmRlcmluZyAobm9uLVNoaW55KSwgdXNlIGEgc2ltcGxlIHdpZGdldCByZWdpc3RyYXRpb24KICAgIC8vIHNjaGVtZS4gV2UgYWxzbyB1c2UgdGhpcyBzY2hlbWUgZm9yIFNoaW55IGFwcHMvZG9jdW1lbnRzIHRoYXQgYWxzbwogICAgLy8gY29udGFpbiBzdGF0aWMgd2lkZ2V0cy4KICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107CiAgICAvLyBNZXJnZSBkZWZhdWx0cyBpbnRvIHRoZSBkZWZpbml0aW9uOyBkb24ndCBtdXRhdGUgdGhlIG9yaWdpbmFsIGRlZmluaXRpb24uCiAgICB2YXIgc3RhdGljQmluZGluZyA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIGRlZmluaXRpb24pOwogICAgb3ZlcnJpZGVNZXRob2Qoc3RhdGljQmluZGluZywgImZpbmQiLCBmdW5jdGlvbihzdXBlcmZ1bmMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHNjb3BlKSB7CiAgICAgICAgdmFyIHJlc3VsdHMgPSBzdXBlcmZ1bmMoc2NvcGUpOwogICAgICAgIC8vIEZpbHRlciBvdXQgU2hpbnkgb3V0cHV0cywgd2Ugb25seSB3YW50IHRoZSBzdGF0aWMga2luZAogICAgICAgIHJldHVybiBmaWx0ZXJCeUNsYXNzKHJlc3VsdHMsICJodG1sLXdpZGdldC1vdXRwdXQiLCBmYWxzZSk7CiAgICAgIH07CiAgICB9KTsKICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzLnB1c2goc3RhdGljQmluZGluZyk7CgogICAgaWYgKHNoaW55TW9kZSkgewogICAgICAvLyBTaGlueSBpcyBydW5uaW5nLiBSZWdpc3RlciB0aGUgZGVmaW5pdGlvbiB3aXRoIGFuIG91dHB1dCBiaW5kaW5nLgogICAgICAvLyBUaGUgZGVmaW5pdGlvbiBpdHNlbGYgd2lsbCBub3QgYmUgdGhlIG91dHB1dCBiaW5kaW5nLCBpbnN0ZWFkCiAgICAgIC8vIHdlIHdpbGwgbWFrZSBhbiBvdXRwdXQgYmluZGluZyBvYmplY3QgdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlCiAgICAgIC8vIGRlZmluaXRpb24uIFRoaXMgaXMgYmVjYXVzZSB3ZSBmb29saXNobHkgdXNlZCB0aGUgc2FtZSBtZXRob2QKICAgICAgLy8gbmFtZSAocmVuZGVyVmFsdWUpIGZvciBodG1sd2lkZ2V0cyBkZWZpbml0aW9uIGFuZCBTaGlueSBiaW5kaW5ncwogICAgICAvLyBidXQgdGhleSBhY3R1YWxseSBoYXZlIHF1aXRlIGRpZmZlcmVudCBzZW1hbnRpY3MgKHRoZSBTaGlueQogICAgICAvLyBiaW5kaW5ncyByZWNlaXZlIGRhdGEgdGhhdCBpbmNsdWRlcyBsb3RzIG9mIG1ldGFkYXRhIHRoYXQgaXQKICAgICAgLy8gc3RyaXBzIG9mZiBiZWZvcmUgY2FsbGluZyBodG1sd2lkZ2V0cyByZW5kZXJWYWx1ZSkuIFdlIGNhbid0CiAgICAgIC8vIGp1c3QgaWdub3JlIHRoZSBkaWZmZXJlbmNlIGJlY2F1c2UgaW4gc29tZSB3aWRnZXRzIGl0J3MgaGVscGZ1bAogICAgICAvLyB0byBjYWxsIHRoaXMucmVuZGVyVmFsdWUoKSBmcm9tIGluc2lkZSBvZiByZXNpemUoKSwgYW5kIGlmCiAgICAgIC8vIHdlJ3JlIG5vdCBkZWxlZ2F0aW5nLCB0aGVuIHRoYXQgY2FsbCB3aWxsIGdvIHRvIHRoZSBTaGlueQogICAgICAvLyB2ZXJzaW9uIGluc3RlYWQgb2YgdGhlIGh0bWx3aWRnZXRzIHZlcnNpb24uCgogICAgICAvLyBNZXJnZSBkZWZhdWx0cyB3aXRoIGRlZmluaXRpb24sIHdpdGhvdXQgbXV0YXRpbmcgZWl0aGVyLgogICAgICB2YXIgYmluZGluZ0RlZiA9IGV4dGVuZCh7fSwgZGVmYXVsdHMsIGRlZmluaXRpb24pOwoKICAgICAgLy8gVGhpcyBvYmplY3Qgd2lsbCBiZSBvdXIgYWN0dWFsIFNoaW55IGJpbmRpbmcuCiAgICAgIHZhciBzaGlueUJpbmRpbmcgPSBuZXcgU2hpbnkuT3V0cHV0QmluZGluZygpOwoKICAgICAgLy8gV2l0aCBhIGZldyBleGNlcHRpb25zLCB3ZSdsbCB3YW50IHRvIHNpbXBseSB1c2UgdGhlIGJpbmRpbmdEZWYncwogICAgICAvLyB2ZXJzaW9uIG9mIG1ldGhvZHMgaWYgdGhleSBhcmUgYXZhaWxhYmxlLCBvdGhlcndpc2UgZmFsbCBiYWNrIHRvCiAgICAgIC8vIFNoaW55J3MgZGVmYXVsdHMuIE5PVEU6IElmIFNoaW55J3Mgb3V0cHV0IGJpbmRpbmdzIGdhaW4gYWRkaXRpb25hbAogICAgICAvLyBtZXRob2RzIGluIHRoZSBmdXR1cmUsIGFuZCB3ZSB3YW50IHRoZW0gdG8gYmUgb3ZlcnJpZGVhYmxlIGJ5CiAgICAgIC8vIEhUTUxXaWRnZXQgYmluZGluZyBkZWZpbml0aW9ucywgdGhlbiB3ZSdsbCBuZWVkIHRvIGFkZCB0aGVtIHRvIHRoaXMKICAgICAgLy8gbGlzdC4KICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAiZ2V0SWQiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUNoYW5nZSIpOwogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJvblZhbHVlRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAicmVuZGVyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAiY2xlYXJFcnJvciIpOwogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJzaG93UHJvZ3Jlc3MiKTsKCiAgICAgIC8vIFRoZSBmaW5kLCByZW5kZXJWYWx1ZSwgYW5kIHJlc2l6ZSBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSB3ZQogICAgICAvLyB3YW50IHRvIGFjdHVhbGx5IGRlY29yYXRlIHRoZSBiZWhhdmlvciBvZiB0aGUgYmluZGluZ0RlZiBtZXRob2RzLgoKICAgICAgc2hpbnlCaW5kaW5nLmZpbmQgPSBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gYmluZGluZ0RlZi5maW5kKHNjb3BlKTsKCiAgICAgICAgLy8gT25seSByZXR1cm4gZWxlbWVudHMgdGhhdCBhcmUgU2hpbnkgb3V0cHV0cywgbm90IHN0YXRpYyBvbmVzCiAgICAgICAgdmFyIGR5bmFtaWNSZXN1bHRzID0gcmVzdWx0cy5maWx0ZXIoIi5odG1sLXdpZGdldC1vdXRwdXQiKTsKCiAgICAgICAgLy8gSXQncyBwb3NzaWJsZSB0aGF0IHdoYXRldmVyIGNhdXNlZCBTaGlueSB0byB0aGluayB0aGVyZSBtaWdodCBiZQogICAgICAgIC8vIG5ldyBkeW5hbWljIG91dHB1dHMsIGFsc28gY2F1c2VkIHRoZXJlIHRvIGJlIG5ldyBzdGF0aWMgb3V0cHV0cy4KICAgICAgICAvLyBTaW5jZSB0aGVyZSBtaWdodCBiZSBsb3RzIG9mIGRpZmZlcmVudCBodG1sd2lkZ2V0cyBiaW5kaW5ncywgd2UKICAgICAgICAvLyBzY2hlZHVsZSBleGVjdXRpb24gZm9yIGxhdGVyLS1ubyBuZWVkIHRvIHN0YXRpY1JlbmRlciBtdWx0aXBsZQogICAgICAgIC8vIHRpbWVzLgogICAgICAgIGlmIChyZXN1bHRzLmxlbmd0aCAhPT0gZHluYW1pY1Jlc3VsdHMubGVuZ3RoKQogICAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXIoKTsKCiAgICAgICAgcmV0dXJuIGR5bmFtaWNSZXN1bHRzOwogICAgICB9OwoKICAgICAgLy8gV3JhcCByZW5kZXJWYWx1ZSB0byBoYW5kbGUgaW5pdGlhbGl6YXRpb24sIHdoaWNoIHVuZm9ydHVuYXRlbHkgaXNuJ3QKICAgICAgLy8gc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IFNoaW55IGF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZy4KCiAgICAgIHNoaW55QmluZGluZy5yZW5kZXJWYWx1ZSA9IGZ1bmN0aW9uKGVsLCBkYXRhKSB7CiAgICAgICAgU2hpbnkucmVuZGVyRGVwZW5kZW5jaWVzKGRhdGEuZGVwcyk7CiAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICBpZiAoIShkYXRhLmV2YWxzIGluc3RhbmNlb2YgQXJyYXkpKSBkYXRhLmV2YWxzID0gW2RhdGEuZXZhbHNdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBkYXRhLmV2YWxzICYmIGkgPCBkYXRhLmV2YWxzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2ldKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFiaW5kaW5nRGVmLnJlbmRlck9uTnVsbFZhbHVlKSB7CiAgICAgICAgICBpZiAoZGF0YS54ID09PSBudWxsKSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWwuc3R5bGUudmlzaWJpbGl0eSA9ICJpbmhlcml0IjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgIGluaXRTaXppbmcoZWwpOwoKICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiLCB0cnVlKTsKICAgICAgICAgIGlmIChiaW5kaW5nRGVmLmluaXRpYWxpemUpIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGJpbmRpbmdEZWYuaW5pdGlhbGl6ZShlbCwgZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIHJlc3VsdCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSwgW2VsLCBkYXRhLnhdKTsKICAgICAgfTsKCiAgICAgIC8vIE9ubHkgb3ZlcnJpZGUgcmVzaXplIGlmIGJpbmRpbmdEZWYgaW1wbGVtZW50cyBpdAogICAgICBpZiAoYmluZGluZ0RlZi5yZXNpemUpIHsKICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICAgIC8vIFNoaW55IGNhbiBjYWxsIHJlc2l6ZSBiZWZvcmUgaW5pdGlhbGl6ZS9yZW5kZXJWYWx1ZSBoYXZlIGJlZW4KICAgICAgICAgIC8vIGNhbGxlZCwgd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlIGZvciB3aWRnZXRzLgogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgewogICAgICAgICAgICBiaW5kaW5nRGVmLnJlc2l6ZShlbCwgd2lkdGgsIGhlaWdodCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7CiAgICB9CiAgfTsKCiAgdmFyIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgZnVuY3Rpb24gc2NoZWR1bGVTdGF0aWNSZW5kZXIoKSB7CiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgewogICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9LCAxKTsKICAgIH0KICB9CgogIC8vIFJlbmRlciBzdGF0aWMgd2lkZ2V0cyBhZnRlciB0aGUgZG9jdW1lbnQgZmluaXNoZXMgbG9hZGluZwogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzCiAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGJpbmRpbmdzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107CiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7CiAgICAgIHZhciBtYXRjaGVzID0gYmluZGluZy5maW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7CiAgICAgIGZvckVhY2gobWF0Y2hlcywgZnVuY3Rpb24oZWwpIHsKICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOwoKICAgICAgICBpZiAoaGFzQ2xhc3MoZWwsICJodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUgKyAiIGh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCI7CgogICAgICAgIHZhciBpbml0UmVzdWx0OwogICAgICAgIGlmIChiaW5kaW5nLmluaXRpYWxpemUpIHsKICAgICAgICAgIGluaXRSZXN1bHQgPSBiaW5kaW5nLmluaXRpYWxpemUoZWwsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICk7CiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsKICAgICAgICAgIHZhciBsYXN0U2l6ZSA9IHsKICAgICAgICAgICAgdzogc2l6ZU9iaiA/IHNpemVPYmouZ2V0V2lkdGgoKSA6IGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICBoOiBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgfTsKICAgICAgICAgIHZhciByZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSBsYXN0U2l6ZS53ICYmIHNpemUuaCA9PT0gbGFzdFNpemUuaCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxhc3RTaXplID0gc2l6ZTsKICAgICAgICAgICAgYmluZGluZy5yZXNpemUoZWwsIHNpemUudywgc2l6ZS5oLCBpbml0UmVzdWx0KTsKICAgICAgICAgIH07CgogICAgICAgICAgb24od2luZG93LCAicmVzaXplIiwgcmVzaXplSGFuZGxlcik7CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYSBTaGlueQogICAgICAgICAgLy8gYXBwLCBidXQgdGhlIHdpZGdldCBpdHNlbGYgaXMgbm90IGEgU2hpbnkgb3V0cHV0LCBidXQKICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzCiAgICAgICAgICAvLyBhbiBybWFya2Rvd24gZG9jdW1lbnQgdGhhdCBoYXMgcnVudGltZTpzaGlueSBhbmQgd2lkZ2V0CiAgICAgICAgICAvLyB0aGF0IGlzbid0IGluIGEgcmVuZGVyIGZ1bmN0aW9uLiBTaGlueSBvbmx5IGtub3dzIHRvCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMKICAgICAgICAgIC8vIHdpZGdldHMsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KICAgICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJzaG93bi5odG1sd2lkZ2V0cyBzaG93bi5icy50YWIuaHRtbHdpZGdldHMgc2hvd24uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgImhpZGRlbi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMudGFiLmh0bWx3aWRnZXRzIGhpZGRlbi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWMgY2FzZSBvZiBpb3NsaWRlcywgd2hpY2gKICAgICAgICAgIC8vIGZsaXBzIHNsaWRlcyBiZXR3ZWVuIGRpc3BsYXk6bm9uZSBhbmQgZGlzcGxheTpibG9jay4KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUKICAgICAgICAgIC8vIGhlcmUsIGJ1dCByYXRoZXIgaGF2ZSBpb3NsaWRlcyByYWlzZSBhIGdlbmVyaWMgZXZlbnQsCiAgICAgICAgICAvLyBidXQgdGhlIHJtYXJrZG93biBwYWNrYWdlIGp1c3Qgd2VudCB0byBDUkFOIHNvIHRoZQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4KICAgICAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGxpbWl0IHRoaXMgdG8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cwogICAgICAgICAgICAvLyBzdWNoIGJyb3dzZXJzLgogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlZW50ZXIiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0RGF0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXSIpOwogICAgICAgIGlmIChzY3JpcHREYXRhKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOwogICAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2tdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGluaXRSZXN1bHQsIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOwogIH0KCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuCiAgaWYgKHNoaW55TW9kZSAmJiB3aW5kb3cualF1ZXJ5KSB7CiAgICAvKgogICAgLyBTaGlueSAxLjQuMCBidW1wcyBqUXVlcnkgZnJvbSAxLnggdG8gMy54LCB3aGljaCBtZWFucyBqUXVlcnkncwogICAgLyBvbi1yZWFkeSBoYW5kbGVyIChpLmUuLCAkKGZuKSkgaXMgbm93IGFzeW5jcm9ub3VzIChpLmUuLCBpdCBub3cKICAgIC8gcmVhbGx5IG1lYW5zICQoc2V0VGltZW91dChmbikpLiBodHRwczovL2pxdWVyeS5jb20vdXBncmFkZS1ndWlkZS8zLjAvI2JyZWFraW5nLWNoYW5nZS1kb2N1bWVudC1yZWFkeS1oYW5kbGVycy1hcmUtbm93LWFzeW5jaHJvbm91cwogICAgLwogICAgLyBJbiBvcmRlciB0byBlbnN1cmUgdGhlIG9yZGVyIG9mIGV4ZWN1dGlvbiBvZiBvbi1yZWFkeSBoYW5kbGVycwogICAgLyByZW1haW5zIGNvbnNpc3RlbnQgd2l0aCBob3cgaXQncyBiZWVuIGluIHRoZSBwYXN0LCBhIHN0YXRpYyByZW5kZXIKICAgIC8gaW4gU2hpbnkgaXMgbm93IHNjaGVkdWxlZCB2aWEgJCgpLgogICAgLwogICAgLyBUaGlzIGlzIG5vdCBhIGxvbmcgdGVybSBzb2x1dGlvbjogaXQganVzdCBwcmVzZXJ2ZXMgdGhlIGN1cnJlbnQgb3JkZXIKICAgIC8gb2YgZXhlY3V0aW9uLiBQYXJ0IG9mIHRoYXQgb3JkZXJpbmcgaXMgdG8gZW5zdXJlIGluaXRTaGlueSBleGVjdXRlcwogICAgLyBfYWZ0ZXJfIHN0YXRpY1JlbmRlciwgd2hpY2ggaXMgYm90aCByaWdodCBhbmQgd3Jvbmc6CiAgICAvICogSXQncyB3cm9uZyBiZWNhdXNlLCB3aGVuIGluaXRTaGlueSBleGVjdXRlcywgaXQgcmVnaXN0ZXJzIG1ldGhvZHMKICAgIC8gbGlrZSBTaGlueS5vbklucHV0Q2hhbmdlIHRoYXQgd2lkZ2V0IGF1dGhvcnMgd291bGQgZXhwZWN0IHRvIGJlIGF2YWlsYWJsZQogICAgLyBkdXJpbmcgYSBzdGF0aWNSZW5kZXIuCiAgICAvICogSXQncyBhbHNvICdyaWdodCcgYmVjYXVzZSBpbml0U2hpbnkgY3VycmVudGx5IChhcyBvZiB2MS40LjApIHdhbnRzCiAgICAvIHRvIGV4ZWN1dGUgYWZ0ZXIgdXNlciBjb2RlIHNvIHRoYXQgaXQgY2FuIGJpbmQgdG8gYW55IGR5bmFtaWNhbGx5CiAgICAvIGNyZWF0ZWQgZWxlbWVudHMuCiAgICAvCiAgICAvIEEgbG9uZ2VyIHRlcm0gc29sdXRpb24gbWlnaHQgYmUgdG8gbWFrZSBjaGFuZ2VzIHRvIFNoaW55IHNvIHRoYXQKICAgIC8gdGhlc2UgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIGJlZm9yZSB0aGUgYmluZGluZyB0YWtlcyBwbGFjZSwgYW5kIHRoZW4KICAgIC8gdGhlIG9yZGVyaW5nIHdvdWxkIGJlOiByZWdpc3RlciBtZXRob2RzIC0+IHN0YXRpYyByZW5kZXIgLT4gYmluZC4KICAgICovCiAgICB3aW5kb3cualF1ZXJ5KGZ1bmN0aW9uKCkgewogICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICB9KTsKICB9IGVsc2UgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgfSwgZmFsc2UpOwogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9CiAgICB9KTsKICB9CgoKICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0QXR0YWNobWVudFVybCA9IGZ1bmN0aW9uKGRlcG5hbWUsIGtleSkgewogICAgLy8gSWYgbm8ga2V5LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBpdGVtCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSAxOwoKICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCAiICsgZGVwbmFtZSArICIvIiArIGtleSArICIgbm90IGZvdW5kIGluIGRvY3VtZW50Iik7CiAgICB9CiAgICByZXR1cm4gbGluay5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyA9IGZ1bmN0aW9uKGRmKSB7CiAgICB2YXIgbmFtZXMgPSBbXTsKICAgIHZhciBsZW5ndGg7CiAgICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICAgICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YoZGZbbmFtZV0pICE9PSAib2JqZWN0IiB8fCB0eXBlb2YoZGZbbmFtZV0ubGVuZ3RoKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGl0ZW07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7CiAgICAgICAgaXRlbSA9IHt9OwogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGRmW25hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgfQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy50cmFuc3Bvc2VBcnJheTJEID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5OwogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gdHJ5RXZhbChvW3BhcnRdKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIC8vIFJldHJpZXZlIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4KICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0Iik7CiAgfTsKCiAgLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZWxlbWVudCwgaWYgYW55LiBJZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmQgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgZWwgPSBzY29wZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UoZWwpOwogICAgfQogIH07CgogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZAogIC8vIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2VzIChpLmUuIHRoZSByZXR1cm4gdmFsdWVzIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdAogIC8vIG1hdGNoIHRoZSBzZWxlY3RvciBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgSFRNTFdpZGdldAogIC8vIGluc3RhbmNlLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIG51bGxzLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kQWxsID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIG5vZGVzID0gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRzLnB1c2god2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKG5vZGVzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB2YXIgcG9zdFJlbmRlckhhbmRsZXJzID0gW107CiAgZnVuY3Rpb24gaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCkgewogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsKICAgICAgdmFyIGhhbmRsZXIgPSBwb3N0UmVuZGVySGFuZGxlcnMuc2hpZnQoKTsKICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICBoYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHBvc3RSZW5kZXJIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTsKICB9OwoKICAvLyBUYWtlcyBhIG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9uLCBhbmQgcmV0dXJucyBhbgogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nCiAgLy8gdG8gcmV3cml0ZSBhbGwgdGhlIGxvZ2ljIGluIHRoaXMgZmlsZSB0byBhY2NvbW9kYXRlIGJvdGgKICAvLyB0eXBlcyBvZiBkZWZpbml0aW9ucy4KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7CiAgICB2YXIgcmVzdWx0ID0gewogICAgICBuYW1lOiBkZWZuLm5hbWUsCiAgICAgIHR5cGU6IGRlZm4udHlwZSwKICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICByZXR1cm4gZGVmbi5mYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfSwKICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZW5kZXJWYWx1ZSh4KTsKICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIGlmIChkZWZuLmZpbmQpCiAgICAgIHJlc3VsdC5maW5kID0gZGVmbi5maW5kOwogICAgaWYgKGRlZm4ucmVuZGVyRXJyb3IpCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7CiAgICBpZiAoZGVmbi5jbGVhckVycm9yKQogICAgICByZXN1bHQuY2xlYXJFcnJvciA9IGRlZm4uY2xlYXJFcnJvcjsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSkoKTsKCg=="></script>
<script src="data:application/x-javascript;base64,CkhUTUxXaWRnZXRzLndpZGdldCh7CiAgbmFtZTogInBsb3RseSIsCiAgdHlwZTogIm91dHB1dCIsCgogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAvLyB3aGVuIHVwZ3JhZGluZyBwbG90bHkuanMsCiAgICAvLyB1bmNvbW1lbnQgdGhpcyBjb25zb2xlLmxvZygpLCB0aGVuIGRvIGBsb2FkX2FsbCgpOyBwbG90X2x5KClgIAogICAgLy8gb3BlbiBpbiBjaHJvbWUsIHJpZ2h0LWNsaWNrIG9uIGNvbnNvbGUgb3V0cHV0OiAic2F2ZS1hcyIgLT4gInNjaGVtYS5qc29uIgogICAgLy8gU2NoZW1hIDwtIGpzb25saXRlOjpmcm9tSlNPTigifi9Eb3dubG9hZHMvc2NoZW1hLmpzb24iKQogICAgLy8gZGV2dG9vbHM6OnVzZV9kYXRhKFNjaGVtYSwgb3ZlcndyaXRlID0gVCwgaW50ZXJuYWwgPSBUKQogICAgLy8gY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoUGxvdGx5LlBsb3RTY2hlbWEuZ2V0KCkpKTsKICAgIAogICAgcmV0dXJuIHt9OwogIH0sCgogIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGluc3RhbmNlKSB7CiAgICBpZiAoaW5zdGFuY2UuYXV0b3NpemUpIHsKICAgICAgdmFyIHdpZHRoID0gaW5zdGFuY2Uud2lkdGggfHwgd2lkdGg7CiAgICAgIHZhciBoZWlnaHQgPSBpbnN0YW5jZS5oZWlnaHQgfHwgaGVpZ2h0OwogICAgICBQbG90bHkucmVsYXlvdXQoZWwuaWQsIHt3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0fSk7CiAgICB9CiAgfSwgIAogIAogIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsKICAgICAgCiAgICBpZiAodHlwZW9mKHdpbmRvdykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIC8vIG1ha2Ugc3VyZSBwbG90cyBkb24ndCBnZXQgY3JlYXRlZCBvdXRzaWRlIHRoZSBuZXR3b3JrIChmb3Igb24tcHJlbSkKICAgICAgd2luZG93LlBMT1RMWUVOViA9IHdpbmRvdy5QTE9UTFlFTlYgfHwge307CiAgICAgIHdpbmRvdy5QTE9UTFlFTlYuQkFTRV9VUkwgPSB4LmJhc2VfdXJsOwogICAgfQoKICAgIHZhciBncmFwaERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKTsKICAgIAogICAgLy8gVE9ETzogbW92ZSB0aGUgY29udHJvbCBwYW5lbCBpbmplY3Rpb24gc3RyYXRlZ3kgaW5zaWRlIGhlcmUuLi4KICAgIEhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyKGZ1bmN0aW9uKCkgewogICAgICAKICAgICAgLy8gbG93ZXIgdGhlIHotaW5kZXggb2YgdGhlIG1vZGViYXIgdG8gcHJldmVudCBpdCBmcm9tIGhpZ2hqYWNraW5nIGhvdmVyCiAgICAgIC8vIChUT0RPOiBkbyB0aGlzIHZpYSBDU1M/KQogICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcm9wZW5zY2kvcGxvdGx5L2lzc3Vlcy85NTYKICAgICAgLy8gaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS9qc3JlZi9wcm9wX3N0eWxlX3ppbmRleC5hc3AKICAgICAgdmFyIG1vZGViYXJzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLmpzLXBsb3RseS1wbG90IC5wbG90bHkgLm1vZGViYXIiKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtb2RlYmFycy5sZW5ndGg7IGkrKykgewogICAgICAgIG1vZGViYXJzW2ldLnN0eWxlLnpJbmRleCA9IDE7CiAgICAgIH0KICAgIH0pOwogICAgICAKICAgICAgLy8gaW5qZWN0IGEgImNvbnRyb2wgcGFuZWwiIGhvbGRpbmcgc2VsZWN0aXplL2R5bmFtaWMgY29sb3Igd2lkZ2V0KHMpCiAgICBpZiAoeC5zZWxlY3RpemUgfHwgeC5oaWdobGlnaHQuZHluYW1pYyAmJiAhaW5zdGFuY2UucGxvdGx5KSB7CiAgICAgIHZhciBmbGV4ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgIGZsZXguY2xhc3MgPSAicGxvdGx5LWNyb3NzdGFsay1jb250cm9sLXBhbmVsIjsKICAgICAgZmxleC5zdHlsZSA9ICJkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXAiOwogICAgICAKICAgICAgLy8gaW5qZWN0IHRoZSBjb2xvdXJwaWNrZXIgSFRNTCBjb250YWluZXIgaW50byB0aGUgZmxleGJveAogICAgICBpZiAoeC5oaWdobGlnaHQuZHluYW1pYykgewogICAgICAgIHZhciBwaWNrZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgICAKICAgICAgICB2YXIgcGlja2VySW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwogICAgICAgIHBpY2tlcklucHV0LmlkID0gZWwuaWQgKyAiLWNvbG91cnBpY2tlciI7CiAgICAgICAgcGlja2VySW5wdXQucGxhY2Vob2xkZXIgPSAiYXNkYXNkIjsKICAgICAgICAKICAgICAgICB2YXIgcGlja2VyTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpOwogICAgICAgIHBpY2tlckxhYmVsLmZvciA9IHBpY2tlcklucHV0LmlkOwogICAgICAgIHBpY2tlckxhYmVsLmlubmVySFRNTCA9ICJCcnVzaCBjb2xvciZuYnNwOyZuYnNwOyI7CiAgICAgICAgCiAgICAgICAgcGlja2VyRGl2LmFwcGVuZENoaWxkKHBpY2tlckxhYmVsKTsKICAgICAgICBwaWNrZXJEaXYuYXBwZW5kQ2hpbGQocGlja2VySW5wdXQpOwogICAgICAgIGZsZXguYXBwZW5kQ2hpbGQocGlja2VyRGl2KTsKICAgICAgfQogICAgICAKICAgICAgLy8gaW5qZWN0IHNlbGVjdGl6ZSBIVE1MIGNvbnRhaW5lcnMgKG9uZSBmb3IgZXZlcnkgY3Jvc3N0YWxrIGdyb3VwKQogICAgICBpZiAoeC5zZWxlY3RpemUpIHsKICAgICAgICB2YXIgaWRzID0gT2JqZWN0LmtleXMoeC5zZWxlY3RpemUpOwogICAgICAgIAogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICBjb250YWluZXIuaWQgPSBpZHNbaV07CiAgICAgICAgICBjb250YWluZXIuc3R5bGUgPSAid2lkdGg6IDgwJTsgaGVpZ2h0OiAxMCUiOwogICAgICAgICAgY29udGFpbmVyLmNsYXNzID0gImZvcm0tZ3JvdXAgY3Jvc3N0YWxrLWlucHV0LXBsb3RseS1oaWdobGlnaHQiOwogICAgICAgICAgCiAgICAgICAgICB2YXIgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsYWJlbCIpOwogICAgICAgICAgbGFiZWwuZm9yID0gaWRzW2ldOwogICAgICAgICAgbGFiZWwuaW5uZXJIVE1MID0geC5zZWxlY3RpemVbaWRzW2ldXS5ncm91cDsKICAgICAgICAgIGxhYmVsLmNsYXNzID0gImNvbnRyb2wtbGFiZWwiOwogICAgICAgICAgCiAgICAgICAgICB2YXIgc2VsZWN0RGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgICAgICB2YXIgc2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VsZWN0Iik7CiAgICAgICAgICBzZWxlY3QubXVsdGlwbGUgPSB0cnVlOwogICAgICAgICAgCiAgICAgICAgICBzZWxlY3REaXYuYXBwZW5kQ2hpbGQoc2VsZWN0KTsKICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChsYWJlbCk7CiAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc2VsZWN0RGl2KTsKICAgICAgICAgIGZsZXguYXBwZW5kQ2hpbGQoY29udGFpbmVyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIC8vIGZpbmFsbHksIGluc2VydCB0aGUgZmxleGJveCBpbnNpZGUgdGhlIGh0bWx3aWRnZXQgY29udGFpbmVyLAogICAgICAvLyBidXQgYmVmb3JlIHRoZSBwbG90bHkgZ3JhcGggZGl2CiAgICAgIGdyYXBoRGl2LnBhcmVudEVsZW1lbnQuaW5zZXJ0QmVmb3JlKGZsZXgsIGdyYXBoRGl2KTsKICAgICAgCiAgICAgIGlmICh4LmhpZ2hsaWdodC5keW5hbWljKSB7CiAgICAgICAgdmFyIHBpY2tlciA9ICQoIiMiICsgcGlja2VySW5wdXQuaWQpOwogICAgICAgIHZhciBjb2xvcnMgPSB4LmhpZ2hsaWdodC5jb2xvciB8fCBbXTsKICAgICAgICAvLyBUT0RPOiBsZXQgdXNlcnMgc3BlY2lmeSBvcHRpb25zPwogICAgICAgIHZhciBvcHRzID0gewogICAgICAgICAgdmFsdWU6IGNvbG9yc1swXSwKICAgICAgICAgIHNob3dDb2xvdXI6ICJib3RoIiwKICAgICAgICAgIHBhbGV0dGU6ICJsaW1pdGVkIiwKICAgICAgICAgIGFsbG93ZWRDb2xzOiBjb2xvcnMuam9pbigiICIpLAogICAgICAgICAgd2lkdGg6ICIyMCUiLAogICAgICAgICAgaGVpZ2h0OiAiMTAlIgogICAgICAgIH07CiAgICAgICAgcGlja2VyLmNvbG91cnBpY2tlcih7Y2hhbmdlRGVsYXk6IDB9KTsKICAgICAgICBwaWNrZXIuY29sb3VycGlja2VyKCJzZXR0aW5ncyIsIG9wdHMpOwogICAgICAgIHBpY2tlci5jb2xvdXJwaWNrZXIoInZhbHVlIiwgb3B0cy52YWx1ZSk7CiAgICAgICAgLy8gaW5mb3JtIGNyb3NzdGFsayBhYm91dCBhIGNoYW5nZSBpbiB0aGUgY3VycmVudCBzZWxlY3Rpb24gY29sb3VyCiAgICAgICAgdmFyIGdycHMgPSB4LmhpZ2hsaWdodC5jdEdyb3VwcyB8fCBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdycHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNyb3NzdGFsay5ncm91cChncnBzW2ldKS52YXIoJ3Bsb3RseVNlbGVjdGlvbkNvbG91cicpCiAgICAgICAgICAgIC5zZXQocGlja2VyLmNvbG91cnBpY2tlcigndmFsdWUnKSk7CiAgICAgICAgfQogICAgICAgIHBpY2tlci5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdycHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY3Jvc3N0YWxrLmdyb3VwKGdycHNbaV0pLnZhcigncGxvdGx5U2VsZWN0aW9uQ29sb3VyJykKICAgICAgICAgICAgICAuc2V0KHBpY2tlci5jb2xvdXJwaWNrZXIoJ3ZhbHVlJykpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9CiAgICAKICAgIC8vIHJlbW92ZSAic2VuZERhdGFUb0Nsb3VkIiwgdW5sZXNzIHVzZXIgaGFzIHNwZWNpZmllZCB0aGV5IHdhbnQgaXQKICAgIHguY29uZmlnID0geC5jb25maWcgfHwge307CiAgICBpZiAoIXguY29uZmlnLmNsb3VkKSB7CiAgICAgIHguY29uZmlnLm1vZGVCYXJCdXR0b25zVG9SZW1vdmUgPSB4LmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlIHx8IFtdOwogICAgICB4LmNvbmZpZy5tb2RlQmFyQnV0dG9uc1RvUmVtb3ZlLnB1c2goInNlbmREYXRhVG9DbG91ZCIpOwogICAgfQogICAgCiAgICAvLyBpZiBubyBwbG90IGV4aXN0cyB5ZXQsIGNyZWF0ZSBvbmUgd2l0aCBhIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbgogICAgaWYgKCFpbnN0YW5jZS5wbG90bHkpIHsKICAgICAgCiAgICAgIHZhciBwbG90ID0gUGxvdGx5LnBsb3QoZ3JhcGhEaXYsIHgpOwogICAgICBpbnN0YW5jZS5wbG90bHkgPSB0cnVlOwogICAgICBpbnN0YW5jZS5hdXRvc2l6ZSA9IHgubGF5b3V0LmF1dG9zaXplIHx8IHRydWU7CiAgICAgIGluc3RhbmNlLndpZHRoID0geC5sYXlvdXQud2lkdGg7CiAgICAgIGluc3RhbmNlLmhlaWdodCA9IHgubGF5b3V0LmhlaWdodDsKICAgICAgCiAgICB9IGVsc2UgewogICAgICAKICAgICAgLy8gdGhpcyBpcyBlc3NlbnRpYWxseSBlcXVpdmFsZW50IHRvIFBsb3RseS5uZXdQbG90KCksIGJ1dCBhdm9pZHMgY3JlYXRpbmcgCiAgICAgIC8vIGEgbmV3IHdlYmdsIGNvbnRleHQKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvYmxvYi8yYjI0ZjlkZWY5MDE4MzFlNjEyODIwNzZjZjNmODM1NTk4ZDU2ZjBlL3NyYy9wbG90X2FwaS9wbG90X2FwaS5qcyNMNTMxLUw1MzIKICAgICAgCiAgICAgIC8vIFRPRE86IHJlc3RvcmUgY3Jvc3N0YWxrIHNlbGVjdGlvbnM/CiAgICAgIFBsb3RseS5wdXJnZShncmFwaERpdik7CiAgICAgIC8vIFRPRE86IHdoeSBpcyB0aGlzIG5lY2Vzc2FyeSB0byBnZXQgY3Jvc3N0YWxrIHdvcmtpbmc/CiAgICAgIGdyYXBoRGl2LmRhdGEgPSB1bmRlZmluZWQ7CiAgICAgIGdyYXBoRGl2LmxheW91dCA9IHVuZGVmaW5lZDsKICAgICAgdmFyIHBsb3QgPSBQbG90bHkucGxvdChncmFwaERpdiwgeCk7CiAgICAgIAogICAgfQogICAgCiAgICAvLyBUcmlnZ2VyIHBsb3RseS5qcyBjYWxscyBkZWZpbmVkIHZpYSBgcGxvdGx5UHJveHkoKWAKICAgIHBsb3QudGhlbihmdW5jdGlvbigpIHsKICAgICAgaWYgKEhUTUxXaWRnZXRzLnNoaW55TW9kZSkgewogICAgICAgIFNoaW55LmFkZEN1c3RvbU1lc3NhZ2VIYW5kbGVyKCJwbG90bHktY2FsbHMiLCBmdW5jdGlvbihtc2cpIHsKICAgICAgICAgIHZhciBnZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1zZy5pZCk7CiAgICAgICAgICBpZiAoIWdkKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ291bGRuJ3QgZmluZCBwbG90bHkgZ3JhcGggd2l0aCBpZDogIiArIG1zZy5pZCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIVBsb3RseVttc2cubWV0aG9kXSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbWV0aG9kICIgKyBtc2cubWV0aG9kKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBhcmdzID0gW2dkXS5jb25jYXQobXNnLmFyZ3MpOwogICAgICAgICAgUGxvdGx5W21zZy5tZXRob2RdLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9KTsKICAgIAogICAgLy8gQXR0YWNoIGF0dHJpYnV0ZXMgKGUuZy4sICJrZXkiLCAieiIpIHRvIHBsb3RseSBldmVudCBkYXRhCiAgICBmdW5jdGlvbiBldmVudERhdGFXaXRoS2V5KGV2ZW50RGF0YSkgewogICAgICBpZiAoZXZlbnREYXRhID09PSB1bmRlZmluZWQgfHwgIWV2ZW50RGF0YS5oYXNPd25Qcm9wZXJ0eSgicG9pbnRzIikpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICByZXR1cm4gZXZlbnREYXRhLnBvaW50cy5tYXAoZnVuY3Rpb24ocHQpIHsKICAgICAgICB2YXIgb2JqID0gewogICAgICAgICAgY3VydmVOdW1iZXI6IHB0LmN1cnZlTnVtYmVyLCAKICAgICAgICAgIHBvaW50TnVtYmVyOiBwdC5wb2ludE51bWJlciwgCiAgICAgICAgICB4OiBwdC54LAogICAgICAgICAgeTogcHQueQogICAgICAgIH07CiAgICAgICAgLyogCiAgICAgICAgICBUTDtEUjogKEkgdGhpbmspIHdlIGhhdmUgdG8gc2VsZWN0IHRoZSBncmFwaCBkaXYgKGFnYWluKSB0byBhdHRhY2gga2V5cy4uLgogICAgICAgICAgCiAgICAgICAgICBXaHk/IFJlbWVtYmVyIHRoYXQgY3Jvc3N0YWxrIHdpbGwgZHluYW1pY2FsbHkgYWRkL2RlbGV0ZSB0cmFjZXMgCiAgICAgICAgICAoc2VlIHRyYWNlTWFuYWdlci5wcm90b3R5cGUudXBkYXRlU2VsZWN0aW9uKCkgYmVsb3cpCiAgICAgICAgICBGb3IgdGhpcyByZWFzb24sIHdlIGNhbid0IHNpbXBseSBncmFiIGtleXMgZnJvbSB4LmRhdGEgKGxpa2Ugd2UgZGlkIHByZXZpb3VzbHkpCiAgICAgICAgICBNb3Jlb3Zlciwgd2UgY2FuJ3QgdXNlIF9mdWxsRGF0YSwgc2luY2UgdGhhdCBkb2Vzbid0IGluY2x1ZGUgCiAgICAgICAgICB1bm9mZmljaWFsIGF0dHJpYnV0ZXMuIEl0J3MgdHJ1ZSB0aGF0IGNsaWNrL2hvdmVyIGV2ZW50cyBmaXJlIHdpdGggCiAgICAgICAgICBwdC5kYXRhLCBidXQgZHJhZyBldmVudHMgZG9uJ3QuLi4KICAgICAgICAqLwogICAgICAgIHZhciBnZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsLmlkKTsKICAgICAgICB2YXIgdHJhY2UgPSBnZC5kYXRhW3B0LmN1cnZlTnVtYmVyXTsKICAgICAgICAKICAgICAgICAvLyBBZGQgb3RoZXIgYXR0cmlidXRlcyBoZXJlLCBpZiBkZXNpcmVkCiAgICAgICAgaWYgKCF0cmFjZS5faXNTaW1wbGVLZXkpIHsKICAgICAgICAgIHZhciBhdHRyc1RvQXR0YWNoID0gWyJrZXkiLCAieiJdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBzaW1wbGUga2V5cyBmaXJlIHRoZSB3aG9sZSBrZXkKICAgICAgICAgIG9iai5rZXkgPSB0cmFjZS5rZXk7CiAgICAgICAgICB2YXIgYXR0cnNUb0F0dGFjaCA9IFsieiJdOwogICAgICAgIH0KICAgICAgICAKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0dHJzVG9BdHRhY2gubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBhdHRyID0gdHJhY2VbYXR0cnNUb0F0dGFjaFtpXV07CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhdHRyKSkgewogICAgICAgICAgICAgIC8vIHBvaW50TnVtYmVyIGNhbiBiZSBhbiBhcnJheSAoZS5nLiwgaGVhdG1hcHMpCiAgICAgICAgICAgICAgLy8gVE9ETzogY2FuIHBvaW50TnVtYmVyIGJlIDNEPwogICAgICAgICAgICAgIG9ialthdHRyc1RvQXR0YWNoW2ldXSA9IHR5cGVvZiBwdC5wb2ludE51bWJlciA9PT0gIm51bWJlciIgPyAKICAgICAgICAgICAgICAgIGF0dHJbcHQucG9pbnROdW1iZXJdIDogYXR0cltwdC5wb2ludE51bWJlclswXV1bcHQucG9pbnROdW1iZXJbMV1dOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gb2JqOwogICAgICB9KTsKICAgIH0KICAgIAogICAgLy8gc2VuZCB1c2VyIGlucHV0IGV2ZW50IGRhdGEgdG8gc2hpbnkKICAgIGlmIChIVE1MV2lkZ2V0cy5zaGlueU1vZGUpIHsKICAgICAgLy8gaHR0cHM6Ly9wbG90Lmx5L2phdmFzY3JpcHQvem9vbS1ldmVudHMvCiAgICAgIGdyYXBoRGl2Lm9uKCdwbG90bHlfcmVsYXlvdXQnLCBmdW5jdGlvbihkKSB7CiAgICAgICAgU2hpbnkub25JbnB1dENoYW5nZSgKICAgICAgICAgICIuY2xpZW50VmFsdWUtcGxvdGx5X3JlbGF5b3V0LSIgKyB4LnNvdXJjZSwgCiAgICAgICAgICBKU09OLnN0cmluZ2lmeShkKQogICAgICAgICk7CiAgICAgIH0pOwogICAgICBncmFwaERpdi5vbigncGxvdGx5X2hvdmVyJywgZnVuY3Rpb24oZCkgewogICAgICAgIFNoaW55Lm9uSW5wdXRDaGFuZ2UoCiAgICAgICAgICAiLmNsaWVudFZhbHVlLXBsb3RseV9ob3Zlci0iICsgeC5zb3VyY2UsIAogICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXZlbnREYXRhV2l0aEtleShkKSkKICAgICAgICApOwogICAgICB9KTsKICAgICAgZ3JhcGhEaXYub24oJ3Bsb3RseV9jbGljaycsIGZ1bmN0aW9uKGQpIHsKICAgICAgICBTaGlueS5vbklucHV0Q2hhbmdlKAogICAgICAgICAgIi5jbGllbnRWYWx1ZS1wbG90bHlfY2xpY2stIiArIHguc291cmNlLCAKICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGV2ZW50RGF0YVdpdGhLZXkoZCkpCiAgICAgICAgKTsKICAgICAgfSk7CiAgICAgIGdyYXBoRGl2Lm9uKCdwbG90bHlfc2VsZWN0ZWQnLCBmdW5jdGlvbihkKSB7CiAgICAgICAgU2hpbnkub25JbnB1dENoYW5nZSgKICAgICAgICAgICIuY2xpZW50VmFsdWUtcGxvdGx5X3NlbGVjdGVkLSIgKyB4LnNvdXJjZSwgCiAgICAgICAgICBKU09OLnN0cmluZ2lmeShldmVudERhdGFXaXRoS2V5KGQpKQogICAgICAgICk7CiAgICAgIH0pOwogICAgICBncmFwaERpdi5vbigncGxvdGx5X3VuaG92ZXInLCBmdW5jdGlvbihldmVudERhdGEpIHsKICAgICAgICBTaGlueS5vbklucHV0Q2hhbmdlKCIuY2xpZW50VmFsdWUtcGxvdGx5X2hvdmVyLSIgKyB4LnNvdXJjZSwgbnVsbCk7CiAgICAgIH0pOwogICAgICBncmFwaERpdi5vbigncGxvdGx5X2RvdWJsZWNsaWNrJywgZnVuY3Rpb24oZXZlbnREYXRhKSB7CiAgICAgICAgU2hpbnkub25JbnB1dENoYW5nZSgiLmNsaWVudFZhbHVlLXBsb3RseV9jbGljay0iICsgeC5zb3VyY2UsIG51bGwpOwogICAgICB9KTsKICAgICAgLy8gJ3Bsb3RseV9kZXNlbGVjdCcgaXMgY29kZSBmb3IgZG91YmxlY2xpY2sgd2hlbiBpbiBzZWxlY3QgbW9kZQogICAgICBncmFwaERpdi5vbigncGxvdGx5X2Rlc2VsZWN0JywgZnVuY3Rpb24oZXZlbnREYXRhKSB7CiAgICAgICAgU2hpbnkub25JbnB1dENoYW5nZSgiLmNsaWVudFZhbHVlLXBsb3RseV9zZWxlY3RlZC0iICsgeC5zb3VyY2UsIG51bGwpOwogICAgICAgIFNoaW55Lm9uSW5wdXRDaGFuZ2UoIi5jbGllbnRWYWx1ZS1wbG90bHlfY2xpY2stIiArIHguc291cmNlLCBudWxsKTsKICAgICAgfSk7CiAgICB9IAogICAgCiAgICAKICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIHtjdXJ2ZU51bWJlcjogeCwgcG9pbnROdW1iZXI6IHl9IG9iamVjdHMsCiAgICAvLyByZXR1cm4gYSBoYXNoIG9mIHsKICAgIC8vICAgc2V0MToge3ZhbHVlOiBba2V5MSwga2V5MiwgLi4uXSwgX2lzU2ltcGxlS2V5OiBmYWxzZX0sIAogICAgLy8gICBzZXQyOiB7dmFsdWU6IFtrZXkzLCBrZXk0LCAuLi5dLCBfaXNTaW1wbGVLZXk6IGZhbHNlfQogICAgLy8gfQogICAgZnVuY3Rpb24gcG9pbnRzVG9LZXlzKHBvaW50cykgewogICAgICB2YXIga2V5c0J5U2V0ID0ge307CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgCiAgICAgICAgdmFyIHRyYWNlID0gZ3JhcGhEaXYuZGF0YVtwb2ludHNbaV0uY3VydmVOdW1iZXJdOwogICAgICAgIGlmICghdHJhY2Uua2V5IHx8ICF0cmFjZS5zZXQpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAKICAgICAgICAvLyBzZXQgZGVmYXVsdHMgZm9yIHRoaXMga2V5U2V0CiAgICAgICAgLy8gbm90ZSB0aGF0IHdlIGRvbid0IHRyYWNrIHRoZSBuZXN0ZWQgcHJvcGVydHkgKHlldCkgc2luY2Ugd2UgYWx3YXlzIAogICAgICAgIC8vIGVtaXQgdGhlIHVuaW9uIC0tIGh0dHA6Ly9jcHNpZXZlcnQuZ2l0aHViLmlvL3RhbGtzLzIwMTYxMjEyYi8jMjEKICAgICAgICBrZXlzQnlTZXRbdHJhY2Uuc2V0XSA9IGtleXNCeVNldFt0cmFjZS5zZXRdIHx8IHsKICAgICAgICAgIHZhbHVlOiBbXSwKICAgICAgICAgIF9pc1NpbXBsZUtleTogdHJhY2UuX2lzU2ltcGxlS2V5CiAgICAgICAgfTsKICAgICAgICAKICAgICAgICAvLyBzZWxlY3RpbmcgYSBwb2ludCBvZiBhICJzaW1wbGUiIHRyYWNlIG1lYW5zOiBzZWxlY3QgdGhlIAogICAgICAgIC8vIGVudGlyZSBrZXkgYXR0YWNoZWQgdG8gdGhpcyB0cmFjZSwgd2hpY2ggaXMgdXNlZnVsIGZvciwKICAgICAgICAvLyBzYXkgY2xpY2tpbmcgb24gYSBmaXR0ZWQgbGluZSB0byBzZWxlY3QgY29ycmVzcG9uZGluZyBvYnNlcnZhdGlvbnMgCiAgICAgICAgdmFyIGtleSA9IHRyYWNlLl9pc1NpbXBsZUtleSA/IHRyYWNlLmtleSA6IHRyYWNlLmtleVtwb2ludHNbaV0ucG9pbnROdW1iZXJdOwogICAgICAgIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTA4NjUwMjUvbWVyZ2UtZmxhdHRlbi1hbi1hcnJheS1vZi1hcnJheXMtaW4tamF2YXNjcmlwdAogICAgICAgIHZhciBrZXlGbGF0ID0gdHJhY2UuX2lzTmVzdGVkS2V5ID8gW10uY29uY2F0LmFwcGx5KFtdLCBrZXkpIDoga2V5OwogICAgICAgIAogICAgICAgIC8vIFRPRE86IGJldHRlciB0byBvbmx5IGFkZCBuZXcgdmFsdWVzPwogICAgICAgIGtleXNCeVNldFt0cmFjZS5zZXRdLnZhbHVlID0ga2V5c0J5U2V0W3RyYWNlLnNldF0udmFsdWUuY29uY2F0KGtleUZsYXQpOwogICAgICB9CiAgICAgIAogICAgICByZXR1cm4ga2V5c0J5U2V0OwogICAgfQogICAgCiAgICAKICAgIHguaGlnaGxpZ2h0LmNvbG9yID0geC5oaWdobGlnaHQuY29sb3IgfHwgW107CiAgICAvLyBtYWtlIHN1cmUgaGlnaGxpZ2h0IGNvbG9yIGlzIGFuIGFycmF5CiAgICBpZiAoIUFycmF5LmlzQXJyYXkoeC5oaWdobGlnaHQuY29sb3IpKSB7CiAgICAgIHguaGlnaGxpZ2h0LmNvbG9yID0gW3guaGlnaGxpZ2h0LmNvbG9yXTsKICAgIH0KCiAgICB2YXIgdHJhY2VNYW5hZ2VyID0gbmV3IFRyYWNlTWFuYWdlcihncmFwaERpdiwgeC5oaWdobGlnaHQpOwoKICAgIC8vIEdhdGhlciBhbGwgKnVuaXF1ZSogc2V0cy4KICAgIHZhciBhbGxTZXRzID0gW107CiAgICBmb3IgKHZhciBjdXJ2ZUlkeCA9IDA7IGN1cnZlSWR4IDwgeC5kYXRhLmxlbmd0aDsgY3VydmVJZHgrKykgewogICAgICB2YXIgbmV3U2V0ID0geC5kYXRhW2N1cnZlSWR4XS5zZXQ7CiAgICAgIGlmIChuZXdTZXQpIHsKICAgICAgICBpZiAoYWxsU2V0cy5pbmRleE9mKG5ld1NldCkgPT09IC0xKSB7CiAgICAgICAgICBhbGxTZXRzLnB1c2gobmV3U2V0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyByZWdpc3RlciBldmVudCBsaXN0ZW5lcnMgZm9yIGFsbCBzZXRzCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbFNldHMubGVuZ3RoOyBpKyspIHsKICAgICAgCiAgICAgIHZhciBzZXQgPSBhbGxTZXRzW2ldOwogICAgICB2YXIgc2VsZWN0aW9uID0gbmV3IGNyb3NzdGFsay5TZWxlY3Rpb25IYW5kbGUoc2V0KTsKICAgICAgdmFyIGZpbHRlciA9IG5ldyBjcm9zc3RhbGsuRmlsdGVySGFuZGxlKHNldCk7CiAgICAgIAogICAgICB2YXIgZmlsdGVyQ2hhbmdlID0gZnVuY3Rpb24oZSkgewogICAgICAgIHJlbW92ZUJydXNoKGVsKTsKICAgICAgICB0cmFjZU1hbmFnZXIudXBkYXRlRmlsdGVyKHNldCwgZS52YWx1ZSk7CiAgICAgIH07CiAgICAgIGZpbHRlci5vbigiY2hhbmdlIiwgZmlsdGVyQ2hhbmdlKTsKICAgICAgCiAgICAgIAogICAgICB2YXIgc2VsZWN0aW9uQ2hhbmdlID0gZnVuY3Rpb24oZSkgewogICAgICAgIAogICAgICAgIC8vIGFycmF5IG9mICJldmVudCBvYmplY3RzIiB0cmFja2luZyB0aGUgc2VsZWN0aW9uIGhpc3RvcnkKICAgICAgICAvLyB0aGlzIGlzIHVzZWQgdG8gYXZvaWQgYWRkaW5nIHJlZHVuZGFudCBzZWxlY3Rpb25zCiAgICAgICAgdmFyIHNlbGVjdGlvbkhpc3RvcnkgPSBjcm9zc3RhbGsudmFyKCJwbG90bHlTZWxlY3Rpb25IaXN0b3J5IikuZ2V0KCkgfHwgW107CiAgICAgICAgCiAgICAgICAgLy8gQ29uc3RydWN0IGFuIGV2ZW50IG9iamVjdCAiZGVmaW5pbmciIHRoZSBjdXJyZW50IGV2ZW50LiAKICAgICAgICB2YXIgZXZlbnQgPSB7CiAgICAgICAgICByZWNlaXZlcklEOiB0cmFjZU1hbmFnZXIuZ2QuaWQsCiAgICAgICAgICBwbG90bHlTZWxlY3Rpb25Db2xvdXI6IGNyb3NzdGFsay5ncm91cChzZXQpLnZhcigicGxvdGx5U2VsZWN0aW9uQ29sb3VyIikuZ2V0KCkKICAgICAgICB9OwogICAgICAgIGV2ZW50W3NldF0gPSBlLnZhbHVlOwogICAgICAgIC8vIFRPRE86IGlzIHRoZXJlIGEgc21hcnRlciB3YXkgdG8gY2hlY2sgb2JqZWN0IGVxdWFsaXR5PwogICAgICAgIGlmIChzZWxlY3Rpb25IaXN0b3J5Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIHZhciBldiA9IEpTT04uc3RyaW5naWZ5KGV2ZW50KTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0aW9uSGlzdG9yeS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgc2VsID0gSlNPTi5zdHJpbmdpZnkoc2VsZWN0aW9uSGlzdG9yeVtpXSk7CiAgICAgICAgICAgIGlmIChzZWwgPT0gZXYpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gYWNjdW11bGF0ZSBoaXN0b3J5IGZvciBwZXJzaXN0ZW50IHNlbGVjdGlvbgogICAgICAgIGlmICgheC5oaWdobGlnaHQucGVyc2lzdGVudCkgewogICAgICAgICAgc2VsZWN0aW9uSGlzdG9yeSA9IFtldmVudF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlbGVjdGlvbkhpc3RvcnkucHVzaChldmVudCk7CiAgICAgICAgfQogICAgICAgIGNyb3NzdGFsay52YXIoInBsb3RseVNlbGVjdGlvbkhpc3RvcnkiKS5zZXQoc2VsZWN0aW9uSGlzdG9yeSk7CiAgICAgICAgCiAgICAgICAgLy8gZG8gdGhlIGFjdHVhbCB1cGRhdGluZyBvZiB0cmFjZXMsIGZyYW1lcywgYW5kIHRoZSBzZWxlY3RpemUgd2lkZ2V0CiAgICAgICAgdHJhY2VNYW5hZ2VyLnVwZGF0ZVNlbGVjdGlvbihzZXQsIGUudmFsdWUpOwogICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9zZWxlY3RpemUvc2VsZWN0aXplLmpzL2Jsb2IvbWFzdGVyL2RvY3MvYXBpLm1kI21ldGhvZHNfaXRlbXMKICAgICAgICBpZiAoeC5zZWxlY3RpemUpIHsKICAgICAgICAgIGlmICgheC5oaWdobGlnaHQucGVyc2lzdGVudCB8fCBlLnZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgIHNlbGVjdGl6ZS5jbGVhcih0cnVlKTsKICAgICAgICAgIH0KICAgICAgICAgIHNlbGVjdGl6ZS5hZGRJdGVtcyhlLnZhbHVlLCB0cnVlKTsKICAgICAgICAgIHNlbGVjdGl6ZS5jbG9zZSgpOwogICAgICAgIH0KICAgICAgfQogICAgICBzZWxlY3Rpb24ub24oImNoYW5nZSIsIHNlbGVjdGlvbkNoYW5nZSk7CiAgICAgIAogICAgICAvLyBTZXQgYSBjcm9zc3RhbGsgdmFyaWFibGUgc2VsZWN0aW9uIHZhbHVlLCB0cmlnZ2VyaW5nIGFuIHVwZGF0ZQogICAgICBncmFwaERpdi5vbih4LmhpZ2hsaWdodC5vbiwgZnVuY3Rpb24gdHVybk9uKGUpIHsKICAgICAgICBpZiAoZSkgewogICAgICAgICAgdmFyIHNlbGVjdGVkS2V5cyA9IHBvaW50c1RvS2V5cyhlLnBvaW50cyk7CiAgICAgICAgICAvLyBLZXlzIGFyZSBncm91cCBuYW1lcywgdmFsdWVzIGFyZSBhcnJheSBvZiBzZWxlY3RlZCBrZXlzIGZyb20gZ3JvdXAuCiAgICAgICAgICBmb3IgKHZhciBzZXQgaW4gc2VsZWN0ZWRLZXlzKSB7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZEtleXMuaGFzT3duUHJvcGVydHkoc2V0KSkgewogICAgICAgICAgICAgIHNlbGVjdGlvbi5zZXQoc2VsZWN0ZWRLZXlzW3NldF0udmFsdWUsIHtzZW5kZXI6IGVsfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgICAKICAgICAgZ3JhcGhEaXYub24oeC5oaWdobGlnaHQub2ZmLCBmdW5jdGlvbiB0dXJuT2ZmKGUpIHsKICAgICAgICAvLyByZW1vdmUgYW55IHZpc3VhbCBjbHVlcwogICAgICAgIHJlbW92ZUJydXNoKGVsKTsKICAgICAgICAvLyByZW1vdmUgYW55IHNlbGVjdGlvbiBoaXN0b3J5CiAgICAgICAgY3Jvc3N0YWxrLnZhcigicGxvdGx5U2VsZWN0aW9uSGlzdG9yeSIpLnNldChudWxsKTsKICAgICAgICAvLyB0cmlnZ2VyIHRoZSBhY3R1YWwgcmVtb3ZhbCBvZiBzZWxlY3Rpb24gdHJhY2VzCiAgICAgICAgc2VsZWN0aW9uLnNldChudWxsLCB7c2VuZGVyOiBlbH0pOwogICAgICB9KTsKICAgICAgICAgIAogICAgICAvLyByZWdpc3RlciBhIGNhbGxiYWNrIGZvciBzZWxlY3RpemUgc28gdGhhdCB0aGVyZSBpcyBiaS1kaXJlY3Rpb25hbAogICAgICAvLyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIHdpZGdldCBhbmQgZGlyZWN0IG1hbmlwdWxhdGlvbiBldmVudHMKICAgICAgaWYgKHguc2VsZWN0aXplKSB7CiAgICAgICAgdmFyIHNlbGVjdGl6ZUlEID0gT2JqZWN0LmtleXMoeC5zZWxlY3RpemUpW2ldOwogICAgICAgIHZhciBpdGVtcyA9IHguc2VsZWN0aXplW3NlbGVjdGl6ZUlEXS5pdGVtczsKICAgICAgICB2YXIgZmlyc3QgPSBbe3ZhbHVlOiAiIiwgbGFiZWw6ICIoQWxsKSJ9XTsKICAgICAgICB2YXIgb3B0cyA9IHsKICAgICAgICAgIG9wdGlvbnM6IGZpcnN0LmNvbmNhdChpdGVtcyksCiAgICAgICAgICBzZWFyY2hGaWVsZDogImxhYmVsIiwKICAgICAgICAgIHZhbHVlRmllbGQ6ICJ2YWx1ZSIsCiAgICAgICAgICBsYWJlbEZpZWxkOiAibGFiZWwiLAogICAgICAgICAgbWF4SXRlbXM6IDUwCiAgICAgICAgfTsKICAgICAgICB2YXIgc2VsZWN0ID0gJCgiIyIgKyBzZWxlY3RpemVJRCkuZmluZCgic2VsZWN0IilbMF07CiAgICAgICAgdmFyIHNlbGVjdGl6ZSA9ICQoc2VsZWN0KS5zZWxlY3RpemUob3B0cylbMF0uc2VsZWN0aXplOwogICAgICAgIC8vIE5PVEU6IHRoaXMgY2FsbGJhY2sgaXMgdHJpZ2dlcmVkIHdoZW4gKmRpcmVjdGx5KiBhbHRlcmluZyAKICAgICAgICAvLyBkcm9wZG93biBpdGVtcwogICAgICAgIHNlbGVjdGl6ZS5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgY3VycmVudEl0ZW1zID0gdHJhY2VNYW5hZ2VyLmdyb3VwU2VsZWN0aW9uc1tzZXRdIHx8IFtdOwogICAgICAgICAgaWYgKCF4LmhpZ2hsaWdodC5wZXJzaXN0ZW50KSB7CiAgICAgICAgICAgIHJlbW92ZUJydXNoKGVsKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjdXJyZW50SXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBzZWxlY3RpemUucmVtb3ZlSXRlbShjdXJyZW50SXRlbXNbaV0sIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbmV3SXRlbXMgPSBzZWxlY3RpemUuaXRlbXMuZmlsdGVyKGZ1bmN0aW9uKGlkeCkgeyAKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJdGVtcy5pbmRleE9mKGlkeCkgPCAwOwogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAobmV3SXRlbXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICB0cmFjZU1hbmFnZXIudXBkYXRlU2VsZWN0aW9uKHNldCwgbmV3SXRlbXMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gSXRlbSBoYXMgYmVlbiByZW1vdmVkLi4uCiAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgbG9naWMgd29uJ3Qgd29yayBmb3IgZHluYW1pY2FsbHkgY2hhbmdpbmcgcGFsZXR0ZSAKICAgICAgICAgICAgdHJhY2VNYW5hZ2VyLnVwZGF0ZVNlbGVjdGlvbihzZXQsIG51bGwpOwogICAgICAgICAgICB0cmFjZU1hbmFnZXIudXBkYXRlU2VsZWN0aW9uKHNldCwgc2VsZWN0aXplLml0ZW1zKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQogICAgICAKICAgICAgCiAgICAgIAogICAgICAKICAgICAgCiAgICAgICAgICAKICAgICAgCiAgICAgIAogICAgfQogICAgCiAgfSAvLyBlbmQgb2YgcmVuZGVyVmFsdWUKfSk7IC8vIGVuZCBvZiB3aWRnZXQgZGVmaW5pdGlvbgoKLyoqCiAqIEBwYXJhbSBncmFwaERpdiBUaGUgUGxvdGx5IGdyYXBoIGRpdgogKiBAcGFyYW0gaGlnaGxpZ2h0IEFuIG9iamVjdCB3aXRoIG9wdGlvbnMgZm9yIHVwZGF0aW5nIHNlbGVjdGlvbihzKQogKi8KZnVuY3Rpb24gVHJhY2VNYW5hZ2VyKGdyYXBoRGl2LCBoaWdobGlnaHQpIHsKICAvLyBUaGUgUGxvdGx5IGdyYXBoIGRpdgogIHRoaXMuZ2QgPSBncmFwaERpdjsKCiAgLy8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIGRhdGEuCiAgLy8gVE9ETzogdHJ5IHVzaW5nIExpYi5leHRlbmRGbGF0KCkgYXMgZG9uZSBpbiAgCiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3Bsb3RseS9wbG90bHkuanMvcHVsbC8xMTM2IAogIHRoaXMub3JpZ0RhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGdyYXBoRGl2LmRhdGEpKTsKICAKICAvLyBhdm9pZCBkb2luZyB0aGlzIG92ZXIgYW5kIG92ZXIKICB0aGlzLm9yaWdPcGFjaXR5ID0gW107CiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9yaWdEYXRhLmxlbmd0aDsgaSsrKSB7CiAgICB0aGlzLm9yaWdPcGFjaXR5W2ldID0gdGhpcy5vcmlnRGF0YVtpXS5vcGFjaXR5IHx8IDE7CiAgfQoKICAvLyBrZXk6IGdyb3VwIG5hbWUsIHZhbHVlOiBudWxsIG9yIGFycmF5IG9mIGtleXMgcmVwcmVzZW50aW5nIHRoZQogIC8vIG1vc3QgcmVjZW50bHkgcmVjZWl2ZWQgc2VsZWN0aW9uIGZvciB0aGF0IGdyb3VwLgogIHRoaXMuZ3JvdXBTZWxlY3Rpb25zID0ge307CiAgCiAgLy8gc2VsZWN0aW9uIHBhcmFtZXRlcnMgKGUuZy4sIHRyYW5zaWVudCB2ZXJzdXMgcGVyc2lzdGVudCBzZWxlY3Rpb24pCiAgdGhpcy5oaWdobGlnaHQgPSBoaWdobGlnaHQ7Cn0KClRyYWNlTWFuYWdlci5wcm90b3R5cGUuY2xvc2UgPSBmdW5jdGlvbigpIHsKICAvLyBUT0RPOiBVbmhvb2sgYWxsIGV2ZW50IGhhbmRsZXJzCn07CgpUcmFjZU1hbmFnZXIucHJvdG90eXBlLnVwZGF0ZUZpbHRlciA9IGZ1bmN0aW9uKGdyb3VwLCBrZXlzKSB7CgogIGlmICh0eXBlb2Yoa2V5cykgPT09ICJ1bmRlZmluZWQiIHx8IGtleXMgPT09IG51bGwpIHsKICAgIAogICAgdGhpcy5nZC5kYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm9yaWdEYXRhKSk7CiAgICAKICB9IGVsc2UgewogIAogICAgdmFyIHRyYWNlcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9yaWdEYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB0cmFjZSA9IHRoaXMub3JpZ0RhdGFbaV07CiAgICAgIGlmICghdHJhY2Uua2V5IHx8IHRyYWNlLnNldCAhPT0gZ3JvdXApIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB2YXIgbWF0Y2hGdW5jID0gZ2V0TWF0Y2hGdW5jKHRyYWNlKTsKICAgICAgdmFyIG1hdGNoZXMgPSBtYXRjaEZ1bmModHJhY2Uua2V5LCBrZXlzKTsKICAgICAgCiAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHsKICAgICAgICBpZiAoIXRyYWNlLl9pc1NpbXBsZUtleSkgewogICAgICAgICAgLy8gc3Vic2V0QXJyYXlBdHRycyBkb2Vzbid0IG11dGF0ZSB0cmFjZSAoaXQgbWFrZXMgYSBtb2RpZmllZCBjbG9uZSkKICAgICAgICAgIHRyYWNlID0gc3Vic2V0QXJyYXlBdHRycyh0cmFjZSwgbWF0Y2hlcyk7CiAgICAgICAgfQogICAgICAgIHRyYWNlcy5wdXNoKHRyYWNlKTsKICAgICAgfQogICAgfQogIH0KICAKICB0aGlzLmdkLmRhdGEgPSB0cmFjZXM7CiAgUGxvdGx5LnJlZHJhdyh0aGlzLmdkKTsKICAKICAvLyBOT1RFOiB3ZSBwdXJwb3NlbHkgZG8gX25vdF8gcmVzdG9yZSBzZWxlY3Rpb24ocyksIHNpbmNlIG9uIGZpbHRlciwKICAvLyBheGlzIGxpa2VseSB3aWxsIHVwZGF0ZSwgY2hhbmdpbmcgdGhlIHBpeGVsIC0+IGRhdGEgbWFwcGluZywgbGVhZGluZyAKICAvLyB0byBhIGxpa2VseSBtaXNtYXRjaCBpbiB0aGUgYnJ1c2ggb3V0bGluZSBhbmQgaGlnaGxpZ2h0ZWQgbWFya3MKICAKfTsKClRyYWNlTWFuYWdlci5wcm90b3R5cGUudXBkYXRlU2VsZWN0aW9uID0gZnVuY3Rpb24oZ3JvdXAsIGtleXMpIHsKICAKICBpZiAoa2V5cyAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheShrZXlzKSkgewogICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGtleXMgYXJndW1lbnQ7IG51bGwgb3IgYXJyYXkgZXhwZWN0ZWQiKTsKICB9CiAgCiAgLy8gaWYgc2VsZWN0aW9uIGhhcyBiZWVuIGNsZWFyZWQsIG9yIGlmIHRoaXMgaXMgdHJhbnNpZW50CiAgLy8gc2VsZWN0aW9uLCBkZWxldGUgdGhlICJzZWxlY3Rpb24gdHJhY2VzIgogIHZhciBuTmV3VHJhY2VzID0gdGhpcy5nZC5kYXRhLmxlbmd0aCAtIHRoaXMub3JpZ0RhdGEubGVuZ3RoOwogIGlmIChrZXlzID09PSBudWxsIHx8ICF0aGlzLmhpZ2hsaWdodC5wZXJzaXN0ZW50ICYmIG5OZXdUcmFjZXMgPiAwKSB7CiAgICB2YXIgdHJhY2VzVG9SZW1vdmUgPSBbXTsKICAgIGZvciAodmFyIGkgPSB0aGlzLm9yaWdEYXRhLmxlbmd0aDsgaSA8IHRoaXMuZ2QuZGF0YS5sZW5ndGg7IGkrKykgewogICAgICB0cmFjZXNUb1JlbW92ZS5wdXNoKGkpOwogICAgfQogICAgUGxvdGx5LmRlbGV0ZVRyYWNlcyh0aGlzLmdkLCB0cmFjZXNUb1JlbW92ZSk7CiAgICB0aGlzLmdyb3VwU2VsZWN0aW9uc1tncm91cF0gPSBrZXlzOwogIH0gZWxzZSB7CiAgICAvLyBhZGQgdG8gdGhlIGdyb3VwU2VsZWN0aW9uLCByYXRoZXIgdGhhbiBvdmVyd3JpdGluZyBpdAogICAgLy8gVE9ETzogY2FuIHRoaXMgYmUgcmVtb3ZlZD8KICAgIHRoaXMuZ3JvdXBTZWxlY3Rpb25zW2dyb3VwXSA9IHRoaXMuZ3JvdXBTZWxlY3Rpb25zW2dyb3VwXSB8fCBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgayA9IGtleXNbaV07CiAgICAgIGlmICh0aGlzLmdyb3VwU2VsZWN0aW9uc1tncm91cF0uaW5kZXhPZihrKSA8IDApIHsKICAgICAgICB0aGlzLmdyb3VwU2VsZWN0aW9uc1tncm91cF0ucHVzaChrKTsKICAgICAgfQogICAgfQogIH0KICAKICBpZiAoa2V5cyA9PT0gbnVsbCkgewogICAgCiAgICBQbG90bHkucmVzdHlsZSh0aGlzLmdkLCB7Im9wYWNpdHkiOiB0aGlzLm9yaWdPcGFjaXR5fSk7CiAgICAKICB9IGVsc2UgaWYgKGtleXMubGVuZ3RoID49IDEpIHsKICAgIAogICAgLy8gcGxhY2Vob2xkZXIgZm9yIG5ldyAic2VsZWN0aW9uIHRyYWNlcyIKICAgIHZhciB0cmFjZXMgPSBbXTsKICAgIC8vIHRoaXMgdmFyaWFibGUgaXMgc2V0IGluIFIvaGlnaGxpZ2h0LlIKICAgIHZhciBzZWxlY3Rpb25Db2xvdXIgPSBjcm9zc3RhbGsuZ3JvdXAoZ3JvdXApLnZhcigicGxvdGx5U2VsZWN0aW9uQ29sb3VyIikuZ2V0KCkgfHwgCiAgICAgIHRoaXMuaGlnaGxpZ2h0LmNvbG9yWzBdOwoKICAgIC8vIHNlbGVjdGlvbiBicnVzaCBhdHRyaWJ1dGVzCiAgICB2YXIgc2VsZWN0QXR0cnMgPSBPYmplY3Qua2V5cyh0aGlzLmhpZ2hsaWdodC5zZWxlY3RlZCk7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm9yaWdEYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgIC8vIFRPRE86IHRyeSB1c2luZyBMaWIuZXh0ZW5kRmxhdCgpIGFzIGRvbmUgaW4gIAogICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vcGxvdGx5L3Bsb3RseS5qcy9wdWxsLzExMzYgCiAgICAgIHZhciB0cmFjZSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5nZC5kYXRhW2ldKSk7CiAgICAgIGlmICghdHJhY2Uua2V5IHx8IHRyYWNlLnNldCAhPT0gZ3JvdXApIHsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICAvLyBHZXQgc29ydGVkIGFycmF5IG9mIG1hdGNoaW5nIGluZGljZXMgaW4gdHJhY2Uua2V5CiAgICAgIHZhciBtYXRjaEZ1bmMgPSBnZXRNYXRjaEZ1bmModHJhY2UpOwogICAgICB2YXIgbWF0Y2hlcyA9IG1hdGNoRnVuYyh0cmFjZS5rZXksIGtleXMpOwogICAgICAKICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMCkgewogICAgICAgIC8vIElmIHRoaXMgaXMgYSAic2ltcGxlIiBrZXksIHRoYXQgbWVhbnMgc2VsZWN0IHRoZSBlbnRpcmUgdHJhY2UKICAgICAgICBpZiAoIXRyYWNlLl9pc1NpbXBsZUtleSkgewogICAgICAgICAgdHJhY2UgPSBzdWJzZXRBcnJheUF0dHJzKHRyYWNlLCBtYXRjaGVzKTsKICAgICAgICB9CiAgICAgICAgLy8gQXBwbHkgc2VsZWN0aW9uIGJydXNoIGF0dHJpYnV0ZXMgKHN1cHBsaWVkIGZyb20gUikKICAgICAgICAvLyBUT0RPOiBpdCB3b3VsZCBiZSBuZWF0IHRvIGhhdmUgYSBkcm9wZG93biB0byBkeW5hbWljYWxseSBzcGVjaWZ5IHRoZXNlCiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzZWxlY3RBdHRycy5sZW5ndGg7IGorKykgewogICAgICAgICAgdmFyIGF0dHIgPSBzZWxlY3RBdHRyc1tqXTsKICAgICAgICAgIHRyYWNlW2F0dHJdID0gdGhpcy5oaWdobGlnaHQuc2VsZWN0ZWRbYXR0cl07CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIGlmIGl0IGlzIGRlZmluZWQsIG92ZXJyaWRlIGNvbG9yIHdpdGggdGhlICJkeW5hbWljIGJydXNoIGNvbG9yIiIKICAgICAgICAvLyBUT0RPOiBEUlkgdGhpcyB1cAogICAgICAgIHZhciBkID0gdGhpcy5nZC5fZnVsbERhdGFbaV07CiAgICAgICAgaWYgKGQubWFya2VyKSB7CiAgICAgICAgICB0cmFjZS5tYXJrZXIgPSB0cmFjZS5tYXJrZXIgfHwge307CiAgICAgICAgICB0cmFjZS5tYXJrZXIuY29sb3IgPSAgc2VsZWN0aW9uQ29sb3VyIHx8IHRyYWNlLm1hcmtlci5jb2xvciB8fCBkLm1hcmtlci5jb2xvcjsKICAgICAgICAgIAogICAgICAgICAgLy8gYWRvcHQgYW55IHVzZXItZGVmaW5lZCBzdHlsaW5nIGZvciB0aGUgc2VsZWN0aW9uCiAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSB0aGlzLmhpZ2hsaWdodC5zZWxlY3RlZC5tYXJrZXIgfHwge307CiAgICAgICAgICB2YXIgYXR0cnMgPSBPYmplY3Qua2V5cyhzZWxlY3RlZCk7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGF0dHJzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHRyYWNlLm1hcmtlclthdHRyc1tqXV0gPSBzZWxlY3RlZFthdHRyc1tqXV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChkLmxpbmUpIHsKICAgICAgICAgIHRyYWNlLmxpbmUgPSB0cmFjZS5saW5lIHx8IHt9OwogICAgICAgICAgdHJhY2UubGluZS5jb2xvciA9ICBzZWxlY3Rpb25Db2xvdXIgfHwgdHJhY2UubGluZS5jb2xvciB8fCBkLmxpbmUuY29sb3I7CiAgICAgICAgICAKICAgICAgICAgIC8vIGFkb3B0IGFueSB1c2VyLWRlZmluZWQgc3R5bGluZyBmb3IgdGhlIHNlbGVjdGlvbgogICAgICAgICAgdmFyIHNlbGVjdGVkID0gdGhpcy5oaWdobGlnaHQuc2VsZWN0ZWQubGluZSB8fCB7fTsKICAgICAgICAgIHZhciBhdHRycyA9IE9iamVjdC5rZXlzKHNlbGVjdGVkKTsKICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYXR0cnMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgdHJhY2UubGluZVthdHRyc1tqXV0gPSBzZWxlY3RlZFthdHRyc1tqXV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIGlmIChkLnRleHRmb250KSB7CiAgICAgICAgICB0cmFjZS50ZXh0Zm9udCA9IHRyYWNlLnRleHRmb250IHx8IHt9OwogICAgICAgICAgdHJhY2UudGV4dGZvbnQuY29sb3IgPSAgc2VsZWN0aW9uQ29sb3VyIHx8IHRyYWNlLnRleHRmb250LmNvbG9yIHx8IGQudGV4dGZvbnQuY29sb3I7CiAgICAgICAgICAKICAgICAgICAgIC8vIGFkb3B0IGFueSB1c2VyLWRlZmluZWQgc3R5bGluZyBmb3IgdGhlIHNlbGVjdGlvbgogICAgICAgICAgdmFyIHNlbGVjdGVkID0gdGhpcy5oaWdobGlnaHQuc2VsZWN0ZWQudGV4dGZvbnQgfHwge307CiAgICAgICAgICB2YXIgYXR0cnMgPSBPYmplY3Qua2V5cyhzZWxlY3RlZCk7CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGF0dHJzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHRyYWNlLnRleHRmb250W2F0dHJzW2pdXSA9IHNlbGVjdGVkW2F0dHJzW2pdXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gYXR0YWNoIGEgc2Vuc2libGUgbmFtZS9sZWdlbmRncm91cAogICAgICAgIHRyYWNlLm5hbWUgPSB0cmFjZS5uYW1lIHx8IGtleXMuam9pbigiPGJyIC8+Iik7CiAgICAgICAgdHJhY2UubGVnZW5kZ3JvdXAgPSB0cmFjZS5sZWdlbmRncm91cCB8fCBrZXlzLmpvaW4oIjxiciAvPiIpOwogICAgICAgIAogICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgbWFwcGluZyBiZXR3ZWVuIHRoaXMgbmV3IHRyYWNlIGFuZCB0aGUgdHJhY2UgaXQgdGFyZ2V0cwogICAgICAgIC8vIChuZWNlc3NhcnkgZm9yIHVwZGF0aW5nIGZyYW1lcyB0byByZWZsZWN0IHRoZSBzZWxlY3Rpb24gdHJhY2VzKQogICAgICAgIHRyYWNlLl9vcmlnaW5hbEluZGV4ID0gaTsKICAgICAgICB0cmFjZS5fbmV3SW5kZXggPSB0aGlzLmdkLl9mdWxsRGF0YS5sZW5ndGggKyB0cmFjZXMubGVuZ3RoOwogICAgICAgIHRyYWNlcy5wdXNoKHRyYWNlKTsKICAgICAgfQogICAgfQogICAgCiAgICBpZiAodHJhY2VzLmxlbmd0aCA+IDApIHsKICAgICAgCiAgICAgIFBsb3RseS5hZGRUcmFjZXModGhpcy5nZCwgdHJhY2VzKS50aGVuKGZ1bmN0aW9uKGdkKSB7CiAgICAgICAgLy8gaW5jcmVtZW50YWxseSBhZGQgc2VsZWN0aW9uIHRyYWNlcyB0byBmcmFtZXMKICAgICAgICAvLyAodGhpcyBpcyBoZWF2aWx5IGluc3BpcmVkIGJ5IFBsb3RseS5QbG90cy5tb2RpZnlGcmFtZXMoKSAKICAgICAgICAvLyBpbiBzcmMvcGxvdHMvcGxvdHMuanMpCiAgICAgICAgdmFyIF9oYXNoID0gZ2QuX3RyYW5zaXRpb25EYXRhLl9mcmFtZUhhc2g7CiAgICAgICAgdmFyIF9mcmFtZXMgPSBnZC5fdHJhbnNpdGlvbkRhdGEuX2ZyYW1lcyB8fCBbXTsKICAgICAgICAKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IF9mcmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIAogICAgICAgICAgLy8gYWRkIHRvIF9mcmFtZXNbaV0udHJhY2VzICppZiogdGhpcyBmcmFtZSByZWZlcmVuY2VzIHNlbGVjdGVkIHRyYWNlKHMpCiAgICAgICAgICB2YXIgbmV3SW5kaWNlcyA9IFtdOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0cmFjZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgdmFyIHRyID0gdHJhY2VzW2pdOwogICAgICAgICAgICBpZiAoX2ZyYW1lc1tpXS50cmFjZXMuaW5kZXhPZih0ci5fb3JpZ2luYWxJbmRleCkgPiAtMSkgewogICAgICAgICAgICAgIG5ld0luZGljZXMucHVzaCh0ci5fbmV3SW5kZXgpOwogICAgICAgICAgICAgIF9mcmFtZXNbaV0udHJhY2VzLnB1c2godHIuX25ld0luZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvLi4uCiAgICAgICAgICBpZiAobmV3SW5kaWNlcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICAKICAgICAgICAgIHZhciBjdHIgPSAwOwogICAgICAgICAgdmFyIG5GcmFtZVRyYWNlcyA9IF9mcmFtZXNbaV0uZGF0YS5sZW5ndGg7CiAgICAgICAgICAKICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbkZyYW1lVHJhY2VzOyBqKyspIHsKICAgICAgICAgICAgdmFyIGZyYW1lVHJhY2UgPSBfZnJhbWVzW2ldLmRhdGFbal07CiAgICAgICAgICAgIGlmICghZnJhbWVUcmFjZS5rZXkgfHwgZnJhbWVUcmFjZS5zZXQgIT09IGdyb3VwKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIHZhciBtYXRjaEZ1bmMgPSBnZXRNYXRjaEZ1bmMoZnJhbWVUcmFjZSk7CiAgICAgICAgICAgIHZhciBtYXRjaGVzID0gbWF0Y2hGdW5jKGZyYW1lVHJhY2Uua2V5LCBrZXlzKTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICBpZiAoIXRyYWNlLl9pc1NpbXBsZUtleSkgewogICAgICAgICAgICAgICAgZnJhbWVUcmFjZSA9IHN1YnNldEFycmF5QXR0cnMoZnJhbWVUcmFjZSwgbWF0Y2hlcyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBkID0gZ2QuX2Z1bGxEYXRhW25ld0luZGljZXNbY3RyXV07CiAgICAgICAgICAgICAgaWYgKGQubWFya2VyKSB7CiAgICAgICAgICAgICAgICBmcmFtZVRyYWNlLm1hcmtlciA9IGQubWFya2VyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoZC5saW5lKSB7CiAgICAgICAgICAgICAgICBmcmFtZVRyYWNlLmxpbmUgPSBkLmxpbmU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChkLnRleHRmb250KSB7CiAgICAgICAgICAgICAgICBmcmFtZVRyYWNlLnRleHRmb250ID0gZC50ZXh0Zm9udDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY3RyID0gY3RyICsgMTsKICAgICAgICAgICAgICBfZnJhbWVzW2ldLmRhdGEucHVzaChmcmFtZVRyYWNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgICAvLyB1cGRhdGUgZ2QuX3RyYW5zaXRpb25EYXRhLl9mcmFtZUhhc2gKICAgICAgICAgIF9oYXNoW19mcmFtZXNbaV0ubmFtZV0gPSBfZnJhbWVzW2ldOwogICAgICAgIH0KICAgICAgCiAgICAgIH0pOwogICAgICAKICAgICAgLy8gZGltIHRyYWNlcyB0aGF0IGhhdmUgYSBzZXQgbWF0Y2hpbmcgdGhlIHNldCBvZiBzZWxlY3Rpb24gc2V0cwogICAgICB2YXIgdHJhY2VzVG9EaW0gPSBbXSwKICAgICAgICAgIG9wYWNpdGllcyA9IFtdLAogICAgICAgICAgc2V0cyA9IE9iamVjdC5rZXlzKHRoaXMuZ3JvdXBTZWxlY3Rpb25zKSwKICAgICAgICAgIG4gPSB0aGlzLm9yaWdEYXRhLmxlbmd0aDsKICAgICAgICAgIAogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHZhciBvcGFjaXR5ID0gdGhpcy5vcmlnT3BhY2l0eVtpXSB8fCAxOwogICAgICAgIC8vIGhhdmUgd2UgYWxyZWFkeSBkaW1tZWQgdGhpcyB0cmFjZT8gT3IgaXMgdGhpcyBldmVuIHdvcnRoIGRvaW5nPwogICAgICAgIGlmIChvcGFjaXR5ICE9PSB0aGlzLmdkLl9mdWxsRGF0YVtpXS5vcGFjaXR5IHx8IHRoaXMuaGlnaGxpZ2h0Lm9wYWNpdHlEaW0gPT09IDEpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICAvLyBpcyB0aGlzIHNldCBhbiBlbGVtZW50IG9mIHRoZSBzZXQgb2Ygc2VsZWN0aW9uIHNldHM/CiAgICAgICAgdmFyIG1hdGNoZXMgPSBmaW5kTWF0Y2hlcyhzZXRzLCBbdGhpcy5nZC5kYXRhW2ldLnNldF0pOwogICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCkgewogICAgICAgICAgdHJhY2VzVG9EaW0ucHVzaChpKTsKICAgICAgICAgIG9wYWNpdGllcy5wdXNoKG9wYWNpdHkgKiB0aGlzLmhpZ2hsaWdodC5vcGFjaXR5RGltKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIGlmICh0cmFjZXNUb0RpbS5sZW5ndGggPiAwKSB7CiAgICAgICAgUGxvdGx5LnJlc3R5bGUodGhpcy5nZCwgeyJvcGFjaXR5Ijogb3BhY2l0aWVzfSwgdHJhY2VzVG9EaW0pOwogICAgICB9CiAgICAgIAogICAgfQogICAgCiAgfQp9OwoKLyogCk5vdGU6IGluIGFsbCBvZiB0aGVzZSBtYXRjaCBmdW5jdGlvbnMsIHdlIGFzc3VtZSBuZWVkbGVTZXQgKGkuZS4gdGhlIHNlbGVjdGVkIGtleXMpCmlzIGEgMUQgKG9yIGZsYXQpIGFycmF5LiBUaGUgcmVhbCBkaWZmZXJlbmNlIGlzIHRoZSBtZWFuaW5nIG9mIGhheXN0YWNrLgpmaW5kTWF0Y2hlcygpIGRvZXMgdGhlIHVzdWFsIHRoaW5nIHlvdSdkIGV4cGVjdCBmb3IgCmxpbmtlZCBicnVzaGluZyBvbiBhIHNjYXR0ZXJwbG90IG1hdHJpeC4gZmluZFNpbXBsZU1hdGNoZXMoKSByZXR1cm5zIGEgbWF0Y2ggaWZmIApoYXlzdGFjayBpcyBhIHN1YnNldCBvZiB0aGUgbmVlZGxlU2V0LiBmaW5kTmVzdGVkTWF0Y2hlcygpIHJldHVybnMgCiovCgpmdW5jdGlvbiBnZXRNYXRjaEZ1bmModHJhY2UpIHsKICByZXR1cm4gKHRyYWNlLl9pc05lc3RlZEtleSkgPyBmaW5kTmVzdGVkTWF0Y2hlcyA6IAogICAgKHRyYWNlLl9pc1NpbXBsZUtleSkgPyBmaW5kU2ltcGxlTWF0Y2hlcyA6IGZpbmRNYXRjaGVzOwp9CgovLyBmaW5kIG1hdGNoZXMgZm9yICJmbGF0IiBrZXlzCmZ1bmN0aW9uIGZpbmRNYXRjaGVzKGhheXN0YWNrLCBuZWVkbGVTZXQpIHsKICB2YXIgbWF0Y2hlcyA9IFtdOwogIGhheXN0YWNrLmZvckVhY2goZnVuY3Rpb24ob2JqLCBpKSB7CiAgICBpZiAob2JqID09PSBudWxsIHx8IG5lZWRsZVNldC5pbmRleE9mKG9iaikgPj0gMCkgewogICAgICBtYXRjaGVzLnB1c2goaSk7CiAgICB9CiAgfSk7CiAgcmV0dXJuIG1hdGNoZXM7Cn0KCi8vIGZpbmQgbWF0Y2hlcyBmb3IgInNpbXBsZSIga2V5cwpmdW5jdGlvbiBmaW5kU2ltcGxlTWF0Y2hlcyhoYXlzdGFjaywgbmVlZGxlU2V0KSB7CiAgdmFyIG1hdGNoID0gaGF5c3RhY2suZXZlcnkoZnVuY3Rpb24odmFsKSB7CiAgICByZXR1cm4gdmFsID09PSBudWxsIHx8IG5lZWRsZVNldC5pbmRleE9mKHZhbCkgPj0gMDsKICB9KTsKICAvLyB5ZXMsIHRoaXMgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2Ugb3RoZXIgdGhhbiBjb25mb3JtaW5nIAogIC8vIHRvIHRoZSBvdXRwdXQgdHlwZSBvZiB0aGUgb3RoZXIgbWF0Y2ggZnVuY3Rpb25zCiAgcmV0dXJuIChtYXRjaCkgPyBbMF0gOiBbXQp9CgovLyBmaW5kIG1hdGNoZXMgZm9yIGEgIm5lc3RlZCIgaGF5c3RhY2sgKDJEIGFycmF5cykKZnVuY3Rpb24gZmluZE5lc3RlZE1hdGNoZXMoaGF5c3RhY2ssIG5lZWRsZVNldCkgewogIHZhciBtYXRjaGVzID0gW107CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBoYXlzdGFjay5sZW5ndGg7IGkrKykgewogICAgdmFyIGhheSA9IGhheXN0YWNrW2ldOwogICAgdmFyIG1hdGNoID0gaGF5LmV2ZXJ5KGZ1bmN0aW9uKHZhbCkgeyAKICAgICAgcmV0dXJuIHZhbCA9PT0gbnVsbCB8fCBuZWVkbGVTZXQuaW5kZXhPZih2YWwpID49IDA7IAogICAgfSk7CiAgICBpZiAobWF0Y2gpIHsKICAgICAgbWF0Y2hlcy5wdXNoKGkpOwogICAgfQogIH0KICByZXR1cm4gbWF0Y2hlczsKfQoKZnVuY3Rpb24gaXNQbGFpbk9iamVjdChvYmopIHsKICByZXR1cm4gKAogICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09ICdbb2JqZWN0IE9iamVjdF0nICYmCiAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSA9PT0gT2JqZWN0LnByb3RvdHlwZQogICk7Cn0KCmZ1bmN0aW9uIHN1YnNldEFycmF5QXR0cnMob2JqLCBpbmRpY2VzKSB7CiAgdmFyIG5ld09iaiA9IHt9OwogIE9iamVjdC5rZXlzKG9iaikuZm9yRWFjaChmdW5jdGlvbihrKSB7CiAgICB2YXIgdmFsID0gb2JqW2tdOwoKICAgIGlmIChrLmNoYXJBdCgwKSA9PT0gIl8iKSB7CiAgICAgIG5ld09ialtrXSA9IHZhbDsKICAgIH0gZWxzZSBpZiAoayA9PT0gInRyYW5zZm9ybXMiICYmIEFycmF5LmlzQXJyYXkodmFsKSkgewogICAgICBuZXdPYmpba10gPSB2YWwubWFwKGZ1bmN0aW9uKHRyYW5zZm9ybSkgewogICAgICAgIHJldHVybiBzdWJzZXRBcnJheUF0dHJzKHRyYW5zZm9ybSwgaW5kaWNlcyk7CiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChrID09PSAiY29sb3JzY2FsZSIgJiYgQXJyYXkuaXNBcnJheSh2YWwpKSB7CiAgICAgIG5ld09ialtrXSA9IHZhbDsKICAgIH0gZWxzZSBpZiAoaXNQbGFpbk9iamVjdCh2YWwpKSB7CiAgICAgIG5ld09ialtrXSA9IHN1YnNldEFycmF5QXR0cnModmFsLCBpbmRpY2VzKTsKICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7CiAgICAgIG5ld09ialtrXSA9IHN1YnNldEFycmF5KHZhbCwgaW5kaWNlcyk7CiAgICB9IGVsc2UgewogICAgICBuZXdPYmpba10gPSB2YWw7CiAgICB9CiAgfSk7CiAgcmV0dXJuIG5ld09iajsKfQoKZnVuY3Rpb24gc3Vic2V0QXJyYXkoYXJyLCBpbmRpY2VzKSB7CiAgdmFyIHJlc3VsdCA9IFtdOwogIGZvciAodmFyIGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKykgewogICAgcmVzdWx0LnB1c2goYXJyW2luZGljZXNbaV1dKTsKICB9CiAgcmV0dXJuIHJlc3VsdDsKfQoKLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHJlbW92aW5nIHBsb3RseSdzIGJydXNoIApmdW5jdGlvbiByZW1vdmVCcnVzaChlbCkgewogIHZhciBvdXRsaW5lcyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGwoIi5zZWxlY3Qtb3V0bGluZSIpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgb3V0bGluZXMubGVuZ3RoOyBpKyspIHsKICAgIG91dGxpbmVzW2ldLnJlbW92ZSgpOwogIH0KfQo="></script>
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKGdsb2JhbCl7InVzZSBzdHJpY3QiO3ZhciB1bmRlZmluZWQ9dm9pZCAwO3ZhciBNQVhfQVJSQVlfTEVOR1RIPTFlNTtmdW5jdGlvbiBUeXBlKHYpe3N3aXRjaCh0eXBlb2Ygdil7Y2FzZSJ1bmRlZmluZWQiOnJldHVybiJ1bmRlZmluZWQiO2Nhc2UiYm9vbGVhbiI6cmV0dXJuImJvb2xlYW4iO2Nhc2UibnVtYmVyIjpyZXR1cm4ibnVtYmVyIjtjYXNlInN0cmluZyI6cmV0dXJuInN0cmluZyI7ZGVmYXVsdDpyZXR1cm4gdj09PW51bGw/Im51bGwiOiJvYmplY3QifX1mdW5jdGlvbiBDbGFzcyh2KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHYpLnJlcGxhY2UoL15cW29iamVjdCAqfFxdJC9nLCIiKX1mdW5jdGlvbiBJc0NhbGxhYmxlKG8pe3JldHVybiB0eXBlb2Ygbz09PSJmdW5jdGlvbiJ9ZnVuY3Rpb24gVG9PYmplY3Qodil7aWYodj09PW51bGx8fHY9PT11bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKCk7cmV0dXJuIE9iamVjdCh2KX1mdW5jdGlvbiBUb0ludDMyKHYpe3JldHVybiB2Pj4wfWZ1bmN0aW9uIFRvVWludDMyKHYpe3JldHVybiB2Pj4+MH12YXIgTE4yPU1hdGguTE4yLGFicz1NYXRoLmFicyxmbG9vcj1NYXRoLmZsb29yLGxvZz1NYXRoLmxvZyxtYXg9TWF0aC5tYXgsbWluPU1hdGgubWluLHBvdz1NYXRoLnBvdyxyb3VuZD1NYXRoLnJvdW5kOyhmdW5jdGlvbigpe3ZhciBvcmlnPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgZG9tX29ubHk9IWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIngiLHt9KX1jYXRjaChfKXtyZXR1cm4gZmFsc2V9fSgpO2lmKCFvcmlnfHxkb21fb25seSl7T2JqZWN0LmRlZmluZVByb3BlcnR5PWZ1bmN0aW9uKG8scHJvcCxkZXNjKXtpZihvcmlnKXRyeXtyZXR1cm4gb3JpZyhvLHByb3AsZGVzYyl9Y2F0Y2goXyl7fWlmKG8hPT1PYmplY3QobykpdGhyb3cgVHlwZUVycm9yKCJPYmplY3QuZGVmaW5lUHJvcGVydHkgY2FsbGVkIG9uIG5vbi1vYmplY3QiKTtpZihPYmplY3QucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18mJiJnZXQiaW4gZGVzYylPYmplY3QucHJvdG90eXBlLl9fZGVmaW5lR2V0dGVyX18uY2FsbChvLHByb3AsZGVzYy5nZXQpO2lmKE9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXyYmInNldCJpbiBkZXNjKU9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVTZXR0ZXJfXy5jYWxsKG8scHJvcCxkZXNjLnNldCk7aWYoInZhbHVlImluIGRlc2Mpb1twcm9wXT1kZXNjLnZhbHVlO3JldHVybiBvfX19KSgpO2Z1bmN0aW9uIG1ha2VBcnJheUFjY2Vzc29ycyhvYmope2lmKG9iai5sZW5ndGg+TUFYX0FSUkFZX0xFTkdUSCl0aHJvdyBSYW5nZUVycm9yKCJBcnJheSB0b28gbGFyZ2UgZm9yIHBvbHlmaWxsIik7ZnVuY3Rpb24gbWFrZUFycmF5QWNjZXNzb3IoaW5kZXgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosaW5kZXgse2dldDpmdW5jdGlvbigpe3JldHVybiBvYmouX2dldHRlcihpbmRleCl9LHNldDpmdW5jdGlvbih2KXtvYmouX3NldHRlcihpbmRleCx2KX0sZW51bWVyYWJsZTp0cnVlLGNvbmZpZ3VyYWJsZTpmYWxzZX0pfXZhciBpO2ZvcihpPTA7aTxvYmoubGVuZ3RoO2krPTEpe21ha2VBcnJheUFjY2Vzc29yKGkpfX1mdW5jdGlvbiBhc19zaWduZWQodmFsdWUsYml0cyl7dmFyIHM9MzItYml0cztyZXR1cm4gdmFsdWU8PHM+PnN9ZnVuY3Rpb24gYXNfdW5zaWduZWQodmFsdWUsYml0cyl7dmFyIHM9MzItYml0cztyZXR1cm4gdmFsdWU8PHM+Pj5zfWZ1bmN0aW9uIHBhY2tJOChuKXtyZXR1cm5bbiYyNTVdfWZ1bmN0aW9uIHVucGFja0k4KGJ5dGVzKXtyZXR1cm4gYXNfc2lnbmVkKGJ5dGVzWzBdLDgpfWZ1bmN0aW9uIHBhY2tVOChuKXtyZXR1cm5bbiYyNTVdfWZ1bmN0aW9uIHVucGFja1U4KGJ5dGVzKXtyZXR1cm4gYXNfdW5zaWduZWQoYnl0ZXNbMF0sOCl9ZnVuY3Rpb24gcGFja1U4Q2xhbXBlZChuKXtuPXJvdW5kKE51bWJlcihuKSk7cmV0dXJuW248MD8wOm4+MjU1PzI1NTpuJjI1NV19ZnVuY3Rpb24gcGFja0kxNihuKXtyZXR1cm5bbj4+OCYyNTUsbiYyNTVdfWZ1bmN0aW9uIHVucGFja0kxNihieXRlcyl7cmV0dXJuIGFzX3NpZ25lZChieXRlc1swXTw8OHxieXRlc1sxXSwxNil9ZnVuY3Rpb24gcGFja1UxNihuKXtyZXR1cm5bbj4+OCYyNTUsbiYyNTVdfWZ1bmN0aW9uIHVucGFja1UxNihieXRlcyl7cmV0dXJuIGFzX3Vuc2lnbmVkKGJ5dGVzWzBdPDw4fGJ5dGVzWzFdLDE2KX1mdW5jdGlvbiBwYWNrSTMyKG4pe3JldHVybltuPj4yNCYyNTUsbj4+MTYmMjU1LG4+PjgmMjU1LG4mMjU1XX1mdW5jdGlvbiB1bnBhY2tJMzIoYnl0ZXMpe3JldHVybiBhc19zaWduZWQoYnl0ZXNbMF08PDI0fGJ5dGVzWzFdPDwxNnxieXRlc1syXTw8OHxieXRlc1szXSwzMil9ZnVuY3Rpb24gcGFja1UzMihuKXtyZXR1cm5bbj4+MjQmMjU1LG4+PjE2JjI1NSxuPj44JjI1NSxuJjI1NV19ZnVuY3Rpb24gdW5wYWNrVTMyKGJ5dGVzKXtyZXR1cm4gYXNfdW5zaWduZWQoYnl0ZXNbMF08PDI0fGJ5dGVzWzFdPDwxNnxieXRlc1syXTw8OHxieXRlc1szXSwzMil9ZnVuY3Rpb24gcGFja0lFRUU3NTQodixlYml0cyxmYml0cyl7dmFyIGJpYXM9KDE8PGViaXRzLTEpLTEscyxlLGYsbG4saSxiaXRzLHN0cixieXRlcztmdW5jdGlvbiByb3VuZFRvRXZlbihuKXt2YXIgdz1mbG9vcihuKSxmPW4tdztpZihmPC41KXJldHVybiB3O2lmKGY+LjUpcmV0dXJuIHcrMTtyZXR1cm4gdyUyP3crMTp3fWlmKHYhPT12KXtlPSgxPDxlYml0cyktMTtmPXBvdygyLGZiaXRzLTEpO3M9MH1lbHNlIGlmKHY9PT1JbmZpbml0eXx8dj09PS1JbmZpbml0eSl7ZT0oMTw8ZWJpdHMpLTE7Zj0wO3M9djwwPzE6MH1lbHNlIGlmKHY9PT0wKXtlPTA7Zj0wO3M9MS92PT09LUluZmluaXR5PzE6MH1lbHNle3M9djwwO3Y9YWJzKHYpO2lmKHY+PXBvdygyLDEtYmlhcykpe2U9bWluKGZsb29yKGxvZyh2KS9MTjIpLDEwMjMpO2Y9cm91bmRUb0V2ZW4odi9wb3coMixlKSpwb3coMixmYml0cykpO2lmKGYvcG93KDIsZmJpdHMpPj0yKXtlPWUrMTtmPTF9aWYoZT5iaWFzKXtlPSgxPDxlYml0cyktMTtmPTB9ZWxzZXtlPWUrYmlhcztmPWYtcG93KDIsZmJpdHMpfX1lbHNle2U9MDtmPXJvdW5kVG9FdmVuKHYvcG93KDIsMS1iaWFzLWZiaXRzKSl9fWJpdHM9W107Zm9yKGk9ZmJpdHM7aTtpLT0xKXtiaXRzLnB1c2goZiUyPzE6MCk7Zj1mbG9vcihmLzIpfWZvcihpPWViaXRzO2k7aS09MSl7Yml0cy5wdXNoKGUlMj8xOjApO2U9Zmxvb3IoZS8yKX1iaXRzLnB1c2gocz8xOjApO2JpdHMucmV2ZXJzZSgpO3N0cj1iaXRzLmpvaW4oIiIpO2J5dGVzPVtdO3doaWxlKHN0ci5sZW5ndGgpe2J5dGVzLnB1c2gocGFyc2VJbnQoc3RyLnN1YnN0cmluZygwLDgpLDIpKTtzdHI9c3RyLnN1YnN0cmluZyg4KX1yZXR1cm4gYnl0ZXN9ZnVuY3Rpb24gdW5wYWNrSUVFRTc1NChieXRlcyxlYml0cyxmYml0cyl7dmFyIGJpdHM9W10saSxqLGIsc3RyLGJpYXMscyxlLGY7Zm9yKGk9Ynl0ZXMubGVuZ3RoO2k7aS09MSl7Yj1ieXRlc1tpLTFdO2ZvcihqPTg7ajtqLT0xKXtiaXRzLnB1c2goYiUyPzE6MCk7Yj1iPj4xfX1iaXRzLnJldmVyc2UoKTtzdHI9Yml0cy5qb2luKCIiKTtiaWFzPSgxPDxlYml0cy0xKS0xO3M9cGFyc2VJbnQoc3RyLnN1YnN0cmluZygwLDEpLDIpPy0xOjE7ZT1wYXJzZUludChzdHIuc3Vic3RyaW5nKDEsMStlYml0cyksMik7Zj1wYXJzZUludChzdHIuc3Vic3RyaW5nKDErZWJpdHMpLDIpO2lmKGU9PT0oMTw8ZWJpdHMpLTEpe3JldHVybiBmIT09MD9OYU46cypJbmZpbml0eX1lbHNlIGlmKGU+MCl7cmV0dXJuIHMqcG93KDIsZS1iaWFzKSooMStmL3BvdygyLGZiaXRzKSl9ZWxzZSBpZihmIT09MCl7cmV0dXJuIHMqcG93KDIsLShiaWFzLTEpKSooZi9wb3coMixmYml0cykpfWVsc2V7cmV0dXJuIHM8MD8tMDowfX1mdW5jdGlvbiB1bnBhY2tGNjQoYil7cmV0dXJuIHVucGFja0lFRUU3NTQoYiwxMSw1Mil9ZnVuY3Rpb24gcGFja0Y2NCh2KXtyZXR1cm4gcGFja0lFRUU3NTQodiwxMSw1Mil9ZnVuY3Rpb24gdW5wYWNrRjMyKGIpe3JldHVybiB1bnBhY2tJRUVFNzU0KGIsOCwyMyl9ZnVuY3Rpb24gcGFja0YzMih2KXtyZXR1cm4gcGFja0lFRUU3NTQodiw4LDIzKX0oZnVuY3Rpb24oKXtmdW5jdGlvbiBBcnJheUJ1ZmZlcihsZW5ndGgpe2xlbmd0aD1Ub0ludDMyKGxlbmd0aCk7aWYobGVuZ3RoPDApdGhyb3cgUmFuZ2VFcnJvcigiQXJyYXlCdWZmZXIgc2l6ZSBpcyBub3QgYSBzbWFsbCBlbm91Z2ggcG9zaXRpdmUgaW50ZWdlci4iKTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnl0ZUxlbmd0aCIse3ZhbHVlOmxlbmd0aH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJfYnl0ZXMiLHt2YWx1ZTpBcnJheShsZW5ndGgpfSk7Zm9yKHZhciBpPTA7aTxsZW5ndGg7aSs9MSl0aGlzLl9ieXRlc1tpXT0wfWdsb2JhbC5BcnJheUJ1ZmZlcj1nbG9iYWwuQXJyYXlCdWZmZXJ8fEFycmF5QnVmZmVyO2Z1bmN0aW9uICRUeXBlZEFycmF5JCgpe2lmKCFhcmd1bWVudHMubGVuZ3RofHx0eXBlb2YgYXJndW1lbnRzWzBdIT09Im9iamVjdCIpe3JldHVybiBmdW5jdGlvbihsZW5ndGgpe2xlbmd0aD1Ub0ludDMyKGxlbmd0aCk7aWYobGVuZ3RoPDApdGhyb3cgUmFuZ2VFcnJvcigibGVuZ3RoIGlzIG5vdCBhIHNtYWxsIGVub3VnaCBwb3NpdGl2ZSBpbnRlZ2VyLiIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsZW5ndGgiLHt2YWx1ZTpsZW5ndGh9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnl0ZUxlbmd0aCIse3ZhbHVlOmxlbmd0aCp0aGlzLkJZVEVTX1BFUl9FTEVNRU5UfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImJ1ZmZlciIse3ZhbHVlOm5ldyBBcnJheUJ1ZmZlcih0aGlzLmJ5dGVMZW5ndGgpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImJ5dGVPZmZzZXQiLHt2YWx1ZTowfSl9LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1pZihhcmd1bWVudHMubGVuZ3RoPj0xJiZUeXBlKGFyZ3VtZW50c1swXSk9PT0ib2JqZWN0IiYmYXJndW1lbnRzWzBdaW5zdGFuY2VvZiAkVHlwZWRBcnJheSQpe3JldHVybiBmdW5jdGlvbih0eXBlZEFycmF5KXtpZih0aGlzLmNvbnN0cnVjdG9yIT09dHlwZWRBcnJheS5jb25zdHJ1Y3Rvcil0aHJvdyBUeXBlRXJyb3IoKTt2YXIgYnl0ZUxlbmd0aD10eXBlZEFycmF5Lmxlbmd0aCp0aGlzLkJZVEVTX1BFUl9FTEVNRU5UO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJidWZmZXIiLHt2YWx1ZTpuZXcgQXJyYXlCdWZmZXIoYnl0ZUxlbmd0aCl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnl0ZUxlbmd0aCIse3ZhbHVlOmJ5dGVMZW5ndGh9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnl0ZU9mZnNldCIse3ZhbHVlOjB9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibGVuZ3RoIix7dmFsdWU6dHlwZWRBcnJheS5sZW5ndGh9KTtmb3IodmFyIGk9MDtpPHRoaXMubGVuZ3RoO2krPTEpdGhpcy5fc2V0dGVyKGksdHlwZWRBcnJheS5fZ2V0dGVyKGkpKX0uYXBwbHkodGhpcyxhcmd1bWVudHMpfWlmKGFyZ3VtZW50cy5sZW5ndGg+PTEmJlR5cGUoYXJndW1lbnRzWzBdKT09PSJvYmplY3QiJiYhKGFyZ3VtZW50c1swXWluc3RhbmNlb2YgJFR5cGVkQXJyYXkkKSYmIShhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxDbGFzcyhhcmd1bWVudHNbMF0pPT09IkFycmF5QnVmZmVyIikpe3JldHVybiBmdW5jdGlvbihhcnJheSl7dmFyIGJ5dGVMZW5ndGg9YXJyYXkubGVuZ3RoKnRoaXMuQllURVNfUEVSX0VMRU1FTlQ7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImJ1ZmZlciIse3ZhbHVlOm5ldyBBcnJheUJ1ZmZlcihieXRlTGVuZ3RoKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJieXRlTGVuZ3RoIix7dmFsdWU6Ynl0ZUxlbmd0aH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJieXRlT2Zmc2V0Iix7dmFsdWU6MH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJsZW5ndGgiLHt2YWx1ZTphcnJheS5sZW5ndGh9KTtmb3IodmFyIGk9MDtpPHRoaXMubGVuZ3RoO2krPTEpe3ZhciBzPWFycmF5W2ldO3RoaXMuX3NldHRlcihpLE51bWJlcihzKSl9fS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9aWYoYXJndW1lbnRzLmxlbmd0aD49MSYmVHlwZShhcmd1bWVudHNbMF0pPT09Im9iamVjdCImJihhcmd1bWVudHNbMF1pbnN0YW5jZW9mIEFycmF5QnVmZmVyfHxDbGFzcyhhcmd1bWVudHNbMF0pPT09IkFycmF5QnVmZmVyIikpe3JldHVybiBmdW5jdGlvbihidWZmZXIsYnl0ZU9mZnNldCxsZW5ndGgpe2J5dGVPZmZzZXQ9VG9VaW50MzIoYnl0ZU9mZnNldCk7aWYoYnl0ZU9mZnNldD5idWZmZXIuYnl0ZUxlbmd0aCl0aHJvdyBSYW5nZUVycm9yKCJieXRlT2Zmc2V0IG91dCBvZiByYW5nZSIpO2lmKGJ5dGVPZmZzZXQldGhpcy5CWVRFU19QRVJfRUxFTUVOVCl0aHJvdyBSYW5nZUVycm9yKCJidWZmZXIgbGVuZ3RoIG1pbnVzIHRoZSBieXRlT2Zmc2V0IGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBlbGVtZW50IHNpemUuIik7aWYobGVuZ3RoPT09dW5kZWZpbmVkKXt2YXIgYnl0ZUxlbmd0aD1idWZmZXIuYnl0ZUxlbmd0aC1ieXRlT2Zmc2V0O2lmKGJ5dGVMZW5ndGgldGhpcy5CWVRFU19QRVJfRUxFTUVOVCl0aHJvdyBSYW5nZUVycm9yKCJsZW5ndGggb2YgYnVmZmVyIG1pbnVzIGJ5dGVPZmZzZXQgbm90IGEgbXVsdGlwbGUgb2YgdGhlIGVsZW1lbnQgc2l6ZSIpO2xlbmd0aD1ieXRlTGVuZ3RoL3RoaXMuQllURVNfUEVSX0VMRU1FTlR9ZWxzZXtsZW5ndGg9VG9VaW50MzIobGVuZ3RoKTtieXRlTGVuZ3RoPWxlbmd0aCp0aGlzLkJZVEVTX1BFUl9FTEVNRU5UfWlmKGJ5dGVPZmZzZXQrYnl0ZUxlbmd0aD5idWZmZXIuYnl0ZUxlbmd0aCl0aHJvdyBSYW5nZUVycm9yKCJieXRlT2Zmc2V0IGFuZCBsZW5ndGggcmVmZXJlbmNlIGFuIGFyZWEgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJidWZmZXIiLHt2YWx1ZTpidWZmZXJ9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnl0ZUxlbmd0aCIse3ZhbHVlOmJ5dGVMZW5ndGh9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiYnl0ZU9mZnNldCIse3ZhbHVlOmJ5dGVPZmZzZXR9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywibGVuZ3RoIix7dmFsdWU6bGVuZ3RofSl9LmFwcGx5KHRoaXMsYXJndW1lbnRzKX10aHJvdyBUeXBlRXJyb3IoKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoJFR5cGVkQXJyYXkkLCJmcm9tIix7dmFsdWU6ZnVuY3Rpb24oaXRlcmFibGUpe3JldHVybiBuZXcgdGhpcyhpdGVyYWJsZSl9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KCRUeXBlZEFycmF5JCwib2YiLHt2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcyhhcmd1bWVudHMpfX0pO3ZhciAkVHlwZWRBcnJheVByb3RvdHlwZSQ9e307JFR5cGVkQXJyYXkkLnByb3RvdHlwZT0kVHlwZWRBcnJheVByb3RvdHlwZSQ7T2JqZWN0LmRlZmluZVByb3BlcnR5KCRUeXBlZEFycmF5JC5wcm90b3R5cGUsIl9nZXR0ZXIiLHt2YWx1ZTpmdW5jdGlvbihpbmRleCl7aWYoYXJndW1lbnRzLmxlbmd0aDwxKXRocm93IFN5bnRheEVycm9yKCJOb3QgZW5vdWdoIGFyZ3VtZW50cyIpO2luZGV4PVRvVWludDMyKGluZGV4KTtpZihpbmRleD49dGhpcy5sZW5ndGgpcmV0dXJuIHVuZGVmaW5lZDt2YXIgYnl0ZXM9W10saSxvO2ZvcihpPTAsbz10aGlzLmJ5dGVPZmZzZXQraW5kZXgqdGhpcy5CWVRFU19QRVJfRUxFTUVOVDtpPHRoaXMuQllURVNfUEVSX0VMRU1FTlQ7aSs9MSxvKz0xKXtieXRlcy5wdXNoKHRoaXMuYnVmZmVyLl9ieXRlc1tvXSl9cmV0dXJuIHRoaXMuX3VucGFjayhieXRlcyl9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KCRUeXBlZEFycmF5JC5wcm90b3R5cGUsImdldCIse3ZhbHVlOiRUeXBlZEFycmF5JC5wcm90b3R5cGUuX2dldHRlcn0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgkVHlwZWRBcnJheSQucHJvdG90eXBlLCJfc2V0dGVyIix7dmFsdWU6ZnVuY3Rpb24oaW5kZXgsdmFsdWUpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil0aHJvdyBTeW50YXhFcnJvcigiTm90IGVub3VnaCBhcmd1bWVudHMiKTtpbmRleD1Ub1VpbnQzMihpbmRleCk7aWYoaW5kZXg+PXRoaXMubGVuZ3RoKXJldHVybjt2YXIgYnl0ZXM9dGhpcy5fcGFjayh2YWx1ZSksaSxvO2ZvcihpPTAsbz10aGlzLmJ5dGVPZmZzZXQraW5kZXgqdGhpcy5CWVRFU19QRVJfRUxFTUVOVDtpPHRoaXMuQllURVNfUEVSX0VMRU1FTlQ7aSs9MSxvKz0xKXt0aGlzLmJ1ZmZlci5fYnl0ZXNbb109Ynl0ZXNbaV19fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgkVHlwZWRBcnJheSQucHJvdG90eXBlLCJjb25zdHJ1Y3RvciIse3ZhbHVlOiRUeXBlZEFycmF5JH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgkVHlwZWRBcnJheSQucHJvdG90eXBlLCJjb3B5V2l0aGluIix7dmFsdWU6ZnVuY3Rpb24odGFyZ2V0LHN0YXJ0KXt2YXIgZW5kPWFyZ3VtZW50c1syXTt2YXIgbz1Ub09iamVjdCh0aGlzKTt2YXIgbGVuVmFsPW8ubGVuZ3RoO3ZhciBsZW49VG9VaW50MzIobGVuVmFsKTtsZW49bWF4KGxlbiwwKTt2YXIgcmVsYXRpdmVUYXJnZXQ9VG9JbnQzMih0YXJnZXQpO3ZhciB0bztpZihyZWxhdGl2ZVRhcmdldDwwKXRvPW1heChsZW4rcmVsYXRpdmVUYXJnZXQsMCk7ZWxzZSB0bz1taW4ocmVsYXRpdmVUYXJnZXQsbGVuKTt2YXIgcmVsYXRpdmVTdGFydD1Ub0ludDMyKHN0YXJ0KTt2YXIgZnJvbTtpZihyZWxhdGl2ZVN0YXJ0PDApZnJvbT1tYXgobGVuK3JlbGF0aXZlU3RhcnQsMCk7ZWxzZSBmcm9tPW1pbihyZWxhdGl2ZVN0YXJ0LGxlbik7dmFyIHJlbGF0aXZlRW5kO2lmKGVuZD09PXVuZGVmaW5lZClyZWxhdGl2ZUVuZD1sZW47ZWxzZSByZWxhdGl2ZUVuZD1Ub0ludDMyKGVuZCk7dmFyIGZpbmFsO2lmKHJlbGF0aXZlRW5kPDApZmluYWw9bWF4KGxlbityZWxhdGl2ZUVuZCwwKTtlbHNlIGZpbmFsPW1pbihyZWxhdGl2ZUVuZCxsZW4pO3ZhciBjb3VudD1taW4oZmluYWwtZnJvbSxsZW4tdG8pO3ZhciBkaXJlY3Rpb247aWYoZnJvbTx0byYmdG88ZnJvbStjb3VudCl7ZGlyZWN0aW9uPS0xO2Zyb209ZnJvbStjb3VudC0xO3RvPXRvK2NvdW50LTF9ZWxzZXtkaXJlY3Rpb249MX13aGlsZShjb3VudD4wKXtvLl9zZXR0ZXIodG8sby5fZ2V0dGVyKGZyb20pKTtmcm9tPWZyb20rZGlyZWN0aW9uO3RvPXRvK2RpcmVjdGlvbjtjb3VudD1jb3VudC0xfXJldHVybiBvfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgkVHlwZWRBcnJheSQucHJvdG90eXBlLCJldmVyeSIse3ZhbHVlOmZ1bmN0aW9uKGNhbGxiYWNrZm4pe2lmKHRoaXM9PT11bmRlZmluZWR8fHRoaXM9PT1udWxsKXRocm93IFR5cGVFcnJvcigpO3ZhciB0PU9iamVjdCh0aGlzKTt2YXIgbGVuPVRvVWludDMyKHQubGVuZ3RoKTtpZighSXNDYWxsYWJsZShjYWxsYmFja2ZuKSl0aHJvdyBUeXBlRXJyb3IoKTt2YXIgdGhpc0FyZz1hcmd1bWVudHNbMV07Zm9yKHZhciBpPTA7aTxsZW47aSsrKXtpZighY2FsbGJhY2tmbi5jYWxsKHRoaXNBcmcsdC5fZ2V0dGVyKGkpLGksdCkpcmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgkVHlwZWRBcnJheSQucHJvdG90eXBlLCJmaWxsIix7dmFsdWU6ZnVuY3Rpb24odmFsdWUpe3ZhciBzdGFydD1hcmd1bWVudHNbMV0sZW5kPWFyZ3VtZW50c1syXTt2YXIgbz1Ub09iamVjdCh0aGlzKTt2YXIgbGVuVmFsPW8ubGVuZ3RoO3ZhciBsZW49VG9VaW50MzIobGVuVmFsKTtsZW49bWF4KGxlbiwwKTt2YXIgcmVsYXRpdmVTdGFydD1Ub0ludDMyKHN0YXJ0KTt2YXIgaztpZihyZWxhdGl2ZVN0YXJ0PDApaz1tYXgobGVuK3JlbGF0aXZlU3RhcnQsMCk7ZWxzZSBrPW1pbihyZWxhdGl2ZVN0YXJ0LGxlbik7dmFyIHJlbGF0aXZlRW5kO2lmKGVuZD09PXVuZGVmaW5lZClyZWxhdGl2ZUVuZD1sZW47ZWxzZSByZWxhdGl2ZUVuZD1Ub0ludDMyKGVuZCk7dmFyIGZpbmFsO2lmKHJlbGF0aXZlRW5kPDApZmluYWw9bWF4KGxlbityZWxhdGl2ZUVuZCwwKTtlbHNlIGZpbmFsPW1pbihyZWxhdGl2ZUVuZCxsZW4pO3doaWxlKGs8ZmluYWwpe28uX3NldHRlcihrLHZhbHVlKTtrKz0xfXJldHVybiBvfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgkVHlwZWRBcnJheSQucHJvdG90eXBlLCJmaWx0ZXIiLHt2YWx1ZTpmdW5jdGlvbihjYWxsYmFja2ZuKXtpZih0aGlzPT09dW5kZWZpbmVkfHx0aGlzPT09bnVsbCl0aHJvdyBUeXBlRXJyb3IoKTt2YXIgdD1PYmplY3QodGhpcyk7dmFyIGxlbj1Ub1VpbnQzMih0Lmxlbmd0aCk7aWYoIUlzQ2FsbGFibGUoY2FsbGJhY2tmbikpdGhyb3cgVHlwZUVycm9yKCk7dmFyIHJlcz1bXTt2YXIgdGhpc3A9YXJndW1lbnRzWzFdO2Zvcih2YXIgaT0wO2k8bGVuO2krKyl7dmFyIHZhbD10Ll9nZXR0ZXIoaSk7aWYoY2FsbGJhY2tmbi5jYWxsKHRoaXNwLHZhbCxpLHQpKXJlcy5wdXNoKHZhbCl9cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHJlcyl9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KCRUeXBlZEFycmF5JC5wcm90b3R5cGUsImZpbmQiLHt2YWx1ZTpmdW5jdGlvbihwcmVkaWNhdGUpe3ZhciBvPVRvT2JqZWN0KHRoaXMpO3ZhciBsZW5WYWx1ZT1vLmxlbmd0aDt2YXIgbGVuPVRvVWludDMyKGxlblZhbHVlKTtpZighSXNDYWxsYWJsZShwcmVkaWNhdGUpKXRocm93IFR5cGVFcnJvcigpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dW5kZWZpbmVkO3ZhciBrPTA7d2hpbGUoazxsZW4pe3ZhciBrVmFsdWU9by5fZ2V0dGVyKGspO3ZhciB0ZXN0UmVzdWx0PXByZWRpY2F0ZS5jYWxsKHQsa1ZhbHVlLGssbyk7aWYoQm9vbGVhbih0ZXN0UmVzdWx0KSlyZXR1cm4ga1ZhbHVlOysra31yZXR1cm4gdW5kZWZpbmVkfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgkVHlwZWRBcnJheSQucHJvdG90eXBlLCJmaW5kSW5kZXgiLHt2YWx1ZTpmdW5jdGlvbihwcmVkaWNhdGUpe3ZhciBvPVRvT2JqZWN0KHRoaXMpO3ZhciBsZW5WYWx1ZT1vLmxlbmd0aDt2YXIgbGVuPVRvVWludDMyKGxlblZhbHVlKTtpZighSXNDYWxsYWJsZShwcmVkaWNhdGUpKXRocm93IFR5cGVFcnJvcigpO3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MT9hcmd1bWVudHNbMV06dW5kZWZpbmVkO3ZhciBrPTA7d2hpbGUoazxsZW4pe3ZhciBrVmFsdWU9by5fZ2V0dGVyKGspO3ZhciB0ZXN0UmVzdWx0PXByZWRpY2F0ZS5jYWxsKHQsa1ZhbHVlLGssbyk7aWYoQm9vbGVhbih0ZXN0UmVzdWx0KSlyZXR1cm4gazsrK2t9cmV0dXJuLTF9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KCRUeXBlZEFycmF5JC5wcm90b3R5cGUsImZvckVhY2giLHt2YWx1ZTpmdW5jdGlvbihjYWxsYmFja2ZuKXtpZih0aGlzPT09dW5kZWZpbmVkfHx0aGlzPT09bnVsbCl0aHJvdyBUeXBlRXJyb3IoKTt2YXIgdD1PYmplY3QodGhpcyk7dmFyIGxlbj1Ub1VpbnQzMih0Lmxlbmd0aCk7aWYoIUlzQ2FsbGFibGUoY2FsbGJhY2tmbikpdGhyb3cgVHlwZUVycm9yKCk7dmFyIHRoaXNwPWFyZ3VtZW50c1sxXTtmb3IodmFyIGk9MDtpPGxlbjtpKyspY2FsbGJhY2tmbi5jYWxsKHRoaXNwLHQuX2dldHRlcihpKSxpLHQpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgkVHlwZWRBcnJheSQucHJvdG90eXBlLCJpbmRleE9mIix7dmFsdWU6ZnVuY3Rpb24oc2VhcmNoRWxlbWVudCl7aWYodGhpcz09PXVuZGVmaW5lZHx8dGhpcz09PW51bGwpdGhyb3cgVHlwZUVycm9yKCk7dmFyIHQ9T2JqZWN0KHRoaXMpO3ZhciBsZW49VG9VaW50MzIodC5sZW5ndGgpO2lmKGxlbj09PTApcmV0dXJuLTE7dmFyIG49MDtpZihhcmd1bWVudHMubGVuZ3RoPjApe249TnVtYmVyKGFyZ3VtZW50c1sxXSk7aWYobiE9PW4pe249MH1lbHNlIGlmKG4hPT0wJiZuIT09MS8wJiZuIT09LSgxLzApKXtuPShuPjB8fC0xKSpmbG9vcihhYnMobikpfX1pZihuPj1sZW4pcmV0dXJuLTE7dmFyIGs9bj49MD9uOm1heChsZW4tYWJzKG4pLDApO2Zvcig7azxsZW47aysrKXtpZih0Ll9nZXR0ZXIoayk9PT1zZWFyY2hFbGVtZW50KXtyZXR1cm4ga319cmV0dXJuLTF9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KCRUeXBlZEFycmF5JC5wcm90b3R5cGUsImpvaW4iLHt2YWx1ZTpmdW5jdGlvbihzZXBhcmF0b3Ipe2lmKHRoaXM9PT11bmRlZmluZWR8fHRoaXM9PT1udWxsKXRocm93IFR5cGVFcnJvcigpO3ZhciB0PU9iamVjdCh0aGlzKTt2YXIgbGVuPVRvVWludDMyKHQubGVuZ3RoKTt2YXIgdG1wPUFycmF5KGxlbik7Zm9yKHZhciBpPTA7aTxsZW47KytpKXRtcFtpXT10Ll9nZXR0ZXIoaSk7cmV0dXJuIHRtcC5qb2luKHNlcGFyYXRvcj09PXVuZGVmaW5lZD8iLCI6c2VwYXJhdG9yKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoJFR5cGVkQXJyYXkkLnByb3RvdHlwZSwibGFzdEluZGV4T2YiLHt2YWx1ZTpmdW5jdGlvbihzZWFyY2hFbGVtZW50KXtpZih0aGlzPT09dW5kZWZpbmVkfHx0aGlzPT09bnVsbCl0aHJvdyBUeXBlRXJyb3IoKTt2YXIgdD1PYmplY3QodGhpcyk7dmFyIGxlbj1Ub1VpbnQzMih0Lmxlbmd0aCk7aWYobGVuPT09MClyZXR1cm4tMTt2YXIgbj1sZW47aWYoYXJndW1lbnRzLmxlbmd0aD4xKXtuPU51bWJlcihhcmd1bWVudHNbMV0pO2lmKG4hPT1uKXtuPTB9ZWxzZSBpZihuIT09MCYmbiE9PTEvMCYmbiE9PS0oMS8wKSl7bj0obj4wfHwtMSkqZmxvb3IoYWJzKG4pKX19dmFyIGs9bj49MD9taW4obixsZW4tMSk6bGVuLWFicyhuKTtmb3IoO2s+PTA7ay0tKXtpZih0Ll9nZXR0ZXIoayk9PT1zZWFyY2hFbGVtZW50KXJldHVybiBrfXJldHVybi0xfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgkVHlwZWRBcnJheSQucHJvdG90eXBlLCJtYXAiLHt2YWx1ZTpmdW5jdGlvbihjYWxsYmFja2ZuKXtpZih0aGlzPT09dW5kZWZpbmVkfHx0aGlzPT09bnVsbCl0aHJvdyBUeXBlRXJyb3IoKTt2YXIgdD1PYmplY3QodGhpcyk7dmFyIGxlbj1Ub1VpbnQzMih0Lmxlbmd0aCk7aWYoIUlzQ2FsbGFibGUoY2FsbGJhY2tmbikpdGhyb3cgVHlwZUVycm9yKCk7dmFyIHJlcz1bXTtyZXMubGVuZ3RoPWxlbjt2YXIgdGhpc3A9YXJndW1lbnRzWzFdO2Zvcih2YXIgaT0wO2k8bGVuO2krKylyZXNbaV09Y2FsbGJhY2tmbi5jYWxsKHRoaXNwLHQuX2dldHRlcihpKSxpLHQpO3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcihyZXMpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgkVHlwZWRBcnJheSQucHJvdG90eXBlLCJyZWR1Y2UiLHt2YWx1ZTpmdW5jdGlvbihjYWxsYmFja2ZuKXtpZih0aGlzPT09dW5kZWZpbmVkfHx0aGlzPT09bnVsbCl0aHJvdyBUeXBlRXJyb3IoKTt2YXIgdD1PYmplY3QodGhpcyk7dmFyIGxlbj1Ub1VpbnQzMih0Lmxlbmd0aCk7aWYoIUlzQ2FsbGFibGUoY2FsbGJhY2tmbikpdGhyb3cgVHlwZUVycm9yKCk7aWYobGVuPT09MCYmYXJndW1lbnRzLmxlbmd0aD09PTEpdGhyb3cgVHlwZUVycm9yKCk7dmFyIGs9MDt2YXIgYWNjdW11bGF0b3I7aWYoYXJndW1lbnRzLmxlbmd0aD49Mil7YWNjdW11bGF0b3I9YXJndW1lbnRzWzFdfWVsc2V7YWNjdW11bGF0b3I9dC5fZ2V0dGVyKGsrKyl9d2hpbGUoazxsZW4pe2FjY3VtdWxhdG9yPWNhbGxiYWNrZm4uY2FsbCh1bmRlZmluZWQsYWNjdW11bGF0b3IsdC5fZ2V0dGVyKGspLGssdCk7aysrfXJldHVybiBhY2N1bXVsYXRvcn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoJFR5cGVkQXJyYXkkLnByb3RvdHlwZSwicmVkdWNlUmlnaHQiLHt2YWx1ZTpmdW5jdGlvbihjYWxsYmFja2ZuKXtpZih0aGlzPT09dW5kZWZpbmVkfHx0aGlzPT09bnVsbCl0aHJvdyBUeXBlRXJyb3IoKTt2YXIgdD1PYmplY3QodGhpcyk7dmFyIGxlbj1Ub1VpbnQzMih0Lmxlbmd0aCk7aWYoIUlzQ2FsbGFibGUoY2FsbGJhY2tmbikpdGhyb3cgVHlwZUVycm9yKCk7aWYobGVuPT09MCYmYXJndW1lbnRzLmxlbmd0aD09PTEpdGhyb3cgVHlwZUVycm9yKCk7dmFyIGs9bGVuLTE7dmFyIGFjY3VtdWxhdG9yO2lmKGFyZ3VtZW50cy5sZW5ndGg+PTIpe2FjY3VtdWxhdG9yPWFyZ3VtZW50c1sxXX1lbHNle2FjY3VtdWxhdG9yPXQuX2dldHRlcihrLS0pfXdoaWxlKGs+PTApe2FjY3VtdWxhdG9yPWNhbGxiYWNrZm4uY2FsbCh1bmRlZmluZWQsYWNjdW11bGF0b3IsdC5fZ2V0dGVyKGspLGssdCk7ay0tfXJldHVybiBhY2N1bXVsYXRvcn19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoJFR5cGVkQXJyYXkkLnByb3RvdHlwZSwicmV2ZXJzZSIse3ZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcz09PXVuZGVmaW5lZHx8dGhpcz09PW51bGwpdGhyb3cgVHlwZUVycm9yKCk7dmFyIHQ9T2JqZWN0KHRoaXMpO3ZhciBsZW49VG9VaW50MzIodC5sZW5ndGgpO3ZhciBoYWxmPWZsb29yKGxlbi8yKTtmb3IodmFyIGk9MCxqPWxlbi0xO2k8aGFsZjsrK2ksLS1qKXt2YXIgdG1wPXQuX2dldHRlcihpKTt0Ll9zZXR0ZXIoaSx0Ll9nZXR0ZXIoaikpO3QuX3NldHRlcihqLHRtcCl9cmV0dXJuIHR9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KCRUeXBlZEFycmF5JC5wcm90b3R5cGUsInNldCIse3ZhbHVlOmZ1bmN0aW9uKGluZGV4LHZhbHVlKXtpZihhcmd1bWVudHMubGVuZ3RoPDEpdGhyb3cgU3ludGF4RXJyb3IoIk5vdCBlbm91Z2ggYXJndW1lbnRzIik7dmFyIGFycmF5LHNlcXVlbmNlLG9mZnNldCxsZW4saSxzLGQsYnl0ZU9mZnNldCxieXRlTGVuZ3RoLHRtcDtpZih0eXBlb2YgYXJndW1lbnRzWzBdPT09Im9iamVjdCImJmFyZ3VtZW50c1swXS5jb25zdHJ1Y3Rvcj09PXRoaXMuY29uc3RydWN0b3Ipe2FycmF5PWFyZ3VtZW50c1swXTtvZmZzZXQ9VG9VaW50MzIoYXJndW1lbnRzWzFdKTtpZihvZmZzZXQrYXJyYXkubGVuZ3RoPnRoaXMubGVuZ3RoKXt0aHJvdyBSYW5nZUVycm9yKCJPZmZzZXQgcGx1cyBsZW5ndGggb2YgYXJyYXkgaXMgb3V0IG9mIHJhbmdlIil9Ynl0ZU9mZnNldD10aGlzLmJ5dGVPZmZzZXQrb2Zmc2V0KnRoaXMuQllURVNfUEVSX0VMRU1FTlQ7Ynl0ZUxlbmd0aD1hcnJheS5sZW5ndGgqdGhpcy5CWVRFU19QRVJfRUxFTUVOVDtpZihhcnJheS5idWZmZXI9PT10aGlzLmJ1ZmZlcil7dG1wPVtdO2ZvcihpPTAscz1hcnJheS5ieXRlT2Zmc2V0O2k8Ynl0ZUxlbmd0aDtpKz0xLHMrPTEpe3RtcFtpXT1hcnJheS5idWZmZXIuX2J5dGVzW3NdfWZvcihpPTAsZD1ieXRlT2Zmc2V0O2k8Ynl0ZUxlbmd0aDtpKz0xLGQrPTEpe3RoaXMuYnVmZmVyLl9ieXRlc1tkXT10bXBbaV19fWVsc2V7Zm9yKGk9MCxzPWFycmF5LmJ5dGVPZmZzZXQsZD1ieXRlT2Zmc2V0O2k8Ynl0ZUxlbmd0aDtpKz0xLHMrPTEsZCs9MSl7dGhpcy5idWZmZXIuX2J5dGVzW2RdPWFycmF5LmJ1ZmZlci5fYnl0ZXNbc119fX1lbHNlIGlmKHR5cGVvZiBhcmd1bWVudHNbMF09PT0ib2JqZWN0IiYmdHlwZW9mIGFyZ3VtZW50c1swXS5sZW5ndGghPT0idW5kZWZpbmVkIil7c2VxdWVuY2U9YXJndW1lbnRzWzBdO2xlbj1Ub1VpbnQzMihzZXF1ZW5jZS5sZW5ndGgpO29mZnNldD1Ub1VpbnQzMihhcmd1bWVudHNbMV0pO2lmKG9mZnNldCtsZW4+dGhpcy5sZW5ndGgpe3Rocm93IFJhbmdlRXJyb3IoIk9mZnNldCBwbHVzIGxlbmd0aCBvZiBhcnJheSBpcyBvdXQgb2YgcmFuZ2UiKX1mb3IoaT0wO2k8bGVuO2krPTEpe3M9c2VxdWVuY2VbaV07dGhpcy5fc2V0dGVyKG9mZnNldCtpLE51bWJlcihzKSl9fWVsc2V7dGhyb3cgVHlwZUVycm9yKCJVbmV4cGVjdGVkIGFyZ3VtZW50IHR5cGUocykiKX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KCRUeXBlZEFycmF5JC5wcm90b3R5cGUsInNsaWNlIix7dmFsdWU6ZnVuY3Rpb24oc3RhcnQsZW5kKXt2YXIgbz1Ub09iamVjdCh0aGlzKTt2YXIgbGVuVmFsPW8ubGVuZ3RoO3ZhciBsZW49VG9VaW50MzIobGVuVmFsKTt2YXIgcmVsYXRpdmVTdGFydD1Ub0ludDMyKHN0YXJ0KTt2YXIgaz1yZWxhdGl2ZVN0YXJ0PDA/bWF4KGxlbityZWxhdGl2ZVN0YXJ0LDApOm1pbihyZWxhdGl2ZVN0YXJ0LGxlbik7dmFyIHJlbGF0aXZlRW5kPWVuZD09PXVuZGVmaW5lZD9sZW46VG9JbnQzMihlbmQpO3ZhciBmaW5hbD1yZWxhdGl2ZUVuZDwwP21heChsZW4rcmVsYXRpdmVFbmQsMCk6bWluKHJlbGF0aXZlRW5kLGxlbik7dmFyIGNvdW50PWZpbmFsLWs7dmFyIGM9by5jb25zdHJ1Y3Rvcjt2YXIgYT1uZXcgYyhjb3VudCk7dmFyIG49MDt3aGlsZShrPGZpbmFsKXt2YXIga1ZhbHVlPW8uX2dldHRlcihrKTthLl9zZXR0ZXIobixrVmFsdWUpOysrazsrK259cmV0dXJuIGF9fSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KCRUeXBlZEFycmF5JC5wcm90b3R5cGUsInNvbWUiLHt2YWx1ZTpmdW5jdGlvbihjYWxsYmFja2ZuKXtpZih0aGlzPT09dW5kZWZpbmVkfHx0aGlzPT09bnVsbCl0aHJvdyBUeXBlRXJyb3IoKTt2YXIgdD1PYmplY3QodGhpcyk7dmFyIGxlbj1Ub1VpbnQzMih0Lmxlbmd0aCk7aWYoIUlzQ2FsbGFibGUoY2FsbGJhY2tmbikpdGhyb3cgVHlwZUVycm9yKCk7dmFyIHRoaXNwPWFyZ3VtZW50c1sxXTtmb3IodmFyIGk9MDtpPGxlbjtpKyspe2lmKGNhbGxiYWNrZm4uY2FsbCh0aGlzcCx0Ll9nZXR0ZXIoaSksaSx0KSl7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoJFR5cGVkQXJyYXkkLnByb3RvdHlwZSwic29ydCIse3ZhbHVlOmZ1bmN0aW9uKGNvbXBhcmVmbil7aWYodGhpcz09PXVuZGVmaW5lZHx8dGhpcz09PW51bGwpdGhyb3cgVHlwZUVycm9yKCk7dmFyIHQ9T2JqZWN0KHRoaXMpO3ZhciBsZW49VG9VaW50MzIodC5sZW5ndGgpO3ZhciB0bXA9QXJyYXkobGVuKTtmb3IodmFyIGk9MDtpPGxlbjsrK2kpdG1wW2ldPXQuX2dldHRlcihpKTtpZihjb21wYXJlZm4pdG1wLnNvcnQoY29tcGFyZWZuKTtlbHNlIHRtcC5zb3J0KCk7Zm9yKGk9MDtpPGxlbjsrK2kpdC5fc2V0dGVyKGksdG1wW2ldKTtyZXR1cm4gdH19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoJFR5cGVkQXJyYXkkLnByb3RvdHlwZSwic3ViYXJyYXkiLHt2YWx1ZTpmdW5jdGlvbihzdGFydCxlbmQpe2Z1bmN0aW9uIGNsYW1wKHYsbWluLG1heCl7cmV0dXJuIHY8bWluP21pbjp2Pm1heD9tYXg6dn1zdGFydD1Ub0ludDMyKHN0YXJ0KTtlbmQ9VG9JbnQzMihlbmQpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MSl7c3RhcnQ9MH1pZihhcmd1bWVudHMubGVuZ3RoPDIpe2VuZD10aGlzLmxlbmd0aH1pZihzdGFydDwwKXtzdGFydD10aGlzLmxlbmd0aCtzdGFydH1pZihlbmQ8MCl7ZW5kPXRoaXMubGVuZ3RoK2VuZH1zdGFydD1jbGFtcChzdGFydCwwLHRoaXMubGVuZ3RoKTtlbmQ9Y2xhbXAoZW5kLDAsdGhpcy5sZW5ndGgpO3ZhciBsZW49ZW5kLXN0YXJ0O2lmKGxlbjwwKXtsZW49MH1yZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5idWZmZXIsdGhpcy5ieXRlT2Zmc2V0K3N0YXJ0KnRoaXMuQllURVNfUEVSX0VMRU1FTlQsbGVuKX19KTtmdW5jdGlvbiBtYWtlVHlwZWRBcnJheShlbGVtZW50U2l6ZSxwYWNrLHVucGFjayl7dmFyIFR5cGVkQXJyYXk9ZnVuY3Rpb24oKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiY29uc3RydWN0b3IiLHt2YWx1ZTpUeXBlZEFycmF5fSk7JFR5cGVkQXJyYXkkLmFwcGx5KHRoaXMsYXJndW1lbnRzKTttYWtlQXJyYXlBY2Nlc3NvcnModGhpcyl9O2lmKCJfX3Byb3RvX18iaW4gVHlwZWRBcnJheSl7VHlwZWRBcnJheS5fX3Byb3RvX189JFR5cGVkQXJyYXkkfWVsc2V7VHlwZWRBcnJheS5mcm9tPSRUeXBlZEFycmF5JC5mcm9tO1R5cGVkQXJyYXkub2Y9JFR5cGVkQXJyYXkkLm9mfVR5cGVkQXJyYXkuQllURVNfUEVSX0VMRU1FTlQ9ZWxlbWVudFNpemU7dmFyIFR5cGVkQXJyYXlQcm90b3R5cGU9ZnVuY3Rpb24oKXt9O1R5cGVkQXJyYXlQcm90b3R5cGUucHJvdG90eXBlPSRUeXBlZEFycmF5UHJvdG90eXBlJDtUeXBlZEFycmF5LnByb3RvdHlwZT1uZXcgVHlwZWRBcnJheVByb3RvdHlwZTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVHlwZWRBcnJheS5wcm90b3R5cGUsIkJZVEVTX1BFUl9FTEVNRU5UIix7dmFsdWU6ZWxlbWVudFNpemV9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVHlwZWRBcnJheS5wcm90b3R5cGUsIl9wYWNrIix7dmFsdWU6cGFja30pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShUeXBlZEFycmF5LnByb3RvdHlwZSwiX3VucGFjayIse3ZhbHVlOnVucGFja30pO3JldHVybiBUeXBlZEFycmF5fXZhciBJbnQ4QXJyYXk9bWFrZVR5cGVkQXJyYXkoMSxwYWNrSTgsdW5wYWNrSTgpO3ZhciBVaW50OEFycmF5PW1ha2VUeXBlZEFycmF5KDEscGFja1U4LHVucGFja1U4KTt2YXIgVWludDhDbGFtcGVkQXJyYXk9bWFrZVR5cGVkQXJyYXkoMSxwYWNrVThDbGFtcGVkLHVucGFja1U4KTt2YXIgSW50MTZBcnJheT1tYWtlVHlwZWRBcnJheSgyLHBhY2tJMTYsdW5wYWNrSTE2KTt2YXIgVWludDE2QXJyYXk9bWFrZVR5cGVkQXJyYXkoMixwYWNrVTE2LHVucGFja1UxNik7dmFyIEludDMyQXJyYXk9bWFrZVR5cGVkQXJyYXkoNCxwYWNrSTMyLHVucGFja0kzMik7dmFyIFVpbnQzMkFycmF5PW1ha2VUeXBlZEFycmF5KDQscGFja1UzMix1bnBhY2tVMzIpO3ZhciBGbG9hdDMyQXJyYXk9bWFrZVR5cGVkQXJyYXkoNCxwYWNrRjMyLHVucGFja0YzMik7dmFyIEZsb2F0NjRBcnJheT1tYWtlVHlwZWRBcnJheSg4LHBhY2tGNjQsdW5wYWNrRjY0KTtnbG9iYWwuSW50OEFycmF5PWdsb2JhbC5JbnQ4QXJyYXl8fEludDhBcnJheTtnbG9iYWwuVWludDhBcnJheT1nbG9iYWwuVWludDhBcnJheXx8VWludDhBcnJheTtnbG9iYWwuVWludDhDbGFtcGVkQXJyYXk9Z2xvYmFsLlVpbnQ4Q2xhbXBlZEFycmF5fHxVaW50OENsYW1wZWRBcnJheTtnbG9iYWwuSW50MTZBcnJheT1nbG9iYWwuSW50MTZBcnJheXx8SW50MTZBcnJheTtnbG9iYWwuVWludDE2QXJyYXk9Z2xvYmFsLlVpbnQxNkFycmF5fHxVaW50MTZBcnJheTtnbG9iYWwuSW50MzJBcnJheT1nbG9iYWwuSW50MzJBcnJheXx8SW50MzJBcnJheTtnbG9iYWwuVWludDMyQXJyYXk9Z2xvYmFsLlVpbnQzMkFycmF5fHxVaW50MzJBcnJheTtnbG9iYWwuRmxvYXQzMkFycmF5PWdsb2JhbC5GbG9hdDMyQXJyYXl8fEZsb2F0MzJBcnJheTtnbG9iYWwuRmxvYXQ2NEFycmF5PWdsb2JhbC5GbG9hdDY0QXJyYXl8fEZsb2F0NjRBcnJheX0pKCk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihhcnJheSxpbmRleCl7cmV0dXJuIElzQ2FsbGFibGUoYXJyYXkuZ2V0KT9hcnJheS5nZXQoaW5kZXgpOmFycmF5W2luZGV4XX12YXIgSVNfQklHX0VORElBTj1mdW5jdGlvbigpe3ZhciB1MTZhcnJheT1uZXcgVWludDE2QXJyYXkoWzQ2NjBdKSx1OGFycmF5PW5ldyBVaW50OEFycmF5KHUxNmFycmF5LmJ1ZmZlcik7cmV0dXJuIHIodThhcnJheSwwKT09PTE4fSgpO2Z1bmN0aW9uIERhdGFWaWV3KGJ1ZmZlcixieXRlT2Zmc2V0LGJ5dGVMZW5ndGgpe2lmKCEoYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXJ8fENsYXNzKGJ1ZmZlcik9PT0iQXJyYXlCdWZmZXIiKSl0aHJvdyBUeXBlRXJyb3IoKTtieXRlT2Zmc2V0PVRvVWludDMyKGJ5dGVPZmZzZXQpO2lmKGJ5dGVPZmZzZXQ+YnVmZmVyLmJ5dGVMZW5ndGgpdGhyb3cgUmFuZ2VFcnJvcigiYnl0ZU9mZnNldCBvdXQgb2YgcmFuZ2UiKTtpZihieXRlTGVuZ3RoPT09dW5kZWZpbmVkKWJ5dGVMZW5ndGg9YnVmZmVyLmJ5dGVMZW5ndGgtYnl0ZU9mZnNldDtlbHNlIGJ5dGVMZW5ndGg9VG9VaW50MzIoYnl0ZUxlbmd0aCk7aWYoYnl0ZU9mZnNldCtieXRlTGVuZ3RoPmJ1ZmZlci5ieXRlTGVuZ3RoKXRocm93IFJhbmdlRXJyb3IoImJ5dGVPZmZzZXQgYW5kIGxlbmd0aCByZWZlcmVuY2UgYW4gYXJlYSBiZXlvbmQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIik7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImJ1ZmZlciIse3ZhbHVlOmJ1ZmZlcn0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJieXRlTGVuZ3RoIix7dmFsdWU6Ynl0ZUxlbmd0aH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJieXRlT2Zmc2V0Iix7dmFsdWU6Ynl0ZU9mZnNldH0pfWZ1bmN0aW9uIG1ha2VHZXR0ZXIoYXJyYXlUeXBlKXtyZXR1cm4gZnVuY3Rpb24gR2V0Vmlld1ZhbHVlKGJ5dGVPZmZzZXQsbGl0dGxlRW5kaWFuKXtieXRlT2Zmc2V0PVRvVWludDMyKGJ5dGVPZmZzZXQpO2lmKGJ5dGVPZmZzZXQrYXJyYXlUeXBlLkJZVEVTX1BFUl9FTEVNRU5UPnRoaXMuYnl0ZUxlbmd0aCl0aHJvdyBSYW5nZUVycm9yKCJBcnJheSBpbmRleCBvdXQgb2YgcmFuZ2UiKTtieXRlT2Zmc2V0Kz10aGlzLmJ5dGVPZmZzZXQ7dmFyIHVpbnQ4QXJyYXk9bmV3IFVpbnQ4QXJyYXkodGhpcy5idWZmZXIsYnl0ZU9mZnNldCxhcnJheVR5cGUuQllURVNfUEVSX0VMRU1FTlQpLGJ5dGVzPVtdO2Zvcih2YXIgaT0wO2k8YXJyYXlUeXBlLkJZVEVTX1BFUl9FTEVNRU5UO2krPTEpYnl0ZXMucHVzaChyKHVpbnQ4QXJyYXksaSkpO2lmKEJvb2xlYW4obGl0dGxlRW5kaWFuKT09PUJvb2xlYW4oSVNfQklHX0VORElBTikpYnl0ZXMucmV2ZXJzZSgpO3JldHVybiByKG5ldyBhcnJheVR5cGUobmV3IFVpbnQ4QXJyYXkoYnl0ZXMpLmJ1ZmZlciksMCl9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShEYXRhVmlldy5wcm90b3R5cGUsImdldFVpbnQ4Iix7dmFsdWU6bWFrZUdldHRlcihVaW50OEFycmF5KX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShEYXRhVmlldy5wcm90b3R5cGUsImdldEludDgiLHt2YWx1ZTptYWtlR2V0dGVyKEludDhBcnJheSl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRGF0YVZpZXcucHJvdG90eXBlLCJnZXRVaW50MTYiLHt2YWx1ZTptYWtlR2V0dGVyKFVpbnQxNkFycmF5KX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShEYXRhVmlldy5wcm90b3R5cGUsImdldEludDE2Iix7dmFsdWU6bWFrZUdldHRlcihJbnQxNkFycmF5KX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShEYXRhVmlldy5wcm90b3R5cGUsImdldFVpbnQzMiIse3ZhbHVlOm1ha2VHZXR0ZXIoVWludDMyQXJyYXkpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KERhdGFWaWV3LnByb3RvdHlwZSwiZ2V0SW50MzIiLHt2YWx1ZTptYWtlR2V0dGVyKEludDMyQXJyYXkpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KERhdGFWaWV3LnByb3RvdHlwZSwiZ2V0RmxvYXQzMiIse3ZhbHVlOm1ha2VHZXR0ZXIoRmxvYXQzMkFycmF5KX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShEYXRhVmlldy5wcm90b3R5cGUsImdldEZsb2F0NjQiLHt2YWx1ZTptYWtlR2V0dGVyKEZsb2F0NjRBcnJheSl9KTtmdW5jdGlvbiBtYWtlU2V0dGVyKGFycmF5VHlwZSl7cmV0dXJuIGZ1bmN0aW9uIFNldFZpZXdWYWx1ZShieXRlT2Zmc2V0LHZhbHVlLGxpdHRsZUVuZGlhbil7Ynl0ZU9mZnNldD1Ub1VpbnQzMihieXRlT2Zmc2V0KTtpZihieXRlT2Zmc2V0K2FycmF5VHlwZS5CWVRFU19QRVJfRUxFTUVOVD50aGlzLmJ5dGVMZW5ndGgpdGhyb3cgUmFuZ2VFcnJvcigiQXJyYXkgaW5kZXggb3V0IG9mIHJhbmdlIik7dmFyIHR5cGVBcnJheT1uZXcgYXJyYXlUeXBlKFt2YWx1ZV0pLGJ5dGVBcnJheT1uZXcgVWludDhBcnJheSh0eXBlQXJyYXkuYnVmZmVyKSxieXRlcz1bXSxpLGJ5dGVWaWV3O2ZvcihpPTA7aTxhcnJheVR5cGUuQllURVNfUEVSX0VMRU1FTlQ7aSs9MSlieXRlcy5wdXNoKHIoYnl0ZUFycmF5LGkpKTtpZihCb29sZWFuKGxpdHRsZUVuZGlhbik9PT1Cb29sZWFuKElTX0JJR19FTkRJQU4pKWJ5dGVzLnJldmVyc2UoKTtieXRlVmlldz1uZXcgVWludDhBcnJheSh0aGlzLmJ1ZmZlcixieXRlT2Zmc2V0LGFycmF5VHlwZS5CWVRFU19QRVJfRUxFTUVOVCk7Ynl0ZVZpZXcuc2V0KGJ5dGVzKX19T2JqZWN0LmRlZmluZVByb3BlcnR5KERhdGFWaWV3LnByb3RvdHlwZSwic2V0VWludDgiLHt2YWx1ZTptYWtlU2V0dGVyKFVpbnQ4QXJyYXkpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KERhdGFWaWV3LnByb3RvdHlwZSwic2V0SW50OCIse3ZhbHVlOm1ha2VTZXR0ZXIoSW50OEFycmF5KX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShEYXRhVmlldy5wcm90b3R5cGUsInNldFVpbnQxNiIse3ZhbHVlOm1ha2VTZXR0ZXIoVWludDE2QXJyYXkpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KERhdGFWaWV3LnByb3RvdHlwZSwic2V0SW50MTYiLHt2YWx1ZTptYWtlU2V0dGVyKEludDE2QXJyYXkpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KERhdGFWaWV3LnByb3RvdHlwZSwic2V0VWludDMyIix7dmFsdWU6bWFrZVNldHRlcihVaW50MzJBcnJheSl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRGF0YVZpZXcucHJvdG90eXBlLCJzZXRJbnQzMiIse3ZhbHVlOm1ha2VTZXR0ZXIoSW50MzJBcnJheSl9KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoRGF0YVZpZXcucHJvdG90eXBlLCJzZXRGbG9hdDMyIix7dmFsdWU6bWFrZVNldHRlcihGbG9hdDMyQXJyYXkpfSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KERhdGFWaWV3LnByb3RvdHlwZSwic2V0RmxvYXQ2NCIse3ZhbHVlOm1ha2VTZXR0ZXIoRmxvYXQ2NEFycmF5KX0pO2dsb2JhbC5EYXRhVmlldz1nbG9iYWwuRGF0YVZpZXd8fERhdGFWaWV3fSkoKX0pKHRoaXMpOw=="></script>
<script src="data:application/x-javascript;base64,LyohIGpRdWVyeSB2MS4xMS4zIHwgKGMpIDIwMDUsIDIwMTUgalF1ZXJ5IEZvdW5kYXRpb24sIEluYy4gfCBqcXVlcnkub3JnL2xpY2Vuc2UgKi8KIWZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBtb2R1bGUmJiJvYmplY3QiPT10eXBlb2YgbW9kdWxlLmV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9YS5kb2N1bWVudD9iKGEsITApOmZ1bmN0aW9uKGEpe2lmKCFhLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBiKGEpfTpiKGEpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihhLGIpe3ZhciBjPVtdLGQ9Yy5zbGljZSxlPWMuY29uY2F0LGY9Yy5wdXNoLGc9Yy5pbmRleE9mLGg9e30saT1oLnRvU3RyaW5nLGo9aC5oYXNPd25Qcm9wZXJ0eSxrPXt9LGw9IjEuMTEuMyIsbT1mdW5jdGlvbihhLGIpe3JldHVybiBuZXcgbS5mbi5pbml0KGEsYil9LG49L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nLG89L14tbXMtLyxwPS8tKFtcZGEtel0pL2dpLHE9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfTttLmZuPW0ucHJvdG90eXBlPXtqcXVlcnk6bCxjb25zdHJ1Y3RvcjptLHNlbGVjdG9yOiIiLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZC5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/MD5hP3RoaXNbYSt0aGlzLmxlbmd0aF06dGhpc1thXTpkLmNhbGwodGhpcyl9LHB1c2hTdGFjazpmdW5jdGlvbihhKXt2YXIgYj1tLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxhKTtyZXR1cm4gYi5wcmV2T2JqZWN0PXRoaXMsYi5jb250ZXh0PXRoaXMuY29udGV4dCxifSxlYWNoOmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZWFjaCh0aGlzLGEsYil9LG1hcDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobS5tYXAodGhpcyxmdW5jdGlvbihiLGMpe3JldHVybiBhLmNhbGwoYixjLGIpfSkpfSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1c2hTdGFjayhkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGVxOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMubGVuZ3RoLGM9K2ErKDA+YT9iOjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhjPj0wJiZiPmM/W3RoaXNbY11dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcihudWxsKX0scHVzaDpmLHNvcnQ6Yy5zb3J0LHNwbGljZTpjLnNwbGljZX0sbS5leHRlbmQ9bS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgYSxiLGMsZCxlLGYsZz1hcmd1bWVudHNbMF18fHt9LGg9MSxpPWFyZ3VtZW50cy5sZW5ndGgsaj0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgZyYmKGo9ZyxnPWFyZ3VtZW50c1toXXx8e30saCsrKSwib2JqZWN0Ij09dHlwZW9mIGd8fG0uaXNGdW5jdGlvbihnKXx8KGc9e30pLGg9PT1pJiYoZz10aGlzLGgtLSk7aT5oO2grKylpZihudWxsIT0oZT1hcmd1bWVudHNbaF0pKWZvcihkIGluIGUpYT1nW2RdLGM9ZVtkXSxnIT09YyYmKGomJmMmJihtLmlzUGxhaW5PYmplY3QoYyl8fChiPW0uaXNBcnJheShjKSkpPyhiPyhiPSExLGY9YSYmbS5pc0FycmF5KGEpP2E6W10pOmY9YSYmbS5pc1BsYWluT2JqZWN0KGEpP2E6e30sZ1tkXT1tLmV4dGVuZChqLGYsYykpOnZvaWQgMCE9PWMmJihnW2RdPWMpKTtyZXR1cm4gZ30sbS5leHRlbmQoe2V4cGFuZG86ImpRdWVyeSIrKGwrTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvXEQvZywiIiksaXNSZWFkeTohMCxlcnJvcjpmdW5jdGlvbihhKXt0aHJvdyBuZXcgRXJyb3IoYSl9LG5vb3A6ZnVuY3Rpb24oKXt9LGlzRnVuY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuImZ1bmN0aW9uIj09PW0udHlwZShhKX0saXNBcnJheTpBcnJheS5pc0FycmF5fHxmdW5jdGlvbihhKXtyZXR1cm4iYXJyYXkiPT09bS50eXBlKGEpfSxpc1dpbmRvdzpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9YSYmYT09YS53aW5kb3d9LGlzTnVtZXJpYzpmdW5jdGlvbihhKXtyZXR1cm4hbS5pc0FycmF5KGEpJiZhLXBhcnNlRmxvYXQoYSkrMT49MH0saXNFbXB0eU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYjtmb3IoYiBpbiBhKXJldHVybiExO3JldHVybiEwfSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBiO2lmKCFhfHwib2JqZWN0IiE9PW0udHlwZShhKXx8YS5ub2RlVHlwZXx8bS5pc1dpbmRvdyhhKSlyZXR1cm4hMTt0cnl7aWYoYS5jb25zdHJ1Y3RvciYmIWouY2FsbChhLCJjb25zdHJ1Y3RvciIpJiYhai5jYWxsKGEuY29uc3RydWN0b3IucHJvdG90eXBlLCJpc1Byb3RvdHlwZU9mIikpcmV0dXJuITF9Y2F0Y2goYyl7cmV0dXJuITF9aWYoay5vd25MYXN0KWZvcihiIGluIGEpcmV0dXJuIGouY2FsbChhLGIpO2ZvcihiIGluIGEpO3JldHVybiB2b2lkIDA9PT1ifHxqLmNhbGwoYSxiKX0sdHlwZTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT9hKyIiOiJvYmplY3QiPT10eXBlb2YgYXx8ImZ1bmN0aW9uIj09dHlwZW9mIGE/aFtpLmNhbGwoYSldfHwib2JqZWN0Ijp0eXBlb2YgYX0sZ2xvYmFsRXZhbDpmdW5jdGlvbihiKXtiJiZtLnRyaW0oYikmJihhLmV4ZWNTY3JpcHR8fGZ1bmN0aW9uKGIpe2EuZXZhbC5jYWxsKGEsYil9KShiKX0sY2FtZWxDYXNlOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UobywibXMtIikucmVwbGFjZShwLHEpfSxub2RlTmFtZTpmdW5jdGlvbihhLGIpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1iLnRvTG93ZXJDYXNlKCl9LGVhY2g6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU9MCxmPWEubGVuZ3RoLGc9cihhKTtpZihjKXtpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmFwcGx5KGFbZV0sYyksZD09PSExKWJyZWFrfWVsc2UgZm9yKGUgaW4gYSlpZihkPWIuYXBwbHkoYVtlXSxjKSxkPT09ITEpYnJlYWt9ZWxzZSBpZihnKXtmb3IoO2Y+ZTtlKyspaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVha31lbHNlIGZvcihlIGluIGEpaWYoZD1iLmNhbGwoYVtlXSxlLGFbZV0pLGQ9PT0hMSlicmVhaztyZXR1cm4gYX0sdHJpbTpmdW5jdGlvbihhKXtyZXR1cm4gbnVsbD09YT8iIjooYSsiIikucmVwbGFjZShuLCIiKX0sbWFrZUFycmF5OmZ1bmN0aW9uKGEsYil7dmFyIGM9Ynx8W107cmV0dXJuIG51bGwhPWEmJihyKE9iamVjdChhKSk/bS5tZXJnZShjLCJzdHJpbmciPT10eXBlb2YgYT9bYV06YSk6Zi5jYWxsKGMsYSkpLGN9LGluQXJyYXk6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkO2lmKGIpe2lmKGcpcmV0dXJuIGcuY2FsbChiLGEsYyk7Zm9yKGQ9Yi5sZW5ndGgsYz1jPzA+Yz9NYXRoLm1heCgwLGQrYyk6YzowO2Q+YztjKyspaWYoYyBpbiBiJiZiW2NdPT09YSlyZXR1cm4gY31yZXR1cm4tMX0sbWVyZ2U6ZnVuY3Rpb24oYSxiKXt2YXIgYz0rYi5sZW5ndGgsZD0wLGU9YS5sZW5ndGg7d2hpbGUoYz5kKWFbZSsrXT1iW2QrK107aWYoYyE9PWMpd2hpbGUodm9pZCAwIT09YltkXSlhW2UrK109YltkKytdO3JldHVybiBhLmxlbmd0aD1lLGF9LGdyZXA6ZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZCxlPVtdLGY9MCxnPWEubGVuZ3RoLGg9IWM7Zz5mO2YrKylkPSFiKGFbZl0sZiksZCE9PWgmJmUucHVzaChhW2ZdKTtyZXR1cm4gZX0sbWFwOmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxmPTAsZz1hLmxlbmd0aCxoPXIoYSksaT1bXTtpZihoKWZvcig7Zz5mO2YrKylkPWIoYVtmXSxmLGMpLG51bGwhPWQmJmkucHVzaChkKTtlbHNlIGZvcihmIGluIGEpZD1iKGFbZl0sZixjKSxudWxsIT1kJiZpLnB1c2goZCk7cmV0dXJuIGUuYXBwbHkoW10saSl9LGd1aWQ6MSxwcm94eTpmdW5jdGlvbihhLGIpe3ZhciBjLGUsZjtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGImJihmPWFbYl0sYj1hLGE9ZiksbS5pc0Z1bmN0aW9uKGEpPyhjPWQuY2FsbChhcmd1bWVudHMsMiksZT1mdW5jdGlvbigpe3JldHVybiBhLmFwcGx5KGJ8fHRoaXMsYy5jb25jYXQoZC5jYWxsKGFyZ3VtZW50cykpKX0sZS5ndWlkPWEuZ3VpZD1hLmd1aWR8fG0uZ3VpZCsrLGUpOnZvaWQgMH0sbm93OmZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSxzdXBwb3J0Omt9KSxtLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IiLnNwbGl0KCIgIiksZnVuY3Rpb24oYSxiKXtoWyJbb2JqZWN0ICIrYisiXSJdPWIudG9Mb3dlckNhc2UoKX0pO2Z1bmN0aW9uIHIoYSl7dmFyIGI9Imxlbmd0aCJpbiBhJiZhLmxlbmd0aCxjPW0udHlwZShhKTtyZXR1cm4iZnVuY3Rpb24iPT09Y3x8bS5pc1dpbmRvdyhhKT8hMToxPT09YS5ub2RlVHlwZSYmYj8hMDoiYXJyYXkiPT09Y3x8MD09PWJ8fCJudW1iZXIiPT10eXBlb2YgYiYmYj4wJiZiLTEgaW4gYX12YXIgcz1mdW5jdGlvbihhKXt2YXIgYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1PSJzaXp6bGUiKzEqbmV3IERhdGUsdj1hLmRvY3VtZW50LHc9MCx4PTAseT1oYSgpLHo9aGEoKSxBPWhhKCksQj1mdW5jdGlvbihhLGIpe3JldHVybiBhPT09YiYmKGw9ITApLDB9LEM9MTw8MzEsRD17fS5oYXNPd25Qcm9wZXJ0eSxFPVtdLEY9RS5wb3AsRz1FLnB1c2gsSD1FLnB1c2gsST1FLnNsaWNlLEo9ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2Q+YztjKyspaWYoYVtjXT09PWIpcmV0dXJuIGM7cmV0dXJuLTF9LEs9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIixMPSJbXFx4MjBcXHRcXHJcXG5cXGZdIixNPSIoPzpcXFxcLnxbXFx3LV18W15cXHgwMC1cXHhhMF0pKyIsTj1NLnJlcGxhY2UoInciLCJ3IyIpLE89IlxcWyIrTCsiKigiK00rIikoPzoiK0wrIiooWypeJHwhfl0/PSkiK0wrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIitOKyIpKXwpIitMKyIqXFxdIixQPSI6KCIrTSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrTysiKSopfC4qKVxcKXwpIixRPW5ldyBSZWdFeHAoTCsiKyIsImciKSxSPW5ldyBSZWdFeHAoIl4iK0wrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrTCsiKyQiLCJnIiksUz1uZXcgUmVnRXhwKCJeIitMKyIqLCIrTCsiKiIpLFQ9bmV3IFJlZ0V4cCgiXiIrTCsiKihbPit+XXwiK0wrIikiK0wrIioiKSxVPW5ldyBSZWdFeHAoIj0iK0wrIiooW15cXF0nXCJdKj8pIitMKyIqXFxdIiwiZyIpLFY9bmV3IFJlZ0V4cChQKSxXPW5ldyBSZWdFeHAoIl4iK04rIiQiKSxYPXtJRDpuZXcgUmVnRXhwKCJeIygiK00rIikiKSxDTEFTUzpuZXcgUmVnRXhwKCJeXFwuKCIrTSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrTS5yZXBsYWNlKCJ3IiwidyoiKSsiKSIpLEFUVFI6bmV3IFJlZ0V4cCgiXiIrTyksUFNFVURPOm5ldyBSZWdFeHAoIl4iK1ApLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrTCsiKihldmVufG9kZHwoKFsrLV18KShcXGQqKW58KSIrTCsiKig/OihbKy1dfCkiK0wrIiooXFxkKyl8KSkiK0wrIipcXCl8KSIsImkiKSxib29sOm5ldyBSZWdFeHAoIl4oPzoiK0srIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIitMKyIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXCgiK0wrIiooKD86LVxcZCk/XFxkKikiK0wrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LFk9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxaPS9eaFxkJC9pLCQ9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLF89L14oPzojKFtcdy1dKyl8KFx3Kyl8XC4oW1x3LV0rKSkkLyxhYT0vWyt+XS8sYmE9Lyd8XFwvZyxjYT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK0wrIj98KCIrTCsiKXwuKSIsImlnIiksZGE9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSIweCIrYi02NTUzNjtyZXR1cm4gZCE9PWR8fGM/YjowPmQ/U3RyaW5nLmZyb21DaGFyQ29kZShkKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKGQ+PjEwfDU1Mjk2LDEwMjMmZHw1NjMyMCl9LGVhPWZ1bmN0aW9uKCl7bSgpfTt0cnl7SC5hcHBseShFPUkuY2FsbCh2LmNoaWxkTm9kZXMpLHYuY2hpbGROb2RlcyksRVt2LmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChmYSl7SD17YXBwbHk6RS5sZW5ndGg/ZnVuY3Rpb24oYSxiKXtHLmFwcGx5KGEsSS5jYWxsKGIpKX06ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmxlbmd0aCxkPTA7d2hpbGUoYVtjKytdPWJbZCsrXSk7YS5sZW5ndGg9Yy0xfX19ZnVuY3Rpb24gZ2EoYSxiLGQsZSl7dmFyIGYsaCxqLGssbCxvLHIscyx3LHg7aWYoKGI/Yi5vd25lckRvY3VtZW50fHxiOnYpIT09biYmbShiKSxiPWJ8fG4sZD1kfHxbXSxrPWIubm9kZVR5cGUsInN0cmluZyIhPXR5cGVvZiBhfHwhYXx8MSE9PWsmJjkhPT1rJiYxMSE9PWspcmV0dXJuIGQ7aWYoIWUmJnApe2lmKDExIT09ayYmKGY9Xy5leGVjKGEpKSlpZihqPWZbMV0pe2lmKDk9PT1rKXtpZihoPWIuZ2V0RWxlbWVudEJ5SWQoaiksIWh8fCFoLnBhcmVudE5vZGUpcmV0dXJuIGQ7aWYoaC5pZD09PWopcmV0dXJuIGQucHVzaChoKSxkfWVsc2UgaWYoYi5vd25lckRvY3VtZW50JiYoaD1iLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaikpJiZ0KGIsaCkmJmguaWQ9PT1qKXJldHVybiBkLnB1c2goaCksZH1lbHNle2lmKGZbMl0pcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpKSxkO2lmKChqPWZbM10pJiZjLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpcmV0dXJuIEguYXBwbHkoZCxiLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoaikpLGR9aWYoYy5xc2EmJighcXx8IXEudGVzdChhKSkpe2lmKHM9cj11LHc9Yix4PTEhPT1rJiZhLDE9PT1rJiYib2JqZWN0IiE9PWIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7bz1nKGEpLChyPWIuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXIucmVwbGFjZShiYSwiXFwkJiIpOmIuc2V0QXR0cmlidXRlKCJpZCIscykscz0iW2lkPSciK3MrIiddICIsbD1vLmxlbmd0aDt3aGlsZShsLS0pb1tsXT1zK3JhKG9bbF0pO3c9YWEudGVzdChhKSYmcGEoYi5wYXJlbnROb2RlKXx8Yix4PW8uam9pbigiLCIpfWlmKHgpdHJ5e3JldHVybiBILmFwcGx5KGQsdy5xdWVyeVNlbGVjdG9yQWxsKHgpKSxkfWNhdGNoKHkpe31maW5hbGx5e3J8fGIucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIGkoYS5yZXBsYWNlKFIsIiQxIiksYixkLGUpfWZ1bmN0aW9uIGhhKCl7dmFyIGE9W107ZnVuY3Rpb24gYihjLGUpe3JldHVybiBhLnB1c2goYysiICIpPmQuY2FjaGVMZW5ndGgmJmRlbGV0ZSBiW2Euc2hpZnQoKV0sYltjKyIgIl09ZX1yZXR1cm4gYn1mdW5jdGlvbiBpYShhKXtyZXR1cm4gYVt1XT0hMCxhfWZ1bmN0aW9uIGphKGEpe3ZhciBiPW4uY3JlYXRlRWxlbWVudCgiZGl2Iik7dHJ5e3JldHVybiEhYShiKX1jYXRjaChjKXtyZXR1cm4hMX1maW5hbGx5e2IucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbH19ZnVuY3Rpb24ga2EoYSxiKXt2YXIgYz1hLnNwbGl0KCJ8IiksZT1hLmxlbmd0aDt3aGlsZShlLS0pZC5hdHRySGFuZGxlW2NbZV1dPWJ9ZnVuY3Rpb24gbGEoYSxiKXt2YXIgYz1iJiZhLGQ9YyYmMT09PWEubm9kZVR5cGUmJjE9PT1iLm5vZGVUeXBlJiYofmIuc291cmNlSW5kZXh8fEMpLSh+YS5zb3VyY2VJbmRleHx8Qyk7aWYoZClyZXR1cm4gZDtpZihjKXdoaWxlKGM9Yy5uZXh0U2libGluZylpZihjPT09YilyZXR1cm4tMTtyZXR1cm4gYT8xOi0xfWZ1bmN0aW9uIG1hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWMmJmIudHlwZT09PWF9fWZ1bmN0aW9uIG5hKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1jfHwiYnV0dG9uIj09PWMpJiZiLnR5cGU9PT1hfX1mdW5jdGlvbiBvYShhKXtyZXR1cm4gaWEoZnVuY3Rpb24oYil7cmV0dXJuIGI9K2IsaWEoZnVuY3Rpb24oYyxkKXt2YXIgZSxmPWEoW10sYy5sZW5ndGgsYiksZz1mLmxlbmd0aDt3aGlsZShnLS0pY1tlPWZbZ11dJiYoY1tlXT0hKGRbZV09Y1tlXSkpfSl9KX1mdW5jdGlvbiBwYShhKXtyZXR1cm4gYSYmInVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZhfWM9Z2Euc3VwcG9ydD17fSxmPWdhLmlzWE1MPWZ1bmN0aW9uKGEpe3ZhciBiPWEmJihhLm93bmVyRG9jdW1lbnR8fGEpLmRvY3VtZW50RWxlbWVudDtyZXR1cm4gYj8iSFRNTCIhPT1iLm5vZGVOYW1lOiExfSxtPWdhLnNldERvY3VtZW50PWZ1bmN0aW9uKGEpe3ZhciBiLGUsZz1hP2Eub3duZXJEb2N1bWVudHx8YTp2O3JldHVybiBnIT09biYmOT09PWcubm9kZVR5cGUmJmcuZG9jdW1lbnRFbGVtZW50PyhuPWcsbz1nLmRvY3VtZW50RWxlbWVudCxlPWcuZGVmYXVsdFZpZXcsZSYmZSE9PWUudG9wJiYoZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcigidW5sb2FkIixlYSwhMSk6ZS5hdHRhY2hFdmVudCYmZS5hdHRhY2hFdmVudCgib251bmxvYWQiLGVhKSkscD0hZihnKSxjLmF0dHJpYnV0ZXM9amEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuY2xhc3NOYW1lPSJpIiwhYS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSksYy5nZXRFbGVtZW50c0J5VGFnTmFtZT1qYShmdW5jdGlvbihhKXtyZXR1cm4gYS5hcHBlbmRDaGlsZChnLmNyZWF0ZUNvbW1lbnQoIiIpKSwhYS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpLmxlbmd0aH0pLGMuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZT0kLnRlc3QoZy5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSxjLmdldEJ5SWQ9amEoZnVuY3Rpb24oYSl7cmV0dXJuIG8uYXBwZW5kQ2hpbGQoYSkuaWQ9dSwhZy5nZXRFbGVtZW50c0J5TmFtZXx8IWcuZ2V0RWxlbWVudHNCeU5hbWUodSkubGVuZ3RofSksYy5nZXRCeUlkPyhkLmZpbmQuSUQ9ZnVuY3Rpb24oYSxiKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGIuZ2V0RWxlbWVudEJ5SWQmJnApe3ZhciBjPWIuZ2V0RWxlbWVudEJ5SWQoYSk7cmV0dXJuIGMmJmMucGFyZW50Tm9kZT9bY106W119fSxkLmZpbHRlci5JRD1mdW5jdGlvbihhKXt2YXIgYj1hLnJlcGxhY2UoY2EsZGEpO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gYS5nZXRBdHRyaWJ1dGUoImlkIik9PT1ifX0pOihkZWxldGUgZC5maW5kLklELGQuZmlsdGVyLklEPWZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSk7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBjPSJ1bmRlZmluZWQiIT10eXBlb2YgYS5nZXRBdHRyaWJ1dGVOb2RlJiZhLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIGMmJmMudmFsdWU9PT1ifX0pLGQuZmluZC5UQUc9Yy5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihhLGIpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgYi5nZXRFbGVtZW50c0J5VGFnTmFtZT9iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpOmMucXNhP2IucXVlcnlTZWxlY3RvckFsbChhKTp2b2lkIDB9OmZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPTAsZj1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKGEpO2lmKCIqIj09PWEpe3doaWxlKGM9ZltlKytdKTE9PT1jLm5vZGVUeXBlJiZkLnB1c2goYyk7cmV0dXJuIGR9cmV0dXJuIGZ9LGQuZmluZC5DTEFTUz1jLmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGEsYil7cmV0dXJuIHA/Yi5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGEpOnZvaWQgMH0scj1bXSxxPVtdLChjLnFzYT0kLnRlc3QoZy5xdWVyeVNlbGVjdG9yQWxsKSkmJihqYShmdW5jdGlvbihhKXtvLmFwcGVuZENoaWxkKGEpLmlubmVySFRNTD0iPGEgaWQ9JyIrdSsiJz48L2E+PHNlbGVjdCBpZD0nIit1KyItXGZdJyBtc2FsbG93Y2FwdHVyZT0nJz48b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PiIsYS5xdWVyeVNlbGVjdG9yQWxsKCJbbXNhbGxvd2NhcHR1cmVePScnXSIpLmxlbmd0aCYmcS5wdXNoKCJbKl4kXT0iK0wrIiooPzonJ3xcIlwiKSIpLGEucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8cS5wdXNoKCJcXFsiK0wrIiooPzp2YWx1ZXwiK0srIikiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49Iit1KyItXSIpLmxlbmd0aHx8cS5wdXNoKCJ+PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fHEucHVzaCgiOmNoZWNrZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIit1KyIrKiIpLmxlbmd0aHx8cS5wdXNoKCIuIy4rWyt+XSIpfSksamEoZnVuY3Rpb24oYSl7dmFyIGI9Zy5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO2Iuc2V0QXR0cmlidXRlKCJ0eXBlIiwiaGlkZGVuIiksYS5hcHBlbmRDaGlsZChiKS5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJEIiksYS5xdWVyeVNlbGVjdG9yQWxsKCJbbmFtZT1kXSIpLmxlbmd0aCYmcS5wdXNoKCJuYW1lIitMKyIqWypeJHwhfl0/PSIpLGEucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGh8fHEucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxhLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxxLnB1c2goIiwuKjoiKX0pKSwoYy5tYXRjaGVzU2VsZWN0b3I9JC50ZXN0KHM9by5tYXRjaGVzfHxvLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8by5tb3pNYXRjaGVzU2VsZWN0b3J8fG8ub01hdGNoZXNTZWxlY3Rvcnx8by5tc01hdGNoZXNTZWxlY3RvcikpJiZqYShmdW5jdGlvbihhKXtjLmRpc2Nvbm5lY3RlZE1hdGNoPXMuY2FsbChhLCJkaXYiKSxzLmNhbGwoYSwiW3MhPScnXTp4Iiksci5wdXNoKCIhPSIsUCl9KSxxPXEubGVuZ3RoJiZuZXcgUmVnRXhwKHEuam9pbigifCIpKSxyPXIubGVuZ3RoJiZuZXcgUmVnRXhwKHIuam9pbigifCIpKSxiPSQudGVzdChvLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSx0PWJ8fCQudGVzdChvLmNvbnRhaW5zKT9mdW5jdGlvbihhLGIpe3ZhciBjPTk9PT1hLm5vZGVUeXBlP2EuZG9jdW1lbnRFbGVtZW50OmEsZD1iJiZiLnBhcmVudE5vZGU7cmV0dXJuIGE9PT1kfHwhKCFkfHwxIT09ZC5ub2RlVHlwZXx8IShjLmNvbnRhaW5zP2MuY29udGFpbnMoZCk6YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihkKSkpfTpmdW5jdGlvbihhLGIpe2lmKGIpd2hpbGUoYj1iLnBhcmVudE5vZGUpaWYoYj09PWEpcmV0dXJuITA7cmV0dXJuITF9LEI9Yj9mdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGQ9IWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIGQ/ZDooZD0oYS5vd25lckRvY3VtZW50fHxhKT09PShiLm93bmVyRG9jdW1lbnR8fGIpP2EuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYik6MSwxJmR8fCFjLnNvcnREZXRhY2hlZCYmYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKT09PWQ/YT09PWd8fGEub3duZXJEb2N1bWVudD09PXYmJnQodixhKT8tMTpiPT09Z3x8Yi5vd25lckRvY3VtZW50PT09diYmdCh2LGIpPzE6az9KKGssYSktSihrLGIpOjA6NCZkPy0xOjEpfTpmdW5jdGlvbihhLGIpe2lmKGE9PT1iKXJldHVybiBsPSEwLDA7dmFyIGMsZD0wLGU9YS5wYXJlbnROb2RlLGY9Yi5wYXJlbnROb2RlLGg9W2FdLGk9W2JdO2lmKCFlfHwhZilyZXR1cm4gYT09PWc/LTE6Yj09PWc/MTplPy0xOmY/MTprP0ooayxhKS1KKGssYik6MDtpZihlPT09ZilyZXR1cm4gbGEoYSxiKTtjPWE7d2hpbGUoYz1jLnBhcmVudE5vZGUpaC51bnNoaWZ0KGMpO2M9Yjt3aGlsZShjPWMucGFyZW50Tm9kZSlpLnVuc2hpZnQoYyk7d2hpbGUoaFtkXT09PWlbZF0pZCsrO3JldHVybiBkP2xhKGhbZF0saVtkXSk6aFtkXT09PXY/LTE6aVtkXT09PXY/MTowfSxnKTpufSxnYS5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGdhKGEsbnVsbCxudWxsLGIpfSxnYS5tYXRjaGVzU2VsZWN0b3I9ZnVuY3Rpb24oYSxiKXtpZigoYS5vd25lckRvY3VtZW50fHxhKSE9PW4mJm0oYSksYj1iLnJlcGxhY2UoVSwiPSckMSddIiksISghYy5tYXRjaGVzU2VsZWN0b3J8fCFwfHxyJiZyLnRlc3QoYil8fHEmJnEudGVzdChiKSkpdHJ5e3ZhciBkPXMuY2FsbChhLGIpO2lmKGR8fGMuZGlzY29ubmVjdGVkTWF0Y2h8fGEuZG9jdW1lbnQmJjExIT09YS5kb2N1bWVudC5ub2RlVHlwZSlyZXR1cm4gZH1jYXRjaChlKXt9cmV0dXJuIGdhKGIsbixudWxsLFthXSkubGVuZ3RoPjB9LGdhLmNvbnRhaW5zPWZ1bmN0aW9uKGEsYil7cmV0dXJuKGEub3duZXJEb2N1bWVudHx8YSkhPT1uJiZtKGEpLHQoYSxiKX0sZ2EuYXR0cj1mdW5jdGlvbihhLGIpeyhhLm93bmVyRG9jdW1lbnR8fGEpIT09biYmbShhKTt2YXIgZT1kLmF0dHJIYW5kbGVbYi50b0xvd2VyQ2FzZSgpXSxmPWUmJkQuY2FsbChkLmF0dHJIYW5kbGUsYi50b0xvd2VyQ2FzZSgpKT9lKGEsYiwhcCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1mP2Y6Yy5hdHRyaWJ1dGVzfHwhcD9hLmdldEF0dHJpYnV0ZShiKTooZj1hLmdldEF0dHJpYnV0ZU5vZGUoYikpJiZmLnNwZWNpZmllZD9mLnZhbHVlOm51bGx9LGdhLmVycm9yPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIithKX0sZ2EudW5pcXVlU29ydD1mdW5jdGlvbihhKXt2YXIgYixkPVtdLGU9MCxmPTA7aWYobD0hYy5kZXRlY3REdXBsaWNhdGVzLGs9IWMuc29ydFN0YWJsZSYmYS5zbGljZSgwKSxhLnNvcnQoQiksbCl7d2hpbGUoYj1hW2YrK10pYj09PWFbZl0mJihlPWQucHVzaChmKSk7d2hpbGUoZS0tKWEuc3BsaWNlKGRbZV0sMSl9cmV0dXJuIGs9bnVsbCxhfSxlPWdhLmdldFRleHQ9ZnVuY3Rpb24oYSl7dmFyIGIsYz0iIixkPTAsZj1hLm5vZGVUeXBlO2lmKGYpe2lmKDE9PT1mfHw5PT09Znx8MTE9PT1mKXtpZigic3RyaW5nIj09dHlwZW9mIGEudGV4dENvbnRlbnQpcmV0dXJuIGEudGV4dENvbnRlbnQ7Zm9yKGE9YS5maXJzdENoaWxkO2E7YT1hLm5leHRTaWJsaW5nKWMrPWUoYSl9ZWxzZSBpZigzPT09Znx8ND09PWYpcmV0dXJuIGEubm9kZVZhbHVlfWVsc2Ugd2hpbGUoYj1hW2QrK10pYys9ZShiKTtyZXR1cm4gY30sZD1nYS5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzppYSxtYXRjaDpYLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihhKXtyZXR1cm4gYVsxXT1hWzFdLnJlcGxhY2UoY2EsZGEpLGFbM109KGFbM118fGFbNF18fGFbNV18fCIiKS5yZXBsYWNlKGNhLGRhKSwifj0iPT09YVsyXSYmKGFbM109IiAiK2FbM10rIiAiKSxhLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGEpe3JldHVybiBhWzFdPWFbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWFbMV0uc2xpY2UoMCwzKT8oYVszXXx8Z2EuZXJyb3IoYVswXSksYVs0XT0rKGFbNF0/YVs1XSsoYVs2XXx8MSk6MiooImV2ZW4iPT09YVszXXx8Im9kZCI9PT1hWzNdKSksYVs1XT0rKGFbN10rYVs4XXx8Im9kZCI9PT1hWzNdKSk6YVszXSYmZ2EuZXJyb3IoYVswXSksYX0sUFNFVURPOmZ1bmN0aW9uKGEpe3ZhciBiLGM9IWFbNl0mJmFbMl07cmV0dXJuIFguQ0hJTEQudGVzdChhWzBdKT9udWxsOihhWzNdP2FbMl09YVs0XXx8YVs1XXx8IiI6YyYmVi50ZXN0KGMpJiYoYj1nKGMsITApKSYmKGI9Yy5pbmRleE9mKCIpIixjLmxlbmd0aC1iKS1jLmxlbmd0aCkmJihhWzBdPWFbMF0uc2xpY2UoMCxiKSxhWzJdPWMuc2xpY2UoMCxiKSksYS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGEpe3ZhciBiPWEucmVwbGFjZShjYSxkYSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1hP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGEpe3JldHVybiBhLm5vZGVOYW1lJiZhLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1ifX0sQ0xBU1M6ZnVuY3Rpb24oYSl7dmFyIGI9eVthKyIgIl07cmV0dXJuIGJ8fChiPW5ldyBSZWdFeHAoIihefCIrTCsiKSIrYSsiKCIrTCsifCQpIikpJiZ5KGEsZnVuY3Rpb24oYSl7cmV0dXJuIGIudGVzdCgic3RyaW5nIj09dHlwZW9mIGEuY2xhc3NOYW1lJiZhLmNsYXNzTmFtZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBhLmdldEF0dHJpYnV0ZSYmYS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gZnVuY3Rpb24oZCl7dmFyIGU9Z2EuYXR0cihkLGEpO3JldHVybiBudWxsPT1lPyIhPSI9PT1iOmI/KGUrPSIiLCI9Ij09PWI/ZT09PWM6IiE9Ij09PWI/ZSE9PWM6Il49Ij09PWI/YyYmMD09PWUuaW5kZXhPZihjKToiKj0iPT09Yj9jJiZlLmluZGV4T2YoYyk+LTE6IiQ9Ij09PWI/YyYmZS5zbGljZSgtYy5sZW5ndGgpPT09Yzoifj0iPT09Yj8oIiAiK2UucmVwbGFjZShRLCIgIikrIiAiKS5pbmRleE9mKGMpPi0xOiJ8PSI9PT1iP2U9PT1jfHxlLnNsaWNlKDAsYy5sZW5ndGgrMSk9PT1jKyItIjohMSk6ITB9fSxDSElMRDpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmPSJudGgiIT09YS5zbGljZSgwLDMpLGc9Imxhc3QiIT09YS5zbGljZSgtNCksaD0ib2YtdHlwZSI9PT1iO3JldHVybiAxPT09ZCYmMD09PWU/ZnVuY3Rpb24oYSl7cmV0dXJuISFhLnBhcmVudE5vZGV9OmZ1bmN0aW9uKGIsYyxpKXt2YXIgaixrLGwsbSxuLG8scD1mIT09Zz8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLHE9Yi5wYXJlbnROb2RlLHI9aCYmYi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLHM9IWkmJiFoO2lmKHEpe2lmKGYpe3doaWxlKHApe2w9Yjt3aGlsZShsPWxbcF0paWYoaD9sLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT1yOjE9PT1sLm5vZGVUeXBlKXJldHVybiExO289cD0ib25seSI9PT1hJiYhbyYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihvPVtnP3EuZmlyc3RDaGlsZDpxLmxhc3RDaGlsZF0sZyYmcyl7az1xW3VdfHwocVt1XT17fSksaj1rW2FdfHxbXSxuPWpbMF09PT13JiZqWzFdLG09alswXT09PXcmJmpbMl0sbD1uJiZxLmNoaWxkTm9kZXNbbl07d2hpbGUobD0rK24mJmwmJmxbcF18fChtPW49MCl8fG8ucG9wKCkpaWYoMT09PWwubm9kZVR5cGUmJisrbSYmbD09PWIpe2tbYV09W3csbixtXTticmVha319ZWxzZSBpZihzJiYoaj0oYlt1XXx8KGJbdV09e30pKVthXSkmJmpbMF09PT13KW09alsxXTtlbHNlIHdoaWxlKGw9KytuJiZsJiZsW3BdfHwobT1uPTApfHxvLnBvcCgpKWlmKChoP2wubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PXI6MT09PWwubm9kZVR5cGUpJiYrK20mJihzJiYoKGxbdV18fChsW3VdPXt9KSlbYV09W3csbV0pLGw9PT1iKSlicmVhaztyZXR1cm4gbS09ZSxtPT09ZHx8bSVkPT09MCYmbS9kPj0wfX19LFBTRVVETzpmdW5jdGlvbihhLGIpe3ZhciBjLGU9ZC5wc2V1ZG9zW2FdfHxkLnNldEZpbHRlcnNbYS50b0xvd2VyQ2FzZSgpXXx8Z2EuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIithKTtyZXR1cm4gZVt1XT9lKGIpOmUubGVuZ3RoPjE/KGM9W2EsYSwiIixiXSxkLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoYS50b0xvd2VyQ2FzZSgpKT9pYShmdW5jdGlvbihhLGMpe3ZhciBkLGY9ZShhLGIpLGc9Zi5sZW5ndGg7d2hpbGUoZy0tKWQ9SihhLGZbZ10pLGFbZF09IShjW2RdPWZbZ10pfSk6ZnVuY3Rpb24oYSl7cmV0dXJuIGUoYSwwLGMpfSk6ZX19LHBzZXVkb3M6e25vdDppYShmdW5jdGlvbihhKXt2YXIgYj1bXSxjPVtdLGQ9aChhLnJlcGxhY2UoUiwiJDEiKSk7cmV0dXJuIGRbdV0/aWEoZnVuY3Rpb24oYSxiLGMsZSl7dmFyIGYsZz1kKGEsbnVsbCxlLFtdKSxoPWEubGVuZ3RoO3doaWxlKGgtLSkoZj1nW2hdKSYmKGFbaF09IShiW2hdPWYpKX0pOmZ1bmN0aW9uKGEsZSxmKXtyZXR1cm4gYlswXT1hLGQoYixudWxsLGYsYyksYlswXT1udWxsLCFjLnBvcCgpfX0pLGhhczppYShmdW5jdGlvbihhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGdhKGEsYikubGVuZ3RoPjB9fSksY29udGFpbnM6aWEoZnVuY3Rpb24oYSl7cmV0dXJuIGE9YS5yZXBsYWNlKGNhLGRhKSxmdW5jdGlvbihiKXtyZXR1cm4oYi50ZXh0Q29udGVudHx8Yi5pbm5lclRleHR8fGUoYikpLmluZGV4T2YoYSk+LTF9fSksbGFuZzppYShmdW5jdGlvbihhKXtyZXR1cm4gVy50ZXN0KGF8fCIiKXx8Z2EuZXJyb3IoInVuc3VwcG9ydGVkIGxhbmc6ICIrYSksYT1hLnJlcGxhY2UoY2EsZGEpLnRvTG93ZXJDYXNlKCksZnVuY3Rpb24oYil7dmFyIGM7ZG8gaWYoYz1wP2IubGFuZzpiLmdldEF0dHJpYnV0ZSgieG1sOmxhbmciKXx8Yi5nZXRBdHRyaWJ1dGUoImxhbmciKSlyZXR1cm4gYz1jLnRvTG93ZXJDYXNlKCksYz09PWF8fDA9PT1jLmluZGV4T2YoYSsiLSIpO3doaWxlKChiPWIucGFyZW50Tm9kZSkmJjE9PT1iLm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24oYil7dmFyIGM9YS5sb2NhdGlvbiYmYS5sb2NhdGlvbi5oYXNoO3JldHVybiBjJiZjLnNsaWNlKDEpPT09Yi5pZH0scm9vdDpmdW5jdGlvbihhKXtyZXR1cm4gYT09PW99LGZvY3VzOmZ1bmN0aW9uKGEpe3JldHVybiBhPT09bi5hY3RpdmVFbGVtZW50JiYoIW4uaGFzRm9jdXN8fG4uaGFzRm9jdXMoKSkmJiEhKGEudHlwZXx8YS5ocmVmfHx+YS50YWJJbmRleCl9LGVuYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMX0sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ9PT0hMH0sY2hlY2tlZDpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiEhYS5jaGVja2VkfHwib3B0aW9uIj09PWImJiEhYS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZSYmYS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsYS5zZWxlY3RlZD09PSEwfSxlbXB0eTpmdW5jdGlvbihhKXtmb3IoYT1hLmZpcnN0Q2hpbGQ7YTthPWEubmV4dFNpYmxpbmcpaWYoYS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIWQucHNldWRvcy5lbXB0eShhKX0saGVhZGVyOmZ1bmN0aW9uKGEpe3JldHVybiBaLnRlc3QoYS5ub2RlTmFtZSl9LGlucHV0OmZ1bmN0aW9uKGEpe3JldHVybiBZLnRlc3QoYS5ub2RlTmFtZSl9LGJ1dHRvbjpmdW5jdGlvbihhKXt2YXIgYj1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PWImJiJidXR0b24iPT09YS50eXBlfHwiYnV0dG9uIj09PWJ9LHRleHQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuImlucHV0Ij09PWEubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmInRleHQiPT09YS50eXBlJiYobnVsbD09KGI9YS5nZXRBdHRyaWJ1dGUoInR5cGUiKSl8fCJ0ZXh0Ij09PWIudG9Mb3dlckNhc2UoKSl9LGZpcnN0Om9hKGZ1bmN0aW9uKCl7cmV0dXJuWzBdfSksbGFzdDpvYShmdW5jdGlvbihhLGIpe3JldHVybltiLTFdfSksZXE6b2EoZnVuY3Rpb24oYSxiLGMpe3JldHVyblswPmM/YytiOmNdfSksZXZlbjpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0wO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLG9kZDpvYShmdW5jdGlvbihhLGIpe2Zvcih2YXIgYz0xO2I+YztjKz0yKWEucHVzaChjKTtyZXR1cm4gYX0pLGx0Om9hKGZ1bmN0aW9uKGEsYixjKXtmb3IodmFyIGQ9MD5jP2MrYjpjOy0tZD49MDspYS5wdXNoKGQpO3JldHVybiBhfSksZ3Q6b2EoZnVuY3Rpb24oYSxiLGMpe2Zvcih2YXIgZD0wPmM/YytiOmM7KytkPGI7KWEucHVzaChkKTtyZXR1cm4gYX0pfX0sZC5wc2V1ZG9zLm50aD1kLnBzZXVkb3MuZXE7Zm9yKGIgaW57cmFkaW86ITAsY2hlY2tib3g6ITAsZmlsZTohMCxwYXNzd29yZDohMCxpbWFnZTohMH0pZC5wc2V1ZG9zW2JdPW1hKGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pZC5wc2V1ZG9zW2JdPW5hKGIpO2Z1bmN0aW9uIHFhKCl7fXFhLnByb3RvdHlwZT1kLmZpbHRlcnM9ZC5wc2V1ZG9zLGQuc2V0RmlsdGVycz1uZXcgcWEsZz1nYS50b2tlbml6ZT1mdW5jdGlvbihhLGIpe3ZhciBjLGUsZixnLGgsaSxqLGs9elthKyIgIl07aWYoaylyZXR1cm4gYj8wOmsuc2xpY2UoMCk7aD1hLGk9W10saj1kLnByZUZpbHRlcjt3aGlsZShoKXsoIWN8fChlPVMuZXhlYyhoKSkpJiYoZSYmKGg9aC5zbGljZShlWzBdLmxlbmd0aCl8fGgpLGkucHVzaChmPVtdKSksYz0hMSwoZT1ULmV4ZWMoaCkpJiYoYz1lLnNoaWZ0KCksZi5wdXNoKHt2YWx1ZTpjLHR5cGU6ZVswXS5yZXBsYWNlKFIsIiAiKX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2ZvcihnIGluIGQuZmlsdGVyKSEoZT1YW2ddLmV4ZWMoaCkpfHxqW2ddJiYhKGU9altnXShlKSl8fChjPWUuc2hpZnQoKSxmLnB1c2goe3ZhbHVlOmMsdHlwZTpnLG1hdGNoZXM6ZX0pLGg9aC5zbGljZShjLmxlbmd0aCkpO2lmKCFjKWJyZWFrfXJldHVybiBiP2gubGVuZ3RoOmg/Z2EuZXJyb3IoYSk6eihhLGkpLnNsaWNlKDApfTtmdW5jdGlvbiByYShhKXtmb3IodmFyIGI9MCxjPWEubGVuZ3RoLGQ9IiI7Yz5iO2IrKylkKz1hW2JdLnZhbHVlO3JldHVybiBkfWZ1bmN0aW9uIHNhKGEsYixjKXt2YXIgZD1iLmRpcixlPWMmJiJwYXJlbnROb2RlIj09PWQsZj14Kys7cmV0dXJuIGIuZmlyc3Q/ZnVuY3Rpb24oYixjLGYpe3doaWxlKGI9YltkXSlpZigxPT09Yi5ub2RlVHlwZXx8ZSlyZXR1cm4gYShiLGMsZil9OmZ1bmN0aW9uKGIsYyxnKXt2YXIgaCxpLGo9W3csZl07aWYoZyl7d2hpbGUoYj1iW2RdKWlmKCgxPT09Yi5ub2RlVHlwZXx8ZSkmJmEoYixjLGcpKXJldHVybiEwfWVsc2Ugd2hpbGUoYj1iW2RdKWlmKDE9PT1iLm5vZGVUeXBlfHxlKXtpZihpPWJbdV18fChiW3VdPXt9KSwoaD1pW2RdKSYmaFswXT09PXcmJmhbMV09PT1mKXJldHVybiBqWzJdPWhbMl07aWYoaVtkXT1qLGpbMl09YShiLGMsZykpcmV0dXJuITB9fX1mdW5jdGlvbiB0YShhKXtyZXR1cm4gYS5sZW5ndGg+MT9mdW5jdGlvbihiLGMsZCl7dmFyIGU9YS5sZW5ndGg7d2hpbGUoZS0tKWlmKCFhW2VdKGIsYyxkKSlyZXR1cm4hMTtyZXR1cm4hMH06YVswXX1mdW5jdGlvbiB1YShhLGIsYyl7Zm9yKHZhciBkPTAsZT1iLmxlbmd0aDtlPmQ7ZCsrKWdhKGEsYltkXSxjKTtyZXR1cm4gY31mdW5jdGlvbiB2YShhLGIsYyxkLGUpe2Zvcih2YXIgZixnPVtdLGg9MCxpPWEubGVuZ3RoLGo9bnVsbCE9YjtpPmg7aCsrKShmPWFbaF0pJiYoIWN8fGMoZixkLGUpKSYmKGcucHVzaChmKSxqJiZiLnB1c2goaCkpO3JldHVybiBnfWZ1bmN0aW9uIHdhKGEsYixjLGQsZSxmKXtyZXR1cm4gZCYmIWRbdV0mJihkPXdhKGQpKSxlJiYhZVt1XSYmKGU9d2EoZSxmKSksaWEoZnVuY3Rpb24oZixnLGgsaSl7dmFyIGosayxsLG09W10sbj1bXSxvPWcubGVuZ3RoLHA9Znx8dWEoYnx8IioiLGgubm9kZVR5cGU/W2hdOmgsW10pLHE9IWF8fCFmJiZiP3A6dmEocCxtLGEsaCxpKSxyPWM/ZXx8KGY/YTpvfHxkKT9bXTpnOnE7aWYoYyYmYyhxLHIsaCxpKSxkKXtqPXZhKHIsbiksZChqLFtdLGgsaSksaz1qLmxlbmd0aDt3aGlsZShrLS0pKGw9altrXSkmJihyW25ba11dPSEocVtuW2tdXT1sKSl9aWYoZil7aWYoZXx8YSl7aWYoZSl7aj1bXSxrPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmai5wdXNoKHFba109bCk7ZShudWxsLHI9W10saixpKX1rPXIubGVuZ3RoO3doaWxlKGstLSkobD1yW2tdKSYmKGo9ZT9KKGYsbCk6bVtrXSk+LTEmJihmW2pdPSEoZ1tqXT1sKSl9fWVsc2Ugcj12YShyPT09Zz9yLnNwbGljZShvLHIubGVuZ3RoKTpyKSxlP2UobnVsbCxnLHIsaSk6SC5hcHBseShnLHIpfSl9ZnVuY3Rpb24geGEoYSl7Zm9yKHZhciBiLGMsZSxmPWEubGVuZ3RoLGc9ZC5yZWxhdGl2ZVthWzBdLnR5cGVdLGg9Z3x8ZC5yZWxhdGl2ZVsiICJdLGk9Zz8xOjAsaz1zYShmdW5jdGlvbihhKXtyZXR1cm4gYT09PWJ9LGgsITApLGw9c2EoZnVuY3Rpb24oYSl7cmV0dXJuIEooYixhKT4tMX0saCwhMCksbT1bZnVuY3Rpb24oYSxjLGQpe3ZhciBlPSFnJiYoZHx8YyE9PWopfHwoKGI9Yykubm9kZVR5cGU/ayhhLGMsZCk6bChhLGMsZCkpO3JldHVybiBiPW51bGwsZX1dO2Y+aTtpKyspaWYoYz1kLnJlbGF0aXZlW2FbaV0udHlwZV0pbT1bc2EodGEobSksYyldO2Vsc2V7aWYoYz1kLmZpbHRlclthW2ldLnR5cGVdLmFwcGx5KG51bGwsYVtpXS5tYXRjaGVzKSxjW3VdKXtmb3IoZT0rK2k7Zj5lO2UrKylpZihkLnJlbGF0aXZlW2FbZV0udHlwZV0pYnJlYWs7cmV0dXJuIHdhKGk+MSYmdGEobSksaT4xJiZyYShhLnNsaWNlKDAsaS0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWFbaS0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKFIsIiQxIiksYyxlPmkmJnhhKGEuc2xpY2UoaSxlKSksZj5lJiZ4YShhPWEuc2xpY2UoZSkpLGY+ZSYmcmEoYSkpfW0ucHVzaChjKX1yZXR1cm4gdGEobSl9ZnVuY3Rpb24geWEoYSxiKXt2YXIgYz1iLmxlbmd0aD4wLGU9YS5sZW5ndGg+MCxmPWZ1bmN0aW9uKGYsZyxoLGksayl7dmFyIGwsbSxvLHA9MCxxPSIwIixyPWYmJltdLHM9W10sdD1qLHU9Znx8ZSYmZC5maW5kLlRBRygiKiIsayksdj13Kz1udWxsPT10PzE6TWF0aC5yYW5kb20oKXx8LjEseD11Lmxlbmd0aDtmb3IoayYmKGo9ZyE9PW4mJmcpO3EhPT14JiZudWxsIT0obD11W3FdKTtxKyspe2lmKGUmJmwpe209MDt3aGlsZShvPWFbbSsrXSlpZihvKGwsZyxoKSl7aS5wdXNoKGwpO2JyZWFrfWsmJih3PXYpfWMmJigobD0hbyYmbCkmJnAtLSxmJiZyLnB1c2gobCkpfWlmKHArPXEsYyYmcSE9PXApe209MDt3aGlsZShvPWJbbSsrXSlvKHIscyxnLGgpO2lmKGYpe2lmKHA+MCl3aGlsZShxLS0pcltxXXx8c1txXXx8KHNbcV09Ri5jYWxsKGkpKTtzPXZhKHMpfUguYXBwbHkoaSxzKSxrJiYhZiYmcy5sZW5ndGg+MCYmcCtiLmxlbmd0aD4xJiZnYS51bmlxdWVTb3J0KGkpfXJldHVybiBrJiYodz12LGo9dCkscn07cmV0dXJuIGM/aWEoZik6Zn1yZXR1cm4gaD1nYS5jb21waWxlPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1bXSxlPVtdLGY9QVthKyIgIl07aWYoIWYpe2J8fChiPWcoYSkpLGM9Yi5sZW5ndGg7d2hpbGUoYy0tKWY9eGEoYltjXSksZlt1XT9kLnB1c2goZik6ZS5wdXNoKGYpO2Y9QShhLHlhKGUsZCkpLGYuc2VsZWN0b3I9YX1yZXR1cm4gZn0saT1nYS5zZWxlY3Q9ZnVuY3Rpb24oYSxiLGUsZil7dmFyIGksaixrLGwsbSxuPSJmdW5jdGlvbiI9PXR5cGVvZiBhJiZhLG89IWYmJmcoYT1uLnNlbGVjdG9yfHxhKTtpZihlPWV8fFtdLDE9PT1vLmxlbmd0aCl7aWYoaj1vWzBdPW9bMF0uc2xpY2UoMCksai5sZW5ndGg+MiYmIklEIj09PShrPWpbMF0pLnR5cGUmJmMuZ2V0QnlJZCYmOT09PWIubm9kZVR5cGUmJnAmJmQucmVsYXRpdmVbalsxXS50eXBlXSl7aWYoYj0oZC5maW5kLklEKGsubWF0Y2hlc1swXS5yZXBsYWNlKGNhLGRhKSxiKXx8W10pWzBdLCFiKXJldHVybiBlO24mJihiPWIucGFyZW50Tm9kZSksYT1hLnNsaWNlKGouc2hpZnQoKS52YWx1ZS5sZW5ndGgpfWk9WC5uZWVkc0NvbnRleHQudGVzdChhKT8wOmoubGVuZ3RoO3doaWxlKGktLSl7aWYoaz1qW2ldLGQucmVsYXRpdmVbbD1rLnR5cGVdKWJyZWFrO2lmKChtPWQuZmluZFtsXSkmJihmPW0oay5tYXRjaGVzWzBdLnJlcGxhY2UoY2EsZGEpLGFhLnRlc3QoalswXS50eXBlKSYmcGEoYi5wYXJlbnROb2RlKXx8YikpKXtpZihqLnNwbGljZShpLDEpLGE9Zi5sZW5ndGgmJnJhKGopLCFhKXJldHVybiBILmFwcGx5KGUsZiksZTticmVha319fXJldHVybihufHxoKGEsbykpKGYsYiwhcCxlLGFhLnRlc3QoYSkmJnBhKGIucGFyZW50Tm9kZSl8fGIpLGV9LGMuc29ydFN0YWJsZT11LnNwbGl0KCIiKS5zb3J0KEIpLmpvaW4oIiIpPT09dSxjLmRldGVjdER1cGxpY2F0ZXM9ISFsLG0oKSxjLnNvcnREZXRhY2hlZD1qYShmdW5jdGlvbihhKXtyZXR1cm4gMSZhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG4uY3JlYXRlRWxlbWVudCgiZGl2IikpfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8YSBocmVmPScjJz48L2E+IiwiIyI9PT1hLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCJocmVmIil9KXx8a2EoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gYz92b2lkIDA6YS5nZXRBdHRyaWJ1dGUoYiwidHlwZSI9PT1iLnRvTG93ZXJDYXNlKCk/MToyKX0pLGMuYXR0cmlidXRlcyYmamEoZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW5uZXJIVE1MPSI8aW5wdXQvPiIsYS5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSwiIj09PWEuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoInZhbHVlIil9KXx8a2EoInZhbHVlIixmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGN8fCJpbnB1dCIhPT1hLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/dm9pZCAwOmEuZGVmYXVsdFZhbHVlfSksamEoZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWEuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGthKEssZnVuY3Rpb24oYSxiLGMpe3ZhciBkO3JldHVybiBjP3ZvaWQgMDphW2JdPT09ITA/Yi50b0xvd2VyQ2FzZSgpOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJmQuc3BlY2lmaWVkP2QudmFsdWU6bnVsbH0pLGdhfShhKTttLmZpbmQ9cyxtLmV4cHI9cy5zZWxlY3RvcnMsbS5leHByWyI6Il09bS5leHByLnBzZXVkb3MsbS51bmlxdWU9cy51bmlxdWVTb3J0LG0udGV4dD1zLmdldFRleHQsbS5pc1hNTERvYz1zLmlzWE1MLG0uY29udGFpbnM9cy5jb250YWluczt2YXIgdD1tLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LHU9L148KFx3KylccypcLz8+KD86PFwvXDE+fCkkLyx2PS9eLlteOiNcW1wuLF0qJC87ZnVuY3Rpb24gdyhhLGIsYyl7aWYobS5pc0Z1bmN0aW9uKGIpKXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhLGQpe3JldHVybiEhYi5jYWxsKGEsZCxhKSE9PWN9KTtpZihiLm5vZGVUeXBlKXJldHVybiBtLmdyZXAoYSxmdW5jdGlvbihhKXtyZXR1cm4gYT09PWIhPT1jfSk7aWYoInN0cmluZyI9PXR5cGVvZiBiKXtpZih2LnRlc3QoYikpcmV0dXJuIG0uZmlsdGVyKGIsYSxjKTtiPW0uZmlsdGVyKGIsYSl9cmV0dXJuIG0uZ3JlcChhLGZ1bmN0aW9uKGEpe3JldHVybiBtLmluQXJyYXkoYSxiKT49MCE9PWN9KX1tLmZpbHRlcj1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YlswXTtyZXR1cm4gYyYmKGE9Ijpub3QoIithKyIpIiksMT09PWIubGVuZ3RoJiYxPT09ZC5ub2RlVHlwZT9tLmZpbmQubWF0Y2hlc1NlbGVjdG9yKGQsYSk/W2RdOltdOm0uZmluZC5tYXRjaGVzKGEsbS5ncmVwKGIsZnVuY3Rpb24oYSl7cmV0dXJuIDE9PT1hLm5vZGVUeXBlfSkpfSxtLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihhKXt2YXIgYixjPVtdLGQ9dGhpcyxlPWQubGVuZ3RoO2lmKCJzdHJpbmciIT10eXBlb2YgYSlyZXR1cm4gdGhpcy5wdXNoU3RhY2sobShhKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IoYj0wO2U+YjtiKyspaWYobS5jb250YWlucyhkW2JdLHRoaXMpKXJldHVybiEwfSkpO2ZvcihiPTA7ZT5iO2IrKyltLmZpbmQoYSxkW2JdLGMpO3JldHVybiBjPXRoaXMucHVzaFN0YWNrKGU+MT9tLnVuaXF1ZShjKTpjKSxjLnNlbGVjdG9yPXRoaXMuc2VsZWN0b3I/dGhpcy5zZWxlY3RvcisiICIrYTphLGN9LGZpbHRlcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyh0aGlzLGF8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sodyh0aGlzLGF8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGEpe3JldHVybiEhdyh0aGlzLCJzdHJpbmciPT10eXBlb2YgYSYmdC50ZXN0KGEpP20oYSk6YXx8W10sITEpLmxlbmd0aH19KTt2YXIgeCx5PWEuZG9jdW1lbnQsej0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSopKSQvLEE9bS5mbi5pbml0PWZ1bmN0aW9uKGEsYil7dmFyIGMsZDtpZighYSlyZXR1cm4gdGhpcztpZigic3RyaW5nIj09dHlwZW9mIGEpe2lmKGM9IjwiPT09YS5jaGFyQXQoMCkmJiI+Ij09PWEuY2hhckF0KGEubGVuZ3RoLTEpJiZhLmxlbmd0aD49Mz9bbnVsbCxhLG51bGxdOnouZXhlYyhhKSwhY3x8IWNbMV0mJmIpcmV0dXJuIWJ8fGIuanF1ZXJ5PyhifHx4KS5maW5kKGEpOnRoaXMuY29uc3RydWN0b3IoYikuZmluZChhKTtpZihjWzFdKXtpZihiPWIgaW5zdGFuY2VvZiBtP2JbMF06YixtLm1lcmdlKHRoaXMsbS5wYXJzZUhUTUwoY1sxXSxiJiZiLm5vZGVUeXBlP2Iub3duZXJEb2N1bWVudHx8Yjp5LCEwKSksdS50ZXN0KGNbMV0pJiZtLmlzUGxhaW5PYmplY3QoYikpZm9yKGMgaW4gYiltLmlzRnVuY3Rpb24odGhpc1tjXSk/dGhpc1tjXShiW2NdKTp0aGlzLmF0dHIoYyxiW2NdKTtyZXR1cm4gdGhpc31pZihkPXkuZ2V0RWxlbWVudEJ5SWQoY1syXSksZCYmZC5wYXJlbnROb2RlKXtpZihkLmlkIT09Y1syXSlyZXR1cm4geC5maW5kKGEpO3RoaXMubGVuZ3RoPTEsdGhpc1swXT1kfXJldHVybiB0aGlzLmNvbnRleHQ9eSx0aGlzLnNlbGVjdG9yPWEsdGhpc31yZXR1cm4gYS5ub2RlVHlwZT8odGhpcy5jb250ZXh0PXRoaXNbMF09YSx0aGlzLmxlbmd0aD0xLHRoaXMpOm0uaXNGdW5jdGlvbihhKT8idW5kZWZpbmVkIiE9dHlwZW9mIHgucmVhZHk/eC5yZWFkeShhKTphKG0pOih2b2lkIDAhPT1hLnNlbGVjdG9yJiYodGhpcy5zZWxlY3Rvcj1hLnNlbGVjdG9yLHRoaXMuY29udGV4dD1hLmNvbnRleHQpLG0ubWFrZUFycmF5KGEsdGhpcykpfTtBLnByb3RvdHlwZT1tLmZuLHg9bSh5KTt2YXIgQj0vXig/OnBhcmVudHN8cHJldig/OlVudGlsfEFsbCkpLyxDPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O20uZXh0ZW5kKHtkaXI6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPVtdLGU9YVtiXTt3aGlsZShlJiY5IT09ZS5ub2RlVHlwZSYmKHZvaWQgMD09PWN8fDEhPT1lLm5vZGVUeXBlfHwhbShlKS5pcyhjKSkpMT09PWUubm9kZVR5cGUmJmQucHVzaChlKSxlPWVbYl07cmV0dXJuIGR9LHNpYmxpbmc6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9W107YTthPWEubmV4dFNpYmxpbmcpMT09PWEubm9kZVR5cGUmJmEhPT1iJiZjLnB1c2goYSk7cmV0dXJuIGN9fSksbS5mbi5leHRlbmQoe2hhczpmdW5jdGlvbihhKXt2YXIgYixjPW0oYSx0aGlzKSxkPWMubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2ZvcihiPTA7ZD5iO2IrKylpZihtLmNvbnRhaW5zKHRoaXMsY1tiXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihhLGIpe2Zvcih2YXIgYyxkPTAsZT10aGlzLmxlbmd0aCxmPVtdLGc9dC50ZXN0KGEpfHwic3RyaW5nIiE9dHlwZW9mIGE/bShhLGJ8fHRoaXMuY29udGV4dCk6MDtlPmQ7ZCsrKWZvcihjPXRoaXNbZF07YyYmYyE9PWI7Yz1jLnBhcmVudE5vZGUpaWYoYy5ub2RlVHlwZTwxMSYmKGc/Zy5pbmRleChjKT4tMToxPT09Yy5ub2RlVHlwZSYmbS5maW5kLm1hdGNoZXNTZWxlY3RvcihjLGEpKSl7Zi5wdXNoKGMpO2JyZWFrfXJldHVybiB0aGlzLnB1c2hTdGFjayhmLmxlbmd0aD4xP20udW5pcXVlKGYpOmYpfSxpbmRleDpmdW5jdGlvbihhKXtyZXR1cm4gYT8ic3RyaW5nIj09dHlwZW9mIGE/bS5pbkFycmF5KHRoaXNbMF0sbShhKSk6bS5pbkFycmF5KGEuanF1ZXJ5P2FbMF06YSx0aGlzKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLnB1c2hTdGFjayhtLnVuaXF1ZShtLm1lcmdlKHRoaXMuZ2V0KCksbShhLGIpKSkpfSxhZGRCYWNrOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFkZChudWxsPT1hP3RoaXMucHJldk9iamVjdDp0aGlzLnByZXZPYmplY3QuZmlsdGVyKGEpKX19KTtmdW5jdGlvbiBEKGEsYil7ZG8gYT1hW2JdO3doaWxlKGEmJjEhPT1hLm5vZGVUeXBlKTtyZXR1cm4gYX1tLmVhY2goe3BhcmVudDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJjExIT09Yi5ub2RlVHlwZT9iOm51bGx9LHBhcmVudHM6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uZGlyKGEsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5kaXIoYSwicGFyZW50Tm9kZSIsYyl9LG5leHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEQoYSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihhKXtyZXR1cm4gRChhLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbS5kaXIoYSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihhKXtyZXR1cm4gbS5kaXIoYSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0uZGlyKGEsIm5leHRTaWJsaW5nIixjKX0scHJldlVudGlsOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5kaXIoYSwicHJldmlvdXNTaWJsaW5nIixjKX0sc2libGluZ3M6ZnVuY3Rpb24oYSl7cmV0dXJuIG0uc2libGluZygoYS5wYXJlbnROb2RlfHx7fSkuZmlyc3RDaGlsZCxhKX0sY2hpbGRyZW46ZnVuY3Rpb24oYSl7cmV0dXJuIG0uc2libGluZyhhLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLCJpZnJhbWUiKT9hLmNvbnRlbnREb2N1bWVudHx8YS5jb250ZW50V2luZG93LmRvY3VtZW50Om0ubWVyZ2UoW10sYS5jaGlsZE5vZGVzKX19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihjLGQpe3ZhciBlPW0ubWFwKHRoaXMsYixjKTtyZXR1cm4iVW50aWwiIT09YS5zbGljZSgtNSkmJihkPWMpLGQmJiJzdHJpbmciPT10eXBlb2YgZCYmKGU9bS5maWx0ZXIoZCxlKSksdGhpcy5sZW5ndGg+MSYmKENbYV18fChlPW0udW5pcXVlKGUpKSxCLnRlc3QoYSkmJihlPWUucmV2ZXJzZSgpKSksdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIEU9L1xTKy9nLEY9e307ZnVuY3Rpb24gRyhhKXt2YXIgYj1GW2FdPXt9O3JldHVybiBtLmVhY2goYS5tYXRjaChFKXx8W10sZnVuY3Rpb24oYSxjKXtiW2NdPSEwfSksYn1tLkNhbGxiYWNrcz1mdW5jdGlvbihhKXthPSJzdHJpbmciPT10eXBlb2YgYT9GW2FdfHxHKGEpOm0uZXh0ZW5kKHt9LGEpO3ZhciBiLGMsZCxlLGYsZyxoPVtdLGk9IWEub25jZSYmW10saj1mdW5jdGlvbihsKXtmb3IoYz1hLm1lbW9yeSYmbCxkPSEwLGY9Z3x8MCxnPTAsZT1oLmxlbmd0aCxiPSEwO2gmJmU+ZjtmKyspaWYoaFtmXS5hcHBseShsWzBdLGxbMV0pPT09ITEmJmEuc3RvcE9uRmFsc2Upe2M9ITE7YnJlYWt9Yj0hMSxoJiYoaT9pLmxlbmd0aCYmaihpLnNoaWZ0KCkpOmM/aD1bXTprLmRpc2FibGUoKSl9LGs9e2FkZDpmdW5jdGlvbigpe2lmKGgpe3ZhciBkPWgubGVuZ3RoOyFmdW5jdGlvbiBmKGIpe20uZWFjaChiLGZ1bmN0aW9uKGIsYyl7dmFyIGQ9bS50eXBlKGMpOyJmdW5jdGlvbiI9PT1kP2EudW5pcXVlJiZrLmhhcyhjKXx8aC5wdXNoKGMpOmMmJmMubGVuZ3RoJiYic3RyaW5nIiE9PWQmJmYoYyl9KX0oYXJndW1lbnRzKSxiP2U9aC5sZW5ndGg6YyYmKGc9ZCxqKGMpKX1yZXR1cm4gdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIGgmJm0uZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oYSxjKXt2YXIgZDt3aGlsZSgoZD1tLmluQXJyYXkoYyxoLGQpKT4tMSloLnNwbGljZShkLDEpLGImJihlPj1kJiZlLS0sZj49ZCYmZi0tKX0pLHRoaXN9LGhhczpmdW5jdGlvbihhKXtyZXR1cm4gYT9tLmluQXJyYXkoYSxoKT4tMTohKCFofHwhaC5sZW5ndGgpfSxlbXB0eTpmdW5jdGlvbigpe3JldHVybiBoPVtdLGU9MCx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGg9aT1jPXZvaWQgMCx0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFofSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIGk9dm9pZCAwLGN8fGsuZGlzYWJsZSgpLHRoaXN9LGxvY2tlZDpmdW5jdGlvbigpe3JldHVybiFpfSxmaXJlV2l0aDpmdW5jdGlvbihhLGMpe3JldHVybiFofHxkJiYhaXx8KGM9Y3x8W10sYz1bYSxjLnNsaWNlP2Muc2xpY2UoKTpjXSxiP2kucHVzaChjKTpqKGMpKSx0aGlzfSxmaXJlOmZ1bmN0aW9uKCl7cmV0dXJuIGsuZmlyZVdpdGgodGhpcyxhcmd1bWVudHMpLHRoaXN9LGZpcmVkOmZ1bmN0aW9uKCl7cmV0dXJuISFkfX07cmV0dXJuIGt9LG0uZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihhKXt2YXIgYj1bWyJyZXNvbHZlIiwiZG9uZSIsbS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksInJlc29sdmVkIl0sWyJyZWplY3QiLCJmYWlsIixtLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwicmVqZWN0ZWQiXSxbIm5vdGlmeSIsInByb2dyZXNzIixtLkNhbGxiYWNrcygibWVtb3J5IildXSxjPSJwZW5kaW5nIixkPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiBjfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gZS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LHRoZW46ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHM7cmV0dXJuIG0uRGVmZXJyZWQoZnVuY3Rpb24oYyl7bS5lYWNoKGIsZnVuY3Rpb24oYixmKXt2YXIgZz1tLmlzRnVuY3Rpb24oYVtiXSkmJmFbYl07ZVtmWzFdXShmdW5jdGlvbigpe3ZhciBhPWcmJmcuYXBwbHkodGhpcyxhcmd1bWVudHMpO2EmJm0uaXNGdW5jdGlvbihhLnByb21pc2UpP2EucHJvbWlzZSgpLmRvbmUoYy5yZXNvbHZlKS5mYWlsKGMucmVqZWN0KS5wcm9ncmVzcyhjLm5vdGlmeSk6Y1tmWzBdKyJXaXRoIl0odGhpcz09PWQ/Yy5wcm9taXNlKCk6dGhpcyxnP1thXTphcmd1bWVudHMpfSl9KSxhPW51bGx9KS5wcm9taXNlKCl9LHByb21pc2U6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPWE/bS5leHRlbmQoYSxkKTpkfX0sZT17fTtyZXR1cm4gZC5waXBlPWQudGhlbixtLmVhY2goYixmdW5jdGlvbihhLGYpe3ZhciBnPWZbMl0saD1mWzNdO2RbZlsxXV09Zy5hZGQsaCYmZy5hZGQoZnVuY3Rpb24oKXtjPWh9LGJbMV5hXVsyXS5kaXNhYmxlLGJbMl1bMl0ubG9jayksZVtmWzBdXT1mdW5jdGlvbigpe3JldHVybiBlW2ZbMF0rIldpdGgiXSh0aGlzPT09ZT9kOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxlW2ZbMF0rIldpdGgiXT1nLmZpcmVXaXRofSksZC5wcm9taXNlKGUpLGEmJmEuY2FsbChlLGUpLGV9LHdoZW46ZnVuY3Rpb24oYSl7dmFyIGI9MCxjPWQuY2FsbChhcmd1bWVudHMpLGU9Yy5sZW5ndGgsZj0xIT09ZXx8YSYmbS5pc0Z1bmN0aW9uKGEucHJvbWlzZSk/ZTowLGc9MT09PWY/YTptLkRlZmVycmVkKCksaD1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGZ1bmN0aW9uKGUpe2JbYV09dGhpcyxjW2FdPWFyZ3VtZW50cy5sZW5ndGg+MT9kLmNhbGwoYXJndW1lbnRzKTplLGM9PT1pP2cubm90aWZ5V2l0aChiLGMpOi0tZnx8Zy5yZXNvbHZlV2l0aChiLGMpfX0saSxqLGs7aWYoZT4xKWZvcihpPW5ldyBBcnJheShlKSxqPW5ldyBBcnJheShlKSxrPW5ldyBBcnJheShlKTtlPmI7YisrKWNbYl0mJm0uaXNGdW5jdGlvbihjW2JdLnByb21pc2UpP2NbYl0ucHJvbWlzZSgpLmRvbmUoaChiLGssYykpLmZhaWwoZy5yZWplY3QpLnByb2dyZXNzKGgoYixqLGkpKTotLWY7cmV0dXJuIGZ8fGcucmVzb2x2ZVdpdGgoayxjKSxnLnByb21pc2UoKX19KTt2YXIgSDttLmZuLnJlYWR5PWZ1bmN0aW9uKGEpe3JldHVybiBtLnJlYWR5LnByb21pc2UoKS5kb25lKGEpLHRoaXN9LG0uZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLGhvbGRSZWFkeTpmdW5jdGlvbihhKXthP20ucmVhZHlXYWl0Kys6bS5yZWFkeSghMCl9LHJlYWR5OmZ1bmN0aW9uKGEpe2lmKGE9PT0hMD8hLS1tLnJlYWR5V2FpdDohbS5pc1JlYWR5KXtpZigheS5ib2R5KXJldHVybiBzZXRUaW1lb3V0KG0ucmVhZHkpO20uaXNSZWFkeT0hMCxhIT09ITAmJi0tbS5yZWFkeVdhaXQ+MHx8KEgucmVzb2x2ZVdpdGgoeSxbbV0pLG0uZm4udHJpZ2dlckhhbmRsZXImJihtKHkpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpLG0oeSkub2ZmKCJyZWFkeSIpKSl9fX0pO2Z1bmN0aW9uIEkoKXt5LmFkZEV2ZW50TGlzdGVuZXI/KHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsSiwhMSksYS5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixKLCExKSk6KHkuZGV0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsSiksYS5kZXRhY2hFdmVudCgib25sb2FkIixKKSl9ZnVuY3Rpb24gSigpeyh5LmFkZEV2ZW50TGlzdGVuZXJ8fCJsb2FkIj09PWV2ZW50LnR5cGV8fCJjb21wbGV0ZSI9PT15LnJlYWR5U3RhdGUpJiYoSSgpLG0ucmVhZHkoKSl9bS5yZWFkeS5wcm9taXNlPWZ1bmN0aW9uKGIpe2lmKCFIKWlmKEg9bS5EZWZlcnJlZCgpLCJjb21wbGV0ZSI9PT15LnJlYWR5U3RhdGUpc2V0VGltZW91dChtLnJlYWR5KTtlbHNlIGlmKHkuYWRkRXZlbnRMaXN0ZW5lcil5LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLEosITEpLGEuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsSiwhMSk7ZWxzZXt5LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLEopLGEuYXR0YWNoRXZlbnQoIm9ubG9hZCIsSik7dmFyIGM9ITE7dHJ5e2M9bnVsbD09YS5mcmFtZUVsZW1lbnQmJnkuZG9jdW1lbnRFbGVtZW50fWNhdGNoKGQpe31jJiZjLmRvU2Nyb2xsJiYhZnVuY3Rpb24gZSgpe2lmKCFtLmlzUmVhZHkpe3RyeXtjLmRvU2Nyb2xsKCJsZWZ0Iil9Y2F0Y2goYSl7cmV0dXJuIHNldFRpbWVvdXQoZSw1MCl9SSgpLG0ucmVhZHkoKX19KCl9cmV0dXJuIEgucHJvbWlzZShiKX07dmFyIEs9InVuZGVmaW5lZCIsTDtmb3IoTCBpbiBtKGspKWJyZWFrO2sub3duTGFzdD0iMCIhPT1MLGsuaW5saW5lQmxvY2tOZWVkc0xheW91dD0hMSxtKGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7Yz15LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJib2R5IilbMF0sYyYmYy5zdHlsZSYmKGI9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXI6MDt3aWR0aDowO2hlaWdodDowO3RvcDowO2xlZnQ6LTk5OTlweCIsYy5hcHBlbmRDaGlsZChkKS5hcHBlbmRDaGlsZChiKSx0eXBlb2YgYi5zdHlsZS56b29tIT09SyYmKGIuc3R5bGUuY3NzVGV4dD0iZGlzcGxheTppbmxpbmU7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzoxcHg7d2lkdGg6MXB4O3pvb206MSIsay5pbmxpbmVCbG9ja05lZWRzTGF5b3V0PWE9Mz09PWIub2Zmc2V0V2lkdGgsYSYmKGMuc3R5bGUuem9vbT0xKSksYy5yZW1vdmVDaGlsZChkKSl9KSxmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiZGl2Iik7aWYobnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBhLnRlc3R9Y2F0Y2goYil7ay5kZWxldGVFeHBhbmRvPSExfX1hPW51bGx9KCksbS5hY2NlcHREYXRhPWZ1bmN0aW9uKGEpe3ZhciBiPW0ubm9EYXRhWyhhLm5vZGVOYW1lKyIgIikudG9Mb3dlckNhc2UoKV0sYz0rYS5ub2RlVHlwZXx8MTtyZXR1cm4gMSE9PWMmJjkhPT1jPyExOiFifHxiIT09ITAmJmEuZ2V0QXR0cmlidXRlKCJjbGFzc2lkIik9PT1ifTt2YXIgTT0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLE49LyhbQS1aXSkvZztmdW5jdGlvbiBPKGEsYixjKXtpZih2b2lkIDA9PT1jJiYxPT09YS5ub2RlVHlwZSl7dmFyIGQ9ImRhdGEtIitiLnJlcGxhY2UoTiwiLSQxIikudG9Mb3dlckNhc2UoKTtpZihjPWEuZ2V0QXR0cmlidXRlKGQpLCJzdHJpbmciPT10eXBlb2YgYyl7dHJ5e2M9InRydWUiPT09Yz8hMDoiZmFsc2UiPT09Yz8hMToibnVsbCI9PT1jP251bGw6K2MrIiI9PT1jPytjOk0udGVzdChjKT9tLnBhcnNlSlNPTihjKTpjfWNhdGNoKGUpe31tLmRhdGEoYSxiLGMpfWVsc2UgYz12b2lkIDB9cmV0dXJuIGN9ZnVuY3Rpb24gUChhKXt2YXIgYjtmb3IoYiBpbiBhKWlmKCgiZGF0YSIhPT1ifHwhbS5pc0VtcHR5T2JqZWN0KGFbYl0pKSYmInRvSlNPTiIhPT1iKXJldHVybiExOwoKcmV0dXJuITB9ZnVuY3Rpb24gUShhLGIsZCxlKXtpZihtLmFjY2VwdERhdGEoYSkpe3ZhciBmLGcsaD1tLmV4cGFuZG8saT1hLm5vZGVUeXBlLGo9aT9tLmNhY2hlOmEsaz1pP2FbaF06YVtoXSYmaDtpZihrJiZqW2tdJiYoZXx8altrXS5kYXRhKXx8dm9pZCAwIT09ZHx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBrfHwoaz1pP2FbaF09Yy5wb3AoKXx8bS5ndWlkKys6aCksaltrXXx8KGpba109aT97fTp7dG9KU09OOm0ubm9vcH0pLCgib2JqZWN0Ij09dHlwZW9mIGJ8fCJmdW5jdGlvbiI9PXR5cGVvZiBiKSYmKGU/altrXT1tLmV4dGVuZChqW2tdLGIpOmpba10uZGF0YT1tLmV4dGVuZChqW2tdLmRhdGEsYikpLGc9altrXSxlfHwoZy5kYXRhfHwoZy5kYXRhPXt9KSxnPWcuZGF0YSksdm9pZCAwIT09ZCYmKGdbbS5jYW1lbENhc2UoYildPWQpLCJzdHJpbmciPT10eXBlb2YgYj8oZj1nW2JdLG51bGw9PWYmJihmPWdbbS5jYW1lbENhc2UoYildKSk6Zj1nLGZ9fWZ1bmN0aW9uIFIoYSxiLGMpe2lmKG0uYWNjZXB0RGF0YShhKSl7dmFyIGQsZSxmPWEubm9kZVR5cGUsZz1mP20uY2FjaGU6YSxoPWY/YVttLmV4cGFuZG9dOm0uZXhwYW5kbztpZihnW2hdKXtpZihiJiYoZD1jP2dbaF06Z1toXS5kYXRhKSl7bS5pc0FycmF5KGIpP2I9Yi5jb25jYXQobS5tYXAoYixtLmNhbWVsQ2FzZSkpOmIgaW4gZD9iPVtiXTooYj1tLmNhbWVsQ2FzZShiKSxiPWIgaW4gZD9bYl06Yi5zcGxpdCgiICIpKSxlPWIubGVuZ3RoO3doaWxlKGUtLSlkZWxldGUgZFtiW2VdXTtpZihjPyFQKGQpOiFtLmlzRW1wdHlPYmplY3QoZCkpcmV0dXJufShjfHwoZGVsZXRlIGdbaF0uZGF0YSxQKGdbaF0pKSkmJihmP20uY2xlYW5EYXRhKFthXSwhMCk6ay5kZWxldGVFeHBhbmRvfHxnIT1nLndpbmRvdz9kZWxldGUgZ1toXTpnW2hdPW51bGwpfX19bS5leHRlbmQoe2NhY2hlOnt9LG5vRGF0YTp7ImFwcGxldCAiOiEwLCJlbWJlZCAiOiEwLCJvYmplY3QgIjoiY2xzaWQ6RDI3Q0RCNkUtQUU2RC0xMWNmLTk2QjgtNDQ0NTUzNTQwMDAwIn0saGFzRGF0YTpmdW5jdGlvbihhKXtyZXR1cm4gYT1hLm5vZGVUeXBlP20uY2FjaGVbYVttLmV4cGFuZG9dXTphW20uZXhwYW5kb10sISFhJiYhUChhKX0sZGF0YTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIFEoYSxiLGMpfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEsYil7cmV0dXJuIFIoYSxiKX0sX2RhdGE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBRKGEsYixjLCEwKX0sX3JlbW92ZURhdGE6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gUihhLGIsITApfX0pLG0uZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9dGhpc1swXSxnPWYmJmYuYXR0cmlidXRlcztpZih2b2lkIDA9PT1hKXtpZih0aGlzLmxlbmd0aCYmKGU9bS5kYXRhKGYpLDE9PT1mLm5vZGVUeXBlJiYhbS5fZGF0YShmLCJwYXJzZWRBdHRycyIpKSl7Yz1nLmxlbmd0aDt3aGlsZShjLS0pZ1tjXSYmKGQ9Z1tjXS5uYW1lLDA9PT1kLmluZGV4T2YoImRhdGEtIikmJihkPW0uY2FtZWxDYXNlKGQuc2xpY2UoNSkpLE8oZixkLGVbZF0pKSk7bS5fZGF0YShmLCJwYXJzZWRBdHRycyIsITApfXJldHVybiBlfXJldHVybiJvYmplY3QiPT10eXBlb2YgYT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhKX0pOmFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goZnVuY3Rpb24oKXttLmRhdGEodGhpcyxhLGIpfSk6Zj9PKGYsYSxtLmRhdGEoZixhKSk6dm9pZCAwfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXttLnJlbW92ZURhdGEodGhpcyxhKX0pfX0pLG0uZXh0ZW5kKHtxdWV1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGE/KGI9KGJ8fCJmeCIpKyJxdWV1ZSIsZD1tLl9kYXRhKGEsYiksYyYmKCFkfHxtLmlzQXJyYXkoYyk/ZD1tLl9kYXRhKGEsYixtLm1ha2VBcnJheShjKSk6ZC5wdXNoKGMpKSxkfHxbXSk6dm9pZCAwfSxkZXF1ZXVlOmZ1bmN0aW9uKGEsYil7Yj1ifHwiZngiO3ZhciBjPW0ucXVldWUoYSxiKSxkPWMubGVuZ3RoLGU9Yy5zaGlmdCgpLGY9bS5fcXVldWVIb29rcyhhLGIpLGc9ZnVuY3Rpb24oKXttLmRlcXVldWUoYSxiKX07ImlucHJvZ3Jlc3MiPT09ZSYmKGU9Yy5zaGlmdCgpLGQtLSksZSYmKCJmeCI9PT1iJiZjLnVuc2hpZnQoImlucHJvZ3Jlc3MiKSxkZWxldGUgZi5zdG9wLGUuY2FsbChhLGcsZikpLCFkJiZmJiZmLmVtcHR5LmZpcmUoKX0sX3F1ZXVlSG9va3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz1iKyJxdWV1ZUhvb2tzIjtyZXR1cm4gbS5fZGF0YShhLGMpfHxtLl9kYXRhKGEsYyx7ZW1wdHk6bS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7bS5fcmVtb3ZlRGF0YShhLGIrInF1ZXVlIiksbS5fcmVtb3ZlRGF0YShhLGMpfSl9KX19KSxtLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPSJmeCIsYy0tKSxhcmd1bWVudHMubGVuZ3RoPGM/bS5xdWV1ZSh0aGlzWzBdLGEpOnZvaWQgMD09PWI/dGhpczp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1tLnF1ZXVlKHRoaXMsYSxiKTttLl9xdWV1ZUhvb2tzKHRoaXMsYSksImZ4Ij09PWEmJiJpbnByb2dyZXNzIiE9PWNbMF0mJm0uZGVxdWV1ZSh0aGlzLGEpfSl9LGRlcXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZGVxdWV1ZSh0aGlzLGEpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucXVldWUoYXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPTEsZT1tLkRlZmVycmVkKCksZj10aGlzLGc9dGhpcy5sZW5ndGgsaD1mdW5jdGlvbigpey0tZHx8ZS5yZXNvbHZlV2l0aChmLFtmXSl9OyJzdHJpbmciIT10eXBlb2YgYSYmKGI9YSxhPXZvaWQgMCksYT1hfHwiZngiO3doaWxlKGctLSljPW0uX2RhdGEoZltnXSxhKyJxdWV1ZUhvb2tzIiksYyYmYy5lbXB0eSYmKGQrKyxjLmVtcHR5LmFkZChoKSk7cmV0dXJuIGgoKSxlLnByb21pc2UoYil9fSk7dmFyIFM9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsVD1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFU9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1ifHxhLCJub25lIj09PW0uY3NzKGEsImRpc3BsYXkiKXx8IW0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfSxWPW0uYWNjZXNzPWZ1bmN0aW9uKGEsYixjLGQsZSxmLGcpe3ZhciBoPTAsaT1hLmxlbmd0aCxqPW51bGw9PWM7aWYoIm9iamVjdCI9PT1tLnR5cGUoYykpe2U9ITA7Zm9yKGggaW4gYyltLmFjY2VzcyhhLGIsaCxjW2hdLCEwLGYsZyl9ZWxzZSBpZih2b2lkIDAhPT1kJiYoZT0hMCxtLmlzRnVuY3Rpb24oZCl8fChnPSEwKSxqJiYoZz8oYi5jYWxsKGEsZCksYj1udWxsKTooaj1iLGI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBqLmNhbGwobShhKSxjKX0pKSxiKSlmb3IoO2k+aDtoKyspYihhW2hdLGMsZz9kOmQuY2FsbChhW2hdLGgsYihhW2hdLGMpKSk7cmV0dXJuIGU/YTpqP2IuY2FsbChhKTppP2IoYVswXSxjKTpmfSxXPS9eKD86Y2hlY2tib3h8cmFkaW8pJC9pOyFmdW5jdGlvbigpe3ZhciBhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYz15LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixrLmxlYWRpbmdXaGl0ZXNwYWNlPTM9PT1iLmZpcnN0Q2hpbGQubm9kZVR5cGUsay50Ym9keT0hYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKS5sZW5ndGgsay5odG1sU2VyaWFsaXplPSEhYi5nZXRFbGVtZW50c0J5VGFnTmFtZSgibGluayIpLmxlbmd0aCxrLmh0bWw1Q2xvbmU9Ijw6bmF2PjwvOm5hdj4iIT09eS5jcmVhdGVFbGVtZW50KCJuYXYiKS5jbG9uZU5vZGUoITApLm91dGVySFRNTCxhLnR5cGU9ImNoZWNrYm94IixhLmNoZWNrZWQ9ITAsYy5hcHBlbmRDaGlsZChhKSxrLmFwcGVuZENoZWNrZWQ9YS5jaGVja2VkLGIuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixrLm5vQ2xvbmVDaGVja2VkPSEhYi5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWUsYy5hcHBlbmRDaGlsZChiKSxiLmlubmVySFRNTD0iPGlucHV0IHR5cGU9J3JhZGlvJyBjaGVja2VkPSdjaGVja2VkJyBuYW1lPSd0Jy8+IixrLmNoZWNrQ2xvbmU9Yi5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsay5ub0Nsb25lRXZlbnQ9ITAsYi5hdHRhY2hFdmVudCYmKGIuYXR0YWNoRXZlbnQoIm9uY2xpY2siLGZ1bmN0aW9uKCl7ay5ub0Nsb25lRXZlbnQ9ITF9KSxiLmNsb25lTm9kZSghMCkuY2xpY2soKSksbnVsbD09ay5kZWxldGVFeHBhbmRvKXtrLmRlbGV0ZUV4cGFuZG89ITA7dHJ5e2RlbGV0ZSBiLnRlc3R9Y2F0Y2goZCl7ay5kZWxldGVFeHBhbmRvPSExfX19KCksZnVuY3Rpb24oKXt2YXIgYixjLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKTtmb3IoYiBpbntzdWJtaXQ6ITAsY2hhbmdlOiEwLGZvY3VzaW46ITB9KWM9Im9uIitiLChrW2IrIkJ1YmJsZXMiXT1jIGluIGEpfHwoZC5zZXRBdHRyaWJ1dGUoYywidCIpLGtbYisiQnViYmxlcyJdPWQuYXR0cmlidXRlc1tjXS5leHBhbmRvPT09ITEpO2Q9bnVsbH0oKTt2YXIgWD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYSkkL2ksWT0vXmtleS8sWj0vXig/Om1vdXNlfHBvaW50ZXJ8Y29udGV4dG1lbnUpfGNsaWNrLywkPS9eKD86Zm9jdXNpbmZvY3VzfGZvY3Vzb3V0Ymx1cikkLyxfPS9eKFteLl0qKSg/OlwuKC4rKXwpJC87ZnVuY3Rpb24gYWEoKXtyZXR1cm4hMH1mdW5jdGlvbiBiYSgpe3JldHVybiExfWZ1bmN0aW9uIGNhKCl7dHJ5e3JldHVybiB5LmFjdGl2ZUVsZW1lbnR9Y2F0Y2goYSl7fX1tLmV2ZW50PXtnbG9iYWw6e30sYWRkOmZ1bmN0aW9uKGEsYixjLGQsZSl7dmFyIGYsZyxoLGksaixrLGwsbixvLHAscSxyPW0uX2RhdGEoYSk7aWYocil7Yy5oYW5kbGVyJiYoaT1jLGM9aS5oYW5kbGVyLGU9aS5zZWxlY3RvciksYy5ndWlkfHwoYy5ndWlkPW0uZ3VpZCsrKSwoZz1yLmV2ZW50cyl8fChnPXIuZXZlbnRzPXt9KSwoaz1yLmhhbmRsZSl8fChrPXIuaGFuZGxlPWZ1bmN0aW9uKGEpe3JldHVybiB0eXBlb2YgbT09PUt8fGEmJm0uZXZlbnQudHJpZ2dlcmVkPT09YS50eXBlP3ZvaWQgMDptLmV2ZW50LmRpc3BhdGNoLmFwcGx5KGsuZWxlbSxhcmd1bWVudHMpfSxrLmVsZW09YSksYj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGg9Yi5sZW5ndGg7d2hpbGUoaC0tKWY9Xy5leGVjKGJbaF0pfHxbXSxvPXE9ZlsxXSxwPShmWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyYmKGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxvPShlP2ouZGVsZWdhdGVUeXBlOmouYmluZFR5cGUpfHxvLGo9bS5ldmVudC5zcGVjaWFsW29dfHx7fSxsPW0uZXh0ZW5kKHt0eXBlOm8sb3JpZ1R5cGU6cSxkYXRhOmQsaGFuZGxlcjpjLGd1aWQ6Yy5ndWlkLHNlbGVjdG9yOmUsbmVlZHNDb250ZXh0OmUmJm0uZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdChlKSxuYW1lc3BhY2U6cC5qb2luKCIuIil9LGkpLChuPWdbb10pfHwobj1nW29dPVtdLG4uZGVsZWdhdGVDb3VudD0wLGouc2V0dXAmJmouc2V0dXAuY2FsbChhLGQscCxrKSE9PSExfHwoYS5hZGRFdmVudExpc3RlbmVyP2EuYWRkRXZlbnRMaXN0ZW5lcihvLGssITEpOmEuYXR0YWNoRXZlbnQmJmEuYXR0YWNoRXZlbnQoIm9uIitvLGspKSksai5hZGQmJihqLmFkZC5jYWxsKGEsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1jLmd1aWQpKSxlP24uc3BsaWNlKG4uZGVsZWdhdGVDb3VudCsrLDAsbCk6bi5wdXNoKGwpLG0uZXZlbnQuZ2xvYmFsW29dPSEwKTthPW51bGx9fSxyZW1vdmU6ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZixnLGgsaSxqLGssbCxuLG8scCxxLHI9bS5oYXNEYXRhKGEpJiZtLl9kYXRhKGEpO2lmKHImJihrPXIuZXZlbnRzKSl7Yj0oYnx8IiIpLm1hdGNoKEUpfHxbIiJdLGo9Yi5sZW5ndGg7d2hpbGUoai0tKWlmKGg9Xy5leGVjKGJbal0pfHxbXSxvPXE9aFsxXSxwPShoWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksbyl7bD1tLmV2ZW50LnNwZWNpYWxbb118fHt9LG89KGQ/bC5kZWxlZ2F0ZVR5cGU6bC5iaW5kVHlwZSl8fG8sbj1rW29dfHxbXSxoPWhbMl0mJm5ldyBSZWdFeHAoIihefFxcLikiK3Auam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIiksaT1mPW4ubGVuZ3RoO3doaWxlKGYtLSlnPW5bZl0sIWUmJnEhPT1nLm9yaWdUeXBlfHxjJiZjLmd1aWQhPT1nLmd1aWR8fGgmJiFoLnRlc3QoZy5uYW1lc3BhY2UpfHxkJiZkIT09Zy5zZWxlY3RvciYmKCIqKiIhPT1kfHwhZy5zZWxlY3Rvcil8fChuLnNwbGljZShmLDEpLGcuc2VsZWN0b3ImJm4uZGVsZWdhdGVDb3VudC0tLGwucmVtb3ZlJiZsLnJlbW92ZS5jYWxsKGEsZykpO2kmJiFuLmxlbmd0aCYmKGwudGVhcmRvd24mJmwudGVhcmRvd24uY2FsbChhLHAsci5oYW5kbGUpIT09ITF8fG0ucmVtb3ZlRXZlbnQoYSxvLHIuaGFuZGxlKSxkZWxldGUga1tvXSl9ZWxzZSBmb3IobyBpbiBrKW0uZXZlbnQucmVtb3ZlKGEsbytiW2pdLGMsZCwhMCk7bS5pc0VtcHR5T2JqZWN0KGspJiYoZGVsZXRlIHIuaGFuZGxlLG0uX3JlbW92ZURhdGEoYSwiZXZlbnRzIikpfX0sdHJpZ2dlcjpmdW5jdGlvbihiLGMsZCxlKXt2YXIgZixnLGgsaSxrLGwsbixvPVtkfHx5XSxwPWouY2FsbChiLCJ0eXBlIik/Yi50eXBlOmIscT1qLmNhbGwoYiwibmFtZXNwYWNlIik/Yi5uYW1lc3BhY2Uuc3BsaXQoIi4iKTpbXTtpZihoPWw9ZD1kfHx5LDMhPT1kLm5vZGVUeXBlJiY4IT09ZC5ub2RlVHlwZSYmISQudGVzdChwK20uZXZlbnQudHJpZ2dlcmVkKSYmKHAuaW5kZXhPZigiLiIpPj0wJiYocT1wLnNwbGl0KCIuIikscD1xLnNoaWZ0KCkscS5zb3J0KCkpLGc9cC5pbmRleE9mKCI6Iik8MCYmIm9uIitwLGI9YlttLmV4cGFuZG9dP2I6bmV3IG0uRXZlbnQocCwib2JqZWN0Ij09dHlwZW9mIGImJmIpLGIuaXNUcmlnZ2VyPWU/MjozLGIubmFtZXNwYWNlPXEuam9pbigiLiIpLGIubmFtZXNwYWNlX3JlPWIubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Euam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxiLnJlc3VsdD12b2lkIDAsYi50YXJnZXR8fChiLnRhcmdldD1kKSxjPW51bGw9PWM/W2JdOm0ubWFrZUFycmF5KGMsW2JdKSxrPW0uZXZlbnQuc3BlY2lhbFtwXXx8e30sZXx8IWsudHJpZ2dlcnx8ay50cmlnZ2VyLmFwcGx5KGQsYykhPT0hMSkpe2lmKCFlJiYhay5ub0J1YmJsZSYmIW0uaXNXaW5kb3coZCkpe2ZvcihpPWsuZGVsZWdhdGVUeXBlfHxwLCQudGVzdChpK3ApfHwoaD1oLnBhcmVudE5vZGUpO2g7aD1oLnBhcmVudE5vZGUpby5wdXNoKGgpLGw9aDtsPT09KGQub3duZXJEb2N1bWVudHx8eSkmJm8ucHVzaChsLmRlZmF1bHRWaWV3fHxsLnBhcmVudFdpbmRvd3x8YSl9bj0wO3doaWxlKChoPW9bbisrXSkmJiFiLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYi50eXBlPW4+MT9pOmsuYmluZFR5cGV8fHAsZj0obS5fZGF0YShoLCJldmVudHMiKXx8e30pW2IudHlwZV0mJm0uX2RhdGEoaCwiaGFuZGxlIiksZiYmZi5hcHBseShoLGMpLGY9ZyYmaFtnXSxmJiZmLmFwcGx5JiZtLmFjY2VwdERhdGEoaCkmJihiLnJlc3VsdD1mLmFwcGx5KGgsYyksYi5yZXN1bHQ9PT0hMSYmYi5wcmV2ZW50RGVmYXVsdCgpKTtpZihiLnR5cGU9cCwhZSYmIWIuaXNEZWZhdWx0UHJldmVudGVkKCkmJighay5fZGVmYXVsdHx8ay5fZGVmYXVsdC5hcHBseShvLnBvcCgpLGMpPT09ITEpJiZtLmFjY2VwdERhdGEoZCkmJmcmJmRbcF0mJiFtLmlzV2luZG93KGQpKXtsPWRbZ10sbCYmKGRbZ109bnVsbCksbS5ldmVudC50cmlnZ2VyZWQ9cDt0cnl7ZFtwXSgpfWNhdGNoKHIpe31tLmV2ZW50LnRyaWdnZXJlZD12b2lkIDAsbCYmKGRbZ109bCl9cmV0dXJuIGIucmVzdWx0fX0sZGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YT1tLmV2ZW50LmZpeChhKTt2YXIgYixjLGUsZixnLGg9W10saT1kLmNhbGwoYXJndW1lbnRzKSxqPShtLl9kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbYS50eXBlXXx8W10saz1tLmV2ZW50LnNwZWNpYWxbYS50eXBlXXx8e307aWYoaVswXT1hLGEuZGVsZWdhdGVUYXJnZXQ9dGhpcywhay5wcmVEaXNwYXRjaHx8ay5wcmVEaXNwYXRjaC5jYWxsKHRoaXMsYSkhPT0hMSl7aD1tLmV2ZW50LmhhbmRsZXJzLmNhbGwodGhpcyxhLGopLGI9MDt3aGlsZSgoZj1oW2IrK10pJiYhYS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKXthLmN1cnJlbnRUYXJnZXQ9Zi5lbGVtLGc9MDt3aGlsZSgoZT1mLmhhbmRsZXJzW2crK10pJiYhYS5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpKSghYS5uYW1lc3BhY2VfcmV8fGEubmFtZXNwYWNlX3JlLnRlc3QoZS5uYW1lc3BhY2UpKSYmKGEuaGFuZGxlT2JqPWUsYS5kYXRhPWUuZGF0YSxjPSgobS5ldmVudC5zcGVjaWFsW2Uub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxlLmhhbmRsZXIpLmFwcGx5KGYuZWxlbSxpKSx2b2lkIDAhPT1jJiYoYS5yZXN1bHQ9Yyk9PT0hMSYmKGEucHJldmVudERlZmF1bHQoKSxhLnN0b3BQcm9wYWdhdGlvbigpKSl9cmV0dXJuIGsucG9zdERpc3BhdGNoJiZrLnBvc3REaXNwYXRjaC5jYWxsKHRoaXMsYSksYS5yZXN1bHR9fSxoYW5kbGVyczpmdW5jdGlvbihhLGIpe3ZhciBjLGQsZSxmLGc9W10saD1iLmRlbGVnYXRlQ291bnQsaT1hLnRhcmdldDtpZihoJiZpLm5vZGVUeXBlJiYoIWEuYnV0dG9ufHwiY2xpY2siIT09YS50eXBlKSlmb3IoO2khPXRoaXM7aT1pLnBhcmVudE5vZGV8fHRoaXMpaWYoMT09PWkubm9kZVR5cGUmJihpLmRpc2FibGVkIT09ITB8fCJjbGljayIhPT1hLnR5cGUpKXtmb3IoZT1bXSxmPTA7aD5mO2YrKylkPWJbZl0sYz1kLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1lW2NdJiYoZVtjXT1kLm5lZWRzQ29udGV4dD9tKGMsdGhpcykuaW5kZXgoaSk+PTA6bS5maW5kKGMsdGhpcyxudWxsLFtpXSkubGVuZ3RoKSxlW2NdJiZlLnB1c2goZCk7ZS5sZW5ndGgmJmcucHVzaCh7ZWxlbTppLGhhbmRsZXJzOmV9KX1yZXR1cm4gaDxiLmxlbmd0aCYmZy5wdXNoKHtlbGVtOnRoaXMsaGFuZGxlcnM6Yi5zbGljZShoKX0pLGd9LGZpeDpmdW5jdGlvbihhKXtpZihhW20uZXhwYW5kb10pcmV0dXJuIGE7dmFyIGIsYyxkLGU9YS50eXBlLGY9YSxnPXRoaXMuZml4SG9va3NbZV07Z3x8KHRoaXMuZml4SG9va3NbZV09Zz1aLnRlc3QoZSk/dGhpcy5tb3VzZUhvb2tzOlkudGVzdChlKT90aGlzLmtleUhvb2tzOnt9KSxkPWcucHJvcHM/dGhpcy5wcm9wcy5jb25jYXQoZy5wcm9wcyk6dGhpcy5wcm9wcyxhPW5ldyBtLkV2ZW50KGYpLGI9ZC5sZW5ndGg7d2hpbGUoYi0tKWM9ZFtiXSxhW2NdPWZbY107cmV0dXJuIGEudGFyZ2V0fHwoYS50YXJnZXQ9Zi5zcmNFbGVtZW50fHx5KSwzPT09YS50YXJnZXQubm9kZVR5cGUmJihhLnRhcmdldD1hLnRhcmdldC5wYXJlbnROb2RlKSxhLm1ldGFLZXk9ISFhLm1ldGFLZXksZy5maWx0ZXI/Zy5maWx0ZXIoYSxmKTphfSxwcm9wczoiYWx0S2V5IGJ1YmJsZXMgY2FuY2VsYWJsZSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZXZlbnRQaGFzZSBtZXRhS2V5IHJlbGF0ZWRUYXJnZXQgc2hpZnRLZXkgdGFyZ2V0IHRpbWVTdGFtcCB2aWV3IHdoaWNoIi5zcGxpdCgiICIpLGZpeEhvb2tzOnt9LGtleUhvb2tzOntwcm9wczoiY2hhciBjaGFyQ29kZSBrZXkga2V5Q29kZSIuc3BsaXQoIiAiKSxmaWx0ZXI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gbnVsbD09YS53aGljaCYmKGEud2hpY2g9bnVsbCE9Yi5jaGFyQ29kZT9iLmNoYXJDb2RlOmIua2V5Q29kZSksYX19LG1vdXNlSG9va3M6e3Byb3BzOiJidXR0b24gYnV0dG9ucyBjbGllbnRYIGNsaWVudFkgZnJvbUVsZW1lbnQgb2Zmc2V0WCBvZmZzZXRZIHBhZ2VYIHBhZ2VZIHNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnQiLnNwbGl0KCIgIiksZmlsdGVyOmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlLGY9Yi5idXR0b24sZz1iLmZyb21FbGVtZW50O3JldHVybiBudWxsPT1hLnBhZ2VYJiZudWxsIT1iLmNsaWVudFgmJihkPWEudGFyZ2V0Lm93bmVyRG9jdW1lbnR8fHksZT1kLmRvY3VtZW50RWxlbWVudCxjPWQuYm9keSxhLnBhZ2VYPWIuY2xpZW50WCsoZSYmZS5zY3JvbGxMZWZ0fHxjJiZjLnNjcm9sbExlZnR8fDApLShlJiZlLmNsaWVudExlZnR8fGMmJmMuY2xpZW50TGVmdHx8MCksYS5wYWdlWT1iLmNsaWVudFkrKGUmJmUuc2Nyb2xsVG9wfHxjJiZjLnNjcm9sbFRvcHx8MCktKGUmJmUuY2xpZW50VG9wfHxjJiZjLmNsaWVudFRvcHx8MCkpLCFhLnJlbGF0ZWRUYXJnZXQmJmcmJihhLnJlbGF0ZWRUYXJnZXQ9Zz09PWEudGFyZ2V0P2IudG9FbGVtZW50OmcpLGEud2hpY2h8fHZvaWQgMD09PWZ8fChhLndoaWNoPTEmZj8xOjImZj8zOjQmZj8yOjApLGF9fSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09Y2EoKSYmdGhpcy5mb2N1cyl0cnl7cmV0dXJuIHRoaXMuZm9jdXMoKSwhMX1jYXRjaChhKXt9fSxkZWxlZ2F0ZVR5cGU6ImZvY3VzaW4ifSxibHVyOnt0cmlnZ2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXM9PT1jYSgpJiZ0aGlzLmJsdXI/KHRoaXMuYmx1cigpLCExKTp2b2lkIDB9LGRlbGVnYXRlVHlwZToiZm9jdXNvdXQifSxjbGljazp7dHJpZ2dlcjpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImlucHV0IikmJiJjaGVja2JveCI9PT10aGlzLnR5cGUmJnRoaXMuY2xpY2s/KHRoaXMuY2xpY2soKSwhMSk6dm9pZCAwfSxfZGVmYXVsdDpmdW5jdGlvbihhKXtyZXR1cm4gbS5ub2RlTmFtZShhLnRhcmdldCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7dm9pZCAwIT09YS5yZXN1bHQmJmEub3JpZ2luYWxFdmVudCYmKGEub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1hLnJlc3VsdCl9fX0sc2ltdWxhdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5leHRlbmQobmV3IG0uRXZlbnQsYyx7dHlwZTphLGlzU2ltdWxhdGVkOiEwLG9yaWdpbmFsRXZlbnQ6e319KTtkP20uZXZlbnQudHJpZ2dlcihlLG51bGwsYik6bS5ldmVudC5kaXNwYXRjaC5jYWxsKGIsZSksZS5pc0RlZmF1bHRQcmV2ZW50ZWQoKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sbS5yZW1vdmVFdmVudD15LnJlbW92ZUV2ZW50TGlzdGVuZXI/ZnVuY3Rpb24oYSxiLGMpe2EucmVtb3ZlRXZlbnRMaXN0ZW5lciYmYS5yZW1vdmVFdmVudExpc3RlbmVyKGIsYywhMSl9OmZ1bmN0aW9uKGEsYixjKXt2YXIgZD0ib24iK2I7YS5kZXRhY2hFdmVudCYmKHR5cGVvZiBhW2RdPT09SyYmKGFbZF09bnVsbCksYS5kZXRhY2hFdmVudChkLGMpKX0sbS5FdmVudD1mdW5jdGlvbihhLGIpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgbS5FdmVudD8oYSYmYS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9YSx0aGlzLnR5cGU9YS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09YS5kZWZhdWx0UHJldmVudGVkJiZhLnJldHVyblZhbHVlPT09ITE/YWE6YmEpOnRoaXMudHlwZT1hLGImJm0uZXh0ZW5kKHRoaXMsYiksdGhpcy50aW1lU3RhbXA9YSYmYS50aW1lU3RhbXB8fG0ubm93KCksdm9pZCh0aGlzW20uZXhwYW5kb109ITApKTpuZXcgbS5FdmVudChhLGIpfSxtLkV2ZW50LnByb3RvdHlwZT17aXNEZWZhdWx0UHJldmVudGVkOmJhLGlzUHJvcGFnYXRpb25TdG9wcGVkOmJhLGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOmJhLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWFhLGEmJihhLnByZXZlbnREZWZhdWx0P2EucHJldmVudERlZmF1bHQoKTphLnJldHVyblZhbHVlPSExKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmKGEuc3RvcFByb3BhZ2F0aW9uJiZhLnN0b3BQcm9wYWdhdGlvbigpLGEuY2FuY2VsQnViYmxlPSEwKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9YWEsYSYmYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24mJmEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LG0uZWFjaCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCIscG9pbnRlcmVudGVyOiJwb2ludGVyb3ZlciIscG9pbnRlcmxlYXZlOiJwb2ludGVyb3V0In0sZnVuY3Rpb24oYSxiKXttLmV2ZW50LnNwZWNpYWxbYV09e2RlbGVnYXRlVHlwZTpiLGJpbmRUeXBlOmIsaGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBjLGQ9dGhpcyxlPWEucmVsYXRlZFRhcmdldCxmPWEuaGFuZGxlT2JqO3JldHVybighZXx8ZSE9PWQmJiFtLmNvbnRhaW5zKGQsZSkpJiYoYS50eXBlPWYub3JpZ1R5cGUsYz1mLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGEudHlwZT1iKSxjfX19KSxrLnN1Ym1pdEJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuc3VibWl0PXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBtLm5vZGVOYW1lKHRoaXMsImZvcm0iKT8hMTp2b2lkIG0uZXZlbnQuYWRkKHRoaXMsImNsaWNrLl9zdWJtaXQga2V5cHJlc3MuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7dmFyIGI9YS50YXJnZXQsYz1tLm5vZGVOYW1lKGIsImlucHV0Iil8fG0ubm9kZU5hbWUoYiwiYnV0dG9uIik/Yi5mb3JtOnZvaWQgMDtjJiYhbS5fZGF0YShjLCJzdWJtaXRCdWJibGVzIikmJihtLmV2ZW50LmFkZChjLCJzdWJtaXQuX3N1Ym1pdCIsZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZT0hMH0pLG0uX2RhdGEoYywic3VibWl0QnViYmxlcyIsITApKX0pfSxwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oYSl7YS5fc3VibWl0X2J1YmJsZSYmKGRlbGV0ZSBhLl9zdWJtaXRfYnViYmxlLHRoaXMucGFyZW50Tm9kZSYmIWEuaXNUcmlnZ2VyJiZtLmV2ZW50LnNpbXVsYXRlKCJzdWJtaXQiLHRoaXMucGFyZW50Tm9kZSxhLCEwKSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7cmV0dXJuIG0ubm9kZU5hbWUodGhpcywiZm9ybSIpPyExOnZvaWQgbS5ldmVudC5yZW1vdmUodGhpcywiLl9zdWJtaXQiKX19KSxrLmNoYW5nZUJ1YmJsZXN8fChtLmV2ZW50LnNwZWNpYWwuY2hhbmdlPXtzZXR1cDpmdW5jdGlvbigpe3JldHVybiBYLnRlc3QodGhpcy5ub2RlTmFtZSk/KCgiY2hlY2tib3giPT09dGhpcy50eXBlfHwicmFkaW8iPT09dGhpcy50eXBlKSYmKG0uZXZlbnQuYWRkKHRoaXMsInByb3BlcnR5Y2hhbmdlLl9jaGFuZ2UiLGZ1bmN0aW9uKGEpeyJjaGVja2VkIj09PWEub3JpZ2luYWxFdmVudC5wcm9wZXJ0eU5hbWUmJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITApfSksbS5ldmVudC5hZGQodGhpcywiY2xpY2suX2NoYW5nZSIsZnVuY3Rpb24oYSl7dGhpcy5fanVzdF9jaGFuZ2VkJiYhYS5pc1RyaWdnZXImJih0aGlzLl9qdXN0X2NoYW5nZWQ9ITEpLG0uZXZlbnQuc2ltdWxhdGUoImNoYW5nZSIsdGhpcyxhLCEwKX0pKSwhMSk6dm9pZCBtLmV2ZW50LmFkZCh0aGlzLCJiZWZvcmVhY3RpdmF0ZS5fY2hhbmdlIixmdW5jdGlvbihhKXt2YXIgYj1hLnRhcmdldDtYLnRlc3QoYi5ub2RlTmFtZSkmJiFtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiKSYmKG0uZXZlbnQuYWRkKGIsImNoYW5nZS5fY2hhbmdlIixmdW5jdGlvbihhKXshdGhpcy5wYXJlbnROb2RlfHxhLmlzU2ltdWxhdGVkfHxhLmlzVHJpZ2dlcnx8bS5ldmVudC5zaW11bGF0ZSgiY2hhbmdlIix0aGlzLnBhcmVudE5vZGUsYSwhMCl9KSxtLl9kYXRhKGIsImNoYW5nZUJ1YmJsZXMiLCEwKSl9KX0saGFuZGxlOmZ1bmN0aW9uKGEpe3ZhciBiPWEudGFyZ2V0O3JldHVybiB0aGlzIT09Ynx8YS5pc1NpbXVsYXRlZHx8YS5pc1RyaWdnZXJ8fCJyYWRpbyIhPT1iLnR5cGUmJiJjaGVja2JveCIhPT1iLnR5cGU/YS5oYW5kbGVPYmouaGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dm9pZCAwfSx0ZWFyZG93bjpmdW5jdGlvbigpe3JldHVybiBtLmV2ZW50LnJlbW92ZSh0aGlzLCIuX2NoYW5nZSIpLCFYLnRlc3QodGhpcy5ub2RlTmFtZSl9fSksay5mb2N1c2luQnViYmxlc3x8bS5lYWNoKHtmb2N1czoiZm9jdXNpbiIsYmx1cjoiZm9jdXNvdXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPWZ1bmN0aW9uKGEpe20uZXZlbnQuc2ltdWxhdGUoYixhLnRhcmdldCxtLmV2ZW50LmZpeChhKSwhMCl9O20uZXZlbnQuc3BlY2lhbFtiXT17c2V0dXA6ZnVuY3Rpb24oKXt2YXIgZD10aGlzLm93bmVyRG9jdW1lbnR8fHRoaXMsZT1tLl9kYXRhKGQsYik7ZXx8ZC5hZGRFdmVudExpc3RlbmVyKGEsYywhMCksbS5fZGF0YShkLGIsKGV8fDApKzEpfSx0ZWFyZG93bjpmdW5jdGlvbigpe3ZhciBkPXRoaXMub3duZXJEb2N1bWVudHx8dGhpcyxlPW0uX2RhdGEoZCxiKS0xO2U/bS5fZGF0YShkLGIsZSk6KGQucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGMsITApLG0uX3JlbW92ZURhdGEoZCxiKSl9fX0pLG0uZm4uZXh0ZW5kKHtvbjpmdW5jdGlvbihhLGIsYyxkLGUpe3ZhciBmLGc7aWYoIm9iamVjdCI9PXR5cGVvZiBhKXsic3RyaW5nIiE9dHlwZW9mIGImJihjPWN8fGIsYj12b2lkIDApO2ZvcihmIGluIGEpdGhpcy5vbihmLGIsYyxhW2ZdLGUpO3JldHVybiB0aGlzfWlmKG51bGw9PWMmJm51bGw9PWQ/KGQ9YixjPWI9dm9pZCAwKTpudWxsPT1kJiYoInN0cmluZyI9PXR5cGVvZiBiPyhkPWMsYz12b2lkIDApOihkPWMsYz1iLGI9dm9pZCAwKSksZD09PSExKWQ9YmE7ZWxzZSBpZighZClyZXR1cm4gdGhpcztyZXR1cm4gMT09PWUmJihnPWQsZD1mdW5jdGlvbihhKXtyZXR1cm4gbSgpLm9mZihhKSxnLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5ndWlkPWcuZ3VpZHx8KGcuZ3VpZD1tLmd1aWQrKykpLHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQuYWRkKHRoaXMsYSxkLGMsYil9KX0sb25lOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGEsYixjLGQsMSl9LG9mZjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZTtpZihhJiZhLnByZXZlbnREZWZhdWx0JiZhLmhhbmRsZU9iailyZXR1cm4gZD1hLmhhbmRsZU9iaixtKGEuZGVsZWdhdGVUYXJnZXQpLm9mZihkLm5hbWVzcGFjZT9kLm9yaWdUeXBlKyIuIitkLm5hbWVzcGFjZTpkLm9yaWdUeXBlLGQuc2VsZWN0b3IsZC5oYW5kbGVyKSx0aGlzO2lmKCJvYmplY3QiPT10eXBlb2YgYSl7Zm9yKGUgaW4gYSl0aGlzLm9mZihlLGIsYVtlXSk7cmV0dXJuIHRoaXN9cmV0dXJuKGI9PT0hMXx8ImZ1bmN0aW9uIj09dHlwZW9mIGIpJiYoYz1iLGI9dm9pZCAwKSxjPT09ITEmJihjPWJhKSx0aGlzLmVhY2goZnVuY3Rpb24oKXttLmV2ZW50LnJlbW92ZSh0aGlzLGEsYyxiKX0pfSx0cmlnZ2VyOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe20uZXZlbnQudHJpZ2dlcihhLGIsdGhpcyl9KX0sdHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzWzBdO3JldHVybiBjP20uZXZlbnQudHJpZ2dlcihhLGIsYywhMCk6dm9pZCAwfX0pO2Z1bmN0aW9uIGRhKGEpe3ZhciBiPWVhLnNwbGl0KCJ8IiksYz1hLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtpZihjLmNyZWF0ZUVsZW1lbnQpd2hpbGUoYi5sZW5ndGgpYy5jcmVhdGVFbGVtZW50KGIucG9wKCkpO3JldHVybiBjfXZhciBlYT0iYWJicnxhcnRpY2xlfGFzaWRlfGF1ZGlvfGJkaXxjYW52YXN8ZGF0YXxkYXRhbGlzdHxkZXRhaWxzfGZpZ2NhcHRpb258ZmlndXJlfGZvb3RlcnxoZWFkZXJ8aGdyb3VwfG1hcmt8bWV0ZXJ8bmF2fG91dHB1dHxwcm9ncmVzc3xzZWN0aW9ufHN1bW1hcnl8dGltZXx2aWRlbyIsZmE9LyBqUXVlcnlcZCs9Iig/Om51bGx8XGQrKSIvZyxnYT1uZXcgUmVnRXhwKCI8KD86IitlYSsiKVtcXHMvPl0iLCJpIiksaGE9L15ccysvLGlhPS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFtcdzpdKylbXj5dKilcLz4vZ2ksamE9LzwoW1x3Ol0rKS8sa2E9Lzx0Ym9keS9pLGxhPS88fCYjP1x3KzsvLG1hPS88KD86c2NyaXB0fHN0eWxlfGxpbmspL2ksbmE9L2NoZWNrZWRccyooPzpbXj1dfD1ccyouY2hlY2tlZC4pL2ksb2E9L14kfFwvKD86amF2YXxlY21hKXNjcmlwdC9pLHBhPS9edHJ1ZVwvKC4qKS8scWE9L15ccyo8ISg/OlxbQ0RBVEFcW3wtLSl8KD86XF1cXXwtLSk+XHMqJC9nLHJhPXtvcHRpb246WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0scGFyYW06WzEsIjxvYmplY3Q+IiwiPC9vYmplY3Q+Il0sdGhlYWQ6WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRkOlszLCI8dGFibGU+PHRib2R5Pjx0cj4iLCI8L3RyPjwvdGJvZHk+PC90YWJsZT4iXSxfZGVmYXVsdDprLmh0bWxTZXJpYWxpemU/WzAsIiIsIiJdOlsxLCJYPGRpdj4iLCI8L2Rpdj4iXX0sc2E9ZGEoeSksdGE9c2EuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSk7cmEub3B0Z3JvdXA9cmEub3B0aW9uLHJhLnRib2R5PXJhLnRmb290PXJhLmNvbGdyb3VwPXJhLmNhcHRpb249cmEudGhlYWQscmEudGg9cmEudGQ7ZnVuY3Rpb24gdWEoYSxiKXt2YXIgYyxkLGU9MCxmPXR5cGVvZiBhLmdldEVsZW1lbnRzQnlUYWdOYW1lIT09Sz9hLmdldEVsZW1lbnRzQnlUYWdOYW1lKGJ8fCIqIik6dHlwZW9mIGEucXVlcnlTZWxlY3RvckFsbCE9PUs/YS5xdWVyeVNlbGVjdG9yQWxsKGJ8fCIqIik6dm9pZCAwO2lmKCFmKWZvcihmPVtdLGM9YS5jaGlsZE5vZGVzfHxhO251bGwhPShkPWNbZV0pO2UrKykhYnx8bS5ub2RlTmFtZShkLGIpP2YucHVzaChkKTptLm1lcmdlKGYsdWEoZCxiKSk7cmV0dXJuIHZvaWQgMD09PWJ8fGImJm0ubm9kZU5hbWUoYSxiKT9tLm1lcmdlKFthXSxmKTpmfWZ1bmN0aW9uIHZhKGEpe1cudGVzdChhLnR5cGUpJiYoYS5kZWZhdWx0Q2hlY2tlZD1hLmNoZWNrZWQpfWZ1bmN0aW9uIHdhKGEsYil7cmV0dXJuIG0ubm9kZU5hbWUoYSwidGFibGUiKSYmbS5ub2RlTmFtZSgxMSE9PWIubm9kZVR5cGU/YjpiLmZpcnN0Q2hpbGQsInRyIik/YS5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGJvZHkiKVswXXx8YS5hcHBlbmRDaGlsZChhLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGJvZHkiKSk6YX1mdW5jdGlvbiB4YShhKXtyZXR1cm4gYS50eXBlPShudWxsIT09bS5maW5kLmF0dHIoYSwidHlwZSIpKSsiLyIrYS50eXBlLGF9ZnVuY3Rpb24geWEoYSl7dmFyIGI9cGEuZXhlYyhhLnR5cGUpO3JldHVybiBiP2EudHlwZT1iWzFdOmEucmVtb3ZlQXR0cmlidXRlKCJ0eXBlIiksYX1mdW5jdGlvbiB6YShhLGIpe2Zvcih2YXIgYyxkPTA7bnVsbCE9KGM9YVtkXSk7ZCsrKW0uX2RhdGEoYywiZ2xvYmFsRXZhbCIsIWJ8fG0uX2RhdGEoYltkXSwiZ2xvYmFsRXZhbCIpKX1mdW5jdGlvbiBBYShhLGIpe2lmKDE9PT1iLm5vZGVUeXBlJiZtLmhhc0RhdGEoYSkpe3ZhciBjLGQsZSxmPW0uX2RhdGEoYSksZz1tLl9kYXRhKGIsZiksaD1mLmV2ZW50cztpZihoKXtkZWxldGUgZy5oYW5kbGUsZy5ldmVudHM9e307Zm9yKGMgaW4gaClmb3IoZD0wLGU9aFtjXS5sZW5ndGg7ZT5kO2QrKyltLmV2ZW50LmFkZChiLGMsaFtjXVtkXSl9Zy5kYXRhJiYoZy5kYXRhPW0uZXh0ZW5kKHt9LGcuZGF0YSkpfX1mdW5jdGlvbiBCYShhLGIpe3ZhciBjLGQsZTtpZigxPT09Yi5ub2RlVHlwZSl7aWYoYz1iLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIWsubm9DbG9uZUV2ZW50JiZiW20uZXhwYW5kb10pe2U9bS5fZGF0YShiKTtmb3IoZCBpbiBlLmV2ZW50cyltLnJlbW92ZUV2ZW50KGIsZCxlLmhhbmRsZSk7Yi5yZW1vdmVBdHRyaWJ1dGUobS5leHBhbmRvKX0ic2NyaXB0Ij09PWMmJmIudGV4dCE9PWEudGV4dD8oeGEoYikudGV4dD1hLnRleHQseWEoYikpOiJvYmplY3QiPT09Yz8oYi5wYXJlbnROb2RlJiYoYi5vdXRlckhUTUw9YS5vdXRlckhUTUwpLGsuaHRtbDVDbG9uZSYmYS5pbm5lckhUTUwmJiFtLnRyaW0oYi5pbm5lckhUTUwpJiYoYi5pbm5lckhUTUw9YS5pbm5lckhUTUwpKToiaW5wdXQiPT09YyYmVy50ZXN0KGEudHlwZSk/KGIuZGVmYXVsdENoZWNrZWQ9Yi5jaGVja2VkPWEuY2hlY2tlZCxiLnZhbHVlIT09YS52YWx1ZSYmKGIudmFsdWU9YS52YWx1ZSkpOiJvcHRpb24iPT09Yz9iLmRlZmF1bHRTZWxlY3RlZD1iLnNlbGVjdGVkPWEuZGVmYXVsdFNlbGVjdGVkOigiaW5wdXQiPT09Y3x8InRleHRhcmVhIj09PWMpJiYoYi5kZWZhdWx0VmFsdWU9YS5kZWZhdWx0VmFsdWUpfX1tLmV4dGVuZCh7Y2xvbmU6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnLGgsaT1tLmNvbnRhaW5zKGEub3duZXJEb2N1bWVudCxhKTtpZihrLmh0bWw1Q2xvbmV8fG0uaXNYTUxEb2MoYSl8fCFnYS50ZXN0KCI8IithLm5vZGVOYW1lKyI+Iik/Zj1hLmNsb25lTm9kZSghMCk6KHRhLmlubmVySFRNTD1hLm91dGVySFRNTCx0YS5yZW1vdmVDaGlsZChmPXRhLmZpcnN0Q2hpbGQpKSwhKGsubm9DbG9uZUV2ZW50JiZrLm5vQ2xvbmVDaGVja2VkfHwxIT09YS5ub2RlVHlwZSYmMTEhPT1hLm5vZGVUeXBlfHxtLmlzWE1MRG9jKGEpKSlmb3IoZD11YShmKSxoPXVhKGEpLGc9MDtudWxsIT0oZT1oW2ddKTsrK2cpZFtnXSYmQmEoZSxkW2ddKTtpZihiKWlmKGMpZm9yKGg9aHx8dWEoYSksZD1kfHx1YShmKSxnPTA7bnVsbCE9KGU9aFtnXSk7ZysrKUFhKGUsZFtnXSk7ZWxzZSBBYShhLGYpO3JldHVybiBkPXVhKGYsInNjcmlwdCIpLGQubGVuZ3RoPjAmJnphKGQsIWkmJnVhKGEsInNjcmlwdCIpKSxkPWg9ZT1udWxsLGZ9LGJ1aWxkRnJhZ21lbnQ6ZnVuY3Rpb24oYSxiLGMsZCl7Zm9yKHZhciBlLGYsZyxoLGksaixsLG49YS5sZW5ndGgsbz1kYShiKSxwPVtdLHE9MDtuPnE7cSsrKWlmKGY9YVtxXSxmfHwwPT09ZilpZigib2JqZWN0Ij09PW0udHlwZShmKSltLm1lcmdlKHAsZi5ub2RlVHlwZT9bZl06Zik7ZWxzZSBpZihsYS50ZXN0KGYpKXtoPWh8fG8uYXBwZW5kQ2hpbGQoYi5jcmVhdGVFbGVtZW50KCJkaXYiKSksaT0oamEuZXhlYyhmKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxsPXJhW2ldfHxyYS5fZGVmYXVsdCxoLmlubmVySFRNTD1sWzFdK2YucmVwbGFjZShpYSwiPCQxPjwvJDI+IikrbFsyXSxlPWxbMF07d2hpbGUoZS0tKWg9aC5sYXN0Q2hpbGQ7aWYoIWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoZikmJnAucHVzaChiLmNyZWF0ZVRleHROb2RlKGhhLmV4ZWMoZilbMF0pKSwhay50Ym9keSl7Zj0idGFibGUiIT09aXx8a2EudGVzdChmKT8iPHRhYmxlPiIhPT1sWzFdfHxrYS50ZXN0KGYpPzA6aDpoLmZpcnN0Q2hpbGQsZT1mJiZmLmNoaWxkTm9kZXMubGVuZ3RoO3doaWxlKGUtLSltLm5vZGVOYW1lKGo9Zi5jaGlsZE5vZGVzW2VdLCJ0Ym9keSIpJiYhai5jaGlsZE5vZGVzLmxlbmd0aCYmZi5yZW1vdmVDaGlsZChqKX1tLm1lcmdlKHAsaC5jaGlsZE5vZGVzKSxoLnRleHRDb250ZW50PSIiO3doaWxlKGguZmlyc3RDaGlsZCloLnJlbW92ZUNoaWxkKGguZmlyc3RDaGlsZCk7aD1vLmxhc3RDaGlsZH1lbHNlIHAucHVzaChiLmNyZWF0ZVRleHROb2RlKGYpKTtoJiZvLnJlbW92ZUNoaWxkKGgpLGsuYXBwZW5kQ2hlY2tlZHx8bS5ncmVwKHVhKHAsImlucHV0IiksdmEpLHE9MDt3aGlsZShmPXBbcSsrXSlpZigoIWR8fC0xPT09bS5pbkFycmF5KGYsZCkpJiYoZz1tLmNvbnRhaW5zKGYub3duZXJEb2N1bWVudCxmKSxoPXVhKG8uYXBwZW5kQ2hpbGQoZiksInNjcmlwdCIpLGcmJnphKGgpLGMpKXtlPTA7d2hpbGUoZj1oW2UrK10pb2EudGVzdChmLnR5cGV8fCIiKSYmYy5wdXNoKGYpfXJldHVybiBoPW51bGwsb30sY2xlYW5EYXRhOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBkLGUsZixnLGg9MCxpPW0uZXhwYW5kbyxqPW0uY2FjaGUsbD1rLmRlbGV0ZUV4cGFuZG8sbj1tLmV2ZW50LnNwZWNpYWw7bnVsbCE9KGQ9YVtoXSk7aCsrKWlmKChifHxtLmFjY2VwdERhdGEoZCkpJiYoZj1kW2ldLGc9ZiYmaltmXSkpe2lmKGcuZXZlbnRzKWZvcihlIGluIGcuZXZlbnRzKW5bZV0/bS5ldmVudC5yZW1vdmUoZCxlKTptLnJlbW92ZUV2ZW50KGQsZSxnLmhhbmRsZSk7altmXSYmKGRlbGV0ZSBqW2ZdLGw/ZGVsZXRlIGRbaV06dHlwZW9mIGQucmVtb3ZlQXR0cmlidXRlIT09Sz9kLnJlbW92ZUF0dHJpYnV0ZShpKTpkW2ldPW51bGwsYy5wdXNoKGYpKX19fSksbS5mbi5leHRlbmQoe3RleHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gdm9pZCAwPT09YT9tLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRvY3VtZW50fHx5KS5jcmVhdGVUZXh0Tm9kZShhKSl9LG51bGwsYSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLGZ1bmN0aW9uKGEpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgYj13YSh0aGlzLGEpO2IuYXBwZW5kQ2hpbGQoYSl9fSl9LHByZXBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciBiPXdhKHRoaXMsYSk7Yi5pbnNlcnRCZWZvcmUoYSxiLmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcyl9KX0sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGEsdGhpcy5uZXh0U2libGluZyl9KX0scmVtb3ZlOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjLGQ9YT9tLmZpbHRlcihhLHRoaXMpOnRoaXMsZT0wO251bGwhPShjPWRbZV0pO2UrKylifHwxIT09Yy5ub2RlVHlwZXx8bS5jbGVhbkRhdGEodWEoYykpLGMucGFyZW50Tm9kZSYmKGImJm0uY29udGFpbnMoYy5vd25lckRvY3VtZW50LGMpJiZ6YSh1YShjLCJzY3JpcHQiKSksYy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGMpKTtyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGEsYj0wO251bGwhPShhPXRoaXNbYl0pO2IrKyl7MT09PWEubm9kZVR5cGUmJm0uY2xlYW5EYXRhKHVhKGEsITEpKTt3aGlsZShhLmZpcnN0Q2hpbGQpYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Eub3B0aW9ucyYmbS5ub2RlTmFtZShhLCJzZWxlY3QiKSYmKGEub3B0aW9ucy5sZW5ndGg9MCl9cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGEsYil7cmV0dXJuIGE9bnVsbD09YT8hMTphLGI9bnVsbD09Yj9hOmIsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gbS5jbG9uZSh0aGlzLGEsYil9KX0saHRtbDpmdW5jdGlvbihhKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEpe3ZhciBiPXRoaXNbMF18fHt9LGM9MCxkPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWEpcmV0dXJuIDE9PT1iLm5vZGVUeXBlP2IuaW5uZXJIVE1MLnJlcGxhY2UoZmEsIiIpOnZvaWQgMDtpZighKCJzdHJpbmciIT10eXBlb2YgYXx8bWEudGVzdChhKXx8IWsuaHRtbFNlcmlhbGl6ZSYmZ2EudGVzdChhKXx8IWsubGVhZGluZ1doaXRlc3BhY2UmJmhhLnRlc3QoYSl8fHJhWyhqYS5leGVjKGEpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpXSkpe2E9YS5yZXBsYWNlKGlhLCI8JDE+PC8kMj4iKTt0cnl7Zm9yKDtkPmM7YysrKWI9dGhpc1tjXXx8e30sMT09PWIubm9kZVR5cGUmJihtLmNsZWFuRGF0YSh1YShiLCExKSksYi5pbm5lckhUTUw9YSk7Yj0wfWNhdGNoKGUpe319YiYmdGhpcy5lbXB0eSgpLmFwcGVuZChhKX0sbnVsbCxhLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBhPWFyZ3VtZW50c1swXTtyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsZnVuY3Rpb24oYil7YT10aGlzLnBhcmVudE5vZGUsbS5jbGVhbkRhdGEodWEodGhpcykpLGEmJmEucmVwbGFjZUNoaWxkKGIsdGhpcyl9KSxhJiYoYS5sZW5ndGh8fGEubm9kZVR5cGUpP3RoaXM6dGhpcy5yZW1vdmUoKX0sZGV0YWNoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJlbW92ZShhLCEwKX0sZG9tTWFuaXA6ZnVuY3Rpb24oYSxiKXthPWUuYXBwbHkoW10sYSk7dmFyIGMsZCxmLGcsaCxpLGo9MCxsPXRoaXMubGVuZ3RoLG49dGhpcyxvPWwtMSxwPWFbMF0scT1tLmlzRnVuY3Rpb24ocCk7aWYocXx8bD4xJiYic3RyaW5nIj09dHlwZW9mIHAmJiFrLmNoZWNrQ2xvbmUmJm5hLnRlc3QocCkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZD1uLmVxKGMpO3EmJihhWzBdPXAuY2FsbCh0aGlzLGMsZC5odG1sKCkpKSxkLmRvbU1hbmlwKGEsYil9KTtpZihsJiYoaT1tLmJ1aWxkRnJhZ21lbnQoYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQsITEsdGhpcyksYz1pLmZpcnN0Q2hpbGQsMT09PWkuY2hpbGROb2Rlcy5sZW5ndGgmJihpPWMpLGMpKXtmb3IoZz1tLm1hcCh1YShpLCJzY3JpcHQiKSx4YSksZj1nLmxlbmd0aDtsPmo7aisrKWQ9aSxqIT09byYmKGQ9bS5jbG9uZShkLCEwLCEwKSxmJiZtLm1lcmdlKGcsdWEoZCwic2NyaXB0IikpKSxiLmNhbGwodGhpc1tqXSxkLGopO2lmKGYpZm9yKGg9Z1tnLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LG0ubWFwKGcseWEpLGo9MDtmPmo7aisrKWQ9Z1tqXSxvYS50ZXN0KGQudHlwZXx8IiIpJiYhbS5fZGF0YShkLCJnbG9iYWxFdmFsIikmJm0uY29udGFpbnMoaCxkKSYmKGQuc3JjP20uX2V2YWxVcmwmJm0uX2V2YWxVcmwoZC5zcmMpOm0uZ2xvYmFsRXZhbCgoZC50ZXh0fHxkLnRleHRDb250ZW50fHxkLmlubmVySFRNTHx8IiIpLnJlcGxhY2UocWEsIiIpKSk7aT1jPW51bGx9cmV0dXJuIHRoaXN9fSksbS5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxhY2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24oYSxiKXttLmZuW2FdPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYyxkPTAsZT1bXSxnPW0oYSksaD1nLmxlbmd0aC0xO2g+PWQ7ZCsrKWM9ZD09PWg/dGhpczp0aGlzLmNsb25lKCEwKSxtKGdbZF0pW2JdKGMpLGYuYXBwbHkoZSxjLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soZSl9fSk7dmFyIENhLERhPXt9O2Z1bmN0aW9uIEVhKGIsYyl7dmFyIGQsZT1tKGMuY3JlYXRlRWxlbWVudChiKSkuYXBwZW5kVG8oYy5ib2R5KSxmPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUmJihkPWEuZ2V0RGVmYXVsdENvbXB1dGVkU3R5bGUoZVswXSkpP2QuZGlzcGxheTptLmNzcyhlWzBdLCJkaXNwbGF5Iik7cmV0dXJuIGUuZGV0YWNoKCksZn1mdW5jdGlvbiBGYShhKXt2YXIgYj15LGM9RGFbYV07cmV0dXJuIGN8fChjPUVhKGEsYiksIm5vbmUiIT09YyYmY3x8KENhPShDYXx8bSgiPGlmcmFtZSBmcmFtZWJvcmRlcj0nMCcgd2lkdGg9JzAnIGhlaWdodD0nMCcvPiIpKS5hcHBlbmRUbyhiLmRvY3VtZW50RWxlbWVudCksYj0oQ2FbMF0uY29udGVudFdpbmRvd3x8Q2FbMF0uY29udGVudERvY3VtZW50KS5kb2N1bWVudCxiLndyaXRlKCksYi5jbG9zZSgpLGM9RWEoYSxiKSxDYS5kZXRhY2goKSksRGFbYV09YyksY30hZnVuY3Rpb24oKXt2YXIgYTtrLnNocmlua1dyYXBCbG9ja3M9ZnVuY3Rpb24oKXtpZihudWxsIT1hKXJldHVybiBhO2E9ITE7dmFyIGIsYyxkO3JldHVybiBjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlPyhiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksZD15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyOjA7d2lkdGg6MDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHgiLGMuYXBwZW5kQ2hpbGQoZCkuYXBwZW5kQ2hpbGQoYiksdHlwZW9mIGIuc3R5bGUuem9vbSE9PUsmJihiLnN0eWxlLmNzc1RleHQ9Ii13ZWJraXQtYm94LXNpemluZzpjb250ZW50LWJveDstbW96LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtkaXNwbGF5OmJsb2NrO21hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MXB4O3dpZHRoOjFweDt6b29tOjEiLGIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSkuc3R5bGUud2lkdGg9IjVweCIsYT0zIT09Yi5vZmZzZXRXaWR0aCksYy5yZW1vdmVDaGlsZChkKSxhKTp2b2lkIDB9fSgpO3ZhciBHYT0vXm1hcmdpbi8sSGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoPyFweClbYS16JV0rJCIsImkiKSxJYSxKYSxLYT0vXih0b3B8cmlnaHR8Ym90dG9tfGxlZnQpJC87YS5nZXRDb21wdXRlZFN0eWxlPyhJYT1mdW5jdGlvbihiKXtyZXR1cm4gYi5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Lm9wZW5lcj9iLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpOmEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jLmdldFByb3BlcnR5VmFsdWUoYil8fGNbYl06dm9pZCAwLGMmJigiIiE9PWd8fG0uY29udGFpbnMoYS5vd25lckRvY3VtZW50LGEpfHwoZz1tLnN0eWxlKGEsYikpLEhhLnRlc3QoZykmJkdhLnRlc3QoYikmJihkPWgud2lkdGgsZT1oLm1pbldpZHRoLGY9aC5tYXhXaWR0aCxoLm1pbldpZHRoPWgubWF4V2lkdGg9aC53aWR0aD1nLGc9Yy53aWR0aCxoLndpZHRoPWQsaC5taW5XaWR0aD1lLGgubWF4V2lkdGg9ZikpLHZvaWQgMD09PWc/ZzpnKyIifSk6eS5kb2N1bWVudEVsZW1lbnQuY3VycmVudFN0eWxlJiYoSWE9ZnVuY3Rpb24oYSl7cmV0dXJuIGEuY3VycmVudFN0eWxlfSxKYT1mdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmLGcsaD1hLnN0eWxlO3JldHVybiBjPWN8fElhKGEpLGc9Yz9jW2JdOnZvaWQgMCxudWxsPT1nJiZoJiZoW2JdJiYoZz1oW2JdKSxIYS50ZXN0KGcpJiYhS2EudGVzdChiKSYmKGQ9aC5sZWZ0LGU9YS5ydW50aW1lU3R5bGUsZj1lJiZlLmxlZnQsZiYmKGUubGVmdD1hLmN1cnJlbnRTdHlsZS5sZWZ0KSxoLmxlZnQ9ImZvbnRTaXplIj09PWI/IjFlbSI6ZyxnPWgucGl4ZWxMZWZ0KyJweCIsaC5sZWZ0PWQsZiYmKGUubGVmdD1mKSksdm9pZCAwPT09Zz9nOmcrIiJ8fCJhdXRvIn0pO2Z1bmN0aW9uIExhKGEsYil7cmV0dXJue2dldDpmdW5jdGlvbigpe3ZhciBjPWEoKTtpZihudWxsIT1jKXJldHVybiBjP3ZvaWQgZGVsZXRlIHRoaXMuZ2V0Oih0aGlzLmdldD1iKS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fX0hZnVuY3Rpb24oKXt2YXIgYixjLGQsZSxmLGcsaDtpZihiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5pbm5lckhUTUw9IiAgPGxpbmsvPjx0YWJsZT48L3RhYmxlPjxhIGhyZWY9Jy9hJz5hPC9hPjxpbnB1dCB0eXBlPSdjaGVja2JveCcvPiIsZD1iLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJhIilbMF0sYz1kJiZkLnN0eWxlKXtjLmNzc1RleHQ9ImZsb2F0OmxlZnQ7b3BhY2l0eTouNSIsay5vcGFjaXR5PSIwLjUiPT09Yy5vcGFjaXR5LGsuY3NzRmxvYXQ9ISFjLmNzc0Zsb2F0LGIuc3R5bGUuYmFja2dyb3VuZENsaXA9ImNvbnRlbnQtYm94IixiLmNsb25lTm9kZSghMCkuc3R5bGUuYmFja2dyb3VuZENsaXA9IiIsay5jbGVhckNsb25lU3R5bGU9ImNvbnRlbnQtYm94Ij09PWIuc3R5bGUuYmFja2dyb3VuZENsaXAsay5ib3hTaXppbmc9IiI9PT1jLmJveFNpemluZ3x8IiI9PT1jLk1vekJveFNpemluZ3x8IiI9PT1jLldlYmtpdEJveFNpemluZyxtLmV4dGVuZChrLHtyZWxpYWJsZUhpZGRlbk9mZnNldHM6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09ZyYmaSgpLGd9LGJveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWYmJmkoKSxmfSxwaXhlbFBvc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWUmJmkoKSxlfSxyZWxpYWJsZU1hcmdpblJpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PWgmJmkoKSxofX0pO2Z1bmN0aW9uIGkoKXt2YXIgYixjLGQsaTtjPXkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJvZHkiKVswXSxjJiZjLnN0eWxlJiYoYj15LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGQ9eS5jcmVhdGVFbGVtZW50KCJkaXYiKSxkLnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2JvcmRlcjowO3dpZHRoOjA7aGVpZ2h0OjA7dG9wOjA7bGVmdDotOTk5OXB4IixjLmFwcGVuZENoaWxkKGQpLmFwcGVuZENoaWxkKGIpLGIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmJvcmRlci1ib3g7LW1vei1ib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luLXRvcDoxJTt0b3A6MSU7Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo0cHg7cG9zaXRpb246YWJzb2x1dGUiLGU9Zj0hMSxoPSEwLGEuZ2V0Q29tcHV0ZWRTdHlsZSYmKGU9IjElIiE9PShhLmdldENvbXB1dGVkU3R5bGUoYixudWxsKXx8e30pLnRvcCxmPSI0cHgiPT09KGEuZ2V0Q29tcHV0ZWRTdHlsZShiLG51bGwpfHx7d2lkdGg6IjRweCJ9KS53aWR0aCxpPWIuYXBwZW5kQ2hpbGQoeS5jcmVhdGVFbGVtZW50KCJkaXYiKSksaS5zdHlsZS5jc3NUZXh0PWIuc3R5bGUuY3NzVGV4dD0iLXdlYmtpdC1ib3gtc2l6aW5nOmNvbnRlbnQtYm94Oy1tb3otYm94LXNpemluZzpjb250ZW50LWJveDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6YmxvY2s7bWFyZ2luOjA7Ym9yZGVyOjA7cGFkZGluZzowIixpLnN0eWxlLm1hcmdpblJpZ2h0PWkuc3R5bGUud2lkdGg9IjAiLGIuc3R5bGUud2lkdGg9IjFweCIsaD0hcGFyc2VGbG9hdCgoYS5nZXRDb21wdXRlZFN0eWxlKGksbnVsbCl8fHt9KS5tYXJnaW5SaWdodCksYi5yZW1vdmVDaGlsZChpKSksYi5pbm5lckhUTUw9Ijx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPnQ8L3RkPjwvdHI+PC90YWJsZT4iLGk9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgidGQiKSxpWzBdLnN0eWxlLmNzc1RleHQ9Im1hcmdpbjowO2JvcmRlcjowO3BhZGRpbmc6MDtkaXNwbGF5Om5vbmUiLGc9MD09PWlbMF0ub2Zmc2V0SGVpZ2h0LGcmJihpWzBdLnN0eWxlLmRpc3BsYXk9IiIsaVsxXS5zdHlsZS5kaXNwbGF5PSJub25lIixnPTA9PT1pWzBdLm9mZnNldEhlaWdodCksYy5yZW1vdmVDaGlsZChkKSl9fX0oKSxtLnN3YXA9ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGUsZixnPXt9O2ZvcihmIGluIGIpZ1tmXT1hLnN0eWxlW2ZdLGEuc3R5bGVbZl09YltmXTtlPWMuYXBwbHkoYSxkfHxbXSk7Zm9yKGYgaW4gYilhLnN0eWxlW2ZdPWdbZl07cmV0dXJuIGV9O3ZhciBNYT0vYWxwaGFcKFteKV0qXCkvaSxOYT0vb3BhY2l0eVxzKj1ccyooW14pXSopLyxPYT0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sUGE9bmV3IFJlZ0V4cCgiXigiK1MrIikoLiopJCIsImkiKSxRYT1uZXcgUmVnRXhwKCJeKFsrLV0pPSgiK1MrIikiLCJpIiksUmE9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LFNhPXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifSxUYT1bIldlYmtpdCIsIk8iLCJNb3oiLCJtcyJdO2Z1bmN0aW9uIFVhKGEsYil7aWYoYiBpbiBhKXJldHVybiBiO3ZhciBjPWIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrYi5zbGljZSgxKSxkPWIsZT1UYS5sZW5ndGg7d2hpbGUoZS0tKWlmKGI9VGFbZV0rYyxiIGluIGEpcmV0dXJuIGI7cmV0dXJuIGR9ZnVuY3Rpb24gVmEoYSxiKXtmb3IodmFyIGMsZCxlLGY9W10sZz0wLGg9YS5sZW5ndGg7aD5nO2crKylkPWFbZ10sZC5zdHlsZSYmKGZbZ109bS5fZGF0YShkLCJvbGRkaXNwbGF5IiksYz1kLnN0eWxlLmRpc3BsYXksYj8oZltnXXx8Im5vbmUiIT09Y3x8KGQuc3R5bGUuZGlzcGxheT0iIiksIiI9PT1kLnN0eWxlLmRpc3BsYXkmJlUoZCkmJihmW2ddPW0uX2RhdGEoZCwib2xkZGlzcGxheSIsRmEoZC5ub2RlTmFtZSkpKSk6KGU9VShkKSwoYyYmIm5vbmUiIT09Y3x8IWUpJiZtLl9kYXRhKGQsIm9sZGRpc3BsYXkiLGU/YzptLmNzcyhkLCJkaXNwbGF5IikpKSk7Zm9yKGc9MDtoPmc7ZysrKWQ9YVtnXSxkLnN0eWxlJiYoYiYmIm5vbmUiIT09ZC5zdHlsZS5kaXNwbGF5JiYiIiE9PWQuc3R5bGUuZGlzcGxheXx8KGQuc3R5bGUuZGlzcGxheT1iP2ZbZ118fCIiOiJub25lIikpO3JldHVybiBhfWZ1bmN0aW9uIFdhKGEsYixjKXt2YXIgZD1QYS5leGVjKGIpO3JldHVybiBkP01hdGgubWF4KDAsZFsxXS0oY3x8MCkpKyhkWzJdfHwicHgiKTpifWZ1bmN0aW9uIFhhKGEsYixjLGQsZSl7Zm9yKHZhciBmPWM9PT0oZD8iYm9yZGVyIjoiY29udGVudCIpPzQ6IndpZHRoIj09PWI/MTowLGc9MDs0PmY7Zis9MikibWFyZ2luIj09PWMmJihnKz1tLmNzcyhhLGMrVFtmXSwhMCxlKSksZD8oImNvbnRlbnQiPT09YyYmKGctPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSkpLCJtYXJnaW4iIT09YyYmKGctPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk6KGcrPW0uY3NzKGEsInBhZGRpbmciK1RbZl0sITAsZSksInBhZGRpbmciIT09YyYmKGcrPW0uY3NzKGEsImJvcmRlciIrVFtmXSsiV2lkdGgiLCEwLGUpKSk7cmV0dXJuIGd9ZnVuY3Rpb24gWWEoYSxiLGMpe3ZhciBkPSEwLGU9IndpZHRoIj09PWI/YS5vZmZzZXRXaWR0aDphLm9mZnNldEhlaWdodCxmPUlhKGEpLGc9ay5ib3hTaXppbmcmJiJib3JkZXItYm94Ij09PW0uY3NzKGEsImJveFNpemluZyIsITEsZik7aWYoMD49ZXx8bnVsbD09ZSl7aWYoZT1KYShhLGIsZiksKDA+ZXx8bnVsbD09ZSkmJihlPWEuc3R5bGVbYl0pLEhhLnRlc3QoZSkpcmV0dXJuIGU7ZD1nJiYoay5ib3hTaXppbmdSZWxpYWJsZSgpfHxlPT09YS5zdHlsZVtiXSksZT1wYXJzZUZsb2F0KGUpfHwwfXJldHVybiBlK1hhKGEsYixjfHwoZz8iYm9yZGVyIjoiY29udGVudCIpLGQsZikrInB4In1tLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihhLGIpe2lmKGIpe3ZhciBjPUphKGEsIm9wYWNpdHkiKTtyZXR1cm4iIj09PWM/IjEiOmN9fX19LGNzc051bWJlcjp7Y29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHdpZG93czohMCx6SW5kZXg6ITAsem9vbTohMH0sY3NzUHJvcHM6eyJmbG9hdCI6ay5jc3NGbG9hdD8iY3NzRmxvYXQiOiJzdHlsZUZsb2F0In0sc3R5bGU6ZnVuY3Rpb24oYSxiLGMsZCl7aWYoYSYmMyE9PWEubm9kZVR5cGUmJjghPT1hLm5vZGVUeXBlJiZhLnN0eWxlKXt2YXIgZSxmLGcsaD1tLmNhbWVsQ2FzZShiKSxpPWEuc3R5bGU7aWYoYj1tLmNzc1Byb3BzW2hdfHwobS5jc3NQcm9wc1toXT1VYShpLGgpKSxnPW0uY3NzSG9va3NbYl18fG0uY3NzSG9va3NbaF0sdm9pZCAwPT09YylyZXR1cm4gZyYmImdldCJpbiBnJiZ2b2lkIDAhPT0oZT1nLmdldChhLCExLGQpKT9lOmlbYl07aWYoZj10eXBlb2YgYywic3RyaW5nIj09PWYmJihlPVFhLmV4ZWMoYykpJiYoYz0oZVsxXSsxKSplWzJdK3BhcnNlRmxvYXQobS5jc3MoYSxiKSksZj0ibnVtYmVyIiksbnVsbCE9YyYmYz09PWMmJigibnVtYmVyIiE9PWZ8fG0uY3NzTnVtYmVyW2hdfHwoYys9InB4Iiksay5jbGVhckNsb25lU3R5bGV8fCIiIT09Y3x8MCE9PWIuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoaVtiXT0iaW5oZXJpdCIpLCEoZyYmInNldCJpbiBnJiZ2b2lkIDA9PT0oYz1nLnNldChhLGMsZCkpKSkpdHJ5e2lbYl09Y31jYXRjaChqKXt9fX0sY3NzOmZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlLGYsZyxoPW0uY2FtZWxDYXNlKGIpO3JldHVybiBiPW0uY3NzUHJvcHNbaF18fChtLmNzc1Byb3BzW2hdPVVhKGEuc3R5bGUsaCkpLGc9bS5jc3NIb29rc1tiXXx8bS5jc3NIb29rc1toXSxnJiYiZ2V0ImluIGcmJihmPWcuZ2V0KGEsITAsYykpLHZvaWQgMD09PWYmJihmPUphKGEsYixkKSksIm5vcm1hbCI9PT1mJiZiIGluIFNhJiYoZj1TYVtiXSksIiI9PT1jfHxjPyhlPXBhcnNlRmxvYXQoZiksYz09PSEwfHxtLmlzTnVtZXJpYyhlKT9lfHwwOmYpOmZ9fSksbS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYl09e2dldDpmdW5jdGlvbihhLGMsZCl7cmV0dXJuIGM/T2EudGVzdChtLmNzcyhhLCJkaXNwbGF5IikpJiYwPT09YS5vZmZzZXRXaWR0aD9tLnN3YXAoYSxSYSxmdW5jdGlvbigpe3JldHVybiBZYShhLGIsZCl9KTpZYShhLGIsZCk6dm9pZCAwfSxzZXQ6ZnVuY3Rpb24oYSxjLGQpe3ZhciBlPWQmJklhKGEpO3JldHVybiBXYShhLGMsZD9YYShhLGIsZCxrLmJveFNpemluZyYmImJvcmRlci1ib3giPT09bS5jc3MoYSwiYm94U2l6aW5nIiwhMSxlKSxlKTowKX19fSksay5vcGFjaXR5fHwobS5jc3NIb29rcy5vcGFjaXR5PXtnZXQ6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gTmEudGVzdCgoYiYmYS5jdXJyZW50U3R5bGU/YS5jdXJyZW50U3R5bGUuZmlsdGVyOmEuc3R5bGUuZmlsdGVyKXx8IiIpPy4wMSpwYXJzZUZsb2F0KFJlZ0V4cC4kMSkrIiI6Yj8iMSI6IiJ9LHNldDpmdW5jdGlvbihhLGIpe3ZhciBjPWEuc3R5bGUsZD1hLmN1cnJlbnRTdHlsZSxlPW0uaXNOdW1lcmljKGIpPyJhbHBoYShvcGFjaXR5PSIrMTAwKmIrIikiOiIiLGY9ZCYmZC5maWx0ZXJ8fGMuZmlsdGVyfHwiIjtjLnpvb209MSwoYj49MXx8IiI9PT1iKSYmIiI9PT1tLnRyaW0oZi5yZXBsYWNlKE1hLCIiKSkmJmMucmVtb3ZlQXR0cmlidXRlJiYoYy5yZW1vdmVBdHRyaWJ1dGUoImZpbHRlciIpLCIiPT09Ynx8ZCYmIWQuZmlsdGVyKXx8KGMuZmlsdGVyPU1hLnRlc3QoZik/Zi5yZXBsYWNlKE1hLGUpOmYrIiAiK2UpfX0pLG0uY3NzSG9va3MubWFyZ2luUmlnaHQ9TGEoay5yZWxpYWJsZU1hcmdpblJpZ2h0LGZ1bmN0aW9uKGEsYil7cmV0dXJuIGI/bS5zd2FwKGEse2Rpc3BsYXk6ImlubGluZS1ibG9jayJ9LEphLFthLCJtYXJnaW5SaWdodCJdKTp2b2lkIDB9KSxtLmVhY2goe21hcmdpbjoiIixwYWRkaW5nOiIiLGJvcmRlcjoiV2lkdGgifSxmdW5jdGlvbihhLGIpe20uY3NzSG9va3NbYStiXT17ZXhwYW5kOmZ1bmN0aW9uKGMpe2Zvcih2YXIgZD0wLGU9e30sZj0ic3RyaW5nIj09dHlwZW9mIGM/Yy5zcGxpdCgiICIpOltjXTs0PmQ7ZCsrKWVbYStUW2RdK2JdPWZbZF18fGZbZC0yXXx8ZlswXTtyZXR1cm4gZX19LEdhLnRlc3QoYSl8fChtLmNzc0hvb2tzW2ErYl0uc2V0PVdhKX0pLG0uZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGY9e30sZz0wO2lmKG0uaXNBcnJheShiKSl7Zm9yKGQ9SWEoYSksZT1iLmxlbmd0aDtlPmc7ZysrKWZbYltnXV09bS5jc3MoYSxiW2ddLCExLGQpO3JldHVybiBmfXJldHVybiB2b2lkIDAhPT1jP20uc3R5bGUoYSxiLGMpOm0uY3NzKGEsYil9LGEsYixhcmd1bWVudHMubGVuZ3RoPjEpfSxzaG93OmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIFZhKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oYSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgYT9hP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe1UodGhpcyk/bSh0aGlzKS5zaG93KCk6bSh0aGlzKS5oaWRlKCl9KX19KTtmdW5jdGlvbiBaYShhLGIsYyxkLGUpewpyZXR1cm4gbmV3IFphLnByb3RvdHlwZS5pbml0KGEsYixjLGQsZSl9bS5Ud2Vlbj1aYSxaYS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlphLGluaXQ6ZnVuY3Rpb24oYSxiLGMsZCxlLGYpe3RoaXMuZWxlbT1hLHRoaXMucHJvcD1jLHRoaXMuZWFzaW5nPWV8fCJzd2luZyIsdGhpcy5vcHRpb25zPWIsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPWQsdGhpcy51bml0PWZ8fChtLmNzc051bWJlcltjXT8iIjoicHgiKX0sY3VyOmZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGEmJmEuZ2V0P2EuZ2V0KHRoaXMpOlphLnByb3BIb29rcy5fZGVmYXVsdC5nZXQodGhpcyl9LHJ1bjpmdW5jdGlvbihhKXt2YXIgYixjPVphLnByb3BIb29rc1t0aGlzLnByb3BdO3JldHVybiB0aGlzLm9wdGlvbnMuZHVyYXRpb24/dGhpcy5wb3M9Yj1tLmVhc2luZ1t0aGlzLmVhc2luZ10oYSx0aGlzLm9wdGlvbnMuZHVyYXRpb24qYSwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTp0aGlzLnBvcz1iPWEsdGhpcy5ub3c9KHRoaXMuZW5kLXRoaXMuc3RhcnQpKmIrdGhpcy5zdGFydCx0aGlzLm9wdGlvbnMuc3RlcCYmdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3csdGhpcyksYyYmYy5zZXQ/Yy5zZXQodGhpcyk6WmEucHJvcEhvb2tzLl9kZWZhdWx0LnNldCh0aGlzKSx0aGlzfX0sWmEucHJvdG90eXBlLmluaXQucHJvdG90eXBlPVphLnByb3RvdHlwZSxaYS5wcm9wSG9va3M9e19kZWZhdWx0OntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI7cmV0dXJuIG51bGw9PWEuZWxlbVthLnByb3BdfHxhLmVsZW0uc3R5bGUmJm51bGwhPWEuZWxlbS5zdHlsZVthLnByb3BdPyhiPW0uY3NzKGEuZWxlbSxhLnByb3AsIiIpLGImJiJhdXRvIiE9PWI/YjowKTphLmVsZW1bYS5wcm9wXX0sc2V0OmZ1bmN0aW9uKGEpe20uZnguc3RlcFthLnByb3BdP20uZnguc3RlcFthLnByb3BdKGEpOmEuZWxlbS5zdHlsZSYmKG51bGwhPWEuZWxlbS5zdHlsZVttLmNzc1Byb3BzW2EucHJvcF1dfHxtLmNzc0hvb2tzW2EucHJvcF0pP20uc3R5bGUoYS5lbGVtLGEucHJvcCxhLm5vdythLnVuaXQpOmEuZWxlbVthLnByb3BdPWEubm93fX19LFphLnByb3BIb29rcy5zY3JvbGxUb3A9WmEucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihhKXthLmVsZW0ubm9kZVR5cGUmJmEuZWxlbS5wYXJlbnROb2RlJiYoYS5lbGVtW2EucHJvcF09YS5ub3cpfX0sbS5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sc3dpbmc6ZnVuY3Rpb24oYSl7cmV0dXJuLjUtTWF0aC5jb3MoYSpNYXRoLlBJKS8yfX0sbS5meD1aYS5wcm90b3R5cGUuaW5pdCxtLmZ4LnN0ZXA9e307dmFyICRhLF9hLGFiPS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxiYj1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrUysiKShbYS16JV0qKSQiLCJpIiksY2I9L3F1ZXVlSG9va3MkLyxkYj1baWJdLGViPXsiKiI6W2Z1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5jcmVhdGVUd2VlbihhLGIpLGQ9Yy5jdXIoKSxlPWJiLmV4ZWMoYiksZj1lJiZlWzNdfHwobS5jc3NOdW1iZXJbYV0/IiI6InB4IiksZz0obS5jc3NOdW1iZXJbYV18fCJweCIhPT1mJiYrZCkmJmJiLmV4ZWMobS5jc3MoYy5lbGVtLGEpKSxoPTEsaT0yMDtpZihnJiZnWzNdIT09Zil7Zj1mfHxnWzNdLGU9ZXx8W10sZz0rZHx8MTtkbyBoPWh8fCIuNSIsZy89aCxtLnN0eWxlKGMuZWxlbSxhLGcrZik7d2hpbGUoaCE9PShoPWMuY3VyKCkvZCkmJjEhPT1oJiYtLWkpfXJldHVybiBlJiYoZz1jLnN0YXJ0PStnfHwrZHx8MCxjLnVuaXQ9ZixjLmVuZD1lWzFdP2crKGVbMV0rMSkqZVsyXTorZVsyXSksY31dfTtmdW5jdGlvbiBmYigpe3JldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7JGE9dm9pZCAwfSksJGE9bS5ub3coKX1mdW5jdGlvbiBnYihhLGIpe3ZhciBjLGQ9e2hlaWdodDphfSxlPTA7Zm9yKGI9Yj8xOjA7ND5lO2UrPTItYiljPVRbZV0sZFsibWFyZ2luIitjXT1kWyJwYWRkaW5nIitjXT1hO3JldHVybiBiJiYoZC5vcGFjaXR5PWQud2lkdGg9YSksZH1mdW5jdGlvbiBoYihhLGIsYyl7Zm9yKHZhciBkLGU9KGViW2JdfHxbXSkuY29uY2F0KGViWyIqIl0pLGY9MCxnPWUubGVuZ3RoO2c+ZjtmKyspaWYoZD1lW2ZdLmNhbGwoYyxiLGEpKXJldHVybiBkfWZ1bmN0aW9uIGliKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixsLG49dGhpcyxvPXt9LHA9YS5zdHlsZSxxPWEubm9kZVR5cGUmJlUoYSkscj1tLl9kYXRhKGEsImZ4c2hvdyIpO2MucXVldWV8fChoPW0uX3F1ZXVlSG9va3MoYSwiZngiKSxudWxsPT1oLnVucXVldWVkJiYoaC51bnF1ZXVlZD0wLGk9aC5lbXB0eS5maXJlLGguZW1wdHkuZmlyZT1mdW5jdGlvbigpe2gudW5xdWV1ZWR8fGkoKX0pLGgudW5xdWV1ZWQrKyxuLmFsd2F5cyhmdW5jdGlvbigpe24uYWx3YXlzKGZ1bmN0aW9uKCl7aC51bnF1ZXVlZC0tLG0ucXVldWUoYSwiZngiKS5sZW5ndGh8fGguZW1wdHkuZmlyZSgpfSl9KSksMT09PWEubm9kZVR5cGUmJigiaGVpZ2h0ImluIGJ8fCJ3aWR0aCJpbiBiKSYmKGMub3ZlcmZsb3c9W3Aub3ZlcmZsb3cscC5vdmVyZmxvd1gscC5vdmVyZmxvd1ldLGo9bS5jc3MoYSwiZGlzcGxheSIpLGw9Im5vbmUiPT09aj9tLl9kYXRhKGEsIm9sZGRpc3BsYXkiKXx8RmEoYS5ub2RlTmFtZSk6aiwiaW5saW5lIj09PWwmJiJub25lIj09PW0uY3NzKGEsImZsb2F0IikmJihrLmlubGluZUJsb2NrTmVlZHNMYXlvdXQmJiJpbmxpbmUiIT09RmEoYS5ub2RlTmFtZSk/cC56b29tPTE6cC5kaXNwbGF5PSJpbmxpbmUtYmxvY2siKSksYy5vdmVyZmxvdyYmKHAub3ZlcmZsb3c9ImhpZGRlbiIsay5zaHJpbmtXcmFwQmxvY2tzKCl8fG4uYWx3YXlzKGZ1bmN0aW9uKCl7cC5vdmVyZmxvdz1jLm92ZXJmbG93WzBdLHAub3ZlcmZsb3dYPWMub3ZlcmZsb3dbMV0scC5vdmVyZmxvd1k9Yy5vdmVyZmxvd1syXX0pKTtmb3IoZCBpbiBiKWlmKGU9YltkXSxhYi5leGVjKGUpKXtpZihkZWxldGUgYltkXSxmPWZ8fCJ0b2dnbGUiPT09ZSxlPT09KHE/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PWV8fCFyfHx2b2lkIDA9PT1yW2RdKWNvbnRpbnVlO3E9ITB9b1tkXT1yJiZyW2RdfHxtLnN0eWxlKGEsZCl9ZWxzZSBqPXZvaWQgMDtpZihtLmlzRW1wdHlPYmplY3QobykpImlubGluZSI9PT0oIm5vbmUiPT09aj9GYShhLm5vZGVOYW1lKTpqKSYmKHAuZGlzcGxheT1qKTtlbHNle3I/ImhpZGRlbiJpbiByJiYocT1yLmhpZGRlbik6cj1tLl9kYXRhKGEsImZ4c2hvdyIse30pLGYmJihyLmhpZGRlbj0hcSkscT9tKGEpLnNob3coKTpuLmRvbmUoZnVuY3Rpb24oKXttKGEpLmhpZGUoKX0pLG4uZG9uZShmdW5jdGlvbigpe3ZhciBiO20uX3JlbW92ZURhdGEoYSwiZnhzaG93Iik7Zm9yKGIgaW4gbyltLnN0eWxlKGEsYixvW2JdKX0pO2ZvcihkIGluIG8pZz1oYihxP3JbZF06MCxkLG4pLGQgaW4gcnx8KHJbZF09Zy5zdGFydCxxJiYoZy5lbmQ9Zy5zdGFydCxnLnN0YXJ0PSJ3aWR0aCI9PT1kfHwiaGVpZ2h0Ij09PWQ/MTowKSl9fWZ1bmN0aW9uIGpiKGEsYil7dmFyIGMsZCxlLGYsZztmb3IoYyBpbiBhKWlmKGQ9bS5jYW1lbENhc2UoYyksZT1iW2RdLGY9YVtjXSxtLmlzQXJyYXkoZikmJihlPWZbMV0sZj1hW2NdPWZbMF0pLGMhPT1kJiYoYVtkXT1mLGRlbGV0ZSBhW2NdKSxnPW0uY3NzSG9va3NbZF0sZyYmImV4cGFuZCJpbiBnKXtmPWcuZXhwYW5kKGYpLGRlbGV0ZSBhW2RdO2ZvcihjIGluIGYpYyBpbiBhfHwoYVtjXT1mW2NdLGJbY109ZSl9ZWxzZSBiW2RdPWV9ZnVuY3Rpb24ga2IoYSxiLGMpe3ZhciBkLGUsZj0wLGc9ZGIubGVuZ3RoLGg9bS5EZWZlcnJlZCgpLmFsd2F5cyhmdW5jdGlvbigpe2RlbGV0ZSBpLmVsZW19KSxpPWZ1bmN0aW9uKCl7aWYoZSlyZXR1cm4hMTtmb3IodmFyIGI9JGF8fGZiKCksYz1NYXRoLm1heCgwLGouc3RhcnRUaW1lK2ouZHVyYXRpb24tYiksZD1jL2ouZHVyYXRpb258fDAsZj0xLWQsZz0wLGk9ai50d2VlbnMubGVuZ3RoO2k+ZztnKyspai50d2VlbnNbZ10ucnVuKGYpO3JldHVybiBoLm5vdGlmeVdpdGgoYSxbaixmLGNdKSwxPmYmJmk/YzooaC5yZXNvbHZlV2l0aChhLFtqXSksITEpfSxqPWgucHJvbWlzZSh7ZWxlbTphLHByb3BzOm0uZXh0ZW5kKHt9LGIpLG9wdHM6bS5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e319LGMpLG9yaWdpbmFsUHJvcGVydGllczpiLG9yaWdpbmFsT3B0aW9uczpjLHN0YXJ0VGltZTokYXx8ZmIoKSxkdXJhdGlvbjpjLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbihiLGMpe3ZhciBkPW0uVHdlZW4oYSxqLm9wdHMsYixjLGoub3B0cy5zcGVjaWFsRWFzaW5nW2JdfHxqLm9wdHMuZWFzaW5nKTtyZXR1cm4gai50d2VlbnMucHVzaChkKSxkfSxzdG9wOmZ1bmN0aW9uKGIpe3ZhciBjPTAsZD1iP2oudHdlZW5zLmxlbmd0aDowO2lmKGUpcmV0dXJuIHRoaXM7Zm9yKGU9ITA7ZD5jO2MrKylqLnR3ZWVuc1tjXS5ydW4oMSk7cmV0dXJuIGI/aC5yZXNvbHZlV2l0aChhLFtqLGJdKTpoLnJlamVjdFdpdGgoYSxbaixiXSksdGhpc319KSxrPWoucHJvcHM7Zm9yKGpiKGssai5vcHRzLnNwZWNpYWxFYXNpbmcpO2c+ZjtmKyspaWYoZD1kYltmXS5jYWxsKGosYSxrLGoub3B0cykpcmV0dXJuIGQ7cmV0dXJuIG0ubWFwKGssaGIsaiksbS5pc0Z1bmN0aW9uKGoub3B0cy5zdGFydCkmJmoub3B0cy5zdGFydC5jYWxsKGEsaiksbS5meC50aW1lcihtLmV4dGVuZChpLHtlbGVtOmEsYW5pbTpqLHF1ZXVlOmoub3B0cy5xdWV1ZX0pKSxqLnByb2dyZXNzKGoub3B0cy5wcm9ncmVzcykuZG9uZShqLm9wdHMuZG9uZSxqLm9wdHMuY29tcGxldGUpLmZhaWwoai5vcHRzLmZhaWwpLmFsd2F5cyhqLm9wdHMuYWx3YXlzKX1tLkFuaW1hdGlvbj1tLmV4dGVuZChrYix7dHdlZW5lcjpmdW5jdGlvbihhLGIpe20uaXNGdW5jdGlvbihhKT8oYj1hLGE9WyIqIl0pOmE9YS5zcGxpdCgiICIpO2Zvcih2YXIgYyxkPTAsZT1hLmxlbmd0aDtlPmQ7ZCsrKWM9YVtkXSxlYltjXT1lYltjXXx8W10sZWJbY10udW5zaGlmdChiKX0scHJlZmlsdGVyOmZ1bmN0aW9uKGEsYil7Yj9kYi51bnNoaWZ0KGEpOmRiLnB1c2goYSl9fSksbS5zcGVlZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9YSYmIm9iamVjdCI9PXR5cGVvZiBhP20uZXh0ZW5kKHt9LGEpOntjb21wbGV0ZTpjfHwhYyYmYnx8bS5pc0Z1bmN0aW9uKGEpJiZhLGR1cmF0aW9uOmEsZWFzaW5nOmMmJmJ8fGImJiFtLmlzRnVuY3Rpb24oYikmJmJ9O3JldHVybiBkLmR1cmF0aW9uPW0uZngub2ZmPzA6Im51bWJlciI9PXR5cGVvZiBkLmR1cmF0aW9uP2QuZHVyYXRpb246ZC5kdXJhdGlvbiBpbiBtLmZ4LnNwZWVkcz9tLmZ4LnNwZWVkc1tkLmR1cmF0aW9uXTptLmZ4LnNwZWVkcy5fZGVmYXVsdCwobnVsbD09ZC5xdWV1ZXx8ZC5xdWV1ZT09PSEwKSYmKGQucXVldWU9ImZ4IiksZC5vbGQ9ZC5jb21wbGV0ZSxkLmNvbXBsZXRlPWZ1bmN0aW9uKCl7bS5pc0Z1bmN0aW9uKGQub2xkKSYmZC5vbGQuY2FsbCh0aGlzKSxkLnF1ZXVlJiZtLmRlcXVldWUodGhpcyxkLnF1ZXVlKX0sZH0sbS5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihhLGIsYyxkKXtyZXR1cm4gdGhpcy5maWx0ZXIoVSkuY3NzKCJvcGFjaXR5IiwwKS5zaG93KCkuZW5kKCkuYW5pbWF0ZSh7b3BhY2l0eTpifSxhLGMsZCl9LGFuaW1hdGU6ZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9bS5pc0VtcHR5T2JqZWN0KGEpLGY9bS5zcGVlZChiLGMsZCksZz1mdW5jdGlvbigpe3ZhciBiPWtiKHRoaXMsbS5leHRlbmQoe30sYSksZik7KGV8fG0uX2RhdGEodGhpcywiZmluaXNoIikpJiZiLnN0b3AoITApfTtyZXR1cm4gZy5maW5pc2g9ZyxlfHxmLnF1ZXVlPT09ITE/dGhpcy5lYWNoKGcpOnRoaXMucXVldWUoZi5xdWV1ZSxnKX0sc3RvcDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9ZnVuY3Rpb24oYSl7dmFyIGI9YS5zdG9wO2RlbGV0ZSBhLnN0b3AsYihjKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBhJiYoYz1iLGI9YSxhPXZvaWQgMCksYiYmYSE9PSExJiZ0aGlzLnF1ZXVlKGF8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPSEwLGU9bnVsbCE9YSYmYSsicXVldWVIb29rcyIsZj1tLnRpbWVycyxnPW0uX2RhdGEodGhpcyk7aWYoZSlnW2VdJiZnW2VdLnN0b3AmJmQoZ1tlXSk7ZWxzZSBmb3IoZSBpbiBnKWdbZV0mJmdbZV0uc3RvcCYmY2IudGVzdChlKSYmZChnW2VdKTtmb3IoZT1mLmxlbmd0aDtlLS07KWZbZV0uZWxlbSE9PXRoaXN8fG51bGwhPWEmJmZbZV0ucXVldWUhPT1hfHwoZltlXS5hbmltLnN0b3AoYyksYj0hMSxmLnNwbGljZShlLDEpKTsoYnx8IWMpJiZtLmRlcXVldWUodGhpcyxhKX0pfSxmaW5pc2g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEhPT0hMSYmKGE9YXx8ImZ4IiksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGIsYz1tLl9kYXRhKHRoaXMpLGQ9Y1thKyJxdWV1ZSJdLGU9Y1thKyJxdWV1ZUhvb2tzIl0sZj1tLnRpbWVycyxnPWQ/ZC5sZW5ndGg6MDtmb3IoYy5maW5pc2g9ITAsbS5xdWV1ZSh0aGlzLGEsW10pLGUmJmUuc3RvcCYmZS5zdG9wLmNhbGwodGhpcywhMCksYj1mLmxlbmd0aDtiLS07KWZbYl0uZWxlbT09PXRoaXMmJmZbYl0ucXVldWU9PT1hJiYoZltiXS5hbmltLnN0b3AoITApLGYuc3BsaWNlKGIsMSkpO2ZvcihiPTA7Zz5iO2IrKylkW2JdJiZkW2JdLmZpbmlzaCYmZFtiXS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgYy5maW5pc2h9KX19KSxtLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGEsYil7dmFyIGM9bS5mbltiXTttLmZuW2JdPWZ1bmN0aW9uKGEsZCxlKXtyZXR1cm4gbnVsbD09YXx8ImJvb2xlYW4iPT10eXBlb2YgYT9jLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoZ2IoYiwhMCksYSxkLGUpfX0pLG0uZWFjaCh7c2xpZGVEb3duOmdiKCJzaG93Iiksc2xpZGVVcDpnYigiaGlkZSIpLHNsaWRlVG9nZ2xlOmdiKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGEsYil7bS5mblthXT1mdW5jdGlvbihhLGMsZCl7cmV0dXJuIHRoaXMuYW5pbWF0ZShiLGEsYyxkKX19KSxtLnRpbWVycz1bXSxtLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgYSxiPW0udGltZXJzLGM9MDtmb3IoJGE9bS5ub3coKTtjPGIubGVuZ3RoO2MrKylhPWJbY10sYSgpfHxiW2NdIT09YXx8Yi5zcGxpY2UoYy0tLDEpO2IubGVuZ3RofHxtLmZ4LnN0b3AoKSwkYT12b2lkIDB9LG0uZngudGltZXI9ZnVuY3Rpb24oYSl7bS50aW1lcnMucHVzaChhKSxhKCk/bS5meC5zdGFydCgpOm0udGltZXJzLnBvcCgpfSxtLmZ4LmludGVydmFsPTEzLG0uZnguc3RhcnQ9ZnVuY3Rpb24oKXtfYXx8KF9hPXNldEludGVydmFsKG0uZngudGljayxtLmZ4LmludGVydmFsKSl9LG0uZnguc3RvcD1mdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwoX2EpLF9hPW51bGx9LG0uZnguc3BlZWRzPXtzbG93OjYwMCxmYXN0OjIwMCxfZGVmYXVsdDo0MDB9LG0uZm4uZGVsYXk9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gYT1tLmZ4P20uZnguc3BlZWRzW2FdfHxhOmEsYj1ifHwiZngiLHRoaXMucXVldWUoYixmdW5jdGlvbihiLGMpe3ZhciBkPXNldFRpbWVvdXQoYixhKTtjLnN0b3A9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoZCl9fSl9LGZ1bmN0aW9uKCl7dmFyIGEsYixjLGQsZTtiPXkuY3JlYXRlRWxlbWVudCgiZGl2IiksYi5zZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIsInQiKSxiLmlubmVySFRNTD0iICA8bGluay8+PHRhYmxlPjwvdGFibGU+PGEgaHJlZj0nL2EnPmE8L2E+PGlucHV0IHR5cGU9J2NoZWNrYm94Jy8+IixkPWIuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKVswXSxjPXkuY3JlYXRlRWxlbWVudCgic2VsZWN0IiksZT1jLmFwcGVuZENoaWxkKHkuY3JlYXRlRWxlbWVudCgib3B0aW9uIikpLGE9Yi5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSxkLnN0eWxlLmNzc1RleHQ9InRvcDoxcHgiLGsuZ2V0U2V0QXR0cmlidXRlPSJ0IiE9PWIuY2xhc3NOYW1lLGsuc3R5bGU9L3RvcC8udGVzdChkLmdldEF0dHJpYnV0ZSgic3R5bGUiKSksay5ocmVmTm9ybWFsaXplZD0iL2EiPT09ZC5nZXRBdHRyaWJ1dGUoImhyZWYiKSxrLmNoZWNrT249ISFhLnZhbHVlLGsub3B0U2VsZWN0ZWQ9ZS5zZWxlY3RlZCxrLmVuY3R5cGU9ISF5LmNyZWF0ZUVsZW1lbnQoImZvcm0iKS5lbmN0eXBlLGMuZGlzYWJsZWQ9ITAsay5vcHREaXNhYmxlZD0hZS5kaXNhYmxlZCxhPXkuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxhLnNldEF0dHJpYnV0ZSgidmFsdWUiLCIiKSxrLmlucHV0PSIiPT09YS5nZXRBdHRyaWJ1dGUoInZhbHVlIiksYS52YWx1ZT0idCIsYS5zZXRBdHRyaWJ1dGUoInR5cGUiLCJyYWRpbyIpLGsucmFkaW9WYWx1ZT0idCI9PT1hLnZhbHVlfSgpO3ZhciBsYj0vXHIvZzttLmZuLmV4dGVuZCh7dmFsOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlPXRoaXNbMF07e2lmKGFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGQ9bS5pc0Z1bmN0aW9uKGEpLHRoaXMuZWFjaChmdW5jdGlvbihjKXt2YXIgZTsxPT09dGhpcy5ub2RlVHlwZSYmKGU9ZD9hLmNhbGwodGhpcyxjLG0odGhpcykudmFsKCkpOmEsbnVsbD09ZT9lPSIiOiJudW1iZXIiPT10eXBlb2YgZT9lKz0iIjptLmlzQXJyYXkoZSkmJihlPW0ubWFwKGUsZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PWE/IiI6YSsiIn0pKSxiPW0udmFsSG9va3NbdGhpcy50eXBlXXx8bS52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJzZXQiaW4gYiYmdm9pZCAwIT09Yi5zZXQodGhpcyxlLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1lKSl9KTtpZihlKXJldHVybiBiPW0udmFsSG9va3NbZS50eXBlXXx8bS52YWxIb29rc1tlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldLGImJiJnZXQiaW4gYiYmdm9pZCAwIT09KGM9Yi5nZXQoZSwidmFsdWUiKSk/YzooYz1lLnZhbHVlLCJzdHJpbmciPT10eXBlb2YgYz9jLnJlcGxhY2UobGIsIiIpOm51bGw9PWM/IiI6Yyl9fX0pLG0uZXh0ZW5kKHt2YWxIb29rczp7b3B0aW9uOntnZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9bS5maW5kLmF0dHIoYSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9Yj9iOm0udHJpbShtLnRleHQoYSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiLGMsZD1hLm9wdGlvbnMsZT1hLnNlbGVjdGVkSW5kZXgsZj0ic2VsZWN0LW9uZSI9PT1hLnR5cGV8fDA+ZSxnPWY/bnVsbDpbXSxoPWY/ZSsxOmQubGVuZ3RoLGk9MD5lP2g6Zj9lOjA7aD5pO2krKylpZihjPWRbaV0sISghYy5zZWxlY3RlZCYmaSE9PWV8fChrLm9wdERpc2FibGVkP2MuZGlzYWJsZWQ6bnVsbCE9PWMuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpKXx8Yy5wYXJlbnROb2RlLmRpc2FibGVkJiZtLm5vZGVOYW1lKGMucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKGI9bShjKS52YWwoKSxmKXJldHVybiBiO2cucHVzaChiKX1yZXR1cm4gZ30sc2V0OmZ1bmN0aW9uKGEsYil7dmFyIGMsZCxlPWEub3B0aW9ucyxmPW0ubWFrZUFycmF5KGIpLGc9ZS5sZW5ndGg7d2hpbGUoZy0tKWlmKGQ9ZVtnXSxtLmluQXJyYXkobS52YWxIb29rcy5vcHRpb24uZ2V0KGQpLGYpPj0wKXRyeXtkLnNlbGVjdGVkPWM9ITB9Y2F0Y2goaCl7ZC5zY3JvbGxIZWlnaHR9ZWxzZSBkLnNlbGVjdGVkPSExO3JldHVybiBjfHwoYS5zZWxlY3RlZEluZGV4PS0xKSxlfX19fSksbS5lYWNoKFsicmFkaW8iLCJjaGVja2JveCJdLGZ1bmN0aW9uKCl7bS52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uaXNBcnJheShiKT9hLmNoZWNrZWQ9bS5pbkFycmF5KG0oYSkudmFsKCksYik+PTA6dm9pZCAwfX0say5jaGVja09ufHwobS52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGw9PT1hLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmEudmFsdWV9KX0pO3ZhciBtYixuYixvYj1tLmV4cHIuYXR0ckhhbmRsZSxwYj0vXig/OmNoZWNrZWR8c2VsZWN0ZWQpJC9pLHFiPWsuZ2V0U2V0QXR0cmlidXRlLHJiPWsuaW5wdXQ7bS5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0uYXR0cixhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7bS5yZW1vdmVBdHRyKHRoaXMsYSl9KX19KSxtLmV4dGVuZCh7YXR0cjpmdW5jdGlvbihhLGIsYyl7dmFyIGQsZSxmPWEubm9kZVR5cGU7aWYoYSYmMyE9PWYmJjghPT1mJiYyIT09ZilyZXR1cm4gdHlwZW9mIGEuZ2V0QXR0cmlidXRlPT09Sz9tLnByb3AoYSxiLGMpOigxPT09ZiYmbS5pc1hNTERvYyhhKXx8KGI9Yi50b0xvd2VyQ2FzZSgpLGQ9bS5hdHRySG9va3NbYl18fChtLmV4cHIubWF0Y2guYm9vbC50ZXN0KGIpP25iOm1iKSksdm9pZCAwPT09Yz9kJiYiZ2V0ImluIGQmJm51bGwhPT0oZT1kLmdldChhLGIpKT9lOihlPW0uZmluZC5hdHRyKGEsYiksbnVsbD09ZT92b2lkIDA6ZSk6bnVsbCE9PWM/ZCYmInNldCJpbiBkJiZ2b2lkIDAhPT0oZT1kLnNldChhLGMsYikpP2U6KGEuc2V0QXR0cmlidXRlKGIsYysiIiksYyk6dm9pZCBtLnJlbW92ZUF0dHIoYSxiKSl9LHJlbW92ZUF0dHI6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9MCxmPWImJmIubWF0Y2goRSk7aWYoZiYmMT09PWEubm9kZVR5cGUpd2hpbGUoYz1mW2UrK10pZD1tLnByb3BGaXhbY118fGMsbS5leHByLm1hdGNoLmJvb2wudGVzdChjKT9yYiYmcWJ8fCFwYi50ZXN0KGMpP2FbZF09ITE6YVttLmNhbWVsQ2FzZSgiZGVmYXVsdC0iK2MpXT1hW2RdPSExOm0uYXR0cihhLGMsIiIpLGEucmVtb3ZlQXR0cmlidXRlKHFiP2M6ZCl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGEsYil7aWYoIWsucmFkaW9WYWx1ZSYmInJhZGlvIj09PWImJm0ubm9kZU5hbWUoYSwiaW5wdXQiKSl7dmFyIGM9YS52YWx1ZTtyZXR1cm4gYS5zZXRBdHRyaWJ1dGUoInR5cGUiLGIpLGMmJihhLnZhbHVlPWMpLGJ9fX19fSksbmI9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGI9PT0hMT9tLnJlbW92ZUF0dHIoYSxjKTpyYiYmcWJ8fCFwYi50ZXN0KGMpP2Euc2V0QXR0cmlidXRlKCFxYiYmbS5wcm9wRml4W2NdfHxjLGMpOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitjKV09YVtjXT0hMCxjfX0sbS5lYWNoKG0uZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGEsYil7dmFyIGM9b2JbYl18fG0uZmluZC5hdHRyO29iW2JdPXJiJiZxYnx8IXBiLnRlc3QoYik/ZnVuY3Rpb24oYSxiLGQpe3ZhciBlLGY7cmV0dXJuIGR8fChmPW9iW2JdLG9iW2JdPWUsZT1udWxsIT1jKGEsYixkKT9iLnRvTG93ZXJDYXNlKCk6bnVsbCxvYltiXT1mKSxlfTpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIGM/dm9pZCAwOmFbbS5jYW1lbENhc2UoImRlZmF1bHQtIitiKV0/Yi50b0xvd2VyQ2FzZSgpOm51bGx9fSkscmImJnFifHwobS5hdHRySG9va3MudmFsdWU9e3NldDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIG0ubm9kZU5hbWUoYSwiaW5wdXQiKT92b2lkKGEuZGVmYXVsdFZhbHVlPWIpOm1iJiZtYi5zZXQoYSxiLGMpfX0pLHFifHwobWI9e3NldDpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9YS5nZXRBdHRyaWJ1dGVOb2RlKGMpO3JldHVybiBkfHxhLnNldEF0dHJpYnV0ZU5vZGUoZD1hLm93bmVyRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGMpKSxkLnZhbHVlPWIrPSIiLCJ2YWx1ZSI9PT1jfHxiPT09YS5nZXRBdHRyaWJ1dGUoYyk/Yjp2b2lkIDB9fSxvYi5pZD1vYi5uYW1lPW9iLmNvb3Jkcz1mdW5jdGlvbihhLGIsYyl7dmFyIGQ7cmV0dXJuIGM/dm9pZCAwOihkPWEuZ2V0QXR0cmlidXRlTm9kZShiKSkmJiIiIT09ZC52YWx1ZT9kLnZhbHVlOm51bGx9LG0udmFsSG9va3MuYnV0dG9uPXtnZXQ6ZnVuY3Rpb24oYSxiKXt2YXIgYz1hLmdldEF0dHJpYnV0ZU5vZGUoYik7cmV0dXJuIGMmJmMuc3BlY2lmaWVkP2MudmFsdWU6dm9pZCAwfSxzZXQ6bWIuc2V0fSxtLmF0dHJIb29rcy5jb250ZW50ZWRpdGFibGU9e3NldDpmdW5jdGlvbihhLGIsYyl7bWIuc2V0KGEsIiI9PT1iPyExOmIsYyl9fSxtLmVhY2goWyJ3aWR0aCIsImhlaWdodCJdLGZ1bmN0aW9uKGEsYil7bS5hdHRySG9va3NbYl09e3NldDpmdW5jdGlvbihhLGMpe3JldHVybiIiPT09Yz8oYS5zZXRBdHRyaWJ1dGUoYiwiYXV0byIpLGMpOnZvaWQgMH19fSkpLGsuc3R5bGV8fChtLmF0dHJIb29rcy5zdHlsZT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLnN0eWxlLmNzc1RleHR8fHZvaWQgMH0sc2V0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3R5bGUuY3NzVGV4dD1iKyIifX0pO3ZhciBzYj0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b258b2JqZWN0KSQvaSx0Yj0vXig/OmF8YXJlYSkkL2k7bS5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gVih0aGlzLG0ucHJvcCxhLGIsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihhKXtyZXR1cm4gYT1tLnByb3BGaXhbYV18fGEsdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dHJ5e3RoaXNbYV09dm9pZCAwLGRlbGV0ZSB0aGlzW2FdfWNhdGNoKGIpe319KX19KSxtLmV4dGVuZCh7cHJvcEZpeDp7ImZvciI6Imh0bWxGb3IiLCJjbGFzcyI6ImNsYXNzTmFtZSJ9LHByb3A6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGUsZixnPWEubm9kZVR5cGU7aWYoYSYmMyE9PWcmJjghPT1nJiYyIT09ZylyZXR1cm4gZj0xIT09Z3x8IW0uaXNYTUxEb2MoYSksZiYmKGI9bS5wcm9wRml4W2JdfHxiLGU9bS5wcm9wSG9va3NbYl0pLHZvaWQgMCE9PWM/ZSYmInNldCJpbiBlJiZ2b2lkIDAhPT0oZD1lLnNldChhLGMsYikpP2Q6YVtiXT1jOmUmJiJnZXQiaW4gZSYmbnVsbCE9PShkPWUuZ2V0KGEsYikpP2Q6YVtiXX0scHJvcEhvb2tzOnt0YWJJbmRleDp7Z2V0OmZ1bmN0aW9uKGEpe3ZhciBiPW0uZmluZC5hdHRyKGEsInRhYmluZGV4Iik7cmV0dXJuIGI/cGFyc2VJbnQoYiwxMCk6c2IudGVzdChhLm5vZGVOYW1lKXx8dGIudGVzdChhLm5vZGVOYW1lKSYmYS5ocmVmPzA6LTF9fX19KSxrLmhyZWZOb3JtYWxpemVkfHxtLmVhY2goWyJocmVmIiwic3JjIl0sZnVuY3Rpb24oYSxiKXttLnByb3BIb29rc1tiXT17Z2V0OmZ1bmN0aW9uKGEpe3JldHVybiBhLmdldEF0dHJpYnV0ZShiLDQpfX19KSxrLm9wdFNlbGVjdGVkfHwobS5wcm9wSG9va3Muc2VsZWN0ZWQ9e2dldDpmdW5jdGlvbihhKXt2YXIgYj1hLnBhcmVudE5vZGU7cmV0dXJuIGImJihiLnNlbGVjdGVkSW5kZXgsYi5wYXJlbnROb2RlJiZiLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCksbnVsbH19KSxtLmVhY2goWyJ0YWJJbmRleCIsInJlYWRPbmx5IiwibWF4TGVuZ3RoIiwiY2VsbFNwYWNpbmciLCJjZWxsUGFkZGluZyIsInJvd1NwYW4iLCJjb2xTcGFuIiwidXNlTWFwIiwiZnJhbWVCb3JkZXIiLCJjb250ZW50RWRpdGFibGUiXSxmdW5jdGlvbigpe20ucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxrLmVuY3R5cGV8fChtLnByb3BGaXguZW5jdHlwZT0iZW5jb2RpbmciKTt2YXIgdWI9L1tcdFxyXG5cZl0vZzttLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9InN0cmluZyI9PXR5cGVvZiBhJiZhO2lmKG0uaXNGdW5jdGlvbihhKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20odGhpcykuYWRkQ2xhc3MoYS5jYWxsKHRoaXMsYix0aGlzLmNsYXNzTmFtZSkpfSk7aWYoailmb3IoYj0oYXx8IiIpLm1hdGNoKEUpfHxbXTtpPmg7aCsrKWlmKGM9dGhpc1toXSxkPTE9PT1jLm5vZGVUeXBlJiYoYy5jbGFzc05hbWU/KCIgIitjLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWIsIiAiKToiICIpKXtmPTA7d2hpbGUoZT1iW2YrK10pZC5pbmRleE9mKCIgIitlKyIgIik8MCYmKGQrPWUrIiAiKTtnPW0udHJpbShkKSxjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGUsZixnLGg9MCxpPXRoaXMubGVuZ3RoLGo9MD09PWFyZ3VtZW50cy5sZW5ndGh8fCJzdHJpbmciPT10eXBlb2YgYSYmYTtpZihtLmlzRnVuY3Rpb24oYSkpcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihiKXttKHRoaXMpLnJlbW92ZUNsYXNzKGEuY2FsbCh0aGlzLGIsdGhpcy5jbGFzc05hbWUpKX0pO2lmKGopZm9yKGI9KGF8fCIiKS5tYXRjaChFKXx8W107aT5oO2grKylpZihjPXRoaXNbaF0sZD0xPT09Yy5ub2RlVHlwZSYmKGMuY2xhc3NOYW1lPygiICIrYy5jbGFzc05hbWUrIiAiKS5yZXBsYWNlKHViLCIgIik6IiIpKXtmPTA7d2hpbGUoZT1iW2YrK10pd2hpbGUoZC5pbmRleE9mKCIgIitlKyIgIik+PTApZD1kLnJlcGxhY2UoIiAiK2UrIiAiLCIgIik7Zz1hP20udHJpbShkKToiIixjLmNsYXNzTmFtZSE9PWcmJihjLmNsYXNzTmFtZT1nKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oYSxiKXt2YXIgYz10eXBlb2YgYTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBiJiYic3RyaW5nIj09PWM/Yj90aGlzLmFkZENsYXNzKGEpOnRoaXMucmVtb3ZlQ2xhc3MoYSk6dGhpcy5lYWNoKG0uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihjKXttKHRoaXMpLnRvZ2dsZUNsYXNzKGEuY2FsbCh0aGlzLGMsdGhpcy5jbGFzc05hbWUsYiksYil9OmZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PT1jKXt2YXIgYixkPTAsZT1tKHRoaXMpLGY9YS5tYXRjaChFKXx8W107d2hpbGUoYj1mW2QrK10pZS5oYXNDbGFzcyhiKT9lLnJlbW92ZUNsYXNzKGIpOmUuYWRkQ2xhc3MoYil9ZWxzZShjPT09S3x8ImJvb2xlYW4iPT09YykmJih0aGlzLmNsYXNzTmFtZSYmbS5fZGF0YSh0aGlzLCJfX2NsYXNzTmFtZV9fIix0aGlzLmNsYXNzTmFtZSksdGhpcy5jbGFzc05hbWU9dGhpcy5jbGFzc05hbWV8fGE9PT0hMT8iIjptLl9kYXRhKHRoaXMsIl9fY2xhc3NOYW1lX18iKXx8IiIpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iICIrYSsiICIsYz0wLGQ9dGhpcy5sZW5ndGg7ZD5jO2MrKylpZigxPT09dGhpc1tjXS5ub2RlVHlwZSYmKCIgIit0aGlzW2NdLmNsYXNzTmFtZSsiICIpLnJlcGxhY2UodWIsIiAiKS5pbmRleE9mKGIpPj0wKXJldHVybiEwO3JldHVybiExfX0pLG0uZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IGxvYWQgcmVzaXplIHNjcm9sbCB1bmxvYWQgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihhLGIpe20uZm5bYl09ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4wP3RoaXMub24oYixudWxsLGEsYyk6dGhpcy50cmlnZ2VyKGIpfX0pLG0uZm4uZXh0ZW5kKHtob3ZlcjpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm1vdXNlZW50ZXIoYSkubW91c2VsZWF2ZShifHxhKX0sYmluZDpmdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMub24oYSxudWxsLGIsYyl9LHVuYmluZDpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLm9mZihhLG51bGwsYil9LGRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjLGQpe3JldHVybiB0aGlzLm9uKGIsYSxjLGQpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoYSwiKioiKTp0aGlzLm9mZihiLGF8fCIqKiIsYyl9fSk7dmFyIHZiPW0ubm93KCksd2I9L1w/Lyx4Yj0vKCwpfChcW3x7KXwofXxdKXwiKD86W14iXFxcclxuXXxcXFsiXFxcL2JmbnJ0XXxcXHVbXGRhLWZBLUZdezR9KSoiXHMqOj98dHJ1ZXxmYWxzZXxudWxsfC0/KD8hMFxkKVxkKyg/OlwuXGQrfCkoPzpbZUVdWystXT9cZCt8KS9nO20ucGFyc2VKU09OPWZ1bmN0aW9uKGIpe2lmKGEuSlNPTiYmYS5KU09OLnBhcnNlKXJldHVybiBhLkpTT04ucGFyc2UoYisiIik7dmFyIGMsZD1udWxsLGU9bS50cmltKGIrIiIpO3JldHVybiBlJiYhbS50cmltKGUucmVwbGFjZSh4YixmdW5jdGlvbihhLGIsZSxmKXtyZXR1cm4gYyYmYiYmKGQ9MCksMD09PWQ/YTooYz1lfHxiLGQrPSFmLSFlLCIiKX0pKT9GdW5jdGlvbigicmV0dXJuICIrZSkoKTptLmVycm9yKCJJbnZhbGlkIEpTT046ICIrYil9LG0ucGFyc2VYTUw9ZnVuY3Rpb24oYil7dmFyIGMsZDtpZighYnx8InN0cmluZyIhPXR5cGVvZiBiKXJldHVybiBudWxsO3RyeXthLkRPTVBhcnNlcj8oZD1uZXcgRE9NUGFyc2VyLGM9ZC5wYXJzZUZyb21TdHJpbmcoYiwidGV4dC94bWwiKSk6KGM9bmV3IEFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSxjLmFzeW5jPSJmYWxzZSIsYy5sb2FkWE1MKGIpKX1jYXRjaChlKXtjPXZvaWQgMH1yZXR1cm4gYyYmYy5kb2N1bWVudEVsZW1lbnQmJiFjLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8bS5lcnJvcigiSW52YWxpZCBYTUw6ICIrYiksY307dmFyIHliLHpiLEFiPS8jLiokLyxCYj0vKFs/Jl0pXz1bXiZdKi8sQ2I9L14oLio/KTpbIFx0XSooW15cclxuXSopXHI/JC9nbSxEYj0vXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxFYj0vXig/OkdFVHxIRUFEKSQvLEZiPS9eXC9cLy8sR2I9L14oW1x3ListXSs6KSg/OlwvXC8oPzpbXlwvPyNdKkB8KShbXlwvPyM6XSopKD86OihcZCspfCl8KS8sSGI9e30sSWI9e30sSmI9IiovIi5jb25jYXQoIioiKTt0cnl7emI9bG9jYXRpb24uaHJlZn1jYXRjaChLYil7emI9eS5jcmVhdGVFbGVtZW50KCJhIiksemIuaHJlZj0iIix6Yj16Yi5ocmVmfXliPUdiLmV4ZWMoemIudG9Mb3dlckNhc2UoKSl8fFtdO2Z1bmN0aW9uIExiKGEpe3JldHVybiBmdW5jdGlvbihiLGMpeyJzdHJpbmciIT10eXBlb2YgYiYmKGM9YixiPSIqIik7dmFyIGQsZT0wLGY9Yi50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbXTtpZihtLmlzRnVuY3Rpb24oYykpd2hpbGUoZD1mW2UrK10pIisiPT09ZC5jaGFyQXQoMCk/KGQ9ZC5zbGljZSgxKXx8IioiLChhW2RdPWFbZF18fFtdKS51bnNoaWZ0KGMpKTooYVtkXT1hW2RdfHxbXSkucHVzaChjKX19ZnVuY3Rpb24gTWIoYSxiLGMsZCl7dmFyIGU9e30sZj1hPT09SWI7ZnVuY3Rpb24gZyhoKXt2YXIgaTtyZXR1cm4gZVtoXT0hMCxtLmVhY2goYVtoXXx8W10sZnVuY3Rpb24oYSxoKXt2YXIgaj1oKGIsYyxkKTtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGp8fGZ8fGVbal0/Zj8hKGk9aik6dm9pZCAwOihiLmRhdGFUeXBlcy51bnNoaWZ0KGopLGcoaiksITEpfSksaX1yZXR1cm4gZyhiLmRhdGFUeXBlc1swXSl8fCFlWyIqIl0mJmcoIioiKX1mdW5jdGlvbiBOYihhLGIpe3ZhciBjLGQsZT1tLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKGQgaW4gYil2b2lkIDAhPT1iW2RdJiYoKGVbZF0/YTpjfHwoYz17fSkpW2RdPWJbZF0pO3JldHVybiBjJiZtLmV4dGVuZCghMCxhLGMpLGF9ZnVuY3Rpb24gT2IoYSxiLGMpe3ZhciBkLGUsZixnLGg9YS5jb250ZW50cyxpPWEuZGF0YVR5cGVzO3doaWxlKCIqIj09PWlbMF0paS5zaGlmdCgpLHZvaWQgMD09PWUmJihlPWEubWltZVR5cGV8fGIuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihlKWZvcihnIGluIGgpaWYoaFtnXSYmaFtnXS50ZXN0KGUpKXtpLnVuc2hpZnQoZyk7YnJlYWt9aWYoaVswXWluIGMpZj1pWzBdO2Vsc2V7Zm9yKGcgaW4gYyl7aWYoIWlbMF18fGEuY29udmVydGVyc1tnKyIgIitpWzBdXSl7Zj1nO2JyZWFrfWR8fChkPWcpfWY9Znx8ZH1yZXR1cm4gZj8oZiE9PWlbMF0mJmkudW5zaGlmdChmKSxjW2ZdKTp2b2lkIDB9ZnVuY3Rpb24gUGIoYSxiLGMsZCl7dmFyIGUsZixnLGgsaSxqPXt9LGs9YS5kYXRhVHlwZXMuc2xpY2UoKTtpZihrWzFdKWZvcihnIGluIGEuY29udmVydGVycylqW2cudG9Mb3dlckNhc2UoKV09YS5jb252ZXJ0ZXJzW2ddO2Y9ay5zaGlmdCgpO3doaWxlKGYpaWYoYS5yZXNwb25zZUZpZWxkc1tmXSYmKGNbYS5yZXNwb25zZUZpZWxkc1tmXV09YiksIWkmJmQmJmEuZGF0YUZpbHRlciYmKGI9YS5kYXRhRmlsdGVyKGIsYS5kYXRhVHlwZSkpLGk9ZixmPWsuc2hpZnQoKSlpZigiKiI9PT1mKWY9aTtlbHNlIGlmKCIqIiE9PWkmJmkhPT1mKXtpZihnPWpbaSsiICIrZl18fGpbIiogIitmXSwhZylmb3IoZSBpbiBqKWlmKGg9ZS5zcGxpdCgiICIpLGhbMV09PT1mJiYoZz1qW2krIiAiK2hbMF1dfHxqWyIqICIraFswXV0pKXtnPT09ITA/Zz1qW2VdOmpbZV0hPT0hMCYmKGY9aFswXSxrLnVuc2hpZnQoaFsxXSkpO2JyZWFrfWlmKGchPT0hMClpZihnJiZhWyJ0aHJvd3MiXSliPWcoYik7ZWxzZSB0cnl7Yj1nKGIpfWNhdGNoKGwpe3JldHVybntzdGF0ZToicGFyc2VyZXJyb3IiLGVycm9yOmc/bDoiTm8gY29udmVyc2lvbiBmcm9tICIraSsiIHRvICIrZn19fXJldHVybntzdGF0ZToic3VjY2VzcyIsZGF0YTpifX1tLmV4dGVuZCh7YWN0aXZlOjAsbGFzdE1vZGlmaWVkOnt9LGV0YWc6e30sYWpheFNldHRpbmdzOnt1cmw6emIsdHlwZToiR0VUIixpc0xvY2FsOkRiLnRlc3QoeWJbMV0pLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SmIsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L3htbC8saHRtbDovaHRtbC8sanNvbjovanNvbi99LHJlc3BvbnNlRmllbGRzOnt4bWw6InJlc3BvbnNlWE1MIix0ZXh0OiJyZXNwb25zZVRleHQiLGpzb246InJlc3BvbnNlSlNPTiJ9LGNvbnZlcnRlcnM6eyIqIHRleHQiOlN0cmluZywidGV4dCBodG1sIjohMCwidGV4dCBqc29uIjptLnBhcnNlSlNPTiwidGV4dCB4bWwiOm0ucGFyc2VYTUx9LGZsYXRPcHRpb25zOnt1cmw6ITAsY29udGV4dDohMH19LGFqYXhTZXR1cDpmdW5jdGlvbihhLGIpe3JldHVybiBiP05iKE5iKGEsbS5hamF4U2V0dGluZ3MpLGIpOk5iKG0uYWpheFNldHRpbmdzLGEpfSxhamF4UHJlZmlsdGVyOkxiKEhiKSxhamF4VHJhbnNwb3J0OkxiKEliKSxhamF4OmZ1bmN0aW9uKGEsYil7Im9iamVjdCI9PXR5cGVvZiBhJiYoYj1hLGE9dm9pZCAwKSxiPWJ8fHt9O3ZhciBjLGQsZSxmLGcsaCxpLGosaz1tLmFqYXhTZXR1cCh7fSxiKSxsPWsuY29udGV4dHx8ayxuPWsuY29udGV4dCYmKGwubm9kZVR5cGV8fGwuanF1ZXJ5KT9tKGwpOm0uZXZlbnQsbz1tLkRlZmVycmVkKCkscD1tLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxxPWsuc3RhdHVzQ29kZXx8e30scj17fSxzPXt9LHQ9MCx1PSJjYW5jZWxlZCIsdj17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKDI9PT10KXtpZighail7aj17fTt3aGlsZShiPUNiLmV4ZWMoZikpaltiWzFdLnRvTG93ZXJDYXNlKCldPWJbMl19Yj1qW2EudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PWI/bnVsbDpifSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gMj09PXQ/ZjpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YS50b0xvd2VyQ2FzZSgpO3JldHVybiB0fHwoYT1zW2NdPXNbY118fGEsclthXT1iKSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGEpe3JldHVybiB0fHwoay5taW1lVHlwZT1hKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGEpe3ZhciBiO2lmKGEpaWYoMj50KWZvcihiIGluIGEpcVtiXT1bcVtiXSxhW2JdXTtlbHNlIHYuYWx3YXlzKGFbdi5zdGF0dXNdKTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YXx8dTtyZXR1cm4gaSYmaS5hYm9ydChiKSx4KDAsYiksdGhpc319O2lmKG8ucHJvbWlzZSh2KS5jb21wbGV0ZT1wLmFkZCx2LnN1Y2Nlc3M9di5kb25lLHYuZXJyb3I9di5mYWlsLGsudXJsPSgoYXx8ay51cmx8fHpiKSsiIikucmVwbGFjZShBYiwiIikucmVwbGFjZShGYix5YlsxXSsiLy8iKSxrLnR5cGU9Yi5tZXRob2R8fGIudHlwZXx8ay5tZXRob2R8fGsudHlwZSxrLmRhdGFUeXBlcz1tLnRyaW0oay5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKEUpfHxbIiJdLG51bGw9PWsuY3Jvc3NEb21haW4mJihjPUdiLmV4ZWMoay51cmwudG9Mb3dlckNhc2UoKSksay5jcm9zc0RvbWFpbj0hKCFjfHxjWzFdPT09eWJbMV0mJmNbMl09PT15YlsyXSYmKGNbM118fCgiaHR0cDoiPT09Y1sxXT8iODAiOiI0NDMiKSk9PT0oeWJbM118fCgiaHR0cDoiPT09eWJbMV0/IjgwIjoiNDQzIikpKSksay5kYXRhJiZrLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGsuZGF0YSYmKGsuZGF0YT1tLnBhcmFtKGsuZGF0YSxrLnRyYWRpdGlvbmFsKSksTWIoSGIsayxiLHYpLDI9PT10KXJldHVybiB2O2g9bS5ldmVudCYmay5nbG9iYWwsaCYmMD09PW0uYWN0aXZlKysmJm0uZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0Iiksay50eXBlPWsudHlwZS50b1VwcGVyQ2FzZSgpLGsuaGFzQ29udGVudD0hRWIudGVzdChrLnR5cGUpLGU9ay51cmwsay5oYXNDb250ZW50fHwoay5kYXRhJiYoZT1rLnVybCs9KHdiLnRlc3QoZSk/IiYiOiI/Iikray5kYXRhLGRlbGV0ZSBrLmRhdGEpLGsuY2FjaGU9PT0hMSYmKGsudXJsPUJiLnRlc3QoZSk/ZS5yZXBsYWNlKEJiLCIkMV89Iit2YisrKTplKyh3Yi50ZXN0KGUpPyImIjoiPyIpKyJfPSIrdmIrKykpLGsuaWZNb2RpZmllZCYmKG0ubGFzdE1vZGlmaWVkW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixtLmxhc3RNb2RpZmllZFtlXSksbS5ldGFnW2VdJiZ2LnNldFJlcXVlc3RIZWFkZXIoIklmLU5vbmUtTWF0Y2giLG0uZXRhZ1tlXSkpLChrLmRhdGEmJmsuaGFzQ29udGVudCYmay5jb250ZW50VHlwZSE9PSExfHxiLmNvbnRlbnRUeXBlKSYmdi5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGsuY29udGVudFR5cGUpLHYuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixrLmRhdGFUeXBlc1swXSYmay5hY2NlcHRzW2suZGF0YVR5cGVzWzBdXT9rLmFjY2VwdHNbay5kYXRhVHlwZXNbMF1dKygiKiIhPT1rLmRhdGFUeXBlc1swXT8iLCAiK0piKyI7IHE9MC4wMSI6IiIpOmsuYWNjZXB0c1siKiJdKTtmb3IoZCBpbiBrLmhlYWRlcnMpdi5zZXRSZXF1ZXN0SGVhZGVyKGQsay5oZWFkZXJzW2RdKTtpZihrLmJlZm9yZVNlbmQmJihrLmJlZm9yZVNlbmQuY2FsbChsLHYsayk9PT0hMXx8Mj09PXQpKXJldHVybiB2LmFib3J0KCk7dT0iYWJvcnQiO2ZvcihkIGlue3N1Y2Nlc3M6MSxlcnJvcjoxLGNvbXBsZXRlOjF9KXZbZF0oa1tkXSk7aWYoaT1NYihJYixrLGIsdikpe3YucmVhZHlTdGF0ZT0xLGgmJm4udHJpZ2dlcigiYWpheFNlbmQiLFt2LGtdKSxrLmFzeW5jJiZrLnRpbWVvdXQ+MCYmKGc9c2V0VGltZW91dChmdW5jdGlvbigpe3YuYWJvcnQoInRpbWVvdXQiKX0say50aW1lb3V0KSk7dHJ5e3Q9MSxpLnNlbmQocix4KX1jYXRjaCh3KXtpZighKDI+dCkpdGhyb3cgdzt4KC0xLHcpfX1lbHNlIHgoLTEsIk5vIFRyYW5zcG9ydCIpO2Z1bmN0aW9uIHgoYSxiLGMsZCl7dmFyIGoscixzLHUsdyx4PWI7MiE9PXQmJih0PTIsZyYmY2xlYXJUaW1lb3V0KGcpLGk9dm9pZCAwLGY9ZHx8IiIsdi5yZWFkeVN0YXRlPWE+MD80OjAsaj1hPj0yMDAmJjMwMD5hfHwzMDQ9PT1hLGMmJih1PU9iKGssdixjKSksdT1QYihrLHUsdixqKSxqPyhrLmlmTW9kaWZpZWQmJih3PXYuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYobS5sYXN0TW9kaWZpZWRbZV09dyksdz12LmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIiksdyYmKG0uZXRhZ1tlXT13KSksMjA0PT09YXx8IkhFQUQiPT09ay50eXBlP3g9Im5vY29udGVudCI6MzA0PT09YT94PSJub3Rtb2RpZmllZCI6KHg9dS5zdGF0ZSxyPXUuZGF0YSxzPXUuZXJyb3Isaj0hcykpOihzPXgsKGF8fCF4KSYmKHg9ImVycm9yIiwwPmEmJihhPTApKSksdi5zdGF0dXM9YSx2LnN0YXR1c1RleHQ9KGJ8fHgpKyIiLGo/by5yZXNvbHZlV2l0aChsLFtyLHgsdl0pOm8ucmVqZWN0V2l0aChsLFt2LHgsc10pLHYuc3RhdHVzQ29kZShxKSxxPXZvaWQgMCxoJiZuLnRyaWdnZXIoaj8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFt2LGssaj9yOnNdKSxwLmZpcmVXaXRoKGwsW3YseF0pLGgmJihuLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3Ysa10pLC0tbS5hY3RpdmV8fG0uZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfXJldHVybiB2fSxnZXRKU09OOmZ1bmN0aW9uKGEsYixjKXtyZXR1cm4gbS5nZXQoYSxiLGMsImpzb24iKX0sZ2V0U2NyaXB0OmZ1bmN0aW9uKGEsYil7cmV0dXJuIG0uZ2V0KGEsdm9pZCAwLGIsInNjcmlwdCIpfX0pLG0uZWFjaChbImdldCIsInBvc3QiXSxmdW5jdGlvbihhLGIpe21bYl09ZnVuY3Rpb24oYSxjLGQsZSl7cmV0dXJuIG0uaXNGdW5jdGlvbihjKSYmKGU9ZXx8ZCxkPWMsYz12b2lkIDApLG0uYWpheCh7dXJsOmEsdHlwZTpiLGRhdGFUeXBlOmUsZGF0YTpjLHN1Y2Nlc3M6ZH0pfX0pLG0uX2V2YWxVcmw9ZnVuY3Rpb24oYSl7cmV0dXJuIG0uYWpheCh7dXJsOmEsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0Iixhc3luYzohMSxnbG9iYWw6ITEsInRocm93cyI6ITB9KX0sbS5mbi5leHRlbmQoe3dyYXBBbGw6ZnVuY3Rpb24oYSl7aWYobS5pc0Z1bmN0aW9uKGEpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oYil7bSh0aGlzKS53cmFwQWxsKGEuY2FsbCh0aGlzLGIpKX0pO2lmKHRoaXNbMF0pe3ZhciBiPW0oYSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKTt0aGlzWzBdLnBhcmVudE5vZGUmJmIuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLGIubWFwKGZ1bmN0aW9uKCl7dmFyIGE9dGhpczt3aGlsZShhLmZpcnN0Q2hpbGQmJjE9PT1hLmZpcnN0Q2hpbGQubm9kZVR5cGUpYT1hLmZpcnN0Q2hpbGQ7cmV0dXJuIGF9KS5hcHBlbmQodGhpcyl9cmV0dXJuIHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5lYWNoKG0uaXNGdW5jdGlvbihhKT9mdW5jdGlvbihiKXttKHRoaXMpLndyYXBJbm5lcihhLmNhbGwodGhpcyxiKSl9OmZ1bmN0aW9uKCl7dmFyIGI9bSh0aGlzKSxjPWIuY29udGVudHMoKTtjLmxlbmd0aD9jLndyYXBBbGwoYSk6Yi5hcHBlbmQoYSl9KX0sd3JhcDpmdW5jdGlvbihhKXt2YXIgYj1tLmlzRnVuY3Rpb24oYSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihjKXttKHRoaXMpLndyYXBBbGwoYj9hLmNhbGwodGhpcyxjKTphKX0pfSx1bndyYXA6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQoKS5lYWNoKGZ1bmN0aW9uKCl7bS5ub2RlTmFtZSh0aGlzLCJib2R5Iil8fG0odGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLmVuZCgpfX0pLG0uZXhwci5maWx0ZXJzLmhpZGRlbj1mdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXRXaWR0aDw9MCYmYS5vZmZzZXRIZWlnaHQ8PTB8fCFrLnJlbGlhYmxlSGlkZGVuT2Zmc2V0cygpJiYibm9uZSI9PT0oYS5zdHlsZSYmYS5zdHlsZS5kaXNwbGF5fHxtLmNzcyhhLCJkaXNwbGF5IikpfSxtLmV4cHIuZmlsdGVycy52aXNpYmxlPWZ1bmN0aW9uKGEpe3JldHVybiFtLmV4cHIuZmlsdGVycy5oaWRkZW4oYSl9O3ZhciBRYj0vJTIwL2csUmI9L1xbXF0kLyxTYj0vXHI/XG4vZyxUYj0vXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksVWI9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8a2V5Z2VuKS9pO2Z1bmN0aW9uIFZiKGEsYixjLGQpe3ZhciBlO2lmKG0uaXNBcnJheShiKSltLmVhY2goYixmdW5jdGlvbihiLGUpe2N8fFJiLnRlc3QoYSk/ZChhLGUpOlZiKGErIlsiKygib2JqZWN0Ij09dHlwZW9mIGU/YjoiIikrIl0iLGUsYyxkKX0pO2Vsc2UgaWYoY3x8Im9iamVjdCIhPT1tLnR5cGUoYikpZChhLGIpO2Vsc2UgZm9yKGUgaW4gYilWYihhKyJbIitlKyJdIixiW2VdLGMsZCl9bS5wYXJhbT1mdW5jdGlvbihhLGIpe3ZhciBjLGQ9W10sZT1mdW5jdGlvbihhLGIpe2I9bS5pc0Z1bmN0aW9uKGIpP2IoKTpudWxsPT1iPyIiOmIsZFtkLmxlbmd0aF09ZW5jb2RlVVJJQ29tcG9uZW50KGEpKyI9IitlbmNvZGVVUklDb21wb25lbnQoYil9O2lmKHZvaWQgMD09PWImJihiPW0uYWpheFNldHRpbmdzJiZtLmFqYXhTZXR0aW5ncy50cmFkaXRpb25hbCksbS5pc0FycmF5KGEpfHxhLmpxdWVyeSYmIW0uaXNQbGFpbk9iamVjdChhKSltLmVhY2goYSxmdW5jdGlvbigpe2UodGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IoYyBpbiBhKVZiKGMsYVtjXSxiLGUpO3JldHVybiBkLmpvaW4oIiYiKS5yZXBsYWNlKFFiLCIrIil9LG0uZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gbS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPW0ucHJvcCh0aGlzLCJlbGVtZW50cyIpO3JldHVybiBhP20ubWFrZUFycmF5KGEpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgYT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIW0odGhpcykuaXMoIjpkaXNhYmxlZCIpJiZVYi50ZXN0KHRoaXMubm9kZU5hbWUpJiYhVGIudGVzdChhKSYmKHRoaXMuY2hlY2tlZHx8IVcudGVzdChhKSl9KS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1tKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1jP251bGw6bS5pc0FycmF5KGMpP20ubWFwKGMsZnVuY3Rpb24oYSl7cmV0dXJue25hbWU6Yi5uYW1lLHZhbHVlOmEucmVwbGFjZShTYiwiXHJcbiIpfX0pOntuYW1lOmIubmFtZSx2YWx1ZTpjLnJlcGxhY2UoU2IsIlxyXG4iKX19KS5nZXQoKX19KSxtLmFqYXhTZXR0aW5ncy54aHI9dm9pZCAwIT09YS5BY3RpdmVYT2JqZWN0P2Z1bmN0aW9uKCl7cmV0dXJuIXRoaXMuaXNMb2NhbCYmL14oZ2V0fHBvc3R8aGVhZHxwdXR8ZGVsZXRlfG9wdGlvbnMpJC9pLnRlc3QodGhpcy50eXBlKSYmWmIoKXx8JGIoKX06WmI7dmFyIFdiPTAsWGI9e30sWWI9bS5hamF4U2V0dGluZ3MueGhyKCk7YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudCgib251bmxvYWQiLGZ1bmN0aW9uKCl7Zm9yKHZhciBhIGluIFhiKVhiW2FdKHZvaWQgMCwhMCl9KSxrLmNvcnM9ISFZYiYmIndpdGhDcmVkZW50aWFscyJpbiBZYixZYj1rLmFqYXg9ISFZYixZYiYmbS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGEpe2lmKCFhLmNyb3NzRG9tYWlufHxrLmNvcnMpe3ZhciBiO3JldHVybntzZW5kOmZ1bmN0aW9uKGMsZCl7dmFyIGUsZj1hLnhocigpLGc9KytXYjtpZihmLm9wZW4oYS50eXBlLGEudXJsLGEuYXN5bmMsYS51c2VybmFtZSxhLnBhc3N3b3JkKSxhLnhockZpZWxkcylmb3IoZSBpbiBhLnhockZpZWxkcylmW2VdPWEueGhyRmllbGRzW2VdO2EubWltZVR5cGUmJmYub3ZlcnJpZGVNaW1lVHlwZSYmZi5vdmVycmlkZU1pbWVUeXBlKGEubWltZVR5cGUpLGEuY3Jvc3NEb21haW58fGNbIlgtUmVxdWVzdGVkLVdpdGgiXXx8KGNbIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoZSBpbiBjKXZvaWQgMCE9PWNbZV0mJmYuc2V0UmVxdWVzdEhlYWRlcihlLGNbZV0rIiIpO2Yuc2VuZChhLmhhc0NvbnRlbnQmJmEuZGF0YXx8bnVsbCksYj1mdW5jdGlvbihjLGUpe3ZhciBoLGksajtpZihiJiYoZXx8ND09PWYucmVhZHlTdGF0ZSkpaWYoZGVsZXRlIFhiW2ddLGI9dm9pZCAwLGYub25yZWFkeXN0YXRlY2hhbmdlPW0ubm9vcCxlKTQhPT1mLnJlYWR5U3RhdGUmJmYuYWJvcnQoKTtlbHNle2o9e30saD1mLnN0YXR1cywic3RyaW5nIj09dHlwZW9mIGYucmVzcG9uc2VUZXh0JiYoai50ZXh0PWYucmVzcG9uc2VUZXh0KTt0cnl7aT1mLnN0YXR1c1RleHR9Y2F0Y2goayl7aT0iIn1ofHwhYS5pc0xvY2FsfHxhLmNyb3NzRG9tYWluPzEyMjM9PT1oJiYoaD0yMDQpOmg9ai50ZXh0PzIwMDo0MDR9aiYmZChoLGksaixmLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKX0sYS5hc3luYz80PT09Zi5yZWFkeVN0YXRlP3NldFRpbWVvdXQoYik6Zi5vbnJlYWR5c3RhdGVjaGFuZ2U9WGJbZ109YjpiKCl9LGFib3J0OmZ1bmN0aW9uKCl7YiYmYih2b2lkIDAsITApfX19fSk7ZnVuY3Rpb24gWmIoKXt0cnl7cmV0dXJuIG5ldyBhLlhNTEh0dHBSZXF1ZXN0fWNhdGNoKGIpe319ZnVuY3Rpb24gJGIoKXt0cnl7cmV0dXJuIG5ldyBhLkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxIVFRQIil9Y2F0Y2goYil7fX1tLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6Lyg/OmphdmF8ZWNtYSlzY3JpcHQvfSxjb252ZXJ0ZXJzOnsidGV4dCBzY3JpcHQiOmZ1bmN0aW9uKGEpe3JldHVybiBtLmdsb2JhbEV2YWwoYSksYX19fSksbS5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEuY2FjaGUmJihhLmNhY2hlPSExKSxhLmNyb3NzRG9tYWluJiYoYS50eXBlPSJHRVQiLGEuZ2xvYmFsPSExKX0pLG0uYWpheFRyYW5zcG9ydCgic2NyaXB0IixmdW5jdGlvbihhKXtpZihhLmNyb3NzRG9tYWluKXt2YXIgYixjPXkuaGVhZHx8bSgiaGVhZCIpWzBdfHx5LmRvY3VtZW50RWxlbWVudDtyZXR1cm57c2VuZDpmdW5jdGlvbihkLGUpe2I9eS5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKSxiLmFzeW5jPSEwLGEuc2NyaXB0Q2hhcnNldCYmKGIuY2hhcnNldD1hLnNjcmlwdENoYXJzZXQpLGIuc3JjPWEudXJsLGIub25sb2FkPWIub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKGEsYyl7KGN8fCFiLnJlYWR5U3RhdGV8fC9sb2FkZWR8Y29tcGxldGUvLnRlc3QoYi5yZWFkeVN0YXRlKSkmJihiLm9ubG9hZD1iLm9ucmVhZHlzdGF0ZWNoYW5nZT1udWxsLGIucGFyZW50Tm9kZSYmYi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGIpLGI9bnVsbCxjfHxlKDIwMCwic3VjY2VzcyIpKX0sYy5pbnNlcnRCZWZvcmUoYixjLmZpcnN0Q2hpbGQpfSxhYm9ydDpmdW5jdGlvbigpe2ImJmIub25sb2FkKHZvaWQgMCwhMCl9fX19KTt2YXIgX2I9W10sYWM9Lyg9KVw/KD89JnwkKXxcP1w/LzttLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGE9X2IucG9wKCl8fG0uZXhwYW5kbysiXyIrdmIrKztyZXR1cm4gdGhpc1thXT0hMCxhfX0pLG0uYWpheFByZWZpbHRlcigianNvbiBqc29ucCIsZnVuY3Rpb24oYixjLGQpe3ZhciBlLGYsZyxoPWIuanNvbnAhPT0hMSYmKGFjLnRlc3QoYi51cmwpPyJ1cmwiOiJzdHJpbmciPT10eXBlb2YgYi5kYXRhJiYhKGIuY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmYWMudGVzdChiLmRhdGEpJiYiZGF0YSIpO3JldHVybiBofHwianNvbnAiPT09Yi5kYXRhVHlwZXNbMF0/KGU9Yi5qc29ucENhbGxiYWNrPW0uaXNGdW5jdGlvbihiLmpzb25wQ2FsbGJhY2spP2IuanNvbnBDYWxsYmFjaygpOmIuanNvbnBDYWxsYmFjayxoP2JbaF09YltoXS5yZXBsYWNlKGFjLCIkMSIrZSk6Yi5qc29ucCE9PSExJiYoYi51cmwrPSh3Yi50ZXN0KGIudXJsKT8iJiI6Ij8iKStiLmpzb25wKyI9IitlKSxiLmNvbnZlcnRlcnNbInNjcmlwdCBqc29uIl09ZnVuY3Rpb24oKXtyZXR1cm4gZ3x8bS5lcnJvcihlKyIgd2FzIG5vdCBjYWxsZWQiKSxnWzBdfSxiLmRhdGFUeXBlc1swXT0ianNvbiIsZj1hW2VdLGFbZV09ZnVuY3Rpb24oKXtnPWFyZ3VtZW50c30sZC5hbHdheXMoZnVuY3Rpb24oKXthW2VdPWYsYltlXSYmKGIuanNvbnBDYWxsYmFjaz1jLmpzb25wQ2FsbGJhY2ssX2IucHVzaChlKSksZyYmbS5pc0Z1bmN0aW9uKGYpJiZmKGdbMF0pLGc9Zj12b2lkIDB9KSwic2NyaXB0Iik6dm9pZCAwfSksbS5wYXJzZUhUTUw9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpcmV0dXJuIG51bGw7ImJvb2xlYW4iPT10eXBlb2YgYiYmKGM9YixiPSExKSxiPWJ8fHk7dmFyIGQ9dS5leGVjKGEpLGU9IWMmJltdO3JldHVybiBkP1tiLmNyZWF0ZUVsZW1lbnQoZFsxXSldOihkPW0uYnVpbGRGcmFnbWVudChbYV0sYixlKSxlJiZlLmxlbmd0aCYmbShlKS5yZW1vdmUoKSxtLm1lcmdlKFtdLGQuY2hpbGROb2RlcykpfTt2YXIgYmM9bS5mbi5sb2FkO20uZm4ubG9hZD1mdW5jdGlvbihhLGIsYyl7aWYoInN0cmluZyIhPXR5cGVvZiBhJiZiYylyZXR1cm4gYmMuYXBwbHkodGhpcyxhcmd1bWVudHMpO3ZhciBkLGUsZixnPXRoaXMsaD1hLmluZGV4T2YoIiAiKTtyZXR1cm4gaD49MCYmKGQ9bS50cmltKGEuc2xpY2UoaCxhLmxlbmd0aCkpLGE9YS5zbGljZSgwLGgpKSxtLmlzRnVuY3Rpb24oYik/KGM9YixiPXZvaWQgMCk6YiYmIm9iamVjdCI9PXR5cGVvZiBiJiYoZj0iUE9TVCIpLGcubGVuZ3RoPjAmJm0uYWpheCh7dXJsOmEsdHlwZTpmLGRhdGFUeXBlOiJodG1sIixkYXRhOmJ9KS5kb25lKGZ1bmN0aW9uKGEpe2U9YXJndW1lbnRzLGcuaHRtbChkP20oIjxkaXY+IikuYXBwZW5kKG0ucGFyc2VIVE1MKGEpKS5maW5kKGQpOmEpfSkuY29tcGxldGUoYyYmZnVuY3Rpb24oYSxiKXtnLmVhY2goYyxlfHxbYS5yZXNwb25zZVRleHQsYixhXSl9KSx0aGlzfSxtLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihhLGIpe20uZm5bYl09ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub24oYixhKX19KSxtLmV4cHIuZmlsdGVycy5hbmltYXRlZD1mdW5jdGlvbihhKXtyZXR1cm4gbS5ncmVwKG0udGltZXJzLGZ1bmN0aW9uKGIpe3JldHVybiBhPT09Yi5lbGVtfSkubGVuZ3RofTt2YXIgY2M9YS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7ZnVuY3Rpb24gZGMoYSl7cmV0dXJuIG0uaXNXaW5kb3coYSk/YTo5PT09YS5ub2RlVHlwZT9hLmRlZmF1bHRWaWV3fHxhLnBhcmVudFdpbmRvdzohMX1tLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGEsYixjKXt2YXIgZCxlLGYsZyxoLGksaixrPW0uY3NzKGEsInBvc2l0aW9uIiksbD1tKGEpLG49e307InN0YXRpYyI9PT1rJiYoYS5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoPWwub2Zmc2V0KCksZj1tLmNzcyhhLCJ0b3AiKSxpPW0uY3NzKGEsImxlZnQiKSxqPSgiYWJzb2x1dGUiPT09a3x8ImZpeGVkIj09PWspJiZtLmluQXJyYXkoImF1dG8iLFtmLGldKT4tMSxqPyhkPWwucG9zaXRpb24oKSxnPWQudG9wLGU9ZC5sZWZ0KTooZz1wYXJzZUZsb2F0KGYpfHwwLGU9cGFyc2VGbG9hdChpKXx8MCksbS5pc0Z1bmN0aW9uKGIpJiYoYj1iLmNhbGwoYSxjLGgpKSxudWxsIT1iLnRvcCYmKG4udG9wPWIudG9wLWgudG9wK2cpLG51bGwhPWIubGVmdCYmKG4ubGVmdD1iLmxlZnQtaC5sZWZ0K2UpLCJ1c2luZyJpbiBiP2IudXNpbmcuY2FsbChhLG4pOmwuY3NzKG4pfX0sbS5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihhKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1hP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKGIpe20ub2Zmc2V0LnNldE9mZnNldCh0aGlzLGEsYil9KTt2YXIgYixjLGQ9e3RvcDowLGxlZnQ6MH0sZT10aGlzWzBdLGY9ZSYmZS5vd25lckRvY3VtZW50O2lmKGYpcmV0dXJuIGI9Zi5kb2N1bWVudEVsZW1lbnQsbS5jb250YWlucyhiLGUpPyh0eXBlb2YgZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QhPT1LJiYoZD1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSxjPWRjKGYpLHt0b3A6ZC50b3ArKGMucGFnZVlPZmZzZXR8fGIuc2Nyb2xsVG9wKS0oYi5jbGllbnRUb3B8fDApLGxlZnQ6ZC5sZWZ0KyhjLnBhZ2VYT2Zmc2V0fHxiLnNjcm9sbExlZnQpLShiLmNsaWVudExlZnR8fDApfSk6ZH0scG9zaXRpb246ZnVuY3Rpb24oKXtpZih0aGlzWzBdKXt2YXIgYSxiLGM9e3RvcDowLGxlZnQ6MH0sZD10aGlzWzBdO3JldHVybiJmaXhlZCI9PT1tLmNzcyhkLCJwb3NpdGlvbiIpP2I9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTooYT10aGlzLm9mZnNldFBhcmVudCgpLGI9dGhpcy5vZmZzZXQoKSxtLm5vZGVOYW1lKGFbMF0sImh0bWwiKXx8KGM9YS5vZmZzZXQoKSksYy50b3ArPW0uY3NzKGFbMF0sImJvcmRlclRvcFdpZHRoIiwhMCksYy5sZWZ0Kz1tLmNzcyhhWzBdLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSkse3RvcDpiLnRvcC1jLnRvcC1tLmNzcyhkLCJtYXJnaW5Ub3AiLCEwKSxsZWZ0OmIubGVmdC1jLmxlZnQtbS5jc3MoZCwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBhPXRoaXMub2Zmc2V0UGFyZW50fHxjYzt3aGlsZShhJiYhbS5ub2RlTmFtZShhLCJodG1sIikmJiJzdGF0aWMiPT09bS5jc3MoYSwicG9zaXRpb24iKSlhPWEub2Zmc2V0UGFyZW50O3JldHVybiBhfHxjY30pfX0pLG0uZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihhLGIpe3ZhciBjPS9ZLy50ZXN0KGIpO20uZm5bYV09ZnVuY3Rpb24oZCl7cmV0dXJuIFYodGhpcyxmdW5jdGlvbihhLGQsZSl7dmFyIGY9ZGMoYSk7cmV0dXJuIHZvaWQgMD09PWU/Zj9iIGluIGY/ZltiXTpmLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFtkXTphW2RdOnZvaWQoZj9mLnNjcm9sbFRvKGM/bShmKS5zY3JvbGxMZWZ0KCk6ZSxjP2U6bShmKS5zY3JvbGxUb3AoKSk6YVtkXT1lKX0sYSxkLGFyZ3VtZW50cy5sZW5ndGgsbnVsbCl9fSksbS5lYWNoKFsidG9wIiwibGVmdCJdLGZ1bmN0aW9uKGEsYil7bS5jc3NIb29rc1tiXT1MYShrLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oYSxjKXtyZXR1cm4gYz8oYz1KYShhLGIpLEhhLnRlc3QoYyk/bShhKS5wb3NpdGlvbigpW2JdKyJweCI6Yyk6dm9pZCAwfSl9KSxtLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihhLGIpe20uZWFjaCh7cGFkZGluZzoiaW5uZXIiK2EsY29udGVudDpiLCIiOiJvdXRlciIrYX0sZnVuY3Rpb24oYyxkKXttLmZuW2RdPWZ1bmN0aW9uKGQsZSl7dmFyIGY9YXJndW1lbnRzLmxlbmd0aCYmKGN8fCJib29sZWFuIiE9dHlwZW9mIGQpLGc9Y3x8KGQ9PT0hMHx8ZT09PSEwPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gVih0aGlzLGZ1bmN0aW9uKGIsYyxkKXt2YXIgZTtyZXR1cm4gbS5pc1dpbmRvdyhiKT9iLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsiY2xpZW50IithXTo5PT09Yi5ub2RlVHlwZT8oZT1iLmRvY3VtZW50RWxlbWVudCxNYXRoLm1heChiLmJvZHlbInNjcm9sbCIrYV0sZVsic2Nyb2xsIithXSxiLmJvZHlbIm9mZnNldCIrYV0sZVsib2Zmc2V0IithXSxlWyJjbGllbnQiK2FdKSk6dm9pZCAwPT09ZD9tLmNzcyhiLGMsZyk6bS5zdHlsZShiLGMsZCxnKX0sYixmP2Q6dm9pZCAwLGYsbnVsbCl9fSl9KSxtLmZuLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZW5ndGh9LG0uZm4uYW5kU2VsZj1tLmZuLmFkZEJhY2ssImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKCJqcXVlcnkiLFtdLGZ1bmN0aW9uKCl7cmV0dXJuIG19KTt2YXIgZWM9YS5qUXVlcnksZmM9YS4kO3JldHVybiBtLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oYil7cmV0dXJuIGEuJD09PW0mJihhLiQ9ZmMpLGImJmEualF1ZXJ5PT09bSYmKGEualF1ZXJ5PWVjKSxtfSx0eXBlb2YgYj09PUsmJihhLmpRdWVyeT1hLiQ9bSksbX0pOwo="></script>
<link href="data:text/css;charset=utf-8,%0A%2Econtainer%2Dfluid%2Ecrosstalk%2Dbscols%20%7B%0Amargin%2Dleft%3A%20%2D30px%3B%0Amargin%2Dright%3A%20%2D30px%3B%0Awhite%2Dspace%3A%20normal%3B%0A%7D%0A%0Abody%20%3E%20%2Econtainer%2Dfluid%2Ecrosstalk%2Dbscols%20%7B%0Amargin%2Dleft%3A%20auto%3B%0Amargin%2Dright%3A%20auto%3B%0A%7D%0A%2Ecrosstalk%2Dinput%2Dcheckboxgroup%20%2Ecrosstalk%2Doptions%2Dgroup%20%2Ecrosstalk%2Doptions%2Dcolumn%20%7B%0Adisplay%3A%20inline%2Dblock%3B%0Apadding%2Dright%3A%2012px%3B%0Avertical%2Dalign%3A%20top%3B%0A%7D%0A%40media%20only%20screen%20and%20%28max%2Dwidth%3A480px%29%20%7B%0A%2Ecrosstalk%2Dinput%2Dcheckboxgroup%20%2Ecrosstalk%2Doptions%2Dgroup%20%2Ecrosstalk%2Doptions%2Dcolumn%20%7B%0Adisplay%3A%20block%3B%0Apadding%2Dright%3A%20inherit%3B%0A%7D%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uIGEoYixjLGQpe2Z1bmN0aW9uIGUoZyxoKXtpZighY1tnXSl7aWYoIWJbZ10pe3ZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFoJiZpKXJldHVybiBpKGcsITApO2lmKGYpcmV0dXJuIGYoZywhMCk7dmFyIGo9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrZysiJyIpO3Rocm93IGouY29kZT0iTU9EVUxFX05PVF9GT1VORCIsan12YXIgaz1jW2ddPXtleHBvcnRzOnt9fTtiW2ddWzBdLmNhbGwoay5leHBvcnRzLGZ1bmN0aW9uKGEpe3ZhciBjPWJbZ11bMV1bYV07cmV0dXJuIGUoYz9jOmEpfSxrLGsuZXhwb3J0cyxhLGIsYyxkKX1yZXR1cm4gY1tnXS5leHBvcnRzfWZvcih2YXIgZj0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxnPTA7ZzxkLmxlbmd0aDtnKyspZShkW2ddKTtyZXR1cm4gZX0oezE6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhLGIpe2lmKCEoYSBpbnN0YW5jZW9mIGIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXTtkLmVudW1lcmFibGU9ZC5lbnVtZXJhYmxlfHwhMSxkLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gZCYmKGQud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGQua2V5LGQpfX1yZXR1cm4gZnVuY3Rpb24oYixjLGQpe3JldHVybiBjJiZhKGIucHJvdG90eXBlLGMpLGQmJmEoYixkKSxifX0oKSxmPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2QodGhpcyxhKSx0aGlzLl90eXBlcz17fSx0aGlzLl9zZXE9MH1yZXR1cm4gZShhLFt7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl90eXBlc1thXTtjfHwoYz10aGlzLl90eXBlc1thXT17fSk7dmFyIGQ9InN1YiIrdGhpcy5fc2VxKys7cmV0dXJuIGNbZF09YixkfX0se2tleToib2ZmIix2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuX3R5cGVzW2FdO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBiKXtmb3IodmFyIGQgaW4gYylpZihjLmhhc093blByb3BlcnR5KGQpJiZjW2RdPT09YilyZXR1cm4gZGVsZXRlIGNbZF0sZDtyZXR1cm4hMX1pZigic3RyaW5nIj09dHlwZW9mIGIpcmV0dXJuISghY3x8IWNbYl0pJiYoZGVsZXRlIGNbYl0sYik7dGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHR5cGUgZm9yIGxpc3RlbmVyIil9fSx7a2V5OiJ0cmlnZ2VyIix2YWx1ZTpmdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcy5fdHlwZXNbYV07Zm9yKHZhciBlIGluIGQpZC5oYXNPd25Qcm9wZXJ0eShlKSYmZFtlXS5jYWxsKGMsYil9fV0pLGF9KCk7Yy5kZWZhdWx0PWZ9LHt9XSwyOltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoYSl7aWYoYSYmYS5fX2VzTW9kdWxlKXJldHVybiBhO3ZhciBiPXt9O2lmKG51bGwhPWEpZm9yKHZhciBjIGluIGEpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYykmJihiW2NdPWFbY10pO3JldHVybiBiLmRlZmF1bHQ9YSxifWZ1bmN0aW9uIGUoYSl7cmV0dXJuIGEmJmEuX19lc01vZHVsZT9hOntkZWZhdWx0OmF9fWZ1bmN0aW9uIGYoYSxiKXtpZighKGEgaW5zdGFuY2VvZiBiKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBnKGEpe3ZhciBiPWEudmFyKCJmaWx0ZXJzZXQiKSxjPWIuZ2V0KCk7cmV0dXJuIGN8fChjPW5ldyBtLmRlZmF1bHQsYi5zZXQoYykpLGN9ZnVuY3Rpb24gaCgpe3JldHVybiByKyt9T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGMuRmlsdGVySGFuZGxlPXZvaWQgMDt2YXIgaT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXTtkLmVudW1lcmFibGU9ZC5lbnVtZXJhYmxlfHwhMSxkLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gZCYmKGQud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGQua2V5LGQpfX1yZXR1cm4gZnVuY3Rpb24oYixjLGQpe3JldHVybiBjJiZhKGIucHJvdG90eXBlLGMpLGQmJmEoYixkKSxifX0oKSxqPWEoIi4vZXZlbnRzIiksaz1lKGopLGw9YSgiLi9maWx0ZXJzZXQiKSxtPWUobCksbj1hKCIuL2dyb3VwIiksbz1lKG4pLHA9YSgiLi91dGlsIikscT1kKHApLHI9MTtjLkZpbHRlckhhbmRsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYixjKXtmKHRoaXMsYSksdGhpcy5fZXZlbnRSZWxheT1uZXcgay5kZWZhdWx0LHRoaXMuX2VtaXR0ZXI9bmV3IHEuU3Vic2NyaXB0aW9uVHJhY2tlcih0aGlzLl9ldmVudFJlbGF5KSx0aGlzLl9ncm91cD1udWxsLHRoaXMuX2ZpbHRlclNldD1udWxsLHRoaXMuX2ZpbHRlclZhcj1udWxsLHRoaXMuX3Zhck9uQ2hhbmdlU3ViPW51bGwsdGhpcy5fZXh0cmFJbmZvPXEuZXh0ZW5kKHtzZW5kZXI6dGhpc30sYyksdGhpcy5faWQ9ImZpbHRlciIraCgpLHRoaXMuc2V0R3JvdXAoYil9cmV0dXJuIGkoYSxbe2tleToic2V0R3JvdXAiLHZhbHVlOmZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7aWYodGhpcy5fZ3JvdXAhPT1hJiYodGhpcy5fZ3JvdXB8fGEpJiYodGhpcy5fZmlsdGVyVmFyJiYodGhpcy5fZmlsdGVyVmFyLm9mZigiY2hhbmdlIix0aGlzLl92YXJPbkNoYW5nZVN1YiksdGhpcy5jbGVhcigpLHRoaXMuX3Zhck9uQ2hhbmdlU3ViPW51bGwsdGhpcy5fZmlsdGVyVmFyPW51bGwsdGhpcy5fZmlsdGVyU2V0PW51bGwpLHRoaXMuX2dyb3VwPWEsYSkpe2E9KDAsby5kZWZhdWx0KShhKSx0aGlzLl9maWx0ZXJTZXQ9ZyhhKSx0aGlzLl9maWx0ZXJWYXI9KDAsby5kZWZhdWx0KShhKS52YXIoImZpbHRlciIpO3ZhciBjPXRoaXMuX2ZpbHRlclZhci5vbigiY2hhbmdlIixmdW5jdGlvbihhKXtiLl9ldmVudFJlbGF5LnRyaWdnZXIoImNoYW5nZSIsYSxiKX0pO3RoaXMuX3Zhck9uQ2hhbmdlU3ViPWN9fX0se2tleToiX21lcmdlRXh0cmFJbmZvIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gcS5leHRlbmQoe30sdGhpcy5fZXh0cmFJbmZvP3RoaXMuX2V4dHJhSW5mbzpudWxsLGE/YTpudWxsKX19LHtrZXk6ImNsb3NlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2VtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCksdGhpcy5jbGVhcigpLHRoaXMuc2V0R3JvdXAobnVsbCl9fSx7a2V5OiJjbGVhciIsdmFsdWU6ZnVuY3Rpb24oYSl7dGhpcy5fZmlsdGVyU2V0JiYodGhpcy5fZmlsdGVyU2V0LmNsZWFyKHRoaXMuX2lkKSx0aGlzLl9vbkNoYW5nZShhKSl9fSx7a2V5OiJzZXQiLHZhbHVlOmZ1bmN0aW9uKGEsYil7dGhpcy5fZmlsdGVyU2V0JiYodGhpcy5fZmlsdGVyU2V0LnVwZGF0ZSh0aGlzLl9pZCxhKSx0aGlzLl9vbkNoYW5nZShiKSl9fSx7a2V5OiJvbiIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5fZW1pdHRlci5vbihhLGIpfX0se2tleToib2ZmIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLl9lbWl0dGVyLm9mZihhLGIpfX0se2tleToiX29uQ2hhbmdlIix2YWx1ZTpmdW5jdGlvbihhKXt0aGlzLl9maWx0ZXJTZXQmJnRoaXMuX2ZpbHRlclZhci5zZXQodGhpcy5fZmlsdGVyU2V0LnZhbHVlLHRoaXMuX21lcmdlRXh0cmFJbmZvKGEpKX19LHtrZXk6ImZpbHRlcmVkS2V5cyIsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpbHRlclNldD90aGlzLl9maWx0ZXJTZXQudmFsdWU6bnVsbH19XSksYX0oKX0seyIuL2V2ZW50cyI6MSwiLi9maWx0ZXJzZXQiOjMsIi4vZ3JvdXAiOjQsIi4vdXRpbCI6MTF9XSwzOltmdW5jdGlvbihhLGIsYyl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGQoYSxiKXtpZighKGEgaW5zdGFuY2VvZiBiKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBlKGEsYil7cmV0dXJuIGE9PT1iPzA6YTxiPy0xOmE+Yj8xOnZvaWQgMH1PYmplY3QuZGVmaW5lUHJvcGVydHkoYywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY107ZC5lbnVtZXJhYmxlPWQuZW51bWVyYWJsZXx8ITEsZC5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGQmJihkLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxkLmtleSxkKX19cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gYyYmYShiLnByb3RvdHlwZSxjKSxkJiZhKGIsZCksYn19KCksZz1hKCIuL3V0aWwiKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe2QodGhpcyxhKSx0aGlzLnJlc2V0KCl9cmV0dXJuIGYoYSxbe2tleToicmVzZXQiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5faGFuZGxlcz17fSx0aGlzLl9rZXlzPXt9LHRoaXMuX3ZhbHVlPW51bGwsdGhpcy5fYWN0aXZlSGFuZGxlcz0wfX0se2tleToidXBkYXRlIix2YWx1ZTpmdW5jdGlvbihhLGIpe251bGwhPT1iJiYoYj1iLnNsaWNlKDApLGIuc29ydChlKSk7dmFyIGM9KDAsZy5kaWZmU29ydGVkTGlzdHMpKHRoaXMuX2hhbmRsZXNbYV0sYiksZD1jLmFkZGVkLGY9Yy5yZW1vdmVkO3RoaXMuX2hhbmRsZXNbYV09Yjtmb3IodmFyIGg9MDtoPGQubGVuZ3RoO2grKyl0aGlzLl9rZXlzW2RbaF1dPSh0aGlzLl9rZXlzW2RbaF1dfHwwKSsxO2Zvcih2YXIgaT0wO2k8Zi5sZW5ndGg7aSsrKXRoaXMuX2tleXNbZltpXV0tLTt0aGlzLl91cGRhdGVWYWx1ZShiKX19LHtrZXk6Il91cGRhdGVWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5fYWxsS2V5cyxiPU9iamVjdC5rZXlzKHRoaXMuX2hhbmRsZXMpLmxlbmd0aDtpZigwPT09Yil0aGlzLl92YWx1ZT1udWxsO2Vsc2V7dGhpcy5fdmFsdWU9W107Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPXRoaXMuX2tleXNbYVtjXV07ZD09PWImJnRoaXMuX3ZhbHVlLnB1c2goYVtjXSl9fX19LHtrZXk6ImNsZWFyIix2YWx1ZTpmdW5jdGlvbihhKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHRoaXMuX2hhbmRsZXNbYV0pe3ZhciBiPXRoaXMuX2hhbmRsZXNbYV07Ynx8KGI9W10pO2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXRoaXMuX2tleXNbYltjXV0tLTtkZWxldGUgdGhpcy5faGFuZGxlc1thXSx0aGlzLl91cGRhdGVWYWx1ZSgpfX19LHtrZXk6InZhbHVlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmFsdWV9fSx7a2V5OiJfYWxsS2V5cyIsZ2V0OmZ1bmN0aW9uKCl7dmFyIGE9T2JqZWN0LmtleXModGhpcy5fa2V5cyk7cmV0dXJuIGEuc29ydChlKSxhfX1dKSxhfSgpO2MuZGVmYXVsdD1ofSx7Ii4vdXRpbCI6MTF9XSw0OltmdW5jdGlvbihhLGIsYyl7KGZ1bmN0aW9uKGIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEpe3JldHVybiBhJiZhLl9fZXNNb2R1bGU/YTp7ZGVmYXVsdDphfX1mdW5jdGlvbiBlKGEsYil7aWYoIShhIGluc3RhbmNlb2YgYikpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9ZnVuY3Rpb24gZihhKXtpZihhJiYic3RyaW5nIj09dHlwZW9mIGEpcmV0dXJuIGsuaGFzT3duUHJvcGVydHkoYSl8fChrW2FdPW5ldyBsKGEpKSxrW2FdO2lmKCJvYmplY3QiPT09KCJ1bmRlZmluZWQiPT10eXBlb2YgYT8idW5kZWZpbmVkIjpoKGEpKSYmYS5fdmFycyYmYS52YXIpcmV0dXJuIGE7aWYoQXJyYXkuaXNBcnJheShhKSYmMT09YS5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2YgYVswXSlyZXR1cm4gZihhWzBdKTt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgZ3JvdXBOYW1lIGFyZ3VtZW50Iil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1iW2NdO2QuZW51bWVyYWJsZT1kLmVudW1lcmFibGV8fCExLGQuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBkJiYoZC53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZC5rZXksZCl9fXJldHVybiBmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGMmJmEoYi5wcm90b3R5cGUsYyksZCYmYShiLGQpLGJ9fSgpLGg9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmYS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmYSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGF9O2MuZGVmYXVsdD1mO3ZhciBpPWEoIi4vdmFyIiksaj1kKGkpO2IuX19jcm9zc3RhbGtfZ3JvdXBzPWIuX19jcm9zc3RhbGtfZ3JvdXBzfHx7fTt2YXIgaz1iLl9fY3Jvc3N0YWxrX2dyb3VwcyxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtlKHRoaXMsYSksdGhpcy5uYW1lPWIsdGhpcy5fdmFycz17fX1yZXR1cm4gZyhhLFt7a2V5OiJ2YXIiLHZhbHVlOmZ1bmN0aW9uKGEpe2lmKCFhfHwic3RyaW5nIiE9dHlwZW9mIGEpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHZhciBuYW1lIik7cmV0dXJuIHRoaXMuX3ZhcnMuaGFzT3duUHJvcGVydHkoYSl8fCh0aGlzLl92YXJzW2FdPW5ldyBqLmRlZmF1bHQodGhpcyxhKSksdGhpcy5fdmFyc1thXX19LHtrZXk6ImhhcyIsdmFsdWU6ZnVuY3Rpb24oYSl7aWYoIWF8fCJzdHJpbmciIT10eXBlb2YgYSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgdmFyIG5hbWUiKTtyZXR1cm4gdGhpcy5fdmFycy5oYXNPd25Qcm9wZXJ0eShhKX19XSksYX0oKX0pLmNhbGwodGhpcywidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0seyIuL3ZhciI6MTJ9XSw1OltmdW5jdGlvbihhLGIsYyl7KGZ1bmN0aW9uKGIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBkKGEpe3JldHVybiBhJiZhLl9fZXNNb2R1bGU/YTp7ZGVmYXVsdDphfX1mdW5jdGlvbiBlKGEpe3JldHVybiBrLnZhcihhKX1mdW5jdGlvbiBmKGEpe3JldHVybiBrLmhhcyhhKX1PYmplY3QuZGVmaW5lUHJvcGVydHkoYywiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGc9YSgiLi9ncm91cCIpLGg9ZChnKSxpPWEoIi4vc2VsZWN0aW9uIiksaj1hKCIuL2ZpbHRlciIpO2EoIi4vaW5wdXQiKSxhKCIuL2lucHV0X3NlbGVjdGl6ZSIpLGEoIi4vaW5wdXRfY2hlY2tib3hncm91cCIpLGEoIi4vaW5wdXRfc2xpZGVyIik7dmFyIGs9KDAsaC5kZWZhdWx0KSgiZGVmYXVsdCIpO2IuU2hpbnkmJmIuU2hpbnkuYWRkQ3VzdG9tTWVzc2FnZUhhbmRsZXIoInVwZGF0ZS1jbGllbnQtdmFsdWUiLGZ1bmN0aW9uKGEpeyJzdHJpbmciPT10eXBlb2YgYS5ncm91cD8oMCxoLmRlZmF1bHQpKGEuZ3JvdXApLnZhcihhLm5hbWUpLnNldChhLnZhbHVlKTplKGEubmFtZSkuc2V0KGEudmFsdWUpfSk7dmFyIGw9e2dyb3VwOmguZGVmYXVsdCx2YXI6ZSxoYXM6ZixTZWxlY3Rpb25IYW5kbGU6aS5TZWxlY3Rpb25IYW5kbGUsRmlsdGVySGFuZGxlOmouRmlsdGVySGFuZGxlfTtjLmRlZmF1bHQ9bCxiLmNyb3NzdGFsaz1sfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7Ii4vZmlsdGVyIjoyLCIuL2dyb3VwIjo0LCIuL2lucHV0Ijo2LCIuL2lucHV0X2NoZWNrYm94Z3JvdXAiOjcsIi4vaW5wdXRfc2VsZWN0aXplIjo4LCIuL2lucHV0X3NsaWRlciI6OSwiLi9zZWxlY3Rpb24iOjEwfV0sNjpbZnVuY3Rpb24oYSxiLGMpeyhmdW5jdGlvbihhKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYihiKXtpW2IuY2xhc3NOYW1lXT1iLGEuZG9jdW1lbnQmJiJjb21wbGV0ZSIhPT1hLmRvY3VtZW50LnJlYWR5U3RhdGU/aChmdW5jdGlvbigpe2QoKX0pOmEuZG9jdW1lbnQmJnNldFRpbWVvdXQoZCwxMDApfWZ1bmN0aW9uIGQoKXtPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPWlbYV07aCgiLiIrYi5jbGFzc05hbWUpLm5vdCgiLmNyb3NzdGFsay1pbnB1dC1ib3VuZCIpLmVhY2goZnVuY3Rpb24oYSxjKXtnKGIsYyl9KX0pfWZ1bmN0aW9uIGUoYSl7cmV0dXJuIGEucmVwbGFjZSgvKFshIiMkJSYnKCkqKywuXC86Ozw9Pj9AXFtcXFxdXmB7fH1+XSkvZywiXFwkMSIpfWZ1bmN0aW9uIGYoYSl7dmFyIGI9aChhKTtPYmplY3Qua2V5cyhpKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2lmKGIuaGFzQ2xhc3MoYykmJiFiLmhhc0NsYXNzKCJjcm9zc3RhbGstaW5wdXQtYm91bmQiKSl7dmFyIGQ9aVtjXTtnKGQsYSl9fSl9ZnVuY3Rpb24gZyhhLGIpe3ZhciBjPWgoYikuZmluZCgic2NyaXB0W3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXVtkYXRhLWZvcj0nIitlKGIuaWQpKyInXSIpLGQ9SlNPTi5wYXJzZShjWzBdLmlubmVyVGV4dCksZj1hLmZhY3RvcnkoYixkKTtoKGIpLmRhdGEoImNyb3NzdGFsay1pbnN0YW5jZSIsZiksaChiKS5hZGRDbGFzcygiY3Jvc3N0YWxrLWlucHV0LWJvdW5kIil9T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGMucmVnaXN0ZXI9Yjt2YXIgaD1hLmpRdWVyeSxpPXt9O2EuU2hpbnkmJiFmdW5jdGlvbigpe3ZhciBiPW5ldyBhLlNoaW55LklucHV0QmluZGluZyxjPWEualF1ZXJ5O2MuZXh0ZW5kKGIse2ZpbmQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGMoYSkuZmluZCgiLmNyb3NzdGFsay1pbnB1dCIpfSxpbml0aWFsaXplOmZ1bmN0aW9uKGEpe2MoYSkuaGFzQ2xhc3MoImNyb3NzdGFsay1pbnB1dC1ib3VuZCIpfHxmKGEpfSxnZXRJZDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pZH0sZ2V0VmFsdWU6ZnVuY3Rpb24oYSl7fSxzZXRWYWx1ZTpmdW5jdGlvbihhLGIpe30scmVjZWl2ZU1lc3NhZ2U6ZnVuY3Rpb24oYSxiKXt9LHN1YnNjcmliZTpmdW5jdGlvbihhLGIpe2MoYSkuZGF0YSgiY3Jvc3N0YWxrLWluc3RhbmNlIikucmVzdW1lKCl9LHVuc3Vic2NyaWJlOmZ1bmN0aW9uKGEpe2MoYSkuZGF0YSgiY3Jvc3N0YWxrLWluc3RhbmNlIikuc3VzcGVuZCgpfX0pLGEuU2hpbnkuaW5wdXRCaW5kaW5ncy5yZWdpc3RlcihiLCJjcm9zc3RhbGsuaW5wdXRCaW5kaW5nIil9KCl9KS5jYWxsKHRoaXMsInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHt9XSw3OltmdW5jdGlvbihhLGIsYyl7KGZ1bmN0aW9uKGIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBjKGEpe2lmKGEmJmEuX19lc01vZHVsZSlyZXR1cm4gYTt2YXIgYj17fTtpZihudWxsIT1hKWZvcih2YXIgYyBpbiBhKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLGMpJiYoYltjXT1hW2NdKTtyZXR1cm4gYi5kZWZhdWx0PWEsYn12YXIgZD1hKCIuL2lucHV0IiksZT1jKGQpLGY9YSgiLi9maWx0ZXIiKSxnPWIualF1ZXJ5O2UucmVnaXN0ZXIoe2NsYXNzTmFtZToiY3Jvc3N0YWxrLWlucHV0LWNoZWNrYm94Z3JvdXAiLGZhY3Rvcnk6ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgZi5GaWx0ZXJIYW5kbGUoYi5ncm91cCksZD12b2lkIDAsZT1nKGEpO3JldHVybiBlLm9uKCJjaGFuZ2UiLCJpbnB1dFt0eXBlPSdjaGVja2JveCddIixmdW5jdGlvbigpe3ZhciBhPWUuZmluZCgiaW5wdXRbdHlwZT0nY2hlY2tib3gnXTpjaGVja2VkIik7MD09PWEubGVuZ3RoPyhkPW51bGwsYy5jbGVhcigpKTohZnVuY3Rpb24oKXt2YXIgZT17fTthLmVhY2goZnVuY3Rpb24oKXtiLm1hcFt0aGlzLnZhbHVlXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2VbYV09ITB9KX0pO3ZhciBmPU9iamVjdC5rZXlzKGUpO2Yuc29ydCgpLGQ9ZixjLnNldChmKX0oKX0pLHtzdXNwZW5kOmZ1bmN0aW9uKCl7Yy5jbGVhcigpfSxyZXN1bWU6ZnVuY3Rpb24oKXtkJiZjLnNldChkKX19fX0pfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7Ii4vZmlsdGVyIjoyLCIuL2lucHV0Ijo2fV0sODpbZnVuY3Rpb24oYSxiLGMpeyhmdW5jdGlvbihiKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYyhhKXtpZihhJiZhLl9fZXNNb2R1bGUpcmV0dXJuIGE7dmFyIGI9e307aWYobnVsbCE9YSlmb3IodmFyIGMgaW4gYSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxjKSYmKGJbY109YVtjXSk7cmV0dXJuIGIuZGVmYXVsdD1hLGJ9dmFyIGQ9YSgiLi9pbnB1dCIpLGU9YyhkKSxmPWEoIi4vdXRpbCIpLGc9YyhmKSxoPWEoIi4vZmlsdGVyIiksaT1iLmpRdWVyeTtlLnJlZ2lzdGVyKHtjbGFzc05hbWU6ImNyb3NzdGFsay1pbnB1dC1zZWxlY3QiLGZhY3Rvcnk6ZnVuY3Rpb24oYSxiKXt2YXIgYz1be3ZhbHVlOiIiLGxhYmVsOiIoQWxsKSJ9XSxkPWcuZGF0YWZyYW1lVG9EMyhiLml0ZW1zKSxlPXtvcHRpb25zOmMuY29uY2F0KGQpLHZhbHVlRmllbGQ6InZhbHVlIixsYWJlbEZpZWxkOiJsYWJlbCIsc2VhcmNoRmllbGQ6ImxhYmVsIn0sZj1pKGEpLmZpbmQoInNlbGVjdCIpWzBdLGo9aShmKS5zZWxlY3RpemUoZSlbMF0uc2VsZWN0aXplLGs9bmV3IGguRmlsdGVySGFuZGxlKGIuZ3JvdXApLGw9dm9pZCAwO3JldHVybiBqLm9uKCJjaGFuZ2UiLGZ1bmN0aW9uKCl7MD09PWouaXRlbXMubGVuZ3RoPyhsPW51bGwsay5jbGVhcigpKTohZnVuY3Rpb24oKXt2YXIgYT17fTtqLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oYyl7Yi5tYXBbY10uZm9yRWFjaChmdW5jdGlvbihiKXthW2JdPSEwfSl9KTt2YXIgYz1PYmplY3Qua2V5cyhhKTtjLnNvcnQoKSxsPWMsay5zZXQoYyl9KCl9KSx7c3VzcGVuZDpmdW5jdGlvbigpe2suY2xlYXIoKX0scmVzdW1lOmZ1bmN0aW9uKCl7bCYmay5zZXQobCl9fX19KX0pLmNhbGwodGhpcywidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0seyIuL2ZpbHRlciI6MiwiLi9pbnB1dCI6NiwiLi91dGlsIjoxMX1dLDk6W2Z1bmN0aW9uKGEsYixjKXsoZnVuY3Rpb24oYil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGMoYSl7aWYoYSYmYS5fX2VzTW9kdWxlKXJldHVybiBhO3ZhciBiPXt9O2lmKG51bGwhPWEpZm9yKHZhciBjIGluIGEpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGEsYykmJihiW2NdPWFbY10pO3JldHVybiBiLmRlZmF1bHQ9YSxifWZ1bmN0aW9uIGQoYSxiKXtmb3IodmFyIGM9YS50b1N0cmluZygpO2MubGVuZ3RoPGI7KWM9IjAiK2M7cmV0dXJuIGN9ZnVuY3Rpb24gZShhKXtyZXR1cm4gYSBpbnN0YW5jZW9mIERhdGU/YS5nZXRVVENGdWxsWWVhcigpKyItIitkKGEuZ2V0VVRDTW9udGgoKSsxLDIpKyItIitkKGEuZ2V0VVRDRGF0ZSgpLDIpOm51bGx9dmFyIGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7dmFyIGM9W10sZD0hMCxlPSExLGY9dm9pZCAwO3RyeXtmb3IodmFyIGcsaD1hW1N5bWJvbC5pdGVyYXRvcl0oKTshKGQ9KGc9aC5uZXh0KCkpLmRvbmUpJiYoYy5wdXNoKGcudmFsdWUpLCFifHxjLmxlbmd0aCE9PWIpO2Q9ITApO31jYXRjaChhKXtlPSEwLGY9YX1maW5hbGx5e3RyeXshZCYmaC5yZXR1cm4mJmgucmV0dXJuKCl9ZmluYWxseXtpZihlKXRocm93IGZ9fXJldHVybiBjfXJldHVybiBmdW5jdGlvbihiLGMpe2lmKEFycmF5LmlzQXJyYXkoYikpcmV0dXJuIGI7aWYoU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChiKSlyZXR1cm4gYShiLGMpO3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2UiKX19KCksZz1hKCIuL2lucHV0IiksaD1jKGcpLGk9YSgiLi9maWx0ZXIiKSxqPWIualF1ZXJ5LGs9Yi5zdHJmdGltZTtoLnJlZ2lzdGVyKHtjbGFzc05hbWU6ImNyb3NzdGFsay1pbnB1dC1zbGlkZXIiLGZhY3Rvcnk6ZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKCl7dmFyIGE9aC5kYXRhKCJpb25SYW5nZVNsaWRlciIpLnJlc3VsdCxiPXZvaWQgMCxjPWguZGF0YSgiZGF0YS10eXBlIik7cmV0dXJuIGI9ImRhdGUiPT09Yz9mdW5jdGlvbihhKXtyZXR1cm4gZShuZXcgRGF0ZSgrYSkpfToiZGF0ZXRpbWUiPT09Yz9mdW5jdGlvbihhKXtyZXR1cm4rYS8xZTN9OmZ1bmN0aW9uKGEpe3JldHVybithfSwiZG91YmxlIj09PWguZGF0YSgiaW9uUmFuZ2VTbGlkZXIiKS5vcHRpb25zLnR5cGU/W2IoYS5mcm9tKSxiKGEudG8pXTpiKGEuZnJvbSl9dmFyIGQ9bmV3IGkuRmlsdGVySGFuZGxlKGIuZ3JvdXApLGc9e30saD1qKGEpLmZpbmQoImlucHV0IiksbD1oLmRhdGEoImRhdGEtdHlwZSIpLG09aC5kYXRhKCJ0aW1lLWZvcm1hdCIpLG49dm9pZCAwO2lmKCJkYXRlIj09PWwpbj1rLnV0YygpLGcucHJldHRpZnk9ZnVuY3Rpb24oYSl7cmV0dXJuIG4obSxuZXcgRGF0ZShhKSl9O2Vsc2UgaWYoImRhdGV0aW1lIj09PWwpe3ZhciBvPWguZGF0YSgidGltZXpvbmUiKTtuPW8/ay50aW1lem9uZShvKTprLGcucHJldHRpZnk9ZnVuY3Rpb24oYSl7cmV0dXJuIG4obSxuZXcgRGF0ZShhKSl9fWguaW9uUmFuZ2VTbGlkZXIoZyk7dmFyIHA9bnVsbDtyZXR1cm4gaC5vbigiY2hhbmdlLmNyb3NzdGFsa1NsaWRlcklucHV0IixmdW5jdGlvbihhKXtpZighaC5kYXRhKCJ1cGRhdGluZyIpJiYhaC5kYXRhKCJhbmltYXRpbmciKSl7Zm9yKHZhciBlPWMoKSxnPWYoZSwyKSxpPWdbMF0saj1nWzFdLGs9W10sbD0wO2w8Yi52YWx1ZXMubGVuZ3RoO2wrKyl7dmFyIG09Yi52YWx1ZXNbbF07bT49aSYmbTw9aiYmay5wdXNoKGIua2V5c1tsXSl9ay5zb3J0KCksZC5zZXQoaykscD1rfX0pLHtzdXNwZW5kOmZ1bmN0aW9uKCl7ZC5jbGVhcigpfSxyZXN1bWU6ZnVuY3Rpb24oKXtwJiZkLnNldChwKX19fX0pfSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7Ii4vZmlsdGVyIjoyLCIuL2lucHV0Ijo2fV0sMTA6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhKXtpZihhJiZhLl9fZXNNb2R1bGUpcmV0dXJuIGE7dmFyIGI9e307aWYobnVsbCE9YSlmb3IodmFyIGMgaW4gYSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSxjKSYmKGJbY109YVtjXSk7cmV0dXJuIGIuZGVmYXVsdD1hLGJ9ZnVuY3Rpb24gZShhKXtyZXR1cm4gYSYmYS5fX2VzTW9kdWxlP2E6e2RlZmF1bHQ6YX19ZnVuY3Rpb24gZihhLGIpe2lmKCEoYSBpbnN0YW5jZW9mIGIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxjLlNlbGVjdGlvbkhhbmRsZT12b2lkIDA7dmFyIGc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYil7Zm9yKHZhciBjPTA7YzxiLmxlbmd0aDtjKyspe3ZhciBkPWJbY107ZC5lbnVtZXJhYmxlPWQuZW51bWVyYWJsZXx8ITEsZC5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGQmJihkLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSxkLmtleSxkKX19cmV0dXJuIGZ1bmN0aW9uKGIsYyxkKXtyZXR1cm4gYyYmYShiLnByb3RvdHlwZSxjKSxkJiZhKGIsZCksYn19KCksaD1hKCIuL2V2ZW50cyIpLGk9ZShoKSxqPWEoIi4vZ3JvdXAiKSxrPWUoaiksbD1hKCIuL3V0aWwiKSxtPWQobCk7Yy5TZWxlY3Rpb25IYW5kbGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dmFyIGI9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOm51bGwsYz1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06bnVsbDtmKHRoaXMsYSksdGhpcy5fZXZlbnRSZWxheT1uZXcgaS5kZWZhdWx0LHRoaXMuX2VtaXR0ZXI9bmV3IG0uU3Vic2NyaXB0aW9uVHJhY2tlcih0aGlzLl9ldmVudFJlbGF5KSx0aGlzLl9ncm91cD1udWxsLHRoaXMuX3Zhcj1udWxsLHRoaXMuX3Zhck9uQ2hhbmdlU3ViPW51bGwsdGhpcy5fZXh0cmFJbmZvPW0uZXh0ZW5kKHtzZW5kZXI6dGhpc30sYyksdGhpcy5zZXRHcm91cChiKX1yZXR1cm4gZyhhLFt7a2V5OiJzZXRHcm91cCIsdmFsdWU6ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztpZih0aGlzLl9ncm91cCE9PWEmJih0aGlzLl9ncm91cHx8YSkmJih0aGlzLl92YXImJih0aGlzLl92YXIub2ZmKCJjaGFuZ2UiLHRoaXMuX3Zhck9uQ2hhbmdlU3ViKSx0aGlzLl92YXI9bnVsbCx0aGlzLl92YXJPbkNoYW5nZVN1Yj1udWxsKSx0aGlzLl9ncm91cD1hLGEpKXt0aGlzLl92YXI9KDAsay5kZWZhdWx0KShhKS52YXIoInNlbGVjdGlvbiIpO3ZhciBjPXRoaXMuX3Zhci5vbigiY2hhbmdlIixmdW5jdGlvbihhKXtiLl9ldmVudFJlbGF5LnRyaWdnZXIoImNoYW5nZSIsYSxiKX0pO3RoaXMuX3Zhck9uQ2hhbmdlU3ViPWN9fX0se2tleToiX21lcmdlRXh0cmFJbmZvIix2YWx1ZTpmdW5jdGlvbihhKXtyZXR1cm4gbS5leHRlbmQoe30sdGhpcy5fZXh0cmFJbmZvP3RoaXMuX2V4dHJhSW5mbzpudWxsLGE/YTpudWxsKX19LHtrZXk6InNldCIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt0aGlzLl92YXImJnRoaXMuX3Zhci5zZXQoYSx0aGlzLl9tZXJnZUV4dHJhSW5mbyhiKSl9fSx7a2V5OiJjbGVhciIsdmFsdWU6ZnVuY3Rpb24oYSl7dGhpcy5fdmFyJiZ0aGlzLnNldCh2b2lkIDAsdGhpcy5fbWVyZ2VFeHRyYUluZm8oYSkpfX0se2tleToib24iLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuX2VtaXR0ZXIub24oYSxiKX19LHtrZXk6Im9mZiIsdmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5fZW1pdHRlci5vZmYoYSxiKX19LHtrZXk6ImNsb3NlIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuX2VtaXR0ZXIucmVtb3ZlQWxsTGlzdGVuZXJzKCksdGhpcy5zZXRHcm91cChudWxsKX19LHtrZXk6InZhbHVlIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdmFyP3RoaXMuX3Zhci5nZXQoKTpudWxsfX1dKSxhfSgpfSx7Ii4vZXZlbnRzIjoxLCIuL2dyb3VwIjo0LCIuL3V0aWwiOjExfV0sMTE6W2Z1bmN0aW9uKGEsYixjKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhLGIpe2lmKCEoYSBpbnN0YW5jZW9mIGIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfWZ1bmN0aW9uIGUoYSl7Zm9yKHZhciBiPWFyZ3VtZW50cy5sZW5ndGgsYz1BcnJheShiPjE/Yi0xOjApLGQ9MTtkPGI7ZCsrKWNbZC0xXT1hcmd1bWVudHNbZF07Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspe3ZhciBmPWNbZV07aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBmJiZudWxsIT09Zilmb3IodmFyIGcgaW4gZilmLmhhc093blByb3BlcnR5KGcpJiYoYVtnXT1mW2ddKX1yZXR1cm4gYX1mdW5jdGlvbiBmKGEpe2Zvcih2YXIgYj0xO2I8YS5sZW5ndGg7YisrKWlmKGFbYl08PWFbYi0xXSl0aHJvdyBuZXcgRXJyb3IoIkxpc3QgaXMgbm90IHNvcnRlZCBvciBjb250YWlucyBkdXBsaWNhdGUiKX1mdW5jdGlvbiBnKGEsYil7dmFyIGM9MCxkPTA7YXx8KGE9W10pLGJ8fChiPVtdKTt2YXIgZT1bXSxnPVtdO2ZvcihmKGEpLGYoYik7YzxhLmxlbmd0aCYmZDxiLmxlbmd0aDspYVtjXT09PWJbZF0/KGMrKyxkKyspOmFbY108YltkXT9lLnB1c2goYVtjKytdKTpnLnB1c2goYltkKytdKTtyZXR1cm4gYzxhLmxlbmd0aCYmKGU9ZS5jb25jYXQoYS5zbGljZShjKSkpLGQ8Yi5sZW5ndGgmJihnPWcuY29uY2F0KGIuc2xpY2UoZCkpKSx7cmVtb3ZlZDplLGFkZGVkOmd9fWZ1bmN0aW9uIGgoYSl7dmFyIGI9W10sYz12b2lkIDA7Zm9yKHZhciBkIGluIGEpe2lmKGEuaGFzT3duUHJvcGVydHkoZCkmJmIucHVzaChkKSwib2JqZWN0IiE9PWooYVtkXSl8fCJ1bmRlZmluZWQiPT10eXBlb2YgYVtkXS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBjJiZjIT09YVtkXS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpO2M9YVtkXS5sZW5ndGh9Zm9yKHZhciBlPVtdLGY9dm9pZCAwLGc9MDtnPGM7ZysrKXtmPXt9O2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGg7aCsrKWZbYltoXV09YVtiW2hdXVtnXTtlLnB1c2goZil9cmV0dXJuIGV9T2JqZWN0LmRlZmluZVByb3BlcnR5KGMsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIpe2Zvcih2YXIgYz0wO2M8Yi5sZW5ndGg7YysrKXt2YXIgZD1iW2NdO2QuZW51bWVyYWJsZT1kLmVudW1lcmFibGV8fCExLGQuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiBkJiYoZC53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZC5rZXksZCl9fXJldHVybiBmdW5jdGlvbihiLGMsZCl7cmV0dXJuIGMmJmEoYi5wcm90b3R5cGUsYyksZCYmYShiLGQpLGJ9fSgpLGo9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oYSl7cmV0dXJuIHR5cGVvZiBhfTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmYS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmYSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGF9O2MuZXh0ZW5kPWUsYy5jaGVja1NvcnRlZD1mLGMuZGlmZlNvcnRlZExpc3RzPWcsYy5kYXRhZnJhbWVUb0QzPWg7Yy5TdWJzY3JpcHRpb25UcmFja2VyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShiKXtkKHRoaXMsYSksdGhpcy5fZW1pdHRlcj1iLHRoaXMuX3N1YnM9e319cmV0dXJuIGkoYSxbe2tleToib24iLHZhbHVlOmZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5fZW1pdHRlci5vbihhLGIpO3JldHVybiB0aGlzLl9zdWJzW2NdPWEsY319LHtrZXk6Im9mZiIsdmFsdWU6ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLl9lbWl0dGVyLm9mZihhLGIpO3JldHVybiBjJiZkZWxldGUgdGhpcy5fc3Vic1tjXSxjfX0se2tleToicmVtb3ZlQWxsTGlzdGVuZXJzIix2YWx1ZTpmdW5jdGlvbigpe3ZhciBhPXRoaXMsYj10aGlzLl9zdWJzO3RoaXMuX3N1YnM9e30sT2JqZWN0LmtleXMoYikuZm9yRWFjaChmdW5jdGlvbihjKXthLl9lbWl0dGVyLm9mZihiW2NdLGMpfSl9fV0pLGF9KCl9LHt9XSwxMjpbZnVuY3Rpb24oYSxiLGMpeyhmdW5jdGlvbihiKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZChhKXtyZXR1cm4gYSYmYS5fX2VzTW9kdWxlP2E6e2RlZmF1bHQ6YX19ZnVuY3Rpb24gZShhLGIpe2lmKCEoYSBpbnN0YW5jZW9mIGIpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfU9iamVjdC5kZWZpbmVQcm9wZXJ0eShjLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihhKXtyZXR1cm4gdHlwZW9mIGF9OmZ1bmN0aW9uKGEpe3JldHVybiBhJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZhLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZhIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgYX0sZz1mdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXTtkLmVudW1lcmFibGU9ZC5lbnVtZXJhYmxlfHwhMSxkLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gZCYmKGQud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGQua2V5LGQpfX1yZXR1cm4gZnVuY3Rpb24oYixjLGQpe3JldHVybiBjJiZhKGIucHJvdG90eXBlLGMpLGQmJmEoYixkKSxifX0oKSxoPWEoIi4vZXZlbnRzIiksaT1kKGgpLGo9ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGIsYyxkKXtlKHRoaXMsYSksdGhpcy5fZ3JvdXA9Yix0aGlzLl9uYW1lPWMsdGhpcy5fdmFsdWU9ZCx0aGlzLl9ldmVudHM9bmV3IGkuZGVmYXVsdH1yZXR1cm4gZyhhLFt7a2V5OiJnZXQiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfX0se2tleToic2V0Iix2YWx1ZTpmdW5jdGlvbihhLGMpe2lmKHRoaXMuX3ZhbHVlIT09YSl7dmFyIGQ9dGhpcy5fdmFsdWU7dGhpcy5fdmFsdWU9YTt2YXIgZT17fTtpZihjJiYib2JqZWN0Ij09PSgidW5kZWZpbmVkIj09dHlwZW9mIGM/InVuZGVmaW5lZCI6ZihjKSkpZm9yKHZhciBnIGluIGMpYy5oYXNPd25Qcm9wZXJ0eShnKSYmKGVbZ109Y1tnXSk7ZS5vbGRWYWx1ZT1kLGUudmFsdWU9YSx0aGlzLl9ldmVudHMudHJpZ2dlcigiY2hhbmdlIixlLHRoaXMpLGIuU2hpbnkmJmIuU2hpbnkub25JbnB1dENoYW5nZSYmYi5TaGlueS5vbklucHV0Q2hhbmdlKCIuY2xpZW50VmFsdWUtIisobnVsbCE9PXRoaXMuX2dyb3VwLm5hbWU/dGhpcy5fZ3JvdXAubmFtZSsiLSI6IiIpK3RoaXMuX25hbWUsInVuZGVmaW5lZCI9PXR5cGVvZiBhP251bGw6YSl9fX0se2tleToib24iLHZhbHVlOmZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMuX2V2ZW50cy5vbihhLGIpfX0se2tleToib2ZmIix2YWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiB0aGlzLl9ldmVudHMub2ZmKGEsYil9fV0pLGF9KCk7Yy5kZWZhdWx0PWp9KS5jYWxsKHRoaXMsInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHsiLi9ldmVudHMiOjF9XX0se30sWzVdKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y3Jvc3N0YWxrLm1pbi5qcy5tYXA="></script>
<link href="data:text/css;charset=utf-8,%0Aslide%3Anot%28%2Ecurrent%29%20%2Eplotly%2Ehtml%2Dwidget%7B%0Adisplay%3A%20none%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyoqCiogcGxvdGx5LmpzIHYxLjI5LjIKKiBDb3B5cmlnaHQgMjAxMi0yMDE3LCBQbG90bHksIEluYy4KKiBBbGwgcmlnaHRzIHJlc2VydmVkLgoqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQoqLwohZnVuY3Rpb24odCl7aWYoIm9iamVjdCI9PXR5cGVvZiBleHBvcnRzJiYidW5kZWZpbmVkIiE9dHlwZW9mIG1vZHVsZSltb2R1bGUuZXhwb3J0cz10KCk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbXSx0KTtlbHNle3ZhciBlO2U9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjp0aGlzLGUuUGxvdGx5PXQoKX19KGZ1bmN0aW9uKCl7dmFyIHQ7cmV0dXJuIGZ1bmN0aW9uIHQoZSxyLG4pe2Z1bmN0aW9uIGkobyxzKXtpZighcltvXSl7aWYoIWVbb10pe3ZhciBsPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFzJiZsKXJldHVybiBsKG8sITApO2lmKGEpcmV0dXJuIGEobywhMCk7dmFyIHU9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IHUuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsdX12YXIgYz1yW29dPXtleHBvcnRzOnt9fTtlW29dWzBdLmNhbGwoYy5leHBvcnRzLGZ1bmN0aW9uKHQpe3ZhciByPWVbb11bMV1bdF07cmV0dXJuIGkocnx8dCl9LGMsYy5leHBvcnRzLHQsZSxyLG4pfXJldHVybiByW29dLmV4cG9ydHN9Zm9yKHZhciBhPSJmdW5jdGlvbiI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLG89MDtvPG4ubGVuZ3RoO28rKylpKG5bb10pO3JldHVybiBpfSh7MTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10KCIuLi9zcmMvbGliIiksaT17IlgsWCBkaXYiOiJmb250LWZhbWlseTonT3BlbiBTYW5zJywgdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7bWFyZ2luOjA7cGFkZGluZzowOyIsIlggaW5wdXQsWCBidXR0b24iOiJmb250LWZhbWlseTonT3BlbiBTYW5zJywgdmVyZGFuYSwgYXJpYWwsIHNhbnMtc2VyaWY7IiwiWCBpbnB1dDpmb2N1cyxYIGJ1dHRvbjpmb2N1cyI6Im91dGxpbmU6bm9uZTsiLCJYIGEiOiJ0ZXh0LWRlY29yYXRpb246bm9uZTsiLCJYIGE6aG92ZXIiOiJ0ZXh0LWRlY29yYXRpb246bm9uZTsiLCJYIC5jcmlzcCI6InNoYXBlLXJlbmRlcmluZzpjcmlzcEVkZ2VzOyIsIlggLnVzZXItc2VsZWN0LW5vbmUiOiItd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lOy1vLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTsiLCJYIHN2ZyI6Im92ZXJmbG93OmhpZGRlbjsiLCJYIHN2ZyBhIjoiZmlsbDojNDQ3YWRiOyIsIlggc3ZnIGE6aG92ZXIiOiJmaWxsOiMzYzZkYzU7IiwiWCAubWFpbi1zdmciOiJwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7cG9pbnRlci1ldmVudHM6bm9uZTsiLCJYIC5tYWluLXN2ZyAuZHJhZ2xheWVyIjoicG9pbnRlci1ldmVudHM6YWxsOyIsIlggLmN1cnNvci1kZWZhdWx0IjoiY3Vyc29yOmRlZmF1bHQ7IiwiWCAuY3Vyc29yLXBvaW50ZXIiOiJjdXJzb3I6cG9pbnRlcjsiLCJYIC5jdXJzb3ItY3Jvc3NoYWlyIjoiY3Vyc29yOmNyb3NzaGFpcjsiLCJYIC5jdXJzb3ItbW92ZSI6ImN1cnNvcjptb3ZlOyIsIlggLmN1cnNvci1jb2wtcmVzaXplIjoiY3Vyc29yOmNvbC1yZXNpemU7IiwiWCAuY3Vyc29yLXJvdy1yZXNpemUiOiJjdXJzb3I6cm93LXJlc2l6ZTsiLCJYIC5jdXJzb3ItbnMtcmVzaXplIjoiY3Vyc29yOm5zLXJlc2l6ZTsiLCJYIC5jdXJzb3ItZXctcmVzaXplIjoiY3Vyc29yOmV3LXJlc2l6ZTsiLCJYIC5jdXJzb3Itc3ctcmVzaXplIjoiY3Vyc29yOnN3LXJlc2l6ZTsiLCJYIC5jdXJzb3Itcy1yZXNpemUiOiJjdXJzb3I6cy1yZXNpemU7IiwiWCAuY3Vyc29yLXNlLXJlc2l6ZSI6ImN1cnNvcjpzZS1yZXNpemU7IiwiWCAuY3Vyc29yLXctcmVzaXplIjoiY3Vyc29yOnctcmVzaXplOyIsIlggLmN1cnNvci1lLXJlc2l6ZSI6ImN1cnNvcjplLXJlc2l6ZTsiLCJYIC5jdXJzb3ItbnctcmVzaXplIjoiY3Vyc29yOm53LXJlc2l6ZTsiLCJYIC5jdXJzb3Itbi1yZXNpemUiOiJjdXJzb3I6bi1yZXNpemU7IiwiWCAuY3Vyc29yLW5lLXJlc2l6ZSI6ImN1cnNvcjpuZS1yZXNpemU7IiwiWCAubW9kZWJhciI6InBvc2l0aW9uOmFic29sdXRlO3RvcDoycHg7cmlnaHQ6MnB4O3otaW5kZXg6MTAwMTtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC43KTsiLCJYIC5tb2RlYmFyLS1ob3ZlciI6Im9wYWNpdHk6MDstd2Via2l0LXRyYW5zaXRpb246b3BhY2l0eSAwLjNzIGVhc2UgMHM7LW1vei10cmFuc2l0aW9uOm9wYWNpdHkgMC4zcyBlYXNlIDBzOy1tcy10cmFuc2l0aW9uOm9wYWNpdHkgMC4zcyBlYXNlIDBzOy1vLXRyYW5zaXRpb246b3BhY2l0eSAwLjNzIGVhc2UgMHM7dHJhbnNpdGlvbjpvcGFjaXR5IDAuM3MgZWFzZSAwczsiLCJYOmhvdmVyIC5tb2RlYmFyLS1ob3ZlciI6Im9wYWNpdHk6MTsiLCJYIC5tb2RlYmFyLWdyb3VwIjoiZmxvYXQ6bGVmdDtkaXNwbGF5OmlubGluZS1ibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7bWFyZ2luLWxlZnQ6OHB4O3Bvc2l0aW9uOnJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt3aGl0ZS1zcGFjZTpub3dyYXA7IiwiWCAubW9kZWJhci1ncm91cDpmaXJzdC1jaGlsZCI6Im1hcmdpbi1sZWZ0OjBweDsiLCJYIC5tb2RlYmFyLWJ0biI6InBvc2l0aW9uOnJlbGF0aXZlO2ZvbnQtc2l6ZToxNnB4O3BhZGRpbmc6M3B4IDRweDtjdXJzb3I6cG9pbnRlcjtsaW5lLWhlaWdodDpub3JtYWw7Ym94LXNpemluZzpib3JkZXItYm94OyIsIlggLm1vZGViYXItYnRuIHN2ZyI6InBvc2l0aW9uOnJlbGF0aXZlO3RvcDoycHg7IiwiWCAubW9kZWJhci1idG4gcGF0aCI6ImZpbGw6cmdiYSgwLDMxLDk1LDAuMyk7IiwiWCAubW9kZWJhci1idG4uYWN0aXZlIHBhdGgsWCAubW9kZWJhci1idG46aG92ZXIgcGF0aCI6ImZpbGw6cmdiYSgwLDIyLDcyLDAuNSk7IiwiWCAubW9kZWJhci1idG4ubW9kZWJhci1idG4tLWxvZ28iOiJwYWRkaW5nOjNweCAxcHg7IiwiWCAubW9kZWJhci1idG4ubW9kZWJhci1idG4tLWxvZ28gcGF0aCI6ImZpbGw6IzQ0N2FkYiAhaW1wb3J0YW50OyIsIlggW2RhdGEtdGl0bGVdOmJlZm9yZSxYIFtkYXRhLXRpdGxlXTphZnRlciI6InBvc2l0aW9uOmFic29sdXRlOy13ZWJraXQtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApOy1tb3otdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7LW8tdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAwLCAwKTtkaXNwbGF5Om5vbmU7b3BhY2l0eTowO3otaW5kZXg6MTAwMTtwb2ludGVyLWV2ZW50czpub25lO3RvcDoxMTAlO3JpZ2h0OjUwJTsiLCJYIFtkYXRhLXRpdGxlXTpob3ZlcjpiZWZvcmUsWCBbZGF0YS10aXRsZV06aG92ZXI6YWZ0ZXIiOiJkaXNwbGF5OmJsb2NrO29wYWNpdHk6MTsiLCJYIFtkYXRhLXRpdGxlXTpiZWZvcmUiOiJjb250ZW50OicnO3Bvc2l0aW9uOmFic29sdXRlO2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Ym9yZGVyOjZweCBzb2xpZCB0cmFuc3BhcmVudDt6LWluZGV4OjEwMDI7bWFyZ2luLXRvcDotMTJweDtib3JkZXItYm90dG9tLWNvbG9yOiM2OTczOGE7bWFyZ2luLXJpZ2h0Oi02cHg7IiwiWCBbZGF0YS10aXRsZV06YWZ0ZXIiOiJjb250ZW50OmF0dHIoZGF0YS10aXRsZSk7YmFja2dyb3VuZDojNjk3MzhhO2NvbG9yOndoaXRlO3BhZGRpbmc6OHB4IDEwcHg7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MTJweDt3aGl0ZS1zcGFjZTpub3dyYXA7bWFyZ2luLXJpZ2h0Oi0xOHB4O2JvcmRlci1yYWRpdXM6MnB4OyIsIlggLnNlbGVjdC1vdXRsaW5lIjoiZmlsbDpub25lO3N0cm9rZS13aWR0aDoxO3NoYXBlLXJlbmRlcmluZzpjcmlzcEVkZ2VzOyIsIlggLnNlbGVjdC1vdXRsaW5lLTEiOiJzdHJva2U6d2hpdGU7IiwiWCAuc2VsZWN0LW91dGxpbmUtMiI6InN0cm9rZTpibGFjaztzdHJva2UtZGFzaGFycmF5OjJweCAycHg7IixZOiJmb250LWZhbWlseTonT3BlbiBTYW5zJztwb3NpdGlvbjpmaXhlZDt0b3A6NTBweDtyaWdodDoyMHB4O3otaW5kZXg6MTAwMDA7Zm9udC1zaXplOjEwcHQ7bWF4LXdpZHRoOjE4MHB4OyIsIlkgcCI6Im1hcmdpbjowOyIsIlkgLm5vdGlmaWVyLW5vdGUiOiJtaW4td2lkdGg6MTgwcHg7bWF4LXdpZHRoOjI1MHB4O2JvcmRlcjoxcHggc29saWQgI2ZmZjt6LWluZGV4OjMwMDA7bWFyZ2luOjA7YmFja2dyb3VuZC1jb2xvcjojOGM5N2FmO2JhY2tncm91bmQtY29sb3I6cmdiYSgxNDAsMTUxLDE3NSwwLjkpO2NvbG9yOiNmZmY7cGFkZGluZzoxMHB4OyIsIlkgLm5vdGlmaWVyLWNsb3NlIjoiY29sb3I6I2ZmZjtvcGFjaXR5OjAuODtmbG9hdDpyaWdodDtwYWRkaW5nOjAgNXB4O2JhY2tncm91bmQ6bm9uZTtib3JkZXI6bm9uZTtmb250LXNpemU6MjBweDtmb250LXdlaWdodDpib2xkO2xpbmUtaGVpZ2h0OjIwcHg7IiwiWSAubm90aWZpZXItY2xvc2U6aG92ZXIiOiJjb2xvcjojNDQ0O3RleHQtZGVjb3JhdGlvbjpub25lO2N1cnNvcjpwb2ludGVyOyJ9O2Zvcih2YXIgYSBpbiBpKXt2YXIgbz1hLnJlcGxhY2UoL14sLywiICwiKS5yZXBsYWNlKC9YL2csIi5qcy1wbG90bHktcGxvdCAucGxvdGx5IikucmVwbGFjZSgvWS9nLCIucGxvdGx5LW5vdGlmaWVyIik7bi5hZGRTdHlsZVJ1bGUobyxpW2FdKX19LHsiLi4vc3JjL2xpYiI6NzI0fV0sMjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9e3VuZG86e3dpZHRoOjg1Ny4xLHBhdGg6Im04NTcgMzUwcTAtODctMzQtMTY2dC05MS0xMzctMTM3LTkyLTE2Ni0zNHEtOTYgMC0xODMgNDF0LTE0NyAxMTRxLTQgNi00IDEzdDUgMTFsNzYgNzdxNiA1IDE0IDUgOS0xIDEzLTcgNDEtNTMgMTAwLTgydDEyNi0yOXE1OCAwIDExMCAyM3Q5MiA2MSA2MSA5MSAyMiAxMTEtMjIgMTExLTYxIDkxLTkyIDYxLTExMCAyM3EtNTUgMC0xMDUtMjB0LTkwLTU3bDc3LTc3cTE3LTE2IDgtMzgtMTAtMjMtMzMtMjNoLTI1MHEtMTUgMC0yNSAxMXQtMTEgMjV2MjUwcTAgMjQgMjIgMzMgMjIgMTAgMzktOGw3Mi03MnE2MCA1NyAxMzcgODh0MTU5IDMxcTg3IDAgMTY2LTM0dDEzNy05MiA5MS0xMzcgMzQtMTY2eiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LGhvbWU6e3dpZHRoOjkyOC42LHBhdGg6Im03ODYgMjk2di0yNjdxMC0xNS0xMS0yNnQtMjUtMTBoLTIxNHYyMTRoLTE0M3YtMjE0aC0yMTRxLTE1IDAtMjUgMTB0LTExIDI2djI2N3EwIDEgMCAydDAgMmwzMjEgMjY0IDMyMS0yNjRxMS0xIDEtNHogbTEyNCAzOWwtMzQtNDFxLTUtNS0xMi02aC0ycS03IDAtMTIgM2wtMzg2IDMyMi0zODYtMzIycS03LTQtMTMtNC03IDItMTIgN2wtMzUgNDFxLTQgNS0zIDEzdDYgMTJsNDAxIDMzNHExOCAxNSA0MiAxNXQ0My0xNWwxMzYtMTE0djEwOXEwIDggNSAxM3QxMyA1aDEwN3E4IDAgMTMtNXQ1LTEzdi0yMjdsMTIyLTEwMnE1LTUgNi0xMnQtNC0xM3oiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSwiY2FtZXJhLXJldHJvIjp7d2lkdGg6MWUzLHBhdGg6Im01MTggMzg2cTAgOC01IDEzdC0xMyA1cS0zNyAwLTYzLTI3dC0yNi02M3EwLTggNS0xM3QxMy01IDEyIDUgNSAxM3EwIDIzIDE2IDM4dDM4IDE2cTggMCAxMyA1dDUgMTN6IG0xMjUtNzNxMC01OS00Mi0xMDF0LTEwMS00Mi0xMDEgNDItNDIgMTAxIDQyIDEwMSAxMDEgNDIgMTAxLTQyIDQyLTEwMXogbS01NzItMzIwaDg1OHY3MWgtODU4di03MXogbTY0MyAzMjBxMCA4OS02MiAxNTJ0LTE1MiA2Mi0xNTEtNjItNjMtMTUyIDYzLTE1MSAxNTEtNjMgMTUyIDYzIDYyIDE1MXogbS01NzEgMzU4aDIxNHY3MmgtMjE0di03MnogbS03Mi0xMDdoODU4djE0M2gtNDYybC0zNi03MWgtMzYwdi03MnogbTkyOSAxNDN2LTcxNHEwLTMwLTIxLTUxdC01MC0yMWgtODU4cS0yOSAwLTUwIDIxdC0yMSA1MXY3MTRxMCAzMCAyMSA1MXQ1MCAyMWg4NThxMjkgMCA1MC0yMXQyMS01MXoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSx6b29tYm94Ont3aWR0aDoxZTMscGF0aDoibTEwMDAtMjVsLTI1MCAyNTFjNDAgNjMgNjMgMTM4IDYzIDIxOCAwIDIyNC0xODIgNDA2LTQwNyA0MDYtMjI0IDAtNDA2LTE4Mi00MDYtNDA2czE4My00MDYgNDA3LTQwNmM4MCAwIDE1NSAyMiAyMTggNjJsMjUwLTI1MCAxMjUgMTI1eiBtLTgxMiAyNTBsMCA0MzggNDM3IDAgMC00MzgtNDM3IDB6IG02MiAzNzVsMzEzIDAgMC0zMTItMzEzIDAgMCAzMTJ6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0scGFuOnt3aWR0aDoxZTMscGF0aDoibTEwMDAgMzUwbC0xODcgMTg4IDAtMTI1LTI1MCAwIDAgMjUwIDEyNSAwLTE4OCAxODctMTg3LTE4NyAxMjUgMCAwLTI1MC0yNTAgMCAwIDEyNS0xODgtMTg4IDE4Ni0xODcgMCAxMjUgMjUyIDAgMC0yNTAtMTI1IDAgMTg3LTE4OCAxODggMTg4LTEyNSAwIDAgMjUwIDI1MCAwIDAtMTI2IDE4NyAxODh6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sem9vbV9wbHVzOnt3aWR0aDoxZTMscGF0aDoibTEgNzg3bDAtODc1IDg3NSAwIDAgODc1LTg3NSAweiBtNjg3LTUwMGwtMTg3IDAgMC0xODctMTI1IDAgMCAxODctMTg4IDAgMCAxMjUgMTg4IDAgMCAxODcgMTI1IDAgMC0xODcgMTg3IDAgMC0xMjV6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sem9vbV9taW51czp7d2lkdGg6MWUzLHBhdGg6Im0wIDc4OGwwLTg3NiA4NzUgMCAwIDg3Ni04NzUgMHogbTY4OC01MDBsLTUwMCAwIDAgMTI1IDUwMCAwIDAtMTI1eiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LGF1dG9zY2FsZTp7d2lkdGg6MWUzLHBhdGg6Im0yNTAgODUwbC0xODcgMC02MyAwIDAtNjIgMC0xODggNjMgMCAwIDE4OCAxODcgMCAwIDYyeiBtNjg4IDBsLTE4OCAwIDAtNjIgMTg4IDAgMC0xODggNjIgMCAwIDE4OCAwIDYyLTYyIDB6IG0tODc1LTkzOGwwIDE4OC02MyAwIDAtMTg4IDAtNjIgNjMgMCAxODcgMCAwIDYyLTE4NyAweiBtODc1IDE4OGwwLTE4OC0xODggMCAwLTYyIDE4OCAwIDYyIDAgMCA2MiAwIDE4OC02MiAweiBtLTEyNSAxODhsLTEgMC05My05NC0xNTYgMTU2IDE1NiAxNTYgOTItOTMgMiAwIDAgMjUwLTI1MCAwIDAtMiA5My05Mi0xNTYtMTU2LTE1NiAxNTYgOTQgOTIgMCAyLTI1MCAwIDAtMjUwIDAgMCA5MyA5MyAxNTctMTU2LTE1Ny0xNTYtOTMgOTQgMCAwIDAtMjUwIDI1MCAwIDAgMC05NCA5MyAxNTYgMTU3IDE1Ni0xNTctOTMtOTMgMCAwIDI1MCAwIDAgMjUweiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LHRvb2x0aXBfYmFzaWM6e3dpZHRoOjE1MDAscGF0aDoibTM3NSA3MjVsMCAwLTM3NS0zNzUgMzc1LTM3NCAwLTEgMTEyNSAwIDAgNzUwLTExMjUgMHoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSx0b29sdGlwX2NvbXBhcmU6e3dpZHRoOjExMjUscGF0aDoibTE4NyA3ODZsMCAyLTE4Ny0xODggMTg4LTE4NyAwIDAgOTM3IDAgMCAzNzMtOTM4IDB6IG0wLTQ5OWwwIDEtMTg3LTE4OCAxODgtMTg4IDAgMCA5MzcgMCAwIDM3Ni05MzgtMXoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSxwbG90bHlsb2dvOnt3aWR0aDoxNTQyLHBhdGg6Im0wLTEwaDE4MnYtMTQwaC0xODJ2MTQweiBtMjI4IDE0NmgxODN2LTI4NmgtMTgzdjI4NnogbTIyNSA3MTRoMTgydi0xMDAwaC0xODJ2MTAwMHogbTIyNS0yODVoMTgydi03MTVoLTE4MnY3MTV6IG0yMjUgMTQyaDE4M3YtODU3aC0xODN2ODU3eiBtMjMxLTQyOGgxODJ2LTQyOWgtMTgydjQyOXogbTIyNS0yOTFoMTgzdi0xMzhoLTE4M3YxMzh6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sInotYXhpcyI6e3dpZHRoOjFlMyxwYXRoOiJtODMzIDVsLTE3IDEwOHY0MWwtMTMwLTY1IDEzMC02NmMwIDAgMCAzOCAwIDM5IDAtMSAzNi0xNCAzOS0yNSA0LTE1LTYtMjItMTYtMzAtMTUtMTItMzktMTYtNTYtMjAtOTAtMjItMTg3LTIzLTI3OS0yMy0yNjEgMC0zNDEgMzQtMzUzIDU5IDMgNjAgMjI4IDExMCAyMjggMTEwLTE0MC04LTM1MS0zNS0zNTEtMTE2IDAtMTIwIDI5My0xNDIgNDc0LTE0MiAxNTUgMCA0NzcgMjIgNDc3IDE0MiAwIDUwLTc0IDc5LTE2MyA5NnogbS0zNzQgOTRjLTU4LTUtOTktMjEtOTktNDAgMC0yNCA2NS00MyAxNDQtNDMgNzkgMCAxNDMgMTkgMTQzIDQzIDAgMTktNDIgMzQtOTggNDB2MjE2aDg3bC0xMzIgMTM1LTEzMy0xMzVoODh2LTIxNnogbTE2NyA1MTVoLTEzNnYxYzE2IDE2IDMxIDM0IDQ2IDUybDg0IDEwOXY1NGgtMjMwdi03MWgxMjR2LTFjLTE2LTE3LTI4LTMyLTQ0LTUxbC04OS0xMTR2LTUxaDI0NXY3MnoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSwiM2Rfcm90YXRlIjp7d2lkdGg6MWUzLHBhdGg6Im05MjIgNjYwYy01IDQtOSA3LTE0IDExLTM1OSAyNjMtNTgwLTMxLTU4MC0zMWwtMTAyIDI4IDU4LTQwMGMwIDEgMSAxIDIgMiAxMTggMTA4IDM1MSAyNDkgMzUxIDI0OXMtNjIgMjctMTAwIDQyYzg4IDgzIDIyMiAxODMgMzQ3IDEyMiAxNi04IDMwLTE3IDQ0LTI3LTIgMS00IDItNiA0eiBtMzYtMzI5YzAgMCA2NCAyMjktODggMjk2LTYyIDI3LTEyNCAxNC0xNzUtMTEgMTU3LTc4IDIyNS0yMDggMjQ5LTI2NiA4LTE5IDExLTMxIDExLTMxIDIgNSA2IDE1IDExIDMyLTUtMTMtOC0yMC04LTIweiBtLTc3NS0yMzljNzAtMzEgMTE3LTUwIDE5OC0zMi0xMjEgODAtMTk5IDM0Ni0xOTkgMzQ2bC05Ni0xNS01OC0xMmMwIDAgNTUtMjI2IDE1NS0yODd6IG02MDMgMTMzbC0zMTctMTM5YzAgMCA0LTQgMTktMTQgNy01IDI0LTE1IDI0LTE1cy0xNzctMTQ3LTM4OSA0YzIzNS0yODcgNTM2LTExMiA1MzYtMTEybDMxLTIyIDEwMCAyOTktNC0xeiBtLTI5OC0xNTNjNi00IDE0LTkgMjQtMTUgMCAwLTE3IDEwLTI0IDE1eiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LGNhbWVyYTp7d2lkdGg6MWUzLHBhdGg6Im01MDAgNDUwYy04MyAwLTE1MC02Ny0xNTAtMTUwIDAtODMgNjctMTUwIDE1MC0xNTAgODMgMCAxNTAgNjcgMTUwIDE1MCAwIDgzLTY3IDE1MC0xNTAgMTUweiBtNDAwIDE1MGgtMTIwYy0xNiAwLTM0IDEzLTM5IDI5bC0zMSA5M2MtNiAxNS0yMyAyOC00MCAyOGgtMzQwYy0xNiAwLTM0LTEzLTM5LTI4bC0zMS05NGMtNi0xNS0yMy0yOC00MC0yOGgtMTIwYy01NSAwLTEwMC00NS0xMDAtMTAwdi00NTBjMC01NSA0NS0xMDAgMTAwLTEwMGg4MDBjNTUgMCAxMDAgNDUgMTAwIDEwMHY0NTBjMCA1NS00NSAxMDAtMTAwIDEwMHogbS00MDAtNTUwYy0xMzggMC0yNTAgMTEyLTI1MCAyNTAgMCAxMzggMTEyIDI1MCAyNTAgMjUwIDEzOCAwIDI1MC0xMTIgMjUwLTI1MCAwLTEzOC0xMTItMjUwLTI1MC0yNTB6IG0zNjUgMzgwYy0xOSAwLTM1IDE2LTM1IDM1IDAgMTkgMTYgMzUgMzUgMzUgMTkgMCAzNS0xNiAzNS0zNSAwLTE5LTE2LTM1LTM1LTM1eiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LG1vdmllOnt3aWR0aDoxZTMscGF0aDoibTkzOCA0MTNsLTE4OC0xMjVjMCAzNy0xNyA3MS00NCA5NCA2NCAzOCAxMDcgMTA3IDEwNyAxODcgMCAxMjEtOTggMjE5LTIxOSAyMTktMTIxIDAtMjE5LTk4LTIxOS0yMTkgMC02MSAyNS0xMTcgNjYtMTU2aC0xMTVjMzAgMzMgNDkgNzYgNDkgMTI1IDAgMTAzLTg0IDE4Ny0xODcgMTg3cy0xODgtODQtMTg4LTE4N2MwLTU3IDI2LTEwNyA2NS0xNDEtMzgtMjItNjUtNjItNjUtMTA5di0yNTBjMC03MCA1Ni0xMjYgMTI1LTEyNmg1MDBjNjkgMCAxMjUgNTYgMTI1IDEyNmwxODgtMTI2YzM0IDAgNjIgMjggNjIgNjN2Mzc1YzAgMzUtMjggNjMtNjIgNjN6IG0tNzUwIDBjLTY5IDAtMTI1IDU2LTEyNSAxMjVzNTYgMTI1IDEyNSAxMjUgMTI1LTU2IDEyNS0xMjUtNTYtMTI1LTEyNS0xMjV6IG00MDYtMWMtODcgMC0xNTcgNzAtMTU3IDE1NyAwIDg2IDcwIDE1NiAxNTcgMTU2czE1Ni03MCAxNTYtMTU2LTcwLTE1Ny0xNTYtMTU3eiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LHF1ZXN0aW9uOnt3aWR0aDo4NTcuMSxwYXRoOiJtNTAwIDgydjEwN3EwIDgtNSAxM3QtMTMgNWgtMTA3cS04IDAtMTMtNXQtNS0xM3YtMTA3cTAtOCA1LTEzdDEzLTVoMTA3cTggMCAxMyA1dDUgMTN6IG0xNDMgMzc1cTAgNDktMzEgOTF0LTc3IDY1LTk1IDIzcS0xMzYgMC0yMDctMTE5LTktMTQgNC0yNGw3NC01NXE0LTQgMTAtNCA5IDAgMTQgNyAzMCAzOCA0OCA1MSAxOSAxNCA0OCAxNCAyNyAwIDQ4LTE1dDIxLTMzcTAtMjEtMTEtMzR0LTM4LTI1cS0zNS0xNi02NS00OHQtMjktNzB2LTIwcTAtOCA1LTEzdDEzLTVoMTA3cTggMCAxMyA1dDUgMTNxMCAxMCAxMiAyN3QzMCAyOHExOCAxMCAyOCAxNnQyNSAxOSAyNSAyNyAxNiAzNCA3IDQ1eiBtMjE0LTEwN3EwLTExNy01Ny0yMTV0LTE1Ni0xNTYtMjE1LTU4LTIxNiA1OC0xNTUgMTU2LTU4IDIxNSA1OCAyMTUgMTU1IDE1NiAyMTYgNTggMjE1LTU4IDE1Ni0xNTYgNTctMjE1eiIsYXNjZW50Ojg1MCxkZXNjZW50Oi0xNTB9LGRpc2s6e3dpZHRoOjg1Ny4xLHBhdGg6Im0yMTQtN2g0Mjl2MjE0aC00Mjl2LTIxNHogbTUwMCAwaDcydjUwMHEwIDgtNiAyMXQtMTEgMjBsLTE1NyAxNTZxLTUgNi0xOSAxMnQtMjIgNXYtMjMycTAtMjItMTUtMzh0LTM4LTE2aC0zMjJxLTIyIDAtMzcgMTZ0LTE2IDM4djIzMmgtNzJ2LTcxNGg3MnYyMzJxMCAyMiAxNiAzOHQzNyAxNmg0NjVxMjIgMCAzOC0xNnQxNS0zOHYtMjMyeiBtLTIxNCA1MTh2MTc4cTAgOC01IDEzdC0xMyA1aC0xMDdxLTcgMC0xMy01dC01LTEzdi0xNzhxMC04IDUtMTN0MTMtNWgxMDdxNyAwIDEzIDV0NSAxM3ogbTM1Ny0xOHYtNTE4cTAtMjItMTUtMzh0LTM4LTE2aC03NTBxLTIzIDAtMzggMTZ0LTE2IDM4djc1MHEwIDIyIDE2IDM4dDM4IDE2aDUxN3EyMyAwIDUwLTEydDQyLTI2bDE1Ni0xNTdxMTYtMTUgMjctNDJ0MTEtNDl6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sbGFzc286e3dpZHRoOjEwMzEscGF0aDoibTEwMTggNTM4Yy0zNiAyMDctMjkwIDMzNi01NjggMjg2LTI3Ny00OC00NzMtMjU2LTQzNi00NjMgMTAtNTcgMzYtMTA4IDc2LTE1MS0xMy02NiAxMS0xMzcgNjgtMTgzIDM0LTI4IDc1LTQxIDExNC00MmwtNTUtNzAgMCAwYy0yLTEtMy0yLTQtMy0xMC0xNC04LTM0IDUtNDUgMTQtMTEgMzQtOCA0NSA0IDEgMSAyIDMgMiA1bDAgMCAxMTMgMTQwYzE2IDExIDMxIDI0IDQ1IDQwIDQgMyA2IDcgOCAxMSA0OC0zIDEwMCAwIDE1MSA5IDI3OCA0OCA0NzMgMjU1IDQzNiA0NjJ6IG0tNjI0LTM3OWMtODAgMTQtMTQ5IDQ4LTE5NyA5NiA0MiA0MiAxMDkgNDcgMTU2IDkgMzMtMjYgNDctNjYgNDEtMTA1eiBtLTE4Ny03NGMtMTkgMTYtMzMgMzctMzkgNjAgNTAtMzIgMTA5LTU1IDE3NC02OC00Mi0yNS05NS0yNC0xMzUgOHogbTM2MCA3NWMtMzQtNy02OS05LTEwMi04IDggNjItMTYgMTI4LTY4IDE3MC03MyA1OS0xNzUgNTQtMjQ0LTUtOSAyMC0xNiA0MC0yMCA2MS0yOCAxNTkgMTIxIDMxNyAzMzMgMzU0czQwNy02MCA0MzQtMjE3YzI4LTE1OS0xMjEtMzE4LTMzMy0zNTV6Iixhc2NlbnQ6ODUwLGRlc2NlbnQ6LTE1MH0sc2VsZWN0Ym94Ont3aWR0aDoxZTMscGF0aDoibTAgODUwbDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiBtMjg2IDBsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG0yODUgMGwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbTI4NiAwbDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiBtLTg1Ny0yODZsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG04NTcgMGwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbS04NTctMjg1bDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiBtODU3IDBsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG0tODU3LTI4NmwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHogbTI4NiAwbDAtMTQzIDE0MyAwIDAgMTQzLTE0MyAweiBtMjg1IDBsMC0xNDMgMTQzIDAgMCAxNDMtMTQzIDB6IG0yODYgMGwwLTE0MyAxNDMgMCAwIDE0My0xNDMgMHoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfSxzcGlrZWxpbmU6e3dpZHRoOjFlMyxwYXRoOiJNNTEyIDQwOWMwLTU3LTQ2LTEwNC0xMDMtMTA0LTU3IDAtMTA0IDQ3LTEwNCAxMDQgMCA1NyA0NyAxMDMgMTA0IDEwMyA1NyAwIDEwMy00NiAxMDMtMTAzeiBtLTMyNy0zOWw5MiAwIDAgOTItOTIgMHogbS0xODUgMGw5MiAwIDAgOTItOTIgMHogbTM3MC0xODZsOTIgMCAwIDkzLTkyIDB6IG0wLTE4NGw5MiAwIDAgOTItOTIgMHoiLGFzY2VudDo4NTAsZGVzY2VudDotMTUwfX19LHt9XSwzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2JhciIpfSx7Ii4uL3NyYy90cmFjZXMvYmFyIjo4NTZ9XSw0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2JveCIpfSx7Ii4uL3NyYy90cmFjZXMvYm94Ijo4Njh9XSw1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvY29tcG9uZW50cy9jYWxlbmRhcnMiKX0seyIuLi9zcmMvY29tcG9uZW50cy9jYWxlbmRhcnMiOjYwMH1dLDY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvY2FuZGxlc3RpY2siKX0seyIuLi9zcmMvdHJhY2VzL2NhbmRsZXN0aWNrIjo4NzZ9XSw3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2NhcnBldCIpfSx7Ii4uL3NyYy90cmFjZXMvY2FycGV0Ijo4OTd9XSw4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2Nob3JvcGxldGgiKX0seyIuLi9zcmMvdHJhY2VzL2Nob3JvcGxldGgiOjkxMn1dLDk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvY29udG91ciIpfSx7Ii4uL3NyYy90cmFjZXMvY29udG91ciI6OTIzfV0sMTA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvY29udG91cmNhcnBldCIpfSx7Ii4uL3NyYy90cmFjZXMvY29udG91cmNhcnBldCI6OTM4fV0sMTE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy9jb3JlIil9LHsiLi4vc3JjL2NvcmUiOjcwN31dLDEyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhbnNmb3Jtcy9maWx0ZXIiKX0seyIuLi9zcmMvdHJhbnNmb3Jtcy9maWx0ZXIiOjEwOTd9XSwxMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYW5zZm9ybXMvZ3JvdXBieSIpfSx7Ii4uL3NyYy90cmFuc2Zvcm1zL2dyb3VwYnkiOjEwOTh9XSwxNDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9oZWF0bWFwIil9LHsiLi4vc3JjL3RyYWNlcy9oZWF0bWFwIjo5NTF9XSwxNTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9oZWF0bWFwZ2wiKX0seyIuLi9zcmMvdHJhY2VzL2hlYXRtYXBnbCI6OTYwfV0sMTY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvaGlzdG9ncmFtIil9LHsiLi4vc3JjL3RyYWNlcy9oaXN0b2dyYW0iOjk2OH1dLDE3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL2hpc3RvZ3JhbTJkIil9LHsiLi4vc3JjL3RyYWNlcy9oaXN0b2dyYW0yZCI6OTczfV0sMTg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvaGlzdG9ncmFtMmRjb250b3VyIil9LHsiLi4vc3JjL3RyYWNlcy9oaXN0b2dyYW0yZGNvbnRvdXIiOjk3N31dLDE5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO3ZhciBuPXQoIi4vY29yZSIpO24ucmVnaXN0ZXIoW3QoIi4vYmFyIiksdCgiLi9ib3giKSx0KCIuL2hlYXRtYXAiKSx0KCIuL2hpc3RvZ3JhbSIpLHQoIi4vaGlzdG9ncmFtMmQiKSx0KCIuL2hpc3RvZ3JhbTJkY29udG91ciIpLHQoIi4vcGllIiksdCgiLi9jb250b3VyIiksdCgiLi9zY2F0dGVydGVybmFyeSIpLHQoIi4vc2Fua2V5IiksdCgiLi9zY2F0dGVyM2QiKSx0KCIuL3N1cmZhY2UiKSx0KCIuL21lc2gzZCIpLHQoIi4vc2NhdHRlcmdlbyIpLHQoIi4vY2hvcm9wbGV0aCIpLHQoIi4vc2NhdHRlcmdsIiksdCgiLi9wb2ludGNsb3VkIiksdCgiLi9oZWF0bWFwZ2wiKSx0KCIuL3BhcmNvb3JkcyIpLHQoIi4vc2NhdHRlcm1hcGJveCIpLHQoIi4vY2FycGV0IiksdCgiLi9zY2F0dGVyY2FycGV0IiksdCgiLi9jb250b3VyY2FycGV0IiksdCgiLi9vaGxjIiksdCgiLi9jYW5kbGVzdGljayIpXSksbi5yZWdpc3RlcihbdCgiLi9maWx0ZXIiKSx0KCIuL2dyb3VwYnkiKSx0KCIuL3NvcnQiKV0pLG4ucmVnaXN0ZXIoW3QoIi4vY2FsZW5kYXJzIildKSxlLmV4cG9ydHM9bn0seyIuL2JhciI6MywiLi9ib3giOjQsIi4vY2FsZW5kYXJzIjo1LCIuL2NhbmRsZXN0aWNrIjo2LCIuL2NhcnBldCI6NywiLi9jaG9yb3BsZXRoIjo4LCIuL2NvbnRvdXIiOjksIi4vY29udG91cmNhcnBldCI6MTAsIi4vY29yZSI6MTEsIi4vZmlsdGVyIjoxMiwiLi9ncm91cGJ5IjoxMywiLi9oZWF0bWFwIjoxNCwiLi9oZWF0bWFwZ2wiOjE1LCIuL2hpc3RvZ3JhbSI6MTYsIi4vaGlzdG9ncmFtMmQiOjE3LCIuL2hpc3RvZ3JhbTJkY29udG91ciI6MTgsIi4vbWVzaDNkIjoyMCwiLi9vaGxjIjoyMSwiLi9wYXJjb29yZHMiOjIyLCIuL3BpZSI6MjMsIi4vcG9pbnRjbG91ZCI6MjQsIi4vc2Fua2V5IjoyNSwiLi9zY2F0dGVyM2QiOjI2LCIuL3NjYXR0ZXJjYXJwZXQiOjI3LCIuL3NjYXR0ZXJnZW8iOjI4LCIuL3NjYXR0ZXJnbCI6MjksIi4vc2NhdHRlcm1hcGJveCI6MzAsIi4vc2NhdHRlcnRlcm5hcnkiOjMxLCIuL3NvcnQiOjMyLCIuL3N1cmZhY2UiOjMzfV0sMjA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvbWVzaDNkIil9LHsiLi4vc3JjL3RyYWNlcy9tZXNoM2QiOjk4M31dLDIxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL29obGMiKX0seyIuLi9zcmMvdHJhY2VzL29obGMiOjk4OH1dLDIyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL3BhcmNvb3JkcyIpfSx7Ii4uL3NyYy90cmFjZXMvcGFyY29vcmRzIjo5OTd9XSwyMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9waWUiKX0seyIuLi9zcmMvdHJhY2VzL3BpZSI6MTAwNn1dLDI0OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL3BvaW50Y2xvdWQiKX0seyIuLi9zcmMvdHJhY2VzL3BvaW50Y2xvdWQiOjEwMTV9XSwyNTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9zYW5rZXkiKX0seyIuLi9zcmMvdHJhY2VzL3NhbmtleSI6MTAyMX1dLDI2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL3NjYXR0ZXIzZCIpfSx7Ii4uL3NyYy90cmFjZXMvc2NhdHRlcjNkIjoxMDUzfV0sMjc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZS5leHBvcnRzPXQoIi4uL3NyYy90cmFjZXMvc2NhdHRlcmNhcnBldCIpfSx7Ii4uL3NyYy90cmFjZXMvc2NhdHRlcmNhcnBldCI6MTA1OH1dLDI4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL3NjYXR0ZXJnZW8iKX0seyIuLi9zcmMvdHJhY2VzL3NjYXR0ZXJnZW8iOjEwNjd9XSwyOTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9zY2F0dGVyZ2wiKX0seyIuLi9zcmMvdHJhY2VzL3NjYXR0ZXJnbCI6MTA3M31dLDMwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2UuZXhwb3J0cz10KCIuLi9zcmMvdHJhY2VzL3NjYXR0ZXJtYXBib3giKX0seyIuLi9zcmMvdHJhY2VzL3NjYXR0ZXJtYXBib3giOjEwODB9XSwzMTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9zY2F0dGVydGVybmFyeSIpfSx7Ii4uL3NyYy90cmFjZXMvc2NhdHRlcnRlcm5hcnkiOjEwODd9XSwzMjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYW5zZm9ybXMvc29ydCIpfSx7Ii4uL3NyYy90cmFuc2Zvcm1zL3NvcnQiOjEwOTl9XSwzMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9dCgiLi4vc3JjL3RyYWNlcy9zdXJmYWNlIil9LHsiLi4vc3JjL3RyYWNlcy9zdXJmYWNlIjoxMDk2fV0sMzQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe2Z1bmN0aW9uIHIoZSxyLG4sYSl7dmFyIG89MS90LmNsaWVudEhlaWdodCxzPW8qKHItbSksbD1vKihuLXYpLGM9cC5mbGlwWD8xOi0xLGY9cC5mbGlwWT8xOi0xLGQ9TWF0aC5QSSpwLnJvdGF0ZVNwZWVkLHk9aSgpO2lmKDEmZSlhLnNoaWZ0P3Uucm90YXRlKHksMCwwLC1zKmQpOnUucm90YXRlKHksYypkKnMsLWYqZCpsLDApO2Vsc2UgaWYoMiZlKXUucGFuKHksLXAudHJhbnNsYXRlU3BlZWQqcypoLHAudHJhbnNsYXRlU3BlZWQqbCpoLDApO2Vsc2UgaWYoNCZlKXt2YXIgYj1wLnpvb21TcGVlZCpsL3dpbmRvdy5pbm5lckhlaWdodCooeS11Lmxhc3RUKCkpKjUwO3UucGFuKHksMCwwLGgqKE1hdGguZXhwKGIpLTEpKX1tPXIsdj1uLGc9YX10PXR8fGRvY3VtZW50LmJvZHksZT1lfHx7fTt2YXIgbj1bLjAxLDEvMF07ImRpc3RhbmNlTGltaXRzImluIGUmJihuWzBdPWUuZGlzdGFuY2VMaW1pdHNbMF0sblsxXT1lLmRpc3RhbmNlTGltaXRzWzFdKSwiem9vbU1pbiJpbiBlJiYoblswXT1lLnpvb21NaW4pLCJ6b29tTWF4ImluIGUmJihuWzFdPWUuem9vbU1heCk7dmFyIHU9YSh7Y2VudGVyOmUuY2VudGVyfHxbMCwwLDBdLHVwOmUudXB8fFswLDEsMF0sZXllOmUuZXllfHxbMCwwLDEwXSxtb2RlOmUubW9kZXx8Im9yYml0IixkaXN0YW5jZUxpbWl0czpufSksYz1bMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMF0saD0wLGY9dC5jbGllbnRXaWR0aCxkPXQuY2xpZW50SGVpZ2h0LHA9e3ZpZXc6dSxlbGVtZW50OnQsZGVsYXk6ZS5kZWxheXx8MTYscm90YXRlU3BlZWQ6ZS5yb3RhdGVTcGVlZHx8MSx6b29tU3BlZWQ6ZS56b29tU3BlZWR8fDEsdHJhbnNsYXRlU3BlZWQ6ZS50cmFuc2xhdGVTcGVlZHx8MSxmbGlwWDohIWUuZmxpcFgsZmxpcFk6ISFlLmZsaXBZLG1vZGVzOnUubW9kZXMsdGljazpmdW5jdGlvbigpe3ZhciBlPWkoKSxyPXRoaXMuZGVsYXk7dS5pZGxlKGUtciksdS5mbHVzaChlLSgxMDArMipyKSk7dmFyIG49ZS0yKnI7dS5yZWNhbGNNYXRyaXgobik7Zm9yKHZhciBhPSEwLG89dS5jb21wdXRlZE1hdHJpeCxzPTA7czwxNjsrK3MpYT1hJiZjW3NdPT09b1tzXSxjW3NdPW9bc107dmFyIGw9dC5jbGllbnRXaWR0aD09PWYmJnQuY2xpZW50SGVpZ2h0PT09ZDtyZXR1cm4gZj10LmNsaWVudFdpZHRoLGQ9dC5jbGllbnRIZWlnaHQsYT8hbDooaD1NYXRoLmV4cCh1LmNvbXB1dGVkUmFkaXVzWzBdKSwhMCl9LGxvb2tBdDpmdW5jdGlvbih0LGUscil7dS5sb29rQXQodS5sYXN0VCgpLHQsZSxyKX0scm90YXRlOmZ1bmN0aW9uKHQsZSxyKXt1LnJvdGF0ZSh1Lmxhc3RUKCksdCxlLHIpfSxwYW46ZnVuY3Rpb24odCxlLHIpe3UucGFuKHUubGFzdFQoKSx0LGUscil9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LGUscil7dS50cmFuc2xhdGUodS5sYXN0VCgpLHQsZSxyKX19O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHAse21hdHJpeDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHUuY29tcHV0ZWRNYXRyaXh9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gdS5zZXRNYXRyaXgodS5sYXN0VCgpLHQpLHUuY29tcHV0ZWRNYXRyaXh9LGVudW1lcmFibGU6ITB9LG1vZGU6e2dldDpmdW5jdGlvbigpe3JldHVybiB1LmdldE1vZGUoKX0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB1LnNldE1vZGUodCksdS5nZXRNb2RlKCl9LGVudW1lcmFibGU6ITB9LGNlbnRlcjp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHUuY29tcHV0ZWRDZW50ZXJ9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gdS5sb29rQXQodS5sYXN0VCgpLHQpLHUuY29tcHV0ZWRDZW50ZXJ9LGVudW1lcmFibGU6ITB9LGV5ZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHUuY29tcHV0ZWRFeWV9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gdS5sb29rQXQodS5sYXN0VCgpLG51bGwsdCksdS5jb21wdXRlZEV5ZX0sZW51bWVyYWJsZTohMH0sdXA6e2dldDpmdW5jdGlvbigpe3JldHVybiB1LmNvbXB1dGVkVXB9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gdS5sb29rQXQodS5sYXN0VCgpLG51bGwsbnVsbCx0KSx1LmNvbXB1dGVkVXB9LGVudW1lcmFibGU6ITB9LGRpc3RhbmNlOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaH0sc2V0OmZ1bmN0aW9uKHQpe3JldHVybiB1LnNldERpc3RhbmNlKHUubGFzdFQoKSx0KSx0fSxlbnVtZXJhYmxlOiEwfSxkaXN0YW5jZUxpbWl0czp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHUuZ2V0RGlzdGFuY2VMaW1pdHMobil9LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gdS5zZXREaXN0YW5jZUxpbWl0cyh0KSx0fSxlbnVtZXJhYmxlOiEwfX0pLHQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLGZ1bmN0aW9uKHQpe3JldHVybiB0LnByZXZlbnREZWZhdWx0KCksITF9KTt2YXIgbT0wLHY9MCxnPXtzaGlmdDohMSxjb250cm9sOiExLGFsdDohMSxtZXRhOiExfTtyZXR1cm4gbyh0LHIpLHQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsZnVuY3Rpb24oZSl7dmFyIG49bChlLmNoYW5nZWRUb3VjaGVzWzBdLHQpO3IoMCxuWzBdLG5bMV0sZykscigxLG5bMF0sblsxXSxnKX0pLHQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2htb3ZlIixmdW5jdGlvbihlKXt2YXIgbj1sKGUuY2hhbmdlZFRvdWNoZXNbMF0sdCk7cigxLG5bMF0sblsxXSxnKX0pLHQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLGZ1bmN0aW9uKGUpe2woZS5jaGFuZ2VkVG91Y2hlc1swXSx0KTtyKDAsbSx2LGcpfSkscyh0LGZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1wLmZsaXBYPzE6LTEsYT1wLmZsaXBZPzE6LTEsbz1pKCk7aWYoTWF0aC5hYnModCk+TWF0aC5hYnMoZSkpdS5yb3RhdGUobywwLDAsLXQqbipNYXRoLlBJKnAucm90YXRlU3BlZWQvd2luZG93LmlubmVyV2lkdGgpO2Vsc2V7dmFyIHM9cC56b29tU3BlZWQqYSplL3dpbmRvdy5pbm5lckhlaWdodCooby11Lmxhc3RUKCkpLzEwMDt1LnBhbihvLDAsMCxoKihNYXRoLmV4cChzKS0xKSl9fSwhMCkscH1lLmV4cG9ydHM9bjt2YXIgaT10KCJyaWdodC1ub3ciKSxhPXQoIjNkLXZpZXciKSxvPXQoIm1vdXNlLWNoYW5nZSIpLHM9dCgibW91c2Utd2hlZWwiKSxsPXQoIm1vdXNlLWV2ZW50LW9mZnNldCIpfSx7IjNkLXZpZXciOjM1LCJtb3VzZS1jaGFuZ2UiOjQ1MCwibW91c2UtZXZlbnQtb2Zmc2V0Ijo0NTEsIm1vdXNlLXdoZWVsIjo0NTMsInJpZ2h0LW5vdyI6NTAwfV0sMzU6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3RoaXMuX2NvbnRyb2xsZXJOYW1lcz1PYmplY3Qua2V5cyh0KSx0aGlzLl9jb250cm9sbGVyTGlzdD10aGlzLl9jb250cm9sbGVyTmFtZXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSksdGhpcy5fbW9kZT1lLHRoaXMuX2FjdGl2ZT10W2VdLHRoaXMuX2FjdGl2ZXx8KHRoaXMuX21vZGU9InR1cm50YWJsZSIsdGhpcy5fYWN0aXZlPXQudHVybnRhYmxlKSx0aGlzLm1vZGVzPXRoaXMuX2NvbnRyb2xsZXJOYW1lcyx0aGlzLmNvbXB1dGVkTWF0cml4PXRoaXMuX2FjdGl2ZS5jb21wdXRlZE1hdHJpeCx0aGlzLmNvbXB1dGVkRXllPXRoaXMuX2FjdGl2ZS5jb21wdXRlZEV5ZSx0aGlzLmNvbXB1dGVkVXA9dGhpcy5fYWN0aXZlLmNvbXB1dGVkVXAsdGhpcy5jb21wdXRlZENlbnRlcj10aGlzLl9hY3RpdmUuY29tcHV0ZWRDZW50ZXIsdGhpcy5jb21wdXRlZFJhZGl1cz10aGlzLl9hY3RpdmUuY29tcHV0ZWRSYWRpdXN9ZnVuY3Rpb24gaSh0KXt0PXR8fHt9O3ZhciBlPXQuZXllfHxbMCwwLDFdLHI9dC5jZW50ZXJ8fFswLDAsMF0saT10LnVwfHxbMCwxLDBdLGw9dC5kaXN0YW5jZUxpbWl0c3x8WzAsMS8wXSx1PXQubW9kZXx8InR1cm50YWJsZSIsYz1hKCksaD1vKCksZj1zKCk7cmV0dXJuIGMuc2V0RGlzdGFuY2VMaW1pdHMobFswXSxsWzFdKSxjLmxvb2tBdCgwLGUscixpKSxoLnNldERpc3RhbmNlTGltaXRzKGxbMF0sbFsxXSksaC5sb29rQXQoMCxlLHIsaSksZi5zZXREaXN0YW5jZUxpbWl0cyhsWzBdLGxbMV0pLGYubG9va0F0KDAsZSxyLGkpLG5ldyBuKHt0dXJudGFibGU6YyxvcmJpdDpoLG1hdHJpeDpmfSx1KX1lLmV4cG9ydHM9aTt2YXIgYT10KCJ0dXJudGFibGUtY2FtZXJhLWNvbnRyb2xsZXIiKSxvPXQoIm9yYml0LWNhbWVyYS1jb250cm9sbGVyIikscz10KCJtYXRyaXgtY2FtZXJhLWNvbnRyb2xsZXIiKSxsPW4ucHJvdG90eXBlO1tbImZsdXNoIiwxXSxbImlkbGUiLDFdLFsibG9va0F0Iiw0XSxbInJvdGF0ZSIsNF0sWyJwYW4iLDRdLFsidHJhbnNsYXRlIiw0XSxbInNldE1hdHJpeCIsMl0sWyJzZXREaXN0YW5jZUxpbWl0cyIsMl0sWyJzZXREaXN0YW5jZSIsMl1dLmZvckVhY2goZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF0scj1bXSxuPTA7bjx0WzFdOysrbilyLnB1c2goImEiK24pO3ZhciBpPSJ2YXIgY2M9dGhpcy5fY29udHJvbGxlckxpc3Q7Zm9yKHZhciBpPTA7aTxjYy5sZW5ndGg7KytpKXtjY1tpXS4iK3RbMF0rIigiK3Iuam9pbigpKyIpfSI7bFtlXT1GdW5jdGlvbi5hcHBseShudWxsLHIuY29uY2F0KGkpKX0pLGwucmVjYWxjTWF0cml4PWZ1bmN0aW9uKHQpe3RoaXMuX2FjdGl2ZS5yZWNhbGNNYXRyaXgodCl9LGwuZ2V0RGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2FjdGl2ZS5nZXREaXN0YW5jZSh0KX0sbC5nZXREaXN0YW5jZUxpbWl0cz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYWN0aXZlLmdldERpc3RhbmNlTGltaXRzKHQpfSxsLmxhc3RUPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FjdGl2ZS5sYXN0VCgpfSxsLnNldE1vZGU9ZnVuY3Rpb24odCl7aWYodCE9PXRoaXMuX21vZGUpe3ZhciBlPXRoaXMuX2NvbnRyb2xsZXJOYW1lcy5pbmRleE9mKHQpO2lmKCEoZTwwKSl7dmFyIHI9dGhpcy5fYWN0aXZlLG49dGhpcy5fY29udHJvbGxlckxpc3RbZV0saT1NYXRoLm1heChyLmxhc3RUKCksbi5sYXN0VCgpKTtyLnJlY2FsY01hdHJpeChpKSxuLnNldE1hdHJpeChpLHIuY29tcHV0ZWRNYXRyaXgpLHRoaXMuX2FjdGl2ZT1uLHRoaXMuX21vZGU9dCx0aGlzLmNvbXB1dGVkTWF0cml4PXRoaXMuX2FjdGl2ZS5jb21wdXRlZE1hdHJpeCx0aGlzLmNvbXB1dGVkRXllPXRoaXMuX2FjdGl2ZS5jb21wdXRlZEV5ZSx0aGlzLmNvbXB1dGVkVXA9dGhpcy5fYWN0aXZlLmNvbXB1dGVkVXAsdGhpcy5jb21wdXRlZENlbnRlcj10aGlzLl9hY3RpdmUuY29tcHV0ZWRDZW50ZXIsdGhpcy5jb21wdXRlZFJhZGl1cz10aGlzLl9hY3RpdmUuY29tcHV0ZWRSYWRpdXN9fX0sbC5nZXRNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vZGV9fSx7Im1hdHJpeC1jYW1lcmEtY29udHJvbGxlciI6NDQ4LCJvcmJpdC1jYW1lcmEtY29udHJvbGxlciI6NDcxLCJ0dXJudGFibGUtY2FtZXJhLWNvbnRyb2xsZXIiOjUzNn1dLDM2OltmdW5jdGlvbihlLHIsbil7IWZ1bmN0aW9uKGksYSl7Im9iamVjdCI9PXR5cGVvZiBuJiZ2b2lkIDAhPT1yP2EobixlKCJkMy1hcnJheSIpLGUoImQzLWNvbGxlY3Rpb24iKSxlKCJkMy1pbnRlcnBvbGF0ZSIpKToiZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5hbWQ/dChbImV4cG9ydHMiLCJkMy1hcnJheSIsImQzLWNvbGxlY3Rpb24iLCJkMy1pbnRlcnBvbGF0ZSJdLGEpOmEoaS5kMz1pLmQzfHx7fSxpLmQzLGkuZDMsaS5kMyl9KHRoaXMsZnVuY3Rpb24odCxlLHIsbil7InVzZSBzdHJpY3QiO3ZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3YuZm9yRWFjaChmdW5jdGlvbih0KXt0LnNvdXJjZUxpbmtzPVtdLHQudGFyZ2V0TGlua3M9W119KSxnLmZvckVhY2goZnVuY3Rpb24odCxlKXt2YXIgcj10LnNvdXJjZSxuPXQudGFyZ2V0OyJudW1iZXIiPT10eXBlb2YgciYmKHI9dC5zb3VyY2U9dlt0LnNvdXJjZV0pLCJudW1iZXIiPT10eXBlb2YgbiYmKG49dC50YXJnZXQ9dlt0LnRhcmdldF0pLHQub3JpZ2luYWxJbmRleD1lLHIuc291cmNlTGlua3MucHVzaCh0KSxuLnRhcmdldExpbmtzLnB1c2godCl9KX1mdW5jdGlvbiBpKCl7di5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QudmFsdWU9TWF0aC5tYXgoZS5zdW0odC5zb3VyY2VMaW5rcyxoKSxlLnN1bSh0LnRhcmdldExpbmtzLGgpKX0pfWZ1bmN0aW9uIGEoKXtmb3IodmFyIHQsZT12LHI9MDtlLmxlbmd0aDspdD1bXSxlLmZvckVhY2goZnVuY3Rpb24oZSl7ZS54PXIsZS5keD1kLGUuc291cmNlTGlua3MuZm9yRWFjaChmdW5jdGlvbihlKXt0LmluZGV4T2YoZS50YXJnZXQpPDAmJnQucHVzaChlLnRhcmdldCl9KX0pLGU9dCwrK3I7byhyKSxzKChtWzBdLWQpLyhyLTEpKX1mdW5jdGlvbiBvKHQpe3YuZm9yRWFjaChmdW5jdGlvbihlKXtlLnNvdXJjZUxpbmtzLmxlbmd0aHx8KGUueD10LTEpfSl9ZnVuY3Rpb24gcyh0KXt2LmZvckVhY2goZnVuY3Rpb24oZSl7ZS54Kj10fSl9ZnVuY3Rpb24gbCh0KXtmdW5jdGlvbiBuKCl7YS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlLHIsbixhPTAsbz10Lmxlbmd0aDtmb3IodC5zb3J0KGkpLG49MDtuPG87KytuKWU9dFtuXSxyPWEtZS55LHI+MCYmKGUueSs9ciksYT1lLnkrZS5keStwO2lmKChyPWEtcC1tWzFdKT4wKWZvcihhPWUueS09cixuPW8tMjtuPj0wOy0tbillPXRbbl0scj1lLnkrZS5keStwLWEscj4wJiYoZS55LT1yKSxhPWUueX0pfWZ1bmN0aW9uIGkodCxlKXtyZXR1cm4gdC55LWUueX12YXIgYT1yLm5lc3QoKS5rZXkoZnVuY3Rpb24odCl7cmV0dXJuIHQueH0pLnNvcnRLZXlzKGUuYXNjZW5kaW5nKS5lbnRyaWVzKHYpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZXN9KTshZnVuY3Rpb24oKXt2YXIgdD1lLm1pbihhLGZ1bmN0aW9uKHQpe3JldHVybihtWzFdLSh0Lmxlbmd0aC0xKSpwKS9lLnN1bSh0LGgpfSk7YS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2UuZm9yRWFjaChmdW5jdGlvbihlLHIpe2UueT1yLGUuZHk9ZS52YWx1ZSp0fSl9KSxnLmZvckVhY2goZnVuY3Rpb24oZSl7ZS5keT1lLnZhbHVlKnR9KX0oKSxuKCk7Zm9yKHZhciBvPTE7dD4wOy0tdCkhZnVuY3Rpb24odCl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gYyh0LnRhcmdldCkqdC52YWx1ZX1hLnNsaWNlKCkucmV2ZXJzZSgpLmZvckVhY2goZnVuY3Rpb24obil7bi5mb3JFYWNoKGZ1bmN0aW9uKG4pe2lmKG4uc291cmNlTGlua3MubGVuZ3RoKXt2YXIgaT1lLnN1bShuLnNvdXJjZUxpbmtzLHIpL2Uuc3VtKG4uc291cmNlTGlua3MsaCk7bi55Kz0oaS1jKG4pKSp0fX0pfSl9KG8qPS45OSksbigpLGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIGModC5zb3VyY2UpKnQudmFsdWV9YS5mb3JFYWNoKGZ1bmN0aW9uKG4pe24uZm9yRWFjaChmdW5jdGlvbihuKXtpZihuLnRhcmdldExpbmtzLmxlbmd0aCl7dmFyIGk9ZS5zdW0obi50YXJnZXRMaW5rcyxyKS9lLnN1bShuLnRhcmdldExpbmtzLGgpO24ueSs9KGktYyhuKSkqdH19KX0pfShvKSxuKCl9ZnVuY3Rpb24gdSgpe2Z1bmN0aW9uIHQodCxlKXtyZXR1cm4gdC5zb3VyY2UueS1lLnNvdXJjZS55fHx0Lm9yaWdpbmFsSW5kZXgtZS5vcmlnaW5hbEluZGV4fWZ1bmN0aW9uIGUodCxlKXtyZXR1cm4gdC50YXJnZXQueS1lLnRhcmdldC55fHx0Lm9yaWdpbmFsSW5kZXgtZS5vcmlnaW5hbEluZGV4fXYuZm9yRWFjaChmdW5jdGlvbihyKXtyLnNvdXJjZUxpbmtzLnNvcnQoZSksci50YXJnZXRMaW5rcy5zb3J0KHQpfSksdi5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPTAscj0wO3Quc291cmNlTGlua3MuZm9yRWFjaChmdW5jdGlvbih0KXt0LnN5PWUsZSs9dC5keX0pLHQudGFyZ2V0TGlua3MuZm9yRWFjaChmdW5jdGlvbih0KXt0LnR5PXIscis9dC5keX0pfSl9ZnVuY3Rpb24gYyh0KXtyZXR1cm4gdC55K3QuZHkvMn1mdW5jdGlvbiBoKHQpe3JldHVybiB0LnZhbHVlfXZhciBmPXt9LGQ9MjQscD04LG09WzEsMV0sdj1bXSxnPVtdO3JldHVybiBmLm5vZGVXaWR0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0rdCxmKTpkfSxmLm5vZGVQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSt0LGYpOnB9LGYubm9kZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9dCxmKTp2fSxmLmxpbmtzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPXQsZik6Z30sZi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPXQsZik6bX0sZi5sYXlvdXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoKSxpKCksYSgpLGwoZSksdSgpLGZ9LGYucmVsYXlvdXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdSgpLGZ9LGYubGluaz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIHI9dC5zb3VyY2UueCt0LnNvdXJjZS5keCxpPXQudGFyZ2V0LngsYT1uLmludGVycG9sYXRlTnVtYmVyKHIsaSksbz1hKGUpLHM9YSgxLWUpLGw9dC5zb3VyY2UueSt0LnN5LHU9bCt0LmR5LGM9dC50YXJnZXQueSt0LnR5LGg9Yyt0LmR5O3JldHVybiJNIityKyIsIitsKyJDIitvKyIsIitsKyIgIitzKyIsIitjKyIgIitpKyIsIitjKyJMIitpKyIsIitoKyJDIitzKyIsIitoKyIgIitvKyIsIit1KyIgIityKyIsIit1KyJaIn12YXIgZT0uNTtyZXR1cm4gdC5jdXJ2YXR1cmU9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3IsdCk6ZX0sdH0sZn07dC5zYW5rZXk9aSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KX0seyJkMy1hcnJheSI6MTEyLCJkMy1jb2xsZWN0aW9uIjoxMTMsImQzLWludGVycG9sYXRlIjoxMTd9XSwzNzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlPXMuZ2V0KHQpLHI9ZSYmKGUuX3RyaWFuZ2xlQnVmZmVyLmhhbmRsZXx8ZS5fdHJpYW5nbGVCdWZmZXIuYnVmZmVyKTtpZighcnx8IXQuaXNCdWZmZXIocikpe3ZhciBuPWEodCxuZXcgRmxvYXQzMkFycmF5KFstMSwtMSwtMSw0LDQsLTFdKSk7ZT1vKHQsW3tidWZmZXI6bix0eXBlOnQuRkxPQVQsc2l6ZToyfV0pLGUuX3RyaWFuZ2xlQnVmZmVyPW4scy5zZXQodCxlKX1lLmJpbmQoKSx0LmRyYXdBcnJheXModC5UUklBTkdMRVMsMCwzKSxlLnVuYmluZCgpfXZhciBpPSJ1bmRlZmluZWQiPT10eXBlb2YgV2Vha01hcD90KCJ3ZWFrLW1hcCIpOldlYWtNYXAsYT10KCJnbC1idWZmZXIiKSxvPXQoImdsLXZhbyIpLHM9bmV3IGk7ZS5leHBvcnRzPW59LHsiZ2wtYnVmZmVyIjoxNTQsImdsLXZhbyI6MjY5LCJ3ZWFrLW1hcCI6NTU3fV0sMzg6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXtlPSJudW1iZXIiPT10eXBlb2YgZT9lOjEscj1yfHwiOiAiO3ZhciBuPXQuc3BsaXQoL1xyP1xuLyksYT1TdHJpbmcobi5sZW5ndGgrZS0xKS5sZW5ndGg7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKHQsbil7dmFyIG89bitlLHM9U3RyaW5nKG8pLmxlbmd0aDtyZXR1cm4gaShvLGEtcykrcit0fSkuam9pbigiXG4iKX12YXIgaT10KCJwYWQtbGVmdCIpO2UuZXhwb3J0cz1ufSx7InBhZC1sZWZ0Ijo0NzJ9XSwzOTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7Zm9yKHZhciByPW5ldyBBcnJheShlKzEpLG49MDtuPHQubGVuZ3RoOysrbilyW25dPXRbbl07Zm9yKHZhciBuPTA7bjw9dC5sZW5ndGg7KytuKXtmb3IodmFyIGk9dC5sZW5ndGg7aTw9ZTsrK2kpe2Zvcih2YXIgbz1uZXcgQXJyYXkoZSkscz0wO3M8ZTsrK3Mpb1tzXT1NYXRoLnBvdyhpKzEtbixzKTtyW2ldPW99aWYoYS5hcHBseSh2b2lkIDAscikpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gaSh0KXt2YXIgZT10Lmxlbmd0aDtpZigwPT09ZSlyZXR1cm5bXTtpZigxPT09ZSlyZXR1cm5bMF07Zm9yKHZhciByPXRbMF0ubGVuZ3RoLGk9W3RbMF1dLGE9WzBdLG89MTtvPGU7KytvKWlmKGkucHVzaCh0W29dKSxuKGkscikpe2lmKGEucHVzaChvKSxhLmxlbmd0aD09PXIrMSlyZXR1cm4gYX1lbHNlIGkucG9wKCk7cmV0dXJuIGF9ZS5leHBvcnRzPWk7dmFyIGE9dCgicm9idXN0LW9yaWVudGF0aW9uIil9LHsicm9idXN0LW9yaWVudGF0aW9uIjo1MDZ9XSw0MDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGkoZSkuZmlsdGVyKGZ1bmN0aW9uKHIpe2Zvcih2YXIgbj1uZXcgQXJyYXkoci5sZW5ndGgpLGk9MDtpPHIubGVuZ3RoOysraSluW2ldPWVbcltpXV07cmV0dXJuIGEobikqdDwxfSl9ZS5leHBvcnRzPW47dmFyIGk9dCgiZGVsYXVuYXktdHJpYW5ndWxhdGUiKSxhPXQoImNpcmN1bXJhZGl1cyIpfSx7Y2lyY3VtcmFkaXVzOjg1LCJkZWxhdW5heS10cmlhbmd1bGF0ZSI6MTIxfV0sNDE6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGEoaSh0LGUpKX1lLmV4cG9ydHM9bjt2YXIgaT10KCJhbHBoYS1jb21wbGV4IiksYT10KCJzaW1wbGljaWFsLWNvbXBsZXgtYm91bmRhcnkiKX0seyJhbHBoYS1jb21wbGV4Ijo0MCwic2ltcGxpY2lhbC1jb21wbGV4LWJvdW5kYXJ5Ijo1MTR9XSw0MjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7aWYoIXR8fG51bGw9PXQubGVuZ3RoKXRocm93IEVycm9yKCJBcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXkiKTtlPW51bGw9PWU/MTpNYXRoLmZsb29yKGUpO2Zvcih2YXIgcj1BcnJheSgyKmUpLG49MDtuPGU7bisrKXtmb3IodmFyIGk9LTEvMCxhPTEvMCxvPW4scz10Lmxlbmd0aDtvPHM7bys9ZSl0W29dPmkmJihpPXRbb10pLHRbb108YSYmKGE9dFtvXSk7cltuXT1hLHJbZStuXT1pfXJldHVybiByfWUuZXhwb3J0cz1ufSx7fV0sNDM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7aWYoIXR8fG51bGw9PXQubGVuZ3RoKXRocm93IEVycm9yKCJBcmd1bWVudCBzaG91bGQgYmUgYW4gYXJyYXkiKTtudWxsPT1lJiYoZT0xKSxudWxsPT1yJiYocj1pKHQsZSkpO2Zvcih2YXIgbj0wO248ZTtuKyspe3ZhciBhPXJbZStuXSxvPXJbbl0scz1uLGw9dC5sZW5ndGg7aWYoYT09PTEvMCYmbz09PS0xLzApZm9yKHM9bjtzPGw7cys9ZSl0W3NdPXRbc109PT1hPzE6dFtzXT09PW8/MDouNTtlbHNlIGlmKGE9PT0xLzApZm9yKHM9bjtzPGw7cys9ZSl0W3NdPXRbc109PT1hPzE6MDtlbHNlIGlmKG89PT0tMS8wKWZvcihzPW47czxsO3MrPWUpdFtzXT10W3NdPT09bz8wOjE7ZWxzZXt2YXIgdT1hLW87Zm9yKHM9bjtzPGw7cys9ZSl0W3NdPSh0W3NdLW8pL3V9fXJldHVybiB0fXZhciBpPXQoImFycmF5LWJvdW5kcyIpO2UuZXhwb3J0cz1ufSx7ImFycmF5LWJvdW5kcyI6NDJ9XSw0NDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiFBcnJheS5pc0FycmF5KHQpJiZudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0fWZ1bmN0aW9uIGUodCxlLHIpe2Zvcih2YXIgbj0oZS10KS9NYXRoLm1heChyLTEsMSksaT1bXSxhPTA7YTxyO2ErKylpLnB1c2godCthKm4pO3JldHVybiBpfWZ1bmN0aW9uIHIoKXtmb3IodmFyIHQ9W10uc2xpY2UuY2FsbChhcmd1bWVudHMpLGU9dC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RofSkscj1NYXRoLm1pbi5hcHBseShudWxsLGUpLG49W10saT0wO2k8cjtpKyspe25baV09W107Zm9yKHZhciBhPTA7YTx0Lmxlbmd0aDsrK2EpbltpXVthXT10W2FdW2ldfXJldHVybiBufWZ1bmN0aW9uIG4odCxlLHIpe2Zvcih2YXIgbj1NYXRoLm1pbi5hcHBseShudWxsLFt0Lmxlbmd0aCxlLmxlbmd0aCxyLmxlbmd0aF0pLGk9W10sYT0wO2E8bjthKyspaS5wdXNoKFt0W2FdLGVbYV0sclthXV0pO3JldHVybiBpfWZ1bmN0aW9uIGkodCl7ZnVuY3Rpb24gZSh0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylBcnJheS5pc0FycmF5KHRbbl0pP2UodFtuXSxyKTpyKz10W25dfXZhciByPTA7cmV0dXJuIGUodCxyKSxyfWZ1bmN0aW9uIGEodCl7Zm9yKHZhciBlPVtdLHI9MDtyPHQubGVuZ3RoOysrcil7ZVtyXT1bXTtmb3IodmFyIG49MDtuPHRbcl0ubGVuZ3RoOysrbillW3JdW25dPXRbcl1bbl19cmV0dXJuIGV9ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGU9W10scj0wO3I8dC5sZW5ndGg7KytyKWVbcl09dFtyXTtyZXR1cm4gZX1mdW5jdGlvbiBzKHQsZSl7aWYodC5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIHI9dC5sZW5ndGg7ci0tOylpZih0W3JdIT09ZVtyXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBsKHQsZSl7dmFyIHIsbjtpZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIHQ7aWYocj1bXSwiIyI9PT10WzBdPyh0PXQuc3Vic3RyKDEpLDM9PT10Lmxlbmd0aCYmKHQrPXQpLG49cGFyc2VJbnQodCwxNiksclswXT1uPj4xNiYyNTUsclsxXT1uPj44JjI1NSxyWzJdPTI1NSZuKTpoLnRlc3QodCkmJihuPXQubWF0Y2goZiksclswXT1wYXJzZUludChuWzFdKSxyWzFdPXBhcnNlSW50KG5bMl0pLHJbMl09cGFyc2VJbnQoblszXSkpLCFlKWZvcih2YXIgaT0wO2k8MzsrK2kpcltpXT1yW2ldLzI1NTtyZXR1cm4gcn1mdW5jdGlvbiB1KHQsZSl7dmFyIHIsbjtpZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIHQ7aWYocj1bXSwiIyI9PT10WzBdPyh0PXQuc3Vic3RyKDEpLDM9PT10Lmxlbmd0aCYmKHQrPXQpLG49cGFyc2VJbnQodCwxNiksclswXT1uPj4xNiYyNTUsclsxXT1uPj44JjI1NSxyWzJdPTI1NSZuKTpoLnRlc3QodCkmJihuPXQubWF0Y2goZiksclswXT1wYXJzZUludChuWzFdKSxyWzFdPXBhcnNlSW50KG5bMl0pLHJbMl09cGFyc2VJbnQoblszXSksbls0XT9yWzNdPXBhcnNlRmxvYXQobls0XSk6clszXT0xKSwhZSlmb3IodmFyIGk9MDtpPDM7KytpKXJbaV09cltpXS8yNTU7cmV0dXJuIHJ9dmFyIGM9e30saD0vXnJnYmE/XChccypcZHsxLDN9XHMqLFxzKlxkezEsM31ccyosXHMqXGR7MSwzfVxzKigsLiopP1wpJC8sZj0vXnJnYmE/XChccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pXHMqLFxzKihcZHsxLDN9KVxzKiw/XHMqKC4qKT9cKSQvO3JldHVybiBjLmlzUGxhaW5PYmplY3Q9dCxjLmxpbnNwYWNlPWUsYy56aXAzPW4sYy5zdW09aSxjLnppcD1yLGMuaXNFcXVhbD1zLGMuY29weTJEPWEsYy5jb3B5MUQ9byxjLnN0cjJSZ2JBcnJheT1sLGMuc3RyMlJnYmFBcnJheT11LGN9KCl9LHt9XSw0NTpbZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe2lmKHQ9PT1lKXJldHVybiAwO2Zvcih2YXIgcj10Lmxlbmd0aCxuPWUubGVuZ3RoLGk9MCxhPU1hdGgubWluKHIsbik7aTxhOysraSlpZih0W2ldIT09ZVtpXSl7cj10W2ldLG49ZVtpXTticmVha31yZXR1cm4gcjxuPy0xOm48cj8xOjB9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gci5CdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiByLkJ1ZmZlci5pc0J1ZmZlcj9yLkJ1ZmZlci5pc0J1ZmZlcih0KTohKG51bGw9PXR8fCF0Ll9pc0J1ZmZlcil9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIG8odCl7cmV0dXJuIWkodCkmJigiZnVuY3Rpb24iPT10eXBlb2Ygci5BcnJheUJ1ZmZlciYmKCJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXc/QXJyYXlCdWZmZXIuaXNWaWV3KHQpOiEhdCYmKHQgaW5zdGFuY2VvZiBEYXRhVmlld3x8ISEodC5idWZmZXImJnQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSkpfWZ1bmN0aW9uIHModCl7aWYoeC5pc0Z1bmN0aW9uKHQpKXtpZihNKXJldHVybiB0Lm5hbWU7dmFyIGU9dC50b1N0cmluZygpLHI9ZS5tYXRjaChBKTtyZXR1cm4gciYmclsxXX19ZnVuY3Rpb24gbCh0LGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD90Lmxlbmd0aDxlP3Q6dC5zbGljZSgwLGUpOnR9ZnVuY3Rpb24gdSh0KXtpZihNfHwheC5pc0Z1bmN0aW9uKHQpKXJldHVybiB4Lmluc3BlY3QodCk7dmFyIGU9cyh0KTtyZXR1cm4iW0Z1bmN0aW9uIisoZT8iOiAiK2U6IiIpKyJdIn1mdW5jdGlvbiBjKHQpe3JldHVybiBsKHUodC5hY3R1YWwpLDEyOCkrIiAiK3Qub3BlcmF0b3IrIiAiK2wodSh0LmV4cGVjdGVkKSwxMjgpfWZ1bmN0aW9uIGgodCxlLHIsbixpKXt0aHJvdyBuZXcgay5Bc3NlcnRpb25FcnJvcih7bWVzc2FnZTpyLGFjdHVhbDp0LGV4cGVjdGVkOmUsb3BlcmF0b3I6bixzdGFja1N0YXJ0RnVuY3Rpb246aX0pfWZ1bmN0aW9uIGYodCxlKXt0fHxoKHQsITAsZSwiPT0iLGsub2spfWZ1bmN0aW9uIGQodCxlLHIscyl7aWYodD09PWUpcmV0dXJuITA7aWYoaSh0KSYmaShlKSlyZXR1cm4gMD09PW4odCxlKTtpZih4LmlzRGF0ZSh0KSYmeC5pc0RhdGUoZSkpcmV0dXJuIHQuZ2V0VGltZSgpPT09ZS5nZXRUaW1lKCk7aWYoeC5pc1JlZ0V4cCh0KSYmeC5pc1JlZ0V4cChlKSlyZXR1cm4gdC5zb3VyY2U9PT1lLnNvdXJjZSYmdC5nbG9iYWw9PT1lLmdsb2JhbCYmdC5tdWx0aWxpbmU9PT1lLm11bHRpbGluZSYmdC5sYXN0SW5kZXg9PT1lLmxhc3RJbmRleCYmdC5pZ25vcmVDYXNlPT09ZS5pZ25vcmVDYXNlO2lmKG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHR8fG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGUpe2lmKG8odCkmJm8oZSkmJmEodCk9PT1hKGUpJiYhKHQgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXl8fHQgaW5zdGFuY2VvZiBGbG9hdDY0QXJyYXkpKXJldHVybiAwPT09bihuZXcgVWludDhBcnJheSh0LmJ1ZmZlciksbmV3IFVpbnQ4QXJyYXkoZS5idWZmZXIpKTtpZihpKHQpIT09aShlKSlyZXR1cm4hMTtzPXN8fHthY3R1YWw6W10sZXhwZWN0ZWQ6W119O3ZhciBsPXMuYWN0dWFsLmluZGV4T2YodCk7cmV0dXJuLTEhPT1sJiZsPT09cy5leHBlY3RlZC5pbmRleE9mKGUpfHwocy5hY3R1YWwucHVzaCh0KSxzLmV4cGVjdGVkLnB1c2goZSksbSh0LGUscixzKSl9cmV0dXJuIHI/dD09PWU6dD09ZX1mdW5jdGlvbiBwKHQpe3JldHVybiJbb2JqZWN0IEFyZ3VtZW50c10iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gbSh0LGUscixuKXtpZihudWxsPT09dHx8dm9pZCAwPT09dHx8bnVsbD09PWV8fHZvaWQgMD09PWUpcmV0dXJuITE7aWYoeC5pc1ByaW1pdGl2ZSh0KXx8eC5pc1ByaW1pdGl2ZShlKSlyZXR1cm4gdD09PWU7aWYociYmT2JqZWN0LmdldFByb3RvdHlwZU9mKHQpIT09T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKXJldHVybiExO3ZhciBpPXAodCksYT1wKGUpO2lmKGkmJiFhfHwhaSYmYSlyZXR1cm4hMTtpZihpKXJldHVybiB0PXcuY2FsbCh0KSxlPXcuY2FsbChlKSxkKHQsZSxyKTt2YXIgbyxzLGw9VCh0KSx1PVQoZSk7aWYobC5sZW5ndGghPT11Lmxlbmd0aClyZXR1cm4hMTtmb3IobC5zb3J0KCksdS5zb3J0KCkscz1sLmxlbmd0aC0xO3M+PTA7cy0tKWlmKGxbc10hPT11W3NdKXJldHVybiExO2ZvcihzPWwubGVuZ3RoLTE7cz49MDtzLS0paWYobz1sW3NdLCFkKHRbb10sZVtvXSxyLG4pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHYodCxlLHIpe2QodCxlLCEwKSYmaCh0LGUsciwibm90RGVlcFN0cmljdEVxdWFsIix2KX1mdW5jdGlvbiBnKHQsZSl7aWYoIXR8fCFlKXJldHVybiExO2lmKCJbb2JqZWN0IFJlZ0V4cF0iPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkpcmV0dXJuIGUudGVzdCh0KTt0cnl7aWYodCBpbnN0YW5jZW9mIGUpcmV0dXJuITB9Y2F0Y2godCl7fXJldHVybiFFcnJvci5pc1Byb3RvdHlwZU9mKGUpJiYhMD09PWUuY2FsbCh7fSx0KX0KZnVuY3Rpb24geSh0KXt2YXIgZTt0cnl7dCgpfWNhdGNoKHQpe2U9dH1yZXR1cm4gZX1mdW5jdGlvbiBiKHQsZSxyLG4pe3ZhciBpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJibG9jayIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7InN0cmluZyI9PXR5cGVvZiByJiYobj1yLHI9bnVsbCksaT15KGUpLG49KHImJnIubmFtZT8iICgiK3IubmFtZSsiKS4iOiIuIikrKG4/IiAiK246Ii4iKSx0JiYhaSYmaChpLHIsIk1pc3NpbmcgZXhwZWN0ZWQgZXhjZXB0aW9uIituKTt2YXIgYT0ic3RyaW5nIj09dHlwZW9mIG4sbz0hdCYmeC5pc0Vycm9yKGkpLHM9IXQmJmkmJiFyO2lmKChvJiZhJiZnKGkscil8fHMpJiZoKGksciwiR290IHVud2FudGVkIGV4Y2VwdGlvbiIrbiksdCYmaSYmciYmIWcoaSxyKXx8IXQmJmkpdGhyb3cgaX12YXIgeD10KCJ1dGlsLyIpLF89T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSx3PUFycmF5LnByb3RvdHlwZS5zbGljZSxNPWZ1bmN0aW9uKCl7cmV0dXJuImZvbyI9PT1mdW5jdGlvbigpe30ubmFtZX0oKSxrPWUuZXhwb3J0cz1mLEE9L1xzKmZ1bmN0aW9uXHMrKFteXChcc10qKVxzKi87ay5Bc3NlcnRpb25FcnJvcj1mdW5jdGlvbih0KXt0aGlzLm5hbWU9IkFzc2VydGlvbkVycm9yIix0aGlzLmFjdHVhbD10LmFjdHVhbCx0aGlzLmV4cGVjdGVkPXQuZXhwZWN0ZWQsdGhpcy5vcGVyYXRvcj10Lm9wZXJhdG9yLHQubWVzc2FnZT8odGhpcy5tZXNzYWdlPXQubWVzc2FnZSx0aGlzLmdlbmVyYXRlZE1lc3NhZ2U9ITEpOih0aGlzLm1lc3NhZ2U9Yyh0aGlzKSx0aGlzLmdlbmVyYXRlZE1lc3NhZ2U9ITApO3ZhciBlPXQuc3RhY2tTdGFydEZ1bmN0aW9ufHxoO2lmKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKUVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsZSk7ZWxzZXt2YXIgcj1uZXcgRXJyb3I7aWYoci5zdGFjayl7dmFyIG49ci5zdGFjayxpPXMoZSksYT1uLmluZGV4T2YoIlxuIitpKTtpZihhPj0wKXt2YXIgbz1uLmluZGV4T2YoIlxuIixhKzEpO249bi5zdWJzdHJpbmcobysxKX10aGlzLnN0YWNrPW59fX0seC5pbmhlcml0cyhrLkFzc2VydGlvbkVycm9yLEVycm9yKSxrLmZhaWw9aCxrLm9rPWYsay5lcXVhbD1mdW5jdGlvbih0LGUscil7dCE9ZSYmaCh0LGUsciwiPT0iLGsuZXF1YWwpfSxrLm5vdEVxdWFsPWZ1bmN0aW9uKHQsZSxyKXt0PT1lJiZoKHQsZSxyLCIhPSIsay5ub3RFcXVhbCl9LGsuZGVlcEVxdWFsPWZ1bmN0aW9uKHQsZSxyKXtkKHQsZSwhMSl8fGgodCxlLHIsImRlZXBFcXVhbCIsay5kZWVwRXF1YWwpfSxrLmRlZXBTdHJpY3RFcXVhbD1mdW5jdGlvbih0LGUscil7ZCh0LGUsITApfHxoKHQsZSxyLCJkZWVwU3RyaWN0RXF1YWwiLGsuZGVlcFN0cmljdEVxdWFsKX0say5ub3REZWVwRXF1YWw9ZnVuY3Rpb24odCxlLHIpe2QodCxlLCExKSYmaCh0LGUsciwibm90RGVlcEVxdWFsIixrLm5vdERlZXBFcXVhbCl9LGsubm90RGVlcFN0cmljdEVxdWFsPXYsay5zdHJpY3RFcXVhbD1mdW5jdGlvbih0LGUscil7dCE9PWUmJmgodCxlLHIsIj09PSIsay5zdHJpY3RFcXVhbCl9LGsubm90U3RyaWN0RXF1YWw9ZnVuY3Rpb24odCxlLHIpe3Q9PT1lJiZoKHQsZSxyLCIhPT0iLGsubm90U3RyaWN0RXF1YWwpfSxrLnRocm93cz1mdW5jdGlvbih0LGUscil7YighMCx0LGUscil9LGsuZG9lc05vdFRocm93PWZ1bmN0aW9uKHQsZSxyKXtiKCExLHQsZSxyKX0say5pZkVycm9yPWZ1bmN0aW9uKHQpe2lmKHQpdGhyb3cgdH07dmFyIFQ9T2JqZWN0LmtleXN8fGZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgciBpbiB0KV8uY2FsbCh0LHIpJiZlLnB1c2gocik7cmV0dXJuIGV9fSkuY2FsbCh0aGlzLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7InV0aWwvIjo1NDd9XSw0NjpbZnVuY3Rpb24odCxlLHIpe2UuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gYXRvYih0KX19LHt9XSw0NzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgZT0wLHI9MDtyPHQubGVuZ3RoOysrcillKz10W3JdO3JldHVybiBlfWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9ZS5sZW5ndGgsaT1uZXcgQXJyYXkocisxKSxvPTA7bzxyOysrbyl7Zm9yKHZhciBzPW5ldyBBcnJheShyKzEpLGw9MDtsPD1yOysrbClzW2xdPXRbbF1bb107aVtvXT1zfWlbcl09bmV3IEFycmF5KHIrMSk7Zm9yKHZhciBvPTA7bzw9cjsrK28paVtyXVtvXT0xO2Zvcih2YXIgdT1uZXcgQXJyYXkocisxKSxvPTA7bzxyOysrbyl1W29dPWVbb107dVtyXT0xO3ZhciBjPWEoaSx1KSxoPW4oY1tyKzFdKTswPT09aCYmKGg9MSk7Zm9yKHZhciBmPW5ldyBBcnJheShyKzEpLG89MDtvPD1yOysrbylmW29dPW4oY1tvXSkvaDtyZXR1cm4gZn1lLmV4cG9ydHM9aTt2YXIgYT10KCJyb2J1c3QtbGluZWFyLXNvbHZlIil9LHsicm9idXN0LWxpbmVhci1zb2x2ZSI6NTA1fV0sNDg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBpKHRbMF0ubXVsKGVbMV0pLmFkZChlWzBdLm11bCh0WzFdKSksdFsxXS5tdWwoZVsxXSkpfXZhciBpPXQoIi4vbGliL3JhdGlvbmFsaXplIik7ZS5leHBvcnRzPW59LHsiLi9saWIvcmF0aW9uYWxpemUiOjU4fV0sNDk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiB0WzBdLm11bChlWzFdKS5jbXAoZVswXS5tdWwodFsxXSkpfWUuZXhwb3J0cz1ufSx7fV0sNTA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBpKHRbMF0ubXVsKGVbMV0pLHRbMV0ubXVsKGVbMF0pKX12YXIgaT10KCIuL2xpYi9yYXRpb25hbGl6ZSIpO2UuZXhwb3J0cz1ufSx7Ii4vbGliL3JhdGlvbmFsaXplIjo1OH1dLDUxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtpZihpKHQpKXJldHVybiBlP3UodCxuKGUpKTpbdFswXS5jbG9uZSgpLHRbMV0uY2xvbmUoKV07dmFyIHIsYyxoPTA7aWYoYSh0KSlyPXQuY2xvbmUoKTtlbHNlIGlmKCJzdHJpbmciPT10eXBlb2YgdClyPXModCk7ZWxzZXtpZigwPT09dClyZXR1cm5bbygwKSxvKDEpXTtpZih0PT09TWF0aC5mbG9vcih0KSlyPW8odCk7ZWxzZXtmb3IoO3QhPT1NYXRoLmZsb29yKHQpOyl0Kj1NYXRoLnBvdygyLDI1NiksaC09MjU2O3I9byh0KX19aWYoaShlKSlyLm11bChlWzFdKSxjPWVbMF0uY2xvbmUoKTtlbHNlIGlmKGEoZSkpYz1lLmNsb25lKCk7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIGUpYz1zKGUpO2Vsc2UgaWYoZSlpZihlPT09TWF0aC5mbG9vcihlKSljPW8oZSk7ZWxzZXtmb3IoO2UhPT1NYXRoLmZsb29yKGUpOyllKj1NYXRoLnBvdygyLDI1NiksaCs9MjU2O2M9byhlKX1lbHNlIGM9bygxKTtyZXR1cm4gaD4wP3I9ci51c2hsbihoKTpoPDAmJihjPWMudXNobG4oLWgpKSxsKHIsYyl9dmFyIGk9dCgiLi9pcy1yYXQiKSxhPXQoIi4vbGliL2lzLWJuIiksbz10KCIuL2xpYi9udW0tdG8tYm4iKSxzPXQoIi4vbGliL3N0ci10by1ibiIpLGw9dCgiLi9saWIvcmF0aW9uYWxpemUiKSx1PXQoIi4vZGl2Iik7ZS5leHBvcnRzPW59LHsiLi9kaXYiOjUwLCIuL2lzLXJhdCI6NTIsIi4vbGliL2lzLWJuIjo1NiwiLi9saWIvbnVtLXRvLWJuIjo1NywiLi9saWIvcmF0aW9uYWxpemUiOjU4LCIuL2xpYi9zdHItdG8tYm4iOjU5fV0sNTI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmMj09PXQubGVuZ3RoJiZpKHRbMF0pJiZpKHRbMV0pfXZhciBpPXQoIi4vbGliL2lzLWJuIik7ZS5leHBvcnRzPW59LHsiLi9saWIvaXMtYm4iOjU2fV0sNTM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdC5jbXAobmV3IGkoMCkpfXZhciBpPXQoImJuLmpzIik7ZS5leHBvcnRzPW59LHsiYm4uanMiOjY2fV0sNTQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZT10Lmxlbmd0aCxyPXQud29yZHMsbj0wO2lmKDE9PT1lKW49clswXTtlbHNlIGlmKDI9PT1lKW49clswXSs2NzEwODg2NCpyWzFdO2Vsc2UgZm9yKHZhciBhPTA7YTxlO2ErKyl7dmFyIG89clthXTtuKz1vKk1hdGgucG93KDY3MTA4ODY0LGEpfXJldHVybiBpKHQpKm59dmFyIGk9dCgiLi9ibi1zaWduIik7ZS5leHBvcnRzPW59LHsiLi9ibi1zaWduIjo1M31dLDU1OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9YShpLmxvKHQpKTtpZihlPDMyKXJldHVybiBlO3ZhciByPWEoaS5oaSh0KSk7cmV0dXJuIHI+MjA/NTI6ciszMn12YXIgaT10KCJkb3VibGUtYml0cyIpLGE9dCgiYml0LXR3aWRkbGUiKS5jb3VudFRyYWlsaW5nWmVyb3M7ZS5leHBvcnRzPW59LHsiYml0LXR3aWRkbGUiOjY1LCJkb3VibGUtYml0cyI6MTIyfV0sNTY6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0JiZCb29sZWFuKHQud29yZHMpfXQoImJuLmpzIik7ZS5leHBvcnRzPW59LHsiYm4uanMiOjY2fV0sNTc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZT1hLmV4cG9uZW50KHQpO3JldHVybiBlPDUyP25ldyBpKHQpOm5ldyBpKHQqTWF0aC5wb3coMiw1Mi1lKSkudXNobG4oZS01Mil9dmFyIGk9dCgiYm4uanMiKSxhPXQoImRvdWJsZS1iaXRzIik7ZS5leHBvcnRzPW59LHsiYm4uanMiOjY2LCJkb3VibGUtYml0cyI6MTIyfV0sNTg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3ZhciByPWEodCksbj1hKGUpO2lmKDA9PT1yKXJldHVybltpKDApLGkoMSldO2lmKDA9PT1uKXJldHVybltpKDApLGkoMCldO248MCYmKHQ9dC5uZWcoKSxlPWUubmVnKCkpO3ZhciBvPXQuZ2NkKGUpO3JldHVybiBvLmNtcG4oMSk/W3QuZGl2KG8pLGUuZGl2KG8pXTpbdCxlXX12YXIgaT10KCIuL251bS10by1ibiIpLGE9dCgiLi9ibi1zaWduIik7ZS5leHBvcnRzPW59LHsiLi9ibi1zaWduIjo1MywiLi9udW0tdG8tYm4iOjU3fV0sNTk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gbmV3IGkodCl9dmFyIGk9dCgiYm4uanMiKTtlLmV4cG9ydHM9bn0seyJibi5qcyI6NjZ9XSw2MDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGkodFswXS5tdWwoZVswXSksdFsxXS5tdWwoZVsxXSkpfXZhciBpPXQoIi4vbGliL3JhdGlvbmFsaXplIik7ZS5leHBvcnRzPW59LHsiLi9saWIvcmF0aW9uYWxpemUiOjU4fV0sNjE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gaSh0WzBdKSppKHRbMV0pfXZhciBpPXQoIi4vbGliL2JuLXNpZ24iKTtlLmV4cG9ydHM9bn0seyIuL2xpYi9ibi1zaWduIjo1M31dLDYyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gaSh0WzBdLm11bChlWzFdKS5zdWIodFsxXS5tdWwoZVswXSkpLHRbMV0ubXVsKGVbMV0pKX12YXIgaT10KCIuL2xpYi9yYXRpb25hbGl6ZSIpO2UuZXhwb3J0cz1ufSx7Ii4vbGliL3JhdGlvbmFsaXplIjo1OH1dLDYzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9dFswXSxyPXRbMV07aWYoMD09PWUuY21wbigwKSlyZXR1cm4gMDt2YXIgbj1lLmFicygpLmRpdm1vZChyLmFicygpKSxvPW4uZGl2LHM9aShvKSxsPW4ubW9kLHU9ZS5uZWdhdGl2ZSE9PXIubmVnYXRpdmU/LTE6MTtpZigwPT09bC5jbXBuKDApKXJldHVybiB1KnM7aWYocyl7dmFyIGM9YShzKSs0LGg9aShsLnVzaGxuKGMpLmRpdlJvdW5kKHIpKTtyZXR1cm4gdSoocytoKk1hdGgucG93KDIsLWMpKX12YXIgZj1yLmJpdExlbmd0aCgpLWwuYml0TGVuZ3RoKCkrNTMsaD1pKGwudXNobG4oZikuZGl2Um91bmQocikpO3JldHVybiBmPDEwMjM/dSpoKk1hdGgucG93KDIsLWYpOihoKj1NYXRoLnBvdygyLC0xMDIzKSx1KmgqTWF0aC5wb3coMiwxMDIzLWYpKX12YXIgaT10KCIuL2xpYi9ibi10by1udW0iKSxhPXQoIi4vbGliL2N0eiIpO2UuZXhwb3J0cz1ufSx7Ii4vbGliL2JuLXRvLW51bSI6NTQsIi4vbGliL2N0eiI6NTV9XSw2NDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSxhKXt2YXIgbz1bImZ1bmN0aW9uICIsdCwiKGEsbCxoLCIsbi5qb2luKCIsIiksIil7IixhPyIiOiJ2YXIgaT0iLHI/ImwtMSI6ImgrMSIsIjt3aGlsZShsPD1oKXt2YXIgbT0obCtoKT4+PjEseD1hIixpPyIuZ2V0KG0pIjoiW21dIl07cmV0dXJuIGE/ZS5pbmRleE9mKCJjIik8MD9vLnB1c2goIjtpZih4PT09eSl7cmV0dXJuIG19ZWxzZSBpZih4PD15KXsiKTpvLnB1c2goIjt2YXIgcD1jKHgseSk7aWYocD09PTApe3JldHVybiBtfWVsc2UgaWYocDw9MCl7Iik6by5wdXNoKCI7aWYoIixlLCIpe2k9bTsiKSxyP28ucHVzaCgibD1tKzF9ZWxzZXtoPW0tMX0iKTpvLnB1c2goImg9bS0xfWVsc2V7bD1tKzF9Iiksby5wdXNoKCJ9IiksYT9vLnB1c2goInJldHVybiAtMX07Iik6by5wdXNoKCJyZXR1cm4gaX07Iiksby5qb2luKCIiKX1mdW5jdGlvbiBpKHQsZSxyLGkpe3JldHVybiBuZXcgRnVuY3Rpb24oW24oIkEiLCJ4Iit0KyJ5IixlLFsieSJdLCExLGkpLG4oIkIiLCJ4Iit0KyJ5IixlLFsieSJdLCEwLGkpLG4oIlAiLCJjKHgseSkiK3QrIjAiLGUsWyJ5IiwiYyJdLCExLGkpLG4oIlEiLCJjKHgseSkiK3QrIjAiLGUsWyJ5IiwiYyJdLCEwLGkpLCJmdW5jdGlvbiBkaXNwYXRjaEJzZWFyY2giLHIsIihhLHksYyxsLGgpe2lmKGEuc2hhcGUpe2lmKHR5cGVvZihjKT09PSdmdW5jdGlvbicpe3JldHVybiBRKGEsKGw9PT11bmRlZmluZWQpPzA6bHwwLChoPT09dW5kZWZpbmVkKT9hLnNoYXBlWzBdLTE6aHwwLHksYyl9ZWxzZXtyZXR1cm4gQihhLChjPT09dW5kZWZpbmVkKT8wOmN8MCwobD09PXVuZGVmaW5lZCk/YS5zaGFwZVswXS0xOmx8MCx5KX19ZWxzZXtpZih0eXBlb2YoYyk9PT0nZnVuY3Rpb24nKXtyZXR1cm4gUChhLChsPT09dW5kZWZpbmVkKT8wOmx8MCwoaD09PXVuZGVmaW5lZCk/YS5sZW5ndGgtMTpofDAseSxjKX1lbHNle3JldHVybiBBKGEsKGM9PT11bmRlZmluZWQpPzA6Y3wwLChsPT09dW5kZWZpbmVkKT9hLmxlbmd0aC0xOmx8MCx5KX19fXJldHVybiBkaXNwYXRjaEJzZWFyY2giLHJdLmpvaW4oIiIpKSgpfWUuZXhwb3J0cz17Z2U6aSgiPj0iLCExLCJHRSIpLGd0OmkoIj4iLCExLCJHVCIpLGx0OmkoIjwiLCEwLCJMVCIpLGxlOmkoIjw9IiwhMCwiTEUiKSxlcTppKCItIiwhMCwiRVEiLCEwKX19LHt9XSw2NTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjsidXNlIHJlc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlPTMyO3JldHVybiB0Jj0tdCx0JiZlLS0sNjU1MzUmdCYmKGUtPTE2KSwxNjcxMTkzNSZ0JiYoZS09OCksMjUyNjQ1MTM1JnQmJihlLT00KSw4NTg5OTM0NTkmdCYmKGUtPTIpLDE0MzE2NTU3NjUmdCYmKGUtPTEpLGV9ci5JTlRfQklUUz0zMixyLklOVF9NQVg9MjE0NzQ4MzY0NyxyLklOVF9NSU49LTE8PDMxLHIuc2lnbj1mdW5jdGlvbih0KXtyZXR1cm4odD4wKS0odDwwKX0sci5hYnM9ZnVuY3Rpb24odCl7dmFyIGU9dD4+MzE7cmV0dXJuKHReZSktZX0sci5taW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gZV4odF5lKSYtKHQ8ZSl9LHIubWF4PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHReKHReZSkmLSh0PGUpfSxyLmlzUG93Mj1mdW5jdGlvbih0KXtyZXR1cm4hKHQmdC0xfHwhdCl9LHIubG9nMj1mdW5jdGlvbih0KXt2YXIgZSxyO3JldHVybiBlPSh0PjY1NTM1KTw8NCx0Pj4+PWUscj0odD4yNTUpPDwzLHQ+Pj49cixlfD1yLHI9KHQ+MTUpPDwyLHQ+Pj49cixlfD1yLHI9KHQ+Myk8PDEsdD4+Pj1yLChlfD1yKXx0Pj4xfSxyLmxvZzEwPWZ1bmN0aW9uKHQpe3JldHVybiB0Pj0xZTk/OTp0Pj0xZTg/ODp0Pj0xZTc/Nzp0Pj0xZTY/Njp0Pj0xZTU/NTp0Pj0xZTQ/NDp0Pj0xZTM/Mzp0Pj0xMDA/Mjp0Pj0xMD8xOjB9LHIucG9wQ291bnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQtPXQ+Pj4xJjE0MzE2NTU3NjUsMTY4NDMwMDkqKCh0PSg4NTg5OTM0NTkmdCkrKHQ+Pj4yJjg1ODk5MzQ1OSkpKyh0Pj4+NCkmMjUyNjQ1MTM1KT4+PjI0fSxyLmNvdW50VHJhaWxpbmdaZXJvcz1uLHIubmV4dFBvdzI9ZnVuY3Rpb24odCl7cmV0dXJuIHQrPTA9PT10LC0tdCx0fD10Pj4+MSx0fD10Pj4+Mix0fD10Pj4+NCx0fD10Pj4+OCwodHw9dD4+PjE2KSsxfSxyLnByZXZQb3cyPWZ1bmN0aW9uKHQpe3JldHVybiB0fD10Pj4+MSx0fD10Pj4+Mix0fD10Pj4+NCx0fD10Pj4+OCwodHw9dD4+PjE2KS0odD4+PjEpfSxyLnBhcml0eT1mdW5jdGlvbih0KXtyZXR1cm4gdF49dD4+PjE2LHRePXQ+Pj44LHRePXQ+Pj40LDI3MDMwPj4+KHQmPTE1KSYxfTt2YXIgaT1uZXcgQXJyYXkoMjU2KTshZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTwyNTY7KytlKXt2YXIgcj1lLG49ZSxpPTc7Zm9yKHI+Pj49MTtyO3I+Pj49MSluPDw9MSxufD0xJnIsLS1pO3RbZV09bjw8aSYyNTV9fShpKSxyLnJldmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGlbMjU1JnRdPDwyNHxpW3Q+Pj44JjI1NV08PDE2fGlbdD4+PjE2JjI1NV08PDh8aVt0Pj4+MjQmMjU1XX0sci5pbnRlcmxlYXZlMj1mdW5jdGlvbih0LGUpe3JldHVybiB0Jj02NTUzNSx0PTE2NzExOTM1Jih0fHQ8PDgpLHQ9MjUyNjQ1MTM1Jih0fHQ8PDQpLHQ9ODU4OTkzNDU5Jih0fHQ8PDIpLHQ9MTQzMTY1NTc2NSYodHx0PDwxKSxlJj02NTUzNSxlPTE2NzExOTM1JihlfGU8PDgpLGU9MjUyNjQ1MTM1JihlfGU8PDQpLGU9ODU4OTkzNDU5JihlfGU8PDIpLGU9MTQzMTY1NTc2NSYoZXxlPDwxKSx0fGU8PDF9LHIuZGVpbnRlcmxlYXZlMj1mdW5jdGlvbih0LGUpe3JldHVybiB0PXQ+Pj5lJjE0MzE2NTU3NjUsdD04NTg5OTM0NTkmKHR8dD4+PjEpLHQ9MjUyNjQ1MTM1Jih0fHQ+Pj4yKSx0PTE2NzExOTM1Jih0fHQ+Pj40KSwodD02NTUzNSYodHx0Pj4+MTYpKTw8MTY+PjE2fSxyLmludGVybGVhdmUzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdCY9MTAyMyx0PTQyNzgxOTAzMzUmKHR8dDw8MTYpLHQ9MjUxNzE5Njk1Jih0fHQ8PDgpLHQ9MzI3MjM1NjAzNSYodHx0PDw0KSx0PTEyMjcxMzM1MTMmKHR8dDw8MiksZSY9MTAyMyxlPTQyNzgxOTAzMzUmKGV8ZTw8MTYpLGU9MjUxNzE5Njk1JihlfGU8PDgpLGU9MzI3MjM1NjAzNSYoZXxlPDw0KSxlPTEyMjcxMzM1MTMmKGV8ZTw8MiksdHw9ZTw8MSxyJj0xMDIzLHI9NDI3ODE5MDMzNSYocnxyPDwxNikscj0yNTE3MTk2OTUmKHJ8cjw8OCkscj0zMjcyMzU2MDM1JihyfHI8PDQpLHI9MTIyNzEzMzUxMyYocnxyPDwyKSx0fHI8PDJ9LHIuZGVpbnRlcmxlYXZlMz1mdW5jdGlvbih0LGUpe3JldHVybiB0PXQ+Pj5lJjEyMjcxMzM1MTMsdD0zMjcyMzU2MDM1Jih0fHQ+Pj4yKSx0PTI1MTcxOTY5NSYodHx0Pj4+NCksdD00Mjc4MTkwMzM1Jih0fHQ+Pj44KSwodD0xMDIzJih0fHQ+Pj4xNikpPDwyMj4+MjJ9LHIubmV4dENvbWJpbmF0aW9uPWZ1bmN0aW9uKHQpe3ZhciBlPXR8dC0xO3JldHVybiBlKzF8KH5lJi1+ZSktMT4+Pm4odCkrMX19LHt9XSw2NjpbZnVuY3Rpb24odCxlLHIpeyFmdW5jdGlvbihlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7aWYoIXQpdGhyb3cgbmV3IEVycm9yKGV8fCJBc3NlcnRpb24gZmFpbGVkIil9ZnVuY3Rpb24gaSh0LGUpe3Quc3VwZXJfPWU7dmFyIHI9ZnVuY3Rpb24oKXt9O3IucHJvdG90eXBlPWUucHJvdG90eXBlLHQucHJvdG90eXBlPW5ldyByLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gYSh0LGUscil7aWYoYS5pc0JOKHQpKXJldHVybiB0O3RoaXMubmVnYXRpdmU9MCx0aGlzLndvcmRzPW51bGwsdGhpcy5sZW5ndGg9MCx0aGlzLnJlZD1udWxsLG51bGwhPT10JiYoImxlIiE9PWUmJiJiZSIhPT1lfHwocj1lLGU9MTApLHRoaXMuX2luaXQodHx8MCxlfHwxMCxyfHwiYmUiKSl9ZnVuY3Rpb24gbyh0LGUscil7Zm9yKHZhciBuPTAsaT1NYXRoLm1pbih0Lmxlbmd0aCxyKSxhPWU7YTxpO2ErKyl7dmFyIG89dC5jaGFyQ29kZUF0KGEpLTQ4O248PD00LG58PW8+PTQ5JiZvPD01ND9vLTQ5KzEwOm8+PTE3JiZvPD0yMj9vLTE3KzEwOjE1Jm99cmV0dXJuIG59ZnVuY3Rpb24gcyh0LGUscixuKXtmb3IodmFyIGk9MCxhPU1hdGgubWluKHQubGVuZ3RoLHIpLG89ZTtvPGE7bysrKXt2YXIgcz10LmNoYXJDb2RlQXQobyktNDg7aSo9bixpKz1zPj00OT9zLTQ5KzEwOnM+PTE3P3MtMTcrMTA6c31yZXR1cm4gaX1mdW5jdGlvbiBsKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodC5iaXRMZW5ndGgoKSkscj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgbj1yLzI2fDAsaT1yJTI2O2Vbcl09KHQud29yZHNbbl0mMTw8aSk+Pj5pfXJldHVybiBlfWZ1bmN0aW9uIHUodCxlLHIpe3IubmVnYXRpdmU9ZS5uZWdhdGl2ZV50Lm5lZ2F0aXZlO3ZhciBuPXQubGVuZ3RoK2UubGVuZ3RofDA7ci5sZW5ndGg9bixuPW4tMXwwO3ZhciBpPTB8dC53b3Jkc1swXSxhPTB8ZS53b3Jkc1swXSxvPWkqYSxzPTY3MTA4ODYzJm8sbD1vLzY3MTA4ODY0fDA7ci53b3Jkc1swXT1zO2Zvcih2YXIgdT0xO3U8bjt1Kyspe2Zvcih2YXIgYz1sPj4+MjYsaD02NzEwODg2MyZsLGY9TWF0aC5taW4odSxlLmxlbmd0aC0xKSxkPU1hdGgubWF4KDAsdS10Lmxlbmd0aCsxKTtkPD1mO2QrKyl7dmFyIHA9dS1kfDA7aT0wfHQud29yZHNbcF0sYT0wfGUud29yZHNbZF0sbz1pKmEraCxjKz1vLzY3MTA4ODY0fDAsaD02NzEwODg2MyZvfXIud29yZHNbdV09MHxoLGw9MHxjfXJldHVybiAwIT09bD9yLndvcmRzW3VdPTB8bDpyLmxlbmd0aC0tLHIuc3RyaXAoKX1mdW5jdGlvbiBjKHQsZSxyKXtyLm5lZ2F0aXZlPWUubmVnYXRpdmVedC5uZWdhdGl2ZSxyLmxlbmd0aD10Lmxlbmd0aCtlLmxlbmd0aDtmb3IodmFyIG49MCxpPTAsYT0wO2E8ci5sZW5ndGgtMTthKyspe3ZhciBvPWk7aT0wO2Zvcih2YXIgcz02NzEwODg2MyZuLGw9TWF0aC5taW4oYSxlLmxlbmd0aC0xKSx1PU1hdGgubWF4KDAsYS10Lmxlbmd0aCsxKTt1PD1sO3UrKyl7dmFyIGM9YS11LGg9MHx0LndvcmRzW2NdLGY9MHxlLndvcmRzW3VdLGQ9aCpmLHA9NjcxMDg4NjMmZDtvPW8rKGQvNjcxMDg4NjR8MCl8MCxwPXArc3wwLHM9NjcxMDg4NjMmcCxvPW8rKHA+Pj4yNil8MCxpKz1vPj4+MjYsbyY9NjcxMDg4NjN9ci53b3Jkc1thXT1zLG49byxvPWl9cmV0dXJuIDAhPT1uP3Iud29yZHNbYV09bjpyLmxlbmd0aC0tLHIuc3RyaXAoKX1mdW5jdGlvbiBoKHQsZSxyKXtyZXR1cm4obmV3IGYpLm11bHAodCxlLHIpfWZ1bmN0aW9uIGYodCxlKXt0aGlzLng9dCx0aGlzLnk9ZX1mdW5jdGlvbiBkKHQsZSl7dGhpcy5uYW1lPXQsdGhpcy5wPW5ldyBhKGUsMTYpLHRoaXMubj10aGlzLnAuYml0TGVuZ3RoKCksdGhpcy5rPW5ldyBhKDEpLml1c2hsbih0aGlzLm4pLmlzdWIodGhpcy5wKSx0aGlzLnRtcD10aGlzLl90bXAoKX1mdW5jdGlvbiBwKCl7ZC5jYWxsKHRoaXMsImsyNTYiLCJmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZiBmZmZmZmZmZSBmZmZmZmMyZiIpfWZ1bmN0aW9uIG0oKXtkLmNhbGwodGhpcywicDIyNCIsImZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIGZmZmZmZmZmIDAwMDAwMDAwIDAwMDAwMDAwIDAwMDAwMDAxIil9ZnVuY3Rpb24gdigpe2QuY2FsbCh0aGlzLCJwMTkyIiwiZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmYgZmZmZmZmZmUgZmZmZmZmZmYgZmZmZmZmZmYiKX1mdW5jdGlvbiBnKCl7ZC5jYWxsKHRoaXMsIjI1NTE5IiwiN2ZmZmZmZmZmZmZmZmZmZiBmZmZmZmZmZmZmZmZmZmZmIGZmZmZmZmZmZmZmZmZmZmYgZmZmZmZmZmZmZmZmZmZlZCIpfWZ1bmN0aW9uIHkodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgZT1hLl9wcmltZSh0KTt0aGlzLm09ZS5wLHRoaXMucHJpbWU9ZX1lbHNlIG4odC5ndG4oMSksIm1vZHVsdXMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMSIpLHRoaXMubT10LHRoaXMucHJpbWU9bnVsbH1mdW5jdGlvbiBiKHQpe3kuY2FsbCh0aGlzLHQpLHRoaXMuc2hpZnQ9dGhpcy5tLmJpdExlbmd0aCgpLHRoaXMuc2hpZnQlMjYhPTAmJih0aGlzLnNoaWZ0Kz0yNi10aGlzLnNoaWZ0JTI2KSx0aGlzLnI9bmV3IGEoMSkuaXVzaGxuKHRoaXMuc2hpZnQpLHRoaXMucjI9dGhpcy5pbW9kKHRoaXMuci5zcXIoKSksdGhpcy5yaW52PXRoaXMuci5faW52bXAodGhpcy5tKSx0aGlzLm1pbnY9dGhpcy5yaW52Lm11bCh0aGlzLnIpLmlzdWJuKDEpLmRpdih0aGlzLm0pLHRoaXMubWludj10aGlzLm1pbnYudW1vZCh0aGlzLnIpLHRoaXMubWludj10aGlzLnIuc3ViKHRoaXMubWludil9Im9iamVjdCI9PXR5cGVvZiBlP2UuZXhwb3J0cz1hOnIuQk49YSxhLkJOPWEsYS53b3JkU2l6ZT0yNjt2YXIgeDt0cnl7eD10KCJidWZmZXIiKS5CdWZmZXJ9Y2F0Y2godCl7fWEuaXNCTj1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGF8fG51bGwhPT10JiYib2JqZWN0Ij09dHlwZW9mIHQmJnQuY29uc3RydWN0b3Iud29yZFNpemU9PT1hLndvcmRTaXplJiZBcnJheS5pc0FycmF5KHQud29yZHMpfSxhLm1heD1mdW5jdGlvbih0LGUpe3JldHVybiB0LmNtcChlKT4wP3Q6ZX0sYS5taW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5jbXAoZSk8MD90OmV9LGEucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKHQsZSxyKXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHRoaXMuX2luaXROdW1iZXIodCxlLHIpO2lmKCJvYmplY3QiPT10eXBlb2YgdClyZXR1cm4gdGhpcy5faW5pdEFycmF5KHQsZSxyKTsiaGV4Ij09PWUmJihlPTE2KSxuKGU9PT0oMHxlKSYmZT49MiYmZTw9MzYpLHQ9dC50b1N0cmluZygpLnJlcGxhY2UoL1xzKy9nLCIiKTt2YXIgaT0wOyItIj09PXRbMF0mJmkrKywxNj09PWU/dGhpcy5fcGFyc2VIZXgodCxpKTp0aGlzLl9wYXJzZUJhc2UodCxlLGkpLCItIj09PXRbMF0mJih0aGlzLm5lZ2F0aXZlPTEpLHRoaXMuc3RyaXAoKSwibGUiPT09ciYmdGhpcy5faW5pdEFycmF5KHRoaXMudG9BcnJheSgpLGUscil9LGEucHJvdG90eXBlLl9pbml0TnVtYmVyPWZ1bmN0aW9uKHQsZSxyKXt0PDAmJih0aGlzLm5lZ2F0aXZlPTEsdD0tdCksdDw2NzEwODg2ND8odGhpcy53b3Jkcz1bNjcxMDg4NjMmdF0sdGhpcy5sZW5ndGg9MSk6dDw0NTAzNTk5NjI3MzcwNDk2Pyh0aGlzLndvcmRzPVs2NzEwODg2MyZ0LHQvNjcxMDg4NjQmNjcxMDg4NjNdLHRoaXMubGVuZ3RoPTIpOihuKHQ8OTAwNzE5OTI1NDc0MDk5MiksdGhpcy53b3Jkcz1bNjcxMDg4NjMmdCx0LzY3MTA4ODY0JjY3MTA4ODYzLDFdLHRoaXMubGVuZ3RoPTMpLCJsZSI9PT1yJiZ0aGlzLl9pbml0QXJyYXkodGhpcy50b0FycmF5KCksZSxyKX0sYS5wcm90b3R5cGUuX2luaXRBcnJheT1mdW5jdGlvbih0LGUscil7aWYobigibnVtYmVyIj09dHlwZW9mIHQubGVuZ3RoKSx0Lmxlbmd0aDw9MClyZXR1cm4gdGhpcy53b3Jkcz1bMF0sdGhpcy5sZW5ndGg9MSx0aGlzO3RoaXMubGVuZ3RoPU1hdGguY2VpbCh0Lmxlbmd0aC8zKSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBpPTA7aTx0aGlzLmxlbmd0aDtpKyspdGhpcy53b3Jkc1tpXT0wO3ZhciBhLG8scz0wO2lmKCJiZSI9PT1yKWZvcihpPXQubGVuZ3RoLTEsYT0wO2k+PTA7aS09MylvPXRbaV18dFtpLTFdPDw4fHRbaS0yXTw8MTYsdGhpcy53b3Jkc1thXXw9bzw8cyY2NzEwODg2Myx0aGlzLndvcmRzW2ErMV09bz4+PjI2LXMmNjcxMDg4NjMsKHMrPTI0KT49MjYmJihzLT0yNixhKyspO2Vsc2UgaWYoImxlIj09PXIpZm9yKGk9MCxhPTA7aTx0Lmxlbmd0aDtpKz0zKW89dFtpXXx0W2krMV08PDh8dFtpKzJdPDwxNix0aGlzLndvcmRzW2FdfD1vPDxzJjY3MTA4ODYzLHRoaXMud29yZHNbYSsxXT1vPj4+MjYtcyY2NzEwODg2Mywocys9MjQpPj0yNiYmKHMtPTI2LGErKyk7cmV0dXJuIHRoaXMuc3RyaXAoKX0sYS5wcm90b3R5cGUuX3BhcnNlSGV4PWZ1bmN0aW9uKHQsZSl7dGhpcy5sZW5ndGg9TWF0aC5jZWlsKCh0Lmxlbmd0aC1lKS82KSx0aGlzLndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciByPTA7cjx0aGlzLmxlbmd0aDtyKyspdGhpcy53b3Jkc1tyXT0wO3ZhciBuLGksYT0wO2ZvcihyPXQubGVuZ3RoLTYsbj0wO3I+PWU7ci09NilpPW8odCxyLHIrNiksdGhpcy53b3Jkc1tuXXw9aTw8YSY2NzEwODg2Myx0aGlzLndvcmRzW24rMV18PWk+Pj4yNi1hJjQxOTQzMDMsKGErPTI0KT49MjYmJihhLT0yNixuKyspO3IrNiE9PWUmJihpPW8odCxlLHIrNiksdGhpcy53b3Jkc1tuXXw9aTw8YSY2NzEwODg2Myx0aGlzLndvcmRzW24rMV18PWk+Pj4yNi1hJjQxOTQzMDMpLHRoaXMuc3RyaXAoKX0sYS5wcm90b3R5cGUuX3BhcnNlQmFzZT1mdW5jdGlvbih0LGUscil7dGhpcy53b3Jkcz1bMF0sdGhpcy5sZW5ndGg9MTtmb3IodmFyIG49MCxpPTE7aTw9NjcxMDg4NjM7aSo9ZSluKys7bi0tLGk9aS9lfDA7Zm9yKHZhciBhPXQubGVuZ3RoLXIsbz1hJW4sbD1NYXRoLm1pbihhLGEtbykrcix1PTAsYz1yO2M8bDtjKz1uKXU9cyh0LGMsYytuLGUpLHRoaXMuaW11bG4oaSksdGhpcy53b3Jkc1swXSt1PDY3MTA4ODY0P3RoaXMud29yZHNbMF0rPXU6dGhpcy5faWFkZG4odSk7aWYoMCE9PW8pe3ZhciBoPTE7Zm9yKHU9cyh0LGMsdC5sZW5ndGgsZSksYz0wO2M8bztjKyspaCo9ZTt0aGlzLmltdWxuKGgpLHRoaXMud29yZHNbMF0rdTw2NzEwODg2ND90aGlzLndvcmRzWzBdKz11OnRoaXMuX2lhZGRuKHUpfX0sYS5wcm90b3R5cGUuY29weT1mdW5jdGlvbih0KXt0LndvcmRzPW5ldyBBcnJheSh0aGlzLmxlbmd0aCk7Zm9yKHZhciBlPTA7ZTx0aGlzLmxlbmd0aDtlKyspdC53b3Jkc1tlXT10aGlzLndvcmRzW2VdO3QubGVuZ3RoPXRoaXMubGVuZ3RoLHQubmVnYXRpdmU9dGhpcy5uZWdhdGl2ZSx0LnJlZD10aGlzLnJlZH0sYS5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgYShudWxsKTtyZXR1cm4gdGhpcy5jb3B5KHQpLHR9LGEucHJvdG90eXBlLl9leHBhbmQ9ZnVuY3Rpb24odCl7Zm9yKDt0aGlzLmxlbmd0aDx0Oyl0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdPTA7cmV0dXJuIHRoaXN9LGEucHJvdG90eXBlLnN0cmlwPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLmxlbmd0aD4xJiYwPT09dGhpcy53b3Jkc1t0aGlzLmxlbmd0aC0xXTspdGhpcy5sZW5ndGgtLTtyZXR1cm4gdGhpcy5fbm9ybVNpZ24oKX0sYS5wcm90b3R5cGUuX25vcm1TaWduPWZ1bmN0aW9uKCl7cmV0dXJuIDE9PT10aGlzLmxlbmd0aCYmMD09PXRoaXMud29yZHNbMF0mJih0aGlzLm5lZ2F0aXZlPTApLHRoaXN9LGEucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5yZWQ/IjxCTi1SOiAiOiI8Qk46ICIpK3RoaXMudG9TdHJpbmcoMTYpKyI+In07dmFyIF89WyIiLCIwIiwiMDAiLCIwMDAiLCIwMDAwIiwiMDAwMDAiLCIwMDAwMDAiLCIwMDAwMDAwIiwiMDAwMDAwMDAiLCIwMDAwMDAwMDAiLCIwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIiwiMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAiLCIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIl0sdz1bMCwwLDI1LDE2LDEyLDExLDEwLDksOCw4LDcsNyw3LDcsNiw2LDYsNiw2LDYsNiw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1LDUsNSw1XSxNPVswLDAsMzM1NTQ0MzIsNDMwNDY3MjEsMTY3NzcyMTYsNDg4MjgxMjUsNjA0NjYxNzYsNDAzNTM2MDcsMTY3NzcyMTYsNDMwNDY3MjEsMWU3LDE5NDg3MTcxLDM1ODMxODA4LDYyNzQ4NTE3LDc1Mjk1MzYsMTEzOTA2MjUsMTY3NzcyMTYsMjQxMzc1NjksMzQwMTIyMjQsNDcwNDU4ODEsNjRlNiw0MDg0MTAxLDUxNTM2MzIsNjQzNjM0Myw3OTYyNjI0LDk3NjU2MjUsMTE4ODEzNzYsMTQzNDg5MDcsMTcyMTAzNjgsMjA1MTExNDksMjQzZTUsMjg2MjkxNTEsMzM1NTQ0MzIsMzkxMzUzOTMsNDU0MzU0MjQsNTI1MjE4NzUsNjA0NjYxNzZdO2EucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKHQsZSl7dD10fHwxMCxlPTB8ZXx8MTt2YXIgcjtpZigxNj09PXR8fCJoZXgiPT09dCl7cj0iIjtmb3IodmFyIGk9MCxhPTAsbz0wO288dGhpcy5sZW5ndGg7bysrKXt2YXIgcz10aGlzLndvcmRzW29dLGw9KDE2Nzc3MjE1JihzPDxpfGEpKS50b1N0cmluZygxNik7YT1zPj4+MjQtaSYxNjc3NzIxNSxyPTAhPT1hfHxvIT09dGhpcy5sZW5ndGgtMT9fWzYtbC5sZW5ndGhdK2wrcjpsK3IsaSs9MixpPj0yNiYmKGktPTI2LG8tLSl9Zm9yKDAhPT1hJiYocj1hLnRvU3RyaW5nKDE2KStyKTtyLmxlbmd0aCVlIT0wOylyPSIwIityO3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZSYmKHI9Ii0iK3IpLHJ9aWYodD09PSgwfHQpJiZ0Pj0yJiZ0PD0zNil7dmFyIHU9d1t0XSxjPU1bdF07cj0iIjt2YXIgaD10aGlzLmNsb25lKCk7Zm9yKGgubmVnYXRpdmU9MDshaC5pc1plcm8oKTspe3ZhciBmPWgubW9kbihjKS50b1N0cmluZyh0KTtoPWguaWRpdm4oYykscj1oLmlzWmVybygpP2YrcjpfW3UtZi5sZW5ndGhdK2Yrcn1mb3IodGhpcy5pc1plcm8oKSYmKHI9IjAiK3IpO3IubGVuZ3RoJWUhPTA7KXI9IjAiK3I7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlJiYocj0iLSIrcikscn1uKCExLCJCYXNlIHNob3VsZCBiZSBiZXR3ZWVuIDIgYW5kIDM2Iil9LGEucHJvdG90eXBlLnRvTnVtYmVyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy53b3Jkc1swXTtyZXR1cm4gMj09PXRoaXMubGVuZ3RoP3QrPTY3MTA4ODY0KnRoaXMud29yZHNbMV06Mz09PXRoaXMubGVuZ3RoJiYxPT09dGhpcy53b3Jkc1syXT90Kz00NTAzNTk5NjI3MzcwNDk2KzY3MTA4ODY0KnRoaXMud29yZHNbMV06dGhpcy5sZW5ndGg+MiYmbighMSwiTnVtYmVyIGNhbiBvbmx5IHNhZmVseSBzdG9yZSB1cCB0byA1MyBiaXRzIiksMCE9PXRoaXMubmVnYXRpdmU/LXQ6dH0sYS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TdHJpbmcoMTYpfSxhLnByb3RvdHlwZS50b0J1ZmZlcj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHZvaWQgMCE9PXgpLHRoaXMudG9BcnJheUxpa2UoeCx0LGUpfSxhLnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudG9BcnJheUxpa2UoQXJyYXksdCxlKX0sYS5wcm90b3R5cGUudG9BcnJheUxpa2U9ZnVuY3Rpb24odCxlLHIpe3ZhciBpPXRoaXMuYnl0ZUxlbmd0aCgpLGE9cnx8TWF0aC5tYXgoMSxpKTtuKGk8PWEsImJ5dGUgYXJyYXkgbG9uZ2VyIHRoYW4gZGVzaXJlZCBsZW5ndGgiKSxuKGE+MCwiUmVxdWVzdGVkIGFycmF5IGxlbmd0aCA8PSAwIiksdGhpcy5zdHJpcCgpO3ZhciBvLHMsbD0ibGUiPT09ZSx1PW5ldyB0KGEpLGM9dGhpcy5jbG9uZSgpO2lmKGwpe2ZvcihzPTA7IWMuaXNaZXJvKCk7cysrKW89Yy5hbmRsbigyNTUpLGMuaXVzaHJuKDgpLHVbc109bztmb3IoO3M8YTtzKyspdVtzXT0wfWVsc2V7Zm9yKHM9MDtzPGEtaTtzKyspdVtzXT0wO2ZvcihzPTA7IWMuaXNaZXJvKCk7cysrKW89Yy5hbmRsbigyNTUpLGMuaXVzaHJuKDgpLHVbYS1zLTFdPW99cmV0dXJuIHV9LE1hdGguY2x6MzI/YS5wcm90b3R5cGUuX2NvdW50Qml0cz1mdW5jdGlvbih0KXtyZXR1cm4gMzItTWF0aC5jbHozMih0KX06YS5wcm90b3R5cGUuX2NvdW50Qml0cz1mdW5jdGlvbih0KXt2YXIgZT10LHI9MDtyZXR1cm4gZT49NDA5NiYmKHIrPTEzLGU+Pj49MTMpLGU+PTY0JiYocis9NyxlPj4+PTcpLGU+PTgmJihyKz00LGU+Pj49NCksZT49MiYmKHIrPTIsZT4+Pj0yKSxyK2V9LGEucHJvdG90eXBlLl96ZXJvQml0cz1mdW5jdGlvbih0KXtpZigwPT09dClyZXR1cm4gMjY7dmFyIGU9dCxyPTA7cmV0dXJuIDA9PSg4MTkxJmUpJiYocis9MTMsZT4+Pj0xMyksMD09KDEyNyZlKSYmKHIrPTcsZT4+Pj03KSwwPT0oMTUmZSkmJihyKz00LGU+Pj49NCksMD09KDMmZSkmJihyKz0yLGU+Pj49MiksMD09KDEmZSkmJnIrKyxyfSxhLnByb3RvdHlwZS5iaXRMZW5ndGg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLndvcmRzW3RoaXMubGVuZ3RoLTFdLGU9dGhpcy5fY291bnRCaXRzKHQpO3JldHVybiAyNioodGhpcy5sZW5ndGgtMSkrZX0sYS5wcm90b3R5cGUuemVyb0JpdHM9ZnVuY3Rpb24oKXtpZih0aGlzLmlzWmVybygpKXJldHVybiAwO2Zvcih2YXIgdD0wLGU9MDtlPHRoaXMubGVuZ3RoO2UrKyl7dmFyIHI9dGhpcy5femVyb0JpdHModGhpcy53b3Jkc1tlXSk7aWYodCs9ciwyNiE9PXIpYnJlYWt9cmV0dXJuIHR9LGEucHJvdG90eXBlLmJ5dGVMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuYml0TGVuZ3RoKCkvOCl9LGEucHJvdG90eXBlLnRvVHdvcz1mdW5jdGlvbih0KXtyZXR1cm4gMCE9PXRoaXMubmVnYXRpdmU/dGhpcy5hYnMoKS5pbm90bih0KS5pYWRkbigxKTp0aGlzLmNsb25lKCl9LGEucHJvdG90eXBlLmZyb21Ud29zPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRlc3RuKHQtMSk/dGhpcy5ub3RuKHQpLmlhZGRuKDEpLmluZWcoKTp0aGlzLmNsb25lKCl9LGEucHJvdG90eXBlLmlzTmVnPWZ1bmN0aW9uKCl7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlfSxhLnByb3RvdHlwZS5uZWc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbG9uZSgpLmluZWcoKX0sYS5wcm90b3R5cGUuaW5lZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmlzWmVybygpfHwodGhpcy5uZWdhdGl2ZV49MSksdGhpc30sYS5wcm90b3R5cGUuaXVvcj1mdW5jdGlvbih0KXtmb3IoO3RoaXMubGVuZ3RoPHQubGVuZ3RoOyl0aGlzLndvcmRzW3RoaXMubGVuZ3RoKytdPTA7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKyspdGhpcy53b3Jkc1tlXT10aGlzLndvcmRzW2VdfHQud29yZHNbZV07cmV0dXJuIHRoaXMuc3RyaXAoKX0sYS5wcm90b3R5cGUuaW9yPWZ1bmN0aW9uKHQpe3JldHVybiBuKDA9PSh0aGlzLm5lZ2F0aXZlfHQubmVnYXRpdmUpKSx0aGlzLml1b3IodCl9LGEucHJvdG90eXBlLm9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaW9yKHQpOnQuY2xvbmUoKS5pb3IodGhpcyl9LGEucHJvdG90eXBlLnVvcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLml1b3IodCk6dC5jbG9uZSgpLml1b3IodGhpcyl9LGEucHJvdG90eXBlLml1YW5kPWZ1bmN0aW9uKHQpe3ZhciBlO2U9dGhpcy5sZW5ndGg+dC5sZW5ndGg/dDp0aGlzO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXRoaXMud29yZHNbcl09dGhpcy53b3Jkc1tyXSZ0LndvcmRzW3JdO3JldHVybiB0aGlzLmxlbmd0aD1lLmxlbmd0aCx0aGlzLnN0cmlwKCl9LGEucHJvdG90eXBlLmlhbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG4oMD09KHRoaXMubmVnYXRpdmV8dC5uZWdhdGl2ZSkpLHRoaXMuaXVhbmQodCl9LGEucHJvdG90eXBlLmFuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sZW5ndGg+dC5sZW5ndGg/dGhpcy5jbG9uZSgpLmlhbmQodCk6dC5jbG9uZSgpLmlhbmQodGhpcyl9LGEucHJvdG90eXBlLnVhbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pdWFuZCh0KTp0LmNsb25lKCkuaXVhbmQodGhpcyl9LGEucHJvdG90eXBlLml1eG9yPWZ1bmN0aW9uKHQpe3ZhciBlLHI7dGhpcy5sZW5ndGg+dC5sZW5ndGg/KGU9dGhpcyxyPXQpOihlPXQscj10aGlzKTtmb3IodmFyIG49MDtuPHIubGVuZ3RoO24rKyl0aGlzLndvcmRzW25dPWUud29yZHNbbl1eci53b3Jkc1tuXTtpZih0aGlzIT09ZSlmb3IoO248ZS5sZW5ndGg7bisrKXRoaXMud29yZHNbbl09ZS53b3Jkc1tuXTtyZXR1cm4gdGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5zdHJpcCgpfSxhLnByb3RvdHlwZS5peG9yPWZ1bmN0aW9uKHQpe3JldHVybiBuKDA9PSh0aGlzLm5lZ2F0aXZlfHQubmVnYXRpdmUpKSx0aGlzLml1eG9yKHQpfSxhLnByb3RvdHlwZS54b3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5peG9yKHQpOnQuY2xvbmUoKS5peG9yKHRoaXMpfSxhLnByb3RvdHlwZS51eG9yPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxlbmd0aD50Lmxlbmd0aD90aGlzLmNsb25lKCkuaXV4b3IodCk6dC5jbG9uZSgpLml1eG9yKHRoaXMpfSxhLnByb3RvdHlwZS5pbm90bj1mdW5jdGlvbih0KXtuKCJudW1iZXIiPT10eXBlb2YgdCYmdD49MCk7dmFyIGU9MHxNYXRoLmNlaWwodC8yNikscj10JTI2O3RoaXMuX2V4cGFuZChlKSxyPjAmJmUtLTtmb3IodmFyIGk9MDtpPGU7aSsrKXRoaXMud29yZHNbaV09NjcxMDg4NjMmfnRoaXMud29yZHNbaV07cmV0dXJuIHI+MCYmKHRoaXMud29yZHNbaV09fnRoaXMud29yZHNbaV0mNjcxMDg4NjM+PjI2LXIpLHRoaXMuc3RyaXAoKX0sYS5wcm90b3R5cGUubm90bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlub3RuKHQpfSxhLnByb3RvdHlwZS5zZXRuPWZ1bmN0aW9uKHQsZSl7bigibnVtYmVyIj09dHlwZW9mIHQmJnQ+PTApO3ZhciByPXQvMjZ8MCxpPXQlMjY7cmV0dXJuIHRoaXMuX2V4cGFuZChyKzEpLHRoaXMud29yZHNbcl09ZT90aGlzLndvcmRzW3JdfDE8PGk6dGhpcy53b3Jkc1tyXSZ+KDE8PGkpLHRoaXMuc3RyaXAoKX0sYS5wcm90b3R5cGUuaWFkZD1mdW5jdGlvbih0KXt2YXIgZTtpZigwIT09dGhpcy5uZWdhdGl2ZSYmMD09PXQubmVnYXRpdmUpcmV0dXJuIHRoaXMubmVnYXRpdmU9MCxlPXRoaXMuaXN1Yih0KSx0aGlzLm5lZ2F0aXZlXj0xLHRoaXMuX25vcm1TaWduKCk7aWYoMD09PXRoaXMubmVnYXRpdmUmJjAhPT10Lm5lZ2F0aXZlKXJldHVybiB0Lm5lZ2F0aXZlPTAsZT10aGlzLmlzdWIodCksdC5uZWdhdGl2ZT0xLGUuX25vcm1TaWduKCk7dmFyIHIsbjt0aGlzLmxlbmd0aD50Lmxlbmd0aD8ocj10aGlzLG49dCk6KHI9dCxuPXRoaXMpO2Zvcih2YXIgaT0wLGE9MDthPG4ubGVuZ3RoO2ErKyllPSgwfHIud29yZHNbYV0pKygwfG4ud29yZHNbYV0pK2ksdGhpcy53b3Jkc1thXT02NzEwODg2MyZlLGk9ZT4+PjI2O2Zvcig7MCE9PWkmJmE8ci5sZW5ndGg7YSsrKWU9KDB8ci53b3Jkc1thXSkraSx0aGlzLndvcmRzW2FdPTY3MTA4ODYzJmUsaT1lPj4+MjY7aWYodGhpcy5sZW5ndGg9ci5sZW5ndGgsMCE9PWkpdGhpcy53b3Jkc1t0aGlzLmxlbmd0aF09aSx0aGlzLmxlbmd0aCsrO2Vsc2UgaWYociE9PXRoaXMpZm9yKDthPHIubGVuZ3RoO2ErKyl0aGlzLndvcmRzW2FdPXIud29yZHNbYV07cmV0dXJuIHRoaXN9LGEucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4gMCE9PXQubmVnYXRpdmUmJjA9PT10aGlzLm5lZ2F0aXZlPyh0Lm5lZ2F0aXZlPTAsZT10aGlzLnN1Yih0KSx0Lm5lZ2F0aXZlXj0xLGUpOjA9PT10Lm5lZ2F0aXZlJiYwIT09dGhpcy5uZWdhdGl2ZT8odGhpcy5uZWdhdGl2ZT0wLGU9dC5zdWIodGhpcyksdGhpcy5uZWdhdGl2ZT0xLGUpOnRoaXMubGVuZ3RoPnQubGVuZ3RoP3RoaXMuY2xvbmUoKS5pYWRkKHQpOnQuY2xvbmUoKS5pYWRkKHRoaXMpfSxhLnByb3RvdHlwZS5pc3ViPWZ1bmN0aW9uKHQpe2lmKDAhPT10Lm5lZ2F0aXZlKXt0Lm5lZ2F0aXZlPTA7dmFyIGU9dGhpcy5pYWRkKHQpO3JldHVybiB0Lm5lZ2F0aXZlPTEsZS5fbm9ybVNpZ24oKX1pZigwIT09dGhpcy5uZWdhdGl2ZSlyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLHRoaXMuaWFkZCh0KSx0aGlzLm5lZ2F0aXZlPTEsdGhpcy5fbm9ybVNpZ24oKTt2YXIgcj10aGlzLmNtcCh0KTtpZigwPT09cilyZXR1cm4gdGhpcy5uZWdhdGl2ZT0wLHRoaXMubGVuZ3RoPTEsdGhpcy53b3Jkc1swXT0wLHRoaXM7dmFyIG4saTtyPjA/KG49dGhpcyxpPXQpOihuPXQsaT10aGlzKTtmb3IodmFyIGE9MCxvPTA7bzxpLmxlbmd0aDtvKyspZT0oMHxuLndvcmRzW29dKS0oMHxpLndvcmRzW29dKSthLGE9ZT4+MjYsdGhpcy53b3Jkc1tvXT02NzEwODg2MyZlO2Zvcig7MCE9PWEmJm88bi5sZW5ndGg7bysrKWU9KDB8bi53b3Jkc1tvXSkrYSxhPWU+PjI2LHRoaXMud29yZHNbb109NjcxMDg4NjMmZTtpZigwPT09YSYmbzxuLmxlbmd0aCYmbiE9PXRoaXMpZm9yKDtvPG4ubGVuZ3RoO28rKyl0aGlzLndvcmRzW29dPW4ud29yZHNbb107cmV0dXJuIHRoaXMubGVuZ3RoPU1hdGgubWF4KHRoaXMubGVuZ3RoLG8pLG4hPT10aGlzJiYodGhpcy5uZWdhdGl2ZT0xKSx0aGlzLnN0cmlwKCl9LGEucHJvdG90eXBlLnN1Yj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlzdWIodCl9O3ZhciBrPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbixpLGEsbz10LndvcmRzLHM9ZS53b3JkcyxsPXIud29yZHMsdT0wLGM9MHxvWzBdLGg9ODE5MSZjLGY9Yz4+PjEzLGQ9MHxvWzFdLHA9ODE5MSZkLG09ZD4+PjEzLHY9MHxvWzJdLGc9ODE5MSZ2LHk9dj4+PjEzLGI9MHxvWzNdLHg9ODE5MSZiLF89Yj4+PjEzLHc9MHxvWzRdLE09ODE5MSZ3LGs9dz4+PjEzLEE9MHxvWzVdLFQ9ODE5MSZBLFM9QT4+PjEzLEU9MHxvWzZdLEw9ODE5MSZFLEM9RT4+PjEzLHo9MHxvWzddLEk9ODE5MSZ6LEQ9ej4+PjEzLFA9MHxvWzhdLE89ODE5MSZQLFI9UD4+PjEzLEY9MHxvWzldLGo9ODE5MSZGLE49Rj4+PjEzLEI9MHxzWzBdLFU9ODE5MSZCLFY9Qj4+PjEzLEg9MHxzWzFdLHE9ODE5MSZILEc9SD4+PjEzLFk9MHxzWzJdLFg9ODE5MSZZLFc9WT4+PjEzLFo9MHxzWzNdLEo9ODE5MSZaLEs9Wj4+PjEzLFE9MHxzWzRdLCQ9ODE5MSZRLHR0PVE+Pj4xMyxldD0wfHNbNV0scnQ9ODE5MSZldCxudD1ldD4+PjEzLGl0PTB8c1s2XSxhdD04MTkxJml0LG90PWl0Pj4+MTMsc3Q9MHxzWzddLGx0PTgxOTEmc3QsdXQ9c3Q+Pj4xMyxjdD0wfHNbOF0saHQ9ODE5MSZjdCxmdD1jdD4+PjEzLGR0PTB8c1s5XSxwdD04MTkxJmR0LG10PWR0Pj4+MTM7ci5uZWdhdGl2ZT10Lm5lZ2F0aXZlXmUubmVnYXRpdmUsci5sZW5ndGg9MTksbj1NYXRoLmltdWwoaCxVKSxpPU1hdGguaW11bChoLFYpLGk9aStNYXRoLmltdWwoZixVKXwwLGE9TWF0aC5pbXVsKGYsVik7dmFyIHZ0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShhKyhpPj4+MTMpfDApKyh2dD4+PjI2KXwwLHZ0Jj02NzEwODg2MyxuPU1hdGguaW11bChwLFUpLGk9TWF0aC5pbXVsKHAsViksaT1pK01hdGguaW11bChtLFUpfDAsYT1NYXRoLmltdWwobSxWKSxuPW4rTWF0aC5pbXVsKGgscSl8MCxpPWkrTWF0aC5pbXVsKGgsRyl8MCxpPWkrTWF0aC5pbXVsKGYscSl8MCxhPWErTWF0aC5pbXVsKGYsRyl8MDt2YXIgZ3Q9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KGErKGk+Pj4xMyl8MCkrKGd0Pj4+MjYpfDAsZ3QmPTY3MTA4ODYzLG49TWF0aC5pbXVsKGcsVSksaT1NYXRoLmltdWwoZyxWKSxpPWkrTWF0aC5pbXVsKHksVSl8MCxhPU1hdGguaW11bCh5LFYpLG49bitNYXRoLmltdWwocCxxKXwwLGk9aStNYXRoLmltdWwocCxHKXwwLGk9aStNYXRoLmltdWwobSxxKXwwLGE9YStNYXRoLmltdWwobSxHKXwwLG49bitNYXRoLmltdWwoaCxYKXwwLGk9aStNYXRoLmltdWwoaCxXKXwwLGk9aStNYXRoLmltdWwoZixYKXwwLGE9YStNYXRoLmltdWwoZixXKXwwO3ZhciB5dD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0oYSsoaT4+PjEzKXwwKSsoeXQ+Pj4yNil8MCx5dCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoeCxVKSxpPU1hdGguaW11bCh4LFYpLGk9aStNYXRoLmltdWwoXyxVKXwwLGE9TWF0aC5pbXVsKF8sViksbj1uK01hdGguaW11bChnLHEpfDAsaT1pK01hdGguaW11bChnLEcpfDAsaT1pK01hdGguaW11bCh5LHEpfDAsYT1hK01hdGguaW11bCh5LEcpfDAsbj1uK01hdGguaW11bChwLFgpfDAsaT1pK01hdGguaW11bChwLFcpfDAsaT1pK01hdGguaW11bChtLFgpfDAsYT1hK01hdGguaW11bChtLFcpfDAsbj1uK01hdGguaW11bChoLEopfDAsaT1pK01hdGguaW11bChoLEspfDAsaT1pK01hdGguaW11bChmLEopfDAsYT1hK01hdGguaW11bChmLEspfDA7dmFyIGJ0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShhKyhpPj4+MTMpfDApKyhidD4+PjI2KXwwLGJ0Jj02NzEwODg2MyxuPU1hdGguaW11bChNLFUpLGk9TWF0aC5pbXVsKE0sViksaT1pK01hdGguaW11bChrLFUpfDAsYT1NYXRoLmltdWwoayxWKSxuPW4rTWF0aC5pbXVsKHgscSl8MCxpPWkrTWF0aC5pbXVsKHgsRyl8MCxpPWkrTWF0aC5pbXVsKF8scSl8MCxhPWErTWF0aC5pbXVsKF8sRyl8MCxuPW4rTWF0aC5pbXVsKGcsWCl8MCxpPWkrTWF0aC5pbXVsKGcsVyl8MCxpPWkrTWF0aC5pbXVsKHksWCl8MCxhPWErTWF0aC5pbXVsKHksVyl8MCxuPW4rTWF0aC5pbXVsKHAsSil8MCxpPWkrTWF0aC5pbXVsKHAsSyl8MCxpPWkrTWF0aC5pbXVsKG0sSil8MCxhPWErTWF0aC5pbXVsKG0sSyl8MCxuPW4rTWF0aC5pbXVsKGgsJCl8MCxpPWkrTWF0aC5pbXVsKGgsdHQpfDAsaT1pK01hdGguaW11bChmLCQpfDAsYT1hK01hdGguaW11bChmLHR0KXwwO3ZhciB4dD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0oYSsoaT4+PjEzKXwwKSsoeHQ+Pj4yNil8MCx4dCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoVCxVKSxpPU1hdGguaW11bChULFYpLGk9aStNYXRoLmltdWwoUyxVKXwwLGE9TWF0aC5pbXVsKFMsViksbj1uK01hdGguaW11bChNLHEpfDAsaT1pK01hdGguaW11bChNLEcpfDAsaT1pK01hdGguaW11bChrLHEpfDAsYT1hK01hdGguaW11bChrLEcpfDAsbj1uK01hdGguaW11bCh4LFgpfDAsaT1pK01hdGguaW11bCh4LFcpfDAsaT1pK01hdGguaW11bChfLFgpfDAsYT1hK01hdGguaW11bChfLFcpfDAsbj1uK01hdGguaW11bChnLEopfDAsaT1pK01hdGguaW11bChnLEspfDAsaT1pK01hdGguaW11bCh5LEopfDAsYT1hK01hdGguaW11bCh5LEspfDAsbj1uK01hdGguaW11bChwLCQpfDAsaT1pK01hdGguaW11bChwLHR0KXwwLGk9aStNYXRoLmltdWwobSwkKXwwLGE9YStNYXRoLmltdWwobSx0dCl8MCxuPW4rTWF0aC5pbXVsKGgscnQpfDAsaT1pK01hdGguaW11bChoLG50KXwwLGk9aStNYXRoLmltdWwoZixydCl8MCxhPWErTWF0aC5pbXVsKGYsbnQpfDA7dmFyIF90PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShhKyhpPj4+MTMpfDApKyhfdD4+PjI2KXwwLF90Jj02NzEwODg2MyxuPU1hdGguaW11bChMLFUpLGk9TWF0aC5pbXVsKEwsViksaT1pK01hdGguaW11bChDLFUpfDAsYT1NYXRoLmltdWwoQyxWKSxuPW4rTWF0aC5pbXVsKFQscSl8MCxpPWkrTWF0aC5pbXVsKFQsRyl8MCxpPWkrTWF0aC5pbXVsKFMscSl8MCxhPWErTWF0aC5pbXVsKFMsRyl8MCxuPW4rTWF0aC5pbXVsKE0sWCl8MCxpPWkrTWF0aC5pbXVsKE0sVyl8MCxpPWkrTWF0aC5pbXVsKGssWCl8MCxhPWErTWF0aC5pbXVsKGssVyl8MCxuPW4rTWF0aC5pbXVsKHgsSil8MCxpPWkrTWF0aC5pbXVsKHgsSyl8MCxpPWkrTWF0aC5pbXVsKF8sSil8MCxhPWErTWF0aC5pbXVsKF8sSyl8MCxuPW4rTWF0aC5pbXVsKGcsJCl8MCxpPWkrTWF0aC5pbXVsKGcsdHQpfDAsaT1pK01hdGguaW11bCh5LCQpfDAsYT1hK01hdGguaW11bCh5LHR0KXwwLG49bitNYXRoLmltdWwocCxydCl8MCxpPWkrTWF0aC5pbXVsKHAsbnQpfDAsaT1pK01hdGguaW11bChtLHJ0KXwwLGE9YStNYXRoLmltdWwobSxudCl8MCxuPW4rTWF0aC5pbXVsKGgsYXQpfDAsaT1pK01hdGguaW11bChoLG90KXwwLGk9aStNYXRoLmltdWwoZixhdCl8MCxhPWErTWF0aC5pbXVsKGYsb3QpfDA7dmFyIHd0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShhKyhpPj4+MTMpfDApKyh3dD4+PjI2KXwwLHd0Jj02NzEwODg2MyxuPU1hdGguaW11bChJLFUpLGk9TWF0aC5pbXVsKEksViksaT1pK01hdGguaW11bChELFUpfDAsYT1NYXRoLmltdWwoRCxWKSxuPW4rTWF0aC5pbXVsKEwscSl8MCxpPWkrTWF0aC5pbXVsKEwsRyl8MCxpPWkrTWF0aC5pbXVsKEMscSl8MCxhPWErTWF0aC5pbXVsKEMsRyl8MCxuPW4rTWF0aC5pbXVsKFQsWCl8MCxpPWkrTWF0aC5pbXVsKFQsVyl8MCxpPWkrTWF0aC5pbXVsKFMsWCl8MCxhPWErTWF0aC5pbXVsKFMsVyl8MCxuPW4rTWF0aC5pbXVsKE0sSil8MCxpPWkrTWF0aC5pbXVsKE0sSyl8MCxpPWkrTWF0aC5pbXVsKGssSil8MCxhPWErTWF0aC5pbXVsKGssSyl8MCxuPW4rTWF0aC5pbXVsKHgsJCl8MCxpPWkrTWF0aC5pbXVsKHgsdHQpfDAsaT1pK01hdGguaW11bChfLCQpfDAsYT1hK01hdGguaW11bChfLHR0KXwwLG49bitNYXRoLmltdWwoZyxydCl8MCxpPWkrTWF0aC5pbXVsKGcsbnQpfDAsaT1pK01hdGguaW11bCh5LHJ0KXwwLGE9YStNYXRoLmltdWwoeSxudCl8MCxuPW4rTWF0aC5pbXVsKHAsYXQpfDAsaT1pK01hdGguaW11bChwLG90KXwwLGk9aStNYXRoLmltdWwobSxhdCl8MCxhPWErTWF0aC5pbXVsKG0sb3QpfDAsbj1uK01hdGguaW11bChoLGx0KXwwLGk9aStNYXRoLmltdWwoaCx1dCl8MCxpPWkrTWF0aC5pbXVsKGYsbHQpfDAsYT1hK01hdGguaW11bChmLHV0KXwwO3ZhciBNdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0oYSsoaT4+PjEzKXwwKSsoTXQ+Pj4yNil8MCxNdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoTyxVKSxpPU1hdGguaW11bChPLFYpLGk9aStNYXRoLmltdWwoUixVKXwwLGE9TWF0aC5pbXVsKFIsViksbj1uK01hdGguaW11bChJLHEpfDAsaT1pK01hdGguaW11bChJLEcpfDAsaT1pK01hdGguaW11bChELHEpfDAsYT1hK01hdGguaW11bChELEcpfDAsbj1uK01hdGguaW11bChMLFgpfDAsaT1pK01hdGguaW11bChMLFcpfDAsaT1pK01hdGguaW11bChDLFgpfDAsYT1hK01hdGguaW11bChDLFcpfDAsbj1uK01hdGguaW11bChULEopfDAsaT1pK01hdGguaW11bChULEspfDAsaT1pK01hdGguaW11bChTLEopfDAsYT1hK01hdGguaW11bChTLEspfDAsbj1uK01hdGguaW11bChNLCQpfDAsaT1pK01hdGguaW11bChNLHR0KXwwLGk9aStNYXRoLmltdWwoaywkKXwwLGE9YStNYXRoLmltdWwoayx0dCl8MCxuPW4rTWF0aC5pbXVsKHgscnQpfDAsaT1pK01hdGguaW11bCh4LG50KXwwLGk9aStNYXRoLmltdWwoXyxydCl8MCxhPWErTWF0aC5pbXVsKF8sbnQpfDAsbj1uK01hdGguaW11bChnLGF0KXwwLGk9aStNYXRoLmltdWwoZyxvdCl8MCxpPWkrTWF0aC5pbXVsKHksYXQpfDAsYT1hK01hdGguaW11bCh5LG90KXwwLG49bitNYXRoLmltdWwocCxsdCl8MCxpPWkrTWF0aC5pbXVsKHAsdXQpfDAsaT1pK01hdGguaW11bChtLGx0KXwwLGE9YStNYXRoLmltdWwobSx1dCl8MCxuPW4rTWF0aC5pbXVsKGgsaHQpfDAsaT1pK01hdGguaW11bChoLGZ0KXwwLGk9aStNYXRoLmltdWwoZixodCl8MCxhPWErTWF0aC5pbXVsKGYsZnQpfDA7dmFyIGt0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShhKyhpPj4+MTMpfDApKyhrdD4+PjI2KXwwLGt0Jj02NzEwODg2MyxuPU1hdGguaW11bChqLFUpLGk9TWF0aC5pbXVsKGosViksaT1pK01hdGguaW11bChOLFUpfDAsYT1NYXRoLmltdWwoTixWKSxuPW4rTWF0aC5pbXVsKE8scSl8MCxpPWkrTWF0aC5pbXVsKE8sRyl8MCxpPWkrTWF0aC5pbXVsKFIscSl8MCxhPWErTWF0aC5pbXVsKFIsRyl8MCxuPW4rTWF0aC5pbXVsKEksWCl8MCxpPWkrTWF0aC5pbXVsKEksVyl8MCxpPWkrTWF0aC5pbXVsKEQsWCl8MCxhPWErTWF0aC5pbXVsKEQsVyl8MCxuPW4rTWF0aC5pbXVsKEwsSil8MCxpPWkrTWF0aC5pbXVsKEwsSyl8MCxpPWkrTWF0aC5pbXVsKEMsSil8MCxhPWErTWF0aC5pbXVsKEMsSyl8MCxuPW4rTWF0aC5pbXVsKFQsJCl8MCxpPWkrTWF0aC5pbXVsKFQsdHQpfDAsaT1pK01hdGguaW11bChTLCQpfDAsYT1hK01hdGguaW11bChTLHR0KXwwLG49bitNYXRoLmltdWwoTSxydCl8MCxpPWkrTWF0aC5pbXVsKE0sbnQpfDAsaT1pK01hdGguaW11bChrLHJ0KXwwLGE9YStNYXRoLmltdWwoayxudCl8MCxuPW4rTWF0aC5pbXVsKHgsYXQpfDAsaT1pK01hdGguaW11bCh4LG90KXwwLGk9aStNYXRoLmltdWwoXyxhdCl8MCxhPWErTWF0aC5pbXVsKF8sb3QpfDAsbj1uK01hdGguaW11bChnLGx0KXwwLGk9aStNYXRoLmltdWwoZyx1dCl8MCxpPWkrTWF0aC5pbXVsKHksbHQpfDAsYT1hK01hdGguaW11bCh5LHV0KXwwLG49bitNYXRoLmltdWwocCxodCl8MCxpPWkrTWF0aC5pbXVsKHAsZnQpfDAsaT1pK01hdGguaW11bChtLGh0KXwwLGE9YStNYXRoLmltdWwobSxmdCl8MCxuPW4rTWF0aC5pbXVsKGgscHQpfDAsaT1pK01hdGguaW11bChoLG10KXwwLGk9aStNYXRoLmltdWwoZixwdCl8MCxhPWErTWF0aC5pbXVsKGYsbXQpfDA7dmFyIEF0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShhKyhpPj4+MTMpfDApKyhBdD4+PjI2KXwwLEF0Jj02NzEwODg2MyxuPU1hdGguaW11bChqLHEpLGk9TWF0aC5pbXVsKGosRyksaT1pK01hdGguaW11bChOLHEpfDAsYT1NYXRoLmltdWwoTixHKSxuPW4rTWF0aC5pbXVsKE8sWCl8MCxpPWkrTWF0aC5pbXVsKE8sVyl8MCxpPWkrTWF0aC5pbXVsKFIsWCl8MCxhPWErTWF0aC5pbXVsKFIsVyl8MCxuPW4rTWF0aC5pbXVsKEksSil8MCxpPWkrTWF0aC5pbXVsKEksSyl8MCxpPWkrTWF0aC5pbXVsKEQsSil8MCxhPWErTWF0aC5pbXVsKEQsSyl8MCxuPW4rTWF0aC5pbXVsKEwsJCl8MCxpPWkrTWF0aC5pbXVsKEwsdHQpfDAsaT1pK01hdGguaW11bChDLCQpfDAsYT1hK01hdGguaW11bChDLHR0KXwwLG49bitNYXRoLmltdWwoVCxydCl8MCxpPWkrTWF0aC5pbXVsKFQsbnQpfDAsaT1pK01hdGguaW11bChTLHJ0KXwwLGE9YStNYXRoLmltdWwoUyxudCl8MCxuPW4rTWF0aC5pbXVsKE0sYXQpfDAsaT1pK01hdGguaW11bChNLG90KXwwLGk9aStNYXRoLmltdWwoayxhdCl8MCxhPWErTWF0aC5pbXVsKGssb3QpfDAsbj1uK01hdGguaW11bCh4LGx0KXwwLGk9aStNYXRoLmltdWwoeCx1dCl8MCxpPWkrTWF0aC5pbXVsKF8sbHQpfDAsYT1hK01hdGguaW11bChfLHV0KXwwLG49bitNYXRoLmltdWwoZyxodCl8MCxpPWkrTWF0aC5pbXVsKGcsZnQpfDAsaT1pK01hdGguaW11bCh5LGh0KXwwLGE9YStNYXRoLmltdWwoeSxmdCl8MCxuPW4rTWF0aC5pbXVsKHAscHQpfDAsaT1pK01hdGguaW11bChwLG10KXwwLGk9aStNYXRoLmltdWwobSxwdCl8MCxhPWErTWF0aC5pbXVsKG0sbXQpfDA7dmFyIFR0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShhKyhpPj4+MTMpfDApKyhUdD4+PjI2KXwwLFR0Jj02NzEwODg2MyxuPU1hdGguaW11bChqLFgpLGk9TWF0aC5pbXVsKGosVyksaT1pK01hdGguaW11bChOLFgpfDAsYT1NYXRoLmltdWwoTixXKSxuPW4rTWF0aC5pbXVsKE8sSil8MCxpPWkrTWF0aC5pbXVsKE8sSyl8MCxpPWkrTWF0aC5pbXVsKFIsSil8MCxhPWErTWF0aC5pbXVsKFIsSyl8MCxuPW4rTWF0aC5pbXVsKEksJCl8MCxpPWkrTWF0aC5pbXVsKEksdHQpfDAsaT1pK01hdGguaW11bChELCQpfDAsYT1hK01hdGguaW11bChELHR0KXwwLG49bitNYXRoLmltdWwoTCxydCl8MCxpPWkrTWF0aC5pbXVsKEwsbnQpfDAsaT1pK01hdGguaW11bChDLHJ0KXwwLGE9YStNYXRoLmltdWwoQyxudCl8MCxuPW4rTWF0aC5pbXVsKFQsYXQpfDAsaT1pK01hdGguaW11bChULG90KXwwLGk9aStNYXRoLmltdWwoUyxhdCl8MCxhPWErTWF0aC5pbXVsKFMsb3QpfDAsbj1uK01hdGguaW11bChNLGx0KXwwLGk9aStNYXRoLmltdWwoTSx1dCl8MCxpPWkrTWF0aC5pbXVsKGssbHQpfDAsYT1hK01hdGguaW11bChrLHV0KXwwLG49bitNYXRoLmltdWwoeCxodCl8MCxpPWkrTWF0aC5pbXVsKHgsZnQpfDAsaT1pK01hdGguaW11bChfLGh0KXwwLGE9YStNYXRoLmltdWwoXyxmdCl8MCxuPW4rTWF0aC5pbXVsKGcscHQpfDAsaT1pK01hdGguaW11bChnLG10KXwwLGk9aStNYXRoLmltdWwoeSxwdCl8MCxhPWErTWF0aC5pbXVsKHksbXQpfDA7dmFyIFN0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShhKyhpPj4+MTMpfDApKyhTdD4+PjI2KXwwLFN0Jj02NzEwODg2MyxuPU1hdGguaW11bChqLEopLGk9TWF0aC5pbXVsKGosSyksaT1pK01hdGguaW11bChOLEopfDAsYT1NYXRoLmltdWwoTixLKSxuPW4rTWF0aC5pbXVsKE8sJCl8MCxpPWkrTWF0aC5pbXVsKE8sdHQpfDAsaT1pK01hdGguaW11bChSLCQpfDAsYT1hK01hdGguaW11bChSLHR0KXwwLG49bitNYXRoLmltdWwoSSxydCl8MCxpPWkrTWF0aC5pbXVsKEksbnQpfDAsaT1pK01hdGguaW11bChELHJ0KXwwLGE9YStNYXRoLmltdWwoRCxudCl8MCxuPW4rTWF0aC5pbXVsKEwsYXQpfDAsaT1pK01hdGguaW11bChMLG90KXwwLGk9aStNYXRoLmltdWwoQyxhdCl8MCxhPWErTWF0aC5pbXVsKEMsb3QpfDAsbj1uK01hdGguaW11bChULGx0KXwwLGk9aStNYXRoLmltdWwoVCx1dCl8MCxpPWkrTWF0aC5pbXVsKFMsbHQpfDAsYT1hK01hdGguaW11bChTLHV0KXwwLG49bitNYXRoLmltdWwoTSxodCl8MCxpPWkrTWF0aC5pbXVsKE0sZnQpfDAsaT1pK01hdGguaW11bChrLGh0KXwwLGE9YStNYXRoLmltdWwoayxmdCl8MCxuPW4rTWF0aC5pbXVsKHgscHQpfDAsaT1pK01hdGguaW11bCh4LG10KXwwLGk9aStNYXRoLmltdWwoXyxwdCl8MCxhPWErTWF0aC5pbXVsKF8sbXQpfDA7dmFyIEV0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShhKyhpPj4+MTMpfDApKyhFdD4+PjI2KXwwLEV0Jj02NzEwODg2MyxuPU1hdGguaW11bChqLCQpLGk9TWF0aC5pbXVsKGosdHQpLGk9aStNYXRoLmltdWwoTiwkKXwwLGE9TWF0aC5pbXVsKE4sdHQpLG49bitNYXRoLmltdWwoTyxydCl8MCxpPWkrTWF0aC5pbXVsKE8sbnQpfDAsaT1pK01hdGguaW11bChSLHJ0KXwwLGE9YStNYXRoLmltdWwoUixudCl8MCxuPW4rTWF0aC5pbXVsKEksYXQpfDAsaT1pK01hdGguaW11bChJLG90KXwwLGk9aStNYXRoLmltdWwoRCxhdCl8MCxhPWErTWF0aC5pbXVsKEQsb3QpfDAsbj1uK01hdGguaW11bChMLGx0KXwwLGk9aStNYXRoLmltdWwoTCx1dCl8MCxpPWkrTWF0aC5pbXVsKEMsbHQpfDAsYT1hK01hdGguaW11bChDLHV0KXwwLG49bitNYXRoLmltdWwoVCxodCl8MCxpPWkrTWF0aC5pbXVsKFQsZnQpfDAsaT1pK01hdGguaW11bChTLGh0KXwwLGE9YStNYXRoLmltdWwoUyxmdCl8MCxuPW4rTWF0aC5pbXVsKE0scHQpfDAsaT1pK01hdGguaW11bChNLG10KXwwLGk9aStNYXRoLmltdWwoayxwdCl8MCxhPWErTWF0aC5pbXVsKGssbXQpfDA7dmFyIEx0PSh1K258MCkrKCg4MTkxJmkpPDwxMyl8MDt1PShhKyhpPj4+MTMpfDApKyhMdD4+PjI2KXwwLEx0Jj02NzEwODg2MyxuPU1hdGguaW11bChqLHJ0KSxpPU1hdGguaW11bChqLG50KSxpPWkrTWF0aC5pbXVsKE4scnQpfDAsYT1NYXRoLmltdWwoTixudCksbj1uK01hdGguaW11bChPLGF0KXwwLGk9aStNYXRoLmltdWwoTyxvdCl8MCxpPWkrTWF0aC5pbXVsKFIsYXQpfDAsYT1hK01hdGguaW11bChSLG90KXwwLG49bitNYXRoLmltdWwoSSxsdCl8MCxpPWkrTWF0aC5pbXVsKEksdXQpfDAsaT1pK01hdGguaW11bChELGx0KXwwLGE9YStNYXRoLmltdWwoRCx1dCl8MCxuPW4rTWF0aC5pbXVsKEwsaHQpfDAsaT1pK01hdGguaW11bChMLGZ0KXwwLGk9aStNYXRoLmltdWwoQyxodCl8MCxhPWErTWF0aC5pbXVsKEMsZnQpfDAsbj1uK01hdGguaW11bChULHB0KXwwLGk9aStNYXRoLmltdWwoVCxtdCl8MCxpPWkrTWF0aC5pbXVsKFMscHQpfDAsYT1hK01hdGguaW11bChTLG10KXwwO3ZhciBDdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0oYSsoaT4+PjEzKXwwKSsoQ3Q+Pj4yNil8MCxDdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoaixhdCksaT1NYXRoLmltdWwoaixvdCksaT1pK01hdGguaW11bChOLGF0KXwwLAphPU1hdGguaW11bChOLG90KSxuPW4rTWF0aC5pbXVsKE8sbHQpfDAsaT1pK01hdGguaW11bChPLHV0KXwwLGk9aStNYXRoLmltdWwoUixsdCl8MCxhPWErTWF0aC5pbXVsKFIsdXQpfDAsbj1uK01hdGguaW11bChJLGh0KXwwLGk9aStNYXRoLmltdWwoSSxmdCl8MCxpPWkrTWF0aC5pbXVsKEQsaHQpfDAsYT1hK01hdGguaW11bChELGZ0KXwwLG49bitNYXRoLmltdWwoTCxwdCl8MCxpPWkrTWF0aC5pbXVsKEwsbXQpfDAsaT1pK01hdGguaW11bChDLHB0KXwwLGE9YStNYXRoLmltdWwoQyxtdCl8MDt2YXIgenQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KGErKGk+Pj4xMyl8MCkrKHp0Pj4+MjYpfDAsenQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKGosbHQpLGk9TWF0aC5pbXVsKGosdXQpLGk9aStNYXRoLmltdWwoTixsdCl8MCxhPU1hdGguaW11bChOLHV0KSxuPW4rTWF0aC5pbXVsKE8saHQpfDAsaT1pK01hdGguaW11bChPLGZ0KXwwLGk9aStNYXRoLmltdWwoUixodCl8MCxhPWErTWF0aC5pbXVsKFIsZnQpfDAsbj1uK01hdGguaW11bChJLHB0KXwwLGk9aStNYXRoLmltdWwoSSxtdCl8MCxpPWkrTWF0aC5pbXVsKEQscHQpfDAsYT1hK01hdGguaW11bChELG10KXwwO3ZhciBJdD0odStufDApKygoODE5MSZpKTw8MTMpfDA7dT0oYSsoaT4+PjEzKXwwKSsoSXQ+Pj4yNil8MCxJdCY9NjcxMDg4NjMsbj1NYXRoLmltdWwoaixodCksaT1NYXRoLmltdWwoaixmdCksaT1pK01hdGguaW11bChOLGh0KXwwLGE9TWF0aC5pbXVsKE4sZnQpLG49bitNYXRoLmltdWwoTyxwdCl8MCxpPWkrTWF0aC5pbXVsKE8sbXQpfDAsaT1pK01hdGguaW11bChSLHB0KXwwLGE9YStNYXRoLmltdWwoUixtdCl8MDt2YXIgRHQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3U9KGErKGk+Pj4xMyl8MCkrKER0Pj4+MjYpfDAsRHQmPTY3MTA4ODYzLG49TWF0aC5pbXVsKGoscHQpLGk9TWF0aC5pbXVsKGosbXQpLGk9aStNYXRoLmltdWwoTixwdCl8MCxhPU1hdGguaW11bChOLG10KTt2YXIgUHQ9KHUrbnwwKSsoKDgxOTEmaSk8PDEzKXwwO3JldHVybiB1PShhKyhpPj4+MTMpfDApKyhQdD4+PjI2KXwwLFB0Jj02NzEwODg2MyxsWzBdPXZ0LGxbMV09Z3QsbFsyXT15dCxsWzNdPWJ0LGxbNF09eHQsbFs1XT1fdCxsWzZdPXd0LGxbN109TXQsbFs4XT1rdCxsWzldPUF0LGxbMTBdPVR0LGxbMTFdPVN0LGxbMTJdPUV0LGxbMTNdPUx0LGxbMTRdPUN0LGxbMTVdPXp0LGxbMTZdPUl0LGxbMTddPUR0LGxbMThdPVB0LDAhPT11JiYobFsxOV09dSxyLmxlbmd0aCsrKSxyfTtNYXRoLmltdWx8fChrPXUpLGEucHJvdG90eXBlLm11bFRvPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5sZW5ndGgrdC5sZW5ndGg7cmV0dXJuIDEwPT09dGhpcy5sZW5ndGgmJjEwPT09dC5sZW5ndGg/ayh0aGlzLHQsZSk6cjw2Mz91KHRoaXMsdCxlKTpyPDEwMjQ/Yyh0aGlzLHQsZSk6aCh0aGlzLHQsZSl9LGYucHJvdG90eXBlLm1ha2VSQlQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0KSxyPWEucHJvdG90eXBlLl9jb3VudEJpdHModCktMSxuPTA7bjx0O24rKyllW25dPXRoaXMucmV2QmluKG4scix0KTtyZXR1cm4gZX0sZi5wcm90b3R5cGUucmV2QmluPWZ1bmN0aW9uKHQsZSxyKXtpZigwPT09dHx8dD09PXItMSlyZXR1cm4gdDtmb3IodmFyIG49MCxpPTA7aTxlO2krKylufD0oMSZ0KTw8ZS1pLTEsdD4+PTE7cmV0dXJuIG59LGYucHJvdG90eXBlLnBlcm11dGU9ZnVuY3Rpb24odCxlLHIsbixpLGEpe2Zvcih2YXIgbz0wO288YTtvKyspbltvXT1lW3Rbb11dLGlbb109clt0W29dXX0sZi5wcm90b3R5cGUudHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxyLG4saSxhKXt0aGlzLnBlcm11dGUoYSx0LGUscixuLGkpO2Zvcih2YXIgbz0xO288aTtvPDw9MSlmb3IodmFyIHM9bzw8MSxsPU1hdGguY29zKDIqTWF0aC5QSS9zKSx1PU1hdGguc2luKDIqTWF0aC5QSS9zKSxjPTA7YzxpO2MrPXMpZm9yKHZhciBoPWwsZj11LGQ9MDtkPG87ZCsrKXt2YXIgcD1yW2MrZF0sbT1uW2MrZF0sdj1yW2MrZCtvXSxnPW5bYytkK29dLHk9aCp2LWYqZztnPWgqZytmKnYsdj15LHJbYytkXT1wK3YsbltjK2RdPW0rZyxyW2MrZCtvXT1wLXYsbltjK2Qrb109bS1nLGQhPT1zJiYoeT1sKmgtdSpmLGY9bCpmK3UqaCxoPXkpfX0sZi5wcm90b3R5cGUuZ3Vlc3NMZW4xM2I9ZnVuY3Rpb24odCxlKXt2YXIgcj0xfE1hdGgubWF4KGUsdCksbj0xJnIsaT0wO2ZvcihyPXIvMnwwO3I7cj4+Pj0xKWkrKztyZXR1cm4gMTw8aSsxK259LGYucHJvdG90eXBlLmNvbmp1Z2F0ZT1mdW5jdGlvbih0LGUscil7aWYoIShyPD0xKSlmb3IodmFyIG49MDtuPHIvMjtuKyspe3ZhciBpPXRbbl07dFtuXT10W3Itbi0xXSx0W3Itbi0xXT1pLGk9ZVtuXSxlW25dPS1lW3Itbi0xXSxlW3Itbi0xXT0taX19LGYucHJvdG90eXBlLm5vcm1hbGl6ZTEzYj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj0wLG49MDtuPGUvMjtuKyspe3ZhciBpPTgxOTIqTWF0aC5yb3VuZCh0WzIqbisxXS9lKStNYXRoLnJvdW5kKHRbMipuXS9lKStyO3Rbbl09NjcxMDg4NjMmaSxyPWk8NjcxMDg4NjQ/MDppLzY3MTA4ODY0fDB9cmV0dXJuIHR9LGYucHJvdG90eXBlLmNvbnZlcnQxM2I9ZnVuY3Rpb24odCxlLHIsaSl7Zm9yKHZhciBhPTAsbz0wO288ZTtvKyspYSs9MHx0W29dLHJbMipvXT04MTkxJmEsYT4+Pj0xMyxyWzIqbysxXT04MTkxJmEsYT4+Pj0xMztmb3Iobz0yKmU7bzxpOysrbylyW29dPTA7bigwPT09YSksbigwPT0oLTgxOTImYSkpfSxmLnByb3RvdHlwZS5zdHViPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCkscj0wO3I8dDtyKyspZVtyXT0wO3JldHVybiBlfSxmLnByb3RvdHlwZS5tdWxwPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj0yKnRoaXMuZ3Vlc3NMZW4xM2IodC5sZW5ndGgsZS5sZW5ndGgpLGk9dGhpcy5tYWtlUkJUKG4pLGE9dGhpcy5zdHViKG4pLG89bmV3IEFycmF5KG4pLHM9bmV3IEFycmF5KG4pLGw9bmV3IEFycmF5KG4pLHU9bmV3IEFycmF5KG4pLGM9bmV3IEFycmF5KG4pLGg9bmV3IEFycmF5KG4pLGY9ci53b3JkcztmLmxlbmd0aD1uLHRoaXMuY29udmVydDEzYih0LndvcmRzLHQubGVuZ3RoLG8sbiksdGhpcy5jb252ZXJ0MTNiKGUud29yZHMsZS5sZW5ndGgsdSxuKSx0aGlzLnRyYW5zZm9ybShvLGEscyxsLG4saSksdGhpcy50cmFuc2Zvcm0odSxhLGMsaCxuLGkpO2Zvcih2YXIgZD0wO2Q8bjtkKyspe3ZhciBwPXNbZF0qY1tkXS1sW2RdKmhbZF07bFtkXT1zW2RdKmhbZF0rbFtkXSpjW2RdLHNbZF09cH1yZXR1cm4gdGhpcy5jb25qdWdhdGUocyxsLG4pLHRoaXMudHJhbnNmb3JtKHMsbCxmLGEsbixpKSx0aGlzLmNvbmp1Z2F0ZShmLGEsbiksdGhpcy5ub3JtYWxpemUxM2IoZixuKSxyLm5lZ2F0aXZlPXQubmVnYXRpdmVeZS5uZWdhdGl2ZSxyLmxlbmd0aD10Lmxlbmd0aCtlLmxlbmd0aCxyLnN0cmlwKCl9LGEucHJvdG90eXBlLm11bD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgYShudWxsKTtyZXR1cm4gZS53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrdC5sZW5ndGgpLHRoaXMubXVsVG8odCxlKX0sYS5wcm90b3R5cGUubXVsZj1mdW5jdGlvbih0KXt2YXIgZT1uZXcgYShudWxsKTtyZXR1cm4gZS53b3Jkcz1uZXcgQXJyYXkodGhpcy5sZW5ndGgrdC5sZW5ndGgpLGgodGhpcyx0LGUpfSxhLnByb3RvdHlwZS5pbXVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkubXVsVG8odCx0aGlzKX0sYS5wcm90b3R5cGUuaW11bG49ZnVuY3Rpb24odCl7bigibnVtYmVyIj09dHlwZW9mIHQpLG4odDw2NzEwODg2NCk7Zm9yKHZhciBlPTAscj0wO3I8dGhpcy5sZW5ndGg7cisrKXt2YXIgaT0oMHx0aGlzLndvcmRzW3JdKSp0LGE9KDY3MTA4ODYzJmkpKyg2NzEwODg2MyZlKTtlPj49MjYsZSs9aS82NzEwODg2NHwwLGUrPWE+Pj4yNix0aGlzLndvcmRzW3JdPTY3MTA4ODYzJmF9cmV0dXJuIDAhPT1lJiYodGhpcy53b3Jkc1tyXT1lLHRoaXMubGVuZ3RoKyspLHRoaXN9LGEucHJvdG90eXBlLm11bG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pbXVsbih0KX0sYS5wcm90b3R5cGUuc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsKHRoaXMpfSxhLnByb3RvdHlwZS5pc3FyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW11bCh0aGlzLmNsb25lKCkpfSxhLnByb3RvdHlwZS5wb3c9ZnVuY3Rpb24odCl7dmFyIGU9bCh0KTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIG5ldyBhKDEpO2Zvcih2YXIgcj10aGlzLG49MDtuPGUubGVuZ3RoJiYwPT09ZVtuXTtuKysscj1yLnNxcigpKTtpZigrK248ZS5sZW5ndGgpZm9yKHZhciBpPXIuc3FyKCk7bjxlLmxlbmd0aDtuKyssaT1pLnNxcigpKTAhPT1lW25dJiYocj1yLm11bChpKSk7cmV0dXJuIHJ9LGEucHJvdG90eXBlLml1c2hsbj1mdW5jdGlvbih0KXtuKCJudW1iZXIiPT10eXBlb2YgdCYmdD49MCk7dmFyIGUscj10JTI2LGk9KHQtcikvMjYsYT02NzEwODg2Mz4+PjI2LXI8PDI2LXI7aWYoMCE9PXIpe3ZhciBvPTA7Zm9yKGU9MDtlPHRoaXMubGVuZ3RoO2UrKyl7dmFyIHM9dGhpcy53b3Jkc1tlXSZhLGw9KDB8dGhpcy53b3Jkc1tlXSktczw8cjt0aGlzLndvcmRzW2VdPWx8byxvPXM+Pj4yNi1yfW8mJih0aGlzLndvcmRzW2VdPW8sdGhpcy5sZW5ndGgrKyl9aWYoMCE9PWkpe2ZvcihlPXRoaXMubGVuZ3RoLTE7ZT49MDtlLS0pdGhpcy53b3Jkc1tlK2ldPXRoaXMud29yZHNbZV07Zm9yKGU9MDtlPGk7ZSsrKXRoaXMud29yZHNbZV09MDt0aGlzLmxlbmd0aCs9aX1yZXR1cm4gdGhpcy5zdHJpcCgpfSxhLnByb3RvdHlwZS5pc2hsbj1mdW5jdGlvbih0KXtyZXR1cm4gbigwPT09dGhpcy5uZWdhdGl2ZSksdGhpcy5pdXNobG4odCl9LGEucHJvdG90eXBlLml1c2hybj1mdW5jdGlvbih0LGUscil7bigibnVtYmVyIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBpO2k9ZT8oZS1lJTI2KS8yNjowO3ZhciBhPXQlMjYsbz1NYXRoLm1pbigodC1hKS8yNix0aGlzLmxlbmd0aCkscz02NzEwODg2M142NzEwODg2Mz4+PmE8PGEsbD1yO2lmKGktPW8saT1NYXRoLm1heCgwLGkpLGwpe2Zvcih2YXIgdT0wO3U8bzt1KyspbC53b3Jkc1t1XT10aGlzLndvcmRzW3VdO2wubGVuZ3RoPW99aWYoMD09PW8pO2Vsc2UgaWYodGhpcy5sZW5ndGg+bylmb3IodGhpcy5sZW5ndGgtPW8sdT0wO3U8dGhpcy5sZW5ndGg7dSsrKXRoaXMud29yZHNbdV09dGhpcy53b3Jkc1t1K29dO2Vsc2UgdGhpcy53b3Jkc1swXT0wLHRoaXMubGVuZ3RoPTE7dmFyIGM9MDtmb3IodT10aGlzLmxlbmd0aC0xO3U+PTAmJigwIT09Y3x8dT49aSk7dS0tKXt2YXIgaD0wfHRoaXMud29yZHNbdV07dGhpcy53b3Jkc1t1XT1jPDwyNi1hfGg+Pj5hLGM9aCZzfXJldHVybiBsJiYwIT09YyYmKGwud29yZHNbbC5sZW5ndGgrK109YyksMD09PXRoaXMubGVuZ3RoJiYodGhpcy53b3Jkc1swXT0wLHRoaXMubGVuZ3RoPTEpLHRoaXMuc3RyaXAoKX0sYS5wcm90b3R5cGUuaXNocm49ZnVuY3Rpb24odCxlLHIpe3JldHVybiBuKDA9PT10aGlzLm5lZ2F0aXZlKSx0aGlzLml1c2hybih0LGUscil9LGEucHJvdG90eXBlLnNobG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hsbih0KX0sYS5wcm90b3R5cGUudXNobG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNobG4odCl9LGEucHJvdG90eXBlLnNocm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc2hybih0KX0sYS5wcm90b3R5cGUudXNocm49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pdXNocm4odCl9LGEucHJvdG90eXBlLnRlc3RuPWZ1bmN0aW9uKHQpe24oIm51bWJlciI9PXR5cGVvZiB0JiZ0Pj0wKTt2YXIgZT10JTI2LHI9KHQtZSkvMjYsaT0xPDxlO3JldHVybiEodGhpcy5sZW5ndGg8PXIpJiYhISh0aGlzLndvcmRzW3JdJmkpfSxhLnByb3RvdHlwZS5pbWFza249ZnVuY3Rpb24odCl7bigibnVtYmVyIj09dHlwZW9mIHQmJnQ+PTApO3ZhciBlPXQlMjYscj0odC1lKS8yNjtpZihuKDA9PT10aGlzLm5lZ2F0aXZlLCJpbWFza24gd29ya3Mgb25seSB3aXRoIHBvc2l0aXZlIG51bWJlcnMiKSx0aGlzLmxlbmd0aDw9cilyZXR1cm4gdGhpcztpZigwIT09ZSYmcisrLHRoaXMubGVuZ3RoPU1hdGgubWluKHIsdGhpcy5sZW5ndGgpLDAhPT1lKXt2YXIgaT02NzEwODg2M142NzEwODg2Mz4+PmU8PGU7dGhpcy53b3Jkc1t0aGlzLmxlbmd0aC0xXSY9aX1yZXR1cm4gdGhpcy5zdHJpcCgpfSxhLnByb3RvdHlwZS5tYXNrbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmltYXNrbih0KX0sYS5wcm90b3R5cGUuaWFkZG49ZnVuY3Rpb24odCl7cmV0dXJuIG4oIm51bWJlciI9PXR5cGVvZiB0KSxuKHQ8NjcxMDg4NjQpLHQ8MD90aGlzLmlzdWJuKC10KTowIT09dGhpcy5uZWdhdGl2ZT8xPT09dGhpcy5sZW5ndGgmJigwfHRoaXMud29yZHNbMF0pPHQ/KHRoaXMud29yZHNbMF09dC0oMHx0aGlzLndvcmRzWzBdKSx0aGlzLm5lZ2F0aXZlPTAsdGhpcyk6KHRoaXMubmVnYXRpdmU9MCx0aGlzLmlzdWJuKHQpLHRoaXMubmVnYXRpdmU9MSx0aGlzKTp0aGlzLl9pYWRkbih0KX0sYS5wcm90b3R5cGUuX2lhZGRuPWZ1bmN0aW9uKHQpe3RoaXMud29yZHNbMF0rPXQ7Zm9yKHZhciBlPTA7ZTx0aGlzLmxlbmd0aCYmdGhpcy53b3Jkc1tlXT49NjcxMDg4NjQ7ZSsrKXRoaXMud29yZHNbZV0tPTY3MTA4ODY0LGU9PT10aGlzLmxlbmd0aC0xP3RoaXMud29yZHNbZSsxXT0xOnRoaXMud29yZHNbZSsxXSsrO3JldHVybiB0aGlzLmxlbmd0aD1NYXRoLm1heCh0aGlzLmxlbmd0aCxlKzEpLHRoaXN9LGEucHJvdG90eXBlLmlzdWJuPWZ1bmN0aW9uKHQpe2lmKG4oIm51bWJlciI9PXR5cGVvZiB0KSxuKHQ8NjcxMDg4NjQpLHQ8MClyZXR1cm4gdGhpcy5pYWRkbigtdCk7aWYoMCE9PXRoaXMubmVnYXRpdmUpcmV0dXJuIHRoaXMubmVnYXRpdmU9MCx0aGlzLmlhZGRuKHQpLHRoaXMubmVnYXRpdmU9MSx0aGlzO2lmKHRoaXMud29yZHNbMF0tPXQsMT09PXRoaXMubGVuZ3RoJiZ0aGlzLndvcmRzWzBdPDApdGhpcy53b3Jkc1swXT0tdGhpcy53b3Jkc1swXSx0aGlzLm5lZ2F0aXZlPTE7ZWxzZSBmb3IodmFyIGU9MDtlPHRoaXMubGVuZ3RoJiZ0aGlzLndvcmRzW2VdPDA7ZSsrKXRoaXMud29yZHNbZV0rPTY3MTA4ODY0LHRoaXMud29yZHNbZSsxXS09MTtyZXR1cm4gdGhpcy5zdHJpcCgpfSxhLnByb3RvdHlwZS5hZGRuPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNsb25lKCkuaWFkZG4odCl9LGEucHJvdG90eXBlLnN1Ym49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pc3Vibih0KX0sYS5wcm90b3R5cGUuaWFicz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5lZ2F0aXZlPTAsdGhpc30sYS5wcm90b3R5cGUuYWJzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2xvbmUoKS5pYWJzKCl9LGEucHJvdG90eXBlLl9pc2hsbnN1Ym11bD1mdW5jdGlvbih0LGUscil7dmFyIGksYT10Lmxlbmd0aCtyO3RoaXMuX2V4cGFuZChhKTt2YXIgbyxzPTA7Zm9yKGk9MDtpPHQubGVuZ3RoO2krKyl7bz0oMHx0aGlzLndvcmRzW2krcl0pK3M7dmFyIGw9KDB8dC53b3Jkc1tpXSkqZTtvLT02NzEwODg2MyZsLHM9KG8+PjI2KS0obC82NzEwODg2NHwwKSx0aGlzLndvcmRzW2krcl09NjcxMDg4NjMmb31mb3IoO2k8dGhpcy5sZW5ndGgtcjtpKyspbz0oMHx0aGlzLndvcmRzW2krcl0pK3Mscz1vPj4yNix0aGlzLndvcmRzW2krcl09NjcxMDg4NjMmbztpZigwPT09cylyZXR1cm4gdGhpcy5zdHJpcCgpO2ZvcihuKC0xPT09cykscz0wLGk9MDtpPHRoaXMubGVuZ3RoO2krKylvPS0oMHx0aGlzLndvcmRzW2ldKStzLHM9bz4+MjYsdGhpcy53b3Jkc1tpXT02NzEwODg2MyZvO3JldHVybiB0aGlzLm5lZ2F0aXZlPTEsdGhpcy5zdHJpcCgpfSxhLnByb3RvdHlwZS5fd29yZERpdj1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMubGVuZ3RoLXQubGVuZ3RoLG49dGhpcy5jbG9uZSgpLGk9dCxvPTB8aS53b3Jkc1tpLmxlbmd0aC0xXTswIT09KHI9MjYtdGhpcy5fY291bnRCaXRzKG8pKSYmKGk9aS51c2hsbihyKSxuLml1c2hsbihyKSxvPTB8aS53b3Jkc1tpLmxlbmd0aC0xXSk7dmFyIHMsbD1uLmxlbmd0aC1pLmxlbmd0aDtpZigibW9kIiE9PWUpe3M9bmV3IGEobnVsbCkscy5sZW5ndGg9bCsxLHMud29yZHM9bmV3IEFycmF5KHMubGVuZ3RoKTtmb3IodmFyIHU9MDt1PHMubGVuZ3RoO3UrKylzLndvcmRzW3VdPTB9dmFyIGM9bi5jbG9uZSgpLl9pc2hsbnN1Ym11bChpLDEsbCk7MD09PWMubmVnYXRpdmUmJihuPWMscyYmKHMud29yZHNbbF09MSkpO2Zvcih2YXIgaD1sLTE7aD49MDtoLS0pe3ZhciBmPTY3MTA4ODY0KigwfG4ud29yZHNbaS5sZW5ndGgraF0pKygwfG4ud29yZHNbaS5sZW5ndGgraC0xXSk7Zm9yKGY9TWF0aC5taW4oZi9vfDAsNjcxMDg4NjMpLG4uX2lzaGxuc3VibXVsKGksZixoKTswIT09bi5uZWdhdGl2ZTspZi0tLG4ubmVnYXRpdmU9MCxuLl9pc2hsbnN1Ym11bChpLDEsaCksbi5pc1plcm8oKXx8KG4ubmVnYXRpdmVePTEpO3MmJihzLndvcmRzW2hdPWYpfXJldHVybiBzJiZzLnN0cmlwKCksbi5zdHJpcCgpLCJkaXYiIT09ZSYmMCE9PXImJm4uaXVzaHJuKHIpLHtkaXY6c3x8bnVsbCxtb2Q6bn19LGEucHJvdG90eXBlLmRpdm1vZD1mdW5jdGlvbih0LGUscil7aWYobighdC5pc1plcm8oKSksdGhpcy5pc1plcm8oKSlyZXR1cm57ZGl2Om5ldyBhKDApLG1vZDpuZXcgYSgwKX07dmFyIGksbyxzO3JldHVybiAwIT09dGhpcy5uZWdhdGl2ZSYmMD09PXQubmVnYXRpdmU/KHM9dGhpcy5uZWcoKS5kaXZtb2QodCxlKSwibW9kIiE9PWUmJihpPXMuZGl2Lm5lZygpKSwiZGl2IiE9PWUmJihvPXMubW9kLm5lZygpLHImJjAhPT1vLm5lZ2F0aXZlJiZvLmlhZGQodCkpLHtkaXY6aSxtb2Q6b30pOjA9PT10aGlzLm5lZ2F0aXZlJiYwIT09dC5uZWdhdGl2ZT8ocz10aGlzLmRpdm1vZCh0Lm5lZygpLGUpLCJtb2QiIT09ZSYmKGk9cy5kaXYubmVnKCkpLHtkaXY6aSxtb2Q6cy5tb2R9KTowIT0odGhpcy5uZWdhdGl2ZSZ0Lm5lZ2F0aXZlKT8ocz10aGlzLm5lZygpLmRpdm1vZCh0Lm5lZygpLGUpLCJkaXYiIT09ZSYmKG89cy5tb2QubmVnKCksciYmMCE9PW8ubmVnYXRpdmUmJm8uaXN1Yih0KSkse2RpdjpzLmRpdixtb2Q6b30pOnQubGVuZ3RoPnRoaXMubGVuZ3RofHx0aGlzLmNtcCh0KTwwP3tkaXY6bmV3IGEoMCksbW9kOnRoaXN9OjE9PT10Lmxlbmd0aD8iZGl2Ij09PWU/e2Rpdjp0aGlzLmRpdm4odC53b3Jkc1swXSksbW9kOm51bGx9OiJtb2QiPT09ZT97ZGl2Om51bGwsbW9kOm5ldyBhKHRoaXMubW9kbih0LndvcmRzWzBdKSl9OntkaXY6dGhpcy5kaXZuKHQud29yZHNbMF0pLG1vZDpuZXcgYSh0aGlzLm1vZG4odC53b3Jkc1swXSkpfTp0aGlzLl93b3JkRGl2KHQsZSl9LGEucHJvdG90eXBlLmRpdj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kaXZtb2QodCwiZGl2IiwhMSkuZGl2fSxhLnByb3RvdHlwZS5tb2Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGl2bW9kKHQsIm1vZCIsITEpLm1vZH0sYS5wcm90b3R5cGUudW1vZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kaXZtb2QodCwibW9kIiwhMCkubW9kfSxhLnByb3RvdHlwZS5kaXZSb3VuZD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmRpdm1vZCh0KTtpZihlLm1vZC5pc1plcm8oKSlyZXR1cm4gZS5kaXY7dmFyIHI9MCE9PWUuZGl2Lm5lZ2F0aXZlP2UubW9kLmlzdWIodCk6ZS5tb2Qsbj10LnVzaHJuKDEpLGk9dC5hbmRsbigxKSxhPXIuY21wKG4pO3JldHVybiBhPDB8fDE9PT1pJiYwPT09YT9lLmRpdjowIT09ZS5kaXYubmVnYXRpdmU/ZS5kaXYuaXN1Ym4oMSk6ZS5kaXYuaWFkZG4oMSl9LGEucHJvdG90eXBlLm1vZG49ZnVuY3Rpb24odCl7bih0PD02NzEwODg2Myk7Zm9yKHZhciBlPSgxPDwyNikldCxyPTAsaT10aGlzLmxlbmd0aC0xO2k+PTA7aS0tKXI9KGUqcisoMHx0aGlzLndvcmRzW2ldKSkldDtyZXR1cm4gcn0sYS5wcm90b3R5cGUuaWRpdm49ZnVuY3Rpb24odCl7bih0PD02NzEwODg2Myk7Zm9yKHZhciBlPTAscj10aGlzLmxlbmd0aC0xO3I+PTA7ci0tKXt2YXIgaT0oMHx0aGlzLndvcmRzW3JdKSs2NzEwODg2NCplO3RoaXMud29yZHNbcl09aS90fDAsZT1pJXR9cmV0dXJuIHRoaXMuc3RyaXAoKX0sYS5wcm90b3R5cGUuZGl2bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbG9uZSgpLmlkaXZuKHQpfSxhLnByb3RvdHlwZS5lZ2NkPWZ1bmN0aW9uKHQpe24oMD09PXQubmVnYXRpdmUpLG4oIXQuaXNaZXJvKCkpO3ZhciBlPXRoaXMscj10LmNsb25lKCk7ZT0wIT09ZS5uZWdhdGl2ZT9lLnVtb2QodCk6ZS5jbG9uZSgpO2Zvcih2YXIgaT1uZXcgYSgxKSxvPW5ldyBhKDApLHM9bmV3IGEoMCksbD1uZXcgYSgxKSx1PTA7ZS5pc0V2ZW4oKSYmci5pc0V2ZW4oKTspZS5pdXNocm4oMSksci5pdXNocm4oMSksKyt1O2Zvcih2YXIgYz1yLmNsb25lKCksaD1lLmNsb25lKCk7IWUuaXNaZXJvKCk7KXtmb3IodmFyIGY9MCxkPTE7MD09KGUud29yZHNbMF0mZCkmJmY8MjY7KytmLGQ8PD0xKTtpZihmPjApZm9yKGUuaXVzaHJuKGYpO2YtLSA+MDspKGkuaXNPZGQoKXx8by5pc09kZCgpKSYmKGkuaWFkZChjKSxvLmlzdWIoaCkpLGkuaXVzaHJuKDEpLG8uaXVzaHJuKDEpO2Zvcih2YXIgcD0wLG09MTswPT0oci53b3Jkc1swXSZtKSYmcDwyNjsrK3AsbTw8PTEpO2lmKHA+MClmb3Ioci5pdXNocm4ocCk7cC0tID4wOykocy5pc09kZCgpfHxsLmlzT2RkKCkpJiYocy5pYWRkKGMpLGwuaXN1YihoKSkscy5pdXNocm4oMSksbC5pdXNocm4oMSk7ZS5jbXAocik+PTA/KGUuaXN1YihyKSxpLmlzdWIocyksby5pc3ViKGwpKTooci5pc3ViKGUpLHMuaXN1YihpKSxsLmlzdWIobykpfXJldHVybnthOnMsYjpsLGdjZDpyLml1c2hsbih1KX19LGEucHJvdG90eXBlLl9pbnZtcD1mdW5jdGlvbih0KXtuKDA9PT10Lm5lZ2F0aXZlKSxuKCF0LmlzWmVybygpKTt2YXIgZT10aGlzLHI9dC5jbG9uZSgpO2U9MCE9PWUubmVnYXRpdmU/ZS51bW9kKHQpOmUuY2xvbmUoKTtmb3IodmFyIGk9bmV3IGEoMSksbz1uZXcgYSgwKSxzPXIuY2xvbmUoKTtlLmNtcG4oMSk+MCYmci5jbXBuKDEpPjA7KXtmb3IodmFyIGw9MCx1PTE7MD09KGUud29yZHNbMF0mdSkmJmw8MjY7KytsLHU8PD0xKTtpZihsPjApZm9yKGUuaXVzaHJuKGwpO2wtLSA+MDspaS5pc09kZCgpJiZpLmlhZGQocyksaS5pdXNocm4oMSk7Zm9yKHZhciBjPTAsaD0xOzA9PShyLndvcmRzWzBdJmgpJiZjPDI2OysrYyxoPDw9MSk7aWYoYz4wKWZvcihyLml1c2hybihjKTtjLS0gPjA7KW8uaXNPZGQoKSYmby5pYWRkKHMpLG8uaXVzaHJuKDEpO2UuY21wKHIpPj0wPyhlLmlzdWIociksaS5pc3ViKG8pKTooci5pc3ViKGUpLG8uaXN1YihpKSl9dmFyIGY7cmV0dXJuIGY9MD09PWUuY21wbigxKT9pOm8sZi5jbXBuKDApPDAmJmYuaWFkZCh0KSxmfSxhLnByb3RvdHlwZS5nY2Q9ZnVuY3Rpb24odCl7aWYodGhpcy5pc1plcm8oKSlyZXR1cm4gdC5hYnMoKTtpZih0LmlzWmVybygpKXJldHVybiB0aGlzLmFicygpO3ZhciBlPXRoaXMuY2xvbmUoKSxyPXQuY2xvbmUoKTtlLm5lZ2F0aXZlPTAsci5uZWdhdGl2ZT0wO2Zvcih2YXIgbj0wO2UuaXNFdmVuKCkmJnIuaXNFdmVuKCk7bisrKWUuaXVzaHJuKDEpLHIuaXVzaHJuKDEpO2Zvcig7Oyl7Zm9yKDtlLmlzRXZlbigpOyllLml1c2hybigxKTtmb3IoO3IuaXNFdmVuKCk7KXIuaXVzaHJuKDEpO3ZhciBpPWUuY21wKHIpO2lmKGk8MCl7dmFyIGE9ZTtlPXIscj1hfWVsc2UgaWYoMD09PWl8fDA9PT1yLmNtcG4oMSkpYnJlYWs7ZS5pc3ViKHIpfXJldHVybiByLml1c2hsbihuKX0sYS5wcm90b3R5cGUuaW52bT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lZ2NkKHQpLmEudW1vZCh0KX0sYS5wcm90b3R5cGUuaXNFdmVuPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PSgxJnRoaXMud29yZHNbMF0pfSxhLnByb3RvdHlwZS5pc09kZD1mdW5jdGlvbigpe3JldHVybiAxPT0oMSZ0aGlzLndvcmRzWzBdKX0sYS5wcm90b3R5cGUuYW5kbG49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMud29yZHNbMF0mdH0sYS5wcm90b3R5cGUuYmluY249ZnVuY3Rpb24odCl7bigibnVtYmVyIj09dHlwZW9mIHQpO3ZhciBlPXQlMjYscj0odC1lKS8yNixpPTE8PGU7aWYodGhpcy5sZW5ndGg8PXIpcmV0dXJuIHRoaXMuX2V4cGFuZChyKzEpLHRoaXMud29yZHNbcl18PWksdGhpcztmb3IodmFyIGE9aSxvPXI7MCE9PWEmJm88dGhpcy5sZW5ndGg7bysrKXt2YXIgcz0wfHRoaXMud29yZHNbb107cys9YSxhPXM+Pj4yNixzJj02NzEwODg2Myx0aGlzLndvcmRzW29dPXN9cmV0dXJuIDAhPT1hJiYodGhpcy53b3Jkc1tvXT1hLHRoaXMubGVuZ3RoKyspLHRoaXN9LGEucHJvdG90eXBlLmlzWmVybz1mdW5jdGlvbigpe3JldHVybiAxPT09dGhpcy5sZW5ndGgmJjA9PT10aGlzLndvcmRzWzBdfSxhLnByb3RvdHlwZS5jbXBuPWZ1bmN0aW9uKHQpe3ZhciBlPXQ8MDtpZigwIT09dGhpcy5uZWdhdGl2ZSYmIWUpcmV0dXJuLTE7aWYoMD09PXRoaXMubmVnYXRpdmUmJmUpcmV0dXJuIDE7dGhpcy5zdHJpcCgpO3ZhciByO2lmKHRoaXMubGVuZ3RoPjEpcj0xO2Vsc2V7ZSYmKHQ9LXQpLG4odDw9NjcxMDg4NjMsIk51bWJlciBpcyB0b28gYmlnIik7dmFyIGk9MHx0aGlzLndvcmRzWzBdO3I9aT09PXQ/MDppPHQ/LTE6MX1yZXR1cm4gMCE9PXRoaXMubmVnYXRpdmU/MHwtcjpyfSxhLnByb3RvdHlwZS5jbXA9ZnVuY3Rpb24odCl7aWYoMCE9PXRoaXMubmVnYXRpdmUmJjA9PT10Lm5lZ2F0aXZlKXJldHVybi0xO2lmKDA9PT10aGlzLm5lZ2F0aXZlJiYwIT09dC5uZWdhdGl2ZSlyZXR1cm4gMTt2YXIgZT10aGlzLnVjbXAodCk7cmV0dXJuIDAhPT10aGlzLm5lZ2F0aXZlPzB8LWU6ZX0sYS5wcm90b3R5cGUudWNtcD1mdW5jdGlvbih0KXtpZih0aGlzLmxlbmd0aD50Lmxlbmd0aClyZXR1cm4gMTtpZih0aGlzLmxlbmd0aDx0Lmxlbmd0aClyZXR1cm4tMTtmb3IodmFyIGU9MCxyPXRoaXMubGVuZ3RoLTE7cj49MDtyLS0pe3ZhciBuPTB8dGhpcy53b3Jkc1tyXSxpPTB8dC53b3Jkc1tyXTtpZihuIT09aSl7bjxpP2U9LTE6bj5pJiYoZT0xKTticmVha319cmV0dXJuIGV9LGEucHJvdG90eXBlLmd0bj1mdW5jdGlvbih0KXtyZXR1cm4gMT09PXRoaXMuY21wbih0KX0sYS5wcm90b3R5cGUuZ3Q9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10aGlzLmNtcCh0KX0sYS5wcm90b3R5cGUuZ3Rlbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5jbXBuKHQpPj0wfSxhLnByb3RvdHlwZS5ndGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wKHQpPj0wfSxhLnByb3RvdHlwZS5sdG49ZnVuY3Rpb24odCl7cmV0dXJuLTE9PT10aGlzLmNtcG4odCl9LGEucHJvdG90eXBlLmx0PWZ1bmN0aW9uKHQpe3JldHVybi0xPT09dGhpcy5jbXAodCl9LGEucHJvdG90eXBlLmx0ZW49ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuY21wbih0KTw9MH0sYS5wcm90b3R5cGUubHRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNtcCh0KTw9MH0sYS5wcm90b3R5cGUuZXFuPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09dGhpcy5jbXBuKHQpfSxhLnByb3RvdHlwZS5lcT1mdW5jdGlvbih0KXtyZXR1cm4gMD09PXRoaXMuY21wKHQpfSxhLnJlZD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHkodCl9LGEucHJvdG90eXBlLnRvUmVkPWZ1bmN0aW9uKHQpe3JldHVybiBuKCF0aGlzLnJlZCwiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCIpLG4oMD09PXRoaXMubmVnYXRpdmUsInJlZCB3b3JrcyBvbmx5IHdpdGggcG9zaXRpdmVzIiksdC5jb252ZXJ0VG8odGhpcykuX2ZvcmNlUmVkKHQpfSxhLnByb3RvdHlwZS5mcm9tUmVkPWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy5yZWQsImZyb21SZWQgd29ya3Mgb25seSB3aXRoIG51bWJlcnMgaW4gcmVkdWN0aW9uIGNvbnRleHQiKSx0aGlzLnJlZC5jb252ZXJ0RnJvbSh0aGlzKX0sYS5wcm90b3R5cGUuX2ZvcmNlUmVkPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJlZD10LHRoaXN9LGEucHJvdG90eXBlLmZvcmNlUmVkPWZ1bmN0aW9uKHQpe3JldHVybiBuKCF0aGlzLnJlZCwiQWxyZWFkeSBhIG51bWJlciBpbiByZWR1Y3Rpb24gY29udGV4dCIpLHRoaXMuX2ZvcmNlUmVkKHQpfSxhLnByb3RvdHlwZS5yZWRBZGQ9ZnVuY3Rpb24odCl7cmV0dXJuIG4odGhpcy5yZWQsInJlZEFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5hZGQodGhpcyx0KX0sYS5wcm90b3R5cGUucmVkSUFkZD1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCwicmVkSUFkZCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5pYWRkKHRoaXMsdCl9LGEucHJvdG90eXBlLnJlZFN1Yj1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCwicmVkU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLnN1Yih0aGlzLHQpfSxhLnByb3RvdHlwZS5yZWRJU3ViPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLCJyZWRJU3ViIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLmlzdWIodGhpcyx0KX0sYS5wcm90b3R5cGUucmVkU2hsPWZ1bmN0aW9uKHQpe3JldHVybiBuKHRoaXMucmVkLCJyZWRTaGwgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuc2hsKHRoaXMsdCl9LGEucHJvdG90eXBlLnJlZE11bD1mdW5jdGlvbih0KXtyZXR1cm4gbih0aGlzLnJlZCwicmVkTXVsIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkyKHRoaXMsdCksdGhpcy5yZWQubXVsKHRoaXMsdCl9LGEucHJvdG90eXBlLnJlZElNdWw9ZnVuY3Rpb24odCl7cmV0dXJuIG4odGhpcy5yZWQsInJlZE11bCB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5Mih0aGlzLHQpLHRoaXMucmVkLmltdWwodGhpcyx0KX0sYS5wcm90b3R5cGUucmVkU3FyPWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy5yZWQsInJlZFNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5zcXIodGhpcyl9LGEucHJvdG90eXBlLnJlZElTcXI9ZnVuY3Rpb24oKXtyZXR1cm4gbih0aGlzLnJlZCwicmVkSVNxciB3b3JrcyBvbmx5IHdpdGggcmVkIG51bWJlcnMiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5pc3FyKHRoaXMpfSxhLnByb3RvdHlwZS5yZWRTcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIG4odGhpcy5yZWQsInJlZFNxcnQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQuc3FydCh0aGlzKX0sYS5wcm90b3R5cGUucmVkSW52bT1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucmVkLCJyZWRJbnZtIHdvcmtzIG9ubHkgd2l0aCByZWQgbnVtYmVycyIpLHRoaXMucmVkLl92ZXJpZnkxKHRoaXMpLHRoaXMucmVkLmludm0odGhpcyl9LGEucHJvdG90eXBlLnJlZE5lZz1mdW5jdGlvbigpe3JldHVybiBuKHRoaXMucmVkLCJyZWROZWcgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIiksdGhpcy5yZWQuX3ZlcmlmeTEodGhpcyksdGhpcy5yZWQubmVnKHRoaXMpfSxhLnByb3RvdHlwZS5yZWRQb3c9ZnVuY3Rpb24odCl7cmV0dXJuIG4odGhpcy5yZWQmJiF0LnJlZCwicmVkUG93KG5vcm1hbE51bSkiKSx0aGlzLnJlZC5fdmVyaWZ5MSh0aGlzKSx0aGlzLnJlZC5wb3codGhpcyx0KX07dmFyIEE9e2syNTY6bnVsbCxwMjI0Om51bGwscDE5MjpudWxsLHAyNTUxOTpudWxsfTtkLnByb3RvdHlwZS5fdG1wPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGEobnVsbCk7cmV0dXJuIHQud29yZHM9bmV3IEFycmF5KE1hdGguY2VpbCh0aGlzLm4vMTMpKSx0fSxkLnByb3RvdHlwZS5pcmVkdWNlPWZ1bmN0aW9uKHQpe3ZhciBlLHI9dDtkb3t0aGlzLnNwbGl0KHIsdGhpcy50bXApLHI9dGhpcy5pbXVsSyhyKSxyPXIuaWFkZCh0aGlzLnRtcCksZT1yLmJpdExlbmd0aCgpfXdoaWxlKGU+dGhpcy5uKTt2YXIgbj1lPHRoaXMubj8tMTpyLnVjbXAodGhpcy5wKTtyZXR1cm4gMD09PW4/KHIud29yZHNbMF09MCxyLmxlbmd0aD0xKTpuPjA/ci5pc3ViKHRoaXMucCk6ci5zdHJpcCgpLHJ9LGQucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKHQsZSl7dC5pdXNocm4odGhpcy5uLDAsZSl9LGQucHJvdG90eXBlLmltdWxLPWZ1bmN0aW9uKHQpe3JldHVybiB0LmltdWwodGhpcy5rKX0saShwLGQpLHAucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPU1hdGgubWluKHQubGVuZ3RoLDkpLG49MDtuPHI7bisrKWUud29yZHNbbl09dC53b3Jkc1tuXTtpZihlLmxlbmd0aD1yLHQubGVuZ3RoPD05KXJldHVybiB0LndvcmRzWzBdPTAsdm9pZCh0Lmxlbmd0aD0xKTt2YXIgaT10LndvcmRzWzldO2ZvcihlLndvcmRzW2UubGVuZ3RoKytdPTQxOTQzMDMmaSxuPTEwO248dC5sZW5ndGg7bisrKXt2YXIgYT0wfHQud29yZHNbbl07dC53b3Jkc1tuLTEwXT0oNDE5NDMwMyZhKTw8NHxpPj4+MjIsaT1hfWk+Pj49MjIsdC53b3Jkc1tuLTEwXT1pLDA9PT1pJiZ0Lmxlbmd0aD4xMD90Lmxlbmd0aC09MTA6dC5sZW5ndGgtPTl9LHAucHJvdG90eXBlLmltdWxLPWZ1bmN0aW9uKHQpe3Qud29yZHNbdC5sZW5ndGhdPTAsdC53b3Jkc1t0Lmxlbmd0aCsxXT0wLHQubGVuZ3RoKz0yO2Zvcih2YXIgZT0wLHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49MHx0LndvcmRzW3JdO2UrPTk3NypuLHQud29yZHNbcl09NjcxMDg4NjMmZSxlPTY0Km4rKGUvNjcxMDg4NjR8MCl9cmV0dXJuIDA9PT10LndvcmRzW3QubGVuZ3RoLTFdJiYodC5sZW5ndGgtLSwwPT09dC53b3Jkc1t0Lmxlbmd0aC0xXSYmdC5sZW5ndGgtLSksdH0saShtLGQpLGkodixkKSxpKGcsZCksZy5wcm90b3R5cGUuaW11bEs9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAscj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgbj0xOSooMHx0LndvcmRzW3JdKStlLGk9NjcxMDg4NjMmbjtuPj4+PTI2LHQud29yZHNbcl09aSxlPW59cmV0dXJuIDAhPT1lJiYodC53b3Jkc1t0Lmxlbmd0aCsrXT1lKSx0fSxhLl9wcmltZT1mdW5jdGlvbih0KXtpZihBW3RdKXJldHVybiBBW3RdO3ZhciBlO2lmKCJrMjU2Ij09PXQpZT1uZXcgcDtlbHNlIGlmKCJwMjI0Ij09PXQpZT1uZXcgbTtlbHNlIGlmKCJwMTkyIj09PXQpZT1uZXcgdjtlbHNle2lmKCJwMjU1MTkiIT09dCl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gcHJpbWUgIit0KTtlPW5ldyBnfXJldHVybiBBW3RdPWUsZX0seS5wcm90b3R5cGUuX3ZlcmlmeTE9ZnVuY3Rpb24odCl7bigwPT09dC5uZWdhdGl2ZSwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSxuKHQucmVkLCJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIil9LHkucHJvdG90eXBlLl92ZXJpZnkyPWZ1bmN0aW9uKHQsZSl7bigwPT0odC5uZWdhdGl2ZXxlLm5lZ2F0aXZlKSwicmVkIHdvcmtzIG9ubHkgd2l0aCBwb3NpdGl2ZXMiKSxuKHQucmVkJiZ0LnJlZD09PWUucmVkLCJyZWQgd29ya3Mgb25seSB3aXRoIHJlZCBudW1iZXJzIil9LHkucHJvdG90eXBlLmltb2Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHJpbWU/dGhpcy5wcmltZS5pcmVkdWNlKHQpLl9mb3JjZVJlZCh0aGlzKTp0LnVtb2QodGhpcy5tKS5fZm9yY2VSZWQodGhpcyl9LHkucHJvdG90eXBlLm5lZz1mdW5jdGlvbih0KXtyZXR1cm4gdC5pc1plcm8oKT90LmNsb25lKCk6dGhpcy5tLnN1Yih0KS5fZm9yY2VSZWQodGhpcyl9LHkucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0LGUpe3RoaXMuX3ZlcmlmeTIodCxlKTt2YXIgcj10LmFkZChlKTtyZXR1cm4gci5jbXAodGhpcy5tKT49MCYmci5pc3ViKHRoaXMubSksci5fZm9yY2VSZWQodGhpcyl9LHkucHJvdG90eXBlLmlhZGQ9ZnVuY3Rpb24odCxlKXt0aGlzLl92ZXJpZnkyKHQsZSk7dmFyIHI9dC5pYWRkKGUpO3JldHVybiByLmNtcCh0aGlzLm0pPj0wJiZyLmlzdWIodGhpcy5tKSxyfSx5LnByb3RvdHlwZS5zdWI9ZnVuY3Rpb24odCxlKXt0aGlzLl92ZXJpZnkyKHQsZSk7dmFyIHI9dC5zdWIoZSk7cmV0dXJuIHIuY21wbigwKTwwJiZyLmlhZGQodGhpcy5tKSxyLl9mb3JjZVJlZCh0aGlzKX0seS5wcm90b3R5cGUuaXN1Yj1mdW5jdGlvbih0LGUpe3RoaXMuX3ZlcmlmeTIodCxlKTt2YXIgcj10LmlzdWIoZSk7cmV0dXJuIHIuY21wbigwKTwwJiZyLmlhZGQodGhpcy5tKSxyfSx5LnByb3RvdHlwZS5zaGw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdmVyaWZ5MSh0KSx0aGlzLmltb2QodC51c2hsbihlKSl9LHkucHJvdG90eXBlLmltdWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdmVyaWZ5Mih0LGUpLHRoaXMuaW1vZCh0LmltdWwoZSkpfSx5LnByb3RvdHlwZS5tdWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fdmVyaWZ5Mih0LGUpLHRoaXMuaW1vZCh0Lm11bChlKSl9LHkucHJvdG90eXBlLmlzcXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW11bCh0LHQuY2xvbmUoKSl9LHkucHJvdG90eXBlLnNxcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tdWwodCx0KX0seS5wcm90b3R5cGUuc3FydD1mdW5jdGlvbih0KXtpZih0LmlzWmVybygpKXJldHVybiB0LmNsb25lKCk7dmFyIGU9dGhpcy5tLmFuZGxuKDMpO2lmKG4oZSUyPT0xKSwzPT09ZSl7dmFyIHI9dGhpcy5tLmFkZChuZXcgYSgxKSkuaXVzaHJuKDIpO3JldHVybiB0aGlzLnBvdyh0LHIpfWZvcih2YXIgaT10aGlzLm0uc3VibigxKSxvPTA7IWkuaXNaZXJvKCkmJjA9PT1pLmFuZGxuKDEpOylvKyssaS5pdXNocm4oMSk7bighaS5pc1plcm8oKSk7dmFyIHM9bmV3IGEoMSkudG9SZWQodGhpcyksbD1zLnJlZE5lZygpLHU9dGhpcy5tLnN1Ym4oMSkuaXVzaHJuKDEpLGM9dGhpcy5tLmJpdExlbmd0aCgpO2ZvcihjPW5ldyBhKDIqYypjKS50b1JlZCh0aGlzKTswIT09dGhpcy5wb3coYyx1KS5jbXAobCk7KWMucmVkSUFkZChsKTtmb3IodmFyIGg9dGhpcy5wb3coYyxpKSxmPXRoaXMucG93KHQsaS5hZGRuKDEpLml1c2hybigxKSksZD10aGlzLnBvdyh0LGkpLHA9bzswIT09ZC5jbXAocyk7KXtmb3IodmFyIG09ZCx2PTA7MCE9PW0uY21wKHMpO3YrKyltPW0ucmVkU3FyKCk7bih2PHApO3ZhciBnPXRoaXMucG93KGgsbmV3IGEoMSkuaXVzaGxuKHAtdi0xKSk7Zj1mLnJlZE11bChnKSxoPWcucmVkU3FyKCksZD1kLnJlZE11bChoKSxwPXZ9cmV0dXJuIGZ9LHkucHJvdG90eXBlLmludm09ZnVuY3Rpb24odCl7dmFyIGU9dC5faW52bXAodGhpcy5tKTtyZXR1cm4gMCE9PWUubmVnYXRpdmU/KGUubmVnYXRpdmU9MCx0aGlzLmltb2QoZSkucmVkTmVnKCkpOnRoaXMuaW1vZChlKX0seS5wcm90b3R5cGUucG93PWZ1bmN0aW9uKHQsZSl7aWYoZS5pc1plcm8oKSlyZXR1cm4gbmV3IGEoMSk7aWYoMD09PWUuY21wbigxKSlyZXR1cm4gdC5jbG9uZSgpO3ZhciByPW5ldyBBcnJheSgxNik7clswXT1uZXcgYSgxKS50b1JlZCh0aGlzKSxyWzFdPXQ7Zm9yKHZhciBuPTI7bjxyLmxlbmd0aDtuKyspcltuXT10aGlzLm11bChyW24tMV0sdCk7dmFyIGk9clswXSxvPTAscz0wLGw9ZS5iaXRMZW5ndGgoKSUyNjtmb3IoMD09PWwmJihsPTI2KSxuPWUubGVuZ3RoLTE7bj49MDtuLS0pe2Zvcih2YXIgdT1lLndvcmRzW25dLGM9bC0xO2M+PTA7Yy0tKXt2YXIgaD11Pj5jJjE7aSE9PXJbMF0mJihpPXRoaXMuc3FyKGkpKSwwIT09aHx8MCE9PW8/KG88PD0xLG98PWgsKDQ9PT0rK3N8fDA9PT1uJiYwPT09YykmJihpPXRoaXMubXVsKGkscltvXSkscz0wLG89MCkpOnM9MH1sPTI2fXJldHVybiBpfSx5LnByb3RvdHlwZS5jb252ZXJ0VG89ZnVuY3Rpb24odCl7dmFyIGU9dC51bW9kKHRoaXMubSk7cmV0dXJuIGU9PT10P2UuY2xvbmUoKTplfSx5LnByb3RvdHlwZS5jb252ZXJ0RnJvbT1mdW5jdGlvbih0KXt2YXIgZT10LmNsb25lKCk7cmV0dXJuIGUucmVkPW51bGwsZX0sYS5tb250PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgYih0KX0saShiLHkpLGIucHJvdG90eXBlLmNvbnZlcnRUbz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbW9kKHQudXNobG4odGhpcy5zaGlmdCkpfSxiLnByb3RvdHlwZS5jb252ZXJ0RnJvbT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmltb2QodC5tdWwodGhpcy5yaW52KSk7cmV0dXJuIGUucmVkPW51bGwsZX0sYi5wcm90b3R5cGUuaW11bD1mdW5jdGlvbih0LGUpe2lmKHQuaXNaZXJvKCl8fGUuaXNaZXJvKCkpcmV0dXJuIHQud29yZHNbMF09MCx0Lmxlbmd0aD0xLHQ7dmFyIHI9dC5pbXVsKGUpLG49ci5tYXNrbih0aGlzLnNoaWZ0KS5tdWwodGhpcy5taW52KS5pbWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubSksaT1yLmlzdWIobikuaXVzaHJuKHRoaXMuc2hpZnQpLGE9aTtyZXR1cm4gaS5jbXAodGhpcy5tKT49MD9hPWkuaXN1Yih0aGlzLm0pOmkuY21wbigwKTwwJiYoYT1pLmlhZGQodGhpcy5tKSksYS5fZm9yY2VSZWQodGhpcyl9LGIucHJvdG90eXBlLm11bD1mdW5jdGlvbih0LGUpe2lmKHQuaXNaZXJvKCl8fGUuaXNaZXJvKCkpcmV0dXJuIG5ldyBhKDApLl9mb3JjZVJlZCh0aGlzKTt2YXIgcj10Lm11bChlKSxuPXIubWFza24odGhpcy5zaGlmdCkubXVsKHRoaXMubWludikuaW1hc2tuKHRoaXMuc2hpZnQpLm11bCh0aGlzLm0pLGk9ci5pc3ViKG4pLml1c2hybih0aGlzLnNoaWZ0KSxvPWk7cmV0dXJuIGkuY21wKHRoaXMubSk+PTA/bz1pLmlzdWIodGhpcy5tKTppLmNtcG4oMCk8MCYmKG89aS5pYWRkKHRoaXMubSkpLG8uX2ZvcmNlUmVkKHRoaXMpfSxiLnByb3RvdHlwZS5pbnZtPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmltb2QodC5faW52bXAodGhpcy5tKS5tdWwodGhpcy5yMikpLl9mb3JjZVJlZCh0aGlzKX19KHZvaWQgMD09PWV8fGUsdGhpcyl9LHt9XSw2NzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlLHIsbixpPXQubGVuZ3RoLGE9MDtmb3IoZT0wO2U8aTsrK2UpYSs9dFtlXS5sZW5ndGg7dmFyIG89bmV3IEFycmF5KGEpLHM9MDtmb3IoZT0wO2U8aTsrK2Upe3ZhciBsPXRbZV0sdT1sLmxlbmd0aDtmb3Iocj0wO3I8dTsrK3Ipe3ZhciBjPW9bcysrXT1uZXcgQXJyYXkodS0xKSxoPTA7Zm9yKG49MDtuPHU7KytuKW4hPT1yJiYoY1toKytdPWxbbl0pO2lmKDEmcil7dmFyIGY9Y1sxXTtjWzFdPWNbMF0sY1swXT1mfX19cmV0dXJuIG99ZS5leHBvcnRzPW59LHt9XSw2ODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7Zm9yKHZhciByPTA7cjx0OysrcilpZighKGVbcl08PWVbcit0XSkpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gaSh0LGUscixpKXtmb3IodmFyIGE9MCxvPTAscz0wLGw9dC5sZW5ndGg7czxsOysrcyl7dmFyIHU9dFtzXTtpZighbihlLHUpKXtmb3IodmFyIGM9MDtjPDIqZTsrK2MpclthKytdPXVbY107aVtvKytdPXN9fXJldHVybiBvfWZ1bmN0aW9uIGEodCxlLHIsbil7dmFyIGE9dC5sZW5ndGgsbz1lLmxlbmd0aDtpZighKGE8PTB8fG88PTApKXt2YXIgcz10WzBdLmxlbmd0aD4+PjE7aWYoIShzPD0wKSl7dmFyIGwsdT1oLm1hbGxvY0RvdWJsZSgyKnMqYSksYz1oLm1hbGxvY0ludDMyKGEpO2lmKChhPWkodCxzLHUsYykpPjApe2lmKDE9PT1zJiZuKWYuaW5pdChhKSxsPWYuc3dlZXBDb21wbGV0ZShzLHIsMCxhLHUsYywwLGEsdSxjKTtlbHNle3ZhciBwPWgubWFsbG9jRG91YmxlKDIqcypvKSxtPWgubWFsbG9jSW50MzIobyk7bz1pKGUscyxwLG0pLG8+MCYmKGYuaW5pdChhK28pLGw9MT09PXM/Zi5zd2VlcEJpcGFydGl0ZShzLHIsMCxhLHUsYywwLG8scCxtKTpkKHMscixuLGEsdSxjLG8scCxtKSxoLmZyZWUocCksaC5mcmVlKG0pKX1oLmZyZWUodSksaC5mcmVlKGMpfXJldHVybiBsfX19ZnVuY3Rpb24gbyh0LGUpe2MucHVzaChbdCxlXSl9ZnVuY3Rpb24gcyh0KXtyZXR1cm4gYz1bXSxhKHQsdCxvLCEwKSxjfWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gYz1bXSxhKHQsZSxvLCExKSxjfWZ1bmN0aW9uIHUodCxlLHIpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIHModCk7Y2FzZSAyOnJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlP2EodCx0LGUsITApOmwodCxlKTtjYXNlIDM6cmV0dXJuIGEodCxlLHIsITEpO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJib3gtaW50ZXJzZWN0OiBJbnZhbGlkIGFyZ3VtZW50cyIpfX1lLmV4cG9ydHM9dTt2YXIgYyxoPXQoInR5cGVkYXJyYXktcG9vbCIpLGY9dCgiLi9saWIvc3dlZXAiKSxkPXQoIi4vbGliL2ludGVyc2VjdCIpfSx7Ii4vbGliL2ludGVyc2VjdCI6NzAsIi4vbGliL3N3ZWVwIjo3NCwidHlwZWRhcnJheS1wb29sIjo1Mzl9XSw2OTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj0iYnJ1dGVGb3JjZSIrKHQ/IlJlZCI6IkJsdWUiKSsoZT8iRmxpcCI6IiIpKyhyPyJGdWxsIjoiIiksaT1bImZ1bmN0aW9uICIsbiwiKCIsdy5qb2luKCksIil7IiwidmFyICIsdSwiPTIqIixhLCI7Il0sbD0iZm9yKHZhciBpPSIrYysiLCIrcCsiPSIrdSsiKiIrYysiO2k8IitoKyI7KytpLCIrcCsiKz0iK3UrIil7dmFyIHgwPSIrZisiWyIrbysiKyIrcCsiXSx4MT0iK2YrIlsiK28rIisiK3ArIisiK2ErIl0seGk9IitkKyJbaV07IixNPSJmb3IodmFyIGo9IittKyIsIitiKyI9Iit1KyIqIittKyI7ajwiK3YrIjsrK2osIitiKyIrPSIrdSsiKXt2YXIgeTA9IitnKyJbIitvKyIrIitiKyJdLCIrKHI/InkxPSIrZysiWyIrbysiKyIrYisiKyIrYSsiXSwiOiIiKSsieWk9Iit5KyJbal07IjtyZXR1cm4gdD9pLnB1c2gobCxfLCI6IixNKTppLnB1c2goTSxfLCI6IixsKSxyP2kucHVzaCgiaWYoeTE8eDB8fHgxPHkwKWNvbnRpbnVlOyIpOmU/aS5wdXNoKCJpZih5MDw9eDB8fHgxPHkwKWNvbnRpbnVlOyIpOmkucHVzaCgiaWYoeTA8eDB8fHgxPHkwKWNvbnRpbnVlOyIpLGkucHVzaCgiZm9yKHZhciBrPSIrbysiKzE7azwiK2ErIjsrK2spe3ZhciByMD0iK2YrIltrKyIrcCsiXSxyMT0iK2YrIltrKyIrYSsiKyIrcCsiXSxiMD0iK2crIltrKyIrYisiXSxiMT0iK2crIltrKyIrYSsiKyIrYisiXTtpZihyMTxiMHx8YjE8cjApY29udGludWUgIitfKyI7fXZhciAiK3grIj0iK3MrIigiKSxlP2kucHVzaCgieWkseGkiKTppLnB1c2goInhpLHlpIiksaS5wdXNoKCIpO2lmKCIreCsiIT09dm9pZCAwKXJldHVybiAiK3grIjt9fX0iKSx7bmFtZTpuLGNvZGU6aS5qb2luKCIiKX19ZnVuY3Rpb24gaSh0KXtmdW5jdGlvbiBlKGUscil7dmFyIGE9bihlLHIsdCk7aS5wdXNoKGEuY29kZSksby5wdXNoKCJyZXR1cm4gIithLm5hbWUrIigiK3cuam9pbigpKyIpOyIpfXZhciByPSJicnV0ZUZvcmNlIisodD8iRnVsbCI6IlBhcnRpYWwiKSxpPVtdLGE9dy5zbGljZSgpO3R8fGEuc3BsaWNlKDMsMCxsKTt2YXIgbz1bImZ1bmN0aW9uICIrcisiKCIrYS5qb2luKCkrIil7Il07by5wdXNoKCJpZigiK2grIi0iK2MrIj4iK3YrIi0iK20rIil7IiksdD8oZSghMCwhMSksby5wdXNoKCJ9ZWxzZXsiKSxlKCExLCExKSk6KG8ucHVzaCgiaWYoIitsKyIpeyIpLGUoITAsITApLG8ucHVzaCgifWVsc2V7IiksZSghMCwhMSksby5wdXNoKCJ9fWVsc2V7aWYoIitsKyIpeyIpLGUoITEsITApLG8ucHVzaCgifWVsc2V7IiksZSghMSwhMSksby5wdXNoKCJ9IikpLG8ucHVzaCgifX1yZXR1cm4gIityKTt2YXIgcz1pLmpvaW4oIiIpK28uam9pbigiIik7cmV0dXJuIG5ldyBGdW5jdGlvbihzKSgpfXZhciBhPSJkIixvPSJheCIscz0idnYiLGw9ImZwIix1PSJlcyIsYz0icnMiLGg9InJlIixmPSJyYiIsZD0icmkiLHA9InJwIixtPSJicyIsdj0iYmUiLGc9ImJiIix5PSJiaSIsYj0iYnAiLHg9InJ2IixfPSJRIix3PVthLG8scyxjLGgsZixkLG0sdixnLHldO3IucGFydGlhbD1pKCExKSxyLmZ1bGw9aSghMCl9LHt9XSw3MDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9OCp1LmxvZzIoZSsxKSoodCsxKXwwLG49dS5uZXh0UG93MihBKnIpO1MubGVuZ3RoPG4mJihsLmZyZWUoUyksUz1sLm1hbGxvY0ludDMyKG4pKTt2YXIgaT11Lm5leHRQb3cyKFQqcik7RTxpJiYobC5mcmVlKEUpLEU9bC5tYWxsb2NEb3VibGUoaSkpfWZ1bmN0aW9uIGkodCxlLHIsbixpLGEsbyxzLGwpe3ZhciB1PUEqdDtTW3VdPWUsU1t1KzFdPXIsU1t1KzJdPW4sU1t1KzNdPWksU1t1KzRdPWEsU1t1KzVdPW87dmFyIGM9VCp0O0VbY109cyxFW2MrMV09bH1mdW5jdGlvbiBhKHQsZSxyLG4saSxhLG8scyxsLHUsYyl7dmFyIGg9Mip0LGY9bCpoLGQ9dVtmK2VdO3Q6Zm9yKHZhciBwPWksbT1pKmg7cDxhOysrcCxtKz1oKXt2YXIgdj1vW20rZV0sZz1vW20rZSt0XTtpZighKGQ8dnx8ZzxkKSYmKCFufHxkIT09dikpe2Zvcih2YXIgeT1zW3BdLGI9ZSsxO2I8dDsrK2Ipe3ZhciB2PW9bbStiXSxnPW9bbStiK3RdLHg9dVtmK2JdLF89dVtmK2IrdF07aWYoZzx4fHxfPHYpY29udGludWUgdH12YXIgdztpZih2b2lkIDAhPT0odz1uP3IoYyx5KTpyKHksYykpKXJldHVybiB3fX19ZnVuY3Rpb24gbyh0LGUscixuLGksYSxvLHMsbCx1KXt2YXIgYz0yKnQsaD1zKmMsZj1sW2grZV07dDpmb3IodmFyIGQ9bixwPW4qYztkPGk7KytkLHArPWMpe3ZhciBtPW9bZF07aWYobSE9PXUpe3ZhciB2PWFbcCtlXSxnPWFbcCtlK3RdO2lmKCEoZjx2fHxnPGYpKXtmb3IodmFyIHk9ZSsxO3k8dDsrK3kpe3ZhciB2PWFbcCt5XSxnPWFbcCt5K3RdLGI9bFtoK3ldLHg9bFtoK3krdF07aWYoZzxifHx4PHYpY29udGludWUgdH12YXIgXz1yKG0sdSk7aWYodm9pZCAwIT09XylyZXR1cm4gX319fX1mdW5jdGlvbiBzKHQsZSxyLHMsbCx1LGMsbSxMKXtuKHQscytjKTt2YXIgQyx6PTAsST0yKnQ7Zm9yKGkoeisrLDAsMCxzLDAsYyxyPzE2OjAsLTEvMCwxLzApLHJ8fGkoeisrLDAsMCxjLDAscywxLC0xLzAsMS8wKTt6PjA7KXt6LT0xO3ZhciBEPXoqQSxQPVNbRF0sTz1TW0QrMV0sUj1TW0QrMl0sRj1TW0QrM10saj1TW0QrNF0sTj1TW0QrNV0sQj16KlQsVT1FW0JdLFY9RVtCKzFdLEg9MSZOLHE9ISEoMTYmTiksRz1sLFk9dSxYPW0sVz1MO2lmKEgmJihHPW0sWT1MLFg9bCxXPXUpLCEoMiZOJiYoUj1fKHQsUCxPLFIsRyxZLFYpLE8+PVIpfHw0Jk4mJihPPXcodCxQLE8sUixHLFksVSkpPj1SKSl7dmFyIFo9Ui1PLEo9ai1GO2lmKHEpe2lmKHQqWiooWitKKTx5KXtpZih2b2lkIDAhPT0oQz1kLnNjYW5Db21wbGV0ZSh0LFAsZSxPLFIsRyxZLEYsaixYLFcpKSlyZXR1cm4gQztjb250aW51ZX19ZWxzZXtpZih0Kk1hdGgubWluKFosSik8dil7aWYodm9pZCAwIT09KEM9aCh0LFAsZSxILE8sUixHLFksRixqLFgsVykpKXJldHVybiBDO2NvbnRpbnVlfWlmKHQqWipKPGcpe2lmKHZvaWQgMCE9PShDPWQuc2NhbkJpcGFydGl0ZSh0LFAsZSxILE8sUixHLFksRixqLFgsVykpKXJldHVybiBDO2NvbnRpbnVlfX12YXIgSz1iKHQsUCxPLFIsRyxZLFUsVik7aWYoTzxLKWlmKHQqKEstTyk8dil7aWYodm9pZCAwIT09KEM9Zih0LFArMSxlLE8sSyxHLFksRixqLFgsVykpKXJldHVybiBDfWVsc2UgaWYoUD09PXQtMil7aWYodm9pZCAwIT09KEM9SD9kLnN3ZWVwQmlwYXJ0aXRlKHQsZSxGLGosWCxXLE8sSyxHLFkpOmQuc3dlZXBCaXBhcnRpdGUodCxlLE8sSyxHLFksRixqLFgsVykpKXJldHVybiBDfWVsc2UgaSh6KyssUCsxLE8sSyxGLGosSCwtMS8wLDEvMCksaSh6KyssUCsxLEYsaixPLEssMV5ILC0xLzAsMS8wKTtpZihLPFIpe3ZhciBRPXAodCxQLEYsaixYLFcpLCQ9WFtJKlErUF0sdHQ9eCh0LFAsUSxqLFgsVywkKTtpZih0dDxqJiZpKHorKyxQLEssUix0dCxqLCg0fEgpKyhxPzE2OjApLCQsViksRjxRJiZpKHorKyxQLEssUixGLFEsKDJ8SCkrKHE/MTY6MCksVSwkKSxRKzE9PT10dCl7aWYodm9pZCAwIT09KEM9cT9vKHQsUCxlLEssUixHLFksUSxYLFdbUV0pOmEodCxQLGUsSCxLLFIsRyxZLFEsWCxXW1FdKSkpcmV0dXJuIEN9ZWxzZSBpZihRPHR0KXt2YXIgZXQ7aWYocSl7aWYoZXQ9TSh0LFAsSyxSLEcsWSwkKSxLPGV0KXt2YXIgcnQ9eCh0LFAsSyxldCxHLFksJCk7aWYoUD09PXQtMil7aWYoSzxydCYmdm9pZCAwIT09KEM9ZC5zd2VlcENvbXBsZXRlKHQsZSxLLHJ0LEcsWSxRLHR0LFgsVykpKXJldHVybiBDO2lmKHJ0PGV0JiZ2b2lkIDAhPT0oQz1kLnN3ZWVwQmlwYXJ0aXRlKHQsZSxydCxldCxHLFksUSx0dCxYLFcpKSlyZXR1cm4gQ31lbHNlIEs8cnQmJmkoeisrLFArMSxLLHJ0LFEsdHQsMTYsLTEvMCwxLzApLHJ0PGV0JiYoaSh6KyssUCsxLHJ0LGV0LFEsdHQsMCwtMS8wLDEvMCksaSh6KyssUCsxLFEsdHQscnQsZXQsMSwtMS8wLDEvMCkpfX1lbHNlIGV0PUg/ayh0LFAsSyxSLEcsWSwkKTpNKHQsUCxLLFIsRyxZLCQpLEs8ZXQmJihQPT09dC0yP0M9SD9kLnN3ZWVwQmlwYXJ0aXRlKHQsZSxRLHR0LFgsVyxLLGV0LEcsWSk6ZC5zd2VlcEJpcGFydGl0ZSh0LGUsSyxldCxHLFksUSx0dCxYLFcpOihpKHorKyxQKzEsSyxldCxRLHR0LEgsLTEvMCwxLzApLGkoeisrLFArMSxRLHR0LEssZXQsMV5ILC0xLzAsMS8wKSkpfX19fX1lLmV4cG9ydHM9czt2YXIgbD10KCJ0eXBlZGFycmF5LXBvb2wiKSx1PXQoImJpdC10d2lkZGxlIiksYz10KCIuL2JydXRlIiksaD1jLnBhcnRpYWwsZj1jLmZ1bGwsZD10KCIuL3N3ZWVwIikscD10KCIuL21lZGlhbiIpLG09dCgiLi9wYXJ0aXRpb24iKSx2PTEyOCxnPTE8PDIyLHk9MTw8MjIsYj1tKCIhKGxvPj1wMCkmJiEocDE+PWhpKSIsWyJwMCIsInAxIl0pLHg9bSgibG89PT1wMCIsWyJwMCJdKSxfPW0oImxvPHAwIixbInAwIl0pLHc9bSgiaGk8PXAwIixbInAwIl0pLE09bSgibG88PXAwJiZwMDw9aGkiLFsicDAiXSksaz1tKCJsbzxwMCYmcDA8PWhpIixbInAwIl0pLEE9NixUPTIsUz1sLm1hbGxvY0ludDMyKDEwMjQpLEU9bC5tYWxsb2NEb3VibGUoMTAyNCl9LHsiLi9icnV0ZSI6NjksIi4vbWVkaWFuIjo3MSwiLi9wYXJ0aXRpb24iOjcyLCIuL3N3ZWVwIjo3NCwiYml0LXR3aWRkbGUiOjY1LCJ0eXBlZGFycmF5LXBvb2wiOjUzOX1dLDcxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLGEpe2Zvcih2YXIgbz0yKnQscz1vKihyKzEpK2UsbD1yKzE7bDxuOysrbCxzKz1vKWZvcih2YXIgdT1pW3NdLGM9bCxoPW8qKGwtMSk7Yz5yJiZpW2grZV0+dTstLWMsaC09byl7Zm9yKHZhciBmPWgsZD1oK28scD0wO3A8bzsrK3AsKytmLCsrZCl7dmFyIG09aVtmXTtpW2ZdPWlbZF0saVtkXT1tfXZhciB2PWFbY107YVtjXT1hW2MtMV0sYVtjLTFdPXZ9fWZ1bmN0aW9uIGkodCxlLHIsaSxhLGwpe2lmKGk8PXIrMSlyZXR1cm4gcjtmb3IodmFyIHU9cixjPWksaD1pK3I+Pj4xLGY9Mip0LGQ9aCxwPWFbZipoK2VdO3U8Yzspe2lmKGMtdTxzKXtuKHQsZSx1LGMsYSxsKSxwPWFbZipoK2VdO2JyZWFrfXZhciBtPWMtdSx2PU1hdGgucmFuZG9tKCkqbSt1fDAsZz1hW2YqditlXSx5PU1hdGgucmFuZG9tKCkqbSt1fDAsYj1hW2YqeStlXSx4PU1hdGgucmFuZG9tKCkqbSt1fDAsXz1hW2YqeCtlXTtnPD1iP18+PWI/KGQ9eSxwPWIpOmc+PV8/KGQ9dixwPWcpOihkPXgscD1fKTpiPj1fPyhkPXkscD1iKTpfPj1nPyhkPXYscD1nKTooZD14LHA9Xyk7Zm9yKHZhciB3PWYqKGMtMSksTT1mKmQsaz0wO2s8ZjsrK2ssKyt3LCsrTSl7dmFyIEE9YVt3XTthW3ddPWFbTV0sYVtNXT1BfXZhciBUPWxbYy0xXTtsW2MtMV09bFtkXSxsW2RdPVQsZD1vKHQsZSx1LGMtMSxhLGwscCk7Zm9yKHZhciB3PWYqKGMtMSksTT1mKmQsaz0wO2s8ZjsrK2ssKyt3LCsrTSl7dmFyIEE9YVt3XTthW3ddPWFbTV0sYVtNXT1BfXZhciBUPWxbYy0xXTtpZihsW2MtMV09bFtkXSxsW2RdPVQsaDxkKXtmb3IoYz1kLTE7dTxjJiZhW2YqKGMtMSkrZV09PT1wOyljLT0xO2MrPTF9ZWxzZXtpZighKGQ8aCkpYnJlYWs7Zm9yKHU9ZCsxO3U8YyYmYVtmKnUrZV09PT1wOyl1Kz0xfX1yZXR1cm4gbyh0LGUscixoLGEsbCxhW2YqaCtlXSl9ZS5leHBvcnRzPWk7dmFyIGE9dCgiLi9wYXJ0aXRpb24iKSxvPWEoImxvPHAwIixbInAwIl0pLHM9OH0seyIuL3BhcnRpdGlvbiI6NzJ9XSw3MjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9ImFiY2RlZiIuc3BsaXQoIiIpLmNvbmNhdChlKSxuPVtdO3JldHVybiB0LmluZGV4T2YoImxvIik+PTAmJm4ucHVzaCgibG89ZVtrK25dIiksdC5pbmRleE9mKCJoaSIpPj0wJiZuLnB1c2goImhpPWVbaytvXSIpLHIucHVzaChpLnJlcGxhY2UoIl8iLG4uam9pbigpKS5yZXBsYWNlKCIkIix0KSksRnVuY3Rpb24uYXBwbHkodm9pZCAwLHIpfWUuZXhwb3J0cz1uO3ZhciBpPSJmb3IodmFyIGo9MiphLGs9aipjLGw9ayxtPWMsbj1iLG89YStiLHA9YztkPnA7KytwLGsrPWope3ZhciBfO2lmKCQpaWYobT09PXApbSs9MSxsKz1qO2Vsc2V7Zm9yKHZhciBzPTA7aj5zOysrcyl7dmFyIHQ9ZVtrK3NdO2VbaytzXT1lW2xdLGVbbCsrXT10fXZhciB1PWZbcF07ZltwXT1mW21dLGZbbSsrXT11fX1yZXR1cm4gbSJ9LHt9XSw3MzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7ZTw9NCpmP2koMCxlLTEsdCk6aCgwLGUtMSx0KX1mdW5jdGlvbiBpKHQsZSxyKXtmb3IodmFyIG49MioodCsxKSxpPXQrMTtpPD1lOysraSl7Zm9yKHZhciBhPXJbbisrXSxvPXJbbisrXSxzPWksbD1uLTI7cy0tID50Oyl7dmFyIHU9cltsLTJdLGM9cltsLTFdO2lmKHU8YSlicmVhaztpZih1PT09YSYmYzxvKWJyZWFrO3JbbF09dSxyW2wrMV09YyxsLT0yfXJbbF09YSxyW2wrMV09b319ZnVuY3Rpb24gYSh0LGUscil7dCo9MixlKj0yO3ZhciBuPXJbdF0saT1yW3QrMV07clt0XT1yW2VdLHJbdCsxXT1yW2UrMV0scltlXT1uLHJbZSsxXT1pfWZ1bmN0aW9uIG8odCxlLHIpe3QqPTIsZSo9MixyW3RdPXJbZV0sclt0KzFdPXJbZSsxXX1mdW5jdGlvbiBzKHQsZSxyLG4pe3QqPTIsZSo9MixyKj0yO3ZhciBpPW5bdF0sYT1uW3QrMV07blt0XT1uW2VdLG5bdCsxXT1uW2UrMV0sbltlXT1uW3JdLG5bZSsxXT1uW3IrMV0sbltyXT1pLG5bcisxXT1hfWZ1bmN0aW9uIGwodCxlLHIsbixpKXt0Kj0yLGUqPTIsaVt0XT1pW2VdLGlbZV09cixpW3QrMV09aVtlKzFdLGlbZSsxXT1ufWZ1bmN0aW9uIHUodCxlLHIpe3QqPTIsZSo9Mjt2YXIgbj1yW3RdLGk9cltlXTtyZXR1cm4hKG48aSkmJihuIT09aXx8clt0KzFdPnJbZSsxXSl9ZnVuY3Rpb24gYyh0LGUscixuKXt0Kj0yO3ZhciBpPW5bdF07cmV0dXJuIGk8ZXx8aT09PWUmJm5bdCsxXTxyfWZ1bmN0aW9uIGgodCxlLHIpe3ZhciBuPShlLXQrMSkvNnwwLGQ9dCtuLHA9ZS1uLG09dCtlPj4xLHY9bS1uLGc9bStuLHk9ZCxiPXYseD1tLF89Zyx3PXAsTT10KzEsaz1lLTEsQT0wO3UoeSxiLHIpJiYoQT15LHk9YixiPUEpLHUoXyx3LHIpJiYoQT1fLF89dyx3PUEpLHUoeSx4LHIpJiYoQT15LHk9eCx4PUEpLHUoYix4LHIpJiYoQT1iLGI9eCx4PUEpLHUoeSxfLHIpJiYoQT15LHk9XyxfPUEpLHUoeCxfLHIpJiYoQT14LHg9XyxfPUEpLHUoYix3LHIpJiYoQT1iLGI9dyx3PUEpLHUoYix4LHIpJiYoQT1iLGI9eCx4PUEpLHUoXyx3LHIpJiYoQT1fLF89dyx3PUEpO2Zvcih2YXIgVD1yWzIqYl0sUz1yWzIqYisxXSxFPXJbMipfXSxMPXJbMipfKzFdLEM9Mip5LHo9Mip4LEk9Mip3LEQ9MipkLFA9MiptLE89MipwLFI9MDtSPDI7KytSKXt2YXIgRj1yW0MrUl0saj1yW3orUl0sTj1yW0krUl07cltEK1JdPUYscltQK1JdPWoscltPK1JdPU59byh2LHQsciksbyhnLGUscik7Zm9yKHZhciBCPU07Qjw9azsrK0IpaWYoYyhCLFQsUyxyKSlCIT09TSYmYShCLE0sciksKytNO2Vsc2UgaWYoIWMoQixFLEwscikpZm9yKDs7KXtpZihjKGssRSxMLHIpKXtjKGssVCxTLHIpPyhzKEIsTSxrLHIpLCsrTSwtLWspOihhKEIsayxyKSwtLWspO2JyZWFrfWlmKC0tazxCKWJyZWFrfWwodCxNLTEsVCxTLHIpLGwoZSxrKzEsRSxMLHIpLE0tMi10PD1mP2kodCxNLTIscik6aCh0LE0tMixyKSxlLShrKzIpPD1mP2koaysyLGUscik6aChrKzIsZSxyKSxrLU08PWY/aShNLGsscik6aChNLGsscil9ZS5leHBvcnRzPW47dmFyIGY9MzJ9LHt9XSw3NDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlPWgubmV4dFBvdzIodCk7cC5sZW5ndGg8ZSYmKGMuZnJlZShwKSxwPWMubWFsbG9jSW50MzIoZSkpLG0ubGVuZ3RoPGUmJihjLmZyZWUobSksbT1jLm1hbGxvY0ludDMyKGUpKSx2Lmxlbmd0aDxlJiYoYy5mcmVlKHYpLHY9Yy5tYWxsb2NJbnQzMihlKSksZy5sZW5ndGg8ZSYmKGMuZnJlZShnKSxnPWMubWFsbG9jSW50MzIoZSkpLHkubGVuZ3RoPGUmJihjLmZyZWUoeSkseT1jLm1hbGxvY0ludDMyKGUpKSxiLmxlbmd0aDxlJiYoYy5mcmVlKGIpLGI9Yy5tYWxsb2NJbnQzMihlKSk7dmFyIHI9OCplO3gubGVuZ3RoPHImJihjLmZyZWUoeCkseD1jLm1hbGxvY0RvdWJsZShyKSl9ZnVuY3Rpb24gaSh0LGUscixuKXt2YXIgaT1lW25dLGE9dFtyLTFdO3RbaV09YSxlW2FdPWl9ZnVuY3Rpb24gYSh0LGUscixuKXt0W3JdPW4sZVtuXT1yfWZ1bmN0aW9uIG8odCxlLHIsbixvLHMsbCx1LGMsaCl7Zm9yKHZhciB5PTAsYj0yKnQsXz10LTEsdz1iLTEsTT1yO008bjsrK00pe3ZhciBrPXNbTV0sQT1iKk07eFt5KytdPW9bQStfXSx4W3krK109LShrKzEpLHhbeSsrXT1vW0Erd10seFt5KytdPWt9Zm9yKHZhciBNPWw7TTx1OysrTSl7dmFyIGs9aFtNXStkLFQ9YipNO3hbeSsrXT1jW1QrX10seFt5KytdPS1rLHhbeSsrXT1jW1Qrd10seFt5KytdPWt9dmFyIFM9eT4+PjE7Zih4LFMpO2Zvcih2YXIgRT0wLEw9MCxNPTA7TTxTOysrTSl7dmFyIEM9MHx4WzIqTSsxXTtpZihDPj1kKUM9Qy1kfDAsaSh2LGcsTC0tLEMpO2Vsc2UgaWYoQz49MClpKHAsbSxFLS0sQyk7ZWxzZSBpZihDPD0tZCl7Qz0tQy1kfDA7Zm9yKHZhciB6PTA7ejxFOysreil7dmFyIEk9ZShwW3pdLEMpO2lmKHZvaWQgMCE9PUkpcmV0dXJuIEl9YSh2LGcsTCsrLEMpfWVsc2V7Qz0tQy0xfDA7Zm9yKHZhciB6PTA7ejxMOysreil7dmFyIEk9ZShDLHZbel0pO2lmKHZvaWQgMCE9PUkpcmV0dXJuIEl9YShwLG0sRSsrLEMpfX19ZnVuY3Rpb24gcyh0LGUscixuLG8scyxsLHUsYyxoKXtmb3IodmFyIGQ9MCxfPTIqdCx3PXQtMSxNPV8tMSxrPXI7azxuOysrayl7dmFyIEE9c1trXSsxPDwxLFQ9XyprO3hbZCsrXT1vW1Qrd10seFtkKytdPS1BLHhbZCsrXT1vW1QrTV0seFtkKytdPUF9Zm9yKHZhciBrPWw7azx1Oysrayl7dmFyIEE9aFtrXSsxPDwxLFM9XyprO3hbZCsrXT1jW1Mrd10seFtkKytdPTF8LUEseFtkKytdPWNbUytNXSx4W2QrK109MXxBfXZhciBFPWQ+Pj4xO2YoeCxFKTtmb3IodmFyIEw9MCxDPTAsej0wLGs9MDtrPEU7KytrKXt2YXIgST0wfHhbMiprKzFdLEQ9MSZJO2lmKGs8RS0xJiZJPj4xPT14WzIqayszXT4+MSYmKEQ9MixrKz0xKSxJPDApe2Zvcih2YXIgUD0tKEk+PjEpLTEsTz0wO088ejsrK08pe3ZhciBSPWUoeVtPXSxQKTtpZih2b2lkIDAhPT1SKXJldHVybiBSfWlmKDAhPT1EKWZvcih2YXIgTz0wO088TDsrK08pe3ZhciBSPWUocFtPXSxQKTtpZih2b2lkIDAhPT1SKXJldHVybiBSfWlmKDEhPT1EKWZvcih2YXIgTz0wO088QzsrK08pe3ZhciBSPWUodltPXSxQKTtpZih2b2lkIDAhPT1SKXJldHVybiBSfTA9PT1EP2EocCxtLEwrKyxQKToxPT09RD9hKHYsZyxDKyssUCk6Mj09PUQmJmEoeSxiLHorKyxQKX1lbHNle3ZhciBQPShJPj4xKS0xOzA9PT1EP2kocCxtLEwtLSxQKToxPT09RD9pKHYsZyxDLS0sUCk6Mj09PUQmJmkoeSxiLHotLSxQKX19fWZ1bmN0aW9uIGwodCxlLHIsbixvLHMsbCx1LGMsaCx2LGcpe3ZhciB5PTAsYj0yKnQsXz1lLHc9ZSt0LE09MSxrPTE7bj9rPWQ6TT1kO2Zvcih2YXIgQT1vO0E8czsrK0Epe3ZhciBUPUErTSxTPWIqQTt4W3krK109bFtTK19dLHhbeSsrXT0tVCx4W3krK109bFtTK3ddLHhbeSsrXT1UfWZvcih2YXIgQT1jO0E8aDsrK0Epe3ZhciBUPUErayxFPWIqQTt4W3krK109dltFK19dLHhbeSsrXT0tVH12YXIgTD15Pj4+MTtmKHgsTCk7Zm9yKHZhciBDPTAsQT0wO0E8TDsrK0Epe3ZhciB6PTB8eFsyKkErMV07aWYoejwwKXt2YXIgVD0teixJPSExO2lmKFQ+PWQ/KEk9IW4sVC09ZCk6KEk9ISFuLFQtPTEpLEkpYShwLG0sQysrLFQpO2Vsc2V7CnZhciBEPWdbVF0sUD1iKlQsTz12W1ArZSsxXSxSPXZbUCtlKzErdF07dDpmb3IodmFyIEY9MDtGPEM7KytGKXt2YXIgaj1wW0ZdLE49YipqO2lmKCEoUjxsW04rZSsxXXx8bFtOK2UrMSt0XTxPKSl7Zm9yKHZhciBCPWUrMjtCPHQ7KytCKWlmKHZbUCtCK3RdPGxbTitCXXx8bFtOK0IrdF08dltQK0JdKWNvbnRpbnVlIHQ7dmFyIFUsVj11W2pdO2lmKHZvaWQgMCE9PShVPW4/cihELFYpOnIoVixEKSkpcmV0dXJuIFV9fX19ZWxzZSBpKHAsbSxDLS0sei1NKX19ZnVuY3Rpb24gdSh0LGUscixuLGksYSxvLHMsbCx1LGMpe2Zvcih2YXIgaD0wLG09Mip0LHY9ZSxnPWUrdCx5PW47eTxpOysreSl7dmFyIGI9eStkLF89bSp5O3hbaCsrXT1hW18rdl0seFtoKytdPS1iLHhbaCsrXT1hW18rZ10seFtoKytdPWJ9Zm9yKHZhciB5PXM7eTxsOysreSl7dmFyIGI9eSsxLHc9bSp5O3hbaCsrXT11W3crdl0seFtoKytdPS1ifXZhciBNPWg+Pj4xO2YoeCxNKTtmb3IodmFyIGs9MCx5PTA7eTxNOysreSl7dmFyIEE9MHx4WzIqeSsxXTtpZihBPDApe3ZhciBiPS1BO2lmKGI+PWQpcFtrKytdPWItZDtlbHNle2ItPTE7dmFyIFQ9Y1tiXSxTPW0qYixFPXVbUytlKzFdLEw9dVtTK2UrMSt0XTt0OmZvcih2YXIgQz0wO0M8azsrK0Mpe3ZhciB6PXBbQ10sST1vW3pdO2lmKEk9PT1UKWJyZWFrO3ZhciBEPW0qejtpZighKEw8YVtEK2UrMV18fGFbRCtlKzErdF08RSkpe2Zvcih2YXIgUD1lKzI7UDx0OysrUClpZih1W1MrUCt0XTxhW0QrUF18fGFbRCtQK3RdPHVbUytQXSljb250aW51ZSB0O3ZhciBPPXIoSSxUKTtpZih2b2lkIDAhPT1PKXJldHVybiBPfX19fWVsc2V7Zm9yKHZhciBiPUEtZCxDPWstMTtDPj0wOy0tQylpZihwW0NdPT09Yil7Zm9yKHZhciBQPUMrMTtQPGs7KytQKXBbUC0xXT1wW1BdO2JyZWFrfS0ta319fWUuZXhwb3J0cz17aW5pdDpuLHN3ZWVwQmlwYXJ0aXRlOm8sc3dlZXBDb21wbGV0ZTpzLHNjYW5CaXBhcnRpdGU6bCxzY2FuQ29tcGxldGU6dX07dmFyIGM9dCgidHlwZWRhcnJheS1wb29sIiksaD10KCJiaXQtdHdpZGRsZSIpLGY9dCgiLi9zb3J0IiksZD0xPDwyOCxwPWMubWFsbG9jSW50MzIoMTAyNCksbT1jLm1hbGxvY0ludDMyKDEwMjQpLHY9Yy5tYWxsb2NJbnQzMigxMDI0KSxnPWMubWFsbG9jSW50MzIoMTAyNCkseT1jLm1hbGxvY0ludDMyKDEwMjQpLGI9Yy5tYWxsb2NJbnQzMigxMDI0KSx4PWMubWFsbG9jRG91YmxlKDgxOTIpfSx7Ii4vc29ydCI6NzMsImJpdC10d2lkZGxlIjo2NSwidHlwZWRhcnJheS1wb29sIjo1Mzl9XSw3NTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe2lmKHQ+Wil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTt2YXIgZT1uZXcgVWludDhBcnJheSh0KTtyZXR1cm4gZS5fX3Byb3RvX189aS5wcm90b3R5cGUsZX1mdW5jdGlvbiBpKHQsZSxyKXtpZigibnVtYmVyIj09dHlwZW9mIHQpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoIklmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nIik7cmV0dXJuIGwodCl9cmV0dXJuIGEodCxlLHIpfWZ1bmN0aW9uIGEodCxlLHIpe2lmKCJudW1iZXIiPT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJyk7cmV0dXJuIHQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9oKHQsZSxyKToic3RyaW5nIj09dHlwZW9mIHQ/dSh0LGUpOmYodCl9ZnVuY3Rpb24gbyh0KXtpZigibnVtYmVyIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInNpemUiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKTtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBuZWdhdGl2ZScpfWZ1bmN0aW9uIHModCxlLHIpe3JldHVybiBvKHQpLHQ8PTA/bih0KTp2b2lkIDAhPT1lPyJzdHJpbmciPT10eXBlb2Ygcj9uKHQpLmZpbGwoZSxyKTpuKHQpLmZpbGwoZSk6bih0KX1mdW5jdGlvbiBsKHQpe3JldHVybiBvKHQpLG4odDwwPzA6MHxkKHQpKX1mdW5jdGlvbiB1KHQsZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYiIiE9PWV8fChlPSJ1dGY4IiksIWkuaXNFbmNvZGluZyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgcj0wfG0odCxlKSxhPW4ociksbz1hLndyaXRlKHQsZSk7cmV0dXJuIG8hPT1yJiYoYT1hLnNsaWNlKDAsbykpLGF9ZnVuY3Rpb24gYyh0KXtmb3IodmFyIGU9dC5sZW5ndGg8MD8wOjB8ZCh0Lmxlbmd0aCkscj1uKGUpLGk9MDtpPGU7aSs9MSlyW2ldPTI1NSZ0W2ldO3JldHVybiByfWZ1bmN0aW9uIGgodCxlLHIpe2lmKGU8MHx8dC5ieXRlTGVuZ3RoPGUpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidvZmZzZXQnIGlzIG91dCBvZiBib3VuZHMiKTtpZih0LmJ5dGVMZW5ndGg8ZSsocnx8MCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIidsZW5ndGgnIGlzIG91dCBvZiBib3VuZHMiKTt2YXIgbjtyZXR1cm4gbj12b2lkIDA9PT1lJiZ2b2lkIDA9PT1yP25ldyBVaW50OEFycmF5KHQpOnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkodCxlKTpuZXcgVWludDhBcnJheSh0LGUsciksbi5fX3Byb3RvX189aS5wcm90b3R5cGUsbn1mdW5jdGlvbiBmKHQpe2lmKGkuaXNCdWZmZXIodCkpe3ZhciBlPTB8ZCh0Lmxlbmd0aCkscj1uKGUpO3JldHVybiAwPT09ci5sZW5ndGg/cjoodC5jb3B5KHIsMCwwLGUpLHIpfWlmKHQpe2lmKEcodCl8fCJsZW5ndGgiaW4gdClyZXR1cm4ibnVtYmVyIiE9dHlwZW9mIHQubGVuZ3RofHxZKHQubGVuZ3RoKT9uKDApOmModCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJkFycmF5LmlzQXJyYXkodC5kYXRhKSlyZXR1cm4gYyh0LmRhdGEpfXRocm93IG5ldyBUeXBlRXJyb3IoIkZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcsIEJ1ZmZlciwgQXJyYXlCdWZmZXIsIEFycmF5LCBvciBhcnJheS1saWtlIG9iamVjdC4iKX1mdW5jdGlvbiBkKHQpe2lmKHQ+PVopdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK1oudG9TdHJpbmcoMTYpKyIgYnl0ZXMiKTtyZXR1cm4gMHx0fWZ1bmN0aW9uIHAodCl7cmV0dXJuK3QhPXQmJih0PTApLGkuYWxsb2MoK3QpfWZ1bmN0aW9uIG0odCxlKXtpZihpLmlzQnVmZmVyKHQpKXJldHVybiB0Lmxlbmd0aDtpZihHKHQpfHx0IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpcmV0dXJuIHQuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIHQmJih0PSIiK3QpO3ZhciByPXQubGVuZ3RoO2lmKDA9PT1yKXJldHVybiAwO2Zvcih2YXIgbj0hMTs7KXN3aXRjaChlKXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiByO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIEIodCkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipyO2Nhc2UiaGV4IjpyZXR1cm4gcj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBIKHQpLmxlbmd0aDtkZWZhdWx0OmlmKG4pcmV0dXJuIEIodCkubGVuZ3RoO2U9KCIiK2UpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gdih0LGUscil7dmFyIG49ITE7aWYoKHZvaWQgMD09PWV8fGU8MCkmJihlPTApLGU+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PXJ8fHI+dGhpcy5sZW5ndGgpJiYocj10aGlzLmxlbmd0aCkscjw9MClyZXR1cm4iIjtpZihyPj4+PTAsZT4+Pj0wLHI8PWUpcmV0dXJuIiI7Zm9yKHR8fCh0PSJ1dGY4Iik7Oylzd2l0Y2godCl7Y2FzZSJoZXgiOnJldHVybiB6KHRoaXMsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBTKHRoaXMsZSxyKTtjYXNlImFzY2lpIjpyZXR1cm4gTCh0aGlzLGUscik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gQyh0aGlzLGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBUKHRoaXMsZSxyKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIEkodGhpcyxlLHIpO2RlZmF1bHQ6aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3QpO3Q9KHQrIiIpLnRvTG93ZXJDYXNlKCksbj0hMH19ZnVuY3Rpb24gZyh0LGUscil7dmFyIG49dFtlXTt0W2VdPXRbcl0sdFtyXT1ufWZ1bmN0aW9uIHkodCxlLHIsbixhKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiByPyhuPXIscj0wKTpyPjIxNDc0ODM2NDc/cj0yMTQ3NDgzNjQ3OnI8LTIxNDc0ODM2NDgmJihyPS0yMTQ3NDgzNjQ4KSxyPStyLFkocikmJihyPWE/MDp0Lmxlbmd0aC0xKSxyPDAmJihyPXQubGVuZ3RoK3IpLHI+PXQubGVuZ3RoKXtpZihhKXJldHVybi0xO3I9dC5sZW5ndGgtMX1lbHNlIGlmKHI8MCl7aWYoIWEpcmV0dXJuLTE7cj0wfWlmKCJzdHJpbmciPT10eXBlb2YgZSYmKGU9aS5mcm9tKGUsbikpLGkuaXNCdWZmZXIoZSkpcmV0dXJuIDA9PT1lLmxlbmd0aD8tMTpiKHQsZSxyLG4sYSk7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBlJj0yNTUsImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/YT9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwodCxlLHIpOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwodCxlLHIpOmIodCxbZV0scixuLGEpO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIGIodCxlLHIsbixpKXtmdW5jdGlvbiBhKHQsZSl7cmV0dXJuIDE9PT1vP3RbZV06dC5yZWFkVUludDE2QkUoZSpvKX12YXIgbz0xLHM9dC5sZW5ndGgsbD1lLmxlbmd0aDtpZih2b2lkIDAhPT1uJiYoInVjczIiPT09KG49U3RyaW5nKG4pLnRvTG93ZXJDYXNlKCkpfHwidWNzLTIiPT09bnx8InV0ZjE2bGUiPT09bnx8InV0Zi0xNmxlIj09PW4pKXtpZih0Lmxlbmd0aDwyfHxlLmxlbmd0aDwyKXJldHVybi0xO289MixzLz0yLGwvPTIsci89Mn12YXIgdTtpZihpKXt2YXIgYz0tMTtmb3IodT1yO3U8czt1KyspaWYoYSh0LHUpPT09YShlLC0xPT09Yz8wOnUtYykpe2lmKC0xPT09YyYmKGM9dSksdS1jKzE9PT1sKXJldHVybiBjKm99ZWxzZS0xIT09YyYmKHUtPXUtYyksYz0tMX1lbHNlIGZvcihyK2w+cyYmKHI9cy1sKSx1PXI7dT49MDt1LS0pe2Zvcih2YXIgaD0hMCxmPTA7ZjxsO2YrKylpZihhKHQsdStmKSE9PWEoZSxmKSl7aD0hMTticmVha31pZihoKXJldHVybiB1fXJldHVybi0xfWZ1bmN0aW9uIHgodCxlLHIsbil7cj1OdW1iZXIocil8fDA7dmFyIGk9dC5sZW5ndGgtcjtuPyhuPU51bWJlcihuKSk+aSYmKG49aSk6bj1pO3ZhciBhPWUubGVuZ3RoO2lmKGElMiE9MCl0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGhleCBzdHJpbmciKTtuPmEvMiYmKG49YS8yKTtmb3IodmFyIG89MDtvPG47KytvKXt2YXIgcz1wYXJzZUludChlLnN1YnN0cigyKm8sMiksMTYpO2lmKFkocykpcmV0dXJuIG87dFtyK29dPXN9cmV0dXJuIG99ZnVuY3Rpb24gXyh0LGUscixuKXtyZXR1cm4gcShCKGUsdC5sZW5ndGgtciksdCxyLG4pfWZ1bmN0aW9uIHcodCxlLHIsbil7cmV0dXJuIHEoVShlKSx0LHIsbil9ZnVuY3Rpb24gTSh0LGUscixuKXtyZXR1cm4gdyh0LGUscixuKX1mdW5jdGlvbiBrKHQsZSxyLG4pe3JldHVybiBxKEgoZSksdCxyLG4pfWZ1bmN0aW9uIEEodCxlLHIsbil7cmV0dXJuIHEoVihlLHQubGVuZ3RoLXIpLHQscixuKX1mdW5jdGlvbiBUKHQsZSxyKXtyZXR1cm4gMD09PWUmJnI9PT10Lmxlbmd0aD9YLmZyb21CeXRlQXJyYXkodCk6WC5mcm9tQnl0ZUFycmF5KHQuc2xpY2UoZSxyKSl9ZnVuY3Rpb24gUyh0LGUscil7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIG49W10saT1lO2k8cjspe3ZhciBhPXRbaV0sbz1udWxsLHM9YT4yMzk/NDphPjIyMz8zOmE+MTkxPzI6MTtpZihpK3M8PXIpe3ZhciBsLHUsYyxoO3N3aXRjaChzKXtjYXNlIDE6YTwxMjgmJihvPWEpO2JyZWFrO2Nhc2UgMjpsPXRbaSsxXSwxMjg9PSgxOTImbCkmJihoPSgzMSZhKTw8Nnw2MyZsKT4xMjcmJihvPWgpO2JyZWFrO2Nhc2UgMzpsPXRbaSsxXSx1PXRbaSsyXSwxMjg9PSgxOTImbCkmJjEyOD09KDE5MiZ1KSYmKGg9KDE1JmEpPDwxMnwoNjMmbCk8PDZ8NjMmdSk+MjA0NyYmKGg8NTUyOTZ8fGg+NTczNDMpJiYobz1oKTticmVhaztjYXNlIDQ6bD10W2krMV0sdT10W2krMl0sYz10W2krM10sMTI4PT0oMTkyJmwpJiYxMjg9PSgxOTImdSkmJjEyOD09KDE5MiZjKSYmKGg9KDE1JmEpPDwxOHwoNjMmbCk8PDEyfCg2MyZ1KTw8Nnw2MyZjKT42NTUzNSYmaDwxMTE0MTEyJiYobz1oKX19bnVsbD09PW8/KG89NjU1MzMscz0xKTpvPjY1NTM1JiYoby09NjU1MzYsbi5wdXNoKG8+Pj4xMCYxMDIzfDU1Mjk2KSxvPTU2MzIwfDEwMjMmbyksbi5wdXNoKG8pLGkrPXN9cmV0dXJuIEUobil9ZnVuY3Rpb24gRSh0KXt2YXIgZT10Lmxlbmd0aDtpZihlPD1KKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZyx0KTtmb3IodmFyIHI9IiIsbj0wO248ZTspcis9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsdC5zbGljZShuLG4rPUopKTtyZXR1cm4gcn1mdW5jdGlvbiBMKHQsZSxyKXt2YXIgbj0iIjtyPU1hdGgubWluKHQubGVuZ3RoLHIpO2Zvcih2YXIgaT1lO2k8cjsrK2kpbis9U3RyaW5nLmZyb21DaGFyQ29kZSgxMjcmdFtpXSk7cmV0dXJuIG59ZnVuY3Rpb24gQyh0LGUscil7dmFyIG49IiI7cj1NYXRoLm1pbih0Lmxlbmd0aCxyKTtmb3IodmFyIGk9ZTtpPHI7KytpKW4rPVN0cmluZy5mcm9tQ2hhckNvZGUodFtpXSk7cmV0dXJuIG59ZnVuY3Rpb24geih0LGUscil7dmFyIG49dC5sZW5ndGg7KCFlfHxlPDApJiYoZT0wKSwoIXJ8fHI8MHx8cj5uKSYmKHI9bik7Zm9yKHZhciBpPSIiLGE9ZTthPHI7KythKWkrPU4odFthXSk7cmV0dXJuIGl9ZnVuY3Rpb24gSSh0LGUscil7Zm9yKHZhciBuPXQuc2xpY2UoZSxyKSxpPSIiLGE9MDthPG4ubGVuZ3RoO2ErPTIpaSs9U3RyaW5nLmZyb21DaGFyQ29kZShuW2FdKzI1NipuW2ErMV0pO3JldHVybiBpfWZ1bmN0aW9uIEQodCxlLHIpe2lmKHQlMSE9MHx8dDwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJvZmZzZXQgaXMgbm90IHVpbnQiKTtpZih0K2U+cil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiVHJ5aW5nIHRvIGFjY2VzcyBiZXlvbmQgYnVmZmVyIGxlbmd0aCIpfWZ1bmN0aW9uIFAodCxlLHIsbixhLG8pe2lmKCFpLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJidWZmZXIiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKTtpZihlPmF8fGU8byl0aHJvdyBuZXcgUmFuZ2VFcnJvcignInZhbHVlIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJyk7aWYocituPnQubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKX1mdW5jdGlvbiBPKHQsZSxyLG4saSxhKXtpZihyK24+dC5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpO2lmKHI8MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW5kZXggb3V0IG9mIHJhbmdlIil9ZnVuY3Rpb24gUih0LGUscixuLGkpe3JldHVybiBlPStlLHI+Pj49MCxpfHxPKHQsZSxyLDQsMy40MDI4MjM0NjYzODUyODg2ZTM4LC0zLjQwMjgyMzQ2NjM4NTI4ODZlMzgpLFcud3JpdGUodCxlLHIsbiwyMyw0KSxyKzR9ZnVuY3Rpb24gRih0LGUscixuLGkpe3JldHVybiBlPStlLHI+Pj49MCxpfHxPKHQsZSxyLDgsMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCwtMS43OTc2OTMxMzQ4NjIzMTU3ZTMwOCksVy53cml0ZSh0LGUscixuLDUyLDgpLHIrOH1mdW5jdGlvbiBqKHQpe2lmKHQ9dC50cmltKCkucmVwbGFjZShLLCIiKSx0Lmxlbmd0aDwyKXJldHVybiIiO2Zvcig7dC5sZW5ndGglNCE9MDspdCs9Ij0iO3JldHVybiB0fWZ1bmN0aW9uIE4odCl7cmV0dXJuIHQ8MTY/IjAiK3QudG9TdHJpbmcoMTYpOnQudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIEIodCxlKXtlPWV8fDEvMDtmb3IodmFyIHIsbj10Lmxlbmd0aCxpPW51bGwsYT1bXSxvPTA7bzxuOysrbyl7aWYoKHI9dC5jaGFyQ29kZUF0KG8pKT41NTI5NSYmcjw1NzM0NCl7aWYoIWkpe2lmKHI+NTYzMTkpeyhlLT0zKT4tMSYmYS5wdXNoKDIzOSwxOTEsMTg5KTtjb250aW51ZX1pZihvKzE9PT1uKXsoZS09Myk+LTEmJmEucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aT1yO2NvbnRpbnVlfWlmKHI8NTYzMjApeyhlLT0zKT4tMSYmYS5wdXNoKDIzOSwxOTEsMTg5KSxpPXI7Y29udGludWV9cj02NTUzNisoaS01NTI5Njw8MTB8ci01NjMyMCl9ZWxzZSBpJiYoZS09Myk+LTEmJmEucHVzaCgyMzksMTkxLDE4OSk7aWYoaT1udWxsLHI8MTI4KXtpZigoZS09MSk8MClicmVhazthLnB1c2gocil9ZWxzZSBpZihyPDIwNDgpe2lmKChlLT0yKTwwKWJyZWFrO2EucHVzaChyPj42fDE5Miw2MyZyfDEyOCl9ZWxzZSBpZihyPDY1NTM2KXtpZigoZS09Myk8MClicmVhazthLnB1c2gocj4+MTJ8MjI0LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX1lbHNle2lmKCEocjwxMTE0MTEyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29kZSBwb2ludCIpO2lmKChlLT00KTwwKWJyZWFrO2EucHVzaChyPj4xOHwyNDAscj4+MTImNjN8MTI4LHI+PjYmNjN8MTI4LDYzJnJ8MTI4KX19cmV0dXJuIGF9ZnVuY3Rpb24gVSh0KXtmb3IodmFyIGU9W10scj0wO3I8dC5sZW5ndGg7KytyKWUucHVzaCgyNTUmdC5jaGFyQ29kZUF0KHIpKTtyZXR1cm4gZX1mdW5jdGlvbiBWKHQsZSl7Zm9yKHZhciByLG4saSxhPVtdLG89MDtvPHQubGVuZ3RoJiYhKChlLT0yKTwwKTsrK28pcj10LmNoYXJDb2RlQXQobyksbj1yPj44LGk9ciUyNTYsYS5wdXNoKGkpLGEucHVzaChuKTtyZXR1cm4gYX1mdW5jdGlvbiBIKHQpe3JldHVybiBYLnRvQnl0ZUFycmF5KGoodCkpfWZ1bmN0aW9uIHEodCxlLHIsbil7Zm9yKHZhciBpPTA7aTxuJiYhKGkrcj49ZS5sZW5ndGh8fGk+PXQubGVuZ3RoKTsrK2kpZVtpK3JdPXRbaV07cmV0dXJuIGl9ZnVuY3Rpb24gRyh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3JiZBcnJheUJ1ZmZlci5pc1ZpZXcodCl9ZnVuY3Rpb24gWSh0KXtyZXR1cm4gdCE9PXR9dmFyIFg9dCgiYmFzZTY0LWpzIiksVz10KCJpZWVlNzU0Iik7ci5CdWZmZXI9aSxyLlNsb3dCdWZmZXI9cCxyLklOU1BFQ1RfTUFYX0JZVEVTPTUwO3ZhciBaPTIxNDc0ODM2NDc7ci5rTWF4TGVuZ3RoPVosaS5UWVBFRF9BUlJBWV9TVVBQT1JUPWZ1bmN0aW9uKCl7dHJ5e3ZhciB0PW5ldyBVaW50OEFycmF5KDEpO3JldHVybiB0Ll9fcHJvdG9fXz17X19wcm90b19fOlVpbnQ4QXJyYXkucHJvdG90eXBlLGZvbzpmdW5jdGlvbigpe3JldHVybiA0Mn19LDQyPT09dC5mb28oKX1jYXRjaCh0KXtyZXR1cm4hMX19KCksaS5UWVBFRF9BUlJBWV9TVVBQT1JUfHwidW5kZWZpbmVkIj09dHlwZW9mIGNvbnNvbGV8fCJmdW5jdGlvbiIhPXR5cGVvZiBjb25zb2xlLmVycm9yfHxjb25zb2xlLmVycm9yKCJUaGlzIGJyb3dzZXIgbGFja3MgdHlwZWQgYXJyYXkgKFVpbnQ4QXJyYXkpIHN1cHBvcnQgd2hpY2ggaXMgcmVxdWlyZWQgYnkgYGJ1ZmZlcmAgdjUueC4gVXNlIGBidWZmZXJgIHY0LnggaWYgeW91IHJlcXVpcmUgb2xkIGJyb3dzZXIgc3VwcG9ydC4iKSwidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnNwZWNpZXMmJmlbU3ltYm9sLnNwZWNpZXNdPT09aSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGksU3ltYm9sLnNwZWNpZXMse3ZhbHVlOm51bGwsY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITF9KSxpLnBvb2xTaXplPTgxOTIsaS5mcm9tPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gYSh0LGUscil9LGkucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxpLl9fcHJvdG9fXz1VaW50OEFycmF5LGkuYWxsb2M9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBzKHQsZSxyKX0saS5hbGxvY1Vuc2FmZT1mdW5jdGlvbih0KXtyZXR1cm4gbCh0KX0saS5hbGxvY1Vuc2FmZVNsb3c9ZnVuY3Rpb24odCl7cmV0dXJuIGwodCl9LGkuaXNCdWZmZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXQmJiEwPT09dC5faXNCdWZmZXJ9LGkuY29tcGFyZT1mdW5jdGlvbih0LGUpe2lmKCFpLmlzQnVmZmVyKHQpfHwhaS5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzIik7aWYodD09PWUpcmV0dXJuIDA7Zm9yKHZhciByPXQubGVuZ3RoLG49ZS5sZW5ndGgsYT0wLG89TWF0aC5taW4ocixuKTthPG87KythKWlmKHRbYV0hPT1lW2FdKXtyPXRbYV0sbj1lW2FdO2JyZWFrfXJldHVybiByPG4/LTE6bjxyPzE6MH0saS5pc0VuY29kaW5nPWZ1bmN0aW9uKHQpe3N3aXRjaChTdHJpbmcodCkudG9Mb3dlckNhc2UoKSl7Y2FzZSJoZXgiOmNhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSJhc2NpaSI6Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpjYXNlImJhc2U2NCI6Y2FzZSJ1Y3MyIjpjYXNlInVjcy0yIjpjYXNlInV0ZjE2bGUiOmNhc2UidXRmLTE2bGUiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fSxpLmNvbmNhdD1mdW5jdGlvbih0LGUpe2lmKCFBcnJheS5pc0FycmF5KHQpKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuIGkuYWxsb2MoMCk7dmFyIHI7aWYodm9pZCAwPT09ZSlmb3IoZT0wLHI9MDtyPHQubGVuZ3RoOysrcillKz10W3JdLmxlbmd0aDt2YXIgbj1pLmFsbG9jVW5zYWZlKGUpLGE9MDtmb3Iocj0wO3I8dC5sZW5ndGg7KytyKXt2YXIgbz10W3JdO2lmKCFpLmlzQnVmZmVyKG8pKXRocm93IG5ldyBUeXBlRXJyb3IoJyJsaXN0IiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKTtvLmNvcHkobixhKSxhKz1vLmxlbmd0aH1yZXR1cm4gbn0saS5ieXRlTGVuZ3RoPW0saS5wcm90b3R5cGUuX2lzQnVmZmVyPSEwLGkucHJvdG90eXBlLnN3YXAxNj1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlMiE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9MilnKHRoaXMsZSxlKzEpO3JldHVybiB0aGlzfSxpLnByb3RvdHlwZS5zd2FwMzI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmxlbmd0aDtpZih0JTQhPTApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkJ1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzIik7Zm9yKHZhciBlPTA7ZTx0O2UrPTQpZyh0aGlzLGUsZSszKSxnKHRoaXMsZSsxLGUrMik7cmV0dXJuIHRoaXN9LGkucHJvdG90eXBlLnN3YXA2ND1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO2lmKHQlOCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMiKTtmb3IodmFyIGU9MDtlPHQ7ZSs9OClnKHRoaXMsZSxlKzcpLGcodGhpcyxlKzEsZSs2KSxnKHRoaXMsZSsyLGUrNSksZyh0aGlzLGUrMyxlKzQpO3JldHVybiB0aGlzfSxpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3ZhciB0PXRoaXMubGVuZ3RoO3JldHVybiAwPT09dD8iIjowPT09YXJndW1lbnRzLmxlbmd0aD9TKHRoaXMsMCx0KTp2LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0saS5wcm90b3R5cGUuZXF1YWxzPWZ1bmN0aW9uKHQpe2lmKCFpLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIiKTtyZXR1cm4gdGhpcz09PXR8fDA9PT1pLmNvbXBhcmUodGhpcyx0KX0saS5wcm90b3R5cGUuaW5zcGVjdD1mdW5jdGlvbigpe3ZhciB0PSIiLGU9ci5JTlNQRUNUX01BWF9CWVRFUztyZXR1cm4gdGhpcy5sZW5ndGg+MCYmKHQ9dGhpcy50b1N0cmluZygiaGV4IiwwLGUpLm1hdGNoKC8uezJ9L2cpLmpvaW4oIiAiKSx0aGlzLmxlbmd0aD5lJiYodCs9IiAuLi4gIikpLCI8QnVmZmVyICIrdCsiPiJ9LGkucHJvdG90eXBlLmNvbXBhcmU9ZnVuY3Rpb24odCxlLHIsbixhKXtpZighaS5pc0J1ZmZlcih0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7aWYodm9pZCAwPT09ZSYmKGU9MCksdm9pZCAwPT09ciYmKHI9dD90Lmxlbmd0aDowKSx2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1hJiYoYT10aGlzLmxlbmd0aCksZTwwfHxyPnQubGVuZ3RofHxuPDB8fGE+dGhpcy5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm91dCBvZiByYW5nZSBpbmRleCIpO2lmKG4+PWEmJmU+PXIpcmV0dXJuIDA7aWYobj49YSlyZXR1cm4tMTtpZihlPj1yKXJldHVybiAxO2lmKGU+Pj49MCxyPj4+PTAsbj4+Pj0wLGE+Pj49MCx0aGlzPT09dClyZXR1cm4gMDtmb3IodmFyIG89YS1uLHM9ci1lLGw9TWF0aC5taW4obyxzKSx1PXRoaXMuc2xpY2UobixhKSxjPXQuc2xpY2UoZSxyKSxoPTA7aDxsOysraClpZih1W2hdIT09Y1toXSl7bz11W2hdLHM9Y1toXTticmVha31yZXR1cm4gbzxzPy0xOnM8bz8xOjB9LGkucHJvdG90eXBlLmluY2x1ZGVzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4tMSE9PXRoaXMuaW5kZXhPZih0LGUscil9LGkucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB5KHRoaXMsdCxlLHIsITApfSxpLnByb3RvdHlwZS5sYXN0SW5kZXhPZj1mdW5jdGlvbih0LGUscil7cmV0dXJuIHkodGhpcyx0LGUsciwhMSl9LGkucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHZvaWQgMD09PWUpbj0idXRmOCIscj10aGlzLmxlbmd0aCxlPTA7ZWxzZSBpZih2b2lkIDA9PT1yJiYic3RyaW5nIj09dHlwZW9mIGUpbj1lLHI9dGhpcy5sZW5ndGgsZT0wO2Vsc2V7aWYoIWlzRmluaXRlKGUpKXRocm93IG5ldyBFcnJvcigiQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQiKTtlPj4+PTAsaXNGaW5pdGUocik/KHI+Pj49MCx2b2lkIDA9PT1uJiYobj0idXRmOCIpKToobj1yLHI9dm9pZCAwKX12YXIgaT10aGlzLmxlbmd0aC1lO2lmKCh2b2lkIDA9PT1yfHxyPmkpJiYocj1pKSx0Lmxlbmd0aD4wJiYocjwwfHxlPDApfHxlPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO258fChuPSJ1dGY4Iik7Zm9yKHZhciBhPSExOzspc3dpdGNoKG4pe2Nhc2UiaGV4IjpyZXR1cm4geCh0aGlzLHQsZSxyKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBfKHRoaXMsdCxlLHIpO2Nhc2UiYXNjaWkiOnJldHVybiB3KHRoaXMsdCxlLHIpO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIE0odGhpcyx0LGUscik7Y2FzZSJiYXNlNjQiOnJldHVybiBrKHRoaXMsdCxlLHIpO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gQSh0aGlzLHQsZSxyKTtkZWZhdWx0OmlmKGEpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKTtuPSgiIituKS50b0xvd2VyQ2FzZSgpLGE9ITB9fSxpLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciBKPTQwOTY7aS5wcm90b3R5cGUuc2xpY2U9ZnVuY3Rpb24odCxlKXt2YXIgcj10aGlzLmxlbmd0aDt0PX5+dCxlPXZvaWQgMD09PWU/cjp+fmUsdDwwPyh0Kz1yKTwwJiYodD0wKTp0PnImJih0PXIpLGU8MD8oZSs9cik8MCYmKGU9MCk6ZT5yJiYoZT1yKSxlPHQmJihlPXQpO3ZhciBuPXRoaXMuc3ViYXJyYXkodCxlKTtyZXR1cm4gbi5fX3Byb3RvX189aS5wcm90b3R5cGUsbn0saS5wcm90b3R5cGUucmVhZFVJbnRMRT1mdW5jdGlvbih0LGUscil7dD4+Pj0wLGU+Pj49MCxyfHxEKHQsZSx0aGlzLmxlbmd0aCk7Zm9yKHZhciBuPXRoaXNbdF0saT0xLGE9MDsrK2E8ZSYmKGkqPTI1Nik7KW4rPXRoaXNbdCthXSppO3JldHVybiBufSxpLnByb3RvdHlwZS5yZWFkVUludEJFPWZ1bmN0aW9uKHQsZSxyKXt0Pj4+PTAsZT4+Pj0wLHJ8fEQodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0Ky0tZV0saT0xO2U+MCYmKGkqPTI1Nik7KW4rPXRoaXNbdCstLWVdKmk7cmV0dXJuIG59LGkucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiB0Pj4+PTAsZXx8RCh0LDEsdGhpcy5sZW5ndGgpLHRoaXNbdF19LGkucHJvdG90eXBlLnJlYWRVSW50MTZMRT1mdW5jdGlvbih0LGUpe3JldHVybiB0Pj4+PTAsZXx8RCh0LDIsdGhpcy5sZW5ndGgpLHRoaXNbdF18dGhpc1t0KzFdPDw4fSxpLnByb3RvdHlwZS5yZWFkVUludDE2QkU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD4+Pj0wLGV8fEQodCwyLHRoaXMubGVuZ3RoKSx0aGlzW3RdPDw4fHRoaXNbdCsxXX0saS5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+Pj49MCxlfHxEKHQsNCx0aGlzLmxlbmd0aCksKHRoaXNbdF18dGhpc1t0KzFdPDw4fHRoaXNbdCsyXTw8MTYpKzE2Nzc3MjE2KnRoaXNbdCszXX0saS5wcm90b3R5cGUucmVhZFVJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+Pj49MCxlfHxEKHQsNCx0aGlzLmxlbmd0aCksMTY3NzcyMTYqdGhpc1t0XSsodGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdKX0saS5wcm90b3R5cGUucmVhZEludExFPWZ1bmN0aW9uKHQsZSxyKXt0Pj4+PTAsZT4+Pj0wLHJ8fEQodCxlLHRoaXMubGVuZ3RoKTtmb3IodmFyIG49dGhpc1t0XSxpPTEsYT0wOysrYTxlJiYoaSo9MjU2KTspbis9dGhpc1t0K2FdKmk7cmV0dXJuIGkqPTEyOCxuPj1pJiYobi09TWF0aC5wb3coMiw4KmUpKSxufSxpLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24odCxlLHIpe3Q+Pj49MCxlPj4+PTAscnx8RCh0LGUsdGhpcy5sZW5ndGgpO2Zvcih2YXIgbj1lLGk9MSxhPXRoaXNbdCstLW5dO24+MCYmKGkqPTI1Nik7KWErPXRoaXNbdCstLW5dKmk7cmV0dXJuIGkqPTEyOCxhPj1pJiYoYS09TWF0aC5wb3coMiw4KmUpKSxhfSxpLnByb3RvdHlwZS5yZWFkSW50OD1mdW5jdGlvbih0LGUpe3JldHVybiB0Pj4+PTAsZXx8RCh0LDEsdGhpcy5sZW5ndGgpLDEyOCZ0aGlzW3RdPy0xKigyNTUtdGhpc1t0XSsxKTp0aGlzW3RdfSxpLnByb3RvdHlwZS5yZWFkSW50MTZMRT1mdW5jdGlvbih0LGUpe3Q+Pj49MCxlfHxEKHQsMix0aGlzLmxlbmd0aCk7dmFyIHI9dGhpc1t0XXx0aGlzW3QrMV08PDg7cmV0dXJuIDMyNzY4JnI/NDI5NDkwMTc2MHxyOnJ9LGkucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKHQsZSl7dD4+Pj0wLGV8fEQodCwyLHRoaXMubGVuZ3RoKTt2YXIgcj10aGlzW3QrMV18dGhpc1t0XTw8ODtyZXR1cm4gMzI3Njgmcj80Mjk0OTAxNzYwfHI6cn0saS5wcm90b3R5cGUucmVhZEludDMyTEU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD4+Pj0wLGV8fEQodCw0LHRoaXMubGVuZ3RoKSx0aGlzW3RdfHRoaXNbdCsxXTw8OHx0aGlzW3QrMl08PDE2fHRoaXNbdCszXTw8MjR9LGkucHJvdG90eXBlLnJlYWRJbnQzMkJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+Pj49MCxlfHxEKHQsNCx0aGlzLmxlbmd0aCksdGhpc1t0XTw8MjR8dGhpc1t0KzFdPDwxNnx0aGlzW3QrMl08PDh8dGhpc1t0KzNdfSxpLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbih0LGUpe3JldHVybiB0Pj4+PTAsZXx8RCh0LDQsdGhpcy5sZW5ndGgpLFcucmVhZCh0aGlzLHQsITAsMjMsNCl9LGkucHJvdG90eXBlLnJlYWRGbG9hdEJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+Pj49MCxlfHxEKHQsNCx0aGlzLmxlbmd0aCksVy5yZWFkKHRoaXMsdCwhMSwyMyw0KX0saS5wcm90b3R5cGUucmVhZERvdWJsZUxFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+Pj49MCxlfHxEKHQsOCx0aGlzLmxlbmd0aCksVy5yZWFkKHRoaXMsdCwhMCw1Miw4KX0saS5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+Pj49MCxlfHxEKHQsOCx0aGlzLmxlbmd0aCksVy5yZWFkKHRoaXMsdCwhMSw1Miw4KX0saS5wcm90b3R5cGUud3JpdGVVSW50TEU9ZnVuY3Rpb24odCxlLHIsbil7aWYodD0rdCxlPj4+PTAscj4+Pj0wLCFuKXtQKHRoaXMsdCxlLHIsTWF0aC5wb3coMiw4KnIpLTEsMCl9dmFyIGk9MSxhPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KythPHImJihpKj0yNTYpOyl0aGlzW2UrYV09dC9pJjI1NTtyZXR1cm4gZStyfSxpLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbih0LGUscixuKXtpZih0PSt0LGU+Pj49MCxyPj4+PTAsIW4pe1AodGhpcyx0LGUscixNYXRoLnBvdygyLDgqciktMSwwKX12YXIgaT1yLTEsYT0xO2Zvcih0aGlzW2UraV09MjU1JnQ7LS1pPj0wJiYoYSo9MjU2KTspdGhpc1tlK2ldPXQvYSYyNTU7cmV0dXJuIGUrcn0saS5wcm90b3R5cGUud3JpdGVVSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZT4+Pj0wLHJ8fFAodGhpcyx0LGUsMSwyNTUsMCksdGhpc1tlXT0yNTUmdCxlKzF9LGkucHJvdG90eXBlLndyaXRlVUludDE2TEU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGU+Pj49MCxyfHxQKHRoaXMsdCxlLDIsNjU1MzUsMCksdGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgsZSsyfSxpLnByb3RvdHlwZS53cml0ZVVJbnQxNkJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlPj4+PTAscnx8UCh0aGlzLHQsZSwyLDY1NTM1LDApLHRoaXNbZV09dD4+PjgsdGhpc1tlKzFdPTI1NSZ0LGUrMn0saS5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZT4+Pj0wLHJ8fFAodGhpcyx0LGUsNCw0Mjk0OTY3Mjk1LDApLHRoaXNbZSszXT10Pj4+MjQsdGhpc1tlKzJdPXQ+Pj4xNix0aGlzW2UrMV09dD4+PjgsdGhpc1tlXT0yNTUmdCxlKzR9LGkucHJvdG90eXBlLndyaXRlVUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGU+Pj49MCxyfHxQKHRoaXMsdCxlLDQsNDI5NDk2NzI5NSwwKSx0aGlzW2VdPXQ+Pj4yNCx0aGlzW2UrMV09dD4+PjE2LHRoaXNbZSsyXT10Pj4+OCx0aGlzW2UrM109MjU1JnQsZSs0fSxpLnByb3RvdHlwZS53cml0ZUludExFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZT4+Pj0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtQKHRoaXMsdCxlLHIsaS0xLC1pKX12YXIgYT0wLG89MSxzPTA7Zm9yKHRoaXNbZV09MjU1JnQ7KythPHImJihvKj0yNTYpOyl0PDAmJjA9PT1zJiYwIT09dGhpc1tlK2EtMV0mJihzPTEpLHRoaXNbZSthXT0odC9vPj4wKS1zJjI1NTtyZXR1cm4gZStyfSxpLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHQ9K3QsZT4+Pj0wLCFuKXt2YXIgaT1NYXRoLnBvdygyLDgqci0xKTtQKHRoaXMsdCxlLHIsaS0xLC1pKX12YXIgYT1yLTEsbz0xLHM9MDtmb3IodGhpc1tlK2FdPTI1NSZ0Oy0tYT49MCYmKG8qPTI1Nik7KXQ8MCYmMD09PXMmJjAhPT10aGlzW2UrYSsxXSYmKHM9MSksdGhpc1tlK2FdPSh0L28+PjApLXMmMjU1O3JldHVybiBlK3J9LGkucHJvdG90eXBlLndyaXRlSW50OD1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZT4+Pj0wLHJ8fFAodGhpcyx0LGUsMSwxMjcsLTEyOCksdDwwJiYodD0yNTUrdCsxKSx0aGlzW2VdPTI1NSZ0LGUrMX0saS5wcm90b3R5cGUud3JpdGVJbnQxNkxFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD0rdCxlPj4+PTAscnx8UCh0aGlzLHQsZSwyLDMyNzY3LC0zMjc2OCksdGhpc1tlXT0yNTUmdCx0aGlzW2UrMV09dD4+PjgsZSsyfSxpLnByb3RvdHlwZS53cml0ZUludDE2QkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGU+Pj49MCxyfHxQKHRoaXMsdCxlLDIsMzI3NjcsLTMyNzY4KSx0aGlzW2VdPXQ+Pj44LHRoaXNbZSsxXT0yNTUmdCxlKzJ9LGkucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9K3QsZT4+Pj0wLHJ8fFAodGhpcyx0LGUsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSx0aGlzW2VdPTI1NSZ0LHRoaXNbZSsxXT10Pj4+OCx0aGlzW2UrMl09dD4+PjE2LHRoaXNbZSszXT10Pj4+MjQsZSs0fSxpLnByb3RvdHlwZS53cml0ZUludDMyQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiB0PSt0LGU+Pj49MCxyfHxQKHRoaXMsdCxlLDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksdDwwJiYodD00Mjk0OTY3Mjk1K3QrMSksdGhpc1tlXT10Pj4+MjQsdGhpc1tlKzFdPXQ+Pj4xNix0aGlzW2UrMl09dD4+PjgsdGhpc1tlKzNdPTI1NSZ0LGUrNH0saS5wcm90b3R5cGUud3JpdGVGbG9hdExFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gUih0aGlzLHQsZSwhMCxyKX0saS5wcm90b3R5cGUud3JpdGVGbG9hdEJFPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gUih0aGlzLHQsZSwhMSxyKX0saS5wcm90b3R5cGUud3JpdGVEb3VibGVMRT1mdW5jdGlvbih0LGUscil7cmV0dXJuIEYodGhpcyx0LGUsITAscil9LGkucHJvdG90eXBlLndyaXRlRG91YmxlQkU9ZnVuY3Rpb24odCxlLHIpe3JldHVybiBGKHRoaXMsdCxlLCExLHIpfSxpLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKHQsZSxyLG4pe2lmKHJ8fChyPTApLG58fDA9PT1ufHwobj10aGlzLmxlbmd0aCksZT49dC5sZW5ndGgmJihlPXQubGVuZ3RoKSxlfHwoZT0wKSxuPjAmJm48ciYmKG49ciksbj09PXIpcmV0dXJuIDA7aWYoMD09PXQubGVuZ3RofHwwPT09dGhpcy5sZW5ndGgpcmV0dXJuIDA7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJ0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwfHxyPj10aGlzLmxlbmd0aCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcyIpO2lmKG48MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigic291cmNlRW5kIG91dCBvZiBib3VuZHMiKTtuPnRoaXMubGVuZ3RoJiYobj10aGlzLmxlbmd0aCksdC5sZW5ndGgtZTxuLXImJihuPXQubGVuZ3RoLWUrcik7dmFyIGksYT1uLXI7aWYodGhpcz09PXQmJnI8ZSYmZTxuKWZvcihpPWEtMTtpPj0wOy0taSl0W2krZV09dGhpc1tpK3JdO2Vsc2UgaWYoYTwxZTMpZm9yKGk9MDtpPGE7KytpKXRbaStlXT10aGlzW2krcl07ZWxzZSBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbCh0LHRoaXMuc3ViYXJyYXkocixyK2EpLGUpO3JldHVybiBhfSxpLnByb3RvdHlwZS5maWxsPWZ1bmN0aW9uKHQsZSxyLG4pe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlPyhuPWUsZT0wLHI9dGhpcy5sZW5ndGgpOiJzdHJpbmciPT10eXBlb2YgciYmKG49cixyPXRoaXMubGVuZ3RoKSwxPT09dC5sZW5ndGgpe3ZhciBhPXQuY2hhckNvZGVBdCgwKTthPDI1NiYmKHQ9YSl9aWYodm9pZCAwIT09biYmInN0cmluZyIhPXR5cGVvZiBuKXRocm93IG5ldyBUeXBlRXJyb3IoImVuY29kaW5nIG11c3QgYmUgYSBzdHJpbmciKTtpZigic3RyaW5nIj09dHlwZW9mIG4mJiFpLmlzRW5jb2RpbmcobikpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIituKX1lbHNlIm51bWJlciI9PXR5cGVvZiB0JiYodCY9MjU1KTtpZihlPDB8fHRoaXMubGVuZ3RoPGV8fHRoaXMubGVuZ3RoPHIpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIk91dCBvZiByYW5nZSBpbmRleCIpO2lmKHI8PWUpcmV0dXJuIHRoaXM7ZT4+Pj0wLHI9dm9pZCAwPT09cj90aGlzLmxlbmd0aDpyPj4+MCx0fHwodD0wKTt2YXIgbztpZigibnVtYmVyIj09dHlwZW9mIHQpZm9yKG89ZTtvPHI7KytvKXRoaXNbb109dDtlbHNle3ZhciBzPWkuaXNCdWZmZXIodCk/dDpuZXcgaSh0LG4pLGw9cy5sZW5ndGg7Zm9yKG89MDtvPHItZTsrK28pdGhpc1tvK2VdPXNbbyVsXX1yZXR1cm4gdGhpc307dmFyIEs9L1teK1wvMC05QS1aYS16LV9dL2d9LHsiYmFzZTY0LWpzIjo3NixpZWVlNzU0OjI4N31dLDc2OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9dC5sZW5ndGg7aWYoZSU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7cmV0dXJuIj0iPT09dFtlLTJdPzI6Ij0iPT09dFtlLTFdPzE6MH1mdW5jdGlvbiBpKHQpe3JldHVybiAzKnQubGVuZ3RoLzQtbih0KX1mdW5jdGlvbiBhKHQpe3ZhciBlLHIsaSxhLG8scyxsPXQubGVuZ3RoO289bih0KSxzPW5ldyBoKDMqbC80LW8pLGk9bz4wP2wtNDpsO3ZhciB1PTA7Zm9yKGU9MCxyPTA7ZTxpO2UrPTQscis9MylhPWNbdC5jaGFyQ29kZUF0KGUpXTw8MTh8Y1t0LmNoYXJDb2RlQXQoZSsxKV08PDEyfGNbdC5jaGFyQ29kZUF0KGUrMildPDw2fGNbdC5jaGFyQ29kZUF0KGUrMyldLHNbdSsrXT1hPj4xNiYyNTUsc1t1KytdPWE+PjgmMjU1LHNbdSsrXT0yNTUmYTtyZXR1cm4gMj09PW8/KGE9Y1t0LmNoYXJDb2RlQXQoZSldPDwyfGNbdC5jaGFyQ29kZUF0KGUrMSldPj40LHNbdSsrXT0yNTUmYSk6MT09PW8mJihhPWNbdC5jaGFyQ29kZUF0KGUpXTw8MTB8Y1t0LmNoYXJDb2RlQXQoZSsxKV08PDR8Y1t0LmNoYXJDb2RlQXQoZSsyKV0+PjIsc1t1KytdPWE+PjgmMjU1LHNbdSsrXT0yNTUmYSksc31mdW5jdGlvbiBvKHQpe3JldHVybiB1W3Q+PjE4JjYzXSt1W3Q+PjEyJjYzXSt1W3Q+PjYmNjNdK3VbNjMmdF19ZnVuY3Rpb24gcyh0LGUscil7Zm9yKHZhciBuLGk9W10sYT1lO2E8cjthKz0zKW49KHRbYV08PDE2KSsodFthKzFdPDw4KSt0W2ErMl0saS5wdXNoKG8obikpO3JldHVybiBpLmpvaW4oIiIpfWZ1bmN0aW9uIGwodCl7Zm9yKHZhciBlLHI9dC5sZW5ndGgsbj1yJTMsaT0iIixhPVtdLG89MCxsPXItbjtvPGw7bys9MTYzODMpYS5wdXNoKHModCxvLG8rMTYzODM+bD9sOm8rMTYzODMpKTtyZXR1cm4gMT09PW4/KGU9dFtyLTFdLGkrPXVbZT4+Ml0saSs9dVtlPDw0JjYzXSxpKz0iPT0iKToyPT09biYmKGU9KHRbci0yXTw8OCkrdFtyLTFdLGkrPXVbZT4+MTBdLGkrPXVbZT4+NCY2M10saSs9dVtlPDwyJjYzXSxpKz0iPSIpLGEucHVzaChpKSxhLmpvaW4oIiIpfXIuYnl0ZUxlbmd0aD1pLHIudG9CeXRlQXJyYXk9YSxyLmZyb21CeXRlQXJyYXk9bDtmb3IodmFyIHU9W10sYz1bXSxoPSJ1bmRlZmluZWQiIT10eXBlb2YgVWludDhBcnJheT9VaW50OEFycmF5OkFycmF5LGY9IkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iLGQ9MCxwPWYubGVuZ3RoO2Q8cDsrK2QpdVtkXT1mW2RdLGNbZi5jaGFyQ29kZUF0KGQpXT1kO2NbIi0iLmNoYXJDb2RlQXQoMCldPTYyLGNbIl8iLmNoYXJDb2RlQXQoMCldPTYzfSx7fV0sNzc6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm5bTWF0aC5taW4odFswXSx0WzFdKSxNYXRoLm1heCh0WzBdLHRbMV0pXX1mdW5jdGlvbiBpKHQsZSl7cmV0dXJuIHRbMF0tZVswXXx8dFsxXS1lWzFdfWZ1bmN0aW9uIGEodCl7cmV0dXJuIHQubWFwKG4pLnNvcnQoaSl9ZnVuY3Rpb24gbyh0LGUscil7cmV0dXJuIGUgaW4gdD90W2VdOnJ9ZnVuY3Rpb24gcyh0LGUscil7QXJyYXkuaXNBcnJheShlKT8ocj1yfHx7fSxlPWV8fFtdKToocj1lfHx7fSxlPVtdKTt2YXIgbj0hIW8ociwiZGVsYXVuYXkiLCEwKSxpPSEhbyhyLCJpbnRlcmlvciIsITApLHM9ISFvKHIsImV4dGVyaW9yIiwhMCksZj0hIW8ociwiaW5maW5pdHkiLCExKTtpZighaSYmIXN8fDA9PT10Lmxlbmd0aClyZXR1cm5bXTt2YXIgZD1sKHQsZSk7aWYobnx8aSE9PXN8fGYpe2Zvcih2YXIgcD11KHQubGVuZ3RoLGEoZSkpLG09MDttPGQubGVuZ3RoOysrbSl7dmFyIHY9ZFttXTtwLmFkZFRyaWFuZ2xlKHZbMF0sdlsxXSx2WzJdKX1yZXR1cm4gbiYmYyh0LHApLHM/aT9mP2gocCwwLGYpOnAuY2VsbHMoKTpoKHAsMSxmKTpoKHAsLTEpfXJldHVybiBkfXZhciBsPXQoIi4vbGliL21vbm90b25lIiksdT10KCIuL2xpYi90cmlhbmd1bGF0aW9uIiksYz10KCIuL2xpYi9kZWxhdW5heSIpLGg9dCgiLi9saWIvZmlsdGVyIik7ZS5leHBvcnRzPXN9LHsiLi9saWIvZGVsYXVuYXkiOjc4LCIuL2xpYi9maWx0ZXIiOjc5LCIuL2xpYi9tb25vdG9uZSI6ODAsIi4vbGliL3RyaWFuZ3VsYXRpb24iOjgxfV0sNzg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGksbyl7dmFyIHM9ZS5vcHBvc2l0ZShuLGkpO2lmKCEoczwwKSl7aWYoaTxuKXt2YXIgbD1uO249aSxpPWwsbD1vLG89cyxzPWx9ZS5pc0NvbnN0cmFpbnQobixpKXx8YSh0W25dLHRbaV0sdFtvXSx0W3NdKTwwJiZyLnB1c2gobixpKX19ZnVuY3Rpb24gaSh0LGUpe2Zvcih2YXIgcj1bXSxpPXQubGVuZ3RoLG89ZS5zdGFycyxzPTA7czxpOysrcylmb3IodmFyIGw9b1tzXSx1PTE7dTxsLmxlbmd0aDt1Kz0yKXt2YXIgYz1sW3VdO2lmKCEoYzxzKSYmIWUuaXNDb25zdHJhaW50KHMsYykpe2Zvcih2YXIgaD1sW3UtMV0sZj0tMSxkPTE7ZDxsLmxlbmd0aDtkKz0yKWlmKGxbZC0xXT09PWMpe2Y9bFtkXTticmVha31mPDB8fGEodFtzXSx0W2NdLHRbaF0sdFtmXSk8MCYmci5wdXNoKHMsYyl9fWZvcig7ci5sZW5ndGg+MDspe2Zvcih2YXIgYz1yLnBvcCgpLHM9ci5wb3AoKSxoPS0xLGY9LTEsbD1vW3NdLHA9MTtwPGwubGVuZ3RoO3ArPTIpe3ZhciBtPWxbcC0xXSx2PWxbcF07bT09PWM/Zj12OnY9PT1jJiYoaD1tKX1oPDB8fGY8MHx8KGEodFtzXSx0W2NdLHRbaF0sdFtmXSk+PTB8fChlLmZsaXAocyxjKSxuKHQsZSxyLGgscyxmKSxuKHQsZSxyLHMsZixoKSxuKHQsZSxyLGYsYyxoKSxuKHQsZSxyLGMsaCxmKSkpfX12YXIgYT10KCJyb2J1c3QtaW4tc3BoZXJlIilbNF07dCgiYmluYXJ5LXNlYXJjaC1ib3VuZHMiKTtlLmV4cG9ydHM9aX0seyJiaW5hcnktc2VhcmNoLWJvdW5kcyI6ODIsInJvYnVzdC1pbi1zcGhlcmUiOjUwNH1dLDc5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbixpLGEsbyl7dGhpcy5jZWxscz10LHRoaXMubmVpZ2hib3I9ZSx0aGlzLmZsYWdzPW4sdGhpcy5jb25zdHJhaW50PXIsdGhpcy5hY3RpdmU9aSx0aGlzLm5leHQ9YSx0aGlzLmJvdW5kYXJ5PW99ZnVuY3Rpb24gaSh0LGUpe3JldHVybiB0WzBdLWVbMF18fHRbMV0tZVsxXXx8dFsyXS1lWzJdfWZ1bmN0aW9uIGEodCxlKXtmb3IodmFyIHI9dC5jZWxscygpLGE9ci5sZW5ndGgsbz0wO288YTsrK28pe3ZhciBzPXJbb10sbD1zWzBdLHU9c1sxXSxjPXNbMl07dTxjP3U8bCYmKHNbMF09dSxzWzFdPWMsc1syXT1sKTpjPGwmJihzWzBdPWMsc1sxXT1sLHNbMl09dSl9ci5zb3J0KGkpO2Zvcih2YXIgaD1uZXcgQXJyYXkoYSksbz0wO288aC5sZW5ndGg7KytvKWhbb109MDt2YXIgZj1bXSxkPVtdLHA9bmV3IEFycmF5KDMqYSksbT1uZXcgQXJyYXkoMyphKSx2PW51bGw7ZSYmKHY9W10pO2Zvcih2YXIgZz1uZXcgbihyLHAsbSxoLGYsZCx2KSxvPTA7bzxhOysrbylmb3IodmFyIHM9cltvXSx5PTA7eTwzOysreSl7dmFyIGw9c1t5XSx1PXNbKHkrMSklM10sYj1wWzMqbyt5XT1nLmxvY2F0ZSh1LGwsdC5vcHBvc2l0ZSh1LGwpKSx4PW1bMypvK3ldPXQuaXNDb25zdHJhaW50KGwsdSk7YjwwJiYoeD9kLnB1c2gobyk6KGYucHVzaChvKSxoW29dPTEpLGUmJnYucHVzaChbdSxsLC0xXSkpfXJldHVybiBnfWZ1bmN0aW9uIG8odCxlLHIpe2Zvcih2YXIgbj0wLGk9MDtpPHQubGVuZ3RoOysraSllW2ldPT09ciYmKHRbbisrXT10W2ldKTtyZXR1cm4gdC5sZW5ndGg9bix0fWZ1bmN0aW9uIHModCxlLHIpe3ZhciBuPWEodCxyKTtpZigwPT09ZSlyZXR1cm4gcj9uLmNlbGxzLmNvbmNhdChuLmJvdW5kYXJ5KTpuLmNlbGxzO2Zvcih2YXIgaT0xLHM9bi5hY3RpdmUsbD1uLm5leHQsdT1uLmZsYWdzLGM9bi5jZWxscyxoPW4uY29uc3RyYWludCxmPW4ubmVpZ2hib3I7cy5sZW5ndGg+MHx8bC5sZW5ndGg+MDspe2Zvcig7cy5sZW5ndGg+MDspe3ZhciBkPXMucG9wKCk7aWYodVtkXSE9PS1pKXt1W2RdPWk7Zm9yKHZhciBwPShjW2RdLDApO3A8MzsrK3Ape3ZhciBtPWZbMypkK3BdO20+PTAmJjA9PT11W21dJiYoaFszKmQrcF0/bC5wdXNoKG0pOihzLnB1c2gobSksdVttXT1pKSl9fX12YXIgdj1sO2w9cyxzPXYsbC5sZW5ndGg9MCxpPS1pfXZhciBnPW8oYyx1LGUpO3JldHVybiByP2cuY29uY2F0KG4uYm91bmRhcnkpOmd9dmFyIGw9dCgiYmluYXJ5LXNlYXJjaC1ib3VuZHMiKTtlLmV4cG9ydHM9cyxuLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24oKXt2YXIgdD1bMCwwLDBdO3JldHVybiBmdW5jdGlvbihlLHIsbil7dmFyIGE9ZSxvPXIscz1uO3JldHVybiByPG4/cjxlJiYoYT1yLG89bixzPWUpOm48ZSYmKGE9bixvPWUscz1yKSxhPDA/LTE6KHRbMF09YSx0WzFdPW8sdFsyXT1zLGwuZXEodGhpcy5jZWxscyx0LGkpKX19KCl9LHsiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjgyfV0sODA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGkpe3RoaXMuYT10LHRoaXMuYj1lLHRoaXMuaWR4PXIsdGhpcy5sb3dlcklkcz1uLHRoaXMudXBwZXJJZHM9aX1mdW5jdGlvbiBpKHQsZSxyLG4pe3RoaXMuYT10LHRoaXMuYj1lLHRoaXMudHlwZT1yLHRoaXMuaWR4PW59ZnVuY3Rpb24gYSh0LGUpe3ZhciByPXQuYVswXS1lLmFbMF18fHQuYVsxXS1lLmFbMV18fHQudHlwZS1lLnR5cGU7cmV0dXJuIHJ8fCh0LnR5cGUhPT1wJiYocj1kKHQuYSx0LmIsZS5iKSk/cjp0LmlkeC1lLmlkeCl9ZnVuY3Rpb24gbyh0LGUpe3JldHVybiBkKHQuYSx0LmIsZSl9ZnVuY3Rpb24gcyh0LGUscixuLGkpe2Zvcih2YXIgYT1mLmx0KGUsbixvKSxzPWYuZ3QoZSxuLG8pLGw9YTtsPHM7KytsKXtmb3IodmFyIHU9ZVtsXSxjPXUubG93ZXJJZHMsaD1jLmxlbmd0aDtoPjEmJmQocltjW2gtMl1dLHJbY1toLTFdXSxuKT4wOyl0LnB1c2goW2NbaC0xXSxjW2gtMl0saV0pLGgtPTE7Yy5sZW5ndGg9aCxjLnB1c2goaSk7Zm9yKHZhciBwPXUudXBwZXJJZHMsaD1wLmxlbmd0aDtoPjEmJmQocltwW2gtMl1dLHJbcFtoLTFdXSxuKTwwOyl0LnB1c2goW3BbaC0yXSxwW2gtMV0saV0pLGgtPTE7cC5sZW5ndGg9aCxwLnB1c2goaSl9fWZ1bmN0aW9uIGwodCxlKXt2YXIgcjtyZXR1cm4ocj10LmFbMF08ZS5hWzBdP2QodC5hLHQuYixlLmEpOmQoZS5iLGUuYSx0LmEpKT9yOihyPWUuYlswXTx0LmJbMF0/ZCh0LmEsdC5iLGUuYik6ZChlLmIsZS5hLHQuYikpfHx0LmlkeC1lLmlkeH1mdW5jdGlvbiB1KHQsZSxyKXt2YXIgaT1mLmxlKHQscixsKSxhPXRbaV0sbz1hLnVwcGVySWRzLHM9b1tvLmxlbmd0aC0xXTthLnVwcGVySWRzPVtzXSx0LnNwbGljZShpKzEsMCxuZXcgbihyLmEsci5iLHIuaWR4LFtzXSxvKSl9ZnVuY3Rpb24gYyh0LGUscil7dmFyIG49ci5hO3IuYT1yLmIsci5iPW47dmFyIGk9Zi5lcSh0LHIsbCksYT10W2ldO3RbaS0xXS51cHBlcklkcz1hLnVwcGVySWRzLHQuc3BsaWNlKGksMSl9ZnVuY3Rpb24gaCh0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aCxvPWUubGVuZ3RoLGw9W10saD0wO2g8cjsrK2gpbC5wdXNoKG5ldyBpKHRbaF0sbnVsbCxwLGgpKTtmb3IodmFyIGg9MDtoPG87KytoKXt2YXIgZj1lW2hdLGQ9dFtmWzBdXSxnPXRbZlsxXV07ZFswXTxnWzBdP2wucHVzaChuZXcgaShkLGcsdixoKSxuZXcgaShnLGQsbSxoKSk6ZFswXT5nWzBdJiZsLnB1c2gobmV3IGkoZyxkLHYsaCksbmV3IGkoZCxnLG0saCkpfWwuc29ydChhKTtmb3IodmFyIHk9bFswXS5hWzBdLSgxK01hdGguYWJzKGxbMF0uYVswXSkpKk1hdGgucG93KDIsLTUyKSxiPVtuZXcgbihbeSwxXSxbeSwwXSwtMSxbXSxbXSxbXSxbXSldLHg9W10saD0wLF89bC5sZW5ndGg7aDxfOysraCl7dmFyIHc9bFtoXSxNPXcudHlwZTtNPT09cD9zKHgsYix0LHcuYSx3LmlkeCk6TT09PXY/dShiLHQsdyk6YyhiLHQsdyl9cmV0dXJuIHh9dmFyIGY9dCgiYmluYXJ5LXNlYXJjaC1ib3VuZHMiKSxkPXQoInJvYnVzdC1vcmllbnRhdGlvbiIpWzNdLHA9MCxtPTEsdj0yO2UuZXhwb3J0cz1ofSx7ImJpbmFyeS1zZWFyY2gtYm91bmRzIjo4Miwicm9idXN0LW9yaWVudGF0aW9uIjo1MDZ9XSw4MTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dGhpcy5zdGFycz10LHRoaXMuZWRnZXM9ZX1mdW5jdGlvbiBpKHQsZSxyKXtmb3IodmFyIG49MSxpPXQubGVuZ3RoO248aTtuKz0yKWlmKHRbbi0xXT09PWUmJnRbbl09PT1yKXJldHVybiB0W24tMV09dFtpLTJdLHRbbl09dFtpLTFdLHZvaWQodC5sZW5ndGg9aS0yKX1mdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciByPW5ldyBBcnJheSh0KSxpPTA7aTx0OysraSlyW2ldPVtdO3JldHVybiBuZXcgbihyLGUpfXZhciBvPXQoImJpbmFyeS1zZWFyY2gtYm91bmRzIik7ZS5leHBvcnRzPWE7dmFyIHM9bi5wcm90b3R5cGU7cy5pc0NvbnN0cmFpbnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7cmV0dXJuIHRbMF0tZVswXXx8dFsxXS1lWzFdfXZhciBlPVswLDBdO3JldHVybiBmdW5jdGlvbihyLG4pe3JldHVybiBlWzBdPU1hdGgubWluKHIsbiksZVsxXT1NYXRoLm1heChyLG4pLG8uZXEodGhpcy5lZGdlcyxlLHQpPj0wfX0oKSxzLnJlbW92ZVRyaWFuZ2xlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLnN0YXJzO2koblt0XSxlLHIpLGkobltlXSxyLHQpLGkobltyXSx0LGUpfSxzLmFkZFRyaWFuZ2xlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLnN0YXJzO25bdF0ucHVzaChlLHIpLG5bZV0ucHVzaChyLHQpLG5bcl0ucHVzaCh0LGUpfSxzLm9wcG9zaXRlPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXRoaXMuc3RhcnNbZV0sbj0xLGk9ci5sZW5ndGg7bjxpO24rPTIpaWYocltuXT09PXQpcmV0dXJuIHJbbi0xXTtyZXR1cm4tMX0scy5mbGlwPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5vcHBvc2l0ZSh0LGUpLG49dGhpcy5vcHBvc2l0ZShlLHQpO3RoaXMucmVtb3ZlVHJpYW5nbGUodCxlLHIpLHRoaXMucmVtb3ZlVHJpYW5nbGUoZSx0LG4pLHRoaXMuYWRkVHJpYW5nbGUodCxuLHIpLHRoaXMuYWRkVHJpYW5nbGUoZSxyLG4pfSxzLmVkZ2VzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuc3RhcnMsZT1bXSxyPTAsbj10Lmxlbmd0aDtyPG47KytyKWZvcih2YXIgaT10W3JdLGE9MCxvPWkubGVuZ3RoO2E8bzthKz0yKWUucHVzaChbaVthXSxpW2ErMV1dKTtyZXR1cm4gZX0scy5jZWxscz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnN0YXJzLGU9W10scj0wLG49dC5sZW5ndGg7cjxuOysrcilmb3IodmFyIGk9dFtyXSxhPTAsbz1pLmxlbmd0aDthPG87YSs9Mil7dmFyIHM9aVthXSxsPWlbYSsxXTtyPE1hdGgubWluKHMsbCkmJmUucHVzaChbcixzLGxdKX1yZXR1cm4gZX19LHsiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjgyfV0sODI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGkpe3ZhciBhPVsiZnVuY3Rpb24gIix0LCIoYSxsLGgsIixuLmpvaW4oIiwiKSwiKXsiLGk/IiI6InZhciBpPSIscj8ibC0xIjoiaCsxIiwiO3doaWxlKGw8PWgpe3ZhciBtPShsK2gpPj4+MSx4PWFbbV0iXTtyZXR1cm4gaT9lLmluZGV4T2YoImMiKTwwP2EucHVzaCgiO2lmKHg9PT15KXtyZXR1cm4gbX1lbHNlIGlmKHg8PXkpeyIpOmEucHVzaCgiO3ZhciBwPWMoeCx5KTtpZihwPT09MCl7cmV0dXJuIG19ZWxzZSBpZihwPD0wKXsiKTphLnB1c2goIjtpZigiLGUsIil7aT1tOyIpLHI/YS5wdXNoKCJsPW0rMX1lbHNle2g9bS0xfSIpOmEucHVzaCgiaD1tLTF9ZWxzZXtsPW0rMX0iKSxhLnB1c2goIn0iKSxpP2EucHVzaCgicmV0dXJuIC0xfTsiKTphLnB1c2goInJldHVybiBpfTsiKSxhLmpvaW4oIiIpfWZ1bmN0aW9uIGkodCxlLHIsaSl7cmV0dXJuIG5ldyBGdW5jdGlvbihbbigiQSIsIngiK3QrInkiLGUsWyJ5Il0saSksbigiUCIsImMoeCx5KSIrdCsiMCIsZSxbInkiLCJjIl0saSksImZ1bmN0aW9uIGRpc3BhdGNoQnNlYXJjaCIsciwiKGEseSxjLGwsaCl7aWYodHlwZW9mKGMpPT09J2Z1bmN0aW9uJyl7cmV0dXJuIFAoYSwobD09PXZvaWQgMCk/MDpsfDAsKGg9PT12b2lkIDApP2EubGVuZ3RoLTE6aHwwLHksYyl9ZWxzZXtyZXR1cm4gQShhLChjPT09dm9pZCAwKT8wOmN8MCwobD09PXZvaWQgMCk/YS5sZW5ndGgtMTpsfDAseSl9fXJldHVybiBkaXNwYXRjaEJzZWFyY2giLHJdLmpvaW4oIiIpKSgpfWUuZXhwb3J0cz17Z2U6aSgiPj0iLCExLCJHRSIpLGd0OmkoIj4iLCExLCJHVCIpLGx0OmkoIjwiLCEwLCJMVCIpLGxlOmkoIjw9IiwhMCwiTEUiKSxlcTppKCItIiwhMCwiRVEiLCEwKX19LHt9XSw4MzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgZT0xLHI9MTtyPHQubGVuZ3RoOysrcilmb3IodmFyIG49MDtuPHI7KytuKWlmKHRbcl08dFtuXSllPS1lO2Vsc2UgaWYodFtuXT09PXRbcl0pcmV0dXJuIDA7cmV0dXJuIGV9ZS5leHBvcnRzPW59LHt9XSw4NDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aCxpPTA7aTxuOysraSlyKz10W2ldKmVbaV07cmV0dXJuIHJ9ZnVuY3Rpb24gaSh0KXt2YXIgZT10Lmxlbmd0aDtpZigwPT09ZSlyZXR1cm5bXTt2YXIgcj0odFswXS5sZW5ndGgsbyhbdC5sZW5ndGgrMSx0Lmxlbmd0aCsxXSwxKSksaT1vKFt0Lmxlbmd0aCsxXSwxKTtyW2VdW2VdPTA7Zm9yKHZhciBhPTA7YTxlOysrYSl7Zm9yKHZhciBsPTA7bDw9YTsrK2wpcltsXVthXT1yW2FdW2xdPTIqbih0W2FdLHRbbF0pO2lbYV09bih0W2FdLHRbYV0pfWZvcih2YXIgdT1zKHIsaSksYz0wLGg9dVtlKzFdLGE9MDthPGgubGVuZ3RoOysrYSljKz1oW2FdO2Zvcih2YXIgZj1uZXcgQXJyYXkoZSksYT0wO2E8ZTsrK2Epe2Zvcih2YXIgaD11W2FdLGQ9MCxsPTA7bDxoLmxlbmd0aDsrK2wpZCs9aFtsXTtmW2FdPWQvY31yZXR1cm4gZn1mdW5jdGlvbiBhKHQpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm5bXTtmb3IodmFyIGU9dFswXS5sZW5ndGgscj1vKFtlXSksbj1pKHQpLGE9MDthPHQubGVuZ3RoOysrYSlmb3IodmFyIHM9MDtzPGU7KytzKXJbc10rPXRbYV1bc10qblthXTtyZXR1cm4gcn12YXIgbz10KCJkdXAiKSxzPXQoInJvYnVzdC1saW5lYXItc29sdmUiKTthLmJhcnljZW5ldHJpYz1pLGUuZXhwb3J0cz1hfSx7ZHVwOjEyMywicm9idXN0LWxpbmVhci1zb2x2ZSI6NTA1fV0sODU6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgZT1pKHQpLHI9MCxuPTA7bjx0Lmxlbmd0aDsrK24pZm9yKHZhciBhPXRbbl0sbz0wO288ZS5sZW5ndGg7KytvKXIrPU1hdGgucG93KGFbb10tZVtvXSwyKTtyZXR1cm4gTWF0aC5zcXJ0KHIvdC5sZW5ndGgpfWUuZXhwb3J0cz1uO3ZhciBpPXQoImNpcmN1bWNlbnRlciIpfSx7Y2lyY3VtY2VudGVyOjg0fV0sODY6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXtyZXR1cm4gZTxyP3Q8ZT9lOnQ+cj9yOnQ6dDxyP3I6dD5lP2U6dH1lLmV4cG9ydHM9bn0se31dLDg3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9Xyh0KTtyZXR1cm5bTShlLC0xLzApLE0oZSwxLzApXX1mdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciByPW5ldyBBcnJheShlLmxlbmd0aCksbj0wO248ZS5sZW5ndGg7KytuKXt2YXIgaT1lW25dLGE9dFtpWzBdXSxvPXRbaVsxXV07cltuXT1bTShNYXRoLm1pbihhWzBdLG9bMF0pLC0xLzApLE0oTWF0aC5taW4oYVsxXSxvWzFdKSwtMS8wKSxNKE1hdGgubWF4KGFbMF0sb1swXSksMS8wKSxNKE1hdGgubWF4KGFbMV0sb1sxXSksMS8wKV19cmV0dXJuIHJ9ZnVuY3Rpb24gYSh0KXtmb3IodmFyIGU9bmV3IEFycmF5KHQubGVuZ3RoKSxyPTA7cjx0Lmxlbmd0aDsrK3Ipe3ZhciBuPXRbcl07ZVtyXT1bTShuWzBdLC0xLzApLE0oblsxXSwtMS8wKSxNKG5bMF0sMS8wKSxNKG5bMV0sMS8wKV19cmV0dXJuIGV9ZnVuY3Rpb24gbyh0LGUscil7dmFyIG49W107cmV0dXJuIGcocixmdW5jdGlvbihyLGkpe3ZhciBhPWVbcl0sbz1lW2ldO2lmKGFbMF0hPT1vWzBdJiZhWzBdIT09b1sxXSYmYVsxXSE9PW9bMF0mJmFbMV0hPT1vWzFdKXt2YXIgcz10W2FbMF1dLGw9dFthWzFdXSx1PXRbb1swXV0sYz10W29bMV1dO3kocyxsLHUsYykmJm4ucHVzaChbcixpXSl9fSksbn1mdW5jdGlvbiBzKHQsZSxyLG4pe3ZhciBpPVtdO3JldHVybiBnKHIsbixmdW5jdGlvbihyLG4pe3ZhciBhPWVbcl07aWYoYVswXSE9PW4mJmFbMV0hPT1uKXt2YXIgbz10W25dLHM9dFthWzBdXSxsPXRbYVsxXV07eShzLGwsbyxvKSYmaS5wdXNoKFtyLG5dKX19KSxpfWZ1bmN0aW9uIGwodCxlLHIsbixpKXt2YXIgYSxvLHM9dC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW2IodFswXSksYih0WzFdKV19KTtmb3IoYT0wO2E8ci5sZW5ndGg7KythKXt2YXIgbD1yW2FdO289bFswXTt2YXIgdT1sWzFdLGM9ZVtvXSxoPWVbdV0sZj1rKHcodFtjWzBdXSksdyh0W2NbMV1dKSx3KHRbaFswXV0pLHcodFtoWzFdXSkpO2lmKGYpe3ZhciBkPXQubGVuZ3RoO3QucHVzaChbXyhmWzBdKSxfKGZbMV0pXSkscy5wdXNoKGYpLG4ucHVzaChbbyxkXSxbdSxkXSl9fWZvcihuLnNvcnQoZnVuY3Rpb24odCxlKXtpZih0WzBdIT09ZVswXSlyZXR1cm4gdFswXS1lWzBdO3ZhciByPXNbdFsxXV0sbj1zW2VbMV1dO3JldHVybiB4KHJbMF0sblswXSl8fHgoclsxXSxuWzFdKX0pLGE9bi5sZW5ndGgtMTthPj0wOy0tYSl7dmFyIHA9blthXTtvPXBbMF07dmFyIG09ZVtvXSx2PW1bMF0sZz1tWzFdLHk9dFt2XSxNPXRbZ107aWYoKHlbMF0tTVswXXx8eVsxXS1NWzFdKTwwKXt2YXIgQT12O3Y9ZyxnPUF9bVswXT12O3ZhciBULFM9bVsxXT1wWzFdO2ZvcihpJiYoVD1tWzJdKTthPjAmJm5bYS0xXVswXT09PW87KXt2YXIgcD1uWy0tYV0sRT1wWzFdO2k/ZS5wdXNoKFtTLEUsVF0pOmUucHVzaChbUyxFXSksUz1FfWk/ZS5wdXNoKFtTLGcsVF0pOmUucHVzaChbUyxnXSl9cmV0dXJuIHN9ZnVuY3Rpb24gdSh0LGUscil7Zm9yKHZhciBpPWUubGVuZ3RoLGE9bmV3IHYoaSksbz1bXSxzPTA7czxlLmxlbmd0aDsrK3Mpe3ZhciBsPWVbc10sdT1uKGxbMF0pLGM9bihsWzFdKTtvLnB1c2goW00odVswXSwtMS8wKSxNKGNbMF0sLTEvMCksTSh1WzFdLDEvMCksTShjWzFdLDEvMCldKX1nKG8sZnVuY3Rpb24odCxlKXthLmxpbmsodCxlKX0pO2Zvcih2YXIgaD0hMCxmPW5ldyBBcnJheShpKSxzPTA7czxpOysrcyl7dmFyIGQ9YS5maW5kKHMpO2QhPT1zJiYoaD0hMSx0W2RdPVtNYXRoLm1pbih0W3NdWzBdLHRbZF1bMF0pLE1hdGgubWluKHRbc11bMV0sdFtkXVsxXSldKX1pZihoKXJldHVybiBudWxsO2Zvcih2YXIgcD0wLHM9MDtzPGk7KytzKXt2YXIgZD1hLmZpbmQocyk7ZD09PXM/KGZbc109cCx0W3ArK109dFtzXSk6ZltzXT0tMX10Lmxlbmd0aD1wO2Zvcih2YXIgcz0wO3M8aTsrK3MpZltzXTwwJiYoZltzXT1mW2EuZmluZChzKV0pO3JldHVybiBmfWZ1bmN0aW9uIGModCxlKXtyZXR1cm4gdFswXS1lWzBdfHx0WzFdLWVbMV19ZnVuY3Rpb24gaCh0LGUpe3ZhciByPXRbMF0tZVswXXx8dFsxXS1lWzFdO3JldHVybiByfHwodFsyXTxlWzJdPy0xOnRbMl0+ZVsyXT8xOjApfWZ1bmN0aW9uIGYodCxlLHIpe2lmKDAhPT10Lmxlbmd0aCl7aWYoZSlmb3IodmFyIG49MDtuPHQubGVuZ3RoOysrbil7dmFyIGk9dFtuXSxhPWVbaVswXV0sbz1lW2lbMV1dO2lbMF09TWF0aC5taW4oYSxvKSxpWzFdPU1hdGgubWF4KGEsbyl9ZWxzZSBmb3IodmFyIG49MDtuPHQubGVuZ3RoOysrbil7dmFyIGk9dFtuXSxhPWlbMF0sbz1pWzFdO2lbMF09TWF0aC5taW4oYSxvKSxpWzFdPU1hdGgubWF4KGEsbyl9cj90LnNvcnQoaCk6dC5zb3J0KGMpO2Zvcih2YXIgcz0xLG49MTtuPHQubGVuZ3RoOysrbil7CnZhciBsPXRbbi0xXSx1PXRbbl07KHVbMF0hPT1sWzBdfHx1WzFdIT09bFsxXXx8ciYmdVsyXSE9PWxbMl0pJiYodFtzKytdPXUpfXQubGVuZ3RoPXN9fWZ1bmN0aW9uIGQodCxlLHIpe3ZhciBuPXUodCxbXSxhKHQpKTtyZXR1cm4gZihlLG4sciksISFufWZ1bmN0aW9uIHAodCxlLHIpe3ZhciBuPWkodCxlKSxjPW8odCxlLG4pLGg9YSh0KSxkPXModCxlLG4saCkscD1sKHQsZSxjLGQsciksbT11KHQscCxoKTtyZXR1cm4gZihlLG0sciksISFtfHwoYy5sZW5ndGg+MHx8ZC5sZW5ndGg+MCl9ZnVuY3Rpb24gbSh0LGUscil7dmFyIG47aWYocil7bj1lO2Zvcih2YXIgaT1uZXcgQXJyYXkoZS5sZW5ndGgpLGE9MDthPGUubGVuZ3RoOysrYSl7dmFyIG89ZVthXTtpW2FdPVtvWzBdLG9bMV0sclthXV19ZT1pfWZvcih2YXIgcz1kKHQsZSwhIXIpO3AodCxlLCEhcik7KXM9ITA7aWYociYmcyl7bi5sZW5ndGg9MCxyLmxlbmd0aD0wO2Zvcih2YXIgYT0wO2E8ZS5sZW5ndGg7KythKXt2YXIgbz1lW2FdO24ucHVzaChbb1swXSxvWzFdXSksci5wdXNoKG9bMl0pfX1yZXR1cm4gc31lLmV4cG9ydHM9bTt2YXIgdj10KCJ1bmlvbi1maW5kIiksZz10KCJib3gtaW50ZXJzZWN0IikseT10KCJyb2J1c3Qtc2VnbWVudC1pbnRlcnNlY3QiKSxiPXQoImJpZy1yYXQiKSx4PXQoImJpZy1yYXQvY21wIiksXz10KCJiaWctcmF0L3RvLWZsb2F0Iiksdz10KCJyYXQtdmVjIiksTT10KCJuZXh0YWZ0ZXIiKSxrPXQoIi4vbGliL3JhdC1zZWctaW50ZXJzZWN0Iil9LHsiLi9saWIvcmF0LXNlZy1pbnRlcnNlY3QiOjg4LCJiaWctcmF0Ijo1MSwiYmlnLXJhdC9jbXAiOjQ5LCJiaWctcmF0L3RvLWZsb2F0Ijo2MywiYm94LWludGVyc2VjdCI6NjgsbmV4dGFmdGVyOjQ2NiwicmF0LXZlYyI6NDkzLCJyb2J1c3Qtc2VnbWVudC1pbnRlcnNlY3QiOjUwOSwidW5pb24tZmluZCI6NTQwfV0sODg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3JldHVybiBzKGEodFswXSxlWzFdKSxhKHRbMV0sZVswXSkpfWZ1bmN0aW9uIGkodCxlLHIsaSl7dmFyIGE9dShlLHQpLHM9dShpLHIpLGY9bihhLHMpO2lmKDA9PT1sKGYpKXJldHVybiBudWxsO3ZhciBkPXUodCxyKSxwPW4ocyxkKSxtPW8ocCxmKSx2PWgoYSxtKTtyZXR1cm4gYyh0LHYpfWUuZXhwb3J0cz1pO3ZhciBhPXQoImJpZy1yYXQvbXVsIiksbz10KCJiaWctcmF0L2RpdiIpLHM9dCgiYmlnLXJhdC9zdWIiKSxsPXQoImJpZy1yYXQvc2lnbiIpLHU9dCgicmF0LXZlYy9zdWIiKSxjPXQoInJhdC12ZWMvYWRkIiksaD10KCJyYXQtdmVjL211bHMiKX0seyJiaWctcmF0L2RpdiI6NTAsImJpZy1yYXQvbXVsIjo2MCwiYmlnLXJhdC9zaWduIjo2MSwiYmlnLXJhdC9zdWIiOjYyLCJyYXQtdmVjL2FkZCI6NDkyLCJyYXQtdmVjL211bHMiOjQ5NCwicmF0LXZlYy9zdWIiOjQ5NX1dLDg5OltmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHQpe3ZhciByPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGUocixuLGksYSl7ZnVuY3Rpb24gcyhyLGkpe2lmKG51bGw9PT1yKXJldHVybiBudWxsO2lmKDA9PWkpcmV0dXJuIHI7dmFyIGgsZjtpZigib2JqZWN0IiE9dHlwZW9mIHIpcmV0dXJuIHI7aWYoZS5fX2lzQXJyYXkocikpaD1bXTtlbHNlIGlmKGUuX19pc1JlZ0V4cChyKSloPW5ldyBSZWdFeHAoci5zb3VyY2UsbyhyKSksci5sYXN0SW5kZXgmJihoLmxhc3RJbmRleD1yLmxhc3RJbmRleCk7ZWxzZSBpZihlLl9faXNEYXRlKHIpKWg9bmV3IERhdGUoci5nZXRUaW1lKCkpO2Vsc2V7aWYoYyYmdC5pc0J1ZmZlcihyKSlyZXR1cm4gaD1uZXcgdChyLmxlbmd0aCksci5jb3B5KGgpLGg7dm9pZCAwPT09YT8oZj1PYmplY3QuZ2V0UHJvdG90eXBlT2YociksaD1PYmplY3QuY3JlYXRlKGYpKTooaD1PYmplY3QuY3JlYXRlKGEpLGY9YSl9aWYobil7dmFyIGQ9bC5pbmRleE9mKHIpO2lmKC0xIT1kKXJldHVybiB1W2RdO2wucHVzaChyKSx1LnB1c2goaCl9Zm9yKHZhciBwIGluIHIpe3ZhciBtO2YmJihtPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZixwKSksbSYmbnVsbD09bS5zZXR8fChoW3BdPXMocltwXSxpLTEpKX1yZXR1cm4gaH0ib2JqZWN0Ij09dHlwZW9mIG4mJihpPW4uZGVwdGgsYT1uLnByb3RvdHlwZSxuLmZpbHRlcixuPW4uY2lyY3VsYXIpO3ZhciBsPVtdLHU9W10sYz12b2lkIDAhPT10O3JldHVybiB2b2lkIDA9PT1uJiYobj0hMCksdm9pZCAwPT09aSYmKGk9MS8wKSxzKHIsaSl9ZnVuY3Rpb24gcih0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIG4odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiYiW29iamVjdCBEYXRlXSI9PT1yKHQpfWZ1bmN0aW9uIGkodCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiYiW29iamVjdCBBcnJheV0iPT09cih0KX1mdW5jdGlvbiBhKHQpe3JldHVybiJvYmplY3QiPT10eXBlb2YgdCYmIltvYmplY3QgUmVnRXhwXSI9PT1yKHQpfWZ1bmN0aW9uIG8odCl7dmFyIGU9IiI7cmV0dXJuIHQuZ2xvYmFsJiYoZSs9ImciKSx0Lmlnbm9yZUNhc2UmJihlKz0iaSIpLHQubXVsdGlsaW5lJiYoZSs9Im0iKSxlfXJldHVybiBlLmNsb25lUHJvdG90eXBlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PT10KXJldHVybiBudWxsO3ZhciBlPWZ1bmN0aW9uKCl7fTtyZXR1cm4gZS5wcm90b3R5cGU9dCxuZXcgZX0sZS5fX29ialRvU3RyPXIsZS5fX2lzRGF0ZT1uLGUuX19pc0FycmF5PWksZS5fX2lzUmVnRXhwPWEsZS5fX2dldFJlZ0V4cEZsYWdzPW8sZX0oKTsib2JqZWN0Ij09dHlwZW9mIGUmJmUuZXhwb3J0cyYmKGUuZXhwb3J0cz1yKX0pLmNhbGwodGhpcyx0KCJidWZmZXIiKS5CdWZmZXIpfSx7YnVmZmVyOjc1fV0sOTA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe251bGw9PWUmJihlPSEwKTt2YXIgcj10WzBdLG49dFsxXSxpPXRbMl0sbz10WzNdO3JldHVybiBudWxsPT1vJiYobz1lPzE6MjU1KSxlJiYocio9MjU1LG4qPTI1NSxpKj0yNTUsbyo9MjU1KSxyPTI1NSZhKHIsMCwyNTUpLG49MjU1JmEobiwwLDI1NSksaT0yNTUmYShpLDAsMjU1KSxvPTI1NSZhKG8sMCwyNTUpLDE2Nzc3MjE2KnIrKG48PDE2KSsoaTw8OCkrb31mdW5jdGlvbiBpKHQsZSl7dD0rdDt2YXIgcj10Pj4+MjQsbj0oMTY3MTE2ODAmdCk+Pj4xNixpPSg2NTI4MCZ0KT4+PjgsYT0yNTUmdDtyZXR1cm4hMT09PWU/W3IsbixpLGFdOltyLzI1NSxuLzI1NSxpLzI1NSxhLzI1NV19dmFyIGE9dCgiY2xhbXAiKTtlLmV4cG9ydHM9bixlLmV4cG9ydHMudG89bixlLmV4cG9ydHMuZnJvbT1pfSx7Y2xhbXA6ODZ9XSw5MTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9e2FsaWNlYmx1ZTpbMjQwLDI0OCwyNTVdLGFudGlxdWV3aGl0ZTpbMjUwLDIzNSwyMTVdLGFxdWE6WzAsMjU1LDI1NV0sYXF1YW1hcmluZTpbMTI3LDI1NSwyMTJdLGF6dXJlOlsyNDAsMjU1LDI1NV0sYmVpZ2U6WzI0NSwyNDUsMjIwXSxiaXNxdWU6WzI1NSwyMjgsMTk2XSxibGFjazpbMCwwLDBdLGJsYW5jaGVkYWxtb25kOlsyNTUsMjM1LDIwNV0sYmx1ZTpbMCwwLDI1NV0sYmx1ZXZpb2xldDpbMTM4LDQzLDIyNl0sYnJvd246WzE2NSw0Miw0Ml0sYnVybHl3b29kOlsyMjIsMTg0LDEzNV0sY2FkZXRibHVlOls5NSwxNTgsMTYwXSxjaGFydHJldXNlOlsxMjcsMjU1LDBdLGNob2NvbGF0ZTpbMjEwLDEwNSwzMF0sY29yYWw6WzI1NSwxMjcsODBdLGNvcm5mbG93ZXJibHVlOlsxMDAsMTQ5LDIzN10sY29ybnNpbGs6WzI1NSwyNDgsMjIwXSxjcmltc29uOlsyMjAsMjAsNjBdLGN5YW46WzAsMjU1LDI1NV0sZGFya2JsdWU6WzAsMCwxMzldLGRhcmtjeWFuOlswLDEzOSwxMzldLGRhcmtnb2xkZW5yb2Q6WzE4NCwxMzQsMTFdLGRhcmtncmF5OlsxNjksMTY5LDE2OV0sZGFya2dyZWVuOlswLDEwMCwwXSxkYXJrZ3JleTpbMTY5LDE2OSwxNjldLGRhcmtraGFraTpbMTg5LDE4MywxMDddLGRhcmttYWdlbnRhOlsxMzksMCwxMzldLGRhcmtvbGl2ZWdyZWVuOls4NSwxMDcsNDddLGRhcmtvcmFuZ2U6WzI1NSwxNDAsMF0sZGFya29yY2hpZDpbMTUzLDUwLDIwNF0sZGFya3JlZDpbMTM5LDAsMF0sZGFya3NhbG1vbjpbMjMzLDE1MCwxMjJdLGRhcmtzZWFncmVlbjpbMTQzLDE4OCwxNDNdLGRhcmtzbGF0ZWJsdWU6WzcyLDYxLDEzOV0sZGFya3NsYXRlZ3JheTpbNDcsNzksNzldLGRhcmtzbGF0ZWdyZXk6WzQ3LDc5LDc5XSxkYXJrdHVycXVvaXNlOlswLDIwNiwyMDldLGRhcmt2aW9sZXQ6WzE0OCwwLDIxMV0sZGVlcHBpbms6WzI1NSwyMCwxNDddLGRlZXBza3libHVlOlswLDE5MSwyNTVdLGRpbWdyYXk6WzEwNSwxMDUsMTA1XSxkaW1ncmV5OlsxMDUsMTA1LDEwNV0sZG9kZ2VyYmx1ZTpbMzAsMTQ0LDI1NV0sZmlyZWJyaWNrOlsxNzgsMzQsMzRdLGZsb3JhbHdoaXRlOlsyNTUsMjUwLDI0MF0sZm9yZXN0Z3JlZW46WzM0LDEzOSwzNF0sZnVjaHNpYTpbMjU1LDAsMjU1XSxnYWluc2Jvcm86WzIyMCwyMjAsMjIwXSxnaG9zdHdoaXRlOlsyNDgsMjQ4LDI1NV0sZ29sZDpbMjU1LDIxNSwwXSxnb2xkZW5yb2Q6WzIxOCwxNjUsMzJdLGdyYXk6WzEyOCwxMjgsMTI4XSxncmVlbjpbMCwxMjgsMF0sZ3JlZW55ZWxsb3c6WzE3MywyNTUsNDddLGdyZXk6WzEyOCwxMjgsMTI4XSxob25leWRldzpbMjQwLDI1NSwyNDBdLGhvdHBpbms6WzI1NSwxMDUsMTgwXSxpbmRpYW5yZWQ6WzIwNSw5Miw5Ml0saW5kaWdvOls3NSwwLDEzMF0saXZvcnk6WzI1NSwyNTUsMjQwXSxraGFraTpbMjQwLDIzMCwxNDBdLGxhdmVuZGVyOlsyMzAsMjMwLDI1MF0sbGF2ZW5kZXJibHVzaDpbMjU1LDI0MCwyNDVdLGxhd25ncmVlbjpbMTI0LDI1MiwwXSxsZW1vbmNoaWZmb246WzI1NSwyNTAsMjA1XSxsaWdodGJsdWU6WzE3MywyMTYsMjMwXSxsaWdodGNvcmFsOlsyNDAsMTI4LDEyOF0sbGlnaHRjeWFuOlsyMjQsMjU1LDI1NV0sbGlnaHRnb2xkZW5yb2R5ZWxsb3c6WzI1MCwyNTAsMjEwXSxsaWdodGdyYXk6WzIxMSwyMTEsMjExXSxsaWdodGdyZWVuOlsxNDQsMjM4LDE0NF0sbGlnaHRncmV5OlsyMTEsMjExLDIxMV0sbGlnaHRwaW5rOlsyNTUsMTgyLDE5M10sbGlnaHRzYWxtb246WzI1NSwxNjAsMTIyXSxsaWdodHNlYWdyZWVuOlszMiwxNzgsMTcwXSxsaWdodHNreWJsdWU6WzEzNSwyMDYsMjUwXSxsaWdodHNsYXRlZ3JheTpbMTE5LDEzNiwxNTNdLGxpZ2h0c2xhdGVncmV5OlsxMTksMTM2LDE1M10sbGlnaHRzdGVlbGJsdWU6WzE3NiwxOTYsMjIyXSxsaWdodHllbGxvdzpbMjU1LDI1NSwyMjRdLGxpbWU6WzAsMjU1LDBdLGxpbWVncmVlbjpbNTAsMjA1LDUwXSxsaW5lbjpbMjUwLDI0MCwyMzBdLG1hZ2VudGE6WzI1NSwwLDI1NV0sbWFyb29uOlsxMjgsMCwwXSxtZWRpdW1hcXVhbWFyaW5lOlsxMDIsMjA1LDE3MF0sbWVkaXVtYmx1ZTpbMCwwLDIwNV0sbWVkaXVtb3JjaGlkOlsxODYsODUsMjExXSxtZWRpdW1wdXJwbGU6WzE0NywxMTIsMjE5XSxtZWRpdW1zZWFncmVlbjpbNjAsMTc5LDExM10sbWVkaXVtc2xhdGVibHVlOlsxMjMsMTA0LDIzOF0sbWVkaXVtc3ByaW5nZ3JlZW46WzAsMjUwLDE1NF0sbWVkaXVtdHVycXVvaXNlOls3MiwyMDksMjA0XSxtZWRpdW12aW9sZXRyZWQ6WzE5OSwyMSwxMzNdLG1pZG5pZ2h0Ymx1ZTpbMjUsMjUsMTEyXSxtaW50Y3JlYW06WzI0NSwyNTUsMjUwXSxtaXN0eXJvc2U6WzI1NSwyMjgsMjI1XSxtb2NjYXNpbjpbMjU1LDIyOCwxODFdLG5hdmFqb3doaXRlOlsyNTUsMjIyLDE3M10sbmF2eTpbMCwwLDEyOF0sb2xkbGFjZTpbMjUzLDI0NSwyMzBdLG9saXZlOlsxMjgsMTI4LDBdLG9saXZlZHJhYjpbMTA3LDE0MiwzNV0sb3JhbmdlOlsyNTUsMTY1LDBdLG9yYW5nZXJlZDpbMjU1LDY5LDBdLG9yY2hpZDpbMjE4LDExMiwyMTRdLHBhbGVnb2xkZW5yb2Q6WzIzOCwyMzIsMTcwXSxwYWxlZ3JlZW46WzE1MiwyNTEsMTUyXSxwYWxldHVycXVvaXNlOlsxNzUsMjM4LDIzOF0scGFsZXZpb2xldHJlZDpbMjE5LDExMiwxNDddLHBhcGF5YXdoaXA6WzI1NSwyMzksMjEzXSxwZWFjaHB1ZmY6WzI1NSwyMTgsMTg1XSxwZXJ1OlsyMDUsMTMzLDYzXSxwaW5rOlsyNTUsMTkyLDIwM10scGx1bTpbMjIxLDE2MCwyMjFdLHBvd2RlcmJsdWU6WzE3NiwyMjQsMjMwXSxwdXJwbGU6WzEyOCwwLDEyOF0scmViZWNjYXB1cnBsZTpbMTAyLDUxLDE1M10scmVkOlsyNTUsMCwwXSxyb3N5YnJvd246WzE4OCwxNDMsMTQzXSxyb3lhbGJsdWU6WzY1LDEwNSwyMjVdLHNhZGRsZWJyb3duOlsxMzksNjksMTldLHNhbG1vbjpbMjUwLDEyOCwxMTRdLHNhbmR5YnJvd246WzI0NCwxNjQsOTZdLHNlYWdyZWVuOls0NiwxMzksODddLHNlYXNoZWxsOlsyNTUsMjQ1LDIzOF0sc2llbm5hOlsxNjAsODIsNDVdLHNpbHZlcjpbMTkyLDE5MiwxOTJdLHNreWJsdWU6WzEzNSwyMDYsMjM1XSxzbGF0ZWJsdWU6WzEwNiw5MCwyMDVdLHNsYXRlZ3JheTpbMTEyLDEyOCwxNDRdLHNsYXRlZ3JleTpbMTEyLDEyOCwxNDRdLHNub3c6WzI1NSwyNTAsMjUwXSxzcHJpbmdncmVlbjpbMCwyNTUsMTI3XSxzdGVlbGJsdWU6WzcwLDEzMCwxODBdLHRhbjpbMjEwLDE4MCwxNDBdLHRlYWw6WzAsMTI4LDEyOF0sdGhpc3RsZTpbMjE2LDE5MSwyMTZdLHRvbWF0bzpbMjU1LDk5LDcxXSx0dXJxdW9pc2U6WzY0LDIyNCwyMDhdLHZpb2xldDpbMjM4LDEzMCwyMzhdLHdoZWF0OlsyNDUsMjIyLDE3OV0sd2hpdGU6WzI1NSwyNTUsMjU1XSx3aGl0ZXNtb2tlOlsyNDUsMjQ1LDI0NV0seWVsbG93OlsyNTUsMjU1LDBdLHllbGxvd2dyZWVuOlsxNTQsMjA1LDUwXX19LHt9XSw5MjpbZnVuY3Rpb24odCxlLHIpeyhmdW5jdGlvbihyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt2YXIgZSxuLHM9W10sbD0xO2lmKCJzdHJpbmciPT10eXBlb2YgdClpZihpW3RdKXM9aVt0XS5zbGljZSgpLG49InJnYiI7ZWxzZSBpZigidHJhbnNwYXJlbnQiPT09dClsPTAsbj0icmdiIixzPVswLDAsMF07ZWxzZSBpZigvXiNbQS1GYS1mMC05XSskLy50ZXN0KHQpKXt2YXIgdT10LnNsaWNlKDEpLGM9dS5sZW5ndGgsaD1jPD00O2w9MSxoPyhzPVtwYXJzZUludCh1WzBdK3VbMF0sMTYpLHBhcnNlSW50KHVbMV0rdVsxXSwxNikscGFyc2VJbnQodVsyXSt1WzJdLDE2KV0sND09PWMmJihsPXBhcnNlSW50KHVbM10rdVszXSwxNikvMjU1KSk6KHM9W3BhcnNlSW50KHVbMF0rdVsxXSwxNikscGFyc2VJbnQodVsyXSt1WzNdLDE2KSxwYXJzZUludCh1WzRdK3VbNV0sMTYpXSw4PT09YyYmKGw9cGFyc2VJbnQodVs2XSt1WzddLDE2KS8yNTUpKSxzWzBdfHwoc1swXT0wKSxzWzFdfHwoc1sxXT0wKSxzWzJdfHwoc1syXT0wKSxuPSJyZ2IifWVsc2UgaWYoZT0vXigoPzpyZ2J8aHNbbHZiXXxod2J8Y215az98eHlbenldfGdyYXl8bGFifGxjaHU/dj98W2x5XXV2fGxtcylhPylccypcKChbXlwpXSopXCkvLmV4ZWModCkpe3ZhciBmPWVbMV0sdT1mLnJlcGxhY2UoL2EkLywiIik7bj11O3ZhciBjPSJjbXlrIj09PXU/NDoiZ3JheSI9PT11PzE6MztzPWVbMl0udHJpbSgpLnNwbGl0KC9ccyosXHMqLykubWFwKGZ1bmN0aW9uKHQsZSl7aWYoLyUkLy50ZXN0KHQpKXJldHVybiBlPT09Yz9wYXJzZUZsb2F0KHQpLzEwMDoicmdiIj09PXU/MjU1KnBhcnNlRmxvYXQodCkvMTAwOnBhcnNlRmxvYXQodCk7aWYoImgiPT09dVtlXSl7aWYoL2RlZyQvLnRlc3QodCkpcmV0dXJuIHBhcnNlRmxvYXQodCk7aWYodm9pZCAwIT09b1t0XSlyZXR1cm4gb1t0XX1yZXR1cm4gcGFyc2VGbG9hdCh0KX0pLGY9PT11JiZzLnB1c2goMSksbD12b2lkIDA9PT1zW2NdPzE6c1tjXSxzPXMuc2xpY2UoMCxjKX1lbHNlIHQubGVuZ3RoPjEwJiYvWzAtOV0oPzpcc3xcLykvLnRlc3QodCkmJihzPXQubWF0Y2goLyhbMC05XSspL2cpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VGbG9hdCh0KX0pLG49dC5tYXRjaCgvKFthLXpdKS9naSkuam9pbigiIikudG9Mb3dlckNhc2UoKSk7ZWxzZSJudW1iZXIiPT10eXBlb2YgdD8obj0icmdiIixzPVt0Pj4+MTYsKDY1MjgwJnQpPj4+OCwyNTUmdF0pOmEodCk/KG51bGwhPXQucj8ocz1bdC5yLHQuZyx0LmJdLG49InJnYiIpOm51bGwhPXQucmVkPyhzPVt0LnJlZCx0LmdyZWVuLHQuYmx1ZV0sbj0icmdiIik6bnVsbCE9dC5oPyhzPVt0LmgsdC5zLHQubF0sbj0iaHNsIik6bnVsbCE9dC5odWUmJihzPVt0Lmh1ZSx0LnNhdHVyYXRpb24sdC5saWdodG5lc3NdLG49ImhzbCIpLG51bGwhPXQuYT9sPXQuYTpudWxsIT10LmFscGhhP2w9dC5hbHBoYTpudWxsIT10Lm9wYWNpdHkmJihsPXQub3BhY2l0eS8xMDApKTooQXJyYXkuaXNBcnJheSh0KXx8ci5BcnJheUJ1ZmZlciYmQXJyYXlCdWZmZXIuaXNWaWV3JiZBcnJheUJ1ZmZlci5pc1ZpZXcodCkpJiYocz1bdFswXSx0WzFdLHRbMl1dLG49InJnYiIsbD00PT09dC5sZW5ndGg/dFszXToxKTtyZXR1cm57c3BhY2U6bix2YWx1ZXM6cyxhbHBoYTpsfX1lLmV4cG9ydHM9bjt2YXIgaT10KCJjb2xvci1uYW1lIiksYT10KCJpcy1wbGFpbi1vYmoiKSxvPXtyZWQ6MCxvcmFuZ2U6NjAseWVsbG93OjEyMCxncmVlbjoxODAsYmx1ZToyNDAscHVycGxlOjMwMH19KS5jYWxsKHRoaXMsInVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzp7fSl9LHsiY29sb3ItbmFtZSI6OTEsImlzLXBsYWluLW9iaiI6Mjk1fV0sOTM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiY29sb3ItcGFyc2UiKSxpPXQoImNvbG9yLXNwYWNlL2hzbCIpLGE9dCgiY2xhbXAiKTtlLmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiB0O251bGw9PWUmJihlPSEwKTt2YXIgcj1uKHQpO2lmKCFyLnNwYWNlKXJldHVybltdO3ZhciBvLHM9ci52YWx1ZXMsbD1zLmxlbmd0aDtmb3Iobz0wO288bDtvKyspc1tvXT1hKHNbb10sMCwyNTUpO2lmKCJoIj09PXIuc3BhY2VbMF0mJihzPWkucmdiKHMpKSxlKWZvcihvPTA7bzxsO28rKylzW29dLz0yNTU7cmV0dXJuIHMucHVzaChhKHIuYWxwaGEsMCwxKSksc319LHtjbGFtcDo4NiwiY29sb3ItcGFyc2UiOjkyLCJjb2xvci1zcGFjZS9oc2wiOjk0fV0sOTQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiLi9yZ2IiKTtlLmV4cG9ydHM9e25hbWU6ImhzbCIsbWluOlswLDAsMF0sbWF4OlszNjAsMTAwLDEwMF0sY2hhbm5lbDpbImh1ZSIsInNhdHVyYXRpb24iLCJsaWdodG5lc3MiXSxhbGlhczpbIkhTTCJdLHJnYjpmdW5jdGlvbih0KXt2YXIgZSxyLG4saSxhLG89dFswXS8zNjAscz10WzFdLzEwMCxsPXRbMl0vMTAwO2lmKDA9PT1zKXJldHVybiBhPTI1NSpsLFthLGEsYV07cj1sPC41P2wqKDErcyk6bCtzLWwqcyxlPTIqbC1yLGk9WzAsMCwwXTtmb3IodmFyIHU9MDt1PDM7dSsrKW49bysxLzMqLSh1LTEpLG48MD9uKys6bj4xJiZuLS0sYT02Km48MT9lKzYqKHItZSkqbjoyKm48MT9yOjMqbjwyP2UrKHItZSkqKDIvMy1uKSo2OmUsaVt1XT0yNTUqYTtyZXR1cm4gaX19LG4uaHNsPWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpPXRbMF0vMjU1LGE9dFsxXS8yNTUsbz10WzJdLzI1NSxzPU1hdGgubWluKGksYSxvKSxsPU1hdGgubWF4KGksYSxvKSx1PWwtcztyZXR1cm4gbD09PXM/ZT0wOmk9PT1sP2U9KGEtbykvdTphPT09bD9lPTIrKG8taSkvdTpvPT09bCYmKGU9NCsoaS1hKS91KSxlPU1hdGgubWluKDYwKmUsMzYwKSxlPDAmJihlKz0zNjApLG49KHMrbCkvMixyPWw9PT1zPzA6bjw9LjU/dS8obCtzKTp1LygyLWwtcyksW2UsMTAwKnIsMTAwKm5dfX0seyIuL3JnYiI6OTV9XSw5NTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9e25hbWU6InJnYiIsbWluOlswLDAsMF0sbWF4OlsyNTUsMjU1LDI1NV0sY2hhbm5lbDpbInJlZCIsImdyZWVuIiwiYmx1ZSJdLGFsaWFzOlsiUkdCIl19fSx7fV0sOTY6W2Z1bmN0aW9uKHQsZSxyKXtlLmV4cG9ydHM9e2pldDpbe2luZGV4OjAscmdiOlswLDAsMTMxXX0se2luZGV4Oi4xMjUscmdiOlswLDYwLDE3MF19LHtpbmRleDouMzc1LHJnYjpbNSwyNTUsMjU1XX0se2luZGV4Oi42MjUscmdiOlsyNTUsMjU1LDBdfSx7aW5kZXg6Ljg3NSxyZ2I6WzI1MCwwLDBdfSx7aW5kZXg6MSxyZ2I6WzEyOCwwLDBdfV0saHN2Olt7aW5kZXg6MCxyZ2I6WzI1NSwwLDBdfSx7aW5kZXg6LjE2OSxyZ2I6WzI1MywyNTUsMl19LHtpbmRleDouMTczLHJnYjpbMjQ3LDI1NSwyXX0se2luZGV4Oi4zMzcscmdiOlswLDI1Miw0XX0se2luZGV4Oi4zNDEscmdiOlswLDI1MiwxMF19LHtpbmRleDouNTA2LHJnYjpbMSwyNDksMjU1XX0se2luZGV4Oi42NzEscmdiOlsyLDAsMjUzXX0se2luZGV4Oi42NzUscmdiOls4LDAsMjUzXX0se2luZGV4Oi44MzkscmdiOlsyNTUsMCwyNTFdfSx7aW5kZXg6Ljg0MyxyZ2I6WzI1NSwwLDI0NV19LHtpbmRleDoxLHJnYjpbMjU1LDAsNl19XSxob3Q6W3tpbmRleDowLHJnYjpbMCwwLDBdfSx7aW5kZXg6LjMscmdiOlsyMzAsMCwwXX0se2luZGV4Oi42LHJnYjpbMjU1LDIxMCwwXX0se2luZGV4OjEscmdiOlsyNTUsMjU1LDI1NV19XSxjb29sOlt7aW5kZXg6MCxyZ2I6WzAsMjU1LDI1NV19LHtpbmRleDoxLHJnYjpbMjU1LDAsMjU1XX1dLHNwcmluZzpbe2luZGV4OjAscmdiOlsyNTUsMCwyNTVdfSx7aW5kZXg6MSxyZ2I6WzI1NSwyNTUsMF19XSxzdW1tZXI6W3tpbmRleDowLHJnYjpbMCwxMjgsMTAyXX0se2luZGV4OjEscmdiOlsyNTUsMjU1LDEwMl19XSxhdXR1bW46W3tpbmRleDowLHJnYjpbMjU1LDAsMF19LHtpbmRleDoxLHJnYjpbMjU1LDI1NSwwXX1dLHdpbnRlcjpbe2luZGV4OjAscmdiOlswLDAsMjU1XX0se2luZGV4OjEscmdiOlswLDI1NSwxMjhdfV0sYm9uZTpbe2luZGV4OjAscmdiOlswLDAsMF19LHtpbmRleDouMzc2LHJnYjpbODQsODQsMTE2XX0se2luZGV4Oi43NTMscmdiOlsxNjksMjAwLDIwMF19LHtpbmRleDoxLHJnYjpbMjU1LDI1NSwyNTVdfV0sY29wcGVyOlt7aW5kZXg6MCxyZ2I6WzAsMCwwXX0se2luZGV4Oi44MDQscmdiOlsyNTUsMTYwLDEwMl19LHtpbmRleDoxLHJnYjpbMjU1LDE5OSwxMjddfV0sZ3JleXM6W3tpbmRleDowLHJnYjpbMCwwLDBdfSx7aW5kZXg6MSxyZ2I6WzI1NSwyNTUsMjU1XX1dLHlpZ25idTpbe2luZGV4OjAscmdiOls4LDI5LDg4XX0se2luZGV4Oi4xMjUscmdiOlszNyw1MiwxNDhdfSx7aW5kZXg6LjI1LHJnYjpbMzQsOTQsMTY4XX0se2luZGV4Oi4zNzUscmdiOlsyOSwxNDUsMTkyXX0se2luZGV4Oi41LHJnYjpbNjUsMTgyLDE5Nl19LHtpbmRleDouNjI1LHJnYjpbMTI3LDIwNSwxODddfSx7aW5kZXg6Ljc1LHJnYjpbMTk5LDIzMywxODBdfSx7aW5kZXg6Ljg3NSxyZ2I6WzIzNywyNDgsMjE3XX0se2luZGV4OjEscmdiOlsyNTUsMjU1LDIxN119XSxncmVlbnM6W3tpbmRleDowLHJnYjpbMCw2OCwyN119LHtpbmRleDouMTI1LHJnYjpbMCwxMDksNDRdfSx7aW5kZXg6LjI1LHJnYjpbMzUsMTM5LDY5XX0se2luZGV4Oi4zNzUscmdiOls2NSwxNzEsOTNdfSx7aW5kZXg6LjUscmdiOlsxMTYsMTk2LDExOF19LHtpbmRleDouNjI1LHJnYjpbMTYxLDIxNywxNTVdfSx7aW5kZXg6Ljc1LHJnYjpbMTk5LDIzMywxOTJdfSx7aW5kZXg6Ljg3NSxyZ2I6WzIyOSwyNDUsMjI0XX0se2luZGV4OjEscmdiOlsyNDcsMjUyLDI0NV19XSx5aW9ycmQ6W3tpbmRleDowLHJnYjpbMTI4LDAsMzhdfSx7aW5kZXg6LjEyNSxyZ2I6WzE4OSwwLDM4XX0se2luZGV4Oi4yNSxyZ2I6WzIyNywyNiwyOF19LHtpbmRleDouMzc1LHJnYjpbMjUyLDc4LDQyXX0se2luZGV4Oi41LHJnYjpbMjUzLDE0MSw2MF19LHtpbmRleDouNjI1LHJnYjpbMjU0LDE3OCw3Nl19LHtpbmRleDouNzUscmdiOlsyNTQsMjE3LDExOF19LHtpbmRleDouODc1LHJnYjpbMjU1LDIzNywxNjBdfSx7aW5kZXg6MSxyZ2I6WzI1NSwyNTUsMjA0XX1dLGJsdWVyZWQ6W3tpbmRleDowLHJnYjpbMCwwLDI1NV19LHtpbmRleDoxLHJnYjpbMjU1LDAsMF19XSxyZGJ1Olt7aW5kZXg6MCxyZ2I6WzUsMTAsMTcyXX0se2luZGV4Oi4zNSxyZ2I6WzEwNiwxMzcsMjQ3XX0se2luZGV4Oi41LHJnYjpbMTkwLDE5MCwxOTBdfSx7aW5kZXg6LjYscmdiOlsyMjAsMTcwLDEzMl19LHtpbmRleDouNyxyZ2I6WzIzMCwxNDUsOTBdfSx7aW5kZXg6MSxyZ2I6WzE3OCwxMCwyOF19XSxwaWNuaWM6W3tpbmRleDowLHJnYjpbMCwwLDI1NV19LHtpbmRleDouMSxyZ2I6WzUxLDE1MywyNTVdfSx7aW5kZXg6LjIscmdiOlsxMDIsMjA0LDI1NV19LHtpbmRleDouMyxyZ2I6WzE1MywyMDQsMjU1XX0se2luZGV4Oi40LHJnYjpbMjA0LDIwNCwyNTVdfSx7aW5kZXg6LjUscmdiOlsyNTUsMjU1LDI1NV19LHtpbmRleDouNixyZ2I6WzI1NSwyMDQsMjU1XX0se2luZGV4Oi43LHJnYjpbMjU1LDE1MywyNTVdfSx7aW5kZXg6LjgscmdiOlsyNTUsMTAyLDIwNF19LHtpbmRleDouOSxyZ2I6WzI1NSwxMDIsMTAyXX0se2luZGV4OjEscmdiOlsyNTUsMCwwXX1dLHJhaW5ib3c6W3tpbmRleDowLHJnYjpbMTUwLDAsOTBdfSx7aW5kZXg6LjEyNSxyZ2I6WzAsMCwyMDBdfSx7aW5kZXg6LjI1LHJnYjpbMCwyNSwyNTVdfSx7aW5kZXg6LjM3NSxyZ2I6WzAsMTUyLDI1NV19LHtpbmRleDouNSxyZ2I6WzQ0LDI1NSwxNTBdfSx7aW5kZXg6LjYyNSxyZ2I6WzE1MSwyNTUsMF19LHtpbmRleDouNzUscmdiOlsyNTUsMjM0LDBdfSx7aW5kZXg6Ljg3NSxyZ2I6WzI1NSwxMTEsMF19LHtpbmRleDoxLHJnYjpbMjU1LDAsMF19XSxwb3J0bGFuZDpbe2luZGV4OjAscmdiOlsxMiw1MSwxMzFdfSx7aW5kZXg6LjI1LHJnYjpbMTAsMTM2LDE4Nl19LHtpbmRleDouNSxyZ2I6WzI0MiwyMTEsNTZdfSx7aW5kZXg6Ljc1LHJnYjpbMjQyLDE0Myw1Nl19LHtpbmRleDoxLHJnYjpbMjE3LDMwLDMwXX1dLGJsYWNrYm9keTpbe2luZGV4OjAscmdiOlswLDAsMF19LHtpbmRleDouMixyZ2I6WzIzMCwwLDBdfSx7aW5kZXg6LjQscmdiOlsyMzAsMjEwLDBdfSx7aW5kZXg6LjcscmdiOlsyNTUsMjU1LDI1NV19LHtpbmRleDoxLHJnYjpbMTYwLDIwMCwyNTVdfV0sZWFydGg6W3tpbmRleDowLHJnYjpbMCwwLDEzMF19LHtpbmRleDouMSxyZ2I6WzAsMTgwLDE4MF19LHtpbmRleDouMixyZ2I6WzQwLDIxMCw0MF19LHtpbmRleDouNCxyZ2I6WzIzMCwyMzAsNTBdfSx7aW5kZXg6LjYscmdiOlsxMjAsNzAsMjBdfSx7aW5kZXg6MSxyZ2I6WzI1NSwyNTUsMjU1XX1dLGVsZWN0cmljOlt7aW5kZXg6MCxyZ2I6WzAsMCwwXX0se2luZGV4Oi4xNSxyZ2I6WzMwLDAsMTAwXX0se2luZGV4Oi40LHJnYjpbMTIwLDAsMTAwXX0se2luZGV4Oi42LHJnYjpbMTYwLDkwLDBdfSx7aW5kZXg6LjgscmdiOlsyMzAsMjAwLDBdfSx7aW5kZXg6MSxyZ2I6WzI1NSwyNTAsMjIwXX1dLGFscGhhOlt7aW5kZXg6MCxyZ2I6WzI1NSwyNTUsMjU1LDBdfSx7aW5kZXg6MCxyZ2I6WzI1NSwyNTUsMjU1LDFdfV0sdmlyaWRpczpbe2luZGV4OjAscmdiOls2OCwxLDg0XX0se2luZGV4Oi4xMyxyZ2I6WzcxLDQ0LDEyMl19LHtpbmRleDouMjUscmdiOls1OSw4MSwxMzldfSx7aW5kZXg6LjM4LHJnYjpbNDQsMTEzLDE0Ml19LHtpbmRleDouNSxyZ2I6WzMzLDE0NCwxNDFdfSx7aW5kZXg6LjYzLHJnYjpbMzksMTczLDEyOV19LHtpbmRleDouNzUscmdiOls5MiwyMDAsOTldfSx7aW5kZXg6Ljg4LHJnYjpbMTcwLDIyMCw1MF19LHtpbmRleDoxLHJnYjpbMjUzLDIzMSwzN119XSxpbmZlcm5vOlt7aW5kZXg6MCxyZ2I6WzAsMCw0XX0se2luZGV4Oi4xMyxyZ2I6WzMxLDEyLDcyXX0se2luZGV4Oi4yNSxyZ2I6Wzg1LDE1LDEwOV19LHtpbmRleDouMzgscmdiOlsxMzYsMzQsMTA2XX0se2luZGV4Oi41LHJnYjpbMTg2LDU0LDg1XX0se2luZGV4Oi42MyxyZ2I6WzIyNyw4OSw1MV19LHtpbmRleDouNzUscmdiOlsyNDksMTQwLDEwXX0se2luZGV4Oi44OCxyZ2I6WzI0OSwyMDEsNTBdfSx7aW5kZXg6MSxyZ2I6WzI1MiwyNTUsMTY0XX1dLG1hZ21hOlt7aW5kZXg6MCxyZ2I6WzAsMCw0XX0se2luZGV4Oi4xMyxyZ2I6WzI4LDE2LDY4XX0se2luZGV4Oi4yNSxyZ2I6Wzc5LDE4LDEyM119LHtpbmRleDouMzgscmdiOlsxMjksMzcsMTI5XX0se2luZGV4Oi41LHJnYjpbMTgxLDU0LDEyMl19LHtpbmRleDouNjMscmdiOlsyMjksODAsMTAwXX0se2luZGV4Oi43NSxyZ2I6WzI1MSwxMzUsOTddfSx7aW5kZXg6Ljg4LHJnYjpbMjU0LDE5NCwxMzVdfSx7aW5kZXg6MSxyZ2I6WzI1MiwyNTMsMTkxXX1dLHBsYXNtYTpbe2luZGV4OjAscmdiOlsxMyw4LDEzNV19LHtpbmRleDouMTMscmdiOls3NSwzLDE2MV19LHtpbmRleDouMjUscmdiOlsxMjUsMywxNjhdfSx7aW5kZXg6LjM4LHJnYjpbMTY4LDM0LDE1MF19LHtpbmRleDouNSxyZ2I6WzIwMyw3MCwxMjFdfSx7aW5kZXg6LjYzLHJnYjpbMjI5LDEwNyw5M119LHtpbmRleDouNzUscmdiOlsyNDgsMTQ4LDY1XX0se2luZGV4Oi44OCxyZ2I6WzI1MywxOTUsNDBdfSx7aW5kZXg6MSxyZ2I6WzI0MCwyNDksMzNdfV0sd2FybTpbe2luZGV4OjAscmdiOlsxMjUsMCwxNzldfSx7aW5kZXg6LjEzLHJnYjpbMTcyLDAsMTg3XX0se2luZGV4Oi4yNSxyZ2I6WzIxOSwwLDE3MF19LHtpbmRleDouMzgscmdiOlsyNTUsMCwxMzBdfSx7aW5kZXg6LjUscmdiOlsyNTUsNjMsNzRdfSx7aW5kZXg6LjYzLHJnYjpbMjU1LDEyMywwXX0se2luZGV4Oi43NSxyZ2I6WzIzNCwxNzYsMF19LHtpbmRleDouODgscmdiOlsxOTAsMjI4LDBdfSx7aW5kZXg6MSxyZ2I6WzE0NywyNTUsMF19XSxjb29sOlt7aW5kZXg6MCxyZ2I6WzEyNSwwLDE3OV19LHtpbmRleDouMTMscmdiOlsxMTYsMCwyMThdfSx7aW5kZXg6LjI1LHJnYjpbOTgsNzQsMjM3XX0se2luZGV4Oi4zOCxyZ2I6WzY4LDE0NiwyMzFdfSx7aW5kZXg6LjUscmdiOlswLDIwNCwxOTddfSx7aW5kZXg6LjYzLHJnYjpbMCwyNDcsMTQ2XX0se2luZGV4Oi43NSxyZ2I6WzAsMjU1LDg4XX0se2luZGV4Oi44OCxyZ2I6WzQwLDI1NSw4XX0se2luZGV4OjEscmdiOlsxNDcsMjU1LDBdfV0sInJhaW5ib3ctc29mdCI6W3tpbmRleDowLHJnYjpbMTI1LDAsMTc5XX0se2luZGV4Oi4xLHJnYjpbMTk5LDAsMTgwXX0se2luZGV4Oi4yLHJnYjpbMjU1LDAsMTIxXX0se2luZGV4Oi4zLHJnYjpbMjU1LDEwOCwwXX0se2luZGV4Oi40LHJnYjpbMjIyLDE5NCwwXX0se2luZGV4Oi41LHJnYjpbMTUwLDI1NSwwXX0se2luZGV4Oi42LHJnYjpbMCwyNTUsNTVdfSx7aW5kZXg6LjcscmdiOlswLDI0NiwxNTBdfSx7aW5kZXg6LjgscmdiOls1MCwxNjcsMjIyXX0se2luZGV4Oi45LHJnYjpbMTAzLDUxLDIzNV19LHtpbmRleDoxLHJnYjpbMTI0LDAsMTg2XX1dLGJhdGh5bWV0cnk6W3tpbmRleDowLHJnYjpbNDAsMjYsNDRdfSx7aW5kZXg6LjEzLHJnYjpbNTksNDksOTBdfSx7aW5kZXg6LjI1LHJnYjpbNjQsNzYsMTM5XX0se2luZGV4Oi4zOCxyZ2I6WzYzLDExMCwxNTFdfSx7aW5kZXg6LjUscmdiOls3MiwxNDIsMTU4XX0se2luZGV4Oi42MyxyZ2I6Wzg1LDE3NCwxNjNdfSx7aW5kZXg6Ljc1LHJnYjpbMTIwLDIwNiwxNjNdfSx7aW5kZXg6Ljg4LHJnYjpbMTg3LDIzMCwxNzJdfSx7aW5kZXg6MSxyZ2I6WzI1MywyNTQsMjA0XX1dLGNkb206W3tpbmRleDowLHJnYjpbNDcsMTUsNjJdfSx7aW5kZXg6LjEzLHJnYjpbODcsMjMsODZdfSx7aW5kZXg6LjI1LHJnYjpbMTMwLDI4LDk5XX0se2luZGV4Oi4zOCxyZ2I6WzE3MSw0MSw5Nl19LHtpbmRleDouNSxyZ2I6WzIwNiw2Nyw4Nl19LHtpbmRleDouNjMscmdiOlsyMzAsMTA2LDg0XX0se2luZGV4Oi43NSxyZ2I6WzI0MiwxNDksMTAzXX0se2luZGV4Oi44OCxyZ2I6WzI0OSwxOTMsMTM1XX0se2luZGV4OjEscmdiOlsyNTQsMjM3LDE3Nl19XSxjaGxvcm9waHlsbDpbe2luZGV4OjAscmdiOlsxOCwzNiwyMF19LHtpbmRleDouMTMscmdiOlsyNSw2Myw0MV19LHtpbmRleDouMjUscmdiOlsyNCw5MSw1OV19LHtpbmRleDouMzgscmdiOlsxMywxMTksNzJdfSx7aW5kZXg6LjUscmdiOlsxOCwxNDgsODBdfSx7aW5kZXg6LjYzLHJnYjpbODAsMTczLDg5XX0se2luZGV4Oi43NSxyZ2I6WzEzMiwxOTYsMTIyXX0se2luZGV4Oi44OCxyZ2I6WzE3NSwyMjEsMTYyXX0se2luZGV4OjEscmdiOlsyMTUsMjQ5LDIwOF19XSxkZW5zaXR5Olt7aW5kZXg6MCxyZ2I6WzU0LDE0LDM2XX0se2luZGV4Oi4xMyxyZ2I6Wzg5LDIzLDgwXX0se2luZGV4Oi4yNSxyZ2I6WzExMCw0NSwxMzJdfSx7aW5kZXg6LjM4LHJnYjpbMTIwLDc3LDE3OF19LHtpbmRleDouNSxyZ2I6WzEyMCwxMTMsMjEzXX0se2luZGV4Oi42MyxyZ2I6WzExNSwxNTEsMjI4XX0se2luZGV4Oi43NSxyZ2I6WzEzNCwxODUsMjI3XX0se2luZGV4Oi44OCxyZ2I6WzE3NywyMTQsMjI3XX0se2luZGV4OjEscmdiOlsyMzAsMjQxLDI0MV19XSwiZnJlZXN1cmZhY2UtYmx1ZSI6W3tpbmRleDowLHJnYjpbMzAsNCwxMTBdfSx7aW5kZXg6LjEzLHJnYjpbNDcsMTQsMTc2XX0se2luZGV4Oi4yNSxyZ2I6WzQxLDQ1LDIzNl19LHtpbmRleDouMzgscmdiOlsyNSw5OSwyMTJdfSx7aW5kZXg6LjUscmdiOls2OCwxMzEsMjAwXX0se2luZGV4Oi42MyxyZ2I6WzExNCwxNTYsMTk3XX0se2luZGV4Oi43NSxyZ2I6WzE1NywxODEsMjAzXX0se2luZGV4Oi44OCxyZ2I6WzIwMCwyMDgsMjE2XX0se2luZGV4OjEscmdiOlsyNDEsMjM3LDIzNl19XSwiZnJlZXN1cmZhY2UtcmVkIjpbe2luZGV4OjAscmdiOls2MCw5LDE4XX0se2luZGV4Oi4xMyxyZ2I6WzEwMCwxNywyN119LHtpbmRleDouMjUscmdiOlsxNDIsMjAsMjldfSx7aW5kZXg6LjM4LHJnYjpbMTc3LDQzLDI3XX0se2luZGV4Oi41LHJnYjpbMTkyLDg3LDYzXX0se2luZGV4Oi42MyxyZ2I6WzIwNSwxMjUsMTA1XX0se2luZGV4Oi43NSxyZ2I6WzIxNiwxNjIsMTQ4XX0se2luZGV4Oi44OCxyZ2I6WzIyNywxOTksMTkzXX0se2luZGV4OjEscmdiOlsyNDEsMjM3LDIzNl19XSxveHlnZW46W3tpbmRleDowLHJnYjpbNjQsNSw1XX0se2luZGV4Oi4xMyxyZ2I6WzEwNiw2LDE1XX0se2luZGV4Oi4yNSxyZ2I6WzE0NCwyNiw3XX0se2luZGV4Oi4zOCxyZ2I6WzE2OCw2NCwzXX0se2luZGV4Oi41LHJnYjpbMTg4LDEwMCw0XX0se2luZGV4Oi42MyxyZ2I6WzIwNiwxMzYsMTFdfSx7aW5kZXg6Ljc1LHJnYjpbMjIwLDE3NCwyNV19LHtpbmRleDouODgscmdiOlsyMzEsMjE1LDQ0XX0se2luZGV4OjEscmdiOlsyNDgsMjU0LDEwNV19XSxwYXI6W3tpbmRleDowLHJnYjpbNTEsMjAsMjRdfSx7aW5kZXg6LjEzLHJnYjpbOTAsMzIsMzVdfSx7aW5kZXg6LjI1LHJnYjpbMTI5LDQ0LDM0XX0se2luZGV4Oi4zOCxyZ2I6WzE1OSw2OCwyNV19LHtpbmRleDouNSxyZ2I6WzE4Miw5OSwxOV19LHtpbmRleDouNjMscmdiOlsxOTksMTM0LDIyXX0se2luZGV4Oi43NSxyZ2I6WzIxMiwxNzEsMzVdfSx7aW5kZXg6Ljg4LHJnYjpbMjIxLDIxMCw1NF19LHtpbmRleDoxLHJnYjpbMjI1LDI1Myw3NV19XSxwaGFzZTpbe2luZGV4OjAscmdiOlsxNDUsMTA1LDE4XX0se2luZGV4Oi4xMyxyZ2I6WzE4NCw3MSwzOF19LHtpbmRleDouMjUscmdiOlsxODYsNTgsMTE1XX0se2luZGV4Oi4zOCxyZ2I6WzE2MCw3MSwxODVdfSx7aW5kZXg6LjUscmdiOlsxMTAsOTcsMjE4XX0se2luZGV4Oi42MyxyZ2I6WzUwLDEyMywxNjRdfSx7aW5kZXg6Ljc1LHJnYjpbMzEsMTMxLDExMF19LHtpbmRleDouODgscmdiOls3NywxMjksMzRdfSx7aW5kZXg6MSxyZ2I6WzE0NSwxMDUsMThdfV0sc2FsaW5pdHk6W3tpbmRleDowLHJnYjpbNDIsMjQsMTA4XX0se2luZGV4Oi4xMyxyZ2I6WzMzLDUwLDE2Ml19LHtpbmRleDouMjUscmdiOlsxNSw5MCwxNDVdfSx7aW5kZXg6LjM4LHJnYjpbNDAsMTE4LDEzN119LHtpbmRleDouNSxyZ2I6WzU5LDE0NiwxMzVdfSx7aW5kZXg6LjYzLHJnYjpbNzksMTc1LDEyNl19LHtpbmRleDouNzUscmdiOlsxMjAsMjAzLDEwNF19LHtpbmRleDouODgscmdiOlsxOTMsMjIxLDEwMF19LHtpbmRleDoxLHJnYjpbMjUzLDIzOSwxNTRdfV0sdGVtcGVyYXR1cmU6W3tpbmRleDowLHJnYjpbNCwzNSw1MV19LHtpbmRleDouMTMscmdiOlsyMyw1MSwxMjJdfSx7aW5kZXg6LjI1LHJnYjpbODUsNTksMTU3XX0se2luZGV4Oi4zOCxyZ2I6WzEyOSw3OSwxNDNdfSx7aW5kZXg6LjUscmdiOlsxNzUsOTUsMTMwXX0se2luZGV4Oi42MyxyZ2I6WzIyMiwxMTIsMTAxXX0se2luZGV4Oi43NSxyZ2I6WzI0OSwxNDYsNjZdfSx7aW5kZXg6Ljg4LHJnYjpbMjQ5LDE5Niw2NV19LHtpbmRleDoxLHJnYjpbMjMyLDI1MCw5MV19XSx0dXJiaWRpdHk6W3tpbmRleDowLHJnYjpbMzQsMzEsMjddfSx7aW5kZXg6LjEzLHJnYjpbNjUsNTAsNDFdfSx7aW5kZXg6LjI1LHJnYjpbOTgsNjksNTJdfSx7aW5kZXg6LjM4LHJnYjpbMTMxLDg5LDU3XX0se2luZGV4Oi41LHJnYjpbMTYxLDExMiw1OV19LHtpbmRleDouNjMscmdiOlsxODUsMTQwLDY2XX0se2luZGV4Oi43NSxyZ2I6WzIwMiwxNzQsODhdfSx7aW5kZXg6Ljg4LHJnYjpbMjE2LDIwOSwxMjZdfSx7aW5kZXg6MSxyZ2I6WzIzMywyNDYsMTcxXX1dLCJ2ZWxvY2l0eS1ibHVlIjpbe2luZGV4OjAscmdiOlsxNywzMiw2NF19LHtpbmRleDouMTMscmdiOlszNSw1MiwxMTZdfSx7aW5kZXg6LjI1LHJnYjpbMjksODEsMTU2XX0se2luZGV4Oi4zOCxyZ2I6WzMxLDExMywxNjJdfSx7aW5kZXg6LjUscmdiOls1MCwxNDQsMTY5XX0se2luZGV4Oi42MyxyZ2I6Wzg3LDE3MywxNzZdfSx7aW5kZXg6Ljc1LHJnYjpbMTQ5LDE5NiwxODldfSx7aW5kZXg6Ljg4LHJnYjpbMjAzLDIyMSwyMTFdfSx7aW5kZXg6MSxyZ2I6WzI1NCwyNTEsMjMwXX1dLCJ2ZWxvY2l0eS1ncmVlbiI6W3tpbmRleDowLHJnYjpbMjMsMzUsMTldfSx7aW5kZXg6LjEzLHJnYjpbMjQsNjQsMzhdfSx7aW5kZXg6LjI1LHJnYjpbMTEsOTUsNDVdfSx7aW5kZXg6LjM4LHJnYjpbMzksMTIzLDM1XX0se2luZGV4Oi41LHJnYjpbOTUsMTQ2LDEyXX0se2luZGV4Oi42MyxyZ2I6WzE1MiwxNjUsMThdfSx7aW5kZXg6Ljc1LHJnYjpbMjAxLDE4Niw2OV19LHtpbmRleDouODgscmdiOlsyMzMsMjE2LDEzN119LHtpbmRleDoxLHJnYjpbMjU1LDI1MywyMDVdfV0sY3ViZWhlbGl4Olt7aW5kZXg6MCxyZ2I6WzAsMCwwXX0se2luZGV4Oi4wNyxyZ2I6WzIyLDUsNTldfSx7aW5kZXg6LjEzLHJnYjpbNjAsNCwxMDVdfSx7aW5kZXg6LjIscmdiOlsxMDksMSwxMzVdfSx7aW5kZXg6LjI3LHJnYjpbMTYxLDAsMTQ3XX0se2luZGV4Oi4zMyxyZ2I6WzIxMCwyLDE0Ml19LHtpbmRleDouNCxyZ2I6WzI1MSwxMSwxMjNdfSx7aW5kZXg6LjQ3LHJnYjpbMjU1LDI5LDk3XX0se2luZGV4Oi41MyxyZ2I6WzI1NSw1NCw2OV19LHtpbmRleDouNixyZ2I6WzI1NSw4NSw0Nl19LHtpbmRleDouNjcscmdiOlsyNTUsMTIwLDM0XX0se2luZGV4Oi43MyxyZ2I6WzI1NSwxNTcsMzddfSx7aW5kZXg6LjgscmdiOlsyNDEsMTkxLDU3XX0se2luZGV4Oi44NyxyZ2I6WzIyNCwyMjAsOTNdfSx7aW5kZXg6LjkzLHJnYjpbMjE4LDI0MSwxNDJdfSx7aW5kZXg6MSxyZ2I6WzIyNywyNTMsMTk4XX1dfX0se31dLDk3OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGUscixuLHUsYyxoLGYsZCxwLG0sdixnLHksYj1bXSx4PVtdLF89W10sdz1bXTtpZihvLmlzUGxhaW5PYmplY3QodCl8fCh0PXt9KSxwPXQubnNoYWRlc3x8NzIsZD10LmZvcm1hdHx8ImhleCIsZj10LmNvbG9ybWFwLGZ8fChmPSJqZXQiKSwic3RyaW5nIj09dHlwZW9mIGYpe2lmKGY9Zi50b0xvd2VyQ2FzZSgpLCFsW2ZdKXRocm93IEVycm9yKGYrIiBub3QgYSBzdXBwb3J0ZWQgY29sb3JzY2FsZSIpO2g9cyhsW2ZdKX1lbHNle2lmKCFBcnJheS5pc0FycmF5KGYpKXRocm93IEVycm9yKCJ1bnN1cHBvcnRlZCBjb2xvcm1hcCBvcHRpb24iLGYpO2g9cyhmKX1pZihoLmxlbmd0aD5wKXRocm93IG5ldyBFcnJvcihmKyIgbWFwIHJlcXVpcmVzIG5zaGFkZXMgdG8gYmUgYXQgbGVhc3Qgc2l6ZSAiK2gubGVuZ3RoKTtmb3Iodj1BcnJheS5pc0FycmF5KHQuYWxwaGEpPzIhPT10LmFscGhhLmxlbmd0aD9bMSwxXTpzKHQuYWxwaGEpOiJudW1iZXIiPT10eXBlb2YgdC5hbHBoYT9bdC5hbHBoYSx0LmFscGhhXTpbMSwxXSxlPWgubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQuaW5kZXgqcCl9KSx2WzBdPDAmJih2WzBdPTApLHZbMV08MCYmKHZbMF09MCksdlswXT4xJiYodlswXT0xKSx2WzFdPjEmJih2WzBdPTEpLHk9MDt5PGUubGVuZ3RoOysreSlnPWhbeV0uaW5kZXgscj1oW3ldLnJnYiw0PT09ci5sZW5ndGgmJnJbM10+PTAmJnJbM108PTF8fChyWzNdPXZbMF0rKHZbMV0tdlswXSkqZyk7Zm9yKHk9MDt5PGUubGVuZ3RoLTE7Kyt5KWM9ZVt5KzFdLWVbeV0sbj1oW3ldLnJnYix1PWhbeSsxXS5yZ2IsYj1iLmNvbmNhdChvLmxpbnNwYWNlKG5bMF0sdVswXSxjKSkseD14LmNvbmNhdChvLmxpbnNwYWNlKG5bMV0sdVsxXSxjKSksXz1fLmNvbmNhdChvLmxpbnNwYWNlKG5bMl0sdVsyXSxjKSksdz13LmNvbmNhdChvLmxpbnNwYWNlKG5bM10sdVszXSxjKSk7cmV0dXJuIGI9Yi5tYXAoTWF0aC5yb3VuZCkseD14Lm1hcChNYXRoLnJvdW5kKSxfPV8ubWFwKE1hdGgucm91bmQpLG09by56aXAoYix4LF8sdyksImhleCI9PT1kJiYobT1tLm1hcChpKSksInJnYmFTdHJpbmciPT09ZCYmKG09bS5tYXAoYSkpLG19ZnVuY3Rpb24gaSh0KXtmb3IodmFyIGUscj0iIyIsbj0wO248MzsrK24pZT10W25dLGU9ZS50b1N0cmluZygxNikscis9KCIwMCIrZSkuc3Vic3RyKGUubGVuZ3RoKTtyZXR1cm4gcn1mdW5jdGlvbiBhKHQpe3JldHVybiJyZ2JhKCIrdC5qb2luKCIsIikrIikifXZhciBvPXQoImFycmF5dG9vbHMiKSxzPXQoImNsb25lIiksbD10KCIuL2NvbG9yU2NhbGVzIik7ZS5leHBvcnRzPW59LHsiLi9jb2xvclNjYWxlcyI6OTYsYXJyYXl0b29sczo0NCxjbG9uZTo4OX1dLDk4OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuPXModFswXSwtZVswXSksaT1zKHRbMV0sLWVbMV0pLGE9cyhyWzBdLC1lWzBdKSxvPXMoclsxXSwtZVsxXSksYz11KGwobixhKSxsKGksbykpO3JldHVybiBjW2MubGVuZ3RoLTFdPj0wfWZ1bmN0aW9uIGkodCxlLHIsaSl7dmFyIHM9YShlLHIsaSk7aWYoMD09PXMpe3ZhciBsPW8oYSh0LGUscikpLHU9byhhKHQsZSxpKSk7aWYobD09PXUpe2lmKDA9PT1sKXt2YXIgYz1uKHQsZSxyKTtyZXR1cm4gYz09PW4odCxlLGkpPzA6Yz8xOi0xfXJldHVybiAwfXJldHVybiAwPT09dT9sPjA/LTE6bih0LGUsaSk/LTE6MTowPT09bD91PjA/MTpuKHQsZSxyKT8xOi0xOm8odS1sKX12YXIgaD1hKHQsZSxyKTtyZXR1cm4gaD4wP3M+MCYmYSh0LGUsaSk+MD8xOi0xOmg8MD9zPjB8fGEodCxlLGkpPjA/MTotMTphKHQsZSxpKT4wPzE6bih0LGUscik/MTotMX1lLmV4cG9ydHM9aTt2YXIgYT10KCJyb2J1c3Qtb3JpZW50YXRpb24iKSxvPXQoInNpZ251bSIpLHM9dCgidHdvLXN1bSIpLGw9dCgicm9idXN0LXByb2R1Y3QiKSx1PXQoInJvYnVzdC1zdW0iKX0seyJyb2J1c3Qtb3JpZW50YXRpb24iOjUwNiwicm9idXN0LXByb2R1Y3QiOjUwNywicm9idXN0LXN1bSI6NTExLHNpZ251bTo1MTMsInR3by1zdW0iOjUzOH1dLDk5OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3JldHVybiB0LWV9ZnVuY3Rpb24gaSh0LGUpe3ZhciByPXQubGVuZ3RoLGk9dC5sZW5ndGgtZS5sZW5ndGg7aWYoaSlyZXR1cm4gaTtzd2l0Y2gocil7Y2FzZSAwOnJldHVybiAwO2Nhc2UgMTpyZXR1cm4gdFswXS1lWzBdO2Nhc2UgMjpyZXR1cm4gdFswXSt0WzFdLWVbMF0tZVsxXXx8YSh0WzBdLHRbMV0pLWEoZVswXSxlWzFdKTtjYXNlIDM6dmFyIG89dFswXSt0WzFdLHM9ZVswXStlWzFdO2lmKGk9byt0WzJdLShzK2VbMl0pKXJldHVybiBpO3ZhciBsPWEodFswXSx0WzFdKSx1PWEoZVswXSxlWzFdKTtyZXR1cm4gYShsLHRbMl0pLWEodSxlWzJdKXx8YShsK3RbMl0sbyktYSh1K2VbMl0scyk7Y2FzZSA0OnZhciBjPXRbMF0saD10WzFdLGY9dFsyXSxkPXRbM10scD1lWzBdLG09ZVsxXSx2PWVbMl0sZz1lWzNdO3JldHVybiBjK2grZitkLShwK20rditnKXx8YShjLGgsZixkKS1hKHAsbSx2LGcscCl8fGEoYytoLGMrZixjK2QsaCtmLGgrZCxmK2QpLWEocCttLHArdixwK2csbSt2LG0rZyx2K2cpfHxhKGMraCtmLGMraCtkLGMrZitkLGgrZitkKS1hKHArbSt2LHArbStnLHArditnLG0rditnKTtkZWZhdWx0OmZvcih2YXIgeT10LnNsaWNlKCkuc29ydChuKSxiPWUuc2xpY2UoKS5zb3J0KG4pLHg9MDt4PHI7Kyt4KWlmKGk9eVt4XS1iW3hdKXJldHVybiBpO3JldHVybiAwfX1lLmV4cG9ydHM9aTt2YXIgYT1NYXRoLm1pbn0se31dLDEwMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGkodCxlKXx8YSh0KS1hKGUpfXZhciBpPXQoImNvbXBhcmUtY2VsbCIpLGE9dCgiY2VsbC1vcmllbnRhdGlvbiIpO2UuZXhwb3J0cz1ufSx7ImNlbGwtb3JpZW50YXRpb24iOjgzLCJjb21wYXJlLWNlbGwiOjk5fV0sMTAxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9dC5sZW5ndGg7aWYoMD09PWUpcmV0dXJuW107aWYoMT09PWUpcmV0dXJuW1swXV07dmFyIHI9dFswXS5sZW5ndGg7cmV0dXJuIDA9PT1yP1tdOjE9PT1yP2kodCk6Mj09PXI/YSh0KTpvKHQscil9dmFyIGk9dCgiLi9saWIvY2gxZCIpLGE9dCgiLi9saWIvY2gyZCIpLG89dCgiLi9saWIvY2huZCIpO2UuZXhwb3J0cz1ufSx7Ii4vbGliL2NoMWQiOjEwMiwiLi9saWIvY2gyZCI6MTAzLCIuL2xpYi9jaG5kIjoxMDR9XSwxMDI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGU9MCxyPTAsbj0xO248dC5sZW5ndGg7KytuKXRbbl1bMF08dFtlXVswXSYmKGU9biksdFtuXVswXT50W3JdWzBdJiYocj1uKTtyZXR1cm4gZTxyP1tbZV0sW3JdXTplPnI/W1tyXSxbZV1dOltbZV1dfWUuZXhwb3J0cz1ufSx7fV0sMTAzOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7dmFyIGU9aSh0KSxyPWUubGVuZ3RoO2lmKHI8PTIpcmV0dXJuW107Zm9yKHZhciBuPW5ldyBBcnJheShyKSxhPWVbci0xXSxvPTA7bzxyOysrbyl7dmFyIHM9ZVtvXTtuW29dPVthLHNdLGE9c31yZXR1cm4gbn1lLmV4cG9ydHM9bjt2YXIgaT10KCJtb25vdG9uZS1jb252ZXgtaHVsbC0yZCIpfSx7Im1vbm90b25lLWNvbnZleC1odWxsLTJkIjo0NDl9XSwxMDQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe2Zvcih2YXIgcj10Lmxlbmd0aCxuPW5ldyBBcnJheShyKSxpPTA7aTxlLmxlbmd0aDsrK2kpbltpXT10W2VbaV1dO2Zvcih2YXIgYT1lLmxlbmd0aCxpPTA7aTxyOysraSllLmluZGV4T2YoaSk8MCYmKG5bYSsrXT10W2ldKTtyZXR1cm4gbn1mdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciByPXQubGVuZ3RoLG49ZS5sZW5ndGgsaT0wO2k8cjsrK2kpZm9yKHZhciBhPXRbaV0sbz0wO288YS5sZW5ndGg7KytvKXt2YXIgcz1hW29dO2lmKHM8bilhW29dPWVbc107ZWxzZXtzLT1uO2Zvcih2YXIgbD0wO2w8bjsrK2wpcz49ZVtsXSYmKHMrPTEpO2Fbb109c319cmV0dXJuIHR9ZnVuY3Rpb24gYSh0LGUpe3RyeXtyZXR1cm4gbyh0LCEwKX1jYXRjaCh1KXt2YXIgcj1zKHQpO2lmKHIubGVuZ3RoPD1lKXJldHVybltdO3ZhciBhPW4odCxyKSxsPW8oYSwhMCk7cmV0dXJuIGkobCxyKX19ZS5leHBvcnRzPWE7dmFyIG89dCgiaW5jcmVtZW50YWwtY29udmV4LWh1bGwiKSxzPXQoImFmZmluZS1odWxsIil9LHsiYWZmaW5lLWh1bGwiOjM5LCJpbmNyZW1lbnRhbC1jb252ZXgtaHVsbCI6Mjg4fV0sMTA1OltmdW5jdGlvbih0LGUscil7ZS5leHBvcnRzPXtBRkc6ImFmZ2hhbiIsQUxBOiJcXGJcXHdsYW5kIixBTEI6ImFsYmFuaWEiLERaQToiYWxnZXJpYSIsQVNNOiJeKD89LiphbWVyaWMpLipzYW1vYSIsQU5EOiJhbmRvcnJhIixBR086ImFuZ29sYSIsQUlBOiJhbmd1aWxsP2EiLEFUQToiYW50YXJjdGljYSIsQVRHOiJhbnRpZ3VhIixBUkc6ImFyZ2VudGluIixBUk06ImFybWVuaWEiLEFCVzoiXig/IS4qYm9uYWlyZSkuKlxcYmFydWJhIixBVVM6ImF1c3RyYWxpYSIsQVVUOiJeKD8hLipodW5nYXJ5KS4qYXVzdHJpYXxcXGJhdXN0cmkuKlxcYmVtcCIsQVpFOiJhemVyYmFpamFuIixCSFM6ImJhaGFtYXMiLEJIUjoiYmFocmFpbiIsQkdEOiJiYW5nbGFkZXNofF4oPz0uKmVhc3QpLipwYWtpP3N0YW4iLEJSQjoiYmFyYmFkb3MiLEJMUjoiYmVsYXJ1c3xieWVsbyIsQkVMOiJeKD8hLipsdXhlbSkuKmJlbGdpdW0iLEJMWjoiYmVsaXplfF4oPz0uKmJyaXRpc2gpLipob25kdXJhcyIsQkVOOiJiZW5pbnxkYWhvbWUiLEJNVToiYmVybXVkYSIsQlROOiJiaHV0YW4iLEJPTDoiYm9saXZpYSIsQkVTOiJeKD89Lipib25haXJlKS4qZXVzdGF0aXVzfF4oPz0uKmNhcmliKS4qbmV0aGVybGFuZHN8XFxiYmVzLj9pc2xhbmRzIixCSUg6ImhlcnplZ292aW5hfGJvc25pYSIsQldBOiJib3Rzd2FuYXxiZWNodWFuYSIsQlZUOiJib3V2ZXQiLEJSQToiYnJhemlsIixJT1Q6ImJyaXRpc2guP2luZGlhbi4/b2NlYW4iLEJSTjoiYnJ1bmVpIixCR1I6ImJ1bGdhcmlhIixCRkE6ImJ1cmtpbmF8XFxiZmFzb3x1cHBlci4/dm9sdGEiLEJESToiYnVydW5kaSIsQ1BWOiJ2ZXJkZSIsS0hNOiJjYW1ib2RpYXxrYW1wdWNoZWF8a2htZXIiLENNUjoiY2FtZXJvb24iLENBTjoiY2FuYWRhIixDWU06ImNheW1hbiIsQ0FGOiJcXGJjZW50cmFsLmFmcmljYW4ucmVwdWJsaWMiLFRDRDoiXFxiY2hhZCIsQ0hMOiJcXGJjaGlsZSIsQ0hOOiJeKD8hLipcXGJtYWMpKD8hLipcXGJob25nKSg/IS4qXFxidGFpKSg/IS4qXFxicmVwKS4qY2hpbmF8Xig/PS4qcGVvKSg/PS4qcmVwKS4qY2hpbmEiLENYUjoiY2hyaXN0bWFzIixDQ0s6IlxcYmNvY29zfGtlZWxpbmciLENPTDoiY29sb21iaWEiLENPTToiY29tb3JvIixDT0c6Il4oPyEuKlxcYmRlbSkoPyEuKlxcYmRbXFwuXT9yKSg/IS4qa2luc2hhc2EpKD8hLip6YWlyZSkoPyEuKmJlbGcpKD8hLipsLm9wb2xkdmlsbGUpKD8hLipmcmVlKS4qXFxiY29uZ28iLENPSzoiXFxiY29vayIsQ1JJOiJjb3N0YS4/cmljYSIsQ0lWOiJpdm9pcmV8aXZvcnkiLEhSVjoiY3JvYXRpYSIsQ1VCOiJcXGJjdWJhIixDVVc6Il4oPyEuKmJvbmFpcmUpLipcXGJjdXJhKGN8XHhlNylhbyIsQ1lQOiJjeXBydXMiLENTSzoiY3plY2hvc2xvdmFraWEiLENaRToiXig/PS4qcmVwKS4qY3plY2h8Y3plY2hpYXxib2hlbWlhIixDT0Q6IlxcYmRlbS4qY29uZ298Y29uZ28uKlxcYmRlbXxjb25nby4qXFxiZFtcXC5dP3J8XFxiZFtcXC5dP3IuKmNvbmdvfGJlbGdpYW4uP2NvbmdvfGNvbmdvLj9mcmVlLj9zdGF0ZXxraW5zaGFzYXx6YWlyZXxsLm9wb2xkdmlsbGV8ZHJjfGRyb2N8cmRjIixETks6ImRlbm1hcmsiLERKSToiZGppYm91dGkiLERNQToiZG9taW5pY2EoPyFuKSIsRE9NOiJkb21pbmljYW4ucmVwIixFQ1U6ImVjdWFkb3IiLEVHWToiZWd5cHQiLFNMVjoiZWwuP3NhbHZhZG9yIixHTlE6Imd1aW5lLiplcXxlcS4qZ3VpbmV8Xig/PS4qc3BhbikuKmd1aW5lYSIsRVJJOiJlcml0cmVhIixFU1Q6ImVzdG9uaWEiLEVUSDoiZXRoaW9waWF8YWJ5c3NpbmlhIixGTEs6ImZhbGtsYW5kfG1hbHZpbmFzIixGUk86ImZhcm9lfGZhZXJvZSIsRkpJOiJmaWppIixGSU46ImZpbmxhbmQiLEZSQToiXig/IS4qXFxiZGVwKSg/IS4qbWFydGluaXF1ZSkuKmZyYW5jZXxmcmVuY2guP3JlcHVibGljfFxcYmdhdWwiLEdVRjoiXig/PS4qZnJlbmNoKS4qZ3VpYW5hIixQWUY6ImZyZW5jaC4/cG9seW5lc2lhfHRhaGl0aSIsQVRGOiJmcmVuY2guP3NvdXRoZXJuIixHQUI6ImdhYm9uIixHTUI6ImdhbWJpYSIsR0VPOiJeKD8hLipzb3V0aCkuKmdlb3JnaWEiLEREUjoiZ2VybWFuLj9kZW1vY3JhdGljLj9yZXB1YmxpY3xkZW1vY3JhdGljLj9yZXB1YmxpYy4qZ2VybWFueXxlYXN0Lmdlcm1hbnkiLERFVToiXig/IS4qZWFzdCkuKmdlcm1hbnl8Xig/PS4qXFxiZmVkLipcXGJyZXApLipnZXJtYW4iLEdIQToiZ2hhbmF8Z29sZC4/Y29hc3QiLEdJQjoiZ2licmFsdGFyIixHUkM6ImdyZWVjZXxoZWxsZW5pY3xoZWxsYXMiLEdSTDoiZ3JlZW5sYW5kIixHUkQ6ImdyZW5hZGEiLEdMUDoiZ3VhZGVsb3VwZSIsR1VNOiJcXGJndWFtIixHVE06Imd1YXRlbWFsYSIsR0dZOiJndWVybnNleSIsR0lOOiJeKD8hLiplcSkoPyEuKnNwYW4pKD8hLipiaXNzYXUpKD8hLipwb3J0dSkoPyEuKm5ldykuKmd1aW5lYSIsR05COiJiaXNzYXV8Xig/PS4qcG9ydHUpLipndWluZWEiLEdVWToiZ3V5YW5hfGJyaXRpc2guP2d1aWFuYSIsSFRJOiJoYWl0aSIsSE1EOiJoZWFyZC4qbWNkb25hbGQiLFZBVDoiaG9seS4/c2VlfHZhdGljYW58cGFwYWwuP3N0IixITkQ6Il4oPyEuKmJyaXQpLipob25kdXJhcyIsSEtHOiJob25nLj9rb25nIixIVU46Il4oPyEuKmF1c3RyKS4qaHVuZ2FyeSIsSVNMOiJpY2VsYW5kIixJTkQ6ImluZGlhKD8hLipvY2VhKSIsSUROOiJpbmRvbmVzaWEiLElSTjoiXFxiaXJhbnxwZXJzaWEiLElSUToiXFxiaXJhcXxtZXNvcG90YW1pYSIsSVJMOiIoXmlyZWxhbmQpfChecmVwdWJsaWMuKmlyZWxhbmQpIixJTU46Il4oPz0uKmlzbGUpLipcXGJtYW4iLElTUjoiaXNyYWVsIixJVEE6Iml0YWx5IixKQU06ImphbWFpY2EiLEpQTjoiamFwYW4iLEpFWToiamVyc2V5IixKT1I6ImpvcmRhbiIsS0FaOiJrYXphayIsS0VOOiJrZW55YXxicml0aXNoLj9lYXN0Lj9hZnJpY2F8ZWFzdC4/YWZyaWNhLj9wcm90IixLSVI6ImtpcmliYXRpIixQUks6Il4oPz0uKmRlbW9jcmF0fHBlb3BsZXxub3J0aHxkLipwLioucikuKlxcYmtvcmVhfGRwcmt8a29yZWEuKihkLipwLipyKSIsS1dUOiJrdXdhaXQiLEtHWjoia3lyZ3l6fGtpcmdoaXoiLExBTzoiXFxibGFvcz9cXGIiLExWQToibGF0dmlhIixMQk46ImxlYmFub24iLExTTzoibGVzb3Rob3xiYXN1dG8iLExCUjoibGliZXJpYSIsTEJZOiJsaWJ5YSIsTElFOiJsaWVjaHRlbnN0ZWluIixMVFU6ImxpdGh1YW5pYSIsTFVYOiJeKD8hLipiZWxnKS4qbHV4ZW0iLE1BQzoibWFjYShvfHUpIixNREc6Im1hZGFnYXNjYXJ8bWFsYWdhc3kiLE1XSToibWFsYXdpfG55YXNhIixNWVM6Im1hbGF5c2lhIixNRFY6Im1hbGRpdmUiLE1MSToiXFxibWFsaVxcYiIsTUxUOiJcXGJtYWx0YSIsTUhMOiJtYXJzaGFsbCIsTVRROiJtYXJ0aW5pcXVlIixNUlQ6Im1hdXJpdGFuaWEiLE1VUzoibWF1cml0aXVzIixNWVQ6IlxcYm1heW90dGUiLE1FWDoiXFxibWV4aWMiLEZTTToiZmVkLiptaWNyb25lc2lhfG1pY3JvbmVzaWEuKmZlZCIsTUNPOiJtb25hY28iLE1ORzoibW9uZ29saWEiLE1ORToiXig/IS4qc2VyYmlhKS4qbW9udGVuZWdybyIsTVNSOiJtb250c2VycmF0IixNQVI6Im1vcm9jY298XFxibWFyb2MiLE1PWjoibW96YW1iaXF1ZSIsTU1SOiJteWFubWFyfGJ1cm1hIixOQU06Im5hbWliaWEiLE5SVToibmF1cnUiLE5QTDoibmVwYWwiLE5MRDoiXig/IS4qXFxiYW50KSg/IS4qXFxiY2FyaWIpLipuZXRoZXJsYW5kcyIsQU5UOiJeKD89LipcXGJhbnQpLioobmV0aGVyfGR1dGNoKSIsTkNMOiJuZXcuP2NhbGVkb25pYSIsTlpMOiJuZXcuP3plYWxhbmQiLE5JQzoibmljYXJhZ3VhIixORVI6IlxcYm5pZ2VyKD8haWEpIixOR0E6Im5pZ2VyaWEiLE5JVToibml1ZSIsTkZLOiJub3Jmb2xrIixNTlA6Im1hcmlhbmEiLE5PUjoibm9yd2F5IixPTU46IlxcYm9tYW58dHJ1Y2lhbCIsUEFLOiJeKD8hLiplYXN0KS4qcGFraT9zdGFuIixQTFc6InBhbGF1IixQU0U6InBhbGVzdGlufFxcYmdhemF8d2VzdC4/YmFuayIsUEFOOiJwYW5hbWEiLFBORzoicGFwdWF8bmV3Lj9ndWluZWEiLFBSWToicGFyYWd1YXkiLFBFUjoicGVydSIsUEhMOiJwaGlsaXBwaW5lcyIsUENOOiJwaXRjYWlybiIsUE9MOiJwb2xhbmQiLFBSVDoicG9ydHVnYWwiLFBSSToicHVlcnRvLj9yaWNvIixRQVQ6InFhdGFyIixLT1I6Il4oPyEuKmQuKnAuKnIpKD8hLipkZW1vY3JhdCkoPyEuKnBlb3BsZSkoPyEuKm5vcnRoKS4qXFxia29yZWEoPyEuKmQuKnAuKnIpIixNREE6Im1vbGRvdnxiKGF8ZSlzc2FyYWJpYSIsUkVVOiJyKGV8XHhlOSl1bmlvbiIsUk9VOiJyKG98dXxvdSltYW5pYSIsUlVTOiJcXGJydXNzaWF8c292aWV0Lj91bmlvbnx1XFwuP3NcXC4/c1xcLj9yfHNvY2lhbGlzdC4/cmVwdWJsaWNzIixSV0E6InJ3YW5kYSIsQkxNOiJiYXJ0aChlfFx4ZTkpbGVteSIsU0hOOiJoZWxlbmEiLEtOQToia2l0dHN8XFxibmV2aXMiLExDQToiXFxibHVjaWEiLE1BRjoiXig/PS4qY29sbGVjdGl2aXR5KS4qbWFydGlufF4oPz0uKmZyYW5jZSkuKm1hcnRpbig/IWlxdWUpfF4oPz0uKmZyZW5jaCkuKm1hcnRpbig/IWlxdWUpIixTUE06Im1pcXVlbG9uIixWQ1Q6InZpbmNlbnQiLFdTTToiXig/IS4qYW1lcikuKnNhbW9hIixTTVI6InNhbi4/bWFyaW5vIixTVFA6IlxcYnMoYXxceGUzKW8uP3RvbShlfFx4ZTkpIixTQVU6IlxcYnNhXFx3Ki4/YXJhYmlhIixTRU46InNlbmVnYWwiLFNSQjoiXig/IS4qbW9udGUpLipzZXJiaWEiLFNZQzoic2V5Y2hlbGwiLFNMRToic2llcnJhIixTR1A6InNpbmdhcG9yZSIsU1hNOiJeKD8hLiptYXJ0aW4pKD8hLipzYWJhKS4qbWFhcnRlbiIsU1ZLOiJeKD8hLipjemUpLipzbG92YWsiLFNWTjoic2xvdmVuaWEiLFNMQjoic29sb21vbiIsU09NOiJzb21hbGkiLFpBRjoic291dGguYWZyaWNhfHNcXFxcLi4/YWZyaWNhIixTR1M6InNvdXRoLj9nZW9yZ2lhfHNhbmR3aWNoIixTU0Q6IlxcYnNcXHcqLj9zdWRhbiIsRVNQOiJzcGFpbiIsTEtBOiJzcmkuP2xhbmthfGNleWxvbiIsU0ROOiJeKD8hLipcXGJzKD8hdSkpLipzdWRhbiIsU1VSOiJzdXJpbmFtfGR1dGNoLj9ndWlhbmEiLFNKTToic3ZhbGJhcmQiLFNXWjoic3dhemlsYW5kIixTV0U6InN3ZWRlbiIsQ0hFOiJzd2l0enxzd2lzcyIsU1lSOiJzeXJpYSIsVFdOOiJ0YWl3YW58dGFpcGVpfGZvcm1vc2F8Xig/IS4qcGVvKSg/PS4qcmVwKS4qY2hpbmEiLFRKSzoidGFqaWsiLFRIQToidGhhaWxhbmR8XFxic2lhbSIsTUtEOiJtYWNlZG9uaWF8Znlyb20iLFRMUzoiXig/PS4qbGVzdGUpLip0aW1vcnxeKD89LiplYXN0KS4qdGltb3IiLFRHTzoidG9nbyIsVEtMOiJ0b2tlbGF1IixUT046InRvbmdhIixUVE86InRyaW5pZGFkfHRvYmFnbyIsVFVOOiJ0dW5pc2lhIixUVVI6InR1cmtleSIsVEtNOiJ0dXJrbWVuIixUQ0E6InR1cmtzIixUVVY6InR1dmFsdSIsVUdBOiJ1Z2FuZGEiLFVLUjoidWtyYWluIixBUkU6ImVtaXJhdGVzfF51XFwuP2FcXC4/ZVxcLj8kfHVuaXRlZC4/YXJhYi4/ZW0iLEdCUjoidW5pdGVkLj9raW5nZG9tfGJyaXRhaW58XnVcXC4/a1xcLj8kIixUWkE6InRhbnphbmlhIixVU0E6InVuaXRlZC4/c3RhdGVzXFxiKD8hLippc2xhbmRzKXxcXGJ1XFwuP3NcXC4/YVxcLj9cXGJ8Xlxccyp1XFwuP3NcXC4/XFxiKD8hLippc2xhbmRzKSIsVU1JOiJtaW5vci4/b3V0bHlpbmcuP2lzIixVUlk6InVydWd1YXkiLFVaQjoidXpiZWsiLFZVVDoidmFudWF0dXxuZXcuP2hlYnJpZGVzIixWRU46InZlbmV6dWVsYSIsVk5NOiJeKD8hLipyZXB1YmxpYykuKnZpZXQuP25hbXxeKD89Lipzb2NpYWxpc3QpLip2aWV0Lj9uYW0iLFZHQjoiXig/PS4qXFxidVxcLj9cXHM/aykuKnZpcmdpbnxeKD89Lipicml0KS4qdmlyZ2lufF4oPz0uKmtpbmdkb20pLip2aXJnaW4iLFZJUjoiXig/PS4qXFxidVxcLj9cXHM/cykuKnZpcmdpbnxeKD89LipzdGF0ZXMpLip2aXJnaW4iLFdMRjoiZnV0dW5hfHdhbGxpcyIsRVNIOiJ3ZXN0ZXJuLnNhaGFyYSIsWUVNOiJeKD8hLiphcmFiKSg/IS4qbm9ydGgpKD8hLipzYW5hKSg/IS4qcGVvKSg/IS4qZGVtKSg/IS4qc291dGgpKD8hLiphZGVuKSg/IS4qXFxicFxcLj9kXFwuP3IpLip5ZW1lbiIsWU1EOiJeKD89LipwZW8pLip5ZW1lbnxeKD8hLipyZXApKD89LipkZW0pLip5ZW1lbnxeKD89Lipzb3V0aCkuKnllbWVufF4oPz0uKmFkZW4pLip5ZW1lbnxeKD89LipcXGJwXFwuP2RcXC4/cikuKnllbWVuIixZVUc6Inl1Z29zbGF2aWEiLFpNQjoiemFtYmlhfG5vcnRoZXJuLj9yaG9kZXNpYSIsRUFaOiJ6YW56aWJhciIsWldFOiJ6aW1iYWJ3ZXxeKD8hLipub3J0aGVybikuKnJob2Rlc2lhIn19LHt9XSwxMDY6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3JldHVybiB0PU1hdGgucm91bmQodCksdDwwPzA6dD4yNTU/MjU1OnR9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdDwwPzA6dD4xPzE6dH1mdW5jdGlvbiBhKHQpe3JldHVybiBuKCIlIj09PXRbdC5sZW5ndGgtMV0/cGFyc2VGbG9hdCh0KS8xMDAqMjU1OnBhcnNlSW50KHQpKX1mdW5jdGlvbiBvKHQpe3JldHVybiBpKCIlIj09PXRbdC5sZW5ndGgtMV0/cGFyc2VGbG9hdCh0KS8xMDA6cGFyc2VGbG9hdCh0KSl9ZnVuY3Rpb24gcyh0LGUscil7cmV0dXJuIHI8MD9yKz0xOnI+MSYmKHItPTEpLDYqcjwxP3QrKGUtdCkqcio2OjIqcjwxP2U6MypyPDI/dCsoZS10KSooMi8zLXIpKjY6dH1mdW5jdGlvbiBsKHQpe3ZhciBlPXQucmVwbGFjZSgvIC9nLCIiKS50b0xvd2VyQ2FzZSgpO2lmKGUgaW4gdSlyZXR1cm4gdVtlXS5zbGljZSgpO2lmKCIjIj09PWVbMF0pe2lmKDQ9PT1lLmxlbmd0aCl7dmFyIHI9cGFyc2VJbnQoZS5zdWJzdHIoMSksMTYpO3JldHVybiByPj0wJiZyPD00MDk1P1soMzg0MCZyKT4+NHwoMzg0MCZyKT4+OCwyNDAmcnwoMjQwJnIpPj40LDE1JnJ8KDE1JnIpPDw0LDFdOm51bGx9aWYoNz09PWUubGVuZ3RoKXt2YXIgcj1wYXJzZUludChlLnN1YnN0cigxKSwxNik7cmV0dXJuIHI+PTAmJnI8PTE2Nzc3MjE1P1soMTY3MTE2ODAmcik+PjE2LCg2NTI4MCZyKT4+OCwyNTUmciwxXTpudWxsfXJldHVybiBudWxsfXZhciBpPWUuaW5kZXhPZigiKCIpLGw9ZS5pbmRleE9mKCIpIik7aWYoLTEhPT1pJiZsKzE9PT1lLmxlbmd0aCl7dmFyIGM9ZS5zdWJzdHIoMCxpKSxoPWUuc3Vic3RyKGkrMSxsLShpKzEpKS5zcGxpdCgiLCIpLGY9MTtzd2l0Y2goYyl7Y2FzZSJyZ2JhIjppZig0IT09aC5sZW5ndGgpcmV0dXJuIG51bGw7Zj1vKGgucG9wKCkpO2Nhc2UicmdiIjpyZXR1cm4gMyE9PWgubGVuZ3RoP251bGw6W2EoaFswXSksYShoWzFdKSxhKGhbMl0pLGZdO2Nhc2UiaHNsYSI6aWYoNCE9PWgubGVuZ3RoKXJldHVybiBudWxsO2Y9byhoLnBvcCgpKTtjYXNlImhzbCI6aWYoMyE9PWgubGVuZ3RoKXJldHVybiBudWxsO3ZhciBkPShwYXJzZUZsb2F0KGhbMF0pJTM2MCszNjApJTM2MC8zNjAscD1vKGhbMV0pLG09byhoWzJdKSx2PW08PS41P20qKHArMSk6bStwLW0qcCxnPTIqbS12O3JldHVybltuKDI1NSpzKGcsdixkKzEvMykpLG4oMjU1KnMoZyx2LGQpKSxuKDI1NSpzKGcsdixkLTEvMykpLGZdO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXJldHVybiBudWxsfXZhciB1PXt0cmFuc3BhcmVudDpbMCwwLDAsMF0sYWxpY2VibHVlOlsyNDAsMjQ4LDI1NSwxXSxhbnRpcXVld2hpdGU6WzI1MCwyMzUsMjE1LDFdLGFxdWE6WzAsMjU1LDI1NSwxXSxhcXVhbWFyaW5lOlsxMjcsMjU1LDIxMiwxXSxhenVyZTpbMjQwLDI1NSwyNTUsMV0sYmVpZ2U6WzI0NSwyNDUsMjIwLDFdLGJpc3F1ZTpbMjU1LDIyOCwxOTYsMV0sYmxhY2s6WzAsMCwwLDFdLGJsYW5jaGVkYWxtb25kOlsyNTUsMjM1LDIwNSwxXSxibHVlOlswLDAsMjU1LDFdLGJsdWV2aW9sZXQ6WzEzOCw0MywyMjYsMV0sYnJvd246WzE2NSw0Miw0MiwxXSxidXJseXdvb2Q6WzIyMiwxODQsMTM1LDFdLGNhZGV0Ymx1ZTpbOTUsMTU4LDE2MCwxXSxjaGFydHJldXNlOlsxMjcsMjU1LDAsMV0sY2hvY29sYXRlOlsyMTAsMTA1LDMwLDFdLGNvcmFsOlsyNTUsMTI3LDgwLDFdLGNvcm5mbG93ZXJibHVlOlsxMDAsMTQ5LDIzNywxXSxjb3Juc2lsazpbMjU1LDI0OCwyMjAsMV0sY3JpbXNvbjpbMjIwLDIwLDYwLDFdLGN5YW46WzAsMjU1LDI1NSwxXSxkYXJrYmx1ZTpbMCwwLDEzOSwxXSxkYXJrY3lhbjpbMCwxMzksMTM5LDFdLGRhcmtnb2xkZW5yb2Q6WzE4NCwxMzQsMTEsMV0sZGFya2dyYXk6WzE2OSwxNjksMTY5LDFdLGRhcmtncmVlbjpbMCwxMDAsMCwxXSxkYXJrZ3JleTpbMTY5LDE2OSwxNjksMV0sZGFya2toYWtpOlsxODksMTgzLDEwNywxXSwKZGFya21hZ2VudGE6WzEzOSwwLDEzOSwxXSxkYXJrb2xpdmVncmVlbjpbODUsMTA3LDQ3LDFdLGRhcmtvcmFuZ2U6WzI1NSwxNDAsMCwxXSxkYXJrb3JjaGlkOlsxNTMsNTAsMjA0LDFdLGRhcmtyZWQ6WzEzOSwwLDAsMV0sZGFya3NhbG1vbjpbMjMzLDE1MCwxMjIsMV0sZGFya3NlYWdyZWVuOlsxNDMsMTg4LDE0MywxXSxkYXJrc2xhdGVibHVlOls3Miw2MSwxMzksMV0sZGFya3NsYXRlZ3JheTpbNDcsNzksNzksMV0sZGFya3NsYXRlZ3JleTpbNDcsNzksNzksMV0sZGFya3R1cnF1b2lzZTpbMCwyMDYsMjA5LDFdLGRhcmt2aW9sZXQ6WzE0OCwwLDIxMSwxXSxkZWVwcGluazpbMjU1LDIwLDE0NywxXSxkZWVwc2t5Ymx1ZTpbMCwxOTEsMjU1LDFdLGRpbWdyYXk6WzEwNSwxMDUsMTA1LDFdLGRpbWdyZXk6WzEwNSwxMDUsMTA1LDFdLGRvZGdlcmJsdWU6WzMwLDE0NCwyNTUsMV0sZmlyZWJyaWNrOlsxNzgsMzQsMzQsMV0sZmxvcmFsd2hpdGU6WzI1NSwyNTAsMjQwLDFdLGZvcmVzdGdyZWVuOlszNCwxMzksMzQsMV0sZnVjaHNpYTpbMjU1LDAsMjU1LDFdLGdhaW5zYm9ybzpbMjIwLDIyMCwyMjAsMV0sZ2hvc3R3aGl0ZTpbMjQ4LDI0OCwyNTUsMV0sZ29sZDpbMjU1LDIxNSwwLDFdLGdvbGRlbnJvZDpbMjE4LDE2NSwzMiwxXSxncmF5OlsxMjgsMTI4LDEyOCwxXSxncmVlbjpbMCwxMjgsMCwxXSxncmVlbnllbGxvdzpbMTczLDI1NSw0NywxXSxncmV5OlsxMjgsMTI4LDEyOCwxXSxob25leWRldzpbMjQwLDI1NSwyNDAsMV0saG90cGluazpbMjU1LDEwNSwxODAsMV0saW5kaWFucmVkOlsyMDUsOTIsOTIsMV0saW5kaWdvOls3NSwwLDEzMCwxXSxpdm9yeTpbMjU1LDI1NSwyNDAsMV0sa2hha2k6WzI0MCwyMzAsMTQwLDFdLGxhdmVuZGVyOlsyMzAsMjMwLDI1MCwxXSxsYXZlbmRlcmJsdXNoOlsyNTUsMjQwLDI0NSwxXSxsYXduZ3JlZW46WzEyNCwyNTIsMCwxXSxsZW1vbmNoaWZmb246WzI1NSwyNTAsMjA1LDFdLGxpZ2h0Ymx1ZTpbMTczLDIxNiwyMzAsMV0sbGlnaHRjb3JhbDpbMjQwLDEyOCwxMjgsMV0sbGlnaHRjeWFuOlsyMjQsMjU1LDI1NSwxXSxsaWdodGdvbGRlbnJvZHllbGxvdzpbMjUwLDI1MCwyMTAsMV0sbGlnaHRncmF5OlsyMTEsMjExLDIxMSwxXSxsaWdodGdyZWVuOlsxNDQsMjM4LDE0NCwxXSxsaWdodGdyZXk6WzIxMSwyMTEsMjExLDFdLGxpZ2h0cGluazpbMjU1LDE4MiwxOTMsMV0sbGlnaHRzYWxtb246WzI1NSwxNjAsMTIyLDFdLGxpZ2h0c2VhZ3JlZW46WzMyLDE3OCwxNzAsMV0sbGlnaHRza3libHVlOlsxMzUsMjA2LDI1MCwxXSxsaWdodHNsYXRlZ3JheTpbMTE5LDEzNiwxNTMsMV0sbGlnaHRzbGF0ZWdyZXk6WzExOSwxMzYsMTUzLDFdLGxpZ2h0c3RlZWxibHVlOlsxNzYsMTk2LDIyMiwxXSxsaWdodHllbGxvdzpbMjU1LDI1NSwyMjQsMV0sbGltZTpbMCwyNTUsMCwxXSxsaW1lZ3JlZW46WzUwLDIwNSw1MCwxXSxsaW5lbjpbMjUwLDI0MCwyMzAsMV0sbWFnZW50YTpbMjU1LDAsMjU1LDFdLG1hcm9vbjpbMTI4LDAsMCwxXSxtZWRpdW1hcXVhbWFyaW5lOlsxMDIsMjA1LDE3MCwxXSxtZWRpdW1ibHVlOlswLDAsMjA1LDFdLG1lZGl1bW9yY2hpZDpbMTg2LDg1LDIxMSwxXSxtZWRpdW1wdXJwbGU6WzE0NywxMTIsMjE5LDFdLG1lZGl1bXNlYWdyZWVuOls2MCwxNzksMTEzLDFdLG1lZGl1bXNsYXRlYmx1ZTpbMTIzLDEwNCwyMzgsMV0sbWVkaXVtc3ByaW5nZ3JlZW46WzAsMjUwLDE1NCwxXSxtZWRpdW10dXJxdW9pc2U6WzcyLDIwOSwyMDQsMV0sbWVkaXVtdmlvbGV0cmVkOlsxOTksMjEsMTMzLDFdLG1pZG5pZ2h0Ymx1ZTpbMjUsMjUsMTEyLDFdLG1pbnRjcmVhbTpbMjQ1LDI1NSwyNTAsMV0sbWlzdHlyb3NlOlsyNTUsMjI4LDIyNSwxXSxtb2NjYXNpbjpbMjU1LDIyOCwxODEsMV0sbmF2YWpvd2hpdGU6WzI1NSwyMjIsMTczLDFdLG5hdnk6WzAsMCwxMjgsMV0sb2xkbGFjZTpbMjUzLDI0NSwyMzAsMV0sb2xpdmU6WzEyOCwxMjgsMCwxXSxvbGl2ZWRyYWI6WzEwNywxNDIsMzUsMV0sb3JhbmdlOlsyNTUsMTY1LDAsMV0sb3JhbmdlcmVkOlsyNTUsNjksMCwxXSxvcmNoaWQ6WzIxOCwxMTIsMjE0LDFdLHBhbGVnb2xkZW5yb2Q6WzIzOCwyMzIsMTcwLDFdLHBhbGVncmVlbjpbMTUyLDI1MSwxNTIsMV0scGFsZXR1cnF1b2lzZTpbMTc1LDIzOCwyMzgsMV0scGFsZXZpb2xldHJlZDpbMjE5LDExMiwxNDcsMV0scGFwYXlhd2hpcDpbMjU1LDIzOSwyMTMsMV0scGVhY2hwdWZmOlsyNTUsMjE4LDE4NSwxXSxwZXJ1OlsyMDUsMTMzLDYzLDFdLHBpbms6WzI1NSwxOTIsMjAzLDFdLHBsdW06WzIyMSwxNjAsMjIxLDFdLHBvd2RlcmJsdWU6WzE3NiwyMjQsMjMwLDFdLHB1cnBsZTpbMTI4LDAsMTI4LDFdLHJlYmVjY2FwdXJwbGU6WzEwMiw1MSwxNTMsMV0scmVkOlsyNTUsMCwwLDFdLHJvc3licm93bjpbMTg4LDE0MywxNDMsMV0scm95YWxibHVlOls2NSwxMDUsMjI1LDFdLHNhZGRsZWJyb3duOlsxMzksNjksMTksMV0sc2FsbW9uOlsyNTAsMTI4LDExNCwxXSxzYW5keWJyb3duOlsyNDQsMTY0LDk2LDFdLHNlYWdyZWVuOls0NiwxMzksODcsMV0sc2Vhc2hlbGw6WzI1NSwyNDUsMjM4LDFdLHNpZW5uYTpbMTYwLDgyLDQ1LDFdLHNpbHZlcjpbMTkyLDE5MiwxOTIsMV0sc2t5Ymx1ZTpbMTM1LDIwNiwyMzUsMV0sc2xhdGVibHVlOlsxMDYsOTAsMjA1LDFdLHNsYXRlZ3JheTpbMTEyLDEyOCwxNDQsMV0sc2xhdGVncmV5OlsxMTIsMTI4LDE0NCwxXSxzbm93OlsyNTUsMjUwLDI1MCwxXSxzcHJpbmdncmVlbjpbMCwyNTUsMTI3LDFdLHN0ZWVsYmx1ZTpbNzAsMTMwLDE4MCwxXSx0YW46WzIxMCwxODAsMTQwLDFdLHRlYWw6WzAsMTI4LDEyOCwxXSx0aGlzdGxlOlsyMTYsMTkxLDIxNiwxXSx0b21hdG86WzI1NSw5OSw3MSwxXSx0dXJxdW9pc2U6WzY0LDIyNCwyMDgsMV0sdmlvbGV0OlsyMzgsMTMwLDIzOCwxXSx3aGVhdDpbMjQ1LDIyMiwxNzksMV0sd2hpdGU6WzI1NSwyNTUsMjU1LDFdLHdoaXRlc21va2U6WzI0NSwyNDUsMjQ1LDFdLHllbGxvdzpbMjU1LDI1NSwwLDFdLHllbGxvd2dyZWVuOlsxNTQsMjA1LDUwLDFdfTt0cnl7ci5wYXJzZUNTU0NvbG9yPWx9Y2F0Y2godCl7fX0se31dLDEwNzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSxhKXt2YXIgbz02KmkqaS02Kmkscz0zKmkqaS00KmkrMSxsPS02KmkqaSs2KmksdT0zKmkqaS0yKmk7aWYodC5sZW5ndGgpe2F8fChhPW5ldyBBcnJheSh0Lmxlbmd0aCkpO2Zvcih2YXIgYz10Lmxlbmd0aC0xO2M+PTA7LS1jKWFbY109byp0W2NdK3MqZVtjXStsKnJbY10rdSpuW2NdO3JldHVybiBhfXJldHVybiBvKnQrcyplK2wqcltjXSt1Km59ZnVuY3Rpb24gaSh0LGUscixuLGksYSl7dmFyIG89aS0xLHM9aSppLGw9bypvLHU9KDErMippKSpsLGM9aSpsLGg9cyooMy0yKmkpLGY9cypvO2lmKHQubGVuZ3RoKXthfHwoYT1uZXcgQXJyYXkodC5sZW5ndGgpKTtmb3IodmFyIGQ9dC5sZW5ndGgtMTtkPj0wOy0tZClhW2RdPXUqdFtkXStjKmVbZF0raCpyW2RdK2YqbltkXTtyZXR1cm4gYX1yZXR1cm4gdSp0K2MqZStoKnIrZipufWUuZXhwb3J0cz1pLGUuZXhwb3J0cy5kZXJpdmF0aXZlPW59LHt9XSwxMDg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbigpe3RoaXMuYXJnVHlwZXM9W10sdGhpcy5zaGltQXJncz1bXSx0aGlzLmFycmF5QXJncz1bXSx0aGlzLmFycmF5QmxvY2tJbmRpY2VzPVtdLHRoaXMuc2NhbGFyQXJncz1bXSx0aGlzLm9mZnNldEFyZ3M9W10sdGhpcy5vZmZzZXRBcmdJbmRleD1bXSx0aGlzLmluZGV4QXJncz1bXSx0aGlzLnNoYXBlQXJncz1bXSx0aGlzLmZ1bmNOYW1lPSIiLHRoaXMucHJlPW51bGwsdGhpcy5ib2R5PW51bGwsdGhpcy5wb3N0PW51bGwsdGhpcy5kZWJ1Zz0hMX1mdW5jdGlvbiBpKHQpe3ZhciBlPW5ldyBuO2UucHJlPXQucHJlLGUuYm9keT10LmJvZHksZS5wb3N0PXQucG9zdDt2YXIgcj10LmFyZ3Muc2xpY2UoMCk7ZS5hcmdUeXBlcz1yO2Zvcih2YXIgaT0wO2k8ci5sZW5ndGg7KytpKXt2YXIgbz1yW2ldO2lmKCJhcnJheSI9PT1vfHwib2JqZWN0Ij09dHlwZW9mIG8mJm8uYmxvY2tJbmRpY2VzKXtpZihlLmFyZ1R5cGVzW2ldPSJhcnJheSIsZS5hcnJheUFyZ3MucHVzaChpKSxlLmFycmF5QmxvY2tJbmRpY2VzLnB1c2goby5ibG9ja0luZGljZXM/by5ibG9ja0luZGljZXM6MCksZS5zaGltQXJncy5wdXNoKCJhcnJheSIraSksaTxlLnByZS5hcmdzLmxlbmd0aCYmZS5wcmUuYXJnc1tpXS5jb3VudD4wKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IHByZSgpIGJsb2NrIG1heSBub3QgcmVmZXJlbmNlIGFycmF5IGFyZ3MiKTtpZihpPGUucG9zdC5hcmdzLmxlbmd0aCYmZS5wb3N0LmFyZ3NbaV0uY291bnQ+MCl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBwb3N0KCkgYmxvY2sgbWF5IG5vdCByZWZlcmVuY2UgYXJyYXkgYXJncyIpfWVsc2UgaWYoInNjYWxhciI9PT1vKWUuc2NhbGFyQXJncy5wdXNoKGkpLGUuc2hpbUFyZ3MucHVzaCgic2NhbGFyIitpKTtlbHNlIGlmKCJpbmRleCI9PT1vKXtpZihlLmluZGV4QXJncy5wdXNoKGkpLGk8ZS5wcmUuYXJncy5sZW5ndGgmJmUucHJlLmFyZ3NbaV0uY291bnQ+MCl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBwcmUoKSBibG9jayBtYXkgbm90IHJlZmVyZW5jZSBhcnJheSBpbmRleCIpO2lmKGk8ZS5ib2R5LmFyZ3MubGVuZ3RoJiZlLmJvZHkuYXJnc1tpXS5sdmFsdWUpdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogYm9keSgpIGJsb2NrIG1heSBub3Qgd3JpdGUgdG8gYXJyYXkgaW5kZXgiKTtpZihpPGUucG9zdC5hcmdzLmxlbmd0aCYmZS5wb3N0LmFyZ3NbaV0uY291bnQ+MCl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBwb3N0KCkgYmxvY2sgbWF5IG5vdCByZWZlcmVuY2UgYXJyYXkgaW5kZXgiKX1lbHNlIGlmKCJzaGFwZSI9PT1vKXtpZihlLnNoYXBlQXJncy5wdXNoKGkpLGk8ZS5wcmUuYXJncy5sZW5ndGgmJmUucHJlLmFyZ3NbaV0ubHZhbHVlKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IHByZSgpIGJsb2NrIG1heSBub3Qgd3JpdGUgdG8gYXJyYXkgc2hhcGUiKTtpZihpPGUuYm9keS5hcmdzLmxlbmd0aCYmZS5ib2R5LmFyZ3NbaV0ubHZhbHVlKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IGJvZHkoKSBibG9jayBtYXkgbm90IHdyaXRlIHRvIGFycmF5IHNoYXBlIik7aWYoaTxlLnBvc3QuYXJncy5sZW5ndGgmJmUucG9zdC5hcmdzW2ldLmx2YWx1ZSl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBwb3N0KCkgYmxvY2sgbWF5IG5vdCB3cml0ZSB0byBhcnJheSBzaGFwZSIpfWVsc2V7aWYoIm9iamVjdCIhPXR5cGVvZiBvfHwhby5vZmZzZXQpdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogVW5rbm93biBhcmd1bWVudCB0eXBlICIrcltpXSk7ZS5hcmdUeXBlc1tpXT0ib2Zmc2V0IixlLm9mZnNldEFyZ3MucHVzaCh7YXJyYXk6by5hcnJheSxvZmZzZXQ6by5vZmZzZXR9KSxlLm9mZnNldEFyZ0luZGV4LnB1c2goaSl9fWlmKGUuYXJyYXlBcmdzLmxlbmd0aDw9MCl0aHJvdyBuZXcgRXJyb3IoImN3aXNlOiBObyBhcnJheSBhcmd1bWVudHMgc3BlY2lmaWVkIik7aWYoZS5wcmUuYXJncy5sZW5ndGg+ci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogVG9vIG1hbnkgYXJndW1lbnRzIGluIHByZSgpIGJsb2NrIik7aWYoZS5ib2R5LmFyZ3MubGVuZ3RoPnIubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IFRvbyBtYW55IGFyZ3VtZW50cyBpbiBib2R5KCkgYmxvY2siKTtpZihlLnBvc3QuYXJncy5sZW5ndGg+ci5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJjd2lzZTogVG9vIG1hbnkgYXJndW1lbnRzIGluIHBvc3QoKSBibG9jayIpO3JldHVybiBlLmRlYnVnPSEhdC5wcmludENvZGV8fCEhdC5kZWJ1ZyxlLmZ1bmNOYW1lPXQuZnVuY05hbWV8fCJjd2lzZSIsZS5ibG9ja1NpemU9dC5ibG9ja1NpemV8fDY0LGEoZSl9dmFyIGE9dCgiLi9saWIvdGh1bmsuanMiKTtlLmV4cG9ydHM9aX0seyIuL2xpYi90aHVuay5qcyI6MTEwfV0sMTA5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuLGksYT10Lmxlbmd0aCxvPWUuYXJyYXlBcmdzLmxlbmd0aCxzPWUuaW5kZXhBcmdzLmxlbmd0aD4wLGw9W10sdT1bXSxjPTAsaD0wO2ZvcihuPTA7bjxhOysrbil1LnB1c2goWyJpIixuLCI9MCJdLmpvaW4oIiIpKTtmb3IoaT0wO2k8bzsrK2kpZm9yKG49MDtuPGE7KytuKWg9YyxjPXRbbl0sMD09PW4/dS5wdXNoKFsiZCIsaSwicyIsbiwiPXQiLGksInAiLGNdLmpvaW4oIiIpKTp1LnB1c2goWyJkIixpLCJzIixuLCI9KHQiLGksInAiLGMsIi1zIixoLCIqdCIsaSwicCIsaCwiKSJdLmpvaW4oIiIpKTtmb3IodS5sZW5ndGg+MCYmbC5wdXNoKCJ2YXIgIit1LmpvaW4oIiwiKSksbj1hLTE7bj49MDstLW4pYz10W25dLGwucHVzaChbImZvcihpIixuLCI9MDtpIixuLCI8cyIsYywiOysraSIsbiwiKXsiXS5qb2luKCIiKSk7Zm9yKGwucHVzaChyKSxuPTA7bjxhOysrbil7Zm9yKGg9YyxjPXRbbl0saT0wO2k8bzsrK2kpbC5wdXNoKFsicCIsaSwiKz1kIixpLCJzIixuXS5qb2luKCIiKSk7cyYmKG4+MCYmbC5wdXNoKFsiaW5kZXhbIixoLCJdLT1zIixoXS5qb2luKCIiKSksbC5wdXNoKFsiKytpbmRleFsiLGMsIl0iXS5qb2luKCIiKSkpLGwucHVzaCgifSIpfXJldHVybiBsLmpvaW4oIlxuIil9ZnVuY3Rpb24gaSh0LGUscixpKXtmb3IodmFyIGE9ZS5sZW5ndGgsbz1yLmFycmF5QXJncy5sZW5ndGgscz1yLmJsb2NrU2l6ZSxsPXIuaW5kZXhBcmdzLmxlbmd0aD4wLHU9W10sYz0wO2M8bzsrK2MpdS5wdXNoKFsidmFyIG9mZnNldCIsYywiPXAiLGNdLmpvaW4oIiIpKTtmb3IodmFyIGM9dDtjPGE7KytjKXUucHVzaChbImZvcih2YXIgaiIrYysiPVNTWyIsZVtjXSwiXXwwO2oiLGMsIj4wOyl7Il0uam9pbigiIikpLHUucHVzaChbImlmKGoiLGMsIjwiLHMsIil7Il0uam9pbigiIikpLHUucHVzaChbInMiLGVbY10sIj1qIixjXS5qb2luKCIiKSksdS5wdXNoKFsiaiIsYywiPTAiXS5qb2luKCIiKSksdS5wdXNoKFsifWVsc2V7cyIsZVtjXSwiPSIsc10uam9pbigiIikpLHUucHVzaChbImoiLGMsIi09IixzLCJ9Il0uam9pbigiIikpLGwmJnUucHVzaChbImluZGV4WyIsZVtjXSwiXT1qIixjXS5qb2luKCIiKSk7Zm9yKHZhciBjPTA7YzxvOysrYyl7Zm9yKHZhciBoPVsib2Zmc2V0IitjXSxmPXQ7ZjxhOysrZiloLnB1c2goWyJqIixmLCIqdCIsYywicCIsZVtmXV0uam9pbigiIikpO3UucHVzaChbInAiLGMsIj0oIixoLmpvaW4oIisiKSwiKSJdLmpvaW4oIiIpKX11LnB1c2gobihlLHIsaSkpO2Zvcih2YXIgYz10O2M8YTsrK2MpdS5wdXNoKCJ9Iik7cmV0dXJuIHUuam9pbigiXG4iKX1mdW5jdGlvbiBhKHQpe2Zvcih2YXIgZT0wLHI9dFswXS5sZW5ndGg7ZTxyOyl7Zm9yKHZhciBuPTE7bjx0Lmxlbmd0aDsrK24paWYodFtuXVtlXSE9PXRbMF1bZV0pcmV0dXJuIGU7KytlfXJldHVybiBlfWZ1bmN0aW9uIG8odCxlLHIpe2Zvcih2YXIgbj10LmJvZHksaT1bXSxhPVtdLG89MDtvPHQuYXJncy5sZW5ndGg7KytvKXt2YXIgcz10LmFyZ3Nbb107aWYoIShzLmNvdW50PD0wKSl7dmFyIGw9bmV3IFJlZ0V4cChzLm5hbWUsImciKSx1PSIiLGM9ZS5hcnJheUFyZ3MuaW5kZXhPZihvKTtzd2l0Y2goZS5hcmdUeXBlc1tvXSl7Y2FzZSJvZmZzZXQiOnZhciBoPWUub2Zmc2V0QXJnSW5kZXguaW5kZXhPZihvKTtjPWUub2Zmc2V0QXJnc1toXS5hcnJheSx1PSIrcSIraDtjYXNlImFycmF5Ijp1PSJwIitjK3U7dmFyIGY9ImwiK28sZD0iYSIrYztpZigwPT09ZS5hcnJheUJsb2NrSW5kaWNlc1tjXSkxPT09cy5jb3VudD8iZ2VuZXJpYyI9PT1yW2NdP3MubHZhbHVlPyhpLnB1c2goWyJ2YXIgIixmLCI9IixkLCIuZ2V0KCIsdSwiKSJdLmpvaW4oIiIpKSxuPW4ucmVwbGFjZShsLGYpLGEucHVzaChbZCwiLnNldCgiLHUsIiwiLGYsIikiXS5qb2luKCIiKSkpOm49bi5yZXBsYWNlKGwsW2QsIi5nZXQoIix1LCIpIl0uam9pbigiIikpOm49bi5yZXBsYWNlKGwsW2QsIlsiLHUsIl0iXS5qb2luKCIiKSk6ImdlbmVyaWMiPT09cltjXT8oaS5wdXNoKFsidmFyICIsZiwiPSIsZCwiLmdldCgiLHUsIikiXS5qb2luKCIiKSksbj1uLnJlcGxhY2UobCxmKSxzLmx2YWx1ZSYmYS5wdXNoKFtkLCIuc2V0KCIsdSwiLCIsZiwiKSJdLmpvaW4oIiIpKSk6KGkucHVzaChbInZhciAiLGYsIj0iLGQsIlsiLHUsIl0iXS5qb2luKCIiKSksbj1uLnJlcGxhY2UobCxmKSxzLmx2YWx1ZSYmYS5wdXNoKFtkLCJbIix1LCJdPSIsZl0uam9pbigiIikpKTtlbHNle2Zvcih2YXIgcD1bcy5uYW1lXSxtPVt1XSx2PTA7djxNYXRoLmFicyhlLmFycmF5QmxvY2tJbmRpY2VzW2NdKTt2KyspcC5wdXNoKCJcXHMqXFxbKFteXFxdXSspXFxdIiksbS5wdXNoKCIkIisodisxKSsiKnQiK2MrImIiK3YpO2lmKGw9bmV3IFJlZ0V4cChwLmpvaW4oIiIpLCJnIiksdT1tLmpvaW4oIisiKSwiZ2VuZXJpYyI9PT1yW2NdKXRocm93IG5ldyBFcnJvcigiY3dpc2U6IEdlbmVyaWMgYXJyYXlzIG5vdCBzdXBwb3J0ZWQgaW4gY29tYmluYXRpb24gd2l0aCBibG9ja3MhIik7bj1uLnJlcGxhY2UobCxbZCwiWyIsdSwiXSJdLmpvaW4oIiIpKX1icmVhaztjYXNlInNjYWxhciI6bj1uLnJlcGxhY2UobCwiWSIrZS5zY2FsYXJBcmdzLmluZGV4T2YobykpO2JyZWFrO2Nhc2UiaW5kZXgiOm49bi5yZXBsYWNlKGwsImluZGV4Iik7YnJlYWs7Y2FzZSJzaGFwZSI6bj1uLnJlcGxhY2UobCwic2hhcGUiKX19fXJldHVybltpLmpvaW4oIlxuIiksbixhLmpvaW4oIlxuIildLmpvaW4oIlxuIikudHJpbSgpfWZ1bmN0aW9uIHModCl7Zm9yKHZhciBlPW5ldyBBcnJheSh0Lmxlbmd0aCkscj0hMCxuPTA7bjx0Lmxlbmd0aDsrK24pe3ZhciBpPXRbbl0sYT1pLm1hdGNoKC9cZCsvKTthPWE/YVswXToiIiwwPT09aS5jaGFyQXQoMCk/ZVtuXT0idSIraS5jaGFyQXQoMSkrYTplW25dPWkuY2hhckF0KDApK2Esbj4wJiYocj1yJiZlW25dPT09ZVtuLTFdKX1yZXR1cm4gcj9lWzBdOmUuam9pbigiIil9ZnVuY3Rpb24gbCh0LGUpe2Zvcih2YXIgcj1lWzFdLmxlbmd0aC1NYXRoLmFicyh0LmFycmF5QmxvY2tJbmRpY2VzWzBdKXwwLGw9bmV3IEFycmF5KHQuYXJyYXlBcmdzLmxlbmd0aCksYz1uZXcgQXJyYXkodC5hcnJheUFyZ3MubGVuZ3RoKSxoPTA7aDx0LmFycmF5QXJncy5sZW5ndGg7KytoKWNbaF09ZVsyKmhdLGxbaF09ZVsyKmgrMV07Zm9yKHZhciBmPVtdLGQ9W10scD1bXSxtPVtdLHY9W10saD0wO2g8dC5hcnJheUFyZ3MubGVuZ3RoOysraCl7dC5hcnJheUJsb2NrSW5kaWNlc1toXTwwPyhwLnB1c2goMCksbS5wdXNoKHIpLGYucHVzaChyKSxkLnB1c2gocit0LmFycmF5QmxvY2tJbmRpY2VzW2hdKSk6KHAucHVzaCh0LmFycmF5QmxvY2tJbmRpY2VzW2hdKSxtLnB1c2godC5hcnJheUJsb2NrSW5kaWNlc1toXStyKSxmLnB1c2goMCksZC5wdXNoKHQuYXJyYXlCbG9ja0luZGljZXNbaF0pKTtmb3IodmFyIGc9W10seT0wO3k8bFtoXS5sZW5ndGg7eSsrKXBbaF08PWxbaF1beV0mJmxbaF1beV08bVtoXSYmZy5wdXNoKGxbaF1beV0tcFtoXSk7di5wdXNoKGcpfWZvcih2YXIgYj1bIlNTIl0seD1bIid1c2Ugc3RyaWN0JyJdLF89W10seT0wO3k8cjsrK3kpXy5wdXNoKFsicyIseSwiPVNTWyIseSwiXSJdLmpvaW4oIiIpKTtmb3IodmFyIGg9MDtoPHQuYXJyYXlBcmdzLmxlbmd0aDsrK2gpe2IucHVzaCgiYSIraCksYi5wdXNoKCJ0IitoKSxiLnB1c2goInAiK2gpO2Zvcih2YXIgeT0wO3k8cjsrK3kpXy5wdXNoKFsidCIsaCwicCIseSwiPXQiLGgsIlsiLHBbaF0reSwiXSJdLmpvaW4oIiIpKTtmb3IodmFyIHk9MDt5PE1hdGguYWJzKHQuYXJyYXlCbG9ja0luZGljZXNbaF0pOysreSlfLnB1c2goWyJ0IixoLCJiIix5LCI9dCIsaCwiWyIsZltoXSt5LCJdIl0uam9pbigiIikpfWZvcih2YXIgaD0wO2g8dC5zY2FsYXJBcmdzLmxlbmd0aDsrK2gpYi5wdXNoKCJZIitoKTtpZih0LnNoYXBlQXJncy5sZW5ndGg+MCYmXy5wdXNoKCJzaGFwZT1TUy5zbGljZSgwKSIpLHQuaW5kZXhBcmdzLmxlbmd0aD4wKXtmb3IodmFyIHc9bmV3IEFycmF5KHIpLGg9MDtoPHI7KytoKXdbaF09IjAiO18ucHVzaChbImluZGV4PVsiLHcuam9pbigiLCIpLCJdIl0uam9pbigiIikpfWZvcih2YXIgaD0wO2g8dC5vZmZzZXRBcmdzLmxlbmd0aDsrK2gpe2Zvcih2YXIgTT10Lm9mZnNldEFyZ3NbaF0saz1bXSx5PTA7eTxNLm9mZnNldC5sZW5ndGg7Kyt5KTAhPT1NLm9mZnNldFt5XSYmKDE9PT1NLm9mZnNldFt5XT9rLnB1c2goWyJ0IixNLmFycmF5LCJwIix5XS5qb2luKCIiKSk6ay5wdXNoKFtNLm9mZnNldFt5XSwiKnQiLE0uYXJyYXksInAiLHldLmpvaW4oIiIpKSk7MD09PWsubGVuZ3RoP18ucHVzaCgicSIraCsiPTAiKTpfLnB1c2goWyJxIixoLCI9IixrLmpvaW4oIisiKV0uam9pbigiIikpfXZhciBBPXUoW10uY29uY2F0KHQucHJlLnRoaXNWYXJzKS5jb25jYXQodC5ib2R5LnRoaXNWYXJzKS5jb25jYXQodC5wb3N0LnRoaXNWYXJzKSk7Xz1fLmNvbmNhdChBKSxfLmxlbmd0aD4wJiZ4LnB1c2goInZhciAiK18uam9pbigiLCIpKTtmb3IodmFyIGg9MDtoPHQuYXJyYXlBcmdzLmxlbmd0aDsrK2gpeC5wdXNoKCJwIitoKyJ8PTAiKTt0LnByZS5ib2R5Lmxlbmd0aD4zJiZ4LnB1c2gobyh0LnByZSx0LGMpKTt2YXIgVD1vKHQuYm9keSx0LGMpLFM9YSh2KTtTPHI/eC5wdXNoKGkoUyx2WzBdLHQsVCkpOngucHVzaChuKHZbMF0sdCxUKSksdC5wb3N0LmJvZHkubGVuZ3RoPjMmJngucHVzaChvKHQucG9zdCx0LGMpKSx0LmRlYnVnJiZjb25zb2xlLmxvZygiLS0tLS1HZW5lcmF0ZWQgY3dpc2Ugcm91dGluZSBmb3IgIixlLCI6XG4iK3guam9pbigiXG4iKSsiXG4tLS0tLS0tLS0tIik7dmFyIEU9W3QuZnVuY05hbWV8fCJ1bm5hbWVkIiwiX2N3aXNlX2xvb3BfIixsWzBdLmpvaW4oInMiKSwibSIsUyxzKGMpXS5qb2luKCIiKTtyZXR1cm4gbmV3IEZ1bmN0aW9uKFsiZnVuY3Rpb24gIixFLCIoIixiLmpvaW4oIiwiKSwiKXsiLHguam9pbigiXG4iKSwifSByZXR1cm4gIixFXS5qb2luKCIiKSkoKX12YXIgdT10KCJ1bmlxIik7ZS5leHBvcnRzPWx9LHt1bmlxOjU0MX1dLDExMDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQpe3ZhciBlPVsiJ3VzZSBzdHJpY3QnIiwidmFyIENBQ0hFRD17fSJdLHI9W10sbj10LmZ1bmNOYW1lKyJfY3dpc2VfdGh1bmsiO2UucHVzaChbInJldHVybiBmdW5jdGlvbiAiLG4sIigiLHQuc2hpbUFyZ3Muam9pbigiLCIpLCIpeyJdLmpvaW4oIiIpKTtmb3IodmFyIGE9W10sbz1bXSxzPVtbImFycmF5Iix0LmFycmF5QXJnc1swXSwiLnNoYXBlLnNsaWNlKCIsTWF0aC5tYXgoMCx0LmFycmF5QmxvY2tJbmRpY2VzWzBdKSx0LmFycmF5QmxvY2tJbmRpY2VzWzBdPDA/IiwiK3QuYXJyYXlCbG9ja0luZGljZXNbMF0rIikiOiIpIl0uam9pbigiIildLGw9W10sdT1bXSxjPTA7Yzx0LmFycmF5QXJncy5sZW5ndGg7KytjKXt2YXIgaD10LmFycmF5QXJnc1tjXTtyLnB1c2goWyJ0IixoLCI9YXJyYXkiLGgsIi5kdHlwZSwiLCJyIixoLCI9YXJyYXkiLGgsIi5vcmRlciJdLmpvaW4oIiIpKSxhLnB1c2goInQiK2gpLGEucHVzaCgiciIraCksby5wdXNoKCJ0IitoKSxvLnB1c2goInIiK2grIi5qb2luKCkiKSxzLnB1c2goImFycmF5IitoKyIuZGF0YSIpLHMucHVzaCgiYXJyYXkiK2grIi5zdHJpZGUiKSxzLnB1c2goImFycmF5IitoKyIub2Zmc2V0fDAiKSxjPjAmJihsLnB1c2goImFycmF5Iit0LmFycmF5QXJnc1swXSsiLnNoYXBlLmxlbmd0aD09PWFycmF5IitoKyIuc2hhcGUubGVuZ3RoKyIrKE1hdGguYWJzKHQuYXJyYXlCbG9ja0luZGljZXNbMF0pLU1hdGguYWJzKHQuYXJyYXlCbG9ja0luZGljZXNbY10pKSksdS5wdXNoKCJhcnJheSIrdC5hcnJheUFyZ3NbMF0rIi5zaGFwZVtzaGFwZUluZGV4KyIrTWF0aC5tYXgoMCx0LmFycmF5QmxvY2tJbmRpY2VzWzBdKSsiXT09PWFycmF5IitoKyIuc2hhcGVbc2hhcGVJbmRleCsiK01hdGgubWF4KDAsdC5hcnJheUJsb2NrSW5kaWNlc1tjXSkrIl0iKSl9dC5hcnJheUFyZ3MubGVuZ3RoPjEmJihlLnB1c2goImlmICghKCIrbC5qb2luKCIgJiYgIikrIikpIHRocm93IG5ldyBFcnJvcignY3dpc2U6IEFycmF5cyBkbyBub3QgYWxsIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uYWxpdHkhJykiKSxlLnB1c2goImZvcih2YXIgc2hhcGVJbmRleD1hcnJheSIrdC5hcnJheUFyZ3NbMF0rIi5zaGFwZS5sZW5ndGgtIitNYXRoLmFicyh0LmFycmF5QmxvY2tJbmRpY2VzWzBdKSsiOyBzaGFwZUluZGV4LS1ceDNlMDspIHsiKSxlLnB1c2goImlmICghKCIrdS5qb2luKCIgJiYgIikrIikpIHRocm93IG5ldyBFcnJvcignY3dpc2U6IEFycmF5cyBkbyBub3QgYWxsIGhhdmUgdGhlIHNhbWUgc2hhcGUhJykiKSxlLnB1c2goIn0iKSk7Zm9yKHZhciBjPTA7Yzx0LnNjYWxhckFyZ3MubGVuZ3RoOysrYylzLnB1c2goInNjYWxhciIrdC5zY2FsYXJBcmdzW2NdKTtyZXR1cm4gci5wdXNoKFsidHlwZT1bIixvLmpvaW4oIiwiKSwiXS5qb2luKCkiXS5qb2luKCIiKSksci5wdXNoKCJwcm9jPUNBQ0hFRFt0eXBlXSIpLGUucHVzaCgidmFyICIrci5qb2luKCIsIikpLGUucHVzaChbImlmKCFwcm9jKXsiLCJDQUNIRURbdHlwZV09cHJvYz1jb21waWxlKFsiLGEuam9pbigiLCIpLCJdKX0iLCJyZXR1cm4gcHJvYygiLHMuam9pbigiLCIpLCIpfSJdLmpvaW4oIiIpKSx0LmRlYnVnJiZjb25zb2xlLmxvZygiLS0tLS1HZW5lcmF0ZWQgdGh1bms6XG4iK2Uuam9pbigiXG4iKSsiXG4tLS0tLS0tLS0tIiksbmV3IEZ1bmN0aW9uKCJjb21waWxlIixlLmpvaW4oIlxuIikpKGkuYmluZCh2b2lkIDAsdCkpfXZhciBpPXQoIi4vY29tcGlsZS5qcyIpO2UuZXhwb3J0cz1ufSx7Ii4vY29tcGlsZS5qcyI6MTA5fV0sMTExOltmdW5jdGlvbih0LGUscil7ZS5leHBvcnRzPXQoImN3aXNlLWNvbXBpbGVyIil9LHsiY3dpc2UtY29tcGlsZXIiOjEwOH1dLDExMjpbZnVuY3Rpb24oZSxyLG4peyFmdW5jdGlvbihlLGkpeyJvYmplY3QiPT10eXBlb2YgbiYmdm9pZCAwIT09cj9pKG4pOiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LmFtZD90KFsiZXhwb3J0cyJdLGkpOmkoZS5kMz1lLmQzfHx7fSl9KHRoaXMsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUscil7cmV0dXJuIG8odChlKSxyKX19ZnVuY3Rpb24gcih0LGUpe3JldHVyblt0LGVdfWZ1bmN0aW9uIG4odCxlLHIpe3ZhciBuPShlLXQpL01hdGgubWF4KDAsciksaT1NYXRoLmZsb29yKE1hdGgubG9nKG4pL01hdGguTE4xMCksYT1uL01hdGgucG93KDEwLGkpO3JldHVybiBpPj0wPyhhPj1rPzEwOmE+PUE/NTphPj1UPzI6MSkqTWF0aC5wb3coMTAsaSk6LU1hdGgucG93KDEwLC1pKS8oYT49az8xMDphPj1BPzU6YT49VD8yOjEpfWZ1bmN0aW9uIGkodCxlLHIpe3ZhciBuPU1hdGguYWJzKGUtdCkvTWF0aC5tYXgoMCxyKSxpPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2cobikvTWF0aC5MTjEwKSksYT1uL2k7cmV0dXJuIGE+PWs/aSo9MTA6YT49QT9pKj01OmE+PVQmJihpKj0yKSxlPHQ/LWk6aX1mdW5jdGlvbiBhKHQpe3JldHVybiB0Lmxlbmd0aH12YXIgbz1mdW5jdGlvbih0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn0scz1mdW5jdGlvbih0KXtyZXR1cm4gMT09PXQubGVuZ3RoJiYodD1lKHQpKSx7bGVmdDpmdW5jdGlvbihlLHIsbixpKXtmb3IobnVsbD09biYmKG49MCksbnVsbD09aSYmKGk9ZS5sZW5ndGgpO248aTspe3ZhciBhPW4raT4+PjE7dChlW2FdLHIpPDA/bj1hKzE6aT1hfXJldHVybiBufSxyaWdodDpmdW5jdGlvbihlLHIsbixpKXtmb3IobnVsbD09biYmKG49MCksbnVsbD09aSYmKGk9ZS5sZW5ndGgpO248aTspe3ZhciBhPW4raT4+PjE7dChlW2FdLHIpPjA/aT1hOm49YSsxfXJldHVybiBufX19LGw9cyhvKSx1PWwucmlnaHQsYz1sLmxlZnQsaD1mdW5jdGlvbih0LGUpe251bGw9PWUmJihlPXIpO2Zvcih2YXIgbj0wLGk9dC5sZW5ndGgtMSxhPXRbMF0sbz1uZXcgQXJyYXkoaTwwPzA6aSk7bjxpOylvW25dPWUoYSxhPXRbKytuXSk7cmV0dXJuIG99LGY9ZnVuY3Rpb24odCxlLG4pe3ZhciBpLGEsbyxzLGw9dC5sZW5ndGgsdT1lLmxlbmd0aCxjPW5ldyBBcnJheShsKnUpO2ZvcihudWxsPT1uJiYobj1yKSxpPW89MDtpPGw7KytpKWZvcihzPXRbaV0sYT0wO2E8dTsrK2EsKytvKWNbb109bihzLGVbYV0pO3JldHVybiBjfSxkPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGU8dD8tMTplPnQ/MTplPj10PzA6TmFOfSxwPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9LG09ZnVuY3Rpb24odCxlKXt2YXIgcixuLGk9dC5sZW5ndGgsYT0wLG89LTEscz0wLGw9MDtpZihudWxsPT1lKWZvcig7KytvPGk7KWlzTmFOKHI9cCh0W29dKSl8fChuPXItcyxzKz1uLysrYSxsKz1uKihyLXMpKTtlbHNlIGZvcig7KytvPGk7KWlzTmFOKHI9cChlKHRbb10sbyx0KSkpfHwobj1yLXMscys9bi8rK2EsbCs9biooci1zKSk7aWYoYT4xKXJldHVybiBsLyhhLTEpfSx2PWZ1bmN0aW9uKHQsZSl7dmFyIHI9bSh0LGUpO3JldHVybiByP01hdGguc3FydChyKTpyfSxnPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpLGE9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1lKXtmb3IoOysrbzxhOylpZihudWxsIT0ocj10W29dKSYmcj49cilmb3Iobj1pPXI7KytvPGE7KW51bGwhPShyPXRbb10pJiYobj5yJiYobj1yKSxpPHImJihpPXIpKX1lbHNlIGZvcig7KytvPGE7KWlmKG51bGwhPShyPWUodFtvXSxvLHQpKSYmcj49cilmb3Iobj1pPXI7KytvPGE7KW51bGwhPShyPWUodFtvXSxvLHQpKSYmKG4+ciYmKG49ciksaTxyJiYoaT1yKSk7cmV0dXJuW24saV19LHk9QXJyYXkucHJvdG90eXBlLGI9eS5zbGljZSx4PXkubWFwLF89ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSx3PWZ1bmN0aW9uKHQpe3JldHVybiB0fSxNPWZ1bmN0aW9uKHQsZSxyKXt0PSt0LGU9K2Uscj0oaT1hcmd1bWVudHMubGVuZ3RoKTwyPyhlPXQsdD0wLDEpOmk8Mz8xOityO2Zvcih2YXIgbj0tMSxpPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKGUtdCkvcikpLGE9bmV3IEFycmF5KGkpOysrbjxpOylhW25dPXQrbipyO3JldHVybiBhfSxrPU1hdGguc3FydCg1MCksQT1NYXRoLnNxcnQoMTApLFQ9TWF0aC5zcXJ0KDIpLFM9ZnVuY3Rpb24odCxlLHIpe3ZhciBpLGEsbyxzPWU8dCxsPS0xO2lmKHMmJihpPXQsdD1lLGU9aSksMD09PShvPW4odCxlLHIpKXx8IWlzRmluaXRlKG8pKXJldHVybltdO2lmKG8+MClmb3IodD1NYXRoLmNlaWwodC9vKSxlPU1hdGguZmxvb3IoZS9vKSxhPW5ldyBBcnJheShpPU1hdGguY2VpbChlLXQrMSkpOysrbDxpOylhW2xdPSh0K2wpKm87ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqbyksZT1NYXRoLmNlaWwoZSpvKSxhPW5ldyBBcnJheShpPU1hdGguY2VpbCh0LWUrMSkpOysrbDxpOylhW2xdPSh0LWwpL287cmV0dXJuIHMmJmEucmV2ZXJzZSgpLGF9LEU9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIpKzF9LEw9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBhLG8scz10Lmxlbmd0aCxsPW5ldyBBcnJheShzKTtmb3IoYT0wO2E8czsrK2EpbFthXT1lKHRbYV0sYSx0KTt2YXIgYz1yKGwpLGg9Y1swXSxmPWNbMV0sZD1uKGwsaCxmKTtBcnJheS5pc0FycmF5KGQpfHwoZD1pKGgsZixkKSxkPU0oTWF0aC5jZWlsKGgvZCkqZCxNYXRoLmZsb29yKGYvZCkqZCxkKSk7Zm9yKHZhciBwPWQubGVuZ3RoO2RbMF08PWg7KWQuc2hpZnQoKSwtLXA7Zm9yKDtkW3AtMV0+ZjspZC5wb3AoKSwtLXA7dmFyIG0sdj1uZXcgQXJyYXkocCsxKTtmb3IoYT0wO2E8PXA7KythKW09dlthXT1bXSxtLngwPWE+MD9kW2EtMV06aCxtLngxPWE8cD9kW2FdOmY7Zm9yKGE9MDthPHM7KythKW89bFthXSxoPD1vJiZvPD1mJiZ2W3UoZCxvLDAscCldLnB1c2godFthXSk7cmV0dXJuIHZ9dmFyIGU9dyxyPWcsbj1FO3JldHVybiB0LnZhbHVlPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6XyhyKSx0KTplfSx0LmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOl8oW2VbMF0sZVsxXV0pLHQpOnJ9LHQudGhyZXNob2xkcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOl8oQXJyYXkuaXNBcnJheShlKT9iLmNhbGwoZSk6ZSksdCk6bn0sdH0sQz1mdW5jdGlvbih0LGUscil7aWYobnVsbD09ciYmKHI9cCksbj10Lmxlbmd0aCl7aWYoKGU9K2UpPD0wfHxuPDIpcmV0dXJuK3IodFswXSwwLHQpO2lmKGU+PTEpcmV0dXJuK3IodFtuLTFdLG4tMSx0KTt2YXIgbixpPShuLTEpKmUsYT1NYXRoLmZsb29yKGkpLG89K3IodFthXSxhLHQpO3JldHVybiBvKygrcih0W2ErMV0sYSsxLHQpLW8pKihpLWEpfX0sej1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9eC5jYWxsKHQscCkuc29ydChvKSxNYXRoLmNlaWwoKHItZSkvKDIqKEModCwuNzUpLUModCwuMjUpKSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSxJPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gTWF0aC5jZWlsKChyLWUpLygzLjUqdih0KSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSxEPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpPXQubGVuZ3RoLGE9LTE7aWYobnVsbD09ZSl7Zm9yKDsrK2E8aTspaWYobnVsbCE9KHI9dFthXSkmJnI+PXIpZm9yKG49cjsrK2E8aTspbnVsbCE9KHI9dFthXSkmJnI+biYmKG49cil9ZWxzZSBmb3IoOysrYTxpOylpZihudWxsIT0ocj1lKHRbYV0sYSx0KSkmJnI+PXIpZm9yKG49cjsrK2E8aTspbnVsbCE9KHI9ZSh0W2FdLGEsdCkpJiZyPm4mJihuPXIpO3JldHVybiBufSxQPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj10Lmxlbmd0aCxpPW4sYT0tMSxvPTA7aWYobnVsbD09ZSlmb3IoOysrYTxuOylpc05hTihyPXAodFthXSkpPy0taTpvKz1yO2Vsc2UgZm9yKDsrK2E8bjspaXNOYU4ocj1wKGUodFthXSxhLHQpKSk/LS1pOm8rPXI7aWYoaSlyZXR1cm4gby9pfSxPPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj10Lmxlbmd0aCxpPS0xLGE9W107aWYobnVsbD09ZSlmb3IoOysraTxuOylpc05hTihyPXAodFtpXSkpfHxhLnB1c2gocik7ZWxzZSBmb3IoOysraTxuOylpc05hTihyPXAoZSh0W2ldLGksdCkpKXx8YS5wdXNoKHIpO3JldHVybiBDKGEuc29ydChvKSwuNSl9LFI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlLHIsbixpPXQubGVuZ3RoLGE9LTEsbz0wOysrYTxpOylvKz10W2FdLmxlbmd0aDtmb3Iocj1uZXcgQXJyYXkobyk7LS1pPj0wOylmb3Iobj10W2ldLGU9bi5sZW5ndGg7LS1lPj0wOylyWy0tb109bltlXTtyZXR1cm4gcn0sRj1mdW5jdGlvbih0LGUpe3ZhciByLG4saT10Lmxlbmd0aCxhPS0xO2lmKG51bGw9PWUpe2Zvcig7KythPGk7KWlmKG51bGwhPShyPXRbYV0pJiZyPj1yKWZvcihuPXI7KythPGk7KW51bGwhPShyPXRbYV0pJiZuPnImJihuPXIpfWVsc2UgZm9yKDsrK2E8aTspaWYobnVsbCE9KHI9ZSh0W2FdLGEsdCkpJiZyPj1yKWZvcihuPXI7KythPGk7KW51bGwhPShyPWUodFthXSxhLHQpKSYmbj5yJiYobj1yKTtyZXR1cm4gbn0saj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lLmxlbmd0aCxuPW5ldyBBcnJheShyKTtyLS07KW5bcl09dFtlW3JdXTtyZXR1cm4gbn0sTj1mdW5jdGlvbih0LGUpe2lmKHI9dC5sZW5ndGgpe3ZhciByLG4saT0wLGE9MCxzPXRbYV07Zm9yKG51bGw9PWUmJihlPW8pOysraTxyOykoZShuPXRbaV0scyk8MHx8MCE9PWUocyxzKSkmJihzPW4sYT1pKTtyZXR1cm4gMD09PWUocyxzKT9hOnZvaWQgMH19LEI9ZnVuY3Rpb24odCxlLHIpe2Zvcih2YXIgbixpLGE9KG51bGw9PXI/dC5sZW5ndGg6ciktKGU9bnVsbD09ZT8wOitlKTthOylpPU1hdGgucmFuZG9tKCkqYS0tfDAsbj10W2ErZV0sdFthK2VdPXRbaStlXSx0W2krZV09bjtyZXR1cm4gdH0sVT1mdW5jdGlvbih0LGUpe3ZhciByLG49dC5sZW5ndGgsaT0tMSxhPTA7aWYobnVsbD09ZSlmb3IoOysraTxuOykocj0rdFtpXSkmJihhKz1yKTtlbHNlIGZvcig7KytpPG47KShyPStlKHRbaV0saSx0KSkmJihhKz1yKTtyZXR1cm4gYX0sVj1mdW5jdGlvbih0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybltdO2Zvcih2YXIgZT0tMSxyPUYodCxhKSxuPW5ldyBBcnJheShyKTsrK2U8cjspZm9yKHZhciBpLG89LTEscz1uW2VdPW5ldyBBcnJheShpKTsrK288aTspc1tvXT10W29dW2VdO3JldHVybiBufSxIPWZ1bmN0aW9uKCl7cmV0dXJuIFYoYXJndW1lbnRzKX07dC5iaXNlY3Q9dSx0LmJpc2VjdFJpZ2h0PXUsdC5iaXNlY3RMZWZ0PWMsdC5hc2NlbmRpbmc9byx0LmJpc2VjdG9yPXMsdC5jcm9zcz1mLHQuZGVzY2VuZGluZz1kLHQuZGV2aWF0aW9uPXYsdC5leHRlbnQ9Zyx0Lmhpc3RvZ3JhbT1MLHQudGhyZXNob2xkRnJlZWRtYW5EaWFjb25pcz16LHQudGhyZXNob2xkU2NvdHQ9SSx0LnRocmVzaG9sZFN0dXJnZXM9RSx0Lm1heD1ELHQubWVhbj1QLHQubWVkaWFuPU8sdC5tZXJnZT1SLHQubWluPUYsdC5wYWlycz1oLHQucGVybXV0ZT1qLHQucXVhbnRpbGU9Qyx0LnJhbmdlPU0sdC5zY2FuPU4sdC5zaHVmZmxlPUIsdC5zdW09VSx0LnRpY2tzPVMsdC50aWNrSW5jcmVtZW50PW4sdC50aWNrU3RlcD1pLHQudHJhbnNwb3NlPVYsdC52YXJpYW5jZT1tLHQuemlwPUgsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSl9LHt9XSwxMTM6W2Z1bmN0aW9uKGUscixuKXshZnVuY3Rpb24oZSxpKXsib2JqZWN0Ij09dHlwZW9mIG4mJnZvaWQgMCE9PXI/aShuKToiZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5hbWQ/dChbImV4cG9ydHMiXSxpKTppKGUuZDM9ZS5kM3x8e30pfSh0aGlzLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKCl7fWZ1bmN0aW9uIHIodCxyKXt2YXIgbj1uZXcgZTtpZih0IGluc3RhbmNlb2YgZSl0LmVhY2goZnVuY3Rpb24odCxlKXtuLnNldChlLHQpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgaSxhPS0xLG89dC5sZW5ndGg7aWYobnVsbD09cilmb3IoOysrYTxvOyluLnNldChhLHRbYV0pO2Vsc2UgZm9yKDsrK2E8bzspbi5zZXQocihpPXRbYV0sYSx0KSxpKX1lbHNlIGlmKHQpZm9yKHZhciBzIGluIHQpbi5zZXQocyx0W3NdKTtyZXR1cm4gbn1mdW5jdGlvbiBuKCl7cmV0dXJue319ZnVuY3Rpb24gaSh0LGUscil7dFtlXT1yfWZ1bmN0aW9uIGEoKXtyZXR1cm4gcigpfWZ1bmN0aW9uIG8odCxlLHIpe3Quc2V0KGUscil9ZnVuY3Rpb24gcygpe31mdW5jdGlvbiBsKHQsZSl7dmFyIHI9bmV3IHM7aWYodCBpbnN0YW5jZW9mIHMpdC5lYWNoKGZ1bmN0aW9uKHQpe3IuYWRkKHQpfSk7ZWxzZSBpZih0KXt2YXIgbj0tMSxpPXQubGVuZ3RoO2lmKG51bGw9PWUpZm9yKDsrK248aTspci5hZGQodFtuXSk7ZWxzZSBmb3IoOysrbjxpOylyLmFkZChlKHRbbl0sbix0KSl9cmV0dXJuIHJ9ZS5wcm90b3R5cGU9ci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmUsaGFzOmZ1bmN0aW9uKHQpe3JldHVybiIkIit0IGluIHRoaXN9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1siJCIrdF19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzWyIkIit0XT1lLHRoaXN9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT0iJCIrdDtyZXR1cm4gZSBpbiB0aGlzJiZkZWxldGUgdGhpc1tlXX0sY2xlYXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcykiJCI9PT10WzBdJiZkZWxldGUgdGhpc1t0XX0sa2V5czpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKSIkIj09PWVbMF0mJnQucHVzaChlLnNsaWNlKDEpKTtyZXR1cm4gdH0sdmFsdWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpIiQiPT09ZVswXSYmdC5wdXNoKHRoaXNbZV0pO3JldHVybiB0fSxlbnRyaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpIiQiPT09ZVswXSYmdC5wdXNoKHtrZXk6ZS5zbGljZSgxKSx2YWx1ZTp0aGlzW2VdfSk7cmV0dXJuIHR9LHNpemU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzKSIkIj09PWVbMF0mJisrdDtyZXR1cm4gdH0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcylpZigiJCI9PT10WzBdKXJldHVybiExO3JldHVybiEwfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzKSIkIj09PWVbMF0mJnQodGhpc1tlXSxlLnNsaWNlKDEpLHRoaXMpfX07dmFyIHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsbixpLGEpe2lmKG4+PWMubGVuZ3RoKXJldHVybiBudWxsIT1sP2woZSk6bnVsbCE9cz9lLnNvcnQocyk6ZTtmb3IodmFyIG8sdSxoLGY9LTEsZD1lLmxlbmd0aCxwPWNbbisrXSxtPXIoKSx2PWkoKTsrK2Y8ZDspKGg9bS5nZXQobz1wKHU9ZVtmXSkrIiIpKT9oLnB1c2godSk6bS5zZXQobyxbdV0pO3JldHVybiBtLmVhY2goZnVuY3Rpb24oZSxyKXthKHYscix0KGUsbixpLGEpKX0pLHZ9ZnVuY3Rpb24gZSh0LHIpe2lmKCsrcj5jLmxlbmd0aClyZXR1cm4gdDt2YXIgbixpPWhbci0xXTtyZXR1cm4gbnVsbCE9bCYmcj49Yy5sZW5ndGg/bj10LmVudHJpZXMoKToobj1bXSx0LmVhY2goZnVuY3Rpb24odCxpKXtuLnB1c2goe2tleTppLHZhbHVlczplKHQscil9KX0pKSxudWxsIT1pP24uc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBpKHQua2V5LGUua2V5KX0pOm59dmFyIHMsbCx1LGM9W10saD1bXTtyZXR1cm4gdT17b2JqZWN0OmZ1bmN0aW9uKGUpe3JldHVybiB0KGUsMCxuLGkpfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSwwLGEsbyl9LGVudHJpZXM6ZnVuY3Rpb24ocil7cmV0dXJuIGUodChyLDAsYSxvKSwwKX0sa2V5OmZ1bmN0aW9uKHQpe3JldHVybiBjLnB1c2godCksdX0sc29ydEtleXM6ZnVuY3Rpb24odCl7cmV0dXJuIGhbYy5sZW5ndGgtMV09dCx1fSxzb3J0VmFsdWVzOmZ1bmN0aW9uKHQpe3JldHVybiBzPXQsdX0scm9sbHVwOmZ1bmN0aW9uKHQpe3JldHVybiBsPXQsdX19fSxjPXIucHJvdG90eXBlO3MucHJvdG90eXBlPWwucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpzLGhhczpjLmhhcyxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQrPSIiLHRoaXNbIiQiK3RdPXQsdGhpc30scmVtb3ZlOmMucmVtb3ZlLGNsZWFyOmMuY2xlYXIsdmFsdWVzOmMua2V5cyxzaXplOmMuc2l6ZSxlbXB0eTpjLmVtcHR5LGVhY2g6Yy5lYWNofTt2YXIgaD1mdW5jdGlvbih0KXt2YXIgZT1bXTtmb3IodmFyIHIgaW4gdCllLnB1c2gocik7cmV0dXJuIGV9LGY9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciByIGluIHQpZS5wdXNoKHRbcl0pO3JldHVybiBlfSxkPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgciBpbiB0KWUucHVzaCh7a2V5OnIsdmFsdWU6dFtyXX0pO3JldHVybiBlfTt0Lm5lc3Q9dSx0LnNldD1sLHQubWFwPXIsdC5rZXlzPWgsdC52YWx1ZXM9Zix0LmVudHJpZXM9ZCxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KX0se31dLDExNDpbZnVuY3Rpb24oZSxyLG4peyFmdW5jdGlvbihlLGkpeyJvYmplY3QiPT10eXBlb2YgbiYmdm9pZCAwIT09cj9pKG4pOiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LmFtZD90KFsiZXhwb3J0cyJdLGkpOmkoZS5kMz1lLmQzfHx7fSl9KHRoaXMsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGUodCxlKXt2YXIgcj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIG4gaW4gZSlyW25dPWVbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gcigpe31mdW5jdGlvbiBuKHQpe3ZhciBlO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwoZT16LmV4ZWModCkpPyhlPXBhcnNlSW50KGVbMV0sMTYpLG5ldyBsKGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoMTUmZSk8PDR8MTUmZSwxKSk6KGU9SS5leGVjKHQpKT9pKHBhcnNlSW50KGVbMV0sMTYpKTooZT1ELmV4ZWModCkpP25ldyBsKGVbMV0sZVsyXSxlWzNdLDEpOihlPVAuZXhlYyh0KSk/bmV3IGwoMjU1KmVbMV0vMTAwLDI1NSplWzJdLzEwMCwyNTUqZVszXS8xMDAsMSk6KGU9Ty5leGVjKHQpKT9hKGVbMV0sZVsyXSxlWzNdLGVbNF0pOihlPVIuZXhlYyh0KSk/YSgyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCxlWzRdKTooZT1GLmV4ZWModCkpP3UoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCwxKTooZT1qLmV4ZWModCkpP3UoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCxlWzRdKTpOLmhhc093blByb3BlcnR5KHQpP2koTlt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IGwoTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBpKHQpe3JldHVybiBuZXcgbCh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24gYSh0LGUscixuKXtyZXR1cm4gbjw9MCYmKHQ9ZT1yPU5hTiksbmV3IGwodCxlLHIsbil9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHJ8fCh0PW4odCkpLHQ/KHQ9dC5yZ2IoKSxuZXcgbCh0LnIsdC5nLHQuYix0Lm9wYWNpdHkpKTpuZXcgbH1mdW5jdGlvbiBzKHQsZSxyLG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9vKHQpOm5ldyBsKHQsZSxyLG51bGw9PW4/MTpuKX1mdW5jdGlvbiBsKHQsZSxyLG4pe3RoaXMucj0rdCx0aGlzLmc9K2UsdGhpcy5iPStyLHRoaXMub3BhY2l0eT0rbn1mdW5jdGlvbiB1KHQsZSxyLG4pe3JldHVybiBuPD0wP3Q9ZT1yPU5hTjpyPD0wfHxyPj0xP3Q9ZT1OYU46ZTw9MCYmKHQ9TmFOKSxuZXcgZih0LGUscixuKX1mdW5jdGlvbiBjKHQpe2lmKHQgaW5zdGFuY2VvZiBmKXJldHVybiBuZXcgZih0LmgsdC5zLHQubCx0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiByfHwodD1uKHQpKSwhdClyZXR1cm4gbmV3IGY7aWYodCBpbnN0YW5jZW9mIGYpcmV0dXJuIHQ7dD10LnJnYigpO3ZhciBlPXQuci8yNTUsaT10LmcvMjU1LGE9dC5iLzI1NSxvPU1hdGgubWluKGUsaSxhKSxzPU1hdGgubWF4KGUsaSxhKSxsPU5hTix1PXMtbyxjPShzK28pLzI7cmV0dXJuIHU/KGw9ZT09PXM/KGktYSkvdSs2KihpPGEpOmk9PT1zPyhhLWUpL3UrMjooZS1pKS91KzQsdS89YzwuNT9zK286Mi1zLW8sbCo9NjApOnU9Yz4wJiZjPDE/MDpsLG5ldyBmKGwsdSxjLHQub3BhY2l0eSl9ZnVuY3Rpb24gaCh0LGUscixuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Yyh0KTpuZXcgZih0LGUscixudWxsPT1uPzE6bil9ZnVuY3Rpb24gZih0LGUscixuKXt0aGlzLmg9K3QsdGhpcy5zPStlLHRoaXMubD0rcix0aGlzLm9wYWNpdHk9K259ZnVuY3Rpb24gZCh0LGUscil7cmV0dXJuIDI1NSoodDw2MD9lKyhyLWUpKnQvNjA6dDwxODA/cjp0PDI0MD9lKyhyLWUpKigyNDAtdCkvNjA6ZSl9ZnVuY3Rpb24gcCh0KXtpZih0IGluc3RhbmNlb2YgdilyZXR1cm4gbmV3IHYodC5sLHQuYSx0LmIsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgTSl7dmFyIGU9dC5oKkI7cmV0dXJuIG5ldyB2KHQubCxNYXRoLmNvcyhlKSp0LmMsTWF0aC5zaW4oZSkqdC5jLHQub3BhY2l0eSl9dCBpbnN0YW5jZW9mIGx8fCh0PW8odCkpO3ZhciByPXgodC5yKSxuPXgodC5nKSxpPXgodC5iKSxhPWcoKC40MTI0NTY0KnIrLjM1NzU3NjEqbisuMTgwNDM3NSppKS9WKSxzPWcoKC4yMTI2NzI5KnIrLjcxNTE1MjIqbisuMDcyMTc1KmkpL0gpO3JldHVybiBuZXcgdigxMTYqcy0xNiw1MDAqKGEtcyksMjAwKihzLWcoKC4wMTkzMzM5KnIrLjExOTE5MipuKy45NTAzMDQxKmkpL3EpKSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIG0odCxlLHIsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3AodCk6bmV3IHYodCxlLHIsbnVsbD09bj8xOm4pfWZ1bmN0aW9uIHYodCxlLHIsbil7dGhpcy5sPSt0LHRoaXMuYT0rZSx0aGlzLmI9K3IsdGhpcy5vcGFjaXR5PStufWZ1bmN0aW9uIGcodCl7cmV0dXJuIHQ+Vz9NYXRoLnBvdyh0LDEvMyk6dC9YK0d9ZnVuY3Rpb24geSh0KXtyZXR1cm4gdD5ZP3QqdCp0OlgqKHQtRyl9ZnVuY3Rpb24gYih0KXtyZXR1cm4gMjU1Kih0PD0uMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIHgodCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gXyh0KXtpZih0IGluc3RhbmNlb2YgTSlyZXR1cm4gbmV3IE0odC5oLHQuYyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2Ygdnx8KHQ9cCh0KSk7dmFyIGU9TWF0aC5hdGFuMih0LmIsdC5hKSpVO3JldHVybiBuZXcgTShlPDA/ZSszNjA6ZSxNYXRoLnNxcnQodC5hKnQuYSt0LmIqdC5iKSx0LmwsdC5vcGFjaXR5KX1mdW5jdGlvbiB3KHQsZSxyLG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9fKHQpOm5ldyBNKHQsZSxyLG51bGw9PW4/MTpuKX1mdW5jdGlvbiBNKHQsZSxyLG4pe3RoaXMuaD0rdCx0aGlzLmM9K2UsdGhpcy5sPStyLHRoaXMub3BhY2l0eT0rbn1mdW5jdGlvbiBrKHQpe2lmKHQgaW5zdGFuY2VvZiBUKXJldHVybiBuZXcgVCh0LmgsdC5zLHQubCx0Lm9wYWNpdHkpO3QgaW5zdGFuY2VvZiBsfHwodD1vKHQpKTt2YXIgZT10LnIvMjU1LHI9dC5nLzI1NSxuPXQuYi8yNTUsaT0ocnQqbit0dCplLWV0KnIpLyhydCt0dC1ldCksYT1uLWkscz0oJCooci1pKS1LKmEpL1EsdT1NYXRoLnNxcnQocypzK2EqYSkvKCQqaSooMS1pKSksYz11P01hdGguYXRhbjIocyxhKSpVLTEyMDpOYU47cmV0dXJuIG5ldyBUKGM8MD9jKzM2MDpjLHUsaSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIEEodCxlLHIsbil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2sodCk6bmV3IFQodCxlLHIsbnVsbD09bj8xOm4pfWZ1bmN0aW9uIFQodCxlLHIsbil7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K3IsdGhpcy5vcGFjaXR5PStufXZhciBTPWZ1bmN0aW9uKHQsZSxyKXt0LnByb3RvdHlwZT1lLnByb3RvdHlwZT1yLHIuY29uc3RydWN0b3I9dH0sRT0iXFxzKihbKy1dP1xcZCspXFxzKiIsTD0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixDPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIix6PS9eIyhbMC05YS1mXXszfSkkLyxJPS9eIyhbMC05YS1mXXs2fSkkLyxEPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tFLEUsRV0rIlxcKSQiKSxQPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tDLEMsQ10rIlxcKSQiKSxPPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbRSxFLEUsTF0rIlxcKSQiKSxSPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbQyxDLEMsTF0rIlxcKSQiKSxGPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tMLEMsQ10rIlxcKSQiKSxqPW5ldyBSZWdFeHAoIl5oc2xhXFwoIitbTCxDLEMsTF0rIlxcKSQiKSxOPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O1MocixuLHtkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9fSksUyhsLHMsZShyLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgbCh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgbCh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9dGhpcy5yJiZ0aGlzLnI8PTI1NSYmMDw9dGhpcy5nJiZ0aGlzLmc8PTI1NSYmMDw9dGhpcy5iJiZ0aGlzLmI8PTI1NSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybiB0PWlzTmFOKHQpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSwoMT09PXQ/InJnYigiOiJyZ2JhKCIpK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5yKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmcpfHwwKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMuYil8fDApKSsoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKSxTKGYsaCxlKHIse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBmKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Ljc6TWF0aC5wb3coLjcsdCksbmV3IGYodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMscj10aGlzLmwsbj1yKyhyPC41P3I6MS1yKSplLGk9MipyLW47cmV0dXJuIG5ldyBsKGQodD49MjQwP3QtMjQwOnQrMTIwLGksbiksZCh0LGksbiksZCh0PDEyMD90KzI0MDp0LTEyMCxpLG4pLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfX0pKTt2YXIgQj1NYXRoLlBJLzE4MCxVPTE4MC9NYXRoLlBJLFY9Ljk1MDQ3LEg9MSxxPTEuMDg4ODMsRz00LzI5LFk9Ni8yOSxYPTMqWSpZLFc9WSpZKlk7Uyh2LG0sZShyLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHYodGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB2KHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LGU9aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxyPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIHQ9SCp5KHQpLGU9Vip5KGUpLHI9cSp5KHIpLG5ldyBsKGIoMy4yNDA0NTQyKmUtMS41MzcxMzg1KnQtLjQ5ODUzMTQqciksYigtLjk2OTI2NiplKzEuODc2MDEwOCp0Ky4wNDE1NTYqciksYiguMDU1NjQzNCplLS4yMDQwMjU5KnQrMS4wNTcyMjUyKnIpLHRoaXMub3BhY2l0eSl9fSkpLFMoTSx3LGUocix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBNKHRoaXMuaCx0aGlzLmMsdGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgTSh0aGlzLmgsdGhpcy5jLHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiBwKHRoaXMpLnJnYigpfX0pKTt2YXIgWj0tLjE0ODYxLEo9MS43ODI3NyxLPS0uMjkyMjcsUT0tLjkwNjQ5LCQ9MS45NzI5NCx0dD0kKlEsZXQ9JCpKLHJ0PUoqSy1RKlo7UyhULEEsZShyLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgVCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBUKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9aXNOYU4odGhpcy5oKT8wOih0aGlzLmgrMTIwKSpCLGU9K3RoaXMubCxyPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqZSooMS1lKSxuPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBsKDI1NSooZStyKihaKm4rSippKSksMjU1KihlK3IqKEsqbitRKmkpKSwyNTUqKGUrciooJCpuKSksdGhpcy5vcGFjaXR5KX19KSksdC5jb2xvcj1uLHQucmdiPXMsdC5oc2w9aCx0LmxhYj1tLHQuaGNsPXcsdC5jdWJlaGVsaXg9QSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KX0se31dLDExNTpbZnVuY3Rpb24oZSxyLG4peyFmdW5jdGlvbihlLGkpeyJvYmplY3QiPT10eXBlb2YgbiYmdm9pZCAwIT09cj9pKG4pOiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LmFtZD90KFsiZXhwb3J0cyJdLGkpOmkoZS5kMz1lLmQzfHx7fSl9KHRoaXMsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGUoKXtmb3IodmFyIHQsZT0wLG49YXJndW1lbnRzLmxlbmd0aCxpPXt9O2U8bjsrK2Upe2lmKCEodD1hcmd1bWVudHNbZV0rIiIpfHx0IGluIGkpdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIrdCk7aVt0XT1bXX1yZXR1cm4gbmV3IHIoaSl9ZnVuY3Rpb24gcih0KXt0aGlzLl89dH1mdW5jdGlvbiBuKHQsZSl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbih0KXt2YXIgcj0iIixuPXQuaW5kZXhPZigiLiIpO2lmKG4+PTAmJihyPXQuc2xpY2UobisxKSx0PXQuc2xpY2UoMCxuKSksdCYmIWUuaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7cmV0dXJue3R5cGU6dCxuYW1lOnJ9fSl9ZnVuY3Rpb24gaSh0LGUpe2Zvcih2YXIgcixuPTAsaT10Lmxlbmd0aDtuPGk7KytuKWlmKChyPXRbbl0pLm5hbWU9PT1lKXJldHVybiByLnZhbHVlfWZ1bmN0aW9uIGEodCxlLHIpe2Zvcih2YXIgbj0wLGk9dC5sZW5ndGg7bjxpOysrbilpZih0W25dLm5hbWU9PT1lKXt0W25dPW8sdD10LnNsaWNlKDAsbikuY29uY2F0KHQuc2xpY2UobisxKSk7YnJlYWt9cmV0dXJuIG51bGwhPXImJnQucHVzaCh7bmFtZTplLHZhbHVlOnJ9KSx0fXZhciBvPXt2YWx1ZTpmdW5jdGlvbigpe319O3IucHJvdG90eXBlPWUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpyLG9uOmZ1bmN0aW9uKHQsZSl7dmFyIHIsbz10aGlzLl8scz1uKHQrIiIsbyksbD0tMSx1PXMubGVuZ3RoO3tpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2lmKG51bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIitlKTtmb3IoOysrbDx1OylpZihyPSh0PXNbbF0pLnR5cGUpb1tyXT1hKG9bcl0sdC5uYW1lLGUpO2Vsc2UgaWYobnVsbD09ZSlmb3IociBpbiBvKW9bcl09YShvW3JdLHQubmFtZSxudWxsKTtyZXR1cm4gdGhpc31mb3IoOysrbDx1OylpZigocj0odD1zW2xdKS50eXBlKSYmKHI9aShvW3JdLHQubmFtZSkpKXJldHVybiByfX0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dGhpcy5fCjtmb3IodmFyIG4gaW4gZSl0W25dPWVbbl0uc2xpY2UoKTtyZXR1cm4gbmV3IHIodCl9LGNhbGw6ZnVuY3Rpb24odCxlKXtpZigocj1hcmd1bWVudHMubGVuZ3RoLTIpPjApZm9yKHZhciByLG4saT1uZXcgQXJyYXkociksYT0wO2E8cjsrK2EpaVthXT1hcmd1bWVudHNbYSsyXTtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2ZvcihuPXRoaXMuX1t0XSxhPTAscj1uLmxlbmd0aDthPHI7KythKW5bYV0udmFsdWUuYXBwbHkoZSxpKX0sYXBwbHk6ZnVuY3Rpb24odCxlLHIpe2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHZhciBuPXRoaXMuX1t0XSxpPTAsYT1uLmxlbmd0aDtpPGE7KytpKW5baV0udmFsdWUuYXBwbHkoZSxyKX19LHQuZGlzcGF0Y2g9ZSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KX0se31dLDExNjpbZnVuY3Rpb24oZSxyLG4peyFmdW5jdGlvbihpLGEpeyJvYmplY3QiPT10eXBlb2YgbiYmdm9pZCAwIT09cj9hKG4sZSgiZDMtcXVhZHRyZWUiKSxlKCJkMy1jb2xsZWN0aW9uIiksZSgiZDMtZGlzcGF0Y2giKSxlKCJkMy10aW1lciIpKToiZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5hbWQ/dChbImV4cG9ydHMiLCJkMy1xdWFkdHJlZSIsImQzLWNvbGxlY3Rpb24iLCJkMy1kaXNwYXRjaCIsImQzLXRpbWVyIl0sYSk6YShpLmQzPWkuZDN8fHt9LGkuZDMsaS5kMyxpLmQzLGkuZDMpfSh0aGlzLGZ1bmN0aW9uKHQsZSxyLG4saSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEodCl7cmV0dXJuIHQueCt0LnZ4fWZ1bmN0aW9uIG8odCl7cmV0dXJuIHQueSt0LnZ5fWZ1bmN0aW9uIHModCl7cmV0dXJuIHQuaW5kZXh9ZnVuY3Rpb24gbCh0LGUpe3ZhciByPXQuZ2V0KGUpO2lmKCFyKXRocm93IG5ldyBFcnJvcigibWlzc2luZzogIitlKTtyZXR1cm4gcn1mdW5jdGlvbiB1KHQpe3JldHVybiB0Lnh9ZnVuY3Rpb24gYyh0KXtyZXR1cm4gdC55fXZhciBoPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcigpe3ZhciByLGksYT1uLmxlbmd0aCxvPTAscz0wO2ZvcihyPTA7cjxhOysrcilpPW5bcl0sbys9aS54LHMrPWkueTtmb3Iobz1vL2EtdCxzPXMvYS1lLHI9MDtyPGE7KytyKWk9bltyXSxpLngtPW8saS55LT1zfXZhciBuO3JldHVybiBudWxsPT10JiYodD0wKSxudWxsPT1lJiYoZT0wKSxyLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10fSxyLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K2Uscik6dH0sci55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0LHIpOmV9LHJ9LGY9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxkPWZ1bmN0aW9uKCl7cmV0dXJuIDFlLTYqKE1hdGgucmFuZG9tKCktLjUpfSxwPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIoKXtmdW5jdGlvbiB0KHQsZSxyLG4saSl7dmFyIGE9dC5kYXRhLG89dC5yLHM9bStvO3tpZighYSlyZXR1cm4gZT5mK3N8fG48Zi1zfHxyPnArc3x8aTxwLXM7aWYoYS5pbmRleD5oLmluZGV4KXt2YXIgbD1mLWEueC1hLnZ4LGM9cC1hLnktYS52eSxnPWwqbCtjKmM7ZzxzKnMmJigwPT09bCYmKGw9ZCgpLGcrPWwqbCksMD09PWMmJihjPWQoKSxnKz1jKmMpLGc9KHMtKGc9TWF0aC5zcXJ0KGcpKSkvZyp1LGgudngrPShsKj1nKSoocz0obyo9bykvKHYrbykpLGgudnkrPShjKj1nKSpzLGEudngtPWwqKHM9MS1zKSxhLnZ5LT1jKnMpfX19Zm9yKHZhciByLGksaCxmLHAsbSx2LGc9cy5sZW5ndGgseT0wO3k8YzsrK3kpZm9yKGk9ZS5xdWFkdHJlZShzLGEsbykudmlzaXRBZnRlcihuKSxyPTA7cjxnOysrciloPXNbcl0sbT1sW2guaW5kZXhdLHY9bSptLGY9aC54K2gudngscD1oLnkraC52eSxpLnZpc2l0KHQpfWZ1bmN0aW9uIG4odCl7aWYodC5kYXRhKXJldHVybiB0LnI9bFt0LmRhdGEuaW5kZXhdO2Zvcih2YXIgZT10LnI9MDtlPDQ7KytlKXRbZV0mJnRbZV0ucj50LnImJih0LnI9dFtlXS5yKX1mdW5jdGlvbiBpKCl7aWYocyl7dmFyIGUscixuPXMubGVuZ3RoO2ZvcihsPW5ldyBBcnJheShuKSxlPTA7ZTxuOysrZSlyPXNbZV0sbFtyLmluZGV4XT0rdChyLGUscyl9fXZhciBzLGwsdT0xLGM9MTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9ZihudWxsPT10PzE6K3QpKSxyLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cz10LGkoKX0sci5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LHIpOmN9LHIuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3Qscik6dX0sci5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpmKCtlKSxpKCkscik6dH0scn0sbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3JldHVybiAxL01hdGgubWluKHBbdC5zb3VyY2UuaW5kZXhdLHBbdC50YXJnZXQuaW5kZXhdKX1mdW5jdGlvbiBuKGUpe2Zvcih2YXIgcj0wLG49dC5sZW5ndGg7cjxiOysrcilmb3IodmFyIGksYSxvLHMsbCxoLGYscD0wO3A8bjsrK3ApaT10W3BdLGE9aS5zb3VyY2Usbz1pLnRhcmdldCxzPW8ueCtvLnZ4LWEueC1hLnZ4fHxkKCksbD1vLnkrby52eS1hLnktYS52eXx8ZCgpLGg9TWF0aC5zcXJ0KHMqcytsKmwpLGg9KGgtY1twXSkvaCplKnVbcF0scyo9aCxsKj1oLG8udngtPXMqKGY9bVtwXSksby52eS09bCpmLGEudngrPXMqKGY9MS1mKSxhLnZ5Kz1sKmZ9ZnVuY3Rpb24gaSgpe2lmKGgpe3ZhciBlLG4saT1oLmxlbmd0aCxzPXQubGVuZ3RoLGY9ci5tYXAoaCx2KTtmb3IoZT0wLHA9bmV3IEFycmF5KGkpO2U8czsrK2Upbj10W2VdLG4uaW5kZXg9ZSwib2JqZWN0IiE9dHlwZW9mIG4uc291cmNlJiYobi5zb3VyY2U9bChmLG4uc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBuLnRhcmdldCYmKG4udGFyZ2V0PWwoZixuLnRhcmdldCkpLHBbbi5zb3VyY2UuaW5kZXhdPShwW24uc291cmNlLmluZGV4XXx8MCkrMSxwW24udGFyZ2V0LmluZGV4XT0ocFtuLnRhcmdldC5pbmRleF18fDApKzE7Zm9yKGU9MCxtPW5ldyBBcnJheShzKTtlPHM7KytlKW49dFtlXSxtW2VdPXBbbi5zb3VyY2UuaW5kZXhdLyhwW24uc291cmNlLmluZGV4XStwW24udGFyZ2V0LmluZGV4XSk7dT1uZXcgQXJyYXkocyksYSgpLGM9bmV3IEFycmF5KHMpLG8oKX19ZnVuY3Rpb24gYSgpe2lmKGgpZm9yKHZhciBlPTAscj10Lmxlbmd0aDtlPHI7KytlKXVbZV09K2codFtlXSxlLHQpfWZ1bmN0aW9uIG8oKXtpZihoKWZvcih2YXIgZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSljW2VdPSt5KHRbZV0sZSx0KX12YXIgdSxjLGgscCxtLHY9cyxnPWUseT1mKDMwKSxiPTE7cmV0dXJuIG51bGw9PXQmJih0PVtdKSxuLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7aD10LGkoKX0sbi5saW5rcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLGkoKSxuKTp0fSxuLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PXQsbik6dn0sbi5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPSt0LG4pOmJ9LG4uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmKCt0KSxhKCksbik6Z30sbi5kaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmYoK3QpLG8oKSxuKTp5fSxufSx2PTEwLGc9TWF0aC5QSSooMy1NYXRoLnNxcnQoNSkpLHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe2EoKSx5LmNhbGwoInRpY2siLGwpLHU8YyYmKG0uc3RvcCgpLHkuY2FsbCgiZW5kIixsKSl9ZnVuY3Rpb24gYSgpe3ZhciBlLHIsbj10Lmxlbmd0aDtmb3IodSs9KGYtdSkqaCxwLmVhY2goZnVuY3Rpb24odCl7dCh1KX0pLGU9MDtlPG47KytlKXI9dFtlXSxudWxsPT1yLmZ4P3IueCs9ci52eCo9ZDooci54PXIuZngsci52eD0wKSxudWxsPT1yLmZ5P3IueSs9ci52eSo9ZDooci55PXIuZnksci52eT0wKX1mdW5jdGlvbiBvKCl7Zm9yKHZhciBlLHI9MCxuPXQubGVuZ3RoO3I8bjsrK3Ipe2lmKGU9dFtyXSxlLmluZGV4PXIsaXNOYU4oZS54KXx8aXNOYU4oZS55KSl7dmFyIGk9dipNYXRoLnNxcnQociksYT1yKmc7ZS54PWkqTWF0aC5jb3MoYSksZS55PWkqTWF0aC5zaW4oYSl9KGlzTmFOKGUudngpfHxpc05hTihlLnZ5KSkmJihlLnZ4PWUudnk9MCl9fWZ1bmN0aW9uIHMoZSl7cmV0dXJuIGUuaW5pdGlhbGl6ZSYmZS5pbml0aWFsaXplKHQpLGV9dmFyIGwsdT0xLGM9LjAwMSxoPTEtTWF0aC5wb3coYywxLzMwMCksZj0wLGQ9LjYscD1yLm1hcCgpLG09aS50aW1lcihlKSx5PW4uZGlzcGF0Y2goInRpY2siLCJlbmQiKTtyZXR1cm4gbnVsbD09dCYmKHQ9W10pLG8oKSxsPXt0aWNrOmEscmVzdGFydDpmdW5jdGlvbigpe3JldHVybiBtLnJlc3RhcnQoZSksbH0sc3RvcDpmdW5jdGlvbigpe3JldHVybiBtLnN0b3AoKSxsfSxub2RlczpmdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG8oKSxwLmVhY2gocyksbCk6dH0sYWxwaGE6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3QsbCk6dX0sYWxwaGFNaW46ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9K3QsbCk6Y30sYWxwaGFEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdCxsKToraH0sYWxwaGFUYXJnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9K3QsbCk6Zn0sdmVsb2NpdHlEZWNheTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0xLXQsbCk6MS1kfSxmb3JjZTpmdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KG51bGw9PWU/cC5yZW1vdmUodCk6cC5zZXQodCxzKGUpKSxsKTpwLmdldCh0KX0sZmluZDpmdW5jdGlvbihlLHIsbil7dmFyIGksYSxvLHMsbCx1PTAsYz10Lmxlbmd0aDtmb3IobnVsbD09bj9uPTEvMDpuKj1uLHU9MDt1PGM7Kyt1KXM9dFt1XSxpPWUtcy54LGE9ci1zLnksKG89aSppK2EqYSk8biYmKGw9cyxuPW8pO3JldHVybiBsfSxvbjpmdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/KHkub24odCxlKSxsKTp5Lm9uKHQpfX19LGI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciByLGw9YS5sZW5ndGgsaD1lLnF1YWR0cmVlKGEsdSxjKS52aXNpdEFmdGVyKG4pO2ZvcihzPXQscj0wO3I8bDsrK3Ipbz1hW3JdLGgudmlzaXQoaSl9ZnVuY3Rpb24gcigpe2lmKGEpe3ZhciB0LGUscj1hLmxlbmd0aDtmb3IobD1uZXcgQXJyYXkociksdD0wO3Q8cjsrK3QpZT1hW3RdLGxbZS5pbmRleF09K2goZSx0LGEpfX1mdW5jdGlvbiBuKHQpe3ZhciBlLHIsbixpLGEsbz0wO2lmKHQubGVuZ3RoKXtmb3Iobj1pPWE9MDthPDQ7KythKShlPXRbYV0pJiYocj1lLnZhbHVlKSYmKG8rPXIsbis9ciplLngsaSs9ciplLnkpO3QueD1uL28sdC55PWkvb31lbHNle2U9dCxlLng9ZS5kYXRhLngsZS55PWUuZGF0YS55O2Rve28rPWxbZS5kYXRhLmluZGV4XX13aGlsZShlPWUubmV4dCl9dC52YWx1ZT1vfWZ1bmN0aW9uIGkodCxlLHIsbil7aWYoIXQudmFsdWUpcmV0dXJuITA7dmFyIGk9dC54LW8ueCxhPXQueS1vLnksdT1uLWUsYz1pKmkrYSphO2lmKHUqdS92PGMpcmV0dXJuIGM8bSYmKDA9PT1pJiYoaT1kKCksYys9aSppKSwwPT09YSYmKGE9ZCgpLGMrPWEqYSksYzxwJiYoYz1NYXRoLnNxcnQocCpjKSksby52eCs9aSp0LnZhbHVlKnMvYyxvLnZ5Kz1hKnQudmFsdWUqcy9jKSwhMDtpZighKHQubGVuZ3RofHxjPj1tKSl7KHQuZGF0YSE9PW98fHQubmV4dCkmJigwPT09aSYmKGk9ZCgpLGMrPWkqaSksMD09PWEmJihhPWQoKSxjKz1hKmEpLGM8cCYmKGM9TWF0aC5zcXJ0KHAqYykpKTtkb3t0LmRhdGEhPT1vJiYodT1sW3QuZGF0YS5pbmRleF0qcy9jLG8udngrPWkqdSxvLnZ5Kz1hKnUpfXdoaWxlKHQ9dC5uZXh0KX19dmFyIGEsbyxzLGwsaD1mKC0zMCkscD0xLG09MS8wLHY9LjgxO3JldHVybiB0LmluaXRpYWxpemU9ZnVuY3Rpb24odCl7YT10LHIoKX0sdC5zdHJlbmd0aD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOmYoK2UpLHIoKSx0KTpofSx0LmRpc3RhbmNlTWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPWUqZSx0KTpNYXRoLnNxcnQocCl9LHQuZGlzdGFuY2VNYXg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09ZSplLHQpOk1hdGguc3FydChtKX0sdC50aGV0YT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1lKmUsdCk6TWF0aC5zcXJ0KHYpfSx0fSx4PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7Zm9yKHZhciBlLHI9MCxvPW4ubGVuZ3RoO3I8bzsrK3IpZT1uW3JdLGUudngrPShhW3JdLWUueCkqaVtyXSp0fWZ1bmN0aW9uIHIoKXtpZihuKXt2YXIgZSxyPW4ubGVuZ3RoO2ZvcihpPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKSxlPTA7ZTxyOysrZSlpW2VdPWlzTmFOKGFbZV09K3QobltlXSxlLG4pKT8wOitvKG5bZV0sZSxuKX19dmFyIG4saSxhLG89ZiguMSk7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWYobnVsbD09dD8wOit0KSksZS5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe249dCxyKCl9LGUuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmKCt0KSxyKCksZSk6b30sZS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZigrbikscigpLGUpOnR9LGV9LF89ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXtmb3IodmFyIGUscj0wLG89bi5sZW5ndGg7cjxvOysrcillPW5bcl0sZS52eSs9KGFbcl0tZS55KSppW3JdKnR9ZnVuY3Rpb24gcigpe2lmKG4pe3ZhciBlLHI9bi5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KHIpLGE9bmV3IEFycmF5KHIpLGU9MDtlPHI7KytlKWlbZV09aXNOYU4oYVtlXT0rdChuW2VdLGUsbikpPzA6K28obltlXSxlLG4pfX12YXIgbixpLGEsbz1mKC4xKTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9ZihudWxsPT10PzA6K3QpKSxlLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LHIoKX0sZS5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmYoK3QpLHIoKSxlKTpvfSxlLnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmKCtuKSxyKCksZSk6dH0sZX07dC5mb3JjZUNlbnRlcj1oLHQuZm9yY2VDb2xsaWRlPXAsdC5mb3JjZUxpbms9bSx0LmZvcmNlTWFueUJvZHk9Yix0LmZvcmNlU2ltdWxhdGlvbj15LHQuZm9yY2VYPXgsdC5mb3JjZVk9XyxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KX0seyJkMy1jb2xsZWN0aW9uIjoxMTMsImQzLWRpc3BhdGNoIjoxMTUsImQzLXF1YWR0cmVlIjoxMTgsImQzLXRpbWVyIjoxMTl9XSwxMTc6W2Z1bmN0aW9uKGUscixuKXshZnVuY3Rpb24oaSxhKXsib2JqZWN0Ij09dHlwZW9mIG4mJnZvaWQgMCE9PXI/YShuLGUoImQzLWNvbG9yIikpOiJmdW5jdGlvbiI9PXR5cGVvZiB0JiZ0LmFtZD90KFsiZXhwb3J0cyIsImQzLWNvbG9yIl0sYSk6YShpLmQzPWkuZDN8fHt9LGkuZDMpfSh0aGlzLGZ1bmN0aW9uKHQsZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIodCxlLHIsbixpKXt2YXIgYT10KnQsbz1hKnQ7cmV0dXJuKCgxLTMqdCszKmEtbykqZSsoNC02KmErMypvKSpyKygxKzMqdCszKmEtMypvKSpuK28qaSkvNn1mdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiB0K3IqZX19ZnVuY3Rpb24gaSh0LGUscil7cmV0dXJuIHQ9TWF0aC5wb3codCxyKSxlPU1hdGgucG93KGUsciktdCxyPTEvcixmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3codCtuKmUscil9fWZ1bmN0aW9uIGEodCxlKXt2YXIgcj1lLXQ7cmV0dXJuIHI/bih0LHI+MTgwfHxyPC0xODA/ci0zNjAqTWF0aC5yb3VuZChyLzM2MCk6cik6Uyhpc05hTih0KT9lOnQpfWZ1bmN0aW9uIG8odCl7cmV0dXJuIDE9PSh0PSt0KT9zOmZ1bmN0aW9uKGUscil7cmV0dXJuIHItZT9pKGUscix0KTpTKGlzTmFOKGUpP3I6ZSl9fWZ1bmN0aW9uIHModCxlKXt2YXIgcj1lLXQ7cmV0dXJuIHI/bih0LHIpOlMoaXNOYU4odCk/ZTp0KX1mdW5jdGlvbiBsKHQpe3JldHVybiBmdW5jdGlvbihyKXt2YXIgbixpLGE9ci5sZW5ndGgsbz1uZXcgQXJyYXkoYSkscz1uZXcgQXJyYXkoYSksbD1uZXcgQXJyYXkoYSk7Zm9yKG49MDtuPGE7KytuKWk9ZS5yZ2IocltuXSksb1tuXT1pLnJ8fDAsc1tuXT1pLmd8fDAsbFtuXT1pLmJ8fDA7cmV0dXJuIG89dChvKSxzPXQocyksbD10KGwpLGkub3BhY2l0eT0xLGZ1bmN0aW9uKHQpe3JldHVybiBpLnI9byh0KSxpLmc9cyh0KSxpLmI9bCh0KSxpKyIifX19ZnVuY3Rpb24gdSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gYyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSkrIiJ9fWZ1bmN0aW9uIGgodCl7cmV0dXJuIm5vbmUiPT09dD9VOihffHwoXz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSx3PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxNPWRvY3VtZW50LmRlZmF1bHRWaWV3KSxfLnN0eWxlLnRyYW5zZm9ybT10LHQ9TS5nZXRDb21wdXRlZFN0eWxlKHcuYXBwZW5kQ2hpbGQoXyksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIiksdy5yZW1vdmVDaGlsZChfKSx0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSxWKCt0WzBdLCt0WzFdLCt0WzJdLCt0WzNdLCt0WzRdLCt0WzVdKSl9ZnVuY3Rpb24gZih0KXtyZXR1cm4gbnVsbD09dD9VOihrfHwoaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKSxrLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIix0KSwodD1rLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpPyh0PXQubWF0cml4LFYodC5hLHQuYix0LmMsdC5kLHQuZSx0LmYpKTpVKX1mdW5jdGlvbiBkKHQsZSxyLG4pe2Z1bmN0aW9uIGkodCl7cmV0dXJuIHQubGVuZ3RoP3QucG9wKCkrIiAiOiIifWZ1bmN0aW9uIGEodCxuLGksYSxvLHMpe2lmKHQhPT1pfHxuIT09YSl7dmFyIGw9by5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLGUsbnVsbCxyKTtzLnB1c2goe2k6bC00LHg6RCh0LGkpfSx7aTpsLTIseDpEKG4sYSl9KX1lbHNlKGl8fGEpJiZvLnB1c2goInRyYW5zbGF0ZSgiK2krZSthK3IpfWZ1bmN0aW9uIG8odCxlLHIsYSl7dCE9PWU/KHQtZT4xODA/ZSs9MzYwOmUtdD4xODAmJih0Kz0zNjApLGEucHVzaCh7aTpyLnB1c2goaShyKSsicm90YXRlKCIsbnVsbCxuKS0yLHg6RCh0LGUpfSkpOmUmJnIucHVzaChpKHIpKyJyb3RhdGUoIitlK24pfWZ1bmN0aW9uIHModCxlLHIsYSl7dCE9PWU/YS5wdXNoKHtpOnIucHVzaChpKHIpKyJza2V3WCgiLG51bGwsbiktMix4OkQodCxlKX0pOmUmJnIucHVzaChpKHIpKyJza2V3WCgiK2Urbil9ZnVuY3Rpb24gbCh0LGUscixuLGEsbyl7aWYodCE9PXJ8fGUhPT1uKXt2YXIgcz1hLnB1c2goaShhKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIik7by5wdXNoKHtpOnMtNCx4OkQodCxyKX0se2k6cy0yLHg6RChlLG4pfSl9ZWxzZSAxPT09ciYmMT09PW58fGEucHVzaChpKGEpKyJzY2FsZSgiK3IrIiwiK24rIikiKX1yZXR1cm4gZnVuY3Rpb24oZSxyKXt2YXIgbj1bXSxpPVtdO3JldHVybiBlPXQoZSkscj10KHIpLGEoZS50cmFuc2xhdGVYLGUudHJhbnNsYXRlWSxyLnRyYW5zbGF0ZVgsci50cmFuc2xhdGVZLG4saSksbyhlLnJvdGF0ZSxyLnJvdGF0ZSxuLGkpLHMoZS5za2V3WCxyLnNrZXdYLG4saSksbChlLnNjYWxlWCxlLnNjYWxlWSxyLnNjYWxlWCxyLnNjYWxlWSxuLGkpLGU9cj1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPS0xLGE9aS5sZW5ndGg7KytyPGE7KW5bKGU9aVtyXSkuaV09ZS54KHQpO3JldHVybiBuLmpvaW4oIiIpfX19ZnVuY3Rpb24gcCh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBtKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfWZ1bmN0aW9uIHYodCl7cmV0dXJuKCh0PU1hdGguZXhwKDIqdCkpLTEpLyh0KzEpfWZ1bmN0aW9uIGcodCl7cmV0dXJuIGZ1bmN0aW9uKHIsbil7dmFyIGk9dCgocj1lLmhzbChyKSkuaCwobj1lLmhzbChuKSkuaCksYT1zKHIucyxuLnMpLG89cyhyLmwsbi5sKSxsPXMoci5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByLmg9aSh0KSxyLnM9YSh0KSxyLmw9byh0KSxyLm9wYWNpdHk9bCh0KSxyKyIifX19ZnVuY3Rpb24geSh0LHIpe3ZhciBuPXMoKHQ9ZS5sYWIodCkpLmwsKHI9ZS5sYWIocikpLmwpLGk9cyh0LmEsci5hKSxhPXModC5iLHIuYiksbz1zKHQub3BhY2l0eSxyLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5sPW4oZSksdC5hPWkoZSksdC5iPWEoZSksdC5vcGFjaXR5PW8oZSksdCsiIn19ZnVuY3Rpb24gYih0KXtyZXR1cm4gZnVuY3Rpb24ocixuKXt2YXIgaT10KChyPWUuaGNsKHIpKS5oLChuPWUuaGNsKG4pKS5oKSxhPXMoci5jLG4uYyksbz1zKHIubCxuLmwpLGw9cyhyLm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIuaD1pKHQpLHIuYz1hKHQpLHIubD1vKHQpLHIub3BhY2l0eT1sKHQpLHIrIiJ9fX1mdW5jdGlvbiB4KHQpe3JldHVybiBmdW5jdGlvbiByKG4pe2Z1bmN0aW9uIGkocixpKXt2YXIgYT10KChyPWUuY3ViZWhlbGl4KHIpKS5oLChpPWUuY3ViZWhlbGl4KGkpKS5oKSxvPXMoci5zLGkucyksbD1zKHIubCxpLmwpLHU9cyhyLm9wYWNpdHksaS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIuaD1hKHQpLHIucz1vKHQpLHIubD1sKE1hdGgucG93KHQsbikpLHIub3BhY2l0eT11KHQpLHIrIiJ9fXJldHVybiBuPStuLGkuZ2FtbWE9cixpfSgxKX12YXIgXyx3LE0sayxBPWZ1bmN0aW9uKHQpe3ZhciBlPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpPW48PTA/bj0wOm4+PTE/KG49MSxlLTEpOk1hdGguZmxvb3IobiplKSxhPXRbaV0sbz10W2krMV0scz1pPjA/dFtpLTFdOjIqYS1vLGw9aTxlLTE/dFtpKzJdOjIqby1hO3JldHVybiByKChuLWkvZSkqZSxzLGEsbyxsKX19LFQ9ZnVuY3Rpb24odCl7dmFyIGU9dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpPU1hdGguZmxvb3IoKChuJT0xKTwwPysrbjpuKSplKSxhPXRbKGkrZS0xKSVlXSxvPXRbaSVlXSxzPXRbKGkrMSklZV0sbD10WyhpKzIpJWVdO3JldHVybiByKChuLWkvZSkqZSxhLG8scyxsKX19LFM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxFPWZ1bmN0aW9uIHQocil7ZnVuY3Rpb24gbih0LHIpe3ZhciBuPWkoKHQ9ZS5yZ2IodCkpLnIsKHI9ZS5yZ2IocikpLnIpLGE9aSh0Lmcsci5nKSxvPWkodC5iLHIuYiksbD1zKHQub3BhY2l0eSxyLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5yPW4oZSksdC5nPWEoZSksdC5iPW8oZSksdC5vcGFjaXR5PWwoZSksdCsiIn19dmFyIGk9byhyKTtyZXR1cm4gbi5nYW1tYT10LG59KDEpLEw9bChBKSxDPWwoVCksej1mdW5jdGlvbih0LGUpe3ZhciByLG49ZT9lLmxlbmd0aDowLGk9dD9NYXRoLm1pbihuLHQubGVuZ3RoKTowLGE9bmV3IEFycmF5KG4pLG89bmV3IEFycmF5KG4pO2ZvcihyPTA7cjxpOysrcilhW3JdPWoodFtyXSxlW3JdKTtmb3IoO3I8bjsrK3Ipb1tyXT1lW3JdO3JldHVybiBmdW5jdGlvbih0KXtmb3Iocj0wO3I8aTsrK3Ipb1tyXT1hW3JdKHQpO3JldHVybiBvfX0sST1mdW5jdGlvbih0LGUpe3ZhciByPW5ldyBEYXRlO3JldHVybiB0PSt0LGUtPXQsZnVuY3Rpb24obil7cmV0dXJuIHIuc2V0VGltZSh0K2Uqbikscn19LEQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD0rdCxlLT10LGZ1bmN0aW9uKHIpe3JldHVybiB0K2Uqcn19LFA9ZnVuY3Rpb24odCxlKXt2YXIgcixuPXt9LGk9e307bnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV8fChlPXt9KTtmb3IociBpbiBlKXIgaW4gdD9uW3JdPWoodFtyXSxlW3JdKTppW3JdPWVbcl07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihyIGluIG4paVtyXT1uW3JdKHQpO3JldHVybiBpfX0sTz0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csUj1uZXcgUmVnRXhwKE8uc291cmNlLCJnIiksRj1mdW5jdGlvbih0LGUpe3ZhciByLG4saSxhPU8ubGFzdEluZGV4PVIubGFzdEluZGV4PTAsbz0tMSxzPVtdLGw9W107Zm9yKHQrPSIiLGUrPSIiOyhyPU8uZXhlYyh0KSkmJihuPVIuZXhlYyhlKSk7KShpPW4uaW5kZXgpPmEmJihpPWUuc2xpY2UoYSxpKSxzW29dP3Nbb10rPWk6c1srK29dPWkpLChyPXJbMF0pPT09KG49blswXSk/c1tvXT9zW29dKz1uOnNbKytvXT1uOihzWysrb109bnVsbCxsLnB1c2goe2k6byx4OkQocixuKX0pKSxhPVIubGFzdEluZGV4O3JldHVybiBhPGUubGVuZ3RoJiYoaT1lLnNsaWNlKGEpLHNbb10/c1tvXSs9aTpzWysrb109aSkscy5sZW5ndGg8Mj9sWzBdP2MobFswXS54KTp1KGUpOihlPWwubGVuZ3RoLGZ1bmN0aW9uKHQpe2Zvcih2YXIgcixuPTA7bjxlOysrbilzWyhyPWxbbl0pLmldPXIueCh0KTtyZXR1cm4gcy5qb2luKCIiKX0pfSxqPWZ1bmN0aW9uKHQscil7dmFyIG4saT10eXBlb2YgcjtyZXR1cm4gbnVsbD09cnx8ImJvb2xlYW4iPT09aT9TKHIpOigibnVtYmVyIj09PWk/RDoic3RyaW5nIj09PWk/KG49ZS5jb2xvcihyKSk/KHI9bixFKTpGOnIgaW5zdGFuY2VvZiBlLmNvbG9yP0U6ciBpbnN0YW5jZW9mIERhdGU/STpBcnJheS5pc0FycmF5KHIpP3o6ImZ1bmN0aW9uIiE9dHlwZW9mIHIudmFsdWVPZiYmImZ1bmN0aW9uIiE9dHlwZW9mIHIudG9TdHJpbmd8fGlzTmFOKHIpP1A6RCkodCxyKX0sTj1mdW5jdGlvbih0LGUpe3JldHVybiB0PSt0LGUtPXQsZnVuY3Rpb24ocil7cmV0dXJuIE1hdGgucm91bmQodCtlKnIpfX0sQj0xODAvTWF0aC5QSSxVPXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9LFY9ZnVuY3Rpb24odCxlLHIsbixpLGEpe3ZhciBvLHMsbDtyZXR1cm4obz1NYXRoLnNxcnQodCp0K2UqZSkpJiYodC89byxlLz1vKSwobD10KnIrZSpuKSYmKHItPXQqbCxuLT1lKmwpLChzPU1hdGguc3FydChyKnIrbipuKSkmJihyLz1zLG4vPXMsbC89cyksdCpuPGUqciYmKHQ9LXQsZT0tZSxsPS1sLG89LW8pLHt0cmFuc2xhdGVYOmksdHJhbnNsYXRlWTphLHJvdGF0ZTpNYXRoLmF0YW4yKGUsdCkqQixza2V3WDpNYXRoLmF0YW4obCkqQixzY2FsZVg6byxzY2FsZVk6c319LEg9ZChoLCJweCwgIiwicHgpIiwiZGVnKSIpLHE9ZChmLCIsICIsIikiLCIpIiksRz1NYXRoLlNRUlQyLFk9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGk9dFswXSxhPXRbMV0sbz10WzJdLHM9ZVswXSxsPWVbMV0sdT1lWzJdLGM9cy1pLGg9bC1hLGY9YypjK2gqaDtpZihmPDFlLTEyKW49TWF0aC5sb2codS9vKS9HLHI9ZnVuY3Rpb24odCl7cmV0dXJuW2krdCpjLGErdCpoLG8qTWF0aC5leHAoRyp0Km4pXX07ZWxzZXt2YXIgZD1NYXRoLnNxcnQoZiksZz0odSp1LW8qbys0KmYpLygyKm8qMipkKSx5PSh1KnUtbypvLTQqZikvKDIqdSoyKmQpLGI9TWF0aC5sb2coTWF0aC5zcXJ0KGcqZysxKS1nKSx4PU1hdGgubG9nKE1hdGguc3FydCh5KnkrMSkteSk7bj0oeC1iKS9HLHI9ZnVuY3Rpb24odCl7dmFyIGU9dCpuLHI9cChiKSxzPW8vKDIqZCkqKHIqdihHKmUrYiktbShiKSk7cmV0dXJuW2krcypjLGErcypoLG8qci9wKEcqZStiKV19fXJldHVybiByLmR1cmF0aW9uPTFlMypuLHJ9LFg9ZyhhKSxXPWcocyksWj1iKGEpLEo9YihzKSxLPXgoYSksUT14KHMpLCQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKXJbbl09dChuLyhlLTEpKTtyZXR1cm4gcn07dC5pbnRlcnBvbGF0ZT1qLHQuaW50ZXJwb2xhdGVBcnJheT16LHQuaW50ZXJwb2xhdGVCYXNpcz1BLHQuaW50ZXJwb2xhdGVCYXNpc0Nsb3NlZD1ULHQuaW50ZXJwb2xhdGVEYXRlPUksdC5pbnRlcnBvbGF0ZU51bWJlcj1ELHQuaW50ZXJwb2xhdGVPYmplY3Q9UCx0LmludGVycG9sYXRlUm91bmQ9Tix0LmludGVycG9sYXRlU3RyaW5nPUYsdC5pbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcz1ILHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc9cSx0LmludGVycG9sYXRlWm9vbT1ZLHQuaW50ZXJwb2xhdGVSZ2I9RSx0LmludGVycG9sYXRlUmdiQmFzaXM9TCx0LmludGVycG9sYXRlUmdiQmFzaXNDbG9zZWQ9Qyx0LmludGVycG9sYXRlSHNsPVgsdC5pbnRlcnBvbGF0ZUhzbExvbmc9Vyx0LmludGVycG9sYXRlTGFiPXksdC5pbnRlcnBvbGF0ZUhjbD1aLHQuaW50ZXJwb2xhdGVIY2xMb25nPUosdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeD1LLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nPVEsdC5xdWFudGl6ZT0kLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pfSx7ImQzLWNvbG9yIjoxMTR9XSwxMTg6W2Z1bmN0aW9uKGUscixuKXshZnVuY3Rpb24oZSxpKXsib2JqZWN0Ij09dHlwZW9mIG4mJnZvaWQgMCE9PXI/aShuKToiZnVuY3Rpb24iPT10eXBlb2YgdCYmdC5hbWQ/dChbImV4cG9ydHMiXSxpKTppKGUuZDM9ZS5kM3x8e30pfSh0aGlzLGZ1bmN0aW9uKHQpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKHQsZSxyLG4pe2lmKGlzTmFOKGUpfHxpc05hTihyKSlyZXR1cm4gdDt2YXIgaSxhLG8scyxsLHUsYyxoLGYsZD10Ll9yb290LHA9e2RhdGE6bn0sbT10Ll94MCx2PXQuX3kwLGc9dC5feDEseT10Ll95MTtpZighZClyZXR1cm4gdC5fcm9vdD1wLHQ7Zm9yKDtkLmxlbmd0aDspaWYoKHU9ZT49KGE9KG0rZykvMikpP209YTpnPWEsKGM9cj49KG89KHYreSkvMikpP3Y9bzp5PW8saT1kLCEoZD1kW2g9Yzw8MXx1XSkpcmV0dXJuIGlbaF09cCx0O2lmKHM9K3QuX3guY2FsbChudWxsLGQuZGF0YSksbD0rdC5feS5jYWxsKG51bGwsZC5kYXRhKSxlPT09cyYmcj09PWwpcmV0dXJuIHAubmV4dD1kLGk/aVtoXT1wOnQuX3Jvb3Q9cCx0O2Rve2k9aT9pW2hdPW5ldyBBcnJheSg0KTp0Ll9yb290PW5ldyBBcnJheSg0KSwodT1lPj0oYT0obStnKS8yKSk/bT1hOmc9YSwoYz1yPj0obz0odit5KS8yKSk/dj1vOnk9b313aGlsZSgoaD1jPDwxfHUpPT0oZj0obD49byk8PDF8cz49YSkpO3JldHVybiBpW2ZdPWQsaVtoXT1wLHR9ZnVuY3Rpb24gcih0KXt2YXIgcixuLGksYSxvPXQubGVuZ3RoLHM9bmV3IEFycmF5KG8pLGw9bmV3IEFycmF5KG8pLHU9MS8wLGM9MS8wLGg9LTEvMCxmPS0xLzA7Zm9yKG49MDtuPG87KytuKWlzTmFOKGk9K3RoaXMuX3guY2FsbChudWxsLHI9dFtuXSkpfHxpc05hTihhPSt0aGlzLl95LmNhbGwobnVsbCxyKSl8fChzW25dPWksbFtuXT1hLGk8dSYmKHU9aSksaT5oJiYoaD1pKSxhPGMmJihjPWEpLGE+ZiYmKGY9YSkpO2ZvcihoPHUmJih1PXRoaXMuX3gwLGg9dGhpcy5feDEpLGY8YyYmKGM9dGhpcy5feTAsZj10aGlzLl95MSksdGhpcy5jb3Zlcih1LGMpLmNvdmVyKGgsZiksbj0wO248bzsrK24pZSh0aGlzLHNbbl0sbFtuXSx0W25dKTtyZXR1cm4gdGhpc31mdW5jdGlvbiBuKHQpe2Zvcih2YXIgZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl0aGlzLnJlbW92ZSh0W2VdKTtyZXR1cm4gdGhpc31mdW5jdGlvbiBpKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGEodCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gbyh0LGUscil7dmFyIG49bmV3IHMobnVsbD09ZT9pOmUsbnVsbD09cj9hOnIsTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9uOm4uYWRkQWxsKHQpfWZ1bmN0aW9uIHModCxlLHIsbixpLGEpe3RoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5feDA9cix0aGlzLl95MD1uLHRoaXMuX3gxPWksdGhpcy5feTE9YSx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiBsKHQpe2Zvcih2YXIgZT17ZGF0YTp0LmRhdGF9LHI9ZTt0PXQubmV4dDspcj1yLm5leHQ9e2RhdGE6dC5kYXRhfTtyZXR1cm4gZX12YXIgdT1mdW5jdGlvbih0KXt2YXIgcj0rdGhpcy5feC5jYWxsKG51bGwsdCksbj0rdGhpcy5feS5jYWxsKG51bGwsdCk7cmV0dXJuIGUodGhpcy5jb3ZlcihyLG4pLHIsbix0KX0sYz1mdW5jdGlvbih0LGUpe2lmKGlzTmFOKHQ9K3QpfHxpc05hTihlPStlKSlyZXR1cm4gdGhpczt2YXIgcj10aGlzLl94MCxuPXRoaXMuX3kwLGk9dGhpcy5feDEsYT10aGlzLl95MTtpZihpc05hTihyKSlpPShyPU1hdGguZmxvb3IodCkpKzEsYT0obj1NYXRoLmZsb29yKGUpKSsxO2Vsc2V7aWYoIShyPnR8fHQ+aXx8bj5lfHxlPmEpKXJldHVybiB0aGlzO3ZhciBvLHMsbD1pLXIsdT10aGlzLl9yb290O3N3aXRjaChzPShlPChuK2EpLzIpPDwxfHQ8KHIraSkvMil7Y2FzZSAwOmRve289bmV3IEFycmF5KDQpLG9bc109dSx1PW99d2hpbGUobCo9MixpPXIrbCxhPW4rbCx0Pml8fGU+YSk7YnJlYWs7Y2FzZSAxOmRve289bmV3IEFycmF5KDQpLG9bc109dSx1PW99d2hpbGUobCo9MixyPWktbCxhPW4rbCxyPnR8fGU+YSk7YnJlYWs7Y2FzZSAyOmRve289bmV3IEFycmF5KDQpLG9bc109dSx1PW99d2hpbGUobCo9MixpPXIrbCxuPWEtbCx0Pml8fG4+ZSk7YnJlYWs7Y2FzZSAzOmRve289bmV3IEFycmF5KDQpLG9bc109dSx1PW99d2hpbGUobCo9MixyPWktbCxuPWEtbCxyPnR8fG4+ZSl9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PXUpfXJldHVybiB0aGlzLl94MD1yLHRoaXMuX3kwPW4sdGhpcy5feDE9aSx0aGlzLl95MT1hLHRoaXN9LGg9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihlKXtpZighZS5sZW5ndGgpZG97dC5wdXNoKGUuZGF0YSl9d2hpbGUoZT1lLm5leHQpfSksdH0sZj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmNvdmVyKCt0WzBdWzBdLCt0WzBdWzFdKS5jb3ZlcigrdFsxXVswXSwrdFsxXVsxXSk6aXNOYU4odGhpcy5feDApP3ZvaWQgMDpbW3RoaXMuX3gwLHRoaXMuX3kwXSxbdGhpcy5feDEsdGhpcy5feTFdXX0sZD1mdW5jdGlvbih0LGUscixuLGkpe3RoaXMubm9kZT10LHRoaXMueDA9ZSx0aGlzLnkwPXIsdGhpcy54MT1uLHRoaXMueTE9aX0scD1mdW5jdGlvbih0LGUscil7dmFyIG4saSxhLG8scyxsLHUsYz10aGlzLl94MCxoPXRoaXMuX3kwLGY9dGhpcy5feDEscD10aGlzLl95MSxtPVtdLHY9dGhpcy5fcm9vdDtmb3IodiYmbS5wdXNoKG5ldyBkKHYsYyxoLGYscCkpLG51bGw9PXI/cj0xLzA6KGM9dC1yLGg9ZS1yLGY9dCtyLHA9ZStyLHIqPXIpO2w9bS5wb3AoKTspaWYoISghKHY9bC5ub2RlKXx8KGk9bC54MCk+Znx8KGE9bC55MCk+cHx8KG89bC54MSk8Y3x8KHM9bC55MSk8aCkpaWYodi5sZW5ndGgpe3ZhciBnPShpK28pLzIseT0oYStzKS8yO20ucHVzaChuZXcgZCh2WzNdLGcseSxvLHMpLG5ldyBkKHZbMl0saSx5LGcscyksbmV3IGQodlsxXSxnLGEsbyx5KSxuZXcgZCh2WzBdLGksYSxnLHkpKSwodT0oZT49eSk8PDF8dD49ZykmJihsPW1bbS5sZW5ndGgtMV0sbVttLmxlbmd0aC0xXT1tW20ubGVuZ3RoLTEtdV0sbVttLmxlbmd0aC0xLXVdPWwpfWVsc2V7dmFyIGI9dC0rdGhpcy5feC5jYWxsKG51bGwsdi5kYXRhKSx4PWUtK3RoaXMuX3kuY2FsbChudWxsLHYuZGF0YSksXz1iKmIreCp4O2lmKF88cil7dmFyIHc9TWF0aC5zcXJ0KHI9Xyk7Yz10LXcsaD1lLXcsZj10K3cscD1lK3csbj12LmRhdGF9fXJldHVybiBufSxtPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKGE9K3RoaXMuX3guY2FsbChudWxsLHQpKXx8aXNOYU4obz0rdGhpcy5feS5jYWxsKG51bGwsdCkpKXJldHVybiB0aGlzO3ZhciBlLHIsbixpLGEsbyxzLGwsdSxjLGgsZixkPXRoaXMuX3Jvb3QscD10aGlzLl94MCxtPXRoaXMuX3kwLHY9dGhpcy5feDEsZz10aGlzLl95MTtpZighZClyZXR1cm4gdGhpcztpZihkLmxlbmd0aClmb3IoOzspe2lmKCh1PWE+PShzPShwK3YpLzIpKT9wPXM6dj1zLChjPW8+PShsPShtK2cpLzIpKT9tPWw6Zz1sLGU9ZCwhKGQ9ZFtoPWM8PDF8dV0pKXJldHVybiB0aGlzO2lmKCFkLmxlbmd0aClicmVhazsoZVtoKzEmM118fGVbaCsyJjNdfHxlW2grMyYzXSkmJihyPWUsZj1oKX1mb3IoO2QuZGF0YSE9PXQ7KWlmKG49ZCwhKGQ9ZC5uZXh0KSlyZXR1cm4gdGhpcztyZXR1cm4oaT1kLm5leHQpJiZkZWxldGUgZC5uZXh0LG4/KGk/bi5uZXh0PWk6ZGVsZXRlIG4ubmV4dCx0aGlzKTplPyhpP2VbaF09aTpkZWxldGUgZVtoXSwoZD1lWzBdfHxlWzFdfHxlWzJdfHxlWzNdKSYmZD09PShlWzNdfHxlWzJdfHxlWzFdfHxlWzBdKSYmIWQubGVuZ3RoJiYocj9yW2ZdPWQ6dGhpcy5fcm9vdD1kKSx0aGlzKToodGhpcy5fcm9vdD1pLHRoaXMpfSx2PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LGc9ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0aGlzLnZpc2l0KGZ1bmN0aW9uKGUpe2lmKCFlLmxlbmd0aClkb3srK3R9d2hpbGUoZT1lLm5leHQpfSksdH0seT1mdW5jdGlvbih0KXt2YXIgZSxyLG4saSxhLG8scz1bXSxsPXRoaXMuX3Jvb3Q7Zm9yKGwmJnMucHVzaChuZXcgZChsLHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7ZT1zLnBvcCgpOylpZighdChsPWUubm9kZSxuPWUueDAsaT1lLnkwLGE9ZS54MSxvPWUueTEpJiZsLmxlbmd0aCl7dmFyIHU9KG4rYSkvMixjPShpK28pLzI7KHI9bFszXSkmJnMucHVzaChuZXcgZChyLHUsYyxhLG8pKSwocj1sWzJdKSYmcy5wdXNoKG5ldyBkKHIsbixjLHUsbykpLChyPWxbMV0pJiZzLnB1c2gobmV3IGQocix1LGksYSxjKSksKHI9bFswXSkmJnMucHVzaChuZXcgZChyLG4saSx1LGMpKX1yZXR1cm4gdGhpc30sYj1mdW5jdGlvbih0KXt2YXIgZSxyPVtdLG49W107Zm9yKHRoaXMuX3Jvb3QmJnIucHVzaChuZXcgZCh0aGlzLl9yb290LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7ZT1yLnBvcCgpOyl7dmFyIGk9ZS5ub2RlO2lmKGkubGVuZ3RoKXt2YXIgYSxvPWUueDAscz1lLnkwLGw9ZS54MSx1PWUueTEsYz0obytsKS8yLGg9KHMrdSkvMjsoYT1pWzBdKSYmci5wdXNoKG5ldyBkKGEsbyxzLGMsaCkpLChhPWlbMV0pJiZyLnB1c2gobmV3IGQoYSxjLHMsbCxoKSksKGE9aVsyXSkmJnIucHVzaChuZXcgZChhLG8saCxjLHUpKSwoYT1pWzNdKSYmci5wdXNoKG5ldyBkKGEsYyxoLGwsdSkpfW4ucHVzaChlKX1mb3IoO2U9bi5wb3AoKTspdChlLm5vZGUsZS54MCxlLnkwLGUueDEsZS55MSk7cmV0dXJuIHRoaXN9LHg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxfPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95PXQsdGhpcyk6dGhpcy5feX0sdz1vLnByb3RvdHlwZT1zLnByb3RvdHlwZTt3LmNvcHk9ZnVuY3Rpb24oKXt2YXIgdCxlLHI9bmV3IHModGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxuPXRoaXMuX3Jvb3Q7aWYoIW4pcmV0dXJuIHI7aWYoIW4ubGVuZ3RoKXJldHVybiByLl9yb290PWwobikscjtmb3IodD1be3NvdXJjZTpuLHRhcmdldDpyLl9yb290PW5ldyBBcnJheSg0KX1dO249dC5wb3AoKTspZm9yKHZhciBpPTA7aTw0OysraSkoZT1uLnNvdXJjZVtpXSkmJihlLmxlbmd0aD90LnB1c2goe3NvdXJjZTplLHRhcmdldDpuLnRhcmdldFtpXT1uZXcgQXJyYXkoNCl9KTpuLnRhcmdldFtpXT1sKGUpKTtyZXR1cm4gcn0sdy5hZGQ9dSx3LmFkZEFsbD1yLHcuY292ZXI9Yyx3LmRhdGE9aCx3LmV4dGVudD1mLHcuZmluZD1wLHcucmVtb3ZlPW0sdy5yZW1vdmVBbGw9bix3LnJvb3Q9dix3LnNpemU9Zyx3LnZpc2l0PXksdy52aXNpdEFmdGVyPWIsdy54PXgsdy55PV8sdC5xdWFkdHJlZT1vLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pfSx7fV0sMTE5OltmdW5jdGlvbihlLHIsbil7IWZ1bmN0aW9uKGUsaSl7Im9iamVjdCI9PXR5cGVvZiBuJiZ2b2lkIDAhPT1yP2kobik6ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuYW1kP3QoWyJleHBvcnRzIl0saSk6aShlLmQzPWUuZDN8fHt9KX0odGhpcyxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZSgpe3JldHVybiBnfHwoeChyKSxnPWIubm93KCkreSl9ZnVuY3Rpb24gcigpe2c9MH1mdW5jdGlvbiBuKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiBpKHQsZSxyKXt2YXIgaT1uZXcgbjtyZXR1cm4gaS5yZXN0YXJ0KHQsZSxyKSxpfWZ1bmN0aW9uIGEoKXtlKCksKytmO2Zvcih2YXIgdCxyPWM7cjspKHQ9Zy1yLl90aW1lKT49MCYmci5fY2FsbC5jYWxsKG51bGwsdCkscj1yLl9uZXh0Oy0tZn1mdW5jdGlvbiBvKCl7Zz0odj1iLm5vdygpKSt5LGY9ZD0wO3RyeXthKCl9ZmluYWxseXtmPTAsbCgpLGc9MH19ZnVuY3Rpb24gcygpe3ZhciB0PWIubm93KCksZT10LXY7ZT5tJiYoeS09ZSx2PXQpfWZ1bmN0aW9uIGwoKXtmb3IodmFyIHQsZSxyPWMsbj0xLzA7cjspci5fY2FsbD8obj5yLl90aW1lJiYobj1yLl90aW1lKSx0PXIscj1yLl9uZXh0KTooZT1yLl9uZXh0LHIuX25leHQ9bnVsbCxyPXQ/dC5fbmV4dD1lOmM9ZSk7aD10LHUobil9ZnVuY3Rpb24gdSh0KXtpZighZil7ZCYmKGQ9Y2xlYXJUaW1lb3V0KGQpKTt2YXIgZT10LWc7ZT4yND8odDwxLzAmJihkPXNldFRpbWVvdXQobyxlKSkscCYmKHA9Y2xlYXJJbnRlcnZhbChwKSkpOihwfHwodj1nLHA9c2V0SW50ZXJ2YWwocyxtKSksZj0xLHgobykpfX12YXIgYyxoLGY9MCxkPTAscD0wLG09MWUzLHY9MCxnPTAseT0wLGI9Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUseD0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lP3JlcXVlc3RBbmltYXRpb25GcmFtZTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtuLnByb3RvdHlwZT1pLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bixyZXN0YXJ0OmZ1bmN0aW9uKHQscixuKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO249KG51bGw9PW4/ZSgpOituKSsobnVsbD09cj8wOityKSx0aGlzLl9uZXh0fHxoPT09dGhpc3x8KGg/aC5fbmV4dD10aGlzOmM9dGhpcyxoPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPW4sdSgpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5fY2FsbCYmKHRoaXMuX2NhbGw9bnVsbCx0aGlzLl90aW1lPTEvMCx1KCkpfX07dmFyIF89ZnVuY3Rpb24odCxlLHIpe3ZhciBpPW5ldyBuO3JldHVybiBlPW51bGw9PWU/MDorZSxpLnJlc3RhcnQoZnVuY3Rpb24ocil7aS5zdG9wKCksdChyK2UpfSxlLHIpLGl9LHc9ZnVuY3Rpb24odCxyLGkpe3ZhciBhPW5ldyBuLG89cjtyZXR1cm4gbnVsbD09cj8oYS5yZXN0YXJ0KHQscixpKSxhKToocj0rcixpPW51bGw9PWk/ZSgpOitpLGEucmVzdGFydChmdW5jdGlvbiBlKG4pe24rPW8sYS5yZXN0YXJ0KGUsbys9cixpKSx0KG4pfSxyLGkpLGEpfTt0Lm5vdz1lLHQudGltZXI9aSx0LnRpbWVyRmx1c2g9YSx0LnRpbWVvdXQ9Xyx0LmludGVydmFsPXcsT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSl9LHt9XSwxMjA6W2Z1bmN0aW9uKGUscixuKXshZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQpe3JldHVybiB0JiYodC5vd25lckRvY3VtZW50fHx0LmRvY3VtZW50fHx0KS5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gbih0KXtyZXR1cm4gdCYmKHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3KX1mdW5jdGlvbiBpKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfWZ1bmN0aW9uIGEodCl7cmV0dXJuIG51bGw9PT10P05hTjordH1mdW5jdGlvbiBvKHQpe3JldHVybiFpc05hTih0KX1mdW5jdGlvbiBzKHQpe3JldHVybntsZWZ0OmZ1bmN0aW9uKGUscixuLGkpe2Zvcihhcmd1bWVudHMubGVuZ3RoPDMmJihuPTApLGFyZ3VtZW50cy5sZW5ndGg8NCYmKGk9ZS5sZW5ndGgpO248aTspe3ZhciBhPW4raT4+PjE7dChlW2FdLHIpPDA/bj1hKzE6aT1hfXJldHVybiBufSxyaWdodDpmdW5jdGlvbihlLHIsbixpKXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYobj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJihpPWUubGVuZ3RoKTtuPGk7KXt2YXIgYT1uK2k+Pj4xO3QoZVthXSxyKT4wP2k9YTpuPWErMX1yZXR1cm4gbn19fWZ1bmN0aW9uIGwodCl7cmV0dXJuIHQubGVuZ3RofWZ1bmN0aW9uIHUodCl7Zm9yKHZhciBlPTE7dCplJTE7KWUqPTEwO3JldHVybiBlfWZ1bmN0aW9uIGModCxlKXtmb3IodmFyIHIgaW4gZSlPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUscix7dmFsdWU6ZVtyXSxlbnVtZXJhYmxlOiExfSl9ZnVuY3Rpb24gaCgpe3RoaXMuXz1PYmplY3QuY3JlYXRlKG51bGwpfWZ1bmN0aW9uIGYodCl7cmV0dXJuKHQrPSIiKT09PV9vfHx0WzBdPT09d28/d28rdDp0fWZ1bmN0aW9uIGQodCl7cmV0dXJuKHQrPSIiKVswXT09PXdvP3Quc2xpY2UoMSk6dH1mdW5jdGlvbiBwKHQpe3JldHVybiBmKHQpaW4gdGhpcy5ffWZ1bmN0aW9uIG0odCl7cmV0dXJuKHQ9Zih0KSlpbiB0aGlzLl8mJmRlbGV0ZSB0aGlzLl9bdF19ZnVuY3Rpb24gdigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzLl8pdC5wdXNoKGQoZSkpO3JldHVybiB0fWZ1bmN0aW9uIGcoKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzLl8pKyt0O3JldHVybiB0fWZ1bmN0aW9uIHkoKXtmb3IodmFyIHQgaW4gdGhpcy5fKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGIoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiB4KHQpe3JldHVybiB0fWZ1bmN0aW9uIF8odCxlLHIpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXIuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBuPT09ZT90Om59fWZ1bmN0aW9uIHcodCxlKXtpZihlIGluIHQpcmV0dXJuIGU7ZT1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSk7Zm9yKHZhciByPTAsbj1Nby5sZW5ndGg7cjxuOysrcil7dmFyIGk9TW9bcl0rZTtpZihpIGluIHQpcmV0dXJuIGl9fWZ1bmN0aW9uIE0oKXt9ZnVuY3Rpb24gaygpe31mdW5jdGlvbiBBKHQpe2Z1bmN0aW9uIGUoKXtmb3IodmFyIGUsbj1yLGk9LTEsYT1uLmxlbmd0aDsrK2k8YTspKGU9bltpXS5vbikmJmUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB0fXZhciByPVtdLG49bmV3IGg7cmV0dXJuIGUub249ZnVuY3Rpb24oZSxpKXt2YXIgYSxvPW4uZ2V0KGUpO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/byYmby5vbjoobyYmKG8ub249bnVsbCxyPXIuc2xpY2UoMCxhPXIuaW5kZXhPZihvKSkuY29uY2F0KHIuc2xpY2UoYSsxKSksbi5yZW1vdmUoZSkpLGkmJnIucHVzaChuLnNldChlLHtvbjppfSkpLHQpfSxlfWZ1bmN0aW9uIFQoKXt1by5ldmVudC5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIFMoKXtmb3IodmFyIHQsZT11by5ldmVudDt0PWUuc291cmNlRXZlbnQ7KWU9dDtyZXR1cm4gZX1mdW5jdGlvbiBFKHQpe2Zvcih2YXIgZT1uZXcgayxyPTAsbj1hcmd1bWVudHMubGVuZ3RoOysrcjxuOyllW2FyZ3VtZW50c1tyXV09QShlKTtyZXR1cm4gZS5vZj1mdW5jdGlvbihyLG4pe3JldHVybiBmdW5jdGlvbihpKXt0cnl7dmFyIGE9aS5zb3VyY2VFdmVudD11by5ldmVudDtpLnRhcmdldD10LHVvLmV2ZW50PWksZVtpLnR5cGVdLmFwcGx5KHIsbil9ZmluYWxseXt1by5ldmVudD1hfX19LGV9ZnVuY3Rpb24gTCh0KXtyZXR1cm4gQW8odCxMbyksdH1mdW5jdGlvbiBDKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZnVuY3Rpb24oKXtyZXR1cm4gVG8odCx0aGlzKX19ZnVuY3Rpb24geih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIFNvKHQsdGhpcyl9fWZ1bmN0aW9uIEkodCxlKXtmdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9ZnVuY3Rpb24gbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX1mdW5jdGlvbiBpKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX1mdW5jdGlvbiBhKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9ZnVuY3Rpb24gbygpe3ZhciByPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxyKX1mdW5jdGlvbiBzKCl7dmFyIHI9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwscil9cmV0dXJuIHQ9dW8ubnMucXVhbGlmeSh0KSxudWxsPT1lP3QubG9jYWw/bjpyOiJmdW5jdGlvbiI9PXR5cGVvZiBlP3QubG9jYWw/czpvOnQubG9jYWw/YTppfWZ1bmN0aW9uIEQodCl7cmV0dXJuIHQudHJpbSgpLnJlcGxhY2UoL1xzKy9nLCIgIil9ZnVuY3Rpb24gUCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiKD86XnxcXHMrKSIrdW8ucmVxdW90ZSh0KSsiKD86XFxzK3wkKSIsImciKX1mdW5jdGlvbiBPKHQpe3JldHVybih0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gUih0LGUpe2Z1bmN0aW9uIHIoKXtmb3IodmFyIHI9LTE7KytyPGk7KXRbcl0odGhpcyxlKX1mdW5jdGlvbiBuKCl7Zm9yKHZhciByPS0xLG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7KytyPGk7KXRbcl0odGhpcyxuKX10PU8odCkubWFwKEYpO3ZhciBpPXQubGVuZ3RoO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlP246cn1mdW5jdGlvbiBGKHQpe3ZhciBlPVAodCk7cmV0dXJuIGZ1bmN0aW9uKHIsbil7aWYoaT1yLmNsYXNzTGlzdClyZXR1cm4gbj9pLmFkZCh0KTppLnJlbW92ZSh0KTt2YXIgaT1yLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiI7bj8oZS5sYXN0SW5kZXg9MCxlLnRlc3QoaSl8fHIuc2V0QXR0cmlidXRlKCJjbGFzcyIsRChpKyIgIit0KSkpOnIuc2V0QXR0cmlidXRlKCJjbGFzcyIsRChpLnJlcGxhY2UoZSwiICIpKSl9fWZ1bmN0aW9uIGoodCxlLHIpe2Z1bmN0aW9uIG4oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfWZ1bmN0aW9uIGkoKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsZSxyKX1mdW5jdGlvbiBhKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxuLHIpfXJldHVybiBudWxsPT1lP246ImZ1bmN0aW9uIj09dHlwZW9mIGU/YTppfWZ1bmN0aW9uIE4odCxlKXtmdW5jdGlvbiByKCl7ZGVsZXRlIHRoaXNbdF19ZnVuY3Rpb24gbigpe3RoaXNbdF09ZX1mdW5jdGlvbiBpKCl7dmFyIHI9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPXJ9cmV0dXJuIG51bGw9PWU/cjoiZnVuY3Rpb24iPT10eXBlb2YgZT9pOm59ZnVuY3Rpb24gQih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50LHI9dGhpcy5uYW1lc3BhY2VVUkk7cmV0dXJuIHI9PT1DbyYmZS5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09Q28/ZS5jcmVhdGVFbGVtZW50KHQpOmUuY3JlYXRlRWxlbWVudE5TKHIsdCl9ZnVuY3Rpb24gcigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDoodD11by5ucy5xdWFsaWZ5KHQpKS5sb2NhbD9yOmV9ZnVuY3Rpb24gVSgpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIFYodCl7cmV0dXJue19fZGF0YV9fOnR9fWZ1bmN0aW9uIEgodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIEVvKHRoaXMsdCl9fWZ1bmN0aW9uIHEodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGh8fCh0PWkpLGZ1bmN0aW9uKGUscil7cmV0dXJuIGUmJnI/dChlLl9fZGF0YV9fLHIuX19kYXRhX18pOiFlLSFyfX1mdW5jdGlvbiBHKHQsZSl7Zm9yKHZhciByPTAsbj10Lmxlbmd0aDtyPG47cisrKWZvcih2YXIgaSxhPXRbcl0sbz0wLHM9YS5sZW5ndGg7bzxzO28rKykoaT1hW29dKSYmZShpLG8scik7cmV0dXJuIHR9ZnVuY3Rpb24gWSh0KXtyZXR1cm4gQW8odCxJbyksdH1mdW5jdGlvbiBYKHQpe3ZhciBlLHI7cmV0dXJuIGZ1bmN0aW9uKG4saSxhKXt2YXIgbyxzPXRbYV0udXBkYXRlLGw9cy5sZW5ndGg7Zm9yKGEhPXImJihyPWEsZT0wKSxpPj1lJiYoZT1pKzEpOyEobz1zW2VdKSYmKytlPGw7KTtyZXR1cm4gb319ZnVuY3Rpb24gVyh0LGUscil7ZnVuY3Rpb24gbigpe3ZhciBlPXRoaXNbb107ZSYmKHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LGUsZS4kKSxkZWxldGUgdGhpc1tvXSl9ZnVuY3Rpb24gaSgpe3ZhciBpPWwoZSxobyhhcmd1bWVudHMpKTtuLmNhbGwodGhpcyksdGhpcy5hZGRFdmVudExpc3RlbmVyKHQsdGhpc1tvXT1pLGkuJD1yKSxpLl89ZX1mdW5jdGlvbiBhKCl7dmFyIGUscj1uZXcgUmVnRXhwKCJeX19vbihbXi5dKykiK3VvLnJlcXVvdGUodCkrIiQiKTtmb3IodmFyIG4gaW4gdGhpcylpZihlPW4ubWF0Y2gocikpe3ZhciBpPXRoaXNbbl07dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGVbMV0saSxpLiQpLGRlbGV0ZSB0aGlzW25dfX12YXIgbz0iX19vbiIrdCxzPXQuaW5kZXhPZigiLiIpLGw9WjtzPjAmJih0PXQuc2xpY2UoMCxzKSk7dmFyIHU9RG8uZ2V0KHQpO3JldHVybiB1JiYodD11LGw9Sikscz9lP2k6bjplP006YX1mdW5jdGlvbiBaKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBuPXVvLmV2ZW50O3VvLmV2ZW50PXIsZVswXT10aGlzLl9fZGF0YV9fO3RyeXt0LmFwcGx5KHRoaXMsZSl9ZmluYWxseXt1by5ldmVudD1ufX19ZnVuY3Rpb24gSih0LGUpe3ZhciByPVoodCxlKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPXQucmVsYXRlZFRhcmdldDtuJiYobj09PWV8fDgmbi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKSl8fHIuY2FsbChlLHQpfX1mdW5jdGlvbiBLKHQpe3ZhciByPSIuZHJhZ3N1cHByZXNzLSIrICsrT28saT0iY2xpY2siK3IsYT11by5zZWxlY3Qobih0KSkub24oInRvdWNobW92ZSIrcixUKS5vbigiZHJhZ3N0YXJ0IityLFQpLm9uKCJzZWxlY3RzdGFydCIrcixUKTtpZihudWxsPT1QbyYmKFBvPSEoIm9uc2VsZWN0c3RhcnQiaW4gdCkmJncodC5zdHlsZSwidXNlclNlbGVjdCIpKSxQbyl7dmFyIG89ZSh0KS5zdHlsZSxzPW9bUG9dO29bUG9dPSJub25lIn1yZXR1cm4gZnVuY3Rpb24odCl7aWYoYS5vbihyLG51bGwpLFBvJiYob1tQb109cyksdCl7dmFyIGU9ZnVuY3Rpb24oKXthLm9uKGksbnVsbCl9O2Eub24oaSxmdW5jdGlvbigpe1QoKSxlKCl9LCEwKSxzZXRUaW1lb3V0KGUsMCl9fX1mdW5jdGlvbiBRKHQsZSl7ZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIHI9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoci5jcmVhdGVTVkdQb2ludCl7dmFyIGk9ci5jcmVhdGVTVkdQb2ludCgpO2lmKFJvPDApe3ZhciBhPW4odCk7aWYoYS5zY3JvbGxYfHxhLnNjcm9sbFkpe3I9dW8uc2VsZWN0KCJib2R5IikuYXBwZW5kKCJzdmciKS5zdHlsZSh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjoibm9uZSJ9LCJpbXBvcnRhbnQiKTt2YXIgbz1yWzBdWzBdLmdldFNjcmVlbkNUTSgpO1JvPSEoby5mfHxvLmUpLHIucmVtb3ZlKCl9fXJldHVybiBSbz8oaS54PWUucGFnZVgsaS55PWUucGFnZVkpOihpLng9ZS5jbGllbnRYLGkueT1lLmNsaWVudFkpLGk9aS5tYXRyaXhUcmFuc2Zvcm0odC5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFtpLngsaS55XX12YXIgcz10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltlLmNsaWVudFgtcy5sZWZ0LXQuY2xpZW50TGVmdCxlLmNsaWVudFktcy50b3AtdC5jbGllbnRUb3BdfWZ1bmN0aW9uICQoKXtyZXR1cm4gdW8uZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcn1mdW5jdGlvbiB0dCh0KXtyZXR1cm4gdD4wPzE6dDwwPy0xOjB9ZnVuY3Rpb24gZXQodCxlLHIpe3JldHVybihlWzBdLXRbMF0pKihyWzFdLXRbMV0pLShlWzFdLXRbMV0pKihyWzBdLXRbMF0pfWZ1bmN0aW9uIHJ0KHQpe3JldHVybiB0PjE/MDp0PC0xP05vOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBudCh0KXtyZXR1cm4gdD4xP1ZvOnQ8LTE/LVZvOk1hdGguYXNpbih0KX1mdW5jdGlvbiBpdCh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpLTEvdCkvMn1mdW5jdGlvbiBhdCh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBvdCh0KXtyZXR1cm4oKHQ9TWF0aC5leHAoMip0KSktMSkvKHQrMSl9ZnVuY3Rpb24gc3QodCl7cmV0dXJuKHQ9TWF0aC5zaW4odC8yKSkqdH1mdW5jdGlvbiBsdCgpe31mdW5jdGlvbiB1dCh0LGUscil7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiB1dD8odGhpcy5oPSt0LHRoaXMucz0rZSx2b2lkKHRoaXMubD0rcikpOmFyZ3VtZW50cy5sZW5ndGg8Mj90IGluc3RhbmNlb2YgdXQ/bmV3IHV0KHQuaCx0LnMsdC5sKTpNdCgiIit0LGt0LHV0KTpuZXcgdXQodCxlLHIpfWZ1bmN0aW9uIGN0KHQsZSxyKXtmdW5jdGlvbiBuKHQpe3JldHVybiB0PjM2MD90LT0zNjA6dDwwJiYodCs9MzYwKSx0PDYwP2ErKG8tYSkqdC82MDp0PDE4MD9vOnQ8MjQwP2ErKG8tYSkqKDI0MC10KS82MDphfWZ1bmN0aW9uIGkodCl7cmV0dXJuIE1hdGgucm91bmQoMjU1Km4odCkpfXZhciBhLG87cmV0dXJuIHQ9aXNOYU4odCk/MDoodCU9MzYwKTwwP3QrMzYwOnQsZT1pc05hTihlKT8wOmU8MD8wOmU+MT8xOmUscj1yPDA/MDpyPjE/MTpyLG89cjw9LjU/ciooMStlKTpyK2UtciplLGE9MipyLW8sbmV3IGJ0KGkodCsxMjApLGkodCksaSh0LTEyMCkpfWZ1bmN0aW9uIGh0KHQsZSxyKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGh0Pyh0aGlzLmg9K3QsdGhpcy5jPStlLHZvaWQodGhpcy5sPStyKSk6YXJndW1lbnRzLmxlbmd0aDwyP3QgaW5zdGFuY2VvZiBodD9uZXcgaHQodC5oLHQuYyx0LmwpOnQgaW5zdGFuY2VvZiBkdD9tdCh0LmwsdC5hLHQuYik6bXQoKHQ9QXQoKHQ9dW8ucmdiKHQpKS5yLHQuZyx0LmIpKS5sLHQuYSx0LmIpOm5ldyBodCh0LGUscil9ZnVuY3Rpb24gZnQodCxlLHIpe3JldHVybiBpc05hTih0KSYmKHQ9MCksaXNOYU4oZSkmJihlPTApLG5ldyBkdChyLE1hdGguY29zKHQqPUhvKSplLE1hdGguc2luKHQpKmUpfWZ1bmN0aW9uIGR0KHQsZSxyKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGR0Pyh0aGlzLmw9K3QsdGhpcy5hPStlLHZvaWQodGhpcy5iPStyKSk6YXJndW1lbnRzLmxlbmd0aDwyP3QgaW5zdGFuY2VvZiBkdD9uZXcgZHQodC5sLHQuYSx0LmIpOnQgaW5zdGFuY2VvZiBodD9mdCh0LmgsdC5jLHQubCk6QXQoKHQ9YnQodCkpLnIsdC5nLHQuYik6bmV3IGR0KHQsZSxyKX1mdW5jdGlvbiBwdCh0LGUscil7dmFyIG49KHQrMTYpLzExNixpPW4rZS81MDAsYT1uLXIvMjAwO3JldHVybiBpPXZ0KGkpKlFvLG49dnQobikqJG8sYT12dChhKSp0cyxuZXcgYnQoeXQoMy4yNDA0NTQyKmktMS41MzcxMzg1Km4tLjQ5ODUzMTQqYSkseXQoLS45NjkyNjYqaSsxLjg3NjAxMDgqbisuMDQxNTU2KmEpLHl0KC4wNTU2NDM0KmktLjIwNDAyNTkqbisxLjA1NzIyNTIqYSkpfWZ1bmN0aW9uIG10KHQsZSxyKXtyZXR1cm4gdD4wP25ldyBodChNYXRoLmF0YW4yKHIsZSkqcW8sTWF0aC5zcXJ0KGUqZStyKnIpLHQpOm5ldyBodChOYU4sTmFOLHQpfWZ1bmN0aW9uIHZ0KHQpe3JldHVybiB0Pi4yMDY4OTMwMzQ/dCp0KnQ6KHQtNC8yOSkvNy43ODcwMzd9ZnVuY3Rpb24gZ3QodCl7cmV0dXJuIHQ+LjAwODg1Nj9NYXRoLnBvdyh0LDEvMyk6Ny43ODcwMzcqdCs0LzI5fWZ1bmN0aW9uIHl0KHQpe3JldHVybiBNYXRoLnJvdW5kKDI1NSoodDw9LjAwMzA0PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSkpfWZ1bmN0aW9uIGJ0KHQsZSxyKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGJ0Pyh0aGlzLnI9fn50LHRoaXMuZz1+fmUsdm9pZCh0aGlzLmI9fn5yKSk6YXJndW1lbnRzLmxlbmd0aDwyP3QgaW5zdGFuY2VvZiBidD9uZXcgYnQodC5yLHQuZyx0LmIpOk10KCIiK3QsYnQsY3QpOm5ldyBidCh0LGUscil9ZnVuY3Rpb24geHQodCl7cmV0dXJuIG5ldyBidCh0Pj4xNix0Pj44JjI1NSwyNTUmdCl9ZnVuY3Rpb24gX3QodCl7cmV0dXJuIHh0KHQpKyIifWZ1bmN0aW9uIHd0KHQpe3JldHVybiB0PDE2PyIwIitNYXRoLm1heCgwLHQpLnRvU3RyaW5nKDE2KTpNYXRoLm1pbigyNTUsdCkudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIE10KHQsZSxyKXt2YXIgbixpLGEsbz0wLHM9MCxsPTA7aWYobj0vKFthLXpdKylcKCguKilcKS8uZXhlYyh0PXQudG9Mb3dlckNhc2UoKSkpc3dpdGNoKGk9blsyXS5zcGxpdCgiLCIpLG5bMV0pe2Nhc2UiaHNsIjpyZXR1cm4gcihwYXJzZUZsb2F0KGlbMF0pLHBhcnNlRmxvYXQoaVsxXSkvMTAwLHBhcnNlRmxvYXQoaVsyXSkvMTAwKTtjYXNlInJnYiI6cmV0dXJuIGUoU3QoaVswXSksU3QoaVsxXSksU3QoaVsyXSkpfXJldHVybihhPW5zLmdldCh0KSk/ZShhLnIsYS5nLGEuYik6KG51bGw9PXR8fCIjIiE9PXQuY2hhckF0KDApfHxpc05hTihhPXBhcnNlSW50KHQuc2xpY2UoMSksMTYpKXx8KDQ9PT10Lmxlbmd0aD8obz0oMzg0MCZhKT4+NCxvfD1vPj40LHM9MjQwJmEsc3w9cz4+NCxsPTE1JmEsbHw9bDw8NCk6Nz09PXQubGVuZ3RoJiYobz0oMTY3MTE2ODAmYSk+PjE2LHM9KDY1MjgwJmEpPj44LGw9MjU1JmEpKSxlKG8scyxsKSl9ZnVuY3Rpb24ga3QodCxlLHIpe3ZhciBuLGksYT1NYXRoLm1pbih0Lz0yNTUsZS89MjU1LHIvPTI1NSksbz1NYXRoLm1heCh0LGUscikscz1vLWEsbD0obythKS8yO3JldHVybiBzPyhpPWw8LjU/cy8obythKTpzLygyLW8tYSksbj10PT1vPyhlLXIpL3MrKGU8cj82OjApOmU9PW8/KHItdCkvcysyOih0LWUpL3MrNCxuKj02MCk6KG49TmFOLGk9bD4wJiZsPDE/MDpuKSxuZXcgdXQobixpLGwpfWZ1bmN0aW9uIEF0KHQsZSxyKXt0PVR0KHQpLGU9VHQoZSkscj1UdChyKTt2YXIgbj1ndCgoLjQxMjQ1NjQqdCsuMzU3NTc2MSplKy4xODA0Mzc1KnIpL1FvKSxpPWd0KCguMjEyNjcyOSp0Ky43MTUxNTIyKmUrLjA3MjE3NSpyKS8kbyk7cmV0dXJuIGR0KDExNippLTE2LDUwMCoobi1pKSwyMDAqKGktZ3QoKC4wMTkzMzM5KnQrLjExOTE5MiplKy45NTAzMDQxKnIpL3RzKSkpfWZ1bmN0aW9uIFR0KHQpe3JldHVybih0Lz0yNTUpPD0uMDQwNDU/dC8xMi45MjpNYXRoLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIFN0KHQpe3ZhciBlPXBhcnNlRmxvYXQodCk7cmV0dXJuIiUiPT09dC5jaGFyQXQodC5sZW5ndGgtMSk/TWF0aC5yb3VuZCgyLjU1KmUpOmV9ZnVuY3Rpb24gRXQodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBMdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxyLG4pe3JldHVybiAyPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIHImJihuPXIscj1udWxsKSxDdChlLHIsdCxuKX19ZnVuY3Rpb24gQ3QodCxlLHIsbil7ZnVuY3Rpb24gaSgpe3ZhciB0LGU9bC5zdGF0dXM7aWYoIWUmJkl0KGwpfHxlPj0yMDAmJmU8MzAwfHwzMDQ9PT1lKXt0cnl7dD1yLmNhbGwoYSxsKQp9Y2F0Y2godCl7cmV0dXJuIHZvaWQgby5lcnJvci5jYWxsKGEsdCl9by5sb2FkLmNhbGwoYSx0KX1lbHNlIG8uZXJyb3IuY2FsbChhLGwpfXZhciBhPXt9LG89dW8uZGlzcGF0Y2goImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLHM9e30sbD1uZXcgWE1MSHR0cFJlcXVlc3QsdT1udWxsO3JldHVybiF0aGlzLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGx8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3QodCl8fChsPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBsP2wub25sb2FkPWwub25lcnJvcj1pOmwub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7bC5yZWFkeVN0YXRlPjMmJmkoKX0sbC5vbnByb2dyZXNzPWZ1bmN0aW9uKHQpe3ZhciBlPXVvLmV2ZW50O3VvLmV2ZW50PXQ7dHJ5e28ucHJvZ3Jlc3MuY2FsbChhLGwpfWZpbmFsbHl7dW8uZXZlbnQ9ZX19LGEuaGVhZGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9KHQrIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP3NbdF06KG51bGw9PWU/ZGVsZXRlIHNbdF06c1t0XT1lKyIiLGEpfSxhLm1pbWVUeXBlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/bnVsbDp0KyIiLGEpOmV9LGEucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsYSk6dX0sYS5yZXNwb25zZT1mdW5jdGlvbih0KXtyZXR1cm4gcj10LGF9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24odCl7YVt0XT1mdW5jdGlvbigpe3JldHVybiBhLnNlbmQuYXBwbHkoYSxbdF0uY29uY2F0KGhvKGFyZ3VtZW50cykpKX19KSxhLnNlbmQ9ZnVuY3Rpb24ocixuLGkpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmKGk9bixuPW51bGwpLGwub3BlbihyLHQsITApLG51bGw9PWV8fCJhY2NlcHQiaW4gc3x8KHMuYWNjZXB0PWUrIiwqLyoiKSxsLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBjIGluIHMpbC5zZXRSZXF1ZXN0SGVhZGVyKGMsc1tjXSk7cmV0dXJuIG51bGwhPWUmJmwub3ZlcnJpZGVNaW1lVHlwZSYmbC5vdmVycmlkZU1pbWVUeXBlKGUpLG51bGwhPXUmJihsLnJlc3BvbnNlVHlwZT11KSxudWxsIT1pJiZhLm9uKCJlcnJvciIsaSkub24oImxvYWQiLGZ1bmN0aW9uKHQpe2kobnVsbCx0KX0pLG8uYmVmb3Jlc2VuZC5jYWxsKGEsbCksbC5zZW5kKG51bGw9PW4/bnVsbDpuKSxhfSxhLmFib3J0PWZ1bmN0aW9uKCl7cmV0dXJuIGwuYWJvcnQoKSxhfSx1by5yZWJpbmQoYSxvLCJvbiIpLG51bGw9PW4/YTphLmdldCh6dChuKSl9ZnVuY3Rpb24genQodCl7cmV0dXJuIDE9PT10Lmxlbmd0aD9mdW5jdGlvbihlLHIpe3QobnVsbD09ZT9yOm51bGwpfTp0fWZ1bmN0aW9uIEl0KHQpe3ZhciBlPXQucmVzcG9uc2VUeXBlO3JldHVybiBlJiYidGV4dCIhPT1lP3QucmVzcG9uc2U6dC5yZXNwb25zZVRleHR9ZnVuY3Rpb24gRHQodCxlLHIpe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg7bjwyJiYoZT0wKSxuPDMmJihyPURhdGUubm93KCkpO3ZhciBpPXIrZSxhPXtjOnQsdDppLG46bnVsbH07cmV0dXJuIGFzP2FzLm49YTppcz1hLGFzPWEsb3N8fChzcz1jbGVhclRpbWVvdXQoc3MpLG9zPTEsbHMoUHQpKSxhfWZ1bmN0aW9uIFB0KCl7dmFyIHQ9T3QoKSxlPVJ0KCktdDtlPjI0Pyhpc0Zpbml0ZShlKSYmKGNsZWFyVGltZW91dChzcyksc3M9c2V0VGltZW91dChQdCxlKSksb3M9MCk6KG9zPTEsbHMoUHQpKX1mdW5jdGlvbiBPdCgpe2Zvcih2YXIgdD1EYXRlLm5vdygpLGU9aXM7ZTspdD49ZS50JiZlLmModC1lLnQpJiYoZS5jPW51bGwpLGU9ZS5uO3JldHVybiB0fWZ1bmN0aW9uIFJ0KCl7Zm9yKHZhciB0LGU9aXMscj0xLzA7ZTspZS5jPyhlLnQ8ciYmKHI9ZS50KSxlPSh0PWUpLm4pOmU9dD90Lm49ZS5uOmlzPWUubjtyZXR1cm4gYXM9dCxyfWZ1bmN0aW9uIEZ0KHQsZSl7cmV0dXJuIGUtKHQ/TWF0aC5jZWlsKE1hdGgubG9nKHQpL01hdGguTE4xMCk6MSl9ZnVuY3Rpb24ganQodCxlKXt2YXIgcj1NYXRoLnBvdygxMCwzKnhvKDgtZSkpO3JldHVybntzY2FsZTplPjg/ZnVuY3Rpb24odCl7cmV0dXJuIHQvcn06ZnVuY3Rpb24odCl7cmV0dXJuIHQqcn0sc3ltYm9sOnR9fWZ1bmN0aW9uIE50KHQpe3ZhciBlPXQuZGVjaW1hbCxyPXQudGhvdXNhbmRzLG49dC5ncm91cGluZyxpPXQuY3VycmVuY3ksYT1uJiZyP2Z1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXQubGVuZ3RoLGE9W10sbz0wLHM9blswXSxsPTA7aT4wJiZzPjAmJihsK3MrMT5lJiYocz1NYXRoLm1heCgxLGUtbCkpLGEucHVzaCh0LnN1YnN0cmluZyhpLT1zLGkrcykpLCEoKGwrPXMrMSk+ZSkpOylzPW5bbz0obysxKSVuLmxlbmd0aF07cmV0dXJuIGEucmV2ZXJzZSgpLmpvaW4ocil9Ong7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPWNzLmV4ZWModCksbj1yWzFdfHwiICIsbz1yWzJdfHwiPiIscz1yWzNdfHwiLSIsbD1yWzRdfHwiIix1PXJbNV0sYz0rcls2XSxoPXJbN10sZj1yWzhdLGQ9cls5XSxwPTEsbT0iIix2PSIiLGc9ITEseT0hMDtzd2l0Y2goZiYmKGY9K2Yuc3Vic3RyaW5nKDEpKSwodXx8IjAiPT09biYmIj0iPT09bykmJih1PW49IjAiLG89Ij0iKSxkKXtjYXNlIm4iOmg9ITAsZD0iZyI7YnJlYWs7Y2FzZSIlIjpwPTEwMCx2PSIlIixkPSJmIjticmVhaztjYXNlInAiOnA9MTAwLHY9IiUiLGQ9InIiO2JyZWFrO2Nhc2UiYiI6Y2FzZSJvIjpjYXNlIngiOmNhc2UiWCI6IiMiPT09bCYmKG09IjAiK2QudG9Mb3dlckNhc2UoKSk7Y2FzZSJjIjp5PSExO2Nhc2UiZCI6Zz0hMCxmPTA7YnJlYWs7Y2FzZSJzIjpwPS0xLGQ9InIifSIkIj09PWwmJihtPWlbMF0sdj1pWzFdKSwiciIhPWR8fGZ8fChkPSJnIiksbnVsbCE9ZiYmKCJnIj09ZD9mPU1hdGgubWF4KDEsTWF0aC5taW4oMjEsZikpOiJlIiE9ZCYmImYiIT1kfHwoZj1NYXRoLm1heCgwLE1hdGgubWluKDIwLGYpKSkpLGQ9aHMuZ2V0KGQpfHxCdDt2YXIgYj11JiZoO3JldHVybiBmdW5jdGlvbih0KXt2YXIgcj12O2lmKGcmJnQlMSlyZXR1cm4iIjt2YXIgaT10PDB8fDA9PT10JiYxL3Q8MD8odD0tdCwiLSIpOiItIj09PXM/IiI6cztpZihwPDApe3ZhciBsPXVvLmZvcm1hdFByZWZpeCh0LGYpO3Q9bC5zY2FsZSh0KSxyPWwuc3ltYm9sK3Z9ZWxzZSB0Kj1wO3Q9ZCh0LGYpO3ZhciB4LF8sdz10Lmxhc3RJbmRleE9mKCIuIik7aWYodzwwKXt2YXIgTT15P3QubGFzdEluZGV4T2YoImUiKTotMTtNPDA/KHg9dCxfPSIiKTooeD10LnN1YnN0cmluZygwLE0pLF89dC5zdWJzdHJpbmcoTSkpfWVsc2UgeD10LnN1YnN0cmluZygwLHcpLF89ZSt0LnN1YnN0cmluZyh3KzEpOyF1JiZoJiYoeD1hKHgsMS8wKSk7dmFyIGs9bS5sZW5ndGgreC5sZW5ndGgrXy5sZW5ndGgrKGI/MDppLmxlbmd0aCksQT1rPGM/bmV3IEFycmF5KGs9Yy1rKzEpLmpvaW4obik6IiI7cmV0dXJuIGImJih4PWEoQSt4LEEubGVuZ3RoP2MtXy5sZW5ndGg6MS8wKSksaSs9bSx0PXgrXywoIjwiPT09bz9pK3QrQToiPiI9PT1vP0EraSt0OiJeIj09PW8/QS5zdWJzdHJpbmcoMCxrPj49MSkraSt0K0Euc3Vic3RyaW5nKGspOmkrKGI/dDpBK3QpKStyfX19ZnVuY3Rpb24gQnQodCl7cmV0dXJuIHQrIiJ9ZnVuY3Rpb24gVXQoKXt0aGlzLl89bmV3IERhdGUoYXJndW1lbnRzLmxlbmd0aD4xP0RhdGUuVVRDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHNbMF0pfWZ1bmN0aW9uIFZ0KHQsZSxyKXtmdW5jdGlvbiBuKGUpe3ZhciByPXQoZSksbj1hKHIsMSk7cmV0dXJuIGUtcjxuLWU/cjpufWZ1bmN0aW9uIGkocil7cmV0dXJuIGUocj10KG5ldyBkcyhyLTEpKSwxKSxyfWZ1bmN0aW9uIGEodCxyKXtyZXR1cm4gZSh0PW5ldyBkcygrdCksciksdH1mdW5jdGlvbiBvKHQsbixhKXt2YXIgbz1pKHQpLHM9W107aWYoYT4xKWZvcig7bzxuOylyKG8pJWF8fHMucHVzaChuZXcgRGF0ZSgrbykpLGUobywxKTtlbHNlIGZvcig7bzxuOylzLnB1c2gobmV3IERhdGUoK28pKSxlKG8sMSk7cmV0dXJuIHN9ZnVuY3Rpb24gcyh0LGUscil7dHJ5e2RzPVV0O3ZhciBuPW5ldyBVdDtyZXR1cm4gbi5fPXQsbyhuLGUscil9ZmluYWxseXtkcz1EYXRlfX10LmZsb29yPXQsdC5yb3VuZD1uLHQuY2VpbD1pLHQub2Zmc2V0PWEsdC5yYW5nZT1vO3ZhciBsPXQudXRjPUh0KHQpO3JldHVybiBsLmZsb29yPWwsbC5yb3VuZD1IdChuKSxsLmNlaWw9SHQoaSksbC5vZmZzZXQ9SHQoYSksbC5yYW5nZT1zLHR9ZnVuY3Rpb24gSHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUscil7dHJ5e2RzPVV0O3ZhciBuPW5ldyBVdDtyZXR1cm4gbi5fPWUsdChuLHIpLl99ZmluYWxseXtkcz1EYXRlfX19ZnVuY3Rpb24gcXQodCl7ZnVuY3Rpb24gZSh0KXtmdW5jdGlvbiBlKGUpe2Zvcih2YXIgcixpLGEsbz1bXSxzPS0xLGw9MDsrK3M8bjspMzc9PT10LmNoYXJDb2RlQXQocykmJihvLnB1c2godC5zbGljZShsLHMpKSxudWxsIT0oaT1tc1tyPXQuY2hhckF0KCsrcyldKSYmKHI9dC5jaGFyQXQoKytzKSksKGE9RVtyXSkmJihyPWEoZSxudWxsPT1pPyJlIj09PXI/IiAiOiIwIjppKSksby5wdXNoKHIpLGw9cysxKTtyZXR1cm4gby5wdXNoKHQuc2xpY2UobCxzKSksby5qb2luKCIiKX12YXIgbj10Lmxlbmd0aDtyZXR1cm4gZS5wYXJzZT1mdW5jdGlvbihlKXt2YXIgbj17eToxOTAwLG06MCxkOjEsSDowLE06MCxTOjAsTDowLFo6bnVsbH07aWYocihuLHQsZSwwKSE9ZS5sZW5ndGgpcmV0dXJuIG51bGw7InAiaW4gbiYmKG4uSD1uLkglMTIrMTIqbi5wKTt2YXIgaT1udWxsIT1uLlomJmRzIT09VXQsYT1uZXcoaT9VdDpkcyk7cmV0dXJuImoiaW4gbj9hLnNldEZ1bGxZZWFyKG4ueSwwLG4uaik6IlciaW4gbnx8IlUiaW4gbj8oInciaW4gbnx8KG4udz0iVyJpbiBuPzE6MCksYS5zZXRGdWxsWWVhcihuLnksMCwxKSxhLnNldEZ1bGxZZWFyKG4ueSwwLCJXImluIG4/KG4udys2KSU3Kzcqbi5XLShhLmdldERheSgpKzUpJTc6bi53Kzcqbi5VLShhLmdldERheSgpKzYpJTcpKTphLnNldEZ1bGxZZWFyKG4ueSxuLm0sbi5kKSxhLnNldEhvdXJzKG4uSCsobi5aLzEwMHwwKSxuLk0rbi5aJTEwMCxuLlMsbi5MKSxpP2EuXzphfSxlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9ZnVuY3Rpb24gcih0LGUscixuKXtmb3IodmFyIGksYSxvLHM9MCxsPWUubGVuZ3RoLHU9ci5sZW5ndGg7czxsOyl7aWYobj49dSlyZXR1cm4tMTtpZigzNz09PShpPWUuY2hhckNvZGVBdChzKyspKSl7aWYobz1lLmNoYXJBdChzKyspLCEoYT1MW28gaW4gbXM/ZS5jaGFyQXQocysrKTpvXSl8fChuPWEodCxyLG4pKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ci5jaGFyQ29kZUF0KG4rKykpcmV0dXJuLTF9cmV0dXJuIG59ZnVuY3Rpb24gbih0LGUscil7dy5sYXN0SW5kZXg9MDt2YXIgbj13LmV4ZWMoZS5zbGljZShyKSk7cmV0dXJuIG4/KHQudz1NLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGkodCxlLHIpe3gubGFzdEluZGV4PTA7dmFyIG49eC5leGVjKGUuc2xpY2UocikpO3JldHVybiBuPyh0Lnc9Xy5nZXQoblswXS50b0xvd2VyQ2FzZSgpKSxyK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBhKHQsZSxyKXtULmxhc3RJbmRleD0wO3ZhciBuPVQuZXhlYyhlLnNsaWNlKHIpKTtyZXR1cm4gbj8odC5tPVMuZ2V0KG5bMF0udG9Mb3dlckNhc2UoKSkscituWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbyh0LGUscil7ay5sYXN0SW5kZXg9MDt2YXIgbj1rLmV4ZWMoZS5zbGljZShyKSk7cmV0dXJuIG4/KHQubT1BLmdldChuWzBdLnRvTG93ZXJDYXNlKCkpLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHModCxlLG4pe3JldHVybiByKHQsRS5jLnRvU3RyaW5nKCksZSxuKX1mdW5jdGlvbiBsKHQsZSxuKXtyZXR1cm4gcih0LEUueC50b1N0cmluZygpLGUsbil9ZnVuY3Rpb24gdSh0LGUsbil7cmV0dXJuIHIodCxFLlgudG9TdHJpbmcoKSxlLG4pfWZ1bmN0aW9uIGModCxlLHIpe3ZhciBuPWIuZ2V0KGUuc2xpY2UocixyKz0yKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbnVsbD09bj8tMToodC5wPW4scil9dmFyIGg9dC5kYXRlVGltZSxmPXQuZGF0ZSxkPXQudGltZSxwPXQucGVyaW9kcyxtPXQuZGF5cyx2PXQuc2hvcnREYXlzLGc9dC5tb250aHMseT10LnNob3J0TW9udGhzO2UudXRjPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIodCl7dHJ5e2RzPVV0O3ZhciBlPW5ldyBkcztyZXR1cm4gZS5fPXQsbihlKX1maW5hbGx5e2RzPURhdGV9fXZhciBuPWUodCk7cmV0dXJuIHIucGFyc2U9ZnVuY3Rpb24odCl7dHJ5e2RzPVV0O3ZhciBlPW4ucGFyc2UodCk7cmV0dXJuIGUmJmUuX31maW5hbGx5e2RzPURhdGV9fSxyLnRvU3RyaW5nPW4udG9TdHJpbmcscn0sZS5tdWx0aT1lLnV0Yy5tdWx0aT1jZTt2YXIgYj11by5tYXAoKSx4PVl0KG0pLF89WHQobSksdz1ZdCh2KSxNPVh0KHYpLGs9WXQoZyksQT1YdChnKSxUPVl0KHkpLFM9WHQoeSk7cC5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7Yi5zZXQodC50b0xvd2VyQ2FzZSgpLGUpfSk7dmFyIEU9e2E6ZnVuY3Rpb24odCl7cmV0dXJuIHZbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24odCl7cmV0dXJuIG1bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24odCl7cmV0dXJuIHlbdC5nZXRNb250aCgpXX0sQjpmdW5jdGlvbih0KXtyZXR1cm4gZ1t0LmdldE1vbnRoKCldfSxjOmUoaCksZDpmdW5jdGlvbih0LGUpe3JldHVybiBHdCh0LmdldERhdGUoKSxlLDIpfSxlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHQuZ2V0RGF0ZSgpLGUsMil9LEg6ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QodC5nZXRIb3VycygpLGUsMil9LEk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QodC5nZXRIb3VycygpJTEyfHwxMixlLDIpfSxqOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KDErZnMuZGF5T2ZZZWFyKHQpLGUsMyl9LEw6ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QodC5nZXRNaWxsaXNlY29uZHMoKSxlLDMpfSxtOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHQuZ2V0TW9udGgoKSsxLGUsMil9LE06ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QodC5nZXRNaW51dGVzKCksZSwyKX0scDpmdW5jdGlvbih0KXtyZXR1cm4gcFsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUzpmdW5jdGlvbih0LGUpe3JldHVybiBHdCh0LmdldFNlY29uZHMoKSxlLDIpfSxVOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KGZzLnN1bmRheU9mWWVhcih0KSxlLDIpfSx3OmZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERheSgpfSxXOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KGZzLm1vbmRheU9mWWVhcih0KSxlLDIpfSx4OmUoZiksWDplKGQpLHk6ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3QodC5nZXRGdWxsWWVhcigpJTEwMCxlLDIpfSxZOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd0KHQuZ2V0RnVsbFllYXIoKSUxZTQsZSw0KX0sWjpsZSwiJSI6ZnVuY3Rpb24oKXtyZXR1cm4iJSJ9fSxMPXthOm4sQTppLGI6YSxCOm8sYzpzLGQ6cmUsZTpyZSxIOmllLEk6aWUsajpuZSxMOnNlLG06ZWUsTTphZSxwOmMsUzpvZSxVOlp0LHc6V3QsVzpKdCx4OmwsWDp1LHk6UXQsWTpLdCxaOiR0LCIlIjp1ZX07cmV0dXJuIGV9ZnVuY3Rpb24gR3QodCxlLHIpe3ZhciBuPXQ8MD8iLSI6IiIsaT0obj8tdDp0KSsiIixhPWkubGVuZ3RoO3JldHVybiBuKyhhPHI/bmV3IEFycmF5KHItYSsxKS5qb2luKGUpK2k6aSl9ZnVuY3Rpb24gWXQodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKHVvLnJlcXVvdGUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBYdCh0KXtmb3IodmFyIGU9bmV3IGgscj0tMSxuPXQubGVuZ3RoOysrcjxuOyllLnNldCh0W3JdLnRvTG93ZXJDYXNlKCkscik7cmV0dXJuIGV9ZnVuY3Rpb24gV3QodCxlLHIpe3ZzLmxhc3RJbmRleD0wO3ZhciBuPXZzLmV4ZWMoZS5zbGljZShyLHIrMSkpO3JldHVybiBuPyh0Lnc9K25bMF0scituWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWnQodCxlLHIpe3ZzLmxhc3RJbmRleD0wO3ZhciBuPXZzLmV4ZWMoZS5zbGljZShyKSk7cmV0dXJuIG4/KHQuVT0rblswXSxyK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKdCh0LGUscil7dnMubGFzdEluZGV4PTA7dmFyIG49dnMuZXhlYyhlLnNsaWNlKHIpKTtyZXR1cm4gbj8odC5XPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEt0KHQsZSxyKXt2cy5sYXN0SW5kZXg9MDt2YXIgbj12cy5leGVjKGUuc2xpY2UocixyKzQpKTtyZXR1cm4gbj8odC55PStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFF0KHQsZSxyKXt2cy5sYXN0SW5kZXg9MDt2YXIgbj12cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC55PXRlKCtuWzBdKSxyK25bMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiAkdCh0LGUscil7cmV0dXJuL15bKy1dXGR7NH0kLy50ZXN0KGU9ZS5zbGljZShyLHIrNSkpPyh0Llo9LWUscis1KTotMX1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4gdCsodD42OD8xOTAwOjJlMyl9ZnVuY3Rpb24gZWUodCxlLHIpe3ZzLmxhc3RJbmRleD0wO3ZhciBuPXZzLmV4ZWMoZS5zbGljZShyLHIrMikpO3JldHVybiBuPyh0Lm09blswXS0xLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJlKHQsZSxyKXt2cy5sYXN0SW5kZXg9MDt2YXIgbj12cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5kPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5lKHQsZSxyKXt2cy5sYXN0SW5kZXg9MDt2YXIgbj12cy5leGVjKGUuc2xpY2UocixyKzMpKTtyZXR1cm4gbj8odC5qPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGllKHQsZSxyKXt2cy5sYXN0SW5kZXg9MDt2YXIgbj12cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5IPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFlKHQsZSxyKXt2cy5sYXN0SW5kZXg9MDt2YXIgbj12cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5NPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9lKHQsZSxyKXt2cy5sYXN0SW5kZXg9MDt2YXIgbj12cy5leGVjKGUuc2xpY2UocixyKzIpKTtyZXR1cm4gbj8odC5TPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNlKHQsZSxyKXt2cy5sYXN0SW5kZXg9MDt2YXIgbj12cy5leGVjKGUuc2xpY2UocixyKzMpKTtyZXR1cm4gbj8odC5MPStuWzBdLHIrblswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxlKHQpe3ZhciBlPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSxyPWU+MD8iLSI6IisiLG49eG8oZSkvNjB8MCxpPXhvKGUpJTYwO3JldHVybiByK0d0KG4sIjAiLDIpK0d0KGksIjAiLDIpfWZ1bmN0aW9uIHVlKHQsZSxyKXtncy5sYXN0SW5kZXg9MDt2YXIgbj1ncy5leGVjKGUuc2xpY2UocixyKzEpKTtyZXR1cm4gbj9yK25bMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGNlKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxyPS0xOysrcjxlOyl0W3JdWzBdPXRoaXModFtyXVswXSk7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgcj0wLG49dFtyXTshblsxXShlKTspbj10Wysrcl07cmV0dXJuIG5bMF0oZSl9fWZ1bmN0aW9uIGhlKCl7fWZ1bmN0aW9uIGZlKHQsZSxyKXt2YXIgbj1yLnM9dCtlLGk9bi10LGE9bi1pO3IudD10LWErKGUtaSl9ZnVuY3Rpb24gZGUodCxlKXt0JiZfcy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpJiZfc1t0LnR5cGVdKHQsZSl9ZnVuY3Rpb24gcGUodCxlLHIpe3ZhciBuLGk9LTEsYT10Lmxlbmd0aC1yO2ZvcihlLmxpbmVTdGFydCgpOysraTxhOyluPXRbaV0sZS5wb2ludChuWzBdLG5bMV0sblsyXSk7ZS5saW5lRW5kKCl9ZnVuY3Rpb24gbWUodCxlKXt2YXIgcj0tMSxuPXQubGVuZ3RoO2ZvcihlLnBvbHlnb25TdGFydCgpOysrcjxuOylwZSh0W3JdLGUsMSk7ZS5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24gdmUoKXtmdW5jdGlvbiB0KHQsZSl7dCo9SG8sZT1lKkhvLzIrTm8vNDt2YXIgcj10LW4sbz1yPj0wPzE6LTEscz1vKnIsbD1NYXRoLmNvcyhlKSx1PU1hdGguc2luKGUpLGM9YSp1LGg9aSpsK2MqTWF0aC5jb3MocyksZj1jKm8qTWF0aC5zaW4ocyk7TXMuYWRkKE1hdGguYXRhbjIoZixoKSksbj10LGk9bCxhPXV9dmFyIGUscixuLGksYTtrcy5wb2ludD1mdW5jdGlvbihvLHMpe2tzLnBvaW50PXQsbj0oZT1vKSpIbyxpPU1hdGguY29zKHM9KHI9cykqSG8vMitOby80KSxhPU1hdGguc2luKHMpfSxrcy5saW5lRW5kPWZ1bmN0aW9uKCl7dChlLHIpfX1mdW5jdGlvbiBnZSh0KXt2YXIgZT10WzBdLHI9dFsxXSxuPU1hdGguY29zKHIpO3JldHVybltuKk1hdGguY29zKGUpLG4qTWF0aC5zaW4oZSksTWF0aC5zaW4ocildfWZ1bmN0aW9uIHllKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV0rdFsyXSplWzJdfWZ1bmN0aW9uIGJlKHQsZSl7cmV0dXJuW3RbMV0qZVsyXS10WzJdKmVbMV0sdFsyXSplWzBdLXRbMF0qZVsyXSx0WzBdKmVbMV0tdFsxXSplWzBdXX1mdW5jdGlvbiB4ZSh0LGUpe3RbMF0rPWVbMF0sdFsxXSs9ZVsxXSx0WzJdKz1lWzJdfWZ1bmN0aW9uIF9lKHQsZSl7cmV0dXJuW3RbMF0qZSx0WzFdKmUsdFsyXSplXX1mdW5jdGlvbiB3ZSh0KXt2YXIgZT1NYXRoLnNxcnQodFswXSp0WzBdK3RbMV0qdFsxXSt0WzJdKnRbMl0pO3RbMF0vPWUsdFsxXS89ZSx0WzJdLz1lfWZ1bmN0aW9uIE1lKHQpe3JldHVybltNYXRoLmF0YW4yKHRbMV0sdFswXSksbnQodFsyXSldfWZ1bmN0aW9uIGtlKHQsZSl7cmV0dXJuIHhvKHRbMF0tZVswXSk8Rm8mJnhvKHRbMV0tZVsxXSk8Rm99ZnVuY3Rpb24gQWUodCxlKXt0Kj1Ibzt2YXIgcj1NYXRoLmNvcyhlKj1Ibyk7VGUocipNYXRoLmNvcyh0KSxyKk1hdGguc2luKHQpLE1hdGguc2luKGUpKX1mdW5jdGlvbiBUZSh0LGUscil7KytBcyxTcys9KHQtU3MpL0FzLEVzKz0oZS1FcykvQXMsTHMrPShyLUxzKS9Bc31mdW5jdGlvbiBTZSgpe2Z1bmN0aW9uIHQodCxpKXt0Kj1Ibzt2YXIgYT1NYXRoLmNvcyhpKj1Ibyksbz1hKk1hdGguY29zKHQpLHM9YSpNYXRoLnNpbih0KSxsPU1hdGguc2luKGkpLHU9TWF0aC5hdGFuMihNYXRoLnNxcnQoKHU9cipsLW4qcykqdSsodT1uKm8tZSpsKSp1Kyh1PWUqcy1yKm8pKnUpLGUqbytyKnMrbipsKTtUcys9dSxDcys9dSooZSsoZT1vKSksenMrPXUqKHIrKHI9cykpLElzKz11KihuKyhuPWwpKSxUZShlLHIsbil9dmFyIGUscixuO1JzLnBvaW50PWZ1bmN0aW9uKGksYSl7aSo9SG87dmFyIG89TWF0aC5jb3MoYSo9SG8pO2U9bypNYXRoLmNvcyhpKSxyPW8qTWF0aC5zaW4oaSksbj1NYXRoLnNpbihhKSxScy5wb2ludD10LFRlKGUscixuKX19ZnVuY3Rpb24gRWUoKXtScy5wb2ludD1BZX1mdW5jdGlvbiBMZSgpe2Z1bmN0aW9uIHQodCxlKXt0Kj1Ibzt2YXIgcj1NYXRoLmNvcyhlKj1Ibyksbz1yKk1hdGguY29zKHQpLHM9cipNYXRoLnNpbih0KSxsPU1hdGguc2luKGUpLHU9aSpsLWEqcyxjPWEqby1uKmwsaD1uKnMtaSpvLGY9TWF0aC5zcXJ0KHUqdStjKmMraCpoKSxkPW4qbytpKnMrYSpsLHA9ZiYmLXJ0KGQpL2YsbT1NYXRoLmF0YW4yKGYsZCk7RHMrPXAqdSxQcys9cCpjLE9zKz1wKmgsVHMrPW0sQ3MrPW0qKG4rKG49bykpLHpzKz1tKihpKyhpPXMpKSxJcys9bSooYSsoYT1sKSksVGUobixpLGEpfXZhciBlLHIsbixpLGE7UnMucG9pbnQ9ZnVuY3Rpb24obyxzKXtlPW8scj1zLFJzLnBvaW50PXQsbyo9SG87dmFyIGw9TWF0aC5jb3Mocyo9SG8pO249bCpNYXRoLmNvcyhvKSxpPWwqTWF0aC5zaW4obyksYT1NYXRoLnNpbihzKSxUZShuLGksYSl9LFJzLmxpbmVFbmQ9ZnVuY3Rpb24oKXt0KGUsciksUnMubGluZUVuZD1FZSxScy5wb2ludD1BZX19ZnVuY3Rpb24gQ2UodCxlKXtmdW5jdGlvbiByKHIsbil7cmV0dXJuIHI9dChyLG4pLGUoclswXSxyWzFdKX1yZXR1cm4gdC5pbnZlcnQmJmUuaW52ZXJ0JiYoci5pbnZlcnQ9ZnVuY3Rpb24ocixuKXtyZXR1cm4ocj1lLmludmVydChyLG4pKSYmdC5pbnZlcnQoclswXSxyWzFdKX0pLHJ9ZnVuY3Rpb24gemUoKXtyZXR1cm4hMH1mdW5jdGlvbiBJZSh0LGUscixuLGkpe3ZhciBhPVtdLG89W107aWYodC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKCEoKGU9dC5sZW5ndGgtMSk8PTApKXt2YXIgZSxyPXRbMF0sbj10W2VdO2lmKGtlKHIsbikpe2kubGluZVN0YXJ0KCk7Zm9yKHZhciBzPTA7czxlOysrcylpLnBvaW50KChyPXRbc10pWzBdLHJbMV0pO3JldHVybiB2b2lkIGkubGluZUVuZCgpfXZhciBsPW5ldyBQZShyLHQsbnVsbCwhMCksdT1uZXcgUGUocixudWxsLGwsITEpO2wubz11LGEucHVzaChsKSxvLnB1c2godSksbD1uZXcgUGUobix0LG51bGwsITEpLHU9bmV3IFBlKG4sbnVsbCxsLCEwKSxsLm89dSxhLnB1c2gobCksby5wdXNoKHUpfX0pLG8uc29ydChlKSxEZShhKSxEZShvKSxhLmxlbmd0aCl7Zm9yKHZhciBzPTAsbD1yLHU9by5sZW5ndGg7czx1OysrcylvW3NdLmU9bD0hbDtmb3IodmFyIGMsaCxmPWFbMF07Oyl7Zm9yKHZhciBkPWYscD0hMDtkLnY7KWlmKChkPWQubik9PT1mKXJldHVybjtjPWQueixpLmxpbmVTdGFydCgpO2Rve2lmKGQudj1kLm8udj0hMCxkLmUpe2lmKHApZm9yKHZhciBzPTAsdT1jLmxlbmd0aDtzPHU7KytzKWkucG9pbnQoKGg9Y1tzXSlbMF0saFsxXSk7ZWxzZSBuKGQueCxkLm4ueCwxLGkpO2Q9ZC5ufWVsc2V7aWYocCl7Yz1kLnAuejtmb3IodmFyIHM9Yy5sZW5ndGgtMTtzPj0wOy0tcylpLnBvaW50KChoPWNbc10pWzBdLGhbMV0pfWVsc2UgbihkLngsZC5wLngsLTEsaSk7ZD1kLnB9ZD1kLm8sYz1kLnoscD0hcH13aGlsZSghZC52KTtpLmxpbmVFbmQoKX19fWZ1bmN0aW9uIERlKHQpe2lmKGU9dC5sZW5ndGgpe2Zvcih2YXIgZSxyLG49MCxpPXRbMF07KytuPGU7KWkubj1yPXRbbl0sci5wPWksaT1yO2kubj1yPXRbMF0sci5wPWl9fWZ1bmN0aW9uIFBlKHQsZSxyLG4pe3RoaXMueD10LHRoaXMuej1lLHRoaXMubz1yLHRoaXMuZT1uLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gT2UodCxlLHIsbil7cmV0dXJuIGZ1bmN0aW9uKGksYSl7ZnVuY3Rpb24gbyhlLHIpe3ZhciBuPWkoZSxyKTt0KGU9blswXSxyPW5bMV0pJiZhLnBvaW50KGUscil9ZnVuY3Rpb24gcyh0LGUpe3ZhciByPWkodCxlKTt2LnBvaW50KHJbMF0sclsxXSl9ZnVuY3Rpb24gbCgpe3kucG9pbnQ9cyx2LmxpbmVTdGFydCgpfWZ1bmN0aW9uIHUoKXt5LnBvaW50PW8sdi5saW5lRW5kKCl9ZnVuY3Rpb24gYyh0LGUpe20ucHVzaChbdCxlXSk7dmFyIHI9aSh0LGUpO3gucG9pbnQoclswXSxyWzFdKX1mdW5jdGlvbiBoKCl7eC5saW5lU3RhcnQoKSxtPVtdfWZ1bmN0aW9uIGYoKXtjKG1bMF1bMF0sbVswXVsxXSkseC5saW5lRW5kKCk7dmFyIHQsZT14LmNsZWFuKCkscj1iLmJ1ZmZlcigpLG49ci5sZW5ndGg7aWYobS5wb3AoKSxwLnB1c2gobSksbT1udWxsLG4paWYoMSZlKXt0PXJbMF07dmFyIGksbj10Lmxlbmd0aC0xLG89LTE7aWYobj4wKXtmb3IoX3x8KGEucG9seWdvblN0YXJ0KCksXz0hMCksYS5saW5lU3RhcnQoKTsrK288bjspYS5wb2ludCgoaT10W29dKVswXSxpWzFdKTthLmxpbmVFbmQoKX19ZWxzZSBuPjEmJjImZSYmci5wdXNoKHIucG9wKCkuY29uY2F0KHIuc2hpZnQoKSkpLGQucHVzaChyLmZpbHRlcihSZSkpfXZhciBkLHAsbSx2PWUoYSksZz1pLmludmVydChuWzBdLG5bMV0pLHk9e3BvaW50Om8sbGluZVN0YXJ0OmwsbGluZUVuZDp1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3kucG9pbnQ9Yyx5LmxpbmVTdGFydD1oLHkubGluZUVuZD1mLGQ9W10scD1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3kucG9pbnQ9byx5LmxpbmVTdGFydD1sLHkubGluZUVuZD11LGQ9dW8ubWVyZ2UoZCk7dmFyIHQ9VmUoZyxwKTtkLmxlbmd0aD8oX3x8KGEucG9seWdvblN0YXJ0KCksXz0hMCksSWUoZCxqZSx0LHIsYSkpOnQmJihffHwoYS5wb2x5Z29uU3RhcnQoKSxfPSEwKSxhLmxpbmVTdGFydCgpLHIobnVsbCxudWxsLDEsYSksYS5saW5lRW5kKCkpLF8mJihhLnBvbHlnb25FbmQoKSxfPSExKSxkPXA9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7YS5wb2x5Z29uU3RhcnQoKSxhLmxpbmVTdGFydCgpLHIobnVsbCxudWxsLDEsYSksYS5saW5lRW5kKCksYS5wb2x5Z29uRW5kKCl9fSxiPUZlKCkseD1lKGIpLF89ITE7cmV0dXJuIHl9fWZ1bmN0aW9uIFJlKHQpe3JldHVybiB0Lmxlbmd0aD4xfWZ1bmN0aW9uIEZlKCl7dmFyIHQsZT1bXTtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7ZS5wdXNoKHQ9W10pfSxwb2ludDpmdW5jdGlvbihlLHIpe3QucHVzaChbZSxyXSl9LGxpbmVFbmQ6TSxidWZmZXI6ZnVuY3Rpb24oKXt2YXIgcj1lO3JldHVybiBlPVtdLHQ9bnVsbCxyfSxyZWpvaW46ZnVuY3Rpb24oKXtlLmxlbmd0aD4xJiZlLnB1c2goZS5wb3AoKS5jb25jYXQoZS5zaGlmdCgpKSl9fX1mdW5jdGlvbiBqZSh0LGUpe3JldHVybigodD10LngpWzBdPDA/dFsxXS1Wby1GbzpWby10WzFdKS0oKGU9ZS54KVswXTwwP2VbMV0tVm8tRm86Vm8tZVsxXSl9ZnVuY3Rpb24gTmUodCl7dmFyIGUscj1OYU4sbj1OYU4saT1OYU47cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksZT0xfSxwb2ludDpmdW5jdGlvbihhLG8pe3ZhciBzPWE+MD9ObzotTm8sbD14byhhLXIpO3hvKGwtTm8pPEZvPyh0LnBvaW50KHIsbj0obitvKS8yPjA/Vm86LVZvKSx0LnBvaW50KGksbiksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHMsbiksdC5wb2ludChhLG4pLGU9MCk6aSE9PXMmJmw+PU5vJiYoeG8oci1pKTxGbyYmKHItPWkqRm8pLHhvKGEtcyk8Rm8mJihhLT1zKkZvKSxuPUJlKHIsbixhLG8pLHQucG9pbnQoaSxuKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQocyxuKSxlPTApLHQucG9pbnQocj1hLG49byksaT1zfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dC5saW5lRW5kKCkscj1uPU5hTn0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gMi1lfX19ZnVuY3Rpb24gQmUodCxlLHIsbil7dmFyIGksYSxvPU1hdGguc2luKHQtcik7cmV0dXJuIHhvKG8pPkZvP01hdGguYXRhbigoTWF0aC5zaW4oZSkqKGE9TWF0aC5jb3MobikpKk1hdGguc2luKHIpLU1hdGguc2luKG4pKihpPU1hdGguY29zKGUpKSpNYXRoLnNpbih0KSkvKGkqYSpvKSk6KGUrbikvMn1mdW5jdGlvbiBVZSh0LGUscixuKXt2YXIgaTtpZihudWxsPT10KWk9cipWbyxuLnBvaW50KC1ObyxpKSxuLnBvaW50KDAsaSksbi5wb2ludChObyxpKSxuLnBvaW50KE5vLDApLG4ucG9pbnQoTm8sLWkpLG4ucG9pbnQoMCwtaSksbi5wb2ludCgtTm8sLWkpLG4ucG9pbnQoLU5vLDApLG4ucG9pbnQoLU5vLGkpO2Vsc2UgaWYoeG8odFswXS1lWzBdKT5Gbyl7dmFyIGE9dFswXTxlWzBdP05vOi1ObztpPXIqYS8yLG4ucG9pbnQoLWEsaSksbi5wb2ludCgwLGkpLG4ucG9pbnQoYSxpKX1lbHNlIG4ucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiBWZSh0LGUpe3ZhciByPXRbMF0sbj10WzFdLGk9W01hdGguc2luKHIpLC1NYXRoLmNvcyhyKSwwXSxhPTAsbz0wO01zLnJlc2V0KCk7Zm9yKHZhciBzPTAsbD1lLmxlbmd0aDtzPGw7KytzKXt2YXIgdT1lW3NdLGM9dS5sZW5ndGg7aWYoYylmb3IodmFyIGg9dVswXSxmPWhbMF0sZD1oWzFdLzIrTm8vNCxwPU1hdGguc2luKGQpLG09TWF0aC5jb3MoZCksdj0xOzspe3Y9PT1jJiYodj0wKSx0PXVbdl07dmFyIGc9dFswXSx5PXRbMV0vMitOby80LGI9TWF0aC5zaW4oeSkseD1NYXRoLmNvcyh5KSxfPWctZix3PV8+PTA/MTotMSxNPXcqXyxrPU0+Tm8sQT1wKmI7aWYoTXMuYWRkKE1hdGguYXRhbjIoQSp3Kk1hdGguc2luKE0pLG0qeCtBKk1hdGguY29zKE0pKSksYSs9az9fK3cqQm86XyxrXmY+PXJeZz49cil7dmFyIFQ9YmUoZ2UoaCksZ2UodCkpO3dlKFQpO3ZhciBTPWJlKGksVCk7d2UoUyk7dmFyIEU9KGteXz49MD8tMToxKSpudChTWzJdKTsobj5FfHxuPT09RSYmKFRbMF18fFRbMV0pKSYmKG8rPWteXz49MD8xOi0xKX1pZighdisrKWJyZWFrO2Y9ZyxwPWIsbT14LGg9dH19cmV0dXJuKGE8LUZvfHxhPEZvJiZNczwtRm8pXjEmb31mdW5jdGlvbiBIZSh0KXtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuIE1hdGguY29zKHQpKk1hdGguY29zKGUpPmF9ZnVuY3Rpb24gcih0KXt2YXIgcixhLGwsdSxjO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt1PWw9ITEsYz0xfSxwb2ludDpmdW5jdGlvbihoLGYpe3ZhciBkLHA9W2gsZl0sbT1lKGgsZiksdj1vP20/MDppKGgsZik6bT9pKGgrKGg8MD9ObzotTm8pLGYpOjA7aWYoIXImJih1PWw9bSkmJnQubGluZVN0YXJ0KCksbSE9PWwmJihkPW4ocixwKSwoa2UocixkKXx8a2UocCxkKSkmJihwWzBdKz1GbyxwWzFdKz1GbyxtPWUocFswXSxwWzFdKSkpLG0hPT1sKWM9MCxtPyh0LmxpbmVTdGFydCgpLGQ9bihwLHIpLHQucG9pbnQoZFswXSxkWzFdKSk6KGQ9bihyLHApLHQucG9pbnQoZFswXSxkWzFdKSx0LmxpbmVFbmQoKSkscj1kO2Vsc2UgaWYocyYmciYmb15tKXt2YXIgZzt2JmF8fCEoZz1uKHAsciwhMCkpfHwoYz0wLG8/KHQubGluZVN0YXJ0KCksdC5wb2ludChnWzBdWzBdLGdbMF1bMV0pLHQucG9pbnQoZ1sxXVswXSxnWzFdWzFdKSx0LmxpbmVFbmQoKSk6KHQucG9pbnQoZ1sxXVswXSxnWzFdWzFdKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQoZ1swXVswXSxnWzBdWzFdKSkpfSFtfHxyJiZrZShyLHApfHx0LnBvaW50KHBbMF0scFsxXSkscj1wLGw9bSxhPXZ9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtsJiZ0LmxpbmVFbmQoKSxyPW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIGN8KHUmJmwpPDwxfX19ZnVuY3Rpb24gbih0LGUscil7dmFyIG49Z2UodCksaT1nZShlKSxvPVsxLDAsMF0scz1iZShuLGkpLGw9eWUocyxzKSx1PXNbMF0sYz1sLXUqdTtpZighYylyZXR1cm4hciYmdDt2YXIgaD1hKmwvYyxmPS1hKnUvYyxkPWJlKG8scykscD1fZShvLGgpO3hlKHAsX2UocyxmKSk7dmFyIG09ZCx2PXllKHAsbSksZz15ZShtLG0pLHk9dip2LWcqKHllKHAscCktMSk7aWYoISh5PDApKXt2YXIgYj1NYXRoLnNxcnQoeSkseD1fZShtLCgtdi1iKS9nKTtpZih4ZSh4LHApLHg9TWUoeCksIXIpcmV0dXJuIHg7dmFyIF8sdz10WzBdLE09ZVswXSxrPXRbMV0sQT1lWzFdO008dyYmKF89dyx3PU0sTT1fKTt2YXIgVD1NLXcsUz14byhULU5vKTxGbyxFPVN8fFQ8Rm87aWYoIVMmJkE8ayYmKF89ayxrPUEsQT1fKSxFP1M/aytBPjBeeFsxXTwoeG8oeFswXS13KTxGbz9rOkEpOms8PXhbMV0mJnhbMV08PUE6VD5Ob14odzw9eFswXSYmeFswXTw9TSkpe3ZhciBMPV9lKG0sKC12K2IpL2cpO3JldHVybiB4ZShMLHApLFt4LE1lKEwpXX19fWZ1bmN0aW9uIGkoZSxyKXt2YXIgbj1vP3Q6Tm8tdCxpPTA7cmV0dXJuIGU8LW4/aXw9MTplPm4mJihpfD0yKSxyPC1uP2l8PTQ6cj5uJiYoaXw9OCksaX12YXIgYT1NYXRoLmNvcyh0KSxvPWE+MCxzPXhvKGEpPkZvO3JldHVybiBPZShlLHIsdnIodCw2KkhvKSxvP1swLC10XTpbLU5vLHQtTm9dKX1mdW5jdGlvbiBxZSh0LGUscixuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIGEsbz1pLmEscz1pLmIsbD1vLngsdT1vLnksYz1zLngsaD1zLnksZj0wLGQ9MSxwPWMtbCxtPWgtdTtpZihhPXQtbCxwfHwhKGE+MCkpe2lmKGEvPXAscDwwKXtpZihhPGYpcmV0dXJuO2E8ZCYmKGQ9YSl9ZWxzZSBpZihwPjApe2lmKGE+ZClyZXR1cm47YT5mJiYoZj1hKX1pZihhPXItbCxwfHwhKGE8MCkpe2lmKGEvPXAscDwwKXtpZihhPmQpcmV0dXJuO2E+ZiYmKGY9YSl9ZWxzZSBpZihwPjApe2lmKGE8ZilyZXR1cm47YTxkJiYoZD1hKX1pZihhPWUtdSxtfHwhKGE+MCkpe2lmKGEvPW0sbTwwKXtpZihhPGYpcmV0dXJuO2E8ZCYmKGQ9YSl9ZWxzZSBpZihtPjApe2lmKGE+ZClyZXR1cm47YT5mJiYoZj1hKX1pZihhPW4tdSxtfHwhKGE8MCkpe2lmKGEvPW0sbTwwKXtpZihhPmQpcmV0dXJuO2E+ZiYmKGY9YSl9ZWxzZSBpZihtPjApe2lmKGE8ZilyZXR1cm47YTxkJiYoZD1hKX1yZXR1cm4gZj4wJiYoaS5hPXt4OmwrZipwLHk6dStmKm19KSxkPDEmJihpLmI9e3g6bCtkKnAseTp1K2QqbX0pLGl9fX19fX1mdW5jdGlvbiBHZSh0LGUscixuKXtmdW5jdGlvbiBpKG4saSl7cmV0dXJuIHhvKG5bMF0tdCk8Rm8/aT4wPzA6Mzp4byhuWzBdLXIpPEZvP2k+MD8yOjE6eG8oblsxXS1lKTxGbz9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gYSh0LGUpe3JldHVybiBvKHQueCxlLngpfWZ1bmN0aW9uIG8odCxlKXt2YXIgcj1pKHQsMSksbj1pKGUsMSk7cmV0dXJuIHIhPT1uP3ItbjowPT09cj9lWzFdLXRbMV06MT09PXI/dFswXS1lWzBdOjI9PT1yP3RbMV0tZVsxXTplWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKHMpe2Z1bmN0aW9uIGwodCl7Zm9yKHZhciBlPTAscj12Lmxlbmd0aCxuPXRbMV0saT0wO2k8cjsrK2kpZm9yKHZhciBhLG89MSxzPXZbaV0sbD1zLmxlbmd0aCx1PXNbMF07bzxsOysrbylhPXNbb10sdVsxXTw9bj9hWzFdPm4mJmV0KHUsYSx0KT4wJiYrK2U6YVsxXTw9biYmZXQodSxhLHQpPDAmJi0tZSx1PWE7cmV0dXJuIDAhPT1lfWZ1bmN0aW9uIHUoYSxzLGwsdSl7dmFyIGM9MCxoPTA7aWYobnVsbD09YXx8KGM9aShhLGwpKSE9PShoPWkocyxsKSl8fG8oYSxzKTwwXmw+MClkb3t1LnBvaW50KDA9PT1jfHwzPT09Yz90OnIsYz4xP246ZSl9d2hpbGUoKGM9KGMrbCs0KSU0KSE9PWgpO2Vsc2UgdS5wb2ludChzWzBdLHNbMV0pfWZ1bmN0aW9uIGMoaSxhKXtyZXR1cm4gdDw9aSYmaTw9ciYmZTw9YSYmYTw9bn1mdW5jdGlvbiBoKHQsZSl7Yyh0LGUpJiZzLnBvaW50KHQsZSl9ZnVuY3Rpb24gZigpe0wucG9pbnQ9cCx2JiZ2LnB1c2goZz1bXSksaz0hMCxNPSExLF89dz1OYU59ZnVuY3Rpb24gZCgpe20mJihwKHksYikseCYmTSYmUy5yZWpvaW4oKSxtLnB1c2goUy5idWZmZXIoKSkpLEwucG9pbnQ9aCxNJiZzLmxpbmVFbmQoKX1mdW5jdGlvbiBwKHQsZSl7dD1NYXRoLm1heCgtanMsTWF0aC5taW4oanMsdCkpLGU9TWF0aC5tYXgoLWpzLE1hdGgubWluKGpzLGUpKTt2YXIgcj1jKHQsZSk7aWYodiYmZy5wdXNoKFt0LGVdKSxrKXk9dCxiPWUseD1yLGs9ITEsciYmKHMubGluZVN0YXJ0KCkscy5wb2ludCh0LGUpKTtlbHNlIGlmKHImJk0pcy5wb2ludCh0LGUpO2Vsc2V7dmFyIG49e2E6e3g6Xyx5Ond9LGI6e3g6dCx5OmV9fTtFKG4pPyhNfHwocy5saW5lU3RhcnQoKSxzLnBvaW50KG4uYS54LG4uYS55KSkscy5wb2ludChuLmIueCxuLmIueSkscnx8cy5saW5lRW5kKCksQT0hMSk6ciYmKHMubGluZVN0YXJ0KCkscy5wb2ludCh0LGUpLEE9ITEpfV89dCx3PWUsTT1yfXZhciBtLHYsZyx5LGIseCxfLHcsTSxrLEEsVD1zLFM9RmUoKSxFPXFlKHQsZSxyLG4pLEw9e3BvaW50OmgsbGluZVN0YXJ0OmYsbGluZUVuZDpkLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3M9UyxtPVtdLHY9W10sQT0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3M9VCxtPXVvLm1lcmdlKG0pO3ZhciBlPWwoW3Qsbl0pLHI9QSYmZSxpPW0ubGVuZ3RoOyhyfHxpKSYmKHMucG9seWdvblN0YXJ0KCksciYmKHMubGluZVN0YXJ0KCksdShudWxsLG51bGwsMSxzKSxzLmxpbmVFbmQoKSksaSYmSWUobSxhLGUsdSxzKSxzLnBvbHlnb25FbmQoKSksbT12PWc9bnVsbH19O3JldHVybiBMfX1mdW5jdGlvbiBZZSh0KXt2YXIgZT0wLHI9Tm8vMyxuPWxyKHQpLGk9bihlLHIpO3JldHVybiBpLnBhcmFsbGVscz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGU9dFswXSpOby8xODAscj10WzFdKk5vLzE4MCk6W2UvTm8qMTgwLHIvTm8qMTgwXX0saX1mdW5jdGlvbiBYZSh0LGUpe2Z1bmN0aW9uIHIodCxlKXt2YXIgcj1NYXRoLnNxcnQoYS0yKmkqTWF0aC5zaW4oZSkpL2k7cmV0dXJuW3IqTWF0aC5zaW4odCo9aSksby1yKk1hdGguY29zKHQpXX12YXIgbj1NYXRoLnNpbih0KSxpPShuK01hdGguc2luKGUpKS8yLGE9MStuKigyKmktbiksbz1NYXRoLnNxcnQoYSkvaTtyZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgcj1vLWU7cmV0dXJuW01hdGguYXRhbjIodCxyKS9pLG50KChhLSh0KnQrcipyKSppKmkpLygyKmkpKV19LHJ9ZnVuY3Rpb24gV2UoKXtmdW5jdGlvbiB0KHQsZSl7QnMrPWkqdC1uKmUsbj10LGk9ZX12YXIgZSxyLG4saTtHcy5wb2ludD1mdW5jdGlvbihhLG8pe0dzLnBvaW50PXQsZT1uPWEscj1pPW99LEdzLmxpbmVFbmQ9ZnVuY3Rpb24oKXt0KGUscil9fWZ1bmN0aW9uIFplKHQsZSl7dDxVcyYmKFVzPXQpLHQ+SHMmJihIcz10KSxlPFZzJiYoVnM9ZSksZT5xcyYmKHFzPWUpfWZ1bmN0aW9uIEplKCl7ZnVuY3Rpb24gdCh0LGUpe28ucHVzaCgiTSIsdCwiLCIsZSxhKX1mdW5jdGlvbiBlKHQsZSl7by5wdXNoKCJNIix0LCIsIixlKSxzLnBvaW50PXJ9ZnVuY3Rpb24gcih0LGUpe28ucHVzaCgiTCIsdCwiLCIsZSl9ZnVuY3Rpb24gbigpe3MucG9pbnQ9dH1mdW5jdGlvbiBpKCl7by5wdXNoKCJaIil9dmFyIGE9S2UoNC41KSxvPVtdLHM9e3BvaW50OnQsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7cy5wb2ludD1lfSxsaW5lRW5kOm4scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7cy5saW5lRW5kPWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtzLmxpbmVFbmQ9bixzLnBvaW50PXR9LHBvaW50UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybiBhPUtlKHQpLHN9LHJlc3VsdDpmdW5jdGlvbigpe2lmKG8ubGVuZ3RoKXt2YXIgdD1vLmpvaW4oIiIpO3JldHVybiBvPVtdLHR9fX07cmV0dXJuIHN9ZnVuY3Rpb24gS2UodCl7cmV0dXJuIm0wLCIrdCsiYSIrdCsiLCIrdCsiIDAgMSwxIDAsIistMip0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKzIqdCsieiJ9ZnVuY3Rpb24gUWUodCxlKXtTcys9dCxFcys9ZSwrK0xzfWZ1bmN0aW9uICRlKCl7ZnVuY3Rpb24gdCh0LG4pe3ZhciBpPXQtZSxhPW4tcixvPU1hdGguc3FydChpKmkrYSphKTtDcys9byooZSt0KS8yLHpzKz1vKihyK24pLzIsSXMrPW8sUWUoZT10LHI9bil9dmFyIGUscjtYcy5wb2ludD1mdW5jdGlvbihuLGkpe1hzLnBvaW50PXQsUWUoZT1uLHI9aSl9fWZ1bmN0aW9uIHRyKCl7WHMucG9pbnQ9UWV9ZnVuY3Rpb24gZXIoKXtmdW5jdGlvbiB0KHQsZSl7dmFyIHI9dC1uLGE9ZS1pLG89TWF0aC5zcXJ0KHIqcithKmEpO0NzKz1vKihuK3QpLzIsenMrPW8qKGkrZSkvMixJcys9byxvPWkqdC1uKmUsRHMrPW8qKG4rdCksUHMrPW8qKGkrZSksT3MrPTMqbyxRZShuPXQsaT1lKX12YXIgZSxyLG4saTtYcy5wb2ludD1mdW5jdGlvbihhLG8pe1hzLnBvaW50PXQsUWUoZT1uPWEscj1pPW8pfSxYcy5saW5lRW5kPWZ1bmN0aW9uKCl7dChlLHIpfX1mdW5jdGlvbiBycih0KXtmdW5jdGlvbiBlKGUscil7dC5tb3ZlVG8oZStvLHIpLHQuYXJjKGUscixvLDAsQm8pfWZ1bmN0aW9uIHIoZSxyKXt0Lm1vdmVUbyhlLHIpLHMucG9pbnQ9bn1mdW5jdGlvbiBuKGUscil7dC5saW5lVG8oZSxyKX1mdW5jdGlvbiBpKCl7cy5wb2ludD1lfWZ1bmN0aW9uIGEoKXt0LmNsb3NlUGF0aCgpfXZhciBvPTQuNSxzPXtwb2ludDplLGxpbmVTdGFydDpmdW5jdGlvbigpe3MucG9pbnQ9cn0sbGluZUVuZDppLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3MubGluZUVuZD1hfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7cy5saW5lRW5kPWkscy5wb2ludD1lfSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gbz10LHN9LHJlc3VsdDpNfTtyZXR1cm4gc31mdW5jdGlvbiBucih0KXtmdW5jdGlvbiBlKHQpe3JldHVybihzP246cikodCl9ZnVuY3Rpb24gcihlKXtyZXR1cm4gb3IoZSxmdW5jdGlvbihyLG4pe3I9dChyLG4pLGUucG9pbnQoclswXSxyWzFdKX0pfWZ1bmN0aW9uIG4oZSl7ZnVuY3Rpb24gcihyLG4pe3I9dChyLG4pLGUucG9pbnQoclswXSxyWzFdKX1mdW5jdGlvbiBuKCl7Yj1OYU4say5wb2ludD1hLGUubGluZVN0YXJ0KCl9ZnVuY3Rpb24gYShyLG4pe3ZhciBhPWdlKFtyLG5dKSxvPXQocixuKTtpKGIseCx5LF8sdyxNLGI9b1swXSx4PW9bMV0seT1yLF89YVswXSx3PWFbMV0sTT1hWzJdLHMsZSksZS5wb2ludChiLHgpfWZ1bmN0aW9uIG8oKXtrLnBvaW50PXIsZS5saW5lRW5kKCl9ZnVuY3Rpb24gbCgpe24oKSxrLnBvaW50PXUsay5saW5lRW5kPWN9ZnVuY3Rpb24gdSh0LGUpe2EoaD10LGY9ZSksZD1iLHA9eCxtPV8sdj13LGc9TSxrLnBvaW50PWF9ZnVuY3Rpb24gYygpe2koYix4LHksXyx3LE0sZCxwLGgsbSx2LGcscyxlKSxrLmxpbmVFbmQ9byxvKCl9dmFyIGgsZixkLHAsbSx2LGcseSxiLHgsXyx3LE0saz17cG9pbnQ6cixsaW5lU3RhcnQ6bixsaW5lRW5kOm8scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7ZS5wb2x5Z29uU3RhcnQoKSxrLmxpbmVTdGFydD1sfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7ZS5wb2x5Z29uRW5kKCksay5saW5lU3RhcnQ9bn19O3JldHVybiBrfWZ1bmN0aW9uIGkoZSxyLG4scyxsLHUsYyxoLGYsZCxwLG0sdixnKXt2YXIgeT1jLWUsYj1oLXIseD15KnkrYipiO2lmKHg+NCphJiZ2LS0pe3ZhciBfPXMrZCx3PWwrcCxNPXUrbSxrPU1hdGguc3FydChfKl8rdyp3K00qTSksQT1NYXRoLmFzaW4oTS89ayksVD14byh4byhNKS0xKTxGb3x8eG8obi1mKTxGbz8obitmKS8yOk1hdGguYXRhbjIodyxfKSxTPXQoVCxBKSxFPVNbMF0sTD1TWzFdLEM9RS1lLHo9TC1yLEk9YipDLXkqejsoSSpJL3g+YXx8eG8oKHkqQytiKnopL3gtLjUpPi4zfHxzKmQrbCpwK3UqbTxvKSYmKGkoZSxyLG4scyxsLHUsRSxMLFQsXy89ayx3Lz1rLE0sdixnKSxnLnBvaW50KEUsTCksaShFLEwsVCxfLHcsTSxjLGgsZixkLHAsbSx2LGcpKX19dmFyIGE9LjUsbz1NYXRoLmNvcygzMCpIbykscz0xNjtyZXR1cm4gZS5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9KGE9dCp0KT4wJiYxNixlKTpNYXRoLnNxcnQoYSl9LGV9ZnVuY3Rpb24gaXIodCl7dmFyIGU9bnIoZnVuY3Rpb24oZSxyKXtyZXR1cm4gdChbZSpxbyxyKnFvXSl9KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHVyKGUodCkpfX1mdW5jdGlvbiBhcih0KXt0aGlzLnN0cmVhbT10fWZ1bmN0aW9uIG9yKHQsZSl7cmV0dXJue3BvaW50OmUsc3BoZXJlOmZ1bmN0aW9uKCl7dC5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCl9fX1mdW5jdGlvbiBzcih0KXtyZXR1cm4gbHIoZnVuY3Rpb24oKXtyZXR1cm4gdH0pKCl9ZnVuY3Rpb24gbHIodCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdD1zKHRbMF0qSG8sdFsxXSpIbyksW3RbMF0qZitsLHUtdFsxXSpmXX1mdW5jdGlvbiByKHQpe3JldHVybih0PXMuaW52ZXJ0KCh0WzBdLWwpL2YsKHUtdFsxXSkvZikpJiZbdFswXSpxbyx0WzFdKnFvXX1mdW5jdGlvbiBuKCl7cz1DZShvPWZyKGcseSxiKSxhKTt2YXIgdD1hKG0sdik7cmV0dXJuIGw9ZC10WzBdKmYsdT1wK3RbMV0qZixpKCl9ZnVuY3Rpb24gaSgpe3JldHVybiBjJiYoYy52YWxpZD0hMSxjPW51bGwpLGV9dmFyIGEsbyxzLGwsdSxjLGg9bnIoZnVuY3Rpb24odCxlKXtyZXR1cm4gdD1hKHQsZSksW3RbMF0qZitsLHUtdFsxXSpmXX0pLGY9MTUwLGQ9NDgwLHA9MjUwLG09MCx2PTAsZz0wLHk9MCxiPTAsXz1Gcyx3PXgsTT1udWxsLGs9bnVsbDtyZXR1cm4gZS5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIGMmJihjLnZhbGlkPSExKSxjPXVyKF8obyxoKHcodCkpKSksYy52YWxpZD0hMCxjfSxlLmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz1udWxsPT10PyhNPXQsRnMpOkhlKChNPSt0KSpIbyksaSgpKTpNfSxlLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGs9dCx3PXQ/R2UodFswXVswXSx0WzBdWzFdLHRbMV1bMF0sdFsxXVsxXSk6eCxpKCkpOmt9LGUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9K3QsbigpKTpmfSxlLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0rdFswXSxwPSt0WzFdLG4oKSk6W2QscF19LGUuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPXRbMF0lMzYwKkhvLHY9dFsxXSUzNjAqSG8sbigpKTpbbSpxbyx2KnFvXX0sZS5yb3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9dFswXSUzNjAqSG8seT10WzFdJTM2MCpIbyxiPXQubGVuZ3RoPjI/dFsyXSUzNjAqSG86MCxuKCkpOltnKnFvLHkqcW8sYipxb119LHVvLnJlYmluZChlLGgsInByZWNpc2lvbiIpLGZ1bmN0aW9uKCl7cmV0dXJuIGE9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS5pbnZlcnQ9YS5pbnZlcnQmJnIsbigpfX1mdW5jdGlvbiB1cih0KXtyZXR1cm4gb3IodCxmdW5jdGlvbihlLHIpe3QucG9pbnQoZSpIbyxyKkhvKX0pfWZ1bmN0aW9uIGNyKHQsZSl7cmV0dXJuW3QsZV19ZnVuY3Rpb24gaHIodCxlKXtyZXR1cm5bdD5Obz90LUJvOnQ8LU5vP3QrQm86dCxlXX1mdW5jdGlvbiBmcih0LGUscil7cmV0dXJuIHQ/ZXx8cj9DZShwcih0KSxtcihlLHIpKTpwcih0KTplfHxyP21yKGUscik6aHJ9ZnVuY3Rpb24gZHIodCl7cmV0dXJuIGZ1bmN0aW9uKGUscil7cmV0dXJuIGUrPXQsW2U+Tm8/ZS1CbzplPC1Obz9lK0JvOmUscl19fWZ1bmN0aW9uIHByKHQpe3ZhciBlPWRyKHQpO3JldHVybiBlLmludmVydD1kcigtdCksZX1mdW5jdGlvbiBtcih0LGUpe2Z1bmN0aW9uIHIodCxlKXt2YXIgcj1NYXRoLmNvcyhlKSxzPU1hdGguY29zKHQpKnIsbD1NYXRoLnNpbih0KSpyLHU9TWF0aC5zaW4oZSksYz11Km4rcyppO3JldHVybltNYXRoLmF0YW4yKGwqYS1jKm8scypuLXUqaSksbnQoYyphK2wqbyldfXZhciBuPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCksYT1NYXRoLmNvcyhlKSxvPU1hdGguc2luKGUpO3JldHVybiByLmludmVydD1mdW5jdGlvbih0LGUpe3ZhciByPU1hdGguY29zKGUpLHM9TWF0aC5jb3ModCkqcixsPU1hdGguc2luKHQpKnIsdT1NYXRoLnNpbihlKSxjPXUqYS1sKm87cmV0dXJuW01hdGguYXRhbjIobCphK3UqbyxzKm4rYyppKSxudChjKm4tcyppKV19LHJ9ZnVuY3Rpb24gdnIodCxlKXt2YXIgcj1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiBmdW5jdGlvbihpLGEsbyxzKXt2YXIgbD1vKmU7bnVsbCE9aT8oaT1ncihyLGkpLGE9Z3IocixhKSwobz4wP2k8YTppPmEpJiYoaSs9bypCbykpOihpPXQrbypCbyxhPXQtLjUqbCk7Zm9yKHZhciB1LGM9aTtvPjA/Yz5hOmM8YTtjLT1sKXMucG9pbnQoKHU9TWUoW3IsLW4qTWF0aC5jb3MoYyksLW4qTWF0aC5zaW4oYyldKSlbMF0sdVsxXSl9fWZ1bmN0aW9uIGdyKHQsZSl7dmFyIHI9Z2UoZSk7clswXS09dCx3ZShyKTt2YXIgbj1ydCgtclsxXSk7cmV0dXJuKCgtclsyXTwwPy1uOm4pKzIqTWF0aC5QSS1GbyklKDIqTWF0aC5QSSl9ZnVuY3Rpb24geXIodCxlLHIpe3ZhciBuPXVvLnJhbmdlKHQsZS1GbyxyKS5jb25jYXQoZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLm1hcChmdW5jdGlvbihlKXtyZXR1cm5bdCxlXX0pfX1mdW5jdGlvbiBicih0LGUscil7dmFyIG49dW8ucmFuZ2UodCxlLUZvLHIpLmNvbmNhdChlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKGUpe3JldHVybltlLHRdfSl9fWZ1bmN0aW9uIHhyKHQpe3JldHVybiB0LnNvdXJjZX1mdW5jdGlvbiBfcih0KXtyZXR1cm4gdC50YXJnZXR9ZnVuY3Rpb24gd3IodCxlLHIsbil7dmFyIGk9TWF0aC5jb3MoZSksYT1NYXRoLnNpbihlKSxvPU1hdGguY29zKG4pLHM9TWF0aC5zaW4obiksbD1pKk1hdGguY29zKHQpLHU9aSpNYXRoLnNpbih0KSxjPW8qTWF0aC5jb3MociksaD1vKk1hdGguc2luKHIpLGY9MipNYXRoLmFzaW4oTWF0aC5zcXJ0KHN0KG4tZSkraSpvKnN0KHItdCkpKSxkPTEvTWF0aC5zaW4oZikscD1mP2Z1bmN0aW9uKHQpe3ZhciBlPU1hdGguc2luKHQqPWYpKmQscj1NYXRoLnNpbihmLXQpKmQsbj1yKmwrZSpjLGk9cip1K2UqaCxvPXIqYStlKnM7cmV0dXJuW01hdGguYXRhbjIoaSxuKSpxbyxNYXRoLmF0YW4yKG8sTWF0aC5zcXJ0KG4qbitpKmkpKSpxb119OmZ1bmN0aW9uKCl7cmV0dXJuW3QqcW8sZSpxb119O3JldHVybiBwLmRpc3RhbmNlPWYscH1mdW5jdGlvbiBNcigpe2Z1bmN0aW9uIHQodCxpKXt2YXIgYT1NYXRoLnNpbihpKj1Ibyksbz1NYXRoLmNvcyhpKSxzPXhvKCh0Kj1IbyktZSksbD1NYXRoLmNvcyhzKTtXcys9TWF0aC5hdGFuMihNYXRoLnNxcnQoKHM9bypNYXRoLnNpbihzKSkqcysocz1uKmEtcipvKmwpKnMpLHIqYStuKm8qbCksZT10LHI9YSxuPW99dmFyIGUscixuO1pzLnBvaW50PWZ1bmN0aW9uKGksYSl7ZT1pKkhvLHI9TWF0aC5zaW4oYSo9SG8pLG49TWF0aC5jb3MoYSksWnMucG9pbnQ9dH0sWnMubGluZUVuZD1mdW5jdGlvbigpe1pzLnBvaW50PVpzLmxpbmVFbmQ9TX19ZnVuY3Rpb24ga3IodCxlKXtmdW5jdGlvbiByKGUscil7dmFyIG49TWF0aC5jb3MoZSksaT1NYXRoLmNvcyhyKSxhPXQobippKTtyZXR1cm5bYSppKk1hdGguc2luKGUpLGEqTWF0aC5zaW4ocildfXJldHVybiByLmludmVydD1mdW5jdGlvbih0LHIpe3ZhciBuPU1hdGguc3FydCh0KnQrcipyKSxpPWUobiksYT1NYXRoLnNpbihpKSxvPU1hdGguY29zKGkpO3JldHVybltNYXRoLmF0YW4yKHQqYSxuKm8pLE1hdGguYXNpbihuJiZyKmEvbildfSxyfWZ1bmN0aW9uIEFyKHQsZSl7ZnVuY3Rpb24gcih0LGUpe28+MD9lPC1WbytGbyYmKGU9LVZvK0ZvKTplPlZvLUZvJiYoZT1Wby1Gbyk7dmFyIHI9by9NYXRoLnBvdyhpKGUpLGEpO3JldHVybltyKk1hdGguc2luKGEqdCksby1yKk1hdGguY29zKGEqdCldfXZhciBuPU1hdGguY29zKHQpLGk9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgudGFuKE5vLzQrdC8yKX0sYT10PT09ZT9NYXRoLnNpbih0KTpNYXRoLmxvZyhuL01hdGguY29zKGUpKS9NYXRoLmxvZyhpKGUpL2kodCkpLG89bipNYXRoLnBvdyhpKHQpLGEpL2E7cmV0dXJuIGE/KHIuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9by1lLG49dHQoYSkqTWF0aC5zcXJ0KHQqdCtyKnIpO3JldHVybltNYXRoLmF0YW4yKHQscikvYSwyKk1hdGguYXRhbihNYXRoLnBvdyhvL24sMS9hKSktVm9dfSxyKTpTcn1mdW5jdGlvbiBUcih0LGUpe2Z1bmN0aW9uIHIodCxlKXt2YXIgcj1hLWU7cmV0dXJuW3IqTWF0aC5zaW4oaSp0KSxhLXIqTWF0aC5jb3MoaSp0KV19dmFyIG49TWF0aC5jb3ModCksaT10PT09ZT9NYXRoLnNpbih0KToobi1NYXRoLmNvcyhlKSkvKGUtdCksYT1uL2krdDtyZXR1cm4geG8oaSk8Rm8/Y3I6KHIuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9YS1lO3JldHVybltNYXRoLmF0YW4yKHQscikvaSxhLXR0KGkpKk1hdGguc3FydCh0KnQrcipyKV19LHIpfWZ1bmN0aW9uIFNyKHQsZSl7cmV0dXJuW3QsTWF0aC5sb2coTWF0aC50YW4oTm8vNCtlLzIpKV19ZnVuY3Rpb24gRXIodCl7dmFyIGUscj1zcih0KSxuPXIuc2NhbGUsaT1yLnRyYW5zbGF0ZSxhPXIuY2xpcEV4dGVudDtyZXR1cm4gci5zY2FsZT1mdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkocixhcmd1bWVudHMpO3JldHVybiB0PT09cj9lP3IuY2xpcEV4dGVudChudWxsKTpyOnR9LHIudHJhbnNsYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseShyLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1yP2U/ci5jbGlwRXh0ZW50KG51bGwpOnI6dH0sci5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBvPWEuYXBwbHkocixhcmd1bWVudHMpO2lmKG89PT1yKXtpZihlPW51bGw9PXQpe3ZhciBzPU5vKm4oKSxsPWkoKTthKFtbbFswXS1zLGxbMV0tc10sW2xbMF0rcyxsWzFdK3NdXSl9fWVsc2UgZSYmKG89bnVsbCk7cmV0dXJuIG99LHIuY2xpcEV4dGVudChudWxsKX1mdW5jdGlvbiBMcih0LGUpe3JldHVybltNYXRoLmxvZyhNYXRoLnRhbihOby80K2UvMikpLC10XX1mdW5jdGlvbiBDcih0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiB6cih0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBJcih0KXtmb3IodmFyIGU9dC5sZW5ndGgscj1bMCwxXSxuPTIsaT0yO2k8ZTtpKyspe2Zvcig7bj4xJiZldCh0W3Jbbi0yXV0sdFtyW24tMV1dLHRbaV0pPD0wOyktLW47cltuKytdPWl9cmV0dXJuIHIuc2xpY2UoMCxuKX1mdW5jdGlvbiBEcih0LGUpe3JldHVybiB0WzBdLWVbMF18fHRbMV0tZVsxXX1mdW5jdGlvbiBQcih0LGUscil7cmV0dXJuKHJbMF0tZVswXSkqKHRbMV0tZVsxXSk8KHJbMV0tZVsxXSkqKHRbMF0tZVswXSl9ZnVuY3Rpb24gT3IodCxlLHIsbil7dmFyIGk9dFswXSxhPXJbMF0sbz1lWzBdLWkscz1uWzBdLWEsbD10WzFdLHU9clsxXSxjPWVbMV0tbCxoPW5bMV0tdSxmPShzKihsLXUpLWgqKGktYSkpLyhoKm8tcypjKTtyZXR1cm5baStmKm8sbCtmKmNdfWZ1bmN0aW9uIFJyKHQpe3ZhciBlPXRbMF0scj10W3QubGVuZ3RoLTFdO3JldHVybiEoZVswXS1yWzBdfHxlWzFdLXJbMV0pfWZ1bmN0aW9uIEZyKCl7YW4odGhpcyksdGhpcy5lZGdlPXRoaXMuc2l0ZT10aGlzLmNpcmNsZT1udWxsfWZ1bmN0aW9uIGpyKHQpe3ZhciBlPXNsLnBvcCgpfHxuZXcgRnI7cmV0dXJuIGUuc2l0ZT10LGV9ZnVuY3Rpb24gTnIodCl7WnIodCksaWwucmVtb3ZlKHQpLHNsLnB1c2godCksYW4odCl9ZnVuY3Rpb24gQnIodCl7dmFyIGU9dC5jaXJjbGUscj1lLngsbj1lLmN5LGk9e3g6cix5Om59LGE9dC5QLG89dC5OLHM9W3RdO05yKHQpO2Zvcih2YXIgbD1hO2wuY2lyY2xlJiZ4byhyLWwuY2lyY2xlLngpPEZvJiZ4byhuLWwuY2lyY2xlLmN5KTxGbzspYT1sLlAscy51bnNoaWZ0KGwpLE5yKGwpLGw9YTtzLnVuc2hpZnQobCksWnIobCk7Zm9yKHZhciB1PW87dS5jaXJjbGUmJnhvKHItdS5jaXJjbGUueCk8Rm8mJnhvKG4tdS5jaXJjbGUuY3kpPEZvOylvPXUuTixzLnB1c2godSksTnIodSksdT1vO3MucHVzaCh1KSxacih1KTt2YXIgYyxoPXMubGVuZ3RoO2ZvcihjPTE7YzxoOysrYyl1PXNbY10sbD1zW2MtMV0sZW4odS5lZGdlLGwuc2l0ZSx1LnNpdGUsaSk7bD1zWzBdLHU9c1toLTFdLHUuZWRnZT0kcihsLnNpdGUsdS5zaXRlLG51bGwsaSksV3IobCksV3IodSl9ZnVuY3Rpb24gVXIodCl7Zm9yKHZhciBlLHIsbixpLGE9dC54LG89dC55LHM9aWwuXztzOylpZigobj1WcihzLG8pLWEpPkZvKXM9cy5MO2Vsc2V7aWYoISgoaT1hLUhyKHMsbykpPkZvKSl7bj4tRm8/KGU9cy5QLHI9cyk6aT4tRm8/KGU9cyxyPXMuTik6ZT1yPXM7YnJlYWt9aWYoIXMuUil7ZT1zO2JyZWFrfXM9cy5SfXZhciBsPWpyKHQpO2lmKGlsLmluc2VydChlLGwpLGV8fHIpe2lmKGU9PT1yKXJldHVybiBacihlKSxyPWpyKGUuc2l0ZSksaWwuaW5zZXJ0KGwsciksbC5lZGdlPXIuZWRnZT0kcihlLnNpdGUsbC5zaXRlKSxXcihlKSx2b2lkIFdyKHIpO2lmKCFyKXJldHVybiB2b2lkKGwuZWRnZT0kcihlLnNpdGUsbC5zaXRlKSk7WnIoZSksWnIocik7dmFyIHU9ZS5zaXRlLGM9dS54LGg9dS55LGY9dC54LWMsZD10LnktaCxwPXIuc2l0ZSxtPXAueC1jLHY9cC55LWgsZz0yKihmKnYtZCptKSx5PWYqZitkKmQsYj1tKm0rdip2LHg9e3g6KHYqeS1kKmIpL2crYyx5OihmKmItbSp5KS9nK2h9O2VuKHIuZWRnZSx1LHAseCksbC5lZGdlPSRyKHUsdCxudWxsLHgpLHIuZWRnZT0kcih0LHAsbnVsbCx4KSxXcihlKSxXcihyKX19ZnVuY3Rpb24gVnIodCxlKXt2YXIgcj10LnNpdGUsbj1yLngsaT1yLnksYT1pLWU7aWYoIWEpcmV0dXJuIG47dmFyIG89dC5QO2lmKCFvKXJldHVybi0xLzA7cj1vLnNpdGU7dmFyIHM9ci54LGw9ci55LHU9bC1lO2lmKCF1KXJldHVybiBzO3ZhciBjPXMtbixoPTEvYS0xL3UsZj1jL3U7cmV0dXJuIGg/KC1mK01hdGguc3FydChmKmYtMipoKihjKmMvKC0yKnUpLWwrdS8yK2ktYS8yKSkpL2grbjoobitzKS8yfWZ1bmN0aW9uIEhyKHQsZSl7dmFyIHI9dC5OO2lmKHIpcmV0dXJuIFZyKHIsZSk7dmFyIG49dC5zaXRlO3JldHVybiBuLnk9PT1lP24ueDoxLzB9ZnVuY3Rpb24gcXIodCl7dGhpcy5zaXRlPXQsdGhpcy5lZGdlcz1bXX1mdW5jdGlvbiBHcih0KXtmb3IodmFyIGUscixuLGksYSxvLHMsbCx1LGMsaD10WzBdWzBdLGY9dFsxXVswXSxkPXRbMF1bMV0scD10WzFdWzFdLG09bmwsdj1tLmxlbmd0aDt2LS07KWlmKChhPW1bdl0pJiZhLnByZXBhcmUoKSlmb3Iocz1hLmVkZ2VzLGw9cy5sZW5ndGgsbz0wO288bDspYz1zW29dLmVuZCgpLG49Yy54LGk9Yy55LHU9c1srK28lbF0uc3RhcnQoKSxlPXUueCxyPXUueSwoeG8obi1lKT5Gb3x8eG8oaS1yKT5GbykmJihzLnNwbGljZShvLDAsbmV3IHJuKHRuKGEuc2l0ZSxjLHhvKG4taCk8Rm8mJnAtaT5Gbz97eDpoLHk6eG8oZS1oKTxGbz9yOnB9OnhvKGktcCk8Rm8mJmYtbj5Gbz97eDp4byhyLXApPEZvP2U6Zix5OnB9OnhvKG4tZik8Rm8mJmktZD5Gbz97eDpmLHk6eG8oZS1mKTxGbz9yOmR9OnhvKGktZCk8Rm8mJm4taD5Gbz97eDp4byhyLWQpPEZvP2U6aCx5OmR9Om51bGwpLGEuc2l0ZSxudWxsKSksKytsKX1mdW5jdGlvbiBZcih0LGUpe3JldHVybiBlLmFuZ2xlLXQuYW5nbGV9ZnVuY3Rpb24gWHIoKXthbih0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24gV3IodCl7dmFyIGU9dC5QLHI9dC5OO2lmKGUmJnIpe3ZhciBuPWUuc2l0ZSxpPXQuc2l0ZSxhPXIuc2l0ZTtpZihuIT09YSl7dmFyIG89aS54LHM9aS55LGw9bi54LW8sdT1uLnktcyxjPWEueC1vLGg9YS55LXMsZj0yKihsKmgtdSpjKTtpZighKGY+PS1qbykpe3ZhciBkPWwqbCt1KnUscD1jKmMraCpoLG09KGgqZC11KnApL2Ysdj0obCpwLWMqZCkvZixoPXYrcyxnPWxsLnBvcCgpfHxuZXcgWHI7Zy5hcmM9dCxnLnNpdGU9aSxnLng9bStvLGcueT1oK01hdGguc3FydChtKm0rdip2KSxnLmN5PWgsdC5jaXJjbGU9Zztmb3IodmFyIHk9bnVsbCxiPW9sLl87YjspaWYoZy55PGIueXx8Zy55PT09Yi55JiZnLng8PWIueCl7aWYoIWIuTCl7eT1iLlA7YnJlYWt9Yj1iLkx9ZWxzZXtpZighYi5SKXt5PWI7YnJlYWt9Yj1iLlJ9b2wuaW5zZXJ0KHksZykseXx8KGFsPWcpfX19fWZ1bmN0aW9uIFpyKHQpe3ZhciBlPXQuY2lyY2xlO2UmJihlLlB8fChhbD1lLk4pLG9sLnJlbW92ZShlKSxsbC5wdXNoKGUpLGFuKGUpLHQuY2lyY2xlPW51bGwpfWZ1bmN0aW9uIEpyKHQpe2Zvcih2YXIgZSxyPXJsLG49cWUodFswXVswXSx0WzBdWzFdLHRbMV1bMF0sdFsxXVsxXSksaT1yLmxlbmd0aDtpLS07KWU9cltpXSwoIUtyKGUsdCl8fCFuKGUpfHx4byhlLmEueC1lLmIueCk8Rm8mJnhvKGUuYS55LWUuYi55KTxGbykmJihlLmE9ZS5iPW51bGwsci5zcGxpY2UoaSwxKSl9ZnVuY3Rpb24gS3IodCxlKXt2YXIgcj10LmI7aWYocilyZXR1cm4hMDt2YXIgbixpLGE9dC5hLG89ZVswXVswXSxzPWVbMV1bMF0sbD1lWzBdWzFdLHU9ZVsxXVsxXSxjPXQubCxoPXQucixmPWMueCxkPWMueSxwPWgueCxtPWgueSx2PShmK3ApLzIsZz0oZCttKS8yO2lmKG09PT1kKXtpZih2PG98fHY+PXMpcmV0dXJuO2lmKGY+cCl7aWYoYSl7aWYoYS55Pj11KXJldHVybn1lbHNlIGE9e3g6dix5Omx9O3I9e3g6dix5OnV9fWVsc2V7aWYoYSl7aWYoYS55PGwpcmV0dXJufWVsc2UgYT17eDp2LHk6dX07cj17eDp2LHk6bH19fWVsc2UgaWYobj0oZi1wKS8obS1kKSxpPWctbip2LG48LTF8fG4+MSlpZihmPnApe2lmKGEpe2lmKGEueT49dSlyZXR1cm59ZWxzZSBhPXt4OihsLWkpL24seTpsfTtyPXt4Oih1LWkpL24seTp1fX1lbHNle2lmKGEpe2lmKGEueTxsKXJldHVybn1lbHNlIGE9e3g6KHUtaSkvbix5OnV9O3I9e3g6KGwtaSkvbix5Omx9fWVsc2UgaWYoZDxtKXtpZihhKXtpZihhLng+PXMpcmV0dXJufWVsc2UgYT17eDpvLHk6bipvK2l9O3I9e3g6cyx5Om4qcytpfX1lbHNle2lmKGEpe2lmKGEueDxvKXJldHVybn1lbHNlIGE9e3g6cyx5Om4qcytpfTtyPXt4Om8seTpuKm8raX19cmV0dXJuIHQuYT1hLHQuYj1yLCEwfWZ1bmN0aW9uIFFyKHQsZSl7dGhpcy5sPXQsdGhpcy5yPWUsdGhpcy5hPXRoaXMuYj1udWxsfWZ1bmN0aW9uICRyKHQsZSxyLG4pe3ZhciBpPW5ldyBRcih0LGUpO3JldHVybiBybC5wdXNoKGkpLHImJmVuKGksdCxlLHIpLG4mJmVuKGksZSx0LG4pLG5sW3QuaV0uZWRnZXMucHVzaChuZXcgcm4oaSx0LGUpKSwKbmxbZS5pXS5lZGdlcy5wdXNoKG5ldyBybihpLGUsdCkpLGl9ZnVuY3Rpb24gdG4odCxlLHIpe3ZhciBuPW5ldyBRcih0LG51bGwpO3JldHVybiBuLmE9ZSxuLmI9cixybC5wdXNoKG4pLG59ZnVuY3Rpb24gZW4odCxlLHIsbil7dC5hfHx0LmI/dC5sPT09cj90LmI9bjp0LmE9bjoodC5hPW4sdC5sPWUsdC5yPXIpfWZ1bmN0aW9uIHJuKHQsZSxyKXt2YXIgbj10LmEsaT10LmI7dGhpcy5lZGdlPXQsdGhpcy5zaXRlPWUsdGhpcy5hbmdsZT1yP01hdGguYXRhbjIoci55LWUueSxyLngtZS54KTp0Lmw9PT1lP01hdGguYXRhbjIoaS54LW4ueCxuLnktaS55KTpNYXRoLmF0YW4yKG4ueC1pLngsaS55LW4ueSl9ZnVuY3Rpb24gbm4oKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBhbih0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIG9uKHQsZSl7dmFyIHI9ZSxuPWUuUixpPXIuVTtpP2kuTD09PXI/aS5MPW46aS5SPW46dC5fPW4sbi5VPWksci5VPW4sci5SPW4uTCxyLlImJihyLlIuVT1yKSxuLkw9cn1mdW5jdGlvbiBzbih0LGUpe3ZhciByPWUsbj1lLkwsaT1yLlU7aT9pLkw9PT1yP2kuTD1uOmkuUj1uOnQuXz1uLG4uVT1pLHIuVT1uLHIuTD1uLlIsci5MJiYoci5MLlU9ciksbi5SPXJ9ZnVuY3Rpb24gbG4odCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIHVuKHQsZSl7dmFyIHIsbixpLGE9dC5zb3J0KGNuKS5wb3AoKTtmb3Iocmw9W10sbmw9bmV3IEFycmF5KHQubGVuZ3RoKSxpbD1uZXcgbm4sb2w9bmV3IG5uOzspaWYoaT1hbCxhJiYoIWl8fGEueTxpLnl8fGEueT09PWkueSYmYS54PGkueCkpYS54PT09ciYmYS55PT09bnx8KG5sW2EuaV09bmV3IHFyKGEpLFVyKGEpLHI9YS54LG49YS55KSxhPXQucG9wKCk7ZWxzZXtpZighaSlicmVhaztCcihpLmFyYyl9ZSYmKEpyKGUpLEdyKGUpKTt2YXIgbz17Y2VsbHM6bmwsZWRnZXM6cmx9O3JldHVybiBpbD1vbD1ybD1ubD1udWxsLG99ZnVuY3Rpb24gY24odCxlKXtyZXR1cm4gZS55LXQueXx8ZS54LXQueH1mdW5jdGlvbiBobih0LGUscil7cmV0dXJuKHQueC1yLngpKihlLnktdC55KS0odC54LWUueCkqKHIueS10LnkpfWZ1bmN0aW9uIGZuKHQpe3JldHVybiB0Lnh9ZnVuY3Rpb24gZG4odCl7cmV0dXJuIHQueX1mdW5jdGlvbiBwbigpe3JldHVybntsZWFmOiEwLG5vZGVzOltdLHBvaW50Om51bGwseDpudWxsLHk6bnVsbH19ZnVuY3Rpb24gbW4odCxlLHIsbixpLGEpe2lmKCF0KGUscixuLGksYSkpe3ZhciBvPS41KihyK2kpLHM9LjUqKG4rYSksbD1lLm5vZGVzO2xbMF0mJm1uKHQsbFswXSxyLG4sbyxzKSxsWzFdJiZtbih0LGxbMV0sbyxuLGkscyksbFsyXSYmbW4odCxsWzJdLHIscyxvLGEpLGxbM10mJm1uKHQsbFszXSxvLHMsaSxhKX19ZnVuY3Rpb24gdm4odCxlLHIsbixpLGEsbyl7dmFyIHMsbD0xLzA7cmV0dXJuIGZ1bmN0aW9uIHQodSxjLGgsZixkKXtpZighKGM+YXx8aD5vfHxmPG58fGQ8aSkpe2lmKHA9dS5wb2ludCl7dmFyIHAsbT1lLXUueCx2PXItdS55LGc9bSptK3YqdjtpZihnPGwpe3ZhciB5PU1hdGguc3FydChsPWcpO249ZS15LGk9ci15LGE9ZSt5LG89cit5LHM9cH19Zm9yKHZhciBiPXUubm9kZXMseD0uNSooYytmKSxfPS41KihoK2QpLHc9ZT49eCxNPXI+PV8saz1NPDwxfHcsQT1rKzQ7azxBOysraylpZih1PWJbMyZrXSlzd2l0Y2goMyZrKXtjYXNlIDA6dCh1LGMsaCx4LF8pO2JyZWFrO2Nhc2UgMTp0KHUseCxoLGYsXyk7YnJlYWs7Y2FzZSAyOnQodSxjLF8seCxkKTticmVhaztjYXNlIDM6dCh1LHgsXyxmLGQpfX19KHQsbixpLGEsbyksc31mdW5jdGlvbiBnbih0LGUpe3Q9dW8ucmdiKHQpLGU9dW8ucmdiKGUpO3ZhciByPXQucixuPXQuZyxpPXQuYixhPWUuci1yLG89ZS5nLW4scz1lLmItaTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIiMiK3d0KE1hdGgucm91bmQocithKnQpKSt3dChNYXRoLnJvdW5kKG4rbyp0KSkrd3QoTWF0aC5yb3VuZChpK3MqdCkpfX1mdW5jdGlvbiB5bih0LGUpe3ZhciByLG49e30saT17fTtmb3IociBpbiB0KXIgaW4gZT9uW3JdPV9uKHRbcl0sZVtyXSk6aVtyXT10W3JdO2ZvcihyIGluIGUpciBpbiB0fHwoaVtyXT1lW3JdKTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKHIgaW4gbilpW3JdPW5bcl0odCk7cmV0dXJuIGl9fWZ1bmN0aW9uIGJuKHQsZSl7cmV0dXJuIHQ9K3QsZT0rZSxmdW5jdGlvbihyKXtyZXR1cm4gdCooMS1yKStlKnJ9fWZ1bmN0aW9uIHhuKHQsZSl7dmFyIHIsbixpLGE9Y2wubGFzdEluZGV4PWhsLmxhc3RJbmRleD0wLG89LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsocj1jbC5leGVjKHQpKSYmKG49aGwuZXhlYyhlKSk7KShpPW4uaW5kZXgpPmEmJihpPWUuc2xpY2UoYSxpKSxzW29dP3Nbb10rPWk6c1srK29dPWkpLChyPXJbMF0pPT09KG49blswXSk/c1tvXT9zW29dKz1uOnNbKytvXT1uOihzWysrb109bnVsbCxsLnB1c2goe2k6byx4OmJuKHIsbil9KSksYT1obC5sYXN0SW5kZXg7cmV0dXJuIGE8ZS5sZW5ndGgmJihpPWUuc2xpY2UoYSksc1tvXT9zW29dKz1pOnNbKytvXT1pKSxzLmxlbmd0aDwyP2xbMF0/KGU9bFswXS54LGZ1bmN0aW9uKHQpe3JldHVybiBlKHQpKyIifSk6ZnVuY3Rpb24oKXtyZXR1cm4gZX06KGU9bC5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciByLG49MDtuPGU7KytuKXNbKHI9bFtuXSkuaV09ci54KHQpO3JldHVybiBzLmpvaW4oIiIpfSl9ZnVuY3Rpb24gX24odCxlKXtmb3IodmFyIHIsbj11by5pbnRlcnBvbGF0b3JzLmxlbmd0aDstLW4+PTAmJiEocj11by5pbnRlcnBvbGF0b3JzW25dKHQsZSkpOyk7cmV0dXJuIHJ9ZnVuY3Rpb24gd24odCxlKXt2YXIgcixuPVtdLGk9W10sYT10Lmxlbmd0aCxvPWUubGVuZ3RoLHM9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpO2ZvcihyPTA7cjxzOysrciluLnB1c2goX24odFtyXSxlW3JdKSk7Zm9yKDtyPGE7KytyKWlbcl09dFtyXTtmb3IoO3I8bzsrK3IpaVtyXT1lW3JdO3JldHVybiBmdW5jdGlvbih0KXtmb3Iocj0wO3I8czsrK3IpaVtyXT1uW3JdKHQpO3JldHVybiBpfX1mdW5jdGlvbiBNbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGU8PTA/MDplPj0xPzE6dChlKX19ZnVuY3Rpb24ga24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiAxLXQoMS1lKX19ZnVuY3Rpb24gQW4odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybi41KihlPC41P3QoMiplKToyLXQoMi0yKmUpKX19ZnVuY3Rpb24gVG4odCl7cmV0dXJuIHQqdH1mdW5jdGlvbiBTbih0KXtyZXR1cm4gdCp0KnR9ZnVuY3Rpb24gRW4odCl7aWYodDw9MClyZXR1cm4gMDtpZih0Pj0xKXJldHVybiAxO3ZhciBlPXQqdCxyPWUqdDtyZXR1cm4gNCoodDwuNT9yOjMqKHQtZSkrci0uNzUpfWZ1bmN0aW9uIExuKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3coZSx0KX19ZnVuY3Rpb24gQ24odCl7cmV0dXJuIDEtTWF0aC5jb3ModCpWbyl9ZnVuY3Rpb24gem4odCl7cmV0dXJuIE1hdGgucG93KDIsMTAqKHQtMSkpfWZ1bmN0aW9uIEluKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9ZnVuY3Rpb24gRG4odCxlKXt2YXIgcjtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYoZT0uNDUpLGFyZ3VtZW50cy5sZW5ndGg/cj1lL0JvKk1hdGguYXNpbigxL3QpOih0PTEscj1lLzQpLGZ1bmN0aW9uKG4pe3JldHVybiAxK3QqTWF0aC5wb3coMiwtMTAqbikqTWF0aC5zaW4oKG4tcikqQm8vZSl9fWZ1bmN0aW9uIFBuKHQpe3JldHVybiB0fHwodD0xLjcwMTU4KSxmdW5jdGlvbihlKXtyZXR1cm4gZSplKigodCsxKSplLXQpfX1mdW5jdGlvbiBPbih0KXtyZXR1cm4gdDwxLzIuNzU/Ny41NjI1KnQqdDp0PDIvMi43NT83LjU2MjUqKHQtPTEuNS8yLjc1KSp0Ky43NTp0PDIuNS8yLjc1PzcuNTYyNSoodC09Mi4yNS8yLjc1KSp0Ky45Mzc1OjcuNTYyNSoodC09Mi42MjUvMi43NSkqdCsuOTg0Mzc1fWZ1bmN0aW9uIFJuKHQsZSl7dD11by5oY2wodCksZT11by5oY2woZSk7dmFyIHI9dC5oLG49dC5jLGk9dC5sLGE9ZS5oLXIsbz1lLmMtbixzPWUubC1pO3JldHVybiBpc05hTihvKSYmKG89MCxuPWlzTmFOKG4pP2UuYzpuKSxpc05hTihhKT8oYT0wLHI9aXNOYU4ocik/ZS5oOnIpOmE+MTgwP2EtPTM2MDphPC0xODAmJihhKz0zNjApLGZ1bmN0aW9uKHQpe3JldHVybiBmdChyK2EqdCxuK28qdCxpK3MqdCkrIiJ9fWZ1bmN0aW9uIEZuKHQsZSl7dD11by5oc2wodCksZT11by5oc2woZSk7dmFyIHI9dC5oLG49dC5zLGk9dC5sLGE9ZS5oLXIsbz1lLnMtbixzPWUubC1pO3JldHVybiBpc05hTihvKSYmKG89MCxuPWlzTmFOKG4pP2UuczpuKSxpc05hTihhKT8oYT0wLHI9aXNOYU4ocik/ZS5oOnIpOmE+MTgwP2EtPTM2MDphPC0xODAmJihhKz0zNjApLGZ1bmN0aW9uKHQpe3JldHVybiBjdChyK2EqdCxuK28qdCxpK3MqdCkrIiJ9fWZ1bmN0aW9uIGpuKHQsZSl7dD11by5sYWIodCksZT11by5sYWIoZSk7dmFyIHI9dC5sLG49dC5hLGk9dC5iLGE9ZS5sLXIsbz1lLmEtbixzPWUuYi1pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gcHQocithKnQsbitvKnQsaStzKnQpKyIifX1mdW5jdGlvbiBObih0LGUpe3JldHVybiBlLT10LGZ1bmN0aW9uKHIpe3JldHVybiBNYXRoLnJvdW5kKHQrZSpyKX19ZnVuY3Rpb24gQm4odCl7dmFyIGU9W3QuYSx0LmJdLHI9W3QuYyx0LmRdLG49Vm4oZSksaT1VbihlLHIpLGE9Vm4oSG4ocixlLC1pKSl8fDA7ZVswXSpyWzFdPHJbMF0qZVsxXSYmKGVbMF0qPS0xLGVbMV0qPS0xLG4qPS0xLGkqPS0xKSx0aGlzLnJvdGF0ZT0obj9NYXRoLmF0YW4yKGVbMV0sZVswXSk6TWF0aC5hdGFuMigtclswXSxyWzFdKSkqcW8sdGhpcy50cmFuc2xhdGU9W3QuZSx0LmZdLHRoaXMuc2NhbGU9W24sYV0sdGhpcy5za2V3PWE/TWF0aC5hdGFuMihpLGEpKnFvOjB9ZnVuY3Rpb24gVW4odCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXX1mdW5jdGlvbiBWbih0KXt2YXIgZT1NYXRoLnNxcnQoVW4odCx0KSk7cmV0dXJuIGUmJih0WzBdLz1lLHRbMV0vPWUpLGV9ZnVuY3Rpb24gSG4odCxlLHIpe3JldHVybiB0WzBdKz1yKmVbMF0sdFsxXSs9ciplWzFdLHR9ZnVuY3Rpb24gcW4odCl7cmV0dXJuIHQubGVuZ3RoP3QucG9wKCkrIiwiOiIifWZ1bmN0aW9uIEduKHQsZSxyLG4pe2lmKHRbMF0hPT1lWzBdfHx0WzFdIT09ZVsxXSl7dmFyIGk9ci5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLCIsIixudWxsLCIpIik7bi5wdXNoKHtpOmktNCx4OmJuKHRbMF0sZVswXSl9LHtpOmktMix4OmJuKHRbMV0sZVsxXSl9KX1lbHNlKGVbMF18fGVbMV0pJiZyLnB1c2goInRyYW5zbGF0ZSgiK2UrIikiKX1mdW5jdGlvbiBZbih0LGUscixuKXt0IT09ZT8odC1lPjE4MD9lKz0zNjA6ZS10PjE4MCYmKHQrPTM2MCksbi5wdXNoKHtpOnIucHVzaChxbihyKSsicm90YXRlKCIsbnVsbCwiKSIpLTIseDpibih0LGUpfSkpOmUmJnIucHVzaChxbihyKSsicm90YXRlKCIrZSsiKSIpfWZ1bmN0aW9uIFhuKHQsZSxyLG4pe3QhPT1lP24ucHVzaCh7aTpyLnB1c2gocW4ocikrInNrZXdYKCIsbnVsbCwiKSIpLTIseDpibih0LGUpfSk6ZSYmci5wdXNoKHFuKHIpKyJza2V3WCgiK2UrIikiKX1mdW5jdGlvbiBXbih0LGUscixuKXtpZih0WzBdIT09ZVswXXx8dFsxXSE9PWVbMV0pe3ZhciBpPXIucHVzaChxbihyKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIik7bi5wdXNoKHtpOmktNCx4OmJuKHRbMF0sZVswXSl9LHtpOmktMix4OmJuKHRbMV0sZVsxXSl9KX1lbHNlIDE9PT1lWzBdJiYxPT09ZVsxXXx8ci5wdXNoKHFuKHIpKyJzY2FsZSgiK2UrIikiKX1mdW5jdGlvbiBabih0LGUpe3ZhciByPVtdLG49W107cmV0dXJuIHQ9dW8udHJhbnNmb3JtKHQpLGU9dW8udHJhbnNmb3JtKGUpLEduKHQudHJhbnNsYXRlLGUudHJhbnNsYXRlLHIsbiksWW4odC5yb3RhdGUsZS5yb3RhdGUscixuKSxYbih0LnNrZXcsZS5za2V3LHIsbiksV24odC5zY2FsZSxlLnNjYWxlLHIsbiksdD1lPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBlLGk9LTEsYT1uLmxlbmd0aDsrK2k8YTspclsoZT1uW2ldKS5pXT1lLngodCk7cmV0dXJuIHIuam9pbigiIil9fWZ1bmN0aW9uIEpuKHQsZSl7cmV0dXJuIGU9KGUtPXQ9K3QpfHwxL2UsZnVuY3Rpb24ocil7cmV0dXJuKHItdCkvZX19ZnVuY3Rpb24gS24odCxlKXtyZXR1cm4gZT0oZS09dD0rdCl8fDEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigxLChyLXQpL2UpKX19ZnVuY3Rpb24gUW4odCl7Zm9yKHZhciBlPXQuc291cmNlLHI9dC50YXJnZXQsbj10aShlLHIpLGk9W2VdO2UhPT1uOyllPWUucGFyZW50LGkucHVzaChlKTtmb3IodmFyIGE9aS5sZW5ndGg7ciE9PW47KWkuc3BsaWNlKGEsMCxyKSxyPXIucGFyZW50O3JldHVybiBpfWZ1bmN0aW9uICRuKHQpe2Zvcih2YXIgZT1bXSxyPXQucGFyZW50O251bGwhPXI7KWUucHVzaCh0KSx0PXIscj1yLnBhcmVudDtyZXR1cm4gZS5wdXNoKHQpLGV9ZnVuY3Rpb24gdGkodCxlKXtpZih0PT09ZSlyZXR1cm4gdDtmb3IodmFyIHI9JG4odCksbj0kbihlKSxpPXIucG9wKCksYT1uLnBvcCgpLG89bnVsbDtpPT09YTspbz1pLGk9ci5wb3AoKSxhPW4ucG9wKCk7cmV0dXJuIG99ZnVuY3Rpb24gZWkodCl7dC5maXhlZHw9Mn1mdW5jdGlvbiByaSh0KXt0LmZpeGVkJj0tN31mdW5jdGlvbiBuaSh0KXt0LmZpeGVkfD00LHQucHg9dC54LHQucHk9dC55fWZ1bmN0aW9uIGlpKHQpe3QuZml4ZWQmPS01fWZ1bmN0aW9uIGFpKHQsZSxyKXt2YXIgbj0wLGk9MDtpZih0LmNoYXJnZT0wLCF0LmxlYWYpZm9yKHZhciBhLG89dC5ub2RlcyxzPW8ubGVuZ3RoLGw9LTE7KytsPHM7KW51bGwhPShhPW9bbF0pJiYoYWkoYSxlLHIpLHQuY2hhcmdlKz1hLmNoYXJnZSxuKz1hLmNoYXJnZSphLmN4LGkrPWEuY2hhcmdlKmEuY3kpO2lmKHQucG9pbnQpe3QubGVhZnx8KHQucG9pbnQueCs9TWF0aC5yYW5kb20oKS0uNSx0LnBvaW50LnkrPU1hdGgucmFuZG9tKCktLjUpO3ZhciB1PWUqclt0LnBvaW50LmluZGV4XTt0LmNoYXJnZSs9dC5wb2ludENoYXJnZT11LG4rPXUqdC5wb2ludC54LGkrPXUqdC5wb2ludC55fXQuY3g9bi90LmNoYXJnZSx0LmN5PWkvdC5jaGFyZ2V9ZnVuY3Rpb24gb2kodCxlKXtyZXR1cm4gdW8ucmViaW5kKHQsZSwic29ydCIsImNoaWxkcmVuIiwidmFsdWUiKSx0Lm5vZGVzPXQsdC5saW5rcz1maSx0fWZ1bmN0aW9uIHNpKHQsZSl7Zm9yKHZhciByPVt0XTtudWxsIT0odD1yLnBvcCgpKTspaWYoZSh0KSwoaT10LmNoaWxkcmVuKSYmKG49aS5sZW5ndGgpKWZvcih2YXIgbixpOy0tbj49MDspci5wdXNoKGlbbl0pfWZ1bmN0aW9uIGxpKHQsZSl7Zm9yKHZhciByPVt0XSxuPVtdO251bGwhPSh0PXIucG9wKCkpOylpZihuLnB1c2godCksKGE9dC5jaGlsZHJlbikmJihpPWEubGVuZ3RoKSlmb3IodmFyIGksYSxvPS0xOysrbzxpOylyLnB1c2goYVtvXSk7Zm9yKDtudWxsIT0odD1uLnBvcCgpKTspZSh0KX1mdW5jdGlvbiB1aSh0KXtyZXR1cm4gdC5jaGlsZHJlbn1mdW5jdGlvbiBjaSh0KXtyZXR1cm4gdC52YWx1ZX1mdW5jdGlvbiBoaSh0LGUpe3JldHVybiBlLnZhbHVlLXQudmFsdWV9ZnVuY3Rpb24gZmkodCl7cmV0dXJuIHVvLm1lcmdlKHQubWFwKGZ1bmN0aW9uKHQpe3JldHVybih0LmNoaWxkcmVufHxbXSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybntzb3VyY2U6dCx0YXJnZXQ6ZX19KX0pKX1mdW5jdGlvbiBkaSh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIHBpKHQpe3JldHVybiB0Lnl9ZnVuY3Rpb24gbWkodCxlLHIpe3QueTA9ZSx0Lnk9cn1mdW5jdGlvbiB2aSh0KXtyZXR1cm4gdW8ucmFuZ2UodC5sZW5ndGgpfWZ1bmN0aW9uIGdpKHQpe2Zvcih2YXIgZT0tMSxyPXRbMF0ubGVuZ3RoLG49W107KytlPHI7KW5bZV09MDtyZXR1cm4gbn1mdW5jdGlvbiB5aSh0KXtmb3IodmFyIGUscj0xLG49MCxpPXRbMF1bMV0sYT10Lmxlbmd0aDtyPGE7KytyKShlPXRbcl1bMV0pPmkmJihuPXIsaT1lKTtyZXR1cm4gbn1mdW5jdGlvbiBiaSh0KXtyZXR1cm4gdC5yZWR1Y2UoeGksMCl9ZnVuY3Rpb24geGkodCxlKXtyZXR1cm4gdCtlWzFdfWZ1bmN0aW9uIF9pKHQsZSl7cmV0dXJuIHdpKHQsTWF0aC5jZWlsKE1hdGgubG9nKGUubGVuZ3RoKS9NYXRoLkxOMisxKSl9ZnVuY3Rpb24gd2kodCxlKXtmb3IodmFyIHI9LTEsbj0rdFswXSxpPSh0WzFdLW4pL2UsYT1bXTsrK3I8PWU7KWFbcl09aSpyK247cmV0dXJuIGF9ZnVuY3Rpb24gTWkodCl7cmV0dXJuW3VvLm1pbih0KSx1by5tYXgodCldfWZ1bmN0aW9uIGtpKHQsZSl7cmV0dXJuIHQudmFsdWUtZS52YWx1ZX1mdW5jdGlvbiBBaSh0LGUpe3ZhciByPXQuX3BhY2tfbmV4dDt0Ll9wYWNrX25leHQ9ZSxlLl9wYWNrX3ByZXY9dCxlLl9wYWNrX25leHQ9cixyLl9wYWNrX3ByZXY9ZX1mdW5jdGlvbiBUaSh0LGUpe3QuX3BhY2tfbmV4dD1lLGUuX3BhY2tfcHJldj10fWZ1bmN0aW9uIFNpKHQsZSl7dmFyIHI9ZS54LXQueCxuPWUueS10LnksaT10LnIrZS5yO3JldHVybi45OTkqaSppPnIqcituKm59ZnVuY3Rpb24gRWkodCl7ZnVuY3Rpb24gZSh0KXtjPU1hdGgubWluKHQueC10LnIsYyksaD1NYXRoLm1heCh0LngrdC5yLGgpLGY9TWF0aC5taW4odC55LXQucixmKSxkPU1hdGgubWF4KHQueSt0LnIsZCl9aWYoKHI9dC5jaGlsZHJlbikmJih1PXIubGVuZ3RoKSl7dmFyIHIsbixpLGEsbyxzLGwsdSxjPTEvMCxoPS0xLzAsZj0xLzAsZD0tMS8wO2lmKHIuZm9yRWFjaChMaSksbj1yWzBdLG4ueD0tbi5yLG4ueT0wLGUobiksdT4xJiYoaT1yWzFdLGkueD1pLnIsaS55PTAsZShpKSx1PjIpKWZvcihhPXJbMl0sSWkobixpLGEpLGUoYSksQWkobixhKSxuLl9wYWNrX3ByZXY9YSxBaShhLGkpLGk9bi5fcGFja19uZXh0LG89MztvPHU7bysrKXtJaShuLGksYT1yW29dKTt2YXIgcD0wLG09MSx2PTE7Zm9yKHM9aS5fcGFja19uZXh0O3MhPT1pO3M9cy5fcGFja19uZXh0LG0rKylpZihTaShzLGEpKXtwPTE7YnJlYWt9aWYoMT09cClmb3IobD1uLl9wYWNrX3ByZXY7bCE9PXMuX3BhY2tfcHJldiYmIVNpKGwsYSk7bD1sLl9wYWNrX3ByZXYsdisrKTtwPyhtPHZ8fG09PXYmJmkucjxuLnI/VGkobixpPXMpOlRpKG49bCxpKSxvLS0pOihBaShuLGEpLGk9YSxlKGEpKX12YXIgZz0oYytoKS8yLHk9KGYrZCkvMixiPTA7Zm9yKG89MDtvPHU7bysrKWE9cltvXSxhLngtPWcsYS55LT15LGI9TWF0aC5tYXgoYixhLnIrTWF0aC5zcXJ0KGEueCphLngrYS55KmEueSkpO3Qucj1iLHIuZm9yRWFjaChDaSl9fWZ1bmN0aW9uIExpKHQpe3QuX3BhY2tfbmV4dD10Ll9wYWNrX3ByZXY9dH1mdW5jdGlvbiBDaSh0KXtkZWxldGUgdC5fcGFja19uZXh0LGRlbGV0ZSB0Ll9wYWNrX3ByZXZ9ZnVuY3Rpb24gemkodCxlLHIsbil7dmFyIGk9dC5jaGlsZHJlbjtpZih0Lng9ZSs9bip0LngsdC55PXIrPW4qdC55LHQucio9bixpKWZvcih2YXIgYT0tMSxvPWkubGVuZ3RoOysrYTxvOyl6aShpW2FdLGUscixuKX1mdW5jdGlvbiBJaSh0LGUscil7dmFyIG49dC5yK3IucixpPWUueC10LngsYT1lLnktdC55O2lmKG4mJihpfHxhKSl7dmFyIG89ZS5yK3IucixzPWkqaSthKmE7byo9byxuKj1uO3ZhciBsPS41KyhuLW8pLygyKnMpLHU9TWF0aC5zcXJ0KE1hdGgubWF4KDAsMipvKihuK3MpLShuLT1zKSpuLW8qbykpLygyKnMpO3IueD10LngrbCppK3UqYSxyLnk9dC55K2wqYS11Kml9ZWxzZSByLng9dC54K24sci55PXQueX1mdW5jdGlvbiBEaSh0LGUpe3JldHVybiB0LnBhcmVudD09ZS5wYXJlbnQ/MToyfWZ1bmN0aW9uIFBpKHQpe3ZhciBlPXQuY2hpbGRyZW47cmV0dXJuIGUubGVuZ3RoP2VbMF06dC50fWZ1bmN0aW9uIE9pKHQpe3ZhciBlLHI9dC5jaGlsZHJlbjtyZXR1cm4oZT1yLmxlbmd0aCk/cltlLTFdOnQudH1mdW5jdGlvbiBSaSh0LGUscil7dmFyIG49ci8oZS5pLXQuaSk7ZS5jLT1uLGUucys9cix0LmMrPW4sZS56Kz1yLGUubSs9cn1mdW5jdGlvbiBGaSh0KXtmb3IodmFyIGUscj0wLG49MCxpPXQuY2hpbGRyZW4sYT1pLmxlbmd0aDstLWE+PTA7KWU9aVthXSxlLnorPXIsZS5tKz1yLHIrPWUucysobis9ZS5jKX1mdW5jdGlvbiBqaSh0LGUscil7cmV0dXJuIHQuYS5wYXJlbnQ9PT1lLnBhcmVudD90LmE6cn1mdW5jdGlvbiBOaSh0KXtyZXR1cm4gMSt1by5tYXgodCxmdW5jdGlvbih0KXtyZXR1cm4gdC55fSl9ZnVuY3Rpb24gQmkodCl7cmV0dXJuIHQucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZS54fSwwKS90Lmxlbmd0aH1mdW5jdGlvbiBVaSh0KXt2YXIgZT10LmNoaWxkcmVuO3JldHVybiBlJiZlLmxlbmd0aD9VaShlWzBdKTp0fWZ1bmN0aW9uIFZpKHQpe3ZhciBlLHI9dC5jaGlsZHJlbjtyZXR1cm4gciYmKGU9ci5sZW5ndGgpP1ZpKHJbZS0xXSk6dH1mdW5jdGlvbiBIaSh0KXtyZXR1cm57eDp0LngseTp0LnksZHg6dC5keCxkeTp0LmR5fX1mdW5jdGlvbiBxaSh0LGUpe3ZhciByPXQueCtlWzNdLG49dC55K2VbMF0saT10LmR4LWVbMV0tZVszXSxhPXQuZHktZVswXS1lWzJdO3JldHVybiBpPDAmJihyKz1pLzIsaT0wKSxhPDAmJihuKz1hLzIsYT0wKSx7eDpyLHk6bixkeDppLGR5OmF9fWZ1bmN0aW9uIEdpKHQpe3ZhciBlPXRbMF0scj10W3QubGVuZ3RoLTFdO3JldHVybiBlPHI/W2Uscl06W3IsZV19ZnVuY3Rpb24gWWkodCl7cmV0dXJuIHQucmFuZ2VFeHRlbnQ/dC5yYW5nZUV4dGVudCgpOkdpKHQucmFuZ2UoKSl9ZnVuY3Rpb24gWGkodCxlLHIsbil7dmFyIGk9cih0WzBdLHRbMV0pLGE9bihlWzBdLGVbMV0pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gYShpKHQpKX19ZnVuY3Rpb24gV2kodCxlKXt2YXIgcixuPTAsaT10Lmxlbmd0aC0xLGE9dFtuXSxvPXRbaV07cmV0dXJuIG88YSYmKHI9bixuPWksaT1yLHI9YSxhPW8sbz1yKSx0W25dPWUuZmxvb3IoYSksdFtpXT1lLmNlaWwobyksdH1mdW5jdGlvbiBaaSh0KXtyZXR1cm4gdD97Zmxvb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguZmxvb3IoZS90KSp0fSxjZWlsOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmNlaWwoZS90KSp0fX06d2x9ZnVuY3Rpb24gSmkodCxlLHIsbil7dmFyIGk9W10sYT1bXSxvPTAscz1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCktMTtmb3IodFtzXTx0WzBdJiYodD10LnNsaWNlKCkucmV2ZXJzZSgpLGU9ZS5zbGljZSgpLnJldmVyc2UoKSk7KytvPD1zOylpLnB1c2gocih0W28tMV0sdFtvXSkpLGEucHVzaChuKGVbby0xXSxlW29dKSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPXVvLmJpc2VjdCh0LGUsMSxzKS0xO3JldHVybiBhW3JdKGlbcl0oZSkpfX1mdW5jdGlvbiBLaSh0LGUscixuKXtmdW5jdGlvbiBpKCl7dmFyIGk9TWF0aC5taW4odC5sZW5ndGgsZS5sZW5ndGgpPjI/Smk6WGksbD1uP0tuOkpuO3JldHVybiBvPWkodCxlLGwscikscz1pKGUsdCxsLF9uKSxhfWZ1bmN0aW9uIGEodCl7cmV0dXJuIG8odCl9dmFyIG8scztyZXR1cm4gYS5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHModCl9LGEuZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUubWFwKE51bWJlciksaSgpKTp0fSxhLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsaSgpKTplfSxhLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGEucmFuZ2UodCkuaW50ZXJwb2xhdGUoTm4pfSxhLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsaSgpKTpufSxhLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsaSgpKTpyfSxhLnRpY2tzPWZ1bmN0aW9uKGUpe3JldHVybiBlYSh0LGUpfSxhLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gcmEodCxlLHIpfSxhLm5pY2U9ZnVuY3Rpb24oZSl7cmV0dXJuICRpKHQsZSksaSgpfSxhLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gS2kodCxlLHIsbil9LGkoKX1mdW5jdGlvbiBRaSh0LGUpe3JldHVybiB1by5yZWJpbmQodCxlLCJyYW5nZSIsInJhbmdlUm91bmQiLCJpbnRlcnBvbGF0ZSIsImNsYW1wIil9ZnVuY3Rpb24gJGkodCxlKXtyZXR1cm4gV2kodCxaaSh0YSh0LGUpWzJdKSksV2kodCxaaSh0YSh0LGUpWzJdKSksdH1mdW5jdGlvbiB0YSh0LGUpe251bGw9PWUmJihlPTEwKTt2YXIgcj1HaSh0KSxuPXJbMV0tclswXSxpPU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2cobi9lKS9NYXRoLkxOMTApKSxhPWUvbippO3JldHVybiBhPD0uMTU/aSo9MTA6YTw9LjM1P2kqPTU6YTw9Ljc1JiYoaSo9MiksclswXT1NYXRoLmNlaWwoclswXS9pKSppLHJbMV09TWF0aC5mbG9vcihyWzFdL2kpKmkrLjUqaSxyWzJdPWkscn1mdW5jdGlvbiBlYSh0LGUpe3JldHVybiB1by5yYW5nZS5hcHBseSh1byx0YSh0LGUpKX1mdW5jdGlvbiByYSh0LGUscil7dmFyIG49dGEodCxlKTtpZihyKXt2YXIgaT1jcy5leGVjKHIpO2lmKGkuc2hpZnQoKSwicyI9PT1pWzhdKXt2YXIgYT11by5mb3JtYXRQcmVmaXgoTWF0aC5tYXgoeG8oblswXSkseG8oblsxXSkpKTtyZXR1cm4gaVs3XXx8KGlbN109Ii4iK25hKGEuc2NhbGUoblsyXSkpKSxpWzhdPSJmIixyPXVvLmZvcm1hdChpLmpvaW4oIiIpKSxmdW5jdGlvbih0KXtyZXR1cm4gcihhLnNjYWxlKHQpKSthLnN5bWJvbH19aVs3XXx8KGlbN109Ii4iK2lhKGlbOF0sbikpLHI9aS5qb2luKCIiKX1lbHNlIHI9IiwuIituYShuWzJdKSsiZiI7cmV0dXJuIHVvLmZvcm1hdChyKX1mdW5jdGlvbiBuYSh0KXtyZXR1cm4tTWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMTArLjAxKX1mdW5jdGlvbiBpYSh0LGUpe3ZhciByPW5hKGVbMl0pO3JldHVybiB0IGluIE1sP01hdGguYWJzKHItbmEoTWF0aC5tYXgoeG8oZVswXSkseG8oZVsxXSkpKSkrICsoImUiIT09dCk6ci0yKigiJSI9PT10KX1mdW5jdGlvbiBhYSh0LGUscixuKXtmdW5jdGlvbiBpKHQpe3JldHVybihyP01hdGgubG9nKHQ8MD8wOnQpOi1NYXRoLmxvZyh0PjA/MDotdCkpL01hdGgubG9nKGUpfWZ1bmN0aW9uIGEodCl7cmV0dXJuIHI/TWF0aC5wb3coZSx0KTotTWF0aC5wb3coZSwtdCl9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gdChpKGUpKX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGEodC5pbnZlcnQoZSkpfSxvLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lWzBdPj0wLHQuZG9tYWluKChuPWUubWFwKE51bWJlcikpLm1hcChpKSksbyk6bn0sby5iYXNlPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPStyLHQuZG9tYWluKG4ubWFwKGkpKSxvKTplfSxvLm5pY2U9ZnVuY3Rpb24oKXt2YXIgZT1XaShuLm1hcChpKSxyP01hdGg6QWwpO3JldHVybiB0LmRvbWFpbihlKSxuPWUubWFwKGEpLG99LG8udGlja3M9ZnVuY3Rpb24oKXt2YXIgdD1HaShuKSxvPVtdLHM9dFswXSxsPXRbMV0sdT1NYXRoLmZsb29yKGkocykpLGM9TWF0aC5jZWlsKGkobCkpLGg9ZSUxPzI6ZTtpZihpc0Zpbml0ZShjLXUpKXtpZihyKXtmb3IoO3U8Yzt1KyspZm9yKHZhciBmPTE7ZjxoO2YrKylvLnB1c2goYSh1KSpmKTtvLnB1c2goYSh1KSl9ZWxzZSBmb3Ioby5wdXNoKGEodSkpO3UrKzxjOylmb3IodmFyIGY9aC0xO2Y+MDtmLS0pby5wdXNoKGEodSkqZik7Zm9yKHU9MDtvW3VdPHM7dSsrKTtmb3IoYz1vLmxlbmd0aDtvW2MtMV0+bDtjLS0pO289by5zbGljZSh1LGMpfXJldHVybiBvfSxvLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxyKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4ga2w7YXJndW1lbnRzLmxlbmd0aDwyP3I9a2w6ImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPXVvLmZvcm1hdChyKSk7dmFyIG49TWF0aC5tYXgoMSxlKnQvby50aWNrcygpLmxlbmd0aCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBvPXQvYShNYXRoLnJvdW5kKGkodCkpKTtyZXR1cm4gbyplPGUtLjUmJihvKj1lKSxvPD1uP3IodCk6IiJ9fSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gYWEodC5jb3B5KCksZSxyLG4pfSxRaShvLHQpfWZ1bmN0aW9uIG9hKHQsZSxyKXtmdW5jdGlvbiBuKGUpe3JldHVybiB0KGkoZSkpfXZhciBpPXNhKGUpLGE9c2EoMS9lKTtyZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGEodC5pbnZlcnQoZSkpfSxuLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odC5kb21haW4oKHI9ZS5tYXAoTnVtYmVyKSkubWFwKGkpKSxuKTpyfSxuLnRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBlYShyLHQpfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcmEocix0LGUpfSxuLm5pY2U9ZnVuY3Rpb24odCl7cmV0dXJuIG4uZG9tYWluKCRpKHIsdCkpfSxuLmV4cG9uZW50PWZ1bmN0aW9uKG8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXNhKGU9byksYT1zYSgxL2UpLHQuZG9tYWluKHIubWFwKGkpKSxuKTplfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gb2EodC5jb3B5KCksZSxyKX0sUWkobix0KX1mdW5jdGlvbiBzYSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGU8MD8tTWF0aC5wb3coLWUsdCk6TWF0aC5wb3coZSx0KX19ZnVuY3Rpb24gbGEodCxlKXtmdW5jdGlvbiByKHIpe3JldHVybiBhWygoaS5nZXQocil8fCgicmFuZ2UiPT09ZS50P2kuc2V0KHIsdC5wdXNoKHIpKTpOYU4pKS0xKSVhLmxlbmd0aF19ZnVuY3Rpb24gbihlLHIpe3JldHVybiB1by5yYW5nZSh0Lmxlbmd0aCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBlK3IqdH0pfXZhciBpLGEsbztyZXR1cm4gci5kb21haW49ZnVuY3Rpb24obil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHQ7dD1bXSxpPW5ldyBoO2Zvcih2YXIgYSxvPS0xLHM9bi5sZW5ndGg7KytvPHM7KWkuaGFzKGE9bltvXSl8fGkuc2V0KGEsdC5wdXNoKGEpKTtyZXR1cm4gcltlLnRdLmFwcGx5KHIsZS5hKX0sci5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10LG89MCxlPXt0OiJyYW5nZSIsYTphcmd1bWVudHN9LHIpOmF9LHIucmFuZ2VQb2ludHM9ZnVuY3Rpb24oaSxzKXthcmd1bWVudHMubGVuZ3RoPDImJihzPTApO3ZhciBsPWlbMF0sdT1pWzFdLGM9dC5sZW5ndGg8Mj8obD0obCt1KS8yLDApOih1LWwpLyh0Lmxlbmd0aC0xK3MpO3JldHVybiBhPW4obCtjKnMvMixjKSxvPTAsZT17dDoicmFuZ2VQb2ludHMiLGE6YXJndW1lbnRzfSxyfSxyLnJhbmdlUm91bmRQb2ludHM9ZnVuY3Rpb24oaSxzKXthcmd1bWVudHMubGVuZ3RoPDImJihzPTApO3ZhciBsPWlbMF0sdT1pWzFdLGM9dC5sZW5ndGg8Mj8obD11PU1hdGgucm91bmQoKGwrdSkvMiksMCk6KHUtbCkvKHQubGVuZ3RoLTErcyl8MDtyZXR1cm4gYT1uKGwrTWF0aC5yb3VuZChjKnMvMisodS1sLSh0Lmxlbmd0aC0xK3MpKmMpLzIpLGMpLG89MCxlPXt0OiJyYW5nZVJvdW5kUG9pbnRzIixhOmFyZ3VtZW50c30scn0sci5yYW5nZUJhbmRzPWZ1bmN0aW9uKGkscyxsKXthcmd1bWVudHMubGVuZ3RoPDImJihzPTApLGFyZ3VtZW50cy5sZW5ndGg8MyYmKGw9cyk7dmFyIHU9aVsxXTxpWzBdLGM9aVt1LTBdLGg9aVsxLXVdLGY9KGgtYykvKHQubGVuZ3RoLXMrMipsKTtyZXR1cm4gYT1uKGMrZipsLGYpLHUmJmEucmV2ZXJzZSgpLG89ZiooMS1zKSxlPXt0OiJyYW5nZUJhbmRzIixhOmFyZ3VtZW50c30scn0sci5yYW5nZVJvdW5kQmFuZHM9ZnVuY3Rpb24oaSxzLGwpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKHM9MCksYXJndW1lbnRzLmxlbmd0aDwzJiYobD1zKTt2YXIgdT1pWzFdPGlbMF0sYz1pW3UtMF0saD1pWzEtdV0sZj1NYXRoLmZsb29yKChoLWMpLyh0Lmxlbmd0aC1zKzIqbCkpO3JldHVybiBhPW4oYytNYXRoLnJvdW5kKChoLWMtKHQubGVuZ3RoLXMpKmYpLzIpLGYpLHUmJmEucmV2ZXJzZSgpLG89TWF0aC5yb3VuZChmKigxLXMpKSxlPXt0OiJyYW5nZVJvdW5kQmFuZHMiLGE6YXJndW1lbnRzfSxyfSxyLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiBvfSxyLnJhbmdlRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIEdpKGUuYVswXSl9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBsYSh0LGUpfSxyLmRvbWFpbih0KX1mdW5jdGlvbiB1YSh0LGUpe2Z1bmN0aW9uIHIoKXt2YXIgcj0wLGk9ZS5sZW5ndGg7Zm9yKHM9W107KytyPGk7KXNbci0xXT11by5xdWFudGlsZSh0LHIvaSk7cmV0dXJuIG59ZnVuY3Rpb24gbih0KXtpZighaXNOYU4odD0rdCkpcmV0dXJuIGVbdW8uYmlzZWN0KHMsdCldfXZhciBzO3JldHVybiBuLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLm1hcChhKS5maWx0ZXIobykuc29ydChpKSxyKCkpOnR9LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxyKCkpOmV9LG4ucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIHN9LG4uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHIpe3JldHVybiByPWUuaW5kZXhPZihyKSxyPDA/W05hTixOYU5dOltyPjA/c1tyLTFdOnRbMF0scjxzLmxlbmd0aD9zW3JdOnRbdC5sZW5ndGgtMV1dfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdWEodCxlKX0scigpfWZ1bmN0aW9uIGNhKHQsZSxyKXtmdW5jdGlvbiBuKGUpe3JldHVybiByW01hdGgubWF4KDAsTWF0aC5taW4obyxNYXRoLmZsb29yKGEqKGUtdCkpKSldfWZ1bmN0aW9uIGkoKXtyZXR1cm4gYT1yLmxlbmd0aC8oZS10KSxvPXIubGVuZ3RoLTEsbn12YXIgYSxvO3JldHVybiBuLmRvbWFpbj1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rclswXSxlPStyW3IubGVuZ3RoLTFdLGkoKSk6W3QsZV19LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxpKCkpOnJ9LG4uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlPXIuaW5kZXhPZihlKSxlPWU8MD9OYU46ZS9hK3QsW2UsZSsxL2FdfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gY2EodCxlLHIpfSxpKCl9ZnVuY3Rpb24gaGEodCxlKXtmdW5jdGlvbiByKHIpe2lmKHI8PXIpcmV0dXJuIGVbdW8uYmlzZWN0KHQscildfXJldHVybiByLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLHIpOnR9LHIucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxyKTplfSxyLmludmVydEV4dGVudD1mdW5jdGlvbihyKXtyZXR1cm4gcj1lLmluZGV4T2YociksW3Rbci0xXSx0W3JdXX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGhhKHQsZSl9LHJ9ZnVuY3Rpb24gZmEodCl7ZnVuY3Rpb24gZSh0KXtyZXR1cm4rdH1yZXR1cm4gZS5pbnZlcnQ9ZSxlLmRvbWFpbj1lLnJhbmdlPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PXIubWFwKGUpLGUpOnR9LGUudGlja3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGVhKHQsZSl9LGUudGlja0Zvcm1hdD1mdW5jdGlvbihlLHIpe3JldHVybiByYSh0LGUscil9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBmYSh0KX0sZX1mdW5jdGlvbiBkYSgpe3JldHVybiAwfWZ1bmN0aW9uIHBhKHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIG1hKHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uIHZhKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gZ2EodCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24geWEodCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gYmEodCxlLHIsbil7cmV0dXJuKHQtcikqZS0oZS1uKSp0PjA/MDoxfWZ1bmN0aW9uIHhhKHQsZSxyLG4saSl7dmFyIGE9dFswXS1lWzBdLG89dFsxXS1lWzFdLHM9KGk/bjotbikvTWF0aC5zcXJ0KGEqYStvKm8pLGw9cypvLHU9LXMqYSxjPXRbMF0rbCxoPXRbMV0rdSxmPWVbMF0rbCxkPWVbMV0rdSxwPShjK2YpLzIsbT0oaCtkKS8yLHY9Zi1jLGc9ZC1oLHk9dip2K2cqZyxiPXItbix4PWMqZC1mKmgsXz0oZzwwPy0xOjEpKk1hdGguc3FydChNYXRoLm1heCgwLGIqYip5LXgqeCkpLHc9KHgqZy12Kl8pL3ksTT0oLXgqdi1nKl8pL3ksaz0oeCpnK3YqXykveSxBPSgteCp2K2cqXykveSxUPXctcCxTPU0tbSxFPWstcCxMPUEtbTtyZXR1cm4gVCpUK1MqUz5FKkUrTCpMJiYodz1rLE09QSksW1t3LWwsTS11XSxbdypyL2IsTSpyL2JdXX1mdW5jdGlvbiBfYSh0KXtmdW5jdGlvbiBlKGUpe2Z1bmN0aW9uIG8oKXt1LnB1c2goIk0iLGEodChjKSxzKSl9Zm9yKHZhciBsLHU9W10sYz1bXSxoPS0xLGY9ZS5sZW5ndGgsZD1FdChyKSxwPUV0KG4pOysraDxmOylpLmNhbGwodGhpcyxsPWVbaF0saCk/Yy5wdXNoKFsrZC5jYWxsKHRoaXMsbCxoKSwrcC5jYWxsKHRoaXMsbCxoKV0pOmMubGVuZ3RoJiYobygpLGM9W10pO3JldHVybiBjLmxlbmd0aCYmbygpLHUubGVuZ3RoP3Uuam9pbigiIik6bnVsbH12YXIgcj1DcixuPXpyLGk9emUsYT13YSxvPWEua2V5LHM9Ljc7cmV0dXJuIGUueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LGUpOnJ9LGUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGUpOm59LGUuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LGUpOml9LGUuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/YT10OihhPXpsLmdldCh0KXx8d2EpLmtleSxlKTpvfSxlLnRlbnNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9dCxlKTpzfSxlfWZ1bmN0aW9uIHdhKHQpe3JldHVybiB0Lmxlbmd0aD4xP3Quam9pbigiTCIpOnQrIloifWZ1bmN0aW9uIE1hKHQpe3JldHVybiB0LmpvaW4oIkwiKSsiWiJ9ZnVuY3Rpb24ga2EodCl7Zm9yKHZhciBlPTAscj10Lmxlbmd0aCxuPXRbMF0saT1bblswXSwiLCIsblsxXV07KytlPHI7KWkucHVzaCgiSCIsKG5bMF0rKG49dFtlXSlbMF0pLzIsIlYiLG5bMV0pO3JldHVybiByPjEmJmkucHVzaCgiSCIsblswXSksaS5qb2luKCIiKX1mdW5jdGlvbiBBYSh0KXtmb3IodmFyIGU9MCxyPXQubGVuZ3RoLG49dFswXSxpPVtuWzBdLCIsIixuWzFdXTsrK2U8cjspaS5wdXNoKCJWIiwobj10W2VdKVsxXSwiSCIsblswXSk7cmV0dXJuIGkuam9pbigiIil9ZnVuY3Rpb24gVGEodCl7Zm9yKHZhciBlPTAscj10Lmxlbmd0aCxuPXRbMF0saT1bblswXSwiLCIsblsxXV07KytlPHI7KWkucHVzaCgiSCIsKG49dFtlXSlbMF0sIlYiLG5bMV0pO3JldHVybiBpLmpvaW4oIiIpfWZ1bmN0aW9uIFNhKHQsZSl7cmV0dXJuIHQubGVuZ3RoPDQ/d2EodCk6dFsxXStDYSh0LnNsaWNlKDEsLTEpLHphKHQsZSkpfWZ1bmN0aW9uIEVhKHQsZSl7cmV0dXJuIHQubGVuZ3RoPDM/TWEodCk6dFswXStDYSgodC5wdXNoKHRbMF0pLHQpLHphKFt0W3QubGVuZ3RoLTJdXS5jb25jYXQodCxbdFsxXV0pLGUpKX1mdW5jdGlvbiBMYSh0LGUpe3JldHVybiB0Lmxlbmd0aDwzP3dhKHQpOnRbMF0rQ2EodCx6YSh0LGUpKX1mdW5jdGlvbiBDYSh0LGUpe2lmKGUubGVuZ3RoPDF8fHQubGVuZ3RoIT1lLmxlbmd0aCYmdC5sZW5ndGghPWUubGVuZ3RoKzIpcmV0dXJuIHdhKHQpO3ZhciByPXQubGVuZ3RoIT1lLmxlbmd0aCxuPSIiLGk9dFswXSxhPXRbMV0sbz1lWzBdLHM9byxsPTE7aWYociYmKG4rPSJRIisoYVswXS0yKm9bMF0vMykrIiwiKyhhWzFdLTIqb1sxXS8zKSsiLCIrYVswXSsiLCIrYVsxXSxpPXRbMV0sbD0yKSxlLmxlbmd0aD4xKXtzPWVbMV0sYT10W2xdLGwrKyxuKz0iQyIrKGlbMF0rb1swXSkrIiwiKyhpWzFdK29bMV0pKyIsIisoYVswXS1zWzBdKSsiLCIrKGFbMV0tc1sxXSkrIiwiK2FbMF0rIiwiK2FbMV07Zm9yKHZhciB1PTI7dTxlLmxlbmd0aDt1KyssbCsrKWE9dFtsXSxzPWVbdV0sbis9IlMiKyhhWzBdLXNbMF0pKyIsIisoYVsxXS1zWzFdKSsiLCIrYVswXSsiLCIrYVsxXX1pZihyKXt2YXIgYz10W2xdO24rPSJRIisoYVswXSsyKnNbMF0vMykrIiwiKyhhWzFdKzIqc1sxXS8zKSsiLCIrY1swXSsiLCIrY1sxXX1yZXR1cm4gbn1mdW5jdGlvbiB6YSh0LGUpe2Zvcih2YXIgcixuPVtdLGk9KDEtZSkvMixhPXRbMF0sbz10WzFdLHM9MSxsPXQubGVuZ3RoOysrczxsOylyPWEsYT1vLG89dFtzXSxuLnB1c2goW2kqKG9bMF0tclswXSksaSoob1sxXS1yWzFdKV0pO3JldHVybiBufWZ1bmN0aW9uIElhKHQpe2lmKHQubGVuZ3RoPDMpcmV0dXJuIHdhKHQpO3ZhciBlPTEscj10Lmxlbmd0aCxuPXRbMF0saT1uWzBdLGE9blsxXSxvPVtpLGksaSwobj10WzFdKVswXV0scz1bYSxhLGEsblsxXV0sbD1baSwiLCIsYSwiTCIsUmEoUGwsbyksIiwiLFJhKFBsLHMpXTtmb3IodC5wdXNoKHRbci0xXSk7KytlPD1yOyluPXRbZV0sby5zaGlmdCgpLG8ucHVzaChuWzBdKSxzLnNoaWZ0KCkscy5wdXNoKG5bMV0pLEZhKGwsbyxzKTtyZXR1cm4gdC5wb3AoKSxsLnB1c2goIkwiLG4pLGwuam9pbigiIil9ZnVuY3Rpb24gRGEodCl7aWYodC5sZW5ndGg8NClyZXR1cm4gd2EodCk7Zm9yKHZhciBlLHI9W10sbj0tMSxpPXQubGVuZ3RoLGE9WzBdLG89WzBdOysrbjwzOyllPXRbbl0sYS5wdXNoKGVbMF0pLG8ucHVzaChlWzFdKTtmb3Ioci5wdXNoKFJhKFBsLGEpKyIsIitSYShQbCxvKSksLS1uOysrbjxpOyllPXRbbl0sYS5zaGlmdCgpLGEucHVzaChlWzBdKSxvLnNoaWZ0KCksby5wdXNoKGVbMV0pLEZhKHIsYSxvKTtyZXR1cm4gci5qb2luKCIiKX1mdW5jdGlvbiBQYSh0KXtmb3IodmFyIGUscixuPS0xLGk9dC5sZW5ndGgsYT1pKzQsbz1bXSxzPVtdOysrbjw0OylyPXRbbiVpXSxvLnB1c2goclswXSkscy5wdXNoKHJbMV0pO2ZvcihlPVtSYShQbCxvKSwiLCIsUmEoUGwscyldLC0tbjsrK248YTspcj10W24laV0sby5zaGlmdCgpLG8ucHVzaChyWzBdKSxzLnNoaWZ0KCkscy5wdXNoKHJbMV0pLEZhKGUsbyxzKTtyZXR1cm4gZS5qb2luKCIiKX1mdW5jdGlvbiBPYSh0LGUpe3ZhciByPXQubGVuZ3RoLTE7aWYocilmb3IodmFyIG4saSxhPXRbMF1bMF0sbz10WzBdWzFdLHM9dFtyXVswXS1hLGw9dFtyXVsxXS1vLHU9LTE7Kyt1PD1yOyluPXRbdV0saT11L3IsblswXT1lKm5bMF0rKDEtZSkqKGEraSpzKSxuWzFdPWUqblsxXSsoMS1lKSoobytpKmwpO3JldHVybiBJYSh0KX1mdW5jdGlvbiBSYSh0LGUpe3JldHVybiB0WzBdKmVbMF0rdFsxXSplWzFdK3RbMl0qZVsyXSt0WzNdKmVbM119ZnVuY3Rpb24gRmEodCxlLHIpe3QucHVzaCgiQyIsUmEoSWwsZSksIiwiLFJhKElsLHIpLCIsIixSYShEbCxlKSwiLCIsUmEoRGwsciksIiwiLFJhKFBsLGUpLCIsIixSYShQbCxyKSl9ZnVuY3Rpb24gamEodCxlKXtyZXR1cm4oZVsxXS10WzFdKS8oZVswXS10WzBdKX1mdW5jdGlvbiBOYSh0KXtmb3IodmFyIGU9MCxyPXQubGVuZ3RoLTEsbj1bXSxpPXRbMF0sYT10WzFdLG89blswXT1qYShpLGEpOysrZTxyOyluW2VdPShvKyhvPWphKGk9YSxhPXRbZSsxXSkpKS8yO3JldHVybiBuW2VdPW8sbn1mdW5jdGlvbiBCYSh0KXtmb3IodmFyIGUscixuLGksYT1bXSxvPU5hKHQpLHM9LTEsbD10Lmxlbmd0aC0xOysrczxsOyllPWphKHRbc10sdFtzKzFdKSx4byhlKTxGbz9vW3NdPW9bcysxXT0wOihyPW9bc10vZSxuPW9bcysxXS9lLChpPXIqcituKm4pPjkmJihpPTMqZS9NYXRoLnNxcnQoaSksb1tzXT1pKnIsb1tzKzFdPWkqbikpO2ZvcihzPS0xOysrczw9bDspaT0odFtNYXRoLm1pbihsLHMrMSldWzBdLXRbTWF0aC5tYXgoMCxzLTEpXVswXSkvKDYqKDErb1tzXSpvW3NdKSksYS5wdXNoKFtpfHwwLG9bc10qaXx8MF0pO3JldHVybiBhfWZ1bmN0aW9uIFVhKHQpe3JldHVybiB0Lmxlbmd0aDwzP3dhKHQpOnRbMF0rQ2EodCxCYSh0KSl9ZnVuY3Rpb24gVmEodCl7Zm9yKHZhciBlLHIsbixpPS0xLGE9dC5sZW5ndGg7KytpPGE7KWU9dFtpXSxyPWVbMF0sbj1lWzFdLVZvLGVbMF09cipNYXRoLmNvcyhuKSxlWzFdPXIqTWF0aC5zaW4obik7cmV0dXJuIHR9ZnVuY3Rpb24gSGEodCl7ZnVuY3Rpb24gZShlKXtmdW5jdGlvbiBsKCl7bS5wdXNoKCJNIixzKHQoZyksaCksYyx1KHQodi5yZXZlcnNlKCkpLGgpLCJaIil9Zm9yKHZhciBmLGQscCxtPVtdLHY9W10sZz1bXSx5PS0xLGI9ZS5sZW5ndGgseD1FdChyKSxfPUV0KGkpLHc9cj09PW4/ZnVuY3Rpb24oKXtyZXR1cm4gZH06RXQobiksTT1pPT09YT9mdW5jdGlvbigpe3JldHVybiBwfTpFdChhKTsrK3k8Yjspby5jYWxsKHRoaXMsZj1lW3ldLHkpPyh2LnB1c2goW2Q9K3guY2FsbCh0aGlzLGYseSkscD0rXy5jYWxsKHRoaXMsZix5KV0pLGcucHVzaChbK3cuY2FsbCh0aGlzLGYseSksK00uY2FsbCh0aGlzLGYseSldKSk6di5sZW5ndGgmJihsKCksdj1bXSxnPVtdKTtyZXR1cm4gdi5sZW5ndGgmJmwoKSxtLmxlbmd0aD9tLmpvaW4oIiIpOm51bGx9dmFyIHI9Q3Isbj1DcixpPTAsYT16cixvPXplLHM9d2EsbD1zLmtleSx1PXMsYz0iTCIsaD0uNztyZXR1cm4gZS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW49dCxlKTpufSxlLngwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsZSk6cn0sZS54MT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGUpOm59LGUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1hPXQsZSk6YX0sZS55MD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LGUpOml9LGUueTE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxlKTphfSxlLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCxlKTpvfSxlLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3M9dDoocz16bC5nZXQodCl8fHdhKS5rZXksdT1zLnJldmVyc2V8fHMsYz1zLmNsb3NlZD8iTSI6IkwiLGUpOmx9LGUudGVuc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD10LGUpOmh9LGV9ZnVuY3Rpb24gcWEodCl7cmV0dXJuIHQucmFkaXVzfWZ1bmN0aW9uIEdhKHQpe3JldHVyblt0LngsdC55XX1mdW5jdGlvbiBZYSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyPWVbMF0sbj1lWzFdLVZvO3JldHVybltyKk1hdGguY29zKG4pLHIqTWF0aC5zaW4obildfX1mdW5jdGlvbiBYYSgpe3JldHVybiA2NH1mdW5jdGlvbiBXYSgpe3JldHVybiJjaXJjbGUifWZ1bmN0aW9uIFphKHQpe3ZhciBlPU1hdGguc3FydCh0L05vKTtyZXR1cm4iTTAsIitlKyJBIitlKyIsIitlKyIgMCAxLDEgMCwiKy1lKyJBIitlKyIsIitlKyIgMCAxLDEgMCwiK2UrIloifWZ1bmN0aW9uIEphKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlLHIsbjsoZT10aGlzW3RdKSYmKG49ZVtyPWUuYWN0aXZlXSkmJihuLnRpbWVyLmM9bnVsbCxuLnRpbWVyLnQ9TmFOLC0tZS5jb3VudD9kZWxldGUgZVtyXTpkZWxldGUgdGhpc1t0XSxlLmFjdGl2ZSs9LjUsbi5ldmVudCYmbi5ldmVudC5pbnRlcnJ1cHQuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sbi5pbmRleCkpfX1mdW5jdGlvbiBLYSh0LGUscil7cmV0dXJuIEFvKHQsVWwpLHQubmFtZXNwYWNlPWUsdC5pZD1yLHR9ZnVuY3Rpb24gUWEodCxlLHIsbil7dmFyIGk9dC5pZCxhPXQubmFtZXNwYWNlO3JldHVybiBHKHQsImZ1bmN0aW9uIj09dHlwZW9mIHI/ZnVuY3Rpb24odCxvLHMpe3RbYV1baV0udHdlZW4uc2V0KGUsbihyLmNhbGwodCx0Ll9fZGF0YV9fLG8scykpKX06KHI9bihyKSxmdW5jdGlvbih0KXt0W2FdW2ldLnR3ZWVuLnNldChlLHIpfSkpfWZ1bmN0aW9uICRhKHQpe3JldHVybiBudWxsPT10JiYodD0iIiksZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIHRvKHQpe3JldHVybiBudWxsPT10PyJfX3RyYW5zaXRpb25fXyI6Il9fdHJhbnNpdGlvbl8iK3QrIl9fIn1mdW5jdGlvbiBlbyh0LGUscixuLGkpe2Z1bmN0aW9uIGEodCl7dmFyIGU9bS5kZWxheTtpZih1LnQ9ZStsLGU8PXQpcmV0dXJuIG8odC1lKTt1LmM9b31mdW5jdGlvbiBvKHIpe3ZhciBpPXAuYWN0aXZlLGE9cFtpXTthJiYoYS50aW1lci5jPW51bGwsYS50aW1lci50PU5hTiwtLXAuY291bnQsZGVsZXRlIHBbaV0sYS5ldmVudCYmYS5ldmVudC5pbnRlcnJ1cHQuY2FsbCh0LHQuX19kYXRhX18sYS5pbmRleCkpO2Zvcih2YXIgbyBpbiBwKWlmKCtvPG4pe3ZhciBoPXBbb107aC50aW1lci5jPW51bGwsaC50aW1lci50PU5hTiwtLXAuY291bnQsZGVsZXRlIHBbb119dS5jPXMsRHQoZnVuY3Rpb24oKXtyZXR1cm4gdS5jJiZzKHJ8fDEpJiYodS5jPW51bGwsdS50PU5hTiksMX0sMCxsKSxwLmFjdGl2ZT1uLG0uZXZlbnQmJm0uZXZlbnQuc3RhcnQuY2FsbCh0LHQuX19kYXRhX18sZSksZD1bXSxtLnR3ZWVuLmZvckVhY2goZnVuY3Rpb24ocixuKXsobj1uLmNhbGwodCx0Ll9fZGF0YV9fLGUpKSYmZC5wdXNoKG4pfSksZj1tLmVhc2UsYz1tLmR1cmF0aW9ufWZ1bmN0aW9uIHMoaSl7Zm9yKHZhciBhPWkvYyxvPWYoYSkscz1kLmxlbmd0aDtzPjA7KWRbLS1zXS5jYWxsKHQsbyk7aWYoYT49MSlyZXR1cm4gbS5ldmVudCYmbS5ldmVudC5lbmQuY2FsbCh0LHQuX19kYXRhX18sZSksLS1wLmNvdW50P2RlbGV0ZSBwW25dOmRlbGV0ZSB0W3JdLDF9dmFyIGwsdSxjLGYsZCxwPXRbcl18fCh0W3JdPXthY3RpdmU6MCxjb3VudDowfSksbT1wW25dO218fChsPWkudGltZSx1PUR0KGEsMCxsKSxtPXBbbl09e3R3ZWVuOm5ldyBoLHRpbWU6bCx0aW1lcjp1LGRlbGF5OmkuZGVsYXksZHVyYXRpb246aS5kdXJhdGlvbixlYXNlOmkuZWFzZSxpbmRleDplfSxpPW51bGwsKytwLmNvdW50KX1mdW5jdGlvbiBybyh0LGUscil7dC5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3ZhciBuPWUodCk7cmV0dXJuInRyYW5zbGF0ZSgiKyhpc0Zpbml0ZShuKT9uOnIodCkpKyIsMCkifSl9ZnVuY3Rpb24gbm8odCxlLHIpe3QuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXt2YXIgbj1lKHQpO3JldHVybiJ0cmFuc2xhdGUoMCwiKyhpc0Zpbml0ZShuKT9uOnIodCkpKyIpIn0pfWZ1bmN0aW9uIGlvKHQpe3JldHVybiB0LnRvSVNPU3RyaW5nKCl9ZnVuY3Rpb24gYW8odCxlLHIpe2Z1bmN0aW9uIG4oZSl7cmV0dXJuIHQoZSl9ZnVuY3Rpb24gaSh0LHIpe3ZhciBuPXRbMV0tdFswXSxpPW4vcixhPXVvLmJpc2VjdChKbCxpKTtyZXR1cm4gYT09SmwubGVuZ3RoP1tlLnllYXIsdGEodC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQvMzE1MzZlNn0pLHIpWzJdXTphP2VbaS9KbFthLTFdPEpsW2FdL2k/YS0xOmFdOlskbCx0YSh0LHIpWzJdXX1yZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG9vKHQuaW52ZXJ0KGUpKX0sbi5kb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQuZG9tYWluKGUpLG4pOnQuZG9tYWluKCkubWFwKG9vKX0sbi5uaWNlPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcihyKXtyZXR1cm4haXNOYU4ocikmJiF0LnJhbmdlKHIsb28oK3IrMSksZSkubGVuZ3RofXZhciBhPW4uZG9tYWluKCksbz1HaShhKSxzPW51bGw9PXQ/aShvLDEwKToibnVtYmVyIj09dHlwZW9mIHQmJmkobyx0KTtyZXR1cm4gcyYmKHQ9c1swXSxlPXNbMV0pLG4uZG9tYWluKFdpKGEsZT4xP3tmbG9vcjpmdW5jdGlvbihlKXtmb3IoO3IoZT10LmZsb29yKGUpKTspZT1vbyhlLTEpO3JldHVybiBlfSxjZWlsOmZ1bmN0aW9uKGUpe2Zvcig7cihlPXQuY2VpbChlKSk7KWU9b28oK2UrMSk7cmV0dXJuIGV9fTp0KSl9LG4udGlja3M9ZnVuY3Rpb24odCxlKXt2YXIgcj1HaShuLmRvbWFpbigpKSxhPW51bGw9PXQ/aShyLDEwKToibnVtYmVyIj09dHlwZW9mIHQ/aShyLHQpOiF0LnJhbmdlJiZbe3JhbmdlOnR9LGVdO3JldHVybiBhJiYodD1hWzBdLGU9YVsxXSksdC5yYW5nZShyWzBdLG9vKCtyWzFdKzEpLGU8MT8xOmUpfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gcn0sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGFvKHQuY29weSgpLGUscil9LFFpKG4sdCl9ZnVuY3Rpb24gb28odCl7cmV0dXJuIG5ldyBEYXRlKHQpfWZ1bmN0aW9uIHNvKHQpe3JldHVybiBKU09OLnBhcnNlKHQucmVzcG9uc2VUZXh0KX1mdW5jdGlvbiBsbyh0KXt2YXIgZT1mby5jcmVhdGVSYW5nZSgpO3JldHVybiBlLnNlbGVjdE5vZGUoZm8uYm9keSksZS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodC5yZXNwb25zZVRleHQpfXZhciB1bz17dmVyc2lvbjoiMy41LjE3In0sY289W10uc2xpY2UsaG89ZnVuY3Rpb24odCl7cmV0dXJuIGNvLmNhbGwodCl9LGZvPXRoaXMuZG9jdW1lbnQ7aWYoZm8pdHJ5e2hvKGZvLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKVswXS5ub2RlVHlwZX1jYXRjaCh0KXtobz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5sZW5ndGgscj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPXRbZV07cmV0dXJuIHJ9fWlmKERhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KSxmbyl0cnl7Zm8uY3JlYXRlRWxlbWVudCgiRElWIikuc3R5bGUuc2V0UHJvcGVydHkoIm9wYWNpdHkiLDAsIiIpfWNhdGNoKHQpe3ZhciBwbz10aGlzLkVsZW1lbnQucHJvdG90eXBlLG1vPXBvLnNldEF0dHJpYnV0ZSx2bz1wby5zZXRBdHRyaWJ1dGVOUyxnbz10aGlzLkNTU1N0eWxlRGVjbGFyYXRpb24ucHJvdG90eXBlLHlvPWdvLnNldFByb3BlcnR5O3BvLnNldEF0dHJpYnV0ZT1mdW5jdGlvbih0LGUpe21vLmNhbGwodGhpcyx0LGUrIiIpfSxwby5zZXRBdHRyaWJ1dGVOUz1mdW5jdGlvbih0LGUscil7dm8uY2FsbCh0aGlzLHQsZSxyKyIiKX0sZ28uc2V0UHJvcGVydHk9ZnVuY3Rpb24odCxlLHIpe3lvLmNhbGwodGhpcyx0LGUrIiIscil9fXVvLmFzY2VuZGluZz1pLHVvLmRlc2NlbmRpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZTx0Py0xOmU+dD8xOmU+PXQ/MDpOYU59LHVvLm1pbj1mdW5jdGlvbih0LGUpe3ZhciByLG4saT0tMSxhPXQubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IoOysraTxhOylpZihudWxsIT0obj10W2ldKSYmbj49bil7cj1uO2JyZWFrfWZvcig7KytpPGE7KW51bGwhPShuPXRbaV0pJiZyPm4mJihyPW4pfWVsc2V7Zm9yKDsrK2k8YTspaWYobnVsbCE9KG49ZS5jYWxsKHQsdFtpXSxpKSkmJm4+PW4pe3I9bjticmVha31mb3IoOysraTxhOyludWxsIT0obj1lLmNhbGwodCx0W2ldLGkpKSYmcj5uJiYocj1uKX1yZXR1cm4gcn0sdW8ubWF4PWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpPS0xLGE9dC5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KytpPGE7KWlmKG51bGwhPShuPXRbaV0pJiZuPj1uKXtyPW47YnJlYWt9Zm9yKDsrK2k8YTspbnVsbCE9KG49dFtpXSkmJm4+ciYmKHI9bil9ZWxzZXtmb3IoOysraTxhOylpZihudWxsIT0obj1lLmNhbGwodCx0W2ldLGkpKSYmbj49bil7cj1uO2JyZWFrfWZvcig7KytpPGE7KW51bGwhPShuPWUuY2FsbCh0LHRbaV0saSkpJiZuPnImJihyPW4pfXJldHVybiByfSx1by5leHRlbnQ9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGksYT0tMSxvPXQubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IoOysrYTxvOylpZihudWxsIT0obj10W2FdKSYmbj49bil7cj1pPW47YnJlYWt9Zm9yKDsrK2E8bzspbnVsbCE9KG49dFthXSkmJihyPm4mJihyPW4pLGk8biYmKGk9bikpfWVsc2V7Zm9yKDsrK2E8bzspaWYobnVsbCE9KG49ZS5jYWxsKHQsdFthXSxhKSkmJm4+PW4pe3I9aT1uO2JyZWFrfWZvcig7KythPG87KW51bGwhPShuPWUuY2FsbCh0LHRbYV0sYSkpJiYocj5uJiYocj1uKSxpPG4mJihpPW4pKX1yZXR1cm5bcixpXX0sdW8uc3VtPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj0wLGk9dC5sZW5ndGgsYT0tMTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrYTxpOylvKHI9K3RbYV0pJiYobis9cik7ZWxzZSBmb3IoOysrYTxpOylvKHI9K2UuY2FsbCh0LHRbYV0sYSkpJiYobis9cik7cmV0dXJuIG59LHVvLm1lYW49ZnVuY3Rpb24odCxlKXt2YXIgcixuPTAsaT10Lmxlbmd0aCxzPS0xLGw9aTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrczxpOylvKHI9YSh0W3NdKSk/bis9cjotLWw7ZWxzZSBmb3IoOysrczxpOylvKHI9YShlLmNhbGwodCx0W3NdLHMpKSk/bis9cjotLWw7aWYobClyZXR1cm4gbi9sfSx1by5xdWFudGlsZT1mdW5jdGlvbih0LGUpe3ZhciByPSh0Lmxlbmd0aC0xKSplKzEsbj1NYXRoLmZsb29yKHIpLGk9K3Rbbi0xXSxhPXItbjtyZXR1cm4gYT9pK2EqKHRbbl0taSk6aX0sdW8ubWVkaWFuPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbj1bXSxzPXQubGVuZ3RoLGw9LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2w8czspbyhyPWEodFtsXSkpJiZuLnB1c2gocik7ZWxzZSBmb3IoOysrbDxzOylvKHI9YShlLmNhbGwodCx0W2xdLGwpKSkmJm4ucHVzaChyKTtpZihuLmxlbmd0aClyZXR1cm4gdW8ucXVhbnRpbGUobi5zb3J0KGkpLC41KX0sdW8udmFyaWFuY2U9ZnVuY3Rpb24odCxlKXt2YXIgcixuLGk9dC5sZW5ndGgscz0wLGw9MCx1PS0xLGM9MDtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrdTxpOylvKHI9YSh0W3VdKSkmJihuPXItcyxzKz1uLysrYyxsKz1uKihyLXMpKTtlbHNlIGZvcig7Kyt1PGk7KW8ocj1hKGUuY2FsbCh0LHRbdV0sdSkpKSYmKG49ci1zLHMrPW4vKytjLGwrPW4qKHItcykpO2lmKGM+MSlyZXR1cm4gbC8oYy0xKX0sdW8uZGV2aWF0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dW8udmFyaWFuY2UuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiB0P01hdGguc3FydCh0KTp0fTt2YXIgYm89cyhpKTt1by5iaXNlY3RMZWZ0PWJvLmxlZnQsdW8uYmlzZWN0PXVvLmJpc2VjdFJpZ2h0PWJvLnJpZ2h0LHVvLmJpc2VjdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBzKDE9PT10Lmxlbmd0aD9mdW5jdGlvbihlLHIpe3JldHVybiBpKHQoZSkscil9OnQpfSx1by5zaHVmZmxlPWZ1bmN0aW9uKHQsZSxyKXsoYT1hcmd1bWVudHMubGVuZ3RoKTwzJiYocj10Lmxlbmd0aCxhPDImJihlPTApKTtmb3IodmFyIG4saSxhPXItZTthOylpPU1hdGgucmFuZG9tKCkqYS0tfDAsbj10W2ErZV0sdFthK2VdPXRbaStlXSx0W2krZV09bjtyZXR1cm4gdH0sdW8ucGVybXV0ZT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj1lLmxlbmd0aCxuPW5ldyBBcnJheShyKTtyLS07KW5bcl09dFtlW3JdXTtyZXR1cm4gbn0sdW8ucGFpcnM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAscj10Lmxlbmd0aC0xLG49dFswXSxpPW5ldyBBcnJheShyPDA/MDpyKTtlPHI7KWlbZV09W24sbj10WysrZV1dO3JldHVybiBpfSx1by50cmFuc3Bvc2U9ZnVuY3Rpb24odCl7aWYoIShpPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIGU9LTEscj11by5taW4odCxsKSxuPW5ldyBBcnJheShyKTsrK2U8cjspZm9yKHZhciBpLGE9LTEsbz1uW2VdPW5ldyBBcnJheShpKTsrK2E8aTspb1thXT10W2FdW2VdO3JldHVybiBufSx1by56aXA9ZnVuY3Rpb24oKXtyZXR1cm4gdW8udHJhbnNwb3NlKGFyZ3VtZW50cyl9LHVvLmtleXM9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciByIGluIHQpZS5wdXNoKHIpO3JldHVybiBlfSx1by52YWx1ZXM9ZnVuY3Rpb24odCl7dmFyIGU9W107Zm9yKHZhciByIGluIHQpZS5wdXNoKHRbcl0pO3JldHVybiBlfSx1by5lbnRyaWVzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgciBpbiB0KWUucHVzaCh7a2V5OnIsdmFsdWU6dFtyXX0pO3JldHVybiBlfSx1by5tZXJnZT1mdW5jdGlvbih0KXtmb3IodmFyIGUscixuLGk9dC5sZW5ndGgsYT0tMSxvPTA7KythPGk7KW8rPXRbYV0ubGVuZ3RoO2ZvcihyPW5ldyBBcnJheShvKTstLWk+PTA7KWZvcihuPXRbaV0sZT1uLmxlbmd0aDstLWU+PTA7KXJbLS1vXT1uW2VdO3JldHVybiByfTt2YXIgeG89TWF0aC5hYnM7dW8ucmFuZ2U9ZnVuY3Rpb24odCxlLHIpe2lmKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MSxhcmd1bWVudHMubGVuZ3RoPDImJihlPXQsdD0wKSksKGUtdCkvcj09MS8wKXRocm93IG5ldyBFcnJvcigiaW5maW5pdGUgcmFuZ2UiKTt2YXIgbixpPVtdLGE9dSh4byhyKSksbz0tMTtpZih0Kj1hLGUqPWEscio9YSxyPDApZm9yKDsobj10K3IqKytvKT5lOylpLnB1c2gobi9hKTtlbHNlIGZvcig7KG49dCtyKisrbyk8ZTspaS5wdXNoKG4vYSk7cmV0dXJuIGl9LHVvLm1hcD1mdW5jdGlvbih0LGUpe3ZhciByPW5ldyBoO2lmKHQgaW5zdGFuY2VvZiBoKXQuZm9yRWFjaChmdW5jdGlvbih0LGUpe3Iuc2V0KHQsZSl9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciBuLGk9LTEsYT10Lmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysraTxhOylyLnNldChpLHRbaV0pO2Vsc2UgZm9yKDsrK2k8YTspci5zZXQoZS5jYWxsKHQsbj10W2ldLGkpLG4pfWVsc2UgZm9yKHZhciBvIGluIHQpci5zZXQobyx0W29dKTtyZXR1cm4gcn07dmFyIF9vPSJfX3Byb3RvX18iLHdvPSJcMCI7YyhoLHtoYXM6cCxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX1tmKHQpXX0sc2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX1tmKHQpXT1lfSxyZW1vdmU6bSxrZXlzOnYsdmFsdWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMuXyl0LnB1c2godGhpcy5fW2VdKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzLl8pdC5wdXNoKHtrZXk6ZChlKSx2YWx1ZTp0aGlzLl9bZV19KTtyZXR1cm4gdH0sc2l6ZTpnLGVtcHR5OnksZm9yRWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcy5fKXQuY2FsbCh0aGlzLGQoZSksdGhpcy5fW2VdKX19KSx1by5uZXN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG8scyl7aWYocz49YS5sZW5ndGgpcmV0dXJuIG4/bi5jYWxsKGksbyk6cj9vLnNvcnQocik6bztmb3IodmFyIGwsdSxjLGYsZD0tMSxwPW8ubGVuZ3RoLG09YVtzKytdLHY9bmV3IGg7KytkPHA7KShmPXYuZ2V0KGw9bSh1PW9bZF0pKSk/Zi5wdXNoKHUpOnYuc2V0KGwsW3VdKTtyZXR1cm4gZT8odT1lKCksYz1mdW5jdGlvbihyLG4pe3Uuc2V0KHIsdChlLG4scykpfSk6KHU9e30sYz1mdW5jdGlvbihyLG4pe3Vbcl09dChlLG4scyl9KSx2LmZvckVhY2goYyksdX1mdW5jdGlvbiBlKHQscil7aWYocj49YS5sZW5ndGgpcmV0dXJuIHQ7dmFyIG49W10saT1vW3IrK107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0LGkpe24ucHVzaCh7a2V5OnQsdmFsdWVzOmUoaSxyKX0pfSksaT9uLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gaSh0LmtleSxlLmtleSl9KTpufXZhciByLG4saT17fSxhPVtdLG89W107cmV0dXJuIGkubWFwPWZ1bmN0aW9uKGUscil7cmV0dXJuIHQocixlLDApfSxpLmVudHJpZXM9ZnVuY3Rpb24ocil7cmV0dXJuIGUodCh1by5tYXAsciwwKSwwKX0saS5rZXk9ZnVuY3Rpb24odCl7cmV0dXJuIGEucHVzaCh0KSxpfSxpLnNvcnRLZXlzPWZ1bmN0aW9uKHQpe3JldHVybiBvW2EubGVuZ3RoLTFdPXQsaX0saS5zb3J0VmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiByPXQsaX0saS5yb2xsdXA9ZnVuY3Rpb24odCl7cmV0dXJuIG49dCxpfSxpfSx1by5zZXQ9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IGI7aWYodClmb3IodmFyIHI9MCxuPXQubGVuZ3RoO3I8bjsrK3IpZS5hZGQodFtyXSk7cmV0dXJuIGV9LGMoYix7aGFzOnAsYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9bZih0Kz0iIildPSEwLHR9LHJlbW92ZTptLHZhbHVlczp2LHNpemU6ZyxlbXB0eTp5LGZvckVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMuXyl0LmNhbGwodGhpcyxkKGUpKX19KSx1by5iZWhhdmlvcj17fSx1by5yZWJpbmQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIHIsbj0xLGk9YXJndW1lbnRzLmxlbmd0aDsrK248aTspdFtyPWFyZ3VtZW50c1tuXV09Xyh0LGUsZVtyXSk7cmV0dXJuIHR9O3ZhciBNbz1bIndlYmtpdCIsIm1zIiwibW96IiwiTW96IiwibyIsIk8iXTt1by5kaXNwYXRjaD1mdW5jdGlvbigpe2Zvcih2YXIgdD1uZXcgayxlPS0xLHI9YXJndW1lbnRzLmxlbmd0aDsrK2U8cjspdFthcmd1bWVudHNbZV1dPUEodCk7cmV0dXJuIHR9LGsucHJvdG90eXBlLm9uPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dC5pbmRleE9mKCIuIiksbj0iIjtpZihyPj0wJiYobj10LnNsaWNlKHIrMSksCnQ9dC5zbGljZSgwLHIpKSx0KXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpc1t0XS5vbihuKTp0aGlzW3RdLm9uKG4sZSk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGw9PWUpZm9yKHQgaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KHQpJiZ0aGlzW3RdLm9uKG4sbnVsbCk7cmV0dXJuIHRoaXN9fSx1by5ldmVudD1udWxsLHVvLnJlcXVvdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVwbGFjZShrbywiXFwkJiIpfTt2YXIga289L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nLEFvPXt9Ll9fcHJvdG9fXz9mdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByIGluIGUpdFtyXT1lW3JdfSxUbz1mdW5jdGlvbih0LGUpe3JldHVybiBlLnF1ZXJ5U2VsZWN0b3IodCl9LFNvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUucXVlcnlTZWxlY3RvckFsbCh0KX0sRW89ZnVuY3Rpb24odCxlKXt2YXIgcj10Lm1hdGNoZXN8fHRbdyh0LCJtYXRjaGVzU2VsZWN0b3IiKV07cmV0dXJuKEVvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIuY2FsbCh0LGUpfSkodCxlKX07ImZ1bmN0aW9uIj09dHlwZW9mIFNpenpsZSYmKFRvPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFNpenpsZSh0LGUpWzBdfHxudWxsfSxTbz1TaXp6bGUsRW89U2l6emxlLm1hdGNoZXNTZWxlY3RvciksdW8uc2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHVvLnNlbGVjdChmby5kb2N1bWVudEVsZW1lbnQpfTt2YXIgTG89dW8uc2VsZWN0aW9uLnByb3RvdHlwZT1bXTtMby5zZWxlY3Q9ZnVuY3Rpb24odCl7dmFyIGUscixuLGksYT1bXTt0PUModCk7Zm9yKHZhciBvPS0xLHM9dGhpcy5sZW5ndGg7KytvPHM7KXthLnB1c2goZT1bXSksZS5wYXJlbnROb2RlPShuPXRoaXNbb10pLnBhcmVudE5vZGU7Zm9yKHZhciBsPS0xLHU9bi5sZW5ndGg7KytsPHU7KShpPW5bbF0pPyhlLnB1c2gocj10LmNhbGwoaSxpLl9fZGF0YV9fLGwsbykpLHImJiJfX2RhdGFfXyJpbiBpJiYoci5fX2RhdGFfXz1pLl9fZGF0YV9fKSk6ZS5wdXNoKG51bGwpfXJldHVybiBMKGEpfSxMby5zZWxlY3RBbGw9ZnVuY3Rpb24odCl7dmFyIGUscixuPVtdO3Q9eih0KTtmb3IodmFyIGk9LTEsYT10aGlzLmxlbmd0aDsrK2k8YTspZm9yKHZhciBvPXRoaXNbaV0scz0tMSxsPW8ubGVuZ3RoOysrczxsOykocj1vW3NdKSYmKG4ucHVzaChlPWhvKHQuY2FsbChyLHIuX19kYXRhX18scyxpKSkpLGUucGFyZW50Tm9kZT1yKTtyZXR1cm4gTChuKX07dmFyIENvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIix6bz17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIseGh0bWw6Q28seGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTt1by5ucz17cHJlZml4OnpvLHF1YWxpZnk6ZnVuY3Rpb24odCl7dmFyIGU9dC5pbmRleE9mKCI6Iikscj10O3JldHVybiBlPj0wJiYieG1sbnMiIT09KHI9dC5zbGljZSgwLGUpKSYmKHQ9dC5zbGljZShlKzEpKSx6by5oYXNPd25Qcm9wZXJ0eShyKT97c3BhY2U6em9bcl0sbG9jYWw6dH06dH19LExvLmF0dHI9ZnVuY3Rpb24odCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIHI9dGhpcy5ub2RlKCk7cmV0dXJuIHQ9dW8ubnMucXVhbGlmeSh0KSx0LmxvY2FsP3IuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTpyLmdldEF0dHJpYnV0ZSh0KX1mb3IoZSBpbiB0KXRoaXMuZWFjaChJKGUsdFtlXSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goSSh0LGUpKX0sTG8uY2xhc3NlZD1mdW5jdGlvbih0LGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgcj10aGlzLm5vZGUoKSxuPSh0PU8odCkpLmxlbmd0aCxpPS0xO2lmKGU9ci5jbGFzc0xpc3Qpe2Zvcig7KytpPG47KWlmKCFlLmNvbnRhaW5zKHRbaV0pKXJldHVybiExfWVsc2UgZm9yKGU9ci5nZXRBdHRyaWJ1dGUoImNsYXNzIik7KytpPG47KWlmKCFQKHRbaV0pLnRlc3QoZSkpcmV0dXJuITE7cmV0dXJuITB9Zm9yKGUgaW4gdCl0aGlzLmVhY2goUihlLHRbZV0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKFIodCxlKSl9LExvLnN0eWxlPWZ1bmN0aW9uKHQsZSxyKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoO2lmKGk8Myl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXtpPDImJihlPSIiKTtmb3IociBpbiB0KXRoaXMuZWFjaChqKHIsdFtyXSxlKSk7cmV0dXJuIHRoaXN9aWYoaTwyKXt2YXIgYT10aGlzLm5vZGUoKTtyZXR1cm4gbihhKS5nZXRDb21wdXRlZFN0eWxlKGEsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSh0KX1yPSIifXJldHVybiB0aGlzLmVhY2goaih0LGUscikpfSxMby5wcm9wZXJ0eT1mdW5jdGlvbih0LGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiB0KXJldHVybiB0aGlzLm5vZGUoKVt0XTtmb3IoZSBpbiB0KXRoaXMuZWFjaChOKGUsdFtlXSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goTih0LGUpKX0sTG8udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX06bnVsbD09dD9mdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9IiJ9OmZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LExvLmh0bWw9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09ZT8iIjplfTpudWxsPT10P2Z1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9IiJ9OmZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dH0pOnRoaXMubm9kZSgpLmlubmVySFRNTH0sTG8uYXBwZW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0PUIodCksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZCh0LmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KX0sTG8uaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9Qih0KSxlPUMoZSksdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUodC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LExvLnJlbW92ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goVSl9LExvLmRhdGE9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQscil7dmFyIG4saSxhLG89dC5sZW5ndGgsYz1yLmxlbmd0aCxmPU1hdGgubWluKG8sYyksZD1uZXcgQXJyYXkoYykscD1uZXcgQXJyYXkoYyksbT1uZXcgQXJyYXkobyk7aWYoZSl7dmFyIHYsZz1uZXcgaCx5PW5ldyBBcnJheShvKTtmb3Iobj0tMTsrK248bzspKGk9dFtuXSkmJihnLmhhcyh2PWUuY2FsbChpLGkuX19kYXRhX18sbikpP21bbl09aTpnLnNldCh2LGkpLHlbbl09dik7Zm9yKG49LTE7KytuPGM7KShpPWcuZ2V0KHY9ZS5jYWxsKHIsYT1yW25dLG4pKSk/ITAhPT1pJiYoZFtuXT1pLGkuX19kYXRhX189YSk6cFtuXT1WKGEpLGcuc2V0KHYsITApO2ZvcihuPS0xOysrbjxvOyluIGluIHkmJiEwIT09Zy5nZXQoeVtuXSkmJihtW25dPXRbbl0pfWVsc2V7Zm9yKG49LTE7KytuPGY7KWk9dFtuXSxhPXJbbl0saT8oaS5fX2RhdGFfXz1hLGRbbl09aSk6cFtuXT1WKGEpO2Zvcig7bjxjOysrbilwW25dPVYocltuXSk7Zm9yKDtuPG87KytuKW1bbl09dFtuXX1wLnVwZGF0ZT1kLHAucGFyZW50Tm9kZT1kLnBhcmVudE5vZGU9bS5wYXJlbnROb2RlPXQucGFyZW50Tm9kZSxzLnB1c2gocCksbC5wdXNoKGQpLHUucHVzaChtKX12YXIgbixpLGE9LTEsbz10aGlzLmxlbmd0aDtpZighYXJndW1lbnRzLmxlbmd0aCl7Zm9yKHQ9bmV3IEFycmF5KG89KG49dGhpc1swXSkubGVuZ3RoKTsrK2E8bzspKGk9blthXSkmJih0W2FdPWkuX19kYXRhX18pO3JldHVybiB0fXZhciBzPVkoW10pLGw9TChbXSksdT1MKFtdKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgdClmb3IoOysrYTxvOylyKG49dGhpc1thXSx0LmNhbGwobixuLnBhcmVudE5vZGUuX19kYXRhX18sYSkpO2Vsc2UgZm9yKDsrK2E8bzspcihuPXRoaXNbYV0sdCk7cmV0dXJuIGwuZW50ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gc30sbC5leGl0PWZ1bmN0aW9uKCl7cmV0dXJuIHV9LGx9LExvLmRhdHVtPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIpfSxMby5maWx0ZXI9ZnVuY3Rpb24odCl7dmFyIGUscixuLGk9W107ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUgodCkpO2Zvcih2YXIgYT0wLG89dGhpcy5sZW5ndGg7YTxvO2ErKyl7aS5wdXNoKGU9W10pLGUucGFyZW50Tm9kZT0ocj10aGlzW2FdKS5wYXJlbnROb2RlO2Zvcih2YXIgcz0wLGw9ci5sZW5ndGg7czxsO3MrKykobj1yW3NdKSYmdC5jYWxsKG4sbi5fX2RhdGFfXyxzLGEpJiZlLnB1c2gobil9cmV0dXJuIEwoaSl9LExvLm9yZGVyPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xLGU9dGhpcy5sZW5ndGg7Kyt0PGU7KWZvcih2YXIgcixuPXRoaXNbdF0saT1uLmxlbmd0aC0xLGE9bltpXTstLWk+PTA7KShyPW5baV0pJiYoYSYmYSE9PXIubmV4dFNpYmxpbmcmJmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocixhKSxhPXIpO3JldHVybiB0aGlzfSxMby5zb3J0PWZ1bmN0aW9uKHQpe3Q9cS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Zm9yKHZhciBlPS0xLHI9dGhpcy5sZW5ndGg7KytlPHI7KXRoaXNbZV0uc29ydCh0KTtyZXR1cm4gdGhpcy5vcmRlcigpfSxMby5lYWNoPWZ1bmN0aW9uKHQpe3JldHVybiBHKHRoaXMsZnVuY3Rpb24oZSxyLG4pe3QuY2FsbChlLGUuX19kYXRhX18scixuKX0pfSxMby5jYWxsPWZ1bmN0aW9uKHQpe3ZhciBlPWhvKGFyZ3VtZW50cyk7cmV0dXJuIHQuYXBwbHkoZVswXT10aGlzLGUpLHRoaXN9LExvLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxMby5ub2RlPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PTAsZT10aGlzLmxlbmd0aDt0PGU7dCsrKWZvcih2YXIgcj10aGlzW3RdLG49MCxpPXIubGVuZ3RoO248aTtuKyspe3ZhciBhPXJbbl07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sTG8uc2l6ZT1mdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIEcodGhpcyxmdW5jdGlvbigpeysrdH0pLHR9O3ZhciBJbz1bXTt1by5zZWxlY3Rpb24uZW50ZXI9WSx1by5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlPUlvLElvLmFwcGVuZD1Mby5hcHBlbmQsSW8uZW1wdHk9TG8uZW1wdHksSW8ubm9kZT1Mby5ub2RlLElvLmNhbGw9TG8uY2FsbCxJby5zaXplPUxvLnNpemUsSW8uc2VsZWN0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyLG4saSxhLG89W10scz0tMSxsPXRoaXMubGVuZ3RoOysrczxsOyl7bj0oaT10aGlzW3NdKS51cGRhdGUsby5wdXNoKGU9W10pLGUucGFyZW50Tm9kZT1pLnBhcmVudE5vZGU7Zm9yKHZhciB1PS0xLGM9aS5sZW5ndGg7Kyt1PGM7KShhPWlbdV0pPyhlLnB1c2goblt1XT1yPXQuY2FsbChpLnBhcmVudE5vZGUsYS5fX2RhdGFfXyx1LHMpKSxyLl9fZGF0YV9fPWEuX19kYXRhX18pOmUucHVzaChudWxsKX1yZXR1cm4gTChvKX0sSW8uaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKGU9WCh0aGlzKSksTG8uaW5zZXJ0LmNhbGwodGhpcyx0LGUpfSx1by5zZWxlY3Q9ZnVuY3Rpb24odCl7dmFyIHI7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0PyhyPVtUbyh0LGZvKV0sci5wYXJlbnROb2RlPWZvLmRvY3VtZW50RWxlbWVudCk6KHI9W3RdLHIucGFyZW50Tm9kZT1lKHQpKSxMKFtyXSl9LHVvLnNlbGVjdEFsbD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/KGU9aG8oU28odCxmbykpLGUucGFyZW50Tm9kZT1mby5kb2N1bWVudEVsZW1lbnQpOihlPWhvKHQpLGUucGFyZW50Tm9kZT1udWxsKSxMKFtlXSl9LExvLm9uPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoO2lmKG48Myl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXtuPDImJihlPSExKTtmb3IociBpbiB0KXRoaXMuZWFjaChXKHIsdFtyXSxlKSk7cmV0dXJuIHRoaXN9aWYobjwyKXJldHVybihuPXRoaXMubm9kZSgpWyJfX29uIit0XSkmJm4uXztyPSExfXJldHVybiB0aGlzLmVhY2goVyh0LGUscikpfTt2YXIgRG89dW8ubWFwKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pO2ZvJiZEby5mb3JFYWNoKGZ1bmN0aW9uKHQpeyJvbiIrdCBpbiBmbyYmRG8ucmVtb3ZlKHQpfSk7dmFyIFBvLE9vPTA7dW8ubW91c2U9ZnVuY3Rpb24odCl7cmV0dXJuIFEodCxTKCkpfTt2YXIgUm89dGhpcy5uYXZpZ2F0b3ImJi9XZWJLaXQvLnRlc3QodGhpcy5uYXZpZ2F0b3IudXNlckFnZW50KT8tMTowO3VvLnRvdWNoPWZ1bmN0aW9uKHQsZSxyKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihyPWUsZT1TKCkuY2hhbmdlZFRvdWNoZXMpLGUpZm9yKHZhciBuLGk9MCxhPWUubGVuZ3RoO2k8YTsrK2kpaWYoKG49ZVtpXSkuaWRlbnRpZmllcj09PXIpcmV0dXJuIFEodCxuKX0sdW8uYmVoYXZpb3IuZHJhZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLm9uKCJtb3VzZWRvd24uZHJhZyIsYSkub24oInRvdWNoc3RhcnQuZHJhZyIsbyl9ZnVuY3Rpb24gZSh0LGUsbixhLG8pe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIHMoKXt2YXIgdCxyLG49ZShmLG0pO24mJih0PW5bMF0tYlswXSxyPW5bMV0tYlsxXSxwfD10fHIsYj1uLGQoe3R5cGU6ImRyYWciLHg6blswXSt1WzBdLHk6blsxXSt1WzFdLGR4OnQsZHk6cn0pKX1mdW5jdGlvbiBsKCl7ZShmLG0pJiYoZy5vbihhK3YsbnVsbCkub24obyt2LG51bGwpLHkocCksZCh7dHlwZToiZHJhZ2VuZCJ9KSl9dmFyIHUsYz10aGlzLGg9dW8uZXZlbnQudGFyZ2V0LmNvcnJlc3BvbmRpbmdFbGVtZW50fHx1by5ldmVudC50YXJnZXQsZj1jLnBhcmVudE5vZGUsZD1yLm9mKGMsYXJndW1lbnRzKSxwPTAsbT10KCksdj0iLmRyYWciKyhudWxsPT1tPyIiOiItIittKSxnPXVvLnNlbGVjdChuKGgpKS5vbihhK3Yscykub24obyt2LGwpLHk9SyhoKSxiPWUoZixtKTtpPyh1PWkuYXBwbHkoYyxhcmd1bWVudHMpLHU9W3UueC1iWzBdLHUueS1iWzFdXSk6dT1bMCwwXSxkKHt0eXBlOiJkcmFnc3RhcnQifSl9fXZhciByPUUodCwiZHJhZyIsImRyYWdzdGFydCIsImRyYWdlbmQiKSxpPW51bGwsYT1lKE0sdW8ubW91c2UsbiwibW91c2Vtb3ZlIiwibW91c2V1cCIpLG89ZSgkLHVvLnRvdWNoLHgsInRvdWNobW92ZSIsInRvdWNoZW5kIik7cmV0dXJuIHQub3JpZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUsdCk6aX0sdW8ucmViaW5kKHQsciwib24iKX0sdW8udG91Y2hlcz1mdW5jdGlvbih0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJihlPVMoKS50b3VjaGVzKSxlP2hvKGUpLm1hcChmdW5jdGlvbihlKXt2YXIgcj1RKHQsZSk7cmV0dXJuIHIuaWRlbnRpZmllcj1lLmlkZW50aWZpZXIscn0pOltdfTt2YXIgRm89MWUtNixqbz1GbypGbyxObz1NYXRoLlBJLEJvPTIqTm8sVW89Qm8tRm8sVm89Tm8vMixIbz1Oby8xODAscW89MTgwL05vLEdvPU1hdGguU1FSVDI7dW8uaW50ZXJwb2xhdGVab29tPWZ1bmN0aW9uKHQsZSl7dmFyIHIsbixpPXRbMF0sYT10WzFdLG89dFsyXSxzPWVbMF0sbD1lWzFdLHU9ZVsyXSxjPXMtaSxoPWwtYSxmPWMqYytoKmg7aWYoZjxqbyluPU1hdGgubG9nKHUvbykvR28scj1mdW5jdGlvbih0KXtyZXR1cm5baSt0KmMsYSt0KmgsbypNYXRoLmV4cChHbyp0Km4pXX07ZWxzZXt2YXIgZD1NYXRoLnNxcnQoZikscD0odSp1LW8qbys0KmYpLygyKm8qMipkKSxtPSh1KnUtbypvLTQqZikvKDIqdSoyKmQpLHY9TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKSxnPU1hdGgubG9nKE1hdGguc3FydChtKm0rMSktbSk7bj0oZy12KS9HbyxyPWZ1bmN0aW9uKHQpe3ZhciBlPXQqbixyPWF0KHYpLHM9by8oMipkKSoocipvdChHbyplK3YpLWl0KHYpKTtyZXR1cm5baStzKmMsYStzKmgsbypyL2F0KEdvKmUrdildfX1yZXR1cm4gci5kdXJhdGlvbj0xZTMqbixyfSx1by5iZWhhdmlvci56b29tPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0Lm9uKHosaCkub24oWG8rIi56b29tIixkKS5vbigiZGJsY2xpY2suem9vbSIscCkub24oUCxmKX1mdW5jdGlvbiBlKHQpe3JldHVyblsodFswXS1rLngpL2suaywodFsxXS1rLnkpL2sua119ZnVuY3Rpb24gcih0KXtyZXR1cm5bdFswXSprLmsray54LHRbMV0qay5rK2sueV19ZnVuY3Rpb24gaSh0KXtrLms9TWF0aC5tYXgoU1swXSxNYXRoLm1pbihTWzFdLHQpKX1mdW5jdGlvbiBhKHQsZSl7ZT1yKGUpLGsueCs9dFswXS1lWzBdLGsueSs9dFsxXS1lWzFdfWZ1bmN0aW9uIG8oZSxyLG4sbyl7ZS5fX2NoYXJ0X189e3g6ay54LHk6ay55LGs6ay5rfSxpKE1hdGgucG93KDIsbykpLGEodj1yLG4pLGU9dW8uc2VsZWN0KGUpLEw+MCYmKGU9ZS50cmFuc2l0aW9uKCkuZHVyYXRpb24oTCkpLGUuY2FsbCh0LmV2ZW50KX1mdW5jdGlvbiBzKCl7XyYmXy5kb21haW4oeC5yYW5nZSgpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4odC1rLngpL2sua30pLm1hcCh4LmludmVydCkpLE0mJk0uZG9tYWluKHcucmFuZ2UoKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuKHQtay55KS9rLmt9KS5tYXAody5pbnZlcnQpKX1mdW5jdGlvbiBsKHQpe0MrK3x8dCh7dHlwZToiem9vbXN0YXJ0In0pfWZ1bmN0aW9uIHUodCl7cygpLHQoe3R5cGU6Inpvb20iLHNjYWxlOmsuayx0cmFuc2xhdGU6W2sueCxrLnldfSl9ZnVuY3Rpb24gYyh0KXstLUN8fCh0KHt0eXBlOiJ6b29tZW5kIn0pLHY9bnVsbCl9ZnVuY3Rpb24gaCgpe2Z1bmN0aW9uIHQoKXtzPTEsYSh1by5tb3VzZShpKSxmKSx1KG8pfWZ1bmN0aW9uIHIoKXtoLm9uKEksbnVsbCkub24oRCxudWxsKSxkKHMpLGMobyl9dmFyIGk9dGhpcyxvPU8ub2YoaSxhcmd1bWVudHMpLHM9MCxoPXVvLnNlbGVjdChuKGkpKS5vbihJLHQpLm9uKEQsciksZj1lKHVvLm1vdXNlKGkpKSxkPUsoaSk7QmwuY2FsbChpKSxsKG8pfWZ1bmN0aW9uIGYoKXtmdW5jdGlvbiB0KCl7dmFyIHQ9dW8udG91Y2hlcyhwKTtyZXR1cm4gZD1rLmssdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuaWRlbnRpZmllciBpbiB2JiYodlt0LmlkZW50aWZpZXJdPWUodCkpfSksdH1mdW5jdGlvbiByKCl7dmFyIGU9dW8uZXZlbnQudGFyZ2V0O3VvLnNlbGVjdChlKS5vbih4LG4pLm9uKF8scyksdy5wdXNoKGUpO2Zvcih2YXIgcj11by5ldmVudC5jaGFuZ2VkVG91Y2hlcyxpPTAsYT1yLmxlbmd0aDtpPGE7KytpKXZbcltpXS5pZGVudGlmaWVyXT1udWxsO3ZhciBsPXQoKSx1PURhdGUubm93KCk7aWYoMT09PWwubGVuZ3RoKXtpZih1LWI8NTAwKXt2YXIgYz1sWzBdO28ocCxjLHZbYy5pZGVudGlmaWVyXSxNYXRoLmZsb29yKE1hdGgubG9nKGsuaykvTWF0aC5MTjIpKzEpLFQoKX1iPXV9ZWxzZSBpZihsLmxlbmd0aD4xKXt2YXIgYz1sWzBdLGg9bFsxXSxmPWNbMF0taFswXSxkPWNbMV0taFsxXTtnPWYqZitkKmR9fWZ1bmN0aW9uIG4oKXt2YXIgdCxlLHIsbixvPXVvLnRvdWNoZXMocCk7QmwuY2FsbChwKTtmb3IodmFyIHM9MCxsPW8ubGVuZ3RoO3M8bDsrK3Msbj1udWxsKWlmKHI9b1tzXSxuPXZbci5pZGVudGlmaWVyXSl7aWYoZSlicmVhazt0PXIsZT1ufWlmKG4pe3ZhciBjPShjPXJbMF0tdFswXSkqYysoYz1yWzFdLXRbMV0pKmMsaD1nJiZNYXRoLnNxcnQoYy9nKTt0PVsodFswXStyWzBdKS8yLCh0WzFdK3JbMV0pLzJdLGU9WyhlWzBdK25bMF0pLzIsKGVbMV0rblsxXSkvMl0saShoKmQpfWI9bnVsbCxhKHQsZSksdShtKX1mdW5jdGlvbiBzKCl7aWYodW8uZXZlbnQudG91Y2hlcy5sZW5ndGgpe2Zvcih2YXIgZT11by5ldmVudC5jaGFuZ2VkVG91Y2hlcyxyPTAsbj1lLmxlbmd0aDtyPG47KytyKWRlbGV0ZSB2W2Vbcl0uaWRlbnRpZmllcl07Zm9yKHZhciBpIGluIHYpcmV0dXJuIHZvaWQgdCgpfXVvLnNlbGVjdEFsbCh3KS5vbih5LG51bGwpLE0ub24oeixoKS5vbihQLGYpLEEoKSxjKG0pfXZhciBkLHA9dGhpcyxtPU8ub2YocCxhcmd1bWVudHMpLHY9e30sZz0wLHk9Ii56b29tLSIrdW8uZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcix4PSJ0b3VjaG1vdmUiK3ksXz0idG91Y2hlbmQiK3ksdz1bXSxNPXVvLnNlbGVjdChwKSxBPUsocCk7cigpLGwobSksTS5vbih6LG51bGwpLm9uKFAscil9ZnVuY3Rpb24gZCgpe3ZhciB0PU8ub2YodGhpcyxhcmd1bWVudHMpO3k/Y2xlYXJUaW1lb3V0KHkpOihCbC5jYWxsKHRoaXMpLG09ZSh2PWd8fHVvLm1vdXNlKHRoaXMpKSxsKHQpKSx5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt5PW51bGwsYyh0KX0sNTApLFQoKSxpKE1hdGgucG93KDIsLjAwMipZbygpKSprLmspLGEodixtKSx1KHQpfWZ1bmN0aW9uIHAoKXt2YXIgdD11by5tb3VzZSh0aGlzKSxyPU1hdGgubG9nKGsuaykvTWF0aC5MTjI7byh0aGlzLHQsZSh0KSx1by5ldmVudC5zaGlmdEtleT9NYXRoLmNlaWwociktMTpNYXRoLmZsb29yKHIpKzEpfXZhciBtLHYsZyx5LGIseCxfLHcsTSxrPXt4OjAseTowLGs6MX0sQT1bOTYwLDUwMF0sUz1XbyxMPTI1MCxDPTAsej0ibW91c2Vkb3duLnpvb20iLEk9Im1vdXNlbW92ZS56b29tIixEPSJtb3VzZXVwLnpvb20iLFA9InRvdWNoc3RhcnQuem9vbSIsTz1FKHQsInpvb21zdGFydCIsInpvb20iLCJ6b29tZW5kIik7cmV0dXJuIFhvfHwoWG89Im9ud2hlZWwiaW4gZm8/KFlvPWZ1bmN0aW9uKCl7cmV0dXJuLXVvLmV2ZW50LmRlbHRhWSoodW8uZXZlbnQuZGVsdGFNb2RlPzEyMDoxKX0sIndoZWVsIik6Im9ubW91c2V3aGVlbCJpbiBmbz8oWW89ZnVuY3Rpb24oKXtyZXR1cm4gdW8uZXZlbnQud2hlZWxEZWx0YX0sIm1vdXNld2hlZWwiKTooWW89ZnVuY3Rpb24oKXtyZXR1cm4tdW8uZXZlbnQuZGV0YWlsfSwiTW96TW91c2VQaXhlbFNjcm9sbCIpKSx0LmV2ZW50PWZ1bmN0aW9uKHQpe3QuZWFjaChmdW5jdGlvbigpe3ZhciB0PU8ub2YodGhpcyxhcmd1bWVudHMpLGU9aztqbD91by5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7az10aGlzLl9fY2hhcnRfX3x8e3g6MCx5OjAsazoxfSxsKHQpfSkudHdlZW4oInpvb206em9vbSIsZnVuY3Rpb24oKXt2YXIgcj1BWzBdLG49QVsxXSxpPXY/dlswXTpyLzIsYT12P3ZbMV06bi8yLG89dW8uaW50ZXJwb2xhdGVab29tKFsoaS1rLngpL2suaywoYS1rLnkpL2suayxyL2sua10sWyhpLWUueCkvZS5rLChhLWUueSkvZS5rLHIvZS5rXSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPW8oZSkscz1yL25bMl07dGhpcy5fX2NoYXJ0X189az17eDppLW5bMF0qcyx5OmEtblsxXSpzLGs6c30sdSh0KX19KS5lYWNoKCJpbnRlcnJ1cHQuem9vbSIsZnVuY3Rpb24oKXtjKHQpfSkuZWFjaCgiZW5kLnpvb20iLGZ1bmN0aW9uKCl7Yyh0KX0pOih0aGlzLl9fY2hhcnRfXz1rLGwodCksdSh0KSxjKHQpKX0pfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDorZVswXSx5OitlWzFdLGs6ay5rfSxzKCksdCk6W2sueCxrLnldfSx0LnNjYWxlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPXt4OmsueCx5OmsueSxrOm51bGx9LGkoK2UpLHMoKSx0KTprLmt9LHQuc2NhbGVFeHRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFM9bnVsbD09ZT9XbzpbK2VbMF0sK2VbMV1dLHQpOlN9LHQuY2VudGVyPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPWUmJlsrZVswXSwrZVsxXV0sdCk6Z30sdC5zaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhBPWUmJlsrZVswXSwrZVsxXV0sdCk6QX0sdC5kdXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTD0rZSx0KTpMfSx0Lng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF89ZSx4PWUuY29weSgpLGs9e3g6MCx5OjAsazoxfSx0KTpffSx0Lnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09ZSx3PWUuY29weSgpLGs9e3g6MCx5OjAsazoxfSx0KTpNfSx1by5yZWJpbmQodCxPLCJvbiIpfTt2YXIgWW8sWG8sV289WzAsMS8wXTt1by5jb2xvcj1sdCxsdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKSsiIn0sdW8uaHNsPXV0O3ZhciBabz11dC5wcm90b3R5cGU9bmV3IGx0O1pvLmJyaWdodGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/dDoxKSxuZXcgdXQodGhpcy5oLHRoaXMucyx0aGlzLmwvdCl9LFpvLmRhcmtlcj1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP3Q6MSksbmV3IHV0KHRoaXMuaCx0aGlzLnMsdCp0aGlzLmwpfSxaby5yZ2I9ZnVuY3Rpb24oKXtyZXR1cm4gY3QodGhpcy5oLHRoaXMucyx0aGlzLmwpfSx1by5oY2w9aHQ7dmFyIEpvPWh0LnByb3RvdHlwZT1uZXcgbHQ7Sm8uYnJpZ2h0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBodCh0aGlzLmgsdGhpcy5jLE1hdGgubWluKDEwMCx0aGlzLmwrS28qKGFyZ3VtZW50cy5sZW5ndGg/dDoxKSkpfSxKby5kYXJrZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBodCh0aGlzLmgsdGhpcy5jLE1hdGgubWF4KDAsdGhpcy5sLUtvKihhcmd1bWVudHMubGVuZ3RoP3Q6MSkpKX0sSm8ucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGZ0KHRoaXMuaCx0aGlzLmMsdGhpcy5sKS5yZ2IoKX0sdW8ubGFiPWR0O3ZhciBLbz0xOCxRbz0uOTUwNDcsJG89MSx0cz0xLjA4ODgzLGVzPWR0LnByb3RvdHlwZT1uZXcgbHQ7ZXMuYnJpZ2h0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBkdChNYXRoLm1pbigxMDAsdGhpcy5sK0tvKihhcmd1bWVudHMubGVuZ3RoP3Q6MSkpLHRoaXMuYSx0aGlzLmIpfSxlcy5kYXJrZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBkdChNYXRoLm1heCgwLHRoaXMubC1LbyooYXJndW1lbnRzLmxlbmd0aD90OjEpKSx0aGlzLmEsdGhpcy5iKX0sZXMucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIHB0KHRoaXMubCx0aGlzLmEsdGhpcy5iKX0sdW8ucmdiPWJ0O3ZhciBycz1idC5wcm90b3R5cGU9bmV3IGx0O3JzLmJyaWdodGVyPWZ1bmN0aW9uKHQpe3Q9TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD90OjEpO3ZhciBlPXRoaXMucixyPXRoaXMuZyxuPXRoaXMuYixpPTMwO3JldHVybiBlfHxyfHxuPyhlJiZlPGkmJihlPWkpLHImJnI8aSYmKHI9aSksbiYmbjxpJiYobj1pKSxuZXcgYnQoTWF0aC5taW4oMjU1LGUvdCksTWF0aC5taW4oMjU1LHIvdCksTWF0aC5taW4oMjU1LG4vdCkpKTpuZXcgYnQoaSxpLGkpfSxycy5kYXJrZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD90OjEpLG5ldyBidCh0KnRoaXMucix0KnRoaXMuZyx0KnRoaXMuYil9LHJzLmhzbD1mdW5jdGlvbigpe3JldHVybiBrdCh0aGlzLnIsdGhpcy5nLHRoaXMuYil9LHJzLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIiMiK3d0KHRoaXMucikrd3QodGhpcy5nKSt3dCh0aGlzLmIpfTt2YXIgbnM9dW8ubWFwKHthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9KTtucy5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7bnMuc2V0KHQseHQoZSkpfSksdW8uZnVuY3Rvcj1FdCx1by54aHI9THQoeCksdW8uZHN2PWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcih0LHIsYSl7YXJndW1lbnRzLmxlbmd0aDwzJiYoYT1yLHI9bnVsbCk7dmFyIG89Q3QodCxlLG51bGw9PXI/bjppKHIpLGEpO3JldHVybiBvLnJvdz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9vLnJlc3BvbnNlKG51bGw9PShyPXQpP246aSh0KSk6cn0sb31mdW5jdGlvbiBuKHQpe3JldHVybiByLnBhcnNlKHQucmVzcG9uc2VUZXh0KX1mdW5jdGlvbiBpKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gci5wYXJzZShlLnJlc3BvbnNlVGV4dCx0KX19ZnVuY3Rpb24gYShlKXtyZXR1cm4gZS5tYXAobykuam9pbih0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBzLnRlc3QodCk/JyInK3QucmVwbGFjZSgvXCIvZywnIiInKSsnIic6dH12YXIgcz1uZXcgUmVnRXhwKCdbIicrdCsiXG5dIiksbD10LmNoYXJDb2RlQXQoMCk7cmV0dXJuIHIucGFyc2U9ZnVuY3Rpb24odCxlKXt2YXIgbjtyZXR1cm4gci5wYXJzZVJvd3ModCxmdW5jdGlvbih0LHIpe2lmKG4pcmV0dXJuIG4odCxyLTEpO3ZhciBpPW5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcChmdW5jdGlvbih0LGUpe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrZSsiXSJ9KS5qb2luKCIsIikrIn0iKTtuPWU/ZnVuY3Rpb24odCxyKXtyZXR1cm4gZShpKHQpLHIpfTppfSl9LHIucGFyc2VSb3dzPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcigpe2lmKGM+PXUpcmV0dXJuIG87aWYoaSlyZXR1cm4gaT0hMSxhO3ZhciBlPWM7aWYoMzQ9PT10LmNoYXJDb2RlQXQoZSkpe2Zvcih2YXIgcj1lO3IrKzx1OylpZigzND09PXQuY2hhckNvZGVBdChyKSl7aWYoMzQhPT10LmNoYXJDb2RlQXQocisxKSlicmVhazsrK3J9Yz1yKzI7dmFyIG49dC5jaGFyQ29kZUF0KHIrMSk7cmV0dXJuIDEzPT09bj8oaT0hMCwxMD09PXQuY2hhckNvZGVBdChyKzIpJiYrK2MpOjEwPT09biYmKGk9ITApLHQuc2xpY2UoZSsxLHIpLnJlcGxhY2UoLyIiL2csJyInKX1mb3IoO2M8dTspe3ZhciBuPXQuY2hhckNvZGVBdChjKyspLHM9MTtpZigxMD09PW4paT0hMDtlbHNlIGlmKDEzPT09bilpPSEwLDEwPT09dC5jaGFyQ29kZUF0KGMpJiYoKytjLCsrcyk7ZWxzZSBpZihuIT09bCljb250aW51ZTtyZXR1cm4gdC5zbGljZShlLGMtcyl9cmV0dXJuIHQuc2xpY2UoZSl9Zm9yKHZhciBuLGksYT17fSxvPXt9LHM9W10sdT10Lmxlbmd0aCxjPTAsaD0wOyhuPXIoKSkhPT1vOyl7Zm9yKHZhciBmPVtdO24hPT1hJiZuIT09bzspZi5wdXNoKG4pLG49cigpO2UmJm51bGw9PShmPWUoZixoKyspKXx8cy5wdXNoKGYpfXJldHVybiBzfSxyLmZvcm1hdD1mdW5jdGlvbihlKXtpZihBcnJheS5pc0FycmF5KGVbMF0pKXJldHVybiByLmZvcm1hdFJvd3MoZSk7dmFyIG49bmV3IGIsaT1bXTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0KW4uaGFzKGUpfHxpLnB1c2gobi5hZGQoZSkpfSksW2kubWFwKG8pLmpvaW4odCldLmNvbmNhdChlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gaS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG8oZVt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9LHIuZm9ybWF0Um93cz1mdW5jdGlvbih0KXtyZXR1cm4gdC5tYXAoYSkuam9pbigiXG4iKX0scn0sdW8uY3N2PXVvLmRzdigiLCIsInRleHQvY3N2IiksdW8udHN2PXVvLmRzdigiXHQiLCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIik7dmFyIGlzLGFzLG9zLHNzLGxzPXRoaXNbdyh0aGlzLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKV18fGZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O3VvLnRpbWVyPWZ1bmN0aW9uKCl7RHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSx1by50aW1lci5mbHVzaD1mdW5jdGlvbigpe090KCksUnQoKX0sdW8ucm91bmQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZT9NYXRoLnJvdW5kKHQqKGU9TWF0aC5wb3coMTAsZSkpKS9lOk1hdGgucm91bmQodCl9O3ZhciB1cz1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIlx4YjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXS5tYXAoanQpO3VvLmZvcm1hdFByZWZpeD1mdW5jdGlvbih0LGUpe3ZhciByPTA7cmV0dXJuKHQ9K3QpJiYodDwwJiYodCo9LTEpLGUmJih0PXVvLnJvdW5kKHQsRnQodCxlKSkpLHI9MStNYXRoLmZsb29yKDFlLTEyK01hdGgubG9nKHQpL01hdGguTE4xMCkscj1NYXRoLm1heCgtMjQsTWF0aC5taW4oMjQsMypNYXRoLmZsb29yKChyLTEpLzMpKSkpLHVzWzgrci8zXX07dmFyIGNzPS8oPzooW157XSk/KFs8Pj1eXSkpPyhbK1wtIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLi0/XGQrKT8oW2EteiVdKT8vaSxocz11by5tYXAoe2I6ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodCl9LG86ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9TdHJpbmcoOCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9TdHJpbmcoMTYpfSxYOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSxnOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9QcmVjaXNpb24oZSl9LGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0V4cG9uZW50aWFsKGUpfSxmOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9GaXhlZChlKX0scjpmdW5jdGlvbih0LGUpe3JldHVybih0PXVvLnJvdW5kKHQsRnQodCxlKSkpLnRvRml4ZWQoTWF0aC5tYXgoMCxNYXRoLm1pbigyMCxGdCh0KigxKzFlLTE1KSxlKSkpKX19KSxmcz11by50aW1lPXt9LGRzPURhdGU7VXQucHJvdG90eXBlPXtnZXREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXRlKCl9LGdldERheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDRGF5KCl9LGdldEZ1bGxZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENGdWxsWWVhcigpfSxnZXRIb3VyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDSG91cnMoKX0sZ2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaWxsaXNlY29uZHMoKX0sZ2V0TWludXRlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTWludXRlcygpfSxnZXRNb250aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTW9udGgoKX0sZ2V0U2Vjb25kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDU2Vjb25kcygpfSxnZXRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRUaW1lKCl9LGdldFRpbWV6b25lT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLnZhbHVlT2YoKX0sc2V0RGF0ZTpmdW5jdGlvbigpe3BzLnNldFVUQ0RhdGUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldERheTpmdW5jdGlvbigpe3BzLnNldFVUQ0RheS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtwcy5zZXRVVENGdWxsWWVhci5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0SG91cnM6ZnVuY3Rpb24oKXtwcy5zZXRVVENIb3Vycy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7cHMuc2V0VVRDTWlsbGlzZWNvbmRzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaW51dGVzOmZ1bmN0aW9uKCl7cHMuc2V0VVRDTWludXRlcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TW9udGg6ZnVuY3Rpb24oKXtwcy5zZXRVVENNb250aC5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0U2Vjb25kczpmdW5jdGlvbigpe3BzLnNldFVUQ1NlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldFRpbWU6ZnVuY3Rpb24oKXtwcy5zZXRUaW1lLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfX07dmFyIHBzPURhdGUucHJvdG90eXBlO2ZzLnllYXI9VnQoZnVuY3Rpb24odCl7cmV0dXJuIHQ9ZnMuZGF5KHQpLHQuc2V0TW9udGgoMCwxKSx0fSxmdW5jdGlvbih0LGUpe3Quc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpK2UpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRGdWxsWWVhcigpfSksZnMueWVhcnM9ZnMueWVhci5yYW5nZSxmcy55ZWFycy51dGM9ZnMueWVhci51dGMucmFuZ2UsZnMuZGF5PVZ0KGZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBkcygyZTMsMCk7cmV0dXJuIGUuc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpLHQuZ2V0TW9udGgoKSx0LmdldERhdGUoKSksZX0sZnVuY3Rpb24odCxlKXt0LnNldERhdGUodC5nZXREYXRlKCkrZSl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERhdGUoKS0xfSksZnMuZGF5cz1mcy5kYXkucmFuZ2UsZnMuZGF5cy51dGM9ZnMuZGF5LnV0Yy5yYW5nZSxmcy5kYXlPZlllYXI9ZnVuY3Rpb24odCl7dmFyIGU9ZnMueWVhcih0KTtyZXR1cm4gTWF0aC5mbG9vcigodC1lLTZlNCoodC5nZXRUaW1lem9uZU9mZnNldCgpLWUuZ2V0VGltZXpvbmVPZmZzZXQoKSkpLzg2NGU1KX0sWyJzdW5kYXkiLCJtb25kYXkiLCJ0dWVzZGF5Iiwid2VkbmVzZGF5IiwidGh1cnNkYXkiLCJmcmlkYXkiLCJzYXR1cmRheSJdLmZvckVhY2goZnVuY3Rpb24odCxlKXtlPTctZTt2YXIgcj1mc1t0XT1WdChmdW5jdGlvbih0KXtyZXR1cm4odD1mcy5kYXkodCkpLnNldERhdGUodC5nZXREYXRlKCktKHQuZ2V0RGF5KCkrZSklNyksdH0sZnVuY3Rpb24odCxlKXt0LnNldERhdGUodC5nZXREYXRlKCkrNypNYXRoLmZsb29yKGUpKX0sZnVuY3Rpb24odCl7dmFyIHI9ZnMueWVhcih0KS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoZnMuZGF5T2ZZZWFyKHQpKyhyK2UpJTcpLzcpLShyIT09ZSl9KTtmc1t0KyJzIl09ci5yYW5nZSxmc1t0KyJzIl0udXRjPXIudXRjLnJhbmdlLGZzW3QrIk9mWWVhciJdPWZ1bmN0aW9uKHQpe3ZhciByPWZzLnllYXIodCkuZ2V0RGF5KCk7cmV0dXJuIE1hdGguZmxvb3IoKGZzLmRheU9mWWVhcih0KSsocitlKSU3KS83KX19KSxmcy53ZWVrPWZzLnN1bmRheSxmcy53ZWVrcz1mcy5zdW5kYXkucmFuZ2UsZnMud2Vla3MudXRjPWZzLnN1bmRheS51dGMucmFuZ2UsZnMud2Vla09mWWVhcj1mcy5zdW5kYXlPZlllYXI7dmFyIG1zPXsiLSI6IiIsXzoiICIsMDoiMCJ9LHZzPS9eXHMqXGQrLyxncz0vXiUvO3VvLmxvY2FsZT1mdW5jdGlvbih0KXtyZXR1cm57bnVtYmVyRm9ybWF0Ok50KHQpLHRpbWVGb3JtYXQ6cXQodCl9fTt2YXIgeXM9dW8ubG9jYWxlKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXSxkYXRlVGltZToiJWEgJWIgJWUgJVggJVkiLGRhdGU6IiVtLyVkLyVZIix0aW1lOiIlSDolTTolUyIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt1by5mb3JtYXQ9eXMubnVtYmVyRm9ybWF0LHVvLmdlbz17fSxoZS5wcm90b3R5cGU9e3M6MCx0OjAsYWRkOmZ1bmN0aW9uKHQpe2ZlKHQsdGhpcy50LGJzKSxmZShicy5zLHRoaXMucyx0aGlzKSx0aGlzLnM/dGhpcy50Kz1icy50OnRoaXMucz1icy50fSxyZXNldDpmdW5jdGlvbigpe3RoaXMucz10aGlzLnQ9MH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgYnM9bmV3IGhlO3VvLmdlby5zdHJlYW09ZnVuY3Rpb24odCxlKXt0JiZ4cy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP3hzW3QudHlwZV0odCxlKTpkZSh0LGUpfTt2YXIgeHM9e0ZlYXR1cmU6ZnVuY3Rpb24odCxlKXtkZSh0Lmdlb21ldHJ5LGUpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10LmZlYXR1cmVzLG49LTEsaT1yLmxlbmd0aDsrK248aTspZGUocltuXS5nZW9tZXRyeSxlKX19LF9zPXtTcGhlcmU6ZnVuY3Rpb24odCxlKXtlLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbih0LGUpe3Q9dC5jb29yZGluYXRlcyxlLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10LmNvb3JkaW5hdGVzLG49LTEsaT1yLmxlbmd0aDsrK248aTspdD1yW25dLGUucG9pbnQodFswXSx0WzFdLHRbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7cGUodC5jb29yZGluYXRlcyxlLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtmb3IodmFyIHI9dC5jb29yZGluYXRlcyxuPS0xLGk9ci5sZW5ndGg7KytuPGk7KXBlKHJbbl0sZSwwKX0sUG9seWdvbjpmdW5jdGlvbih0LGUpe21lKHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10LmNvb3JkaW5hdGVzLG49LTEsaT1yLmxlbmd0aDsrK248aTspbWUocltuXSxlKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciByPXQuZ2VvbWV0cmllcyxuPS0xLGk9ci5sZW5ndGg7KytuPGk7KWRlKHJbbl0sZSl9fTt1by5nZW8uYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gd3M9MCx1by5nZW8uc3RyZWFtKHQsa3MpLHdzfTt2YXIgd3MsTXM9bmV3IGhlLGtzPXtzcGhlcmU6ZnVuY3Rpb24oKXt3cys9NCpOb30scG9pbnQ6TSxsaW5lU3RhcnQ6TSxsaW5lRW5kOk0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7TXMucmVzZXQoKSxrcy5saW5lU3RhcnQ9dmV9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgdD0yKk1zO3dzKz10PDA/NCpObyt0OnQsa3MubGluZVN0YXJ0PWtzLmxpbmVFbmQ9a3MucG9pbnQ9TX19O3VvLmdlby5ib3VuZHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Yi5wdXNoKHg9W2M9dCxmPXRdKSxlPGgmJihoPWUpLGU+ZCYmKGQ9ZSl9ZnVuY3Rpb24gZShlLHIpe3ZhciBuPWdlKFtlKkhvLHIqSG9dKTtpZihnKXt2YXIgaT1iZShnLG4pLGE9W2lbMV0sLWlbMF0sMF0sbz1iZShhLGkpO3dlKG8pLG89TWUobyk7dmFyIGw9ZS1wLHU9bD4wPzE6LTEsbT1vWzBdKnFvKnUsdj14byhsKT4xODA7aWYodl4odSpwPG0mJm08dSplKSl7dmFyIHk9b1sxXSpxbzt5PmQmJihkPXkpfWVsc2UgaWYobT0obSszNjApJTM2MC0xODAsdl4odSpwPG0mJm08dSplKSl7dmFyIHk9LW9bMV0qcW87eTxoJiYoaD15KX1lbHNlIHI8aCYmKGg9cikscj5kJiYoZD1yKTt2P2U8cD9zKGMsZSk+cyhjLGYpJiYoZj1lKTpzKGUsZik+cyhjLGYpJiYoYz1lKTpmPj1jPyhlPGMmJihjPWUpLGU+ZiYmKGY9ZSkpOmU+cD9zKGMsZSk+cyhjLGYpJiYoZj1lKTpzKGUsZik+cyhjLGYpJiYoYz1lKX1lbHNlIHQoZSxyKTtnPW4scD1lfWZ1bmN0aW9uIHIoKXtfLnBvaW50PWV9ZnVuY3Rpb24gbigpe3hbMF09Yyx4WzFdPWYsXy5wb2ludD10LGc9bnVsbH1mdW5jdGlvbiBpKHQscil7aWYoZyl7dmFyIG49dC1wO3krPXhvKG4pPjE4MD9uKyhuPjA/MzYwOi0zNjApOm59ZWxzZSBtPXQsdj1yO2tzLnBvaW50KHQsciksZSh0LHIpfWZ1bmN0aW9uIGEoKXtrcy5saW5lU3RhcnQoKX1mdW5jdGlvbiBvKCl7aShtLHYpLGtzLmxpbmVFbmQoKSx4byh5KT5GbyYmKGM9LShmPTE4MCkpLHhbMF09Yyx4WzFdPWYsZz1udWxsfWZ1bmN0aW9uIHModCxlKXtyZXR1cm4oZS09dCk8MD9lKzM2MDplfWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gdFswXS1lWzBdfWZ1bmN0aW9uIHUodCxlKXtyZXR1cm4gZVswXTw9ZVsxXT9lWzBdPD10JiZ0PD1lWzFdOnQ8ZVswXXx8ZVsxXTx0fXZhciBjLGgsZixkLHAsbSx2LGcseSxiLHgsXz17cG9pbnQ6dCxsaW5lU3RhcnQ6cixsaW5lRW5kOm4scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Xy5wb2ludD1pLF8ubGluZVN0YXJ0PWEsXy5saW5lRW5kPW8seT0wLGtzLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7a3MucG9seWdvbkVuZCgpLF8ucG9pbnQ9dCxfLmxpbmVTdGFydD1yLF8ubGluZUVuZD1uLE1zPDA/KGM9LShmPTE4MCksaD0tKGQ9OTApKTp5PkZvP2Q9OTA6eTwtRm8mJihoPS05MCkseFswXT1jLHhbMV09Zn19O3JldHVybiBmdW5jdGlvbih0KXtkPWY9LShjPWg9MS8wKSxiPVtdLHVvLmdlby5zdHJlYW0odCxfKTt2YXIgZT1iLmxlbmd0aDtpZihlKXtiLnNvcnQobCk7Zm9yKHZhciByLG49MSxpPWJbMF0sYT1baV07bjxlOysrbilyPWJbbl0sdShyWzBdLGkpfHx1KHJbMV0saSk/KHMoaVswXSxyWzFdKT5zKGlbMF0saVsxXSkmJihpWzFdPXJbMV0pLHMoclswXSxpWzFdKT5zKGlbMF0saVsxXSkmJihpWzBdPXJbMF0pKTphLnB1c2goaT1yKTtmb3IodmFyIG8scixwPS0xLzAsZT1hLmxlbmd0aC0xLG49MCxpPWFbZV07bjw9ZTtpPXIsKytuKXI9YVtuXSwobz1zKGlbMV0sclswXSkpPnAmJihwPW8sYz1yWzBdLGY9aVsxXSl9cmV0dXJuIGI9eD1udWxsLGM9PT0xLzB8fGg9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbYyxoXSxbZixkXV19fSgpLHVvLmdlby5jZW50cm9pZD1mdW5jdGlvbih0KXtBcz1Ucz1Tcz1Fcz1Mcz1Dcz16cz1Jcz1Ecz1Qcz1Pcz0wLHVvLmdlby5zdHJlYW0odCxScyk7dmFyIGU9RHMscj1QcyxuPU9zLGk9ZSplK3IqcituKm47cmV0dXJuIGk8am8mJihlPUNzLHI9enMsbj1JcyxUczxGbyYmKGU9U3Mscj1FcyxuPUxzKSwoaT1lKmUrcipyK24qbik8am8pP1tOYU4sTmFOXTpbTWF0aC5hdGFuMihyLGUpKnFvLG50KG4vTWF0aC5zcXJ0KGkpKSpxb119O3ZhciBBcyxUcyxTcyxFcyxMcyxDcyx6cyxJcyxEcyxQcyxPcyxScz17c3BoZXJlOk0scG9pbnQ6QWUsbGluZVN0YXJ0OlNlLGxpbmVFbmQ6RWUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7UnMubGluZVN0YXJ0PUxlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7UnMubGluZVN0YXJ0PVNlfX0sRnM9T2UoemUsTmUsVWUsWy1ObywtTm8vMl0pLGpzPTFlOTt1by5nZW8uY2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciB0LGUscixuLGksYSxvPXtzdHJlYW06ZnVuY3Rpb24odCl7cmV0dXJuIGkmJihpLnZhbGlkPSExKSxpPWEodCksaS52YWxpZD0hMCxpfSxleHRlbnQ6ZnVuY3Rpb24ocyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9R2UodD0rc1swXVswXSxlPStzWzBdWzFdLHI9K3NbMV1bMF0sbj0rc1sxXVsxXSksaSYmKGkudmFsaWQ9ITEsaT1udWxsKSxvKTpbW3QsZV0sW3Isbl1dfX07cmV0dXJuIG8uZXh0ZW50KFtbMCwwXSxbOTYwLDUwMF1dKX0sKHVvLmdlby5jb25pY0VxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiBZZShYZSl9KS5yYXc9WGUsdW8uZ2VvLmFsYmVycz1mdW5jdGlvbigpe3JldHVybiB1by5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKX0sdW8uZ2VvLmFsYmVyc1VzYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGE9dFswXSxvPXRbMV07cmV0dXJuIGU9bnVsbCxyKGEsbyksZXx8KG4oYSxvKSxlKXx8aShhLG8pLGV9dmFyIGUscixuLGksYT11by5nZW8uYWxiZXJzKCksbz11by5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLHM9dW8uZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGw9e3BvaW50OmZ1bmN0aW9uKHQscil7ZT1bdCxyXX19O3JldHVybiB0LmludmVydD1mdW5jdGlvbih0KXt2YXIgZT1hLnNjYWxlKCkscj1hLnRyYW5zbGF0ZSgpLG49KHRbMF0tclswXSkvZSxpPSh0WzFdLXJbMV0pL2U7cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZuPj0tLjQyNSYmbjwtLjIxND9vOmk+PS4xNjYmJmk8LjIzNCYmbj49LS4yMTQmJm48LS4xMTU/czphKS5pbnZlcnQodCl9LHQuc3RyZWFtPWZ1bmN0aW9uKHQpe3ZhciBlPWEuc3RyZWFtKHQpLHI9by5zdHJlYW0odCksbj1zLnN0cmVhbSh0KTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24odCxpKXtlLnBvaW50KHQsaSksci5wb2ludCh0LGkpLG4ucG9pbnQodCxpKX0sc3BoZXJlOmZ1bmN0aW9uKCl7ZS5zcGhlcmUoKSxyLnNwaGVyZSgpLG4uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe2UubGluZVN0YXJ0KCksci5saW5lU3RhcnQoKSxuLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZS5saW5lRW5kKCksci5saW5lRW5kKCksbi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2UucG9seWdvblN0YXJ0KCksci5wb2x5Z29uU3RhcnQoKSxuLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7ZS5wb2x5Z29uRW5kKCksci5wb2x5Z29uRW5kKCksbi5wb2x5Z29uRW5kKCl9fX0sdC5wcmVjaXNpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEucHJlY2lzaW9uKGUpLG8ucHJlY2lzaW9uKGUpLHMucHJlY2lzaW9uKGUpLHQpOmEucHJlY2lzaW9uKCl9LHQuc2NhbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEuc2NhbGUoZSksby5zY2FsZSguMzUqZSkscy5zY2FsZShlKSx0LnRyYW5zbGF0ZShhLnRyYW5zbGF0ZSgpKSk6YS5zY2FsZSgpfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbihlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYS50cmFuc2xhdGUoKTt2YXIgdT1hLnNjYWxlKCksYz0rZVswXSxoPStlWzFdO3JldHVybiByPWEudHJhbnNsYXRlKGUpLmNsaXBFeHRlbnQoW1tjLS40NTUqdSxoLS4yMzgqdV0sW2MrLjQ1NSp1LGgrLjIzOCp1XV0pLnN0cmVhbShsKS5wb2ludCxuPW8udHJhbnNsYXRlKFtjLS4zMDcqdSxoKy4yMDEqdV0pLmNsaXBFeHRlbnQoW1tjLS40MjUqdStGbyxoKy4xMip1K0ZvXSxbYy0uMjE0KnUtRm8saCsuMjM0KnUtRm9dXSkuc3RyZWFtKGwpLnBvaW50LGk9cy50cmFuc2xhdGUoW2MtLjIwNSp1LGgrLjIxMip1XSkuY2xpcEV4dGVudChbW2MtLjIxNCp1K0ZvLGgrLjE2Nip1K0ZvXSxbYy0uMTE1KnUtRm8saCsuMjM0KnUtRm9dXSkuc3RyZWFtKGwpLnBvaW50LHR9LHQuc2NhbGUoMTA3MCl9O3ZhciBOcyxCcyxVcyxWcyxIcyxxcyxHcz17cG9pbnQ6TSxsaW5lU3RhcnQ6TSxsaW5lRW5kOk0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7QnM9MCxHcy5saW5lU3RhcnQ9V2V9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtHcy5saW5lU3RhcnQ9R3MubGluZUVuZD1Hcy5wb2ludD1NLE5zKz14byhCcy8yKX19LFlzPXtwb2ludDpaZSxsaW5lU3RhcnQ6TSxsaW5lRW5kOk0scG9seWdvblN0YXJ0Ok0scG9seWdvbkVuZDpNfSxYcz17cG9pbnQ6UWUsbGluZVN0YXJ0OiRlLGxpbmVFbmQ6dHIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WHMubGluZVN0YXJ0PWVyfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7WHMucG9pbnQ9UWUsWHMubGluZVN0YXJ0PSRlLFhzLmxpbmVFbmQ9dHJ9fTt1by5nZW8ucGF0aD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQmJigiZnVuY3Rpb24iPT10eXBlb2YgcyYmYS5wb2ludFJhZGl1cygrcy5hcHBseSh0aGlzLGFyZ3VtZW50cykpLG8mJm8udmFsaWR8fChvPWkoYSkpLHVvLmdlby5zdHJlYW0odCxvKSksYS5yZXN1bHQoKX1mdW5jdGlvbiBlKCl7cmV0dXJuIG89bnVsbCx0fXZhciByLG4saSxhLG8scz00LjU7cmV0dXJuIHQuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gTnM9MCx1by5nZW8uc3RyZWFtKHQsaShHcykpLE5zfSx0LmNlbnRyb2lkPWZ1bmN0aW9uKHQpe3JldHVybiBTcz1Fcz1Mcz1Dcz16cz1Jcz1Ecz1Qcz1Pcz0wLHVvLmdlby5zdHJlYW0odCxpKFhzKSksT3M/W0RzL09zLFBzL09zXTpJcz9bQ3MvSXMsenMvSXNdOkxzP1tTcy9McyxFcy9Mc106W05hTixOYU5dfSx0LmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gSHM9cXM9LShVcz1Wcz0xLzApLHVvLmdlby5zdHJlYW0odCxpKFlzKSksW1tVcyxWc10sW0hzLHFzXV19LHQucHJvamVjdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0ocj10KT90LnN0cmVhbXx8aXIodCk6eCxlKCkpOnJ9LHQuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1udWxsPT0obj10KT9uZXcgSmU6bmV3IHJyKHQpLCJmdW5jdGlvbiIhPXR5cGVvZiBzJiZhLnBvaW50UmFkaXVzKHMpLGUoKSk6bn0sdC5wb2ludFJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOihhLnBvaW50UmFkaXVzKCtlKSwrZSksdCk6c30sdC5wcm9qZWN0aW9uKHVvLmdlby5hbGJlcnNVc2EoKSkuY29udGV4dChudWxsKX0sdW8uZ2VvLnRyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm57c3RyZWFtOmZ1bmN0aW9uKGUpe3ZhciByPW5ldyBhcihlKTtmb3IodmFyIG4gaW4gdClyW25dPXRbbl07cmV0dXJuIHJ9fX0sYXIucHJvdG90eXBlPXtwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuc3RyZWFtLnBvaW50KHQsZSl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fSx1by5nZW8ucHJvamVjdGlvbj1zcix1by5nZW8ucHJvamVjdGlvbk11dGF0b3I9bHIsKHVvLmdlby5lcXVpcmVjdGFuZ3VsYXI9ZnVuY3Rpb24oKXtyZXR1cm4gc3IoY3IpfSkucmF3PWNyLmludmVydD1jcix1by5nZW8ucm90YXRpb249ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZT10KGVbMF0qSG8sZVsxXSpIbyksZVswXSo9cW8sZVsxXSo9cW8sZX1yZXR1cm4gdD1mcih0WzBdJTM2MCpIbyx0WzFdKkhvLHQubGVuZ3RoPjI/dFsyXSpIbzowKSxlLmludmVydD1mdW5jdGlvbihlKXtyZXR1cm4gZT10LmludmVydChlWzBdKkhvLGVbMV0qSG8pLGVbMF0qPXFvLGVbMV0qPXFvLGV9LGV9LGhyLmludmVydD1jcix1by5nZW8uY2lyY2xlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm4sZT1mcigtdFswXSpIbywtdFsxXSpIbywwKS5pbnZlcnQsaT1bXTtyZXR1cm4gcihudWxsLG51bGwsMSx7cG9pbnQ6ZnVuY3Rpb24odCxyKXtpLnB1c2godD1lKHQscikpLHRbMF0qPXFvLHRbMV0qPXFvfX0pLHt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaV19fXZhciBlLHIsbj1bMCwwXSxpPTY7cmV0dXJuIHQub3JpZ2luPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUsdCk6bn0sdC5hbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj12cigoZT0rbikqSG8saSpIbyksdCk6ZX0sdC5wcmVjaXNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dnIoZSpIbywoaT0rbikqSG8pLHQpOml9LHQuYW5nbGUoOTApfSx1by5nZW8uZGlzdGFuY2U9ZnVuY3Rpb24odCxlKXt2YXIgcixuPShlWzBdLXRbMF0pKkhvLGk9dFsxXSpIbyxhPWVbMV0qSG8sbz1NYXRoLnNpbihuKSxzPU1hdGguY29zKG4pLGw9TWF0aC5zaW4oaSksdT1NYXRoLmNvcyhpKSxjPU1hdGguc2luKGEpLGg9TWF0aC5jb3MoYSk7cmV0dXJuIE1hdGguYXRhbjIoTWF0aC5zcXJ0KChyPWgqbykqcisocj11KmMtbCpoKnMpKnIpLGwqYyt1Kmgqcyl9LHVvLmdlby5ncmF0aWN1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6ZSgpfX1mdW5jdGlvbiBlKCl7cmV0dXJuIHVvLnJhbmdlKE1hdGguY2VpbChhL3YpKnYsaSx2KS5tYXAoZikuY29uY2F0KHVvLnJhbmdlKE1hdGguY2VpbCh1L2cpKmcsbCxnKS5tYXAoZCkpLmNvbmNhdCh1by5yYW5nZShNYXRoLmNlaWwobi9wKSpwLHIscCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB4byh0JXYpPkZvfSkubWFwKGMpKS5jb25jYXQodW8ucmFuZ2UoTWF0aC5jZWlsKHMvbSkqbSxvLG0pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4geG8odCVnKT5Gb30pLm1hcChoKSl9dmFyIHIsbixpLGEsbyxzLGwsdSxjLGgsZixkLHA9MTAsbT1wLHY9OTAsZz0zNjAseT0yLjU7cmV0dXJuIHQubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gZSgpLm1hcChmdW5jdGlvbih0KXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dH19KX0sdC5vdXRsaW5lPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltmKGEpLmNvbmNhdChkKGwpLnNsaWNlKDEpLGYoaSkucmV2ZXJzZSgpLnNsaWNlKDEpLGQodSkucmV2ZXJzZSgpLnNsaWNlKDEpKV19fSx0LmV4dGVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90Lm1ham9yRXh0ZW50KGUpLm1pbm9yRXh0ZW50KGUpOnQubWlub3JFeHRlbnQoKX0sdC5tYWpvckV4dGVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rZVswXVswXSxpPStlWzFdWzBdLHU9K2VbMF1bMV0sbD0rZVsxXVsxXSxhPmkmJihlPWEsYT1pLGk9ZSksdT5sJiYoZT11LHU9bCxsPWUpLHQucHJlY2lzaW9uKHkpKTpbW2EsdV0sW2ksbF1dfSx0Lm1pbm9yRXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStlWzBdWzBdLHI9K2VbMV1bMF0scz0rZVswXVsxXSxvPStlWzFdWzFdLG4+ciYmKGU9bixuPXIscj1lKSxzPm8mJihlPXMscz1vLG89ZSksdC5wcmVjaXNpb24oeSkpOltbbixzXSxbcixvXV19LHQuc3RlcD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90Lm1ham9yU3RlcChlKS5taW5vclN0ZXAoZSk6dC5taW5vclN0ZXAoKX0sdC5tYWpvclN0ZXA9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9K2VbMF0sZz0rZVsxXSx0KTpbdixnXX0sdC5taW5vclN0ZXA9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9K2VbMF0sbT0rZVsxXSx0KTpbcCxtXX0sdC5wcmVjaXNpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K2UsYz15cihzLG8sOTApLGg9YnIobixyLHkpLGY9eXIodSxsLDkwKSxkPWJyKGEsaSx5KSx0KTp5fSx0Lm1ham9yRXh0ZW50KFtbLTE4MCwtOTArRm9dLFsxODAsOTAtRm9dXSkubWlub3JFeHRlbnQoW1stMTgwLC04MC1Gb10sWzE4MCw4MCtGb11dKX0sdW8uZ2VvLmdyZWF0QXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3JldHVybnsKdHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W2V8fG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHJ8fGkuYXBwbHkodGhpcyxhcmd1bWVudHMpXX19dmFyIGUscixuPXhyLGk9X3I7cmV0dXJuIHQuZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdW8uZ2VvLmRpc3RhbmNlKGV8fG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHJ8fGkuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sdC5zb3VyY2U9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49cixlPSJmdW5jdGlvbiI9PXR5cGVvZiByP251bGw6cix0KTpufSx0LnRhcmdldD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1lLHI9ImZ1bmN0aW9uIj09dHlwZW9mIGU/bnVsbDplLHQpOml9LHQucHJlY2lzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dDowfSx0fSx1by5nZW8uaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gd3IodFswXSpIbyx0WzFdKkhvLGVbMF0qSG8sZVsxXSpIbyl9LHVvLmdlby5sZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIFdzPTAsdW8uZ2VvLnN0cmVhbSh0LFpzKSxXc307dmFyIFdzLFpzPXtzcGhlcmU6TSxwb2ludDpNLGxpbmVTdGFydDpNcixsaW5lRW5kOk0scG9seWdvblN0YXJ0Ok0scG9seWdvbkVuZDpNfSxKcz1rcihmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KDIvKDErdCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gMipNYXRoLmFzaW4odC8yKX0pOyh1by5nZW8uYXppbXV0aGFsRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHNyKEpzKX0pLnJhdz1Kczt2YXIgS3M9a3IoZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5hY29zKHQpO3JldHVybiBlJiZlL01hdGguc2luKGUpfSx4KTsodW8uZ2VvLmF6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHNyKEtzKX0pLnJhdz1LcywodW8uZ2VvLmNvbmljQ29uZm9ybWFsPWZ1bmN0aW9uKCl7cmV0dXJuIFllKEFyKX0pLnJhdz1BciwodW8uZ2VvLmNvbmljRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gWWUoVHIpfSkucmF3PVRyO3ZhciBRcz1rcihmdW5jdGlvbih0KXtyZXR1cm4gMS90fSxNYXRoLmF0YW4pOyh1by5nZW8uZ25vbW9uaWM9ZnVuY3Rpb24oKXtyZXR1cm4gc3IoUXMpfSkucmF3PVFzLFNyLmludmVydD1mdW5jdGlvbih0LGUpe3JldHVyblt0LDIqTWF0aC5hdGFuKE1hdGguZXhwKGUpKS1Wb119LCh1by5nZW8ubWVyY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gRXIoU3IpfSkucmF3PVNyO3ZhciAkcz1rcihmdW5jdGlvbigpe3JldHVybiAxfSxNYXRoLmFzaW4pOyh1by5nZW8ub3J0aG9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIHNyKCRzKX0pLnJhdz0kczt2YXIgdGw9a3IoZnVuY3Rpb24odCl7cmV0dXJuIDEvKDErdCl9LGZ1bmN0aW9uKHQpe3JldHVybiAyKk1hdGguYXRhbih0KX0pOyh1by5nZW8uc3RlcmVvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiBzcih0bCl9KS5yYXc9dGwsTHIuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuWy1lLDIqTWF0aC5hdGFuKE1hdGguZXhwKHQpKS1Wb119LCh1by5nZW8udHJhbnN2ZXJzZU1lcmNhdG9yPWZ1bmN0aW9uKCl7dmFyIHQ9RXIoTHIpLGU9dC5jZW50ZXIscj10LnJvdGF0ZTtyZXR1cm4gdC5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQ/ZShbLXRbMV0sdFswXV0pOih0PWUoKSxbdFsxXSwtdFswXV0pfSx0LnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdD9yKFt0WzBdLHRbMV0sdC5sZW5ndGg+Mj90WzJdKzkwOjkwXSk6KHQ9cigpLFt0WzBdLHRbMV0sdFsyXS05MF0pfSxyKFswLDAsOTBdKX0pLnJhdz1Mcix1by5nZW9tPXt9LHVvLmdlb20uaHVsbD1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe2lmKHQubGVuZ3RoPDMpcmV0dXJuW107dmFyIGUsaT1FdChyKSxhPUV0KG4pLG89dC5sZW5ndGgscz1bXSxsPVtdO2ZvcihlPTA7ZTxvO2UrKylzLnB1c2goWytpLmNhbGwodGhpcyx0W2VdLGUpLCthLmNhbGwodGhpcyx0W2VdLGUpLGVdKTtmb3Iocy5zb3J0KERyKSxlPTA7ZTxvO2UrKylsLnB1c2goW3NbZV1bMF0sLXNbZV1bMV1dKTt2YXIgdT1JcihzKSxjPUlyKGwpLGg9Y1swXT09PXVbMF0sZj1jW2MubGVuZ3RoLTFdPT09dVt1Lmxlbmd0aC0xXSxkPVtdO2ZvcihlPXUubGVuZ3RoLTE7ZT49MDstLWUpZC5wdXNoKHRbc1t1W2VdXVsyXV0pO2ZvcihlPStoO2U8Yy5sZW5ndGgtZjsrK2UpZC5wdXNoKHRbc1tjW2VdXVsyXV0pO3JldHVybiBkfXZhciByPUNyLG49enI7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZSh0KTooZS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsZSk6cn0sZS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZSk6bn0sZSl9LHVvLmdlb20ucG9seWdvbj1mdW5jdGlvbih0KXtyZXR1cm4gQW8odCxlbCksdH07dmFyIGVsPXVvLmdlb20ucG9seWdvbi5wcm90b3R5cGU9W107ZWwuYXJlYT1mdW5jdGlvbigpe2Zvcih2YXIgdCxlPS0xLHI9dGhpcy5sZW5ndGgsbj10aGlzW3ItMV0saT0wOysrZTxyOyl0PW4sbj10aGlzW2VdLGkrPXRbMV0qblswXS10WzBdKm5bMV07cmV0dXJuLjUqaX0sZWwuY2VudHJvaWQ9ZnVuY3Rpb24odCl7dmFyIGUscixuPS0xLGk9dGhpcy5sZW5ndGgsYT0wLG89MCxzPXRoaXNbaS0xXTtmb3IoYXJndW1lbnRzLmxlbmd0aHx8KHQ9LTEvKDYqdGhpcy5hcmVhKCkpKTsrK248aTspZT1zLHM9dGhpc1tuXSxyPWVbMF0qc1sxXS1zWzBdKmVbMV0sYSs9KGVbMF0rc1swXSkqcixvKz0oZVsxXStzWzFdKSpyO3JldHVyblthKnQsbyp0XX0sZWwuY2xpcD1mdW5jdGlvbih0KXtmb3IodmFyIGUscixuLGksYSxvLHM9UnIodCksbD0tMSx1PXRoaXMubGVuZ3RoLVJyKHRoaXMpLGM9dGhpc1t1LTFdOysrbDx1Oyl7Zm9yKGU9dC5zbGljZSgpLHQubGVuZ3RoPTAsaT10aGlzW2xdLGE9ZVsobj1lLmxlbmd0aC1zKS0xXSxyPS0xOysrcjxuOylvPWVbcl0sUHIobyxjLGkpPyhQcihhLGMsaSl8fHQucHVzaChPcihhLG8sYyxpKSksdC5wdXNoKG8pKTpQcihhLGMsaSkmJnQucHVzaChPcihhLG8sYyxpKSksYT1vO3MmJnQucHVzaCh0WzBdKSxjPWl9cmV0dXJuIHR9O3ZhciBybCxubCxpbCxhbCxvbCxzbD1bXSxsbD1bXTtxci5wcm90b3R5cGUucHJlcGFyZT1mdW5jdGlvbigpe2Zvcih2YXIgdCxlPXRoaXMuZWRnZXMscj1lLmxlbmd0aDtyLS07KXQ9ZVtyXS5lZGdlLHQuYiYmdC5hfHxlLnNwbGljZShyLDEpO3JldHVybiBlLnNvcnQoWXIpLGUubGVuZ3RofSxybi5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZS5sPT09dGhpcy5zaXRlP3RoaXMuZWRnZS5hOnRoaXMuZWRnZS5ifSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmI6dGhpcy5lZGdlLmF9fSxubi5wcm90b3R5cGU9e2luc2VydDpmdW5jdGlvbih0LGUpe3ZhciByLG4saTtpZih0KXtpZihlLlA9dCxlLk49dC5OLHQuTiYmKHQuTi5QPWUpLHQuTj1lLHQuUil7Zm9yKHQ9dC5SO3QuTDspdD10Lkw7dC5MPWV9ZWxzZSB0LlI9ZTtyPXR9ZWxzZSB0aGlzLl8/KHQ9bG4odGhpcy5fKSxlLlA9bnVsbCxlLk49dCx0LlA9dC5MPWUscj10KTooZS5QPWUuTj1udWxsLHRoaXMuXz1lLHI9bnVsbCk7Zm9yKGUuTD1lLlI9bnVsbCxlLlU9cixlLkM9ITAsdD1lO3ImJnIuQzspbj1yLlUscj09PW4uTD8oaT1uLlIsaSYmaS5DPyhyLkM9aS5DPSExLG4uQz0hMCx0PW4pOih0PT09ci5SJiYob24odGhpcyxyKSx0PXIscj10LlUpLHIuQz0hMSxuLkM9ITAsc24odGhpcyxuKSkpOihpPW4uTCxpJiZpLkM/KHIuQz1pLkM9ITEsbi5DPSEwLHQ9bik6KHQ9PT1yLkwmJihzbih0aGlzLHIpLHQ9cixyPXQuVSksci5DPSExLG4uQz0hMCxvbih0aGlzLG4pKSkscj10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBlLHIsbixpPXQuVSxhPXQuTCxvPXQuUjtpZihyPWE/bz9sbihvKTphOm8saT9pLkw9PT10P2kuTD1yOmkuUj1yOnRoaXMuXz1yLGEmJm8/KG49ci5DLHIuQz10LkMsci5MPWEsYS5VPXIsciE9PW8/KGk9ci5VLHIuVT10LlUsdD1yLlIsaS5MPXQsci5SPW8sby5VPXIpOihyLlU9aSxpPXIsdD1yLlIpKToobj10LkMsdD1yKSx0JiYodC5VPWkpLCFuKXtpZih0JiZ0LkMpcmV0dXJuIHZvaWQodC5DPSExKTtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKGU9aS5SLGUuQyYmKGUuQz0hMSxpLkM9ITAsb24odGhpcyxpKSxlPWkuUiksZS5MJiZlLkwuQ3x8ZS5SJiZlLlIuQyl7ZS5SJiZlLlIuQ3x8KGUuTC5DPSExLGUuQz0hMCxzbih0aGlzLGUpLGU9aS5SKSxlLkM9aS5DLGkuQz1lLlIuQz0hMSxvbih0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKGU9aS5MLGUuQyYmKGUuQz0hMSxpLkM9ITAsc24odGhpcyxpKSxlPWkuTCksZS5MJiZlLkwuQ3x8ZS5SJiZlLlIuQyl7ZS5MJiZlLkwuQ3x8KGUuUi5DPSExLGUuQz0hMCxvbih0aGlzLGUpLGU9aS5MKSxlLkM9aS5DLGkuQz1lLkwuQz0hMSxzbih0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfWUuQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX0sdW8uZ2VvbS52b3Jvbm9pPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCl7dmFyIGU9bmV3IEFycmF5KHQubGVuZ3RoKSxuPXNbMF1bMF0saT1zWzBdWzFdLGE9c1sxXVswXSxvPXNbMV1bMV07cmV0dXJuIHVuKHIodCkscykuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihyLHMpe3ZhciBsPXIuZWRnZXMsdT1yLnNpdGU7KGVbc109bC5sZW5ndGg/bC5tYXAoZnVuY3Rpb24odCl7dmFyIGU9dC5zdGFydCgpO3JldHVybltlLngsZS55XX0pOnUueD49biYmdS54PD1hJiZ1Lnk+PWkmJnUueTw9bz9bW24sb10sW2Esb10sW2EsaV0sW24saV1dOltdKS5wb2ludD10W3NdfSksZX1mdW5jdGlvbiByKHQpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0LGUpe3JldHVybnt4Ok1hdGgucm91bmQoYSh0LGUpL0ZvKSpGbyx5Ok1hdGgucm91bmQobyh0LGUpL0ZvKSpGbyxpOmV9fSl9dmFyIG49Q3IsaT16cixhPW4sbz1pLHM9dWw7cmV0dXJuIHQ/ZSh0KTooZS5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gdW4ocih0KSkuZWRnZXMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0LmwmJnQucn0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm57c291cmNlOnRbZS5sLmldLHRhcmdldDp0W2Uuci5pXX19KX0sZS50cmlhbmdsZXM9ZnVuY3Rpb24odCl7dmFyIGU9W107cmV0dXJuIHVuKHIodCkpLmNlbGxzLmZvckVhY2goZnVuY3Rpb24ocixuKXtmb3IodmFyIGksYT1yLnNpdGUsbz1yLmVkZ2VzLnNvcnQoWXIpLHM9LTEsbD1vLmxlbmd0aCx1PW9bbC0xXS5lZGdlLGM9dS5sPT09YT91LnI6dS5sOysrczxsOyl1LGk9Yyx1PW9bc10uZWRnZSxjPXUubD09PWE/dS5yOnUubCxuPGkuaSYmbjxjLmkmJmhuKGEsaSxjKTwwJiZlLnB1c2goW3Rbbl0sdFtpLmldLHRbYy5pXV0pfSksZX0sZS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUV0KG49dCksZSk6bn0sZS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUV0KGk9dCksZSk6aX0sZS5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW51bGw9PXQ/dWw6dCxlKTpzPT09dWw/bnVsbDpzfSxlLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZS5jbGlwRXh0ZW50KHQmJltbMCwwXSx0XSk6cz09PXVsP251bGw6cyYmc1sxXX0sZSl9O3ZhciB1bD1bWy0xZTYsLTFlNl0sWzFlNiwxZTZdXTt1by5nZW9tLmRlbGF1bmF5PWZ1bmN0aW9uKHQpe3JldHVybiB1by5nZW9tLnZvcm9ub2koKS50cmlhbmdsZXModCl9LHVvLmdlb20ucXVhZHRyZWU9ZnVuY3Rpb24odCxlLHIsbixpKXtmdW5jdGlvbiBhKHQpe2Z1bmN0aW9uIGEodCxlLHIsbixpLGEsbyxzKXtpZighaXNOYU4ocikmJiFpc05hTihuKSlpZih0LmxlYWYpe3ZhciBsPXQueCxjPXQueTtpZihudWxsIT1sKWlmKHhvKGwtcikreG8oYy1uKTwuMDEpdSh0LGUscixuLGksYSxvLHMpO2Vsc2V7dmFyIGg9dC5wb2ludDt0Lng9dC55PXQucG9pbnQ9bnVsbCx1KHQsaCxsLGMsaSxhLG8scyksdSh0LGUscixuLGksYSxvLHMpfWVsc2UgdC54PXIsdC55PW4sdC5wb2ludD1lfWVsc2UgdSh0LGUscixuLGksYSxvLHMpfWZ1bmN0aW9uIHUodCxlLHIsbixpLG8scyxsKXt2YXIgdT0uNSooaStzKSxjPS41KihvK2wpLGg9cj49dSxmPW4+PWMsZD1mPDwxfGg7dC5sZWFmPSExLHQ9dC5ub2Rlc1tkXXx8KHQubm9kZXNbZF09cG4oKSksaD9pPXU6cz11LGY/bz1jOmw9YyxhKHQsZSxyLG4saSxvLHMsbCl9dmFyIGMsaCxmLGQscCxtLHYsZyx5LGI9RXQocykseD1FdChsKTtpZihudWxsIT1lKW09ZSx2PXIsZz1uLHk9aTtlbHNlIGlmKGc9eT0tKG09dj0xLzApLGg9W10sZj1bXSxwPXQubGVuZ3RoLG8pZm9yKGQ9MDtkPHA7KytkKWM9dFtkXSxjLng8bSYmKG09Yy54KSxjLnk8diYmKHY9Yy55KSxjLng+ZyYmKGc9Yy54KSxjLnk+eSYmKHk9Yy55KSxoLnB1c2goYy54KSxmLnB1c2goYy55KTtlbHNlIGZvcihkPTA7ZDxwOysrZCl7dmFyIF89K2IoYz10W2RdLGQpLHc9K3goYyxkKTtfPG0mJihtPV8pLHc8diYmKHY9dyksXz5nJiYoZz1fKSx3PnkmJih5PXcpLGgucHVzaChfKSxmLnB1c2godyl9dmFyIE09Zy1tLGs9eS12O00+az95PXYrTTpnPW0razt2YXIgQT1wbigpO2lmKEEuYWRkPWZ1bmN0aW9uKHQpe2EoQSx0LCtiKHQsKytkKSwreCh0LGQpLG0sdixnLHkpfSxBLnZpc2l0PWZ1bmN0aW9uKHQpe21uKHQsQSxtLHYsZyx5KX0sQS5maW5kPWZ1bmN0aW9uKHQpe3JldHVybiB2bihBLHRbMF0sdFsxXSxtLHYsZyx5KX0sZD0tMSxudWxsPT1lKXtmb3IoOysrZDxwOylhKEEsdFtkXSxoW2RdLGZbZF0sbSx2LGcseSk7LS1kfWVsc2UgdC5mb3JFYWNoKEEuYWRkKTtyZXR1cm4gaD1mPXQ9Yz1udWxsLEF9dmFyIG8scz1DcixsPXpyO3JldHVybihvPWFyZ3VtZW50cy5sZW5ndGgpPyhzPWZuLGw9ZG4sMz09PW8mJihpPXIsbj1lLHI9ZT0wKSxhKHQpKTooYS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsYSk6c30sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQsYSk6bH0sYS5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/ZT1yPW49aT1udWxsOihlPSt0WzBdWzBdLHI9K3RbMF1bMV0sbj0rdFsxXVswXSxpPSt0WzFdWzFdKSxhKTpudWxsPT1lP251bGw6W1tlLHJdLFtuLGldXX0sYS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2U9cj1uPWk9bnVsbDooZT1yPTAsbj0rdFswXSxpPSt0WzFdKSxhKTpudWxsPT1lP251bGw6W24tZSxpLXJdfSxhKX0sdW8uaW50ZXJwb2xhdGVSZ2I9Z24sdW8uaW50ZXJwb2xhdGVPYmplY3Q9eW4sdW8uaW50ZXJwb2xhdGVOdW1iZXI9Ym4sdW8uaW50ZXJwb2xhdGVTdHJpbmc9eG47dmFyIGNsPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxobD1uZXcgUmVnRXhwKGNsLnNvdXJjZSwiZyIpO3VvLmludGVycG9sYXRlPV9uLHVvLmludGVycG9sYXRvcnM9W2Z1bmN0aW9uKHQsZSl7dmFyIHI9dHlwZW9mIGU7cmV0dXJuKCJzdHJpbmciPT09cj9ucy5oYXMoZS50b0xvd2VyQ2FzZSgpKXx8L14oI3xyZ2JcKHxoc2xcKCkvaS50ZXN0KGUpP2duOnhuOmUgaW5zdGFuY2VvZiBsdD9nbjpBcnJheS5pc0FycmF5KGUpP3duOiJvYmplY3QiPT09ciYmaXNOYU4oZSk/eW46Ym4pKHQsZSl9XSx1by5pbnRlcnBvbGF0ZUFycmF5PXduO3ZhciBmbD1mdW5jdGlvbigpe3JldHVybiB4fSxkbD11by5tYXAoe2xpbmVhcjpmbCxwb2x5OkxuLHF1YWQ6ZnVuY3Rpb24oKXtyZXR1cm4gVG59LGN1YmljOmZ1bmN0aW9uKCl7cmV0dXJuIFNufSxzaW46ZnVuY3Rpb24oKXtyZXR1cm4gQ259LGV4cDpmdW5jdGlvbigpe3JldHVybiB6bn0sY2lyY2xlOmZ1bmN0aW9uKCl7cmV0dXJuIElufSxlbGFzdGljOkRuLGJhY2s6UG4sYm91bmNlOmZ1bmN0aW9uKCl7cmV0dXJuIE9ufX0pLHBsPXVvLm1hcCh7aW46eCxvdXQ6a24sImluLW91dCI6QW4sIm91dC1pbiI6ZnVuY3Rpb24odCl7cmV0dXJuIEFuKGtuKHQpKX19KTt1by5lYXNlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhPZigiLSIpLHI9ZT49MD90LnNsaWNlKDAsZSk6dCxuPWU+PTA/dC5zbGljZShlKzEpOiJpbiI7cmV0dXJuIHI9ZGwuZ2V0KHIpfHxmbCxuPXBsLmdldChuKXx8eCxNbihuKHIuYXBwbHkobnVsbCxjby5jYWxsKGFyZ3VtZW50cywxKSkpKX0sdW8uaW50ZXJwb2xhdGVIY2w9Um4sdW8uaW50ZXJwb2xhdGVIc2w9Rm4sdW8uaW50ZXJwb2xhdGVMYWI9am4sdW8uaW50ZXJwb2xhdGVSb3VuZD1Obix1by50cmFuc2Zvcm09ZnVuY3Rpb24odCl7dmFyIGU9Zm8uY3JlYXRlRWxlbWVudE5TKHVvLm5zLnByZWZpeC5zdmcsImciKTtyZXR1cm4odW8udHJhbnNmb3JtPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe2Uuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpO3ZhciByPWUudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKX1yZXR1cm4gbmV3IEJuKHI/ci5tYXRyaXg6bWwpfSkodCl9LEJuLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIit0aGlzLnRyYW5zbGF0ZSsiKXJvdGF0ZSgiK3RoaXMucm90YXRlKyIpc2tld1goIit0aGlzLnNrZXcrIilzY2FsZSgiK3RoaXMuc2NhbGUrIikifTt2YXIgbWw9e2E6MSxiOjAsYzowLGQ6MSxlOjAsZjowfTt1by5pbnRlcnBvbGF0ZVRyYW5zZm9ybT1abix1by5sYXlvdXQ9e30sdW8ubGF5b3V0LmJ1bmRsZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9W10scj0tMSxuPXQubGVuZ3RoOysrcjxuOyllLnB1c2goUW4odFtyXSkpO3JldHVybiBlfX0sdW8ubGF5b3V0LmNob3JkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0LHUsaCxmLGQscD17fSxtPVtdLHY9dW8ucmFuZ2UoYSksZz1bXTtmb3Iocj1bXSxuPVtdLHQ9MCxmPS0xOysrZjxhOyl7Zm9yKHU9MCxkPS0xOysrZDxhOyl1Kz1pW2ZdW2RdO20ucHVzaCh1KSxnLnB1c2godW8ucmFuZ2UoYSkpLHQrPXV9Zm9yKG8mJnYuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBvKG1bdF0sbVtlXSl9KSxzJiZnLmZvckVhY2goZnVuY3Rpb24odCxlKXt0LnNvcnQoZnVuY3Rpb24odCxyKXtyZXR1cm4gcyhpW2VdW3RdLGlbZV1bcl0pfSl9KSx0PShCby1jKmEpL3QsdT0wLGY9LTE7KytmPGE7KXtmb3IoaD11LGQ9LTE7KytkPGE7KXt2YXIgeT12W2ZdLGI9Z1t5XVtkXSx4PWlbeV1bYl0sXz11LHc9dSs9eCp0O3BbeSsiLSIrYl09e2luZGV4Onksc3ViaW5kZXg6YixzdGFydEFuZ2xlOl8sZW5kQW5nbGU6dyx2YWx1ZTp4fX1uW3ldPXtpbmRleDp5LHN0YXJ0QW5nbGU6aCxlbmRBbmdsZTp1LHZhbHVlOm1beV19LHUrPWN9Zm9yKGY9LTE7KytmPGE7KWZvcihkPWYtMTsrK2Q8YTspe3ZhciBNPXBbZisiLSIrZF0saz1wW2QrIi0iK2ZdOyhNLnZhbHVlfHxrLnZhbHVlKSYmci5wdXNoKE0udmFsdWU8ay52YWx1ZT97c291cmNlOmssdGFyZ2V0Ok19Ontzb3VyY2U6TSx0YXJnZXQ6a30pfWwmJmUoKX1mdW5jdGlvbiBlKCl7ci5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGwoKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlKS8yLChlLnNvdXJjZS52YWx1ZStlLnRhcmdldC52YWx1ZSkvMil9KX12YXIgcixuLGksYSxvLHMsbCx1PXt9LGM9MDtyZXR1cm4gdS5tYXRyaXg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9KGk9dCkmJmkubGVuZ3RoLHI9bj1udWxsLHUpOml9LHUucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz10LHI9bj1udWxsLHUpOmN9LHUuc29ydEdyb3Vwcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10LHI9bj1udWxsLHUpOm99LHUuc29ydFN1Ymdyb3Vwcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LHI9bnVsbCx1KTpzfSx1LnNvcnRDaG9yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCxyJiZlKCksdSk6bH0sdS5jaG9yZHM9ZnVuY3Rpb24oKXtyZXR1cm4gcnx8dCgpLHJ9LHUuZ3JvdXBzPWZ1bmN0aW9uKCl7cmV0dXJuIG58fHQoKSxufSx1fSx1by5sYXlvdXQuZm9yY2U9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiBmdW5jdGlvbihlLHIsbixpKXtpZihlLnBvaW50IT09dCl7dmFyIGE9ZS5jeC10Lngsbz1lLmN5LXQueSxzPWktcixsPWEqYStvKm87aWYocypzL2c8bCl7aWYobDxtKXt2YXIgdT1lLmNoYXJnZS9sO3QucHgtPWEqdSx0LnB5LT1vKnV9cmV0dXJuITB9aWYoZS5wb2ludCYmbCYmbDxtKXt2YXIgdT1lLnBvaW50Q2hhcmdlL2w7dC5weC09YSp1LHQucHktPW8qdX19cmV0dXJuIWUuY2hhcmdlfX1mdW5jdGlvbiBlKHQpe3QucHg9dW8uZXZlbnQueCx0LnB5PXVvLmV2ZW50LnksbC5yZXN1bWUoKX12YXIgcixuLGksYSxvLHMsbD17fSx1PXVvLmRpc3BhdGNoKCJzdGFydCIsInRpY2siLCJlbmQiKSxjPVsxLDFdLGg9LjksZj12bCxkPWdsLHA9LTMwLG09eWwsdj0uMSxnPS42NCx5PVtdLGI9W107cmV0dXJuIGwudGljaz1mdW5jdGlvbigpe2lmKChpKj0uOTkpPC4wMDUpcmV0dXJuIHI9bnVsbCx1LmVuZCh7dHlwZToiZW5kIixhbHBoYTppPTB9KSwhMDt2YXIgZSxuLGwsZixkLG0sZyx4LF8sdz15Lmxlbmd0aCxNPWIubGVuZ3RoO2ZvcihuPTA7bjxNOysrbilsPWJbbl0sZj1sLnNvdXJjZSxkPWwudGFyZ2V0LHg9ZC54LWYueCxfPWQueS1mLnksKG09eCp4K18qXykmJihtPWkqb1tuXSooKG09TWF0aC5zcXJ0KG0pKS1hW25dKS9tLHgqPW0sXyo9bSxkLngtPXgqKGc9Zi53ZWlnaHQrZC53ZWlnaHQ/Zi53ZWlnaHQvKGYud2VpZ2h0K2Qud2VpZ2h0KTouNSksZC55LT1fKmcsZi54Kz14KihnPTEtZyksZi55Kz1fKmcpO2lmKChnPWkqdikmJih4PWNbMF0vMixfPWNbMV0vMixuPS0xLGcpKWZvcig7KytuPHc7KWw9eVtuXSxsLngrPSh4LWwueCkqZyxsLnkrPShfLWwueSkqZztpZihwKWZvcihhaShlPXVvLmdlb20ucXVhZHRyZWUoeSksaSxzKSxuPS0xOysrbjx3OykobD15W25dKS5maXhlZHx8ZS52aXNpdCh0KGwpKTtmb3Iobj0tMTsrK248dzspbD15W25dLGwuZml4ZWQ/KGwueD1sLnB4LGwueT1sLnB5KToobC54LT0obC5weC0obC5weD1sLngpKSpoLGwueS09KGwucHktKGwucHk9bC55KSkqaCk7dS50aWNrKHt0eXBlOiJ0aWNrIixhbHBoYTppfSl9LGwubm9kZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9dCxsKTp5fSxsLmxpbmtzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPXQsbCk6Yn0sbC5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQsbCk6Y30sbC5saW5rRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDordCxsKTpmfSxsLmRpc3RhbmNlPWwubGlua0Rpc3RhbmNlLGwubGlua1N0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6K3QsbCk6ZH0sbC5mcmljdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdCxsKTpofSxsLmNoYXJnZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0iZnVuY3Rpb24iPT10eXBlb2YgdD90Oit0LGwpOnB9LGwuY2hhcmdlRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09dCp0LGwpOk1hdGguc3FydChtKX0sbC5ncmF2aXR5PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PSt0LGwpOnZ9LGwudGhldGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9dCp0LGwpOk1hdGguc3FydChnKX0sbC5hbHBoYT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rdCxpP3Q+MD9pPXQ6KHIuYz1udWxsLHIudD1OYU4scj1udWxsLHUuZW5kKHt0eXBlOiJlbmQiLGFscGhhOmk9MH0pKTp0PjAmJih1LnN0YXJ0KHt0eXBlOiJzdGFydCIsYWxwaGE6aT10fSkscj1EdChsLnRpY2spKSxsKTppfSxsLnN0YXJ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LG4pe2lmKCFyKXtmb3Iocj1uZXcgQXJyYXkoaSksbD0wO2w8aTsrK2wpcltsXT1bXTtmb3IobD0wO2w8dTsrK2wpe3ZhciBhPWJbbF07clthLnNvdXJjZS5pbmRleF0ucHVzaChhLnRhcmdldCksclthLnRhcmdldC5pbmRleF0ucHVzaChhLnNvdXJjZSl9fWZvcih2YXIgbyxzPXJbZV0sbD0tMSxjPXMubGVuZ3RoOysrbDxjOylpZighaXNOYU4obz1zW2xdW3RdKSlyZXR1cm4gbztyZXR1cm4gTWF0aC5yYW5kb20oKSpufXZhciBlLHIsbixpPXkubGVuZ3RoLHU9Yi5sZW5ndGgsaD1jWzBdLG09Y1sxXTtmb3IoZT0wO2U8aTsrK2UpKG49eVtlXSkuaW5kZXg9ZSxuLndlaWdodD0wO2ZvcihlPTA7ZTx1OysrZSluPWJbZV0sIm51bWJlciI9PXR5cGVvZiBuLnNvdXJjZSYmKG4uc291cmNlPXlbbi5zb3VyY2VdKSwibnVtYmVyIj09dHlwZW9mIG4udGFyZ2V0JiYobi50YXJnZXQ9eVtuLnRhcmdldF0pLCsrbi5zb3VyY2Uud2VpZ2h0LCsrbi50YXJnZXQud2VpZ2h0O2ZvcihlPTA7ZTxpOysrZSluPXlbZV0saXNOYU4obi54KSYmKG4ueD10KCJ4IixoKSksaXNOYU4obi55KSYmKG4ueT10KCJ5IixtKSksaXNOYU4obi5weCkmJihuLnB4PW4ueCksaXNOYU4obi5weSkmJihuLnB5PW4ueSk7aWYoYT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZilmb3IoZT0wO2U8dTsrK2UpYVtlXT0rZi5jYWxsKHRoaXMsYltlXSxlKTtlbHNlIGZvcihlPTA7ZTx1OysrZSlhW2VdPWY7aWYobz1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZClmb3IoZT0wO2U8dTsrK2Upb1tlXT0rZC5jYWxsKHRoaXMsYltlXSxlKTtlbHNlIGZvcihlPTA7ZTx1OysrZSlvW2VdPWQ7aWYocz1bXSwiZnVuY3Rpb24iPT10eXBlb2YgcClmb3IoZT0wO2U8aTsrK2Upc1tlXT0rcC5jYWxsKHRoaXMseVtlXSxlKTtlbHNlIGZvcihlPTA7ZTxpOysrZSlzW2VdPXA7cmV0dXJuIGwucmVzdW1lKCl9LGwucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGwuYWxwaGEoLjEpfSxsLnN0b3A9ZnVuY3Rpb24oKXtyZXR1cm4gbC5hbHBoYSgwKX0sbC5kcmFnPWZ1bmN0aW9uKCl7aWYobnx8KG49dW8uYmVoYXZpb3IuZHJhZygpLm9yaWdpbih4KS5vbigiZHJhZ3N0YXJ0LmZvcmNlIixlaSkub24oImRyYWcuZm9yY2UiLGUpLm9uKCJkcmFnZW5kLmZvcmNlIixyaSkpLCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBuO3RoaXMub24oIm1vdXNlb3Zlci5mb3JjZSIsbmkpLm9uKCJtb3VzZW91dC5mb3JjZSIsaWkpLmNhbGwobil9LHVvLnJlYmluZChsLHUsIm9uIil9O3ZhciB2bD0yMCxnbD0xLHlsPTEvMDt1by5sYXlvdXQuaGllcmFyY2h5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChpKXt2YXIgYSxvPVtpXSxzPVtdO2ZvcihpLmRlcHRoPTA7bnVsbCE9KGE9by5wb3AoKSk7KWlmKHMucHVzaChhKSwodT1yLmNhbGwodCxhLGEuZGVwdGgpKSYmKGw9dS5sZW5ndGgpKXtmb3IodmFyIGwsdSxjOy0tbD49MDspby5wdXNoKGM9dVtsXSksYy5wYXJlbnQ9YSxjLmRlcHRoPWEuZGVwdGgrMTtuJiYoYS52YWx1ZT0wKSxhLmNoaWxkcmVuPXV9ZWxzZSBuJiYoYS52YWx1ZT0rbi5jYWxsKHQsYSxhLmRlcHRoKXx8MCksZGVsZXRlIGEuY2hpbGRyZW47cmV0dXJuIGxpKGksZnVuY3Rpb24odCl7dmFyIHIsaTtlJiYocj10LmNoaWxkcmVuKSYmci5zb3J0KGUpLG4mJihpPXQucGFyZW50KSYmKGkudmFsdWUrPXQudmFsdWUpfSksc312YXIgZT1oaSxyPXVpLG49Y2k7cmV0dXJuIHQuc29ydD1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1yLHQpOmV9LHQuY2hpbGRyZW49ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSx0KTpyfSx0LnZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUsdCk6bn0sdC5yZXZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBuJiYoc2koZSxmdW5jdGlvbih0KXt0LmNoaWxkcmVuJiYodC52YWx1ZT0wKX0pLGxpKGUsZnVuY3Rpb24oZSl7dmFyIHI7ZS5jaGlsZHJlbnx8KGUudmFsdWU9K24uY2FsbCh0LGUsZS5kZXB0aCl8fDApLChyPWUucGFyZW50KSYmKHIudmFsdWUrPWUudmFsdWUpfSkpLGV9LHR9LHVvLmxheW91dC5wYXJ0aXRpb249ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUscixuLGkpe3ZhciBhPWUuY2hpbGRyZW47aWYoZS54PXIsZS55PWUuZGVwdGgqaSxlLmR4PW4sZS5keT1pLGEmJihvPWEubGVuZ3RoKSl7dmFyIG8scyxsLHU9LTE7Zm9yKG49ZS52YWx1ZT9uL2UudmFsdWU6MDsrK3U8bzspdChzPWFbdV0scixsPXMudmFsdWUqbixpKSxyKz1sfX1mdW5jdGlvbiBlKHQpe3ZhciByPXQuY2hpbGRyZW4sbj0wO2lmKHImJihpPXIubGVuZ3RoKSlmb3IodmFyIGksYT0tMTsrK2E8aTspbj1NYXRoLm1heChuLGUoclthXSkpO3JldHVybiAxK259ZnVuY3Rpb24gcihyLGEpe3ZhciBvPW4uY2FsbCh0aGlzLHIsYSk7cmV0dXJuIHQob1swXSwwLGlbMF0saVsxXS9lKG9bMF0pKSxvfXZhciBuPXVvLmxheW91dC5oaWVyYXJjaHkoKSxpPVsxLDFdO3JldHVybiByLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxyKTppfSxvaShyLG4pfSx1by5sYXlvdXQucGllPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChvKXt2YXIgcyxsPW8ubGVuZ3RoLHU9by5tYXAoZnVuY3Rpb24ocixuKXtyZXR1cm4rZS5jYWxsKHQscixuKX0pLGM9KygiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKSxoPSgiZnVuY3Rpb24iPT10eXBlb2YgaT9pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppKS1jLGY9TWF0aC5taW4oTWF0aC5hYnMoaCkvbCwrKCJmdW5jdGlvbiI9PXR5cGVvZiBhP2EuYXBwbHkodGhpcyxhcmd1bWVudHMpOmEpKSxkPWYqKGg8MD8tMToxKSxwPXVvLnN1bSh1KSxtPXA/KGgtbCpkKS9wOjAsdj11by5yYW5nZShsKSxnPVtdO3JldHVybiBudWxsIT1yJiZ2LnNvcnQocj09PWJsP2Z1bmN0aW9uKHQsZSl7cmV0dXJuIHVbZV0tdVt0XX06ZnVuY3Rpb24odCxlKXtyZXR1cm4gcihvW3RdLG9bZV0pfSksdi5mb3JFYWNoKGZ1bmN0aW9uKHQpe2dbdF09e2RhdGE6b1t0XSx2YWx1ZTpzPXVbdF0sc3RhcnRBbmdsZTpjLGVuZEFuZ2xlOmMrPXMqbStkLHBhZEFuZ2xlOmZ9fSksZ312YXIgZT1OdW1iZXIscj1ibCxuPTAsaT1CbyxhPTA7cmV0dXJuIHQudmFsdWU9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9cix0KTplfSx0LnNvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSx0KTpyfSx0LnN0YXJ0QW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSx0KTpufSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUsdCk6aX0sdC5wYWRBbmdsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1lLHQpOmF9LHR9O3ZhciBibD17fTt1by5sYXlvdXQuc3RhY2s9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHMsbCl7aWYoIShmPXMubGVuZ3RoKSlyZXR1cm4gczt2YXIgdT1zLm1hcChmdW5jdGlvbihyLG4pe3JldHVybiBlLmNhbGwodCxyLG4pfSksYz11Lm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24oZSxyKXtyZXR1cm5bYS5jYWxsKHQsZSxyKSxvLmNhbGwodCxlLHIpXX0pfSksaD1yLmNhbGwodCxjLGwpO3U9dW8ucGVybXV0ZSh1LGgpLGM9dW8ucGVybXV0ZShjLGgpO3ZhciBmLGQscCxtLHY9bi5jYWxsKHQsYyxsKSxnPXVbMF0ubGVuZ3RoO2ZvcihwPTA7cDxnOysrcClmb3IoaS5jYWxsKHQsdVswXVtwXSxtPXZbcF0sY1swXVtwXVsxXSksZD0xO2Q8ZjsrK2QpaS5jYWxsKHQsdVtkXVtwXSxtKz1jW2QtMV1bcF1bMV0sY1tkXVtwXVsxXSk7cmV0dXJuIHN9dmFyIGU9eCxyPXZpLG49Z2ksaT1taSxhPWRpLG89cGk7cmV0dXJuIHQudmFsdWVzPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXIsdCk6ZX0sdC5vcmRlcj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOnhsLmdldChlKXx8dmksdCk6cn0sdC5vZmZzZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpfbC5nZXQoZSl8fGdpLHQpOm59LHQueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1lLHQpOmF9LHQueT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1lLHQpOm99LHQub3V0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPWUsdCk6aX0sdH07dmFyIHhsPXVvLm1hcCh7Imluc2lkZS1vdXQiOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbj10Lmxlbmd0aCxpPXQubWFwKHlpKSxhPXQubWFwKGJpKSxvPXVvLnJhbmdlKG4pLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gaVt0XS1pW2VdfSkscz0wLGw9MCx1PVtdLGM9W107Zm9yKGU9MDtlPG47KytlKXI9b1tlXSxzPGw/KHMrPWFbcl0sdS5wdXNoKHIpKToobCs9YVtyXSxjLnB1c2gocikpO3JldHVybiBjLnJldmVyc2UoKS5jb25jYXQodSl9LHJldmVyc2U6ZnVuY3Rpb24odCl7cmV0dXJuIHVvLnJhbmdlKHQubGVuZ3RoKS5yZXZlcnNlKCl9LGRlZmF1bHQ6dml9KSxfbD11by5tYXAoe3NpbGhvdWV0dGU6ZnVuY3Rpb24odCl7dmFyIGUscixuLGk9dC5sZW5ndGgsYT10WzBdLmxlbmd0aCxvPVtdLHM9MCxsPVtdO2ZvcihyPTA7cjxhOysrcil7Zm9yKGU9MCxuPTA7ZTxpO2UrKyluKz10W2VdW3JdWzFdO24+cyYmKHM9biksby5wdXNoKG4pfWZvcihyPTA7cjxhOysrcilsW3JdPShzLW9bcl0pLzI7cmV0dXJuIGx9LHdpZ2dsZTpmdW5jdGlvbih0KXt2YXIgZSxyLG4saSxhLG8scyxsLHUsYz10Lmxlbmd0aCxoPXRbMF0sZj1oLmxlbmd0aCxkPVtdO2ZvcihkWzBdPWw9dT0wLHI9MTtyPGY7KytyKXtmb3IoZT0wLGk9MDtlPGM7KytlKWkrPXRbZV1bcl1bMV07Zm9yKGU9MCxhPTAscz1oW3JdWzBdLWhbci0xXVswXTtlPGM7KytlKXtmb3Iobj0wLG89KHRbZV1bcl1bMV0tdFtlXVtyLTFdWzFdKS8oMipzKTtuPGU7KytuKW8rPSh0W25dW3JdWzFdLXRbbl1bci0xXVsxXSkvczthKz1vKnRbZV1bcl1bMV19ZFtyXT1sLT1pP2EvaSpzOjAsbDx1JiYodT1sKX1mb3Iocj0wO3I8ZjsrK3IpZFtyXS09dTtyZXR1cm4gZH0sZXhwYW5kOmZ1bmN0aW9uKHQpe3ZhciBlLHIsbixpPXQubGVuZ3RoLGE9dFswXS5sZW5ndGgsbz0xL2kscz1bXTtmb3Iocj0wO3I8YTsrK3Ipe2ZvcihlPTAsbj0wO2U8aTtlKyspbis9dFtlXVtyXVsxXTtpZihuKWZvcihlPTA7ZTxpO2UrKyl0W2VdW3JdWzFdLz1uO2Vsc2UgZm9yKGU9MDtlPGk7ZSsrKXRbZV1bcl1bMV09b31mb3Iocj0wO3I8YTsrK3Ipc1tyXT0wO3JldHVybiBzfSx6ZXJvOmdpfSk7dW8ubGF5b3V0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxhKXtmb3IodmFyIG8scyxsPVtdLHU9dC5tYXAocix0aGlzKSxjPW4uY2FsbCh0aGlzLHUsYSksaD1pLmNhbGwodGhpcyxjLHUsYSksYT0tMSxmPXUubGVuZ3RoLGQ9aC5sZW5ndGgtMSxwPWU/MToxL2Y7KythPGQ7KW89bFthXT1bXSxvLmR4PWhbYSsxXS0oby54PWhbYV0pLG8ueT0wO2lmKGQ+MClmb3IoYT0tMTsrK2E8ZjspKHM9dVthXSk+PWNbMF0mJnM8PWNbMV0mJihvPWxbdW8uYmlzZWN0KGgscywxLGQpLTFdLG8ueSs9cCxvLnB1c2godFthXSkpO3JldHVybiBsfXZhciBlPSEwLHI9TnVtYmVyLG49TWksaT1faTtyZXR1cm4gdC52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLHQpOnJ9LHQucmFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49RXQoZSksdCk6bn0sdC5iaW5zPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJudW1iZXIiPT10eXBlb2YgZT9mdW5jdGlvbih0KXtyZXR1cm4gd2kodCxlKX06RXQoZSksdCk6aX0sdC5mcmVxdWVuY3k9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ISFyLHQpOmV9LHR9LHVvLmxheW91dC5wYWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGEpe3ZhciBvPXIuY2FsbCh0aGlzLHQsYSkscz1vWzBdLGw9aVswXSx1PWlbMV0sYz1udWxsPT1lP01hdGguc3FydDoiZnVuY3Rpb24iPT10eXBlb2YgZT9lOmZ1bmN0aW9uKCl7cmV0dXJuIGV9O2lmKHMueD1zLnk9MCxsaShzLGZ1bmN0aW9uKHQpe3Qucj0rYyh0LnZhbHVlKX0pLGxpKHMsRWkpLG4pe3ZhciBoPW4qKGU/MTpNYXRoLm1heCgyKnMuci9sLDIqcy5yL3UpKS8yO2xpKHMsZnVuY3Rpb24odCl7dC5yKz1ofSksbGkocyxFaSksbGkocyxmdW5jdGlvbih0KXt0LnItPWh9KX1yZXR1cm4gemkocyxsLzIsdS8yLGU/MToxL01hdGgubWF4KDIqcy5yL2wsMipzLnIvdSkpLG99dmFyIGUscj11by5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChraSksbj0wLGk9WzEsMV07cmV0dXJuIHQuc2l6ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1lLHQpOml9LHQucmFkaXVzPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXJ8fCJmdW5jdGlvbiI9PXR5cGVvZiByP3I6K3IsdCk6ZX0sdC5wYWRkaW5nPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStlLHQpOm59LG9pKHQscil9LHVvLmxheW91dC50cmVlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGkpe3ZhciBjPW8uY2FsbCh0aGlzLHQsaSksaD1jWzBdLGY9ZShoKTtpZihsaShmLHIpLGYucGFyZW50Lm09LWYueixzaShmLG4pLHUpc2koaCxhKTtlbHNle3ZhciBkPWgscD1oLG09aDtzaShoLGZ1bmN0aW9uKHQpe3QueDxkLngmJihkPXQpLHQueD5wLngmJihwPXQpLHQuZGVwdGg+bS5kZXB0aCYmKG09dCl9KTt2YXIgdj1zKGQscCkvMi1kLngsZz1sWzBdLyhwLngrcyhwLGQpLzIrdikseT1sWzFdLyhtLmRlcHRofHwxKTtzaShoLGZ1bmN0aW9uKHQpe3QueD0odC54K3YpKmcsdC55PXQuZGVwdGgqeX0pfXJldHVybiBjfWZ1bmN0aW9uIGUodCl7Zm9yKHZhciBlLHI9e0E6bnVsbCxjaGlsZHJlbjpbdF19LG49W3JdO251bGwhPShlPW4ucG9wKCkpOylmb3IodmFyIGksYT1lLmNoaWxkcmVuLG89MCxzPWEubGVuZ3RoO288czsrK28pbi5wdXNoKChhW29dPWk9e186YVtvXSxwYXJlbnQ6ZSxjaGlsZHJlbjooaT1hW29dLmNoaWxkcmVuKSYmaS5zbGljZSgpfHxbXSxBOm51bGwsYTpudWxsLHo6MCxtOjAsYzowLHM6MCx0Om51bGwsaTpvfSkuYT1pKTtyZXR1cm4gci5jaGlsZHJlblswXX1mdW5jdGlvbiByKHQpe3ZhciBlPXQuY2hpbGRyZW4scj10LnBhcmVudC5jaGlsZHJlbixuPXQuaT9yW3QuaS0xXTpudWxsO2lmKGUubGVuZ3RoKXtGaSh0KTt2YXIgYT0oZVswXS56K2VbZS5sZW5ndGgtMV0ueikvMjtuPyh0Lno9bi56K3ModC5fLG4uXyksdC5tPXQuei1hKTp0Lno9YX1lbHNlIG4mJih0Lno9bi56K3ModC5fLG4uXykpO3QucGFyZW50LkE9aSh0LG4sdC5wYXJlbnQuQXx8clswXSl9ZnVuY3Rpb24gbih0KXt0Ll8ueD10LnordC5wYXJlbnQubSx0Lm0rPXQucGFyZW50Lm19ZnVuY3Rpb24gaSh0LGUscil7aWYoZSl7Zm9yKHZhciBuLGk9dCxhPXQsbz1lLGw9aS5wYXJlbnQuY2hpbGRyZW5bMF0sdT1pLm0sYz1hLm0saD1vLm0sZj1sLm07bz1PaShvKSxpPVBpKGkpLG8mJmk7KWw9UGkobCksYT1PaShhKSxhLmE9dCxuPW8ueitoLWkuei11K3Moby5fLGkuXyksbj4wJiYoUmkoamkobyx0LHIpLHQsbiksdSs9bixjKz1uKSxoKz1vLm0sdSs9aS5tLGYrPWwubSxjKz1hLm07byYmIU9pKGEpJiYoYS50PW8sYS5tKz1oLWMpLGkmJiFQaShsKSYmKGwudD1pLGwubSs9dS1mLHI9dCl9cmV0dXJuIHJ9ZnVuY3Rpb24gYSh0KXt0LngqPWxbMF0sdC55PXQuZGVwdGgqbFsxXX12YXIgbz11by5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxzPURpLGw9WzEsMV0sdT1udWxsO3JldHVybiB0LnNlcGFyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ZSx0KTpzfSx0LnNpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09KGw9ZSk/YTpudWxsLHQpOnU/bnVsbDpsfSx0Lm5vZGVTaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PShsPWUpP251bGw6YSx0KTp1P2w6bnVsbH0sb2kodCxvKX0sdW8ubGF5b3V0LmNsdXN0ZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsYSl7dmFyIG8scz1lLmNhbGwodGhpcyx0LGEpLGw9c1swXSx1PTA7bGkobCxmdW5jdGlvbih0KXt2YXIgZT10LmNoaWxkcmVuO2UmJmUubGVuZ3RoPyh0Lng9QmkoZSksdC55PU5pKGUpKToodC54PW8/dSs9cih0LG8pOjAsdC55PTAsbz10KX0pO3ZhciBjPVVpKGwpLGg9VmkobCksZj1jLngtcihjLGgpLzIsZD1oLngrcihoLGMpLzI7cmV0dXJuIGxpKGwsaT9mdW5jdGlvbih0KXt0Lng9KHQueC1sLngpKm5bMF0sdC55PShsLnktdC55KSpuWzFdfTpmdW5jdGlvbih0KXt0Lng9KHQueC1mKS8oZC1mKSpuWzBdLHQueT0oMS0obC55P3QueS9sLnk6MSkpKm5bMV19KSxzfXZhciBlPXVvLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLHI9RGksbj1bMSwxXSxpPSExO3JldHVybiB0LnNlcGFyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSx0KTpyfSx0LnNpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09KG49ZSksdCk6aT9udWxsOm59LHQubm9kZVNpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbCE9KG49ZSksdCk6aT9uOm51bGx9LG9pKHQsZSl9LHVvLmxheW91dC50cmVlbWFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe2Zvcih2YXIgcixuLGk9LTEsYT10Lmxlbmd0aDsrK2k8YTspbj0ocj10W2ldKS52YWx1ZSooZTwwPzA6ZSksci5hcmVhPWlzTmFOKG4pfHxuPD0wPzA6bn1mdW5jdGlvbiBlKHIpe3ZhciBhPXIuY2hpbGRyZW47aWYoYSYmYS5sZW5ndGgpe3ZhciBvLHMsbCx1PWgociksYz1bXSxmPWEuc2xpY2UoKSxwPTEvMCxtPSJzbGljZSI9PT1kP3UuZHg6ImRpY2UiPT09ZD91LmR5OiJzbGljZS1kaWNlIj09PWQ/MSZyLmRlcHRoP3UuZHk6dS5keDpNYXRoLm1pbih1LmR4LHUuZHkpO2Zvcih0KGYsdS5keCp1LmR5L3IudmFsdWUpLGMuYXJlYT0wOyhsPWYubGVuZ3RoKT4wOyljLnB1c2gobz1mW2wtMV0pLGMuYXJlYSs9by5hcmVhLCJzcXVhcmlmeSIhPT1kfHwocz1uKGMsbSkpPD1wPyhmLnBvcCgpLHA9cyk6KGMuYXJlYS09Yy5wb3AoKS5hcmVhLGkoYyxtLHUsITEpLG09TWF0aC5taW4odS5keCx1LmR5KSxjLmxlbmd0aD1jLmFyZWE9MCxwPTEvMCk7Yy5sZW5ndGgmJihpKGMsbSx1LCEwKSxjLmxlbmd0aD1jLmFyZWE9MCksYS5mb3JFYWNoKGUpfX1mdW5jdGlvbiByKGUpe3ZhciBuPWUuY2hpbGRyZW47aWYobiYmbi5sZW5ndGgpe3ZhciBhLG89aChlKSxzPW4uc2xpY2UoKSxsPVtdO2Zvcih0KHMsby5keCpvLmR5L2UudmFsdWUpLGwuYXJlYT0wO2E9cy5wb3AoKTspbC5wdXNoKGEpLGwuYXJlYSs9YS5hcmVhLG51bGwhPWEueiYmKGkobCxhLno/by5keDpvLmR5LG8sIXMubGVuZ3RoKSxsLmxlbmd0aD1sLmFyZWE9MCk7bi5mb3JFYWNoKHIpfX1mdW5jdGlvbiBuKHQsZSl7Zm9yKHZhciByLG49dC5hcmVhLGk9MCxhPTEvMCxvPS0xLHM9dC5sZW5ndGg7KytvPHM7KShyPXRbb10uYXJlYSkmJihyPGEmJihhPXIpLHI+aSYmKGk9cikpO3JldHVybiBuKj1uLGUqPWUsbj9NYXRoLm1heChlKmkqcC9uLG4vKGUqYSpwKSk6MS8wfWZ1bmN0aW9uIGkodCxlLHIsbil7dmFyIGksYT0tMSxvPXQubGVuZ3RoLHM9ci54LHU9ci55LGM9ZT9sKHQuYXJlYS9lKTowO2lmKGU9PXIuZHgpe2Zvcigobnx8Yz5yLmR5KSYmKGM9ci5keSk7KythPG87KWk9dFthXSxpLng9cyxpLnk9dSxpLmR5PWMscys9aS5keD1NYXRoLm1pbihyLngrci5keC1zLGM/bChpLmFyZWEvYyk6MCk7aS56PSEwLGkuZHgrPXIueCtyLmR4LXMsci55Kz1jLHIuZHktPWN9ZWxzZXtmb3IoKG58fGM+ci5keCkmJihjPXIuZHgpOysrYTxvOylpPXRbYV0saS54PXMsaS55PXUsaS5keD1jLHUrPWkuZHk9TWF0aC5taW4oci55K3IuZHktdSxjP2woaS5hcmVhL2MpOjApO2kuej0hMSxpLmR5Kz1yLnkrci5keS11LHIueCs9YyxyLmR4LT1jfX1mdW5jdGlvbiBhKG4pe3ZhciBpPW98fHMobiksYT1pWzBdO3JldHVybiBhLng9YS55PTAsYS52YWx1ZT8oYS5keD11WzBdLGEuZHk9dVsxXSk6YS5keD1hLmR5PTAsbyYmcy5yZXZhbHVlKGEpLHQoW2FdLGEuZHgqYS5keS9hLnZhbHVlKSwobz9yOmUpKGEpLGYmJihvPWkpLGl9dmFyIG8scz11by5sYXlvdXQuaGllcmFyY2h5KCksbD1NYXRoLnJvdW5kLHU9WzEsMV0sYz1udWxsLGg9SGksZj0hMSxkPSJzcXVhcmlmeSIscD0uNSooMStNYXRoLnNxcnQoNSkpO3JldHVybiBhLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxhKTp1fSxhLnBhZGRpbmc9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgcj10LmNhbGwoYSxlLGUuZGVwdGgpO3JldHVybiBudWxsPT1yP0hpKGUpOnFpKGUsIm51bWJlciI9PXR5cGVvZiByP1tyLHIscixyXTpyKX1mdW5jdGlvbiByKGUpe3JldHVybiBxaShlLHQpfWlmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBjO3ZhciBuO3JldHVybiBoPW51bGw9PShjPXQpP0hpOiJmdW5jdGlvbiI9PShuPXR5cGVvZiB0KT9lOiJudW1iZXIiPT09bj8odD1bdCx0LHQsdF0scik6cixhfSxhLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQ/TWF0aC5yb3VuZDpOdW1iZXIsYSk6bCE9TnVtYmVyfSxhLnN0aWNreT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj10LG89bnVsbCxhKTpmfSxhLnJhdGlvPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPXQsYSk6cH0sYS5tb2RlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPXQrIiIsYSk6ZH0sb2koYSxzKX0sdW8ucmFuZG9tPXtub3JtYWw6ZnVuY3Rpb24odCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO3JldHVybiByPDImJihlPTEpLHI8MSYmKHQ9MCksZnVuY3Rpb24oKXt2YXIgcixuLGk7ZG97cj0yKk1hdGgucmFuZG9tKCktMSxuPTIqTWF0aC5yYW5kb20oKS0xLGk9cipyK24qbn13aGlsZSghaXx8aT4xKTtyZXR1cm4gdCtlKnIqTWF0aC5zcXJ0KC0yKk1hdGgubG9nKGkpL2kpfX0sbG9nTm9ybWFsOmZ1bmN0aW9uKCl7dmFyIHQ9dW8ucmFuZG9tLm5vcm1hbC5hcHBseSh1byxhcmd1bWVudHMpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBNYXRoLmV4cCh0KCkpfX0sYmF0ZXM6ZnVuY3Rpb24odCl7dmFyIGU9dW8ucmFuZG9tLmlyd2luSGFsbCh0KTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZSgpL3R9fSxpcndpbkhhbGw6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBlPTAscj0wO3I8dDtyKyspZSs9TWF0aC5yYW5kb20oKTtyZXR1cm4gZX19fSx1by5zY2FsZT17fTt2YXIgd2w9e2Zsb29yOngsY2VpbDp4fTt1by5zY2FsZS5saW5lYXI9ZnVuY3Rpb24oKXtyZXR1cm4gS2koWzAsMV0sWzAsMV0sX24sITEpfTt2YXIgTWw9e3M6MSxnOjEscDoxLHI6MSxlOjF9O3VvLnNjYWxlLmxvZz1mdW5jdGlvbigpe3JldHVybiBhYSh1by5zY2FsZS5saW5lYXIoKS5kb21haW4oWzAsMV0pLDEwLCEwLFsxLDEwXSl9O3ZhciBrbD11by5mb3JtYXQoIi4wZSIpLEFsPXtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4tTWF0aC5jZWlsKC10KX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4tTWF0aC5mbG9vcigtdCl9fTt1by5zY2FsZS5wb3c9ZnVuY3Rpb24oKXtyZXR1cm4gb2EodW8uc2NhbGUubGluZWFyKCksMSxbMCwxXSl9LHVvLnNjYWxlLnNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdW8uc2NhbGUucG93KCkuZXhwb25lbnQoLjUpfSx1by5zY2FsZS5vcmRpbmFsPWZ1bmN0aW9uKCl7cmV0dXJuIGxhKFtdLHt0OiJyYW5nZSIsYTpbW11dfSl9LHVvLnNjYWxlLmNhdGVnb3J5MTA9ZnVuY3Rpb24oKXtyZXR1cm4gdW8uc2NhbGUub3JkaW5hbCgpLnJhbmdlKFRsKX0sdW8uc2NhbGUuY2F0ZWdvcnkyMD1mdW5jdGlvbigpe3JldHVybiB1by5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoU2wpfSx1by5zY2FsZS5jYXRlZ29yeTIwYj1mdW5jdGlvbigpe3JldHVybiB1by5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoRWwpfSx1by5zY2FsZS5jYXRlZ29yeTIwYz1mdW5jdGlvbigpe3JldHVybiB1by5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoTGwpfTt2YXIgVGw9WzIwNjIyNjAsMTY3NDQyMDYsMjkyNDU4OCwxNDAzNDcyOCw5NzI1ODg1LDkxOTcxMzEsMTQ5MDczMzAsODM1NTcxMSwxMjM2OTE4NiwxNTU2MTc1XS5tYXAoX3QpLFNsPVsyMDYyMjYwLDExNDU0NDQwLDE2NzQ0MjA2LDE2NzU5NjcyLDI5MjQ1ODgsMTAwMTg2OTgsMTQwMzQ3MjgsMTY3NTA3NDIsOTcyNTg4NSwxMjk1NTg2MSw5MTk3MTMxLDEyODg1MTQwLDE0OTA3MzMwLDE2MjM0MTk0LDgzNTU3MTEsMTMwOTI4MDcsMTIzNjkxODYsMTQ0MDg1ODksMTU1NjE3NSwxMDQxMDcyNV0ubWFwKF90KSxFbD1bMzc1MDc3Nyw1Mzk1NjE5LDcwNDA3MTksMTAyNjQyODYsNjUxOTA5Nyw5MjE2NTk0LDExOTE1MTE1LDEzNTU2NjM2LDkyMDI5OTMsMTI0MjY4MDksMTUxODY1MTQsMTUxOTA5MzIsODY2NjE2OSwxMTM1NjQ5MCwxNDA0OTY0MywxNTE3NzM3Miw4MDc3NjgzLDEwODM0MzI0LDEzNTI4NTA5LDE0NTg5NjU0XS5tYXAoX3QpLExsPVszMjQ0NzMzLDcwNTcxMTAsMTA0MDY2MjUsMTMwMzI0MzEsMTUwOTUwNTMsMTY2MTY3NjQsMTY2MjUyNTksMTY2MzQwMTgsMzI1MzA3Niw3NjUyNDcwLDEwNjA3MDAzLDEzMTAxNTA0LDc2OTUyODEsMTAzOTQzMTIsMTIzNjkzNzIsMTQzNDI4OTEsNjUxMzUwNyw5ODY4OTUwLDEyNDM0ODc3LDE0Mjc3MDgxXS5tYXAoX3QpO3VvLnNjYWxlLnF1YW50aWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHVhKFtdLFtdKX0sdW8uc2NhbGUucXVhbnRpemU9ZnVuY3Rpb24oKXtyZXR1cm4gY2EoMCwxLFswLDFdKX0sdW8uc2NhbGUudGhyZXNob2xkPWZ1bmN0aW9uKCl7cmV0dXJuIGhhKFsuNV0sWzAsMV0pfSx1by5zY2FsZS5pZGVudGl0eT1mdW5jdGlvbigpe3JldHVybiBmYShbMCwxXSl9LHVvLnN2Zz17fSx1by5zdmcuYXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0PU1hdGgubWF4KDAsK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKSx1PU1hdGgubWF4KDAsK24uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxjPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLVZvLGg9cy5hcHBseSh0aGlzLGFyZ3VtZW50cyktVm8sZj1NYXRoLmFicyhoLWMpLGQ9Yz5oPzA6MTtpZih1PHQmJihwPXUsdT10LHQ9cCksZj49VW8pcmV0dXJuIGUodSxkKSsodD9lKHQsMS1kKToiIikrIloiO3ZhciBwLG0sdixnLHksYix4LF8sdyxNLGssQSxUPTAsUz0wLEU9W107aWYoKGc9KCtsLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8MCkvMikmJih2PWE9PT1DbD9NYXRoLnNxcnQodCp0K3UqdSk6K2EuYXBwbHkodGhpcyxhcmd1bWVudHMpLGR8fChTKj0tMSksdSYmKFM9bnQodi91Kk1hdGguc2luKGcpKSksdCYmKFQ9bnQodi90Kk1hdGguc2luKGcpKSkpLHUpe3k9dSpNYXRoLmNvcyhjK1MpLGI9dSpNYXRoLnNpbihjK1MpLHg9dSpNYXRoLmNvcyhoLVMpLF89dSpNYXRoLnNpbihoLVMpO3ZhciBMPU1hdGguYWJzKGgtYy0yKlMpPD1Obz8wOjE7aWYoUyYmYmEoeSxiLHgsXyk9PT1kXkwpe3ZhciBDPShjK2gpLzI7eT11Kk1hdGguY29zKEMpLGI9dSpNYXRoLnNpbihDKSx4PV89bnVsbH19ZWxzZSB5PWI9MDtpZih0KXt3PXQqTWF0aC5jb3MoaC1UKSxNPXQqTWF0aC5zaW4oaC1UKSxrPXQqTWF0aC5jb3MoYytUKSxBPXQqTWF0aC5zaW4oYytUKTt2YXIgej1NYXRoLmFicyhjLWgrMipUKTw9Tm8/MDoxO2lmKFQmJmJhKHcsTSxrLEEpPT09MS1kXnope3ZhciBJPShjK2gpLzI7dz10Kk1hdGguY29zKEkpLE09dCpNYXRoLnNpbihJKSxrPUE9bnVsbH19ZWxzZSB3PU09MDtpZihmPkZvJiYocD1NYXRoLm1pbihNYXRoLmFicyh1LXQpLzIsK2kuYXBwbHkodGhpcyxhcmd1bWVudHMpKSk+LjAwMSl7bT10PHVeZD8wOjE7dmFyIEQ9cCxQPXA7aWYoZjxObyl7dmFyIE89bnVsbD09az9bdyxNXTpudWxsPT14P1t5LGJdOk9yKFt5LGJdLFtrLEFdLFt4LF9dLFt3LE1dKSxSPXktT1swXSxGPWItT1sxXSxqPXgtT1swXSxOPV8tT1sxXSxCPTEvTWF0aC5zaW4oTWF0aC5hY29zKChSKmorRipOKS8oTWF0aC5zcXJ0KFIqUitGKkYpKk1hdGguc3FydChqKmorTipOKSkpLzIpLFU9TWF0aC5zcXJ0KE9bMF0qT1swXStPWzFdKk9bMV0pO1A9TWF0aC5taW4ocCwodC1VKS8oQi0xKSksRD1NYXRoLm1pbihwLCh1LVUpLyhCKzEpKX1pZihudWxsIT14KXt2YXIgVj14YShudWxsPT1rP1t3LE1dOltrLEFdLFt5LGJdLHUsRCxkKSxIPXhhKFt4LF9dLFt3LE1dLHUsRCxkKTtwPT09RD9FLnB1c2goIk0iLFZbMF0sIkEiLEQsIiwiLEQsIiAwIDAsIixtLCIgIixWWzFdLCJBIix1LCIsIix1LCIgMCAiLDEtZF5iYShWWzFdWzBdLFZbMV1bMV0sSFsxXVswXSxIWzFdWzFdKSwiLCIsZCwiICIsSFsxXSwiQSIsRCwiLCIsRCwiIDAgMCwiLG0sIiAiLEhbMF0pOkUucHVzaCgiTSIsVlswXSwiQSIsRCwiLCIsRCwiIDAgMSwiLG0sIiAiLEhbMF0pfWVsc2UgRS5wdXNoKCJNIix5LCIsIixiKTtpZihudWxsIT1rKXt2YXIgcT14YShbeSxiXSxbayxBXSx0LC1QLGQpLEc9eGEoW3csTV0sbnVsbD09eD9beSxiXTpbeCxfXSx0LC1QLGQpO3A9PT1QP0UucHVzaCgiTCIsR1swXSwiQSIsUCwiLCIsUCwiIDAgMCwiLG0sIiAiLEdbMV0sIkEiLHQsIiwiLHQsIiAwICIsZF5iYShHWzFdWzBdLEdbMV1bMV0scVsxXVswXSxxWzFdWzFdKSwiLCIsMS1kLCIgIixxWzFdLCJBIixQLCIsIixQLCIgMCAwLCIsbSwiICIscVswXSk6RS5wdXNoKCJMIixHWzBdLCJBIixQLCIsIixQLCIgMCAwLCIsbSwiICIscVswXSl9ZWxzZSBFLnB1c2goIkwiLHcsIiwiLE0pfWVsc2UgRS5wdXNoKCJNIix5LCIsIixiKSxudWxsIT14JiZFLnB1c2goIkEiLHUsIiwiLHUsIiAwICIsTCwiLCIsZCwiICIseCwiLCIsXyksRS5wdXNoKCJMIix3LCIsIixNKSxudWxsIT1rJiZFLnB1c2goIkEiLHQsIiwiLHQsIiAwICIseiwiLCIsMS1kLCIgIixrLCIsIixBKTtyZXR1cm4gRS5wdXNoKCJaIiksRS5qb2luKCIiKX1mdW5jdGlvbiBlKHQsZSl7cmV0dXJuIk0wLCIrdCsiQSIrdCsiLCIrdCsiIDAgMSwiK2UrIiAwLCIrLXQrIkEiK3QrIiwiK3QrIiAwIDEsIitlKyIgMCwiK3R9dmFyIHI9cGEsbj1tYSxpPWRhLGE9Q2wsbz12YSxzPWdhLGw9eWE7cmV0dXJuIHQuaW5uZXJSYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9RXQoZSksdCk6cn0sdC5vdXRlclJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1FdChlKSx0KTpufSx0LmNvcm5lclJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1FdChlKSx0KTppfSx0LnBhZFJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1lPT1DbD9DbDpFdChlKSx0KTphfSx0LnN0YXJ0QW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89RXQoZSksdCk6b30sdC5lbmRBbmdsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1FdChlKSx0KTpzfSx0LnBhZEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPUV0KGUpLHQpOmx9LHQuY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgdD0oK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIsZT0oK28uYXBwbHkodGhpcyxhcmd1bWVudHMpKyArcy5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzItVm87cmV0dXJuW01hdGguY29zKGUpKnQsTWF0aC5zaW4oZSkqdF19LHR9O3ZhciBDbD0iYXV0byI7dW8uc3ZnLmxpbmU9ZnVuY3Rpb24oKXtyZXR1cm4gX2EoeCl9O3ZhciB6bD11by5tYXAoe2xpbmVhcjp3YSwibGluZWFyLWNsb3NlZCI6TWEsc3RlcDprYSwic3RlcC1iZWZvcmUiOkFhLCJzdGVwLWFmdGVyIjpUYSxiYXNpczpJYSwiYmFzaXMtb3BlbiI6RGEsImJhc2lzLWNsb3NlZCI6UGEsYnVuZGxlOk9hLGNhcmRpbmFsOkxhLCJjYXJkaW5hbC1vcGVuIjpTYSwiY2FyZGluYWwtY2xvc2VkIjpFYSxtb25vdG9uZTpVYX0pO3psLmZvckVhY2goZnVuY3Rpb24odCxlKXtlLmtleT10LGUuY2xvc2VkPS8tY2xvc2VkJC8udGVzdCh0KX0pO3ZhciBJbD1bMCwyLzMsMS8zLDBdLERsPVswLDEvMywyLzMsMF0sUGw9WzAsMS82LDIvMywxLzZdO3VvLnN2Zy5saW5lLnJhZGlhbD1mdW5jdGlvbigpe3ZhciB0PV9hKFZhKTtyZXR1cm4gdC5yYWRpdXM9dC54LGRlbGV0ZSB0LngsdC5hbmdsZT10LnksZGVsZXRlIHQueSx0fSxBYS5yZXZlcnNlPVRhLFRhLnJldmVyc2U9QWEsdW8uc3ZnLmFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gSGEoeCl9LHVvLnN2Zy5hcmVhLnJhZGlhbD1mdW5jdGlvbigpe3ZhciB0PUhhKFZhKTtyZXR1cm4gdC5yYWRpdXM9dC54LGRlbGV0ZSB0LngsdC5pbm5lclJhZGl1cz10LngwLGRlbGV0ZSB0LngwLHQub3V0ZXJSYWRpdXM9dC54MSxkZWxldGUgdC54MSx0LmFuZ2xlPXQueSxkZWxldGUgdC55LHQuc3RhcnRBbmdsZT10LnkwLGRlbGV0ZSB0LnkwLHQuZW5kQW5nbGU9dC55MSxkZWxldGUgdC55MSx0fSx1by5zdmcuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQscyl7dmFyIGw9ZSh0aGlzLGEsdCxzKSx1PWUodGhpcyxvLHQscyk7cmV0dXJuIk0iK2wucDArbihsLnIsbC5wMSxsLmExLWwuYTApKyhyKGwsdSk/aShsLnIsbC5wMSxsLnIsbC5wMCk6aShsLnIsbC5wMSx1LnIsdS5wMCkrbih1LnIsdS5wMSx1LmExLXUuYTApK2kodS5yLHUucDEsbC5yLGwucDApKSsiWiJ9ZnVuY3Rpb24gZSh0LGUscixuKXt2YXIgaT1lLmNhbGwodCxyLG4pLGE9cy5jYWxsKHQsaSxuKSxvPWwuY2FsbCh0LGksbiktVm8sYz11LmNhbGwodCxpLG4pLVZvO3JldHVybntyOmEsYTA6byxhMTpjLHAwOlthKk1hdGguY29zKG8pLGEqTWF0aC5zaW4obyldLHAxOlthKk1hdGguY29zKGMpLGEqTWF0aC5zaW4oYyldfX1mdW5jdGlvbiByKHQsZSl7cmV0dXJuIHQuYTA9PWUuYTAmJnQuYTE9PWUuYTF9ZnVuY3Rpb24gbih0LGUscil7cmV0dXJuIkEiK3QrIiwiK3QrIiAwICIrICsocj5ObykrIiwxICIrZX1mdW5jdGlvbiBpKHQsZSxyLG4pe3JldHVybiJRIDAsMCAiK259dmFyIGE9eHIsbz1fcixzPXFhLGw9dmEsdT1nYTtyZXR1cm4gdC5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9RXQoZSksdCk6c30sdC5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9RXQoZSksdCk6YX0sdC50YXJnZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89RXQoZSksdCk6b30sdC5zdGFydEFuZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPUV0KGUpLHQpOmx9LHQuZW5kQW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9RXQoZSksdCk6dX0sdH0sdW8uc3ZnLmRpYWdvbmFsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGkpe3ZhciBhPWUuY2FsbCh0aGlzLHQsaSksbz1yLmNhbGwodGhpcyx0LGkpLHM9KGEueStvLnkpLzIsbD1bYSx7eDphLngseTpzfSx7eDpvLngseTpzfSxvXTtyZXR1cm4gbD1sLm1hcChuKSwiTSIrbFswXSsiQyIrbFsxXSsiICIrbFsyXSsiICIrbFszXX12YXIgZT14cixyPV9yLG49R2E7cmV0dXJuIHQuc291cmNlPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUV0KHIpLHQpOmV9LHQudGFyZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUV0KGUpLHQpOnJ9LHQucHJvamVjdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLHQpOm59LHR9LHVvLnN2Zy5kaWFnb25hbC5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgdD11by5zdmcuZGlhZ29uYWwoKSxlPUdhLHI9dC5wcm9qZWN0aW9uO3JldHVybiB0LnByb2plY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cihZYShlPXQpKTplfSx0fSx1by5zdmcuc3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LG4pe3JldHVybihPbC5nZXQoZS5jYWxsKHRoaXMsdCxuKSl8fFphKShyLmNhbGwodGhpcyx0LG4pKX12YXIgZT1XYSxyPVhhO3JldHVybiB0LnR5cGU9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9RXQociksdCk6ZX0sdC5zaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUV0KGUpLHQpOnJ9LHR9O3ZhciBPbD11by5tYXAoe2NpcmNsZTpaYSxjcm9zczpmdW5jdGlvbih0KXt2YXIgZT1NYXRoLnNxcnQodC81KS8yO3JldHVybiJNIistMyplKyIsIistZSsiSCIrLWUrIlYiKy0zKmUrIkgiK2UrIlYiKy1lKyJIIiszKmUrIlYiK2UrIkgiK2UrIlYiKzMqZSsiSCIrLWUrIlYiK2UrIkgiKy0zKmUrIloifSxkaWFtb25kOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguc3FydCh0LygyKkZsKSkscj1lKkZsO3JldHVybiJNMCwiKy1lKyJMIityKyIsMCAwLCIrZSsiICIrLXIrIiwwWiJ9LHNxdWFyZTpmdW5jdGlvbih0KXt2YXIgZT1NYXRoLnNxcnQodCkvMjtyZXR1cm4iTSIrLWUrIiwiKy1lKyJMIitlKyIsIistZSsiICIrZSsiLCIrZSsiICIrLWUrIiwiK2UrIloifSwidHJpYW5nbGUtZG93biI6ZnVuY3Rpb24odCl7dmFyIGU9TWF0aC5zcXJ0KHQvUmwpLHI9ZSpSbC8yO3JldHVybiJNMCwiK3IrIkwiK2UrIiwiKy1yKyIgIistZSsiLCIrLXIrIloifSwidHJpYW5nbGUtdXAiOmZ1bmN0aW9uKHQpe3ZhciBlPU1hdGguc3FydCh0L1JsKSxyPWUqUmwvMjtyZXR1cm4iTTAsIistcisiTCIrZSsiLCIrcisiICIrLWUrIiwiK3IrIloifX0pO3VvLnN2Zy5zeW1ib2xUeXBlcz1PbC5rZXlzKCk7dmFyIFJsPU1hdGguc3FydCgzKSxGbD1NYXRoLnRhbigzMCpIbyk7TG8udHJhbnNpdGlvbj1mdW5jdGlvbih0KXtmb3IodmFyIGUscixuPWpsfHwrK1ZsLGk9dG8odCksYT1bXSxvPU5sfHx7dGltZTpEYXRlLm5vdygpLGVhc2U6RW4sZGVsYXk6MCxkdXJhdGlvbjoyNTB9LHM9LTEsbD10aGlzLmxlbmd0aDsrK3M8bDspe2EucHVzaChlPVtdKTtmb3IodmFyIHU9dGhpc1tzXSxjPS0xLGg9dS5sZW5ndGg7KytjPGg7KShyPXVbY10pJiZlbyhyLGMsaSxuLG8pLGUucHVzaChyKX1yZXR1cm4gS2EoYSxpLG4pfSxMby5pbnRlcnJ1cHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChudWxsPT10P0JsOkphKHRvKHQpKSl9O3ZhciBqbCxObCxCbD1KYSh0bygpKSxVbD1bXSxWbD0wO1VsLmNhbGw9TG8uY2FsbCxVbC5lbXB0eT1Mby5lbXB0eSxVbC5ub2RlPUxvLm5vZGUsVWwuc2l6ZT1Mby5zaXplLHVvLnRyYW5zaXRpb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmdC50cmFuc2l0aW9uP2psP3QudHJhbnNpdGlvbihlKTp0OnVvLnNlbGVjdGlvbigpLnRyYW5zaXRpb24odCl9LHVvLnRyYW5zaXRpb24ucHJvdG90eXBlPVVsLFVsLnNlbGVjdD1mdW5jdGlvbih0KXt2YXIgZSxyLG4saT10aGlzLmlkLGE9dGhpcy5uYW1lc3BhY2Usbz1bXTt0PUModCk7Zm9yKHZhciBzPS0xLGw9dGhpcy5sZW5ndGg7KytzPGw7KXtvLnB1c2goZT1bXSk7Zm9yKHZhciB1PXRoaXNbc10sYz0tMSxoPXUubGVuZ3RoOysrYzxoOykobj11W2NdKSYmKHI9dC5jYWxsKG4sbi5fX2RhdGFfXyxjLHMpKT8oIl9fZGF0YV9fImluIG4mJihyLl9fZGF0YV9fPW4uX19kYXRhX18pLAplbyhyLGMsYSxpLG5bYV1baV0pLGUucHVzaChyKSk6ZS5wdXNoKG51bGwpfXJldHVybiBLYShvLGEsaSl9LFVsLnNlbGVjdEFsbD1mdW5jdGlvbih0KXt2YXIgZSxyLG4saSxhLG89dGhpcy5pZCxzPXRoaXMubmFtZXNwYWNlLGw9W107dD16KHQpO2Zvcih2YXIgdT0tMSxjPXRoaXMubGVuZ3RoOysrdTxjOylmb3IodmFyIGg9dGhpc1t1XSxmPS0xLGQ9aC5sZW5ndGg7KytmPGQ7KWlmKG49aFtmXSl7YT1uW3NdW29dLHI9dC5jYWxsKG4sbi5fX2RhdGFfXyxmLHUpLGwucHVzaChlPVtdKTtmb3IodmFyIHA9LTEsbT1yLmxlbmd0aDsrK3A8bTspKGk9cltwXSkmJmVvKGkscCxzLG8sYSksZS5wdXNoKGkpfXJldHVybiBLYShsLHMsbyl9LFVsLmZpbHRlcj1mdW5jdGlvbih0KXt2YXIgZSxyLG4saT1bXTsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9SCh0KSk7Zm9yKHZhciBhPTAsbz10aGlzLmxlbmd0aDthPG87YSsrKXtpLnB1c2goZT1bXSk7Zm9yKHZhciByPXRoaXNbYV0scz0wLGw9ci5sZW5ndGg7czxsO3MrKykobj1yW3NdKSYmdC5jYWxsKG4sbi5fX2RhdGFfXyxzLGEpJiZlLnB1c2gobil9cmV0dXJuIEthKGksdGhpcy5uYW1lc3BhY2UsdGhpcy5pZCl9LFVsLnR3ZWVuPWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5pZCxuPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpcy5ub2RlKClbbl1bcl0udHdlZW4uZ2V0KHQpOkcodGhpcyxudWxsPT1lP2Z1bmN0aW9uKGUpe2Vbbl1bcl0udHdlZW4ucmVtb3ZlKHQpfTpmdW5jdGlvbihpKXtpW25dW3JdLnR3ZWVuLnNldCh0LGUpfSl9LFVsLmF0dHI9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUocyl9ZnVuY3Rpb24gbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlMocy5zcGFjZSxzLmxvY2FsKX1mdW5jdGlvbiBpKHQpe3JldHVybiBudWxsPT10P3I6KHQrPSIiLGZ1bmN0aW9uKCl7dmFyIGUscj10aGlzLmdldEF0dHJpYnV0ZShzKTtyZXR1cm4gciE9PXQmJihlPW8ocix0KSxmdW5jdGlvbih0KXt0aGlzLnNldEF0dHJpYnV0ZShzLGUodCkpfSl9KX1mdW5jdGlvbiBhKHQpe3JldHVybiBudWxsPT10P246KHQrPSIiLGZ1bmN0aW9uKCl7dmFyIGUscj10aGlzLmdldEF0dHJpYnV0ZU5TKHMuc3BhY2Uscy5sb2NhbCk7cmV0dXJuIHIhPT10JiYoZT1vKHIsdCksZnVuY3Rpb24odCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyhzLnNwYWNlLHMubG9jYWwsZSh0KSl9KX0pfWlmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKGUgaW4gdCl0aGlzLmF0dHIoZSx0W2VdKTtyZXR1cm4gdGhpc312YXIgbz0idHJhbnNmb3JtIj09dD9abjpfbixzPXVvLm5zLnF1YWxpZnkodCk7cmV0dXJuIFFhKHRoaXMsImF0dHIuIit0LGUscy5sb2NhbD9hOmkpfSxVbC5hdHRyVHdlZW49ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiByKHQscil7dmFyIG49ZS5jYWxsKHRoaXMsdCxyLHRoaXMuZ2V0QXR0cmlidXRlKGkpKTtyZXR1cm4gbiYmZnVuY3Rpb24odCl7dGhpcy5zZXRBdHRyaWJ1dGUoaSxuKHQpKX19ZnVuY3Rpb24gbih0LHIpe3ZhciBuPWUuY2FsbCh0aGlzLHQscix0aGlzLmdldEF0dHJpYnV0ZU5TKGkuc3BhY2UsaS5sb2NhbCkpO3JldHVybiBuJiZmdW5jdGlvbih0KXt0aGlzLnNldEF0dHJpYnV0ZU5TKGkuc3BhY2UsaS5sb2NhbCxuKHQpKX19dmFyIGk9dW8ubnMucXVhbGlmeSh0KTtyZXR1cm4gdGhpcy50d2VlbigiYXR0ci4iK3QsaS5sb2NhbD9uOnIpfSxVbC5zdHlsZT1mdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gaSgpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9ZnVuY3Rpb24gYShlKXtyZXR1cm4gbnVsbD09ZT9pOihlKz0iIixmdW5jdGlvbigpe3ZhciBpLGE9bih0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSh0KTtyZXR1cm4gYSE9PWUmJihpPV9uKGEsZSksZnVuY3Rpb24oZSl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGkoZSkscil9KX0pfXZhciBvPWFyZ3VtZW50cy5sZW5ndGg7aWYobzwzKXtpZigic3RyaW5nIiE9dHlwZW9mIHQpe288MiYmKGU9IiIpO2ZvcihyIGluIHQpdGhpcy5zdHlsZShyLHRbcl0sZSk7cmV0dXJuIHRoaXN9cj0iIn1yZXR1cm4gUWEodGhpcywic3R5bGUuIit0LGUsYSl9LFVsLnN0eWxlVHdlZW49ZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIGkoaSxhKXt2YXIgbz1lLmNhbGwodGhpcyxpLGEsbih0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSh0KSk7cmV0dXJuIG8mJmZ1bmN0aW9uKGUpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxvKGUpLHIpfX1yZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwzJiYocj0iIiksdGhpcy50d2Vlbigic3R5bGUuIit0LGkpfSxVbC50ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBRYSh0aGlzLCJ0ZXh0Iix0LCRhKX0sVWwucmVtb3ZlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIHRoaXMuZWFjaCgiZW5kLnRyYW5zaXRpb24iLGZ1bmN0aW9uKCl7dmFyIGU7dGhpc1t0XS5jb3VudDwyJiYoZT10aGlzLnBhcmVudE5vZGUpJiZlLnJlbW92ZUNoaWxkKHRoaXMpfSl9LFVsLmVhc2U9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5pZCxyPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbcl1bZV0uZWFzZTooImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXVvLmVhc2UuYXBwbHkodW8sYXJndW1lbnRzKSksRyh0aGlzLGZ1bmN0aW9uKG4pe25bcl1bZV0uZWFzZT10fSkpfSxVbC5kZWxheT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtyXVtlXS5kZWxheTpHKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24obixpLGEpe25bcl1bZV0uZGVsYXk9K3QuY2FsbChuLG4uX19kYXRhX18saSxhKX06KHQ9K3QsZnVuY3Rpb24obil7bltyXVtlXS5kZWxheT10fSkpfSxVbC5kdXJhdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtyXVtlXS5kdXJhdGlvbjpHKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24obixpLGEpe25bcl1bZV0uZHVyYXRpb249TWF0aC5tYXgoMSx0LmNhbGwobixuLl9fZGF0YV9fLGksYSkpfToodD1NYXRoLm1heCgxLHQpLGZ1bmN0aW9uKG4pe25bcl1bZV0uZHVyYXRpb249dH0pKX0sVWwuZWFjaD1mdW5jdGlvbih0LGUpe3ZhciByPXRoaXMuaWQsbj10aGlzLm5hbWVzcGFjZTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciBpPU5sLGE9amw7dHJ5e2psPXIsRyh0aGlzLGZ1bmN0aW9uKGUsaSxhKXtObD1lW25dW3JdLHQuY2FsbChlLGUuX19kYXRhX18saSxhKX0pfWZpbmFsbHl7Tmw9aSxqbD1hfX1lbHNlIEcodGhpcyxmdW5jdGlvbihpKXt2YXIgYT1pW25dW3JdOyhhLmV2ZW50fHwoYS5ldmVudD11by5kaXNwYXRjaCgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSkpLm9uKHQsZSl9KTtyZXR1cm4gdGhpc30sVWwudHJhbnNpdGlvbj1mdW5jdGlvbigpe2Zvcih2YXIgdCxlLHIsbixpPXRoaXMuaWQsYT0rK1ZsLG89dGhpcy5uYW1lc3BhY2Uscz1bXSxsPTAsdT10aGlzLmxlbmd0aDtsPHU7bCsrKXtzLnB1c2godD1bXSk7Zm9yKHZhciBlPXRoaXNbbF0sYz0wLGg9ZS5sZW5ndGg7YzxoO2MrKykocj1lW2NdKSYmKG49cltvXVtpXSxlbyhyLGMsbyxhLHt0aW1lOm4udGltZSxlYXNlOm4uZWFzZSxkZWxheTpuLmRlbGF5K24uZHVyYXRpb24sZHVyYXRpb246bi5kdXJhdGlvbn0pKSx0LnB1c2gocil9cmV0dXJuIEthKHMsbyxhKX0sdW8uc3ZnLmF4aXM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3QuZWFjaChmdW5jdGlvbigpe3ZhciB0LHU9dW8uc2VsZWN0KHRoaXMpLGM9dGhpcy5fX2NoYXJ0X198fHIsaD10aGlzLl9fY2hhcnRfXz1yLmNvcHkoKSxmPW51bGw9PWw/aC50aWNrcz9oLnRpY2tzLmFwcGx5KGgscyk6aC5kb21haW4oKTpsLGQ9bnVsbD09ZT9oLnRpY2tGb3JtYXQ/aC50aWNrRm9ybWF0LmFwcGx5KGgscyk6eDplLHA9dS5zZWxlY3RBbGwoIi50aWNrIikuZGF0YShmLGgpLG09cC5lbnRlcigpLmluc2VydCgiZyIsIi5kb21haW4iKS5hdHRyKCJjbGFzcyIsInRpY2siKS5zdHlsZSgib3BhY2l0eSIsRm8pLHY9dW8udHJhbnNpdGlvbihwLmV4aXQoKSkuc3R5bGUoIm9wYWNpdHkiLEZvKS5yZW1vdmUoKSxnPXVvLnRyYW5zaXRpb24ocC5vcmRlcigpKS5zdHlsZSgib3BhY2l0eSIsMSkseT1NYXRoLm1heChpLDApK28sYj1ZaShoKSxfPXUuc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbMF0pLHc9KF8uZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLHVvLnRyYW5zaXRpb24oXykpO20uYXBwZW5kKCJsaW5lIiksbS5hcHBlbmQoInRleHQiKTt2YXIgTSxrLEEsVCxTPW0uc2VsZWN0KCJsaW5lIiksRT1nLnNlbGVjdCgibGluZSIpLEw9cC5zZWxlY3QoInRleHQiKS50ZXh0KGQpLEM9bS5zZWxlY3QoInRleHQiKSx6PWcuc2VsZWN0KCJ0ZXh0IiksST0idG9wIj09PW58fCJsZWZ0Ij09PW4/LTE6MTtpZigiYm90dG9tIj09PW58fCJ0b3AiPT09bj8odD1ybyxNPSJ4IixBPSJ5IixrPSJ4MiIsVD0ieTIiLEwuYXR0cigiZHkiLEk8MD8iMGVtIjoiLjcxZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSx3LmF0dHIoImQiLCJNIitiWzBdKyIsIitJKmErIlYwSCIrYlsxXSsiViIrSSphKSk6KHQ9bm8sTT0ieSIsQT0ieCIsaz0ieTIiLFQ9IngyIixMLmF0dHIoImR5IiwiLjMyZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLEk8MD8iZW5kIjoic3RhcnQiKSx3LmF0dHIoImQiLCJNIitJKmErIiwiK2JbMF0rIkgwViIrYlsxXSsiSCIrSSphKSksUy5hdHRyKFQsSSppKSxDLmF0dHIoQSxJKnkpLEUuYXR0cihrLDApLmF0dHIoVCxJKmkpLHouYXR0cihNLDApLmF0dHIoQSxJKnkpLGgucmFuZ2VCYW5kKXt2YXIgRD1oLFA9RC5yYW5nZUJhbmQoKS8yO2M9aD1mdW5jdGlvbih0KXtyZXR1cm4gRCh0KStQfX1lbHNlIGMucmFuZ2VCYW5kP2M9aDp2LmNhbGwodCxoLGMpO20uY2FsbCh0LGMsaCksZy5jYWxsKHQsaCxoKX0pfXZhciBlLHI9dW8uc2NhbGUubGluZWFyKCksbj1IbCxpPTYsYT02LG89MyxzPVsxMF0sbD1udWxsO3JldHVybiB0LnNjYWxlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWUsdCk6cn0sdC5vcmllbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSBpbiBxbD9lKyIiOkhsLHQpOm59LHQudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1obyhhcmd1bWVudHMpLHQpOnN9LHQudGlja1ZhbHVlcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1lLHQpOmx9LHQudGlja0Zvcm1hdD1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1yLHQpOmV9LHQudGlja1NpemU9ZnVuY3Rpb24oZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gcj8oaT0rZSxhPSthcmd1bWVudHNbci0xXSx0KTppfSx0LmlubmVyVGlja1NpemU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K2UsdCk6aX0sdC5vdXRlclRpY2tTaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPStlLHQpOmF9LHQudGlja1BhZGRpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K2UsdCk6b30sdC50aWNrU3ViZGl2aWRlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgmJnR9LHR9O3ZhciBIbD0iYm90dG9tIixxbD17dG9wOjEscmlnaHQ6MSxib3R0b206MSxsZWZ0OjF9O3VvLnN2Zy5icnVzaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobil7bi5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49dW8uc2VsZWN0KHRoaXMpLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIikub24oIm1vdXNlZG93bi5icnVzaCIsYSkub24oInRvdWNoc3RhcnQuYnJ1c2giLGEpLG89bi5zZWxlY3RBbGwoIi5iYWNrZ3JvdW5kIikuZGF0YShbMF0pO28uZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImJhY2tncm91bmQiKS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpLnN0eWxlKCJjdXJzb3IiLCJjcm9zc2hhaXIiKSxuLnNlbGVjdEFsbCgiLmV4dGVudCIpLmRhdGEoWzBdKS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiZXh0ZW50Iikuc3R5bGUoImN1cnNvciIsIm1vdmUiKTt2YXIgcz1uLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmRhdGEobSx4KTtzLmV4aXQoKS5yZW1vdmUoKSxzLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLGZ1bmN0aW9uKHQpe3JldHVybiJyZXNpemUgIit0fSkuc3R5bGUoImN1cnNvciIsZnVuY3Rpb24odCl7cmV0dXJuIEdsW3RdfSkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsZnVuY3Rpb24odCl7cmV0dXJuL1tld10kLy50ZXN0KHQpPy0zOm51bGx9KS5hdHRyKCJ5IixmdW5jdGlvbih0KXtyZXR1cm4vXltuc10vLnRlc3QodCk/LTM6bnVsbH0pLmF0dHIoIndpZHRoIiw2KS5hdHRyKCJoZWlnaHQiLDYpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikscy5zdHlsZSgiZGlzcGxheSIsdC5lbXB0eSgpPyJub25lIjpudWxsKTt2YXIgbCxoPXVvLnRyYW5zaXRpb24obiksZj11by50cmFuc2l0aW9uKG8pO3UmJihsPVlpKHUpLGYuYXR0cigieCIsbFswXSkuYXR0cigid2lkdGgiLGxbMV0tbFswXSkscihoKSksYyYmKGw9WWkoYyksZi5hdHRyKCJ5IixsWzBdKS5hdHRyKCJoZWlnaHQiLGxbMV0tbFswXSksaShoKSksZShoKX0pfWZ1bmN0aW9uIGUodCl7dC5zZWxlY3RBbGwoIi5yZXNpemUiKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiJ0cmFuc2xhdGUoIitoWysvZSQvLnRlc3QodCldKyIsIitmWysvXnMvLnRlc3QodCldKyIpIn0pfWZ1bmN0aW9uIHIodCl7dC5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ4IixoWzBdKSx0LnNlbGVjdEFsbCgiLmV4dGVudCwubj5yZWN0LC5zPnJlY3QiKS5hdHRyKCJ3aWR0aCIsaFsxXS1oWzBdKX1mdW5jdGlvbiBpKHQpe3Quc2VsZWN0KCIuZXh0ZW50IikuYXR0cigieSIsZlswXSksdC5zZWxlY3RBbGwoIi5leHRlbnQsLmU+cmVjdCwudz5yZWN0IikuYXR0cigiaGVpZ2h0IixmWzFdLWZbMF0pfWZ1bmN0aW9uIGEoKXtmdW5jdGlvbiBhKCl7MzI9PXVvLmV2ZW50LmtleUNvZGUmJihMfHwoYj1udWxsLHpbMF0tPWhbMV0selsxXS09ZlsxXSxMPTIpLFQoKSl9ZnVuY3Rpb24gbSgpezMyPT11by5ldmVudC5rZXlDb2RlJiYyPT1MJiYoelswXSs9aFsxXSx6WzFdKz1mWzFdLEw9MCxUKCkpfWZ1bmN0aW9uIHYoKXt2YXIgdD11by5tb3VzZShfKSxuPSExO3gmJih0WzBdKz14WzBdLHRbMV0rPXhbMV0pLEx8fCh1by5ldmVudC5hbHRLZXk/KGJ8fChiPVsoaFswXStoWzFdKS8yLChmWzBdK2ZbMV0pLzJdKSx6WzBdPWhbKyh0WzBdPGJbMF0pXSx6WzFdPWZbKyh0WzFdPGJbMV0pXSk6Yj1udWxsKSxTJiZnKHQsdSwwKSYmKHIoayksbj0hMCksRSYmZyh0LGMsMSkmJihpKGspLG49ITApLG4mJihlKGspLE0oe3R5cGU6ImJydXNoIixtb2RlOkw/Im1vdmUiOiJyZXNpemUifSkpfWZ1bmN0aW9uIGcodCxlLHIpe3ZhciBuLGksYT1ZaShlKSxsPWFbMF0sdT1hWzFdLGM9eltyXSxtPXI/ZjpoLHY9bVsxXS1tWzBdO2lmKEwmJihsLT1jLHUtPXYrYyksbj0ocj9wOmQpP01hdGgubWF4KGwsTWF0aC5taW4odSx0W3JdKSk6dFtyXSxMP2k9KG4rPWMpK3Y6KGImJihjPU1hdGgubWF4KGwsTWF0aC5taW4odSwyKmJbcl0tbikpKSxjPG4/KGk9bixuPWMpOmk9YyksbVswXSE9bnx8bVsxXSE9aSlyZXR1cm4gcj9zPW51bGw6bz1udWxsLG1bMF09bixtWzFdPWksITB9ZnVuY3Rpb24geSgpe3YoKSxrLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5Iix0LmVtcHR5KCk/Im5vbmUiOm51bGwpLHVvLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLG51bGwpLEkub24oIm1vdXNlbW92ZS5icnVzaCIsbnVsbCkub24oIm1vdXNldXAuYnJ1c2giLG51bGwpLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLG51bGwpLm9uKCJ0b3VjaGVuZC5icnVzaCIsbnVsbCkub24oImtleWRvd24uYnJ1c2giLG51bGwpLm9uKCJrZXl1cC5icnVzaCIsbnVsbCksQygpLE0oe3R5cGU6ImJydXNoZW5kIn0pfXZhciBiLHgsXz10aGlzLHc9dW8uc2VsZWN0KHVvLmV2ZW50LnRhcmdldCksTT1sLm9mKF8sYXJndW1lbnRzKSxrPXVvLnNlbGVjdChfKSxBPXcuZGF0dW0oKSxTPSEvXihufHMpJC8udGVzdChBKSYmdSxFPSEvXihlfHcpJC8udGVzdChBKSYmYyxMPXcuY2xhc3NlZCgiZXh0ZW50IiksQz1LKF8pLHo9dW8ubW91c2UoXyksST11by5zZWxlY3QobihfKSkub24oImtleWRvd24uYnJ1c2giLGEpLm9uKCJrZXl1cC5icnVzaCIsbSk7aWYodW8uZXZlbnQuY2hhbmdlZFRvdWNoZXM/SS5vbigidG91Y2htb3ZlLmJydXNoIix2KS5vbigidG91Y2hlbmQuYnJ1c2giLHkpOkkub24oIm1vdXNlbW92ZS5icnVzaCIsdikub24oIm1vdXNldXAuYnJ1c2giLHkpLGsuaW50ZXJydXB0KCkuc2VsZWN0QWxsKCIqIikuaW50ZXJydXB0KCksTCl6WzBdPWhbMF0telswXSx6WzFdPWZbMF0telsxXTtlbHNlIGlmKEEpe3ZhciBEPSsvdyQvLnRlc3QoQSksUD0rL15uLy50ZXN0KEEpO3g9W2hbMS1EXS16WzBdLGZbMS1QXS16WzFdXSx6WzBdPWhbRF0selsxXT1mW1BdfWVsc2UgdW8uZXZlbnQuYWx0S2V5JiYoYj16LnNsaWNlKCkpO2suc3R5bGUoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKSx1by5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIix3LnN0eWxlKCJjdXJzb3IiKSksTSh7dHlwZToiYnJ1c2hzdGFydCJ9KSx2KCl9dmFyIG8scyxsPUUodCwiYnJ1c2hzdGFydCIsImJydXNoIiwiYnJ1c2hlbmQiKSx1PW51bGwsYz1udWxsLGg9WzAsMF0sZj1bMCwwXSxkPSEwLHA9ITAsbT1ZbFswXTtyZXR1cm4gdC5ldmVudD1mdW5jdGlvbih0KXt0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1sLm9mKHRoaXMsYXJndW1lbnRzKSxlPXt4OmgseTpmLGk6byxqOnN9LHI9dGhpcy5fX2NoYXJ0X198fGU7dGhpcy5fX2NoYXJ0X189ZSxqbD91by5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0LmJydXNoIixmdW5jdGlvbigpe289ci5pLHM9ci5qLGg9ci54LGY9ci55LHQoe3R5cGU6ImJydXNoc3RhcnQifSl9KS50d2VlbigiYnJ1c2g6YnJ1c2giLGZ1bmN0aW9uKCl7dmFyIHI9d24oaCxlLngpLG49d24oZixlLnkpO3JldHVybiBvPXM9bnVsbCxmdW5jdGlvbihpKXtoPWUueD1yKGkpLGY9ZS55PW4oaSksdCh7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KX19KS5lYWNoKCJlbmQuYnJ1c2giLGZ1bmN0aW9uKCl7bz1lLmkscz1lLmosdCh7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KSx0KHt0eXBlOiJicnVzaGVuZCJ9KX0pOih0KHt0eXBlOiJicnVzaHN0YXJ0In0pLHQoe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSksdCh7dHlwZToiYnJ1c2hlbmQifSkpfSl9LHQueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1lLG09WWxbIXU8PDF8IWNdLHQpOnV9LHQueT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1lLG09WWxbIXU8PDF8IWNdLHQpOmN9LHQuY2xhbXA9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHUmJmM/KGQ9ISFlWzBdLHA9ISFlWzFdKTp1P2Q9ISFlOmMmJihwPSEhZSksdCk6dSYmYz9bZCxwXTp1P2Q6Yz9wOm51bGx9LHQuZXh0ZW50PWZ1bmN0aW9uKGUpe3ZhciByLG4saSxhLGw7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHUmJihyPWVbMF0sbj1lWzFdLGMmJihyPXJbMF0sbj1uWzBdKSxvPVtyLG5dLHUuaW52ZXJ0JiYocj11KHIpLG49dShuKSksbjxyJiYobD1yLHI9bixuPWwpLHI9PWhbMF0mJm49PWhbMV18fChoPVtyLG5dKSksYyYmKGk9ZVswXSxhPWVbMV0sdSYmKGk9aVsxXSxhPWFbMV0pLHM9W2ksYV0sYy5pbnZlcnQmJihpPWMoaSksYT1jKGEpKSxhPGkmJihsPWksaT1hLGE9bCksaT09ZlswXSYmYT09ZlsxXXx8KGY9W2ksYV0pKSx0KToodSYmKG8/KHI9b1swXSxuPW9bMV0pOihyPWhbMF0sbj1oWzFdLHUuaW52ZXJ0JiYocj11LmludmVydChyKSxuPXUuaW52ZXJ0KG4pKSxuPHImJihsPXIscj1uLG49bCkpKSxjJiYocz8oaT1zWzBdLGE9c1sxXSk6KGk9ZlswXSxhPWZbMV0sYy5pbnZlcnQmJihpPWMuaW52ZXJ0KGkpLGE9Yy5pbnZlcnQoYSkpLGE8aSYmKGw9aSxpPWEsYT1sKSkpLHUmJmM/W1tyLGldLFtuLGFdXTp1P1tyLG5dOmMmJltpLGFdKX0sdC5jbGVhcj1mdW5jdGlvbigpe3JldHVybiB0LmVtcHR5KCl8fChoPVswLDBdLGY9WzAsMF0sbz1zPW51bGwpLHR9LHQuZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4hIXUmJmhbMF09PWhbMV18fCEhYyYmZlswXT09ZlsxXX0sdW8ucmViaW5kKHQsbCwib24iKX07dmFyIEdsPXtuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LFlsPVtbIm4iLCJlIiwicyIsInciLCJudyIsIm5lIiwic2UiLCJzdyJdLFsiZSIsInciXSxbIm4iLCJzIl0sW11dLFhsPWZzLmZvcm1hdD15cy50aW1lRm9ybWF0LFdsPVhsLnV0YyxabD1XbCgiJVktJW0tJWRUJUg6JU06JVMuJUxaIik7WGwuaXNvPURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nJiYrbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2lvOlpsLGlvLnBhcnNlPWZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihlKT9udWxsOmV9LGlvLnRvU3RyaW5nPVpsLnRvU3RyaW5nLGZzLnNlY29uZD1WdChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGRzKDFlMypNYXRoLmZsb29yKHQvMWUzKSl9LGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKHQuZ2V0VGltZSgpKzFlMypNYXRoLmZsb29yKGUpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0U2Vjb25kcygpfSksZnMuc2Vjb25kcz1mcy5zZWNvbmQucmFuZ2UsZnMuc2Vjb25kcy51dGM9ZnMuc2Vjb25kLnV0Yy5yYW5nZSxmcy5taW51dGU9VnQoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBkcyg2ZTQqTWF0aC5mbG9vcih0LzZlNCkpfSxmdW5jdGlvbih0LGUpe3Quc2V0VGltZSh0LmdldFRpbWUoKSs2ZTQqTWF0aC5mbG9vcihlKSl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1pbnV0ZXMoKX0pLGZzLm1pbnV0ZXM9ZnMubWludXRlLnJhbmdlLGZzLm1pbnV0ZXMudXRjPWZzLm1pbnV0ZS51dGMucmFuZ2UsZnMuaG91cj1WdChmdW5jdGlvbih0KXt2YXIgZT10LmdldFRpbWV6b25lT2Zmc2V0KCkvNjA7cmV0dXJuIG5ldyBkcygzNmU1KihNYXRoLmZsb29yKHQvMzZlNS1lKStlKSl9LGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKHQuZ2V0VGltZSgpKzM2ZTUqTWF0aC5mbG9vcihlKSl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEhvdXJzKCl9KSxmcy5ob3Vycz1mcy5ob3VyLnJhbmdlLGZzLmhvdXJzLnV0Yz1mcy5ob3VyLnV0Yy5yYW5nZSxmcy5tb250aD1WdChmdW5jdGlvbih0KXtyZXR1cm4gdD1mcy5kYXkodCksdC5zZXREYXRlKDEpLHR9LGZ1bmN0aW9uKHQsZSl7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrZSl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1vbnRoKCl9KSxmcy5tb250aHM9ZnMubW9udGgucmFuZ2UsZnMubW9udGhzLnV0Yz1mcy5tb250aC51dGMucmFuZ2U7dmFyIEpsPVsxZTMsNWUzLDE1ZTMsM2U0LDZlNCwzZTUsOWU1LDE4ZTUsMzZlNSwxMDhlNSwyMTZlNSw0MzJlNSw4NjRlNSwxNzI4ZTUsNjA0OGU1LDI1OTJlNiw3Nzc2ZTYsMzE1MzZlNl0sS2w9W1tmcy5zZWNvbmQsMV0sW2ZzLnNlY29uZCw1XSxbZnMuc2Vjb25kLDE1XSxbZnMuc2Vjb25kLDMwXSxbZnMubWludXRlLDFdLFtmcy5taW51dGUsNV0sW2ZzLm1pbnV0ZSwxNV0sW2ZzLm1pbnV0ZSwzMF0sW2ZzLmhvdXIsMV0sW2ZzLmhvdXIsM10sW2ZzLmhvdXIsNl0sW2ZzLmhvdXIsMTJdLFtmcy5kYXksMV0sW2ZzLmRheSwyXSxbZnMud2VlaywxXSxbZnMubW9udGgsMV0sW2ZzLm1vbnRoLDNdLFtmcy55ZWFyLDFdXSxRbD1YbC5tdWx0aShbWyIuJUwiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1pbGxpc2Vjb25kcygpfV0sWyI6JVMiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFNlY29uZHMoKX1dLFsiJUk6JU0iLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1pbnV0ZXMoKX1dLFsiJUkgJXAiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEhvdXJzKCl9XSxbIiVhICVkIixmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXkoKSYmMSE9dC5nZXREYXRlKCl9XSxbIiViICVkIixmdW5jdGlvbih0KXtyZXR1cm4gMSE9dC5nZXREYXRlKCl9XSxbIiVCIixmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfV0sWyIlWSIsemVdXSksJGw9e3JhbmdlOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdW8ucmFuZ2UoTWF0aC5jZWlsKHQvcikqciwrZSxyKS5tYXAob28pfSxmbG9vcjp4LGNlaWw6eH07S2wueWVhcj1mcy55ZWFyLGZzLnNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIGFvKHVvLnNjYWxlLmxpbmVhcigpLEtsLFFsKX07dmFyIHR1PUtsLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bdFswXS51dGMsdFsxXV19KSxldT1XbC5tdWx0aShbWyIuJUwiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbGxpc2Vjb25kcygpfV0sWyI6JVMiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ1NlY29uZHMoKX1dLFsiJUk6JU0iLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX1dLFsiJUkgJXAiLGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0hvdXJzKCl9XSxbIiVhICVkIixmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXkoKSYmMSE9dC5nZXRVVENEYXRlKCl9XSxbIiViICVkIixmdW5jdGlvbih0KXtyZXR1cm4gMSE9dC5nZXRVVENEYXRlKCl9XSxbIiVCIixmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENNb250aCgpfV0sWyIlWSIsemVdXSk7dHUueWVhcj1mcy55ZWFyLnV0Yyxmcy5zY2FsZS51dGM9ZnVuY3Rpb24oKXtyZXR1cm4gYW8odW8uc2NhbGUubGluZWFyKCksdHUsZXUpfSx1by50ZXh0PUx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlc3BvbnNlVGV4dH0pLHVvLmpzb249ZnVuY3Rpb24odCxlKXtyZXR1cm4gQ3QodCwiYXBwbGljYXRpb24vanNvbiIsc28sZSl9LHVvLmh0bWw9ZnVuY3Rpb24odCxlKXtyZXR1cm4gQ3QodCwidGV4dC9odG1sIixsbyxlKX0sdW8ueG1sPUx0KGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlc3BvbnNlWE1MfSksImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuYW1kPyh0aGlzLmQzPXVvLHQodW8pKToib2JqZWN0Ij09dHlwZW9mIHImJnIuZXhwb3J0cz9yLmV4cG9ydHM9dW86dGhpcy5kMz11b30oKX0se31dLDEyMTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dGhpcy5wb2ludD10LHRoaXMuaW5kZXg9ZX1mdW5jdGlvbiBpKHQsZSl7Zm9yKHZhciByPXQucG9pbnQsbj1lLnBvaW50LGk9ci5sZW5ndGgsYT0wO2E8aTsrK2Epe3ZhciBvPW5bYV0tclthXTtpZihvKXJldHVybiBvfXJldHVybiAwfWZ1bmN0aW9uIGEodCxlLHIpe2lmKDE9PT10KXJldHVybiByP1tbLTEsMF1dOltdO3ZhciBuPWUubWFwKGZ1bmN0aW9uKHQsZSl7cmV0dXJuW3RbMF0sZV19KTtuLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdFswXS1lWzBdfSk7Zm9yKHZhciBpPW5ldyBBcnJheSh0LTEpLGE9MTthPHQ7KythKXt2YXIgbz1uW2EtMV0scz1uW2FdO2lbYS0xXT1bb1sxXSxzWzFdXX1yZXR1cm4gciYmaS5wdXNoKFstMSxpWzBdWzFdXSxbaVt0LTFdWzFdLC0xXSksaX1mdW5jdGlvbiBvKHQsZSl7dmFyIHI9dC5sZW5ndGg7aWYoMD09PXIpcmV0dXJuW107dmFyIG89dFswXS5sZW5ndGg7aWYobzwxKXJldHVybltdO2lmKDE9PT1vKXJldHVybiBhKHIsdCxlKTtmb3IodmFyIHU9bmV3IEFycmF5KHIpLGM9MSxoPTA7aDxyOysraCl7Zm9yKHZhciBmPXRbaF0sZD1uZXcgQXJyYXkobysxKSxwPTAsbT0wO208bzsrK20pe3ZhciB2PWZbbV07ZFttXT12LHArPXYqdn1kW29dPXAsdVtoXT1uZXcgbihkLGgpLGM9TWF0aC5tYXgocCxjKX1sKHUsaSkscj11Lmxlbmd0aDtmb3IodmFyIGc9bmV3IEFycmF5KHIrbysxKSx5PW5ldyBBcnJheShyK28rMSksYj0obysxKSoobysxKSpjLHg9bmV3IEFycmF5KG8rMSksaD0wO2g8PW87KytoKXhbaF09MDt4W29dPWIsZ1swXT14LnNsaWNlKCkseVswXT0tMTtmb3IodmFyIGg9MDtoPD1vOysraCl7dmFyIGQ9eC5zbGljZSgpO2RbaF09MSxnW2grMV09ZCx5W2grMV09LTF9Zm9yKHZhciBoPTA7aDxyOysraCl7dmFyIF89dVtoXTtnW2grbysxXT1fLnBvaW50LHlbaCtvKzFdPV8uaW5kZXh9dmFyIHc9cyhnLCExKTtpZih3PWU/dy5maWx0ZXIoZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAscj0wO3I8PW87KytyKXt2YXIgbj15W3Rbcl1dO2lmKG48MCYmKytlPj0yKXJldHVybiExO3Rbcl09bn1yZXR1cm4hMH0pOncuZmlsdGVyKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8PW87KytlKXt2YXIgcj15W3RbZV1dO2lmKHI8MClyZXR1cm4hMTt0W2VdPXJ9cmV0dXJuITB9KSwxJm8pZm9yKHZhciBoPTA7aDx3Lmxlbmd0aDsrK2gpe3ZhciBfPXdbaF0sZD1fWzBdO19bMF09X1sxXSxfWzFdPWR9cmV0dXJuIHd9dmFyIHM9dCgiaW5jcmVtZW50YWwtY29udmV4LWh1bGwiKSxsPXQoInVuaXEiKTtlLmV4cG9ydHM9b30seyJpbmNyZW1lbnRhbC1jb252ZXgtaHVsbCI6Mjg4LHVuaXE6NTQxfV0sMTIyOltmdW5jdGlvbih0LGUscil7KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIHIodCxlKXtyZXR1cm4gZFswXT10LGRbMV09ZSxmWzBdfWZ1bmN0aW9uIG4odCl7cmV0dXJuIGZbMF09dCxkWzBdfWZ1bmN0aW9uIGkodCl7cmV0dXJuIGZbMF09dCxkWzFdfWZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gZFsxXT10LGRbMF09ZSxmWzBdfWZ1bmN0aW9uIG8odCl7cmV0dXJuIGZbMF09dCxkWzFdfWZ1bmN0aW9uIHModCl7cmV0dXJuIGZbMF09dCxkWzBdfWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gcC53cml0ZVVJbnQzMkxFKHQsMCwhMCkscC53cml0ZVVJbnQzMkxFKGUsNCwhMCkscC5yZWFkRG91YmxlTEUoMCwhMCl9ZnVuY3Rpb24gdSh0KXtyZXR1cm4gcC53cml0ZURvdWJsZUxFKHQsMCwhMCkscC5yZWFkVUludDMyTEUoMCwhMCl9ZnVuY3Rpb24gYyh0KXtyZXR1cm4gcC53cml0ZURvdWJsZUxFKHQsMCwhMCkscC5yZWFkVUludDMyTEUoNCwhMCl9dmFyIGg9ITE7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBGbG9hdDY0QXJyYXkpe3ZhciBmPW5ldyBGbG9hdDY0QXJyYXkoMSksZD1uZXcgVWludDMyQXJyYXkoZi5idWZmZXIpO2ZbMF09MSxoPSEwLDEwNzI2OTMyNDg9PT1kWzFdPyhlLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZbMF09dCxbZFswXSxkWzFdXX0sZS5leHBvcnRzLnBhY2s9cixlLmV4cG9ydHMubG89bixlLmV4cG9ydHMuaGk9aSk6MTA3MjY5MzI0OD09PWRbMF0/KGUuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZlswXT10LFtkWzFdLGRbMF1dfSxlLmV4cG9ydHMucGFjaz1hLGUuZXhwb3J0cy5sbz1vLGUuZXhwb3J0cy5oaT1zKTpoPSExfWlmKCFoKXt2YXIgcD1uZXcgdCg4KTtlLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIHAud3JpdGVEb3VibGVMRSh0LDAsITApLFtwLnJlYWRVSW50MzJMRSgwLCEwKSxwLnJlYWRVSW50MzJMRSg0LCEwKV19LGUuZXhwb3J0cy5wYWNrPWwsZS5leHBvcnRzLmxvPXUsZS5leHBvcnRzLmhpPWN9ZS5leHBvcnRzLnNpZ249ZnVuY3Rpb24odCl7cmV0dXJuIGUuZXhwb3J0cy5oaSh0KT4+PjMxfSxlLmV4cG9ydHMuZXhwb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuKGUuZXhwb3J0cy5oaSh0KTw8MT4+PjIxKS0xMDIzfSxlLmV4cG9ydHMuZnJhY3Rpb249ZnVuY3Rpb24odCl7dmFyIHI9ZS5leHBvcnRzLmxvKHQpLG49ZS5leHBvcnRzLmhpKHQpLGk9MTA0ODU3NSZuO3JldHVybiAyMTQ2NDM1MDcyJm4mJihpKz0xPDwyMCksW3IsaV19LGUuZXhwb3J0cy5kZW5vcm1hbGl6ZWQ9ZnVuY3Rpb24odCl7cmV0dXJuISgyMTQ2NDM1MDcyJmUuZXhwb3J0cy5oaSh0KSl9fSkuY2FsbCh0aGlzLHQoImJ1ZmZlciIpLkJ1ZmZlcil9LHtidWZmZXI6NzV9XSwxMjM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7dmFyIGk9MHx0W3JdO2lmKGk8PTApcmV0dXJuW107dmFyIGEsbz1uZXcgQXJyYXkoaSk7aWYocj09PXQubGVuZ3RoLTEpZm9yKGE9MDthPGk7KythKW9bYV09ZTtlbHNlIGZvcihhPTA7YTxpOysrYSlvW2FdPW4odCxlLHIrMSk7cmV0dXJuIG99ZnVuY3Rpb24gaSh0LGUpe3ZhciByLG47Zm9yKHI9bmV3IEFycmF5KHQpLG49MDtuPHQ7KytuKXJbbl09ZTtyZXR1cm4gcn1mdW5jdGlvbiBhKHQsZSl7c3dpdGNoKHZvaWQgMD09PWUmJihlPTApLHR5cGVvZiB0KXtjYXNlIm51bWJlciI6aWYodD4wKXJldHVybiBpKDB8dCxlKTticmVhaztjYXNlIm9iamVjdCI6aWYoIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aClyZXR1cm4gbih0LGUsMCl9cmV0dXJuW119ZS5leHBvcnRzPWF9LHt9XSwxMjQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7cj1yfHwyO3ZhciBuPWUmJmUubGVuZ3RoLGE9bj9lWzBdKnI6dC5sZW5ndGgscz1pKHQsMCxhLHIsITApLGw9W107aWYoIXMpcmV0dXJuIGw7dmFyIHUsYyxmLGQscCxtLHY7aWYobiYmKHM9aCh0LGUscyxyKSksdC5sZW5ndGg+ODAqcil7dT1mPXRbMF0sYz1kPXRbMV07Zm9yKHZhciBnPXI7ZzxhO2crPXIpcD10W2ddLG09dFtnKzFdLHA8dSYmKHU9cCksbTxjJiYoYz1tKSxwPmYmJihmPXApLG0+ZCYmKGQ9bSk7dj1NYXRoLm1heChmLXUsZC1jKX1yZXR1cm4gbyhzLGwscix1LGMsdiksbH1mdW5jdGlvbiBpKHQsZSxyLG4saSl7dmFyIGEsbztpZihpPT09eih0LGUscixuKT4wKWZvcihhPWU7YTxyO2ErPW4pbz1FKGEsdFthXSx0W2ErMV0sbyk7ZWxzZSBmb3IoYT1yLW47YT49ZTthLT1uKW89RShhLHRbYV0sdFthKzFdLG8pO3JldHVybiBvJiZ3KG8sby5uZXh0KSYmKEwobyksbz1vLm5leHQpLG99ZnVuY3Rpb24gYSh0LGUpe2lmKCF0KXJldHVybiB0O2V8fChlPXQpO3ZhciByLG49dDtkb3tpZihyPSExLG4uc3RlaW5lcnx8IXcobixuLm5leHQpJiYwIT09XyhuLnByZXYsbixuLm5leHQpKW49bi5uZXh0O2Vsc2V7aWYoTChuKSwobj1lPW4ucHJldik9PT1uLm5leHQpcmV0dXJuIG51bGw7cj0hMH19d2hpbGUocnx8biE9PWUpO3JldHVybiBlfWZ1bmN0aW9uIG8odCxlLHIsbixpLGgsZil7aWYodCl7IWYmJmgmJm0odCxuLGksaCk7Zm9yKHZhciBkLHAsdj10O3QucHJldiE9PXQubmV4dDspaWYoZD10LnByZXYscD10Lm5leHQsaD9sKHQsbixpLGgpOnModCkpZS5wdXNoKGQuaS9yKSxlLnB1c2godC5pL3IpLGUucHVzaChwLmkvciksTCh0KSx0PXAubmV4dCx2PXAubmV4dDtlbHNlIGlmKCh0PXApPT09dil7Zj8xPT09Zj8odD11KHQsZSxyKSxvKHQsZSxyLG4saSxoLDIpKToyPT09ZiYmYyh0LGUscixuLGksaCk6byhhKHQpLGUscixuLGksaCwxKTticmVha319fWZ1bmN0aW9uIHModCl7dmFyIGU9dC5wcmV2LHI9dCxuPXQubmV4dDtpZihfKGUscixuKT49MClyZXR1cm4hMTtmb3IodmFyIGk9dC5uZXh0Lm5leHQ7aSE9PXQucHJldjspe2lmKGIoZS54LGUueSxyLngsci55LG4ueCxuLnksaS54LGkueSkmJl8oaS5wcmV2LGksaS5uZXh0KT49MClyZXR1cm4hMTtpPWkubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBsKHQsZSxyLG4pe3ZhciBpPXQucHJldixhPXQsbz10Lm5leHQ7aWYoXyhpLGEsbyk+PTApcmV0dXJuITE7Zm9yKHZhciBzPWkueDxhLng/aS54PG8ueD9pLng6by54OmEueDxvLng/YS54Om8ueCxsPWkueTxhLnk/aS55PG8ueT9pLnk6by55OmEueTxvLnk/YS55Om8ueSx1PWkueD5hLng/aS54Pm8ueD9pLng6by54OmEueD5vLng/YS54Om8ueCxjPWkueT5hLnk/aS55Pm8ueT9pLnk6by55OmEueT5vLnk/YS55Om8ueSxoPWcocyxsLGUscixuKSxmPWcodSxjLGUscixuKSxkPXQubmV4dFo7ZCYmZC56PD1mOyl7aWYoZCE9PXQucHJldiYmZCE9PXQubmV4dCYmYihpLngsaS55LGEueCxhLnksby54LG8ueSxkLngsZC55KSYmXyhkLnByZXYsZCxkLm5leHQpPj0wKXJldHVybiExO2Q9ZC5uZXh0Wn1mb3IoZD10LnByZXZaO2QmJmQuej49aDspe2lmKGQhPT10LnByZXYmJmQhPT10Lm5leHQmJmIoaS54LGkueSxhLngsYS55LG8ueCxvLnksZC54LGQueSkmJl8oZC5wcmV2LGQsZC5uZXh0KT49MClyZXR1cm4hMTtkPWQucHJldlp9cmV0dXJuITB9ZnVuY3Rpb24gdSh0LGUscil7dmFyIG49dDtkb3t2YXIgaT1uLnByZXYsYT1uLm5leHQubmV4dDshdyhpLGEpJiZNKGksbixuLm5leHQsYSkmJkEoaSxhKSYmQShhLGkpJiYoZS5wdXNoKGkuaS9yKSxlLnB1c2gobi5pL3IpLGUucHVzaChhLmkvciksTChuKSxMKG4ubmV4dCksbj10PWEpLG49bi5uZXh0fXdoaWxlKG4hPT10KTtyZXR1cm4gbn1mdW5jdGlvbiBjKHQsZSxyLG4saSxzKXt2YXIgbD10O2Rve2Zvcih2YXIgdT1sLm5leHQubmV4dDt1IT09bC5wcmV2Oyl7aWYobC5pIT09dS5pJiZ4KGwsdSkpe3ZhciBjPVMobCx1KTtyZXR1cm4gbD1hKGwsbC5uZXh0KSxjPWEoYyxjLm5leHQpLG8obCxlLHIsbixpLHMpLHZvaWQgbyhjLGUscixuLGkscyl9dT11Lm5leHR9bD1sLm5leHR9d2hpbGUobCE9PXQpfWZ1bmN0aW9uIGgodCxlLHIsbil7dmFyIG8scyxsLHUsYyxoPVtdO2ZvcihvPTAscz1lLmxlbmd0aDtvPHM7bysrKWw9ZVtvXSpuLHU9bzxzLTE/ZVtvKzFdKm46dC5sZW5ndGgsYz1pKHQsbCx1LG4sITEpLGM9PT1jLm5leHQmJihjLnN0ZWluZXI9ITApLGgucHVzaCh5KGMpKTtmb3IoaC5zb3J0KGYpLG89MDtvPGgubGVuZ3RoO28rKylkKGhbb10scikscj1hKHIsci5uZXh0KTtyZXR1cm4gcn1mdW5jdGlvbiBmKHQsZSl7cmV0dXJuIHQueC1lLnh9ZnVuY3Rpb24gZCh0LGUpe2lmKGU9cCh0LGUpKXt2YXIgcj1TKGUsdCk7YShyLHIubmV4dCl9fWZ1bmN0aW9uIHAodCxlKXt2YXIgcixuPWUsaT10LngsYT10Lnksbz0tMS8wO2Rve2lmKGE8PW4ueSYmYT49bi5uZXh0Lnkpe3ZhciBzPW4ueCsoYS1uLnkpKihuLm5leHQueC1uLngpLyhuLm5leHQueS1uLnkpO2lmKHM8PWkmJnM+byl7aWYobz1zLHM9PT1pKXtpZihhPT09bi55KXJldHVybiBuO2lmKGE9PT1uLm5leHQueSlyZXR1cm4gbi5uZXh0fXI9bi54PG4ubmV4dC54P246bi5uZXh0fX1uPW4ubmV4dH13aGlsZShuIT09ZSk7aWYoIXIpcmV0dXJuIG51bGw7aWYoaT09PW8pcmV0dXJuIHIucHJldjt2YXIgbCx1PXIsYz1yLngsaD1yLnksZj0xLzA7Zm9yKG49ci5uZXh0O24hPT11OylpPj1uLngmJm4ueD49YyYmYihhPGg/aTpvLGEsYyxoLGE8aD9vOmksYSxuLngsbi55KSYmKChsPU1hdGguYWJzKGEtbi55KS8oaS1uLngpKTxmfHxsPT09ZiYmbi54PnIueCkmJkEobix0KSYmKHI9bixmPWwpLG49bi5uZXh0O3JldHVybiByfWZ1bmN0aW9uIG0odCxlLHIsbil7dmFyIGk9dDtkb3tudWxsPT09aS56JiYoaS56PWcoaS54LGkueSxlLHIsbikpLGkucHJldlo9aS5wcmV2LGkubmV4dFo9aS5uZXh0LGk9aS5uZXh0fXdoaWxlKGkhPT10KTtpLnByZXZaLm5leHRaPW51bGwsaS5wcmV2Wj1udWxsLHYoaSl9ZnVuY3Rpb24gdih0KXt2YXIgZSxyLG4saSxhLG8scyxsLHU9MTtkb3tmb3Iocj10LHQ9bnVsbCxhPW51bGwsbz0wO3I7KXtmb3IobysrLG49cixzPTAsZT0wO2U8dSYmKHMrKyxuPW4ubmV4dFopO2UrKyk7Zm9yKGw9dTtzPjB8fGw+MCYmbjspMD09PXM/KGk9bixuPW4ubmV4dFosbC0tKTowIT09bCYmbj9yLno8PW4uej8oaT1yLHI9ci5uZXh0WixzLS0pOihpPW4sbj1uLm5leHRaLGwtLSk6KGk9cixyPXIubmV4dFoscy0tKSxhP2EubmV4dFo9aTp0PWksaS5wcmV2Wj1hLGE9aTtyPW59YS5uZXh0Wj1udWxsLHUqPTJ9d2hpbGUobz4xKTtyZXR1cm4gdH1mdW5jdGlvbiBnKHQsZSxyLG4saSl7cmV0dXJuIHQ9MzI3NjcqKHQtcikvaSxlPTMyNzY3KihlLW4pL2ksdD0xNjcxMTkzNSYodHx0PDw4KSx0PTI1MjY0NTEzNSYodHx0PDw0KSx0PTg1ODk5MzQ1OSYodHx0PDwyKSx0PTE0MzE2NTU3NjUmKHR8dDw8MSksZT0xNjcxMTkzNSYoZXxlPDw4KSxlPTI1MjY0NTEzNSYoZXxlPDw0KSxlPTg1ODk5MzQ1OSYoZXxlPDwyKSxlPTE0MzE2NTU3NjUmKGV8ZTw8MSksdHxlPDwxfWZ1bmN0aW9uIHkodCl7dmFyIGU9dCxyPXQ7ZG97ZS54PHIueCYmKHI9ZSksZT1lLm5leHR9d2hpbGUoZSE9PXQpO3JldHVybiByfWZ1bmN0aW9uIGIodCxlLHIsbixpLGEsbyxzKXtyZXR1cm4oaS1vKSooZS1zKS0odC1vKSooYS1zKT49MCYmKHQtbykqKG4tcyktKHItbykqKGUtcyk+PTAmJihyLW8pKihhLXMpLShpLW8pKihuLXMpPj0wfWZ1bmN0aW9uIHgodCxlKXtyZXR1cm4gdC5uZXh0LmkhPT1lLmkmJnQucHJldi5pIT09ZS5pJiYhayh0LGUpJiZBKHQsZSkmJkEoZSx0KSYmVCh0LGUpfWZ1bmN0aW9uIF8odCxlLHIpe3JldHVybihlLnktdC55KSooci54LWUueCktKGUueC10LngpKihyLnktZS55KX1mdW5jdGlvbiB3KHQsZSl7cmV0dXJuIHQueD09PWUueCYmdC55PT09ZS55fWZ1bmN0aW9uIE0odCxlLHIsbil7cmV0dXJuISEodyh0LGUpJiZ3KHIsbil8fHcodCxuKSYmdyhyLGUpKXx8Xyh0LGUscik+MCE9Xyh0LGUsbik+MCYmXyhyLG4sdCk+MCE9XyhyLG4sZSk+MH1mdW5jdGlvbiBrKHQsZSl7dmFyIHI9dDtkb3tpZihyLmkhPT10LmkmJnIubmV4dC5pIT09dC5pJiZyLmkhPT1lLmkmJnIubmV4dC5pIT09ZS5pJiZNKHIsci5uZXh0LHQsZSkpcmV0dXJuITA7cj1yLm5leHR9d2hpbGUociE9PXQpO3JldHVybiExfWZ1bmN0aW9uIEEodCxlKXtyZXR1cm4gXyh0LnByZXYsdCx0Lm5leHQpPDA/Xyh0LGUsdC5uZXh0KT49MCYmXyh0LHQucHJldixlKT49MDpfKHQsZSx0LnByZXYpPDB8fF8odCx0Lm5leHQsZSk8MH1mdW5jdGlvbiBUKHQsZSl7dmFyIHI9dCxuPSExLGk9KHQueCtlLngpLzIsYT0odC55K2UueSkvMjtkb3tyLnk+YSE9ci5uZXh0Lnk+YSYmaTwoci5uZXh0Lngtci54KSooYS1yLnkpLyhyLm5leHQueS1yLnkpK3IueCYmKG49IW4pLHI9ci5uZXh0fXdoaWxlKHIhPT10KTtyZXR1cm4gbn1mdW5jdGlvbiBTKHQsZSl7dmFyIHI9bmV3IEModC5pLHQueCx0LnkpLG49bmV3IEMoZS5pLGUueCxlLnkpLGk9dC5uZXh0LGE9ZS5wcmV2O3JldHVybiB0Lm5leHQ9ZSxlLnByZXY9dCxyLm5leHQ9aSxpLnByZXY9cixuLm5leHQ9cixyLnByZXY9bixhLm5leHQ9bixuLnByZXY9YSxufWZ1bmN0aW9uIEUodCxlLHIsbil7dmFyIGk9bmV3IEModCxlLHIpO3JldHVybiBuPyhpLm5leHQ9bi5uZXh0LGkucHJldj1uLG4ubmV4dC5wcmV2PWksbi5uZXh0PWkpOihpLnByZXY9aSxpLm5leHQ9aSksaX1mdW5jdGlvbiBMKHQpe3QubmV4dC5wcmV2PXQucHJldix0LnByZXYubmV4dD10Lm5leHQsdC5wcmV2WiYmKHQucHJldloubmV4dFo9dC5uZXh0WiksdC5uZXh0WiYmKHQubmV4dFoucHJldlo9dC5wcmV2Wil9ZnVuY3Rpb24gQyh0LGUscil7dGhpcy5pPXQsdGhpcy54PWUsdGhpcy55PXIsdGhpcy5wcmV2PW51bGwsdGhpcy5uZXh0PW51bGwsdGhpcy56PW51bGwsdGhpcy5wcmV2Wj1udWxsLHRoaXMubmV4dFo9bnVsbCx0aGlzLnN0ZWluZXI9ITF9ZnVuY3Rpb24geih0LGUscixuKXtmb3IodmFyIGk9MCxhPWUsbz1yLW47YTxyO2ErPW4paSs9KHRbb10tdFthXSkqKHRbYSsxXSt0W28rMV0pLG89YTtyZXR1cm4gaX1lLmV4cG9ydHM9bixuLmRldmlhdGlvbj1mdW5jdGlvbih0LGUscixuKXt2YXIgaT1lJiZlLmxlbmd0aCxhPWk/ZVswXSpyOnQubGVuZ3RoLG89TWF0aC5hYnMoeih0LDAsYSxyKSk7aWYoaSlmb3IodmFyIHM9MCxsPWUubGVuZ3RoO3M8bDtzKyspe3ZhciB1PWVbc10qcixjPXM8bC0xP2VbcysxXSpyOnQubGVuZ3RoO28tPU1hdGguYWJzKHoodCx1LGMscikpfXZhciBoPTA7Zm9yKHM9MDtzPG4ubGVuZ3RoO3MrPTMpe3ZhciBmPW5bc10qcixkPW5bcysxXSpyLHA9bltzKzJdKnI7aCs9TWF0aC5hYnMoKHRbZl0tdFtwXSkqKHRbZCsxXS10W2YrMV0pLSh0W2ZdLXRbZF0pKih0W3ArMV0tdFtmKzFdKSl9cmV0dXJuIDA9PT1vJiYwPT09aD8wOk1hdGguYWJzKChoLW8pL28pfSxuLmZsYXR0ZW49ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRbMF1bMF0ubGVuZ3RoLHI9e3ZlcnRpY2VzOltdLGhvbGVzOltdLGRpbWVuc2lvbnM6ZX0sbj0wLGk9MDtpPHQubGVuZ3RoO2krKyl7Zm9yKHZhciBhPTA7YTx0W2ldLmxlbmd0aDthKyspZm9yKHZhciBvPTA7bzxlO28rKylyLnZlcnRpY2VzLnB1c2godFtpXVthXVtvXSk7aT4wJiYobis9dFtpLTFdLmxlbmd0aCxyLmhvbGVzLnB1c2gobikpfXJldHVybiByfX0se31dLDEyNTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9dC5sZW5ndGg7aWYoIm51bWJlciIhPXR5cGVvZiBlKXtlPTA7Zm9yKHZhciBuPTA7bjxyOysrbil7dmFyIGE9dFtuXTtlPU1hdGgubWF4KGUsYVswXSxhWzFdKX1lPTErKDB8ZSl9ZXw9MDtmb3IodmFyIG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKW9bbl09W107Zm9yKHZhciBuPTA7bjxyOysrbil7dmFyIGE9dFtuXTtvW2FbMF1dLnB1c2goYVsxXSksb1thWzFdXS5wdXNoKGFbMF0pfWZvcih2YXIgcz0wO3M8ZTsrK3MpaShvW3NdLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pO3JldHVybiBvfWUuZXhwb3J0cz1uO3ZhciBpPXQoInVuaXEiKX0se3VuaXE6NTQxfV0sMTI2OltmdW5jdGlvbihlLHIsbil7KGZ1bmN0aW9uKGksYSl7IWZ1bmN0aW9uKGUsaSl7Im9iamVjdCI9PXR5cGVvZiBuJiZ2b2lkIDAhPT1yP3IuZXhwb3J0cz1pKCk6ImZ1bmN0aW9uIj09dHlwZW9mIHQmJnQuYW1kP3QoaSk6ZS5FUzZQcm9taXNlPWkoKX0odGhpcyxmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiB0KHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fHwib2JqZWN0Ij09dHlwZW9mIHQmJm51bGwhPT10fWZ1bmN0aW9uIHIodCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHR9ZnVuY3Rpb24gbih0KXtHPXR9ZnVuY3Rpb24gbyh0KXtZPXR9ZnVuY3Rpb24gcygpe3JldHVybiBmdW5jdGlvbigpe3EodSl9fWZ1bmN0aW9uIGwoKXt2YXIgdD1zZXRUaW1lb3V0O3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KHUsMSl9fWZ1bmN0aW9uIHUoKXtmb3IodmFyIHQ9MDt0PEg7dCs9Mil7KDAsUVt0XSkoUVt0KzFdKSxRW3RdPXZvaWQgMCxRW3QrMV09dm9pZCAwfUg9MH1mdW5jdGlvbiBjKHQsZSl7dmFyIHI9YXJndW1lbnRzLG49dGhpcyxpPW5ldyB0aGlzLmNvbnN0cnVjdG9yKGYpO3ZvaWQgMD09PWlbdHRdJiZ6KGkpO3ZhciBhPW4uX3N0YXRlO3JldHVybiBhP2Z1bmN0aW9uKCl7dmFyIHQ9clthLTFdO1koZnVuY3Rpb24oKXtyZXR1cm4gRShhLGksdCxuLl9yZXN1bHQpfSl9KCk6ayhuLGksdCxlKSxpfWZ1bmN0aW9uIGgodCl7dmFyIGU9dGhpcztpZih0JiYib2JqZWN0Ij09dHlwZW9mIHQmJnQuY29uc3RydWN0b3I9PT1lKXJldHVybiB0O3ZhciByPW5ldyBlKGYpO3JldHVybiB4KHIsdCkscn1mdW5jdGlvbiBmKCl7fWZ1bmN0aW9uIGQoKXtyZXR1cm4gbmV3IFR5cGVFcnJvcigiWW91IGNhbm5vdCByZXNvbHZlIGEgcHJvbWlzZSB3aXRoIGl0c2VsZiIpfWZ1bmN0aW9uIHAoKXtyZXR1cm4gbmV3IFR5cGVFcnJvcigiQSBwcm9taXNlcyBjYWxsYmFjayBjYW5ub3QgcmV0dXJuIHRoYXQgc2FtZSBwcm9taXNlLiIpfWZ1bmN0aW9uIG0odCl7dHJ5e3JldHVybiB0LnRoZW59Y2F0Y2godCl7cmV0dXJuIGl0LmVycm9yPXQsaXR9fWZ1bmN0aW9uIHYodCxlLHIsbil7dHJ5e3QuY2FsbChlLHIsbil9Y2F0Y2godCl7cmV0dXJuIHR9fWZ1bmN0aW9uIGcodCxlLHIpe1koZnVuY3Rpb24odCl7dmFyIG49ITEsaT12KHIsZSxmdW5jdGlvbihyKXtufHwobj0hMCxlIT09cj94KHQscik6dyh0LHIpKX0sZnVuY3Rpb24oZSl7bnx8KG49ITAsTSh0LGUpKX0sIlNldHRsZTogIisodC5fbGFiZWx8fCIgdW5rbm93biBwcm9taXNlIikpOyFuJiZpJiYobj0hMCxNKHQsaSkpfSx0KX1mdW5jdGlvbiB5KHQsZSl7ZS5fc3RhdGU9PT1ydD93KHQsZS5fcmVzdWx0KTplLl9zdGF0ZT09PW50P00odCxlLl9yZXN1bHQpOmsoZSx2b2lkIDAsZnVuY3Rpb24oZSl7cmV0dXJuIHgodCxlKX0sZnVuY3Rpb24oZSl7cmV0dXJuIE0odCxlKX0pfWZ1bmN0aW9uIGIodCxlLG4pe2UuY29uc3RydWN0b3I9PT10LmNvbnN0cnVjdG9yJiZuPT09YyYmZS5jb25zdHJ1Y3Rvci5yZXNvbHZlPT09aD95KHQsZSk6bj09PWl0P00odCxpdC5lcnJvcik6dm9pZCAwPT09bj93KHQsZSk6cihuKT9nKHQsZSxuKTp3KHQsZSl9ZnVuY3Rpb24geChlLHIpe2U9PT1yP00oZSxkKCkpOnQocik/YihlLHIsbShyKSk6dyhlLHIpfWZ1bmN0aW9uIF8odCl7dC5fb25lcnJvciYmdC5fb25lcnJvcih0Ll9yZXN1bHQpLEEodCl9ZnVuY3Rpb24gdyh0LGUpe3QuX3N0YXRlPT09ZXQmJih0Ll9yZXN1bHQ9ZSx0Ll9zdGF0ZT1ydCwwIT09dC5fc3Vic2NyaWJlcnMubGVuZ3RoJiZZKEEsdCkpfWZ1bmN0aW9uIE0odCxlKXt0Ll9zdGF0ZT09PWV0JiYodC5fc3RhdGU9bnQsdC5fcmVzdWx0PWUsWShfLHQpKX1mdW5jdGlvbiBrKHQsZSxyLG4pe3ZhciBpPXQuX3N1YnNjcmliZXJzLGE9aS5sZW5ndGg7dC5fb25lcnJvcj1udWxsLGlbYV09ZSxpW2ErcnRdPXIsaVthK250XT1uLDA9PT1hJiZ0Ll9zdGF0ZSYmWShBLHQpfWZ1bmN0aW9uIEEodCl7dmFyIGU9dC5fc3Vic2NyaWJlcnMscj10Ll9zdGF0ZTtpZigwIT09ZS5sZW5ndGgpe2Zvcih2YXIgbj12b2lkIDAsaT12b2lkIDAsYT10Ll9yZXN1bHQsbz0wO288ZS5sZW5ndGg7bys9MyluPWVbb10saT1lW28rcl0sbj9FKHIsbixpLGEpOmkoYSk7dC5fc3Vic2NyaWJlcnMubGVuZ3RoPTB9fWZ1bmN0aW9uIFQoKXt0aGlzLmVycm9yPW51bGx9ZnVuY3Rpb24gUyh0LGUpe3RyeXtyZXR1cm4gdChlKX1jYXRjaCh0KXtyZXR1cm4gYXQuZXJyb3I9dCxhdH19ZnVuY3Rpb24gRSh0LGUsbixpKXt2YXIgYT1yKG4pLG89dm9pZCAwLHM9dm9pZCAwLGw9dm9pZCAwLHU9dm9pZCAwO2lmKGEpe2lmKG89UyhuLGkpLG89PT1hdD8odT0hMCxzPW8uZXJyb3Isbz1udWxsKTpsPSEwLGU9PT1vKXJldHVybiB2b2lkIE0oZSxwKCkpfWVsc2Ugbz1pLGw9ITA7ZS5fc3RhdGUhPT1ldHx8KGEmJmw/eChlLG8pOnU/TShlLHMpOnQ9PT1ydD93KGUsbyk6dD09PW50JiZNKGUsbykpfWZ1bmN0aW9uIEwodCxlKXt0cnl7ZShmdW5jdGlvbihlKXt4KHQsZSl9LGZ1bmN0aW9uKGUpe00odCxlKX0pfWNhdGNoKGUpe00odCxlKX19ZnVuY3Rpb24gQygpe3JldHVybiBvdCsrfWZ1bmN0aW9uIHoodCl7dFt0dF09b3QrKyx0Ll9zdGF0ZT12b2lkIDAsdC5fcmVzdWx0PXZvaWQgMCx0Ll9zdWJzY3JpYmVycz1bXX1mdW5jdGlvbiBJKHQsZSl7dGhpcy5faW5zdGFuY2VDb25zdHJ1Y3Rvcj10LHRoaXMucHJvbWlzZT1uZXcgdChmKSx0aGlzLnByb21pc2VbdHRdfHx6KHRoaXMucHJvbWlzZSksVihlKT8odGhpcy5faW5wdXQ9ZSx0aGlzLmxlbmd0aD1lLmxlbmd0aCx0aGlzLl9yZW1haW5pbmc9ZS5sZW5ndGgsdGhpcy5fcmVzdWx0PW5ldyBBcnJheSh0aGlzLmxlbmd0aCksMD09PXRoaXMubGVuZ3RoP3codGhpcy5wcm9taXNlLHRoaXMuX3Jlc3VsdCk6KHRoaXMubGVuZ3RoPXRoaXMubGVuZ3RofHwwLHRoaXMuX2VudW1lcmF0ZSgpLDA9PT10aGlzLl9yZW1haW5pbmcmJncodGhpcy5wcm9taXNlLHRoaXMuX3Jlc3VsdCkpKTpNKHRoaXMucHJvbWlzZSxEKCkpfWZ1bmN0aW9uIEQoKXtyZXR1cm4gbmV3IEVycm9yKCJBcnJheSBNZXRob2RzIG11c3QgYmUgcHJvdmlkZWQgYW4gQXJyYXkiKX1mdW5jdGlvbiBQKHQpe3JldHVybiBuZXcgSSh0aGlzLHQpLnByb21pc2V9ZnVuY3Rpb24gTyh0KXt2YXIgZT10aGlzO3JldHVybiBuZXcgZShWKHQpP2Z1bmN0aW9uKHIsbil7Zm9yKHZhciBpPXQubGVuZ3RoLGE9MDthPGk7YSsrKWUucmVzb2x2ZSh0W2FdKS50aGVuKHIsbil9OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUobmV3IFR5cGVFcnJvcigiWW91IG11c3QgcGFzcyBhbiBhcnJheSB0byByYWNlLiIpKX0pfWZ1bmN0aW9uIFIodCl7dmFyIGU9dGhpcyxyPW5ldyBlKGYpO3JldHVybiBNKHIsdCkscn1mdW5jdGlvbiBGKCl7dGhyb3cgbmV3IFR5cGVFcnJvcigiWW91IG11c3QgcGFzcyBhIHJlc29sdmVyIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGUgcHJvbWlzZSBjb25zdHJ1Y3RvciIpfWZ1bmN0aW9uIGooKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJGYWlsZWQgdG8gY29uc3RydWN0ICdQcm9taXNlJzogUGxlYXNlIHVzZSB0aGUgJ25ldycgb3BlcmF0b3IsIHRoaXMgb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxsZWQgYXMgYSBmdW5jdGlvbi4iKX1mdW5jdGlvbiBOKHQpe3RoaXNbdHRdPUMoKSx0aGlzLl9yZXN1bHQ9dGhpcy5fc3RhdGU9dm9pZCAwLHRoaXMuX3N1YnNjcmliZXJzPVtdLGYhPT10JiYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJkYoKSx0aGlzIGluc3RhbmNlb2YgTj9MKHRoaXMsdCk6aigpKX1mdW5jdGlvbiBCKCl7dmFyIHQ9dm9pZCAwO2lmKHZvaWQgMCE9PWEpdD1hO2Vsc2UgaWYoInVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmKXQ9c2VsZjtlbHNlIHRyeXt0PUZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2godCl7dGhyb3cgbmV3IEVycm9yKCJwb2x5ZmlsbCBmYWlsZWQgYmVjYXVzZSBnbG9iYWwgb2JqZWN0IGlzIHVuYXZhaWxhYmxlIGluIHRoaXMgZW52aXJvbm1lbnQiKX12YXIgZT10LlByb21pc2U7aWYoZSl7dmFyIHI9bnVsbDt0cnl7cj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZS5yZXNvbHZlKCkpfWNhdGNoKHQpe31pZigiW29iamVjdCBQcm9taXNlXSI9PT1yJiYhZS5jYXN0KXJldHVybn10LlByb21pc2U9Tn12YXIgVT12b2lkIDA7VT1BcnJheS5pc0FycmF5P0FycmF5LmlzQXJyYXk6ZnVuY3Rpb24odCl7cmV0dXJuIltvYmplY3QgQXJyYXldIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX07dmFyIFY9VSxIPTAscT12b2lkIDAsRz12b2lkIDAsWT1mdW5jdGlvbih0LGUpe1FbSF09dCxRW0grMV09ZSwyPT09KEgrPTIpJiYoRz9HKHUpOiQoKSl9LFg9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93OnZvaWQgMCxXPVh8fHt9LFo9Vy5NdXRhdGlvbk9ic2VydmVyfHxXLldlYktpdE11dGF0aW9uT2JzZXJ2ZXIsSj0idW5kZWZpbmVkIj09dHlwZW9mIHNlbGYmJnZvaWQgMCE9PWkmJiJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwoaSksSz0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4Q2xhbXBlZEFycmF5JiYidW5kZWZpbmVkIiE9dHlwZW9mIGltcG9ydFNjcmlwdHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgTWVzc2FnZUNoYW5uZWwsUT1uZXcgQXJyYXkoMWUzKSwkPXZvaWQgMDskPUo/ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gaS5uZXh0VGljayh1KX19KCk6Wj9mdW5jdGlvbigpe3ZhciB0PTAsZT1uZXcgWih1KSxyPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKTtyZXR1cm4gZS5vYnNlcnZlKHIse2NoYXJhY3RlckRhdGE6ITB9KSxmdW5jdGlvbigpe3IuZGF0YT10PSsrdCUyfX0oKTpLP2Z1bmN0aW9uKCl7dmFyIHQ9bmV3IE1lc3NhZ2VDaGFubmVsO3JldHVybiB0LnBvcnQxLm9ubWVzc2FnZT11LGZ1bmN0aW9uKCl7cmV0dXJuIHQucG9ydDIucG9zdE1lc3NhZ2UoMCl9fSgpOnZvaWQgMD09PVgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlP2Z1bmN0aW9uKCl7dHJ5e3ZhciB0PWUscj10KCJ2ZXJ0eCIpO3JldHVybiBxPXIucnVuT25Mb29wfHxyLnJ1bk9uQ29udGV4dCxzKCl9Y2F0Y2godCl7cmV0dXJuIGwoKX19KCk6bCgpO3ZhciB0dD1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMTYpLGV0PXZvaWQgMCxydD0xLG50PTIsaXQ9bmV3IFQsYXQ9bmV3IFQsb3Q9MDtyZXR1cm4gSS5wcm90b3R5cGUuX2VudW1lcmF0ZT1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLmxlbmd0aCxlPXRoaXMuX2lucHV0LHI9MDt0aGlzLl9zdGF0ZT09PWV0JiZyPHQ7cisrKXRoaXMuX2VhY2hFbnRyeShlW3JdLHIpfSxJLnByb3RvdHlwZS5fZWFjaEVudHJ5PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcy5faW5zdGFuY2VDb25zdHJ1Y3RvcixuPXIucmVzb2x2ZTtpZihuPT09aCl7dmFyIGk9bSh0KTtpZihpPT09YyYmdC5fc3RhdGUhPT1ldCl0aGlzLl9zZXR0bGVkQXQodC5fc3RhdGUsZSx0Ll9yZXN1bHQpO2Vsc2UgaWYoImZ1bmN0aW9uIiE9dHlwZW9mIGkpdGhpcy5fcmVtYWluaW5nLS0sdGhpcy5fcmVzdWx0W2VdPXQ7ZWxzZSBpZihyPT09Til7dmFyIGE9bmV3IHIoZik7YihhLHQsaSksdGhpcy5fd2lsbFNldHRsZUF0KGEsZSl9ZWxzZSB0aGlzLl93aWxsU2V0dGxlQXQobmV3IHIoZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KSxlKX1lbHNlIHRoaXMuX3dpbGxTZXR0bGVBdChuKHQpLGUpfSxJLnByb3RvdHlwZS5fc2V0dGxlZEF0PWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLnByb21pc2U7bi5fc3RhdGU9PT1ldCYmKHRoaXMuX3JlbWFpbmluZy0tLHQ9PT1udD9NKG4scik6dGhpcy5fcmVzdWx0W2VdPXIpLDA9PT10aGlzLl9yZW1haW5pbmcmJncobix0aGlzLl9yZXN1bHQpfSxJLnByb3RvdHlwZS5fd2lsbFNldHRsZUF0PWZ1bmN0aW9uKHQsZSl7dmFyIHI9dGhpcztrKHQsdm9pZCAwLGZ1bmN0aW9uKHQpe3JldHVybiByLl9zZXR0bGVkQXQocnQsZSx0KX0sZnVuY3Rpb24odCl7cmV0dXJuIHIuX3NldHRsZWRBdChudCxlLHQpfSl9LE4uYWxsPVAsTi5yYWNlPU8sTi5yZXNvbHZlPWgsTi5yZWplY3Q9UixOLl9zZXRTY2hlZHVsZXI9bixOLl9zZXRBc2FwPW8sTi5fYXNhcD1ZLE4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpOLHRoZW46YyxjYXRjaDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50aGVuKG51bGwsdCl9fSxCKCksTi5wb2x5ZmlsbD1CLE4uUHJvbWlzZT1OLE59KX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpLCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7X3Byb2Nlc3M6NDg1fV0sMTI3OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbigpe3RoaXMuX2V2ZW50cz10aGlzLl9ldmVudHN8fHt9LHRoaXMuX21heExpc3RlbmVycz10aGlzLl9tYXhMaXN0ZW5lcnN8fHZvaWQgMH1mdW5jdGlvbiBpKHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0fWZ1bmN0aW9uIGEodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0fWZ1bmN0aW9uIG8odCl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dH1mdW5jdGlvbiBzKHQpe3JldHVybiB2b2lkIDA9PT10fWUuZXhwb3J0cz1uLG4uRXZlbnRFbWl0dGVyPW4sbi5wcm90b3R5cGUuX2V2ZW50cz12b2lkIDAsbi5wcm90b3R5cGUuX21heExpc3RlbmVycz12b2lkIDAsbi5kZWZhdWx0TWF4TGlzdGVuZXJzPTEwLG4ucHJvdG90eXBlLnNldE1heExpc3RlbmVycz1mdW5jdGlvbih0KXtpZighYSh0KXx8dDwwfHxpc05hTih0KSl0aHJvdyBUeXBlRXJyb3IoIm4gbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlciIpO3JldHVybiB0aGlzLl9tYXhMaXN0ZW5lcnM9dCx0aGlzfSxuLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQpe3ZhciBlLHIsbixhLGwsdTtpZih0aGlzLl9ldmVudHN8fCh0aGlzLl9ldmVudHM9e30pLCJlcnJvciI9PT10JiYoIXRoaXMuX2V2ZW50cy5lcnJvcnx8byh0aGlzLl9ldmVudHMuZXJyb3IpJiYhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpe2lmKChlPWFyZ3VtZW50c1sxXSlpbnN0YW5jZW9mIEVycm9yKXRocm93IGU7dmFyIGM9bmV3IEVycm9yKCdVbmNhdWdodCwgdW5zcGVjaWZpZWQgImVycm9yIiBldmVudC4gKCcrZSsiKSIpO3Rocm93IGMuY29udGV4dD1lLGN9aWYocj10aGlzLl9ldmVudHNbdF0scyhyKSlyZXR1cm4hMTtpZihpKHIpKXN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6ci5jYWxsKHRoaXMpO2JyZWFrO2Nhc2UgMjpyLmNhbGwodGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzpyLmNhbGwodGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKTticmVhaztkZWZhdWx0OmE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLHIuYXBwbHkodGhpcyxhKX1lbHNlIGlmKG8ocikpZm9yKGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLHU9ci5zbGljZSgpLG49dS5sZW5ndGgsbD0wO2w8bjtsKyspdVtsXS5hcHBseSh0aGlzLGEpO3JldHVybiEwfSxuLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3ZhciByO2lmKCFpKGUpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuIHRoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSksdGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyJiZ0aGlzLmVtaXQoIm5ld0xpc3RlbmVyIix0LGkoZS5saXN0ZW5lcik/ZS5saXN0ZW5lcjplKSx0aGlzLl9ldmVudHNbdF0/byh0aGlzLl9ldmVudHNbdF0pP3RoaXMuX2V2ZW50c1t0XS5wdXNoKGUpOnRoaXMuX2V2ZW50c1t0XT1bdGhpcy5fZXZlbnRzW3RdLGVdOnRoaXMuX2V2ZW50c1t0XT1lLG8odGhpcy5fZXZlbnRzW3RdKSYmIXRoaXMuX2V2ZW50c1t0XS53YXJuZWQmJihyPXModGhpcy5fbWF4TGlzdGVuZXJzKT9uLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dGhpcy5fbWF4TGlzdGVuZXJzKSYmcj4wJiZ0aGlzLl9ldmVudHNbdF0ubGVuZ3RoPnImJih0aGlzLl9ldmVudHNbdF0ud2FybmVkPSEwLGNvbnNvbGUuZXJyb3IoIihub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuIix0aGlzLl9ldmVudHNbdF0ubGVuZ3RoKSwiZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZS50cmFjZSYmY29uc29sZS50cmFjZSgpKSx0aGlzfSxuLnByb3RvdHlwZS5vbj1uLnByb3RvdHlwZS5hZGRMaXN0ZW5lcixuLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gcigpe3RoaXMucmVtb3ZlTGlzdGVuZXIodCxyKSxufHwobj0hMCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9aWYoIWkoZSkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTt2YXIgbj0hMTtyZXR1cm4gci5saXN0ZW5lcj1lLHRoaXMub24odCxyKSx0aGlzfSxuLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe3ZhciByLG4sYSxzO2lmKCFpKGUpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7aWYoIXRoaXMuX2V2ZW50c3x8IXRoaXMuX2V2ZW50c1t0XSlyZXR1cm4gdGhpcztpZihyPXRoaXMuX2V2ZW50c1t0XSxhPXIubGVuZ3RoLG49LTEscj09PWV8fGkoci5saXN0ZW5lcikmJnIubGlzdGVuZXI9PT1lKWRlbGV0ZSB0aGlzLl9ldmVudHNbdF0sdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIix0LGUpO2Vsc2UgaWYobyhyKSl7Zm9yKHM9YTtzLS0gPjA7KWlmKHJbc109PT1lfHxyW3NdLmxpc3RlbmVyJiZyW3NdLmxpc3RlbmVyPT09ZSl7bj1zO2JyZWFrfWlmKG48MClyZXR1cm4gdGhpczsxPT09ci5sZW5ndGg/KHIubGVuZ3RoPTAsZGVsZXRlIHRoaXMuX2V2ZW50c1t0XSk6ci5zcGxpY2UobiwxKSx0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLHQsZSl9cmV0dXJuIHRoaXN9LApuLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7dmFyIGUscjtpZighdGhpcy5fZXZlbnRzKXJldHVybiB0aGlzO2lmKCF0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpcmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuX2V2ZW50cz17fTp0aGlzLl9ldmVudHNbdF0mJmRlbGV0ZSB0aGlzLl9ldmVudHNbdF0sdGhpcztpZigwPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKGUgaW4gdGhpcy5fZXZlbnRzKSJyZW1vdmVMaXN0ZW5lciIhPT1lJiZ0aGlzLnJlbW92ZUFsbExpc3RlbmVycyhlKTtyZXR1cm4gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoInJlbW92ZUxpc3RlbmVyIiksdGhpcy5fZXZlbnRzPXt9LHRoaXN9aWYocj10aGlzLl9ldmVudHNbdF0saShyKSl0aGlzLnJlbW92ZUxpc3RlbmVyKHQscik7ZWxzZSBpZihyKWZvcig7ci5sZW5ndGg7KXRoaXMucmVtb3ZlTGlzdGVuZXIodCxyW3IubGVuZ3RoLTFdKTtyZXR1cm4gZGVsZXRlIHRoaXMuX2V2ZW50c1t0XSx0aGlzfSxuLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzW3RdP2kodGhpcy5fZXZlbnRzW3RdKT9bdGhpcy5fZXZlbnRzW3RdXTp0aGlzLl9ldmVudHNbdF0uc2xpY2UoKTpbXX0sbi5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1mdW5jdGlvbih0KXtpZih0aGlzLl9ldmVudHMpe3ZhciBlPXRoaXMuX2V2ZW50c1t0XTtpZihpKGUpKXJldHVybiAxO2lmKGUpcmV0dXJuIGUubGVuZ3RofXJldHVybiAwfSxuLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5saXN0ZW5lckNvdW50KGUpfX0se31dLDEyODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj1lfHwwLGk9cnx8MTtyZXR1cm5bW3RbMTJdK3RbMF0sdFsxM10rdFsxXSx0WzE0XSt0WzJdLHRbMTVdK3RbM11dLFt0WzEyXS10WzBdLHRbMTNdLXRbMV0sdFsxNF0tdFsyXSx0WzE1XS10WzNdXSxbdFsxMl0rdFs0XSx0WzEzXSt0WzVdLHRbMTRdK3RbNl0sdFsxNV0rdFs3XV0sW3RbMTJdLXRbNF0sdFsxM10tdFs1XSx0WzE0XS10WzZdLHRbMTVdLXRbN11dLFtuKnRbMTJdK3RbOF0sbip0WzEzXSt0WzldLG4qdFsxNF0rdFsxMF0sbip0WzE1XSt0WzExXV0sW2kqdFsxMl0tdFs4XSxpKnRbMTNdLXRbOV0saSp0WzE0XS10WzEwXSxpKnRbMTVdLXRbMTFdXV19ZS5leHBvcnRzPW59LHt9XSwxMjk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtmb3IodmFyIGUscj10Lmxlbmd0aCxuPTA7bjxyO24rKylpZigoKGU9dC5jaGFyQ29kZUF0KG4pKTw5fHxlPjEzKSYmMzIhPT1lJiYxMzMhPT1lJiYxNjAhPT1lJiY1NzYwIT09ZSYmNjE1OCE9PWUmJihlPDgxOTJ8fGU+ODIwNSkmJjgyMzIhPT1lJiY4MjMzIT09ZSYmODIzOSE9PWUmJjgyODchPT1lJiY4Mjg4IT09ZSYmMTIyODghPT1lJiY2NTI3OSE9PWUpcmV0dXJuITE7cmV0dXJuITB9ZS5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXR5cGVvZiB0O2lmKCJzdHJpbmciPT09ZSl7dmFyIHI9dDtpZigwPT09KHQ9K3QpJiZuKHIpKXJldHVybiExfWVsc2UgaWYoIm51bWJlciIhPT1lKXJldHVybiExO3JldHVybiB0LXQ8MX19LHt9XSwxMzA6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXtyZXR1cm4gbmV3IEZ1bmN0aW9uKCJmIiwidmFyIHAgPSAoZiAmJiBmLnByb3BlcnRpZXMgfHwge30pOyByZXR1cm4gIitpKHQpKX1mdW5jdGlvbiBpKHQpe2lmKCF0KXJldHVybiJ0cnVlIjt2YXIgZT10WzBdO3JldHVybiB0Lmxlbmd0aDw9MT8iYW55Ij09PWU/ImZhbHNlIjoidHJ1ZSI6IigiKygiPT0iPT09ZT9vKHRbMV0sdFsyXSwiPT09IiwhMSk6IiE9Ij09PWU/byh0WzFdLHRbMl0sIiE9PSIsITEpOiI8Ij09PWV8fCI+Ij09PWV8fCI8PSI9PT1lfHwiPj0iPT09ZT9vKHRbMV0sdFsyXSxlLCEwKToiYW55Ij09PWU/cyh0LnNsaWNlKDEpLCJ8fCIpOiJhbGwiPT09ZT9zKHQuc2xpY2UoMSksIiYmIik6Im5vbmUiPT09ZT9jKHModC5zbGljZSgxKSwifHwiKSk6ImluIj09PWU/bCh0WzFdLHQuc2xpY2UoMikpOiIhaW4iPT09ZT9jKGwodFsxXSx0LnNsaWNlKDIpKSk6ImhhcyI9PT1lP3UodFsxXSk6IiFoYXMiPT09ZT9jKHUoW3RbMV1dKSk6InRydWUiKSsiKSJ9ZnVuY3Rpb24gYSh0KXtyZXR1cm4iJHR5cGUiPT09dD8iZi50eXBlIjoiJGlkIj09PXQ/ImYuaWQiOiJwWyIrSlNPTi5zdHJpbmdpZnkodCkrIl0ifWZ1bmN0aW9uIG8odCxlLHIsbil7dmFyIGk9YSh0KSxvPSIkdHlwZSI9PT10P2YuaW5kZXhPZihlKTpKU09OLnN0cmluZ2lmeShlKTtyZXR1cm4obj8idHlwZW9mICIraSsiPT09IHR5cGVvZiAiK28rIiYmIjoiIikraStyK299ZnVuY3Rpb24gcyh0LGUpe3JldHVybiB0Lm1hcChpKS5qb2luKGUpfWZ1bmN0aW9uIGwodCxlKXsiJHR5cGUiPT09dCYmKGU9ZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGYuaW5kZXhPZih0KX0pKTt2YXIgcj1KU09OLnN0cmluZ2lmeShlLnNvcnQoaCkpLG49YSh0KTtyZXR1cm4gZS5sZW5ndGg8PTIwMD9yKyIuaW5kZXhPZigiK24rIikgIT09IC0xIjoiZnVuY3Rpb24odiwgYSwgaSwgaikge3doaWxlIChpIDw9IGopIHsgdmFyIG0gPSAoaSArIGopID4+IDE7ICAgIGlmIChhW21dID09PSB2KSByZXR1cm4gdHJ1ZTsgaWYgKGFbbV0gPiB2KSBqID0gbSAtIDE7IGVsc2UgaSA9IG0gKyAxO31yZXR1cm4gZmFsc2U7IH0oIituKyIsICIrcisiLDAsIisoZS5sZW5ndGgtMSkrIikifWZ1bmN0aW9uIHUodCl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpKyIgaW4gcCJ9ZnVuY3Rpb24gYyh0KXtyZXR1cm4iISgiK3QrIikifWZ1bmN0aW9uIGgodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOjB9ZS5leHBvcnRzPW47dmFyIGY9WyJVbmtub3duIiwiUG9pbnQiLCJMaW5lU3RyaW5nIiwiUG9seWdvbiJdfSx7fV0sMTMxOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIpe3JldHVybiBNYXRoLm1pbihlLE1hdGgubWF4KHQscikpfWZ1bmN0aW9uIGkodCxlLHIpe3RoaXMuZGltZW5zaW9uPXQubGVuZ3RoLHRoaXMuYm91bmRzPVtuZXcgQXJyYXkodGhpcy5kaW1lbnNpb24pLG5ldyBBcnJheSh0aGlzLmRpbWVuc2lvbildO2Zvcih2YXIgbj0wO248dGhpcy5kaW1lbnNpb247KytuKXRoaXMuYm91bmRzWzBdW25dPS0xLzAsdGhpcy5ib3VuZHNbMV1bbl09MS8wO3RoaXMuX3N0YXRlPXQuc2xpY2UoKS5yZXZlcnNlKCksdGhpcy5fdmVsb2NpdHk9ZS5zbGljZSgpLnJldmVyc2UoKSx0aGlzLl90aW1lPVtyXSx0aGlzLl9zY3JhdGNoPVt0LnNsaWNlKCksdC5zbGljZSgpLHQuc2xpY2UoKSx0LnNsaWNlKCksdC5zbGljZSgpXX1mdW5jdGlvbiBhKHQpe2Zvcih2YXIgZT1uZXcgQXJyYXkodCkscj0wO3I8dDsrK3IpZVtyXT0wO3JldHVybiBlfWZ1bmN0aW9uIG8odCxlLHIpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyBpKFswXSxbMF0sMCk7Y2FzZSAxOmlmKCJudW1iZXIiPT10eXBlb2YgdCl7dmFyIG49YSh0KTtyZXR1cm4gbmV3IGkobixuLDApfXJldHVybiBuZXcgaSh0LGEodC5sZW5ndGgpLDApO2Nhc2UgMjppZigibnVtYmVyIj09dHlwZW9mIGUpe3ZhciBuPWEodC5sZW5ndGgpO3JldHVybiBuZXcgaSh0LG4sK2UpfXI9MDtjYXNlIDM6aWYodC5sZW5ndGghPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoInN0YXRlIGFuZCB2ZWxvY2l0eSBsZW5ndGhzIG11c3QgbWF0Y2giKTtyZXR1cm4gbmV3IGkodCxlLHIpfX1lLmV4cG9ydHM9bzt2YXIgcz10KCJjdWJpYy1oZXJtaXRlIiksbD10KCJiaW5hcnktc2VhcmNoLWJvdW5kcyIpLHU9aS5wcm90b3R5cGU7dS5mbHVzaD1mdW5jdGlvbih0KXt2YXIgZT1sLmd0KHRoaXMuX3RpbWUsdCktMTtlPD0wfHwodGhpcy5fdGltZS5zcGxpY2UoMCxlKSx0aGlzLl9zdGF0ZS5zcGxpY2UoMCxlKnRoaXMuZGltZW5zaW9uKSx0aGlzLl92ZWxvY2l0eS5zcGxpY2UoMCxlKnRoaXMuZGltZW5zaW9uKSl9LHUuY3VydmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdGltZSxyPWUubGVuZ3RoLGk9bC5sZShlLHQpLGE9dGhpcy5fc2NyYXRjaFswXSxvPXRoaXMuX3N0YXRlLHU9dGhpcy5fdmVsb2NpdHksYz10aGlzLmRpbWVuc2lvbixoPXRoaXMuYm91bmRzO2lmKGk8MClmb3IodmFyIGY9Yy0xLGQ9MDtkPGM7KytkLC0tZilhW2RdPW9bZl07ZWxzZSBpZihpPj1yLTEpZm9yKHZhciBmPW8ubGVuZ3RoLTEscD10LWVbci0xXSxkPTA7ZDxjOysrZCwtLWYpYVtkXT1vW2ZdK3AqdVtmXTtlbHNle2Zvcih2YXIgZj1jKihpKzEpLTEsbT1lW2ldLHY9ZVtpKzFdLGc9di1tfHwxLHk9dGhpcy5fc2NyYXRjaFsxXSxiPXRoaXMuX3NjcmF0Y2hbMl0seD10aGlzLl9zY3JhdGNoWzNdLF89dGhpcy5fc2NyYXRjaFs0XSx3PSEwLGQ9MDtkPGM7KytkLC0tZil5W2RdPW9bZl0seFtkXT11W2ZdKmcsYltkXT1vW2YrY10sX1tkXT11W2YrY10qZyx3PXcmJnlbZF09PT1iW2RdJiZ4W2RdPT09X1tkXSYmMD09PXhbZF07aWYodylmb3IodmFyIGQ9MDtkPGM7KytkKWFbZF09eVtkXTtlbHNlIHMoeSx4LGIsXywodC1tKS9nLGEpfWZvcih2YXIgTT1oWzBdLGs9aFsxXSxkPTA7ZDxjOysrZClhW2RdPW4oTVtkXSxrW2RdLGFbZF0pO3JldHVybiBhfSx1LmRjdXJ2ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl90aW1lLHI9ZS5sZW5ndGgsbj1sLmxlKGUsdCksaT10aGlzLl9zY3JhdGNoWzBdLGE9dGhpcy5fc3RhdGUsbz10aGlzLl92ZWxvY2l0eSx1PXRoaXMuZGltZW5zaW9uO2lmKG4+PXItMSlmb3IodmFyIGM9YS5sZW5ndGgtMSxoPShlW3ItMV0sMCk7aDx1OysraCwtLWMpaVtoXT1vW2NdO2Vsc2V7Zm9yKHZhciBjPXUqKG4rMSktMSxmPWVbbl0sZD1lW24rMV0scD1kLWZ8fDEsbT10aGlzLl9zY3JhdGNoWzFdLHY9dGhpcy5fc2NyYXRjaFsyXSxnPXRoaXMuX3NjcmF0Y2hbM10seT10aGlzLl9zY3JhdGNoWzRdLGI9ITAsaD0wO2g8dTsrK2gsLS1jKW1baF09YVtjXSxnW2hdPW9bY10qcCx2W2hdPWFbYyt1XSx5W2hdPW9bYyt1XSpwLGI9YiYmbVtoXT09PXZbaF0mJmdbaF09PT15W2hdJiYwPT09Z1toXTtpZihiKWZvcih2YXIgaD0wO2g8dTsrK2gpaVtoXT0wO2Vsc2V7cy5kZXJpdmF0aXZlKG0sZyx2LHksKHQtZikvcCxpKTtmb3IodmFyIGg9MDtoPHU7KytoKWlbaF0vPXB9fXJldHVybiBpfSx1Lmxhc3RUPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fdGltZTtyZXR1cm4gdFt0Lmxlbmd0aC0xXX0sdS5zdGFibGU9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fdmVsb2NpdHksZT10Lmxlbmd0aCxyPXRoaXMuZGltZW5zaW9uLTE7cj49MDstLXIpaWYodFstLWVdKXJldHVybiExO3JldHVybiEwfSx1Lmp1bXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sYXN0VCgpLHI9dGhpcy5kaW1lbnNpb247aWYoISh0PGV8fGFyZ3VtZW50cy5sZW5ndGghPT1yKzEpKXt2YXIgaT10aGlzLl9zdGF0ZSxhPXRoaXMuX3ZlbG9jaXR5LG89aS5sZW5ndGgtdGhpcy5kaW1lbnNpb24scz10aGlzLmJvdW5kcyxsPXNbMF0sdT1zWzFdO3RoaXMuX3RpbWUucHVzaChlLHQpO2Zvcih2YXIgYz0wO2M8MjsrK2MpZm9yKHZhciBoPTA7aDxyOysraClpLnB1c2goaVtvKytdKSxhLnB1c2goMCk7dGhpcy5fdGltZS5wdXNoKHQpO2Zvcih2YXIgaD1yO2g+MDstLWgpaS5wdXNoKG4obFtoLTFdLHVbaC0xXSxhcmd1bWVudHNbaF0pKSxhLnB1c2goMCl9fSx1LnB1c2g9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sYXN0VCgpLHI9dGhpcy5kaW1lbnNpb247aWYoISh0PGV8fGFyZ3VtZW50cy5sZW5ndGghPT1yKzEpKXt2YXIgaT10aGlzLl9zdGF0ZSxhPXRoaXMuX3ZlbG9jaXR5LG89aS5sZW5ndGgtdGhpcy5kaW1lbnNpb24scz10LWUsbD10aGlzLmJvdW5kcyx1PWxbMF0sYz1sWzFdLGg9cz4xZS02PzEvczowO3RoaXMuX3RpbWUucHVzaCh0KTtmb3IodmFyIGY9cjtmPjA7LS1mKXt2YXIgZD1uKHVbZi0xXSxjW2YtMV0sYXJndW1lbnRzW2ZdKTtpLnB1c2goZCksYS5wdXNoKChkLWlbbysrXSkqaCl9fX0sdS5zZXQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5kaW1lbnNpb247aWYoISh0PHRoaXMubGFzdFQoKXx8YXJndW1lbnRzLmxlbmd0aCE9PWUrMSkpe3ZhciByPXRoaXMuX3N0YXRlLGk9dGhpcy5fdmVsb2NpdHksYT10aGlzLmJvdW5kcyxvPWFbMF0scz1hWzFdO3RoaXMuX3RpbWUucHVzaCh0KTtmb3IodmFyIGw9ZTtsPjA7LS1sKXIucHVzaChuKG9bbC0xXSxzW2wtMV0sYXJndW1lbnRzW2xdKSksaS5wdXNoKDApfX0sdS5tb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubGFzdFQoKSxyPXRoaXMuZGltZW5zaW9uO2lmKCEodDw9ZXx8YXJndW1lbnRzLmxlbmd0aCE9PXIrMSkpe3ZhciBpPXRoaXMuX3N0YXRlLGE9dGhpcy5fdmVsb2NpdHksbz1pLmxlbmd0aC10aGlzLmRpbWVuc2lvbixzPXRoaXMuYm91bmRzLGw9c1swXSx1PXNbMV0sYz10LWUsaD1jPjFlLTY/MS9jOjA7dGhpcy5fdGltZS5wdXNoKHQpO2Zvcih2YXIgZj1yO2Y+MDstLWYpe3ZhciBkPWFyZ3VtZW50c1tmXTtpLnB1c2gobihsW2YtMV0sdVtmLTFdLGlbbysrXStkKSksYS5wdXNoKGQqaCl9fX0sdS5pZGxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubGFzdFQoKTtpZighKHQ8ZSkpe3ZhciByPXRoaXMuZGltZW5zaW9uLGk9dGhpcy5fc3RhdGUsYT10aGlzLl92ZWxvY2l0eSxvPWkubGVuZ3RoLXIscz10aGlzLmJvdW5kcyxsPXNbMF0sdT1zWzFdLGM9dC1lO3RoaXMuX3RpbWUucHVzaCh0KTtmb3IodmFyIGg9ci0xO2g+PTA7LS1oKWkucHVzaChuKGxbaF0sdVtoXSxpW29dK2MqYVtvXSkpLGEucHVzaCgwKSxvKz0xfX19LHsiYmluYXJ5LXNlYXJjaC1ib3VuZHMiOjY0LCJjdWJpYy1oZXJtaXRlIjoxMDd9XSwxMzI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0KXt0PXR8fHt9O3ZhciBlLHIsbj10LmNhbnZhc3x8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksbz10LmZhbWlseXx8InNhbnMtc2VyaWYiLHM9dC5zaGFwZXx8WzUxMiw1MTJdLGw9dC5zdGVwfHxbMzIsMzJdLHU9cGFyc2VGbG9hdCh0LnNpemUpfHwxNixjPXQuY2hhcnN8fFszMiwxMjZdLGg9TWF0aC5mbG9vcigobFswXS11KS8yKSxmPXQucmFkaXVzfHwxLjUqaCxkPW5ldyBhKHUsaCxmLDAsbykscD1udWxsPT10LmFsaWduPyJvcHRpY2FsIjp0LmFsaWduLG09bnVsbD09dC5maXR8fDE9PXQuZml0Py41OnQuZml0O2lmKEFycmF5LmlzQXJyYXkoYykpe2lmKDI9PT1jLmxlbmd0aCYmIm51bWJlciI9PXR5cGVvZiBjWzBdJiYibnVtYmVyIj09dHlwZW9mIGNbMV0pe3ZhciB2PVtdO2ZvcihlPWNbMF0scj0wO2U8PWNbMV07ZSsrKXZbcisrXT1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpO2M9dn19ZWxzZSBjPVN0cmluZyhjKS5zcGxpdCgiIik7cz1zLnNsaWNlKCksbi53aWR0aD1zWzBdLG4uaGVpZ2h0PXNbMV07dmFyIGc9bi5nZXRDb250ZXh0KCIyZCIpO2cuZmlsbFN0eWxlPSIjMDAwIixnLmZpbGxSZWN0KDAsMCxuLndpZHRoLG4uaGVpZ2h0KSxnLnRleHRCYXNlbGluZT0ibWlkZGxlIjt2YXIgeT1sWzBdLGI9bFsxXSx4PTAsXz0wLHc9dS9iLE09TWF0aC5taW4oYy5sZW5ndGgsTWF0aC5mbG9vcihzWzBdL3kpKk1hdGguY2VpbChzWzFdL2IpKSxrPWQuY3R4LnRleHRBbGlnbixBPWQuYnVmZmVyLFQ9ZC5taWRkbGU7Zm9yKGQuY3R4LnRleHRBbGlnbj0iY2VudGVyIixkLmJ1ZmZlcj1kLnNpemUvMixlPTA7ZTxNO2UrKylpZihjW2VdKXt2YXIgUz1pKGNbZV0sbyx3KSxFPTEsTD1bMCwwXTtpZihtKXt2YXIgQz1tO0FycmF5LmlzQXJyYXkobSkmJihDPW1bZV0pO3ZhciB6PS41KihTLmJvdW5kc1szXS1TLmJvdW5kc1sxXSksST0uNSooUy5ib3VuZHNbMl0tUy5ib3VuZHNbMF0pLEQ9TWF0aC5tYXgoeixJKSxQPU1hdGguc3FydCh6KnorSSpJKSxPPS4zMzMqUy5yYWRpdXMrLjMzMypEKy4zMzMqUDtFPWIqQy8oTypiKjIpLGQuY3R4LmZvbnQ9dSpFKyJweCAiK299ZWxzZSBkLmN0eC5mb250PXUrInB4ICIrbztwJiYoTD0ib3B0aWNhbCI9PT1wfHwhMD09PXA/Wy41KnkteSpTLmNlbnRlclswXSwuNSpiLWIqUy5jZW50ZXJbMV1dOlsuNSp5LXkqKFMuYm91bmRzWzJdK1MuYm91bmRzWzBdKSouNSwuNSpiLWIqKFMuYm91bmRzWzNdK1MuYm91bmRzWzFdKSouNV0sZC5taWRkbGU9VCtMWzFdKkUpO3ZhciBSPWQuZHJhdyhjW2VdKTtnLnB1dEltYWdlRGF0YShSLHgrTFswXSpFLF8pLHgrPWxbMF0seD5zWzBdLWxbMF0mJih4PTAsXys9bFsxXSl9cmV0dXJuIGQuY3R4LnRleHRBbGlnbj1rLGQuYnVmZmVyPUEsZC5taWRkbGU9VCxufWZ1bmN0aW9uIGkodCxlLHIpe2lmKHNbZV0mJnNbZV1bdF0pcmV0dXJuIHNbZV1bdF07dmFyIG49MjAwKnIsaT1vKHQse3NpemU6MjAwLGZvbnRTaXplOm4sZm9udEZhbWlseTplfSk7c1tlXXx8KHNbZV09e30pO3ZhciBhPXtjZW50ZXI6W2kuY2VudGVyWzBdLzIwMCxpLmNlbnRlclsxXS8yMDBdLGJvdW5kczppLmJvdW5kcy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQvMjAwfSkscmFkaXVzOmkucmFkaXVzLzIwMH07cmV0dXJuIHNbZV1bdF09YSxhfXZhciBhPXQoInRpbnktc2RmIiksbz10KCJvcHRpY2FsLXByb3BlcnRpZXMiKTtlLmV4cG9ydHM9bjt2YXIgcz17fX0seyJvcHRpY2FsLXByb3BlcnRpZXMiOjQ2OSwidGlueS1zZGYiOjUzMX1dLDEzMzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4saSxhKXt0aGlzLl9jb2xvcj10LHRoaXMua2V5PWUsdGhpcy52YWx1ZT1yLHRoaXMubGVmdD1uLHRoaXMucmlnaHQ9aSx0aGlzLl9jb3VudD1hfWZ1bmN0aW9uIGkodCl7cmV0dXJuIG5ldyBuKHQuX2NvbG9yLHQua2V5LHQudmFsdWUsdC5sZWZ0LHQucmlnaHQsdC5fY291bnQpfWZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gbmV3IG4odCxlLmtleSxlLnZhbHVlLGUubGVmdCxlLnJpZ2h0LGUuX2NvdW50KX1mdW5jdGlvbiBvKHQpe3QuX2NvdW50PTErKHQubGVmdD90LmxlZnQuX2NvdW50OjApKyh0LnJpZ2h0P3QucmlnaHQuX2NvdW50OjApfWZ1bmN0aW9uIHModCxlKXt0aGlzLl9jb21wYXJlPXQsdGhpcy5yb290PWV9ZnVuY3Rpb24gbCh0LGUpe2lmKGUubGVmdCl7dmFyIHI9bCh0LGUubGVmdCk7aWYocilyZXR1cm4gcn12YXIgcj10KGUua2V5LGUudmFsdWUpO3JldHVybiByfHwoZS5yaWdodD9sKHQsZS5yaWdodCk6dm9pZCAwKX1mdW5jdGlvbiB1KHQsZSxyLG4pe2lmKGUodCxuLmtleSk8PTApe2lmKG4ubGVmdCl7dmFyIGk9dSh0LGUscixuLmxlZnQpO2lmKGkpcmV0dXJuIGl9dmFyIGk9cihuLmtleSxuLnZhbHVlKTtpZihpKXJldHVybiBpfWlmKG4ucmlnaHQpcmV0dXJuIHUodCxlLHIsbi5yaWdodCl9ZnVuY3Rpb24gYyh0LGUscixuLGkpe3ZhciBhLG89cih0LGkua2V5KSxzPXIoZSxpLmtleSk7aWYobzw9MCl7aWYoaS5sZWZ0JiYoYT1jKHQsZSxyLG4saS5sZWZ0KSkpcmV0dXJuIGE7aWYocz4wJiYoYT1uKGkua2V5LGkudmFsdWUpKSlyZXR1cm4gYX1pZihzPjAmJmkucmlnaHQpcmV0dXJuIGModCxlLHIsbixpLnJpZ2h0KX1mdW5jdGlvbiBoKHQsZSl7dGhpcy50cmVlPXQsdGhpcy5fc3RhY2s9ZX1mdW5jdGlvbiBmKHQsZSl7dC5rZXk9ZS5rZXksdC52YWx1ZT1lLnZhbHVlLHQubGVmdD1lLmxlZnQsdC5yaWdodD1lLnJpZ2h0LHQuX2NvbG9yPWUuX2NvbG9yLHQuX2NvdW50PWUuX2NvdW50fWZ1bmN0aW9uIGQodCl7Zm9yKHZhciBlLHIsbixzLGw9dC5sZW5ndGgtMTtsPj0wOy0tbCl7aWYoZT10W2xdLDA9PT1sKXJldHVybiB2b2lkKGUuX2NvbG9yPWcpO2lmKHI9dFtsLTFdLHIubGVmdD09PWUpe2lmKG49ci5yaWdodCxuLnJpZ2h0JiZuLnJpZ2h0Ll9jb2xvcj09PXYpe2lmKG49ci5yaWdodD1pKG4pLHM9bi5yaWdodD1pKG4ucmlnaHQpLHIucmlnaHQ9bi5sZWZ0LG4ubGVmdD1yLG4ucmlnaHQ9cyxuLl9jb2xvcj1yLl9jb2xvcixlLl9jb2xvcj1nLHIuX2NvbG9yPWcscy5fY29sb3I9ZyxvKHIpLG8obiksbD4xKXt2YXIgdT10W2wtMl07dS5sZWZ0PT09cj91LmxlZnQ9bjp1LnJpZ2h0PW59cmV0dXJuIHZvaWQodFtsLTFdPW4pfWlmKG4ubGVmdCYmbi5sZWZ0Ll9jb2xvcj09PXYpe2lmKG49ci5yaWdodD1pKG4pLHM9bi5sZWZ0PWkobi5sZWZ0KSxyLnJpZ2h0PXMubGVmdCxuLmxlZnQ9cy5yaWdodCxzLmxlZnQ9cixzLnJpZ2h0PW4scy5fY29sb3I9ci5fY29sb3Isci5fY29sb3I9ZyxuLl9jb2xvcj1nLGUuX2NvbG9yPWcsbyhyKSxvKG4pLG8ocyksbD4xKXt2YXIgdT10W2wtMl07dS5sZWZ0PT09cj91LmxlZnQ9czp1LnJpZ2h0PXN9cmV0dXJuIHZvaWQodFtsLTFdPXMpfWlmKG4uX2NvbG9yPT09Zyl7aWYoci5fY29sb3I9PT12KXJldHVybiByLl9jb2xvcj1nLHZvaWQoci5yaWdodD1hKHYsbikpO3IucmlnaHQ9YSh2LG4pO2NvbnRpbnVlfWlmKG49aShuKSxyLnJpZ2h0PW4ubGVmdCxuLmxlZnQ9cixuLl9jb2xvcj1yLl9jb2xvcixyLl9jb2xvcj12LG8ociksbyhuKSxsPjEpe3ZhciB1PXRbbC0yXTt1LmxlZnQ9PT1yP3UubGVmdD1uOnUucmlnaHQ9bn10W2wtMV09bix0W2xdPXIsbCsxPHQubGVuZ3RoP3RbbCsxXT1lOnQucHVzaChlKSxsKz0yfWVsc2V7aWYobj1yLmxlZnQsbi5sZWZ0JiZuLmxlZnQuX2NvbG9yPT09dil7aWYobj1yLmxlZnQ9aShuKSxzPW4ubGVmdD1pKG4ubGVmdCksci5sZWZ0PW4ucmlnaHQsbi5yaWdodD1yLG4ubGVmdD1zLG4uX2NvbG9yPXIuX2NvbG9yLGUuX2NvbG9yPWcsci5fY29sb3I9ZyxzLl9jb2xvcj1nLG8ociksbyhuKSxsPjEpe3ZhciB1PXRbbC0yXTt1LnJpZ2h0PT09cj91LnJpZ2h0PW46dS5sZWZ0PW59cmV0dXJuIHZvaWQodFtsLTFdPW4pfWlmKG4ucmlnaHQmJm4ucmlnaHQuX2NvbG9yPT09dil7aWYobj1yLmxlZnQ9aShuKSxzPW4ucmlnaHQ9aShuLnJpZ2h0KSxyLmxlZnQ9cy5yaWdodCxuLnJpZ2h0PXMubGVmdCxzLnJpZ2h0PXIscy5sZWZ0PW4scy5fY29sb3I9ci5fY29sb3Isci5fY29sb3I9ZyxuLl9jb2xvcj1nLGUuX2NvbG9yPWcsbyhyKSxvKG4pLG8ocyksbD4xKXt2YXIgdT10W2wtMl07dS5yaWdodD09PXI/dS5yaWdodD1zOnUubGVmdD1zfXJldHVybiB2b2lkKHRbbC0xXT1zKX1pZihuLl9jb2xvcj09PWcpe2lmKHIuX2NvbG9yPT09dilyZXR1cm4gci5fY29sb3I9Zyx2b2lkKHIubGVmdD1hKHYsbikpO3IubGVmdD1hKHYsbik7Y29udGludWV9aWYobj1pKG4pLHIubGVmdD1uLnJpZ2h0LG4ucmlnaHQ9cixuLl9jb2xvcj1yLl9jb2xvcixyLl9jb2xvcj12LG8ociksbyhuKSxsPjEpe3ZhciB1PXRbbC0yXTt1LnJpZ2h0PT09cj91LnJpZ2h0PW46dS5sZWZ0PW59dFtsLTFdPW4sdFtsXT1yLGwrMTx0Lmxlbmd0aD90W2wrMV09ZTp0LnB1c2goZSksbCs9Mn19fWZ1bmN0aW9uIHAodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOjB9ZnVuY3Rpb24gbSh0KXtyZXR1cm4gbmV3IHModHx8cCxudWxsKX1lLmV4cG9ydHM9bTt2YXIgdj0wLGc9MSx5PXMucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJrZXlzIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbihlLHIpe3QucHVzaChlKX0pLHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksInZhbHVlcyIse2dldDpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmZvckVhY2goZnVuY3Rpb24oZSxyKXt0LnB1c2gocil9KSx0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJsZW5ndGgiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290P3RoaXMucm9vdC5fY291bnQ6MH19KSx5Lmluc2VydD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgcj10aGlzLl9jb21wYXJlLGk9dGhpcy5yb290LGw9W10sdT1bXTtpOyl7dmFyIGM9cih0LGkua2V5KTtsLnB1c2goaSksdS5wdXNoKGMpLGk9Yzw9MD9pLmxlZnQ6aS5yaWdodH1sLnB1c2gobmV3IG4odix0LGUsbnVsbCxudWxsLDEpKTtmb3IodmFyIGg9bC5sZW5ndGgtMjtoPj0wOy0taCl7dmFyIGk9bFtoXTt1W2hdPD0wP2xbaF09bmV3IG4oaS5fY29sb3IsaS5rZXksaS52YWx1ZSxsW2grMV0saS5yaWdodCxpLl9jb3VudCsxKTpsW2hdPW5ldyBuKGkuX2NvbG9yLGkua2V5LGkudmFsdWUsaS5sZWZ0LGxbaCsxXSxpLl9jb3VudCsxKX1mb3IodmFyIGg9bC5sZW5ndGgtMTtoPjE7LS1oKXt2YXIgZj1sW2gtMV0saT1sW2hdO2lmKGYuX2NvbG9yPT09Z3x8aS5fY29sb3I9PT1nKWJyZWFrO3ZhciBkPWxbaC0yXTtpZihkLmxlZnQ9PT1mKWlmKGYubGVmdD09PWkpe3ZhciBwPWQucmlnaHQ7aWYoIXB8fHAuX2NvbG9yIT09dil7aWYoZC5fY29sb3I9dixkLmxlZnQ9Zi5yaWdodCxmLl9jb2xvcj1nLGYucmlnaHQ9ZCxsW2gtMl09ZixsW2gtMV09aSxvKGQpLG8oZiksaD49Myl7dmFyIG09bFtoLTNdO20ubGVmdD09PWQ/bS5sZWZ0PWY6bS5yaWdodD1mfWJyZWFrfWYuX2NvbG9yPWcsZC5yaWdodD1hKGcscCksZC5fY29sb3I9dixoLT0xfWVsc2V7dmFyIHA9ZC5yaWdodDtpZighcHx8cC5fY29sb3IhPT12KXtpZihmLnJpZ2h0PWkubGVmdCxkLl9jb2xvcj12LGQubGVmdD1pLnJpZ2h0LGkuX2NvbG9yPWcsaS5sZWZ0PWYsaS5yaWdodD1kLGxbaC0yXT1pLGxbaC0xXT1mLG8oZCksbyhmKSxvKGkpLGg+PTMpe3ZhciBtPWxbaC0zXTttLmxlZnQ9PT1kP20ubGVmdD1pOm0ucmlnaHQ9aX1icmVha31mLl9jb2xvcj1nLGQucmlnaHQ9YShnLHApLGQuX2NvbG9yPXYsaC09MX1lbHNlIGlmKGYucmlnaHQ9PT1pKXt2YXIgcD1kLmxlZnQ7aWYoIXB8fHAuX2NvbG9yIT09dil7aWYoZC5fY29sb3I9dixkLnJpZ2h0PWYubGVmdCxmLl9jb2xvcj1nLGYubGVmdD1kLGxbaC0yXT1mLGxbaC0xXT1pLG8oZCksbyhmKSxoPj0zKXt2YXIgbT1sW2gtM107bS5yaWdodD09PWQ/bS5yaWdodD1mOm0ubGVmdD1mfWJyZWFrfWYuX2NvbG9yPWcsZC5sZWZ0PWEoZyxwKSxkLl9jb2xvcj12LGgtPTF9ZWxzZXt2YXIgcD1kLmxlZnQ7aWYoIXB8fHAuX2NvbG9yIT09dil7aWYoZi5sZWZ0PWkucmlnaHQsZC5fY29sb3I9dixkLnJpZ2h0PWkubGVmdCxpLl9jb2xvcj1nLGkucmlnaHQ9ZixpLmxlZnQ9ZCxsW2gtMl09aSxsW2gtMV09ZixvKGQpLG8oZiksbyhpKSxoPj0zKXt2YXIgbT1sW2gtM107bS5yaWdodD09PWQ/bS5yaWdodD1pOm0ubGVmdD1pfWJyZWFrfWYuX2NvbG9yPWcsZC5sZWZ0PWEoZyxwKSxkLl9jb2xvcj12LGgtPTF9fXJldHVybiBsWzBdLl9jb2xvcj1nLG5ldyBzKHIsbFswXSl9LHkuZm9yRWFjaD1mdW5jdGlvbih0LGUscil7aWYodGhpcy5yb290KXN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6cmV0dXJuIGwodCx0aGlzLnJvb3QpO2Nhc2UgMjpyZXR1cm4gdShlLHRoaXMuX2NvbXBhcmUsdCx0aGlzLnJvb3QpO2Nhc2UgMzppZih0aGlzLl9jb21wYXJlKGUscik+PTApcmV0dXJuO3JldHVybiBjKGUscix0aGlzLl9jb21wYXJlLHQsdGhpcy5yb290KX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5LCJiZWdpbiIse2dldDpmdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPXRoaXMucm9vdDtlOyl0LnB1c2goZSksZT1lLmxlZnQ7cmV0dXJuIG5ldyBoKHRoaXMsdCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHksImVuZCIse2dldDpmdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPXRoaXMucm9vdDtlOyl0LnB1c2goZSksZT1lLnJpZ2h0O3JldHVybiBuZXcgaCh0aGlzLHQpfX0pLHkuYXQ9ZnVuY3Rpb24odCl7aWYodDwwKXJldHVybiBuZXcgaCh0aGlzLFtdKTtmb3IodmFyIGU9dGhpcy5yb290LHI9W107Oyl7aWYoci5wdXNoKGUpLGUubGVmdCl7aWYodDxlLmxlZnQuX2NvdW50KXtlPWUubGVmdDtjb250aW51ZX10LT1lLmxlZnQuX2NvdW50fWlmKCF0KXJldHVybiBuZXcgaCh0aGlzLHIpO2lmKHQtPTEsIWUucmlnaHQpYnJlYWs7aWYodD49ZS5yaWdodC5fY291bnQpYnJlYWs7ZT1lLnJpZ2h0fXJldHVybiBuZXcgaCh0aGlzLFtdKX0seS5nZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fY29tcGFyZSxyPXRoaXMucm9vdCxuPVtdLGk9MDtyOyl7dmFyIGE9ZSh0LHIua2V5KTtuLnB1c2gociksYTw9MCYmKGk9bi5sZW5ndGgpLHI9YTw9MD9yLmxlZnQ6ci5yaWdodH1yZXR1cm4gbi5sZW5ndGg9aSxuZXcgaCh0aGlzLG4pfSx5Lmd0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9jb21wYXJlLHI9dGhpcy5yb290LG49W10saT0wO3I7KXt2YXIgYT1lKHQsci5rZXkpO24ucHVzaChyKSxhPDAmJihpPW4ubGVuZ3RoKSxyPWE8MD9yLmxlZnQ6ci5yaWdodH1yZXR1cm4gbi5sZW5ndGg9aSxuZXcgaCh0aGlzLG4pfSx5Lmx0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl9jb21wYXJlLHI9dGhpcy5yb290LG49W10saT0wO3I7KXt2YXIgYT1lKHQsci5rZXkpO24ucHVzaChyKSxhPjAmJihpPW4ubGVuZ3RoKSxyPWE8PTA/ci5sZWZ0OnIucmlnaHR9cmV0dXJuIG4ubGVuZ3RoPWksbmV3IGgodGhpcyxuKX0seS5sZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fY29tcGFyZSxyPXRoaXMucm9vdCxuPVtdLGk9MDtyOyl7dmFyIGE9ZSh0LHIua2V5KTtuLnB1c2gociksYT49MCYmKGk9bi5sZW5ndGgpLHI9YTwwP3IubGVmdDpyLnJpZ2h0fXJldHVybiBuLmxlbmd0aD1pLG5ldyBoKHRoaXMsbil9LHkuZmluZD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fY29tcGFyZSxyPXRoaXMucm9vdCxuPVtdO3I7KXt2YXIgaT1lKHQsci5rZXkpO2lmKG4ucHVzaChyKSwwPT09aSlyZXR1cm4gbmV3IGgodGhpcyxuKTtyPWk8PTA/ci5sZWZ0OnIucmlnaHR9cmV0dXJuIG5ldyBoKHRoaXMsW10pfSx5LnJlbW92ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmZpbmQodCk7cmV0dXJuIGU/ZS5yZW1vdmUoKTp0aGlzfSx5LmdldD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fY29tcGFyZSxyPXRoaXMucm9vdDtyOyl7dmFyIG49ZSh0LHIua2V5KTtpZigwPT09bilyZXR1cm4gci52YWx1ZTtyPW48PTA/ci5sZWZ0OnIucmlnaHR9fTt2YXIgYj1oLnByb3RvdHlwZTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwidmFsaWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhY2subGVuZ3RoPjB9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGIsIm5vZGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3RhY2subGVuZ3RoPjA/dGhpcy5fc3RhY2tbdGhpcy5fc3RhY2subGVuZ3RoLTFdOm51bGx9LGVudW1lcmFibGU6ITB9KSxiLmNsb25lPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBoKHRoaXMudHJlZSx0aGlzLl9zdGFjay5zbGljZSgpKX0sYi5yZW1vdmU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdGFjaztpZigwPT09dC5sZW5ndGgpcmV0dXJuIHRoaXMudHJlZTt2YXIgZT1uZXcgQXJyYXkodC5sZW5ndGgpLHI9dFt0Lmxlbmd0aC0xXTtlW2UubGVuZ3RoLTFdPW5ldyBuKHIuX2NvbG9yLHIua2V5LHIudmFsdWUsci5sZWZ0LHIucmlnaHQsci5fY291bnQpO2Zvcih2YXIgaT10Lmxlbmd0aC0yO2k+PTA7LS1pKXt2YXIgcj10W2ldO3IubGVmdD09PXRbaSsxXT9lW2ldPW5ldyBuKHIuX2NvbG9yLHIua2V5LHIudmFsdWUsZVtpKzFdLHIucmlnaHQsci5fY291bnQpOmVbaV09bmV3IG4oci5fY29sb3Isci5rZXksci52YWx1ZSxyLmxlZnQsZVtpKzFdLHIuX2NvdW50KX1pZihyPWVbZS5sZW5ndGgtMV0sci5sZWZ0JiZyLnJpZ2h0KXt2YXIgYT1lLmxlbmd0aDtmb3Iocj1yLmxlZnQ7ci5yaWdodDspZS5wdXNoKHIpLHI9ci5yaWdodDt2YXIgbz1lW2EtMV07ZS5wdXNoKG5ldyBuKHIuX2NvbG9yLG8ua2V5LG8udmFsdWUsci5sZWZ0LHIucmlnaHQsci5fY291bnQpKSxlW2EtMV0ua2V5PXIua2V5LGVbYS0xXS52YWx1ZT1yLnZhbHVlO2Zvcih2YXIgaT1lLmxlbmd0aC0yO2k+PWE7LS1pKXI9ZVtpXSxlW2ldPW5ldyBuKHIuX2NvbG9yLHIua2V5LHIudmFsdWUsci5sZWZ0LGVbaSsxXSxyLl9jb3VudCk7ZVthLTFdLmxlZnQ9ZVthXX1pZihyPWVbZS5sZW5ndGgtMV0sci5fY29sb3I9PT12KXt2YXIgbD1lW2UubGVuZ3RoLTJdO2wubGVmdD09PXI/bC5sZWZ0PW51bGw6bC5yaWdodD09PXImJihsLnJpZ2h0PW51bGwpLGUucG9wKCk7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDsrK2kpZVtpXS5fY291bnQtLTtyZXR1cm4gbmV3IHModGhpcy50cmVlLl9jb21wYXJlLGVbMF0pfWlmKHIubGVmdHx8ci5yaWdodCl7ci5sZWZ0P2YocixyLmxlZnQpOnIucmlnaHQmJmYocixyLnJpZ2h0KSxyLl9jb2xvcj1nO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGgtMTsrK2kpZVtpXS5fY291bnQtLTtyZXR1cm4gbmV3IHModGhpcy50cmVlLl9jb21wYXJlLGVbMF0pfWlmKDE9PT1lLmxlbmd0aClyZXR1cm4gbmV3IHModGhpcy50cmVlLl9jb21wYXJlLG51bGwpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7KytpKWVbaV0uX2NvdW50LS07dmFyIHU9ZVtlLmxlbmd0aC0yXTtyZXR1cm4gZChlKSx1LmxlZnQ9PT1yP3UubGVmdD1udWxsOnUucmlnaHQ9bnVsbCxuZXcgcyh0aGlzLnRyZWUuX2NvbXBhcmUsZVswXSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJrZXkiLHtnZXQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9zdGFjay5sZW5ndGg+MClyZXR1cm4gdGhpcy5fc3RhY2tbdGhpcy5fc3RhY2subGVuZ3RoLTFdLmtleX0sZW51bWVyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJ2YWx1ZSIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMuX3N0YWNrLmxlbmd0aD4wKXJldHVybiB0aGlzLl9zdGFja1t0aGlzLl9zdGFjay5sZW5ndGgtMV0udmFsdWV9LGVudW1lcmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiaW5kZXgiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD0wLGU9dGhpcy5fc3RhY2s7aWYoMD09PWUubGVuZ3RoKXt2YXIgcj10aGlzLnRyZWUucm9vdDtyZXR1cm4gcj9yLl9jb3VudDowfWVbZS5sZW5ndGgtMV0ubGVmdCYmKHQ9ZVtlLmxlbmd0aC0xXS5sZWZ0Ll9jb3VudCk7Zm9yKHZhciBuPWUubGVuZ3RoLTI7bj49MDstLW4pZVtuKzFdPT09ZVtuXS5yaWdodCYmKCsrdCxlW25dLmxlZnQmJih0Kz1lW25dLmxlZnQuX2NvdW50KSk7cmV0dXJuIHR9LGVudW1lcmFibGU6ITB9KSxiLm5leHQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9zdGFjaztpZigwIT09dC5sZW5ndGgpe3ZhciBlPXRbdC5sZW5ndGgtMV07aWYoZS5yaWdodClmb3IoZT1lLnJpZ2h0O2U7KXQucHVzaChlKSxlPWUubGVmdDtlbHNlIGZvcih0LnBvcCgpO3QubGVuZ3RoPjAmJnRbdC5sZW5ndGgtMV0ucmlnaHQ9PT1lOyllPXRbdC5sZW5ndGgtMV0sdC5wb3AoKX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJoYXNOZXh0Iix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3RhY2s7aWYoMD09PXQubGVuZ3RoKXJldHVybiExO2lmKHRbdC5sZW5ndGgtMV0ucmlnaHQpcmV0dXJuITA7Zm9yKHZhciBlPXQubGVuZ3RoLTE7ZT4wOy0tZSlpZih0W2UtMV0ubGVmdD09PXRbZV0pcmV0dXJuITA7cmV0dXJuITF9fSksYi51cGRhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc3RhY2s7aWYoMD09PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQ2FuJ3QgdXBkYXRlIGVtcHR5IG5vZGUhIik7dmFyIHI9bmV3IEFycmF5KGUubGVuZ3RoKSxpPWVbZS5sZW5ndGgtMV07cltyLmxlbmd0aC0xXT1uZXcgbihpLl9jb2xvcixpLmtleSx0LGkubGVmdCxpLnJpZ2h0LGkuX2NvdW50KTtmb3IodmFyIGE9ZS5sZW5ndGgtMjthPj0wOy0tYSlpPWVbYV0saS5sZWZ0PT09ZVthKzFdP3JbYV09bmV3IG4oaS5fY29sb3IsaS5rZXksaS52YWx1ZSxyW2ErMV0saS5yaWdodCxpLl9jb3VudCk6clthXT1uZXcgbihpLl9jb2xvcixpLmtleSxpLnZhbHVlLGkubGVmdCxyW2ErMV0saS5fY291bnQpO3JldHVybiBuZXcgcyh0aGlzLnRyZWUuX2NvbXBhcmUsclswXSl9LGIucHJldj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3N0YWNrO2lmKDAhPT10Lmxlbmd0aCl7dmFyIGU9dFt0Lmxlbmd0aC0xXTtpZihlLmxlZnQpZm9yKGU9ZS5sZWZ0O2U7KXQucHVzaChlKSxlPWUucmlnaHQ7ZWxzZSBmb3IodC5wb3AoKTt0Lmxlbmd0aD4wJiZ0W3QubGVuZ3RoLTFdLmxlZnQ9PT1lOyllPXRbdC5sZW5ndGgtMV0sdC5wb3AoKX19LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShiLCJoYXNQcmV2Iix7Z2V0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc3RhY2s7aWYoMD09PXQubGVuZ3RoKXJldHVybiExO2lmKHRbdC5sZW5ndGgtMV0ubGVmdClyZXR1cm4hMDtmb3IodmFyIGU9dC5sZW5ndGgtMTtlPjA7LS1lKWlmKHRbZS0xXS5yaWdodD09PXRbZV0pcmV0dXJuITA7cmV0dXJuITF9fSl9LHt9XSwxMzQ6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe2lmKHQ8MClyZXR1cm4gTnVtYmVyKCIwLzAiKTtmb3IodmFyIGU9b1swXSxyPW8ubGVuZ3RoLTE7cj4wOy0tcillKz1vW3JdLyh0K3IpO3ZhciBuPXQrYSsuNTtyZXR1cm4uNSpNYXRoLmxvZygyKk1hdGguUEkpKyh0Ky41KSpNYXRoLmxvZyhuKS1uK01hdGgubG9nKGUpLU1hdGgubG9nKHQpfXZhciBpPVsuOTk5OTk5OTk5OTk5ODA5OSw2NzYuNTIwMzY4MTIxODg1MSwtMTI1OS4xMzkyMTY3MjI0MDI4LDc3MS4zMjM0Mjg3Nzc2NTMxLC0xNzYuNjE1MDI5MTYyMTQwNiwxMi41MDczNDMyNzg2ODY5MDUsLS4xMzg1NzEwOTUyNjU3MjAxMiw5OTg0MzY5NTc4MDE5NTcyZS0yMSwxLjUwNTYzMjczNTE0OTMxMTZlLTddLGE9NjA3LzEyOCxvPVsuOTk5OTk5OTk5OTk5OTk3MSw1Ny4xNTYyMzU2NjU4NjI5MiwtNTkuNTk3OTYwMzU1NDc1NDksMTQuMTM2MDk3OTc0NzQxNzQ2LC0uNDkxOTEzODE2MDk3NjIwMiwzMzk5NDY0OTk4NDgxMTg5ZS0yMCw0NjUyMzYyODkyNzA0ODU4ZS0yMCwtOTgzNzQ0NzUzMDQ4Nzk1NmUtMjAsLjAwMDE1ODA4ODcwMzIyNDkxMjUsLS4wMDAyMTAyNjQ0NDE3MjQxMDQ4OCwuMDAwMjE3NDM5NjE4MTE1MjEyNjUsLS4wMDAxNjQzMTgxMDY1MzY3NjM5LDg0NDE4MjIzOTgzODUyNzVlLTIwLC0yNjE5MDgzODQwMTU4MTQwOGUtMjEsMzY4OTkxODI2NTk1MzE2MjVlLTIyXTtlLmV4cG9ydHM9ZnVuY3Rpb24gdChlKXtpZihlPC41KXJldHVybiBNYXRoLlBJLyhNYXRoLnNpbihNYXRoLlBJKmUpKnQoMS1lKSk7aWYoZT4xMDApcmV0dXJuIE1hdGguZXhwKG4oZSkpO2UtPTE7Zm9yKHZhciByPWlbMF0sYT0xO2E8OTthKyspcis9aVthXS8oZSthKTt2YXIgbz1lKzcrLjU7cmV0dXJuIE1hdGguc3FydCgyKk1hdGguUEkpKk1hdGgucG93KG8sZSsuNSkqTWF0aC5leHAoLW8pKnJ9LGUuZXhwb3J0cy5sb2c9bn0se31dLDEzNTpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7aWYoIlBvbHlnb24iPT09dC50eXBlKXJldHVybiBpKHQuY29vcmRpbmF0ZXMpO2lmKCJNdWx0aVBvbHlnb24iPT09dC50eXBlKXtmb3IodmFyIGU9MCxyPTA7cjx0LmNvb3JkaW5hdGVzLmxlbmd0aDtyKyspZSs9aSh0LmNvb3JkaW5hdGVzW3JdKTtyZXR1cm4gZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBpKHQpe3ZhciBlPTA7aWYodCYmdC5sZW5ndGg+MCl7ZSs9TWF0aC5hYnMoYSh0WzBdKSk7Zm9yKHZhciByPTE7cjx0Lmxlbmd0aDtyKyspZS09TWF0aC5hYnMoYSh0W3JdKSl9cmV0dXJuIGV9ZnVuY3Rpb24gYSh0KXt2YXIgZT0wO2lmKHQubGVuZ3RoPjIpe2Zvcih2YXIgcixuLGk9MDtpPHQubGVuZ3RoLTE7aSsrKXI9dFtpXSxuPXRbaSsxXSxlKz1vKG5bMF0tclswXSkqKDIrTWF0aC5zaW4obyhyWzFdKSkrTWF0aC5zaW4obyhuWzFdKSkpO2U9ZSpzLlJBRElVUypzLlJBRElVUy8yfXJldHVybiBlfWZ1bmN0aW9uIG8odCl7cmV0dXJuIHQqTWF0aC5QSS8xODB9dmFyIHM9dCgid2dzODQiKTtlLmV4cG9ydHMuZ2VvbWV0cnk9bixlLmV4cG9ydHMucmluZz1hfSx7d2dzODQ6NTYzfV0sMTM2OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3N3aXRjaCh0JiZ0LnR5cGV8fG51bGwpe2Nhc2UiRmVhdHVyZUNvbGxlY3Rpb24iOnJldHVybiB0LmZlYXR1cmVzPXQuZmVhdHVyZXMubWFwKGkobixlKSksdDtjYXNlIkZlYXR1cmUiOnJldHVybiB0Lmdlb21ldHJ5PW4odC5nZW9tZXRyeSxlKSx0O2Nhc2UiUG9seWdvbiI6Y2FzZSJNdWx0aVBvbHlnb24iOnJldHVybiBhKHQsZSk7ZGVmYXVsdDpyZXR1cm4gdH19ZnVuY3Rpb24gaSh0LGUpe3JldHVybiBmdW5jdGlvbihyKXtyZXR1cm4gdChyLGUpfX1mdW5jdGlvbiBhKHQsZSl7cmV0dXJuIlBvbHlnb24iPT09dC50eXBlP3QuY29vcmRpbmF0ZXM9byh0LmNvb3JkaW5hdGVzLGUpOiJNdWx0aVBvbHlnb24iPT09dC50eXBlJiYodC5jb29yZGluYXRlcz10LmNvb3JkaW5hdGVzLm1hcChpKG8sZSkpKSx0fWZ1bmN0aW9uIG8odCxlKXtlPSEhZSx0WzBdPXModFswXSwhZSk7Zm9yKHZhciByPTE7cjx0Lmxlbmd0aDtyKyspdFtyXT1zKHRbcl0sZSk7cmV0dXJuIHR9ZnVuY3Rpb24gcyh0LGUpe3JldHVybiBsKHQpPT09ZT90OnQucmV2ZXJzZSgpfWZ1bmN0aW9uIGwodCl7cmV0dXJuIHUucmluZyh0KT49MH12YXIgdT10KCJnZW9qc29uLWFyZWEiKTtlLmV4cG9ydHM9bn0seyJnZW9qc29uLWFyZWEiOjEzNX1dLDEzNzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4sbyxsLHUsYyl7aWYoci89ZSxuLz1lLHU+PXImJmM8PW4pcmV0dXJuIHQ7aWYodT5ufHxjPHIpcmV0dXJuIG51bGw7Zm9yKHZhciBoPVtdLGY9MDtmPHQubGVuZ3RoO2YrKyl7dmFyIGQscCxtPXRbZl0sdj1tLmdlb21ldHJ5LGc9bS50eXBlO2lmKGQ9bS5taW5bb10scD1tLm1heFtvXSxkPj1yJiZwPD1uKWgucHVzaChtKTtlbHNlIGlmKCEoZD5ufHxwPHIpKXt2YXIgeT0xPT09Zz9pKHYscixuLG8pOmEodixyLG4sbyxsLDM9PT1nKTt5Lmxlbmd0aCYmaC5wdXNoKHMobS50YWdzLGcseSxtLmlkKSl9fXJldHVybiBoLmxlbmd0aD9oOm51bGx9ZnVuY3Rpb24gaSh0LGUscixuKXtmb3IodmFyIGk9W10sYT0wO2E8dC5sZW5ndGg7YSsrKXt2YXIgbz10W2FdLHM9b1tuXTtzPj1lJiZzPD1yJiZpLnB1c2gobyl9cmV0dXJuIGl9ZnVuY3Rpb24gYSh0LGUscixuLGksYSl7Zm9yKHZhciBzPVtdLGw9MDtsPHQubGVuZ3RoO2wrKyl7dmFyIHUsYyxoLGY9MCxkPTAscD1udWxsLG09dFtsXSx2PW0uYXJlYSxnPW0uZGlzdCx5PW0ub3V0ZXIsYj1tLmxlbmd0aCx4PVtdO2ZvcihjPTA7YzxiLTE7YysrKXU9cHx8bVtjXSxwPW1bYysxXSxmPWR8fHVbbl0sZD1wW25dLGY8ZT9kPnI/KHgucHVzaChpKHUscCxlKSxpKHUscCxyKSksYXx8KHg9byhzLHgsdixnLHkpKSk6ZD49ZSYmeC5wdXNoKGkodSxwLGUpKTpmPnI/ZDxlPyh4LnB1c2goaSh1LHAsciksaSh1LHAsZSkpLGF8fCh4PW8ocyx4LHYsZyx5KSkpOmQ8PXImJngucHVzaChpKHUscCxyKSk6KHgucHVzaCh1KSxkPGU/KHgucHVzaChpKHUscCxlKSksYXx8KHg9byhzLHgsdixnLHkpKSk6ZD5yJiYoeC5wdXNoKGkodSxwLHIpKSxhfHwoeD1vKHMseCx2LGcseSkpKSk7dT1tW2ItMV0sZj11W25dLGY+PWUmJmY8PXImJngucHVzaCh1KSxoPXhbeC5sZW5ndGgtMV0sYSYmaCYmKHhbMF1bMF0hPT1oWzBdfHx4WzBdWzFdIT09aFsxXSkmJngucHVzaCh4WzBdKSxvKHMseCx2LGcseSl9cmV0dXJuIHN9ZnVuY3Rpb24gbyh0LGUscixuLGkpe3JldHVybiBlLmxlbmd0aCYmKGUuYXJlYT1yLGUuZGlzdD1uLHZvaWQgMCE9PWkmJihlLm91dGVyPWkpLHQucHVzaChlKSksW119ZS5leHBvcnRzPW47dmFyIHM9dCgiLi9mZWF0dXJlIil9LHsiLi9mZWF0dXJlIjoxMzl9XSwxMzg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUpe3ZhciByPVtdO2lmKCJGZWF0dXJlQ29sbGVjdGlvbiI9PT10LnR5cGUpZm9yKHZhciBuPTA7bjx0LmZlYXR1cmVzLmxlbmd0aDtuKyspaShyLHQuZmVhdHVyZXNbbl0sZSk7ZWxzZSJGZWF0dXJlIj09PXQudHlwZT9pKHIsdCxlKTppKHIse2dlb21ldHJ5OnR9LGUpO3JldHVybiByfWZ1bmN0aW9uIGkodCxlLHIpe2lmKG51bGwhPT1lLmdlb21ldHJ5KXt2YXIgbixzLGwsYyxoPWUuZ2VvbWV0cnksZj1oLnR5cGUsZD1oLmNvb3JkaW5hdGVzLHA9ZS5wcm9wZXJ0aWVzLG09ZS5pZDtpZigiUG9pbnQiPT09Zil0LnB1c2godShwLDEsW28oZCldLG0pKTtlbHNlIGlmKCJNdWx0aVBvaW50Ij09PWYpdC5wdXNoKHUocCwxLGEoZCksbSkpO2Vsc2UgaWYoIkxpbmVTdHJpbmciPT09Zil0LnB1c2godShwLDIsW2EoZCxyKV0sbSkpO2Vsc2UgaWYoIk11bHRpTGluZVN0cmluZyI9PT1mfHwiUG9seWdvbiI9PT1mKXtmb3IobD1bXSxuPTA7bjxkLmxlbmd0aDtuKyspYz1hKGRbbl0sciksIlBvbHlnb24iPT09ZiYmKGMub3V0ZXI9MD09PW4pLGwucHVzaChjKTt0LnB1c2godShwLCJQb2x5Z29uIj09PWY/MzoyLGwsbSkpfWVsc2UgaWYoIk11bHRpUG9seWdvbiI9PT1mKXtmb3IobD1bXSxuPTA7bjxkLmxlbmd0aDtuKyspZm9yKHM9MDtzPGRbbl0ubGVuZ3RoO3MrKyljPWEoZFtuXVtzXSxyKSxjLm91dGVyPTA9PT1zLGwucHVzaChjKTt0LnB1c2godShwLDMsbCxtKSl9ZWxzZXtpZigiR2VvbWV0cnlDb2xsZWN0aW9uIiE9PWYpdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBkYXRhIGlzIG5vdCBhIHZhbGlkIEdlb0pTT04gb2JqZWN0LiIpO2ZvcihuPTA7bjxoLmdlb21ldHJpZXMubGVuZ3RoO24rKylpKHQse2dlb21ldHJ5OmguZ2VvbWV0cmllc1tuXSxwcm9wZXJ0aWVzOnB9LHIpfX19ZnVuY3Rpb24gYSh0LGUpe2Zvcih2YXIgcj1bXSxuPTA7bjx0Lmxlbmd0aDtuKyspci5wdXNoKG8odFtuXSkpO3JldHVybiBlJiYobChyLGUpLHMocikpLHJ9ZnVuY3Rpb24gbyh0KXt2YXIgZT1NYXRoLnNpbih0WzFdKk1hdGguUEkvMTgwKSxyPXRbMF0vMzYwKy41LG49LjUtLjI1Kk1hdGgubG9nKCgxK2UpLygxLWUpKS9NYXRoLlBJO3JldHVybiBuPW48MD8wOm4+MT8xOm4sW3IsbiwwXX1mdW5jdGlvbiBzKHQpe2Zvcih2YXIgZSxyLG49MCxpPTAsYT0wO2E8dC5sZW5ndGgtMTthKyspZT1yfHx0W2FdLHI9dFthKzFdLG4rPWVbMF0qclsxXS1yWzBdKmVbMV0saSs9TWF0aC5hYnMoclswXS1lWzBdKStNYXRoLmFicyhyWzFdLWVbMV0pO3QuYXJlYT1NYXRoLmFicyhuLzIpLHQuZGlzdD1pfWUuZXhwb3J0cz1uO3ZhciBsPXQoIi4vc2ltcGxpZnkiKSx1PXQoIi4vZmVhdHVyZSIpfSx7Ii4vZmVhdHVyZSI6MTM5LCIuL3NpbXBsaWZ5IjoxNDF9XSwxMzk6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuKXt2YXIgYT17aWQ6bnx8bnVsbCx0eXBlOmUsZ2VvbWV0cnk6cix0YWdzOnR8fG51bGwsbWluOlsxLzAsMS8wXSxtYXg6Wy0xLzAsLTEvMF19O3JldHVybiBpKGEpLGF9ZnVuY3Rpb24gaSh0KXt2YXIgZT10Lmdlb21ldHJ5LHI9dC5taW4sbj10Lm1heDtpZigxPT09dC50eXBlKWEocixuLGUpO2Vsc2UgZm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspYShyLG4sZVtpXSk7cmV0dXJuIHR9ZnVuY3Rpb24gYSh0LGUscil7Zm9yKHZhciBuLGk9MDtpPHIubGVuZ3RoO2krKyluPXJbaV0sdFswXT1NYXRoLm1pbihuWzBdLHRbMF0pLGVbMF09TWF0aC5tYXgoblswXSxlWzBdKSx0WzFdPU1hdGgubWluKG5bMV0sdFsxXSksZVsxXT1NYXRoLm1heChuWzFdLGVbMV0pfWUuZXhwb3J0cz1ufSx7fV0sMTQwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtyZXR1cm4gbmV3IGkodCxlKX1mdW5jdGlvbiBpKHQsZSl7ZT10aGlzLm9wdGlvbnM9bChPYmplY3QuY3JlYXRlKHRoaXMub3B0aW9ucyksZSk7dmFyIHI9ZS5kZWJ1ZztyJiZjb25zb2xlLnRpbWUoInByZXByb2Nlc3MgZGF0YSIpO3ZhciBuPTE8PGUubWF4Wm9vbSxpPWModCxlLnRvbGVyYW5jZS8obiplLmV4dGVudCkpO3RoaXMudGlsZXM9e30sdGhpcy50aWxlQ29vcmRzPVtdLHImJihjb25zb2xlLnRpbWVFbmQoInByZXByb2Nlc3MgZGF0YSIpLGNvbnNvbGUubG9nKCJpbmRleDogbWF4Wm9vbTogJWQsIG1heFBvaW50czogJWQiLGUuaW5kZXhNYXhab29tLGUuaW5kZXhNYXhQb2ludHMpLGNvbnNvbGUudGltZSgiZ2VuZXJhdGUgdGlsZXMiKSx0aGlzLnN0YXRzPXt9LHRoaXMudG90YWw9MCksaT1kKGksZS5idWZmZXIvZS5leHRlbnQsbyksaS5sZW5ndGgmJnRoaXMuc3BsaXRUaWxlKGksMCwwLDApLHImJihpLmxlbmd0aCYmY29uc29sZS5sb2coImZlYXR1cmVzOiAlZCwgcG9pbnRzOiAlZCIsdGhpcy50aWxlc1swXS5udW1GZWF0dXJlcyx0aGlzLnRpbGVzWzBdLm51bVBvaW50cyksY29uc29sZS50aW1lRW5kKCJnZW5lcmF0ZSB0aWxlcyIpLGNvbnNvbGUubG9nKCJ0aWxlcyBnZW5lcmF0ZWQ6Iix0aGlzLnRvdGFsLEpTT04uc3RyaW5naWZ5KHRoaXMuc3RhdHMpKSl9ZnVuY3Rpb24gYSh0LGUscil7cmV0dXJuIDMyKigoMTw8dCkqcitlKSt0fWZ1bmN0aW9uIG8odCxlLHIpe3JldHVybltyLChyLXRbMF0pKihlWzFdLXRbMV0pLyhlWzBdLXRbMF0pK3RbMV0sMV19ZnVuY3Rpb24gcyh0LGUscil7cmV0dXJuWyhyLXRbMV0pKihlWzBdLXRbMF0pLyhlWzFdLXRbMV0pK3RbMF0sciwxXX1mdW5jdGlvbiBsKHQsZSl7Zm9yKHZhciByIGluIGUpdFtyXT1lW3JdO3JldHVybiB0fWZ1bmN0aW9uIHUodCxlLHIpe3ZhciBuPXQuc291cmNlO2lmKDEhPT1uLmxlbmd0aClyZXR1cm4hMTt2YXIgaT1uWzBdO2lmKDMhPT1pLnR5cGV8fGkuZ2VvbWV0cnkubGVuZ3RoPjEpcmV0dXJuITE7dmFyIGE9aS5nZW9tZXRyeVswXS5sZW5ndGg7aWYoNSE9PWEpcmV0dXJuITE7Zm9yKHZhciBvPTA7bzxhO28rKyl7dmFyIHM9aC5wb2ludChpLmdlb21ldHJ5WzBdW29dLGUsdC56Mix0LngsdC55KTtpZihzWzBdIT09LXImJnNbMF0hPT1lK3J8fHNbMV0hPT0tciYmc1sxXSE9PWUrcilyZXR1cm4hMX1yZXR1cm4hMH1lLmV4cG9ydHM9bjt2YXIgYz10KCIuL2NvbnZlcnQiKSxoPXQoIi4vdHJhbnNmb3JtIiksZj10KCIuL2NsaXAiKSxkPXQoIi4vd3JhcCIpLHA9dCgiLi90aWxlIik7aS5wcm90b3R5cGUub3B0aW9ucz17bWF4Wm9vbToxNCxpbmRleE1heFpvb206NSxpbmRleE1heFBvaW50czoxZTUsc29saWRDaGlsZHJlbjohMSx0b2xlcmFuY2U6MyxleHRlbnQ6NDA5NixidWZmZXI6NjQsZGVidWc6MH0saS5wcm90b3R5cGUuc3BsaXRUaWxlPWZ1bmN0aW9uKHQsZSxyLG4saSxsLGMpe2Zvcih2YXIgaD1bdCxlLHIsbl0sZD10aGlzLm9wdGlvbnMsbT1kLmRlYnVnLHY9bnVsbDtoLmxlbmd0aDspe249aC5wb3AoKSxyPWgucG9wKCksZT1oLnBvcCgpLHQ9aC5wb3AoKTt2YXIgZz0xPDxlLHk9YShlLHIsbiksYj10aGlzLnRpbGVzW3ldLHg9ZT09PWQubWF4Wm9vbT8wOmQudG9sZXJhbmNlLyhnKmQuZXh0ZW50KTtpZighYiYmKG0+MSYmY29uc29sZS50aW1lKCJjcmVhdGlvbiIpLGI9dGhpcy50aWxlc1t5XT1wKHQsZyxyLG4seCxlPT09ZC5tYXhab29tKSx0aGlzLnRpbGVDb29yZHMucHVzaCh7ejplLHg6cix5Om59KSxtKSl7bT4xJiYoY29uc29sZS5sb2coInRpbGUgeiVkLSVkLSVkIChmZWF0dXJlczogJWQsIHBvaW50czogJWQsIHNpbXBsaWZpZWQ6ICVkKSIsZSxyLG4sYi5udW1GZWF0dXJlcyxiLm51bVBvaW50cyxiLm51bVNpbXBsaWZpZWQpLGNvbnNvbGUudGltZUVuZCgiY3JlYXRpb24iKSk7dmFyIF89InoiK2U7dGhpcy5zdGF0c1tfXT0odGhpcy5zdGF0c1tfXXx8MCkrMSx0aGlzLnRvdGFsKyt9aWYoYi5zb3VyY2U9dCxpKXtpZihlPT09ZC5tYXhab29tfHxlPT09aSljb250aW51ZTt2YXIgdz0xPDxpLWU7aWYociE9PU1hdGguZmxvb3IobC93KXx8biE9PU1hdGguZmxvb3IoYy93KSljb250aW51ZX1lbHNlIGlmKGU9PT1kLmluZGV4TWF4Wm9vbXx8Yi5udW1Qb2ludHM8PWQuaW5kZXhNYXhQb2ludHMpY29udGludWU7aWYoZC5zb2xpZENoaWxkcmVufHwhdShiLGQuZXh0ZW50LGQuYnVmZmVyKSl7Yi5zb3VyY2U9bnVsbCxtPjEmJmNvbnNvbGUudGltZSgiY2xpcHBpbmciKTt2YXIgTSxrLEEsVCxTLEUsTD0uNSpkLmJ1ZmZlci9kLmV4dGVudCxDPS41LUwsej0uNStMLEk9MStMO009az1BPVQ9bnVsbCxTPWYodCxnLHItTCxyK3osMCxvLGIubWluWzBdLGIubWF4WzBdKSxFPWYodCxnLHIrQyxyK0ksMCxvLGIubWluWzBdLGIubWF4WzBdKSxTJiYoTT1mKFMsZyxuLUwsbit6LDEscyxiLm1pblsxXSxiLm1heFsxXSksaz1mKFMsZyxuK0MsbitJLDEscyxiLm1pblsxXSxiLm1heFsxXSkpLEUmJihBPWYoRSxnLG4tTCxuK3osMSxzLGIubWluWzFdLGIubWF4WzFdKSxUPWYoRSxnLG4rQyxuK0ksMSxzLGIubWluWzFdLGIubWF4WzFdKSksbT4xJiZjb25zb2xlLnRpbWVFbmQoImNsaXBwaW5nIiksdC5sZW5ndGgmJihoLnB1c2goTXx8W10sZSsxLDIqciwyKm4pLGgucHVzaChrfHxbXSxlKzEsMipyLDIqbisxKSxoLnB1c2goQXx8W10sZSsxLDIqcisxLDIqbiksaC5wdXNoKFR8fFtdLGUrMSwyKnIrMSwyKm4rMSkpfWVsc2UgaSYmKHY9ZSl9cmV0dXJuIHZ9LGkucHJvdG90eXBlLmdldFRpbGU9ZnVuY3Rpb24odCxlLHIpe3ZhciBuPXRoaXMub3B0aW9ucyxpPW4uZXh0ZW50LG89bi5kZWJ1ZyxzPTE8PHQ7ZT0oZSVzK3MpJXM7dmFyIGw9YSh0LGUscik7aWYodGhpcy50aWxlc1tsXSlyZXR1cm4gaC50aWxlKHRoaXMudGlsZXNbbF0saSk7bz4xJiZjb25zb2xlLmxvZygiZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWQiLHQsZSxyKTtmb3IodmFyIGMsZj10LGQ9ZSxwPXI7IWMmJmY+MDspZi0tLGQ9TWF0aC5mbG9vcihkLzIpLHA9TWF0aC5mbG9vcihwLzIpLGM9dGhpcy50aWxlc1thKGYsZCxwKV07aWYoIWN8fCFjLnNvdXJjZSlyZXR1cm4gbnVsbDtpZihvPjEmJmNvbnNvbGUubG9nKCJmb3VuZCBwYXJlbnQgdGlsZSB6JWQtJWQtJWQiLGYsZCxwKSx1KGMsaSxuLmJ1ZmZlcikpcmV0dXJuIGgudGlsZShjLGkpO28+MSYmY29uc29sZS50aW1lKCJkcmlsbGluZyBkb3duIik7dmFyIG09dGhpcy5zcGxpdFRpbGUoYy5zb3VyY2UsZixkLHAsdCxlLHIpO2lmKG8+MSYmY29uc29sZS50aW1lRW5kKCJkcmlsbGluZyBkb3duIiksbnVsbCE9PW0pe3ZhciB2PTE8PHQtbTtsPWEobSxNYXRoLmZsb29yKGUvdiksTWF0aC5mbG9vcihyL3YpKX1yZXR1cm4gdGhpcy50aWxlc1tsXT9oLnRpbGUodGhpcy50aWxlc1tsXSxpKTpudWxsfX0seyIuL2NsaXAiOjEzNywiLi9jb252ZXJ0IjoxMzgsIi4vdGlsZSI6MTQyLCIuL3RyYW5zZm9ybSI6MTQzLCIuL3dyYXAiOjE0NH1dLDE0MTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7dmFyIHIsbixhLG8scz1lKmUsbD10Lmxlbmd0aCx1PTAsYz1sLTEsaD1bXTtmb3IodFt1XVsyXT0xLHRbY11bMl09MTtjOyl7Zm9yKG49MCxyPXUrMTtyPGM7cisrKShhPWkodFtyXSx0W3VdLHRbY10pKT5uJiYobz1yLG49YSk7bj5zPyh0W29dWzJdPW4saC5wdXNoKHUpLGgucHVzaChvKSx1PW8pOihjPWgucG9wKCksdT1oLnBvcCgpKX19ZnVuY3Rpb24gaSh0LGUscil7dmFyIG49ZVswXSxpPWVbMV0sYT1yWzBdLG89clsxXSxzPXRbMF0sbD10WzFdLHU9YS1uLGM9by1pO2lmKDAhPT11fHwwIT09Yyl7dmFyIGg9KChzLW4pKnUrKGwtaSkqYykvKHUqdStjKmMpO2g+MT8obj1hLGk9byk6aD4wJiYobis9dSpoLGkrPWMqaCl9cmV0dXJuIHU9cy1uLGM9bC1pLHUqdStjKmN9ZS5leHBvcnRzPW59LHt9XSwxNDI6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGEsbyl7Zm9yKHZhciBzPXtmZWF0dXJlczpbXSxudW1Qb2ludHM6MCxudW1TaW1wbGlmaWVkOjAsbnVtRmVhdHVyZXM6MCxzb3VyY2U6bnVsbCx4OnIseTpuLHoyOmUsdHJhbnNmb3JtZWQ6ITEsbWluOlsyLDFdLG1heDpbLTEsMF19LGw9MDtsPHQubGVuZ3RoO2wrKyl7cy5udW1GZWF0dXJlcysrLGkocyx0W2xdLGEsbyk7dmFyIHU9dFtsXS5taW4sYz10W2xdLm1heDt1WzBdPHMubWluWzBdJiYocy5taW5bMF09dVswXSksdVsxXTxzLm1pblsxXSYmKHMubWluWzFdPXVbMV0pLGNbMF0+cy5tYXhbMF0mJihzLm1heFswXT1jWzBdKSxjWzFdPnMubWF4WzFdJiYocy5tYXhbMV09Y1sxXSl9cmV0dXJuIHN9ZnVuY3Rpb24gaSh0LGUscixuKXt2YXIgaSxvLHMsbCx1PWUuZ2VvbWV0cnksYz1lLnR5cGUsaD1bXSxmPXIqcjtpZigxPT09Yylmb3IoaT0wO2k8dS5sZW5ndGg7aSsrKWgucHVzaCh1W2ldKSx0Lm51bVBvaW50cysrLHQubnVtU2ltcGxpZmllZCsrO2Vsc2UgZm9yKGk9MDtpPHUubGVuZ3RoO2krKylpZihzPXVbaV0sbnx8ISgyPT09YyYmcy5kaXN0PHJ8fDM9PT1jJiZzLmFyZWE8Zikpe3ZhciBkPVtdO2ZvcihvPTA7bzxzLmxlbmd0aDtvKyspbD1zW29dLChufHxsWzJdPmYpJiYoZC5wdXNoKGwpLHQubnVtU2ltcGxpZmllZCsrKSx0Lm51bVBvaW50cysrOzM9PT1jJiZhKGQscy5vdXRlciksaC5wdXNoKGQpfWVsc2UgdC5udW1Qb2ludHMrPXMubGVuZ3RoO2lmKGgubGVuZ3RoKXt2YXIgcD17Z2VvbWV0cnk6aCx0eXBlOmMsdGFnczplLnRhZ3N8fG51bGx9O251bGwhPT1lLmlkJiYocC5pZD1lLmlkKSx0LmZlYXR1cmVzLnB1c2gocCl9fWZ1bmN0aW9uIGEodCxlKXtvKHQpPDA9PT1lJiZ0LnJldmVyc2UoKX1mdW5jdGlvbiBvKHQpe2Zvcih2YXIgZSxyLG49MCxpPTAsYT10Lmxlbmd0aCxvPWEtMTtpPGE7bz1pKyspZT10W2ldLHI9dFtvXSxuKz0oclswXS1lWzBdKSooZVsxXStyWzFdKTtyZXR1cm4gbn1lLmV4cG9ydHM9bn0se31dLDE0MzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7aWYodC50cmFuc2Zvcm1lZClyZXR1cm4gdDt2YXIgcixuLGEsbz10LnoyLHM9dC54LGw9dC55O2ZvcihyPTA7cjx0LmZlYXR1cmVzLmxlbmd0aDtyKyspe3ZhciB1PXQuZmVhdHVyZXNbcl0sYz11Lmdlb21ldHJ5O2lmKDE9PT11LnR5cGUpZm9yKG49MDtuPGMubGVuZ3RoO24rKyljW25dPWkoY1tuXSxlLG8scyxsKTtlbHNlIGZvcihuPTA7bjxjLmxlbmd0aDtuKyspe3ZhciBoPWNbbl07Zm9yKGE9MDthPGgubGVuZ3RoO2ErKyloW2FdPWkoaFthXSxlLG8scyxsKX19cmV0dXJuIHQudHJhbnNmb3JtZWQ9ITAsdH1mdW5jdGlvbiBpKHQsZSxyLG4saSl7cmV0dXJuW01hdGgucm91bmQoZSoodFswXSpyLW4pKSxNYXRoLnJvdW5kKGUqKHRbMV0qci1pKSldfXIudGlsZT1uLHIucG9pbnQ9aX0se31dLDE0NDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj10LGE9byh0LDEsLTEtZSxlLDAsciwtMSwyKSxzPW8odCwxLDEtZSwyK2UsMCxyLC0xLDIpO3JldHVybihhfHxzKSYmKG49byh0LDEsLWUsMStlLDAsciwtMSwyKXx8W10sYSYmKG49aShhLDEpLmNvbmNhdChuKSkscyYmKG49bi5jb25jYXQoaShzLC0xKSkpKSxufWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9W10sbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaSxvPXRbbl0sbD1vLnR5cGU7aWYoMT09PWwpaT1hKG8uZ2VvbWV0cnksZSk7ZWxzZXtpPVtdO2Zvcih2YXIgdT0wO3U8by5nZW9tZXRyeS5sZW5ndGg7dSsrKWkucHVzaChhKG8uZ2VvbWV0cnlbdV0sZSkpfXIucHVzaChzKG8udGFncyxsLGksby5pZCkpfXJldHVybiByfWZ1bmN0aW9uIGEodCxlKXt2YXIgcj1bXTtyLmFyZWE9dC5hcmVhLHIuZGlzdD10LmRpc3Q7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspci5wdXNoKFt0W25dWzBdK2UsdFtuXVsxXSx0W25dWzJdXSk7cmV0dXJuIHJ9dmFyIG89dCgiLi9jbGlwIikscz10KCIuL2ZlYXR1cmUiKTtlLmV4cG9ydHM9bn0seyIuL2NsaXAiOjEzNywiLi9mZWF0dXJlIjoxMzl9XSwxNDU6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7aWYoInN0cmluZyIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoIm11c3Qgc3BlY2lmeSB0eXBlIHN0cmluZyIpO2lmKGU9ZXx8e30sInVuZGVmaW5lZCI9PXR5cGVvZiBkb2N1bWVudCYmIWUuY2FudmFzKXJldHVybiBudWxsO3ZhciByPWUuY2FudmFzfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKTsibnVtYmVyIj09dHlwZW9mIGUud2lkdGgmJihyLndpZHRoPWUud2lkdGgpLCJudW1iZXIiPT10eXBlb2YgZS5oZWlnaHQmJihyLmhlaWdodD1lLmhlaWdodCk7dmFyIG4saT1lO3RyeXt2YXIgYT1bdF07MD09PXQuaW5kZXhPZigid2ViZ2wiKSYmYS5wdXNoKCJleHBlcmltZW50YWwtIit0KTtmb3IodmFyIG89MDtvPGEubGVuZ3RoO28rKylpZihuPXIuZ2V0Q29udGV4dChhW29dLGkpKXJldHVybiBufWNhdGNoKHQpe249bnVsbH1yZXR1cm4gbnx8bnVsbH1lLmV4cG9ydHM9bn0se31dLDE0NjpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHR9ZnVuY3Rpb24gaSh0KXt0aGlzLmdsPXQsdGhpcy5waXhlbFJhdGlvPTEsdGhpcy5ib3VuZHM9W1stMTAsLTEwLC0xMF0sWzEwLDEwLDEwXV0sdGhpcy50aWNrcz1bW10sW10sW11dLHRoaXMuYXV0b1RpY2tzPSEwLHRoaXMudGlja1NwYWNpbmc9WzEsMSwxXSx0aGlzLnRpY2tFbmFibGU9WyEwLCEwLCEwXSx0aGlzLnRpY2tGb250PVsic2Fucy1zZXJpZiIsInNhbnMtc2VyaWYiLCJzYW5zLXNlcmlmIl0sdGhpcy50aWNrU2l6ZT1bMTIsMTIsMTJdLHRoaXMudGlja0FuZ2xlPVswLDAsMF0sdGhpcy50aWNrQ29sb3I9W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLnRpY2tQYWQ9WzEwLDEwLDEwXSx0aGlzLmxhc3RDdWJlUHJvcHM9e2N1YmVFZGdlczpbMCwwLDBdLGF4aXM6WzAsMCwwXX0sdGhpcy5sYWJlbHM9WyJ4IiwieSIsInoiXSx0aGlzLmxhYmVsRW5hYmxlPVshMCwhMCwhMF0sdGhpcy5sYWJlbEZvbnQ9InNhbnMtc2VyaWYiLHRoaXMubGFiZWxTaXplPVsyMCwyMCwyMF0sdGhpcy5sYWJlbEFuZ2xlPVswLDAsMF0sdGhpcy5sYWJlbENvbG9yPVtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy5sYWJlbFBhZD1bMTAsMTAsMTBdLHRoaXMubGluZUVuYWJsZT1bITAsITAsITBdLHRoaXMubGluZU1pcnJvcj1bITEsITEsITFdLHRoaXMubGluZVdpZHRoPVsxLDEsMV0sdGhpcy5saW5lQ29sb3I9W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLmxpbmVUaWNrRW5hYmxlPVshMCwhMCwhMF0sdGhpcy5saW5lVGlja01pcnJvcj1bITEsITEsITFdLHRoaXMubGluZVRpY2tMZW5ndGg9WzAsMCwwXSx0aGlzLmxpbmVUaWNrV2lkdGg9WzEsMSwxXSx0aGlzLmxpbmVUaWNrQ29sb3I9W1swLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLmdyaWRFbmFibGU9WyEwLCEwLCEwXSx0aGlzLmdyaWRXaWR0aD1bMSwxLDFdLHRoaXMuZ3JpZENvbG9yPVtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy56ZXJvRW5hYmxlPVshMCwhMCwhMF0sdGhpcy56ZXJvTGluZUNvbG9yPVtbMCwwLDAsMV0sWzAsMCwwLDFdLFswLDAsMCwxXV0sdGhpcy56ZXJvTGluZVdpZHRoPVsyLDIsMl0sdGhpcy5iYWNrZ3JvdW5kRW5hYmxlPVshMSwhMSwhMV0sdGhpcy5iYWNrZ3JvdW5kQ29sb3I9W1suOCwuOCwuOCwuNV0sWy44LC44LC44LC41XSxbLjgsLjgsLjgsLjVdXSx0aGlzLl9maXJzdEluaXQ9ITAsdGhpcy5fdGV4dD1udWxsLHRoaXMuX2xpbmVzPW51bGwsdGhpcy5fYmFja2dyb3VuZD1jKHQpfWZ1bmN0aW9uIGEoKXt0aGlzLnByaW1hbE9mZnNldD1bMCwwLDBdLHRoaXMucHJpbWFsTWlub3I9WzAsMCwwXSx0aGlzLm1pcnJvck9mZnNldD1bMCwwLDBdLHRoaXMubWlycm9yTWlub3I9WzAsMCwwXX1mdW5jdGlvbiBvKHQsZSxyLG4saSl7Zm9yKHZhciBhPXQucHJpbWFsT2Zmc2V0LG89dC5wcmltYWxNaW5vcixzPXQubWlycm9yT2Zmc2V0LGw9dC5taXJyb3JNaW5vcix1PW5bZV0sYz0wO2M8MzsrK2MpaWYoZSE9PWMpe3ZhciBoPWEsZj1zLGQ9byxwPWw7dSYxPDxjJiYoaD1zLGY9YSxkPWwscD1vKSxoW2NdPXJbMF1bY10sZltjXT1yWzFdW2NdLGlbY10+MD8oZFtjXT0tMSxwW2NdPTApOihkW2NdPTAscFtjXT0xKX19ZnVuY3Rpb24gcyh0LGUpe3ZhciByPW5ldyBpKHQpO3JldHVybiByLnVwZGF0ZShlKSxyfWUuZXhwb3J0cz1zO3ZhciBsPXQoIi4vbGliL3RleHQuanMiKSx1PXQoIi4vbGliL2xpbmVzLmpzIiksYz10KCIuL2xpYi9iYWNrZ3JvdW5kLmpzIiksaD10KCIuL2xpYi9jdWJlLmpzIiksZj10KCIuL2xpYi90aWNrcy5qcyIpLGQ9bmV3IEZsb2F0MzJBcnJheShbMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMV0pLHA9aS5wcm90b3R5cGU7cC51cGRhdGU9ZnVuY3Rpb24odCl7CmZ1bmN0aW9uIGUoZSxyLG4pe2lmKG4gaW4gdCl7dmFyIGksYT10W25dLG89dGhpc1tuXTsoZT9BcnJheS5pc0FycmF5KGEpJiZBcnJheS5pc0FycmF5KGFbMF0pOkFycmF5LmlzQXJyYXkoYSkpP3RoaXNbbl09aT1bcihhWzBdKSxyKGFbMV0pLHIoYVsyXSldOnRoaXNbbl09aT1bcihhKSxyKGEpLHIoYSldO2Zvcih2YXIgcz0wO3M8MzsrK3MpaWYoaVtzXSE9PW9bc10pcmV0dXJuITB9cmV0dXJuITF9dD10fHx7fTt2YXIgcixuPWUuYmluZCh0aGlzLCExLE51bWJlciksaT1lLmJpbmQodGhpcywhMSxCb29sZWFuKSxhPWUuYmluZCh0aGlzLCExLFN0cmluZyksbz1lLmJpbmQodGhpcywhMCxmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXtpZigzPT09dC5sZW5ndGgpcmV0dXJuWyt0WzBdLCt0WzFdLCt0WzJdLDFdO2lmKDQ9PT10Lmxlbmd0aClyZXR1cm5bK3RbMF0sK3RbMV0sK3RbMl0sK3RbM11dfXJldHVyblswLDAsMCwxXX0pLHM9ITEsYz0hMTtpZigiYm91bmRzImluIHQpZm9yKHZhciBoPXQuYm91bmRzLGQ9MDtkPDI7KytkKWZvcih2YXIgcD0wO3A8MzsrK3ApaFtkXVtwXSE9PXRoaXMuYm91bmRzW2RdW3BdJiYoYz0hMCksdGhpcy5ib3VuZHNbZF1bcF09aFtkXVtwXTtpZigidGlja3MiaW4gdCl7cj10LnRpY2tzLHM9ITAsdGhpcy5hdXRvVGlja3M9ITE7Zm9yKHZhciBkPTA7ZDwzOysrZCl0aGlzLnRpY2tTcGFjaW5nW2RdPTB9ZWxzZSBuKCJ0aWNrU3BhY2luZyIpJiYodGhpcy5hdXRvVGlja3M9ITAsYz0hMCk7aWYodGhpcy5fZmlyc3RJbml0JiYoInRpY2tzImluIHR8fCJ0aWNrU3BhY2luZyJpbiB0fHwodGhpcy5hdXRvVGlja3M9ITApLGM9ITAscz0hMCx0aGlzLl9maXJzdEluaXQ9ITEpLGMmJnRoaXMuYXV0b1RpY2tzJiYocj1mLmNyZWF0ZSh0aGlzLmJvdW5kcyx0aGlzLnRpY2tTcGFjaW5nKSxzPSEwKSxzKXtmb3IodmFyIGQ9MDtkPDM7KytkKXJbZF0uc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LngtZS54fSk7Zi5lcXVhbChyLHRoaXMudGlja3MpP3M9ITE6dGhpcy50aWNrcz1yfWkoInRpY2tFbmFibGUiKSxhKCJ0aWNrRm9udCIpJiYocz0hMCksbigidGlja1NpemUiKSxuKCJ0aWNrQW5nbGUiKSxuKCJ0aWNrUGFkIiksbygidGlja0NvbG9yIik7dmFyIG09YSgibGFiZWxzIik7YSgibGFiZWxGb250IikmJihtPSEwKSxpKCJsYWJlbEVuYWJsZSIpLG4oImxhYmVsU2l6ZSIpLG4oImxhYmVsUGFkIiksbygibGFiZWxDb2xvciIpLGkoImxpbmVFbmFibGUiKSxpKCJsaW5lTWlycm9yIiksbigibGluZVdpZHRoIiksbygibGluZUNvbG9yIiksaSgibGluZVRpY2tFbmFibGUiKSxpKCJsaW5lVGlja01pcnJvciIpLG4oImxpbmVUaWNrTGVuZ3RoIiksbigibGluZVRpY2tXaWR0aCIpLG8oImxpbmVUaWNrQ29sb3IiKSxpKCJncmlkRW5hYmxlIiksbigiZ3JpZFdpZHRoIiksbygiZ3JpZENvbG9yIiksaSgiemVyb0VuYWJsZSIpLG8oInplcm9MaW5lQ29sb3IiKSxuKCJ6ZXJvTGluZVdpZHRoIiksaSgiYmFja2dyb3VuZEVuYWJsZSIpLG8oImJhY2tncm91bmRDb2xvciIpLHRoaXMuX3RleHQ/dGhpcy5fdGV4dCYmKG18fHMpJiZ0aGlzLl90ZXh0LnVwZGF0ZSh0aGlzLmJvdW5kcyx0aGlzLmxhYmVscyx0aGlzLmxhYmVsRm9udCx0aGlzLnRpY2tzLHRoaXMudGlja0ZvbnQpOnRoaXMuX3RleHQ9bCh0aGlzLmdsLHRoaXMuYm91bmRzLHRoaXMubGFiZWxzLHRoaXMubGFiZWxGb250LHRoaXMudGlja3MsdGhpcy50aWNrRm9udCksdGhpcy5fbGluZXMmJnMmJih0aGlzLl9saW5lcy5kaXNwb3NlKCksdGhpcy5fbGluZXM9bnVsbCksdGhpcy5fbGluZXN8fCh0aGlzLl9saW5lcz11KHRoaXMuZ2wsdGhpcy5ib3VuZHMsdGhpcy50aWNrcykpfTt2YXIgbT1bbmV3IGEsbmV3IGEsbmV3IGFdLHY9WzAsMCwwXSxnPXttb2RlbDpkLHZpZXc6ZCxwcm9qZWN0aW9uOmR9O3AuaXNPcGFxdWU9ZnVuY3Rpb24oKXtyZXR1cm4hMH0scC5pc1RyYW5zcGFyZW50PWZ1bmN0aW9uKCl7cmV0dXJuITF9LHAuZHJhd1RyYW5zcGFyZW50PWZ1bmN0aW9uKHQpe307dmFyIHk9WzAsMCwwXSxiPVswLDAsMF0seD1bMCwwLDBdO3AuZHJhdz1mdW5jdGlvbih0KXt0PXR8fGc7Zm9yKHZhciBlPXRoaXMuZ2wscj10Lm1vZGVsfHxkLGk9dC52aWV3fHxkLGE9dC5wcm9qZWN0aW9ufHxkLHM9dGhpcy5ib3VuZHMsbD1oKHIsaSxhLHMpLHU9bC5jdWJlRWRnZXMsYz1sLmF4aXMsZj1pWzEyXSxwPWlbMTNdLF89aVsxNF0sdz1pWzE1XSxNPXRoaXMucGl4ZWxSYXRpbyooYVszXSpmK2FbN10qcCthWzExXSpfK2FbMTVdKncpL2UuZHJhd2luZ0J1ZmZlckhlaWdodCxrPTA7azwzOysrayl0aGlzLmxhc3RDdWJlUHJvcHMuY3ViZUVkZ2VzW2tdPXVba10sdGhpcy5sYXN0Q3ViZVByb3BzLmF4aXNba109Y1trXTtmb3IodmFyIEE9bSxrPTA7azwzOysraylvKG1ba10sayx0aGlzLmJvdW5kcyx1LGMpO2Zvcih2YXIgZT10aGlzLmdsLFQ9dixrPTA7azwzOysrayl0aGlzLmJhY2tncm91bmRFbmFibGVba10/VFtrXT1jW2tdOlRba109MDt0aGlzLl9iYWNrZ3JvdW5kLmRyYXcocixpLGEscyxULHRoaXMuYmFja2dyb3VuZENvbG9yKSx0aGlzLl9saW5lcy5iaW5kKHIsaSxhLHRoaXMpO2Zvcih2YXIgaz0wO2s8MzsrK2spe3ZhciBTPVswLDAsMF07Y1trXT4wP1Nba109c1sxXVtrXTpTW2tdPXNbMF1ba107Zm9yKHZhciBFPTA7RTwyOysrRSl7dmFyIEw9KGsrMStFKSUzLEM9KGsrMSsoMV5FKSklMzt0aGlzLmdyaWRFbmFibGVbTF0mJnRoaXMuX2xpbmVzLmRyYXdHcmlkKEwsQyx0aGlzLmJvdW5kcyxTLHRoaXMuZ3JpZENvbG9yW0xdLHRoaXMuZ3JpZFdpZHRoW0xdKnRoaXMucGl4ZWxSYXRpbyl9Zm9yKHZhciBFPTA7RTwyOysrRSl7dmFyIEw9KGsrMStFKSUzLEM9KGsrMSsoMV5FKSklMzt0aGlzLnplcm9FbmFibGVbQ10mJnNbMF1bQ108PTAmJnNbMV1bQ10+PTAmJnRoaXMuX2xpbmVzLmRyYXdaZXJvKEwsQyx0aGlzLmJvdW5kcyxTLHRoaXMuemVyb0xpbmVDb2xvcltDXSx0aGlzLnplcm9MaW5lV2lkdGhbQ10qdGhpcy5waXhlbFJhdGlvKX19Zm9yKHZhciBrPTA7azwzOysrayl7dGhpcy5saW5lRW5hYmxlW2tdJiZ0aGlzLl9saW5lcy5kcmF3QXhpc0xpbmUoayx0aGlzLmJvdW5kcyxBW2tdLnByaW1hbE9mZnNldCx0aGlzLmxpbmVDb2xvcltrXSx0aGlzLmxpbmVXaWR0aFtrXSp0aGlzLnBpeGVsUmF0aW8pLHRoaXMubGluZU1pcnJvcltrXSYmdGhpcy5fbGluZXMuZHJhd0F4aXNMaW5lKGssdGhpcy5ib3VuZHMsQVtrXS5taXJyb3JPZmZzZXQsdGhpcy5saW5lQ29sb3Jba10sdGhpcy5saW5lV2lkdGhba10qdGhpcy5waXhlbFJhdGlvKTtmb3IodmFyIHo9bih5LEFba10ucHJpbWFsTWlub3IpLEk9bihiLEFba10ubWlycm9yTWlub3IpLEQ9dGhpcy5saW5lVGlja0xlbmd0aCxFPTA7RTwzOysrRSl7dmFyIFA9TS9yWzUqRV07eltFXSo9RFtFXSpQLElbRV0qPURbRV0qUH10aGlzLmxpbmVUaWNrRW5hYmxlW2tdJiZ0aGlzLl9saW5lcy5kcmF3QXhpc1RpY2tzKGssQVtrXS5wcmltYWxPZmZzZXQseix0aGlzLmxpbmVUaWNrQ29sb3Jba10sdGhpcy5saW5lVGlja1dpZHRoW2tdKnRoaXMucGl4ZWxSYXRpbyksdGhpcy5saW5lVGlja01pcnJvcltrXSYmdGhpcy5fbGluZXMuZHJhd0F4aXNUaWNrcyhrLEFba10ubWlycm9yT2Zmc2V0LEksdGhpcy5saW5lVGlja0NvbG9yW2tdLHRoaXMubGluZVRpY2tXaWR0aFtrXSp0aGlzLnBpeGVsUmF0aW8pfXRoaXMuX3RleHQuYmluZChyLGksYSx0aGlzLnBpeGVsUmF0aW8pO2Zvcih2YXIgaz0wO2s8MzsrK2spe2Zvcih2YXIgTz1BW2tdLnByaW1hbE1pbm9yLFI9bih4LEFba10ucHJpbWFsT2Zmc2V0KSxFPTA7RTwzOysrRSl0aGlzLmxpbmVUaWNrRW5hYmxlW2tdJiYoUltFXSs9TSpPW0VdKk1hdGgubWF4KHRoaXMubGluZVRpY2tMZW5ndGhbRV0sMCkvcls1KkVdKTtpZih0aGlzLnRpY2tFbmFibGVba10pe2Zvcih2YXIgRT0wO0U8MzsrK0UpUltFXSs9TSpPW0VdKnRoaXMudGlja1BhZFtFXS9yWzUqRV07dGhpcy5fdGV4dC5kcmF3VGlja3Moayx0aGlzLnRpY2tTaXplW2tdLHRoaXMudGlja0FuZ2xlW2tdLFIsdGhpcy50aWNrQ29sb3Jba10pfWlmKHRoaXMubGFiZWxFbmFibGVba10pe2Zvcih2YXIgRT0wO0U8MzsrK0UpUltFXSs9TSpPW0VdKnRoaXMubGFiZWxQYWRbRV0vcls1KkVdO1Jba10rPS41KihzWzBdW2tdK3NbMV1ba10pLHRoaXMuX3RleHQuZHJhd0xhYmVsKGssdGhpcy5sYWJlbFNpemVba10sdGhpcy5sYWJlbEFuZ2xlW2tdLFIsdGhpcy5sYWJlbENvbG9yW2tdKX19fSxwLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLl90ZXh0LmRpc3Bvc2UoKSx0aGlzLl9saW5lcy5kaXNwb3NlKCksdGhpcy5fYmFja2dyb3VuZC5kaXNwb3NlKCksdGhpcy5fbGluZXM9bnVsbCx0aGlzLl90ZXh0PW51bGwsdGhpcy5fYmFja2dyb3VuZD1udWxsLHRoaXMuZ2w9bnVsbH19LHsiLi9saWIvYmFja2dyb3VuZC5qcyI6MTQ3LCIuL2xpYi9jdWJlLmpzIjoxNDgsIi4vbGliL2xpbmVzLmpzIjoxNDksIi4vbGliL3RleHQuanMiOjE1MSwiLi9saWIvdGlja3MuanMiOjE1Mn1dLDE0NzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4pe3RoaXMuZ2w9dCx0aGlzLmJ1ZmZlcj1lLHRoaXMudmFvPXIsdGhpcy5zaGFkZXI9bn1mdW5jdGlvbiBpKHQpe2Zvcih2YXIgZT1bXSxyPVtdLGk9MCxsPTA7bDwzOysrbClmb3IodmFyIHU9KGwrMSklMyxjPShsKzIpJTMsaD1bMCwwLDBdLGY9WzAsMCwwXSxkPS0xO2Q8PTE7ZCs9Mil7ci5wdXNoKGksaSsyLGkrMSxpKzEsaSsyLGkrMyksaFtsXT1kLGZbbF09ZDtmb3IodmFyIHA9LTE7cDw9MTtwKz0yKXtoW3VdPXA7Zm9yKHZhciBtPS0xO208PTE7bSs9MiloW2NdPW0sZS5wdXNoKGhbMF0saFsxXSxoWzJdLGZbMF0sZlsxXSxmWzJdKSxpKz0xfXZhciB2PXU7dT1jLGM9dn12YXIgZz1hKHQsbmV3IEZsb2F0MzJBcnJheShlKSkseT1hKHQsbmV3IFVpbnQxNkFycmF5KHIpLHQuRUxFTUVOVF9BUlJBWV9CVUZGRVIpLGI9byh0LFt7YnVmZmVyOmcsdHlwZTp0LkZMT0FULHNpemU6MyxvZmZzZXQ6MCxzdHJpZGU6MjR9LHtidWZmZXI6Zyx0eXBlOnQuRkxPQVQsc2l6ZTozLG9mZnNldDoxMixzdHJpZGU6MjR9XSx5KSx4PXModCk7cmV0dXJuIHguYXR0cmlidXRlcy5wb3NpdGlvbi5sb2NhdGlvbj0wLHguYXR0cmlidXRlcy5ub3JtYWwubG9jYXRpb249MSxuZXcgbih0LGcsYix4KX1lLmV4cG9ydHM9aTt2YXIgYT10KCJnbC1idWZmZXIiKSxvPXQoImdsLXZhbyIpLHM9dCgiLi9zaGFkZXJzIikuYmcsbD1uLnByb3RvdHlwZTtsLmRyYXc9ZnVuY3Rpb24odCxlLHIsbixpLGEpe2Zvcih2YXIgbz0hMSxzPTA7czwzOysrcylvPW98fGlbc107aWYobyl7dmFyIGw9dGhpcy5nbDtsLmVuYWJsZShsLlBPTFlHT05fT0ZGU0VUX0ZJTEwpLGwucG9seWdvbk9mZnNldCgxLDIpLHRoaXMuc2hhZGVyLmJpbmQoKSx0aGlzLnNoYWRlci51bmlmb3Jtcz17bW9kZWw6dCx2aWV3OmUscHJvamVjdGlvbjpyLGJvdW5kczpuLGVuYWJsZTppLGNvbG9yczphfSx0aGlzLnZhby5iaW5kKCksdGhpcy52YW8uZHJhdyh0aGlzLmdsLlRSSUFOR0xFUywzNiksbC5kaXNhYmxlKGwuUE9MWUdPTl9PRkZTRVRfRklMTCl9fSxsLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnZhby5kaXNwb3NlKCksdGhpcy5idWZmZXIuZGlzcG9zZSgpLHRoaXMuc2hhZGVyLmRpc3Bvc2UoKX19LHsiLi9zaGFkZXJzIjoxNTAsImdsLWJ1ZmZlciI6MTU0LCJnbC12YW8iOjI2OX1dLDE0ODpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyKXtmb3IodmFyIG49MDtuPDQ7KytuKXt0W25dPXJbMTIrbl07Zm9yKHZhciBpPTA7aTwzOysraSl0W25dKz1lW2ldKnJbNCppK25dfX1mdW5jdGlvbiBpKHQpe2Zvcih2YXIgZT0wO2U8bS5sZW5ndGg7KytlKWlmKHQ9bC5wb3NpdGl2ZSh0LG1bZV0pLHQubGVuZ3RoPDMpcmV0dXJuIDA7Zm9yKHZhciByPXRbMF0sbj1yWzBdL3JbM10saT1yWzFdL3JbM10sYT0wLGU9MTtlKzE8dC5sZW5ndGg7KytlKXt2YXIgbz10W2VdLHM9dFtlKzFdLHU9b1swXS9vWzNdLGM9b1sxXS9vWzNdLGg9c1swXS9zWzNdLGY9c1sxXS9zWzNdLGQ9dS1uLHA9Yy1pLHY9aC1uLGc9Zi1pO2ErPU1hdGguYWJzKGQqZy1wKnYpfXJldHVybiBhfWZ1bmN0aW9uIGEodCxlLHIsYSl7cyhjLGUsdCkscyhjLHIsYyk7Zm9yKHZhciBsPTAsbT0wO208MjsrK20pe2RbMl09YVttXVsyXTtmb3IodmFyIGI9MDtiPDI7KytiKXtkWzFdPWFbYl1bMV07Zm9yKHZhciB4PTA7eDwyOysreClkWzBdPWFbeF1bMF0sbihoW2xdLGQsYyksbCs9MX19Zm9yKHZhciBfPS0xLG09MDttPDg7KyttKXtmb3IodmFyIHc9aFttXVszXSxNPTA7TTwzOysrTSlmW21dW01dPWhbbV1bTV0vdzt3PDAmJihfPDA/Xz1tOmZbbV1bMl08ZltfXVsyXSYmKF89bSkpfWlmKF88MCl7Xz0wO2Zvcih2YXIgaz0wO2s8MzsrK2spe2Zvcih2YXIgQT0oaysyKSUzLFQ9KGsrMSklMyxTPS0xLEU9LTEsTD0wO0w8MjsrK0wpe3ZhciBDPUw8PGssej1DKyhMPDxBKSsoMS1MPDxUKSxJPUMrKDEtTDw8QSkrKEw8PFQpO3UoZltDXSxmW3pdLGZbSV0scCk8MHx8KEw/Uz0xOkU9MSl9aWYoUzwwfHxFPDApRT5TJiYoX3w9MTw8ayk7ZWxzZXtmb3IodmFyIEw9MDtMPDI7KytMKXt2YXIgQz1MPDxrLHo9QysoTDw8QSkrKDEtTDw8VCksST1DKygxLUw8PEEpKyhMPDxUKSxEPWkoW2hbQ10saFt6XSxoW0ldLGhbQysoMTw8QSkrKDE8PFQpXV0pO0w/Uz1EOkU9RH1FPlMmJihffD0xPDxrKX19fWZvcih2YXIgUD03Xl8sTz0tMSxtPTA7bTw4OysrbSltIT09XyYmbSE9PVAmJihPPDA/Tz1tOmZbT11bMV0+ZlttXVsxXSYmKE89bSkpO2Zvcih2YXIgUj0tMSxtPTA7bTwzOysrbSl7dmFyIEY9T14xPDxtO2lmKEYhPT1fJiZGIT09UCl7UjwwJiYoUj1GKTt2YXIgVD1mW0ZdO1RbMF08ZltSXVswXSYmKFI9Ril9fWZvcih2YXIgaj0tMSxtPTA7bTwzOysrbSl7dmFyIEY9T14xPDxtO2lmKEYhPT1fJiZGIT09UCYmRiE9PVIpe2o8MCYmKGo9Rik7dmFyIFQ9ZltGXTtUWzBdPmZbal1bMF0mJihqPUYpfX12YXIgTj12O05bMF09TlsxXT1OWzJdPTAsTltvLmxvZzIoUl5PKV09TyZSLE5bby5sb2cyKE9eaildPU8majt2YXIgQj03Xmo7Qj09PV98fEI9PT1QPyhCPTdeUixOW28ubG9nMihqXkIpXT1CJmopOk5bby5sb2cyKFJeQildPUImUjtmb3IodmFyIFU9ZyxWPV8saz0wO2s8MzsrK2spVVtrXT1WJjE8PGs/LTE6MTtyZXR1cm4geX1lLmV4cG9ydHM9YTt2YXIgbz10KCJiaXQtdHdpZGRsZSIpLHM9dCgiZ2wtbWF0NC9tdWx0aXBseSIpLGw9KHQoImdsLW1hdDQvaW52ZXJ0IiksdCgic3BsaXQtcG9seWdvbiIpKSx1PXQoInJvYnVzdC1vcmllbnRhdGlvbiIpLGM9bmV3IEFycmF5KDE2KSxoPShuZXcgQXJyYXkoMTYpLG5ldyBBcnJheSg4KSksZj1uZXcgQXJyYXkoOCksZD1uZXcgQXJyYXkoMykscD1bMCwwLDBdOyFmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8ODsrK3QpaFt0XT1bMSwxLDEsMV0sZlt0XT1bMSwxLDFdfSgpO3ZhciBtPVtbMCwwLDEsMCwwXSxbMCwwLC0xLDEsMF0sWzAsLTEsMCwxLDBdLFswLDEsMCwxLDBdLFstMSwwLDAsMSwwXSxbMSwwLDAsMSwwXV0sdj1bMSwxLDFdLGc9WzAsMCwwXSx5PXtjdWJlRWRnZXM6dixheGlzOmd9fSx7ImJpdC10d2lkZGxlIjo2NSwiZ2wtbWF0NC9pbnZlcnQiOjE3OSwiZ2wtbWF0NC9tdWx0aXBseSI6MTgxLCJyb2J1c3Qtb3JpZW50YXRpb24iOjUwNiwic3BsaXQtcG9seWdvbiI6NTI0fV0sMTQ5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuIHRbMF09dFsxXT10WzJdPTAsdH1mdW5jdGlvbiBpKHQsZSl7cmV0dXJuIHRbMF09ZVswXSx0WzFdPWVbMV0sdFsyXT1lWzJdLHR9ZnVuY3Rpb24gYSh0LGUscixuLGksYSxvLHMpe3RoaXMuZ2w9dCx0aGlzLnZlcnRCdWZmZXI9ZSx0aGlzLnZhbz1yLHRoaXMuc2hhZGVyPW4sdGhpcy50aWNrQ291bnQ9aSx0aGlzLnRpY2tPZmZzZXQ9YSx0aGlzLmdyaWRDb3VudD1vLHRoaXMuZ3JpZE9mZnNldD1zfWZ1bmN0aW9uIG8odCxlLHIpe3ZhciBuPVtdLGk9WzAsMCwwXSxvPVswLDAsMF0sYz1bMCwwLDBdLGg9WzAsMCwwXTtuLnB1c2goMCwwLDEsMCwxLDEsMCwwLC0xLDAsMCwtMSwwLDEsMSwwLDEsLTEpO2Zvcih2YXIgZj0wO2Y8MzsrK2Ype2Zvcih2YXIgZD1uLmxlbmd0aC8zfDAscD0wO3A8cltmXS5sZW5ndGg7KytwKXt2YXIgbT0rcltmXVtwXS54O24ucHVzaChtLDAsMSxtLDEsMSxtLDAsLTEsbSwwLC0xLG0sMSwxLG0sMSwtMSl9dmFyIHY9bi5sZW5ndGgvM3wwO2lbZl09ZCxvW2ZdPXYtZDtmb3IodmFyIGQ9bi5sZW5ndGgvM3wwLGc9MDtnPHJbZl0ubGVuZ3RoOysrZyl7dmFyIG09K3JbZl1bZ10ueDtuLnB1c2gobSwwLDEsbSwxLDEsbSwwLC0xLG0sMCwtMSxtLDEsMSxtLDEsLTEpfXZhciB2PW4ubGVuZ3RoLzN8MDtjW2ZdPWQsaFtmXT12LWR9dmFyIHk9cyh0LG5ldyBGbG9hdDMyQXJyYXkobikpLGI9bCh0LFt7YnVmZmVyOnksdHlwZTp0LkZMT0FULHNpemU6MyxzdHJpZGU6MCxvZmZzZXQ6MH1dKSx4PXUodCk7cmV0dXJuIHguYXR0cmlidXRlcy5wb3NpdGlvbi5sb2NhdGlvbj0wLG5ldyBhKHQseSxiLHgsbyxpLGgsYyl9ZS5leHBvcnRzPW87dmFyIHM9dCgiZ2wtYnVmZmVyIiksbD10KCJnbC12YW8iKSx1PXQoIi4vc2hhZGVycyIpLmxpbmUsYz1bMCwwLDBdLGg9WzAsMCwwXSxmPVswLDAsMF0sZD1bMCwwLDBdLHA9WzEsMV0sbT1hLnByb3RvdHlwZTttLmJpbmQ9ZnVuY3Rpb24odCxlLHIpe3RoaXMuc2hhZGVyLmJpbmQoKSx0aGlzLnNoYWRlci51bmlmb3Jtcy5tb2RlbD10LHRoaXMuc2hhZGVyLnVuaWZvcm1zLnZpZXc9ZSx0aGlzLnNoYWRlci51bmlmb3Jtcy5wcm9qZWN0aW9uPXIscFswXT10aGlzLmdsLmRyYXdpbmdCdWZmZXJXaWR0aCxwWzFdPXRoaXMuZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCx0aGlzLnNoYWRlci51bmlmb3Jtcy5zY3JlZW5TaGFwZT1wLHRoaXMudmFvLmJpbmQoKX0sbS5kcmF3QXhpc0xpbmU9ZnVuY3Rpb24odCxlLHIsYSxvKXt2YXIgcz1uKGgpO3RoaXMuc2hhZGVyLnVuaWZvcm1zLm1ham9yQXhpcz1oLHNbdF09ZVsxXVt0XS1lWzBdW3RdLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm1pbm9yQXhpcz1zO3ZhciBsPWkoZCxyKTtsW3RdKz1lWzBdW3RdLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm9mZnNldD1sLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmxpbmVXaWR0aD1vLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmNvbG9yPWE7dmFyIHU9bihmKTt1Wyh0KzIpJTNdPTEsdGhpcy5zaGFkZXIudW5pZm9ybXMuc2NyZWVuQXhpcz11LHRoaXMudmFvLmRyYXcodGhpcy5nbC5UUklBTkdMRVMsNik7dmFyIHU9bihmKTt1Wyh0KzEpJTNdPTEsdGhpcy5zaGFkZXIudW5pZm9ybXMuc2NyZWVuQXhpcz11LHRoaXMudmFvLmRyYXcodGhpcy5nbC5UUklBTkdMRVMsNil9LG0uZHJhd0F4aXNUaWNrcz1mdW5jdGlvbih0LGUscixpLGEpe2lmKHRoaXMudGlja0NvdW50W3RdKXt2YXIgbz1uKGMpO29bdF09MSx0aGlzLnNoYWRlci51bmlmb3Jtcy5tYWpvckF4aXM9byx0aGlzLnNoYWRlci51bmlmb3Jtcy5vZmZzZXQ9ZSx0aGlzLnNoYWRlci51bmlmb3Jtcy5taW5vckF4aXM9cix0aGlzLnNoYWRlci51bmlmb3Jtcy5jb2xvcj1pLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmxpbmVXaWR0aD1hO3ZhciBzPW4oZik7c1t0XT0xLHRoaXMuc2hhZGVyLnVuaWZvcm1zLnNjcmVlbkF4aXM9cyx0aGlzLnZhby5kcmF3KHRoaXMuZ2wuVFJJQU5HTEVTLHRoaXMudGlja0NvdW50W3RdLHRoaXMudGlja09mZnNldFt0XSl9fSxtLmRyYXdHcmlkPWZ1bmN0aW9uKHQsZSxyLGEsbyxzKXtpZih0aGlzLmdyaWRDb3VudFt0XSl7dmFyIGw9bihoKTtsW2VdPXJbMV1bZV0tclswXVtlXSx0aGlzLnNoYWRlci51bmlmb3Jtcy5taW5vckF4aXM9bDt2YXIgdT1pKGQsYSk7dVtlXSs9clswXVtlXSx0aGlzLnNoYWRlci51bmlmb3Jtcy5vZmZzZXQ9dTt2YXIgcD1uKGMpO3BbdF09MSx0aGlzLnNoYWRlci51bmlmb3Jtcy5tYWpvckF4aXM9cDt2YXIgbT1uKGYpO21bdF09MSx0aGlzLnNoYWRlci51bmlmb3Jtcy5zY3JlZW5BeGlzPW0sdGhpcy5zaGFkZXIudW5pZm9ybXMubGluZVdpZHRoPXMsdGhpcy5zaGFkZXIudW5pZm9ybXMuY29sb3I9byx0aGlzLnZhby5kcmF3KHRoaXMuZ2wuVFJJQU5HTEVTLHRoaXMuZ3JpZENvdW50W3RdLHRoaXMuZ3JpZE9mZnNldFt0XSl9fSxtLmRyYXdaZXJvPWZ1bmN0aW9uKHQsZSxyLGEsbyxzKXt2YXIgbD1uKGgpO3RoaXMuc2hhZGVyLnVuaWZvcm1zLm1ham9yQXhpcz1sLGxbdF09clsxXVt0XS1yWzBdW3RdLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm1pbm9yQXhpcz1sO3ZhciB1PWkoZCxhKTt1W3RdKz1yWzBdW3RdLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm9mZnNldD11O3ZhciBjPW4oZik7Y1tlXT0xLHRoaXMuc2hhZGVyLnVuaWZvcm1zLnNjcmVlbkF4aXM9Yyx0aGlzLnNoYWRlci51bmlmb3Jtcy5saW5lV2lkdGg9cyx0aGlzLnNoYWRlci51bmlmb3Jtcy5jb2xvcj1vLHRoaXMudmFvLmRyYXcodGhpcy5nbC5UUklBTkdMRVMsNil9LG0uZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMudmFvLmRpc3Bvc2UoKSx0aGlzLnZlcnRCdWZmZXIuZGlzcG9zZSgpLHRoaXMuc2hhZGVyLmRpc3Bvc2UoKX19LHsiLi9zaGFkZXJzIjoxNTAsImdsLWJ1ZmZlciI6MTU0LCJnbC12YW8iOjI2OX1dLDE1MDpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0Ijt2YXIgbj10KCJnbC1zaGFkZXIiKTtyLmxpbmU9ZnVuY3Rpb24odCl7cmV0dXJuIG4odCwiI2RlZmluZSBHTFNMSUZZIDFcbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xuXG51bmlmb3JtIG1hdDQgbW9kZWwsIHZpZXcsIHByb2plY3Rpb247XG51bmlmb3JtIHZlYzMgb2Zmc2V0LCBtYWpvckF4aXMsIG1pbm9yQXhpcywgc2NyZWVuQXhpcztcbnVuaWZvcm0gZmxvYXQgbGluZVdpZHRoO1xudW5pZm9ybSB2ZWMyIHNjcmVlblNoYXBlO1xuXG52ZWMzIHByb2plY3QodmVjMyBwKSB7XG4gIHZlYzQgcHAgPSBwcm9qZWN0aW9uICogdmlldyAqIG1vZGVsICogdmVjNChwLCAxLjApO1xuICByZXR1cm4gcHAueHl6IC8gbWF4KHBwLncsIDAuMDAwMSk7XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMyBtYWpvciA9IHBvc2l0aW9uLnggKiBtYWpvckF4aXM7XG4gIHZlYzMgbWlub3IgPSBwb3NpdGlvbi55ICogbWlub3JBeGlzO1xuXG4gIHZlYzMgdlBvc2l0aW9uID0gbWFqb3IgKyBtaW5vciArIG9mZnNldDtcbiAgdmVjMyBwUG9zaXRpb24gPSBwcm9qZWN0KHZQb3NpdGlvbik7XG4gIHZlYzMgb2Zmc2V0ID0gcHJvamVjdCh2UG9zaXRpb24gKyBzY3JlZW5BeGlzICogcG9zaXRpb24ueik7XG5cbiAgdmVjMiBzY3JlZW4gPSBub3JtYWxpemUoKG9mZnNldCAtIHBQb3NpdGlvbikueHkgKiBzY3JlZW5TaGFwZSkgLyBzY3JlZW5TaGFwZTtcblxuICBnbF9Qb3NpdGlvbiA9IHZlYzQocFBvc2l0aW9uICsgdmVjMygwLjUgKiBzY3JlZW4gKiBsaW5lV2lkdGgsIDApLCAxLjApO1xufVxuIiwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxudW5pZm9ybSB2ZWM0IGNvbG9yO1xudm9pZCBtYWluKCkge1xuICBnbF9GcmFnQ29sb3IgPSBjb2xvcjtcbn0iLG51bGwsW3tuYW1lOiJwb3NpdGlvbiIsdHlwZToidmVjMyJ9XSl9O3IudGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gbih0LCIjZGVmaW5lIEdMU0xJRlkgMVxuYXR0cmlidXRlIHZlYzMgcG9zaXRpb247XG5cbnVuaWZvcm0gbWF0NCBtb2RlbCwgdmlldywgcHJvamVjdGlvbjtcbnVuaWZvcm0gdmVjMyBvZmZzZXQsIGF4aXM7XG51bmlmb3JtIGZsb2F0IHNjYWxlLCBhbmdsZSwgcGl4ZWxTY2FsZTtcbnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xuXG52b2lkIG1haW4oKSB7ICBcbiAgLy9Db21wdXRlIHBsYW5lIG9mZnNldFxuICB2ZWMyIHBsYW5lQ29vcmQgPSBwb3NpdGlvbi54eSAqIHBpeGVsU2NhbGU7XG4gIG1hdDIgcGxhbmVYZm9ybSA9IHNjYWxlICogbWF0Mihjb3MoYW5nbGUpLCBzaW4oYW5nbGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtc2luKGFuZ2xlKSwgY29zKGFuZ2xlKSk7XG4gIHZlYzIgdmlld09mZnNldCA9IDIuMCAqIHBsYW5lWGZvcm0gKiBwbGFuZUNvb3JkIC8gcmVzb2x1dGlvbjtcblxuICAvL0NvbXB1dGUgd29ybGQgb2Zmc2V0XG4gIGZsb2F0IGF4aXNEaXN0YW5jZSA9IHBvc2l0aW9uLno7XG4gIHZlYzMgZGF0YVBvc2l0aW9uID0gYXhpc0Rpc3RhbmNlICogYXhpcyArIG9mZnNldDtcbiAgdmVjNCB3b3JsZFBvc2l0aW9uID0gbW9kZWwgKiB2ZWM0KGRhdGFQb3NpdGlvbiwgMSk7XG4gIFxuICAvL0NvbXB1dGUgY2xpcCBwb3NpdGlvblxuICB2ZWM0IHZpZXdQb3NpdGlvbiA9IHZpZXcgKiB3b3JsZFBvc2l0aW9uO1xuICB2ZWM0IGNsaXBQb3NpdGlvbiA9IHByb2plY3Rpb24gKiB2aWV3UG9zaXRpb247XG4gIGNsaXBQb3NpdGlvbiAvPSBjbGlwUG9zaXRpb24udztcblxuICAvL0FwcGx5IHRleHQgb2Zmc2V0IGluIGNsaXAgY29vcmRpbmF0ZXNcbiAgY2xpcFBvc2l0aW9uICs9IHZlYzQodmlld09mZnNldCwgMCwgMCk7XG5cbiAgLy9Eb25lXG4gIGdsX1Bvc2l0aW9uID0gY2xpcFBvc2l0aW9uO1xufSIsInByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcbnVuaWZvcm0gdmVjNCBjb2xvcjtcbnZvaWQgbWFpbigpIHtcbiAgZ2xfRnJhZ0NvbG9yID0gY29sb3I7XG59IixudWxsLFt7bmFtZToicG9zaXRpb24iLHR5cGU6InZlYzMifV0pfTtyLmJnPWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsIiNkZWZpbmUgR0xTTElGWSAxXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbjtcbmF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDtcblxudW5pZm9ybSBtYXQ0IG1vZGVsLCB2aWV3LCBwcm9qZWN0aW9uO1xudW5pZm9ybSB2ZWMzIGVuYWJsZTtcbnVuaWZvcm0gdmVjMyBib3VuZHNbMl07XG5cbnZhcnlpbmcgdmVjMyBjb2xvckNoYW5uZWw7XG5cbnZvaWQgbWFpbigpIHtcbiAgaWYoZG90KG5vcm1hbCwgZW5hYmxlKSA+IDAuMCkge1xuICAgIHZlYzMgblBvc2l0aW9uID0gbWl4KGJvdW5kc1swXSwgYm91bmRzWzFdLCAwLjUgKiAocG9zaXRpb24gKyAxLjApKTtcbiAgICBnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb24gKiB2aWV3ICogbW9kZWwgKiB2ZWM0KG5Qb3NpdGlvbiwgMS4wKTtcbiAgfSBlbHNlIHtcbiAgICBnbF9Qb3NpdGlvbiA9IHZlYzQoMCwwLDAsMCk7XG4gIH1cbiAgY29sb3JDaGFubmVsID0gYWJzKG5vcm1hbCk7XG59IiwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzQgY29sb3JzWzNdO1xuXG52YXJ5aW5nIHZlYzMgY29sb3JDaGFubmVsO1xuXG52b2lkIG1haW4oKSB7XG4gIGdsX0ZyYWdDb2xvciA9IGNvbG9yQ2hhbm5lbC54ICogY29sb3JzWzBdICsgXG4gICAgICAgICAgICAgICAgIGNvbG9yQ2hhbm5lbC55ICogY29sb3JzWzFdICtcbiAgICAgICAgICAgICAgICAgY29sb3JDaGFubmVsLnogKiBjb2xvcnNbMl07XG59IixudWxsLFt7bmFtZToicG9zaXRpb24iLHR5cGU6InZlYzMifSx7bmFtZToibm9ybWFsIix0eXBlOiJ2ZWMzIn1dKX19LHsiZ2wtc2hhZGVyIjoyNTN9XSwxNTE6W2Z1bmN0aW9uKHQsZSxyKXsoZnVuY3Rpb24ocil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbil7dGhpcy5nbD10LHRoaXMuc2hhZGVyPWUsdGhpcy5idWZmZXI9cix0aGlzLnZhbz1uLHRoaXMudGlja09mZnNldD10aGlzLnRpY2tDb3VudD10aGlzLmxhYmVsT2Zmc2V0PXRoaXMubGFiZWxDb3VudD1udWxsfWZ1bmN0aW9uIGkodCxlKXt0cnl7cmV0dXJuIGwodCxlKX1jYXRjaCh0KXtyZXR1cm4gY29uc29sZS53YXJuKCJlcnJvciB2ZWN0b3JpemluZyB0ZXh0OiIsdCkse2NlbGxzOltdLHBvc2l0aW9uczpbXX19fWZ1bmN0aW9uIGEodCxlLHIsaSxhLGwpe3ZhciBjPW8odCksaD1zKHQsW3tidWZmZXI6YyxzaXplOjN9XSksZj11KHQpO2YuYXR0cmlidXRlcy5wb3NpdGlvbi5sb2NhdGlvbj0wO3ZhciBkPW5ldyBuKHQsZixjLGgpO3JldHVybiBkLnVwZGF0ZShlLHIsaSxhLGwpLGR9ZS5leHBvcnRzPWE7dmFyIG89dCgiZ2wtYnVmZmVyIikscz10KCJnbC12YW8iKSxsPXQoInZlY3Rvcml6ZS10ZXh0IiksdT10KCIuL3NoYWRlcnMiKS50ZXh0LGM9d2luZG93fHxyLmdsb2JhbHx8e30saD1jLl9fVEVYVF9DQUNIRXx8e307Yy5fX1RFWFRfQ0FDSEU9e307dmFyIGY9bi5wcm90b3R5cGUsZD1bMCwwXTtmLmJpbmQ9ZnVuY3Rpb24odCxlLHIsbil7dGhpcy52YW8uYmluZCgpLHRoaXMuc2hhZGVyLmJpbmQoKTt2YXIgaT10aGlzLnNoYWRlci51bmlmb3JtcztpLm1vZGVsPXQsaS52aWV3PWUsaS5wcm9qZWN0aW9uPXIsaS5waXhlbFNjYWxlPW4sZFswXT10aGlzLmdsLmRyYXdpbmdCdWZmZXJXaWR0aCxkWzFdPXRoaXMuZ2wuZHJhd2luZ0J1ZmZlckhlaWdodCx0aGlzLnNoYWRlci51bmlmb3Jtcy5yZXNvbHV0aW9uPWR9LGYudXBkYXRlPWZ1bmN0aW9uKHQsZSxyLG4sYSl7ZnVuY3Rpb24gbyh0LGUscixuKXt2YXIgYT1oW3JdO2F8fChhPWhbcl09e30pO3ZhciBvPWFbZV07b3x8KG89YVtlXT1pKGUse3RyaWFuZ2xlczohMCxmb250OnIsdGV4dEFsaWduOiJjZW50ZXIiLHRleHRCYXNlbGluZToibWlkZGxlIn0pKTtmb3IodmFyIGw9KG58fDEyKS8xMix1PW8ucG9zaXRpb25zLGM9by5jZWxscyxmPTAsZD1jLmxlbmd0aDtmPGQ7KytmKWZvcih2YXIgcD1jW2ZdLG09MjttPj0wOy0tbSl7dmFyIHY9dVtwW21dXTtzLnB1c2gobCp2WzBdLC1sKnZbMV0sdCl9fWZvcih2YXIgcz0odGhpcy5nbCxbXSksbD1bMCwwLDBdLHU9WzAsMCwwXSxjPVswLDAsMF0sZj1bMCwwLDBdLGQ9MDtkPDM7KytkKXtjW2RdPXMubGVuZ3RoLzN8MCxvKC41Kih0WzBdW2RdK3RbMV1bZF0pLGVbZF0sciksZltkXT0ocy5sZW5ndGgvM3wwKS1jW2RdLGxbZF09cy5sZW5ndGgvM3wwO2Zvcih2YXIgcD0wO3A8bltkXS5sZW5ndGg7KytwKW5bZF1bcF0udGV4dCYmbyhuW2RdW3BdLngsbltkXVtwXS50ZXh0LG5bZF1bcF0uZm9udHx8YSxuW2RdW3BdLmZvbnRTaXplfHwxMik7dVtkXT0ocy5sZW5ndGgvM3wwKS1sW2RdfXRoaXMuYnVmZmVyLnVwZGF0ZShzKSx0aGlzLnRpY2tPZmZzZXQ9bCx0aGlzLnRpY2tDb3VudD11LHRoaXMubGFiZWxPZmZzZXQ9Yyx0aGlzLmxhYmVsQ291bnQ9Zn07dmFyIHA9WzAsMCwwXTtmLmRyYXdUaWNrcz1mdW5jdGlvbih0LGUscixuLGkpe2lmKHRoaXMudGlja0NvdW50W3RdKXt2YXIgYT1wO2FbMF09YVsxXT1hWzJdPTAsYVt0XT0xLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmF4aXM9YSx0aGlzLnNoYWRlci51bmlmb3Jtcy5jb2xvcj1pLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmFuZ2xlPXIsdGhpcy5zaGFkZXIudW5pZm9ybXMuc2NhbGU9ZSx0aGlzLnNoYWRlci51bmlmb3Jtcy5vZmZzZXQ9bix0aGlzLnZhby5kcmF3KHRoaXMuZ2wuVFJJQU5HTEVTLHRoaXMudGlja0NvdW50W3RdLHRoaXMudGlja09mZnNldFt0XSl9fTt2YXIgbT1bMCwwLDBdO2YuZHJhd0xhYmVsPWZ1bmN0aW9uKHQsZSxyLG4saSl7dGhpcy5sYWJlbENvdW50W3RdJiYodGhpcy5zaGFkZXIudW5pZm9ybXMuYXhpcz1tLHRoaXMuc2hhZGVyLnVuaWZvcm1zLmNvbG9yPWksdGhpcy5zaGFkZXIudW5pZm9ybXMuYW5nbGU9cix0aGlzLnNoYWRlci51bmlmb3Jtcy5zY2FsZT1lLHRoaXMuc2hhZGVyLnVuaWZvcm1zLm9mZnNldD1uLHRoaXMudmFvLmRyYXcodGhpcy5nbC5UUklBTkdMRVMsdGhpcy5sYWJlbENvdW50W3RdLHRoaXMubGFiZWxPZmZzZXRbdF0pKX0sZi5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5zaGFkZXIuZGlzcG9zZSgpLHRoaXMudmFvLmRpc3Bvc2UoKSx0aGlzLmJ1ZmZlci5kaXNwb3NlKCl9fSkuY2FsbCh0aGlzLHQoIl9wcm9jZXNzIikpfSx7Ii4vc2hhZGVycyI6MTUwLF9wcm9jZXNzOjQ4NSwiZ2wtYnVmZmVyIjoxNTQsImdsLXZhbyI6MjY5LCJ2ZWN0b3JpemUtdGV4dCI6NTUyfV0sMTUyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXt2YXIgcj10KyIiLG49ci5pbmRleE9mKCIuIiksaT0wO24+PTAmJihpPXIubGVuZ3RoLW4tMSk7dmFyIGE9TWF0aC5wb3coMTAsaSksbz1NYXRoLnJvdW5kKHQqZSphKSxzPW8rIiI7aWYocy5pbmRleE9mKCJlIik+PTApcmV0dXJuIHM7dmFyIGw9by9hLHU9byVhO288MD8obD0wfC1NYXRoLmNlaWwobCksdT0wfC11KToobD0wfE1hdGguZmxvb3IobCksdXw9MCk7dmFyIGM9IiIrbDtpZihvPDAmJihjPSItIitjKSxpKXtmb3IodmFyIGg9IiIrdTtoLmxlbmd0aDxpOyloPSIwIitoO3JldHVybiBjKyIuIitofXJldHVybiBjfWZ1bmN0aW9uIGkodCxlKXtmb3IodmFyIHI9W10saT0wO2k8MzsrK2kpe2Zvcih2YXIgYT1bXSxvPSh0WzBdW2ldLHRbMV1baV0sMCk7byplW2ldPD10WzFdW2ldOysrbylhLnB1c2goe3g6byplW2ldLHRleHQ6bihlW2ldLG8pfSk7Zm9yKHZhciBvPS0xO28qZVtpXT49dFswXVtpXTstLW8pYS5wdXNoKHt4Om8qZVtpXSx0ZXh0Om4oZVtpXSxvKX0pO3IucHVzaChhKX1yZXR1cm4gcn1mdW5jdGlvbiBhKHQsZSl7Zm9yKHZhciByPTA7cjwzOysrcil7aWYodFtyXS5sZW5ndGghPT1lW3JdLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIG49MDtuPHRbcl0ubGVuZ3RoOysrbil7dmFyIGk9dFtyXVtuXSxhPWVbcl1bbl07aWYoaS54IT09YS54fHxpLnRleHQhPT1hLnRleHR8fGkuZm9udCE9PWEuZm9udHx8aS5mb250Q29sb3IhPT1hLmZvbnRDb2xvcnx8aS5mb250U2l6ZSE9PWEuZm9udFNpemV8fGkuZHghPT1hLmR4fHxpLmR5IT09YS5keSlyZXR1cm4hMX19cmV0dXJuITB9ci5jcmVhdGU9aSxyLmVxdWFsPWF9LHt9XSwxNTM6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscil7dGhpcy5sbz10LHRoaXMuaGk9ZSx0aGlzLnBpeGVsc1BlckRhdGFVbml0PXJ9ZnVuY3Rpb24gaSh0LGUscixuLGkpe2Zvcih2YXIgYT0wO2E8MzsrK2Epe2Zvcih2YXIgbz1wLHM9bSxsPTA7bDwzOysrbClzW2xdPW9bbF09cltsXTtzWzNdPW9bM109MSxzW2FdKz0xLGgocyxzLGUpLHNbM108MCYmKHRbYV09MS8wKSxvW2FdLT0xLGgobyxvLGUpLG9bM108MCYmKHRbYV09MS8wKTt2YXIgdT0ob1swXS9vWzNdLXNbMF0vc1szXSkqbixjPShvWzFdL29bM10tc1sxXS9zWzNdKSppO3RbYV09LjI1Kk1hdGguc3FydCh1KnUrYypjKX1yZXR1cm4gdH1mdW5jdGlvbiBhKHQsZSxyLG4sYSl7dmFyIGg9ZS5tb2RlbHx8ZixwPWUudmlld3x8ZixtPWUucHJvamVjdGlvbnx8Zix5PXQuYm91bmRzLGE9YXx8bChoLHAsbSx5KSxiPWEuYXhpczthLmVkZ2VzO3UoZCxwLGgpLHUoZCxtLGQpO2Zvcih2YXIgeD12LF89MDtfPDM7KytfKXhbX10ubG89MS8wLHhbX10uaGk9LTEvMCx4W19dLnBpeGVsc1BlckRhdGFVbml0PTEvMDt2YXIgdz1vKGMoZCxkKSk7YyhkLGQpO2Zvcih2YXIgTT0wO008MzsrK00pe3ZhciBrPShNKzEpJTMsQT0oTSsyKSUzLFQ9Zzt0OmZvcih2YXIgXz0wO188MjsrK18pe3ZhciBTPVtdO2lmKGJbTV08MCE9ISFfKXtUW01dPXlbX11bTV07Zm9yKHZhciBFPTA7RTwyOysrRSl7VFtrXT15W0VeX11ba107Zm9yKHZhciBMPTA7TDwyOysrTClUW0FdPXlbTF5FXl9dW0FdLFMucHVzaChULnNsaWNlKCkpfWZvcih2YXIgRT0wO0U8dy5sZW5ndGg7KytFKXtpZigwPT09Uy5sZW5ndGgpY29udGludWUgdDtTPXMucG9zaXRpdmUoUyx3W0VdKX1mb3IodmFyIEU9MDtFPFMubGVuZ3RoOysrRSlmb3IodmFyIEE9U1tFXSxDPWkoZyxkLEEscixuKSxMPTA7TDwzOysrTCl4W0xdLmxvPU1hdGgubWluKHhbTF0ubG8sQVtMXSkseFtMXS5oaT1NYXRoLm1heCh4W0xdLmhpLEFbTF0pLEwhPT1NJiYoeFtMXS5waXhlbHNQZXJEYXRhVW5pdD1NYXRoLm1pbih4W0xdLnBpeGVsc1BlckRhdGFVbml0LE1hdGguYWJzKENbTF0pKSl9fX1yZXR1cm4geH1lLmV4cG9ydHM9YTt2YXIgbz10KCJleHRyYWN0LWZydXN0dW0tcGxhbmVzIikscz10KCJzcGxpdC1wb2x5Z29uIiksbD10KCIuL2xpYi9jdWJlLmpzIiksdT10KCJnbC1tYXQ0L211bHRpcGx5IiksYz10KCJnbC1tYXQ0L3RyYW5zcG9zZSIpLGg9dCgiZ2wtdmVjNC90cmFuc2Zvcm1NYXQ0IiksZj1uZXcgRmxvYXQzMkFycmF5KFsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSksZD1uZXcgRmxvYXQzMkFycmF5KDE2KSxwPVswLDAsMCwxXSxtPVswLDAsMCwxXSx2PVtuZXcgbigxLzAsLTEvMCwxLzApLG5ldyBuKDEvMCwtMS8wLDEvMCksbmV3IG4oMS8wLC0xLzAsMS8wKV0sZz1bMCwwLDBdfSx7Ii4vbGliL2N1YmUuanMiOjE0OCwiZXh0cmFjdC1mcnVzdHVtLXBsYW5lcyI6MTI4LCJnbC1tYXQ0L211bHRpcGx5IjoxODEsImdsLW1hdDQvdHJhbnNwb3NlIjoxODksImdsLXZlYzQvdHJhbnNmb3JtTWF0NCI6Mjc1LCJzcGxpdC1wb2x5Z29uIjo1MjR9XSwxNTQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGkpe3RoaXMuZ2w9dCx0aGlzLnR5cGU9ZSx0aGlzLmhhbmRsZT1yLHRoaXMubGVuZ3RoPW4sdGhpcy51c2FnZT1pfWZ1bmN0aW9uIGkodCxlLHIsbixpLGEpe3ZhciBvPWkubGVuZ3RoKmkuQllURVNfUEVSX0VMRU1FTlQ7aWYoYTwwKXJldHVybiB0LmJ1ZmZlckRhdGEoZSxpLG4pLG87aWYobythPnIpdGhyb3cgbmV3IEVycm9yKCJnbC1idWZmZXI6IElmIHJlc2l6aW5nIGJ1ZmZlciwgbXVzdCBub3Qgc3BlY2lmeSBvZmZzZXQiKTtyZXR1cm4gdC5idWZmZXJTdWJEYXRhKGUsYSxpKSxyfWZ1bmN0aW9uIGEodCxlKXtmb3IodmFyIHI9bC5tYWxsb2ModC5sZW5ndGgsZSksbj10Lmxlbmd0aCxpPTA7aTxuOysraSlyW2ldPXRbaV07cmV0dXJuIHJ9ZnVuY3Rpb24gbyh0LGUpe2Zvcih2YXIgcj0xLG49ZS5sZW5ndGgtMTtuPj0wOy0tbil7aWYoZVtuXSE9PXIpcmV0dXJuITE7cio9dFtuXX1yZXR1cm4hMH1mdW5jdGlvbiBzKHQsZSxyLGkpe2lmKHI9cnx8dC5BUlJBWV9CVUZGRVIsaT1pfHx0LkRZTkFNSUNfRFJBVyxyIT09dC5BUlJBWV9CVUZGRVImJnIhPT10LkVMRU1FTlRfQVJSQVlfQlVGRkVSKXRocm93IG5ldyBFcnJvcigiZ2wtYnVmZmVyOiBJbnZhbGlkIHR5cGUgZm9yIHdlYmdsIGJ1ZmZlciwgbXVzdCBiZSBlaXRoZXIgZ2wuQVJSQVlfQlVGRkVSIG9yIGdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSIik7aWYoaSE9PXQuRFlOQU1JQ19EUkFXJiZpIT09dC5TVEFUSUNfRFJBVyYmaSE9PXQuU1RSRUFNX0RSQVcpdGhyb3cgbmV3IEVycm9yKCJnbC1idWZmZXI6IEludmFsaWQgdXNhZ2UgZm9yIGJ1ZmZlciwgbXVzdCBiZSBlaXRoZXIgZ2wuRFlOQU1JQ19EUkFXLCBnbC5TVEFUSUNfRFJBVyBvciBnbC5TVFJFQU1fRFJBVyIpO3ZhciBhPXQuY3JlYXRlQnVmZmVyKCksbz1uZXcgbih0LHIsYSwwLGkpO3JldHVybiBvLnVwZGF0ZShlKSxvfXZhciBsPXQoInR5cGVkYXJyYXktcG9vbCIpLHU9dCgibmRhcnJheS1vcHMiKSxjPXQoIm5kYXJyYXkiKSxoPVsidWludDgiLCJ1aW50OF9jbGFtcGVkIiwidWludDE2IiwidWludDMyIiwiaW50OCIsImludDE2IiwiaW50MzIiLCJmbG9hdDMyIl0sZj1uLnByb3RvdHlwZTtmLmJpbmQ9ZnVuY3Rpb24oKXt0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy50eXBlLHRoaXMuaGFuZGxlKX0sZi51bmJpbmQ9ZnVuY3Rpb24oKXt0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy50eXBlLG51bGwpfSxmLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmdsLmRlbGV0ZUJ1ZmZlcih0aGlzLmhhbmRsZSl9LGYudXBkYXRlPWZ1bmN0aW9uKHQsZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlJiYoZT0tMSksdGhpcy5iaW5kKCksIm9iamVjdCI9PXR5cGVvZiB0JiZ2b2lkIDAhPT10LnNoYXBlKXt2YXIgcj10LmR0eXBlO2lmKGguaW5kZXhPZihyKTwwJiYocj0iZmxvYXQzMiIpLHRoaXMudHlwZT09PXRoaXMuZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIpe3I9Z2wuZ2V0RXh0ZW5zaW9uKCJPRVNfZWxlbWVudF9pbmRleF91aW50IikmJiJ1aW50MTYiIT09cj8idWludDMyIjoidWludDE2In1pZihyPT09dC5kdHlwZSYmbyh0LnNoYXBlLHQuc3RyaWRlKSkwPT09dC5vZmZzZXQmJnQuZGF0YS5sZW5ndGg9PT10LnNoYXBlWzBdP3RoaXMubGVuZ3RoPWkodGhpcy5nbCx0aGlzLnR5cGUsdGhpcy5sZW5ndGgsdGhpcy51c2FnZSx0LmRhdGEsZSk6dGhpcy5sZW5ndGg9aSh0aGlzLmdsLHRoaXMudHlwZSx0aGlzLmxlbmd0aCx0aGlzLnVzYWdlLHQuZGF0YS5zdWJhcnJheSh0Lm9mZnNldCx0LnNoYXBlWzBdKSxlKTtlbHNle3ZhciBuPWwubWFsbG9jKHQuc2l6ZSxyKSxzPWMobix0LnNoYXBlKTt1LmFzc2lnbihzLHQpLHRoaXMubGVuZ3RoPWU8MD9pKHRoaXMuZ2wsdGhpcy50eXBlLHRoaXMubGVuZ3RoLHRoaXMudXNhZ2UsbixlKTppKHRoaXMuZ2wsdGhpcy50eXBlLHRoaXMubGVuZ3RoLHRoaXMudXNhZ2Usbi5zdWJhcnJheSgwLHQuc2l6ZSksZSksbC5mcmVlKG4pfX1lbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciBmO2Y9dGhpcy50eXBlPT09dGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUj9hKHQsInVpbnQxNiIpOmEodCwiZmxvYXQzMiIpLHRoaXMubGVuZ3RoPWU8MD9pKHRoaXMuZ2wsdGhpcy50eXBlLHRoaXMubGVuZ3RoLHRoaXMudXNhZ2UsZixlKTppKHRoaXMuZ2wsdGhpcy50eXBlLHRoaXMubGVuZ3RoLHRoaXMudXNhZ2UsZi5zdWJhcnJheSgwLHQubGVuZ3RoKSxlKSxsLmZyZWUoZil9ZWxzZSBpZigib2JqZWN0Ij09dHlwZW9mIHQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpdGhpcy5sZW5ndGg9aSh0aGlzLmdsLHRoaXMudHlwZSx0aGlzLmxlbmd0aCx0aGlzLnVzYWdlLHQsZSk7ZWxzZXtpZigibnVtYmVyIiE9dHlwZW9mIHQmJnZvaWQgMCE9PXQpdGhyb3cgbmV3IEVycm9yKCJnbC1idWZmZXI6IEludmFsaWQgZGF0YSB0eXBlIik7aWYoZT49MCl0aHJvdyBuZXcgRXJyb3IoImdsLWJ1ZmZlcjogQ2Fubm90IHNwZWNpZnkgb2Zmc2V0IHdoZW4gcmVzaXppbmcgYnVmZmVyIik7dHw9MCx0PD0wJiYodD0xKSx0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy50eXBlLDB8dCx0aGlzLnVzYWdlKSx0aGlzLmxlbmd0aD10fX0sZS5leHBvcnRzPXN9LHtuZGFycmF5OjQ2NSwibmRhcnJheS1vcHMiOjQ1OSwidHlwZWRhcnJheS1wb29sIjo1Mzl9XSwxNTU6W2Z1bmN0aW9uKHQsZSxyKXtlLmV4cG9ydHM9ezA6Ik5PTkUiLDE6Ik9ORSIsMjoiTElORV9MT09QIiwzOiJMSU5FX1NUUklQIiw0OiJUUklBTkdMRVMiLDU6IlRSSUFOR0xFX1NUUklQIiw2OiJUUklBTkdMRV9GQU4iLDI1NjoiREVQVEhfQlVGRkVSX0JJVCIsNTEyOiJORVZFUiIsNTEzOiJMRVNTIiw1MTQ6IkVRVUFMIiw1MTU6IkxFUVVBTCIsNTE2OiJHUkVBVEVSIiw1MTc6Ik5PVEVRVUFMIiw1MTg6IkdFUVVBTCIsNTE5OiJBTFdBWVMiLDc2ODoiU1JDX0NPTE9SIiw3Njk6Ik9ORV9NSU5VU19TUkNfQ09MT1IiLDc3MDoiU1JDX0FMUEhBIiw3NzE6Ik9ORV9NSU5VU19TUkNfQUxQSEEiLDc3MjoiRFNUX0FMUEhBIiw3NzM6Ik9ORV9NSU5VU19EU1RfQUxQSEEiLDc3NDoiRFNUX0NPTE9SIiw3NzU6Ik9ORV9NSU5VU19EU1RfQ09MT1IiLDc3NjoiU1JDX0FMUEhBX1NBVFVSQVRFIiwxMDI0OiJTVEVOQ0lMX0JVRkZFUl9CSVQiLDEwMjg6IkZST05UIiwxMDI5OiJCQUNLIiwxMDMyOiJGUk9OVF9BTkRfQkFDSyIsMTI4MDoiSU5WQUxJRF9FTlVNIiwxMjgxOiJJTlZBTElEX1ZBTFVFIiwxMjgyOiJJTlZBTElEX09QRVJBVElPTiIsMTI4NToiT1VUX09GX01FTU9SWSIsMTI4NjoiSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04iLDIzMDQ6IkNXIiwyMzA1OiJDQ1ciLDI4NDk6IkxJTkVfV0lEVEgiLDI4ODQ6IkNVTExfRkFDRSIsMjg4NToiQ1VMTF9GQUNFX01PREUiLDI4ODY6IkZST05UX0ZBQ0UiLDI5Mjg6IkRFUFRIX1JBTkdFIiwyOTI5OiJERVBUSF9URVNUIiwyOTMwOiJERVBUSF9XUklURU1BU0siLDI5MzE6IkRFUFRIX0NMRUFSX1ZBTFVFIiwyOTMyOiJERVBUSF9GVU5DIiwyOTYwOiJTVEVOQ0lMX1RFU1QiLDI5NjE6IlNURU5DSUxfQ0xFQVJfVkFMVUUiLDI5NjI6IlNURU5DSUxfRlVOQyIsMjk2MzoiU1RFTkNJTF9WQUxVRV9NQVNLIiwyOTY0OiJTVEVOQ0lMX0ZBSUwiLDI5NjU6IlNURU5DSUxfUEFTU19ERVBUSF9GQUlMIiwyOTY2OiJTVEVOQ0lMX1BBU1NfREVQVEhfUEFTUyIsMjk2NzoiU1RFTkNJTF9SRUYiLDI5Njg6IlNURU5DSUxfV1JJVEVNQVNLIiwyOTc4OiJWSUVXUE9SVCIsMzAyNDoiRElUSEVSIiwzMDQyOiJCTEVORCIsMzA4ODoiU0NJU1NPUl9CT1giLDMwODk6IlNDSVNTT1JfVEVTVCIsMzEwNjoiQ09MT1JfQ0xFQVJfVkFMVUUiLDMxMDc6IkNPTE9SX1dSSVRFTUFTSyIsMzMxNzoiVU5QQUNLX0FMSUdOTUVOVCIsMzMzMzoiUEFDS19BTElHTk1FTlQiLDMzNzk6Ik1BWF9URVhUVVJFX1NJWkUiLDMzODY6Ik1BWF9WSUVXUE9SVF9ESU1TIiwzNDA4OiJTVUJQSVhFTF9CSVRTIiwzNDEwOiJSRURfQklUUyIsMzQxMToiR1JFRU5fQklUUyIsMzQxMjoiQkxVRV9CSVRTIiwzNDEzOiJBTFBIQV9CSVRTIiwzNDE0OiJERVBUSF9CSVRTIiwzNDE1OiJTVEVOQ0lMX0JJVFMiLDM1NTM6IlRFWFRVUkVfMkQiLDQzNTI6IkRPTlRfQ0FSRSIsNDM1MzoiRkFTVEVTVCIsNDM1NDoiTklDRVNUIiw1MTIwOiJCWVRFIiw1MTIxOiJVTlNJR05FRF9CWVRFIiw1MTIyOiJTSE9SVCIsNTEyMzoiVU5TSUdORURfU0hPUlQiLDUxMjQ6IklOVCIsNTEyNToiVU5TSUdORURfSU5UIiw1MTI2OiJGTE9BVCIsNTM4NjoiSU5WRVJUIiw1ODkwOiJURVhUVVJFIiw2NDAxOiJTVEVOQ0lMX0lOREVYIiw2NDAyOiJERVBUSF9DT01QT05FTlQiLDY0MDY6IkFMUEhBIiw2NDA3OiJSR0IiLDY0MDg6IlJHQkEiLDY0MDk6IkxVTUlOQU5DRSIsNjQxMDoiTFVNSU5BTkNFX0FMUEhBIiw3NjgwOiJLRUVQIiw3NjgxOiJSRVBMQUNFIiw3NjgyOiJJTkNSIiw3NjgzOiJERUNSIiw3OTM2OiJWRU5ET1IiLDc5Mzc6IlJFTkRFUkVSIiw3OTM4OiJWRVJTSU9OIiw5NzI4OiJORUFSRVNUIiw5NzI5OiJMSU5FQVIiLDk5ODQ6Ik5FQVJFU1RfTUlQTUFQX05FQVJFU1QiLDk5ODU6IkxJTkVBUl9NSVBNQVBfTkVBUkVTVCIsOTk4NjoiTkVBUkVTVF9NSVBNQVBfTElORUFSIiw5OTg3OiJMSU5FQVJfTUlQTUFQX0xJTkVBUiIsMTAyNDA6IlRFWFRVUkVfTUFHX0ZJTFRFUiIsMTAyNDE6IlRFWFRVUkVfTUlOX0ZJTFRFUiIsMTAyNDI6IlRFWFRVUkVfV1JBUF9TIiwxMDI0MzoiVEVYVFVSRV9XUkFQX1QiLDEwNDk3OiJSRVBFQVQiLDEwNzUyOiJQT0xZR09OX09GRlNFVF9VTklUUyIsMTYzODQ6IkNPTE9SX0JVRkZFUl9CSVQiLDMyNzY5OiJDT05TVEFOVF9DT0xPUiIsMzI3NzA6Ik9ORV9NSU5VU19DT05TVEFOVF9DT0xPUiIsMzI3NzE6IkNPTlNUQU5UX0FMUEhBIiwzMjc3MjoiT05FX01JTlVTX0NPTlNUQU5UX0FMUEhBIiwzMjc3MzoiQkxFTkRfQ09MT1IiLDMyNzc0OiJGVU5DX0FERCIsMzI3Nzc6IkJMRU5EX0VRVUFUSU9OX1JHQiIsMzI3Nzg6IkZVTkNfU1VCVFJBQ1QiLDMyNzc5OiJGVU5DX1JFVkVSU0VfU1VCVFJBQ1QiLDMyODE5OiJVTlNJR05FRF9TSE9SVF80XzRfNF80IiwzMjgyMDoiVU5TSUdORURfU0hPUlRfNV81XzVfMSIsMzI4MjM6IlBPTFlHT05fT0ZGU0VUX0ZJTEwiLDMyODI0OiJQT0xZR09OX09GRlNFVF9GQUNUT1IiLDMyODU0OiJSR0JBNCIsMzI4NTU6IlJHQjVfQTEiLDMyODczOiJURVhUVVJFX0JJTkRJTkdfMkQiLDMyOTI2OiJTQU1QTEVfQUxQSEFfVE9fQ09WRVJBR0UiLDMyOTI4OiJTQU1QTEVfQ09WRVJBR0UiLDMyOTM2OiJTQU1QTEVfQlVGRkVSUyIsMzI5Mzc6IlNBTVBMRVMiLDMyOTM4OiJTQU1QTEVfQ09WRVJBR0VfVkFMVUUiLDMyOTM5OiJTQU1QTEVfQ09WRVJBR0VfSU5WRVJUIiwzMjk2ODoiQkxFTkRfRFNUX1JHQiIsMzI5Njk6IkJMRU5EX1NSQ19SR0IiLDMyOTcwOiJCTEVORF9EU1RfQUxQSEEiLDMyOTcxOiJCTEVORF9TUkNfQUxQSEEiLDMzMDcxOiJDTEFNUF9UT19FREdFIiwzMzE3MDoiR0VORVJBVEVfTUlQTUFQX0hJTlQiLDMzMTg5OiJERVBUSF9DT01QT05FTlQxNiIsMzMzMDY6IkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCIsMzM2MzU6IlVOU0lHTkVEX1NIT1JUXzVfNl81IiwzMzY0ODoiTUlSUk9SRURfUkVQRUFUIiwzMzkwMToiQUxJQVNFRF9QT0lOVF9TSVpFX1JBTkdFIiwzMzkwMjoiQUxJQVNFRF9MSU5FX1dJRFRIX1JBTkdFIiwzMzk4NDoiVEVYVFVSRTAiLDMzOTg1OiJURVhUVVJFMSIsMzM5ODY6IlRFWFRVUkUyIiwzMzk4NzoiVEVYVFVSRTMiLDMzOTg4OiJURVhUVVJFNCIsMzM5ODk6IlRFWFRVUkU1IiwzMzk5MDoiVEVYVFVSRTYiLDMzOTkxOiJURVhUVVJFNyIsMzM5OTI6IlRFWFRVUkU4IiwzMzk5MzoiVEVYVFVSRTkiLDMzOTk0OiJURVhUVVJFMTAiLDMzOTk1OiJURVhUVVJFMTEiLDMzOTk2OiJURVhUVVJFMTIiLDMzOTk3OiJURVhUVVJFMTMiLDMzOTk4OiJURVhUVVJFMTQiLDMzOTk5OiJURVhUVVJFMTUiLDM0ZTM6IlRFWFRVUkUxNiIsMzQwMDE6IlRFWFRVUkUxNyIsMzQwMDI6IlRFWFRVUkUxOCIsMzQwMDM6IlRFWFRVUkUxOSIsMzQwMDQ6IlRFWFRVUkUyMCIsMzQwMDU6IlRFWFRVUkUyMSIsMzQwMDY6IlRFWFRVUkUyMiIsMzQwMDc6IlRFWFRVUkUyMyIsMzQwMDg6IlRFWFRVUkUyNCIsMzQwMDk6IlRFWFRVUkUyNSIsMzQwMTA6IlRFWFRVUkUyNiIsMzQwMTE6IlRFWFRVUkUyNyIsMzQwMTI6IlRFWFRVUkUyOCIsMzQwMTM6IlRFWFRVUkUyOSIsMzQwMTQ6IlRFWFRVUkUzMCIsMzQwMTU6IlRFWFRVUkUzMSIsMzQwMTY6IkFDVElWRV9URVhUVVJFIiwzNDAyNDoiTUFYX1JFTkRFUkJVRkZFUl9TSVpFIiwzNDA0MToiREVQVEhfU1RFTkNJTCIsMzQwNTU6IklOQ1JfV1JBUCIsMzQwNTY6IkRFQ1JfV1JBUCIsMzQwNjc6IlRFWFRVUkVfQ1VCRV9NQVAiLDM0MDY4OiJURVhUVVJFX0JJTkRJTkdfQ1VCRV9NQVAiLDM0MDY5OiJURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1giLDM0MDcwOiJURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1giLDM0MDcxOiJURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1kiLDM0MDcyOiJURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1kiLDM0MDczOiJURVhUVVJFX0NVQkVfTUFQX1BPU0lUSVZFX1oiLDM0MDc0OiJURVhUVVJFX0NVQkVfTUFQX05FR0FUSVZFX1oiLDM0MDc2OiJNQVhfQ1VCRV9NQVBfVEVYVFVSRV9TSVpFIiwzNDMzODoiVkVSVEVYX0FUVFJJQl9BUlJBWV9FTkFCTEVEIiwzNDMzOToiVkVSVEVYX0FUVFJJQl9BUlJBWV9TSVpFIiwzNDM0MDoiVkVSVEVYX0FUVFJJQl9BUlJBWV9TVFJJREUiLDM0MzQxOiJWRVJURVhfQVRUUklCX0FSUkFZX1RZUEUiLDM0MzQyOiJDVVJSRU5UX1ZFUlRFWF9BVFRSSUIiLDM0MzczOiJWRVJURVhfQVRUUklCX0FSUkFZX1BPSU5URVIiLDM0NDY2OiJOVU1fQ09NUFJFU1NFRF9URVhUVVJFX0ZPUk1BVFMiLDM0NDY3OiJDT01QUkVTU0VEX1RFWFRVUkVfRk9STUFUUyIsMzQ2NjA6IkJVRkZFUl9TSVpFIiwzNDY2MToiQlVGRkVSX1VTQUdFIiwzNDgxNjoiU1RFTkNJTF9CQUNLX0ZVTkMiLDM0ODE3OiJTVEVOQ0lMX0JBQ0tfRkFJTCIsMzQ4MTg6IlNURU5DSUxfQkFDS19QQVNTX0RFUFRIX0ZBSUwiLDM0ODE5OiJTVEVOQ0lMX0JBQ0tfUEFTU19ERVBUSF9QQVNTIiwzNDg3NzoiQkxFTkRfRVFVQVRJT05fQUxQSEEiLDM0OTIxOiJNQVhfVkVSVEVYX0FUVFJJQlMiLDM0OTIyOiJWRVJURVhfQVRUUklCX0FSUkFZX05PUk1BTElaRUQiLDM0OTMwOiJNQVhfVEVYVFVSRV9JTUFHRV9VTklUUyIsMzQ5NjI6IkFSUkFZX0JVRkZFUiIsMzQ5NjM6IkVMRU1FTlRfQVJSQVlfQlVGRkVSIiwzNDk2NDoiQVJSQVlfQlVGRkVSX0JJTkRJTkciLDM0OTY1OiJFTEVNRU5UX0FSUkFZX0JVRkZFUl9CSU5ESU5HIiwzNDk3NToiVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORyIsMzUwNDA6IlNUUkVBTV9EUkFXIiwzNTA0NDoiU1RBVElDX0RSQVciLDM1MDQ4OiJEWU5BTUlDX0RSQVciLDM1NjMyOiJGUkFHTUVOVF9TSEFERVIiLDM1NjMzOiJWRVJURVhfU0hBREVSIiwzNTY2MDoiTUFYX1ZFUlRFWF9URVhUVVJFX0lNQUdFX1VOSVRTIiwzNTY2MToiTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMiLDM1NjYzOiJTSEFERVJfVFlQRSIsMzU2NjQ6IkZMT0FUX1ZFQzIiLDM1NjY1OiJGTE9BVF9WRUMzIiwzNTY2NjoiRkxPQVRfVkVDNCIsMzU2Njc6IklOVF9WRUMyIiwzNTY2ODoiSU5UX1ZFQzMiLDM1NjY5OiJJTlRfVkVDNCIsMzU2NzA6IkJPT0wiLDM1NjcxOiJCT09MX1ZFQzIiLDM1NjcyOiJCT09MX1ZFQzMiLDM1NjczOiJCT09MX1ZFQzQiLDM1Njc0OiJGTE9BVF9NQVQyIiwzNTY3NToiRkxPQVRfTUFUMyIsMzU2NzY6IkZMT0FUX01BVDQiLDM1Njc4OiJTQU1QTEVSXzJEIiwzNTY4MDoiU0FNUExFUl9DVUJFIiwzNTcxMjoiREVMRVRFX1NUQVRVUyIsMzU3MTM6IkNPTVBJTEVfU1RBVFVTIiwzNTcxNDoiTElOS19TVEFUVVMiLDM1NzE1OiJWQUxJREFURV9TVEFUVVMiLDM1NzE2OiJJTkZPX0xPR19MRU5HVEgiLDM1NzE3OiJBVFRBQ0hFRF9TSEFERVJTIiwzNTcxODoiQUNUSVZFX1VOSUZPUk1TIiwzNTcxOToiQUNUSVZFX1VOSUZPUk1fTUFYX0xFTkdUSCIsMzU3MjA6IlNIQURFUl9TT1VSQ0VfTEVOR1RIIiwzNTcyMToiQUNUSVZFX0FUVFJJQlVURVMiLDM1NzIyOiJBQ1RJVkVfQVRUUklCVVRFX01BWF9MRU5HVEgiLDM1NzI0OiJTSEFESU5HX0xBTkdVQUdFX1ZFUlNJT04iLDM1NzI1OiJDVVJSRU5UX1BST0dSQU0iLDM2MDAzOiJTVEVOQ0lMX0JBQ0tfUkVGIiwzNjAwNDoiU1RFTkNJTF9CQUNLX1ZBTFVFX01BU0siLDM2MDA1OiJTVEVOQ0lMX0JBQ0tfV1JJVEVNQVNLIiwzNjAwNjoiRlJBTUVCVUZGRVJfQklORElORyIsMzYwMDc6IlJFTkRFUkJVRkZFUl9CSU5ESU5HIiwzNjA0ODoiRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRSIsMzYwNDk6IkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUUiLDM2MDUwOiJGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUwiLDM2MDUxOiJGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRSIsMzYwNTM6IkZSQU1FQlVGRkVSX0NPTVBMRVRFIiwzNjA1NDoiRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UIiwzNjA1NToiRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQiLDM2MDU3OiJGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMiLDM2MDYxOiJGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCIsMzYwNjQ6IkNPTE9SX0FUVEFDSE1FTlQwIiwzNjA5NjoiREVQVEhfQVRUQUNITUVOVCIsMzYxMjg6IlNURU5DSUxfQVRUQUNITUVOVCIsMzYxNjA6IkZSQU1FQlVGRkVSIiwzNjE2MToiUkVOREVSQlVGRkVSIiwzNjE2MjoiUkVOREVSQlVGRkVSX1dJRFRIIiwzNjE2MzoiUkVOREVSQlVGRkVSX0hFSUdIVCIsMzYxNjQ6IlJFTkRFUkJVRkZFUl9JTlRFUk5BTF9GT1JNQVQiLDM2MTY4OiJTVEVOQ0lMX0lOREVYOCIsMzYxNzY6IlJFTkRFUkJVRkZFUl9SRURfU0laRSIsMzYxNzc6IlJFTkRFUkJVRkZFUl9HUkVFTl9TSVpFIiwzNjE3ODoiUkVOREVSQlVGRkVSX0JMVUVfU0laRSIsMzYxNzk6IlJFTkRFUkJVRkZFUl9BTFBIQV9TSVpFIiwzNjE4MDoiUkVOREVSQlVGRkVSX0RFUFRIX1NJWkUiLDM2MTgxOiJSRU5ERVJCVUZGRVJfU1RFTkNJTF9TSVpFIiwzNjE5NDoiUkdCNTY1IiwzNjMzNjoiTE9XX0ZMT0FUIiwzNjMzNzoiTUVESVVNX0ZMT0FUIiwzNjMzODoiSElHSF9GTE9BVCIsMzYzMzk6IkxPV19JTlQiLDM2MzQwOiJNRURJVU1fSU5UIiwzNjM0MToiSElHSF9JTlQiLDM2MzQ2OiJTSEFERVJfQ09NUElMRVIiLDM2MzQ3OiJNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUyIsMzYzNDg6Ik1BWF9WQVJZSU5HX1ZFQ1RPUlMiLDM2MzQ5OiJNQVhfRlJBR01FTlRfVU5JRk9STV9WRUNUT1JTIiwzNzQ0MDoiVU5QQUNLX0ZMSVBfWV9XRUJHTCIsMzc0NDE6IlVOUEFDS19QUkVNVUxUSVBMWV9BTFBIQV9XRUJHTCIsMzc0NDI6IkNPTlRFWFRfTE9TVF9XRUJHTCIsMzc0NDM6IlVOUEFDS19DT0xPUlNQQUNFX0NPTlZFUlNJT05fV0VCR0wiLDM3NDQ0OiJCUk9XU0VSX0RFRkFVTFRfV0VCR0wifX0se31dLDE1NjpbZnVuY3Rpb24odCxlLHIpe3ZhciBuPXQoIi4vMS4wL251bWJlcnMiKTtlLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG5bdF19fSx7Ii4vMS4wL251bWJlcnMiOjE1NX1dLDE1NzpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBuKHQsZSxyLG4pe3RoaXMucGxvdD10LHRoaXMuc2hhZGVyPWUsdGhpcy5idWZmZXJIaT1yLHRoaXMuYnVmZmVyTG89bix0aGlzLmJvdW5kcz1bMS8wLDEvMCwtMS8wLC0xLzBdLHRoaXMubnVtUG9pbnRzPTAsdGhpcy5jb2xvcj1bMCwwLDAsMV19ZnVuY3Rpb24gaSh0LGUpe3ZhciByPWEodC5nbCxsLnZlcnRleCxsLmZyYWdtZW50KSxpPW8odC5nbCkscz1vKHQuZ2wpLHU9bmV3IG4odCxyLGkscyk7cmV0dXJuIHUudXBkYXRlKGUpLHQuYWRkT2JqZWN0KHUpLHV9dmFyIGE9dCgiZ2wtc2hhZGVyIiksbz10KCJnbC1idWZmZXIiKSxzPXQoInR5cGVkYXJyYXktcG9vbCIpLGw9dCgiLi9saWIvc2hhZGVycyIpO2UuZXhwb3J0cz1pO3ZhciB1PVtbMSwwLDAsMSwwLDBdLFsxLDAsMCwtMSwwLDBdLFstMSwwLDAsLTEsMCwwXSxbLTEsMCwwLC0xLDAsMF0sWy0xLDAsMCwxLDAsMF0sWzEsMCwwLDEsMCwwXSxbMSwwLC0xLDAsMCwxXSxbMSwwLC0xLDAsMCwtMV0sWzEsMCwxLDAsMCwtMV0sWzEsMCwxLDAsMCwtMV0sWzEsMCwxLDAsMCwxXSxbMSwwLC0xLDAsMCwxXSxbLTEsMCwtMSwwLDAsMV0sWy0xLDAsLTEsMCwwLC0xXSxbLTEsMCwxLDAsMCwtMV0sWy0xLDAsMSwwLDAsLTFdLFstMSwwLDEsMCwwLDFdLFstMSwwLC0xLDAsMCwxXSxbMCwxLDEsMCwwLDBdLFswLDEsLTEsMCwwLDBdLFswLC0xLC0xLDAsMCwwXSxbMCwtMSwtMSwwLDAsMF0sWzAsMSwxLDAsMCwwXSxbMCwtMSwxLDAsMCwwXSxbMCwxLDAsLTEsMSwwXSxbMCwxLDAsLTEsLTEsMF0sWzAsMSwwLDEsLTEsMF0sWzAsMSwwLDEsMSwwXSxbMCwxLDAsLTEsMSwwXSxbMCwxLDAsMSwtMSwwXSxbMCwtMSwwLC0xLDEsMF0sWzAsLTEsMCwtMSwtMSwwXSxbMCwtMSwwLDEsLTEsMF0sWzAsLTEsMCwxLDEsMF0sWzAsLTEsMCwtMSwxLDBdLFswLC0xLDAsMSwtMSwwXV0sYz1uLnByb3RvdHlwZTtjLmRyYXc9ZnVuY3Rpb24oKXt2YXIgdD1uZXcgRmxvYXQzMkFycmF5KFswLDBdKSxlPW5ldyBGbG9hdDMyQXJyYXkoWzAsMF0pLHI9bmV3IEZsb2F0MzJBcnJheShbMCwwXSksbj1uZXcgRmxvYXQzMkFycmF5KFswLDBdKSxpPVsxLDFdO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXRoaXMucGxvdCxvPXRoaXMuc2hhZGVyLHM9dGhpcy5ib3VuZHMsbD10aGlzLm51bVBvaW50cztpZihsKXt2YXIgYz1hLmdsLGg9YS5kYXRhQm94LGY9YS52aWV3Qm94LGQ9YS5waXhlbFJhdGlvLHA9c1syXS1zWzBdLG09c1szXS1zWzFdLHY9aFsyXS1oWzBdLGc9aFszXS1oWzFdLHk9MipwL3YsYj0yKm0vZyx4PShzWzBdLWhbMF0tLjUqdikvcCxfPShzWzFdLWhbMV0tLjUqZykvbTt0WzBdPXksdFsxXT1iLGVbMF09eS10WzBdLGVbMV09Yi10WzFdLHJbMF09eCxyWzFdPV8sblswXT14LXJbMF0sblsxXT1fLXJbMV07dmFyIHc9ZlsyXS1mWzBdLE09ZlszXS1mWzFdO2lbMF09MipkL3csaVsxXT0yKmQvTSxvLmJpbmQoKSxvLnVuaWZvcm1zLnNjYWxlSGk9dCxvLnVuaWZvcm1zLnNjYWxlTG89ZSxvLnVuaWZvcm1zLnRyYW5zbGF0ZUhpPXIsby51bmlmb3Jtcy50cmFuc2xhdGVMbz1uLG8udW5pZm9ybXMucGl4ZWxTY2FsZT1pLG8udW5pZm9ybXMuY29sb3I9dGhpcy5jb2xvcix0aGlzLmJ1ZmZlckxvLmJpbmQoKSxvLmF0dHJpYnV0ZXMucG9zaXRpb25Mby5wb2ludGVyKGMuRkxPQVQsITEsMTYsMCksdGhpcy5idWZmZXJIaS5iaW5kKCksby5hdHRyaWJ1dGVzLnBvc2l0aW9uSGkucG9pbnRlcihjLkZMT0FULCExLDE2LDApLG8uYXR0cmlidXRlcy5waXhlbE9mZnNldC5wb2ludGVyKGMuRkxPQVQsITEsMTYsOCksYy5kcmF3QXJyYXlzKGMuVFJJQU5HTEVTLDAsbCp1Lmxlbmd0aCl9fX0oKSxjLmRyYXdQaWNrPWZ1bmN0aW9uKHQpe3JldHVybiB0fSxjLnBpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sYy51cGRhdGU9ZnVuY3Rpb24odCl7dD10fHx7fTt2YXIgZSxyLG4saT10LnBvc2l0aW9uc3x8W10sYT10LmVycm9yc3x8W10sbz0xOyJsaW5lV2lkdGgiaW4gdCYmKG89K3QubGluZVdpZHRoKTt2YXIgbD01OyJjYXBTaXplImluIHQmJihsPSt0LmNhcFNpemUpLHRoaXMuY29sb3I9KHQuY29sb3J8fFswLDAsMCwxXSkuc2xpY2UoKTt2YXIgYz10aGlzLmJvdW5kcz1bMS8wLDEvMCwtMS8wLC0xLzBdLGg9dGhpcy5udW1Qb2ludHM9aS5sZW5ndGg+PjE7Zm9yKGU9MDtlPGg7KytlKXI9aVsyKmVdLG49aVsyKmUrMV0sY1swXT1NYXRoLm1pbihyLGNbMF0pLGNbMV09TWF0aC5taW4obixjWzFdKSxjWzJdPU1hdGgubWF4KHIsY1syXSksY1szXT1NYXRoLm1heChuLGNbM10pO2NbMl09PT1jWzBdJiYoY1syXSs9MSksY1szXT09PWNbMV0mJihjWzNdKz0xKTt2YXIgZj0xLyhjWzJdLWNbMF0pLGQ9MS8oY1szXS1jWzFdKSxwPWNbMF0sbT1jWzFdLHY9cy5tYWxsb2NGbG9hdDY0KGgqdS5sZW5ndGgqNCksZz1zLm1hbGxvY0Zsb2F0MzIoaCp1Lmxlbmd0aCo0KSx5PXMubWFsbG9jRmxvYXQzMihoKnUubGVuZ3RoKjQpLGI9MDtmb3IoZT0wO2U8aDsrK2Upe3I9aVsyKmVdLG49aVsyKmUrMV07Zm9yKHZhciB4PWFbNCplXSxfPWFbNCplKzFdLHc9YVs0KmUrMl0sTT1hWzQqZSszXSxrPTA7azx1Lmxlbmd0aDsrK2spe3ZhciBBPXVba10sVD1BWzBdLFM9QVsxXTtUPDA/VCo9eDpUPjAmJihUKj1fKSxTPDA/Uyo9dzpTPjAmJihTKj1NKSx2W2IrK109Ziooci1wK1QpLHZbYisrXT1kKihuLW0rUyksdltiKytdPW8qQVsyXSsobCtvKSpBWzRdLHZbYisrXT1vKkFbM10rKGwrbykqQVs1XX19Zm9yKGU9MDtlPHYubGVuZ3RoO2UrKylnW2VdPXZbZV0seVtlXT12W2VdLWdbZV07dGhpcy5idWZmZXJIaS51cGRhdGUoZyksdGhpcy5idWZmZXJMby51cGRhdGUoeSkscy5mcmVlKHYpfSxjLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnBsb3QucmVtb3ZlT2JqZWN0KHRoaXMpLHRoaXMuc2hhZGVyLmRpc3Bvc2UoKSx0aGlzLmJ1ZmZlckhpLmRpc3Bvc2UoKSx0aGlzLmJ1ZmZlckxvLmRpc3Bvc2UoKX19LHsiLi9saWIvc2hhZGVycyI6MTU4LCJnbC1idWZmZXIiOjE1NCwiZ2wtc2hhZGVyIjoyNTMsInR5cGVkYXJyYXktcG9vbCI6NTM5fV0sMTU4OltmdW5jdGlvbih0LGUscil7ZS5leHBvcnRzPXt2ZXJ0ZXg6InByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMyIHBvc2l0aW9uSGk7XG5hdHRyaWJ1dGUgdmVjMiBwb3NpdGlvbkxvO1xuYXR0cmlidXRlIHZlYzIgcGl4ZWxPZmZzZXQ7XG5cbnVuaWZvcm0gdmVjMiBzY2FsZUhpLCBzY2FsZUxvLCB0cmFuc2xhdGVIaSwgdHJhbnNsYXRlTG8sIHBpeGVsU2NhbGU7XG5cbnZlYzIgcHJvamVjdCh2ZWMyIHNjSGksIHZlYzIgdHJIaSwgdmVjMiBzY0xvLCB2ZWMyIHRyTG8sIHZlYzIgcG9zSGksIHZlYzIgcG9zTG8pIHtcbiAgcmV0dXJuIChwb3NIaSArIHRySGkpICogc2NIaVxuICAgICAgICsgKHBvc0xvICsgdHJMbykgKiBzY0hpXG4gICAgICAgKyAocG9zSGkgKyB0ckhpKSAqIHNjTG9cbiAgICAgICArIChwb3NMbyArIHRyTG8pICogc2NMbztcbn1cblxudm9pZCBtYWluKCkge1xuICB2ZWMzIHNjclBvc2l0aW9uID0gdmVjMyhcbiAgICAgICAgIHByb2plY3Qoc2NhbGVIaSwgdHJhbnNsYXRlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUxvLCBwb3NpdGlvbkhpLCBwb3NpdGlvbkxvKSxcbiAgICAgICAgIDEpO1xuICBnbF9Qb3NpdGlvbiA9IHZlYzQoXG4gICAgc2NyUG9zaXRpb24ueHkgKyBzY3JQb3NpdGlvbi56ICogcGl4ZWxTY2FsZSAqIHBpeGVsT2Zmc2V0LFxuICAgIDAsXG4gICAgc2NyUG9zaXRpb24ueik7XG59XG4iLApmcmFnbWVudDoicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzQgY29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgZ2xfRnJhZ0NvbG9yID0gdmVjNChjb2xvci5yZ2IgKiBjb2xvci5hLCBjb2xvci5hKTtcbn1cbiJ9fSx7fV0sMTU5OltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlLHIsbil7dGhpcy5nbD10LHRoaXMuc2hhZGVyPW4sdGhpcy5idWZmZXI9ZSx0aGlzLnZhbz1yLHRoaXMucGl4ZWxSYXRpbz0xLHRoaXMuYm91bmRzPVtbMS8wLDEvMCwxLzBdLFstMS8wLC0xLzAsLTEvMF1dLHRoaXMuY2xpcEJvdW5kcz1bWy0xLzAsLTEvMCwtMS8wXSxbMS8wLDEvMCwxLzBdXSx0aGlzLmxpbmVXaWR0aD1bMSwxLDFdLHRoaXMuY2FwU2l6ZT1bMTAsMTAsMTBdLHRoaXMubGluZUNvdW50PVswLDAsMF0sdGhpcy5saW5lT2Zmc2V0PVswLDAsMF0sdGhpcy5vcGFjaXR5PTF9ZnVuY3Rpb24gaSh0LGUpe2Zvcih2YXIgcj0wO3I8MzsrK3IpdFswXVtyXT1NYXRoLm1pbih0WzBdW3JdLGVbcl0pLHRbMV1bcl09TWF0aC5tYXgodFsxXVtyXSxlW3JdKX1mdW5jdGlvbiBhKHQsZSxyLG4pe2Zvcih2YXIgaT1mW25dLGE9MDthPGkubGVuZ3RoOysrYSl7dmFyIG89aVthXTt0LnB1c2goZVswXSxlWzFdLGVbMl0sclswXSxyWzFdLHJbMl0sclszXSxvWzBdLG9bMV0sb1syXSl9cmV0dXJuIGkubGVuZ3RofWZ1bmN0aW9uIG8odCl7dmFyIGU9dC5nbCxyPXMoZSksaT1sKGUsW3tidWZmZXI6cix0eXBlOmUuRkxPQVQsc2l6ZTozLG9mZnNldDowLHN0cmlkZTo0MH0se2J1ZmZlcjpyLHR5cGU6ZS5GTE9BVCxzaXplOjQsb2Zmc2V0OjEyLHN0cmlkZTo0MH0se2J1ZmZlcjpyLHR5cGU6ZS5GTE9BVCxzaXplOjMsb2Zmc2V0OjI4LHN0cmlkZTo0MH1dKSxhPXUoZSk7YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLmxvY2F0aW9uPTAsYS5hdHRyaWJ1dGVzLmNvbG9yLmxvY2F0aW9uPTEsYS5hdHRyaWJ1dGVzLm9mZnNldC5sb2NhdGlvbj0yO3ZhciBvPW5ldyBuKGUscixpLGEpO3JldHVybiBvLnVwZGF0ZSh0KSxvfWUuZXhwb3J0cz1vO3ZhciBzPXQoImdsLWJ1ZmZlciIpLGw9dCgiZ2wtdmFvIiksdT10KCIuL3NoYWRlcnMvaW5kZXgiKSxjPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSxoPW4ucHJvdG90eXBlO2guaXNPcGFxdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcGFjaXR5Pj0xfSxoLmlzVHJhbnNwYXJlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vcGFjaXR5PDF9LGguZHJhd1RyYW5zcGFyZW50PWguZHJhdz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmdsLHI9dGhpcy5zaGFkZXIudW5pZm9ybXM7dGhpcy5zaGFkZXIuYmluZCgpO3ZhciBuPXIudmlldz10LnZpZXd8fGMsaT1yLnByb2plY3Rpb249dC5wcm9qZWN0aW9ufHxjO3IubW9kZWw9dC5tb2RlbHx8YyxyLmNsaXBCb3VuZHM9dGhpcy5jbGlwQm91bmRzLHIub3BhY2l0eT10aGlzLm9wYWNpdHk7dmFyIGE9blsxMl0sbz1uWzEzXSxzPW5bMTRdLGw9blsxNV0sdT10aGlzLnBpeGVsUmF0aW8qKGlbM10qYStpWzddKm8raVsxMV0qcytpWzE1XSpsKS9lLmRyYXdpbmdCdWZmZXJIZWlnaHQ7dGhpcy52YW8uYmluZCgpO2Zvcih2YXIgaD0wO2g8MzsrK2gpZS5saW5lV2lkdGgodGhpcy5saW5lV2lkdGhbaF0pLHIuY2FwU2l6ZT10aGlzLmNhcFNpemVbaF0qdSx0aGlzLmxpbmVDb3VudFtoXSYmZS5kcmF3QXJyYXlzKGUuTElORVMsdGhpcy5saW5lT2Zmc2V0W2hdLHRoaXMubGluZUNvdW50W2hdKTt0aGlzLnZhby51bmJpbmQoKX07dmFyIGY9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9bmV3IEFycmF5KDMpLGU9MDtlPDM7KytlKXtmb3IodmFyIHI9W10sbj0xO248PTI7KytuKWZvcih2YXIgaT0tMTtpPD0xO2krPTIpe3ZhciBhPShuK2UpJTMsbz1bMCwwLDBdO29bYV09aSxyLnB1c2gobyl9dFtlXT1yfXJldHVybiB0fSgpO2gudXBkYXRlPWZ1bmN0aW9uKHQpe3Q9dHx8e30sImxpbmVXaWR0aCJpbiB0JiYodGhpcy5saW5lV2lkdGg9dC5saW5lV2lkdGgsQXJyYXkuaXNBcnJheSh0aGlzLmxpbmVXaWR0aCl8fCh0aGlzLmxpbmVXaWR0aD1bdGhpcy5saW5lV2lkdGgsdGhpcy5saW5lV2lkdGgsdGhpcy5saW5lV2lkdGhdKSksImNhcFNpemUiaW4gdCYmKHRoaXMuY2FwU2l6ZT10LmNhcFNpemUsQXJyYXkuaXNBcnJheSh0aGlzLmNhcFNpemUpfHwodGhpcy5jYXBTaXplPVt0aGlzLmNhcFNpemUsdGhpcy5jYXBTaXplLHRoaXMuY2FwU2l6ZV0pKSwib3BhY2l0eSJpbiB0JiYodGhpcy5vcGFjaXR5PXQub3BhY2l0eSk7dmFyIGU9dC5jb2xvcnx8W1swLDAsMF0sWzAsMCwwXSxbMCwwLDBdXSxyPXQucG9zaXRpb24sbj10LmVycm9yO2lmKEFycmF5LmlzQXJyYXkoZVswXSl8fChlPVtlLGUsZV0pLHImJm4pe3ZhciBvPVtdLHM9ci5sZW5ndGgsbD0wO3RoaXMuYm91bmRzPVtbMS8wLDEvMCwxLzBdLFstMS8wLC0xLzAsLTEvMF1dLHRoaXMubGluZUNvdW50PVswLDAsMF07Zm9yKHZhciB1PTA7dTwzOysrdSl7dGhpcy5saW5lT2Zmc2V0W3VdPWw7dDpmb3IodmFyIGM9MDtjPHM7KytjKXtmb3IodmFyIGg9cltjXSxmPTA7ZjwzOysrZilpZihpc05hTihoW2ZdKXx8IWlzRmluaXRlKGhbZl0pKWNvbnRpbnVlIHQ7dmFyIGQ9bltjXSxwPWVbdV07aWYoQXJyYXkuaXNBcnJheShwWzBdKSYmKHA9ZVtjXSksMz09PXAubGVuZ3RoJiYocD1bcFswXSxwWzFdLHBbMl0sMV0pLCFpc05hTihkWzBdW3VdKSYmIWlzTmFOKGRbMV1bdV0pKXtpZihkWzBdW3VdPDApe3ZhciBtPWguc2xpY2UoKTttW3VdKz1kWzBdW3VdLG8ucHVzaChoWzBdLGhbMV0saFsyXSxwWzBdLHBbMV0scFsyXSxwWzNdLDAsMCwwLG1bMF0sbVsxXSxtWzJdLHBbMF0scFsxXSxwWzJdLHBbM10sMCwwLDApLGkodGhpcy5ib3VuZHMsbSksbCs9MithKG8sbSxwLHUpfWlmKGRbMV1bdV0+MCl7dmFyIG09aC5zbGljZSgpO21bdV0rPWRbMV1bdV0sby5wdXNoKGhbMF0saFsxXSxoWzJdLHBbMF0scFsxXSxwWzJdLHBbM10sMCwwLDAsbVswXSxtWzFdLG1bMl0scFswXSxwWzFdLHBbMl0scFszXSwwLDAsMCksaSh0aGlzLmJvdW5kcyxtKSxsKz0yK2EobyxtLHAsdSl9fX10aGlzLmxpbmVDb3VudFt1XT1sLXRoaXMubGluZU9mZnNldFt1XX10aGlzLmJ1ZmZlci51cGRhdGUobyl9fSxoLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLnNoYWRlci5kaXNwb3NlKCksdGhpcy5idWZmZXIuZGlzcG9zZSgpLHRoaXMudmFvLmRpc3Bvc2UoKX19LHsiLi9zaGFkZXJzL2luZGV4IjoxNjEsImdsLWJ1ZmZlciI6MTU0LCJnbC12YW8iOjI2OX1dLDE2MDpbZnVuY3Rpb24odCxlLHIpe2UuZXhwb3J0cz1mdW5jdGlvbih0KXsic3RyaW5nIj09dHlwZW9mIHQmJih0PVt0XSk7Zm9yKHZhciBlPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLHI9W10sbj0wO248dC5sZW5ndGgtMTtuKyspci5wdXNoKHRbbl0sZVtuXXx8IiIpO3JldHVybiByLnB1c2godFtuXSksci5qb2luKCIiKX19LHt9XSwxNjE6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49dCgiZ2xzbGlmeSIpLGk9dCgiZ2wtc2hhZGVyIiksYT1uKFsicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMyBwb3NpdGlvbiwgb2Zmc2V0O1xuYXR0cmlidXRlIHZlYzQgY29sb3I7XG51bmlmb3JtIG1hdDQgbW9kZWwsIHZpZXcsIHByb2plY3Rpb247XG51bmlmb3JtIGZsb2F0IGNhcFNpemU7XG52YXJ5aW5nIHZlYzQgZnJhZ0NvbG9yO1xudmFyeWluZyB2ZWMzIGZyYWdQb3NpdGlvbjtcblxudm9pZCBtYWluKCkge1xuICB2ZWM0IHdvcmxkUG9zaXRpb24gID0gbW9kZWwgKiB2ZWM0KHBvc2l0aW9uLCAxLjApO1xuICB3b3JsZFBvc2l0aW9uICAgICAgID0gKHdvcmxkUG9zaXRpb24gLyB3b3JsZFBvc2l0aW9uLncpICsgdmVjNChjYXBTaXplICogb2Zmc2V0LCAwLjApO1xuICBnbF9Qb3NpdGlvbiAgICAgICAgID0gcHJvamVjdGlvbiAqIHZpZXcgKiB3b3JsZFBvc2l0aW9uO1xuICBmcmFnQ29sb3IgICAgICAgICAgID0gY29sb3I7XG4gIGZyYWdQb3NpdGlvbiAgICAgICAgPSBwb3NpdGlvbjtcbn0iXSksbz1uKFsicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxudW5pZm9ybSB2ZWMzIGNsaXBCb3VuZHNbMl07XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG52YXJ5aW5nIHZlYzMgZnJhZ1Bvc2l0aW9uO1xudmFyeWluZyB2ZWM0IGZyYWdDb2xvcjtcblxudm9pZCBtYWluKCkge1xuICBpZihhbnkobGVzc1RoYW4oZnJhZ1Bvc2l0aW9uLCBjbGlwQm91bmRzWzBdKSkgfHwgYW55KGdyZWF0ZXJUaGFuKGZyYWdQb3NpdGlvbiwgY2xpcEJvdW5kc1sxXSkpKSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuICBnbF9GcmFnQ29sb3IgPSBvcGFjaXR5ICogZnJhZ0NvbG9yO1xufSJdKTtlLmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIGkodCxhLG8sbnVsbCxbe25hbWU6InBvc2l0aW9uIix0eXBlOiJ2ZWMzIn0se25hbWU6ImNvbG9yIix0eXBlOiJ2ZWM0In0se25hbWU6Im9mZnNldCIsdHlwZToidmVjMyJ9XSl9fSx7ImdsLXNoYWRlciI6MjUzLGdsc2xpZnk6MTYwfV0sMTYyOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuW3QuZ2V0UGFyYW1ldGVyKHQuRlJBTUVCVUZGRVJfQklORElORyksdC5nZXRQYXJhbWV0ZXIodC5SRU5ERVJCVUZGRVJfQklORElORyksdC5nZXRQYXJhbWV0ZXIodC5URVhUVVJFX0JJTkRJTkdfMkQpXX1mdW5jdGlvbiBpKHQsZSl7dC5iaW5kRnJhbWVidWZmZXIodC5GUkFNRUJVRkZFUixlWzBdKSx0LmJpbmRSZW5kZXJidWZmZXIodC5SRU5ERVJCVUZGRVIsZVsxXSksdC5iaW5kVGV4dHVyZSh0LlRFWFRVUkVfMkQsZVsyXSl9ZnVuY3Rpb24gYSh0LGUpe3ZhciByPXQuZ2V0UGFyYW1ldGVyKGUuTUFYX0NPTE9SX0FUVEFDSE1FTlRTX1dFQkdMKTt5PW5ldyBBcnJheShyKzEpO2Zvcih2YXIgbj0wO248PXI7KytuKXtmb3IodmFyIGk9bmV3IEFycmF5KHIpLGE9MDthPG47KythKWlbYV09dC5DT0xPUl9BVFRBQ0hNRU5UMCthO2Zvcih2YXIgYT1uO2E8cjsrK2EpaVthXT10Lk5PTkU7eVtuXT1pfX1mdW5jdGlvbiBvKHQpe3N3aXRjaCh0KXtjYXNlIHA6dGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IEZyYW1lYnVmZmVyIHVuc3VwcG9ydGVkIik7Y2FzZSBtOnRocm93IG5ldyBFcnJvcigiZ2wtZmJvOiBGcmFtZWJ1ZmZlciBpbmNvbXBsZXRlIGF0dGFjaG1lbnQiKTtjYXNlIHY6dGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IEZyYW1lYnVmZmVyIGluY29tcGxldGUgZGltZW5zaW9ucyIpO2Nhc2UgZzp0aHJvdyBuZXcgRXJyb3IoImdsLWZibzogRnJhbWVidWZmZXIgaW5jb21wbGV0ZSBtaXNzaW5nIGF0dGFjaG1lbnQiKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiZ2wtZmJvOiBGcmFtZWJ1ZmZlciBmYWlsZWQgZm9yIHVuc3BlY2lmaWVkIHJlYXNvbiIpfX1mdW5jdGlvbiBzKHQsZSxyLG4saSxhKXtpZighbilyZXR1cm4gbnVsbDt2YXIgbz1kKHQsZSxyLGksbik7cmV0dXJuIG8ubWFnRmlsdGVyPXQuTkVBUkVTVCxvLm1pbkZpbHRlcj10Lk5FQVJFU1Qsby5taXBTYW1wbGVzPTEsby5iaW5kKCksdC5mcmFtZWJ1ZmZlclRleHR1cmUyRCh0LkZSQU1FQlVGRkVSLGEsdC5URVhUVVJFXzJELG8uaGFuZGxlLDApLG99ZnVuY3Rpb24gbCh0LGUscixuLGkpe3ZhciBhPXQuY3JlYXRlUmVuZGVyYnVmZmVyKCk7cmV0dXJuIHQuYmluZFJlbmRlcmJ1ZmZlcih0LlJFTkRFUkJVRkZFUixhKSx0LnJlbmRlcmJ1ZmZlclN0b3JhZ2UodC5SRU5ERVJCVUZGRVIsbixlLHIpLHQuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodC5GUkFNRUJVRkZFUixpLHQuUkVOREVSQlVGRkVSLGEpLGF9ZnVuY3Rpb24gdSh0KXt2YXIgZT1uKHQuZ2wpLHI9dC5nbCxhPXQuaGFuZGxlPXIuY3JlYXRlRnJhbWVidWZmZXIoKSx1PXQuX3NoYXBlWzBdLGM9dC5fc2hhcGVbMV0saD10LmNvbG9yLmxlbmd0aCxmPXQuX2V4dCxkPXQuX3VzZVN0ZW5jaWwscD10Ll91c2VEZXB0aCxtPXQuX2NvbG9yVHlwZTtyLmJpbmRGcmFtZWJ1ZmZlcihyLkZSQU1FQlVGRkVSLGEpO2Zvcih2YXIgdj0wO3Y8aDsrK3YpdC5jb2xvclt2XT1zKHIsdSxjLG0sci5SR0JBLHIuQ09MT1JfQVRUQUNITUVOVDArdik7MD09PWg/KHQuX2NvbG9yX3JiPWwocix1LGMsci5SR0JBNCxyLkNPTE9SX0FUVEFDSE1FTlQwKSxmJiZmLmRyYXdCdWZmZXJzV0VCR0woeVswXSkpOmg+MSYmZi5kcmF3QnVmZmVyc1dFQkdMKHlbaF0pO3ZhciBnPXIuZ2V0RXh0ZW5zaW9uKCJXRUJHTF9kZXB0aF90ZXh0dXJlIik7Zz9kP3QuZGVwdGg9cyhyLHUsYyxnLlVOU0lHTkVEX0lOVF8yNF84X1dFQkdMLHIuREVQVEhfU1RFTkNJTCxyLkRFUFRIX1NURU5DSUxfQVRUQUNITUVOVCk6cCYmKHQuZGVwdGg9cyhyLHUsYyxyLlVOU0lHTkVEX1NIT1JULHIuREVQVEhfQ09NUE9ORU5ULHIuREVQVEhfQVRUQUNITUVOVCkpOnAmJmQ/dC5fZGVwdGhfcmI9bChyLHUsYyxyLkRFUFRIX1NURU5DSUwsci5ERVBUSF9TVEVOQ0lMX0FUVEFDSE1FTlQpOnA/dC5fZGVwdGhfcmI9bChyLHUsYyxyLkRFUFRIX0NPTVBPTkVOVDE2LHIuREVQVEhfQVRUQUNITUVOVCk6ZCYmKHQuX2RlcHRoX3JiPWwocix1LGMsci5TVEVOQ0lMX0lOREVYLHIuU1RFTkNJTF9BVFRBQ0hNRU5UKSk7dmFyIGI9ci5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKHIuRlJBTUVCVUZGRVIpO2lmKGIhPT1yLkZSQU1FQlVGRkVSX0NPTVBMRVRFKXt0Ll9kZXN0cm95ZWQ9ITAsci5iaW5kRnJhbWVidWZmZXIoci5GUkFNRUJVRkZFUixudWxsKSxyLmRlbGV0ZUZyYW1lYnVmZmVyKHQuaGFuZGxlKSx0LmhhbmRsZT1udWxsLHQuZGVwdGgmJih0LmRlcHRoLmRpc3Bvc2UoKSx0LmRlcHRoPW51bGwpLHQuX2RlcHRoX3JiJiYoci5kZWxldGVSZW5kZXJidWZmZXIodC5fZGVwdGhfcmIpLHQuX2RlcHRoX3JiPW51bGwpO2Zvcih2YXIgdj0wO3Y8dC5jb2xvci5sZW5ndGg7Kyt2KXQuY29sb3Jbdl0uZGlzcG9zZSgpLHQuY29sb3Jbdl09bnVsbDt0Ll9jb2xvcl9yYiYmKHIuZGVsZXRlUmVuZGVyYnVmZmVyKHQuX2NvbG9yX3JiKSx0Ll9jb2xvcl9yYj1udWxsKSxpKHIsZSksbyhiKX1pKHIsZSl9ZnVuY3Rpb24gYyh0LGUscixuLGksYSxvLHMpe3RoaXMuZ2w9dCx0aGlzLl9zaGFwZT1bMHxlLDB8cl0sdGhpcy5fZGVzdHJveWVkPSExLHRoaXMuX2V4dD1zLHRoaXMuY29sb3I9bmV3IEFycmF5KGkpO2Zvcih2YXIgbD0wO2w8aTsrK2wpdGhpcy5jb2xvcltsXT1udWxsO3RoaXMuX2NvbG9yX3JiPW51bGwsdGhpcy5kZXB0aD1udWxsLHRoaXMuX2RlcHRoX3JiPW51bGwsdGhpcy5fY29sb3JUeXBlPW4sdGhpcy5fdXNlRGVwdGg9YSx0aGlzLl91c2VTdGVuY2lsPW87dmFyIGM9dGhpcyxoPVswfGUsMHxyXTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhoLHswOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYy5fc2hhcGVbMF19LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gYy53aWR0aD10fX0sMTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGMuX3NoYXBlWzFdfSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGMuaGVpZ2h0PXR9fX0pLHRoaXMuX3NoYXBlVmVjdG9yPWgsdSh0aGlzKX1mdW5jdGlvbiBoKHQsZSxyKXtpZih0Ll9kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IENhbid0IHJlc2l6ZSBkZXN0cm95ZWQgRkJPIik7aWYodC5fc2hhcGVbMF0hPT1lfHx0Ll9zaGFwZVsxXSE9PXIpe3ZhciBhPXQuZ2wscz1hLmdldFBhcmFtZXRlcihhLk1BWF9SRU5ERVJCVUZGRVJfU0laRSk7aWYoZTwwfHxlPnN8fHI8MHx8cj5zKXRocm93IG5ldyBFcnJvcigiZ2wtZmJvOiBDYW4ndCByZXNpemUgRkJPLCBpbnZhbGlkIGRpbWVuc2lvbnMiKTt0Ll9zaGFwZVswXT1lLHQuX3NoYXBlWzFdPXI7Zm9yKHZhciBsPW4oYSksdT0wO3U8dC5jb2xvci5sZW5ndGg7Kyt1KXQuY29sb3JbdV0uc2hhcGU9dC5fc2hhcGU7dC5fY29sb3JfcmImJihhLmJpbmRSZW5kZXJidWZmZXIoYS5SRU5ERVJCVUZGRVIsdC5fY29sb3JfcmIpLGEucmVuZGVyYnVmZmVyU3RvcmFnZShhLlJFTkRFUkJVRkZFUixhLlJHQkE0LHQuX3NoYXBlWzBdLHQuX3NoYXBlWzFdKSksdC5kZXB0aCYmKHQuZGVwdGguc2hhcGU9dC5fc2hhcGUpLHQuX2RlcHRoX3JiJiYoYS5iaW5kUmVuZGVyYnVmZmVyKGEuUkVOREVSQlVGRkVSLHQuX2RlcHRoX3JiKSx0Ll91c2VEZXB0aCYmdC5fdXNlU3RlbmNpbD9hLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoYS5SRU5ERVJCVUZGRVIsYS5ERVBUSF9TVEVOQ0lMLHQuX3NoYXBlWzBdLHQuX3NoYXBlWzFdKTp0Ll91c2VEZXB0aD9hLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoYS5SRU5ERVJCVUZGRVIsYS5ERVBUSF9DT01QT05FTlQxNix0Ll9zaGFwZVswXSx0Ll9zaGFwZVsxXSk6dC5fdXNlU3RlbmNpbCYmYS5yZW5kZXJidWZmZXJTdG9yYWdlKGEuUkVOREVSQlVGRkVSLGEuU1RFTkNJTF9JTkRFWCx0Ll9zaGFwZVswXSx0Ll9zaGFwZVsxXSkpLGEuYmluZEZyYW1lYnVmZmVyKGEuRlJBTUVCVUZGRVIsdC5oYW5kbGUpO3ZhciBjPWEuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhhLkZSQU1FQlVGRkVSKTtjIT09YS5GUkFNRUJVRkZFUl9DT01QTEVURSYmKHQuZGlzcG9zZSgpLGkoYSxsKSxvKGMpKSxpKGEsbCl9fWZ1bmN0aW9uIGYodCxlLHIsbil7cHx8KHA9dC5GUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCxtPXQuRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5ULHY9dC5GUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0RJTUVOU0lPTlMsZz10LkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UKTt2YXIgaT10LmdldEV4dGVuc2lvbigiV0VCR0xfZHJhd19idWZmZXJzIik7aWYoIXkmJmkmJmEodCxpKSxBcnJheS5pc0FycmF5KGUpJiYobj1yLHI9MHxlWzFdLGU9MHxlWzBdKSwibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IE1pc3Npbmcgc2hhcGUgcGFyYW1ldGVyIik7dmFyIG89dC5nZXRQYXJhbWV0ZXIodC5NQVhfUkVOREVSQlVGRkVSX1NJWkUpO2lmKGU8MHx8ZT5vfHxyPDB8fHI+byl0aHJvdyBuZXcgRXJyb3IoImdsLWZibzogUGFyYW1ldGVycyBhcmUgdG9vIGxhcmdlIGZvciBGQk8iKTtuPW58fHt9O3ZhciBzPTE7aWYoImNvbG9yImluIG4pe2lmKChzPU1hdGgubWF4KDB8bi5jb2xvciwwKSk8MCl0aHJvdyBuZXcgRXJyb3IoImdsLWZibzogTXVzdCBzcGVjaWZ5IGEgbm9ubmVnYXRpdmUgbnVtYmVyIG9mIGNvbG9ycyIpO2lmKHM+MSl7aWYoIWkpdGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IE11bHRpcGxlIGRyYXcgYnVmZmVyIGV4dGVuc2lvbiBub3Qgc3VwcG9ydGVkIik7aWYocz50LmdldFBhcmFtZXRlcihpLk1BWF9DT0xPUl9BVFRBQ0hNRU5UU19XRUJHTCkpdGhyb3cgbmV3IEVycm9yKCJnbC1mYm86IENvbnRleHQgZG9lcyBub3Qgc3VwcG9ydCAiK3MrIiBkcmF3IGJ1ZmZlcnMiKX19dmFyIGw9dC5VTlNJR05FRF9CWVRFLHU9dC5nZXRFeHRlbnNpb24oIk9FU190ZXh0dXJlX2Zsb2F0Iik7aWYobi5mbG9hdCYmcz4wKXtpZighdSl0aHJvdyBuZXcgRXJyb3IoImdsLWZibzogQ29udGV4dCBkb2VzIG5vdCBzdXBwb3J0IGZsb2F0aW5nIHBvaW50IHRleHR1cmVzIik7bD10LkZMT0FUfWVsc2Ugbi5wcmVmZXJGbG9hdCYmcz4wJiZ1JiYobD10LkZMT0FUKTt2YXIgaD0hMDsiZGVwdGgiaW4gbiYmKGg9ISFuLmRlcHRoKTt2YXIgZj0hMTtyZXR1cm4ic3RlbmNpbCJpbiBuJiYoZj0hIW4uc3RlbmNpbCksbmV3IGModCxlLHIsbCxzLGgsZixpKX12YXIgZD10KCJnbC10ZXh0dXJlMmQiKTtlLmV4cG9ydHM9Zjt2YXIgcCxtLHYsZyx5PW51bGwsYj1jLnByb3RvdHlwZTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhiLHtzaGFwZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rlc3Ryb3llZD9bMCwwXTp0aGlzLl9zaGFwZVZlY3Rvcn0sc2V0OmZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodCl8fCh0PVswfHQsMHx0XSksMiE9PXQubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiZ2wtZmJvOiBTaGFwZSB2ZWN0b3IgbXVzdCBiZSBsZW5ndGggMiIpO3ZhciBlPTB8dFswXSxyPTB8dFsxXTtyZXR1cm4gaCh0aGlzLGUsciksW2Uscl19LGVudW1lcmFibGU6ITF9LHdpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVzdHJveWVkPzA6dGhpcy5fc2hhcGVbMF19LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gdHw9MCxoKHRoaXMsdCx0aGlzLl9zaGFwZVsxXSksdH0sZW51bWVyYWJsZTohMX0saGVpZ2h0OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVzdHJveWVkPzA6dGhpcy5fc2hhcGVbMV19LHNldDpmdW5jdGlvbih0KXtyZXR1cm4gdHw9MCxoKHRoaXMsdGhpcy5fc2hhcGVbMF0sdCksdH0sZW51bWVyYWJsZTohMX19KSxiLmJpbmQ9ZnVuY3Rpb24oKXtpZighdGhpcy5fZGVzdHJveWVkKXt2YXIgdD10aGlzLmdsO3QuYmluZEZyYW1lYnVmZmVyKHQuRlJBTUVCVUZGRVIsdGhpcy5oYW5kbGUpLHQudmlld3BvcnQoMCwwLHRoaXMuX3NoYXBlWzBdLHRoaXMuX3NoYXBlWzFdKX19LGIuZGlzcG9zZT1mdW5jdGlvbigpe2lmKCF0aGlzLl9kZXN0cm95ZWQpe3RoaXMuX2Rlc3Ryb3llZD0hMDt2YXIgdD10aGlzLmdsO3QuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5oYW5kbGUpLHRoaXMuaGFuZGxlPW51bGwsdGhpcy5kZXB0aCYmKHRoaXMuZGVwdGguZGlzcG9zZSgpLHRoaXMuZGVwdGg9bnVsbCksdGhpcy5fZGVwdGhfcmImJih0LmRlbGV0ZVJlbmRlcmJ1ZmZlcih0aGlzLl9kZXB0aF9yYiksdGhpcy5fZGVwdGhfcmI9bnVsbCk7Zm9yKHZhciBlPTA7ZTx0aGlzLmNvbG9yLmxlbmd0aDsrK2UpdGhpcy5jb2xvcltlXS5kaXNwb3NlKCksdGhpcy5jb2xvcltlXT1udWxsO3RoaXMuX2NvbG9yX3JiJiYodC5kZWxldGVSZW5kZXJidWZmZXIodGhpcy5fY29sb3JfcmIpLHRoaXMuX2NvbG9yX3JiPW51bGwpfX19LHsiZ2wtdGV4dHVyZTJkIjoyNjV9XSwxNjM6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXsidXNlIHN0cmljdCI7dmFyIG49byhlKXx8Im9mIHVua25vd24gbmFtZSAoc2VlIG5wbSBnbHNsLXNoYWRlci1uYW1lKSIsbD0idW5rbm93biB0eXBlIjt2b2lkIDAhPT1yJiYobD1yPT09YS5GUkFHTUVOVF9TSEFERVI/ImZyYWdtZW50IjoidmVydGV4Iik7Zm9yKHZhciB1PWkoIkVycm9yIGNvbXBpbGluZyAlcyBzaGFkZXIgJXM6XG4iLGwsbiksYz1pKCIlcyVzIix1LHQpLGg9dC5zcGxpdCgiXG4iKSxmPXt9LGQ9MDtkPGgubGVuZ3RoO2QrKyl7dmFyIHA9aFtkXTtpZigiIiE9PXApe3ZhciBtPXBhcnNlSW50KHAuc3BsaXQoIjoiKVsyXSk7aWYoaXNOYU4obSkpdGhyb3cgbmV3IEVycm9yKGkoIkNvdWxkIG5vdCBwYXJzZSBlcnJvcjogJXMiLHApKTtmW21dPXB9fWZvcih2YXIgdj1zKGUpLnNwbGl0KCJcbiIpLGQ9MDtkPHYubGVuZ3RoO2QrKylpZihmW2QrM118fGZbZCsyXXx8ZltkKzFdKXt2YXIgZz12W2RdO2lmKHUrPWcrIlxuIixmW2QrMV0pe3ZhciB5PWZbZCsxXTt5PXkuc3Vic3RyKHkuc3BsaXQoIjoiLDMpLmpvaW4oIjoiKS5sZW5ndGgrMSkudHJpbSgpLHUrPWkoIl5eXiAlc1xuXG4iLHkpfX1yZXR1cm57bG9uZzp1LnRyaW0oKSxzaG9ydDpjLnRyaW0oKX19dmFyIGk9dCgic3ByaW50Zi1qcyIpLnNwcmludGYsYT10KCJnbC1jb25zdGFudHMvbG9va3VwIiksbz10KCJnbHNsLXNoYWRlci1uYW1lIikscz10KCJhZGQtbGluZS1udW1iZXJzIik7ZS5leHBvcnRzPW59LHsiYWRkLWxpbmUtbnVtYmVycyI6MzgsImdsLWNvbnN0YW50cy9sb29rdXAiOjE1NiwiZ2xzbC1zaGFkZXItbmFtZSI6Mjc3LCJzcHJpbnRmLWpzIjo1MjV9XSwxNjQ6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGksYSxvKXt0aGlzLnBsb3Q9dCx0aGlzLnNoYWRlcj1lLHRoaXMucGlja1NoYWRlcj1yLHRoaXMucG9zaXRpb25CdWZmZXI9bix0aGlzLndlaWdodEJ1ZmZlcj1pLHRoaXMuY29sb3JCdWZmZXI9YSx0aGlzLmlkQnVmZmVyPW8sdGhpcy54RGF0YT1bXSx0aGlzLnlEYXRhPVtdLHRoaXMuc2hhcGU9WzAsMF0sdGhpcy5ib3VuZHM9WzEvMCwxLzAsLTEvMCwtMS8wXSx0aGlzLnBpY2tPZmZzZXQ9MH1mdW5jdGlvbiBpKHQsZSl7dmFyIHI9dC5nbCxpPWwocixjLnZlcnRleCxjLmZyYWdtZW50KSxhPWwocixjLnBpY2tWZXJ0ZXgsYy5waWNrRnJhZ21lbnQpLG89dShyKSxzPXUociksaD11KHIpLGY9dShyKSxkPW5ldyBuKHQsaSxhLG8scyxoLGYpO3JldHVybiBkLnVwZGF0ZShlKSx0LmFkZE9iamVjdChkKSxkfWUuZXhwb3J0cz1pO3ZhciBhPXQoImJpbmFyeS1zZWFyY2gtYm91bmRzIiksbz10KCJpb3RhLWFycmF5Iikscz10KCJ0eXBlZGFycmF5LXBvb2wiKSxsPXQoImdsLXNoYWRlciIpLHU9dCgiZ2wtYnVmZmVyIiksYz10KCIuL2xpYi9zaGFkZXJzIiksaD1uLnByb3RvdHlwZSxmPVswLDAsMSwwLDAsMSwxLDAsMSwxLDAsMV07aC5kcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9WzEsMCwwLDAsMSwwLDAsMCwxXTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBsb3Qscj10aGlzLnNoYWRlcixuPXRoaXMuYm91bmRzLGk9dGhpcy5udW1WZXJ0aWNlcztpZighKGk8PTApKXt2YXIgYT1lLmdsLG89ZS5kYXRhQm94LHM9blsyXS1uWzBdLGw9blszXS1uWzFdLHU9b1syXS1vWzBdLGM9b1szXS1vWzFdO3RbMF09MipzL3UsdFs0XT0yKmwvYyx0WzZdPTIqKG5bMF0tb1swXSkvdS0xLHRbN109MiooblsxXS1vWzFdKS9jLTEsci5iaW5kKCk7dmFyIGg9ci51bmlmb3JtcztoLnZpZXdUcmFuc2Zvcm09dCxoLnNoYXBlPXRoaXMuc2hhcGU7dmFyIGY9ci5hdHRyaWJ1dGVzO3RoaXMucG9zaXRpb25CdWZmZXIuYmluZCgpLGYucG9zaXRpb24ucG9pbnRlcigpLHRoaXMud2VpZ2h0QnVmZmVyLmJpbmQoKSxmLndlaWdodC5wb2ludGVyKGEuVU5TSUdORURfQllURSwhMSksdGhpcy5jb2xvckJ1ZmZlci5iaW5kKCksZi5jb2xvci5wb2ludGVyKGEuVU5TSUdORURfQllURSwhMCksYS5kcmF3QXJyYXlzKGEuVFJJQU5HTEVTLDAsaSl9fX0oKSxoLmRyYXdQaWNrPWZ1bmN0aW9uKCl7dmFyIHQ9WzEsMCwwLDAsMSwwLDAsMCwxXSxlPVswLDAsMCwwXTtyZXR1cm4gZnVuY3Rpb24ocil7dmFyIG49dGhpcy5wbG90LGk9dGhpcy5waWNrU2hhZGVyLGE9dGhpcy5ib3VuZHMsbz10aGlzLm51bVZlcnRpY2VzO2lmKCEobzw9MCkpe3ZhciBzPW4uZ2wsbD1uLmRhdGFCb3gsdT1hWzJdLWFbMF0sYz1hWzNdLWFbMV0saD1sWzJdLWxbMF0sZj1sWzNdLWxbMV07dFswXT0yKnUvaCx0WzRdPTIqYy9mLHRbNl09MiooYVswXS1sWzBdKS9oLTEsdFs3XT0yKihhWzFdLWxbMV0pL2YtMTtmb3IodmFyIGQ9MDtkPDQ7KytkKWVbZF09cj4+OCpkJjI1NTt0aGlzLnBpY2tPZmZzZXQ9cixpLmJpbmQoKTt2YXIgcD1pLnVuaWZvcm1zO3Audmlld1RyYW5zZm9ybT10LHAucGlja09mZnNldD1lLHAuc2hhcGU9dGhpcy5zaGFwZTt2YXIgbT1pLmF0dHJpYnV0ZXM7cmV0dXJuIHRoaXMucG9zaXRpb25CdWZmZXIuYmluZCgpLG0ucG9zaXRpb24ucG9pbnRlcigpLHRoaXMud2VpZ2h0QnVmZmVyLmJpbmQoKSxtLndlaWdodC5wb2ludGVyKHMuVU5TSUdORURfQllURSwhMSksdGhpcy5pZEJ1ZmZlci5iaW5kKCksbS5waWNrSWQucG9pbnRlcihzLlVOU0lHTkVEX0JZVEUsITEpLHMuZHJhd0FycmF5cyhzLlRSSUFOR0xFUywwLG8pLHIrdGhpcy5zaGFwZVswXSp0aGlzLnNoYXBlWzFdfX19KCksaC5waWNrPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLnBpY2tPZmZzZXQsaT10aGlzLnNoYXBlWzBdKnRoaXMuc2hhcGVbMV07aWYocjxufHxyPj1uK2kpcmV0dXJuIG51bGw7dmFyIGE9ci1uLG89dGhpcy54RGF0YSxzPXRoaXMueURhdGE7cmV0dXJue29iamVjdDp0aGlzLHBvaW50SWQ6YSxkYXRhQ29vcmQ6W29bYSV0aGlzLnNoYXBlWzBdXSxzW2EvdGhpcy5zaGFwZVswXXwwXV19fSxoLnVwZGF0ZT1mdW5jdGlvbih0KXt0PXR8fHt9O3ZhciBlPXQuc2hhcGV8fFswLDBdLHI9dC54fHxvKGVbMF0pLG49dC55fHxvKGVbMV0pLGk9dC56fHxuZXcgRmxvYXQzMkFycmF5KGVbMF0qZVsxXSk7dGhpcy54RGF0YT1yLHRoaXMueURhdGE9bjt2YXIgbD10LmNvbG9yTGV2ZWxzfHxbMF0sdT10LmNvbG9yVmFsdWVzfHxbMCwwLDAsMV0sYz1sLmxlbmd0aCxoPXRoaXMuYm91bmRzLGQ9aFswXT1yWzBdLHA9aFsxXT1uWzBdLG09aFsyXT1yW3IubGVuZ3RoLTFdLHY9aFszXT1uW24ubGVuZ3RoLTFdLGc9MS8obS1kKSx5PTEvKHYtcCksYj1lWzBdLHg9ZVsxXTt0aGlzLnNoYXBlPVtiLHhdO3ZhciBfPShiLTEpKih4LTEpKihmLmxlbmd0aD4+PjEpO3RoaXMubnVtVmVydGljZXM9Xztmb3IodmFyIHc9cy5tYWxsb2NVaW50OCg0Kl8pLE09cy5tYWxsb2NGbG9hdDMyKDIqXyksaz1zLm1hbGxvY1VpbnQ4KDIqXyksQT1zLm1hbGxvY1VpbnQzMihfKSxUPTAsUz0wO1M8eC0xOysrUylmb3IodmFyIEU9eSoobltTXS1wKSxMPXkqKG5bUysxXS1wKSxDPTA7QzxiLTE7KytDKWZvcih2YXIgej1nKihyW0NdLWQpLEk9ZyoocltDKzFdLWQpLEQ9MDtEPGYubGVuZ3RoO0QrPTIpe3ZhciBQLE8sUixGLGo9ZltEXSxOPWZbRCsxXSxCPShTK04pKmIrKEMraiksVT1pW0JdLFY9YS5sZShsLFUpO2lmKFY8MClQPXVbMF0sTz11WzFdLFI9dVsyXSxGPXVbM107ZWxzZSBpZihWPT09Yy0xKVA9dVs0KmMtNF0sTz11WzQqYy0zXSxSPXVbNCpjLTJdLEY9dVs0KmMtMV07ZWxzZXt2YXIgSD0oVS1sW1ZdKS8obFtWKzFdLWxbVl0pLHE9MS1ILEc9NCpWLFk9NCooVisxKTtQPXEqdVtHXStIKnVbWV0sTz1xKnVbRysxXStIKnVbWSsxXSxSPXEqdVtHKzJdK0gqdVtZKzJdLEY9cSp1W0crM10rSCp1W1krM119d1s0KlRdPTI1NSpQLHdbNCpUKzFdPTI1NSpPLHdbNCpUKzJdPTI1NSpSLHdbNCpUKzNdPTI1NSpGLE1bMipUXT0uNSp6Ky41KkksTVsyKlQrMV09LjUqRSsuNSpMLGtbMipUXT1qLGtbMipUKzFdPU4sQVtUXT1TKmIrQyxUKz0xfXRoaXMucG9zaXRpb25CdWZmZXIudXBkYXRlKE0pLHRoaXMud2VpZ2h0QnVmZmVyLnVwZGF0ZShrKSx0aGlzLmNvbG9yQnVmZmVyLnVwZGF0ZSh3KSx0aGlzLmlkQnVmZmVyLnVwZGF0ZShBKSxzLmZyZWUoTSkscy5mcmVlKHcpLHMuZnJlZShrKSxzLmZyZWUoQSl9LGguZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuc2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnBpY2tTaGFkZXIuZGlzcG9zZSgpLHRoaXMucG9zaXRpb25CdWZmZXIuZGlzcG9zZSgpLHRoaXMud2VpZ2h0QnVmZmVyLmRpc3Bvc2UoKSx0aGlzLmNvbG9yQnVmZmVyLmRpc3Bvc2UoKSx0aGlzLmlkQnVmZmVyLmRpc3Bvc2UoKSx0aGlzLnBsb3QucmVtb3ZlT2JqZWN0KHRoaXMpfX0seyIuL2xpYi9zaGFkZXJzIjoxNjUsImJpbmFyeS1zZWFyY2gtYm91bmRzIjoxNjYsImdsLWJ1ZmZlciI6MTU0LCJnbC1zaGFkZXIiOjI1MywiaW90YS1hcnJheSI6MjkxLCJ0eXBlZGFycmF5LXBvb2wiOjUzOX1dLDE2NTpbZnVuY3Rpb24odCxlLHIpeyJ1c2Ugc3RyaWN0IjtlLmV4cG9ydHM9e2ZyYWdtZW50OiJwcmVjaXNpb24gbG93cCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG52YXJ5aW5nIHZlYzQgZnJhZ0NvbG9yO1xudm9pZCBtYWluKCkge1xuICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGZyYWdDb2xvci5yZ2IgKiBmcmFnQ29sb3IuYSwgZnJhZ0NvbG9yLmEpO1xufVxuIix2ZXJ0ZXg6InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzIgcG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjNCBjb2xvcjtcbmF0dHJpYnV0ZSB2ZWMyIHdlaWdodDtcblxudW5pZm9ybSB2ZWMyIHNoYXBlO1xudW5pZm9ybSBtYXQzIHZpZXdUcmFuc2Zvcm07XG5cbnZhcnlpbmcgdmVjNCBmcmFnQ29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMyB2UG9zaXRpb24gPSB2aWV3VHJhbnNmb3JtICogdmVjMyggcG9zaXRpb24gKyAod2VpZ2h0LS41KS8oc2hhcGUtMS4pICwgMS4wKTtcbiAgZnJhZ0NvbG9yID0gY29sb3I7XG4gIGdsX1Bvc2l0aW9uID0gdmVjNCh2UG9zaXRpb24ueHksIDAsIHZQb3NpdGlvbi56KTtcbn1cbiIscGlja0ZyYWdtZW50OiJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnZhcnlpbmcgdmVjNCBmcmFnSWQ7XG52YXJ5aW5nIHZlYzIgdldlaWdodDtcblxudW5pZm9ybSB2ZWMyIHNoYXBlO1xudW5pZm9ybSB2ZWM0IHBpY2tPZmZzZXQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMiBkID0gc3RlcCguNSwgdldlaWdodCk7XG4gIHZlYzQgaWQgPSBmcmFnSWQgKyBwaWNrT2Zmc2V0O1xuICBpZC54ICs9IGQueCArIGQueSpzaGFwZS54O1xuXG4gIGlkLnkgKz0gZmxvb3IoaWQueCAvIDI1Ni4wKTtcbiAgaWQueCAtPSBmbG9vcihpZC54IC8gMjU2LjApICogMjU2LjA7XG5cbiAgaWQueiArPSBmbG9vcihpZC55IC8gMjU2LjApO1xuICBpZC55IC09IGZsb29yKGlkLnkgLyAyNTYuMCkgKiAyNTYuMDtcblxuICBpZC53ICs9IGZsb29yKGlkLnogLyAyNTYuMCk7XG4gIGlkLnogLT0gZmxvb3IoaWQueiAvIDI1Ni4wKSAqIDI1Ni4wO1xuXG4gIGdsX0ZyYWdDb2xvciA9IGlkLzI1NS47XG59XG4iLHBpY2tWZXJ0ZXg6InByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzIgcG9zaXRpb247XG5hdHRyaWJ1dGUgdmVjNCBwaWNrSWQ7XG5hdHRyaWJ1dGUgdmVjMiB3ZWlnaHQ7XG5cbnVuaWZvcm0gdmVjMiBzaGFwZTtcbnVuaWZvcm0gbWF0MyB2aWV3VHJhbnNmb3JtO1xuXG52YXJ5aW5nIHZlYzQgZnJhZ0lkO1xudmFyeWluZyB2ZWMyIHZXZWlnaHQ7XG5cbnZvaWQgbWFpbigpIHtcbiAgdldlaWdodCA9IHdlaWdodDtcblxuICBmcmFnSWQgPSBwaWNrSWQ7XG5cbiAgdmVjMyB2UG9zaXRpb24gPSB2aWV3VHJhbnNmb3JtICogdmVjMyggcG9zaXRpb24gKyAod2VpZ2h0LS41KS8oc2hhcGUtMS4pICwgMS4wKTtcbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHZQb3NpdGlvbi54eSwgMCwgdlBvc2l0aW9uLnopO1xufVxuIn19LHt9XSwxNjY6W2Z1bmN0aW9uKHQsZSxyKXthcmd1bWVudHNbNF1bODJdWzBdLmFwcGx5KHIsYXJndW1lbnRzKX0se2R1cDo4Mn1dLDE2NzpbZnVuY3Rpb24odCxlLHIpe3IubGluZVZlcnRleD0icHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuI2RlZmluZSBHTFNMSUZZIDFcblxuYXR0cmlidXRlIHZlYzIgYUhpLCBhTG8sIGRIaSwgZExvO1xuXG51bmlmb3JtIHZlYzIgc2NhbGVIaSwgdHJhbnNsYXRlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUxvLCBzY3JlZW5TaGFwZTtcbnVuaWZvcm0gZmxvYXQgd2lkdGg7XG5cbnZhcnlpbmcgdmVjMiBkaXJlY3Rpb247XG5cblxudmVjMiBwcm9qZWN0XzFfMCh2ZWMyIHNjSGksIHZlYzIgdHJIaSwgdmVjMiBzY0xvLCB2ZWMyIHRyTG8sIHZlYzIgcG9zSGksIHZlYzIgcG9zTG8pIHtcbiAgcmV0dXJuIChwb3NIaSArIHRySGkpICogc2NIaVxuICAgICAgICsgKHBvc0xvICsgdHJMbykgKiBzY0hpXG4gICAgICAgKyAocG9zSGkgKyB0ckhpKSAqIHNjTG9cbiAgICAgICArIChwb3NMbyArIHRyTG8pICogc2NMbztcbn1cblxuXG52ZWMyIHByb2plY3RfMl8xKHZlYzIgc2NIaSwgdmVjMiBzY0xvLCB2ZWMyIHBvc0hpLCB2ZWMyIHBvc0xvKSB7XG4gIHJldHVybiBzY0hpICogcG9zSGlcbiAgICAgICArIHNjTG8gKiBwb3NIaVxuICAgICAgICsgc2NIaSAqIHBvc0xvXG4gICAgICAgKyBzY0xvICogcG9zTG87XG59XG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMiBwID0gcHJvamVjdF8xXzAoc2NhbGVIaSwgdHJhbnNsYXRlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUxvLCBhSGksIGFMbyk7XG4gIHZlYzIgZGlyID0gcHJvamVjdF8yXzEoc2NhbGVIaSwgc2NhbGVMbywgZEhpLCBkTG8pO1xuICB2ZWMyIG4gPSAwLjUgKiB3aWR0aCAqIG5vcm1hbGl6ZShzY3JlZW5TaGFwZS55eCAqIHZlYzIoZGlyLnksIC1kaXIueCkpIC8gc2NyZWVuU2hhcGUueHk7XG4gIHZlYzIgdGFuZ2VudCA9IG5vcm1hbGl6ZShzY3JlZW5TaGFwZS54eSAqIGRpcik7XG4gIGlmKGRpci54IDwgMC4wIHx8IChkaXIueCA9PSAwLjAgJiYgZGlyLnkgPCAwLjApKSB7XG4gICAgZGlyZWN0aW9uID0gLXRhbmdlbnQ7XG4gIH0gZWxzZSB7XG4gICAgZGlyZWN0aW9uID0gdGFuZ2VudDtcbiAgfVxuICBnbF9Qb3NpdGlvbiA9IHZlYzQocCArIG4sIDAuMCwgMS4wKTtcbn0iLHIubGluZUZyYWdtZW50PSJwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzQgY29sb3I7XG51bmlmb3JtIHZlYzIgc2NyZWVuU2hhcGU7XG51bmlmb3JtIHNhbXBsZXIyRCBkYXNoUGF0dGVybjtcbnVuaWZvcm0gZmxvYXQgZGFzaExlbmd0aDtcblxudmFyeWluZyB2ZWMyIGRpcmVjdGlvbjtcblxudm9pZCBtYWluKCkge1xuICBmbG9hdCB0ID0gZnJhY3QoZG90KGRpcmVjdGlvbiwgZ2xfRnJhZ0Nvb3JkLnh5KSAvIGRhc2hMZW5ndGgpO1xuICB2ZWM0IHBjb2xvciA9IGNvbG9yICogdGV4dHVyZTJEKGRhc2hQYXR0ZXJuLCB2ZWMyKHQsIDAuMCkpLnI7XG4gIGdsX0ZyYWdDb2xvciA9IHZlYzQocGNvbG9yLnJnYiAqIHBjb2xvci5hLCBwY29sb3IuYSk7XG59IixyLm1pdHJlVmVydGV4PSJwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMiBhSGksIGFMbztcblxudW5pZm9ybSB2ZWMyIHNjYWxlSGksIHRyYW5zbGF0ZUhpLCBzY2FsZUxvLCB0cmFuc2xhdGVMbztcbnVuaWZvcm0gZmxvYXQgcmFkaXVzO1xuXG5cbnZlYzIgcHJvamVjdF8xXzAodmVjMiBzY0hpLCB2ZWMyIHRySGksIHZlYzIgc2NMbywgdmVjMiB0ckxvLCB2ZWMyIHBvc0hpLCB2ZWMyIHBvc0xvKSB7XG4gIHJldHVybiAocG9zSGkgKyB0ckhpKSAqIHNjSGlcbiAgICAgICArIChwb3NMbyArIHRyTG8pICogc2NIaVxuICAgICAgICsgKHBvc0hpICsgdHJIaSkgKiBzY0xvXG4gICAgICAgKyAocG9zTG8gKyB0ckxvKSAqIHNjTG87XG59XG5cblxudm9pZCBtYWluKCkge1xuICB2ZWMyIHAgPSBwcm9qZWN0XzFfMChzY2FsZUhpLCB0cmFuc2xhdGVIaSwgc2NhbGVMbywgdHJhbnNsYXRlTG8sIGFIaSwgYUxvKTtcbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHAsIDAuMCwgMS4wKTtcbiAgZ2xfUG9pbnRTaXplID0gcmFkaXVzO1xufSIsci5taXRyZUZyYWdtZW50PSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnVuaWZvcm0gdmVjNCBjb2xvcjtcblxudm9pZCBtYWluKCkge1xuICBpZihsZW5ndGgoZ2xfUG9pbnRDb29yZC54eSAtIDAuNSkgPiAwLjI1KSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLnJnYiwgY29sb3IuYSk7XG59IixyLnBpY2tWZXJ0ZXg9InByZWNpc2lvbiBoaWdocCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMyIGFIaSwgYUxvLCBkSGk7XG5hdHRyaWJ1dGUgdmVjNCBwaWNrMCwgcGljazE7XG5cbnVuaWZvcm0gdmVjMiBzY2FsZUhpLCB0cmFuc2xhdGVIaSwgc2NhbGVMbywgdHJhbnNsYXRlTG8sIHNjcmVlblNoYXBlO1xudW5pZm9ybSBmbG9hdCB3aWR0aDtcblxudmFyeWluZyB2ZWM0IHBpY2tBLCBwaWNrQjtcblxuXG52ZWMyIHByb2plY3RfMV8wKHZlYzIgc2NIaSwgdmVjMiB0ckhpLCB2ZWMyIHNjTG8sIHZlYzIgdHJMbywgdmVjMiBwb3NIaSwgdmVjMiBwb3NMbykge1xuICByZXR1cm4gKHBvc0hpICsgdHJIaSkgKiBzY0hpXG4gICAgICAgKyAocG9zTG8gKyB0ckxvKSAqIHNjSGlcbiAgICAgICArIChwb3NIaSArIHRySGkpICogc2NMb1xuICAgICAgICsgKHBvc0xvICsgdHJMbykgKiBzY0xvO1xufVxuXG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMiBwID0gcHJvamVjdF8xXzAoc2NhbGVIaSwgdHJhbnNsYXRlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUxvLCBhSGksIGFMbyk7XG4gIHZlYzIgbiA9IHdpZHRoICogbm9ybWFsaXplKHNjcmVlblNoYXBlLnl4ICogdmVjMihkSGkueSwgLWRIaS54KSkgLyBzY3JlZW5TaGFwZS54eTtcbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHAgKyBuLCAwLCAxKTtcbiAgcGlja0EgPSBwaWNrMDtcbiAgcGlja0IgPSBwaWNrMTtcbn0iLHIucGlja0ZyYWdtZW50PSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnVuaWZvcm0gdmVjNCBwaWNrT2Zmc2V0O1xuXG52YXJ5aW5nIHZlYzQgcGlja0EsIHBpY2tCO1xuXG52b2lkIG1haW4oKSB7XG4gIHZlYzQgZnJhZ0lkID0gdmVjNChwaWNrQS54eXosIDAuMCk7XG4gIGlmKHBpY2tCLncgPiBwaWNrQS53KSB7XG4gICAgZnJhZ0lkLnh5eiA9IHBpY2tCLnh5ejtcbiAgfVxuXG4gIGZyYWdJZCArPSBwaWNrT2Zmc2V0O1xuXG4gIGZyYWdJZC55ICs9IGZsb29yKGZyYWdJZC54IC8gMjU2LjApO1xuICBmcmFnSWQueCAtPSBmbG9vcihmcmFnSWQueCAvIDI1Ni4wKSAqIDI1Ni4wO1xuXG4gIGZyYWdJZC56ICs9IGZsb29yKGZyYWdJZC55IC8gMjU2LjApO1xuICBmcmFnSWQueSAtPSBmbG9vcihmcmFnSWQueSAvIDI1Ni4wKSAqIDI1Ni4wO1xuXG4gIGZyYWdJZC53ICs9IGZsb29yKGZyYWdJZC56IC8gMjU2LjApO1xuICBmcmFnSWQueiAtPSBmbG9vcihmcmFnSWQueiAvIDI1Ni4wKSAqIDI1Ni4wO1xuXG4gIGdsX0ZyYWdDb2xvciA9IGZyYWdJZCAvIDI1NS4wO1xufSIsci5maWxsVmVydGV4PSJwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG5hdHRyaWJ1dGUgdmVjMiBhSGksIGFMbywgZEhpO1xuXG51bmlmb3JtIHZlYzIgc2NhbGVIaSwgdHJhbnNsYXRlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUxvLCBwcm9qZWN0QXhpcztcbnVuaWZvcm0gZmxvYXQgcHJvamVjdFZhbHVlLCBkZXB0aDtcblxuXG52ZWMyIHByb2plY3RfMV8wKHZlYzIgc2NIaSwgdmVjMiB0ckhpLCB2ZWMyIHNjTG8sIHZlYzIgdHJMbywgdmVjMiBwb3NIaSwgdmVjMiBwb3NMbykge1xuICByZXR1cm4gKHBvc0hpICsgdHJIaSkgKiBzY0hpXG4gICAgICAgKyAocG9zTG8gKyB0ckxvKSAqIHNjSGlcbiAgICAgICArIChwb3NIaSArIHRySGkpICogc2NMb1xuICAgICAgICsgKHBvc0xvICsgdHJMbykgKiBzY0xvO1xufVxuXG5cbnZvaWQgbWFpbigpIHtcbiAgdmVjMiBwID0gcHJvamVjdF8xXzAoc2NhbGVIaSwgdHJhbnNsYXRlSGksIHNjYWxlTG8sIHRyYW5zbGF0ZUxvLCBhSGksIGFMbyk7XG4gIGlmKGRIaS55IDwgMC4wIHx8IChkSGkueSA9PSAwLjAgJiYgZEhpLnggPCAwLjApKSB7XG4gICAgaWYoZG90KHAsIHByb2plY3RBeGlzKSA8IHByb2plY3RWYWx1ZSkge1xuICAgICAgcCA9IHAgKiAoMS4wIC0gYWJzKHByb2plY3RBeGlzKSkgKyBwcm9qZWN0QXhpcyAqIHByb2plY3RWYWx1ZTtcbiAgICB9XG4gIH1cbiAgZ2xfUG9zaXRpb24gPSB2ZWM0KHAsIGRlcHRoLCAxKTtcbn0iLHIuZmlsbEZyYWdtZW50PSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbnVuaWZvcm0gdmVjNCBjb2xvcjtcblxudm9pZCBtYWluKCkge1xuICBnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLnJnYiAqIGNvbG9yLmEsIGNvbG9yLmEpO1xufSJ9LHt9XSwxNjg6W2Z1bmN0aW9uKHQsZSxyKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LGUscixuLGksYSxvLHMsbCl7dGhpcy5wbG90PXQsdGhpcy5kYXNoUGF0dGVybj1lLHRoaXMubGluZUJ1ZmZlckhpPXIsdGhpcy5saW5lQnVmZmVyTG89bix0aGlzLnBpY2tCdWZmZXI9aSx0aGlzLmxpbmVTaGFkZXI9YSx0aGlzLm1pdHJlU2hhZGVyPW8sdGhpcy5maWxsU2hhZGVyPXMsdGhpcy5waWNrU2hhZGVyPWwsdGhpcy51c2luZ0Rhc2hlcz0hMSx0aGlzLmJvdW5kcz1bMS8wLDEvMCwtMS8wLC0xLzBdLHRoaXMud2lkdGg9MSx0aGlzLmNvbG9yPVswLDAsMSwxXSx0aGlzLmZpbGw9WyExLCExLCExLCExXSx0aGlzLmZpbGxDb2xvcj1bWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSx0aGlzLmRhdGE9bnVsbCx0aGlzLm51bVBvaW50cz0wLHRoaXMudmVydENvdW50PTAsdGhpcy5waWNrT2Zmc2V0PTB9ZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQuc2xpY2UoKX0pfWZ1bmN0aW9uIGEodCxlKXt2YXIgcj10LmdsLGk9cyhyKSxhPXMociksdT1zKHIpLGM9bChyLFsxLDFdKSxmPW8ocixoLmxpbmVWZXJ0ZXgsaC5saW5lRnJhZ21lbnQpLGQ9byhyLGgubWl0cmVWZXJ0ZXgsaC5taXRyZUZyYWdtZW50KSxwPW8ocixoLmZpbGxWZXJ0ZXgsaC5maWxsRnJhZ21lbnQpLG09byhyLGgucGlja1ZlcnRleCxoLnBpY2tGcmFnbWVudCksdj1uZXcgbih0LGMsaSxhLHUsZixkLHAsbSk7cmV0dXJuIHQuYWRkT2JqZWN0KHYpLHYudXBkYXRlKGUpLHZ9ZS5leHBvcnRzPWE7dmFyIG89dCgiZ2wtc2hhZGVyIikscz10KCJnbC1idWZmZXIiKSxsPXQoImdsLXRleHR1cmUyZCIpLHU9dCgibmRhcnJheSIpLGM9dCgidHlwZWRhcnJheS1wb29sIiksaD10KCIuL2xpYi9zaGFkZXJzIiksZj1uLnByb3RvdHlwZTtmLnNldFByb2plY3Rpb25Nb2RlbD1mdW5jdGlvbigpe3ZhciB0PXtzY2FsZUhpOm5ldyBGbG9hdDMyQXJyYXkoWzAsMF0pLHNjYWxlTG86bmV3IEZsb2F0MzJBcnJheShbMCwwXSksdHJhbnNsYXRlSGk6bmV3IEZsb2F0MzJBcnJheShbMCwwXSksdHJhbnNsYXRlTG86bmV3IEZsb2F0MzJBcnJheShbMCwwXSksc2NyZWVuU2hhcGU6WzAsMF19O3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMuYm91bmRzLHI9dGhpcy5wbG90LnZpZXdCb3gsbj10aGlzLnBsb3QuZGF0YUJveCxpPWVbMl0tZVswXSxhPWVbM10tZVsxXSxvPW5bMl0tblswXSxzPW5bM10tblsxXSxsPXJbMl0tclswXSx1PXJbM10tclsxXSxjPTIqaS9vLGg9MiphL3MsZj0oZVswXS1uWzBdLS41Km8pL2ksZD0oZVsxXS1uWzFdLS41KnMpL2E7cmV0dXJuIHQuc2NhbGVIaVswXT1jLHQuc2NhbGVIaVsxXT1oLHQuc2NhbGVMb1swXT1jLXQuc2NhbGVIaVswXSx0LnNjYWxlTG9bMV09aC10LnNjYWxlSGlbMV0sdC50cmFuc2xhdGVIaVswXT1mLHQudHJhbnNsYXRlSGlbMV09ZCx0LnRyYW5zbGF0ZUxvWzBdPWYtdC50cmFuc2xhdGVIaVswXSx0LnRyYW5zbGF0ZUxvWzFdPWQtdC50cmFuc2xhdGVIaVsxXSx0LnNjcmVlblNoYXBlWzBdPWwsdC5zY3JlZW5TaGFwZVsxXT11LHR9fSgpLGYuc2V0UHJvamVjdGlvblVuaWZvcm1zPWZ1bmN0aW9uKHQsZSl7dC5zY2FsZUhpPWUuc2NhbGVIaSx0LnNjYWxlTG89ZS5zY2FsZUxvLHQudHJhbnNsYXRlSGk9ZS50cmFuc2xhdGVIaSx0LnRyYW5zbGF0ZUxvPWUudHJhbnNsYXRlTG8sdC5zY3JlZW5TaGFwZT1lLnNjcmVlblNoYXBlfSxmLmRyYXc9ZnVuY3Rpb24oKXt2YXIgdD1bMSwwXSxlPVstMSwwXSxyPVswLDFdLG49WzAsLTFdO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPXRoaXMudmVydENvdW50O2lmKGkpe3ZhciBhPXRoaXMuc2V0UHJvamVjdGlvbk1vZGVsKCksbz10aGlzLnBsb3Qscz10aGlzLndpZHRoLGw9by5nbCx1PW8ucGl4ZWxSYXRpbyxjPXRoaXMuY29sb3IsaD10aGlzLmZpbGxTaGFkZXIuYXR0cmlidXRlczt0aGlzLmxpbmVCdWZmZXJMby5iaW5kKCksaC5hTG8ucG9pbnRlcihsLkZMT0FULCExLDE2LDApLHRoaXMubGluZUJ1ZmZlckhpLmJpbmQoKTt2YXIgZj10aGlzLmZpbGw7aWYoZlswXXx8ZlsxXXx8ZlsyXXx8ZlszXSl7dmFyIGQ9dGhpcy5maWxsU2hhZGVyO2QuYmluZCgpO3ZhciBwPWQudW5pZm9ybXM7dGhpcy5zZXRQcm9qZWN0aW9uVW5pZm9ybXMocCxhKSxwLmRlcHRoPW8ubmV4dERlcHRoVmFsdWUoKSxoLmFIaS5wb2ludGVyKGwuRkxPQVQsITEsMTYsMCksaC5kSGkucG9pbnRlcihsLkZMT0FULCExLDE2LDgpLGwuZGVwdGhNYXNrKCEwKSxsLmVuYWJsZShsLkRFUFRIX1RFU1QpO3ZhciBtPXRoaXMuZmlsbENvbG9yO2ZbMF0mJihwLmNvbG9yPW1bMF0scC5wcm9qZWN0QXhpcz1lLHAucHJvamVjdFZhbHVlPTEsbC5kcmF3QXJyYXlzKGwuVFJJQU5HTEVTLDAsaSkpLGZbMV0mJihwLmNvbG9yPW1bMV0scC5wcm9qZWN0QXhpcz1uLHAucHJvamVjdFZhbHVlPTEsbC5kcmF3QXJyYXlzKGwuVFJJQU5HTEVTLDAsaSkpLGZbMl0mJihwLmNvbG9yPW1bMl0scC5wcm9qZWN0QXhpcz10LHAucHJvamVjdFZhbHVlPTEsbC5kcmF3QXJyYXlzKGwuVFJJQU5HTEVTLDAsaSkpLGZbM10mJihwLmNvbG9yPW1bM10scC5wcm9qZWN0QXhpcz1yLHAucHJvamVjdFZhbHVlPTEsbC5kcmF3QXJyYXlzKGwuVFJJQU5HTEVTLDAsaSkpLGwuZGVwdGhNYXNrKCExKSxsLmRpc2FibGUobC5ERVBUSF9URVNUKX12YXIgdj10aGlzLmxpbmVTaGFkZXI7di5iaW5kKCksdGhpcy5saW5lQnVmZmVyTG8uYmluZCgpLHYuYXR0cmlidXRlcy5hTG8ucG9pbnRlcihsLkZMT0FULCExLDE2LDApLHYuYXR0cmlidXRlcy5kTG8ucG9pbnRlcihsLkZMT0FULCExLDE2LDgpLHRoaXMubGluZUJ1ZmZlckhpLmJpbmQoKTt2YXIgZz12LnVuaWZvcm1zO3RoaXMuc2V0UHJvamVjdGlvblVuaWZvcm1zKGcsYSksZy5jb2xvcj1jLGcud2lkdGg9cyp1LGcuZGFzaFBhdHRlcm49dGhpcy5kYXNoUGF0dGVybi5iaW5kKCksZy5kYXNoTGVuZ3RoPXRoaXMuZGFzaExlbmd0aCp1O3ZhciB5PXYuYXR0cmlidXRlcztpZih5LmFIaS5wb2ludGVyKGwuRkxPQVQsITEsMTYsMCkseS5kSGkucG9pbnRlcihsLkZMT0FULCExLDE2LDgpLGwuZHJhd0FycmF5cyhsLlRSSUFOR0xFUywwLGkpLHM+MiYmIXRoaXMudXNpbmdEYXNoZXMpe3ZhciBiPXRoaXMubWl0cmVTaGFkZXI7dGhpcy5saW5lQnVmZmVyTG8uYmluZCgpLGIuYXR0cmlidXRlcy5hTG8ucG9pbnRlcihsLkZMT0FULCExLDQ4LDApLHRoaXMubGluZUJ1ZmZlckhpLmJpbmQoKSxiLmJpbmQoKTt2YXIgeD1iLnVuaWZvcm1zO3RoaXMuc2V0UHJvamVjdGlvblVuaWZvcm1zKHgsYSkseC5jb2xvcj1jLHgucmFkaXVzPXMqdSxiLmF0dHJpYnV0ZXMuYUhpLnBvaW50ZXIobC5GTE9BVCwhMSw0OCwwKSxsLmRyYXdBcnJheXMobC5QT0lOVFMsMCxpLzN8MCl9fX19KCksZi5kcmF3UGljaz1mdW5jdGlvbigpe3ZhciB0PVswLDAsMCwwXTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9dGhpcy52ZXJ0Q291bnQsbj10aGlzLm51bVBvaW50cztpZih0aGlzLnBpY2tPZmZzZXQ9ZSwhcilyZXR1cm4gZStuO3ZhciBpPXRoaXMuc2V0UHJvamVjdGlvbk1vZGVsKCksYT10aGlzLnBsb3Qsbz10aGlzLndpZHRoLHM9YS5nbCxsPWEucGlja1BpeGVsUmF0aW8sdT10aGlzLnBpY2tTaGFkZXIsYz10aGlzLnBpY2tCdWZmZXI7dFswXT0yNTUmZSx0WzFdPWU+Pj44JjI1NSx0WzJdPWU+Pj4xNiYyNTUsdFszXT1lPj4+MjQsdS5iaW5kKCk7dmFyIGg9dS51bmlmb3Jtczt0aGlzLnNldFByb2plY3Rpb25Vbmlmb3JtcyhoLGkpLGgud2lkdGg9bypsLGgucGlja09mZnNldD10O3ZhciBmPXUuYXR0cmlidXRlcztyZXR1cm4gdGhpcy5saW5lQnVmZmVySGkuYmluZCgpLGYuYUhpLnBvaW50ZXIocy5GTE9BVCwhMSwxNiwwKSxmLmRIaS5wb2ludGVyKHMuRkxPQVQsITEsMTYsOCksdGhpcy5saW5lQnVmZmVyTG8uYmluZCgpLGYuYUxvLnBvaW50ZXIocy5GTE9BVCwhMSwxNiwwKSxjLmJpbmQoKSxmLnBpY2swLnBvaW50ZXIocy5VTlNJR05FRF9CWVRFLCExLDgsMCksZi5waWNrMS5wb2ludGVyKHMuVU5TSUdORURfQllURSwhMSw4LDQpLHMuZHJhd0FycmF5cyhzLlRSSUFOR0xFUywwLHIpLGUrbn19KCksZi5waWNrPWZ1bmN0aW9uKHQsZSxyKXt2YXIgbj10aGlzLnBpY2tPZmZzZXQsaT10aGlzLm51bVBvaW50cztpZihyPG58fHI+PW4raSlyZXR1cm4gbnVsbDt2YXIgYT1yLW4sbz10aGlzLmRhdGE7cmV0dXJue29iamVjdDp0aGlzLHBvaW50SWQ6YSxkYXRhQ29vcmQ6W29bMiphXSxvWzIqYSsxXV19fSxmLnVwZGF0ZT1mdW5jdGlvbih0KXt0PXR8fHt9O3ZhciBlLHIsbixhLG8scz10aGlzLnBsb3QuZ2w7dGhpcy5jb2xvcj0odC5jb2xvcnx8WzAsMCwxLDFdKS5zbGljZSgpLHRoaXMud2lkdGg9Kyh0LndpZHRofHwxKSx0aGlzLmZpbGw9KHQuZmlsbHx8WyExLCExLCExLCExXSkuc2xpY2UoKSx0aGlzLmZpbGxDb2xvcj1pKHQuZmlsbENvbG9yfHxbWzAsMCwwLDFdLFswLDAsMCwxXSxbMCwwLDAsMV0sWzAsMCwwLDFdXSk7dmFyIGg9dC5kYXNoZXN8fFsxXSxmPTA7Zm9yKGU9MDtlPGgubGVuZ3RoOysrZSlmKz1oW2VdO3ZhciBkPWMubWFsbG9jVWludDgoZik7bj0wO3ZhciBwPTI1NTtmb3IoZT0wO2U8aC5sZW5ndGg7KytlKXtmb3Iocj0wO3I8aFtlXTsrK3IpZFtuKytdPXA7cF49MjU1fXRoaXMuZGFzaFBhdHRlcm4uZGlzcG9zZSgpLHRoaXMudXNpbmdEYXNoZXM9aC5sZW5ndGg+MSx0aGlzLmRhc2hQYXR0ZXJuPWwocyx1KGQsW2YsMSw0XSxbMSwwLDBdKSksdGhpcy5kYXNoUGF0dGVybi5taW5GaWx0ZXI9cy5ORUFSRVNULHRoaXMuZGFzaFBhdHRlcm4ubWFnRmlsdGVyPXMuTkVBUkVTVCx0aGlzLmRhc2hMZW5ndGg9ZixjLmZyZWUoZCk7dmFyIG09dC5wb3NpdGlvbnM7dGhpcy5kYXRhPW07dmFyIHY9dGhpcy5ib3VuZHM7dlswXT12WzFdPTEvMCx2WzJdPXZbM109LTEvMDt2YXIgZz10aGlzLm51bVBvaW50cz1tLmxlbmd0aD4+PjE7aWYoMCE9PWcpe2ZvcihlPTA7ZTxnOysrZSlhPW1bMiplXSxvPW1bMiplKzFdLGlzTmFOKGEpfHxpc05hTihvKXx8KHZbMF09TWF0aC5taW4odlswXSxhKSx2WzFdPU1hdGgubWluKHZbMV0sbyksdlsyXT1NYXRoLm1heCh2WzJdLGEpLHZbM109TWF0aC5tYXgodlszXSxvKSk7dlswXT09PXZbMl0mJih2WzJdKz0xKSx2WzNdPT09dlsxXSYmKHZbM10rPTEpO3ZhciB5PWMubWFsbG9jRmxvYXQ2NCgyNCooZy0xKSksYj1jLm1hbGxvY0Zsb2F0MzIoMjQqKGctMSkpLHg9Yy5tYWxsb2NGbG9hdDMyKDI0KihnLTEpKSxfPWMubWFsbG9jVWludDMyKDEyKihnLTEpKSx3PWIubGVuZ3RoLE09Xy5sZW5ndGg7bj1nO2Zvcih2YXIgaz0wO24+MTspe3ZhciBBPS0tbjthPW1bMipuXSxvPW1bMipuKzFdO3ZhciBUPUEtMSxTPW1bMipUXSxFPW1bMipUKzFdO2lmKCEoaXNOYU4oYSl8fGlzTmFOKG8pfHxpc05hTihTKXx8aXNOYU4oRSkpKXtrKz0xLGE9KGEtdlswXSkvKHZbMl0tdlswXSksbz0oby12WzFdKS8odlszXS12WzFdKSxTPShTLXZbMF0pLyh2WzJdLXZbMF0pLEU9KEUtdlsxXSkvKHZbM10tdlsxXSk7dmFyIEw9Uy1hLEM9RS1vLHo9QXwxPDwyNCxJPUEtMSxEPUEsUD1BLTF8MTw8MjQ7eVstLXddPS1DLHlbLS13XT0tTCx5Wy0td109byx5Wy0td109YSxfWy0tTV09eixfWy0tTV09SSx5Wy0td109Qyx5Wy0td109TCx5Wy0td109RSx5Wy0td109UyxfWy0tTV09RCxfWy0tTV09UCx5Wy0td109LUMseVstLXddPS1MLHlbLS13XT1FLHlbLS13XT1TLF9bLS1NXT1ELF9bLS1NXT1QLHlbLS13XT1DLHlbLS13XT1MLHlbLS13XT1FLHlbLS13XT1TLF9bLS1NXT1ELF9bLS1NXT1QLHlbLS13XT0tQyx5Wy0td109LUwseVstLXddPW8seVstLXddPWEsX1stLU1dPXosX1stLU1dPUkseVstLXddPUMseVstLXddPUwseVstLXddPW8seVstLXddPWEsX1stLU1dPXosX1stLU1dPUl9fWZvcihlPTA7ZTx5Lmxlbmd0aDtlKyspYltlXT15W2VdLHhbZV09eVtlXS1iW2VdO3RoaXMudmVydENvdW50PTYqayx0aGlzLmxpbmVCdWZmZXJIaS51cGRhdGUoYi5zdWJhcnJheSh3KSksdGhpcy5saW5lQnVmZmVyTG8udXBkYXRlKHguc3ViYXJyYXkodykpLHRoaXMucGlja0J1ZmZlci51cGRhdGUoXy5zdWJhcnJheShNKSksYy5mcmVlKHkpLGMuZnJlZShiKSxjLmZyZWUoeCksYy5mcmVlKF8pfX0sZi5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5wbG90LnJlbW92ZU9iamVjdCh0aGlzKSx0aGlzLmxpbmVCdWZmZXJMby5kaXNwb3NlKCksdGhpcy5saW5lQnVmZmVySGkuZGlzcG9zZSgpLHRoaXMucGlja0J1ZmZlci5kaXNwb3NlKCksdGhpcy5saW5lU2hhZGVyLmRpc3Bvc2UoKSx0aGlzLm1pdHJlU2hhZGVyLmRpc3Bvc2UoKSx0aGlzLmZpbGxTaGFkZXIuZGlzcG9zZSgpLHRoaXMucGlja1NoYWRlci5kaXNwb3NlKCksdGhpcy5kYXNoUGF0dGVybi5kaXNwb3NlKCl9fSx7Ii4vbGliL3NoYWRlcnMiOjE2NywiZ2wtYnVmZmVyIjoxNTQsImdsLXNoYWRlciI6MjUzLCJnbC10ZXh0dXJlMmQiOjI2NSxuZGFycmF5OjQ2NSwidHlwZWRhcnJheS1wb29sIjo1Mzl9XSwxNjk6W2Z1bmN0aW9uKHQsZSxyKXt2YXIgbj10KCJnbC1zaGFkZXIiKSxpPSJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDtcbiNkZWZpbmUgR0xTTElGWSAxXG5cbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uLCBuZXh0UG9zaXRpb247XG5hdHRyaWJ1dGUgZmxvYXQgYXJjTGVuZ3RoLCBsaW5lV2lkdGg7XG5hdHRyaWJ1dGUgdmVjNCBjb2xvcjtcblxudW5pZm9ybSB2ZWMyIHNjcmVlblNoYXBlO1xudW5pZm9ybSBmbG9hdCBwaXhlbFJhdGlvO1xudW5pZm9ybSBtYXQ0IG1vZGVsLCB2aWV3LCBwcm9qZWN0aW9uO1xuXG52YXJ5aW5nIHZlYzQgZnJhZ0NvbG9yO1xudmFyeWluZyB2ZWMzIHdvcmxkUG9zaXRpb247XG52YXJ5aW5nIGZsb2F0IHBpeGVsQXJjTGVuZ3RoO1xuXG52b2lkIG1haW4oKSB7XG4gIHZlYzQgcHJvamVjdGVkID0gcHJvamVjdGlvbiAqIHZpZXcgKiBtb2RlbCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XG4gIHZlYzQgdGFuZ2VudENsaXAgPSBwcm9qZWN0aW9uICogdmlldyAqIG1vZGVsICogdmVjNChuZXh0UG9zaXRpb24gLSBwb3NpdGlvbiwgMC4wKTtcbiAgdmVjMiB0YW5nZW50ID0gbm9ybWFsaXplKHNjcmVlblNoYXBlICogdGFuZ2VudENsaXAueHkpO1xuICB2ZWMyIG9mZnNldCA9IDAuNSAqIHBpeGVsUmF0aW8gKiBsaW5lV2lkdGggKiB2ZWMyKHRhbmdlbnQueSwgLXRhbmdlbnQueCkgLyBzY3JlZW5TaGFwZTtcblxuICBnbF9Qb3NpdGlvbiA9IHZlYzQocHJvamVjdGVkLnh5ICsgcHJvamVjdGVkLncgKiBvZmZzZXQsIHByb2plY3RlZC56dyk7XG5cbiAgd29ybGRQb3NpdGlvbiA9IHBvc2l0aW9uO1xuICBwaXhlbEFyY0xlbmd0aCA9IGFyY0xlbmd0aDtcbiAgZnJhZ0NvbG9yID0gY29sb3I7XG59XG4iLGE9W3tuYW1lOiJwb3NpdGlvbiIsdHlwZToidmVjMyJ9LHtuYW1lOiJuZXh0UG9zaXRpb24iLHR5cGU6InZlYzMifSx7bmFtZToiYXJjTGVuZ3RoIix0eXBlOiJmbG9hdCJ9LHtuYW1lOiJsaW5lV2lkdGgiLHR5cGU6ImZsb2F0In0se25hbWU6ImNvbG9yIix0eXBlOiJ2ZWM0In1dO3IuY3JlYXRlU2hhZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsaSwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG51bmlmb3JtIHZlYzMgICAgICBjbGlwQm91bmRzWzJdO1xudW5pZm9ybSBzYW1wbGVyMkQgZGFzaFRleHR1cmU7XG51bmlmb3JtIGZsb2F0ICAgICBkYXNoU2NhbGU7XG51bmlmb3JtIGZsb2F0ICAgICBvcGFjaXR5O1xuXG52YXJ5aW5nIHZlYzMgICAgd29ybGRQb3NpdGlvbjtcbnZhcnlpbmcgZmxvYXQgICBwaXhlbEFyY0xlbmd0aDtcbnZhcnlpbmcgdmVjNCAgICBmcmFnQ29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgaWYoYW55KGxlc3NUaGFuKHdvcmxkUG9zaXRpb24sIGNsaXBCb3VuZHNbMF0pKSB8fCBhbnkoZ3JlYXRlclRoYW4od29ybGRQb3NpdGlvbiwgY2xpcEJvdW5kc1sxXSkpKSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuICBmbG9hdCBkYXNoV2VpZ2h0ID0gdGV4dHVyZTJEKGRhc2hUZXh0dXJlLCB2ZWMyKGRhc2hTY2FsZSAqIHBpeGVsQXJjTGVuZ3RoLCAwKSkucjtcbiAgaWYoZGFzaFdlaWdodCA8IDAuNSkge1xuICAgIGRpc2NhcmQ7XG4gIH1cbiAgZ2xfRnJhZ0NvbG9yID0gZnJhZ0NvbG9yICogb3BhY2l0eTtcbn1cbiIsbnVsbCxhKX0sci5jcmVhdGVQaWNrU2hhZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBuKHQsaSwicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZGVmaW5lIEdMU0xJRlkgMVxuXG4jZGVmaW5lIEZMT0FUX01BWCAgMS43MDE0MTE4NGUzOFxuI2RlZmluZSBGTE9BVF9NSU4gIDEuMTc1NDk0MzVlLTM4XG5cbmxvd3AgdmVjNCBlbmNvZGVfZmxvYXRfMV8wKGhpZ2hwIGZsb2F0IHYpIHtcbiAgaGlnaHAgZmxvYXQgYXYgPSBhYnModik7XG5cbiAgLy9IYW5kbGUgc3BlY2lhbCBjYXNlc1xuICBpZihhdiA8IEZMT0FUX01JTikge1xuICAgIHJldHVybiB2ZWM0KDAuMCwgMC4wLCAwLjAsIDAuMCk7XG4gIH0gZWxzZSBpZih2ID4gRkxPQVRfTUFYKSB7XG4gICAgcmV0dXJuIHZlYzQoMTI3LjAsIDEyOC4wLCAwLjAsIDAuMCkgLyAyNTUuMDtcbiAgfSBlbHNlIGlmKHYgPCAtRkxPQVRfTUFYKSB7XG4gICAgcmV0dXJuIHZlYzQoMjU1LjAsIDEyOC4wLCAwLjAsIDAuMCkgLyAyNTUuMDtcbiAgfVxuXG4gIGhpZ2hwIHZlYzQgYyA9IHZlYzQoMCwwLDAsMCk7XG5cbiAgLy9Db21wdXRlIGV4cG9uZW50IGFuZCBtYW50aXNzYVxuICBoaWdocCBmbG9hdCBlID0gZmxvb3IobG9nMihhdikpO1xuICBoaWdocCBmbG9hdCBtID0gYXYgKiBwb3coMi4wLCAtZSkgLSAxLjA7XG4gIFxuICAvL1VucGFjayBtYW50aXNzYVxuICBjWzFdID0gZmxvb3IoMTI4LjAgKiBtKTtcbiAgbSAtPSBjWzFdIC8gMTI4LjA7XG4gIGNbMl0gPSBmbG9vcigzMjc2OC4wICogbSk7XG4gIG0gLT0gY1syXSAvIDMyNzY4LjA7XG4gIGNbM10gPSBmbG9vcig4Mzg4NjA4LjAgKiBtKTtcbiAgXG4gIC8vVW5wYWNrIGV4cG9uZW50XG4gIGhpZ2hwIGZsb2F0IGViaWFzID0gZSArIDEyNy4wO1xuICBjWzBdID0gZmxvb3IoZWJpYXMgLyAyLjApO1xuICBlYmlhcyAtPSBjWzBdICogMi4wO1xuICBjWzFdICs9IGZsb29yKGViaWFzKSAqIDEyOC4wOyBcblxuICAvL1VucGFjayBzaWduIGJpdFxuICBjWzBdICs9IDEyOC4wICogc3RlcCgwLjAsIC12KTtcblxuICAvL1NjYWxlIGJhY2sgdG8gcmFuZ2VcbiAgcmV0dXJuIGMgLyAyNTUuMDtcbn1cblxuXG5cbnVuaWZvcm0gZmxvYXQgcGlja0lkO1xudW5pZm9ybSB2ZWMzIGNsaXBCb3VuZHNbMl07XG5cbnZhcnlpbmcgdmVjMyB3b3JsZFBvc2l0aW9uO1xudmFyeWluZyBmbG9hdCBwaXhlbEFyY0xlbmd0aDtcbnZhcnlpbmcgdmVjNCBmcmFnQ29sb3I7XG5cbnZvaWQgbWFpbigpIHtcbiAgaWYoYW55KGxlc3NUaGFuKHdvcmxkUG9zaXRpb24sIGNsaXBCb3VuZHNbMF0pKSB8fCBhbnkoZ3JlYXRlclRoYW4od29ybGRQb3NpdGlvbiwgY2xpcEJvdW5kc1sxXSkpKSB7XG4gICAgZGlzY2FyZDtcbiAgfVxuICBnbF9GcmFnQ29sb3IgPSB2ZWM0KHBpY2tJZC8yNTUuMCwgZW5jb2RlX2Zsb2F0XzFfMChwaXhlbEFyY0xlbmd0aCkueHl6KTtcbn0iLG51bGwsYSl9fSx7ImdsLXNoYWRlciI6MjUzfV0sMTcwOltmdW5jdGlvbih0LGUscil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxlKXtmb3IodmFyIHI9MCxuPTA7bjwzOysrbil7dmFyIGk9dFtuXS1lW25dO3IrPWkqaX1yZXR1cm4gTWF0aC5zcXJ0KHIpfWZ1bmN0aW9uIGkodCl7Zm9yKHZhciBlPVtbLTFlNiwtMWU2LC0xZTZdLFsxZTYsMWU2LDFlNl1dLHI9MDtyPDM7KytyKWVbMF1bcl09TWF0aC5tYXgodFswXVtyXSxlWzBdW3JdKSxlWzFdW3JdPU1hdGgubWluKHRbMV1bcl0sZVsxXVtyXSk7cmV0dXJuIGV9ZnVuY3Rpb24gYSh0LGUscixuKXt0aGlzLmFyY0xlbmd0aD10LHRoaXMucG9zaXRpb249ZSx0aGlzLmluZGV4PXIsdGhpcy5kYXRhQ29vcmRpbmF0ZT1ufWZ1bmN0aW9uIG8odCxlLHIsbixpLGEpe3RoaXMuZ2w9dCx0aGlzLnNoYWRlcj1lLHRoaXMucGlja1NoYWRlcj1yLHRoaXMuYnVmZmVyPW4sdGhpcy52YW89aSx0aGlzLmNsaXBCb3VuZHM9W1stMS8wLC0xLzAsLTEvMF0sWzEvMCwxLzAsMS8wXV0sdGhpcy5wb2ludHM9W10sdGhpcy5hcmNMZW5ndGg9W10sdGhpcy52ZXJ0ZXhDb3VudD0wLHRoaXMuYm91bmRzPVtbMCwwLDBdLFswLDAsMF1dLHRoaXMucGlja0lkPTAsdGhpcy5saW5lV2lkdGg9MSx0aGlzLnRleHR1cmU9YSx0aGlzLmRhc2hTY2FsZT0xLHRoaXMub3BhY2l0eT0xLHRoaXMuZGlydHk9ITAsdGhpcy5waXhlbFJhdGlvPTF9ZnVuY3Rpb24gcyh0KXt2YXIgZT10LmdsfHx0LnNjZW5lJiZ0LnNjZW5lLmdsLHI9bShlKTtyLmF0dHJpYnV0ZXMucG9zaXRpb24ubG9jYXRpb249MCxyLmF0dHJpYnV0ZXMubmV4dFBvc2l0aW9uLmxvY2F0aW9uPTEsci5hdHRyaWJ1dGVzLmFyY0xlbmd0aC5sb2NhdGlvbj0yLHIuYXR0cmlidXRlcy5saW5lV2lkdGgubG9jYXRpb249MywKci5hdHRyaWJ1dGVzLmNvbG9yLmxvY2F0aW9uPTQ7dmFyIG49dihlKTtuLmF0dHJpYnV0ZXMucG9zaXRpb24ubG9jYXRpb249MCxuLmF0dHJpYnV0ZXMubmV4dFBvc2l0aW9uLmxvY2F0aW9uPTEsbi5hdHRyaWJ1dGVzLmFyY0xlbmd0aC5sb2NhdGlvbj0yLG4uYXR0cmlidXRlcy5saW5lV2lkdGgubG9jYXRpb249MyxuLmF0dHJpYnV0ZXMuY29sb3IubG9jYXRpb249NDtmb3IodmFyIGk9bChlKSxhPXUoZSxbe2J1ZmZlcjppLHNpemU6MyxvZmZzZXQ6MCxzdHJpZGU6NDh9LHtidWZmZXI6aSxzaXplOjMsb2Zmc2V0OjEyLHN0cmlkZTo0OH0se2J1ZmZlcjppLHNpemU6MSxvZmZzZXQ6MjQsc3RyaWRlOjQ4fSx7YnVmZmVyOmksc2l6ZToxLG9mZnNldDoyOCxzdHJpZGU6NDh9LHtidWZmZXI6aSxzaXplOjQsb2Zmc2V0OjMyLHN0cmlkZTo0OH1dKSxzPWQobmV3IEFycmF5KDEwMjQpLFsyNTYsMSw0XSksaD0wO2g8MTAyNDsrK2gpcy5kYXRhW2hdPTI1NTt2YXIgZj1jKGUscyk7Zi53cmFwPWUuUkVQRUFUO3ZhciBwPW5ldyBvKGUscixuLGksYSxmKTtyZXR1cm4gcC51cGRhdGUodCkscH1lLmV4cG9ydHM9czt2YXIgbD10KCJnbC1idWZmZXIiKSx1PXQoImdsLXZhbyIpLGM9dCgiZ2wtdGV4dHVyZTJkIiksaD10KCJnbHNsLXJlYWQtZmxvYXQiKSxmPXQoImJpbmFyeS1zZWFyY2gtYm91bmRzIiksZD10KCJuZGFycmF5IikscD10KCIuL2xpYi9zaGFkZXJzIiksbT1wLmNyZWF0ZVNoYWRlcix2PXAuY3JlYXRlUGlja1NoYWRlcixnPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSx5PW8ucHJvdG90eXBlO3kuaXNUcmFuc3BhcmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wYWNpdHk8MX0seS5pc09wYXF1ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm9wYWNpdHk+PTF9LHkucGlja1Nsb3RzPTEseS5zZXRQaWNrQmFzZT1mdW5jdGlvbih0KXt0aGlzLnBpY2tJZD10fSx5LmRyYXdUcmFuc3BhcmVudD15LmRyYXc9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nbCxyPXRoaXMuc2hhZGVyLG49dGhpcy52YW87ci5iaW5kKCksci51bmlmb3Jtcz17bW9kZWw6dC5tb2RlbHx8Zyx2aWV3OnQudmlld3x8Zyxwcm9qZWN0aW9uOnQucHJvamVjdGlvbnx8ZyxjbGlwQm91bmRzOmkodGhpcy5jbGlwQm91bmRzKSxkYXNoVGV4dHVyZTp0aGlzLnRleHR1cmUuYmluZCgpLGRhc2hTY2FsZTp0aGlzLmRhc2hTY2FsZS90aGlzLmFyY0xlbmd0aFt0aGlzLmFyY0xlbmd0aC5sZW5ndGgtMV0sb3BhY2l0eTp0aGlzLm9wYWNpdHksc2NyZWVuU2hhcGU6W2UuZHJhd2luZ0J1ZmZlcldpZHRoLGUuZHJhd2luZ0J1ZmZlckhlaWdodF0scGl4ZWxSYXRpbzp0aGlzLnBpeGVsUmF0aW99LG4uYmluZCgpLG4uZHJhdyhlLlRSSUFOR0xFX1NUUklQLHRoaXMudmVydGV4Q291bnQpfSx5LmRyYXdQaWNrPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2wscj10aGlzLnBpY2tTaGFkZXIsbj10aGlzLnZhbztyLmJpbmQoKSxyLnVuaWZvcm1zPXttb2RlbDp0Lm1vZGVsfHxnLHZpZXc6dC52aWV3fHxnLHByb2plY3Rpb246dC5wcm9qZWN0aW9ufHxnLHBpY2tJZDp0aGlzLnBpY2tJZCxjbGlwQm91bmRzOmkodGhpcy5jbGlwQm91bmRzKSxzY3JlZW5TaGFwZTpbZS5kcmF3aW5nQnVmZmVyV2lkdGgsZS5kcmF3aW5nQnVmZmVySGVpZ2h0XSxwaXhlbFJhdGlvOnRoaXMucGl4ZWxSYXRpb30sbi5iaW5kKCksbi5kcmF3KGUuVFJJQU5HTEVfU1RSSVAsdGhpcy52ZXJ0ZXhDb3VudCl9LHkudXBkYXRlPWZ1bmN0aW9uKHQpe3ZhciBlLHI7dGhpcy5kaXJ0eT0hMDt2YXIgaT0hIXQuY29ubmVjdEdhcHM7ImRhc2hTY2FsZSJpbiB0JiYodGhpcy5kYXNoU2NhbGU9dC5kYXNoU2NhbGUpLCJvcGFjaXR5ImluIHQmJih0aGlzLm9wYWNpdHk9K3Qub3BhY2l0eSk7dmFyIGE9dC5wb3NpdGlvbnx8dC5wb3NpdGlvbnM7aWYoYSl7dmFyIG89dC5jb2xvcnx8dC5jb2xvcnN8fFswLDAsMCwxXSxzPXQubGluZVdpZHRofHwxLGw9W10sdT1bXSxjPVtdLGg9MCxwPTAsbT1bWzEvMCwxLzAsMS8wXSxbLTEvMCwtMS8wLC0xLzBdXSx2PSExO3Q6Zm9yKGU9MTtlPGEubGVuZ3RoOysrZSl7dmFyIGc9YVtlLTFdLHk9YVtlXTtmb3IodS5wdXNoKGgpLGMucHVzaChnLnNsaWNlKCkpLHI9MDtyPDM7KytyKXtpZihpc05hTihnW3JdKXx8aXNOYU4oeVtyXSl8fCFpc0Zpbml0ZShnW3JdKXx8IWlzRmluaXRlKHlbcl0pKXtpZighaSYmbC5sZW5ndGg+MCl7Zm9yKHZhciBiPTA7YjwyNDsrK2IpbC5wdXNoKGxbbC5sZW5ndGgtMTJdKTtwKz0yLHY9ITB9Y29udGludWUgdH1tWzBdW3JdPU1hdGgubWluKG1bMF1bcl0sZ1tyXSx5W3JdKSxtWzFdW3JdPU1hdGgubWF4KG1bMV1bcl0sZ1tyXSx5W3JdKX12YXIgeCxfO0FycmF5LmlzQXJyYXkob1swXSk/KHg9b1tlLTFdLF89b1tlXSk6eD1fPW8sMz09PXgubGVuZ3RoJiYoeD1beFswXSx4WzFdLHhbMl0sMV0pLDM9PT1fLmxlbmd0aCYmKF89W19bMF0sX1sxXSxfWzJdLDFdKTt2YXIgdzt3PUFycmF5LmlzQXJyYXkocyk/c1tlLTFdOnM7dmFyIE09aDtpZihoKz1uKGcseSksdil7Zm9yKHI9MDtyPDI7KytyKWwucHVzaChnWzBdLGdbMV0sZ1syXSx5WzBdLHlbMV0seVsyXSxNLHcseFswXSx4WzFdLHhbMl0seFszXSk7cCs9Mix2PSExfWwucHVzaChnWzBdLGdbMV0sZ1syXSx5WzBdLHlbMV0seVsyXSxNLHcseFswXSx4WzFdLHhbMl0seFszXSxnWzBdLGdbMV0sZ1syXSx5WzBdLHlbMV0seVsyXSxNLC13LHhbMF0seFsxXSx4WzJdLHhbM10seVswXSx5WzFdLHlbMl0sZ1swXSxnWzFdLGdbMl0saCwtdyxfWzBdLF9bMV0sX1syXSxfWzNdLHlbMF0seVsxXSx5WzJdLGdbMF0sZ1sxXSxnWzJdLGgsdyxfWzBdLF9bMV0sX1syXSxfWzNdKSxwKz00fWlmKHRoaXMuYnVmZmVyLnVwZGF0ZShsKSx1LnB1c2goaCksYy5wdXNoKGFbYS5sZW5ndGgtMV0uc2xpY2UoKSksdGhpcy5ib3VuZHM9bSx0aGlzLnZlcnRleENvdW50PXAsdGhpcy5wb2ludHM9Yyx0aGlzLmFyY0xlbmd0aD11LCJkYXNoZXMiaW4gdCl7dmFyIGs9dC5kYXNoZXMsQT1rLnNsaWNlKCk7Zm9yKEEudW5zaGlmdCgwKSxlPTE7ZTxBLmxlbmd0aDsrK2UpQVtlXT1BW2UtMV0rQVtlXTt2YXIgVD1kKG5ldyBBcnJheSgxMDI0KSxbMjU2LDEsNF0pO2ZvcihlPTA7ZTwyNTY7KytlKXtmb3Iocj0wO3I8NDsrK3IpVC5zZXQoZSwwLHIsMCk7MSZmLmxlKEEsQVtBLmxlbmd0aC0xXSplLzI1NSk/VC5zZXQoZSwwLDAsMCk6VC5zZXQoZSwwLDAsMjU1KX10aGlzLnRleHR1cmUuc2V0UGl4ZWxzKFQpfX19LHkuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuc2hhZGVyLmRpc3Bvc2UoKSx0aGlzLnZhby5kaXNwb3NlKCksdGhpcy5idWZmZXIuZGlzcG9zZSgpfSx5LnBpY2s9ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7aWYodC5pZCE9PXRoaXMucGlja0lkKXJldHVybiBudWxsO3ZhciBlPWgodC52YWx1ZVswXSx0LnZhbHVlWzFdLHQudmFsdWVbMl0sMCkscj1mLmxlKHRoaXMuYXJjTGVuZ3RoLGUpO2lmKHI8MClyZXR1cm4gbnVsbDtpZihyPT09dGhpcy5hcmNMZW5ndGgubGVuZ3RoLTEpcmV0dXJuIG5ldyBhKHRoaXMuYXJjTGVuZ3RoW3RoaXMuYXJjTGVuZ3RoLmxlbmd0aC0xXSx0aGlzLnBvaW50c1t0aGlzLnBvaW50cy5sZW5ndGgtMV0uc2xpY2UoKSxyKTtmb3IodmFyIG49dGhpcy5wb2ludHNbcl0saT10aGlzLnBvaW50c1tNYXRoLm1pbihyKzEsdGhpcy5wb2ludHMubGVuZ3RoLTEpXSxvPShlLXRoaXMuYXJjTGVuZ3RoW3JdKS8odGhpcy5hcmNMZW5ndGhbcisxXS10aGlzLmFyY0xlbmd0aFtyXSkscz0xLW8sbD1bMCwwLDBdLHU9MDt1PDM7Kyt1KWxbdV09cypuW3VdK28qaVt1XTt2YXIgYz1NYXRoLm1pbihvPC41P3I6cisxLHRoaXMucG9pbnRzLmxlbmd0aC0xKTtyZXR1cm4gbmV3IGEoZSxsLGMsdGhpcy5wb2ludHNbY10pfX0seyIuL2xpYi9zaGFkZXJzIjoxNjksImJpbmFyeS1zZWFyY2gtYm91bmRzIjo2NCwiZ2wtYnVmZmVyIjoxNTQsImdsLXRleHR1cmUyZCI6MjY1LCJnbC12YW8iOjI2OSwiZ2xzbC1yZWFkLWZsb2F0IjoyNzYsbmRhcnJheTo0NjV9XSwxNzE6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9ZVszXSxvPXIqYS1pKm47cmV0dXJuIG8/KG89MS9vLHRbMF09YSpvLHRbMV09LW4qbyx0WzJdPS1pKm8sdFszXT1yKm8sdCk6bnVsbH1lLmV4cG9ydHM9bn0se31dLDE3MjpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXt2YXIgcj1lWzBdLG49ZVsxXSxpPWVbMl0sYT1lWzNdLG89ZVs0XSxzPWVbNV0sbD1lWzZdLHU9ZVs3XSxjPWVbOF0saD1jKm8tcyp1LGY9LWMqYStzKmwsZD11KmEtbypsLHA9cipoK24qZitpKmQ7cmV0dXJuIHA/KHA9MS9wLHRbMF09aCpwLHRbMV09KC1jKm4raSp1KSpwLHRbMl09KHMqbi1pKm8pKnAsdFszXT1mKnAsdFs0XT0oYypyLWkqbCkqcCx0WzVdPSgtcypyK2kqYSkqcCx0WzZdPWQqcCx0WzddPSgtdSpyK24qbCkqcCx0WzhdPShvKnItbiphKSpwLHQpOm51bGx9ZS5leHBvcnRzPW59LHt9XSwxNzM6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3ZhciBlPW5ldyBGbG9hdDMyQXJyYXkoMTYpO3JldHVybiBlWzBdPXRbMF0sZVsxXT10WzFdLGVbMl09dFsyXSxlWzNdPXRbM10sZVs0XT10WzRdLGVbNV09dFs1XSxlWzZdPXRbNl0sZVs3XT10WzddLGVbOF09dFs4XSxlWzldPXRbOV0sZVsxMF09dFsxMF0sZVsxMV09dFsxMV0sZVsxMl09dFsxMl0sZVsxM109dFsxM10sZVsxNF09dFsxNF0sZVsxNV09dFsxNV0sZX1lLmV4cG9ydHM9bn0se31dLDE3NDpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4oKXt2YXIgdD1uZXcgRmxvYXQzMkFycmF5KDE2KTtyZXR1cm4gdFswXT0xLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPTEsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPTEsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9ZS5leHBvcnRzPW59LHt9XSwxNzU6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQpe3ZhciBlPXRbMF0scj10WzFdLG49dFsyXSxpPXRbM10sYT10WzRdLG89dFs1XSxzPXRbNl0sbD10WzddLHU9dFs4XSxjPXRbOV0saD10WzEwXSxmPXRbMTFdLGQ9dFsxMl0scD10WzEzXSxtPXRbMTRdLHY9dFsxNV07cmV0dXJuKGUqby1yKmEpKihoKnYtZiptKS0oZSpzLW4qYSkqKGMqdi1mKnApKyhlKmwtaSphKSooYyptLWgqcCkrKHIqcy1uKm8pKih1KnYtZipkKS0ocipsLWkqbykqKHUqbS1oKmQpKyhuKmwtaSpzKSoodSpwLWMqZCl9ZS5leHBvcnRzPW59LHt9XSwxNzY6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSl7dmFyIHI9ZVswXSxuPWVbMV0saT1lWzJdLGE9ZVszXSxvPXIrcixzPW4rbixsPWkraSx1PXIqbyxjPW4qbyxoPW4qcyxmPWkqbyxkPWkqcyxwPWkqbCxtPWEqbyx2PWEqcyxnPWEqbDtyZXR1cm4gdFswXT0xLWgtcCx0WzFdPWMrZyx0WzJdPWYtdix0WzNdPTAsdFs0XT1jLWcsdFs1XT0xLXUtcCx0WzZdPWQrbSx0WzddPTAsdFs4XT1mK3YsdFs5XT1kLW0sdFsxMF09MS11LWgsdFsxMV09MCx0WzEyXT0wLHRbMTNdPTAsdFsxNF09MCx0WzE1XT0xLHR9ZS5leHBvcnRzPW59LHt9XSwxNzc6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj1lWzBdLGk9ZVsxXSxhPWVbMl0sbz1lWzNdLHM9bituLGw9aStpLHU9YSthLGM9bipzLGg9bipsLGY9bip1LGQ9aSpsLHA9aSp1LG09YSp1LHY9bypzLGc9bypsLHk9byp1O3JldHVybiB0WzBdPTEtKGQrbSksdFsxXT1oK3ksdFsyXT1mLWcsdFszXT0wLHRbNF09aC15LHRbNV09MS0oYyttKSx0WzZdPXArdix0WzddPTAsdFs4XT1mK2csdFs5XT1wLXYsdFsxMF09MS0oYytkKSx0WzExXT0wLHRbMTJdPXJbMF0sdFsxM109clsxXSx0WzE0XT1yWzJdLHRbMTVdPTEsdH1lLmV4cG9ydHM9bn0se31dLDE3ODpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIHRbMF09MSx0WzFdPTAsdFsyXT0wLHRbM109MCx0WzRdPTAsdFs1XT0xLHRbNl09MCx0WzddPTAsdFs4XT0wLHRbOV09MCx0WzEwXT0xLHRbMTFdPTAsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTAsdFsxNV09MSx0fWUuZXhwb3J0cz1ufSx7fV0sMTc5OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUpe3ZhciByPWVbMF0sbj1lWzFdLGk9ZVsyXSxhPWVbM10sbz1lWzRdLHM9ZVs1XSxsPWVbNl0sdT1lWzddLGM9ZVs4XSxoPWVbOV0sZj1lWzEwXSxkPWVbMTFdLHA9ZVsxMl0sbT1lWzEzXSx2PWVbMTRdLGc9ZVsxNV0seT1yKnMtbipvLGI9cipsLWkqbyx4PXIqdS1hKm8sXz1uKmwtaSpzLHc9bip1LWEqcyxNPWkqdS1hKmwsaz1jKm0taCpwLEE9Yyp2LWYqcCxUPWMqZy1kKnAsUz1oKnYtZiptLEU9aCpnLWQqbSxMPWYqZy1kKnYsQz15KkwtYipFK3gqUytfKlQtdypBK00qaztyZXR1cm4gQz8oQz0xL0MsdFswXT0ocypMLWwqRSt1KlMpKkMsdFsxXT0oaSpFLW4qTC1hKlMpKkMsdFsyXT0obSpNLXYqdytnKl8pKkMsdFszXT0oZip3LWgqTS1kKl8pKkMsdFs0XT0obCpULW8qTC11KkEpKkMsdFs1XT0ocipMLWkqVCthKkEpKkMsdFs2XT0odip4LXAqTS1nKmIpKkMsdFs3XT0oYypNLWYqeCtkKmIpKkMsdFs4XT0obypFLXMqVCt1KmspKkMsdFs5XT0obipULXIqRS1hKmspKkMsdFsxMF09KHAqdy1tKngrZyp5KSpDLHRbMTFdPShoKngtYyp3LWQqeSkqQyx0WzEyXT0ocypBLW8qUy1sKmspKkMsdFsxM109KHIqUy1uKkEraSprKSpDLHRbMTRdPShtKmItcCpfLXYqeSkqQyx0WzE1XT0oYypfLWgqYitmKnkpKkMsdCk6bnVsbH1lLmV4cG9ydHM9bn0se31dLDE4MDpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIsbil7dmFyIGEsbyxzLGwsdSxjLGgsZixkLHAsbT1lWzBdLHY9ZVsxXSxnPWVbMl0seT1uWzBdLGI9blsxXSx4PW5bMl0sXz1yWzBdLHc9clsxXSxNPXJbMl07cmV0dXJuIE1hdGguYWJzKG0tXyk8MWUtNiYmTWF0aC5hYnModi13KTwxZS02JiZNYXRoLmFicyhnLU0pPDFlLTY/aSh0KTooaD1tLV8sZj12LXcsZD1nLU0scD0xL01hdGguc3FydChoKmgrZipmK2QqZCksaCo9cCxmKj1wLGQqPXAsYT1iKmQteCpmLG89eCpoLXkqZCxzPXkqZi1iKmgscD1NYXRoLnNxcnQoYSphK28qbytzKnMpLHA/KHA9MS9wLGEqPXAsbyo9cCxzKj1wKTooYT0wLG89MCxzPTApLGw9ZipzLWQqbyx1PWQqYS1oKnMsYz1oKm8tZiphLHA9TWF0aC5zcXJ0KGwqbCt1KnUrYypjKSxwPyhwPTEvcCxsKj1wLHUqPXAsYyo9cCk6KGw9MCx1PTAsYz0wKSx0WzBdPWEsdFsxXT1sLHRbMl09aCx0WzNdPTAsdFs0XT1vLHRbNV09dSx0WzZdPWYsdFs3XT0wLHRbOF09cyx0WzldPWMsdFsxMF09ZCx0WzExXT0wLHRbMTJdPS0oYSptK28qditzKmcpLHRbMTNdPS0obCptK3UqditjKmcpLHRbMTRdPS0oaCptK2YqditkKmcpLHRbMTVdPTEsdCl9dmFyIGk9dCgiLi9pZGVudGl0eSIpO2UuZXhwb3J0cz1ufSx7Ii4vaWRlbnRpdHkiOjE3OH1dLDE4MTpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuPWVbMF0saT1lWzFdLGE9ZVsyXSxvPWVbM10scz1lWzRdLGw9ZVs1XSx1PWVbNl0sYz1lWzddLGg9ZVs4XSxmPWVbOV0sZD1lWzEwXSxwPWVbMTFdLG09ZVsxMl0sdj1lWzEzXSxnPWVbMTRdLHk9ZVsxNV0sYj1yWzBdLHg9clsxXSxfPXJbMl0sdz1yWzNdO3JldHVybiB0WzBdPWIqbit4KnMrXypoK3cqbSx0WzFdPWIqaSt4KmwrXypmK3cqdix0WzJdPWIqYSt4KnUrXypkK3cqZyx0WzNdPWIqbyt4KmMrXypwK3cqeSxiPXJbNF0seD1yWzVdLF89cls2XSx3PXJbN10sdFs0XT1iKm4reCpzK18qaCt3Km0sdFs1XT1iKmkreCpsK18qZit3KnYsdFs2XT1iKmEreCp1K18qZCt3KmcsdFs3XT1iKm8reCpjK18qcCt3KnksYj1yWzhdLHg9cls5XSxfPXJbMTBdLHc9clsxMV0sdFs4XT1iKm4reCpzK18qaCt3Km0sdFs5XT1iKmkreCpsK18qZit3KnYsdFsxMF09YiphK3gqdStfKmQrdypnLHRbMTFdPWIqbyt4KmMrXypwK3cqeSxiPXJbMTJdLHg9clsxM10sXz1yWzE0XSx3PXJbMTVdLHRbMTJdPWIqbit4KnMrXypoK3cqbSx0WzEzXT1iKmkreCpsK18qZit3KnYsdFsxNF09YiphK3gqdStfKmQrdypnLHRbMTVdPWIqbyt4KmMrXypwK3cqeSx0fWUuZXhwb3J0cz1ufSx7fV0sMTgyOltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscixuLGkpe3ZhciBhPTEvTWF0aC50YW4oZS8yKSxvPTEvKG4taSk7cmV0dXJuIHRbMF09YS9yLHRbMV09MCx0WzJdPTAsdFszXT0wLHRbNF09MCx0WzVdPWEsdFs2XT0wLHRbN109MCx0WzhdPTAsdFs5XT0wLHRbMTBdPShpK24pKm8sdFsxMV09LTEsdFsxMl09MCx0WzEzXT0wLHRbMTRdPTIqaSpuKm8sdFsxNV09MCx0fWUuZXhwb3J0cz1ufSx7fV0sMTgzOltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscixuKXt2YXIgaSxhLG8scyxsLHUsYyxoLGYsZCxwLG0sdixnLHksYix4LF8sdyxNLGssQSxULFMsRT1uWzBdLEw9blsxXSxDPW5bMl0sej1NYXRoLnNxcnQoRSpFK0wqTCtDKkMpO3JldHVybiBNYXRoLmFicyh6KTwxZS02P251bGw6KHo9MS96LEUqPXosTCo9eixDKj16LGk9TWF0aC5zaW4ociksYT1NYXRoLmNvcyhyKSxvPTEtYSxzPWVbMF0sbD1lWzFdLHU9ZVsyXSxjPWVbM10saD1lWzRdLGY9ZVs1XSxkPWVbNl0scD1lWzddLG09ZVs4XSx2PWVbOV0sZz1lWzEwXSx5PWVbMTFdLGI9RSpFKm8rYSx4PUwqRSpvK0MqaSxfPUMqRSpvLUwqaSx3PUUqTCpvLUMqaSxNPUwqTCpvK2Esaz1DKkwqbytFKmksQT1FKkMqbytMKmksVD1MKkMqby1FKmksUz1DKkMqbythLHRbMF09cypiK2gqeCttKl8sdFsxXT1sKmIrZip4K3YqXyx0WzJdPXUqYitkKngrZypfLHRbM109YypiK3AqeCt5Kl8sdFs0XT1zKncraCpNK20qayx0WzVdPWwqdytmKk0rdiprLHRbNl09dSp3K2QqTStnKmssdFs3XT1jKncrcCpNK3kqayx0WzhdPXMqQStoKlQrbSpTLHRbOV09bCpBK2YqVCt2KlMsdFsxMF09dSpBK2QqVCtnKlMsdFsxMV09YypBK3AqVCt5KlMsZSE9PXQmJih0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSksdCl9ZS5leHBvcnRzPW59LHt9XSwxODQ6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj1NYXRoLnNpbihyKSxpPU1hdGguY29zKHIpLGE9ZVs0XSxvPWVbNV0scz1lWzZdLGw9ZVs3XSx1PWVbOF0sYz1lWzldLGg9ZVsxMF0sZj1lWzExXTtyZXR1cm4gZSE9PXQmJih0WzBdPWVbMF0sdFsxXT1lWzFdLHRbMl09ZVsyXSx0WzNdPWVbM10sdFsxMl09ZVsxMl0sdFsxM109ZVsxM10sdFsxNF09ZVsxNF0sdFsxNV09ZVsxNV0pLHRbNF09YSppK3Uqbix0WzVdPW8qaStjKm4sdFs2XT1zKmkraCpuLHRbN109bCppK2Yqbix0WzhdPXUqaS1hKm4sdFs5XT1jKmktbypuLHRbMTBdPWgqaS1zKm4sdFsxMV09ZippLWwqbix0fWUuZXhwb3J0cz1ufSx7fV0sMTg1OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7dmFyIG49TWF0aC5zaW4ociksaT1NYXRoLmNvcyhyKSxhPWVbMF0sbz1lWzFdLHM9ZVsyXSxsPWVbM10sdT1lWzhdLGM9ZVs5XSxoPWVbMTBdLGY9ZVsxMV07cmV0dXJuIGUhPT10JiYodFs0XT1lWzRdLHRbNV09ZVs1XSx0WzZdPWVbNl0sdFs3XT1lWzddLHRbMTJdPWVbMTJdLHRbMTNdPWVbMTNdLHRbMTRdPWVbMTRdLHRbMTVdPWVbMTVdKSx0WzBdPWEqaS11Km4sdFsxXT1vKmktYypuLHRbMl09cyppLWgqbix0WzNdPWwqaS1mKm4sdFs4XT1hKm4rdSppLHRbOV09bypuK2MqaSx0WzEwXT1zKm4raCppLHRbMTFdPWwqbitmKmksdH1lLmV4cG9ydHM9bn0se31dLDE4NjpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlLHIpe3ZhciBuPU1hdGguc2luKHIpLGk9TWF0aC5jb3MociksYT1lWzBdLG89ZVsxXSxzPWVbMl0sbD1lWzNdLHU9ZVs0XSxjPWVbNV0saD1lWzZdLGY9ZVs3XTtyZXR1cm4gZSE9PXQmJih0WzhdPWVbOF0sdFs5XT1lWzldLHRbMTBdPWVbMTBdLHRbMTFdPWVbMTFdLHRbMTJdPWVbMTJdLHRbMTNdPWVbMTNdLHRbMTRdPWVbMTRdLHRbMTVdPWVbMTVdKSx0WzBdPWEqaSt1Km4sdFsxXT1vKmkrYypuLHRbMl09cyppK2gqbix0WzNdPWwqaStmKm4sdFs0XT11KmktYSpuLHRbNV09YyppLW8qbix0WzZdPWgqaS1zKm4sdFs3XT1mKmktbCpuLHR9ZS5leHBvcnRzPW59LHt9XSwxODc6W2Z1bmN0aW9uKHQsZSxyKXtmdW5jdGlvbiBuKHQsZSxyKXt2YXIgbj1yWzBdLGk9clsxXSxhPXJbMl07cmV0dXJuIHRbMF09ZVswXSpuLHRbMV09ZVsxXSpuLHRbMl09ZVsyXSpuLHRbM109ZVszXSpuLHRbNF09ZVs0XSppLHRbNV09ZVs1XSppLHRbNl09ZVs2XSppLHRbN109ZVs3XSppLHRbOF09ZVs4XSphLHRbOV09ZVs5XSphLHRbMTBdPWVbMTBdKmEsdFsxMV09ZVsxMV0qYSx0WzEyXT1lWzEyXSx0WzEzXT1lWzEzXSx0WzE0XT1lWzE0XSx0WzE1XT1lWzE1XSx0fWUuZXhwb3J0cz1ufSx7fV0sMTg4OltmdW5jdGlvbih0LGUscil7ZnVuY3Rpb24gbih0LGUscil7dmFyIG4saSxhLG8scyxsLHUsYyxoLGYsZCxwLG09clswXSx2PXJbMV0sZz1yWzJdO3JldHVybiBlPT09dD8odFsxMl09ZVswXSptK2VbNF0qditlWzhdKmcrZVsxMl0sdFsxM109ZVsxXSptK2VbNV0qditlWzldKmcrZVsxM10sdFsxNF09ZVsyXSptK2VbNl0qditlWzEwXSpnK2VbMTRdLHRbMTVdPWVbM10qbStlWzddKnYrZVsxMV0qZytlWzE1XSk6KG49ZVswXSxpPWVbMV0sYT1lWzJdLG89ZVszXSxzPWVbNF0sbD1lWzVdLHU9ZVs2XSxjPWVbN10saD1lWzhdLGY9ZVs5XSxkPWVbMTBdLHA9ZVsxMV0sdFswXT1uLHRbMV09aSx0WzJdPWEsdFszXT1vLHRbNF09cyx0WzVdPWwsdFs2XT11LHRbN109Yyx0WzhdPWgsdFs5XT1mLHRbMTBdPWQsdFsxMV09cCx0WzEyXT1uKm0rcyp2K2gqZytlWzEyXSx0WzEzXT1pKm0rbCp2K2YqZytlWzEzXSx0WzE0XT1hKm0rdSp2K2QqZytlWzE0XSx0WzE1XT1vKm0rYyp2K3AqZytlWzE1XSksdH1lLmV4cG9ydHM9bn0se31dLDE4OTpbZnVuY3Rpb24odCxlLHIpe2Z1bmN0aW9uIG4odCxlKXtpZih0PT09ZSl7dmFyIHI9ZVsxXSxuPWVbMl0saT1lWzNdLGE9ZVs2XSxvPWVbN10scz1lWzExXTt0WzFdPWVbNF0sdFsyXT1lWzhdLHRbM109ZVsxMl0sdFs0XT1yLHRbNl09ZVs5XSx0WzddPWVbMTNdLHRbOF09bix0Wz
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment