Skip to content

Instantly share code, notes, and snippets.

@filipstachura
Created February 7, 2017 15:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save filipstachura/0ec130d0d8e478882d626ae94c77a117 to your computer and use it in GitHub Desktop.
Save filipstachura/0ec130d0d8e478882d626ae94c77a117 to your computer and use it in GitHub Desktop.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTaGlueS5yZW5kZXJEZXBlbmRlbmNpZXMoZGF0YS5kZXBzKTsKICAgICAgICBiaW5kaW5nRGVmLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgIH07CgogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQKICAgICAgaWYgKGJpbmRpbmdEZWYucmVzaXplKSB7CiAgICAgICAgc2hpbnlCaW5kaW5nLnJlc2l6ZSA9IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuCiAgICAgICAgICAvLyBjYWxsZWQsIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igd2lkZ2V0cy4KICAgICAgICAgIGlmIChlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgU2hpbnkub3V0cHV0QmluZGluZ3MucmVnaXN0ZXIoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLm5hbWUpOwogICAgfQogIH07CgogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3RhdGljUmVuZGVyKCkgewogICAgaWYgKCFzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQpIHsKICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfQoKICAvLyBSZW5kZXIgc3RhdGljIHdpZGdldHMgYWZ0ZXIgdGhlIGRvY3VtZW50IGZpbmlzaGVzIGxvYWRpbmcKICAvLyBTdGF0aWNhbGx5IHJlbmRlciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhpcyB3aWRnZXQncyBjbGFzcwogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiaW5kaW5ncyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICBmb3JFYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgdmFyIHNpemVPYmogPSBpbml0U2l6aW5nKGVsLCBiaW5kaW5nKTsKCiAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCAiaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOwoKICAgICAgICB2YXIgaW5pdFJlc3VsdDsKICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7CiAgICAgICAgICBpbml0UmVzdWx0ID0gYmluZGluZy5pbml0aWFsaXplKGVsLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICApOwogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIGluaXRSZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRpbmcucmVzaXplKSB7CiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsKICAgICAgICAgIHZhciByZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSBsYXN0U2l6ZS53ICYmIHNpemUuaCA9PT0gbGFzdFNpemUuaCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxhc3RTaXplID0gc2l6ZTsKICAgICAgICAgICAgYmluZGluZy5yZXNpemUoZWwsIHNpemUudywgc2l6ZS5oLCBpbml0UmVzdWx0KTsKICAgICAgICAgIH07CgogICAgICAgICAgb24od2luZG93LCAicmVzaXplIiwgcmVzaXplSGFuZGxlcik7CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYSBTaGlueQogICAgICAgICAgLy8gYXBwLCBidXQgdGhlIHdpZGdldCBpdHNlbGYgaXMgbm90IGEgU2hpbnkgb3V0cHV0LCBidXQKICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzCiAgICAgICAgICAvLyBhbiBybWFya2Rvd24gZG9jdW1lbnQgdGhhdCBoYXMgcnVudGltZTpzaGlueSBhbmQgd2lkZ2V0CiAgICAgICAgICAvLyB0aGF0IGlzbid0IGluIGEgcmVuZGVyIGZ1bmN0aW9uLiBTaGlueSBvbmx5IGtub3dzIHRvCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMKICAgICAgICAgIC8vIHdpZGdldHMsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KICAgICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJzaG93bi5odG1sd2lkZ2V0cyBzaG93bi5icy50YWIuaHRtbHdpZGdldHMgc2hvd24uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgImhpZGRlbi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMudGFiLmh0bWx3aWRnZXRzIGhpZGRlbi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWMgY2FzZSBvZiBpb3NsaWRlcywgd2hpY2gKICAgICAgICAgIC8vIGZsaXBzIHNsaWRlcyBiZXR3ZWVuIGRpc3BsYXk6bm9uZSBhbmQgZGlzcGxheTpibG9jay4KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUKICAgICAgICAgIC8vIGhlcmUsIGJ1dCByYXRoZXIgaGF2ZSBpb3NsaWRlcyByYWlzZSBhIGdlbmVyaWMgZXZlbnQsCiAgICAgICAgICAvLyBidXQgdGhlIHJtYXJrZG93biBwYWNrYWdlIGp1c3Qgd2VudCB0byBDUkFOIHNvIHRoZQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4KICAgICAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGxpbWl0IHRoaXMgdG8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cwogICAgICAgICAgICAvLyBzdWNoIGJyb3dzZXJzLgogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlZW50ZXIiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0RGF0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXSIpOwogICAgICAgIGlmIChzY3JpcHREYXRhKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOwogICAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2tdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGluaXRSZXN1bHQsIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOwogIH0KCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgfSwgZmFsc2UpOwogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9CiAgICB9KTsKICB9CgoKICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0QXR0YWNobWVudFVybCA9IGZ1bmN0aW9uKGRlcG5hbWUsIGtleSkgewogICAgLy8gSWYgbm8ga2V5LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBpdGVtCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSAxOwoKICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCAiICsgZGVwbmFtZSArICIvIiArIGtleSArICIgbm90IGZvdW5kIGluIGRvY3VtZW50Iik7CiAgICB9CiAgICByZXR1cm4gbGluay5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyA9IGZ1bmN0aW9uKGRmKSB7CiAgICB2YXIgbmFtZXMgPSBbXTsKICAgIHZhciBsZW5ndGg7CiAgICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICAgICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YoZGZbbmFtZV0pICE9PSAib2JqZWN0IiB8fCB0eXBlb2YoZGZbbmFtZV0ubGVuZ3RoKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGl0ZW07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7CiAgICAgICAgaXRlbSA9IHt9OwogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGRmW25hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgfQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy50cmFuc3Bvc2VBcnJheTJEID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5OwogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gZXZhbCgiKCIgKyBvW3BhcnRdICsgIikiKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIC8vIFJldHJpZXZlIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4KICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0Iik7CiAgfTsKCiAgLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZWxlbWVudCwgaWYgYW55LiBJZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmQgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgZWwgPSBzY29wZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UoZWwpOwogICAgfQogIH07CgogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZAogIC8vIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2VzIChpLmUuIHRoZSByZXR1cm4gdmFsdWVzIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdAogIC8vIG1hdGNoIHRoZSBzZWxlY3RvciBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgSFRNTFdpZGdldAogIC8vIGluc3RhbmNlLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIG51bGxzLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kQWxsID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIG5vZGVzID0gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRzLnB1c2god2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKG5vZGVzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB2YXIgcG9zdFJlbmRlckhhbmRsZXJzID0gW107CiAgZnVuY3Rpb24gaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCkgewogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsKICAgICAgdmFyIGhhbmRsZXIgPSBwb3N0UmVuZGVySGFuZGxlcnMuc2hpZnQoKTsKICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICBoYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHBvc3RSZW5kZXJIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTsKICB9OwoKICAvLyBUYWtlcyBhIG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9uLCBhbmQgcmV0dXJucyBhbgogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nCiAgLy8gdG8gcmV3cml0ZSBhbGwgdGhlIGxvZ2ljIGluIHRoaXMgZmlsZSB0byBhY2NvbW9kYXRlIGJvdGgKICAvLyB0eXBlcyBvZiBkZWZpbml0aW9ucy4KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7CiAgICB2YXIgcmVzdWx0ID0gewogICAgICBuYW1lOiBkZWZuLm5hbWUsCiAgICAgIHR5cGU6IGRlZm4udHlwZSwKICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICByZXR1cm4gZGVmbi5mYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfSwKICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZW5kZXJWYWx1ZSh4KTsKICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIGlmIChkZWZuLmZpbmQpCiAgICAgIHJlc3VsdC5maW5kID0gZGVmbi5maW5kOwogICAgaWYgKGRlZm4ucmVuZGVyRXJyb3IpCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7CiAgICBpZiAoZGVmbi5jbGVhckVycm9yKQogICAgICByZXN1bHQuY2xlYXJFcnJvciA9IGRlZm4uY2xlYXJFcnJvcjsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSkoKTsKCg=="></script>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOjAvMH1mdW5jdGlvbiB0KG4pe3JldHVybiBudWxsIT1uJiYhaXNOYU4obil9ZnVuY3Rpb24gZShuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24odFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiByKG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiB1KG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBpKG4sdCl7dHJ5e2Zvcih2YXIgZSBpbiB0KU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLnByb3RvdHlwZSxlLHt2YWx1ZTp0W2VdLGVudW1lcmFibGU6ITF9KX1jYXRjaChyKXtuLnByb3RvdHlwZT10fX1mdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIGEobil7cmV0dXJuIENvK24gaW4gdGhpc31mdW5jdGlvbiBzKG4pe3JldHVybiBuPUNvK24sbiBpbiB0aGlzJiZkZWxldGUgdGhpc1tuXX1mdW5jdGlvbiBjKCl7dmFyIG49W107cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbih0KXtuLnB1c2godCl9KSxufWZ1bmN0aW9uIGwoKXt2YXIgbj0wO2Zvcih2YXIgdCBpbiB0aGlzKXQuY2hhckNvZGVBdCgwKT09PUFvJiYrK247cmV0dXJuIG59ZnVuY3Rpb24gZigpe2Zvcih2YXIgbiBpbiB0aGlzKWlmKG4uY2hhckNvZGVBdCgwKT09PUFvKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGgoKXt9ZnVuY3Rpb24gZyhuLHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9ZS5hcHBseSh0LGFyZ3VtZW50cyk7cmV0dXJuIHI9PT10P246cn19ZnVuY3Rpb24gcChuLHQpe2lmKHQgaW4gbilyZXR1cm4gdDt0PXQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHJpbmcoMSk7Zm9yKHZhciBlPTAscj1Oby5sZW5ndGg7cj5lOysrZSl7dmFyIHU9Tm9bZV0rdDtpZih1IGluIG4pcmV0dXJuIHV9fWZ1bmN0aW9uIHYoKXt9ZnVuY3Rpb24gZCgpe31mdW5jdGlvbiBtKG4pe2Z1bmN0aW9uIHQoKXtmb3IodmFyIHQscj1lLHU9LTEsaT1yLmxlbmd0aDsrK3U8aTspKHQ9clt1XS5vbikmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBufXZhciBlPVtdLHI9bmV3IG87cmV0dXJuIHQub249ZnVuY3Rpb24odCx1KXt2YXIgaSxvPXIuZ2V0KHQpO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/byYmby5vbjoobyYmKG8ub249bnVsbCxlPWUuc2xpY2UoMCxpPWUuaW5kZXhPZihvKSkuY29uY2F0KGUuc2xpY2UoaSsxKSksci5yZW1vdmUodCkpLHUmJmUucHVzaChyLnNldCh0LHtvbjp1fSkpLG4pfSx0fWZ1bmN0aW9uIHkoKXtsby5ldmVudC5wcmV2ZW50RGVmYXVsdCgpfWZ1bmN0aW9uIHgoKXtmb3IodmFyIG4sdD1sby5ldmVudDtuPXQuc291cmNlRXZlbnQ7KXQ9bjtyZXR1cm4gdH1mdW5jdGlvbiBNKG4pe2Zvcih2YXIgdD1uZXcgZCxlPTAscj1hcmd1bWVudHMubGVuZ3RoOysrZTxyOyl0W2FyZ3VtZW50c1tlXV09bSh0KTtyZXR1cm4gdC5vZj1mdW5jdGlvbihlLHIpe3JldHVybiBmdW5jdGlvbih1KXt0cnl7dmFyIGk9dS5zb3VyY2VFdmVudD1sby5ldmVudDt1LnRhcmdldD1uLGxvLmV2ZW50PXUsdFt1LnR5cGVdLmFwcGx5KGUscil9ZmluYWxseXtsby5ldmVudD1pfX19LHR9ZnVuY3Rpb24gXyhuKXtyZXR1cm4gem8obixSbyksbn1mdW5jdGlvbiBiKG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gVG8obix0aGlzKX19ZnVuY3Rpb24gdyhuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIExvKG4sdGhpcyl9fWZ1bmN0aW9uIGsobix0KXtmdW5jdGlvbiBlKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUobil9ZnVuY3Rpb24gcigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKX1mdW5jdGlvbiB1KCl7dGhpcy5zZXRBdHRyaWJ1dGUobix0KX1mdW5jdGlvbiBpKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwsdCl9ZnVuY3Rpb24gbygpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGUobik6dGhpcy5zZXRBdHRyaWJ1dGUobixlKX1mdW5jdGlvbiBhKCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwsZSl9cmV0dXJuIG49bG8ubnMucXVhbGlmeShuKSxudWxsPT10P24ubG9jYWw/cjplOiJmdW5jdGlvbiI9PXR5cGVvZiB0P24ubG9jYWw/YTpvOm4ubG9jYWw/aTp1fWZ1bmN0aW9uIFMobil7cmV0dXJuIG4udHJpbSgpLnJlcGxhY2UoL1xzKy9nLCIgIil9ZnVuY3Rpb24gQyhuKXtyZXR1cm4gbmV3IFJlZ0V4cCgiKD86XnxcXHMrKSIrbG8ucmVxdW90ZShuKSsiKD86XFxzK3wkKSIsImciKX1mdW5jdGlvbiBBKG4pe3JldHVybihuKyIiKS50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gTihuLHQpe2Z1bmN0aW9uIGUoKXtmb3IodmFyIGU9LTE7KytlPHU7KW5bZV0odGhpcyx0KX1mdW5jdGlvbiByKCl7Zm9yKHZhciBlPS0xLHI9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7KytlPHU7KW5bZV0odGhpcyxyKX1uPUEobikubWFwKEUpO3ZhciB1PW4ubGVuZ3RoO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3I6ZX1mdW5jdGlvbiBFKG4pe3ZhciB0PUMobik7cmV0dXJuIGZ1bmN0aW9uKGUscil7aWYodT1lLmNsYXNzTGlzdClyZXR1cm4gcj91LmFkZChuKTp1LnJlbW92ZShuKTt2YXIgdT1lLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiI7cj8odC5sYXN0SW5kZXg9MCx0LnRlc3QodSl8fGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsUyh1KyIgIituKSkpOmUuc2V0QXR0cmlidXRlKCJjbGFzcyIsUyh1LnJlcGxhY2UodCwiICIpKSl9fWZ1bmN0aW9uIHoobix0LGUpe2Z1bmN0aW9uIHIoKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG4pfWZ1bmN0aW9uIHUoKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4sdCxlKX1mdW5jdGlvbiBpKCl7dmFyIHI9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG4pOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkobixyLGUpfXJldHVybiBudWxsPT10P3I6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/aTp1fWZ1bmN0aW9uIFQobix0KXtmdW5jdGlvbiBlKCl7ZGVsZXRlIHRoaXNbbl19ZnVuY3Rpb24gcigpe3RoaXNbbl09dH1mdW5jdGlvbiB1KCl7dmFyIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1tuXTp0aGlzW25dPWV9cmV0dXJuIG51bGw9PXQ/ZToiZnVuY3Rpb24iPT10eXBlb2YgdD91OnJ9ZnVuY3Rpb24gTChuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOihuPWxvLm5zLnF1YWxpZnkobikpLmxvY2FsP2Z1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobi5zcGFjZSxuLmxvY2FsKX06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0aGlzLm5hbWVzcGFjZVVSSSxuKX19ZnVuY3Rpb24gcShuKXtyZXR1cm57X19kYXRhX186bn19ZnVuY3Rpb24gRChuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gRG8odGhpcyxuKX19ZnVuY3Rpb24gUih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aHx8KHQ9biksZnVuY3Rpb24obixlKXtyZXR1cm4gbiYmZT90KG4uX19kYXRhX18sZS5fX2RhdGFfXyk6IW4tIWV9fWZ1bmN0aW9uIFAobix0KXtmb3IodmFyIGU9MCxyPW4ubGVuZ3RoO3I+ZTtlKyspZm9yKHZhciB1LGk9bltlXSxvPTAsYT1pLmxlbmd0aDthPm87bysrKSh1PWlbb10pJiZ0KHUsbyxlKTtyZXR1cm4gbn1mdW5jdGlvbiBVKG4pe3JldHVybiB6byhuLFVvKSxufWZ1bmN0aW9uIGoobil7dmFyIHQsZTtyZXR1cm4gZnVuY3Rpb24ocix1LGkpe3ZhciBvLGE9bltpXS51cGRhdGUscz1hLmxlbmd0aDtmb3IoaSE9ZSYmKGU9aSx0PTApLHU+PXQmJih0PXUrMSk7IShvPWFbdF0pJiYrK3Q8czspO3JldHVybiBvfX1mdW5jdGlvbiBIKCl7dmFyIG49dGhpcy5fX3RyYW5zaXRpb25fXztuJiYrK24uYWN0aXZlfWZ1bmN0aW9uIEYobix0LGUpe2Z1bmN0aW9uIHIoKXt2YXIgdD10aGlzW29dO3QmJih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobix0LHQuJCksZGVsZXRlIHRoaXNbb10pfWZ1bmN0aW9uIHUoKXt2YXIgdT1zKHQsaG8oYXJndW1lbnRzKSk7ci5jYWxsKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihuLHRoaXNbb109dSx1LiQ9ZSksdS5fPXR9ZnVuY3Rpb24gaSgpe3ZhciB0LGU9bmV3IFJlZ0V4cCgiXl9fb24oW14uXSspIitsby5yZXF1b3RlKG4pKyIkIik7Zm9yKHZhciByIGluIHRoaXMpaWYodD1yLm1hdGNoKGUpKXt2YXIgdT10aGlzW3JdO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0WzFdLHUsdS4kKSxkZWxldGUgdGhpc1tyXX19dmFyIG89Il9fb24iK24sYT1uLmluZGV4T2YoIi4iKSxzPU87YT4wJiYobj1uLnN1YnN0cmluZygwLGEpKTt2YXIgYz1Iby5nZXQobik7cmV0dXJuIGMmJihuPWMscz1ZKSxhP3Q/dTpyOnQ/djppfWZ1bmN0aW9uIE8obix0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9bG8uZXZlbnQ7bG8uZXZlbnQ9ZSx0WzBdPXRoaXMuX19kYXRhX187dHJ5e24uYXBwbHkodGhpcyx0KX1maW5hbGx5e2xvLmV2ZW50PXJ9fX1mdW5jdGlvbiBZKG4sdCl7dmFyIGU9TyhuLHQpO3JldHVybiBmdW5jdGlvbihuKXt2YXIgdD10aGlzLHI9bi5yZWxhdGVkVGFyZ2V0O3ImJihyPT09dHx8OCZyLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpKXx8ZS5jYWxsKHQsbil9fWZ1bmN0aW9uIEkoKXt2YXIgbj0iLmRyYWdzdXBwcmVzcy0iKyArK09vLHQ9ImNsaWNrIituLGU9bG8uc2VsZWN0KHZvKS5vbigidG91Y2htb3ZlIituLHkpLm9uKCJkcmFnc3RhcnQiK24seSkub24oInNlbGVjdHN0YXJ0IituLHkpO2lmKEZvKXt2YXIgcj1wby5zdHlsZSx1PXJbRm9dO3JbRm9dPSJub25lIn1yZXR1cm4gZnVuY3Rpb24oaSl7ZnVuY3Rpb24gbygpe2Uub24odCxudWxsKX1lLm9uKG4sbnVsbCksRm8mJihyW0ZvXT11KSxpJiYoZS5vbih0LGZ1bmN0aW9uKCl7eSgpLG8oKX0sITApLHNldFRpbWVvdXQobywwKSl9fWZ1bmN0aW9uIFoobix0KXt0LmNoYW5nZWRUb3VjaGVzJiYodD10LmNoYW5nZWRUb3VjaGVzWzBdKTt2YXIgZT1uLm93bmVyU1ZHRWxlbWVudHx8bjtpZihlLmNyZWF0ZVNWR1BvaW50KXt2YXIgcj1lLmNyZWF0ZVNWR1BvaW50KCk7aWYoMD5ZbyYmKHZvLnNjcm9sbFh8fHZvLnNjcm9sbFkpKXtlPWxvLnNlbGVjdCgiYm9keSIpLmFwcGVuZCgic3ZnIikuc3R5bGUoe3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOjAsbGVmdDowLG1hcmdpbjowLHBhZGRpbmc6MCxib3JkZXI6Im5vbmUifSwiaW1wb3J0YW50Iik7dmFyIHU9ZVswXVswXS5nZXRTY3JlZW5DVE0oKTtZbz0hKHUuZnx8dS5lKSxlLnJlbW92ZSgpfXJldHVybiBZbz8oci54PXQucGFnZVgsci55PXQucGFnZVkpOihyLng9dC5jbGllbnRYLHIueT10LmNsaWVudFkpLHI9ci5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFtyLngsci55XX12YXIgaT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVyblt0LmNsaWVudFgtaS5sZWZ0LW4uY2xpZW50TGVmdCx0LmNsaWVudFktaS50b3Atbi5jbGllbnRUb3BdfWZ1bmN0aW9uIFYoKXtyZXR1cm4gbG8uZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcn1mdW5jdGlvbiBYKCl7cmV0dXJuIGxvLmV2ZW50LnRhcmdldH1mdW5jdGlvbiAkKCl7cmV0dXJuIHZvfWZ1bmN0aW9uIEIobix0LGUpe3JldHVybih0WzBdLW5bMF0pKihlWzFdLW5bMV0pLSh0WzFdLW5bMV0pKihlWzBdLW5bMF0pfWZ1bmN0aW9uIFcobil7cmV0dXJuIG4+MT8wOi0xPm4/SW86TWF0aC5hY29zKG4pfWZ1bmN0aW9uIEoobil7cmV0dXJuIG4+MT9WbzotMT5uPy1WbzpNYXRoLmFzaW4obil9ZnVuY3Rpb24gRyhuKXtyZXR1cm4oKG49TWF0aC5leHAobikpLTEvbikvMn1mdW5jdGlvbiBLKG4pe3JldHVybigobj1NYXRoLmV4cChuKSkrMS9uKS8yfWZ1bmN0aW9uIFEobil7cmV0dXJuKChuPU1hdGguZXhwKDIqbikpLTEpLyhuKzEpfWZ1bmN0aW9uIG50KCl7fWZ1bmN0aW9uIHR0KG4sdCxlKXtyZXR1cm4gdGhpcyBpbnN0YW5jZW9mIHR0Pyh0aGlzLmg9K24sdGhpcy5zPSt0LHZvaWQodGhpcy5sPStlKSk6YXJndW1lbnRzLmxlbmd0aDwyP24gaW5zdGFuY2VvZiB0dD9uZXcgdHQobi5oLG4ucyxuLmwpOnZ0KCIiK24sZHQsdHQpOm5ldyB0dChuLHQsZSl9ZnVuY3Rpb24gZXQobix0LGUpe2Z1bmN0aW9uIHIobil7cmV0dXJuIG4+MzYwP24tPTM2MDowPm4mJihuKz0zNjApLDYwPm4/aSsoby1pKSpuLzYwOjE4MD5uP286MjQwPm4/aSsoby1pKSooMjQwLW4pLzYwOml9ZnVuY3Rpb24gdShuKXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqcihuKSl9dmFyIGksbztyZXR1cm4gbj1pc05hTihuKT8wOihuJT0zNjApPDA/biszNjA6bix0PWlzTmFOKHQpPzA6MD50PzA6dD4xPzE6dCxlPTA+ZT8wOmU+MT8xOmUsbz0uNT49ZT9lKigxK3QpOmUrdC1lKnQsaT0yKmUtbyxuZXcgZnQodShuKzEyMCksdShuKSx1KG4tMTIwKSl9ZnVuY3Rpb24gcnQobix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgcnQ/KHRoaXMuaD0rbix0aGlzLmM9K3Qsdm9pZCh0aGlzLmw9K2UpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIHJ0P25ldyBydChuLmgsbi5jLG4ubCk6biBpbnN0YW5jZW9mIGl0P2F0KG4ubCxuLmEsbi5iKTphdCgobj1tdCgobj1sby5yZ2IobikpLnIsbi5nLG4uYikpLmwsbi5hLG4uYik6bmV3IHJ0KG4sdCxlKX1mdW5jdGlvbiB1dChuLHQsZSl7cmV0dXJuIGlzTmFOKG4pJiYobj0wKSxpc05hTih0KSYmKHQ9MCksbmV3IGl0KGUsTWF0aC5jb3Mobio9Qm8pKnQsTWF0aC5zaW4obikqdCl9ZnVuY3Rpb24gaXQobix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgaXQ/KHRoaXMubD0rbix0aGlzLmE9K3Qsdm9pZCh0aGlzLmI9K2UpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIGl0P25ldyBpdChuLmwsbi5hLG4uYik6biBpbnN0YW5jZW9mIHJ0P3V0KG4ubCxuLmMsbi5oKTptdCgobj1mdChuKSkucixuLmcsbi5iKTpuZXcgaXQobix0LGUpfWZ1bmN0aW9uIG90KG4sdCxlKXt2YXIgcj0obisxNikvMTE2LHU9cit0LzUwMCxpPXItZS8yMDA7cmV0dXJuIHU9c3QodSkqaWEscj1zdChyKSpvYSxpPXN0KGkpKmFhLG5ldyBmdChsdCgzLjI0MDQ1NDIqdS0xLjUzNzEzODUqci0uNDk4NTMxNCppKSxsdCgtLjk2OTI2Nip1KzEuODc2MDEwOCpyKy4wNDE1NTYqaSksbHQoLjA1NTY0MzQqdS0uMjA0MDI1OSpyKzEuMDU3MjI1MippKSl9ZnVuY3Rpb24gYXQobix0LGUpe3JldHVybiBuPjA/bmV3IHJ0KE1hdGguYXRhbjIoZSx0KSpXbyxNYXRoLnNxcnQodCp0K2UqZSksbik6bmV3IHJ0KDAvMCwwLzAsbil9ZnVuY3Rpb24gc3Qobil7cmV0dXJuIG4+LjIwNjg5MzAzND9uKm4qbjoobi00LzI5KS83Ljc4NzAzN31mdW5jdGlvbiBjdChuKXtyZXR1cm4gbj4uMDA4ODU2P01hdGgucG93KG4sMS8zKTo3Ljc4NzAzNypuKzQvMjl9ZnVuY3Rpb24gbHQobil7cmV0dXJuIE1hdGgucm91bmQoMjU1KiguMDAzMDQ+PW4/MTIuOTIqbjoxLjA1NSpNYXRoLnBvdyhuLDEvMi40KS0uMDU1KSl9ZnVuY3Rpb24gZnQobix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgZnQ/KHRoaXMucj1+fm4sdGhpcy5nPX5+dCx2b2lkKHRoaXMuYj1+fmUpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIGZ0P25ldyBmdChuLnIsbi5nLG4uYik6dnQoIiIrbixmdCxldCk6bmV3IGZ0KG4sdCxlKX1mdW5jdGlvbiBodChuKXtyZXR1cm4gbmV3IGZ0KG4+PjE2LDI1NSZuPj44LDI1NSZuKX1mdW5jdGlvbiBndChuKXtyZXR1cm4gaHQobikrIiJ9ZnVuY3Rpb24gcHQobil7cmV0dXJuIDE2Pm4/IjAiK01hdGgubWF4KDAsbikudG9TdHJpbmcoMTYpOk1hdGgubWluKDI1NSxuKS50b1N0cmluZygxNil9ZnVuY3Rpb24gdnQobix0LGUpe3ZhciByLHUsaSxvPTAsYT0wLHM9MDtpZihyPS8oW2Etel0rKVwoKC4qKVwpL2kuZXhlYyhuKSlzd2l0Y2godT1yWzJdLnNwbGl0KCIsIiksclsxXSl7Y2FzZSJoc2wiOnJldHVybiBlKHBhcnNlRmxvYXQodVswXSkscGFyc2VGbG9hdCh1WzFdKS8xMDAscGFyc2VGbG9hdCh1WzJdKS8xMDApO2Nhc2UicmdiIjpyZXR1cm4gdCh4dCh1WzBdKSx4dCh1WzFdKSx4dCh1WzJdKSl9cmV0dXJuKGk9bGEuZ2V0KG4pKT90KGkucixpLmcsaS5iKToobnVsbD09bnx8IiMiIT09bi5jaGFyQXQoMCl8fGlzTmFOKGk9cGFyc2VJbnQobi5zdWJzdHJpbmcoMSksMTYpKXx8KDQ9PT1uLmxlbmd0aD8obz0oMzg0MCZpKT4+NCxvPW8+PjR8byxhPTI0MCZpLGE9YT4+NHxhLHM9MTUmaSxzPXM8PDR8cyk6Nz09PW4ubGVuZ3RoJiYobz0oMTY3MTE2ODAmaSk+PjE2LGE9KDY1MjgwJmkpPj44LHM9MjU1JmkpKSx0KG8sYSxzKSl9ZnVuY3Rpb24gZHQobix0LGUpe3ZhciByLHUsaT1NYXRoLm1pbihuLz0yNTUsdC89MjU1LGUvPTI1NSksbz1NYXRoLm1heChuLHQsZSksYT1vLWkscz0obytpKS8yO3JldHVybiBhPyh1PS41PnM/YS8obytpKTphLygyLW8taSkscj1uPT1vPyh0LWUpL2ErKGU+dD82OjApOnQ9PW8/KGUtbikvYSsyOihuLXQpL2ErNCxyKj02MCk6KHI9MC8wLHU9cz4wJiYxPnM/MDpyKSxuZXcgdHQocix1LHMpfWZ1bmN0aW9uIG10KG4sdCxlKXtuPXl0KG4pLHQ9eXQodCksZT15dChlKTt2YXIgcj1jdCgoLjQxMjQ1NjQqbisuMzU3NTc2MSp0Ky4xODA0Mzc1KmUpL2lhKSx1PWN0KCguMjEyNjcyOSpuKy43MTUxNTIyKnQrLjA3MjE3NSplKS9vYSksaT1jdCgoLjAxOTMzMzkqbisuMTE5MTkyKnQrLjk1MDMwNDEqZSkvYWEpO3JldHVybiBpdCgxMTYqdS0xNiw1MDAqKHItdSksMjAwKih1LWkpKX1mdW5jdGlvbiB5dChuKXtyZXR1cm4obi89MjU1KTw9LjA0MDQ1P24vMTIuOTI6TWF0aC5wb3coKG4rLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiB4dChuKXt2YXIgdD1wYXJzZUZsb2F0KG4pO3JldHVybiIlIj09PW4uY2hhckF0KG4ubGVuZ3RoLTEpP01hdGgucm91bmQoMi41NSp0KTp0fWZ1bmN0aW9uIE10KG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gbn19ZnVuY3Rpb24gX3Qobil7cmV0dXJuIG59ZnVuY3Rpb24gYnQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksd3QodCxlLG4scil9fWZ1bmN0aW9uIHd0KG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgbix0PXMuc3RhdHVzO2lmKCF0JiZzLnJlc3BvbnNlVGV4dHx8dD49MjAwJiYzMDA+dHx8MzA0PT09dCl7dHJ5e249ZS5jYWxsKGkscyl9Y2F0Y2gocil7cmV0dXJuIG8uZXJyb3IuY2FsbChpLHIpLHZvaWQgMH1vLmxvYWQuY2FsbChpLG4pfWVsc2Ugby5lcnJvci5jYWxsKGkscyl9dmFyIGk9e30sbz1sby5kaXNwYXRjaCgiYmVmb3Jlc2VuZCIsInByb2dyZXNzIiwibG9hZCIsImVycm9yIiksYT17fSxzPW5ldyBYTUxIdHRwUmVxdWVzdCxjPW51bGw7cmV0dXJuIXZvLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIHN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3Qobil8fChzPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBzP3Mub25sb2FkPXMub25lcnJvcj11OnMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7cy5yZWFkeVN0YXRlPjMmJnUoKX0scy5vbnByb2dyZXNzPWZ1bmN0aW9uKG4pe3ZhciB0PWxvLmV2ZW50O2xvLmV2ZW50PW47dHJ5e28ucHJvZ3Jlc3MuY2FsbChpLHMpfWZpbmFsbHl7bG8uZXZlbnQ9dH19LGkuaGVhZGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49KG4rIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2Fbbl06KG51bGw9PXQ/ZGVsZXRlIGFbbl06YVtuXT10KyIiLGkpfSxpLm1pbWVUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PW4/bnVsbDpuKyIiLGkpOnR9LGkucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4saSk6Y30saS5yZXNwb25zZT1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLGl9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24obil7aVtuXT1mdW5jdGlvbigpe3JldHVybiBpLnNlbmQuYXBwbHkoaSxbbl0uY29uY2F0KGhvKGFyZ3VtZW50cykpKX19KSxpLnNlbmQ9ZnVuY3Rpb24oZSxyLHUpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKHU9cixyPW51bGwpLHMub3BlbihlLG4sITApLG51bGw9PXR8fCJhY2NlcHQiaW4gYXx8KGEuYWNjZXB0PXQrIiwqLyoiKSxzLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBsIGluIGEpcy5zZXRSZXF1ZXN0SGVhZGVyKGwsYVtsXSk7cmV0dXJuIG51bGwhPXQmJnMub3ZlcnJpZGVNaW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlKHQpLG51bGwhPWMmJihzLnJlc3BvbnNlVHlwZT1jKSxudWxsIT11JiZpLm9uKCJlcnJvciIsdSkub24oImxvYWQiLGZ1bmN0aW9uKG4pe3UobnVsbCxuKX0pLG8uYmVmb3Jlc2VuZC5jYWxsKGkscykscy5zZW5kKG51bGw9PXI/bnVsbDpyKSxpfSxpLmFib3J0PWZ1bmN0aW9uKCl7cmV0dXJuIHMuYWJvcnQoKSxpfSxsby5yZWJpbmQoaSxvLCJvbiIpLG51bGw9PXI/aTppLmdldChrdChyKSl9ZnVuY3Rpb24ga3Qobil7cmV0dXJuIDE9PT1uLmxlbmd0aD9mdW5jdGlvbih0LGUpe24obnVsbD09dD9lOm51bGwpfTpufWZ1bmN0aW9uIFN0KCl7dmFyIG49Q3QoKSx0PUF0KCktbjt0PjI0Pyhpc0Zpbml0ZSh0KSYmKGNsZWFyVGltZW91dChwYSkscGE9c2V0VGltZW91dChTdCx0KSksZ2E9MCk6KGdhPTEsZGEoU3QpKX1mdW5jdGlvbiBDdCgpe3ZhciBuPURhdGUubm93KCk7Zm9yKHZhPWZhO3ZhOyluPj12YS50JiYodmEuZj12YS5jKG4tdmEudCkpLHZhPXZhLm47cmV0dXJuIG59ZnVuY3Rpb24gQXQoKXtmb3IodmFyIG4sdD1mYSxlPTEvMDt0Oyl0LmY/dD1uP24ubj10Lm46ZmE9dC5uOih0LnQ8ZSYmKGU9dC50KSx0PShuPXQpLm4pO3JldHVybiBoYT1uLGV9ZnVuY3Rpb24gTnQobix0KXtyZXR1cm4gdC0obj9NYXRoLmNlaWwoTWF0aC5sb2cobikvTWF0aC5MTjEwKToxKX1mdW5jdGlvbiBFdChuLHQpe3ZhciBlPU1hdGgucG93KDEwLDMqU28oOC10KSk7cmV0dXJue3NjYWxlOnQ+OD9mdW5jdGlvbihuKXtyZXR1cm4gbi9lfTpmdW5jdGlvbihuKXtyZXR1cm4gbiplfSxzeW1ib2w6bn19ZnVuY3Rpb24genQobil7dmFyIHQ9bi5kZWNpbWFsLGU9bi50aG91c2FuZHMscj1uLmdyb3VwaW5nLHU9bi5jdXJyZW5jeSxpPXI/ZnVuY3Rpb24obil7Zm9yKHZhciB0PW4ubGVuZ3RoLHU9W10saT0wLG89clswXTt0PjAmJm8+MDspdS5wdXNoKG4uc3Vic3RyaW5nKHQtPW8sdCtvKSksbz1yW2k9KGkrMSklci5sZW5ndGhdO3JldHVybiB1LnJldmVyc2UoKS5qb2luKGUpfTpfdDtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9eWEuZXhlYyhuKSxyPWVbMV18fCIgIixvPWVbMl18fCI+IixhPWVbM118fCIiLHM9ZVs0XXx8IiIsYz1lWzVdLGw9K2VbNl0sZj1lWzddLGg9ZVs4XSxnPWVbOV0scD0xLHY9IiIsZD0iIixtPSExO3N3aXRjaChoJiYoaD0raC5zdWJzdHJpbmcoMSkpLChjfHwiMCI9PT1yJiYiPSI9PT1vKSYmKGM9cj0iMCIsbz0iPSIsZiYmKGwtPU1hdGguZmxvb3IoKGwtMSkvNCkpKSxnKXtjYXNlIm4iOmY9ITAsZz0iZyI7YnJlYWs7Y2FzZSIlIjpwPTEwMCxkPSIlIixnPSJmIjticmVhaztjYXNlInAiOnA9MTAwLGQ9IiUiLGc9InIiO2JyZWFrO2Nhc2UiYiI6Y2FzZSJvIjpjYXNlIngiOmNhc2UiWCI6IiMiPT09cyYmKHY9IjAiK2cudG9Mb3dlckNhc2UoKSk7Y2FzZSJjIjpjYXNlImQiOm09ITAsaD0wO2JyZWFrO2Nhc2UicyI6cD0tMSxnPSJyIn0iJCI9PT1zJiYodj11WzBdLGQ9dVsxXSksInIiIT1nfHxofHwoZz0iZyIpLG51bGwhPWgmJigiZyI9PWc/aD1NYXRoLm1heCgxLE1hdGgubWluKDIxLGgpKTooImUiPT1nfHwiZiI9PWcpJiYoaD1NYXRoLm1heCgwLE1hdGgubWluKDIwLGgpKSkpLGc9eGEuZ2V0KGcpfHxUdDt2YXIgeT1jJiZmO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1kO2lmKG0mJm4lMSlyZXR1cm4iIjt2YXIgdT0wPm58fDA9PT1uJiYwPjEvbj8obj0tbiwiLSIpOmE7aWYoMD5wKXt2YXIgcz1sby5mb3JtYXRQcmVmaXgobixoKTtuPXMuc2NhbGUobiksZT1zLnN5bWJvbCtkfWVsc2Ugbio9cDtuPWcobixoKTt2YXIgeD1uLmxhc3RJbmRleE9mKCIuIiksTT0wPng/bjpuLnN1YnN0cmluZygwLHgpLF89MD54PyIiOnQrbi5zdWJzdHJpbmcoeCsxKTshYyYmZiYmKE09aShNKSk7dmFyIGI9di5sZW5ndGgrTS5sZW5ndGgrXy5sZW5ndGgrKHk/MDp1Lmxlbmd0aCksdz1sPmI/bmV3IEFycmF5KGI9bC1iKzEpLmpvaW4ocik6IiI7cmV0dXJuIHkmJihNPWkodytNKSksdSs9dixuPU0rXywoIjwiPT09bz91K24rdzoiPiI9PT1vP3crdStuOiJeIj09PW8/dy5zdWJzdHJpbmcoMCxiPj49MSkrdStuK3cuc3Vic3RyaW5nKGIpOnUrKHk/bjp3K24pKStlfX19ZnVuY3Rpb24gVHQobil7cmV0dXJuIG4rIiJ9ZnVuY3Rpb24gTHQoKXt0aGlzLl89bmV3IERhdGUoYXJndW1lbnRzLmxlbmd0aD4xP0RhdGUuVVRDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHNbMF0pfWZ1bmN0aW9uIHF0KG4sdCxlKXtmdW5jdGlvbiByKHQpe3ZhciBlPW4odCkscj1pKGUsMSk7cmV0dXJuIHItdD50LWU/ZTpyfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIHQoZT1uKG5ldyBfYShlLTEpKSwxKSxlfWZ1bmN0aW9uIGkobixlKXtyZXR1cm4gdChuPW5ldyBfYSgrbiksZSksbn1mdW5jdGlvbiBvKG4scixpKXt2YXIgbz11KG4pLGE9W107aWYoaT4xKWZvcig7cj5vOyllKG8pJWl8fGEucHVzaChuZXcgRGF0ZSgrbykpLHQobywxKTtlbHNlIGZvcig7cj5vOylhLnB1c2gobmV3IERhdGUoK28pKSx0KG8sMSk7cmV0dXJuIGF9ZnVuY3Rpb24gYShuLHQsZSl7dHJ5e19hPUx0O3ZhciByPW5ldyBMdDtyZXR1cm4gci5fPW4sbyhyLHQsZSl9ZmluYWxseXtfYT1EYXRlfX1uLmZsb29yPW4sbi5yb3VuZD1yLG4uY2VpbD11LG4ub2Zmc2V0PWksbi5yYW5nZT1vO3ZhciBzPW4udXRjPUR0KG4pO3JldHVybiBzLmZsb29yPXMscy5yb3VuZD1EdChyKSxzLmNlaWw9RHQodSkscy5vZmZzZXQ9RHQoaSkscy5yYW5nZT1hLG59ZnVuY3Rpb24gRHQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dHJ5e19hPUx0O3ZhciByPW5ldyBMdDtyZXR1cm4gci5fPXQsbihyLGUpLl99ZmluYWxseXtfYT1EYXRlfX19ZnVuY3Rpb24gUnQobil7ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiB0KHQpe2Zvcih2YXIgZSx1LGksbz1bXSxhPS0xLHM9MDsrK2E8cjspMzc9PT1uLmNoYXJDb2RlQXQoYSkmJihvLnB1c2gobi5zdWJzdHJpbmcocyxhKSksbnVsbCE9KHU9d2FbZT1uLmNoYXJBdCgrK2EpXSkmJihlPW4uY2hhckF0KCsrYSkpLChpPU5bZV0pJiYoZT1pKHQsbnVsbD09dT8iZSI9PT1lPyIgIjoiMCI6dSkpLG8ucHVzaChlKSxzPWErMSk7cmV0dXJuIG8ucHVzaChuLnN1YnN0cmluZyhzLGEpKSxvLmpvaW4oIiIpfXZhciByPW4ubGVuZ3RoO3JldHVybiB0LnBhcnNlPWZ1bmN0aW9uKHQpe3ZhciByPXt5OjE5MDAsbTowLGQ6MSxIOjAsTTowLFM6MCxMOjAsWjpudWxsfSx1PWUocixuLHQsMCk7aWYodSE9dC5sZW5ndGgpcmV0dXJuIG51bGw7InAiaW4gciYmKHIuSD1yLkglMTIrMTIqci5wKTt2YXIgaT1udWxsIT1yLlomJl9hIT09THQsbz1uZXcoaT9MdDpfYSk7cmV0dXJuImoiaW4gcj9vLnNldEZ1bGxZZWFyKHIueSwwLHIuaik6InciaW4gciYmKCJXImluIHJ8fCJVImluIHIpPyhvLnNldEZ1bGxZZWFyKHIueSwwLDEpLG8uc2V0RnVsbFllYXIoci55LDAsIlciaW4gcj8oci53KzYpJTcrNypyLlctKG8uZ2V0RGF5KCkrNSklNzpyLncrNypyLlUtKG8uZ2V0RGF5KCkrNiklNykpOm8uc2V0RnVsbFllYXIoci55LHIubSxyLmQpLG8uc2V0SG91cnMoci5IK01hdGguZmxvb3Ioci5aLzEwMCksci5NK3IuWiUxMDAsci5TLHIuTCksaT9vLl86b30sdC50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBufSx0fWZ1bmN0aW9uIGUobix0LGUscil7Zm9yKHZhciB1LGksbyxhPTAscz10Lmxlbmd0aCxjPWUubGVuZ3RoO3M+YTspe2lmKHI+PWMpcmV0dXJuLTE7aWYodT10LmNoYXJDb2RlQXQoYSsrKSwzNz09PXUpe2lmKG89dC5jaGFyQXQoYSsrKSxpPUVbbyBpbiB3YT90LmNoYXJBdChhKyspOm9dLCFpfHwocj1pKG4sZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKHUhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfWZ1bmN0aW9uIHIobix0LGUpe2IubGFzdEluZGV4PTA7dmFyIHI9Yi5leGVjKHQuc3Vic3RyaW5nKGUpKTtyZXR1cm4gcj8obi53PXcuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdShuLHQsZSl7TS5sYXN0SW5kZXg9MDt2YXIgcj1NLmV4ZWModC5zdWJzdHJpbmcoZSkpO3JldHVybiByPyhuLnc9Xy5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpKG4sdCxlKXtDLmxhc3RJbmRleD0wO3ZhciByPUMuZXhlYyh0LnN1YnN0cmluZyhlKSk7cmV0dXJuIHI/KG4ubT1BLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG8obix0LGUpe2subGFzdEluZGV4PTA7dmFyIHI9ay5leGVjKHQuc3Vic3RyaW5nKGUpKTtyZXR1cm4gcj8obi5tPVMuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gYShuLHQscil7cmV0dXJuIGUobixOLmMudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIHMobix0LHIpe3JldHVybiBlKG4sTi54LnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBjKG4sdCxyKXtyZXR1cm4gZShuLE4uWC50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gbChuLHQsZSl7dmFyIHI9eC5nZXQodC5zdWJzdHJpbmcoZSxlKz0yKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbnVsbD09cj8tMToobi5wPXIsZSl9dmFyIGY9bi5kYXRlVGltZSxoPW4uZGF0ZSxnPW4udGltZSxwPW4ucGVyaW9kcyx2PW4uZGF5cyxkPW4uc2hvcnREYXlzLG09bi5tb250aHMseT1uLnNob3J0TW9udGhzO3QudXRjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIGUobil7dHJ5e19hPUx0O3ZhciB0PW5ldyBfYTtyZXR1cm4gdC5fPW4scih0KX1maW5hbGx5e19hPURhdGV9fXZhciByPXQobik7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24obil7dHJ5e19hPUx0O3ZhciB0PXIucGFyc2Uobik7cmV0dXJuIHQmJnQuX31maW5hbGx5e19hPURhdGV9fSxlLnRvU3RyaW5nPXIudG9TdHJpbmcsZX0sdC5tdWx0aT10LnV0Yy5tdWx0aT10ZTt2YXIgeD1sby5tYXAoKSxNPVV0KHYpLF89anQodiksYj1VdChkKSx3PWp0KGQpLGs9VXQobSksUz1qdChtKSxDPVV0KHkpLEE9anQoeSk7cC5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7eC5zZXQobi50b0xvd2VyQ2FzZSgpLHQpfSk7dmFyIE49e2E6ZnVuY3Rpb24obil7cmV0dXJuIGRbbi5nZXREYXkoKV19LEE6ZnVuY3Rpb24obil7cmV0dXJuIHZbbi5nZXREYXkoKV19LGI6ZnVuY3Rpb24obil7cmV0dXJuIHlbbi5nZXRNb250aCgpXX0sQjpmdW5jdGlvbihuKXtyZXR1cm4gbVtuLmdldE1vbnRoKCldfSxjOnQoZiksZDpmdW5jdGlvbihuLHQpe3JldHVybiBQdChuLmdldERhdGUoKSx0LDIpfSxlOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFB0KG4uZ2V0RGF0ZSgpLHQsMil9LEg6ZnVuY3Rpb24obix0KXtyZXR1cm4gUHQobi5nZXRIb3VycygpLHQsMil9LEk6ZnVuY3Rpb24obix0KXtyZXR1cm4gUHQobi5nZXRIb3VycygpJTEyfHwxMix0LDIpfSxqOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFB0KDErTWEuZGF5T2ZZZWFyKG4pLHQsMyl9LEw6ZnVuY3Rpb24obix0KXtyZXR1cm4gUHQobi5nZXRNaWxsaXNlY29uZHMoKSx0LDMpfSxtOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFB0KG4uZ2V0TW9udGgoKSsxLHQsMil9LE06ZnVuY3Rpb24obix0KXtyZXR1cm4gUHQobi5nZXRNaW51dGVzKCksdCwyKX0scDpmdW5jdGlvbihuKXtyZXR1cm4gcFsrKG4uZ2V0SG91cnMoKT49MTIpXX0sUzpmdW5jdGlvbihuLHQpe3JldHVybiBQdChuLmdldFNlY29uZHMoKSx0LDIpfSxVOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFB0KE1hLnN1bmRheU9mWWVhcihuKSx0LDIpfSx3OmZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpfSxXOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFB0KE1hLm1vbmRheU9mWWVhcihuKSx0LDIpfSx4OnQoaCksWDp0KGcpLHk6ZnVuY3Rpb24obix0KXtyZXR1cm4gUHQobi5nZXRGdWxsWWVhcigpJTEwMCx0LDIpfSxZOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIFB0KG4uZ2V0RnVsbFllYXIoKSUxZTQsdCw0KX0sWjpRdCwiJSI6ZnVuY3Rpb24oKXtyZXR1cm4iJSJ9fSxFPXthOnIsQTp1LGI6aSxCOm8sYzphLGQ6JHQsZTokdCxIOld0LEk6V3QsajpCdCxMOkt0LG06WHQsTTpKdCxwOmwsUzpHdCxVOkZ0LHc6SHQsVzpPdCx4OnMsWDpjLHk6SXQsWTpZdCxaOlp0LCIlIjpuZX07cmV0dXJuIHR9ZnVuY3Rpb24gUHQobix0LGUpe3ZhciByPTA+bj8iLSI6IiIsdT0ocj8tbjpuKSsiIixpPXUubGVuZ3RoO3JldHVybiByKyhlPmk/bmV3IEFycmF5KGUtaSsxKS5qb2luKHQpK3U6dSl9ZnVuY3Rpb24gVXQobil7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK24ubWFwKGxvLnJlcXVvdGUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBqdChuKXtmb3IodmFyIHQ9bmV3IG8sZT0tMSxyPW4ubGVuZ3RoOysrZTxyOyl0LnNldChuW2VdLnRvTG93ZXJDYXNlKCksZSk7cmV0dXJuIHR9ZnVuY3Rpb24gSHQobix0LGUpe2thLmxhc3RJbmRleD0wO3ZhciByPWthLmV4ZWModC5zdWJzdHJpbmcoZSxlKzEpKTtyZXR1cm4gcj8obi53PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEZ0KG4sdCxlKXtrYS5sYXN0SW5kZXg9MDt2YXIgcj1rYS5leGVjKHQuc3Vic3RyaW5nKGUpKTtyZXR1cm4gcj8obi5VPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIE90KG4sdCxlKXtrYS5sYXN0SW5kZXg9MDt2YXIgcj1rYS5leGVjKHQuc3Vic3RyaW5nKGUpKTtyZXR1cm4gcj8obi5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFl0KG4sdCxlKXtrYS5sYXN0SW5kZXg9MDt2YXIgcj1rYS5leGVjKHQuc3Vic3RyaW5nKGUsZSs0KSk7cmV0dXJuIHI/KG4ueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBJdChuLHQsZSl7a2EubGFzdEluZGV4PTA7dmFyIHI9a2EuZXhlYyh0LnN1YnN0cmluZyhlLGUrMikpO3JldHVybiByPyhuLnk9VnQoK3JbMF0pLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFp0KG4sdCxlKXtyZXR1cm4vXlsrLV1cZHs0fSQvLnRlc3QodD10LnN1YnN0cmluZyhlLGUrNSkpPyhuLlo9LXQsZSs1KTotMX1mdW5jdGlvbiBWdChuKXtyZXR1cm4gbisobj42OD8xOTAwOjJlMyl9ZnVuY3Rpb24gWHQobix0LGUpe2thLmxhc3RJbmRleD0wO3ZhciByPWthLmV4ZWModC5zdWJzdHJpbmcoZSxlKzIpKTtyZXR1cm4gcj8obi5tPXJbMF0tMSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiAkdChuLHQsZSl7a2EubGFzdEluZGV4PTA7dmFyIHI9a2EuZXhlYyh0LnN1YnN0cmluZyhlLGUrMikpO3JldHVybiByPyhuLmQ9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gQnQobix0LGUpe2thLmxhc3RJbmRleD0wO3ZhciByPWthLmV4ZWModC5zdWJzdHJpbmcoZSxlKzMpKTtyZXR1cm4gcj8obi5qPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFd0KG4sdCxlKXtrYS5sYXN0SW5kZXg9MDt2YXIgcj1rYS5leGVjKHQuc3Vic3RyaW5nKGUsZSsyKSk7cmV0dXJuIHI/KG4uSD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKdChuLHQsZSl7a2EubGFzdEluZGV4PTA7dmFyIHI9a2EuZXhlYyh0LnN1YnN0cmluZyhlLGUrMikpO3JldHVybiByPyhuLk09K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gR3Qobix0LGUpe2thLmxhc3RJbmRleD0wO3ZhciByPWthLmV4ZWModC5zdWJzdHJpbmcoZSxlKzIpKTtyZXR1cm4gcj8obi5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEt0KG4sdCxlKXtrYS5sYXN0SW5kZXg9MDt2YXIgcj1rYS5leGVjKHQuc3Vic3RyaW5nKGUsZSszKSk7cmV0dXJuIHI/KG4uTD0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRdChuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCksZT10PjA/Ii0iOiIrIixyPX5+KFNvKHQpLzYwKSx1PVNvKHQpJTYwO3JldHVybiBlK1B0KHIsIjAiLDIpK1B0KHUsIjAiLDIpfWZ1bmN0aW9uIG5lKG4sdCxlKXtTYS5sYXN0SW5kZXg9MDt2YXIgcj1TYS5leGVjKHQuc3Vic3RyaW5nKGUsZSsxKSk7cmV0dXJuIHI/ZStyWzBdLmxlbmd0aDotMX1mdW5jdGlvbiB0ZShuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT0tMTsrK2U8dDspbltlXVswXT10aGlzKG5bZV1bMF0pO3JldHVybiBmdW5jdGlvbih0KXtmb3IodmFyIGU9MCxyPW5bZV07IXJbMV0odCk7KXI9blsrK2VdO3JldHVybiByWzBdKHQpfX1mdW5jdGlvbiBlZShuLHQpe24mJk5hLmhhc093blByb3BlcnR5KG4udHlwZSkmJk5hW24udHlwZV0obix0KX1mdW5jdGlvbiByZShuLHQsZSl7dmFyIHIsdT0tMSxpPW4ubGVuZ3RoLWU7Zm9yKHQubGluZVN0YXJ0KCk7Kyt1PGk7KXI9blt1XSx0LnBvaW50KHJbMF0qQm8sclsxXSpCbyk7dC5saW5lRW5kKCl9ZnVuY3Rpb24gdWUobix0KXt2YXIgZT0tMSxyPW4ubGVuZ3RoO2Zvcih0LnBvbHlnb25TdGFydCgpOysrZTxyOylyZShuW2VdLHQsMSk7dC5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24gaWUobix0KXtyZXR1cm57c3BoZXJlOmZ1bmN0aW9uKCl7bi5zcGhlcmUoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7bi5saW5lRW5kKCl9LHBvaW50OnR9fWZ1bmN0aW9uIG9lKG4sdCl7cmV0dXJuIGZ1bmN0aW9uKGUscil7ZSs9bixlPklvP2UtPVpvOi1Jbz5lJiYoZSs9Wm8pLHQucG9pbnQoZSxyKX19ZnVuY3Rpb24gYWUobix0LGUpe3ZhciByPU1hdGguY29zKHQpLHU9TWF0aC5zaW4odCk7cmV0dXJuIGZ1bmN0aW9uKHQsaSl7dCs9bix0PklvP3QtPVpvOi1Jbz50JiYodCs9Wm8pO3ZhciBvPU1hdGguY29zKGkpLGE9TWF0aC5jb3ModCkqbyxzPU1hdGguc2luKHQpKm8sYz1NYXRoLnNpbihpKTtlLnBvaW50KE1hdGguYXRhbjIocyxhKnItYyp1KSxKKGMqcithKnUpKX19ZnVuY3Rpb24gc2Uobix0LGUscil7dmFyIHU9TWF0aC5jb3ModCksaT1NYXRoLnNpbih0KSxvPU1hdGguY29zKGUpLGE9TWF0aC5zaW4oZSk7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dCs9bix0PklvP3QtPVpvOi1Jbz50JiYodCs9Wm8pO3ZhciBzPU1hdGguY29zKGUpLGM9TWF0aC5jb3ModCkqcyxsPU1hdGguc2luKHQpKnMsZj1NYXRoLnNpbihlKSxoPWYqdStjKmk7ci5wb2ludChNYXRoLmF0YW4yKGwqby1oKmEsYyp1LWYqaSksSihoKm8rbCphKSl9fWZ1bmN0aW9uIGNlKG4sdCxlKXt2YXIgcj1NYXRoLmNvcyh0KSx1PU1hdGguc2luKHQpO3JldHVybiBmdW5jdGlvbih0LGkpe3QrPW4sdD5Jbz90LT1abzotSW8+dCYmKHQrPVpvKTt2YXIgbz1NYXRoLmNvcyhpKSxhPU1hdGguY29zKHQpKm8scz1NYXRoLnNpbih0KSpvLGM9TWF0aC5zaW4oaSk7ZS5wb2ludChNYXRoLmF0YW4yKHMqci1jKnUsYSksSihjKnIrcyp1KSl9fWZ1bmN0aW9uIGxlKG4sdCl7dmFyIGU9TWF0aC5jb3Mobikscj1NYXRoLnNpbihuKTtyZXR1cm4gZnVuY3Rpb24obix1KXt2YXIgaT1NYXRoLmNvcyh1KSxvPU1hdGguY29zKG4pKmksYT1NYXRoLnNpbihuKSppLHM9TWF0aC5zaW4odSk7dC5wb2ludChNYXRoLmF0YW4yKGEsbyplLXMqciksSihzKmUrbypyKSl9fWZ1bmN0aW9uIGZlKG4sdCxlKXt2YXIgcj1NYXRoLmNvcyhuKSx1PU1hdGguc2luKG4pLGk9TWF0aC5jb3ModCksbz1NYXRoLnNpbih0KTtyZXR1cm4gZnVuY3Rpb24obix0KXt2YXIgYT1NYXRoLmNvcyh0KSxzPU1hdGguY29zKG4pKmEsYz1NYXRoLnNpbihuKSphLGw9TWF0aC5zaW4odCksZj1sKnIrcyp1O2UucG9pbnQoTWF0aC5hdGFuMihjKmktZipvLHMqci1sKnUpLEooZippK2MqbykpfX1mdW5jdGlvbiBoZShuLHQpe3ZhciBlPU1hdGguY29zKG4pLHI9TWF0aC5zaW4obik7cmV0dXJuIGZ1bmN0aW9uKG4sdSl7dmFyIGk9TWF0aC5jb3ModSksbz1NYXRoLmNvcyhuKSppLGE9TWF0aC5zaW4obikqaSxzPU1hdGguc2luKHUpO3QucG9pbnQoTWF0aC5hdGFuMihhKmUtcypyLG8pLEoocyplK2EqcikpfX1mdW5jdGlvbiBnZShuKXt2YXIgdD1uWzBdLGU9blsxXSxyPU1hdGguY29zKGUpO3JldHVybltyKk1hdGguY29zKHQpLHIqTWF0aC5zaW4odCksTWF0aC5zaW4oZSldfWZ1bmN0aW9uIHBlKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdfWZ1bmN0aW9uIHZlKG4sdCl7cmV0dXJuW25bMV0qdFsyXS1uWzJdKnRbMV0sblsyXSp0WzBdLW5bMF0qdFsyXSxuWzBdKnRbMV0tblsxXSp0WzBdXX1mdW5jdGlvbiBkZShuLHQpe25bMF0rPXRbMF0sblsxXSs9dFsxXSxuWzJdKz10WzJdfWZ1bmN0aW9uIG1lKG4sdCl7cmV0dXJuW25bMF0qdCxuWzFdKnQsblsyXSp0XX1mdW5jdGlvbiB5ZShuKXt2YXIgdD1NYXRoLnNxcnQoblswXSpuWzBdK25bMV0qblsxXStuWzJdKm5bMl0pO25bMF0vPXQsblsxXS89dCxuWzJdLz10fWZ1bmN0aW9uIHhlKCl7cmV0dXJuITB9ZnVuY3Rpb24gTWUobil7cmV0dXJuW01hdGguYXRhbjIoblsxXSxuWzBdKSxKKG5bMl0pXX1mdW5jdGlvbiBfZShuLHQpe3JldHVybiBTbyhuWzBdLXRbMF0pPFhvJiZTbyhuWzFdLXRbMV0pPFhvfWZ1bmN0aW9uIGJlKG4sdCxlLHIsdSl7dmFyIGk9W10sbz1bXTtpZihuLmZvckVhY2goZnVuY3Rpb24obil7aWYoISgodD1uLmxlbmd0aC0xKTw9MCkpe3ZhciB0LGU9blswXSxyPW5bdF07aWYoX2UoZSxyKSl7dS5saW5lU3RhcnQoKTtmb3IodmFyIGE9MDt0PmE7KythKXUucG9pbnQoKGU9blthXSlbMF0sZVsxXSk7cmV0dXJuIHUubGluZUVuZCgpLHZvaWQgMH12YXIgcz1uZXcga2UoZSxuLG51bGwsITApLGM9bmV3IGtlKGUsbnVsbCxzLCExKTtzLm89YyxpLnB1c2gocyksby5wdXNoKGMpLHM9bmV3IGtlKHIsbixudWxsLCExKSxjPW5ldyBrZShyLG51bGwscywhMCkscy5vPWMsaS5wdXNoKHMpLG8ucHVzaChjKX19KSxvLnNvcnQodCksd2UoaSksd2UobyksaS5sZW5ndGgpe2Zvcih2YXIgYT0wLHM9ZSxjPW8ubGVuZ3RoO2M+YTsrK2Epb1thXS5lPXM9IXM7Zm9yKHZhciBsLGYsaD1pWzBdOzspe2Zvcih2YXIgZz1oLHA9ITA7Zy52OylpZigoZz1nLm4pPT09aClyZXR1cm47bD1nLnosdS5saW5lU3RhcnQoKTtkb3tpZihnLnY9Zy5vLnY9ITAsZy5lKXtpZihwKWZvcih2YXIgYT0wLGM9bC5sZW5ndGg7Yz5hOysrYSl1LnBvaW50KChmPWxbYV0pWzBdLGZbMV0pO2Vsc2UgcihnLngsZy5uLngsMSx1KTtnPWcubn1lbHNle2lmKHApe2w9Zy5wLno7Zm9yKHZhciBhPWwubGVuZ3RoLTE7YT49MDstLWEpdS5wb2ludCgoZj1sW2FdKVswXSxmWzFdKX1lbHNlIHIoZy54LGcucC54LC0xLHUpO2c9Zy5wfWc9Zy5vLGw9Zy56LHA9IXB9d2hpbGUoIWcudik7dS5saW5lRW5kKCl9fX1mdW5jdGlvbiB3ZShuKXtpZih0PW4ubGVuZ3RoKXtmb3IodmFyIHQsZSxyPTAsdT1uWzBdOysrcjx0Oyl1Lm49ZT1uW3JdLGUucD11LHU9ZTt1Lm49ZT1uWzBdLGUucD11fX1mdW5jdGlvbiBrZShuLHQsZSxyKXt0aGlzLng9bix0aGlzLno9dCx0aGlzLm89ZSx0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIFNlKCl7dmFyIG4sdD1bXTtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5wdXNoKG49W10pfSxwb2ludDpmdW5jdGlvbih0LGUpe24ucHVzaChbdCxlXSl9LGxpbmVFbmQ6dixidWZmZXI6ZnVuY3Rpb24oKXt2YXIgZT10O3JldHVybiB0PVtdLG49bnVsbCxlfSxyZWpvaW46ZnVuY3Rpb24oKXt0Lmxlbmd0aD4xJiZ0LnB1c2godC5wb3AoKS5jb25jYXQodC5zaGlmdCgpKSl9fX1mdW5jdGlvbiBDZShuLHQsZSxyLHUpe2Z1bmN0aW9uIGkodCxlKXtuKHQsZSkmJnUucG9pbnQodCxlKX1mdW5jdGlvbiBvKG4sdCl7di5wb2ludChuLHQpfWZ1bmN0aW9uIGEoKXtkLnBvaW50PW8sdi5saW5lU3RhcnQoKX1mdW5jdGlvbiBzKCl7ZC5wb2ludD1pLHYubGluZUVuZCgpfWZ1bmN0aW9uIGMobix0KXtwLnB1c2goW24sdF0pLHkucG9pbnQobix0KX1mdW5jdGlvbiBsKCl7eS5saW5lU3RhcnQoKSxwPVtdfWZ1bmN0aW9uIGYoKXtjKHBbMF1bMF0scFswXVsxXSkseS5saW5lRW5kKCk7dmFyIG4sdD15LmNsZWFuKCksZT1tLmJ1ZmZlcigpLHI9ZS5sZW5ndGg7aWYocC5wb3AoKSxnLnB1c2gocCkscD1udWxsLHIpaWYoMSZ0KXtuPWVbMF07dmFyIGkscj1uLmxlbmd0aC0xLG89LTE7aWYocj4wKXtmb3IoeHx8KHUucG9seWdvblN0YXJ0KCkseD0hMCksdS5saW5lU3RhcnQoKTsrK288cjspdS5wb2ludCgoaT1uW29dKVswXSxpWzFdKTt1LmxpbmVFbmQoKX19ZWxzZSByPjEmJjImdCYmZS5wdXNoKGUucG9wKCkuY29uY2F0KGUuc2hpZnQoKSkpLGgucHVzaChlLmZpbHRlcihBZSkpfXZhciBoLGcscCx2PXQodSksZD17cG9pbnQ6aSxsaW5lU3RhcnQ6YSxsaW5lRW5kOnMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7ZC5wb2ludD1jLGQubGluZVN0YXJ0PWwsZC5saW5lRW5kPWYsaD1bXSxnPVtdfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7ZC5wb2ludD1pLGQubGluZVN0YXJ0PWEsZC5saW5lRW5kPXMsaD1sby5tZXJnZShoKTt2YXIgbj1UZShyLGcpO2gubGVuZ3RoPyh4fHwodS5wb2x5Z29uU3RhcnQoKSx4PSEwKSxiZShoLE5lLG4sZSx1KSk6biYmKHh8fCh1LnBvbHlnb25TdGFydCgpLHg9ITApLHUubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSx1KSx1LmxpbmVFbmQoKSkseCYmKHUucG9seWdvbkVuZCgpLHg9ITEpLGg9Zz1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXt1LnBvbHlnb25TdGFydCgpLHUubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSx1KSx1LmxpbmVFbmQoKSx1LnBvbHlnb25FbmQoKX19LG09U2UoKSx5PXQobSkseD0hMTtyZXR1cm4gZH1mdW5jdGlvbiBBZShuKXtyZXR1cm4gbi5sZW5ndGg+MX1mdW5jdGlvbiBOZShuLHQpe3JldHVybigobj1uLngpWzBdPDA/blsxXS1Wby1YbzpWby1uWzFdKS0oKHQ9dC54KVswXTwwP3RbMV0tVm8tWG86Vm8tdFsxXSl9ZnVuY3Rpb24gRWUoKXt9ZnVuY3Rpb24gemUobix0LGUpe3ZhciByPWUucz1uK3QsdT1yLW4saT1yLXU7ZS50PW4taSsodC11KX1mdW5jdGlvbiBUZShuLHQpe3ZhciBlPW5bMF0scj1uWzFdLHU9W01hdGguc2luKGUpLC1NYXRoLmNvcyhlKSwwXSxpPTAsbz0wO0xhLnJlc2V0KCk7Zm9yKHZhciBhPTAscz10Lmxlbmd0aDtzPmE7KythKXt2YXIgYz10W2FdLGw9Yy5sZW5ndGg7aWYobClmb3IodmFyIGY9Y1swXSxoPWZbMF0sZz1mWzFdLzIrSW8vNCxwPU1hdGguc2luKGcpLHY9TWF0aC5jb3MoZyksZD0xOzspe2Q9PT1sJiYoZD0wKSxuPWNbZF07dmFyIG09blswXSx5PW5bMV0vMitJby80LHg9TWF0aC5zaW4oeSksTT1NYXRoLmNvcyh5KSxfPW0taCxiPV8+PTA/MTotMSx3PWIqXyxrPXc+SW8sUz1wKng7aWYoTGEuYWRkKE1hdGguYXRhbjIoUypiKk1hdGguc2luKHcpLHYqTStTKk1hdGguY29zKHcpKSksaSs9az9fK2IqWm86XyxrXmg+PWVebT49ZSl7dmFyIEM9dmUoZ2UoZiksZ2UobikpO3llKEMpO3ZhciBBPXZlKHUsQyk7eWUoQSk7dmFyIE49KGteXz49MD8tMToxKSpKKEFbMl0pOyhyPk58fHI9PT1OJiYoQ1swXXx8Q1sxXSkpJiYobys9a15fPj0wPzE6LTEpfWlmKCFkKyspYnJlYWs7aD1tLHA9eCx2PU0sZj1ufX1yZXR1cm4oLVhvPml8fFhvPmkmJjA+TGEpXjEmb31mdW5jdGlvbiBMZShuKXt2YXIgdCxlPTAvMCxyPTAvMCx1PTAvMDtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5saW5lU3RhcnQoKSx0PTF9LHBvaW50OmZ1bmN0aW9uKGksbyl7dmFyIGE9aT4wP0lvOi1JbyxzPVNvKGktZSk7U28ocy1Jbyk8WG8/KG4ucG9pbnQoZSxyPShyK28pLzI+MD9WbzotVm8pLG4ucG9pbnQodSxyKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQoYSxyKSxuLnBvaW50KGksciksdD0wKTp1IT09YSYmcz49SW8mJihTbyhlLXUpPFhvJiYoZS09dSpYbyksU28oaS1hKTxYbyYmKGktPWEqWG8pLHI9cWUoZSxyLGksbyksbi5wb2ludCh1LHIpLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChhLHIpLHQ9MCksbi5wb2ludChlPWkscj1vKSx1PWF9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtuLmxpbmVFbmQoKSxlPXI9MC8wfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLXR9fX1mdW5jdGlvbiBxZShuLHQsZSxyKXt2YXIgdSxpLG89TWF0aC5zaW4obi1lKTtyZXR1cm4gU28obyk+WG8/TWF0aC5hdGFuKChNYXRoLnNpbih0KSooaT1NYXRoLmNvcyhyKSkqTWF0aC5zaW4oZSktTWF0aC5zaW4ocikqKHU9TWF0aC5jb3ModCkpKk1hdGguc2luKG4pKS8odSppKm8pKToodCtyKS8yfWZ1bmN0aW9uIERlKG4sdCxlLHIpe3ZhciB1O2lmKG51bGw9PW4pdT1lKlZvLHIucG9pbnQoLUlvLHUpLHIucG9pbnQoMCx1KSxyLnBvaW50KElvLHUpLHIucG9pbnQoSW8sMCksci5wb2ludChJbywtdSksci5wb2ludCgwLC11KSxyLnBvaW50KC1JbywtdSksci5wb2ludCgtSW8sMCksci5wb2ludCgtSW8sdSk7ZWxzZSBpZihTbyhuWzBdLXRbMF0pPlhvKXt2YXIgaT1uWzBdPHRbMF0/SW86LUlvO3U9ZSppLzIsci5wb2ludCgtaSx1KSxyLnBvaW50KDAsdSksci5wb2ludChpLHUpfWVsc2Ugci5wb2ludCh0WzBdLHRbMV0pfWZ1bmN0aW9uIFJlKG4sdCl7dmFyIGU9TWF0aC5jb3Mobikscj1NYXRoLnNpbihuKTtyZXR1cm4gZnVuY3Rpb24odSxpLG8sYSl7dmFyIHM9byp0O251bGwhPXU/KHU9UGUoZSx1KSxpPVBlKGUsaSksKG8+MD9pPnU6dT5pKSYmKHUrPW8qWm8pKToodT1uK28qWm8saT1uLS41KnMpO2Zvcih2YXIgYyxsPXU7bz4wP2w+aTppPmw7bC09cylhLnBvaW50KChjPU1lKFtlLC1yKk1hdGguY29zKGwpLC1yKk1hdGguc2luKGwpXSkpWzBdLGNbMV0pfX1mdW5jdGlvbiBQZShuLHQpe3ZhciBlPWdlKHQpO2VbMF0tPW4seWUoZSk7dmFyIHI9VygtZVsxXSk7cmV0dXJuKCgtZVsyXTwwPy1yOnIpKzIqTWF0aC5QSS1YbyklKDIqTWF0aC5QSSl9ZnVuY3Rpb24gVWUobix0LGUpe3ZhciByPWxvLnJhbmdlKG4sdC1YbyxlKS5jb25jYXQodCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiByLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bbix0XX0pfX1mdW5jdGlvbiBqZShuLHQsZSl7dmFyIHI9bG8ucmFuZ2Uobix0LVhvLGUpLmNvbmNhdCh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKHQpe3JldHVyblt0LG5dfSl9fWZ1bmN0aW9uIEhlKG4sdCl7ZnVuY3Rpb24gZSh0LGUpe3ZhciByPU1hdGguY29zKHQpLHU9TWF0aC5jb3MoZSksaT1uKHIqdSk7cmV0dXJuW2kqdSpNYXRoLnNpbih0KSxpKk1hdGguc2luKGUpXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obixlKXt2YXIgcj1NYXRoLnNxcnQobipuK2UqZSksdT10KHIpLGk9TWF0aC5zaW4odSksbz1NYXRoLmNvcyh1KTtyZXR1cm5bTWF0aC5hdGFuMihuKmkscipvKSxNYXRoLmFzaW4ociYmZSppL3IpXX0sZX1mdW5jdGlvbiBGZShuKXtyZXR1cm4gZnVuY3Rpb24odCxlKXt2YXIgcj1NYXRoLmNvcyhlKSx1PShuLTEpLyhuLXIqTWF0aC5jb3ModCkpO3JldHVyblt1KnIqTWF0aC5zaW4odCksdSpNYXRoLnNpbihlKV19fWZ1bmN0aW9uIE9lKG4pe3JldHVybiBuWzBdfWZ1bmN0aW9uIFllKG4pe3JldHVybiBuWzFdfWZ1bmN0aW9uIEllKG4pe2Zvcih2YXIgdD1uLmxlbmd0aCxlPVswLDFdLHI9Mix1PTI7dD51O3UrKyl7Zm9yKDtyPjEmJkIobltlW3ItMl1dLG5bZVtyLTFdXSxuW3VdKTw9MDspLS1yO2VbcisrXT11fXJldHVybiBlLnNsaWNlKDAscil9ZnVuY3Rpb24gWmUobix0KXtyZXR1cm4gblswXS10WzBdfHxuWzFdLXRbMV19ZnVuY3Rpb24gVmUobix0LGUpe3JldHVybihlWzBdLXRbMF0pKihuWzFdLXRbMV0pPChlWzFdLXRbMV0pKihuWzBdLXRbMF0pfWZ1bmN0aW9uIFhlKG4sdCxlLHIpe3ZhciB1PW5bMF0saT1lWzBdLG89dFswXS11LGE9clswXS1pLHM9blsxXSxjPWVbMV0sbD10WzFdLXMsZj1yWzFdLWMsaD0oYSoocy1jKS1mKih1LWkpKS8oZipvLWEqbCk7cmV0dXJuW3UraCpvLHMraCpsXX1mdW5jdGlvbiAkZShuKXt2YXIgdD1uWzBdLGU9bltuLmxlbmd0aC0xXTtyZXR1cm4hKHRbMF0tZVswXXx8dFsxXS1lWzFdKX1mdW5jdGlvbiBCZSgpe2RyKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBXZShuKXt2YXIgdD1IYS5wb3AoKXx8bmV3IEJlO3JldHVybiB0LnNpdGU9bix0fWZ1bmN0aW9uIEplKG4pe29yKG4pLFBhLnJlbW92ZShuKSxIYS5wdXNoKG4pLGRyKG4pfWZ1bmN0aW9uIEdlKG4pe3ZhciB0PW4uY2lyY2xlLGU9dC54LHI9dC5jeSx1PXt4OmUseTpyfSxpPW4uUCxvPW4uTixhPVtuXTtKZShuKTtmb3IodmFyIHM9aTtzLmNpcmNsZSYmU28oZS1zLmNpcmNsZS54KTxYbyYmU28oci1zLmNpcmNsZS5jeSk8WG87KWk9cy5QLGEudW5zaGlmdChzKSxKZShzKSxzPWk7YS51bnNoaWZ0KHMpLG9yKHMpO2Zvcih2YXIgYz1vO2MuY2lyY2xlJiZTbyhlLWMuY2lyY2xlLngpPFhvJiZTbyhyLWMuY2lyY2xlLmN5KTxYbzspbz1jLk4sYS5wdXNoKGMpLEplKGMpLGM9bzthLnB1c2goYyksb3IoYyk7dmFyIGwsZj1hLmxlbmd0aDtmb3IobD0xO2Y+bDsrK2wpYz1hW2xdLHM9YVtsLTFdLGdyKGMuZWRnZSxzLnNpdGUsYy5zaXRlLHUpO3M9YVswXSxjPWFbZi0xXSxjLmVkZ2U9ZnIocy5zaXRlLGMuc2l0ZSxudWxsLHUpLGlyKHMpLGlyKGMpfWZ1bmN0aW9uIEtlKG4pe2Zvcih2YXIgdCxlLHIsdSxpPW4ueCxvPW4ueSxhPVBhLl87YTspaWYocj1RZShhLG8pLWkscj5YbylhPWEuTDtlbHNle2lmKHU9aS1ucihhLG8pLCEodT5Ybykpe3I+LVhvPyh0PWEuUCxlPWEpOnU+LVhvPyh0PWEsZT1hLk4pOnQ9ZT1hO2JyZWFrfWlmKCFhLlIpe3Q9YTticmVha31hPWEuUn12YXIgcz1XZShuKTtpZihQYS5pbnNlcnQodCxzKSx0fHxlKXtpZih0PT09ZSlyZXR1cm4gb3IodCksZT1XZSh0LnNpdGUpLFBhLmluc2VydChzLGUpLHMuZWRnZT1lLmVkZ2U9ZnIodC5zaXRlLHMuc2l0ZSksaXIodCksaXIoZSksdm9pZCAwO2lmKCFlKXJldHVybiBzLmVkZ2U9ZnIodC5zaXRlLHMuc2l0ZSksdm9pZCAwO29yKHQpLG9yKGUpO3ZhciBjPXQuc2l0ZSxsPWMueCxmPWMueSxoPW4ueC1sLGc9bi55LWYscD1lLnNpdGUsdj1wLngtbCxkPXAueS1mLG09MiooaCpkLWcqdikseT1oKmgrZypnLHg9dip2K2QqZCxNPXt4OihkKnktZyp4KS9tK2wseTooaCp4LXYqeSkvbStmfTtncihlLmVkZ2UsYyxwLE0pLHMuZWRnZT1mcihjLG4sbnVsbCxNKSxlLmVkZ2U9ZnIobixwLG51bGwsTSksaXIodCksaXIoZSl9fWZ1bmN0aW9uIFFlKG4sdCl7dmFyIGU9bi5zaXRlLHI9ZS54LHU9ZS55LGk9dS10O2lmKCFpKXJldHVybiByO3ZhciBvPW4uUDtpZighbylyZXR1cm4tMS8wO2U9by5zaXRlO3ZhciBhPWUueCxzPWUueSxjPXMtdDtpZighYylyZXR1cm4gYTt2YXIgbD1hLXIsZj0xL2ktMS9jLGg9bC9jO3JldHVybiBmPygtaCtNYXRoLnNxcnQoaCpoLTIqZioobCpsLygtMipjKS1zK2MvMit1LWkvMikpKS9mK3I6KHIrYSkvMn1mdW5jdGlvbiBucihuLHQpe3ZhciBlPW4uTjtpZihlKXJldHVybiBRZShlLHQpO3ZhciByPW4uc2l0ZTtyZXR1cm4gci55PT09dD9yLng6MS8wfWZ1bmN0aW9uIHRyKG4pe3RoaXMuc2l0ZT1uLHRoaXMuZWRnZXM9W119ZnVuY3Rpb24gZXIobil7Zm9yKHZhciB0LGUscix1LGksbyxhLHMsYyxsLGY9blswXVswXSxoPW5bMV1bMF0sZz1uWzBdWzFdLHA9blsxXVsxXSx2PVJhLGQ9di5sZW5ndGg7ZC0tOylpZihpPXZbZF0saSYmaS5wcmVwYXJlKCkpZm9yKGE9aS5lZGdlcyxzPWEubGVuZ3RoLG89MDtzPm87KWw9YVtvXS5lbmQoKSxyPWwueCx1PWwueSxjPWFbKytvJXNdLnN0YXJ0KCksdD1jLngsZT1jLnksKFNvKHItdCk+WG98fFNvKHUtZSk+WG8pJiYoYS5zcGxpY2UobywwLG5ldyBwcihocihpLnNpdGUsbCxTbyhyLWYpPFhvJiZwLXU+WG8/e3g6Zix5OlNvKHQtZik8WG8/ZTpwfTpTbyh1LXApPFhvJiZoLXI+WG8/e3g6U28oZS1wKTxYbz90OmgseTpwfTpTbyhyLWgpPFhvJiZ1LWc+WG8/e3g6aCx5OlNvKHQtaCk8WG8/ZTpnfTpTbyh1LWcpPFhvJiZyLWY+WG8/e3g6U28oZS1nKTxYbz90OmYseTpnfTpudWxsKSxpLnNpdGUsbnVsbCkpLCsrcyl9ZnVuY3Rpb24gcnIobix0KXtyZXR1cm4gdC5hbmdsZS1uLmFuZ2xlfWZ1bmN0aW9uIHVyKCl7ZHIodGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIGlyKG4pe3ZhciB0PW4uUCxlPW4uTjtpZih0JiZlKXt2YXIgcj10LnNpdGUsdT1uLnNpdGUsaT1lLnNpdGU7aWYociE9PWkpe3ZhciBvPXUueCxhPXUueSxzPXIueC1vLGM9ci55LWEsbD1pLngtbyxmPWkueS1hLGg9MioocypmLWMqbCk7aWYoIShoPj0tJG8pKXt2YXIgZz1zKnMrYypjLHA9bCpsK2YqZix2PShmKmctYypwKS9oLGQ9KHMqcC1sKmcpL2gsZj1kK2EsbT1GYS5wb3AoKXx8bmV3IHVyO20uYXJjPW4sbS5zaXRlPXUsbS54PXYrbyxtLnk9ZitNYXRoLnNxcnQodip2K2QqZCksbS5jeT1mLG4uY2lyY2xlPW07Zm9yKHZhciB5PW51bGwseD1qYS5fO3g7KWlmKG0ueTx4Lnl8fG0ueT09PXgueSYmbS54PD14Lngpe2lmKCF4Lkwpe3k9eC5QO2JyZWFrfXg9eC5MfWVsc2V7aWYoIXguUil7eT14O2JyZWFrfXg9eC5SfWphLmluc2VydCh5LG0pLHl8fChVYT1tKX19fX1mdW5jdGlvbiBvcihuKXt2YXIgdD1uLmNpcmNsZTt0JiYodC5QfHwoVWE9dC5OKSxqYS5yZW1vdmUodCksRmEucHVzaCh0KSxkcih0KSxuLmNpcmNsZT1udWxsKX1mdW5jdGlvbiBhcihuLHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dmFyIGksbz11LmEsYT11LmIscz1vLngsYz1vLnksbD1hLngsZj1hLnksaD0wLGc9MSxwPWwtcyx2PWYtYztpZihpPW4tcyxwfHwhKGk+MCkpe2lmKGkvPXAsMD5wKXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZihwPjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPWUtcyxwfHwhKDA+aSkpe2lmKGkvPXAsMD5wKXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZihwPjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1pZihpPXQtYyx2fHwhKGk+MCkpe2lmKGkvPXYsMD52KXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZih2PjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPXItYyx2fHwhKDA+aSkpe2lmKGkvPXYsMD52KXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZih2PjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1yZXR1cm4gaD4wJiYodS5hPXt4OnMraCpwLHk6YytoKnZ9KSwxPmcmJih1LmI9e3g6cytnKnAseTpjK2cqdn0pLHV9fX19fX1mdW5jdGlvbiBzcihuKXtmb3IodmFyIHQsZT1EYSxyPWFyKG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0pLHU9ZS5sZW5ndGg7dS0tOyl0PWVbdV0sKCFjcih0LG4pfHwhcih0KXx8U28odC5hLngtdC5iLngpPFhvJiZTbyh0LmEueS10LmIueSk8WG8pJiYodC5hPXQuYj1udWxsLGUuc3BsaWNlKHUsMSkpfWZ1bmN0aW9uIGNyKG4sdCl7dmFyIGU9bi5iO2lmKGUpcmV0dXJuITA7dmFyIHIsdSxpPW4uYSxvPXRbMF1bMF0sYT10WzFdWzBdLHM9dFswXVsxXSxjPXRbMV1bMV0sbD1uLmwsZj1uLnIsaD1sLngsZz1sLnkscD1mLngsdj1mLnksZD0oaCtwKS8yLG09KGcrdikvMjtpZih2PT09Zyl7aWYobz5kfHxkPj1hKXJldHVybjtpZihoPnApe2lmKGkpe2lmKGkueT49YylyZXR1cm59ZWxzZSBpPXt4OmQseTpzfTtlPXt4OmQseTpjfX1lbHNle2lmKGkpe2lmKGkueTxzKXJldHVybn1lbHNlIGk9e3g6ZCx5OmN9O2U9e3g6ZCx5OnN9fX1lbHNlIGlmKHI9KGgtcCkvKHYtZyksdT1tLXIqZCwtMT5yfHxyPjEpaWYoaD5wKXtpZihpKXtpZihpLnk+PWMpcmV0dXJufWVsc2UgaT17eDoocy11KS9yLHk6c307ZT17eDooYy11KS9yLHk6Y319ZWxzZXtpZihpKXtpZihpLnk8cylyZXR1cm59ZWxzZSBpPXt4OihjLXUpL3IseTpjfTtlPXt4OihzLXUpL3IseTpzfX1lbHNlIGlmKHY+Zyl7aWYoaSl7aWYoaS54Pj1hKXJldHVybn1lbHNlIGk9e3g6byx5OnIqbyt1fTtlPXt4OmEseTpyKmErdX19ZWxzZXtpZihpKXtpZihpLng8bylyZXR1cm59ZWxzZSBpPXt4OmEseTpyKmErdX07ZT17eDpvLHk6cipvK3V9fXJldHVybiBuLmE9aSxuLmI9ZSwhMH1mdW5jdGlvbiBscihuLHQpe3RoaXMubD1uLHRoaXMucj10LHRoaXMuYT10aGlzLmI9bnVsbH1mdW5jdGlvbiBmcihuLHQsZSxyKXt2YXIgdT1uZXcgbHIobix0KTtyZXR1cm4gRGEucHVzaCh1KSxlJiZncih1LG4sdCxlKSxyJiZncih1LHQsbixyKSxSYVtuLmldLmVkZ2VzLnB1c2gobmV3IHByKHUsbix0KSksUmFbdC5pXS5lZGdlcy5wdXNoKG5ldyBwcih1LHQsbikpLHV9ZnVuY3Rpb24gaHIobix0LGUpe3ZhciByPW5ldyBscihuLG51bGwpO3JldHVybiByLmE9dCxyLmI9ZSxEYS5wdXNoKHIpLHJ9ZnVuY3Rpb24gZ3Iobix0LGUscil7bi5hfHxuLmI/bi5sPT09ZT9uLmI9cjpuLmE9cjoobi5hPXIsbi5sPXQsbi5yPWUpfWZ1bmN0aW9uIHByKG4sdCxlKXt2YXIgcj1uLmEsdT1uLmI7dGhpcy5lZGdlPW4sdGhpcy5zaXRlPXQsdGhpcy5hbmdsZT1lP01hdGguYXRhbjIoZS55LXQueSxlLngtdC54KTpuLmw9PT10P01hdGguYXRhbjIodS54LXIueCxyLnktdS55KTpNYXRoLmF0YW4yKHIueC11LngsdS55LXIueSl9ZnVuY3Rpb24gdnIoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBkcihuKXtuLlU9bi5DPW4uTD1uLlI9bi5QPW4uTj1udWxsfWZ1bmN0aW9uIG1yKG4sdCl7dmFyIGU9dCxyPXQuUix1PWUuVTt1P3UuTD09PWU/dS5MPXI6dS5SPXI6bi5fPXIsci5VPXUsZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiB5cihuLHQpe3ZhciBlPXQscj10LkwsdT1lLlU7dT91Lkw9PT1lP3UuTD1yOnUuUj1yOm4uXz1yLHIuVT11LGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24geHIobil7Zm9yKDtuLkw7KW49bi5MO3JldHVybiBufWZ1bmN0aW9uIE1yKG4sdCl7dmFyIGUscix1LGk9bi5zb3J0KF9yKS5wb3AoKTtmb3IoRGE9W10sUmE9bmV3IEFycmF5KG4ubGVuZ3RoKSxQYT1uZXcgdnIsamE9bmV3IHZyOzspaWYodT1VYSxpJiYoIXV8fGkueTx1Lnl8fGkueT09PXUueSYmaS54PHUueCkpKGkueCE9PWV8fGkueSE9PXIpJiYoUmFbaS5pXT1uZXcgdHIoaSksS2UoaSksZT1pLngscj1pLnkpLGk9bi5wb3AoKTtlbHNle2lmKCF1KWJyZWFrO0dlKHUuYXJjKX10JiYoc3IodCksZXIodCkpO3ZhciBvPXtjZWxsczpSYSxlZGdlczpEYX07cmV0dXJuIFBhPWphPURhPVJhPW51bGwsb31mdW5jdGlvbiBfcihuLHQpe3JldHVybiB0Lnktbi55fHx0Lngtbi54fWZ1bmN0aW9uIGJyKG4sdCxlKXtyZXR1cm4obi54LWUueCkqKHQueS1uLnkpLShuLngtdC54KSooZS55LW4ueSl9ZnVuY3Rpb24gd3Iobil7cmV0dXJuIG4ueH1mdW5jdGlvbiBrcihuKXtyZXR1cm4gbi55fWZ1bmN0aW9uIFNyKCl7cmV0dXJue2xlYWY6ITAsbm9kZXM6W10scG9pbnQ6bnVsbCx4Om51bGwseTpudWxsfQp9ZnVuY3Rpb24gQ3Iobix0LGUscix1LGkpe2lmKCFuKHQsZSxyLHUsaSkpe3ZhciBvPS41KihlK3UpLGE9LjUqKHIraSkscz10Lm5vZGVzO3NbMF0mJkNyKG4sc1swXSxlLHIsbyxhKSxzWzFdJiZDcihuLHNbMV0sbyxyLHUsYSksc1syXSYmQ3IobixzWzJdLGUsYSxvLGkpLHNbM10mJkNyKG4sc1szXSxvLGEsdSxpKX19ZnVuY3Rpb24gQXIobix0KXtuPWxvLnJnYihuKSx0PWxvLnJnYih0KTt2YXIgZT1uLnIscj1uLmcsdT1uLmIsaT10LnItZSxvPXQuZy1yLGE9dC5iLXU7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiIjIitwdChNYXRoLnJvdW5kKGUraSpuKSkrcHQoTWF0aC5yb3VuZChyK28qbikpK3B0KE1hdGgucm91bmQodSthKm4pKX19ZnVuY3Rpb24gTnIobix0KXt2YXIgZSxyPXt9LHU9e307Zm9yKGUgaW4gbillIGluIHQ/cltlXT1UcihuW2VdLHRbZV0pOnVbZV09bltlXTtmb3IoZSBpbiB0KWUgaW4gbnx8KHVbZV09dFtlXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe2ZvcihlIGluIHIpdVtlXT1yW2VdKG4pO3JldHVybiB1fX1mdW5jdGlvbiBFcihuLHQpe3JldHVybiB0LT1uPStuLGZ1bmN0aW9uKGUpe3JldHVybiBuK3QqZX19ZnVuY3Rpb24genIobix0KXt2YXIgZSxyLHUsaT1JYS5sYXN0SW5kZXg9WmEubGFzdEluZGV4PTAsbz0tMSxhPVtdLHM9W107Zm9yKG4rPSIiLHQrPSIiOyhlPUlhLmV4ZWMobikpJiYocj1aYS5leGVjKHQpKTspKHU9ci5pbmRleCk+aSYmKHU9dC5zdWJzdHJpbmcoaSx1KSxhW29dP2Fbb10rPXU6YVsrK29dPXUpLChlPWVbMF0pPT09KHI9clswXSk/YVtvXT9hW29dKz1yOmFbKytvXT1yOihhWysrb109bnVsbCxzLnB1c2goe2k6byx4OkVyKGUscil9KSksaT1aYS5sYXN0SW5kZXg7cmV0dXJuIGk8dC5sZW5ndGgmJih1PXQuc3Vic3RyaW5nKGkpLGFbb10/YVtvXSs9dTphWysrb109dSksYS5sZW5ndGg8Mj9zWzBdPyh0PXNbMF0ueCxmdW5jdGlvbihuKXtyZXR1cm4gdChuKSsiIn0pOmZ1bmN0aW9uKCl7cmV0dXJuIHR9Oih0PXMubGVuZ3RoLGZ1bmN0aW9uKG4pe2Zvcih2YXIgZSxyPTA7dD5yOysrcilhWyhlPXNbcl0pLmldPWUueChuKTtyZXR1cm4gYS5qb2luKCIiKX0pfWZ1bmN0aW9uIFRyKG4sdCl7Zm9yKHZhciBlLHI9bG8uaW50ZXJwb2xhdG9ycy5sZW5ndGg7LS1yPj0wJiYhKGU9bG8uaW50ZXJwb2xhdG9yc1tyXShuLHQpKTspO3JldHVybiBlfWZ1bmN0aW9uIExyKG4sdCl7dmFyIGUscj1bXSx1PVtdLGk9bi5sZW5ndGgsbz10Lmxlbmd0aCxhPU1hdGgubWluKG4ubGVuZ3RoLHQubGVuZ3RoKTtmb3IoZT0wO2E+ZTsrK2Upci5wdXNoKFRyKG5bZV0sdFtlXSkpO2Zvcig7aT5lOysrZSl1W2VdPW5bZV07Zm9yKDtvPmU7KytlKXVbZV09dFtlXTtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKGU9MDthPmU7KytlKXVbZV09cltlXShuKTtyZXR1cm4gdX19ZnVuY3Rpb24gcXIobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAwPj10PzA6dD49MT8xOm4odCl9fWZ1bmN0aW9uIERyKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMS1uKDEtdCl9fWZ1bmN0aW9uIFJyKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4uNSooLjU+dD9uKDIqdCk6Mi1uKDItMip0KSl9fWZ1bmN0aW9uIFByKG4pe3JldHVybiBuKm59ZnVuY3Rpb24gVXIobil7cmV0dXJuIG4qbipufWZ1bmN0aW9uIGpyKG4pe2lmKDA+PW4pcmV0dXJuIDA7aWYobj49MSlyZXR1cm4gMTt2YXIgdD1uKm4sZT10Km47cmV0dXJuIDQqKC41Pm4/ZTozKihuLXQpK2UtLjc1KX1mdW5jdGlvbiBIcihuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KHQsbil9fWZ1bmN0aW9uIEZyKG4pe3JldHVybiAxLU1hdGguY29zKG4qVm8pfWZ1bmN0aW9uIE9yKG4pe3JldHVybiBNYXRoLnBvdygyLDEwKihuLTEpKX1mdW5jdGlvbiBZcihuKXtyZXR1cm4gMS1NYXRoLnNxcnQoMS1uKm4pfWZ1bmN0aW9uIElyKG4sdCl7dmFyIGU7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9LjQ1KSxhcmd1bWVudHMubGVuZ3RoP2U9dC9abypNYXRoLmFzaW4oMS9uKToobj0xLGU9dC80KSxmdW5jdGlvbihyKXtyZXR1cm4gMStuKk1hdGgucG93KDIsLTEwKnIpKk1hdGguc2luKChyLWUpKlpvL3QpfX1mdW5jdGlvbiBacihuKXtyZXR1cm4gbnx8KG49MS43MDE1OCksZnVuY3Rpb24odCl7cmV0dXJuIHQqdCooKG4rMSkqdC1uKX19ZnVuY3Rpb24gVnIobil7cmV0dXJuIDEvMi43NT5uPzcuNTYyNSpuKm46Mi8yLjc1Pm4/Ny41NjI1KihuLT0xLjUvMi43NSkqbisuNzU6Mi41LzIuNzU+bj83LjU2MjUqKG4tPTIuMjUvMi43NSkqbisuOTM3NTo3LjU2MjUqKG4tPTIuNjI1LzIuNzUpKm4rLjk4NDM3NX1mdW5jdGlvbiBYcihuLHQpe249bG8uaGNsKG4pLHQ9bG8uaGNsKHQpO3ZhciBlPW4uaCxyPW4uYyx1PW4ubCxpPXQuaC1lLG89dC5jLXIsYT10LmwtdTtyZXR1cm4gaXNOYU4obykmJihvPTAscj1pc05hTihyKT90LmM6ciksaXNOYU4oaSk/KGk9MCxlPWlzTmFOKGUpP3QuaDplKTppPjE4MD9pLT0zNjA6LTE4MD5pJiYoaSs9MzYwKSxmdW5jdGlvbihuKXtyZXR1cm4gdXQoZStpKm4scitvKm4sdSthKm4pKyIifX1mdW5jdGlvbiAkcihuLHQpe249bG8uaHNsKG4pLHQ9bG8uaHNsKHQpO3ZhciBlPW4uaCxyPW4ucyx1PW4ubCxpPXQuaC1lLG89dC5zLXIsYT10LmwtdTtyZXR1cm4gaXNOYU4obykmJihvPTAscj1pc05hTihyKT90LnM6ciksaXNOYU4oaSk/KGk9MCxlPWlzTmFOKGUpP3QuaDplKTppPjE4MD9pLT0zNjA6LTE4MD5pJiYoaSs9MzYwKSxmdW5jdGlvbihuKXtyZXR1cm4gZXQoZStpKm4scitvKm4sdSthKm4pKyIifX1mdW5jdGlvbiBCcihuLHQpe249bG8ubGFiKG4pLHQ9bG8ubGFiKHQpO3ZhciBlPW4ubCxyPW4uYSx1PW4uYixpPXQubC1lLG89dC5hLXIsYT10LmItdTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG90KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gV3Iobix0KXtyZXR1cm4gdC09bixmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5yb3VuZChuK3QqZSl9fWZ1bmN0aW9uIEpyKG4pe3ZhciB0PVtuLmEsbi5iXSxlPVtuLmMsbi5kXSxyPUtyKHQpLHU9R3IodCxlKSxpPUtyKFFyKGUsdCwtdSkpfHwwO3RbMF0qZVsxXTxlWzBdKnRbMV0mJih0WzBdKj0tMSx0WzFdKj0tMSxyKj0tMSx1Kj0tMSksdGhpcy5yb3RhdGU9KHI/TWF0aC5hdGFuMih0WzFdLHRbMF0pOk1hdGguYXRhbjIoLWVbMF0sZVsxXSkpKldvLHRoaXMudHJhbnNsYXRlPVtuLmUsbi5mXSx0aGlzLnNjYWxlPVtyLGldLHRoaXMuc2tldz1pP01hdGguYXRhbjIodSxpKSpXbzowfWZ1bmN0aW9uIEdyKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV19ZnVuY3Rpb24gS3Iobil7dmFyIHQ9TWF0aC5zcXJ0KEdyKG4sbikpO3JldHVybiB0JiYoblswXS89dCxuWzFdLz10KSx0fWZ1bmN0aW9uIFFyKG4sdCxlKXtyZXR1cm4gblswXSs9ZSp0WzBdLG5bMV0rPWUqdFsxXSxufWZ1bmN0aW9uIG51KG4sdCl7dmFyIGUscj1bXSx1PVtdLGk9bG8udHJhbnNmb3JtKG4pLG89bG8udHJhbnNmb3JtKHQpLGE9aS50cmFuc2xhdGUscz1vLnRyYW5zbGF0ZSxjPWkucm90YXRlLGw9by5yb3RhdGUsZj1pLnNrZXcsaD1vLnNrZXcsZz1pLnNjYWxlLHA9by5zY2FsZTtyZXR1cm4gYVswXSE9c1swXXx8YVsxXSE9c1sxXT8oci5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLCIsIixudWxsLCIpIiksdS5wdXNoKHtpOjEseDpFcihhWzBdLHNbMF0pfSx7aTozLHg6RXIoYVsxXSxzWzFdKX0pKTpzWzBdfHxzWzFdP3IucHVzaCgidHJhbnNsYXRlKCIrcysiKSIpOnIucHVzaCgiIiksYyE9bD8oYy1sPjE4MD9sKz0zNjA6bC1jPjE4MCYmKGMrPTM2MCksdS5wdXNoKHtpOnIucHVzaChyLnBvcCgpKyJyb3RhdGUoIixudWxsLCIpIiktMix4OkVyKGMsbCl9KSk6bCYmci5wdXNoKHIucG9wKCkrInJvdGF0ZSgiK2wrIikiKSxmIT1oP3UucHVzaCh7aTpyLnB1c2goci5wb3AoKSsic2tld1goIixudWxsLCIpIiktMix4OkVyKGYsaCl9KTpoJiZyLnB1c2goci5wb3AoKSsic2tld1goIitoKyIpIiksZ1swXSE9cFswXXx8Z1sxXSE9cFsxXT8oZT1yLnB1c2goci5wb3AoKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIiksdS5wdXNoKHtpOmUtNCx4OkVyKGdbMF0scFswXSl9LHtpOmUtMix4OkVyKGdbMV0scFsxXSl9KSk6KDEhPXBbMF18fDEhPXBbMV0pJiZyLnB1c2goci5wb3AoKSsic2NhbGUoIitwKyIpIiksZT11Lmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIHQsaT0tMTsrK2k8ZTspclsodD11W2ldKS5pXT10Lngobik7cmV0dXJuIHIuam9pbigiIil9fWZ1bmN0aW9uIHR1KG4sdCl7cmV0dXJuIHQ9dC0obj0rbik/MS8odC1uKTowLGZ1bmN0aW9uKGUpe3JldHVybihlLW4pKnR9fWZ1bmN0aW9uIGV1KG4sdCl7cmV0dXJuIHQ9dC0obj0rbik/MS8odC1uKTowLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDEsKGUtbikqdCkpfX1mdW5jdGlvbiBydShuKXtmb3IodmFyIHQ9bi5zb3VyY2UsZT1uLnRhcmdldCxyPWl1KHQsZSksdT1bdF07dCE9PXI7KXQ9dC5wYXJlbnQsdS5wdXNoKHQpO2Zvcih2YXIgaT11Lmxlbmd0aDtlIT09cjspdS5zcGxpY2UoaSwwLGUpLGU9ZS5wYXJlbnQ7cmV0dXJuIHV9ZnVuY3Rpb24gdXUobil7Zm9yKHZhciB0PVtdLGU9bi5wYXJlbnQ7bnVsbCE9ZTspdC5wdXNoKG4pLG49ZSxlPWUucGFyZW50O3JldHVybiB0LnB1c2gobiksdH1mdW5jdGlvbiBpdShuLHQpe2lmKG49PT10KXJldHVybiBuO2Zvcih2YXIgZT11dShuKSxyPXV1KHQpLHU9ZS5wb3AoKSxpPXIucG9wKCksbz1udWxsO3U9PT1pOylvPXUsdT1lLnBvcCgpLGk9ci5wb3AoKTtyZXR1cm4gb31mdW5jdGlvbiBvdShuKXtuLmZpeGVkfD0yfWZ1bmN0aW9uIGF1KG4pe24uZml4ZWQmPS03fWZ1bmN0aW9uIHN1KG4pe24uZml4ZWR8PTQsbi5weD1uLngsbi5weT1uLnl9ZnVuY3Rpb24gY3Uobil7bi5maXhlZCY9LTV9ZnVuY3Rpb24gbHUobix0LGUpe3ZhciByPTAsdT0wO2lmKG4uY2hhcmdlPTAsIW4ubGVhZilmb3IodmFyIGksbz1uLm5vZGVzLGE9by5sZW5ndGgscz0tMTsrK3M8YTspaT1vW3NdLG51bGwhPWkmJihsdShpLHQsZSksbi5jaGFyZ2UrPWkuY2hhcmdlLHIrPWkuY2hhcmdlKmkuY3gsdSs9aS5jaGFyZ2UqaS5jeSk7aWYobi5wb2ludCl7bi5sZWFmfHwobi5wb2ludC54Kz1NYXRoLnJhbmRvbSgpLS41LG4ucG9pbnQueSs9TWF0aC5yYW5kb20oKS0uNSk7dmFyIGM9dCplW24ucG9pbnQuaW5kZXhdO24uY2hhcmdlKz1uLnBvaW50Q2hhcmdlPWMscis9YypuLnBvaW50LngsdSs9YypuLnBvaW50Lnl9bi5jeD1yL24uY2hhcmdlLG4uY3k9dS9uLmNoYXJnZX1mdW5jdGlvbiBmdShuLHQpe3JldHVybiBsby5yZWJpbmQobix0LCJzb3J0IiwiY2hpbGRyZW4iLCJ2YWx1ZSIpLG4ubm9kZXM9bixuLmxpbmtzPW11LG59ZnVuY3Rpb24gaHUobix0KXtmb3IodmFyIGU9W25dO251bGwhPShuPWUucG9wKCkpOylpZih0KG4pLCh1PW4uY2hpbGRyZW4pJiYocj11Lmxlbmd0aCkpZm9yKHZhciByLHU7LS1yPj0wOyllLnB1c2godVtyXSl9ZnVuY3Rpb24gZ3Uobix0KXtmb3IodmFyIGU9W25dLHI9W107bnVsbCE9KG49ZS5wb3AoKSk7KWlmKHIucHVzaChuKSwoaT1uLmNoaWxkcmVuKSYmKHU9aS5sZW5ndGgpKWZvcih2YXIgdSxpLG89LTE7KytvPHU7KWUucHVzaChpW29dKTtmb3IoO251bGwhPShuPXIucG9wKCkpOyl0KG4pfWZ1bmN0aW9uIHB1KG4pe3JldHVybiBuLmNoaWxkcmVufWZ1bmN0aW9uIHZ1KG4pe3JldHVybiBuLnZhbHVlfWZ1bmN0aW9uIGR1KG4sdCl7cmV0dXJuIHQudmFsdWUtbi52YWx1ZX1mdW5jdGlvbiBtdShuKXtyZXR1cm4gbG8ubWVyZ2Uobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4uY2hpbGRyZW58fFtdKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTpuLHRhcmdldDp0fX0pfSkpfWZ1bmN0aW9uIHl1KG4pe3JldHVybiBuLnh9ZnVuY3Rpb24geHUobil7cmV0dXJuIG4ueX1mdW5jdGlvbiBNdShuLHQsZSl7bi55MD10LG4ueT1lfWZ1bmN0aW9uIF91KG4pe3JldHVybiBsby5yYW5nZShuLmxlbmd0aCl9ZnVuY3Rpb24gYnUobil7Zm9yKHZhciB0PS0xLGU9blswXS5sZW5ndGgscj1bXTsrK3Q8ZTspclt0XT0wO3JldHVybiByfWZ1bmN0aW9uIHd1KG4pe2Zvcih2YXIgdCxlPTEscj0wLHU9blswXVsxXSxpPW4ubGVuZ3RoO2k+ZTsrK2UpKHQ9bltlXVsxXSk+dSYmKHI9ZSx1PXQpO3JldHVybiByfWZ1bmN0aW9uIGt1KG4pe3JldHVybiBuLnJlZHVjZShTdSwwKX1mdW5jdGlvbiBTdShuLHQpe3JldHVybiBuK3RbMV19ZnVuY3Rpb24gQ3Uobix0KXtyZXR1cm4gQXUobixNYXRoLmNlaWwoTWF0aC5sb2codC5sZW5ndGgpL01hdGguTE4yKzEpKX1mdW5jdGlvbiBBdShuLHQpe2Zvcih2YXIgZT0tMSxyPStuWzBdLHU9KG5bMV0tcikvdCxpPVtdOysrZTw9dDspaVtlXT11KmUrcjtyZXR1cm4gaX1mdW5jdGlvbiBOdShuKXtyZXR1cm5bbG8ubWluKG4pLGxvLm1heChuKV19ZnVuY3Rpb24gRXUobix0KXtyZXR1cm4gbi52YWx1ZS10LnZhbHVlfWZ1bmN0aW9uIHp1KG4sdCl7dmFyIGU9bi5fcGFja19uZXh0O24uX3BhY2tfbmV4dD10LHQuX3BhY2tfcHJldj1uLHQuX3BhY2tfbmV4dD1lLGUuX3BhY2tfcHJldj10fWZ1bmN0aW9uIFR1KG4sdCl7bi5fcGFja19uZXh0PXQsdC5fcGFja19wcmV2PW59ZnVuY3Rpb24gTHUobix0KXt2YXIgZT10Lngtbi54LHI9dC55LW4ueSx1PW4ucit0LnI7cmV0dXJuLjk5OSp1KnU+ZSplK3Iqcn1mdW5jdGlvbiBxdShuKXtmdW5jdGlvbiB0KG4pe2w9TWF0aC5taW4obi54LW4ucixsKSxmPU1hdGgubWF4KG4ueCtuLnIsZiksaD1NYXRoLm1pbihuLnktbi5yLGgpLGc9TWF0aC5tYXgobi55K24ucixnKX1pZigoZT1uLmNoaWxkcmVuKSYmKGM9ZS5sZW5ndGgpKXt2YXIgZSxyLHUsaSxvLGEscyxjLGw9MS8wLGY9LTEvMCxoPTEvMCxnPS0xLzA7aWYoZS5mb3JFYWNoKER1KSxyPWVbMF0sci54PS1yLnIsci55PTAsdChyKSxjPjEmJih1PWVbMV0sdS54PXUucix1Lnk9MCx0KHUpLGM+MikpZm9yKGk9ZVsyXSxVdShyLHUsaSksdChpKSx6dShyLGkpLHIuX3BhY2tfcHJldj1pLHp1KGksdSksdT1yLl9wYWNrX25leHQsbz0zO2M+bztvKyspe1V1KHIsdSxpPWVbb10pO3ZhciBwPTAsdj0xLGQ9MTtmb3IoYT11Ll9wYWNrX25leHQ7YSE9PXU7YT1hLl9wYWNrX25leHQsdisrKWlmKEx1KGEsaSkpe3A9MTticmVha31pZigxPT1wKWZvcihzPXIuX3BhY2tfcHJldjtzIT09YS5fcGFja19wcmV2JiYhTHUocyxpKTtzPXMuX3BhY2tfcHJldixkKyspO3A/KGQ+dnx8dj09ZCYmdS5yPHIucj9UdShyLHU9YSk6VHUocj1zLHUpLG8tLSk6KHp1KHIsaSksdT1pLHQoaSkpfXZhciBtPShsK2YpLzIseT0oaCtnKS8yLHg9MDtmb3Iobz0wO2M+bztvKyspaT1lW29dLGkueC09bSxpLnktPXkseD1NYXRoLm1heCh4LGkucitNYXRoLnNxcnQoaS54KmkueCtpLnkqaS55KSk7bi5yPXgsZS5mb3JFYWNoKFJ1KX19ZnVuY3Rpb24gRHUobil7bi5fcGFja19uZXh0PW4uX3BhY2tfcHJldj1ufWZ1bmN0aW9uIFJ1KG4pe2RlbGV0ZSBuLl9wYWNrX25leHQsZGVsZXRlIG4uX3BhY2tfcHJldn1mdW5jdGlvbiBQdShuLHQsZSxyKXt2YXIgdT1uLmNoaWxkcmVuO2lmKG4ueD10Kz1yKm4ueCxuLnk9ZSs9cipuLnksbi5yKj1yLHUpZm9yKHZhciBpPS0xLG89dS5sZW5ndGg7KytpPG87KVB1KHVbaV0sdCxlLHIpfWZ1bmN0aW9uIFV1KG4sdCxlKXt2YXIgcj1uLnIrZS5yLHU9dC54LW4ueCxpPXQueS1uLnk7aWYociYmKHV8fGkpKXt2YXIgbz10LnIrZS5yLGE9dSp1K2kqaTtvKj1vLHIqPXI7dmFyIHM9LjUrKHItbykvKDIqYSksYz1NYXRoLnNxcnQoTWF0aC5tYXgoMCwyKm8qKHIrYSktKHItPWEpKnItbypvKSkvKDIqYSk7ZS54PW4ueCtzKnUrYyppLGUueT1uLnkrcyppLWMqdX1lbHNlIGUueD1uLngrcixlLnk9bi55fWZ1bmN0aW9uIGp1KG4sdCl7cmV0dXJuIG4ucGFyZW50PT10LnBhcmVudD8xOjJ9ZnVuY3Rpb24gSHUobil7dmFyIHQ9bi5jaGlsZHJlbjtyZXR1cm4gdC5sZW5ndGg/dFswXTpuLnR9ZnVuY3Rpb24gRnUobil7dmFyIHQsZT1uLmNoaWxkcmVuO3JldHVybih0PWUubGVuZ3RoKT9lW3QtMV06bi50fWZ1bmN0aW9uIE91KG4sdCxlKXt2YXIgcj1lLyh0Lmktbi5pKTt0LmMtPXIsdC5zKz1lLG4uYys9cix0LnorPWUsdC5tKz1lfWZ1bmN0aW9uIFl1KG4pe2Zvcih2YXIgdCxlPTAscj0wLHU9bi5jaGlsZHJlbixpPXUubGVuZ3RoOy0taT49MDspdD11W2ldLHQueis9ZSx0Lm0rPWUsZSs9dC5zKyhyKz10LmMpfWZ1bmN0aW9uIEl1KG4sdCxlKXtyZXR1cm4gbi5hLnBhcmVudD09PXQucGFyZW50P24uYTplfWZ1bmN0aW9uIFp1KG4pe3JldHVybiAxK2xvLm1heChuLGZ1bmN0aW9uKG4pe3JldHVybiBuLnl9KX1mdW5jdGlvbiBWdShuKXtyZXR1cm4gbi5yZWR1Y2UoZnVuY3Rpb24obix0KXtyZXR1cm4gbit0Lnh9LDApL24ubGVuZ3RofWZ1bmN0aW9uIFh1KG4pe3ZhciB0PW4uY2hpbGRyZW47cmV0dXJuIHQmJnQubGVuZ3RoP1h1KHRbMF0pOm59ZnVuY3Rpb24gJHUobil7dmFyIHQsZT1uLmNoaWxkcmVuO3JldHVybiBlJiYodD1lLmxlbmd0aCk/JHUoZVt0LTFdKTpufWZ1bmN0aW9uIEJ1KG4pe3JldHVybnt4Om4ueCx5Om4ueSxkeDpuLmR4LGR5Om4uZHl9fWZ1bmN0aW9uIFd1KG4sdCl7dmFyIGU9bi54K3RbM10scj1uLnkrdFswXSx1PW4uZHgtdFsxXS10WzNdLGk9bi5keS10WzBdLXRbMl07cmV0dXJuIDA+dSYmKGUrPXUvMix1PTApLDA+aSYmKHIrPWkvMixpPTApLHt4OmUseTpyLGR4OnUsZHk6aX19ZnVuY3Rpb24gSnUobil7dmFyIHQ9blswXSxlPW5bbi5sZW5ndGgtMV07cmV0dXJuIGU+dD9bdCxlXTpbZSx0XX1mdW5jdGlvbiBHdShuKXtyZXR1cm4gbi5yYW5nZUV4dGVudD9uLnJhbmdlRXh0ZW50KCk6SnUobi5yYW5nZSgpKX1mdW5jdGlvbiBLdShuLHQsZSxyKXt2YXIgdT1lKG5bMF0sblsxXSksaT1yKHRbMF0sdFsxXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBpKHUobikpfX1mdW5jdGlvbiBRdShuLHQpe3ZhciBlLHI9MCx1PW4ubGVuZ3RoLTEsaT1uW3JdLG89blt1XTtyZXR1cm4gaT5vJiYoZT1yLHI9dSx1PWUsZT1pLGk9byxvPWUpLG5bcl09dC5mbG9vcihpKSxuW3VdPXQuY2VpbChvKSxufWZ1bmN0aW9uIG5pKG4pe3JldHVybiBuP3tmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5mbG9vcih0L24pKm59LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguY2VpbCh0L24pKm59fTp0c31mdW5jdGlvbiB0aShuLHQsZSxyKXt2YXIgdT1bXSxpPVtdLG89MCxhPU1hdGgubWluKG4ubGVuZ3RoLHQubGVuZ3RoKS0xO2ZvcihuW2FdPG5bMF0mJihuPW4uc2xpY2UoKS5yZXZlcnNlKCksdD10LnNsaWNlKCkucmV2ZXJzZSgpKTsrK288PWE7KXUucHVzaChlKG5bby0xXSxuW29dKSksaS5wdXNoKHIodFtvLTFdLHRbb10pKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9bG8uYmlzZWN0KG4sdCwxLGEpLTE7cmV0dXJuIGlbZV0odVtlXSh0KSl9fWZ1bmN0aW9uIGVpKG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgdT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk+Mj90aTpLdSxzPXI/ZXU6dHU7cmV0dXJuIG89dShuLHQscyxlKSxhPXUodCxuLHMsVHIpLGl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbyhuKX12YXIgbyxhO3JldHVybiBpLmludmVydD1mdW5jdGlvbihuKXtyZXR1cm4gYShuKX0saS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dC5tYXAoTnVtYmVyKSx1KCkpOm59LGkucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bix1KCkpOnR9LGkucmFuZ2VSb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gaS5yYW5nZShuKS5pbnRlcnBvbGF0ZShXcil9LGkuY2xhbXA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix1KCkpOnJ9LGkuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix1KCkpOmV9LGkudGlja3M9ZnVuY3Rpb24odCl7cmV0dXJuIG9pKG4sdCl9LGkudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiBhaShuLHQsZSl9LGkubmljZT1mdW5jdGlvbih0KXtyZXR1cm4gdWkobix0KSx1KCl9LGkuY29weT1mdW5jdGlvbigpe3JldHVybiBlaShuLHQsZSxyKX0sdSgpfWZ1bmN0aW9uIHJpKG4sdCl7cmV0dXJuIGxvLnJlYmluZChuLHQsInJhbmdlIiwicmFuZ2VSb3VuZCIsImludGVycG9sYXRlIiwiY2xhbXAiKX1mdW5jdGlvbiB1aShuLHQpe3JldHVybiBRdShuLG5pKGlpKG4sdClbMl0pKX1mdW5jdGlvbiBpaShuLHQpe251bGw9PXQmJih0PTEwKTt2YXIgZT1KdShuKSxyPWVbMV0tZVswXSx1PU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2coci90KS9NYXRoLkxOMTApKSxpPXQvcip1O3JldHVybi4xNT49aT91Kj0xMDouMzU+PWk/dSo9NTouNzU+PWkmJih1Kj0yKSxlWzBdPU1hdGguY2VpbChlWzBdL3UpKnUsZVsxXT1NYXRoLmZsb29yKGVbMV0vdSkqdSsuNSp1LGVbMl09dSxlfWZ1bmN0aW9uIG9pKG4sdCl7cmV0dXJuIGxvLnJhbmdlLmFwcGx5KGxvLGlpKG4sdCkpfWZ1bmN0aW9uIGFpKG4sdCxlKXt2YXIgcj1paShuLHQpO2lmKGUpe3ZhciB1PXlhLmV4ZWMoZSk7aWYodS5zaGlmdCgpLCJzIj09PXVbOF0pe3ZhciBpPWxvLmZvcm1hdFByZWZpeChNYXRoLm1heChTbyhyWzBdKSxTbyhyWzFdKSkpO3JldHVybiB1WzddfHwodVs3XT0iLiIrc2koaS5zY2FsZShyWzJdKSkpLHVbOF09ImYiLGU9bG8uZm9ybWF0KHUuam9pbigiIikpLGZ1bmN0aW9uKG4pe3JldHVybiBlKGkuc2NhbGUobikpK2kuc3ltYm9sfX11WzddfHwodVs3XT0iLiIrY2kodVs4XSxyKSksZT11LmpvaW4oIiIpfWVsc2UgZT0iLC4iK3NpKHJbMl0pKyJmIjtyZXR1cm4gbG8uZm9ybWF0KGUpfWZ1bmN0aW9uIHNpKG4pe3JldHVybi1NYXRoLmZsb29yKE1hdGgubG9nKG4pL01hdGguTE4xMCsuMDEpfWZ1bmN0aW9uIGNpKG4sdCl7dmFyIGU9c2kodFsyXSk7cmV0dXJuIG4gaW4gZXM/TWF0aC5hYnMoZS1zaShNYXRoLm1heChTbyh0WzBdKSxTbyh0WzFdKSkpKSsgKygiZSIhPT1uKTplLTIqKCIlIj09PW4pfWZ1bmN0aW9uIGxpKG4sdCxlLHIpe2Z1bmN0aW9uIHUobil7cmV0dXJuKGU/TWF0aC5sb2coMD5uPzA6bik6LU1hdGgubG9nKG4+MD8wOi1uKSkvTWF0aC5sb2codCl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gZT9NYXRoLnBvdyh0LG4pOi1NYXRoLnBvdyh0LC1uKX1mdW5jdGlvbiBvKHQpe3JldHVybiBuKHUodCkpfXJldHVybiBvLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gaShuLmludmVydCh0KSl9LG8uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXRbMF0+PTAsbi5kb21haW4oKHI9dC5tYXAoTnVtYmVyKSkubWFwKHUpKSxvKTpyfSxvLmJhc2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K2Usbi5kb21haW4oci5tYXAodSkpLG8pOnR9LG8ubmljZT1mdW5jdGlvbigpe3ZhciB0PVF1KHIubWFwKHUpLGU/TWF0aDp1cyk7cmV0dXJuIG4uZG9tYWluKHQpLHI9dC5tYXAoaSksb30sby50aWNrcz1mdW5jdGlvbigpe3ZhciBuPUp1KHIpLG89W10sYT1uWzBdLHM9blsxXSxjPU1hdGguZmxvb3IodShhKSksbD1NYXRoLmNlaWwodShzKSksZj10JTE/Mjp0O2lmKGlzRmluaXRlKGwtYykpe2lmKGUpe2Zvcig7bD5jO2MrKylmb3IodmFyIGg9MTtmPmg7aCsrKW8ucHVzaChpKGMpKmgpO28ucHVzaChpKGMpKX1lbHNlIGZvcihvLnB1c2goaShjKSk7YysrPGw7KWZvcih2YXIgaD1mLTE7aD4wO2gtLSlvLnB1c2goaShjKSpoKTtmb3IoYz0wO29bY108YTtjKyspO2ZvcihsPW8ubGVuZ3RoO29bbC0xXT5zO2wtLSk7bz1vLnNsaWNlKGMsbCl9cmV0dXJuIG99LG8udGlja0Zvcm1hdD1mdW5jdGlvbihuLHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiByczthcmd1bWVudHMubGVuZ3RoPDI/dD1yczoiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9bG8uZm9ybWF0KHQpKTt2YXIgcixhPU1hdGgubWF4KC4xLG4vby50aWNrcygpLmxlbmd0aCkscz1lPyhyPTFlLTEyLE1hdGguY2VpbCk6KHI9LTFlLTEyLE1hdGguZmxvb3IpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi9pKHModShuKStyKSk8PWE/dChuKToiIn19LG8uY29weT1mdW5jdGlvbigpe3JldHVybiBsaShuLmNvcHkoKSx0LGUscil9LHJpKG8sbil9ZnVuY3Rpb24gZmkobix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIG4odSh0KSl9dmFyIHU9aGkodCksaT1oaSgxL3QpO3JldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gaShuLmludmVydCh0KSl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuLmRvbWFpbigoZT10Lm1hcChOdW1iZXIpKS5tYXAodSkpLHIpOmV9LHIudGlja3M9ZnVuY3Rpb24obil7cmV0dXJuIG9pKGUsbil9LHIudGlja0Zvcm1hdD1mdW5jdGlvbihuLHQpe3JldHVybiBhaShlLG4sdCl9LHIubmljZT1mdW5jdGlvbihuKXtyZXR1cm4gci5kb21haW4odWkoZSxuKSl9LHIuZXhwb25lbnQ9ZnVuY3Rpb24obyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9aGkodD1vKSxpPWhpKDEvdCksbi5kb21haW4oZS5tYXAodSkpLHIpOnR9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBmaShuLmNvcHkoKSx0LGUpfSxyaShyLG4pfWZ1bmN0aW9uIGhpKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD50Py1NYXRoLnBvdygtdCxuKTpNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBnaShuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIGlbKCh1LmdldChlKXx8KCJyYW5nZSI9PT10LnQ/dS5zZXQoZSxuLnB1c2goZSkpOjAvMCkpLTEpJWkubGVuZ3RoXX1mdW5jdGlvbiByKHQsZSl7cmV0dXJuIGxvLnJhbmdlKG4ubGVuZ3RoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIHQrZSpufSl9dmFyIHUsaSxhO3JldHVybiBlLmRvbWFpbj1mdW5jdGlvbihyKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbjtuPVtdLHU9bmV3IG87Zm9yKHZhciBpLGE9LTEscz1yLmxlbmd0aDsrK2E8czspdS5oYXMoaT1yW2FdKXx8dS5zZXQoaSxuLnB1c2goaSkpO3JldHVybiBlW3QudF0uYXBwbHkoZSx0LmEpfSxlLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW4sYT0wLHQ9e3Q6InJhbmdlIixhOmFyZ3VtZW50c30sZSk6aX0sZS5yYW5nZVBvaW50cz1mdW5jdGlvbih1LG8pe2FyZ3VtZW50cy5sZW5ndGg8MiYmKG89MCk7dmFyIHM9dVswXSxjPXVbMV0sbD0oYy1zKS8oTWF0aC5tYXgoMSxuLmxlbmd0aC0xKStvKTtyZXR1cm4gaT1yKG4ubGVuZ3RoPDI/KHMrYykvMjpzK2wqby8yLGwpLGE9MCx0PXt0OiJyYW5nZVBvaW50cyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VCYW5kcz1mdW5jdGlvbih1LG8scyl7YXJndW1lbnRzLmxlbmd0aDwyJiYobz0wKSxhcmd1bWVudHMubGVuZ3RoPDMmJihzPW8pO3ZhciBjPXVbMV08dVswXSxsPXVbYy0wXSxmPXVbMS1jXSxoPShmLWwpLyhuLmxlbmd0aC1vKzIqcyk7cmV0dXJuIGk9cihsK2gqcyxoKSxjJiZpLnJldmVyc2UoKSxhPWgqKDEtbyksdD17dDoicmFuZ2VCYW5kcyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VSb3VuZEJhbmRzPWZ1bmN0aW9uKHUsbyxzKXthcmd1bWVudHMubGVuZ3RoPDImJihvPTApLGFyZ3VtZW50cy5sZW5ndGg8MyYmKHM9byk7dmFyIGM9dVsxXTx1WzBdLGw9dVtjLTBdLGY9dVsxLWNdLGg9TWF0aC5mbG9vcigoZi1sKS8obi5sZW5ndGgtbysyKnMpKSxnPWYtbC0obi5sZW5ndGgtbykqaDtyZXR1cm4gaT1yKGwrTWF0aC5yb3VuZChnLzIpLGgpLGMmJmkucmV2ZXJzZSgpLGE9TWF0aC5yb3VuZChoKigxLW8pKSx0PXt0OiJyYW5nZVJvdW5kQmFuZHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiBhfSxlLnJhbmdlRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIEp1KHQuYVswXSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBnaShuLHQpfSxlLmRvbWFpbihuKX1mdW5jdGlvbiBwaShlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgbj0wLHQ9ci5sZW5ndGg7Zm9yKG89W107KytuPHQ7KW9bbi0xXT1sby5xdWFudGlsZShlLG4vdCk7cmV0dXJuIGl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gaXNOYU4obj0rbik/dm9pZCAwOnJbbG8uYmlzZWN0KG8sbildfXZhciBvO3JldHVybiBpLmRvbWFpbj1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1yLmZpbHRlcih0KS5zb3J0KG4pLHUoKSk6ZX0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHUoKSk6cn0saS5xdWFudGlsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gb30saS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIG49ci5pbmRleE9mKG4pLDA+bj9bMC8wLDAvMF06W24+MD9vW24tMV06ZVswXSxuPG8ubGVuZ3RoP29bbl06ZVtlLmxlbmd0aC0xXV19LGkuY29weT1mdW5jdGlvbigpe3JldHVybiBwaShlLHIpfSx1KCl9ZnVuY3Rpb24gdmkobix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIGVbTWF0aC5tYXgoMCxNYXRoLm1pbihvLE1hdGguZmxvb3IoaSoodC1uKSkpKV19ZnVuY3Rpb24gdSgpe3JldHVybiBpPWUubGVuZ3RoLyh0LW4pLG89ZS5sZW5ndGgtMSxyfXZhciBpLG87cmV0dXJuIHIuZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStlWzBdLHQ9K2VbZS5sZW5ndGgtMV0sdSgpKTpbbix0XX0sci5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHUoKSk6ZX0sci5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9ZS5pbmRleE9mKHQpLHQ9MD50PzAvMDp0L2krbixbdCx0KzEvaV19LHIuY29weT1mdW5jdGlvbigpe3JldHVybiB2aShuLHQsZSl9LHUoKX1mdW5jdGlvbiBkaShuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIGU+PWU/dFtsby5iaXNlY3QobixlKV06dm9pZCAwfXJldHVybiBlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGUpOm59LGUucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixlKTp0fSxlLmludmVydEV4dGVudD1mdW5jdGlvbihlKXtyZXR1cm4gZT10LmluZGV4T2YoZSksW25bZS0xXSxuW2VdXX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGRpKG4sdCl9LGV9ZnVuY3Rpb24gbWkobil7ZnVuY3Rpb24gdChuKXtyZXR1cm4rbn1yZXR1cm4gdC5pbnZlcnQ9dCx0LmRvbWFpbj10LnJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUubWFwKHQpLHQpOm59LHQudGlja3M9ZnVuY3Rpb24odCl7cmV0dXJuIG9pKG4sdCl9LHQudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiBhaShuLHQsZSl9LHQuY29weT1mdW5jdGlvbigpe3JldHVybiBtaShuKX0sdH1mdW5jdGlvbiB5aShuKXtyZXR1cm4gbi5pbm5lclJhZGl1c31mdW5jdGlvbiB4aShuKXtyZXR1cm4gbi5vdXRlclJhZGl1c31mdW5jdGlvbiBNaShuKXtyZXR1cm4gbi5zdGFydEFuZ2xlfWZ1bmN0aW9uIF9pKG4pe3JldHVybiBuLmVuZEFuZ2xlfWZ1bmN0aW9uIGJpKG4pe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gbygpe2MucHVzaCgiTSIsaShuKGwpLGEpKX1mb3IodmFyIHMsYz1bXSxsPVtdLGY9LTEsaD10Lmxlbmd0aCxnPU10KGUpLHA9TXQocik7KytmPGg7KXUuY2FsbCh0aGlzLHM9dFtmXSxmKT9sLnB1c2goWytnLmNhbGwodGhpcyxzLGYpLCtwLmNhbGwodGhpcyxzLGYpXSk6bC5sZW5ndGgmJihvKCksbD1bXSk7cmV0dXJuIGwubGVuZ3RoJiZvKCksYy5sZW5ndGg/Yy5qb2luKCIiKTpudWxsfXZhciBlPU9lLHI9WWUsdT14ZSxpPXdpLG89aS5rZXksYT0uNztyZXR1cm4gdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sdCk6dX0sdC5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9pPW46KGk9ZnMuZ2V0KG4pfHx3aSkua2V5LHQpOm99LHQudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1uLHQpOmF9LHR9ZnVuY3Rpb24gd2kobil7cmV0dXJuIG4uam9pbigiTCIpfWZ1bmN0aW9uIGtpKG4pe3JldHVybiB3aShuKSsiWiJ9ZnVuY3Rpb24gU2kobil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiSCIsKHJbMF0rKHI9blt0XSlbMF0pLzIsIlYiLHJbMV0pO3JldHVybiBlPjEmJnUucHVzaCgiSCIsclswXSksdS5qb2luKCIiKX1mdW5jdGlvbiBDaShuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLHI9blswXSx1PVtyWzBdLCIsIixyWzFdXTsrK3Q8ZTspdS5wdXNoKCJWIiwocj1uW3RdKVsxXSwiSCIsclswXSk7cmV0dXJuIHUuam9pbigiIil9ZnVuY3Rpb24gQWkobil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiSCIsKHI9blt0XSlbMF0sIlYiLHJbMV0pO3JldHVybiB1LmpvaW4oIiIpfWZ1bmN0aW9uIE5pKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDQ/d2kobik6blsxXStUaShuLnNsaWNlKDEsbi5sZW5ndGgtMSksTGkobix0KSl9ZnVuY3Rpb24gRWkobix0KXtyZXR1cm4gbi5sZW5ndGg8Mz93aShuKTpuWzBdK1RpKChuLnB1c2goblswXSksbiksTGkoW25bbi5sZW5ndGgtMl1dLmNvbmNhdChuLFtuWzFdXSksdCkpfWZ1bmN0aW9uIHppKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDM/d2kobik6blswXStUaShuLExpKG4sdCkpfWZ1bmN0aW9uIFRpKG4sdCl7aWYodC5sZW5ndGg8MXx8bi5sZW5ndGghPXQubGVuZ3RoJiZuLmxlbmd0aCE9dC5sZW5ndGgrMilyZXR1cm4gd2kobik7dmFyIGU9bi5sZW5ndGghPXQubGVuZ3RoLHI9IiIsdT1uWzBdLGk9blsxXSxvPXRbMF0sYT1vLHM9MTtpZihlJiYocis9IlEiKyhpWzBdLTIqb1swXS8zKSsiLCIrKGlbMV0tMipvWzFdLzMpKyIsIitpWzBdKyIsIitpWzFdLHU9blsxXSxzPTIpLHQubGVuZ3RoPjEpe2E9dFsxXSxpPW5bc10scysrLHIrPSJDIisodVswXStvWzBdKSsiLCIrKHVbMV0rb1sxXSkrIiwiKyhpWzBdLWFbMF0pKyIsIisoaVsxXS1hWzFdKSsiLCIraVswXSsiLCIraVsxXTtmb3IodmFyIGM9MjtjPHQubGVuZ3RoO2MrKyxzKyspaT1uW3NdLGE9dFtjXSxyKz0iUyIrKGlbMF0tYVswXSkrIiwiKyhpWzFdLWFbMV0pKyIsIitpWzBdKyIsIitpWzFdfWlmKGUpe3ZhciBsPW5bc107cis9IlEiKyhpWzBdKzIqYVswXS8zKSsiLCIrKGlbMV0rMiphWzFdLzMpKyIsIitsWzBdKyIsIitsWzFdfXJldHVybiByfWZ1bmN0aW9uIExpKG4sdCl7Zm9yKHZhciBlLHI9W10sdT0oMS10KS8yLGk9blswXSxvPW5bMV0sYT0xLHM9bi5sZW5ndGg7KythPHM7KWU9aSxpPW8sbz1uW2FdLHIucHVzaChbdSoob1swXS1lWzBdKSx1KihvWzFdLWVbMV0pXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gcWkobil7aWYobi5sZW5ndGg8MylyZXR1cm4gd2kobik7dmFyIHQ9MSxlPW4ubGVuZ3RoLHI9blswXSx1PXJbMF0saT1yWzFdLG89W3UsdSx1LChyPW5bMV0pWzBdXSxhPVtpLGksaSxyWzFdXSxzPVt1LCIsIixpLCJMIixVaShwcyxvKSwiLCIsVWkocHMsYSldO2ZvcihuLnB1c2gobltlLTFdKTsrK3Q8PWU7KXI9blt0XSxvLnNoaWZ0KCksby5wdXNoKHJbMF0pLGEuc2hpZnQoKSxhLnB1c2goclsxXSksamkocyxvLGEpO3JldHVybiBuLnBvcCgpLHMucHVzaCgiTCIscikscy5qb2luKCIiKX1mdW5jdGlvbiBEaShuKXtpZihuLmxlbmd0aDw0KXJldHVybiB3aShuKTtmb3IodmFyIHQsZT1bXSxyPS0xLHU9bi5sZW5ndGgsaT1bMF0sbz1bMF07KytyPDM7KXQ9bltyXSxpLnB1c2godFswXSksby5wdXNoKHRbMV0pO2ZvcihlLnB1c2goVWkocHMsaSkrIiwiK1VpKHBzLG8pKSwtLXI7KytyPHU7KXQ9bltyXSxpLnNoaWZ0KCksaS5wdXNoKHRbMF0pLG8uc2hpZnQoKSxvLnB1c2godFsxXSksamkoZSxpLG8pO3JldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIFJpKG4pe2Zvcih2YXIgdCxlLHI9LTEsdT1uLmxlbmd0aCxpPXUrNCxvPVtdLGE9W107KytyPDQ7KWU9bltyJXVdLG8ucHVzaChlWzBdKSxhLnB1c2goZVsxXSk7Zm9yKHQ9W1VpKHBzLG8pLCIsIixVaShwcyxhKV0sLS1yOysrcjxpOyllPW5bciV1XSxvLnNoaWZ0KCksby5wdXNoKGVbMF0pLGEuc2hpZnQoKSxhLnB1c2goZVsxXSksamkodCxvLGEpO3JldHVybiB0LmpvaW4oIiIpfWZ1bmN0aW9uIFBpKG4sdCl7dmFyIGU9bi5sZW5ndGgtMTtpZihlKWZvcih2YXIgcix1LGk9blswXVswXSxvPW5bMF1bMV0sYT1uW2VdWzBdLWkscz1uW2VdWzFdLW8sYz0tMTsrK2M8PWU7KXI9bltjXSx1PWMvZSxyWzBdPXQqclswXSsoMS10KSooaSt1KmEpLHJbMV09dCpyWzFdKygxLXQpKihvK3Uqcyk7cmV0dXJuIHFpKG4pfWZ1bmN0aW9uIFVpKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdK25bM10qdFszXX1mdW5jdGlvbiBqaShuLHQsZSl7bi5wdXNoKCJDIixVaShocyx0KSwiLCIsVWkoaHMsZSksIiwiLFVpKGdzLHQpLCIsIixVaShncyxlKSwiLCIsVWkocHMsdCksIiwiLFVpKHBzLGUpKX1mdW5jdGlvbiBIaShuLHQpe3JldHVybih0WzFdLW5bMV0pLyh0WzBdLW5bMF0pfWZ1bmN0aW9uIEZpKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgtMSxyPVtdLHU9blswXSxpPW5bMV0sbz1yWzBdPUhpKHUsaSk7Kyt0PGU7KXJbdF09KG8rKG89SGkodT1pLGk9blt0KzFdKSkpLzI7cmV0dXJuIHJbdF09byxyfWZ1bmN0aW9uIE9pKG4pe2Zvcih2YXIgdCxlLHIsdSxpPVtdLG89RmkobiksYT0tMSxzPW4ubGVuZ3RoLTE7KythPHM7KXQ9SGkoblthXSxuW2ErMV0pLFNvKHQpPFhvP29bYV09b1thKzFdPTA6KGU9b1thXS90LHI9b1thKzFdL3QsdT1lKmUrcipyLHU+OSYmKHU9Myp0L01hdGguc3FydCh1KSxvW2FdPXUqZSxvW2ErMV09dSpyKSk7Zm9yKGE9LTE7KythPD1zOyl1PShuW01hdGgubWluKHMsYSsxKV1bMF0tbltNYXRoLm1heCgwLGEtMSldWzBdKS8oNiooMStvW2FdKm9bYV0pKSxpLnB1c2goW3V8fDAsb1thXSp1fHwwXSk7cmV0dXJuIGl9ZnVuY3Rpb24gWWkobil7cmV0dXJuIG4ubGVuZ3RoPDM/d2kobik6blswXStUaShuLE9pKG4pKX1mdW5jdGlvbiBJaShuKXtmb3IodmFyIHQsZSxyLHU9LTEsaT1uLmxlbmd0aDsrK3U8aTspdD1uW3VdLGU9dFswXSxyPXRbMV0rY3MsdFswXT1lKk1hdGguY29zKHIpLHRbMV09ZSpNYXRoLnNpbihyKTtyZXR1cm4gbn1mdW5jdGlvbiBaaShuKXtmdW5jdGlvbiB0KHQpe2Z1bmN0aW9uIHMoKXt2LnB1c2goIk0iLGEobihtKSxmKSxsLGMobihkLnJldmVyc2UoKSksZiksIloiKX1mb3IodmFyIGgsZyxwLHY9W10sZD1bXSxtPVtdLHk9LTEseD10Lmxlbmd0aCxNPU10KGUpLF89TXQodSksYj1lPT09cj9mdW5jdGlvbigpe3JldHVybiBnfTpNdChyKSx3PXU9PT1pP2Z1bmN0aW9uKCl7cmV0dXJuIHB9Ok10KGkpOysreTx4OylvLmNhbGwodGhpcyxoPXRbeV0seSk/KGQucHVzaChbZz0rTS5jYWxsKHRoaXMsaCx5KSxwPStfLmNhbGwodGhpcyxoLHkpXSksbS5wdXNoKFsrYi5jYWxsKHRoaXMsaCx5KSwrdy5jYWxsKHRoaXMsaCx5KV0pKTpkLmxlbmd0aCYmKHMoKSxkPVtdLG09W10pO3JldHVybiBkLmxlbmd0aCYmcygpLHYubGVuZ3RoP3Yuam9pbigiIik6bnVsbH12YXIgZT1PZSxyPU9lLHU9MCxpPVllLG89eGUsYT13aSxzPWEua2V5LGM9YSxsPSJMIixmPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9cj1uLHQpOnJ9LHQueDA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0LngxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWk9bix0KTppfSx0LnkwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sdCk6dX0sdC55MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLHQpOml9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLHQpOm99LHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/YT1uOihhPWZzLmdldChuKXx8d2kpLmtleSxjPWEucmV2ZXJzZXx8YSxsPWEuY2xvc2VkPyJNIjoiTCIsdCk6c30sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPW4sdCk6Zn0sdH1mdW5jdGlvbiBWaShuKXtyZXR1cm4gbi5zb3VyY2V9ZnVuY3Rpb24gWGkobil7cmV0dXJuIG4udGFyZ2V0fWZ1bmN0aW9uICRpKG4pe3JldHVybiBuLnJhZGl1c31mdW5jdGlvbiBCaShuKXtyZXR1cm5bbi54LG4ueV19ZnVuY3Rpb24gV2kobil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10WzBdLHI9dFsxXStjcztyZXR1cm5bZSpNYXRoLmNvcyhyKSxlKk1hdGguc2luKHIpXX19ZnVuY3Rpb24gSmkoKXtyZXR1cm4gNjR9ZnVuY3Rpb24gR2koKXtyZXR1cm4iY2lyY2xlIn1mdW5jdGlvbiBLaShuKXt2YXIgdD1NYXRoLnNxcnQobi9Jbyk7cmV0dXJuIk0wLCIrdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIistdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIit0KyJaIn1mdW5jdGlvbiBRaShuLHQpe3JldHVybiB6byhuLE1zKSxuLmlkPXQsbn1mdW5jdGlvbiBubyhuLHQsZSxyKXt2YXIgdT1uLmlkO3JldHVybiBQKG4sImZ1bmN0aW9uIj09dHlwZW9mIGU/ZnVuY3Rpb24obixpLG8pe24uX190cmFuc2l0aW9uX19bdV0udHdlZW4uc2V0KHQscihlLmNhbGwobixuLl9fZGF0YV9fLGksbykpKX06KGU9cihlKSxmdW5jdGlvbihuKXtuLl9fdHJhbnNpdGlvbl9fW3VdLnR3ZWVuLnNldCh0LGUpfSkpfWZ1bmN0aW9uIHRvKG4pe3JldHVybiBudWxsPT1uJiYobj0iIiksZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PW59fWZ1bmN0aW9uIGVvKG4sdCxlLHIpe3ZhciB1PW4uX190cmFuc2l0aW9uX198fChuLl9fdHJhbnNpdGlvbl9fPXthY3RpdmU6MCxjb3VudDowfSksaT11W2VdO2lmKCFpKXt2YXIgYT1yLnRpbWU7aT11W2VdPXt0d2VlbjpuZXcgbyx0aW1lOmEsZWFzZTpyLmVhc2UsZGVsYXk6ci5kZWxheSxkdXJhdGlvbjpyLmR1cmF0aW9ufSwrK3UuY291bnQsbG8udGltZXIoZnVuY3Rpb24ocil7ZnVuY3Rpb24gbyhyKXtyZXR1cm4gdS5hY3RpdmU+ZT9jKCk6KHUuYWN0aXZlPWUsaS5ldmVudCYmaS5ldmVudC5zdGFydC5jYWxsKG4sbCx0KSxpLnR3ZWVuLmZvckVhY2goZnVuY3Rpb24oZSxyKXsocj1yLmNhbGwobixsLHQpKSYmdi5wdXNoKHIpfSksbG8udGltZXIoZnVuY3Rpb24oKXtyZXR1cm4gcC5jPXMocnx8MSk/eGU6cywxfSwwLGEpLHZvaWQgMCl9ZnVuY3Rpb24gcyhyKXtpZih1LmFjdGl2ZSE9PWUpcmV0dXJuIGMoKTtmb3IodmFyIG89ci9nLGE9ZihvKSxzPXYubGVuZ3RoO3M+MDspdlstLXNdLmNhbGwobixhKTtyZXR1cm4gbz49MT8oaS5ldmVudCYmaS5ldmVudC5lbmQuY2FsbChuLGwsdCksYygpKTp2b2lkIDB9ZnVuY3Rpb24gYygpe3JldHVybi0tdS5jb3VudD9kZWxldGUgdVtlXTpkZWxldGUgbi5fX3RyYW5zaXRpb25fXywxfXZhciBsPW4uX19kYXRhX18sZj1pLmVhc2UsaD1pLmRlbGF5LGc9aS5kdXJhdGlvbixwPXZhLHY9W107cmV0dXJuIHAudD1oK2Escj49aD9vKHItaCk6KHAuYz1vLHZvaWQgMCl9LDAsYSl9fWZ1bmN0aW9uIHJvKG4sdCl7bi5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3JldHVybiJ0cmFuc2xhdGUoIit0KG4pKyIsMCkifSl9ZnVuY3Rpb24gdW8obix0KXtuLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7cmV0dXJuInRyYW5zbGF0ZSgwLCIrdChuKSsiKSJ9KX1mdW5jdGlvbiBpbyhuKXtyZXR1cm4gbi50b0lTT1N0cmluZygpfWZ1bmN0aW9uIG9vKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKHQpfWZ1bmN0aW9uIHUobixlKXt2YXIgcj1uWzFdLW5bMF0sdT1yL2UsaT1sby5iaXNlY3QoRXMsdSk7cmV0dXJuIGk9PUVzLmxlbmd0aD9bdC55ZWFyLGlpKG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLzMxNTM2ZTZ9KSxlKVsyXV06aT90W3UvRXNbaS0xXTxFc1tpXS91P2ktMTppXTpbTHMsaWkobixlKVsyXV19cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBhbyhuLmludmVydCh0KSl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuLmRvbWFpbih0KSxyKTpuLmRvbWFpbigpLm1hcChhbyl9LHIubmljZT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIWlzTmFOKGUpJiYhbi5yYW5nZShlLGFvKCtlKzEpLHQpLmxlbmd0aH12YXIgaT1yLmRvbWFpbigpLG89SnUoaSksYT1udWxsPT1uP3UobywxMCk6Im51bWJlciI9PXR5cGVvZiBuJiZ1KG8sbik7cmV0dXJuIGEmJihuPWFbMF0sdD1hWzFdKSxyLmRvbWFpbihRdShpLHQ+MT97Zmxvb3I6ZnVuY3Rpb24odCl7Zm9yKDtlKHQ9bi5mbG9vcih0KSk7KXQ9YW8odC0xKTtyZXR1cm4gdH0sY2VpbDpmdW5jdGlvbih0KXtmb3IoO2UodD1uLmNlaWwodCkpOyl0PWFvKCt0KzEpO3JldHVybiB0fX06bikpfSxyLnRpY2tzPWZ1bmN0aW9uKG4sdCl7dmFyIGU9SnUoci5kb21haW4oKSksaT1udWxsPT1uP3UoZSwxMCk6Im51bWJlciI9PXR5cGVvZiBuP3UoZSxuKTohbi5yYW5nZSYmW3tyYW5nZTpufSx0XTtyZXR1cm4gaSYmKG49aVswXSx0PWlbMV0pLG4ucmFuZ2UoZVswXSxhbygrZVsxXSsxKSwxPnQ/MTp0KX0sci50aWNrRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBvbyhuLmNvcHkoKSx0LGUpfSxyaShyLG4pfWZ1bmN0aW9uIGFvKG4pe3JldHVybiBuZXcgRGF0ZShuKX1mdW5jdGlvbiBzbyhuKXtyZXR1cm4gSlNPTi5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gY28obil7dmFyIHQ9Z28uY3JlYXRlUmFuZ2UoKTtyZXR1cm4gdC5zZWxlY3ROb2RlKGdvLmJvZHkpLHQuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KG4ucmVzcG9uc2VUZXh0KX12YXIgbG89e3ZlcnNpb246IjMuNC4xMSJ9O0RhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KTt2YXIgZm89W10uc2xpY2UsaG89ZnVuY3Rpb24obil7cmV0dXJuIGZvLmNhbGwobil9LGdvPWRvY3VtZW50LHBvPWdvLmRvY3VtZW50RWxlbWVudCx2bz13aW5kb3c7dHJ5e2hvKHBvLmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlfWNhdGNoKG1vKXtobz1mdW5jdGlvbihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1uZXcgQXJyYXkodCk7dC0tOyllW3RdPW5bdF07cmV0dXJuIGV9fXRyeXtnby5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZS5zZXRQcm9wZXJ0eSgib3BhY2l0eSIsMCwiIil9Y2F0Y2goeW8pe3ZhciB4bz12by5FbGVtZW50LnByb3RvdHlwZSxNbz14by5zZXRBdHRyaWJ1dGUsX289eG8uc2V0QXR0cmlidXRlTlMsYm89dm8uQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUsd289Ym8uc2V0UHJvcGVydHk7eG8uc2V0QXR0cmlidXRlPWZ1bmN0aW9uKG4sdCl7TW8uY2FsbCh0aGlzLG4sdCsiIil9LHhvLnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKG4sdCxlKXtfby5jYWxsKHRoaXMsbix0LGUrIiIpfSxiby5zZXRQcm9wZXJ0eT1mdW5jdGlvbihuLHQsZSl7d28uY2FsbCh0aGlzLG4sdCsiIixlKX19bG8uYXNjZW5kaW5nPW4sbG8uZGVzY2VuZGluZz1mdW5jdGlvbihuLHQpe3JldHVybiBuPnQ/LTE6dD5uPzE6dD49bj8wOjAvMH0sbG8ubWluPWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7Kyt1PGkmJiEobnVsbCE9KGU9blt1XSkmJmU+PWUpOyllPXZvaWQgMDtmb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmZT5yJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGkmJiEobnVsbCE9KGU9dC5jYWxsKG4sblt1XSx1KSkmJmU+PWUpOyllPXZvaWQgMDtmb3IoOysrdTxpOyludWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmZT5yJiYoZT1yKX1yZXR1cm4gZX0sbG8ubWF4PWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7Kyt1PGkmJiEobnVsbCE9KGU9blt1XSkmJmU+PWUpOyllPXZvaWQgMDtmb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmcj5lJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGkmJiEobnVsbCE9KGU9dC5jYWxsKG4sblt1XSx1KSkmJmU+PWUpOyllPXZvaWQgMDtmb3IoOysrdTxpOyludWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj5lJiYoZT1yKX1yZXR1cm4gZX0sbG8uZXh0ZW50PWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1LGk9LTEsbz1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK2k8byYmIShudWxsIT0oZT11PW5baV0pJiZlPj1lKTspZT11PXZvaWQgMDtmb3IoOysraTxvOyludWxsIT0ocj1uW2ldKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9ZWxzZXtmb3IoOysraTxvJiYhKG51bGwhPShlPXU9dC5jYWxsKG4sbltpXSxpKSkmJmU+PWUpOyllPXZvaWQgMDtmb3IoOysraTxvOyludWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9cmV0dXJuW2UsdV19LGxvLnN1bT1mdW5jdGlvbihuLHQpe3ZhciBlLHI9MCx1PW4ubGVuZ3RoLGk9LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2k8dTspaXNOYU4oZT0rbltpXSl8fChyKz1lKTtlbHNlIGZvcig7KytpPHU7KWlzTmFOKGU9K3QuY2FsbChuLG5baV0saSkpfHwocis9ZSk7cmV0dXJuIHJ9LGxvLm1lYW49ZnVuY3Rpb24obixlKXt2YXIgcix1PTAsaT1uLmxlbmd0aCxvPS0xLGE9aTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrbzxpOyl0KHI9bltvXSk/dSs9cjotLWE7ZWxzZSBmb3IoOysrbzxpOyl0KHI9ZS5jYWxsKG4sbltvXSxvKSk/dSs9cjotLWE7cmV0dXJuIGE/dS9hOnZvaWQgMH0sbG8ucXVhbnRpbGU9ZnVuY3Rpb24obix0KXt2YXIgZT0obi5sZW5ndGgtMSkqdCsxLHI9TWF0aC5mbG9vcihlKSx1PStuW3ItMV0saT1lLXI7cmV0dXJuIGk/dStpKihuW3JdLXUpOnV9LGxvLm1lZGlhbj1mdW5jdGlvbihlLHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjEmJihlPWUubWFwKHIpKSxlPWUuZmlsdGVyKHQpLGUubGVuZ3RoP2xvLnF1YW50aWxlKGUuc29ydChuKSwuNSk6dm9pZCAwfTt2YXIga289ZShuKTtsby5iaXNlY3RMZWZ0PWtvLmxlZnQsbG8uYmlzZWN0PWxvLmJpc2VjdFJpZ2h0PWtvLnJpZ2h0LGxvLmJpc2VjdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBlKDE9PT10Lmxlbmd0aD9mdW5jdGlvbihlLHIpe3JldHVybiBuKHQoZSkscil9OnQpfSxsby5zaHVmZmxlPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHI9bi5sZW5ndGg7cjspZT0wfE1hdGgucmFuZG9tKCkqci0tLHQ9bltyXSxuW3JdPW5bZV0sbltlXT10O3JldHVybiBufSxsby5wZXJtdXRlPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT1uW3RbZV1dO3JldHVybiByfSxsby5wYWlycz1mdW5jdGlvbihuKXtmb3IodmFyIHQsZT0wLHI9bi5sZW5ndGgtMSx1PW5bMF0saT1uZXcgQXJyYXkoMD5yPzA6cik7cj5lOylpW2VdPVt0PXUsdT1uWysrZV1dO3JldHVybiBpfSxsby56aXA9ZnVuY3Rpb24oKXtpZighKHU9YXJndW1lbnRzLmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLHQ9bG8ubWluKGFyZ3VtZW50cyxyKSxlPW5ldyBBcnJheSh0KTsrK248dDspZm9yKHZhciB1LGk9LTEsbz1lW25dPW5ldyBBcnJheSh1KTsrK2k8dTspb1tpXT1hcmd1bWVudHNbaV1bbl07cmV0dXJuIGV9LGxvLnRyYW5zcG9zZT1mdW5jdGlvbihuKXtyZXR1cm4gbG8uemlwLmFwcGx5KGxvLG4pfSxsby5rZXlzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChlKTtyZXR1cm4gdH0sbG8udmFsdWVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChuW2VdKTtyZXR1cm4gdH0sbG8uZW50cmllcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2goe2tleTplLHZhbHVlOm5bZV19KTtyZXR1cm4gdH0sbG8ubWVyZ2U9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1PW4ubGVuZ3RoLGk9LTEsbz0wOysraTx1OylvKz1uW2ldLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkobyk7LS11Pj0wOylmb3Iocj1uW3VdLHQ9ci5sZW5ndGg7LS10Pj0wOyllWy0tb109clt0XTtyZXR1cm4gZX07dmFyIFNvPU1hdGguYWJzO2xvLnJhbmdlPWZ1bmN0aW9uKG4sdCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihlPTEsYXJndW1lbnRzLmxlbmd0aDwyJiYodD1uLG49MCkpLDEvMD09PSh0LW4pL2UpdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpO3ZhciByLGk9W10sbz11KFNvKGUpKSxhPS0xO2lmKG4qPW8sdCo9byxlKj1vLDA+ZSlmb3IoOyhyPW4rZSorK2EpPnQ7KWkucHVzaChyL28pO2Vsc2UgZm9yKDsocj1uK2UqKythKTx0OylpLnB1c2goci9vKTtyZXR1cm4gaX0sbG8ubWFwPWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBvO2lmKG4gaW5zdGFuY2VvZiBvKW4uZm9yRWFjaChmdW5jdGlvbihuLGUpe3Quc2V0KG4sZSl9KTtlbHNlIGZvcih2YXIgZSBpbiBuKXQuc2V0KGUsbltlXSk7cmV0dXJuIHR9LGkobyx7aGFzOmEsZ2V0OmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzW0NvK25dfSxzZXQ6ZnVuY3Rpb24obix0KXtyZXR1cm4gdGhpc1tDbytuXT10fSxyZW1vdmU6cyxrZXlzOmMsdmFsdWVzOmZ1bmN0aW9uKCl7dmFyIG49W107cmV0dXJuIHRoaXMuZm9yRWFjaChmdW5jdGlvbih0LGUpe24ucHVzaChlKX0pLG59LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgbj1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHQsZSl7bi5wdXNoKHtrZXk6dCx2YWx1ZTplfSl9KSxufSxzaXplOmwsZW1wdHk6Zixmb3JFYWNoOmZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiB0aGlzKXQuY2hhckNvZGVBdCgwKT09PUFvJiZuLmNhbGwodGhpcyx0LnN1YnN0cmluZygxKSx0aGlzW3RdKX19KTt2YXIgQ289Ilx4MDAiLEFvPUNvLmNoYXJDb2RlQXQoMCk7bG8ubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxhLHMpe2lmKHM+PWkubGVuZ3RoKXJldHVybiByP3IuY2FsbCh1LGEpOmU/YS5zb3J0KGUpOmE7Zm9yKHZhciBjLGwsZixoLGc9LTEscD1hLmxlbmd0aCx2PWlbcysrXSxkPW5ldyBvOysrZzxwOykoaD1kLmdldChjPXYobD1hW2ddKSkpP2gucHVzaChsKTpkLnNldChjLFtsXSk7cmV0dXJuIHQ/KGw9dCgpLGY9ZnVuY3Rpb24oZSxyKXtsLnNldChlLG4odCxyLHMpKX0pOihsPXt9LGY9ZnVuY3Rpb24oZSxyKXtsW2VdPW4odCxyLHMpfSksZC5mb3JFYWNoKGYpLGx9ZnVuY3Rpb24gdChuLGUpe2lmKGU+PWkubGVuZ3RoKXJldHVybiBuO3ZhciByPVtdLHU9YVtlKytdO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24obix1KXtyLnB1c2goe2tleTpuLHZhbHVlczp0KHUsZSl9KX0pLHU/ci5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHUobi5rZXksdC5rZXkpfSk6cn12YXIgZSxyLHU9e30saT1bXSxhPVtdO3JldHVybiB1Lm1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBuKGUsdCwwKX0sdS5lbnRyaWVzPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4obG8ubWFwLGUsMCksMCl9LHUua2V5PWZ1bmN0aW9uKG4pe3JldHVybiBpLnB1c2gobiksdX0sdS5zb3J0S2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gYVtpLmxlbmd0aC0xXT1uLHV9LHUuc29ydFZhbHVlcz1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLHV9LHUucm9sbHVwPWZ1bmN0aW9uKG4pe3JldHVybiByPW4sdX0sdX0sbG8uc2V0PWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBoO2lmKG4pZm9yKHZhciBlPTAscj1uLmxlbmd0aDtyPmU7KytlKXQuYWRkKG5bZV0pO3JldHVybiB0fSxpKGgse2hhczphLGFkZDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpc1tDbytuXT0hMCxufSxyZW1vdmU6ZnVuY3Rpb24obil7cmV0dXJuIG49Q28rbixuIGluIHRoaXMmJmRlbGV0ZSB0aGlzW25dfSx2YWx1ZXM6YyxzaXplOmwsZW1wdHk6Zixmb3JFYWNoOmZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiB0aGlzKXQuY2hhckNvZGVBdCgwKT09PUFvJiZuLmNhbGwodGhpcyx0LnN1YnN0cmluZygxKSl9fSksbG8uYmVoYXZpb3I9e30sbG8ucmViaW5kPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlLHI9MSx1PWFyZ3VtZW50cy5sZW5ndGg7KytyPHU7KW5bZT1hcmd1bWVudHNbcl1dPWcobix0LHRbZV0pO3JldHVybiBufTt2YXIgTm89WyJ3ZWJraXQiLCJtcyIsIm1veiIsIk1veiIsIm8iLCJPIl07bG8uZGlzcGF0Y2g9ZnVuY3Rpb24oKXtmb3IodmFyIG49bmV3IGQsdD0tMSxlPWFyZ3VtZW50cy5sZW5ndGg7Kyt0PGU7KW5bYXJndW1lbnRzW3RdXT1tKG4pO3JldHVybiBufSxkLnByb3RvdHlwZS5vbj1mdW5jdGlvbihuLHQpe3ZhciBlPW4uaW5kZXhPZigiLiIpLHI9IiI7aWYoZT49MCYmKHI9bi5zdWJzdHJpbmcoZSsxKSxuPW4uc3Vic3RyaW5nKDAsZSkpLG4pcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj90aGlzW25dLm9uKHIpOnRoaXNbbl0ub24ocix0KTtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYobnVsbD09dClmb3IobiBpbiB0aGlzKXRoaXMuaGFzT3duUHJvcGVydHkobikmJnRoaXNbbl0ub24ocixudWxsKTtyZXR1cm4gdGhpc319LGxvLmV2ZW50PW51bGwsbG8ucmVxdW90ZT1mdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKEVvLCJcXCQmIil9O3ZhciBFbz0vW1xcXF5cJFwqXCtcP1x8XFtcXVwoXClcLlx7XH1dL2csem89e30uX19wcm90b19fP2Z1bmN0aW9uKG4sdCl7bi5fX3Byb3RvX189dH06ZnVuY3Rpb24obix0KXtmb3IodmFyIGUgaW4gdCluW2VdPXRbZV19LFRvPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcihuKX0sTG89ZnVuY3Rpb24obix0KXtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yQWxsKG4pfSxxbz1wby5tYXRjaGVzfHxwb1twKHBvLCJtYXRjaGVzU2VsZWN0b3IiKV0sRG89ZnVuY3Rpb24obix0KXtyZXR1cm4gcW8uY2FsbChuLHQpfTsiZnVuY3Rpb24iPT10eXBlb2YgU2l6emxlJiYoVG89ZnVuY3Rpb24obix0KXtyZXR1cm4gU2l6emxlKG4sdClbMF18fG51bGx9LExvPVNpenpsZSxEbz1TaXp6bGUubWF0Y2hlc1NlbGVjdG9yKSxsby5zZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gam99O3ZhciBSbz1sby5zZWxlY3Rpb24ucHJvdG90eXBlPVtdO1JvLnNlbGVjdD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpPVtdO249YihuKTtmb3IodmFyIG89LTEsYT10aGlzLmxlbmd0aDsrK288YTspe2kucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9KHI9dGhpc1tvXSkucGFyZW50Tm9kZTtmb3IodmFyIHM9LTEsYz1yLmxlbmd0aDsrK3M8YzspKHU9cltzXSk/KHQucHVzaChlPW4uY2FsbCh1LHUuX19kYXRhX18scyxvKSksZSYmIl9fZGF0YV9fImluIHUmJihlLl9fZGF0YV9fPXUuX19kYXRhX18pKTp0LnB1c2gobnVsbCl9cmV0dXJuIF8oaSl9LFJvLnNlbGVjdEFsbD1mdW5jdGlvbihuKXt2YXIgdCxlLHI9W107bj13KG4pO2Zvcih2YXIgdT0tMSxpPXRoaXMubGVuZ3RoOysrdTxpOylmb3IodmFyIG89dGhpc1t1XSxhPS0xLHM9by5sZW5ndGg7KythPHM7KShlPW9bYV0pJiYoci5wdXNoKHQ9aG8obi5jYWxsKGUsZS5fX2RhdGFfXyxhLHUpKSksdC5wYXJlbnROb2RlPWUpO3JldHVybiBfKHIpfTt2YXIgUG89e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIix4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O2xvLm5zPXtwcmVmaXg6UG8scXVhbGlmeTpmdW5jdGlvbihuKXt2YXIgdD1uLmluZGV4T2YoIjoiKSxlPW47cmV0dXJuIHQ+PTAmJihlPW4uc3Vic3RyaW5nKDAsdCksbj1uLnN1YnN0cmluZyh0KzEpKSxQby5oYXNPd25Qcm9wZXJ0eShlKT97c3BhY2U6UG9bZV0sbG9jYWw6bn06bn19LFJvLmF0dHI9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGU9dGhpcy5ub2RlKCk7cmV0dXJuIG49bG8ubnMucXVhbGlmeShuKSxuLmxvY2FsP2UuZ2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTplLmdldEF0dHJpYnV0ZShuKX1mb3IodCBpbiBuKXRoaXMuZWFjaChrKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goayhuLHQpKX0sUm8uY2xhc3NlZD1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgZT10aGlzLm5vZGUoKSxyPShuPUEobikpLmxlbmd0aCx1PS0xO2lmKHQ9ZS5jbGFzc0xpc3Qpe2Zvcig7Kyt1PHI7KWlmKCF0LmNvbnRhaW5zKG5bdV0pKXJldHVybiExfWVsc2UgZm9yKHQ9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Kyt1PHI7KWlmKCFDKG5bdV0pLnRlc3QodCkpcmV0dXJuITE7cmV0dXJuITB9Zm9yKHQgaW4gbil0aGlzLmVhY2goTih0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKE4obix0KSl9LFJvLnN0eWxlPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO2lmKDM+cil7aWYoInN0cmluZyIhPXR5cGVvZiBuKXsyPnImJih0PSIiKTtmb3IoZSBpbiBuKXRoaXMuZWFjaCh6KGUsbltlXSx0KSk7cmV0dXJuIHRoaXN9aWYoMj5yKXJldHVybiB2by5nZXRDb21wdXRlZFN0eWxlKHRoaXMubm9kZSgpLG51bGwpLmdldFByb3BlcnR5VmFsdWUobik7ZT0iIn1yZXR1cm4gdGhpcy5lYWNoKHoobix0LGUpKX0sUm8ucHJvcGVydHk9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gdGhpcy5ub2RlKClbbl07Zm9yKHQgaW4gbil0aGlzLmVhY2goVCh0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKFQobix0KSl9LFJvLnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT10PyIiOnR9Om51bGw9PW4/ZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PSIifTpmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9bn0pOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxSby5odG1sPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PXQ/IiI6dH06bnVsbD09bj9mdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPSIifTpmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPW59KTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LFJvLmFwcGVuZD1mdW5jdGlvbihuKXtyZXR1cm4gbj1MKG4pLHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LFJvLmluc2VydD1mdW5jdGlvbihuLHQpe3JldHVybiBuPUwobiksdD1iKHQpLHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pfSxSby5yZW1vdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5wYXJlbnROb2RlO24mJm4ucmVtb3ZlQ2hpbGQodGhpcyl9KX0sUm8uZGF0YT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcix1LGksYT1uLmxlbmd0aCxmPWUubGVuZ3RoLGg9TWF0aC5taW4oYSxmKSxnPW5ldyBBcnJheShmKSxwPW5ldyBBcnJheShmKSx2PW5ldyBBcnJheShhKTsKaWYodCl7dmFyIGQsbT1uZXcgbyx5PW5ldyBvLHg9W107Zm9yKHI9LTE7KytyPGE7KWQ9dC5jYWxsKHU9bltyXSx1Ll9fZGF0YV9fLHIpLG0uaGFzKGQpP3Zbcl09dTptLnNldChkLHUpLHgucHVzaChkKTtmb3Iocj0tMTsrK3I8ZjspZD10LmNhbGwoZSxpPWVbcl0sciksKHU9bS5nZXQoZCkpPyhnW3JdPXUsdS5fX2RhdGFfXz1pKTp5LmhhcyhkKXx8KHBbcl09cShpKSkseS5zZXQoZCxpKSxtLnJlbW92ZShkKTtmb3Iocj0tMTsrK3I8YTspbS5oYXMoeFtyXSkmJih2W3JdPW5bcl0pfWVsc2V7Zm9yKHI9LTE7KytyPGg7KXU9bltyXSxpPWVbcl0sdT8odS5fX2RhdGFfXz1pLGdbcl09dSk6cFtyXT1xKGkpO2Zvcig7Zj5yOysrcilwW3JdPXEoZVtyXSk7Zm9yKDthPnI7KytyKXZbcl09bltyXX1wLnVwZGF0ZT1nLHAucGFyZW50Tm9kZT1nLnBhcmVudE5vZGU9di5wYXJlbnROb2RlPW4ucGFyZW50Tm9kZSxzLnB1c2gocCksYy5wdXNoKGcpLGwucHVzaCh2KX12YXIgcix1LGk9LTEsYT10aGlzLmxlbmd0aDtpZighYXJndW1lbnRzLmxlbmd0aCl7Zm9yKG49bmV3IEFycmF5KGE9KHI9dGhpc1swXSkubGVuZ3RoKTsrK2k8YTspKHU9cltpXSkmJihuW2ldPXUuX19kYXRhX18pO3JldHVybiBufXZhciBzPVUoW10pLGM9XyhbXSksbD1fKFtdKTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbilmb3IoOysraTxhOyllKHI9dGhpc1tpXSxuLmNhbGwocixyLnBhcmVudE5vZGUuX19kYXRhX18saSkpO2Vsc2UgZm9yKDsrK2k8YTspZShyPXRoaXNbaV0sbik7cmV0dXJuIGMuZW50ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gc30sYy5leGl0PWZ1bmN0aW9uKCl7cmV0dXJuIGx9LGN9LFJvLmRhdHVtPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIixuKTp0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIpfSxSby5maWx0ZXI9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9W107ImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPUQobikpO2Zvcih2YXIgaT0wLG89dGhpcy5sZW5ndGg7bz5pO2krKyl7dS5wdXNoKHQ9W10pLHQucGFyZW50Tm9kZT0oZT10aGlzW2ldKS5wYXJlbnROb2RlO2Zvcih2YXIgYT0wLHM9ZS5sZW5ndGg7cz5hO2ErKykocj1lW2FdKSYmbi5jYWxsKHIsci5fX2RhdGFfXyxhLGkpJiZ0LnB1c2gocil9cmV0dXJuIF8odSl9LFJvLm9yZGVyPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xLHQ9dGhpcy5sZW5ndGg7KytuPHQ7KWZvcih2YXIgZSxyPXRoaXNbbl0sdT1yLmxlbmd0aC0xLGk9clt1XTstLXU+PTA7KShlPXJbdV0pJiYoaSYmaSE9PWUubmV4dFNpYmxpbmcmJmkucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSxpKSxpPWUpO3JldHVybiB0aGlzfSxSby5zb3J0PWZ1bmN0aW9uKG4pe249Ui5hcHBseSh0aGlzLGFyZ3VtZW50cyk7Zm9yKHZhciB0PS0xLGU9dGhpcy5sZW5ndGg7Kyt0PGU7KXRoaXNbdF0uc29ydChuKTtyZXR1cm4gdGhpcy5vcmRlcigpfSxSby5lYWNoPWZ1bmN0aW9uKG4pe3JldHVybiBQKHRoaXMsZnVuY3Rpb24odCxlLHIpe24uY2FsbCh0LHQuX19kYXRhX18sZSxyKX0pfSxSby5jYWxsPWZ1bmN0aW9uKG4pe3ZhciB0PWhvKGFyZ3VtZW50cyk7cmV0dXJuIG4uYXBwbHkodFswXT10aGlzLHQpLHRoaXN9LFJvLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxSby5ub2RlPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsdD10aGlzLmxlbmd0aDt0Pm47bisrKWZvcih2YXIgZT10aGlzW25dLHI9MCx1PWUubGVuZ3RoO3U+cjtyKyspe3ZhciBpPWVbcl07aWYoaSlyZXR1cm4gaX1yZXR1cm4gbnVsbH0sUm8uc2l6ZT1mdW5jdGlvbigpe3ZhciBuPTA7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeysrbn0pLG59O3ZhciBVbz1bXTtsby5zZWxlY3Rpb24uZW50ZXI9VSxsby5zZWxlY3Rpb24uZW50ZXIucHJvdG90eXBlPVVvLFVvLmFwcGVuZD1Sby5hcHBlbmQsVW8uZW1wdHk9Um8uZW1wdHksVW8ubm9kZT1Sby5ub2RlLFVvLmNhbGw9Um8uY2FsbCxVby5zaXplPVJvLnNpemUsVW8uc2VsZWN0PWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHIsdSxpLG89W10sYT0tMSxzPXRoaXMubGVuZ3RoOysrYTxzOyl7cj0odT10aGlzW2FdKS51cGRhdGUsby5wdXNoKHQ9W10pLHQucGFyZW50Tm9kZT11LnBhcmVudE5vZGU7Zm9yKHZhciBjPS0xLGw9dS5sZW5ndGg7KytjPGw7KShpPXVbY10pPyh0LnB1c2gocltjXT1lPW4uY2FsbCh1LnBhcmVudE5vZGUsaS5fX2RhdGFfXyxjLGEpKSxlLl9fZGF0YV9fPWkuX19kYXRhX18pOnQucHVzaChudWxsKX1yZXR1cm4gXyhvKX0sVW8uaW5zZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9aih0aGlzKSksUm8uaW5zZXJ0LmNhbGwodGhpcyxuLHQpfSxSby50cmFuc2l0aW9uPWZ1bmN0aW9uKCl7Zm9yKHZhciBuLHQsZT1kc3x8KytfcyxyPVtdLHU9bXN8fHt0aW1lOkRhdGUubm93KCksZWFzZTpqcixkZWxheTowLGR1cmF0aW9uOjI1MH0saT0tMSxvPXRoaXMubGVuZ3RoOysraTxvOyl7ci5wdXNoKG49W10pO2Zvcih2YXIgYT10aGlzW2ldLHM9LTEsYz1hLmxlbmd0aDsrK3M8YzspKHQ9YVtzXSkmJmVvKHQscyxlLHUpLG4ucHVzaCh0KX1yZXR1cm4gUWkocixlKX0sUm8uaW50ZXJydXB0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChIKX0sbG8uc2VsZWN0PWZ1bmN0aW9uKG4pe3ZhciB0PVsic3RyaW5nIj09dHlwZW9mIG4/VG8obixnbyk6bl07cmV0dXJuIHQucGFyZW50Tm9kZT1wbyxfKFt0XSl9LGxvLnNlbGVjdEFsbD1mdW5jdGlvbihuKXt2YXIgdD1obygic3RyaW5nIj09dHlwZW9mIG4/TG8obixnbyk6bik7cmV0dXJuIHQucGFyZW50Tm9kZT1wbyxfKFt0XSl9O3ZhciBqbz1sby5zZWxlY3QocG8pO1JvLm9uPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO2lmKDM+cil7aWYoInN0cmluZyIhPXR5cGVvZiBuKXsyPnImJih0PSExKTtmb3IoZSBpbiBuKXRoaXMuZWFjaChGKGUsbltlXSx0KSk7cmV0dXJuIHRoaXN9aWYoMj5yKXJldHVybihyPXRoaXMubm9kZSgpWyJfX29uIituXSkmJnIuXztlPSExfXJldHVybiB0aGlzLmVhY2goRihuLHQsZSkpfTt2YXIgSG89bG8ubWFwKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pO0hvLmZvckVhY2goZnVuY3Rpb24obil7Im9uIituIGluIGdvJiZIby5yZW1vdmUobil9KTt2YXIgRm89Im9uc2VsZWN0c3RhcnQiaW4gZ28/bnVsbDpwKHBvLnN0eWxlLCJ1c2VyU2VsZWN0IiksT289MDtsby5tb3VzZT1mdW5jdGlvbihuKXtyZXR1cm4gWihuLHgoKSl9O3ZhciBZbz0vV2ViS2l0Ly50ZXN0KHZvLm5hdmlnYXRvci51c2VyQWdlbnQpPy0xOjA7bG8udG91Y2hlcz1mdW5jdGlvbihuLHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PXgoKS50b3VjaGVzKSx0P2hvKHQpLm1hcChmdW5jdGlvbih0KXt2YXIgZT1aKG4sdCk7cmV0dXJuIGUuaWRlbnRpZmllcj10LmlkZW50aWZpZXIsZX0pOltdfSxsby5iZWhhdmlvci5kcmFnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3RoaXMub24oIm1vdXNlZG93bi5kcmFnIix1KS5vbigidG91Y2hzdGFydC5kcmFnIixpKX1mdW5jdGlvbiB0KG4sdCx1LGksbyl7cmV0dXJuIGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe3ZhciBuLGUscj10KGgsdik7ciYmKG49clswXS14WzBdLGU9clsxXS14WzFdLHB8PW58ZSx4PXIsZyh7dHlwZToiZHJhZyIseDpyWzBdK2NbMF0seTpyWzFdK2NbMV0sZHg6bixkeTplfSkpfWZ1bmN0aW9uIHMoKXt0KGgsdikmJihtLm9uKGkrZCxudWxsKS5vbihvK2QsbnVsbCkseShwJiZsby5ldmVudC50YXJnZXQ9PT1mKSxnKHt0eXBlOiJkcmFnZW5kIn0pKX12YXIgYyxsPXRoaXMsZj1sby5ldmVudC50YXJnZXQsaD1sLnBhcmVudE5vZGUsZz1lLm9mKGwsYXJndW1lbnRzKSxwPTAsdj1uKCksZD0iLmRyYWciKyhudWxsPT12PyIiOiItIit2KSxtPWxvLnNlbGVjdCh1KCkpLm9uKGkrZCxhKS5vbihvK2QscykseT1JKCkseD10KGgsdik7cj8oYz1yLmFwcGx5KGwsYXJndW1lbnRzKSxjPVtjLngteFswXSxjLnkteFsxXV0pOmM9WzAsMF0sZyh7dHlwZToiZHJhZ3N0YXJ0In0pfX12YXIgZT1NKG4sImRyYWciLCJkcmFnc3RhcnQiLCJkcmFnZW5kIikscj1udWxsLHU9dCh2LGxvLm1vdXNlLCQsIm1vdXNlbW92ZSIsIm1vdXNldXAiKSxpPXQoVixsby50b3VjaCxYLCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIpO3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LGxvLnJlYmluZChuLGUsIm9uIil9O3ZhciBJbz1NYXRoLlBJLFpvPTIqSW8sVm89SW8vMixYbz0xZS02LCRvPVhvKlhvLEJvPUlvLzE4MCxXbz0xODAvSW8sSm89TWF0aC5TUVJUMixHbz0yLEtvPTQ7bG8uaW50ZXJwb2xhdGVab29tPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuKXt2YXIgdD1uKnk7aWYobSl7dmFyIGU9Syh2KSxvPWkvKEdvKmgpKihlKlEoSm8qdCt2KS1HKHYpKTtyZXR1cm5bcitvKmMsdStvKmwsaSplL0soSm8qdCt2KV19cmV0dXJuW3IrbipjLHUrbipsLGkqTWF0aC5leHAoSm8qdCldfXZhciByPW5bMF0sdT1uWzFdLGk9blsyXSxvPXRbMF0sYT10WzFdLHM9dFsyXSxjPW8tcixsPWEtdSxmPWMqYytsKmwsaD1NYXRoLnNxcnQoZiksZz0ocypzLWkqaStLbypmKS8oMippKkdvKmgpLHA9KHMqcy1pKmktS28qZikvKDIqcypHbypoKSx2PU1hdGgubG9nKE1hdGguc3FydChnKmcrMSktZyksZD1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApLG09ZC12LHk9KG18fE1hdGgubG9nKHMvaSkpL0pvO3JldHVybiBlLmR1cmF0aW9uPTFlMyp5LGV9LGxvLmJlaGF2aW9yLnpvb209ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe24ub24oQSxjKS5vbih0YSsiLnpvb20iLGYpLm9uKCJkYmxjbGljay56b29tIixoKS5vbih6LGwpfWZ1bmN0aW9uIHQobil7cmV0dXJuWyhuWzBdLWsueCkvay5rLChuWzFdLWsueSkvay5rXX1mdW5jdGlvbiBlKG4pe3JldHVybltuWzBdKmsuaytrLngsblsxXSprLmsray55XX1mdW5jdGlvbiByKG4pe2suaz1NYXRoLm1heChDWzBdLE1hdGgubWluKENbMV0sbikpfWZ1bmN0aW9uIHUobix0KXt0PWUodCksay54Kz1uWzBdLXRbMF0say55Kz1uWzFdLXRbMV19ZnVuY3Rpb24gaSgpe18mJl8uZG9tYWluKHgucmFuZ2UoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4tay54KS9rLmt9KS5tYXAoeC5pbnZlcnQpKSx3JiZ3LmRvbWFpbihiLnJhbmdlKCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLWsueSkvay5rfSkubWFwKGIuaW52ZXJ0KSl9ZnVuY3Rpb24gbyhuKXtuKHt0eXBlOiJ6b29tc3RhcnQifSl9ZnVuY3Rpb24gYShuKXtpKCksbih7dHlwZToiem9vbSIsc2NhbGU6ay5rLHRyYW5zbGF0ZTpbay54LGsueV19KX1mdW5jdGlvbiBzKG4pe24oe3R5cGU6Inpvb21lbmQifSl9ZnVuY3Rpb24gYygpe2Z1bmN0aW9uIG4oKXtsPTEsdShsby5tb3VzZShyKSxoKSxhKGMpfWZ1bmN0aW9uIGUoKXtmLm9uKE4sbnVsbCkub24oRSxudWxsKSxnKGwmJmxvLmV2ZW50LnRhcmdldD09PWkpLHMoYyl9dmFyIHI9dGhpcyxpPWxvLmV2ZW50LnRhcmdldCxjPVQub2Yocixhcmd1bWVudHMpLGw9MCxmPWxvLnNlbGVjdCh2bykub24oTixuKS5vbihFLGUpLGg9dChsby5tb3VzZShyKSksZz1JKCk7SC5jYWxsKHIpLG8oYyl9ZnVuY3Rpb24gbCgpe2Z1bmN0aW9uIG4oKXt2YXIgbj1sby50b3VjaGVzKGcpO3JldHVybiBoPWsuayxuLmZvckVhY2goZnVuY3Rpb24obil7bi5pZGVudGlmaWVyIGluIHYmJih2W24uaWRlbnRpZmllcl09dChuKSl9KSxufWZ1bmN0aW9uIGUoKXt2YXIgdD1sby5ldmVudC50YXJnZXQ7bG8uc2VsZWN0KHQpLm9uKE0saSkub24oXyxmKSxiLnB1c2godCk7Zm9yKHZhciBlPWxvLmV2ZW50LmNoYW5nZWRUb3VjaGVzLG89MCxzPWUubGVuZ3RoO3M+bzsrK28pdltlW29dLmlkZW50aWZpZXJdPW51bGw7dmFyIGM9bigpLGw9RGF0ZS5ub3coKTtpZigxPT09Yy5sZW5ndGgpe2lmKDUwMD5sLW0pe3ZhciBoPWNbMF0sZz12W2guaWRlbnRpZmllcl07cigyKmsuayksdShoLGcpLHkoKSxhKHApfW09bH1lbHNlIGlmKGMubGVuZ3RoPjEpe3ZhciBoPWNbMF0seD1jWzFdLHc9aFswXS14WzBdLFM9aFsxXS14WzFdO2Q9dyp3K1MqU319ZnVuY3Rpb24gaSgpe2Zvcih2YXIgbix0LGUsaSxvPWxvLnRvdWNoZXMoZykscz0wLGM9by5sZW5ndGg7Yz5zOysrcyxpPW51bGwpaWYoZT1vW3NdLGk9dltlLmlkZW50aWZpZXJdKXtpZih0KWJyZWFrO249ZSx0PWl9aWYoaSl7dmFyIGw9KGw9ZVswXS1uWzBdKSpsKyhsPWVbMV0tblsxXSkqbCxmPWQmJk1hdGguc3FydChsL2QpO249WyhuWzBdK2VbMF0pLzIsKG5bMV0rZVsxXSkvMl0sdD1bKHRbMF0raVswXSkvMiwodFsxXStpWzFdKS8yXSxyKGYqaCl9bT1udWxsLHUobix0KSxhKHApfWZ1bmN0aW9uIGYoKXtpZihsby5ldmVudC50b3VjaGVzLmxlbmd0aCl7Zm9yKHZhciB0PWxvLmV2ZW50LmNoYW5nZWRUb3VjaGVzLGU9MCxyPXQubGVuZ3RoO3I+ZTsrK2UpZGVsZXRlIHZbdFtlXS5pZGVudGlmaWVyXTtmb3IodmFyIHUgaW4gdilyZXR1cm4gdm9pZCBuKCl9bG8uc2VsZWN0QWxsKGIpLm9uKHgsbnVsbCksdy5vbihBLGMpLm9uKHosbCksUygpLHMocCl9dmFyIGgsZz10aGlzLHA9VC5vZihnLGFyZ3VtZW50cyksdj17fSxkPTAseD0iLnpvb20tIitsby5ldmVudC5jaGFuZ2VkVG91Y2hlc1swXS5pZGVudGlmaWVyLE09InRvdWNobW92ZSIreCxfPSJ0b3VjaGVuZCIreCxiPVtdLHc9bG8uc2VsZWN0KGcpLm9uKEEsbnVsbCkub24oeixlKSxTPUkoKTtILmNhbGwoZyksZSgpLG8ocCl9ZnVuY3Rpb24gZigpe3ZhciBuPVQub2YodGhpcyxhcmd1bWVudHMpO2Q/Y2xlYXJUaW1lb3V0KGQpOihnPXQocD12fHxsby5tb3VzZSh0aGlzKSksSC5jYWxsKHRoaXMpLG8obikpLGQ9c2V0VGltZW91dChmdW5jdGlvbigpe2Q9bnVsbCxzKG4pfSw1MCkseSgpLHIoTWF0aC5wb3coMiwuMDAyKlFvKCkpKmsuayksdShwLGcpLGEobil9ZnVuY3Rpb24gaCgpe3ZhciBuPVQub2YodGhpcyxhcmd1bWVudHMpLGU9bG8ubW91c2UodGhpcyksaT10KGUpLGM9TWF0aC5sb2coay5rKS9NYXRoLkxOMjtvKG4pLHIoTWF0aC5wb3coMixsby5ldmVudC5zaGlmdEtleT9NYXRoLmNlaWwoYyktMTpNYXRoLmZsb29yKGMpKzEpKSx1KGUsaSksYShuKSxzKG4pfXZhciBnLHAsdixkLG0seCxfLGIsdyxrPXt4OjAseTowLGs6MX0sUz1bOTYwLDUwMF0sQz1uYSxBPSJtb3VzZWRvd24uem9vbSIsTj0ibW91c2Vtb3ZlLnpvb20iLEU9Im1vdXNldXAuem9vbSIsej0idG91Y2hzdGFydC56b29tIixUPU0obiwiem9vbXN0YXJ0Iiwiem9vbSIsInpvb21lbmQiKTtyZXR1cm4gbi5ldmVudD1mdW5jdGlvbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1ULm9mKHRoaXMsYXJndW1lbnRzKSx0PWs7ZHM/bG8uc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC56b29tIixmdW5jdGlvbigpe2s9dGhpcy5fX2NoYXJ0X198fHt4OjAseTowLGs6MX0sbyhuKX0pLnR3ZWVuKCJ6b29tOnpvb20iLGZ1bmN0aW9uKCl7dmFyIGU9U1swXSxyPVNbMV0sdT1lLzIsaT1yLzIsbz1sby5pbnRlcnBvbGF0ZVpvb20oWyh1LWsueCkvay5rLChpLWsueSkvay5rLGUvay5rXSxbKHUtdC54KS90LmssKGktdC55KS90LmssZS90LmtdKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIHI9byh0KSxzPWUvclsyXTt0aGlzLl9fY2hhcnRfXz1rPXt4OnUtclswXSpzLHk6aS1yWzFdKnMsazpzfSxhKG4pfX0pLmVhY2goImVuZC56b29tIixmdW5jdGlvbigpe3Mobil9KToodGhpcy5fX2NoYXJ0X189ayxvKG4pLGEobikscyhuKSl9KX0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGs9e3g6K3RbMF0seTordFsxXSxrOmsua30saSgpLG4pOltrLngsay55XX0sbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDprLngseTprLnksazordH0saSgpLG4pOmsua30sbi5zY2FsZUV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQz1udWxsPT10P25hOlsrdFswXSwrdFsxXV0sbik6Q30sbi5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9dCYmWyt0WzBdLCt0WzFdXSxuKTp2fSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFM9dCYmWyt0WzBdLCt0WzFdXSxuKTpTfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KF89dCx4PXQuY29weSgpLGs9e3g6MCx5OjAsazoxfSxuKTpffSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHc9dCxiPXQuY29weSgpLGs9e3g6MCx5OjAsazoxfSxuKTp3fSxsby5yZWJpbmQobixULCJvbiIpfTt2YXIgUW8sbmE9WzAsMS8wXSx0YT0ib253aGVlbCJpbiBnbz8oUW89ZnVuY3Rpb24oKXtyZXR1cm4tbG8uZXZlbnQuZGVsdGFZKihsby5ldmVudC5kZWx0YU1vZGU/MTIwOjEpfSwid2hlZWwiKToib25tb3VzZXdoZWVsImluIGdvPyhRbz1mdW5jdGlvbigpe3JldHVybiBsby5ldmVudC53aGVlbERlbHRhfSwibW91c2V3aGVlbCIpOihRbz1mdW5jdGlvbigpe3JldHVybi1sby5ldmVudC5kZXRhaWx9LCJNb3pNb3VzZVBpeGVsU2Nyb2xsIik7bG8uY29sb3I9bnQsbnQucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9LGxvLmhzbD10dDt2YXIgZWE9dHQucHJvdG90eXBlPW5ldyBudDtlYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IHR0KHRoaXMuaCx0aGlzLnMsdGhpcy5sL24pfSxlYS5kYXJrZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyB0dCh0aGlzLmgsdGhpcy5zLG4qdGhpcy5sKX0sZWEucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGV0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKX0sbG8uaGNsPXJ0O3ZhciByYT1ydC5wcm90b3R5cGU9bmV3IG50O3JhLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgcnQodGhpcy5oLHRoaXMuYyxNYXRoLm1pbigxMDAsdGhpcy5sK3VhKihhcmd1bWVudHMubGVuZ3RoP246MSkpKX0scmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgcnQodGhpcy5oLHRoaXMuYyxNYXRoLm1heCgwLHRoaXMubC11YSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LHJhLnJnYj1mdW5jdGlvbigpe3JldHVybiB1dCh0aGlzLmgsdGhpcy5jLHRoaXMubCkucmdiKCl9LGxvLmxhYj1pdDt2YXIgdWE9MTgsaWE9Ljk1MDQ3LG9hPTEsYWE9MS4wODg4MyxzYT1pdC5wcm90b3R5cGU9bmV3IG50O3NhLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgaXQoTWF0aC5taW4oMTAwLHRoaXMubCt1YSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSx0aGlzLmEsdGhpcy5iKX0sc2EuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgaXQoTWF0aC5tYXgoMCx0aGlzLmwtdWEqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LHNhLnJnYj1mdW5jdGlvbigpe3JldHVybiBvdCh0aGlzLmwsdGhpcy5hLHRoaXMuYil9LGxvLnJnYj1mdDt2YXIgY2E9ZnQucHJvdG90eXBlPW5ldyBudDtjYS5icmlnaHRlcj1mdW5jdGlvbihuKXtuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKTt2YXIgdD10aGlzLnIsZT10aGlzLmcscj10aGlzLmIsdT0zMDtyZXR1cm4gdHx8ZXx8cj8odCYmdT50JiYodD11KSxlJiZ1PmUmJihlPXUpLHImJnU+ciYmKHI9dSksbmV3IGZ0KE1hdGgubWluKDI1NSx0L24pLE1hdGgubWluKDI1NSxlL24pLE1hdGgubWluKDI1NSxyL24pKSk6bmV3IGZ0KHUsdSx1KX0sY2EuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgZnQobip0aGlzLnIsbip0aGlzLmcsbip0aGlzLmIpfSxjYS5oc2w9ZnVuY3Rpb24oKXtyZXR1cm4gZHQodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxjYS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIjIitwdCh0aGlzLnIpK3B0KHRoaXMuZykrcHQodGhpcy5iKX07dmFyIGxhPWxvLm1hcCh7YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9KTtsYS5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7bGEuc2V0KG4saHQodCkpfSksbG8uZnVuY3Rvcj1NdCxsby54aHI9YnQoX3QpLGxvLmRzdj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlLGkpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGk9ZSxlPW51bGwpO3ZhciBvPXd0KG4sdCxudWxsPT1lP3I6dShlKSxpKTtyZXR1cm4gby5yb3c9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/by5yZXNwb25zZShudWxsPT0oZT1uKT9yOnUobikpOmV9LG99ZnVuY3Rpb24gcihuKXtyZXR1cm4gZS5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gdShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUucGFyc2UodC5yZXNwb25zZVRleHQsbil9fWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQubWFwKG8pLmpvaW4obil9ZnVuY3Rpb24gbyhuKXtyZXR1cm4gYS50ZXN0KG4pPyciJytuLnJlcGxhY2UoL1wiL2csJyIiJykrJyInOm59dmFyIGE9bmV3IFJlZ0V4cCgnWyInK24rIlxuXSIpLHM9bi5jaGFyQ29kZUF0KDApO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4sdCl7dmFyIHI7cmV0dXJuIGUucGFyc2VSb3dzKG4sZnVuY3Rpb24obixlKXtpZihyKXJldHVybiByKG4sZS0xKTt2YXIgdT1uZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobikrIjogZFsiK3QrIl0ifSkuam9pbigiLCIpKyJ9Iik7cj10P2Z1bmN0aW9uKG4sZSl7cmV0dXJuIHQodShuKSxlKX06dX0pfSxlLnBhcnNlUm93cz1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXtpZihsPj1jKXJldHVybiBvO2lmKHUpcmV0dXJuIHU9ITEsaTt2YXIgdD1sO2lmKDM0PT09bi5jaGFyQ29kZUF0KHQpKXtmb3IodmFyIGU9dDtlKys8YzspaWYoMzQ9PT1uLmNoYXJDb2RlQXQoZSkpe2lmKDM0IT09bi5jaGFyQ29kZUF0KGUrMSkpYnJlYWs7KytlfWw9ZSsyO3ZhciByPW4uY2hhckNvZGVBdChlKzEpO3JldHVybiAxMz09PXI/KHU9ITAsMTA9PT1uLmNoYXJDb2RlQXQoZSsyKSYmKytsKToxMD09PXImJih1PSEwKSxuLnN1YnN0cmluZyh0KzEsZSkucmVwbGFjZSgvIiIvZywnIicpfWZvcig7Yz5sOyl7dmFyIHI9bi5jaGFyQ29kZUF0KGwrKyksYT0xO2lmKDEwPT09cil1PSEwO2Vsc2UgaWYoMTM9PT1yKXU9ITAsMTA9PT1uLmNoYXJDb2RlQXQobCkmJigrK2wsKythKTtlbHNlIGlmKHIhPT1zKWNvbnRpbnVlO3JldHVybiBuLnN1YnN0cmluZyh0LGwtYSl9cmV0dXJuIG4uc3Vic3RyaW5nKHQpfWZvcih2YXIgcix1LGk9e30sbz17fSxhPVtdLGM9bi5sZW5ndGgsbD0wLGY9MDsocj1lKCkpIT09bzspe2Zvcih2YXIgaD1bXTtyIT09aSYmciE9PW87KWgucHVzaChyKSxyPWUoKTsoIXR8fChoPXQoaCxmKyspKSkmJmEucHVzaChoKX1yZXR1cm4gYX0sZS5mb3JtYXQ9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0WzBdKSlyZXR1cm4gZS5mb3JtYXRSb3dzKHQpO3ZhciByPW5ldyBoLHU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gbilyLmhhcyh0KXx8dS5wdXNoKHIuYWRkKHQpKX0pLFt1Lm1hcChvKS5qb2luKG4pXS5jb25jYXQodC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHUubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBvKHRbbl0pfSkuam9pbihuKX0pKS5qb2luKCJcbiIpfSxlLmZvcm1hdFJvd3M9ZnVuY3Rpb24obil7cmV0dXJuIG4ubWFwKGkpLmpvaW4oIlxuIil9LGV9LGxvLmNzdj1sby5kc3YoIiwiLCJ0ZXh0L2NzdiIpLGxvLnRzdj1sby5kc3YoIgkiLCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIiksbG8udG91Y2g9ZnVuY3Rpb24obix0LGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg8MyYmKGU9dCx0PXgoKS5jaGFuZ2VkVG91Y2hlcyksdClmb3IodmFyIHIsdT0wLGk9dC5sZW5ndGg7aT51OysrdSlpZigocj10W3VdKS5pZGVudGlmaWVyPT09ZSlyZXR1cm4gWihuLHIpfTt2YXIgZmEsaGEsZ2EscGEsdmEsZGE9dm9bcCh2bywicmVxdWVzdEFuaW1hdGlvbkZyYW1lIildfHxmdW5jdGlvbihuKXtzZXRUaW1lb3V0KG4sMTcpfTtsby50aW1lcj1mdW5jdGlvbihuLHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDsyPnImJih0PTApLDM+ciYmKGU9RGF0ZS5ub3coKSk7dmFyIHU9ZSt0LGk9e2M6bix0OnUsZjohMSxuOm51bGx9O2hhP2hhLm49aTpmYT1pLGhhPWksZ2F8fChwYT1jbGVhclRpbWVvdXQocGEpLGdhPTEsZGEoU3QpKX0sbG8udGltZXIuZmx1c2g9ZnVuY3Rpb24oKXtDdCgpLEF0KCl9LGxvLnJvdW5kPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQ/TWF0aC5yb3VuZChuKih0PU1hdGgucG93KDEwLHQpKSkvdDpNYXRoLnJvdW5kKG4pfTt2YXIgbWE9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCJceGI1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl0ubWFwKEV0KTtsby5mb3JtYXRQcmVmaXg9ZnVuY3Rpb24obix0KXt2YXIgZT0wO3JldHVybiBuJiYoMD5uJiYobio9LTEpLHQmJihuPWxvLnJvdW5kKG4sTnQobix0KSkpLGU9MStNYXRoLmZsb29yKDFlLTEyK01hdGgubG9nKG4pL01hdGguTE4xMCksZT1NYXRoLm1heCgtMjQsTWF0aC5taW4oMjQsMypNYXRoLmZsb29yKChlLTEpLzMpKSkpLG1hWzgrZS8zXX07dmFyIHlhPS8oPzooW157XSk/KFs8Pj1eXSkpPyhbK1wtIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLi0/XGQrKT8oW2EteiVdKT8vaSx4YT1sby5tYXAoe2I6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24obil7cmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUobil9LG86ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoOCl9LHg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpfSxYOmZ1bmN0aW9uKG4pe3JldHVybiBuLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSxnOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4udG9QcmVjaXNpb24odCl9LGU6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0V4cG9uZW50aWFsKHQpfSxmOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4udG9GaXhlZCh0KX0scjpmdW5jdGlvbihuLHQpe3JldHVybihuPWxvLnJvdW5kKG4sTnQobix0KSkpLnRvRml4ZWQoTWF0aC5tYXgoMCxNYXRoLm1pbigyMCxOdChuKigxKzFlLTE1KSx0KSkpKX19KSxNYT1sby50aW1lPXt9LF9hPURhdGU7THQucHJvdG90eXBlPXtnZXREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXRlKCl9LGdldERheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDRGF5KCl9LGdldEZ1bGxZZWFyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENGdWxsWWVhcigpfSxnZXRIb3VyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDSG91cnMoKX0sZ2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaWxsaXNlY29uZHMoKX0sZ2V0TWludXRlczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTWludXRlcygpfSxnZXRNb250aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDTW9udGgoKX0sZ2V0U2Vjb25kczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8uZ2V0VVRDU2Vjb25kcygpfSxnZXRUaW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRUaW1lKCl9LGdldFRpbWV6b25lT2Zmc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLnZhbHVlT2YoKX0sc2V0RGF0ZTpmdW5jdGlvbigpe2JhLnNldFVUQ0RhdGUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldERheTpmdW5jdGlvbigpe2JhLnNldFVUQ0RheS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtiYS5zZXRVVENGdWxsWWVhci5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0SG91cnM6ZnVuY3Rpb24oKXtiYS5zZXRVVENIb3Vycy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TWlsbGlzZWNvbmRzOmZ1bmN0aW9uKCl7YmEuc2V0VVRDTWlsbGlzZWNvbmRzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaW51dGVzOmZ1bmN0aW9uKCl7YmEuc2V0VVRDTWludXRlcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0TW9udGg6ZnVuY3Rpb24oKXtiYS5zZXRVVENNb250aC5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0U2Vjb25kczpmdW5jdGlvbigpe2JhLnNldFVUQ1NlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldFRpbWU6ZnVuY3Rpb24oKXtiYS5zZXRUaW1lLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfX07dmFyIGJhPURhdGUucHJvdG90eXBlO01hLnllYXI9cXQoZnVuY3Rpb24obil7cmV0dXJuIG49TWEuZGF5KG4pLG4uc2V0TW9udGgoMCwxKSxufSxmdW5jdGlvbihuLHQpe24uc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpK3QpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRGdWxsWWVhcigpfSksTWEueWVhcnM9TWEueWVhci5yYW5nZSxNYS55ZWFycy51dGM9TWEueWVhci51dGMucmFuZ2UsTWEuZGF5PXF0KGZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBfYSgyZTMsMCk7cmV0dXJuIHQuc2V0RnVsbFllYXIobi5nZXRGdWxsWWVhcigpLG4uZ2V0TW9udGgoKSxuLmdldERhdGUoKSksdH0sZnVuY3Rpb24obix0KXtuLnNldERhdGUobi5nZXREYXRlKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERhdGUoKS0xfSksTWEuZGF5cz1NYS5kYXkucmFuZ2UsTWEuZGF5cy51dGM9TWEuZGF5LnV0Yy5yYW5nZSxNYS5kYXlPZlllYXI9ZnVuY3Rpb24obil7dmFyIHQ9TWEueWVhcihuKTtyZXR1cm4gTWF0aC5mbG9vcigobi10LTZlNCoobi5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkpLzg2NGU1KX0sWyJzdW5kYXkiLCJtb25kYXkiLCJ0dWVzZGF5Iiwid2VkbmVzZGF5IiwidGh1cnNkYXkiLCJmcmlkYXkiLCJzYXR1cmRheSJdLmZvckVhY2goZnVuY3Rpb24obix0KXt0PTctdDt2YXIgZT1NYVtuXT1xdChmdW5jdGlvbihuKXtyZXR1cm4obj1NYS5kYXkobikpLnNldERhdGUobi5nZXREYXRlKCktKG4uZ2V0RGF5KCkrdCklNyksbn0sZnVuY3Rpb24obix0KXtuLnNldERhdGUobi5nZXREYXRlKCkrNypNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7dmFyIGU9TWEueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoTWEuZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpLShlIT09dCl9KTtNYVtuKyJzIl09ZS5yYW5nZSxNYVtuKyJzIl0udXRjPWUudXRjLnJhbmdlLE1hW24rIk9mWWVhciJdPWZ1bmN0aW9uKG4pe3ZhciBlPU1hLnllYXIobikuZ2V0RGF5KCk7cmV0dXJuIE1hdGguZmxvb3IoKE1hLmRheU9mWWVhcihuKSsoZSt0KSU3KS83KX19KSxNYS53ZWVrPU1hLnN1bmRheSxNYS53ZWVrcz1NYS5zdW5kYXkucmFuZ2UsTWEud2Vla3MudXRjPU1hLnN1bmRheS51dGMucmFuZ2UsTWEud2Vla09mWWVhcj1NYS5zdW5kYXlPZlllYXI7dmFyIHdhPXsiLSI6IiIsXzoiICIsMDoiMCJ9LGthPS9eXHMqXGQrLyxTYT0vXiUvO2xvLmxvY2FsZT1mdW5jdGlvbihuKXtyZXR1cm57bnVtYmVyRm9ybWF0Onp0KG4pLHRpbWVGb3JtYXQ6UnQobil9fTt2YXIgQ2E9bG8ubG9jYWxlKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXSxkYXRlVGltZToiJWEgJWIgJWUgJVggJVkiLGRhdGU6IiVtLyVkLyVZIix0aW1lOiIlSDolTTolUyIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTtsby5mb3JtYXQ9Q2EubnVtYmVyRm9ybWF0LGxvLmdlbz17fSxsby5nZW8uanNvblNvdXJjZT1mdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24odCl7KHQmJkFhLmhhc093blByb3BlcnR5KHQudHlwZSk/QWFbdC50eXBlXTplZSkodCxuKX19O3ZhciBBYT17RmVhdHVyZTpmdW5jdGlvbihuLHQpe2VlKG4uZ2VvbWV0cnksdCl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uZmVhdHVyZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OyllZShlW3JdLmdlb21ldHJ5LHQpfX0sTmE9e1NwaGVyZTpmdW5jdGlvbihuLHQpe3Quc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKG4sdCl7bj1uLmNvb3JkaW5hdGVzLHQucG9pbnQoblswXSpCbyxuWzFdKkJvKX0sTXVsdGlQb2ludDpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmNvb3JkaW5hdGVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspbj1lW3JdLHQucG9pbnQoblswXSpCbyxuWzFdKkJvKX0sTGluZVN0cmluZzpmdW5jdGlvbihuLHQpe3JlKG4uY29vcmRpbmF0ZXMsdCwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylyZShlW3JdLHQsMCl9LFBvbHlnb246ZnVuY3Rpb24obix0KXt1ZShuLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KXVlKGVbcl0sdCl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmdlb21ldHJpZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OyllZShlW3JdLHQpfX07bG8uZ2VvLmpzb25TaW5rPWZ1bmN0aW9uKCl7dmFyIG4sdCxlPXt0eXBlOiJNdWx0aVBvbHlnb24iLGNvb3JkaW5hdGVzOltdfTtyZXR1cm57cG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7ZS5jb29yZGluYXRlcy5wdXNoKG49W10pfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7fSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLnB1c2godD1bXSl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LnB1c2godFswXSl9LHBvaW50OmZ1bmN0aW9uKG4sZSl7dC5wdXNoKFtuKldvLGUqV29dKX0sdmFsdWU6ZnVuY3Rpb24oKXt2YXIgbj1lO3JldHVybiBlPXt0eXBlOiJNdWx0aVBvbHlnb24iLGNvb3JkaW5hdGVzOltdfSxufX19LGxvLmdlby5yb3RhdGU9ZnVuY3Rpb24obix0LGUscil7cmV0dXJuIG49K24sdD0rdCxlPStlLGllKHIsbj90P2U/c2Uobix0LGUscik6YWUobix0LHIpOmU/Y2UobixlLHIpOm9lKG4scik6dD9lP2ZlKHQsZSxyKTpsZSh0LHIpOmU/aGUoZSxyKTpmdW5jdGlvbihuLHQpe3IucG9pbnQobix0KX0pfTt2YXIgRWE9TWF0aC5jb3MoMzAqQm8pLHphPTE2O2xvLmdlby5wcm9qZWN0PWZ1bmN0aW9uKG4sdCxlKXtmdW5jdGlvbiByKHQscil7dD1uKHQsciksZS5wb2ludCh0WzBdLHRbMV0pfWZ1bmN0aW9uIHUoKXtfPTAvMCxBLnBvaW50PWksZS5saW5lU3RhcnQoKX1mdW5jdGlvbiBpKHQscil7dmFyIHU9Z2UoW3Qscl0pLGk9bih0LHIpO2goXyxiLE0sdyxrLFMsXz1pWzBdLGI9aVsxXSxNPXQsdz11WzBdLGs9dVsxXSxTPXVbMl0semEsZSksZS5wb2ludChfLGIpfWZ1bmN0aW9uIG8oKXtBLnBvaW50PXIsZS5saW5lRW5kKCl9ZnVuY3Rpb24gYSgpe3UoKSxBLnBvaW50PXMsQS5saW5lRW5kPWN9ZnVuY3Rpb24gcyhuLHQpe2koZz1uLHA9dCksdj1fLGQ9YixtPXcseT1rLHg9UyxBLnBvaW50PWl9ZnVuY3Rpb24gYygpe2goXyxiLE0sdyxrLFMsdixkLGcsbSx5LHgsemEsZSksQS5saW5lRW5kPW8sbygpfWZ1bmN0aW9uIGwoKXtlLnBvbHlnb25TdGFydCgpLEEubGluZVN0YXJ0PWF9ZnVuY3Rpb24gZigpe2UucG9seWdvbkVuZCgpLEEubGluZVN0YXJ0PXV9ZnVuY3Rpb24gaCh0LHIsdSxpLG8sYSxzLGMsbCxmLGcscCx2KXt2YXIgZD1zLXQsbT1jLXIseT1kKmQrbSptO2lmKHk+NCpDJiZ2LS0pe3ZhciB4PWkrZixNPW8rZyxfPWErcCxiPU1hdGguc3FydCh4KngrTSpNK18qXyksdz1NYXRoLmFzaW4oXy89Yiksaz1TbyhTbyhfKS0xKTxYb3x8U28odS1sKTxYbz8odStsKS8yOk1hdGguYXRhbjIoTSx4KSxTPW4oayx3KSxBPVNbMF0sTj1TWzFdLEU9QS10LHo9Ti1yLFQ9bSpFLWQqejsoVCpUL3k+Q3x8U28oKGQqRSttKnopL3ktLjUpPi4zfHxFYT5pKmYrbypnK2EqcCkmJihoKHQscix1LGksbyxhLEEsTixrLHgvPWIsTS89YixfLHYpLGUucG9pbnQoQSxOKSxoKEEsTixrLHgsTSxfLHMsYyxsLGYsZyxwLHYpKX19aWYoYXJndW1lbnRzLmxlbmd0aDwzJiYoZT10LHQ9MCksISgrdD4wKSlyZXR1cm4gaWUoZSxmdW5jdGlvbih0LHIpe3Q9bih0LHIpLGUucG9pbnQodFswXSx0WzFdKX0pO3ZhciBnLHAsdixkLG0seSx4LE0sXyxiLHcsayxTLEM9dCp0LEE9e3BvaW50OnIsbGluZVN0YXJ0OnUsbGluZUVuZDpvLHBvbHlnb25TdGFydDpsLHBvbHlnb25FbmQ6Zn07cmV0dXJuIEF9LEVlLnByb3RvdHlwZT17czowLHQ6MCxhZGQ6ZnVuY3Rpb24obil7emUobix0aGlzLnQsVGEpLHplKFRhLnMsdGhpcy5zLHRoaXMpLHRoaXMucz90aGlzLnQrPVRhLnQ6dGhpcy5zPVRhLnR9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zPXRoaXMudD0wfSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciBUYT1uZXcgRWUsTGE9bmV3IEVlO2xvLmdlby5jbGlwQW50aW1lcmlkaWFuPWZ1bmN0aW9uKG4pe3JldHVybiBDZSh4ZSxMZSxEZSxbLUlvLC1Jby8yXSxuKX0sbG8uZ2VvLmNsaXBDaXJjbGU9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sdCl7cmV0dXJuIE1hdGguY29zKG4pKk1hdGguY29zKHQpPm99ZnVuY3Rpb24gcihuKXt2YXIgdCxyLG8sYyxsO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtjPW89ITEsbD0xfSxwb2ludDpmdW5jdGlvbihmLGgpe3ZhciBnLHA9W2YsaF0sdj1lKGYsaCksZD1hP3Y/MDppKGYsaCk6dj9pKGYrKDA+Zj9JbzotSW8pLGgpOjA7aWYoIXQmJihjPW89dikmJm4ubGluZVN0YXJ0KCksdiE9PW8mJihnPXUodCxwKSwoX2UodCxnKXx8X2UocCxnKSkmJihwWzBdKz1YbyxwWzFdKz1Ybyx2PWUocFswXSxwWzFdKSkpLHYhPT1vKWw9MCx2PyhuLmxpbmVTdGFydCgpLGc9dShwLHQpLG4ucG9pbnQoZ1swXSxnWzFdKSk6KGc9dSh0LHApLG4ucG9pbnQoZ1swXSxnWzFdKSxuLmxpbmVFbmQoKSksdD1nO2Vsc2UgaWYocyYmdCYmYV52KXt2YXIgbTtkJnJ8fCEobT11KHAsdCwhMCkpfHwobD0wLGE/KG4ubGluZVN0YXJ0KCksbi5wb2ludChtWzBdWzBdLG1bMF1bMV0pLG4ucG9pbnQobVsxXVswXSxtWzFdWzFdKSxuLmxpbmVFbmQoKSk6KG4ucG9pbnQobVsxXVswXSxtWzFdWzFdKSxuLmxpbmVFbmQoKSxuLmxpbmVTdGFydCgpLG4ucG9pbnQobVswXVswXSxtWzBdWzFdKSkpfSF2fHx0JiZfZSh0LHApfHxuLnBvaW50KHBbMF0scFsxXSksdD1wLG89dixyPWR9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtvJiZuLmxpbmVFbmQoKSx0PW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIGx8KGMmJm8pPDwxfX19ZnVuY3Rpb24gdShuLHQsZSl7dmFyIHI9Z2UobiksdT1nZSh0KSxpPVsxLDAsMF0sYT12ZShyLHUpLHM9cGUoYSxhKSxjPWFbMF0sbD1zLWMqYztpZighbClyZXR1cm4hZSYmbjt2YXIgZj1vKnMvbCxoPS1vKmMvbCxnPXZlKGksYSkscD1tZShpLGYpLHY9bWUoYSxoKTtkZShwLHYpO3ZhciBkPWcsbT1wZShwLGQpLHk9cGUoZCxkKSx4PW0qbS15KihwZShwLHApLTEpO2lmKCEoMD54KSl7dmFyIE09TWF0aC5zcXJ0KHgpLF89bWUoZCwoLW0tTSkveSk7aWYoZGUoXyxwKSxfPU1lKF8pLCFlKXJldHVybiBfO3ZhciBiLHc9blswXSxrPXRbMF0sUz1uWzFdLEM9dFsxXTt3PmsmJihiPXcsdz1rLGs9Yik7dmFyIEE9ay13LE49U28oQS1Jbyk8WG8sRT1OfHxYbz5BO2lmKCFOJiZTPkMmJihiPVMsUz1DLEM9YiksRT9OP1MrQz4wXl9bMV08KFNvKF9bMF0tdyk8WG8/UzpDKTpTPD1fWzFdJiZfWzFdPD1DOkE+SW9eKHc8PV9bMF0mJl9bMF08PWspKXt2YXIgej1tZShkLCgtbStNKS95KTtyZXR1cm4gZGUoeixwKSxbXyxNZSh6KV19fX1mdW5jdGlvbiBpKHQsZSl7dmFyIHI9YT9uOklvLW4sdT0wO3JldHVybi1yPnQ/dXw9MTp0PnImJih1fD0yKSwtcj5lP3V8PTQ6ZT5yJiYodXw9OCksdX12YXIgbz1NYXRoLmNvcyhuKSxhPW8+MCxzPVNvKG8pPlhvLGM9UmUobiw2KkJvKTtyZXR1cm4gQ2UoZSxyLGMsYT9bMCwtbl06Wy1JbyxuLUlvXSx0KX0sbG8uZ2VvLmdyYXRpY3VsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczp0KCl9fWZ1bmN0aW9uIHQoKXtyZXR1cm4gbG8ucmFuZ2UoTWF0aC5jZWlsKGkvZCkqZCx1LGQpLm1hcChoKS5jb25jYXQobG8ucmFuZ2UoTWF0aC5jZWlsKGMvbSkqbSxzLG0pLm1hcChnKSkuY29uY2F0KGxvLnJhbmdlKE1hdGguY2VpbChyL3ApKnAsZSxwKS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIFNvKG4lZCk+WG99KS5tYXAobCkpLmNvbmNhdChsby5yYW5nZShNYXRoLmNlaWwoYS92KSp2LG8sdikuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBTbyhuJW0pPlhvfSkubWFwKGYpKX12YXIgZSxyLHUsaSxvLGEscyxjLGwsZixoLGcscD0xMCx2PXAsZD05MCxtPTM2MCx5PTIuNTtyZXR1cm4gbi5saW5lcz1mdW5jdGlvbigpe3JldHVybiB0KCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpufX0pfSxuLm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W2goaSkuY29uY2F0KGcocykuc2xpY2UoMSksaCh1KS5yZXZlcnNlKCkuc2xpY2UoMSksZyhjKS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LG4uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24ubWFqb3JFeHRlbnQodCkubWlub3JFeHRlbnQodCk6bi5taW5vckV4dGVudCgpfSxuLm1ham9yRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0WzBdWzBdLHU9K3RbMV1bMF0sYz0rdFswXVsxXSxzPSt0WzFdWzFdLGk+dSYmKHQ9aSxpPXUsdT10KSxjPnMmJih0PWMsYz1zLHM9dCksbi5wcmVjaXNpb24oeSkpOltbaSxjXSxbdSxzXV19LG4ubWlub3JFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3RbMF1bMF0sZT0rdFsxXVswXSxhPSt0WzBdWzFdLG89K3RbMV1bMV0scj5lJiYodD1yLHI9ZSxlPXQpLGE+byYmKHQ9YSxhPW8sbz10KSxuLnByZWNpc2lvbih5KSk6W1tyLGFdLFtlLG9dXX0sbi5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24ubWFqb3JTdGVwKHQpLm1pbm9yU3RlcCh0KTpuLm1pbm9yU3RlcCgpfSxuLm1ham9yU3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0rdFswXSxtPSt0WzFdLG4pOltkLG1dfSxuLm1pbm9yU3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSx2PSt0WzFdLG4pOltwLHZdfSxuLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0rdCxsPVVlKGEsbyw5MCksZj1qZShyLGUseSksaD1VZShjLHMsOTApLGc9amUoaSx1LHkpLG4pOnl9LG4ubWFqb3JFeHRlbnQoW1stMTgwLC05MCtYb10sWzE4MCw5MC1Yb11dKS5taW5vckV4dGVudChbWy0xODAsLTgwLVhvXSxbMTgwLDgwK1hvXV0pfSxsby5nZW8ucGlwZWxpbmU9ZnVuY3Rpb24oKXt2YXIgbj1bXTtyZXR1cm57c291cmNlOmZ1bmN0aW9uKCl7cmV0dXJuIG5bMF09YXJndW1lbnRzLHRoaXN9LHBpcGU6ZnVuY3Rpb24oKXtyZXR1cm4gbi5wdXNoKGFyZ3VtZW50cyksdGhpc30sc2luazpmdW5jdGlvbigpe2Zvcih2YXIgdCxlPWFyZ3VtZW50c1swXS5hcHBseShudWxsLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKSxyPWU7dD1uLnBvcCgpOyl7dmFyIHU9W10uc2xpY2UuY2FsbCh0LDEpO3UucHVzaChlKSxlPXRbMF0uYXBwbHkobnVsbCx1KX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksci52YWx1ZSYmci52YWx1ZSgpfX19fSxsby5nZW8uZXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuW24sdF19LGxvLmdlby5vcnRob2dyYXBoaWM9SGUoZnVuY3Rpb24oKXtyZXR1cm4gMX0sTWF0aC5hc2luKSxsby5nZW8ubWVyY2F0b3I9ZnVuY3Rpb24obix0KXtyZXR1cm5bbixNYXRoLmxvZyhNYXRoLnRhbihJby80K3QvMikpXX0sbG8uZ2VvLnNhdGVsbGl0ZT1mdW5jdGlvbihuLHQpe3ZhciBlPUZlKG4pO2lmKCErdClyZXR1cm4gZTt2YXIgcj1NYXRoLmNvcyh0KSx1PU1hdGguc2luKHQpO3JldHVybiBmdW5jdGlvbih0LGkpe3ZhciBvPWUodCxpKSxhPW9bMF0scz1vWzFdLGM9cyp1LyhuLTEpK3I7cmV0dXJuW2Eqci9jLHMvY119fSxsby5nZW9tPXt9LGxvLmdlb20uaHVsbD1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KG4pe2lmKG4ubGVuZ3RoPDMpcmV0dXJuW107dmFyIHQsdT1NdChlKSxpPU10KHIpLG89bi5sZW5ndGgsYT1bXSxzPVtdO2Zvcih0PTA7bz50O3QrKylhLnB1c2goWyt1LmNhbGwodGhpcyxuW3RdLHQpLCtpLmNhbGwodGhpcyxuW3RdLHQpLHRdKTtmb3IoYS5zb3J0KFplKSx0PTA7bz50O3QrKylzLnB1c2goW2FbdF1bMF0sLWFbdF1bMV1dKTt2YXIgYz1JZShhKSxsPUllKHMpLGY9bFswXT09PWNbMF0saD1sW2wubGVuZ3RoLTFdPT09Y1tjLmxlbmd0aC0xXSxnPVtdO2Zvcih0PWMubGVuZ3RoLTE7dD49MDstLXQpZy5wdXNoKG5bYVtjW3RdXVsyXV0pO2Zvcih0PStmO3Q8bC5sZW5ndGgtaDsrK3QpZy5wdXNoKG5bYVtsW3RdXVsyXV0pO3JldHVybiBnfXZhciBlPU9lLHI9WWU7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dChuKToodC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdCl9LGxvLmdlb20ucG9seWdvbj1mdW5jdGlvbihuKXtyZXR1cm4gem8obixxYSksbn07dmFyIHFhPWxvLmdlb20ucG9seWdvbi5wcm90b3R5cGU9W107cWEuYXJlYT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PS0xLGU9dGhpcy5sZW5ndGgscj10aGlzW2UtMV0sdT0wOysrdDxlOyluPXIscj10aGlzW3RdLHUrPW5bMV0qclswXS1uWzBdKnJbMV07cmV0dXJuLjUqdX0scWEuY2VudHJvaWQ9ZnVuY3Rpb24obil7dmFyIHQsZSxyPS0xLHU9dGhpcy5sZW5ndGgsaT0wLG89MCxhPXRoaXNbdS0xXTtmb3IoYXJndW1lbnRzLmxlbmd0aHx8KG49LTEvKDYqdGhpcy5hcmVhKCkpKTsrK3I8dTspdD1hLGE9dGhpc1tyXSxlPXRbMF0qYVsxXS1hWzBdKnRbMV0saSs9KHRbMF0rYVswXSkqZSxvKz0odFsxXSthWzFdKSplO3JldHVybltpKm4sbypuXX0scWEuY2xpcD1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHUsaSxvLGE9JGUobikscz0tMSxjPXRoaXMubGVuZ3RoLSRlKHRoaXMpLGw9dGhpc1tjLTFdOysrczxjOyl7Zm9yKHQ9bi5zbGljZSgpLG4ubGVuZ3RoPTAsdT10aGlzW3NdLGk9dFsocj10Lmxlbmd0aC1hKS0xXSxlPS0xOysrZTxyOylvPXRbZV0sVmUobyxsLHUpPyhWZShpLGwsdSl8fG4ucHVzaChYZShpLG8sbCx1KSksbi5wdXNoKG8pKTpWZShpLGwsdSkmJm4ucHVzaChYZShpLG8sbCx1KSksaT1vO2EmJm4ucHVzaChuWzBdKSxsPXV9cmV0dXJuIG59O3ZhciBEYSxSYSxQYSxVYSxqYSxIYT1bXSxGYT1bXTt0ci5wcm90b3R5cGUucHJlcGFyZT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PXRoaXMuZWRnZXMsZT10Lmxlbmd0aDtlLS07KW49dFtlXS5lZGdlLG4uYiYmbi5hfHx0LnNwbGljZShlLDEpO3JldHVybiB0LnNvcnQocnIpLHQubGVuZ3RofSxwci5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZS5sPT09dGhpcy5zaXRlP3RoaXMuZWRnZS5hOnRoaXMuZWRnZS5ifSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmI6dGhpcy5lZGdlLmF9fSx2ci5wcm90b3R5cGU9e2luc2VydDpmdW5jdGlvbihuLHQpe3ZhciBlLHIsdTtpZihuKXtpZih0LlA9bix0Lk49bi5OLG4uTiYmKG4uTi5QPXQpLG4uTj10LG4uUil7Zm9yKG49bi5SO24uTDspbj1uLkw7bi5MPXR9ZWxzZSBuLlI9dDtlPW59ZWxzZSB0aGlzLl8/KG49eHIodGhpcy5fKSx0LlA9bnVsbCx0Lk49bixuLlA9bi5MPXQsZT1uKToodC5QPXQuTj1udWxsLHRoaXMuXz10LGU9bnVsbCk7Zm9yKHQuTD10LlI9bnVsbCx0LlU9ZSx0LkM9ITAsbj10O2UmJmUuQzspcj1lLlUsZT09PXIuTD8odT1yLlIsdSYmdS5DPyhlLkM9dS5DPSExLHIuQz0hMCxuPXIpOihuPT09ZS5SJiYobXIodGhpcyxlKSxuPWUsZT1uLlUpLGUuQz0hMSxyLkM9ITAseXIodGhpcyxyKSkpOih1PXIuTCx1JiZ1LkM/KGUuQz11LkM9ITEsci5DPSEwLG49cik6KG49PT1lLkwmJih5cih0aGlzLGUpLG49ZSxlPW4uVSksZS5DPSExLHIuQz0hMCxtcih0aGlzLHIpKSksZT1uLlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbihuKXtuLk4mJihuLk4uUD1uLlApLG4uUCYmKG4uUC5OPW4uTiksbi5OPW4uUD1udWxsO3ZhciB0LGUscix1PW4uVSxpPW4uTCxvPW4uUjtpZihlPWk/bz94cihvKTppOm8sdT91Lkw9PT1uP3UuTD1lOnUuUj1lOnRoaXMuXz1lLGkmJm8/KHI9ZS5DLGUuQz1uLkMsZS5MPWksaS5VPWUsZSE9PW8/KHU9ZS5VLGUuVT1uLlUsbj1lLlIsdS5MPW4sZS5SPW8sby5VPWUpOihlLlU9dSx1PWUsbj1lLlIpKToocj1uLkMsbj1lKSxuJiYobi5VPXUpLCFyKXtpZihuJiZuLkMpcmV0dXJuIG4uQz0hMSx2b2lkIDA7ZG97aWYobj09PXRoaXMuXylicmVhaztpZihuPT09dS5MKXtpZih0PXUuUix0LkMmJih0LkM9ITEsdS5DPSEwLG1yKHRoaXMsdSksdD11LlIpLHQuTCYmdC5MLkN8fHQuUiYmdC5SLkMpe3QuUiYmdC5SLkN8fCh0LkwuQz0hMSx0LkM9ITAseXIodGhpcyx0KSx0PXUuUiksdC5DPXUuQyx1LkM9dC5SLkM9ITEsbXIodGhpcyx1KSxuPXRoaXMuXzticmVha319ZWxzZSBpZih0PXUuTCx0LkMmJih0LkM9ITEsdS5DPSEwLHlyKHRoaXMsdSksdD11LkwpLHQuTCYmdC5MLkN8fHQuUiYmdC5SLkMpe3QuTCYmdC5MLkN8fCh0LlIuQz0hMSx0LkM9ITAsbXIodGhpcyx0KSx0PXUuTCksdC5DPXUuQyx1LkM9dC5MLkM9ITEseXIodGhpcyx1KSxuPXRoaXMuXzticmVha310LkM9ITAsbj11LHU9dS5VfXdoaWxlKCFuLkMpO24mJihuLkM9ITEpfX19LGxvLmdlb20udm9yb25vaT1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KG4pe3ZhciB0PW5ldyBBcnJheShuLmxlbmd0aCkscj1hWzBdWzBdLHU9YVswXVsxXSxpPWFbMV1bMF0sbz1hWzFdWzFdO3JldHVybiBNcihlKG4pLGEpLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oZSxhKXt2YXIgcz1lLmVkZ2VzLGM9ZS5zaXRlLGw9dFthXT1zLmxlbmd0aD9zLm1hcChmdW5jdGlvbihuKXt2YXIgdD1uLnN0YXJ0KCk7cmV0dXJuW3QueCx0LnldfSk6Yy54Pj1yJiZjLng8PWkmJmMueT49dSYmYy55PD1vP1tbcixvXSxbaSxvXSxbaSx1XSxbcix1XV06W107bC5wb2ludD1uW2FdfSksdH1mdW5jdGlvbiBlKG4pe3JldHVybiBuLm1hcChmdW5jdGlvbihuLHQpe3JldHVybnt4Ok1hdGgucm91bmQoaShuLHQpL1hvKSpYbyx5Ok1hdGgucm91bmQobyhuLHQpL1hvKSpYbyxpOnR9fSl9dmFyIHI9T2UsdT1ZZSxpPXIsbz11LGE9T2E7cmV0dXJuIG4/dChuKToodC5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gTXIoZShuKSkuZWRnZXMuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBuLmwmJm4ucn0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOm5bdC5sLmldLHRhcmdldDpuW3Quci5pXX19KX0sdC50cmlhbmdsZXM9ZnVuY3Rpb24obil7dmFyIHQ9W107cmV0dXJuIE1yKGUobikpLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oZSxyKXtmb3IodmFyIHUsaSxvPWUuc2l0ZSxhPWUuZWRnZXMuc29ydChycikscz0tMSxjPWEubGVuZ3RoLGw9YVtjLTFdLmVkZ2UsZj1sLmw9PT1vP2wucjpsLmw7KytzPGM7KXU9bCxpPWYsbD1hW3NdLmVkZ2UsZj1sLmw9PT1vP2wucjpsLmwscjxpLmkmJnI8Zi5pJiZicihvLGksZik8MCYmdC5wdXNoKFtuW3JdLG5baS5pXSxuW2YuaV1dKX0pLHR9LHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1NdChyPW4pLHQpOnJ9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1NdCh1PW4pLHQpOnV9LHQuY2xpcEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1udWxsPT1uP09hOm4sdCk6YT09PU9hP251bGw6YX0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QuY2xpcEV4dGVudChuJiZbWzAsMF0sbl0pOmE9PT1PYT9udWxsOmEmJmFbMV19LHQpfTt2YXIgT2E9W1stMWU2LC0xZTZdLFsxZTYsMWU2XV07bG8uZ2VvbS5kZWxhdW5heT1mdW5jdGlvbihuKXtyZXR1cm4gbG8uZ2VvbS52b3Jvbm9pKCkudHJpYW5nbGVzKG4pfSxsby5nZW9tLnF1YWR0cmVlPWZ1bmN0aW9uKG4sdCxlLHIsdSl7ZnVuY3Rpb24gaShuKXtmdW5jdGlvbiBpKG4sdCxlLHIsdSxpLG8sYSl7aWYoIWlzTmFOKGUpJiYhaXNOYU4ocikpaWYobi5sZWFmKXt2YXIgcz1uLngsbD1uLnk7aWYobnVsbCE9cylpZihTbyhzLWUpK1NvKGwtcik8LjAxKWMobix0LGUscix1LGksbyxhKTtlbHNle3ZhciBmPW4ucG9pbnQ7bi54PW4ueT1uLnBvaW50PW51bGwsYyhuLGYscyxsLHUsaSxvLGEpLGMobix0LGUscix1LGksbyxhKX1lbHNlIG4ueD1lLG4ueT1yLG4ucG9pbnQ9dH1lbHNlIGMobix0LGUscix1LGksbyxhKX1mdW5jdGlvbiBjKG4sdCxlLHIsdSxvLGEscyl7dmFyIGM9LjUqKHUrYSksbD0uNSoobytzKSxmPWU+PWMsaD1yPj1sLGc9KGg8PDEpK2Y7bi5sZWFmPSExLG49bi5ub2Rlc1tnXXx8KG4ubm9kZXNbZ109U3IoKSksZj91PWM6YT1jLGg/bz1sOnM9bCxpKG4sdCxlLHIsdSxvLGEscyl9dmFyIGwsZixoLGcscCx2LGQsbSx5LHg9TXQoYSksTT1NdChzKTtpZihudWxsIT10KXY9dCxkPWUsbT1yLHk9dTtlbHNlIGlmKG09eT0tKHY9ZD0xLzApLGY9W10saD1bXSxwPW4ubGVuZ3RoLG8pZm9yKGc9MDtwPmc7KytnKWw9bltnXSxsLng8diYmKHY9bC54KSxsLnk8ZCYmKGQ9bC55KSxsLng+bSYmKG09bC54KSxsLnk+eSYmKHk9bC55KSxmLnB1c2gobC54KSxoLnB1c2gobC55KTtlbHNlIGZvcihnPTA7cD5nOysrZyl7dmFyIF89K3gobD1uW2ddLGcpLGI9K00obCxnKTt2Pl8mJih2PV8pLGQ+YiYmKGQ9YiksXz5tJiYobT1fKSxiPnkmJih5PWIpLGYucHVzaChfKSxoLnB1c2goYil9dmFyIHc9bS12LGs9eS1kO3c+az95PWQrdzptPXYrazt2YXIgUz1TcigpO2lmKFMuYWRkPWZ1bmN0aW9uKG4pe2koUyxuLCt4KG4sKytnKSwrTShuLGcpLHYsZCxtLHkpfSxTLnZpc2l0PWZ1bmN0aW9uKG4pe0NyKG4sUyx2LGQsbSx5KX0sZz0tMSxudWxsPT10KXtmb3IoOysrZzxwOylpKFMsbltnXSxmW2ddLGhbZ10sdixkLG0seSk7LS1nfWVsc2Ugbi5mb3JFYWNoKFMuYWRkKTtyZXR1cm4gZj1oPW49bD1udWxsLFN9dmFyIG8sYT1PZSxzPVllO3JldHVybihvPWFyZ3VtZW50cy5sZW5ndGgpPyhhPXdyLHM9a3IsMz09PW8mJih1PWUscj10LGU9dD0wKSxpKG4pKTooaS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4saSk6YX0saS55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW4saSk6c30saS5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9dT1udWxsOih0PStuWzBdWzBdLGU9K25bMF1bMV0scj0rblsxXVswXSx1PStuWzFdWzFdKSxpKTpudWxsPT10P251bGw6W1t0LGVdLFtyLHVdXX0saS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP3Q9ZT1yPXU9bnVsbDoodD1lPTAscj0rblswXSx1PStuWzFdKSxpKTpudWxsPT10P251bGw6W3ItdCx1LWVdfSxpKX0sbG8uZ2VvbS5jb250ZXh0U2luaz1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoZSxyKXt0Lm1vdmVUbyhlLHIpLHQuYXJjKGUscixuLDAsWm8pfWZ1bmN0aW9uIHIobixlKXt0Lm1vdmVUbyhuLGUpLGwucG9pbnQ9dX1mdW5jdGlvbiB1KG4sZSl7dC5saW5lVG8obixlKX1mdW5jdGlvbiBpKCl7bC5wb2ludD1yfWZ1bmN0aW9uIG8oKXtsLnBvaW50PWV9ZnVuY3Rpb24gYSgpe3QuY2xvc2VQYXRoKCl9ZnVuY3Rpb24gcygpe2wubGluZUVuZD1hfWZ1bmN0aW9uIGMoKXtsLmxpbmVFbmQ9byxsLnBvaW50PWV9YXJndW1lbnRzLmxlbmd0aDwyJiYodD1uLG49NC41KTt2YXIgbD17cG9pbnQ6ZSxsaW5lU3RhcnQ6aSxsaW5lRW5kOm8scG9seWdvblN0YXJ0OnMscG9seWdvbkVuZDpjfTtyZXR1cm4gbH0sbG8uZ2VvbS5tYXRyaXg9ZnVuY3Rpb24obix0LGUscix1LGksbyl7cmV0dXJue3BvbHlnb25TdGFydDpmdW5jdGlvbigpe28ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtvLnBvbHlnb25FbmQoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7by5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe28ubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbihhLHMpe28ucG9pbnQobiphK3Qqcyt1LGUqYStyKnMraSl9fX07dmFyIFlhPTFlOTtsby5nZW9tLmNsaXBFeHRlbnQ9ZnVuY3Rpb24obix0LGUscix1KXtmdW5jdGlvbiBpKG4pe2Zvcih2YXIgdD0wLGU9ZC5sZW5ndGgscj1uWzFdLHU9MDtlPnU7Kyt1KWZvcih2YXIgaSxvPTEsYT1kW3VdLHM9YS5sZW5ndGgsYz1hWzBdO3M+bzsrK28paT1hW29dLGNbMV08PXI/aVsxXT5yJiZCKGMsaSxuKT4wJiYrK3Q6aVsxXTw9ciYmQihjLGksbik8MCYmLS10LGM9aTtyZXR1cm4gMCE9PXR9ZnVuY3Rpb24gbyh1LGksbyxhKXt2YXIgcz0wLGM9MDtpZihudWxsPT11fHwocz1oKHUsbykpIT09KGM9aChpLG8pKXx8cCh1LGkpPDBebz4wKXtkbyBhLnBvaW50KDA9PT1zfHwzPT09cz9uOmUscz4xP3I6dCk7d2hpbGUoKHM9KHMrbys0KSU0KSE9PWMpfWVsc2UgYS5wb2ludChpWzBdLGlbMV0pfWZ1bmN0aW9uIGEodSxpKXtyZXR1cm4gdT49biYmZT49dSYmaT49dCYmcj49aX1mdW5jdGlvbiBzKG4sdCl7YShuLHQpJiZ1LnBvaW50KG4sdCl9ZnVuY3Rpb24gYygpe0UucG9pbnQ9ZixkJiZkLnB1c2gobT1bXSksaz0hMCx3PSExLF89Yj0wLzB9ZnVuY3Rpb24gbCgpe3YmJihmKHkseCksTSYmdyYmQS5yZWpvaW4oKSx2LnB1c2goQS5idWZmZXIoKSkpLEUucG9pbnQ9cyx3JiZ1LmxpbmVFbmQoKQp9ZnVuY3Rpb24gZihuLHQpe249TWF0aC5tYXgoLVlhLE1hdGgubWluKFlhLG4pKSx0PU1hdGgubWF4KC1ZYSxNYXRoLm1pbihZYSx0KSk7dmFyIGU9YShuLHQpO2lmKGQmJm0ucHVzaChbbix0XSksayl5PW4seD10LE09ZSxrPSExLGUmJih1LmxpbmVTdGFydCgpLHUucG9pbnQobix0KSk7ZWxzZSBpZihlJiZ3KXUucG9pbnQobix0KTtlbHNle3ZhciByPXthOnt4Ol8seTpifSxiOnt4Om4seTp0fX07TihyKT8od3x8KHUubGluZVN0YXJ0KCksdS5wb2ludChyLmEueCxyLmEueSkpLHUucG9pbnQoci5iLngsci5iLnkpLGV8fHUubGluZUVuZCgpLFM9ITEpOmUmJih1LmxpbmVTdGFydCgpLHUucG9pbnQobix0KSxTPSExKX1fPW4sYj10LHc9ZX1mdW5jdGlvbiBoKHIsdSl7cmV0dXJuIFNvKHJbMF0tbik8WG8/dT4wPzA6MzpTbyhyWzBdLWUpPFhvP3U+MD8yOjE6U28oclsxXS10KTxYbz91PjA/MTowOnU+MD8zOjJ9ZnVuY3Rpb24gZyhuLHQpe3JldHVybiBwKG4ueCx0LngpfWZ1bmN0aW9uIHAobix0KXt2YXIgZT1oKG4sMSkscj1oKHQsMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT90WzFdLW5bMV06MT09PWU/blswXS10WzBdOjI9PT1lP25bMV0tdFsxXTp0WzBdLW5bMF19dmFyIHYsZCxtLHkseCxNLF8sYix3LGssUyxDPXUsQT1TZSgpLE49YXIobix0LGUsciksRT17cG9pbnQ6cyxsaW5lU3RhcnQ6YyxsaW5lRW5kOmwscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dT1BLHY9W10sZD1bXSxTPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dT1DLHY9bG8ubWVyZ2Uodik7dmFyIHQ9aShbbixyXSksZT1TJiZ0LGE9di5sZW5ndGg7KGV8fGEpJiYodS5wb2x5Z29uU3RhcnQoKSxlJiYodS5saW5lU3RhcnQoKSxvKG51bGwsbnVsbCwxLHUpLHUubGluZUVuZCgpKSxhJiZiZSh2LGcsdCxvLHUpLHUucG9seWdvbkVuZCgpKSx2PWQ9bT1udWxsfX07cmV0dXJuIEV9LGxvLmludGVycG9sYXRlUmdiPUFyLGxvLmludGVycG9sYXRlT2JqZWN0PU5yLGxvLmludGVycG9sYXRlTnVtYmVyPUVyLGxvLmludGVycG9sYXRlU3RyaW5nPXpyO3ZhciBJYT0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csWmE9bmV3IFJlZ0V4cChJYS5zb3VyY2UsImciKTtsby5pbnRlcnBvbGF0ZT1Ucixsby5pbnRlcnBvbGF0b3JzPVtmdW5jdGlvbihuLHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybigic3RyaW5nIj09PWU/bGEuaGFzKHQpfHwvXigjfHJnYlwofGhzbFwoKS8udGVzdCh0KT9Bcjp6cjp0IGluc3RhbmNlb2YgbnQ/QXI6QXJyYXkuaXNBcnJheSh0KT9Mcjoib2JqZWN0Ij09PWUmJmlzTmFOKHQpP05yOkVyKShuLHQpfV0sbG8uaW50ZXJwb2xhdGVBcnJheT1Mcjt2YXIgVmE9ZnVuY3Rpb24oKXtyZXR1cm4gX3R9LFhhPWxvLm1hcCh7bGluZWFyOlZhLHBvbHk6SHIscXVhZDpmdW5jdGlvbigpe3JldHVybiBQcn0sY3ViaWM6ZnVuY3Rpb24oKXtyZXR1cm4gVXJ9LHNpbjpmdW5jdGlvbigpe3JldHVybiBGcn0sZXhwOmZ1bmN0aW9uKCl7cmV0dXJuIE9yfSxjaXJjbGU6ZnVuY3Rpb24oKXtyZXR1cm4gWXJ9LGVsYXN0aWM6SXIsYmFjazpacixib3VuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gVnJ9fSksJGE9bG8ubWFwKHsiaW4iOl90LG91dDpEciwiaW4tb3V0IjpSciwib3V0LWluIjpmdW5jdGlvbihuKXtyZXR1cm4gUnIoRHIobikpfX0pO2xvLmVhc2U9ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCItIiksZT10Pj0wP24uc3Vic3RyaW5nKDAsdCk6bixyPXQ+PTA/bi5zdWJzdHJpbmcodCsxKToiaW4iO3JldHVybiBlPVhhLmdldChlKXx8VmEscj0kYS5nZXQocil8fF90LHFyKHIoZS5hcHBseShudWxsLGZvLmNhbGwoYXJndW1lbnRzLDEpKSkpfSxsby5pbnRlcnBvbGF0ZUhjbD1Ycixsby5pbnRlcnBvbGF0ZUhzbD0kcixsby5pbnRlcnBvbGF0ZUxhYj1Ccixsby5pbnRlcnBvbGF0ZVJvdW5kPVdyLGxvLnRyYW5zZm9ybT1mdW5jdGlvbihuKXt2YXIgdD1nby5jcmVhdGVFbGVtZW50TlMobG8ubnMucHJlZml4LnN2ZywiZyIpO3JldHVybihsby50cmFuc2Zvcm09ZnVuY3Rpb24obil7aWYobnVsbCE9bil7dC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsbik7dmFyIGU9dC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpfXJldHVybiBuZXcgSnIoZT9lLm1hdHJpeDpCYSl9KShuKX0sSnIucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMudHJhbnNsYXRlKyIpcm90YXRlKCIrdGhpcy5yb3RhdGUrIilza2V3WCgiK3RoaXMuc2tldysiKXNjYWxlKCIrdGhpcy5zY2FsZSsiKSJ9O3ZhciBCYT17YToxLGI6MCxjOjAsZDoxLGU6MCxmOjB9O2xvLmludGVycG9sYXRlVHJhbnNmb3JtPW51LGxvLmxheW91dD17fSxsby5sYXlvdXQuYnVuZGxlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2Zvcih2YXIgdD1bXSxlPS0xLHI9bi5sZW5ndGg7KytlPHI7KXQucHVzaChydShuW2VdKSk7cmV0dXJuIHR9fSxsby5sYXlvdXQuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG4sYyxmLGgsZyxwPXt9LHY9W10sZD1sby5yYW5nZShpKSxtPVtdO2ZvcihlPVtdLHI9W10sbj0wLGg9LTE7KytoPGk7KXtmb3IoYz0wLGc9LTE7KytnPGk7KWMrPXVbaF1bZ107di5wdXNoKGMpLG0ucHVzaChsby5yYW5nZShpKSksbis9Y31mb3IobyYmZC5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG8odltuXSx2W3RdKX0pLGEmJm0uZm9yRWFjaChmdW5jdGlvbihuLHQpe24uc29ydChmdW5jdGlvbihuLGUpe3JldHVybiBhKHVbdF1bbl0sdVt0XVtlXSl9KX0pLG49KFpvLWwqaSkvbixjPTAsaD0tMTsrK2g8aTspe2ZvcihmPWMsZz0tMTsrK2c8aTspe3ZhciB5PWRbaF0seD1tW3ldW2ddLE09dVt5XVt4XSxfPWMsYj1jKz1NKm47cFt5KyItIit4XT17aW5kZXg6eSxzdWJpbmRleDp4LHN0YXJ0QW5nbGU6XyxlbmRBbmdsZTpiLHZhbHVlOk19fXJbeV09e2luZGV4Onksc3RhcnRBbmdsZTpmLGVuZEFuZ2xlOmMsdmFsdWU6KGMtZikvbn0sYys9bH1mb3IoaD0tMTsrK2g8aTspZm9yKGc9aC0xOysrZzxpOyl7dmFyIHc9cFtoKyItIitnXSxrPXBbZysiLSIraF07KHcudmFsdWV8fGsudmFsdWUpJiZlLnB1c2gody52YWx1ZTxrLnZhbHVlP3tzb3VyY2U6ayx0YXJnZXQ6d306e3NvdXJjZTp3LHRhcmdldDprfSl9cyYmdCgpfWZ1bmN0aW9uIHQoKXtlLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gcygobi5zb3VyY2UudmFsdWUrbi50YXJnZXQudmFsdWUpLzIsKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlKS8yKX0pfXZhciBlLHIsdSxpLG8sYSxzLGM9e30sbD0wO3JldHVybiBjLm1hdHJpeD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0odT1uKSYmdS5sZW5ndGgsZT1yPW51bGwsYyk6dX0sYy5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4sZT1yPW51bGwsYyk6bH0sYy5zb3J0R3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sZT1yPW51bGwsYyk6b30sYy5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4sZT1udWxsLGMpOmF9LGMuc29ydENob3Jkcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1uLGUmJnQoKSxjKTpzfSxjLmNob3Jkcz1mdW5jdGlvbigpe3JldHVybiBlfHxuKCksZX0sYy5ncm91cHM9ZnVuY3Rpb24oKXtyZXR1cm4gcnx8bigpLHJ9LGN9LGxvLmxheW91dC5mb3JjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLHUpe2lmKHQucG9pbnQhPT1uKXt2YXIgaT10LmN4LW4ueCxvPXQuY3ktbi55LGE9dS1lLHM9aSppK28qbztpZihzPmEqYS9kKXtpZihwPnMpe3ZhciBjPXQuY2hhcmdlL3M7bi5weC09aSpjLG4ucHktPW8qY31yZXR1cm4hMH1pZih0LnBvaW50JiZzJiZwPnMpe3ZhciBjPXQucG9pbnRDaGFyZ2UvcztuLnB4LT1pKmMsbi5weS09bypjfX1yZXR1cm4hdC5jaGFyZ2V9fWZ1bmN0aW9uIHQobil7bi5weD1sby5ldmVudC54LG4ucHk9bG8uZXZlbnQueSxhLnJlc3VtZSgpfXZhciBlLHIsdSxpLG8sYT17fSxzPWxvLmRpc3BhdGNoKCJzdGFydCIsInRpY2siLCJlbmQiKSxjPVsxLDFdLGw9LjksZj1XYSxoPUphLGc9LTMwLHA9R2Esdj0uMSxkPS42NCxtPVtdLHk9W107cmV0dXJuIGEudGljaz1mdW5jdGlvbigpe2lmKChyKj0uOTkpPC4wMDUpcmV0dXJuIHMuZW5kKHt0eXBlOiJlbmQiLGFscGhhOnI9MH0pLCEwO3ZhciB0LGUsYSxmLGgscCxkLHgsTSxfPW0ubGVuZ3RoLGI9eS5sZW5ndGg7Zm9yKGU9MDtiPmU7KytlKWE9eVtlXSxmPWEuc291cmNlLGg9YS50YXJnZXQseD1oLngtZi54LE09aC55LWYueSwocD14KngrTSpNKSYmKHA9cippW2VdKigocD1NYXRoLnNxcnQocCkpLXVbZV0pL3AseCo9cCxNKj1wLGgueC09eCooZD1mLndlaWdodC8oaC53ZWlnaHQrZi53ZWlnaHQpKSxoLnktPU0qZCxmLngrPXgqKGQ9MS1kKSxmLnkrPU0qZCk7aWYoKGQ9cip2KSYmKHg9Y1swXS8yLE09Y1sxXS8yLGU9LTEsZCkpZm9yKDsrK2U8XzspYT1tW2VdLGEueCs9KHgtYS54KSpkLGEueSs9KE0tYS55KSpkO2lmKGcpZm9yKGx1KHQ9bG8uZ2VvbS5xdWFkdHJlZShtKSxyLG8pLGU9LTE7KytlPF87KShhPW1bZV0pLmZpeGVkfHx0LnZpc2l0KG4oYSkpO2ZvcihlPS0xOysrZTxfOylhPW1bZV0sYS5maXhlZD8oYS54PWEucHgsYS55PWEucHkpOihhLngtPShhLnB4LShhLnB4PWEueCkpKmwsYS55LT0oYS5weS0oYS5weT1hLnkpKSpsKTtzLnRpY2soe3R5cGU6InRpY2siLGFscGhhOnJ9KX0sYS5ub2Rlcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1uLGEpOm19LGEubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9bixhKTp5fSxhLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bixhKTpjfSxhLmxpbmtEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGEpOmZ9LGEuZGlzdGFuY2U9YS5saW5rRGlzdGFuY2UsYS5saW5rU3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixhKTpofSxhLmZyaWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPStuLGEpOmx9LGEuY2hhcmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sYSk6Z30sYS5jaGFyZ2VEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1uKm4sYSk6TWF0aC5zcXJ0KHApfSxhLmdyYXZpdHk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9K24sYSk6dn0sYS50aGV0YT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1uKm4sYSk6TWF0aC5zcXJ0KGQpfSxhLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStuLHI/cj1uPjA/bjowOm4+MCYmKHMuc3RhcnQoe3R5cGU6InN0YXJ0IixhbHBoYTpyPW59KSxsby50aW1lcihhLnRpY2spKSxhKTpyfSxhLnN0YXJ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe2lmKCFlKXtmb3IoZT1uZXcgQXJyYXkocyksYT0wO3M+YTsrK2EpZVthXT1bXTtmb3IoYT0wO2M+YTsrK2Epe3ZhciB1PXlbYV07ZVt1LnNvdXJjZS5pbmRleF0ucHVzaCh1LnRhcmdldCksZVt1LnRhcmdldC5pbmRleF0ucHVzaCh1LnNvdXJjZSl9fWZvcih2YXIgaSxvPWVbdF0sYT0tMSxjPW8ubGVuZ3RoOysrYTxjOylpZighaXNOYU4oaT1vW2FdW25dKSlyZXR1cm4gaTtyZXR1cm4gTWF0aC5yYW5kb20oKSpyfXZhciB0LGUscixzPW0ubGVuZ3RoLGw9eS5sZW5ndGgscD1jWzBdLHY9Y1sxXTtmb3IodD0wO3M+dDsrK3QpKHI9bVt0XSkuaW5kZXg9dCxyLndlaWdodD0wO2Zvcih0PTA7bD50OysrdClyPXlbdF0sIm51bWJlciI9PXR5cGVvZiByLnNvdXJjZSYmKHIuc291cmNlPW1bci5zb3VyY2VdKSwibnVtYmVyIj09dHlwZW9mIHIudGFyZ2V0JiYoci50YXJnZXQ9bVtyLnRhcmdldF0pLCsrci5zb3VyY2Uud2VpZ2h0LCsrci50YXJnZXQud2VpZ2h0O2Zvcih0PTA7cz50OysrdClyPW1bdF0saXNOYU4oci54KSYmKHIueD1uKCJ4IixwKSksaXNOYU4oci55KSYmKHIueT1uKCJ5Iix2KSksaXNOYU4oci5weCkmJihyLnB4PXIueCksaXNOYU4oci5weSkmJihyLnB5PXIueSk7aWYodT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZilmb3IodD0wO2w+dDsrK3QpdVt0XT0rZi5jYWxsKHRoaXMseVt0XSx0KTtlbHNlIGZvcih0PTA7bD50OysrdCl1W3RdPWY7aWYoaT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgaClmb3IodD0wO2w+dDsrK3QpaVt0XT0raC5jYWxsKHRoaXMseVt0XSx0KTtlbHNlIGZvcih0PTA7bD50OysrdClpW3RdPWg7aWYobz1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZylmb3IodD0wO3M+dDsrK3Qpb1t0XT0rZy5jYWxsKHRoaXMsbVt0XSx0KTtlbHNlIGZvcih0PTA7cz50OysrdClvW3RdPWc7cmV0dXJuIGEucmVzdW1lKCl9LGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYWxwaGEoLjEpfSxhLnN0b3A9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hbHBoYSgwKX0sYS5kcmFnPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fChlPWxvLmJlaGF2aW9yLmRyYWcoKS5vcmlnaW4oX3QpLm9uKCJkcmFnc3RhcnQuZm9yY2UiLG91KS5vbigiZHJhZy5mb3JjZSIsdCkub24oImRyYWdlbmQuZm9yY2UiLGF1KSksYXJndW1lbnRzLmxlbmd0aD8odGhpcy5vbigibW91c2VvdmVyLmZvcmNlIixzdSkub24oIm1vdXNlb3V0LmZvcmNlIixjdSkuY2FsbChlKSx2b2lkIDApOmV9LGxvLnJlYmluZChhLHMsIm9uIil9O3ZhciBXYT0yMCxKYT0xLEdhPTEvMDtsby5sYXlvdXQuaGllcmFyY2h5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih1KXt2YXIgaSxvPVt1XSxhPVtdO2Zvcih1LmRlcHRoPTA7bnVsbCE9KGk9by5wb3AoKSk7KWlmKGEucHVzaChpKSwoYz1lLmNhbGwobixpLGkuZGVwdGgpKSYmKHM9Yy5sZW5ndGgpKXtmb3IodmFyIHMsYyxsOy0tcz49MDspby5wdXNoKGw9Y1tzXSksbC5wYXJlbnQ9aSxsLmRlcHRoPWkuZGVwdGgrMTtyJiYoaS52YWx1ZT0wKSxpLmNoaWxkcmVuPWN9ZWxzZSByJiYoaS52YWx1ZT0rci5jYWxsKG4saSxpLmRlcHRoKXx8MCksZGVsZXRlIGkuY2hpbGRyZW47cmV0dXJuIGd1KHUsZnVuY3Rpb24obil7dmFyIGUsdTt0JiYoZT1uLmNoaWxkcmVuKSYmZS5zb3J0KHQpLHImJih1PW4ucGFyZW50KSYmKHUudmFsdWUrPW4udmFsdWUpfSksYX12YXIgdD1kdSxlPXB1LHI9dnU7cmV0dXJuIG4uc29ydD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4uY2hpbGRyZW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi5yZXZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiByJiYoaHUodCxmdW5jdGlvbihuKXtuLmNoaWxkcmVuJiYobi52YWx1ZT0wKX0pLGd1KHQsZnVuY3Rpb24odCl7dmFyIGU7dC5jaGlsZHJlbnx8KHQudmFsdWU9K3IuY2FsbChuLHQsdC5kZXB0aCl8fDApLChlPXQucGFyZW50KSYmKGUudmFsdWUrPXQudmFsdWUpfSkpLHR9LG59LGxvLmxheW91dC5wYXJ0aXRpb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQsZSxyLHUpe3ZhciBpPXQuY2hpbGRyZW47aWYodC54PWUsdC55PXQuZGVwdGgqdSx0LmR4PXIsdC5keT11LGkmJihvPWkubGVuZ3RoKSl7dmFyIG8sYSxzLGM9LTE7Zm9yKHI9dC52YWx1ZT9yL3QudmFsdWU6MDsrK2M8bzspbihhPWlbY10sZSxzPWEudmFsdWUqcix1KSxlKz1zfX1mdW5jdGlvbiB0KG4pe3ZhciBlPW4uY2hpbGRyZW4scj0wO2lmKGUmJih1PWUubGVuZ3RoKSlmb3IodmFyIHUsaT0tMTsrK2k8dTspcj1NYXRoLm1heChyLHQoZVtpXSkpO3JldHVybiAxK3J9ZnVuY3Rpb24gZShlLGkpe3ZhciBvPXIuY2FsbCh0aGlzLGUsaSk7cmV0dXJuIG4ob1swXSwwLHVbMF0sdVsxXS90KG9bMF0pKSxvfXZhciByPWxvLmxheW91dC5oaWVyYXJjaHkoKSx1PVsxLDFdO3JldHVybiBlLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bixlKTp1fSxmdShlLHIpfSxsby5sYXlvdXQucGllPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihpKXt2YXIgbz1pLm1hcChmdW5jdGlvbihlLHIpe3JldHVybit0LmNhbGwobixlLHIpfSksYT0rKCJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOnIpLHM9KCgiZnVuY3Rpb24iPT10eXBlb2YgdT91LmFwcGx5KHRoaXMsYXJndW1lbnRzKTp1KS1hKS9sby5zdW0obyksYz1sby5yYW5nZShpLmxlbmd0aCk7bnVsbCE9ZSYmYy5zb3J0KGU9PT1LYT9mdW5jdGlvbihuLHQpe3JldHVybiBvW3RdLW9bbl19OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIGUoaVtuXSxpW3RdKX0pO3ZhciBsPVtdO3JldHVybiBjLmZvckVhY2goZnVuY3Rpb24obil7dmFyIHQ7bFtuXT17ZGF0YTppW25dLHZhbHVlOnQ9b1tuXSxzdGFydEFuZ2xlOmEsZW5kQW5nbGU6YSs9dCpzfX0pLGx9dmFyIHQ9TnVtYmVyLGU9S2Escj0wLHU9Wm87cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLnNvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsbik6dX0sbn07dmFyIEthPXt9O2xvLmxheW91dC5zdGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oYSxzKXt2YXIgYz1hLm1hcChmdW5jdGlvbihlLHIpe3JldHVybiB0LmNhbGwobixlLHIpfSksbD1jLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5tYXAoZnVuY3Rpb24odCxlKXtyZXR1cm5baS5jYWxsKG4sdCxlKSxvLmNhbGwobix0LGUpXX0pfSksZj1lLmNhbGwobixsLHMpO2M9bG8ucGVybXV0ZShjLGYpLGw9bG8ucGVybXV0ZShsLGYpO3ZhciBoLGcscCx2PXIuY2FsbChuLGwscyksZD1jLmxlbmd0aCxtPWNbMF0ubGVuZ3RoO2ZvcihnPTA7bT5nOysrZylmb3IodS5jYWxsKG4sY1swXVtnXSxwPXZbZ10sbFswXVtnXVsxXSksaD0xO2Q+aDsrK2gpdS5jYWxsKG4sY1toXVtnXSxwKz1sW2gtMV1bZ11bMV0sbFtoXVtnXVsxXSk7cmV0dXJuIGF9dmFyIHQ9X3QsZT1fdSxyPWJ1LHU9TXUsaT15dSxvPXh1O3JldHVybiBuLnZhbHVlcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4ub3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRYS5nZXQodCl8fF91LG4pOmV9LG4ub2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bnMuZ2V0KHQpfHxidSxuKTpyfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCxuKTpvfSxuLm91dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG59O3ZhciBRYT1sby5tYXAoeyJpbnNpZGUtb3V0IjpmdW5jdGlvbihuKXt2YXIgdCxlLHI9bi5sZW5ndGgsdT1uLm1hcCh3dSksaT1uLm1hcChrdSksbz1sby5yYW5nZShyKS5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHVbbl0tdVt0XX0pLGE9MCxzPTAsYz1bXSxsPVtdO2Zvcih0PTA7cj50OysrdCllPW9bdF0scz5hPyhhKz1pW2VdLGMucHVzaChlKSk6KHMrPWlbZV0sbC5wdXNoKGUpKTtyZXR1cm4gbC5yZXZlcnNlKCkuY29uY2F0KGMpfSxyZXZlcnNlOmZ1bmN0aW9uKG4pe3JldHVybiBsby5yYW5nZShuLmxlbmd0aCkucmV2ZXJzZSgpfSwiZGVmYXVsdCI6X3V9KSxucz1sby5tYXAoe3NpbGhvdWV0dGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9bi5sZW5ndGgsaT1uWzBdLmxlbmd0aCxvPVtdLGE9MCxzPVtdO2ZvcihlPTA7aT5lOysrZSl7Zm9yKHQ9MCxyPTA7dT50O3QrKylyKz1uW3RdW2VdWzFdO3I+YSYmKGE9ciksby5wdXNoKHIpfWZvcihlPTA7aT5lOysrZSlzW2VdPShhLW9bZV0pLzI7cmV0dXJuIHN9LHdpZ2dsZTpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpLG8sYSxzLGMsbD1uLmxlbmd0aCxmPW5bMF0saD1mLmxlbmd0aCxnPVtdO2ZvcihnWzBdPXM9Yz0wLGU9MTtoPmU7KytlKXtmb3IodD0wLHU9MDtsPnQ7Kyt0KXUrPW5bdF1bZV1bMV07Zm9yKHQ9MCxpPTAsYT1mW2VdWzBdLWZbZS0xXVswXTtsPnQ7Kyt0KXtmb3Iocj0wLG89KG5bdF1bZV1bMV0tblt0XVtlLTFdWzFdKS8oMiphKTt0PnI7KytyKW8rPShuW3JdW2VdWzFdLW5bcl1bZS0xXVsxXSkvYTtpKz1vKm5bdF1bZV1bMV19Z1tlXT1zLT11P2kvdSphOjAsYz5zJiYoYz1zKX1mb3IoZT0wO2g+ZTsrK2UpZ1tlXS09YztyZXR1cm4gZ30sZXhwYW5kOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PW4ubGVuZ3RoLGk9blswXS5sZW5ndGgsbz0xL3UsYT1bXTtmb3IoZT0wO2k+ZTsrK2Upe2Zvcih0PTAscj0wO3U+dDt0Kyspcis9blt0XVtlXVsxXTtpZihyKWZvcih0PTA7dT50O3QrKyluW3RdW2VdWzFdLz1yO2Vsc2UgZm9yKHQ9MDt1PnQ7dCsrKW5bdF1bZV1bMV09b31mb3IoZT0wO2k+ZTsrK2UpYVtlXT0wO3JldHVybiBhfSx6ZXJvOmJ1fSk7bG8ubGF5b3V0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXtmb3IodmFyIG8sYSxzPVtdLGM9bi5tYXAoZSx0aGlzKSxsPXIuY2FsbCh0aGlzLGMsaSksZj11LmNhbGwodGhpcyxsLGMsaSksaT0tMSxoPWMubGVuZ3RoLGc9Zi5sZW5ndGgtMSxwPXQ/MToxL2g7KytpPGc7KW89c1tpXT1bXSxvLmR4PWZbaSsxXS0oby54PWZbaV0pLG8ueT0wO2lmKGc+MClmb3IoaT0tMTsrK2k8aDspYT1jW2ldLGE+PWxbMF0mJmE8PWxbMV0mJihvPXNbbG8uYmlzZWN0KGYsYSwxLGcpLTFdLG8ueSs9cCxvLnB1c2gobltpXSkpO3JldHVybiBzfXZhciB0PSEwLGU9TnVtYmVyLHI9TnUsdT1DdTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9TXQodCksbik6cn0sbi5iaW5zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbihuKXtyZXR1cm4gQXUobix0KX06TXQodCksbik6dX0sbi5mcmVxdWVuY3k9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ISFlLG4pOnR9LG59LGxvLmxheW91dC5wYWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciBvPWUuY2FsbCh0aGlzLG4saSksYT1vWzBdLHM9dVswXSxjPXVbMV0sbD1udWxsPT10P01hdGguc3FydDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O2lmKGEueD1hLnk9MCxndShhLGZ1bmN0aW9uKG4pe24ucj0rbChuLnZhbHVlKX0pLGd1KGEscXUpLHIpe3ZhciBmPXIqKHQ/MTpNYXRoLm1heCgyKmEuci9zLDIqYS5yL2MpKS8yO2d1KGEsZnVuY3Rpb24obil7bi5yKz1mfSksZ3UoYSxxdSksZ3UoYSxmdW5jdGlvbihuKXtuLnItPWZ9KX1yZXR1cm4gUHUoYSxzLzIsYy8yLHQ/MToxL01hdGgubWF4KDIqYS5yL3MsMiphLnIvYykpLG99dmFyIHQsZT1sby5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChFdSkscj0wLHU9WzEsMV07cmV0dXJuIG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG4ucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PWV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6K2Usbik6dH0sbi5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG4pOnJ9LGZ1KG4sZSl9LGxvLmxheW91dC50cmVlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBsPW8uY2FsbCh0aGlzLG4sdSksZj1sWzBdLGg9dChmKTtpZihndShoLGUpLGgucGFyZW50Lm09LWgueixodShoLHIpLGMpaHUoZixpKTtlbHNle3ZhciBnPWYscD1mLHY9ZjtodShmLGZ1bmN0aW9uKG4pe24ueDxnLngmJihnPW4pLG4ueD5wLngmJihwPW4pLG4uZGVwdGg+di5kZXB0aCYmKHY9bil9KTt2YXIgZD1hKGcscCkvMi1nLngsbT1zWzBdLyhwLngrYShwLGcpLzIrZCkseT1zWzFdLyh2LmRlcHRofHwxKTtodShmLGZ1bmN0aW9uKG4pe24ueD0obi54K2QpKm0sbi55PW4uZGVwdGgqeX0pfXJldHVybiBsfWZ1bmN0aW9uIHQobil7Zm9yKHZhciB0LGU9e0E6bnVsbCxjaGlsZHJlbjpbbl19LHI9W2VdO251bGwhPSh0PXIucG9wKCkpOylmb3IodmFyIHUsaT10LmNoaWxkcmVuLG89MCxhPWkubGVuZ3RoO2E+bzsrK28pci5wdXNoKChpW29dPXU9e186aVtvXSxwYXJlbnQ6dCxjaGlsZHJlbjoodT1pW29dLmNoaWxkcmVuKSYmdS5zbGljZSgpfHxbXSxBOm51bGwsYTpudWxsLHo6MCxtOjAsYzowLHM6MCx0Om51bGwsaTpvfSkuYT11KTtyZXR1cm4gZS5jaGlsZHJlblswXX1mdW5jdGlvbiBlKG4pe3ZhciB0PW4uY2hpbGRyZW4sZT1uLnBhcmVudC5jaGlsZHJlbixyPW4uaT9lW24uaS0xXTpudWxsO2lmKHQubGVuZ3RoKXtZdShuKTt2YXIgaT0odFswXS56K3RbdC5sZW5ndGgtMV0ueikvMjtyPyhuLno9ci56K2Eobi5fLHIuXyksbi5tPW4uei1pKTpuLno9aX1lbHNlIHImJihuLno9ci56K2Eobi5fLHIuXykpO24ucGFyZW50LkE9dShuLHIsbi5wYXJlbnQuQXx8ZVswXSl9ZnVuY3Rpb24gcihuKXtuLl8ueD1uLnorbi5wYXJlbnQubSxuLm0rPW4ucGFyZW50Lm19ZnVuY3Rpb24gdShuLHQsZSl7aWYodCl7Zm9yKHZhciByLHU9bixpPW4sbz10LHM9dS5wYXJlbnQuY2hpbGRyZW5bMF0sYz11Lm0sbD1pLm0sZj1vLm0saD1zLm07bz1GdShvKSx1PUh1KHUpLG8mJnU7KXM9SHUocyksaT1GdShpKSxpLmE9bixyPW8ueitmLXUuei1jK2Eoby5fLHUuXykscj4wJiYoT3UoSXUobyxuLGUpLG4sciksYys9cixsKz1yKSxmKz1vLm0sYys9dS5tLGgrPXMubSxsKz1pLm07byYmIUZ1KGkpJiYoaS50PW8saS5tKz1mLWwpLHUmJiFIdShzKSYmKHMudD11LHMubSs9Yy1oLGU9bil9cmV0dXJuIGV9ZnVuY3Rpb24gaShuKXtuLngqPXNbMF0sbi55PW4uZGVwdGgqc1sxXX12YXIgbz1sby5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxhPWp1LHM9WzEsMV0sYz1udWxsO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxuKTphfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bnVsbD09KHM9dCk/aTpudWxsLG4pOmM/bnVsbDpzfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW51bGw9PShzPXQpP251bGw6aSxuKTpjP3M6bnVsbH0sZnUobixvKX0sbG8ubGF5b3V0LmNsdXN0ZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7dmFyIG8sYT10LmNhbGwodGhpcyxuLGkpLHM9YVswXSxjPTA7Z3UocyxmdW5jdGlvbihuKXt2YXIgdD1uLmNoaWxkcmVuO3QmJnQubGVuZ3RoPyhuLng9VnUodCksbi55PVp1KHQpKToobi54PW8/Yys9ZShuLG8pOjAsbi55PTAsbz1uKX0pO3ZhciBsPVh1KHMpLGY9JHUocyksaD1sLngtZShsLGYpLzIsZz1mLngrZShmLGwpLzI7cmV0dXJuIGd1KHMsdT9mdW5jdGlvbihuKXtuLng9KG4ueC1zLngpKnJbMF0sbi55PShzLnktbi55KSpyWzFdfTpmdW5jdGlvbihuKXtuLng9KG4ueC1oKS8oZy1oKSpyWzBdLG4ueT0oMS0ocy55P24ueS9zLnk6MSkpKnJbMV19KSxhfXZhciB0PWxvLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLGU9anUscj1bMSwxXSx1PSExO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09KHI9dCksbik6dT9udWxsOnJ9LG4ubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbCE9KHI9dCksbik6dT9yOm51bGx9LGZ1KG4sdCl9LGxvLmxheW91dC50cmVlbWFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe2Zvcih2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDsrK3U8aTspcj0oZT1uW3VdKS52YWx1ZSooMD50PzA6dCksZS5hcmVhPWlzTmFOKHIpfHwwPj1yPzA6cn1mdW5jdGlvbiB0KGUpe3ZhciBpPWUuY2hpbGRyZW47aWYoaSYmaS5sZW5ndGgpe3ZhciBvLGEscyxjPWYoZSksbD1bXSxoPWkuc2xpY2UoKSxwPTEvMCx2PSJzbGljZSI9PT1nP2MuZHg6ImRpY2UiPT09Zz9jLmR5OiJzbGljZS1kaWNlIj09PWc/MSZlLmRlcHRoP2MuZHk6Yy5keDpNYXRoLm1pbihjLmR4LGMuZHkpO2ZvcihuKGgsYy5keCpjLmR5L2UudmFsdWUpLGwuYXJlYT0wOyhzPWgubGVuZ3RoKT4wOylsLnB1c2gobz1oW3MtMV0pLGwuYXJlYSs9by5hcmVhLCJzcXVhcmlmeSIhPT1nfHwoYT1yKGwsdikpPD1wPyhoLnBvcCgpLHA9YSk6KGwuYXJlYS09bC5wb3AoKS5hcmVhLHUobCx2LGMsITEpLHY9TWF0aC5taW4oYy5keCxjLmR5KSxsLmxlbmd0aD1sLmFyZWE9MCxwPTEvMCk7bC5sZW5ndGgmJih1KGwsdixjLCEwKSxsLmxlbmd0aD1sLmFyZWE9MCksaS5mb3JFYWNoKHQpfX1mdW5jdGlvbiBlKHQpe3ZhciByPXQuY2hpbGRyZW47aWYociYmci5sZW5ndGgpe3ZhciBpLG89Zih0KSxhPXIuc2xpY2UoKSxzPVtdO2ZvcihuKGEsby5keCpvLmR5L3QudmFsdWUpLHMuYXJlYT0wO2k9YS5wb3AoKTspcy5wdXNoKGkpLHMuYXJlYSs9aS5hcmVhLG51bGwhPWkueiYmKHUocyxpLno/by5keDpvLmR5LG8sIWEubGVuZ3RoKSxzLmxlbmd0aD1zLmFyZWE9MCk7ci5mb3JFYWNoKGUpfX1mdW5jdGlvbiByKG4sdCl7Zm9yKHZhciBlLHI9bi5hcmVhLHU9MCxpPTEvMCxvPS0xLGE9bi5sZW5ndGg7KytvPGE7KShlPW5bb10uYXJlYSkmJihpPmUmJihpPWUpLGU+dSYmKHU9ZSkpO3JldHVybiByKj1yLHQqPXQscj9NYXRoLm1heCh0KnUqcC9yLHIvKHQqaSpwKSk6MS8wfWZ1bmN0aW9uIHUobix0LGUscil7dmFyIHUsaT0tMSxvPW4ubGVuZ3RoLGE9ZS54LGM9ZS55LGw9dD9zKG4uYXJlYS90KTowO2lmKHQ9PWUuZHgpe2Zvcigocnx8bD5lLmR5KSYmKGw9ZS5keSk7KytpPG87KXU9bltpXSx1Lng9YSx1Lnk9Yyx1LmR5PWwsYSs9dS5keD1NYXRoLm1pbihlLngrZS5keC1hLGw/cyh1LmFyZWEvbCk6MCk7dS56PSEwLHUuZHgrPWUueCtlLmR4LWEsZS55Kz1sLGUuZHktPWx9ZWxzZXtmb3IoKHJ8fGw+ZS5keCkmJihsPWUuZHgpOysraTxvOyl1PW5baV0sdS54PWEsdS55PWMsdS5keD1sLGMrPXUuZHk9TWF0aC5taW4oZS55K2UuZHktYyxsP3ModS5hcmVhL2wpOjApO3Uuej0hMSx1LmR5Kz1lLnkrZS5keS1jLGUueCs9bCxlLmR4LT1sfX1mdW5jdGlvbiBpKHIpe3ZhciB1PW98fGEociksaT11WzBdO3JldHVybiBpLng9MCxpLnk9MCxpLmR4PWNbMF0saS5keT1jWzFdLG8mJmEucmV2YWx1ZShpKSxuKFtpXSxpLmR4KmkuZHkvaS52YWx1ZSksKG8/ZTp0KShpKSxoJiYobz11KSx1fXZhciBvLGE9bG8ubGF5b3V0LmhpZXJhcmNoeSgpLHM9TWF0aC5yb3VuZCxjPVsxLDFdLGw9bnVsbCxmPUJ1LGg9ITEsZz0ic3F1YXJpZnkiLHA9LjUqKDErTWF0aC5zcXJ0KDUpKTtyZXR1cm4gaS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4saSk6Y30saS5wYWRkaW5nPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7dmFyIGU9bi5jYWxsKGksdCx0LmRlcHRoKTtyZXR1cm4gbnVsbD09ZT9CdSh0KTpXdSh0LCJudW1iZXIiPT10eXBlb2YgZT9bZSxlLGUsZV06ZSl9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gV3UodCxuKX1pZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbDt2YXIgcjtyZXR1cm4gZj1udWxsPT0obD1uKT9CdToiZnVuY3Rpb24iPT0ocj10eXBlb2Ygbik/dDoibnVtYmVyIj09PXI/KG49W24sbixuLG5dLGUpOmUsaX0saS5yb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1uP01hdGgucm91bmQ6TnVtYmVyLGkpOnMhPU51bWJlcn0saS5zdGlja3k9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9bixvPW51bGwsaSk6aH0saS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1uLGkpOnB9LGkubW9kZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz1uKyIiLGkpOmd9LGZ1KGksYSl9LGxvLnJhbmRvbT17bm9ybWFsOmZ1bmN0aW9uKG4sdCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gMj5lJiYodD0xKSwxPmUmJihuPTApLGZ1bmN0aW9uKCl7dmFyIGUscix1O2RvIGU9MipNYXRoLnJhbmRvbSgpLTEscj0yKk1hdGgucmFuZG9tKCktMSx1PWUqZStyKnI7d2hpbGUoIXV8fHU+MSk7cmV0dXJuIG4rdCplKk1hdGguc3FydCgtMipNYXRoLmxvZyh1KS91KX19LGxvZ05vcm1hbDpmdW5jdGlvbigpe3ZhciBuPWxvLnJhbmRvbS5ub3JtYWwuYXBwbHkobG8sYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAobigpKX19LGJhdGVzOmZ1bmN0aW9uKG4pe3ZhciB0PWxvLnJhbmRvbS5pcndpbkhhbGwobik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQoKS9ufX0saXJ3aW5IYWxsOmZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MDtuPmU7ZSsrKXQrPU1hdGgucmFuZG9tKCk7cmV0dXJuIHR9fX0sbG8uc2NhbGU9e307dmFyIHRzPXtmbG9vcjpfdCxjZWlsOl90fTtsby5zY2FsZS5saW5lYXI9ZnVuY3Rpb24oKXtyZXR1cm4gZWkoWzAsMV0sWzAsMV0sVHIsITEpfTt2YXIgZXM9e3M6MSxnOjEscDoxLHI6MSxlOjF9O2xvLnNjYWxlLmxvZz1mdW5jdGlvbigpe3JldHVybiBsaShsby5zY2FsZS5saW5lYXIoKS5kb21haW4oWzAsMV0pLDEwLCEwLFsxLDEwXSl9O3ZhciBycz1sby5mb3JtYXQoIi4wZSIpLHVzPXtmbG9vcjpmdW5jdGlvbihuKXtyZXR1cm4tTWF0aC5jZWlsKC1uKX0sY2VpbDpmdW5jdGlvbihuKXtyZXR1cm4tTWF0aC5mbG9vcigtbil9fTtsby5zY2FsZS5wb3c9ZnVuY3Rpb24oKXtyZXR1cm4gZmkobG8uc2NhbGUubGluZWFyKCksMSxbMCwxXSl9LGxvLnNjYWxlLnNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbG8uc2NhbGUucG93KCkuZXhwb25lbnQoLjUpfSxsby5zY2FsZS5vcmRpbmFsPWZ1bmN0aW9uKCl7cmV0dXJuIGdpKFtdLHt0OiJyYW5nZSIsYTpbW11dfSl9LGxvLnNjYWxlLmNhdGVnb3J5MTA9ZnVuY3Rpb24oKXtyZXR1cm4gbG8uc2NhbGUub3JkaW5hbCgpLnJhbmdlKGlzKX0sbG8uc2NhbGUuY2F0ZWdvcnkyMD1mdW5jdGlvbigpe3JldHVybiBsby5zY2FsZS5vcmRpbmFsKCkucmFuZ2Uob3MpfSxsby5zY2FsZS5jYXRlZ29yeTIwYj1mdW5jdGlvbigpe3JldHVybiBsby5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoYXMpfSxsby5zY2FsZS5jYXRlZ29yeTIwYz1mdW5jdGlvbigpe3JldHVybiBsby5zY2FsZS5vcmRpbmFsKCkucmFuZ2Uoc3MpfTt2YXIgaXM9WzIwNjIyNjAsMTY3NDQyMDYsMjkyNDU4OCwxNDAzNDcyOCw5NzI1ODg1LDkxOTcxMzEsMTQ5MDczMzAsODM1NTcxMSwxMjM2OTE4NiwxNTU2MTc1XS5tYXAoZ3QpLG9zPVsyMDYyMjYwLDExNDU0NDQwLDE2NzQ0MjA2LDE2NzU5NjcyLDI5MjQ1ODgsMTAwMTg2OTgsMTQwMzQ3MjgsMTY3NTA3NDIsOTcyNTg4NSwxMjk1NTg2MSw5MTk3MTMxLDEyODg1MTQwLDE0OTA3MzMwLDE2MjM0MTk0LDgzNTU3MTEsMTMwOTI4MDcsMTIzNjkxODYsMTQ0MDg1ODksMTU1NjE3NSwxMDQxMDcyNV0ubWFwKGd0KSxhcz1bMzc1MDc3Nyw1Mzk1NjE5LDcwNDA3MTksMTAyNjQyODYsNjUxOTA5Nyw5MjE2NTk0LDExOTE1MTE1LDEzNTU2NjM2LDkyMDI5OTMsMTI0MjY4MDksMTUxODY1MTQsMTUxOTA5MzIsODY2NjE2OSwxMTM1NjQ5MCwxNDA0OTY0MywxNTE3NzM3Miw4MDc3NjgzLDEwODM0MzI0LDEzNTI4NTA5LDE0NTg5NjU0XS5tYXAoZ3QpLHNzPVszMjQ0NzMzLDcwNTcxMTAsMTA0MDY2MjUsMTMwMzI0MzEsMTUwOTUwNTMsMTY2MTY3NjQsMTY2MjUyNTksMTY2MzQwMTgsMzI1MzA3Niw3NjUyNDcwLDEwNjA3MDAzLDEzMTAxNTA0LDc2OTUyODEsMTAzOTQzMTIsMTIzNjkzNzIsMTQzNDI4OTEsNjUxMzUwNyw5ODY4OTUwLDEyNDM0ODc3LDE0Mjc3MDgxXS5tYXAoZ3QpO2xvLnNjYWxlLnF1YW50aWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHBpKFtdLFtdKX0sbG8uc2NhbGUucXVhbnRpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdmkoMCwxLFswLDFdKX0sbG8uc2NhbGUudGhyZXNob2xkPWZ1bmN0aW9uKCl7cmV0dXJuIGRpKFsuNV0sWzAsMV0pfSxsby5zY2FsZS5pZGVudGl0eT1mdW5jdGlvbigpe3JldHVybiBtaShbMCwxXSl9LGxvLnN2Zz17fSxsby5zdmcuYXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpLGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbz1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKStjcyxhPXUuYXBwbHkodGhpcyxhcmd1bWVudHMpK2NzLHM9KG8+YSYmKHM9byxvPWEsYT1zKSxhLW8pLGM9SW8+cz8iMCI6IjEiLGw9TWF0aC5jb3MobyksZj1NYXRoLnNpbihvKSxoPU1hdGguY29zKGEpLGc9TWF0aC5zaW4oYSk7cmV0dXJuIHM+PWxzP24/Ik0wLCIraSsiQSIraSsiLCIraSsiIDAgMSwxIDAsIistaSsiQSIraSsiLCIraSsiIDAgMSwxIDAsIitpKyJNMCwiK24rIkEiK24rIiwiK24rIiAwIDEsMCAwLCIrLW4rIkEiK24rIiwiK24rIiAwIDEsMCAwLCIrbisiWiI6Ik0wLCIraSsiQSIraSsiLCIraSsiIDAgMSwxIDAsIistaSsiQSIraSsiLCIraSsiIDAgMSwxIDAsIitpKyJaIjpuPyJNIitpKmwrIiwiK2kqZisiQSIraSsiLCIraSsiIDAgIitjKyIsMSAiK2kqaCsiLCIraSpnKyJMIituKmgrIiwiK24qZysiQSIrbisiLCIrbisiIDAgIitjKyIsMCAiK24qbCsiLCIrbipmKyJaIjoiTSIraSpsKyIsIitpKmYrIkEiK2krIiwiK2krIiAwICIrYysiLDEgIitpKmgrIiwiK2kqZysiTDAsMCIrIloifXZhciB0PXlpLGU9eGkscj1NaSx1PV9pO3JldHVybiBuLmlubmVyUmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PU10KGUpLG4pOnR9LG4ub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9TXQodCksbik6ZX0sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPU10KHQpLG4pOnJ9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9TXQodCksbik6dX0sbi5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBuPSh0LmFwcGx5KHRoaXMsYXJndW1lbnRzKStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixpPShyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSt1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMitjcztyZXR1cm5bTWF0aC5jb3MoaSkqbixNYXRoLnNpbihpKSpuXX0sbn07dmFyIGNzPS1Wbyxscz1aby1Ybztsby5zdmcubGluZT1mdW5jdGlvbigpe3JldHVybiBiaShfdCl9O3ZhciBmcz1sby5tYXAoe2xpbmVhcjp3aSwibGluZWFyLWNsb3NlZCI6a2ksc3RlcDpTaSwic3RlcC1iZWZvcmUiOkNpLCJzdGVwLWFmdGVyIjpBaSxiYXNpczpxaSwiYmFzaXMtb3BlbiI6RGksImJhc2lzLWNsb3NlZCI6UmksYnVuZGxlOlBpLGNhcmRpbmFsOnppLCJjYXJkaW5hbC1vcGVuIjpOaSwiY2FyZGluYWwtY2xvc2VkIjpFaSxtb25vdG9uZTpZaX0pO2ZzLmZvckVhY2goZnVuY3Rpb24obix0KXt0LmtleT1uLHQuY2xvc2VkPS8tY2xvc2VkJC8udGVzdChuKX0pO3ZhciBocz1bMCwyLzMsMS8zLDBdLGdzPVswLDEvMywyLzMsMF0scHM9WzAsMS82LDIvMywxLzZdO2xvLnN2Zy5saW5lLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPWJpKElpKTtyZXR1cm4gbi5yYWRpdXM9bi54LGRlbGV0ZSBuLngsbi5hbmdsZT1uLnksZGVsZXRlIG4ueSxufSxDaS5yZXZlcnNlPUFpLEFpLnJldmVyc2U9Q2ksbG8uc3ZnLmFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gWmkoX3QpfSxsby5zdmcuYXJlYS5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj1aaShJaSk7cmV0dXJuIG4ucmFkaXVzPW4ueCxkZWxldGUgbi54LG4uaW5uZXJSYWRpdXM9bi54MCxkZWxldGUgbi54MCxuLm91dGVyUmFkaXVzPW4ueDEsZGVsZXRlIG4ueDEsbi5hbmdsZT1uLnksZGVsZXRlIG4ueSxuLnN0YXJ0QW5nbGU9bi55MCxkZWxldGUgbi55MCxuLmVuZEFuZ2xlPW4ueTEsZGVsZXRlIG4ueTEsbn0sbG8uc3ZnLmNob3JkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGEpe3ZhciBzPXQodGhpcyxpLG4sYSksYz10KHRoaXMsbyxuLGEpO3JldHVybiJNIitzLnAwK3Iocy5yLHMucDEscy5hMS1zLmEwKSsoZShzLGMpP3Uocy5yLHMucDEscy5yLHMucDApOnUocy5yLHMucDEsYy5yLGMucDApK3IoYy5yLGMucDEsYy5hMS1jLmEwKSt1KGMucixjLnAxLHMucixzLnAwKSkrIloifWZ1bmN0aW9uIHQobix0LGUscil7dmFyIHU9dC5jYWxsKG4sZSxyKSxpPWEuY2FsbChuLHUsciksbz1zLmNhbGwobix1LHIpK2NzLGw9Yy5jYWxsKG4sdSxyKStjcztyZXR1cm57cjppLGEwOm8sYTE6bCxwMDpbaSpNYXRoLmNvcyhvKSxpKk1hdGguc2luKG8pXSxwMTpbaSpNYXRoLmNvcyhsKSxpKk1hdGguc2luKGwpXX19ZnVuY3Rpb24gZShuLHQpe3JldHVybiBuLmEwPT10LmEwJiZuLmExPT10LmExfWZ1bmN0aW9uIHIobix0LGUpe3JldHVybiJBIituKyIsIituKyIgMCAiKyArKGU+SW8pKyIsMSAiK3R9ZnVuY3Rpb24gdShuLHQsZSxyKXtyZXR1cm4iUSAwLDAgIityfXZhciBpPVZpLG89WGksYT0kaSxzPU1pLGM9X2k7cmV0dXJuIG4ucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPU10KHQpLG4pOmF9LG4uc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPU10KHQpLG4pOml9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPU10KHQpLG4pOm99LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1NdCh0KSxuKTpzfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPU10KHQpLG4pOmN9LG59LGxvLnN2Zy5kaWFnb25hbD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXt2YXIgaT10LmNhbGwodGhpcyxuLHUpLG89ZS5jYWxsKHRoaXMsbix1KSxhPShpLnkrby55KS8yLHM9W2kse3g6aS54LHk6YX0se3g6by54LHk6YX0sb107cmV0dXJuIHM9cy5tYXAociksIk0iK3NbMF0rIkMiK3NbMV0rIiAiK3NbMl0rIiAiK3NbM119dmFyIHQ9VmksZT1YaSxyPUJpO3JldHVybiBuLnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1NdChlKSxuKTp0fSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1NdCh0KSxuKTplfSxuLnByb2plY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxufSxsby5zdmcuZGlhZ29uYWwucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49bG8uc3ZnLmRpYWdvbmFsKCksdD1CaSxlPW4ucHJvamVjdGlvbjtyZXR1cm4gbi5wcm9qZWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoV2kodD1uKSk6dH0sbn0sbG8uc3ZnLnN5bWJvbD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixyKXtyZXR1cm4odnMuZ2V0KHQuY2FsbCh0aGlzLG4scikpfHxLaSkoZS5jYWxsKHRoaXMsbixyKSl9dmFyIHQ9R2ksZT1KaTtyZXR1cm4gbi50eXBlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PU10KGUpLG4pOnR9LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1NdCh0KSxuKTplfSxufTt2YXIgdnM9bG8ubWFwKHtjaXJjbGU6S2ksY3Jvc3M6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vNSkvMjtyZXR1cm4iTSIrLTMqdCsiLCIrLXQrIkgiKy10KyJWIistMyp0KyJIIit0KyJWIistdCsiSCIrMyp0KyJWIit0KyJIIit0KyJWIiszKnQrIkgiKy10KyJWIit0KyJIIistMyp0KyJaIn0sZGlhbW9uZDpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi8oMip4cykpLGU9dCp4cztyZXR1cm4iTTAsIistdCsiTCIrZSsiLDAiKyIgMCwiK3QrIiAiKy1lKyIsMCIrIloifSxzcXVhcmU6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4pLzI7cmV0dXJuIk0iKy10KyIsIistdCsiTCIrdCsiLCIrLXQrIiAiK3QrIiwiK3QrIiAiKy10KyIsIit0KyJaIn0sInRyaWFuZ2xlLWRvd24iOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuL3lzKSxlPXQqeXMvMjtyZXR1cm4iTTAsIitlKyJMIit0KyIsIistZSsiICIrLXQrIiwiKy1lKyJaIn0sInRyaWFuZ2xlLXVwIjpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi95cyksZT10KnlzLzI7cmV0dXJuIk0wLCIrLWUrIkwiK3QrIiwiK2UrIiAiKy10KyIsIitlKyJaIn19KTtsby5zdmcuc3ltYm9sVHlwZXM9dnMua2V5cygpO3ZhciBkcyxtcyx5cz1NYXRoLnNxcnQoMykseHM9TWF0aC50YW4oMzAqQm8pLE1zPVtdLF9zPTA7TXMuY2FsbD1Sby5jYWxsLE1zLmVtcHR5PVJvLmVtcHR5LE1zLm5vZGU9Um8ubm9kZSxNcy5zaXplPVJvLnNpemUsbG8udHJhbnNpdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9kcz9uLnRyYW5zaXRpb24oKTpuOmpvLnRyYW5zaXRpb24oKX0sbG8udHJhbnNpdGlvbi5wcm90b3R5cGU9TXMsTXMuc2VsZWN0PWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PXRoaXMuaWQsaT1bXTtuPWIobik7Zm9yKHZhciBvPS0xLGE9dGhpcy5sZW5ndGg7KytvPGE7KXtpLnB1c2godD1bXSk7Zm9yKHZhciBzPXRoaXNbb10sYz0tMSxsPXMubGVuZ3RoOysrYzxsOykocj1zW2NdKSYmKGU9bi5jYWxsKHIsci5fX2RhdGFfXyxjLG8pKT8oIl9fZGF0YV9fImluIHImJihlLl9fZGF0YV9fPXIuX19kYXRhX18pLGVvKGUsYyx1LHIuX190cmFuc2l0aW9uX19bdV0pLHQucHVzaChlKSk6dC5wdXNoKG51bGwpfXJldHVybiBRaShpLHUpfSxNcy5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaSxvPXRoaXMuaWQsYT1bXTtuPXcobik7Zm9yKHZhciBzPS0xLGM9dGhpcy5sZW5ndGg7KytzPGM7KWZvcih2YXIgbD10aGlzW3NdLGY9LTEsaD1sLmxlbmd0aDsrK2Y8aDspaWYocj1sW2ZdKXtpPXIuX190cmFuc2l0aW9uX19bb10sZT1uLmNhbGwocixyLl9fZGF0YV9fLGYscyksYS5wdXNoKHQ9W10pO2Zvcih2YXIgZz0tMSxwPWUubGVuZ3RoOysrZzxwOykodT1lW2ddKSYmZW8odSxnLG8saSksdC5wdXNoKHUpfXJldHVybiBRaShhLG8pfSxNcy5maWx0ZXI9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9W107ImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPUQobikpO2Zvcih2YXIgaT0wLG89dGhpcy5sZW5ndGg7bz5pO2krKyl7dS5wdXNoKHQ9W10pO2Zvcih2YXIgZT10aGlzW2ldLGE9MCxzPWUubGVuZ3RoO3M+YTthKyspKHI9ZVthXSkmJm4uY2FsbChyLHIuX19kYXRhX18sYSxpKSYmdC5wdXNoKHIpfXJldHVybiBRaSh1LHRoaXMuaWQpfSxNcy50d2Vlbj1mdW5jdGlvbihuLHQpe3ZhciBlPXRoaXMuaWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj90aGlzLm5vZGUoKS5fX3RyYW5zaXRpb25fX1tlXS50d2Vlbi5nZXQobik6UCh0aGlzLG51bGw9PXQ/ZnVuY3Rpb24odCl7dC5fX3RyYW5zaXRpb25fX1tlXS50d2Vlbi5yZW1vdmUobil9OmZ1bmN0aW9uKHIpe3IuX190cmFuc2l0aW9uX19bZV0udHdlZW4uc2V0KG4sdCl9KX0sTXMuYXR0cj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZShhKX1mdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhhLnNwYWNlLGEubG9jYWwpfWZ1bmN0aW9uIHUobil7cmV0dXJuIG51bGw9PW4/ZToobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlKGEpO3JldHVybiBlIT09biYmKHQ9byhlLG4pLGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlKGEsdChuKSl9KX0pfWZ1bmN0aW9uIGkobil7cmV0dXJuIG51bGw9PW4/cjoobis9IiIsZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuZ2V0QXR0cmlidXRlTlMoYS5zcGFjZSxhLmxvY2FsKTtyZXR1cm4gZSE9PW4mJih0PW8oZSxuKSxmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKGEuc3BhY2UsYS5sb2NhbCx0KG4pKX0pfSl9aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodCBpbiBuKXRoaXMuYXR0cih0LG5bdF0pO3JldHVybiB0aGlzfXZhciBvPSJ0cmFuc2Zvcm0iPT1uP251OlRyLGE9bG8ubnMucXVhbGlmeShuKTtyZXR1cm4gbm8odGhpcywiYXR0ci4iK24sdCxhLmxvY2FsP2k6dSl9LE1zLmF0dHJUd2Vlbj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcj10LmNhbGwodGhpcyxuLGUsdGhpcy5nZXRBdHRyaWJ1dGUodSkpO3JldHVybiByJiZmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZSh1LHIobikpfX1mdW5jdGlvbiByKG4sZSl7dmFyIHI9dC5jYWxsKHRoaXMsbixlLHRoaXMuZ2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsKSk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlModS5zcGFjZSx1LmxvY2FsLHIobikpfX12YXIgdT1sby5ucy5xdWFsaWZ5KG4pO3JldHVybiB0aGlzLnR3ZWVuKCJhdHRyLiIrbix1LmxvY2FsP3I6ZSl9LE1zLnN0eWxlPWZ1bmN0aW9uKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiB1KHQpe3JldHVybiBudWxsPT10P3I6KHQrPSIiLGZ1bmN0aW9uKCl7dmFyIHIsdT12by5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKTtyZXR1cm4gdSE9PXQmJihyPVRyKHUsdCksZnVuY3Rpb24odCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHIodCksZSl9KX0pfXZhciBpPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5pKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+aSYmKHQ9IiIpO2ZvcihlIGluIG4pdGhpcy5zdHlsZShlLG5bZV0sdCk7cmV0dXJuIHRoaXN9ZT0iIn1yZXR1cm4gbm8odGhpcywic3R5bGUuIituLHQsdSl9LE1zLnN0eWxlVHdlZW49ZnVuY3Rpb24obix0LGUpe2Z1bmN0aW9uIHIocix1KXt2YXIgaT10LmNhbGwodGhpcyxyLHUsdm8uZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUobikpO3JldHVybiBpJiZmdW5jdGlvbih0KXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4saSh0KSxlKX19cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MyYmKGU9IiIpLHRoaXMudHdlZW4oInN0eWxlLiIrbixyKX0sTXMudGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gbm8odGhpcywidGV4dCIsbix0byl9LE1zLnJlbW92ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goImVuZC50cmFuc2l0aW9uIixmdW5jdGlvbigpe3ZhciBuO3RoaXMuX190cmFuc2l0aW9uX18uY291bnQ8MiYmKG49dGhpcy5wYXJlbnROb2RlKSYmbi5yZW1vdmVDaGlsZCh0aGlzKX0pfSxNcy5lYXNlPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKS5fX3RyYW5zaXRpb25fX1t0XS5lYXNlOigiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49bG8uZWFzZS5hcHBseShsbyxhcmd1bWVudHMpKSxQKHRoaXMsZnVuY3Rpb24oZSl7ZS5fX3RyYW5zaXRpb25fX1t0XS5lYXNlPW59KSl9LE1zLmRlbGF5PWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKS5fX3RyYW5zaXRpb25fX1t0XS5kZWxheTpQKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24oZSxyLHUpe2UuX190cmFuc2l0aW9uX19bdF0uZGVsYXk9K24uY2FsbChlLGUuX19kYXRhX18scix1KX06KG49K24sZnVuY3Rpb24oZSl7ZS5fX3RyYW5zaXRpb25fX1t0XS5kZWxheT1ufSkpfSxNcy5kdXJhdGlvbj1mdW5jdGlvbihuKXt2YXIgdD10aGlzLmlkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKCkuX190cmFuc2l0aW9uX19bdF0uZHVyYXRpb246UCh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKGUscix1KXtlLl9fdHJhbnNpdGlvbl9fW3RdLmR1cmF0aW9uPU1hdGgubWF4KDEsbi5jYWxsKGUsZS5fX2RhdGFfXyxyLHUpKX06KG49TWF0aC5tYXgoMSxuKSxmdW5jdGlvbihlKXtlLl9fdHJhbnNpdGlvbl9fW3RdLmR1cmF0aW9uPW59KSl9LE1zLmVhY2g9ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7dmFyIHI9bXMsdT1kcztkcz1lLFAodGhpcyxmdW5jdGlvbih0LHIsdSl7bXM9dC5fX3RyYW5zaXRpb25fX1tlXSxuLmNhbGwodCx0Ll9fZGF0YV9fLHIsdSl9KSxtcz1yLGRzPXV9ZWxzZSBQKHRoaXMsZnVuY3Rpb24ocil7dmFyIHU9ci5fX3RyYW5zaXRpb25fX1tlXTsodS5ldmVudHx8KHUuZXZlbnQ9bG8uZGlzcGF0Y2goInN0YXJ0IiwiZW5kIikpKS5vbihuLHQpfSk7cmV0dXJuIHRoaXN9LE1zLnRyYW5zaXRpb249ZnVuY3Rpb24oKXtmb3IodmFyIG4sdCxlLHIsdT10aGlzLmlkLGk9KytfcyxvPVtdLGE9MCxzPXRoaXMubGVuZ3RoO3M+YTthKyspe28ucHVzaChuPVtdKTtmb3IodmFyIHQ9dGhpc1thXSxjPTAsbD10Lmxlbmd0aDtsPmM7YysrKShlPXRbY10pJiYocj1PYmplY3QuY3JlYXRlKGUuX190cmFuc2l0aW9uX19bdV0pLHIuZGVsYXkrPXIuZHVyYXRpb24sZW8oZSxjLGkscikpLG4ucHVzaChlKX1yZXR1cm4gUWkobyxpKX0sbG8uc3ZnLmF4aXM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuLGM9bG8uc2VsZWN0KHRoaXMpLGw9dGhpcy5fX2NoYXJ0X198fGUsZj10aGlzLl9fY2hhcnRfXz1lLmNvcHkoKSxoPW51bGw9PXM/Zi50aWNrcz9mLnRpY2tzLmFwcGx5KGYsYSk6Zi5kb21haW4oKTpzLGc9bnVsbD09dD9mLnRpY2tGb3JtYXQ/Zi50aWNrRm9ybWF0LmFwcGx5KGYsYSk6X3Q6dCxwPWMuc2VsZWN0QWxsKCIudGljayIpLmRhdGEoaCxmKSx2PXAuZW50ZXIoKS5pbnNlcnQoImciLCIuZG9tYWluIikuYXR0cigiY2xhc3MiLCJ0aWNrIikuc3R5bGUoIm9wYWNpdHkiLFhvKSxkPWxvLnRyYW5zaXRpb24ocC5leGl0KCkpLnN0eWxlKCJvcGFjaXR5IixYbykucmVtb3ZlKCksbT1sby50cmFuc2l0aW9uKHAub3JkZXIoKSkuc3R5bGUoIm9wYWNpdHkiLDEpLHk9R3UoZikseD1jLnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoWzBdKSxNPSh4LmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJkb21haW4iKSxsby50cmFuc2l0aW9uKHgpKTt2LmFwcGVuZCgibGluZSIpLHYuYXBwZW5kKCJ0ZXh0Iik7dmFyIF89di5zZWxlY3QoImxpbmUiKSxiPW0uc2VsZWN0KCJsaW5lIiksdz1wLnNlbGVjdCgidGV4dCIpLnRleHQoZyksaz12LnNlbGVjdCgidGV4dCIpLFM9bS5zZWxlY3QoInRleHQiKTtzd2l0Y2gocil7Y2FzZSJib3R0b20iOm49cm8sXy5hdHRyKCJ5MiIsdSksay5hdHRyKCJ5IixNYXRoLm1heCh1LDApK28pLGIuYXR0cigieDIiLDApLmF0dHIoInkyIix1KSxTLmF0dHIoIngiLDApLmF0dHIoInkiLE1hdGgubWF4KHUsMCkrbyksdy5hdHRyKCJkeSIsIi43MWVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIiksTS5hdHRyKCJkIiwiTSIreVswXSsiLCIraSsiVjBIIit5WzFdKyJWIitpKTticmVhaztjYXNlInRvcCI6bj1ybyxfLmF0dHIoInkyIiwtdSksay5hdHRyKCJ5IiwtKE1hdGgubWF4KHUsMCkrbykpLGIuYXR0cigieDIiLDApLmF0dHIoInkyIiwtdSksUy5hdHRyKCJ4IiwwKS5hdHRyKCJ5IiwtKE1hdGgubWF4KHUsMCkrbykpLHcuYXR0cigiZHkiLCIwZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSxNLmF0dHIoImQiLCJNIit5WzBdKyIsIistaSsiVjBIIit5WzFdKyJWIistaSk7YnJlYWs7Y2FzZSJsZWZ0IjpuPXVvLF8uYXR0cigieDIiLC11KSxrLmF0dHIoIngiLC0oTWF0aC5tYXgodSwwKStvKSksYi5hdHRyKCJ4MiIsLXUpLmF0dHIoInkyIiwwKSxTLmF0dHIoIngiLC0oTWF0aC5tYXgodSwwKStvKSkuYXR0cigieSIsMCksdy5hdHRyKCJkeSIsIi4zMmVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwiZW5kIiksTS5hdHRyKCJkIiwiTSIrLWkrIiwiK3lbMF0rIkgwViIreVsxXSsiSCIrLWkpO2JyZWFrO2Nhc2UicmlnaHQiOm49dW8sXy5hdHRyKCJ4MiIsdSksay5hdHRyKCJ4IixNYXRoLm1heCh1LDApK28pLGIuYXR0cigieDIiLHUpLmF0dHIoInkyIiwwKSxTLmF0dHIoIngiLE1hdGgubWF4KHUsMCkrbykuYXR0cigieSIsMCksdy5hdHRyKCJkeSIsIi4zMmVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwic3RhcnQiKSxNLmF0dHIoImQiLCJNIitpKyIsIit5WzBdKyJIMFYiK3lbMV0rIkgiK2kpfWlmKGYucmFuZ2VCYW5kKXt2YXIgQz1mLEE9Qy5yYW5nZUJhbmQoKS8yO2w9Zj1mdW5jdGlvbihuKXtyZXR1cm4gQyhuKStBfX1lbHNlIGwucmFuZ2VCYW5kP2w9ZjpkLmNhbGwobixmKTt2LmNhbGwobixsKSxtLmNhbGwobixmKX0pfXZhciB0LGU9bG8uc2NhbGUubGluZWFyKCkscj1icyx1PTYsaT02LG89MyxhPVsxMF0scz1udWxsO3JldHVybiBuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5vcmllbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCBpbiB3cz90KyIiOmJzLG4pOnJ9LG4udGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1hcmd1bWVudHMsbik6YX0sbi50aWNrVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsbik6c30sbi50aWNrRm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi50aWNrU2l6ZT1mdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoO3JldHVybiBlPyh1PSt0LGk9K2FyZ3VtZW50c1tlLTFdLG4pOnV9LG4uaW5uZXJUaWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxuKTp1fSxuLm91dGVyVGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3Qsbik6aX0sbi50aWNrUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxuKTpvfSxuLnRpY2tTdWJkaXZpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCYmbn0sbn07dmFyIGJzPSJib3R0b20iLHdzPXt0b3A6MSxyaWdodDoxLGJvdHRvbToxLGxlZnQ6MX07bG8uc3ZnLmJydXNoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihpKXtpLmVhY2goZnVuY3Rpb24oKXt2YXIgaT1sby5zZWxlY3QodGhpcykuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKS5vbigibW91c2Vkb3duLmJydXNoIix1KS5vbigidG91Y2hzdGFydC5icnVzaCIsdSksbz1pLnNlbGVjdEFsbCgiLmJhY2tncm91bmQiKS5kYXRhKFswXSk7by5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiYmFja2dyb3VuZCIpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikuc3R5bGUoImN1cnNvciIsImNyb3NzaGFpciIpLGkuc2VsZWN0QWxsKCIuZXh0ZW50IikuZGF0YShbMF0pLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJleHRlbnQiKS5zdHlsZSgiY3Vyc29yIiwibW92ZSIpO3ZhciBhPWkuc2VsZWN0QWxsKCIucmVzaXplIikuZGF0YShwLF90KTthLmV4aXQoKS5yZW1vdmUoKSxhLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLGZ1bmN0aW9uKG4pe3JldHVybiJyZXNpemUgIitufSkuc3R5bGUoImN1cnNvciIsZnVuY3Rpb24obil7cmV0dXJuIGtzW25dfSkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsZnVuY3Rpb24obil7cmV0dXJuL1tld10kLy50ZXN0KG4pPy0zOm51bGx9KS5hdHRyKCJ5IixmdW5jdGlvbihuKXtyZXR1cm4vXltuc10vLnRlc3Qobik/LTM6bnVsbH0pLmF0dHIoIndpZHRoIiw2KS5hdHRyKCJoZWlnaHQiLDYpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIiksYS5zdHlsZSgiZGlzcGxheSIsbi5lbXB0eSgpPyJub25lIjpudWxsKTt2YXIgbCxmPWxvLnRyYW5zaXRpb24oaSksaD1sby50cmFuc2l0aW9uKG8pO3MmJihsPUd1KHMpLGguYXR0cigieCIsbFswXSkuYXR0cigid2lkdGgiLGxbMV0tbFswXSksZShmKSksYyYmKGw9R3UoYyksaC5hdHRyKCJ5IixsWzBdKS5hdHRyKCJoZWlnaHQiLGxbMV0tbFswXSkscihmKSksdChmKX0pfWZ1bmN0aW9uIHQobil7bi5zZWxlY3RBbGwoIi5yZXNpemUiKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3JldHVybiJ0cmFuc2xhdGUoIitsWysvZSQvLnRlc3QobildKyIsIitmWysvXnMvLnRlc3QobildKyIpIn0pfWZ1bmN0aW9uIGUobil7bi5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ4IixsWzBdKSxuLnNlbGVjdEFsbCgiLmV4dGVudCwubj5yZWN0LC5zPnJlY3QiKS5hdHRyKCJ3aWR0aCIsbFsxXS1sWzBdKX1mdW5jdGlvbiByKG4pe24uc2VsZWN0KCIuZXh0ZW50IikuYXR0cigieSIsZlswXSksbi5zZWxlY3RBbGwoIi5leHRlbnQsLmU+cmVjdCwudz5yZWN0IikuYXR0cigiaGVpZ2h0IixmWzFdLWZbMF0pfWZ1bmN0aW9uIHUoKXtmdW5jdGlvbiB1KCl7MzI9PWxvLmV2ZW50LmtleUNvZGUmJihOfHwoeD1udWxsLHpbMF0tPWxbMV0selsxXS09ZlsxXSxOPTIpLHkoKSl9ZnVuY3Rpb24gcCgpezMyPT1sby5ldmVudC5rZXlDb2RlJiYyPT1OJiYoelswXSs9bFsxXSx6WzFdKz1mWzFdLE49MCx5KCkpfWZ1bmN0aW9uIHYoKXt2YXIgbj1sby5tb3VzZShfKSx1PSExO00mJihuWzBdKz1NWzBdLG5bMV0rPU1bMV0pLE58fChsby5ldmVudC5hbHRLZXk/KHh8fCh4PVsobFswXStsWzFdKS8yLChmWzBdK2ZbMV0pLzJdKSx6WzBdPWxbKyhuWzBdPHhbMF0pXSx6WzFdPWZbKyhuWzFdPHhbMV0pXSk6eD1udWxsKSxDJiZkKG4scywwKSYmKGUoayksdT0hMCksQSYmZChuLGMsMSkmJihyKGspLHU9ITApLHUmJih0KGspLHcoe3R5cGU6ImJydXNoIixtb2RlOk4/Im1vdmUiOiJyZXNpemUifSkpfWZ1bmN0aW9uIGQobix0LGUpe3ZhciByLHUsYT1HdSh0KSxzPWFbMF0sYz1hWzFdLHA9eltlXSx2PWU/ZjpsLGQ9dlsxXS12WzBdO3JldHVybiBOJiYocy09cCxjLT1kK3ApLHI9KGU/ZzpoKT9NYXRoLm1heChzLE1hdGgubWluKGMsbltlXSkpOm5bZV0sTj91PShyKz1wKStkOih4JiYocD1NYXRoLm1heChzLE1hdGgubWluKGMsMip4W2VdLXIpKSkscj5wPyh1PXIscj1wKTp1PXApLHZbMF0hPXJ8fHZbMV0hPXU/KGU/bz1udWxsOmk9bnVsbCx2WzBdPXIsdlsxXT11LCEwKTp2b2lkIDB9ZnVuY3Rpb24gbSgpe3YoKSxrLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IixuLmVtcHR5KCk/Im5vbmUiOm51bGwpLGxvLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLG51bGwpLFQub24oIm1vdXNlbW92ZS5icnVzaCIsbnVsbCkub24oIm1vdXNldXAuYnJ1c2giLG51bGwpLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLG51bGwpLm9uKCJ0b3VjaGVuZC5icnVzaCIsbnVsbCkub24oImtleWRvd24uYnJ1c2giLG51bGwpLm9uKCJrZXl1cC5icnVzaCIsbnVsbCksRSgpLHcoe3R5cGU6ImJydXNoZW5kIn0pfXZhciB4LE0sXz10aGlzLGI9bG8uc2VsZWN0KGxvLmV2ZW50LnRhcmdldCksdz1hLm9mKF8sYXJndW1lbnRzKSxrPWxvLnNlbGVjdChfKSxTPWIuZGF0dW0oKSxDPSEvXihufHMpJC8udGVzdChTKSYmcyxBPSEvXihlfHcpJC8udGVzdChTKSYmYyxOPWIuY2xhc3NlZCgiZXh0ZW50IiksRT1JKCksej1sby5tb3VzZShfKSxUPWxvLnNlbGVjdCh2bykub24oImtleWRvd24uYnJ1c2giLHUpLm9uKCJrZXl1cC5icnVzaCIscCk7CmlmKGxvLmV2ZW50LmNoYW5nZWRUb3VjaGVzP1Qub24oInRvdWNobW92ZS5icnVzaCIsdikub24oInRvdWNoZW5kLmJydXNoIixtKTpULm9uKCJtb3VzZW1vdmUuYnJ1c2giLHYpLm9uKCJtb3VzZXVwLmJydXNoIixtKSxrLmludGVycnVwdCgpLnNlbGVjdEFsbCgiKiIpLmludGVycnVwdCgpLE4pelswXT1sWzBdLXpbMF0selsxXT1mWzBdLXpbMV07ZWxzZSBpZihTKXt2YXIgTD0rL3ckLy50ZXN0KFMpLHE9Ky9ebi8udGVzdChTKTtNPVtsWzEtTF0telswXSxmWzEtcV0telsxXV0selswXT1sW0xdLHpbMV09ZltxXX1lbHNlIGxvLmV2ZW50LmFsdEtleSYmKHg9ei5zbGljZSgpKTtrLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsbnVsbCksbG8uc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsYi5zdHlsZSgiY3Vyc29yIikpLHcoe3R5cGU6ImJydXNoc3RhcnQifSksdigpfXZhciBpLG8sYT1NKG4sImJydXNoc3RhcnQiLCJicnVzaCIsImJydXNoZW5kIikscz1udWxsLGM9bnVsbCxsPVswLDBdLGY9WzAsMF0saD0hMCxnPSEwLHA9U3NbMF07cmV0dXJuIG4uZXZlbnQ9ZnVuY3Rpb24obil7bi5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49YS5vZih0aGlzLGFyZ3VtZW50cyksdD17eDpsLHk6ZixpOmksajpvfSxlPXRoaXMuX19jaGFydF9ffHx0O3RoaXMuX19jaGFydF9fPXQsZHM/bG8uc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKS5lYWNoKCJzdGFydC5icnVzaCIsZnVuY3Rpb24oKXtpPWUuaSxvPWUuaixsPWUueCxmPWUueSxuKHt0eXBlOiJicnVzaHN0YXJ0In0pfSkudHdlZW4oImJydXNoOmJydXNoIixmdW5jdGlvbigpe3ZhciBlPUxyKGwsdC54KSxyPUxyKGYsdC55KTtyZXR1cm4gaT1vPW51bGwsZnVuY3Rpb24odSl7bD10Lng9ZSh1KSxmPXQueT1yKHUpLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSl9fSkuZWFjaCgiZW5kLmJydXNoIixmdW5jdGlvbigpe2k9dC5pLG89dC5qLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSksbih7dHlwZToiYnJ1c2hlbmQifSl9KToobih7dHlwZToiYnJ1c2hzdGFydCJ9KSxuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLG4oe3R5cGU6ImJydXNoZW5kIn0pKX0pfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9dCxwPVNzWyFzPDwxfCFjXSxuKTpzfSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9dCxwPVNzWyFzPDwxfCFjXSxuKTpjfSxuLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzJiZjPyhoPSEhdFswXSxnPSEhdFsxXSk6cz9oPSEhdDpjJiYoZz0hIXQpLG4pOnMmJmM/W2gsZ106cz9oOmM/ZzpudWxsfSxuLmV4dGVudD1mdW5jdGlvbih0KXt2YXIgZSxyLHUsYSxoO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzJiYoZT10WzBdLHI9dFsxXSxjJiYoZT1lWzBdLHI9clswXSksaT1bZSxyXSxzLmludmVydCYmKGU9cyhlKSxyPXMocikpLGU+ciYmKGg9ZSxlPXIscj1oKSwoZSE9bFswXXx8ciE9bFsxXSkmJihsPVtlLHJdKSksYyYmKHU9dFswXSxhPXRbMV0scyYmKHU9dVsxXSxhPWFbMV0pLG89W3UsYV0sYy5pbnZlcnQmJih1PWModSksYT1jKGEpKSx1PmEmJihoPXUsdT1hLGE9aCksKHUhPWZbMF18fGEhPWZbMV0pJiYoZj1bdSxhXSkpLG4pOihzJiYoaT8oZT1pWzBdLHI9aVsxXSk6KGU9bFswXSxyPWxbMV0scy5pbnZlcnQmJihlPXMuaW52ZXJ0KGUpLHI9cy5pbnZlcnQocikpLGU+ciYmKGg9ZSxlPXIscj1oKSkpLGMmJihvPyh1PW9bMF0sYT1vWzFdKToodT1mWzBdLGE9ZlsxXSxjLmludmVydCYmKHU9Yy5pbnZlcnQodSksYT1jLmludmVydChhKSksdT5hJiYoaD11LHU9YSxhPWgpKSkscyYmYz9bW2UsdV0sW3IsYV1dOnM/W2Uscl06YyYmW3UsYV0pfSxuLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIG4uZW1wdHkoKXx8KGw9WzAsMF0sZj1bMCwwXSxpPW89bnVsbCksbn0sbi5lbXB0eT1mdW5jdGlvbigpe3JldHVybiEhcyYmbFswXT09bFsxXXx8ISFjJiZmWzBdPT1mWzFdfSxsby5yZWJpbmQobixhLCJvbiIpfTt2YXIga3M9e246Im5zLXJlc2l6ZSIsZToiZXctcmVzaXplIixzOiJucy1yZXNpemUiLHc6ImV3LXJlc2l6ZSIsbnc6Im53c2UtcmVzaXplIixuZToibmVzdy1yZXNpemUiLHNlOiJud3NlLXJlc2l6ZSIsc3c6Im5lc3ctcmVzaXplIn0sU3M9W1sibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0sWyJlIiwidyJdLFsibiIsInMiXSxbXV0sQ3M9TWEuZm9ybWF0PUNhLnRpbWVGb3JtYXQsQXM9Q3MudXRjLE5zPUFzKCIlWS0lbS0lZFQlSDolTTolUy4lTFoiKTtDcy5pc289RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcmJituZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIik/aW86TnMsaW8ucGFyc2U9ZnVuY3Rpb24obil7dmFyIHQ9bmV3IERhdGUobik7cmV0dXJuIGlzTmFOKHQpP251bGw6dH0saW8udG9TdHJpbmc9TnMudG9TdHJpbmcsTWEuc2Vjb25kPXF0KGZ1bmN0aW9uKG4pe3JldHVybiBuZXcgX2EoMWUzKk1hdGguZmxvb3Iobi8xZTMpKX0sZnVuY3Rpb24obix0KXtuLnNldFRpbWUobi5nZXRUaW1lKCkrMWUzKk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRTZWNvbmRzKCl9KSxNYS5zZWNvbmRzPU1hLnNlY29uZC5yYW5nZSxNYS5zZWNvbmRzLnV0Yz1NYS5zZWNvbmQudXRjLnJhbmdlLE1hLm1pbnV0ZT1xdChmdW5jdGlvbihuKXtyZXR1cm4gbmV3IF9hKDZlNCpNYXRoLmZsb29yKG4vNmU0KSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzZlNCpNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWludXRlcygpfSksTWEubWludXRlcz1NYS5taW51dGUucmFuZ2UsTWEubWludXRlcy51dGM9TWEubWludXRlLnV0Yy5yYW5nZSxNYS5ob3VyPXF0KGZ1bmN0aW9uKG4pe3ZhciB0PW4uZ2V0VGltZXpvbmVPZmZzZXQoKS82MDtyZXR1cm4gbmV3IF9hKDM2ZTUqKE1hdGguZmxvb3Iobi8zNmU1LXQpK3QpKX0sZnVuY3Rpb24obix0KXtuLnNldFRpbWUobi5nZXRUaW1lKCkrMzZlNSpNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0SG91cnMoKX0pLE1hLmhvdXJzPU1hLmhvdXIucmFuZ2UsTWEuaG91cnMudXRjPU1hLmhvdXIudXRjLnJhbmdlLE1hLm1vbnRoPXF0KGZ1bmN0aW9uKG4pe3JldHVybiBuPU1hLmRheShuKSxuLnNldERhdGUoMSksbn0sZnVuY3Rpb24obix0KXtuLnNldE1vbnRoKG4uZ2V0TW9udGgoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TW9udGgoKX0pLE1hLm1vbnRocz1NYS5tb250aC5yYW5nZSxNYS5tb250aHMudXRjPU1hLm1vbnRoLnV0Yy5yYW5nZTt2YXIgRXM9WzFlMyw1ZTMsMTVlMywzZTQsNmU0LDNlNSw5ZTUsMThlNSwzNmU1LDEwOGU1LDIxNmU1LDQzMmU1LDg2NGU1LDE3MjhlNSw2MDQ4ZTUsMjU5MmU2LDc3NzZlNiwzMTUzNmU2XSx6cz1bW01hLnNlY29uZCwxXSxbTWEuc2Vjb25kLDVdLFtNYS5zZWNvbmQsMTVdLFtNYS5zZWNvbmQsMzBdLFtNYS5taW51dGUsMV0sW01hLm1pbnV0ZSw1XSxbTWEubWludXRlLDE1XSxbTWEubWludXRlLDMwXSxbTWEuaG91ciwxXSxbTWEuaG91ciwzXSxbTWEuaG91ciw2XSxbTWEuaG91ciwxMl0sW01hLmRheSwxXSxbTWEuZGF5LDJdLFtNYS53ZWVrLDFdLFtNYS5tb250aCwxXSxbTWEubW9udGgsM10sW01hLnllYXIsMV1dLFRzPUNzLm11bHRpKFtbIi4lTCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWlsbGlzZWNvbmRzKCl9XSxbIjolUyIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0U2Vjb25kcygpfV0sWyIlSTolTSIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TWludXRlcygpfV0sWyIlSSAlcCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0SG91cnMoKX1dLFsiJWEgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpJiYxIT1uLmdldERhdGUoKX1dLFsiJWIgJWQiLGZ1bmN0aW9uKG4pe3JldHVybiAxIT1uLmdldERhdGUoKX1dLFsiJUIiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1vbnRoKCl9XSxbIiVZIix4ZV1dKSxMcz17cmFuZ2U6ZnVuY3Rpb24obix0LGUpe3JldHVybiBsby5yYW5nZShNYXRoLmNlaWwobi9lKSplLCt0LGUpLm1hcChhbyl9LGZsb29yOl90LGNlaWw6X3R9O3pzLnllYXI9TWEueWVhcixNYS5zY2FsZT1mdW5jdGlvbigpe3JldHVybiBvbyhsby5zY2FsZS5saW5lYXIoKSx6cyxUcyl9O3ZhciBxcz16cy5tYXAoZnVuY3Rpb24obil7cmV0dXJuW25bMF0udXRjLG5bMV1dfSksRHM9QXMubXVsdGkoW1siLiVMIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNaWxsaXNlY29uZHMoKX1dLFsiOiVTIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENTZWNvbmRzKCl9XSxbIiVJOiVNIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNaW51dGVzKCl9XSxbIiVJICVwIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENIb3VycygpfV0sWyIlYSAlZCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDRGF5KCkmJjEhPW4uZ2V0VVRDRGF0ZSgpfV0sWyIlYiAlZCIsZnVuY3Rpb24obil7cmV0dXJuIDEhPW4uZ2V0VVRDRGF0ZSgpfV0sWyIlQiIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTW9udGgoKX1dLFsiJVkiLHhlXV0pO3FzLnllYXI9TWEueWVhci51dGMsTWEuc2NhbGUudXRjPWZ1bmN0aW9uKCl7cmV0dXJuIG9vKGxvLnNjYWxlLmxpbmVhcigpLHFzLERzKX0sbG8udGV4dD1idChmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXNwb25zZVRleHR9KSxsby5qc29uPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHd0KG4sImFwcGxpY2F0aW9uL2pzb24iLHNvLHQpfSxsby5odG1sPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHd0KG4sInRleHQvaHRtbCIsY28sdCl9LGxvLnhtbD1idChmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXNwb25zZVhNTH0pLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGxvKToib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHMmJihtb2R1bGUuZXhwb3J0cz1sbyksdGhpcy5kMz1sb30oKTs="></script>
<script src="data:application/x-javascript;base64,Ly8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjEwLjAKKGZ1bmN0aW9uKCkgewogIHZhciByYW5kLCB1bWQsCiAgICBzbGljZSA9IFtdLnNsaWNlOwoKICByYW5kID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gKChNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KSkgKyAiMDAwMDAwMDAwMDAwMDAwMDAiKS5yZXBsYWNlKC9bXmEtel0rL2csICIiKS5zbGljZSgwLCA1KTsKICB9OwoKICB1bWQgPSBmdW5jdGlvbihmYWN0b3J5KSB7CiAgICBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKSB7CiAgICAgIHJldHVybiBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKICAgIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7CiAgICAgIHJldHVybiBkZWZpbmUoW10sIGZhY3RvcnkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHRoaXMudGV4dHVyZXMgPSBmYWN0b3J5KCk7CiAgICB9CiAgfTsKCiAgdW1kKGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHsKICAgICAgY2lyY2xlczogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGJhY2tncm91bmQsIGNpcmNsZXMsIGNvbXBsZW1lbnQsIGZpbGwsIGlkLCByYWRpdXMsIHNpemUsIHN0cm9rZSwgc3Ryb2tlV2lkdGg7CiAgICAgICAgc2l6ZSA9IDIwOwogICAgICAgIGJhY2tncm91bmQgPSAiIjsKICAgICAgICByYWRpdXMgPSAyOwogICAgICAgIGNvbXBsZW1lbnQgPSBmYWxzZTsKICAgICAgICBmaWxsID0gIiMzNDM0MzQiOwogICAgICAgIHN0cm9rZSA9ICIjMzQzNDM0IjsKICAgICAgICBzdHJva2VXaWR0aCA9IDA7CiAgICAgICAgaWQgPSByYW5kKCk7CiAgICAgICAgY2lyY2xlcyA9IGZ1bmN0aW9uKHNlbCkgewogICAgICAgICAgdmFyIGNvcm5lciwgZywgaSwgbGVuLCByZWYsIHJlc3VsdHM7CiAgICAgICAgICBnID0gc2VsLmFwcGVuZCgiZGVmcyIpLmFwcGVuZCgicGF0dGVybiIpLmF0dHIoImlkIiwgaWQpLmF0dHIoInBhdHRlcm5Vbml0cyIsICJ1c2VyU3BhY2VPblVzZSIpLmF0dHIoIndpZHRoIiwgc2l6ZSkuYXR0cigiaGVpZ2h0Iiwgc2l6ZSk7CiAgICAgICAgICBpZiAoYmFja2dyb3VuZCkgewogICAgICAgICAgICBnLmFwcGVuZCgicmVjdCIpLmF0dHIoIndpZHRoIiwgc2l6ZSkuYXR0cigiaGVpZ2h0Iiwgc2l6ZSkuYXR0cigiZmlsbCIsIGJhY2tncm91bmQpOwogICAgICAgICAgfQogICAgICAgICAgZy5hcHBlbmQoImNpcmNsZSIpLmF0dHIoImN4Iiwgc2l6ZSAvIDIpLmF0dHIoImN5Iiwgc2l6ZSAvIDIpLmF0dHIoInIiLCByYWRpdXMpLmF0dHIoImZpbGwiLCBmaWxsKS5hdHRyKCJzdHJva2UiLCBzdHJva2UpLmF0dHIoInN0cm9rZS13aWR0aCIsIHN0cm9rZVdpZHRoKTsKICAgICAgICAgIGlmIChjb21wbGVtZW50KSB7CiAgICAgICAgICAgIHJlZiA9IFtbMCwgMF0sIFswLCBzaXplXSwgW3NpemUsIDBdLCBbc2l6ZSwgc2l6ZV1dOwogICAgICAgICAgICByZXN1bHRzID0gW107CiAgICAgICAgICAgIGZvciAoaSA9IDAsIGxlbiA9IHJlZi5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgIGNvcm5lciA9IHJlZltpXTsKICAgICAgICAgICAgICByZXN1bHRzLnB1c2goZy5hcHBlbmQoImNpcmNsZSIpLmF0dHIoImN4IiwgY29ybmVyWzBdKS5hdHRyKCJjeSIsIGNvcm5lclsxXSkuYXR0cigiciIsIHJhZGl1cykuYXR0cigiZmlsbCIsIGZpbGwpLmF0dHIoInN0cm9rZSIsIHN0cm9rZSkuYXR0cigic3Ryb2tlLXdpZHRoIiwgc3Ryb2tlV2lkdGgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGNpcmNsZXMuaGVhdmllciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByYWRpdXMgPSByYWRpdXMgKiAyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmFkaXVzID0gXyA/IHJhZGl1cyAqIDIgKiBfIDogcmFkaXVzICogMjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjaXJjbGVzOwogICAgICAgIH07CiAgICAgICAgY2lyY2xlcy5saWdodGVyID0gZnVuY3Rpb24oXykgewogICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJhZGl1cyA9IHJhZGl1cyAvIDI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByYWRpdXMgPSBfID8gcmFkaXVzIC8gKDIgKiBfKSA6IHJhZGl1cyAvIDI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gY2lyY2xlczsKICAgICAgICB9OwogICAgICAgIGNpcmNsZXMudGhpbm5lciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICBzaXplID0gc2l6ZSAqIDI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzaXplID0gXyA/IHNpemUgKiAyICogXyA6IHNpemUgKiAyOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGNpcmNsZXM7CiAgICAgICAgfTsKICAgICAgICBjaXJjbGVzLnRoaWNrZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgc2l6ZSA9IHNpemUgLyAyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2l6ZSA9IF8gPyBzaXplIC8gKDIgKiBfKSA6IHNpemUgLyAyOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGNpcmNsZXM7CiAgICAgICAgfTsKICAgICAgICBjaXJjbGVzLmJhY2tncm91bmQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgICBiYWNrZ3JvdW5kID0gXzsKICAgICAgICAgIHJldHVybiBjaXJjbGVzOwogICAgICAgIH07CiAgICAgICAgY2lyY2xlcy5zaXplID0gZnVuY3Rpb24oXykgewogICAgICAgICAgc2l6ZSA9IF87CiAgICAgICAgICByZXR1cm4gY2lyY2xlczsKICAgICAgICB9OwogICAgICAgIGNpcmNsZXMuY29tcGxlbWVudCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29tcGxlbWVudCA9IHRydWU7CiAgICAgICAgICByZXR1cm4gY2lyY2xlczsKICAgICAgICB9OwogICAgICAgIGNpcmNsZXMucmFkaXVzID0gZnVuY3Rpb24oXykgewogICAgICAgICAgcmFkaXVzID0gXzsKICAgICAgICAgIHJldHVybiBjaXJjbGVzOwogICAgICAgIH07CiAgICAgICAgY2lyY2xlcy5maWxsID0gZnVuY3Rpb24oXykgewogICAgICAgICAgZmlsbCA9IF87CiAgICAgICAgICByZXR1cm4gY2lyY2xlczsKICAgICAgICB9OwogICAgICAgIGNpcmNsZXMuc3Ryb2tlID0gZnVuY3Rpb24oXykgewogICAgICAgICAgc3Ryb2tlID0gXzsKICAgICAgICAgIHJldHVybiBjaXJjbGVzOwogICAgICAgIH07CiAgICAgICAgY2lyY2xlcy5zdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICAgIHN0cm9rZVdpZHRoID0gXzsKICAgICAgICAgIHJldHVybiBjaXJjbGVzOwogICAgICAgIH07CiAgICAgICAgY2lyY2xlcy5pZCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gaWQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZCA9IF87CiAgICAgICAgICAgIHJldHVybiBjaXJjbGVzOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgY2lyY2xlcy51cmwgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAidXJsKCMiICsgaWQgKyAiKSI7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gY2lyY2xlczsKICAgICAgfSwKICAgICAgbGluZXM6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBiYWNrZ3JvdW5kLCBpZCwgbGluZXMsIG9yaWVudGF0aW9uLCBwYXRoLCBzaGFwZVJlbmRlcmluZywgc2l6ZSwgc3Ryb2tlLCBzdHJva2VXaWR0aDsKICAgICAgICBzaXplID0gMjA7CiAgICAgICAgc3Ryb2tlV2lkdGggPSAyOwogICAgICAgIHN0cm9rZSA9ICIjMzQzNDM0IjsKICAgICAgICBpZCA9IHJhbmQoKTsKICAgICAgICBiYWNrZ3JvdW5kID0gIiI7CiAgICAgICAgb3JpZW50YXRpb24gPSBbImRpYWdvbmFsIl07CiAgICAgICAgc2hhcGVSZW5kZXJpbmcgPSAiYXV0byI7CiAgICAgICAgcGF0aCA9IGZ1bmN0aW9uKG9yaWVudGF0aW9uKSB7CiAgICAgICAgICBzd2l0Y2ggKG9yaWVudGF0aW9uKSB7CiAgICAgICAgICAgIGNhc2UgIjAvOCI6CiAgICAgICAgICAgICAgcmV0dXJuIChmdW5jdGlvbihzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIk0gIiArIChzIC8gMikgKyAiLCAwIGwgMCwgIiArIHM7CiAgICAgICAgICAgICAgfSkoc2l6ZSk7CiAgICAgICAgICAgIGNhc2UgInZlcnRpY2FsIjoKICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiTSAiICsgKHMgLyAyKSArICIsIDAgbCAwLCAiICsgczsKICAgICAgICAgICAgICB9KShzaXplKTsKICAgICAgICAgICAgY2FzZSAiMS84IjoKICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiTSAiICsgKHMgLyA0KSArICIsMCBsICIgKyAocyAvIDIpICsgIiwiICsgcyArICIgTSAiICsgKC1zIC8gNCkgKyAiLDAgbCAiICsgKHMgLyAyKSArICIsIiArIHMgKyAiXG5NICIgKyAocyAqIDMgLyA0KSArICIsMCBsICIgKyAocyAvIDIpICsgIiwiICsgczsKICAgICAgICAgICAgICB9KShzaXplKTsKICAgICAgICAgICAgY2FzZSAiMi84IjoKICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiTSAwLCIgKyBzICsgIiBsICIgKyBzICsgIiwiICsgKC1zKSArICIgTSAiICsgKC1zIC8gNCkgKyAiLCIgKyAocyAvIDQpICsgIiBsICIgKyAocyAvIDIpICsgIiwiICsgKC1zIC8gMikgKyAiXG5NICIgKyAoMyAvIDQgKiBzKSArICIsIiArICg1IC8gNCAqIHMpICsgIiBsICIgKyAocyAvIDIpICsgIiwiICsgKC1zIC8gMik7CiAgICAgICAgICAgICAgfSkoc2l6ZSk7CiAgICAgICAgICAgIGNhc2UgImRpYWdvbmFsIjoKICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiTSAwLCIgKyBzICsgIiBsICIgKyBzICsgIiwiICsgKC1zKSArICIgTSAiICsgKC1zIC8gNCkgKyAiLCIgKyAocyAvIDQpICsgIiBsICIgKyAocyAvIDIpICsgIiwiICsgKC1zIC8gMikgKyAiXG5NICIgKyAoMyAvIDQgKiBzKSArICIsIiArICg1IC8gNCAqIHMpICsgIiBsICIgKyAocyAvIDIpICsgIiwiICsgKC1zIC8gMik7CiAgICAgICAgICAgICAgfSkoc2l6ZSk7CiAgICAgICAgICAgIGNhc2UgIjMvOCI6CiAgICAgICAgICAgICAgcmV0dXJuIChmdW5jdGlvbihzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIk0gMCwiICsgKDMgLyA0ICogcykgKyAiIGwgIiArIHMgKyAiLCIgKyAoLXMgLyAyKSArICIgTSAwLCIgKyAocyAvIDQpICsgIiBsICIgKyBzICsgIiwiICsgKC1zIC8gMikgKyAiXG5NIDAsIiArIChzICogNSAvIDQpICsgIiBsICIgKyBzICsgIiwiICsgKC1zIC8gMik7CiAgICAgICAgICAgICAgfSkoc2l6ZSk7CiAgICAgICAgICAgIGNhc2UgIjQvOCI6CiAgICAgICAgICAgICAgcmV0dXJuIChmdW5jdGlvbihzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIk0gMCwiICsgKHMgLyAyKSArICIgbCAiICsgcyArICIsMCI7CiAgICAgICAgICAgICAgfSkoc2l6ZSk7CiAgICAgICAgICAgIGNhc2UgImhvcml6b250YWwiOgogICAgICAgICAgICAgIHJldHVybiAoZnVuY3Rpb24ocykgewogICAgICAgICAgICAgICAgcmV0dXJuICJNIDAsIiArIChzIC8gMikgKyAiIGwgIiArIHMgKyAiLDAiOwogICAgICAgICAgICAgIH0pKHNpemUpOwogICAgICAgICAgICBjYXNlICI1LzgiOgogICAgICAgICAgICAgIHJldHVybiAoZnVuY3Rpb24ocykgewogICAgICAgICAgICAgICAgcmV0dXJuICJNIDAsIiArICgtcyAvIDQpICsgIiBsICIgKyBzICsgIiwiICsgKHMgLyAyKSArICJNIDAsIiArIChzIC8gNCkgKyAiIGwgIiArIHMgKyAiLCIgKyAocyAvIDIpICsgIlxuTSAwLCIgKyAocyAqIDMgLyA0KSArICIgbCAiICsgcyArICIsIiArIChzIC8gMik7CiAgICAgICAgICAgICAgfSkoc2l6ZSk7CiAgICAgICAgICAgIGNhc2UgIjYvOCI6CiAgICAgICAgICAgICAgcmV0dXJuIChmdW5jdGlvbihzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIk0gMCwwIGwgIiArIHMgKyAiLCIgKyBzICsgIiBNICIgKyAoLXMgLyA0KSArICIsIiArICgzIC8gNCAqIHMpICsgIiBsICIgKyAocyAvIDIpICsgIiwiICsgKHMgLyAyKSArICJcbk0gIiArIChzICogMyAvIDQpICsgIiwiICsgKC1zIC8gNCkgKyAiIGwgIiArIChzIC8gMikgKyAiLCIgKyAocyAvIDIpOwogICAgICAgICAgICAgIH0pKHNpemUpOwogICAgICAgICAgICBjYXNlICI3LzgiOgogICAgICAgICAgICAgIHJldHVybiAoZnVuY3Rpb24ocykgewogICAgICAgICAgICAgICAgcmV0dXJuICJNICIgKyAoLXMgLyA0KSArICIsMCBsICIgKyAocyAvIDIpICsgIiwiICsgcyArICIgTSAiICsgKHMgLyA0KSArICIsMCBsICIgKyAocyAvIDIpICsgIiwiICsgcyArICJcbk0gIiArIChzICogMyAvIDQpICsgIiwwIGwgIiArIChzIC8gMikgKyAiLCIgKyBzOwogICAgICAgICAgICAgIH0pKHNpemUpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiAoZnVuY3Rpb24ocykgewogICAgICAgICAgICAgICAgcmV0dXJuICJNICIgKyAocyAvIDIpICsgIiwgMCBsIDAsICIgKyBzOwogICAgICAgICAgICAgIH0pKHNpemUpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgbGluZXMgPSBmdW5jdGlvbihzZWwpIHsKICAgICAgICAgIHZhciBnLCBpLCBsZW4sIG8sIHJlc3VsdHM7CiAgICAgICAgICBnID0gc2VsLmFwcGVuZCgiZGVmcyIpLmFwcGVuZCgicGF0dGVybiIpLmF0dHIoImlkIiwgaWQpLmF0dHIoInBhdHRlcm5Vbml0cyIsICJ1c2VyU3BhY2VPblVzZSIpLmF0dHIoIndpZHRoIiwgc2l6ZSkuYXR0cigiaGVpZ2h0Iiwgc2l6ZSk7CiAgICAgICAgICBpZiAoYmFja2dyb3VuZCkgewogICAgICAgICAgICBnLmFwcGVuZCgicmVjdCIpLmF0dHIoIndpZHRoIiwgc2l6ZSkuYXR0cigiaGVpZ2h0Iiwgc2l6ZSkuYXR0cigiZmlsbCIsIGJhY2tncm91bmQpOwogICAgICAgICAgfQogICAgICAgICAgcmVzdWx0cyA9IFtdOwogICAgICAgICAgZm9yIChpID0gMCwgbGVuID0gb3JpZW50YXRpb24ubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgbyA9IG9yaWVudGF0aW9uW2ldOwogICAgICAgICAgICByZXN1bHRzLnB1c2goZy5hcHBlbmQoInBhdGgiKS5hdHRyKCJkIiwgcGF0aChvKSkuYXR0cigic3Ryb2tlLXdpZHRoIiwgc3Ryb2tlV2lkdGgpLmF0dHIoInNoYXBlLXJlbmRlcmluZyIsIHNoYXBlUmVuZGVyaW5nKS5hdHRyKCJzdHJva2UiLCBzdHJva2UpLmF0dHIoInN0cm9rZS1saW5lY2FwIiwgInNxdWFyZSIpKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHRzOwogICAgICAgIH07CiAgICAgICAgbGluZXMuYmFja2dyb3VuZCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICAgIGJhY2tncm91bmQgPSBfOwogICAgICAgICAgcmV0dXJuIGxpbmVzOwogICAgICAgIH07CiAgICAgICAgbGluZXMuc2hhcGVSZW5kZXJpbmcgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgICBzaGFwZVJlbmRlcmluZyA9IF87CiAgICAgICAgICByZXR1cm4gbGluZXM7CiAgICAgICAgfTsKICAgICAgICBsaW5lcy5oZWF2aWVyID0gZnVuY3Rpb24oXykgewogICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHN0cm9rZVdpZHRoID0gc3Ryb2tlV2lkdGggKiAyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3Ryb2tlV2lkdGggPSBfID8gc3Ryb2tlV2lkdGggKiAyICogXyA6IHN0cm9rZVdpZHRoICogMjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBsaW5lczsKICAgICAgICB9OwogICAgICAgIGxpbmVzLmxpZ2h0ZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgc3Ryb2tlV2lkdGggPSBzdHJva2VXaWR0aCAvIDI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJva2VXaWR0aCA9IF8gPyBzdHJva2VXaWR0aCAvICgyICogXykgOiBzdHJva2VXaWR0aCAvIDI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbGluZXM7CiAgICAgICAgfTsKICAgICAgICBsaW5lcy50aGlubmVyID0gZnVuY3Rpb24oXykgewogICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHNpemUgPSBzaXplICogMjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNpemUgPSBfID8gc2l6ZSAqIDIgKiBfIDogc2l6ZSAqIDI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbGluZXM7CiAgICAgICAgfTsKICAgICAgICBsaW5lcy50aGlja2VyID0gZnVuY3Rpb24oXykgewogICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHNpemUgPSBzaXplIC8gMjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNpemUgPSBfID8gc2l6ZSAvICgyICogXykgOiBzaXplIC8gMjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBsaW5lczsKICAgICAgICB9OwogICAgICAgIGxpbmVzLm9yaWVudGF0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgYXJnczsKICAgICAgICAgIGFyZ3MgPSAxIDw9IGFyZ3VtZW50cy5sZW5ndGggPyBzbGljZS5jYWxsKGFyZ3VtZW50cywgMCkgOiBbXTsKICAgICAgICAgIG9yaWVudGF0aW9uID0gYXJnczsKICAgICAgICAgIHJldHVybiBsaW5lczsKICAgICAgICB9OwogICAgICAgIGxpbmVzLnNpemUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgICBzaXplID0gXzsKICAgICAgICAgIHJldHVybiBsaW5lczsKICAgICAgICB9OwogICAgICAgIGxpbmVzLnN0cm9rZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICAgIHN0cm9rZSA9IF87CiAgICAgICAgICByZXR1cm4gbGluZXM7CiAgICAgICAgfTsKICAgICAgICBsaW5lcy5zdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICAgIHN0cm9rZVdpZHRoID0gXzsKICAgICAgICAgIHJldHVybiBsaW5lczsKICAgICAgICB9OwogICAgICAgIGxpbmVzLmlkID0gZnVuY3Rpb24oXykgewogICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBpZDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlkID0gXzsKICAgICAgICAgICAgcmV0dXJuIGxpbmVzOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgbGluZXMudXJsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gInVybCgjIiArIGlkICsgIikiOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIGxpbmVzOwogICAgICB9LAogICAgICBwYXRoczogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGJhY2tncm91bmQsIGQsIGZpbGwsIGhlaWdodCwgaWQsIHBhdGhzLCBzaGFwZVJlbmRlcmluZywgc2l6ZSwgc3Ryb2tlLCBzdHJva2VXaWR0aCwgc3ZnUGF0aCwgd2lkdGg7CiAgICAgICAgc2l6ZSA9IDIwOwogICAgICAgIGhlaWdodCA9IDE7CiAgICAgICAgd2lkdGggPSAxOwogICAgICAgIHN0cm9rZVdpZHRoID0gMjsKICAgICAgICBzdHJva2UgPSAiIzM0MzQzNCI7CiAgICAgICAgYmFja2dyb3VuZCA9ICIiOwogICAgICAgIGQgPSAiIjsKICAgICAgICBzaGFwZVJlbmRlcmluZyA9ICJhdXRvIjsKICAgICAgICBmaWxsID0gInRyYW5zcGFyZW50IjsKICAgICAgICBpZCA9IHZvaWQgMDsKICAgICAgICBzdmdQYXRoID0gZnVuY3Rpb24oXykgewogICAgICAgICAgc3dpdGNoIChfKSB7CiAgICAgICAgICAgIGNhc2UgInNxdWFyZXMiOgogICAgICAgICAgICAgIHJldHVybiAoZnVuY3Rpb24ocykgewogICAgICAgICAgICAgICAgcmV0dXJuICJNICIgKyAocyAvIDQpICsgIiAiICsgKHMgLyA0KSArICIgbCAiICsgKHMgLyAyKSArICIgMCBsIDAgIiArIChzIC8gMikgKyAiIGwgIiArICgtcyAvIDIpICsgIiAwIFoiOwogICAgICAgICAgICAgIH0pKHNpemUpOwogICAgICAgICAgICBjYXNlICJueWxvbiI6CiAgICAgICAgICAgICAgcmV0dXJuIChmdW5jdGlvbihzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIk0gMCAiICsgKHMgLyA0KSArICIgbCAiICsgKHMgLyA0KSArICIgMCBsIDAgIiArICgtcyAvIDQpICsgIiBNICIgKyAocyAqIDMgLyA0KSArICIgIiArIHMgKyAiIGwgMCAiICsgKC1zIC8gNCkgKyAiXG5sICIgKyAocyAvIDQpICsgIiAwIE0gIiArIChzIC8gNCkgKyAiICIgKyAocyAvIDIpICsgIiBsIDAgIiArIChzIC8gNCkgKyAiIGwgIiArIChzIC8gNCkgKyAiIDAgTSAiICsgKHMgLyAyKSArICIgIiArIChzIC8gNCkgKyAiXG5sICIgKyAocyAvIDQpICsgIiAwIGwgMCAiICsgKHMgLyA0KTsKICAgICAgICAgICAgICB9KShzaXplKTsKICAgICAgICAgICAgY2FzZSAid2F2ZXMiOgogICAgICAgICAgICAgIHJldHVybiAoZnVuY3Rpb24ocykgewogICAgICAgICAgICAgICAgcmV0dXJuICJNIDAgIiArIChzIC8gMikgKyAiIGMgIiArIChzIC8gOCkgKyAiICIgKyAoLXMgLyA0KSArICIgLCAiICsgKHMgKiAzIC8gOCkgKyAiICIgKyAoLXMgLyA0KSArICIgLCAiICsgKHMgLyAyKSArICIgMFxuYyAiICsgKHMgLyA4KSArICIgIiArIChzIC8gNCkgKyAiICwgIiArIChzICogMyAvIDgpICsgIiAiICsgKHMgLyA0KSArICIgLCAiICsgKHMgLyAyKSArICIgMCBNICIgKyAoLXMgLyAyKSArICIgIiArIChzIC8gMikgKyAiXG5jICIgKyAocyAvIDgpICsgIiAiICsgKHMgLyA0KSArICIgLCAiICsgKHMgKiAzIC8gOCkgKyAiICIgKyAocyAvIDQpICsgIiAsICIgKyAocyAvIDIpICsgIiAwIE0gIiArIHMgKyAiICIgKyAocyAvIDIpICsgIlxuYyAiICsgKHMgLyA4KSArICIgIiArICgtcyAvIDQpICsgIiAsICIgKyAocyAqIDMgLyA4KSArICIgIiArICgtcyAvIDQpICsgIiAsICIgKyAocyAvIDIpICsgIiAwIjsKICAgICAgICAgICAgICB9KShzaXplKTsKICAgICAgICAgICAgY2FzZSAid292ZW4iOgogICAgICAgICAgICAgIHJldHVybiAoZnVuY3Rpb24ocykgewogICAgICAgICAgICAgICAgcmV0dXJuICJNICIgKyAocyAvIDQpICsgIiwiICsgKHMgLyA0KSArICJsIiArIChzIC8gMikgKyAiLCIgKyAocyAvIDIpICsgIk0iICsgKHMgKiAzIC8gNCkgKyAiLCIgKyAocyAvIDQpICsgImwiICsgKHMgLyAyKSArICIsIiArICgtcyAvIDIpICsgIlxuTSIgKyAocyAvIDQpICsgIiwiICsgKHMgKiAzIC8gNCkgKyAibCIgKyAoLXMgLyAyKSArICIsIiArIChzIC8gMikgKyAiTSIgKyAocyAqIDMgLyA0KSArICIsIiArIChzICogNSAvIDQpICsgImwiICsgKHMgLyAyKSArICIsIiArICgtcyAvIDIpICsgIlxuTSIgKyAoLXMgLyA0KSArICIsIiArIChzIC8gNCkgKyAibCIgKyAocyAvIDIpICsgIiwiICsgKC1zIC8gMik7CiAgICAgICAgICAgICAgfSkoc2l6ZSk7CiAgICAgICAgICAgIGNhc2UgImNyb3NzZXMiOgogICAgICAgICAgICAgIHJldHVybiAoZnVuY3Rpb24ocykgewogICAgICAgICAgICAgICAgcmV0dXJuICJNICIgKyAocyAvIDQpICsgIiwiICsgKHMgLyA0KSArICJsIiArIChzIC8gMikgKyAiLCIgKyAocyAvIDIpICsgIk0iICsgKHMgLyA0KSArICIsIiArIChzICogMyAvIDQpICsgImwiICsgKHMgLyAyKSArICIsIiArICgtcyAvIDIpOwogICAgICAgICAgICAgIH0pKHNpemUpOwogICAgICAgICAgICBjYXNlICJjYXBzIjoKICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAiTSAiICsgKHMgLyA0KSArICIsIiArIChzICogMyAvIDQpICsgImwiICsgKHMgLyA0KSArICIsIiArICgtcyAvIDIpICsgImwiICsgKHMgLyA0KSArICIsIiArIChzIC8gMik7CiAgICAgICAgICAgICAgfSkoc2l6ZSk7CiAgICAgICAgICAgIGNhc2UgImhleGFnb25zIjoKICAgICAgICAgICAgICByZXR1cm4gKGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgICAgIHdpZHRoID0gMzsKICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGguc3FydCgzKTsKICAgICAgICAgICAgICAgIHJldHVybiAiTSAiICsgcyArICIsMCBsICIgKyBzICsgIiwwIGwgIiArIChzIC8gMikgKyAiLCIgKyAocyAqIE1hdGguc3FydCgzKSAvIDIpICsgIlxubCAiICsgKC1zIC8gMikgKyAiLCIgKyAocyAqIE1hdGguc3FydCgzKSAvIDIpICsgIiBsICIgKyAoLXMpICsgIiwwXG5sICIgKyAoLXMgLyAyKSArICIsIiArICgtcyAqIE1hdGguc3FydCgzKSAvIDIpICsgIiBaIE0gMCwiICsgKHMgKiBNYXRoLnNxcnQoMykgLyAyKSArICJcbmwgIiArIChzIC8gMikgKyAiLDAgTSAiICsgKDMgKiBzKSArICIsIiArIChzICogTWF0aC5zcXJ0KDMpIC8gMikgKyAiIGwgIiArICgtcyAvIDIpICsgIiwwIjsKICAgICAgICAgICAgICB9KShzaXplKTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICByZXR1cm4gXyhzaXplKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHBhdGhzID0gZnVuY3Rpb24oc2VsKSB7CiAgICAgICAgICB2YXIgZywgcGF0aDsKICAgICAgICAgIHBhdGggPSBzdmdQYXRoKGQpOwogICAgICAgICAgaWQgPSByYW5kKCk7CiAgICAgICAgICBnID0gc2VsLmFwcGVuZCgiZGVmcyIpLmFwcGVuZCgicGF0dGVybiIpLmF0dHIoImlkIiwgaWQpLmF0dHIoInBhdHRlcm5Vbml0cyIsICJ1c2VyU3BhY2VPblVzZSIpLmF0dHIoIndpZHRoIiwgc2l6ZSAqIHdpZHRoKS5hdHRyKCJoZWlnaHQiLCBzaXplICogaGVpZ2h0KTsKICAgICAgICAgIGlmIChiYWNrZ3JvdW5kKSB7CiAgICAgICAgICAgIGcuYXBwZW5kKCJyZWN0IikuYXR0cigid2lkdGgiLCBzaXplICogd2lkdGgpLmF0dHIoImhlaWdodCIsIHNpemUgKiBoZWlnaHQpLmF0dHIoImZpbGwiLCBiYWNrZ3JvdW5kKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBnLmFwcGVuZCgicGF0aCIpLmF0dHIoImQiLCBwYXRoKS5hdHRyKCJmaWxsIiwgZmlsbCkuYXR0cigic3Ryb2tlLXdpZHRoIiwgc3Ryb2tlV2lkdGgpLmF0dHIoInNoYXBlLXJlbmRlcmluZyIsIHNoYXBlUmVuZGVyaW5nKS5hdHRyKCJzdHJva2UiLCBzdHJva2UpLmF0dHIoInN0cm9rZS1saW5lY2FwIiwgInNxdWFyZSIpOwogICAgICAgIH07CiAgICAgICAgcGF0aHMuYmFja2dyb3VuZCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICAgIGJhY2tncm91bmQgPSBfOwogICAgICAgICAgcmV0dXJuIHBhdGhzOwogICAgICAgIH07CiAgICAgICAgcGF0aHMuc2hhcGVSZW5kZXJpbmcgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgICBzaGFwZVJlbmRlcmluZyA9IF87CiAgICAgICAgICByZXR1cm4gcGF0aHM7CiAgICAgICAgfTsKICAgICAgICBwYXRocy5oZWF2aWVyID0gZnVuY3Rpb24oXykgewogICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHN0cm9rZVdpZHRoID0gc3Ryb2tlV2lkdGggKiAyOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3Ryb2tlV2lkdGggPSBfID8gc3Ryb2tlV2lkdGggKiAyICogXyA6IHN0cm9rZVdpZHRoICogMjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwYXRoczsKICAgICAgICB9OwogICAgICAgIHBhdGhzLmxpZ2h0ZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgc3Ryb2tlV2lkdGggPSBzdHJva2VXaWR0aCAvIDI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJva2VXaWR0aCA9IF8gPyBzdHJva2VXaWR0aCAvICgyICogXykgOiBzdHJva2VXaWR0aCAvIDI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcGF0aHM7CiAgICAgICAgfTsKICAgICAgICBwYXRocy50aGlubmVyID0gZnVuY3Rpb24oXykgewogICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHNpemUgPSBzaXplICogMjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNpemUgPSBfID8gc2l6ZSAqIDIgKiBfIDogc2l6ZSAqIDI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcGF0aHM7CiAgICAgICAgfTsKICAgICAgICBwYXRocy50aGlja2VyID0gZnVuY3Rpb24oXykgewogICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHNpemUgPSBzaXplIC8gMjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNpemUgPSBfID8gc2l6ZSAvICgyICogXykgOiBzaXplIC8gMjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwYXRoczsKICAgICAgICB9OwogICAgICAgIHBhdGhzLmQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgICBkID0gXzsKICAgICAgICAgIHJldHVybiBwYXRoczsKICAgICAgICB9OwogICAgICAgIHBhdGhzLnNpemUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgICBzaXplID0gXzsKICAgICAgICAgIHJldHVybiBwYXRoczsKICAgICAgICB9OwogICAgICAgIHBhdGhzLnN0cm9rZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICAgIHN0cm9rZSA9IF87CiAgICAgICAgICByZXR1cm4gcGF0aHM7CiAgICAgICAgfTsKICAgICAgICBwYXRocy5zdHJva2VXaWR0aCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICAgIHN0cm9rZVdpZHRoID0gXzsKICAgICAgICAgIHJldHVybiBwYXRoczsKICAgICAgICB9OwogICAgICAgIHBhdGhzLmlkID0gZnVuY3Rpb24oXykgewogICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBpZDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlkID0gXzsKICAgICAgICAgICAgcmV0dXJuIHBhdGhzOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcGF0aHMudXJsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gInVybCgjIiArIGlkICsgIikiOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHBhdGhzOwogICAgICB9CiAgICB9OwogIH0pOwoKfSkuY2FsbCh0aGlzKTsK"></script>
<script src="data:application/x-javascript;base64,YXBwZW5kU3R5bGUgPSBmdW5jdGlvbihjc3MpIHsKICB2YXIgaGVhZCA9IGRvY3VtZW50LmhlYWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsKICB2YXIgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwoKICBzdHlsZS50eXBlID0gJ3RleHQvY3NzJzsKICBpZiAoc3R5bGUuc3R5bGVTaGVldCl7CiAgICBzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3M7CiAgfSBlbHNlIHsKICAgIHN0eWxlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpOwogIH0KCiAgaGVhZC5hcHBlbmRDaGlsZChzdHlsZSk7Cn0KCnZhciB0cnlUb0dldEZ1bmN0aW9ucyA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgdHJ5IHsKICAgIHZhciBldmFsdWF0ZWQgPSBldmFsKCIoIiArIHZhbHVlICsgIikiKTsKICAgIGlmICh0eXBlb2YgZXZhbHVhdGVkID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHJldHVybiBldmFsdWF0ZWQ7CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfSBjYXRjaChlKSB7fQogIHJldHVybiB2YWx1ZTsKfTsKCnZhciBleGVjdXRlX2luc3RydWN0aW9uID0gZnVuY3Rpb24oZW52LCBpbnN0X3BhcnRzKSB7CiAgdmFyIGN1cnJlbnQ7CiAgZm9yKHZhciBpdCA9IDA7IGl0IDwgaW5zdF9wYXJ0cy5sZW5ndGg7ICsraXQpIHsKICAgIHZhciBlbGVtID0gaW5zdF9wYXJ0c1tpdF07CiAgICBzd2l0Y2goZWxlbS5jb21tYW5kKSB7CiAgICAgIGNhc2UgInNhdmVfdmFyIjoKICAgICAgICB2YXIgZW52X3BvaW50ZXIgPSBlbnY7CiAgICAgICAgbmFtZV9wYXJ0cyA9IGVsZW0uYXJncy5uYW1lLnNwbGl0KCcuJykKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5hbWVfcGFydHMubGVuZ3RoIC0gMTsgKytpKSB7CiAgICAgICAgICBlbnZfcG9pbnRlciA9IGVudl9wb2ludGVyW25hbWVfcGFydHNbaV1dOwogICAgICAgIH0KICAgICAgICBlbnZfcG9pbnRlcltuYW1lX3BhcnRzW25hbWVfcGFydHMubGVuZ3RoIC0gMV1dID0gY3VycmVudDsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiZ2V0X3ZhciI6CiAgICAgICAgY3VycmVudCA9IGVudltlbGVtLmFyZ3MubmFtZV0gfHwgd2luZG93W2VsZW0uYXJncy5uYW1lXTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAiZXZhbHVhdGUiOgogICAgICAgIGN1cnJlbnQgPSBldmFsKGVsZW0uYXJncy5zdHIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJqc19wcm9wIjoKICAgICAgICAvLyByZXR1cm4gY3VycmVudFtlbGVtLmFyZ3MubmFtZV07CiAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbZWxlbS5hcmdzLm5hbWVdOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICJqc19mdW5jIjoKICAgICAgICAvLyBvbigibW91c2VvdXQiLCBqc19mdW5jKGQzKCkgJT4lIHNlbGVjdCh0aGlzKCkpICU+JSBzdHlsZSgiZmlsbCIsIHVybChnZXRfdmFyKCJkb3RzIikpKSkpCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRvdCwgaSkgewogICAgICAgICAgdmFyIF90aGlzID0gZW52WyJ0aGlzIl07CiAgICAgICAgICB2YXIgX2RvdCA9IGVudlsiLiJdOwogICAgICAgICAgdmFyIF94ID0gZW52WyIueCJdOwogICAgICAgICAgdmFyIF95ID0gZW52WyIueSJdOwogICAgICAgICAgZW52WyJ0aGlzIl0gPSB0aGlzOwogICAgICAgICAgZW52WyIuIl0gPSBkb3Q7CiAgICAgICAgICBlbnZbIi54Il0gPSBkb3Q7CiAgICAgICAgICBlbnZbIi55Il0gPSBpOwogICAgICAgICAgdmFyIHJlc3VsdHMgPSBlbGVtLmFyZ3MubWFwKGZ1bmN0aW9uKGJsb2NrKSB7IHJldHVybiBleGVjdXRlX2luc3RydWN0aW9uKGVudiwgYmxvY2spOyB9KQogICAgICAgICAgdmFyIHJlc3VsdCA9IHJlc3VsdHNbcmVzdWx0cy5sZW5ndGggLSAxXTsKICAgICAgICAgIGVudlsidGhpcyJdID0gX3RoaXM7CiAgICAgICAgICBlbnZbIi4iXSA9IF9kb3Q7CiAgICAgICAgICBlbnZbIi54Il0gPSBfeDsKICAgICAgICAgIGVudlsiLnkiXSA9IF95OwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgICBjYXNlICJhcHBseSI6CiAgICAgICAgdmFyIGV2YWx1YXRlZF9hcmdzID0gZWxlbS5hcmdzLm1hcChmdW5jdGlvbihhcmcpIHsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZykgJiYgYXJnWzBdLmNvbW1hbmQpIHsKICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgYmUgbW9yZSByb2J1c3QgdGhhbiBzaW1wbGUgaGV1cmlzdGljLgogICAgICAgICAgICByZXR1cm4gZXhlY3V0ZV9pbnN0cnVjdGlvbihlbnYsIGFyZyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ5VG9HZXRGdW5jdGlvbnMoYXJnKTsKICAgICAgICB9KTsKICAgICAgICBpZiAoZWxlbS5mdW4gPT09ICJkYXRhIikgewogICAgICAgICAgZCA9IGV2YWx1YXRlZF9hcmdzWzBdOwogICAgICAgICAgZXZhbHVhdGVkX2FyZ3NbMF0gPSAobmV3IEFycmF5KGRbT2JqZWN0LmtleXMoZClbMF1dLmxlbmd0aCkuZmlsbCh1bmRlZmluZWQpKS5tYXAoZnVuY3Rpb24oXywgaSkgewogICAgICAgICAgICB2YXIgbyA9IHt9OwogICAgICAgICAgICBPYmplY3Qua2V5cyhkKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgeyBvW2tleV09IGRba2V5XVtpXX0pOwogICAgICAgICAgICByZXR1cm4gbzsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBjb25zb2xlLmxvZyhjdXJyZW50LCBlbGVtLmZ1bikKICAgICAgICBjdXJyZW50ID0gY3VycmVudFtlbGVtLmZ1bl0uYXBwbHkoY3VycmVudCwgZXZhbHVhdGVkX2FyZ3MpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIHRocm93ICJVbnJlY29nbml6ZWQgaW5zdHJ1Y3Rpb246ICIgKyBlbGVtLmNvbW1hbmQ7CiAgICB9CiAgfQogIHJldHVybiBjdXJyZW50Owp9OwoKSFRNTFdpZGdldHMud2lkZ2V0KHsKICBuYW1lOiAicjJkMyIsCiAgdHlwZTogIm91dHB1dCIsCgogIGZhY3Rvcnk6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICByZXR1cm4gewogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oYXJncykgewogICAgICAgIHZhciB3cmFwcGVkX2luc3RzID0gYXJncy5pbnN0czsKICAgICAgICB2YXIgY3NzID0gYXJncy5jc3M7CiAgICAgICAgYXBwZW5kU3R5bGUoY3NzKTsKCiAgICAgICAgaW5zdHMgPSBPYmplY3Qua2V5cyh3cmFwcGVkX2luc3RzKS5tYXAoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICByZXR1cm4gd3JhcHBlZF9pbnN0c1trZXldOwogICAgICAgIH0pOwoKICAgICAgICB2YXIgZW52ID0ge307CiAgICAgICAgZm9yIChpdCA9IDA7IGl0IDwgaW5zdHMubGVuZ3RoOyArK2l0KSB7CiAgICAgICAgICBleGVjdXRlX2luc3RydWN0aW9uKGVudiwgaW5zdHNbaXRdKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICByZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHsKICAgICAgfSwKCiAgICAgIC8vIE1ha2UgdGhlIG9iamVjdCBhdmFpbGFibGUgYXMgYSBwcm9wZXJ0eSBvbiB0aGUgd2lkZ2V0CiAgICAgIC8vIGluc3RhbmNlIHdlJ3JlIHJldHVybmluZyBmcm9tIGZhY3RvcnkoKS4gVGhpcyBpcyBnZW5lcmFsbHkgYQogICAgICAvLyBnb29kIGlkZWEgZm9yIGV4dGVuc2liaWxpdHktLWl0IGhlbHBzIHVzZXJzIG9mIHRoaXMgd2lkZ2V0CiAgICAgIC8vIGludGVyYWN0IGRpcmVjdGx5IHdpdGggb2JqZWN0LCBpZiBuZWVkZWQuCiAgICAgIC8vIHIyZDM6IHNpZwogICAgfTsKICB9Cn0pOwo="></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget_container">
<div id="htmlwidget-cc004c7ddfce958cd4f6" style="width:960px;height:500px;" class="r2d3 html-widget"></div>
</div>
<script type="application/json" data-for="htmlwidget-cc004c7ddfce958cd4f6">{"x":{"insts":{"1":[{"command":"get_var","args":{"name":"d3"}},{"command":"apply","fun":"select","args":[".r2d3"]},{"command":"apply","fun":"append","args":["canvas"]},{"command":"apply","fun":"attr","args":["width",960]},{"command":"apply","fun":"attr","args":["height",500]}],"2":[{"command":"get_var","args":{"name":"d3"}},{"command":"apply","fun":"select","args":["canvas"]},{"command":"save_var","args":{"name":"canvas"}}],"3":[{"command":"get_var","args":{"name":"canvas"}},{"command":"apply","fun":"node","args":[]},{"command":"save_var","args":{"name":"canvasNode"}}],"4":[{"command":"get_var","args":{"name":"canvasNode"}},{"command":"apply","fun":"getContext","args":["2d"]},{"command":"save_var","args":{"name":"context"}}],"5":[{"command":"get_var","args":{"name":"d3"}},{"command":"js_prop","args":{"name":"geo"}},{"command":"apply","fun":"graticule","args":[]},{"command":"apply","fun":"call","args":[]},{"command":"save_var","args":{"name":"graticule"}}],"6":[{"command":"get_var","args":{"name":"d3"}},{"command":"apply","fun":"timer","args":[[{"command":"js_func","args":[[{"command":"evaluate","args":{"str":"\n env.context.clearRect(0, 0, 960, 500);\n env.context.save();\n\n var tilt = (-89 + Math.abs((env['.x'] / 30) % 358 - 179)) * Math.PI / 180,\n alpha = Math.acos(1.4 * Math.cos(tilt) * .99);\n\n env.context.beginPath();\n\n env.context.translate(960 / 2, 500 / 2);\n env.context.scale(500, -500);\n env.context.lineWidth = 1 / 500;\n\n var render = d3.geo.pipeline()\n .source(d3.geo.jsonSource)\n .pipe(d3.geo.rotate, 0, 0, env['.x'] / 3000)\n .pipe(d3.geo.clipCircle, Math.acos(1 / 1.4) - 1e-6)\n\n if (alpha) render\n .pipe(d3.geo.rotate, 0, Math.PI + tilt, 0)\n .pipe(d3.geo.clipCircle, Math.PI - alpha)\n .pipe(d3.geo.rotate, 0, -Math.PI - tilt, 0);\n\n render = render\n .pipe(d3.geo.project, d3.geo.satellite(1.4, tilt), .5 / 500)\n .sink(d3.geom.contextSink, env.context)(env.graticule);\n\n env.context.stroke();\n env.context.restore();"}}]]}]]}]},"css":""},"evals":[],"jsHooks":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-cc004c7ddfce958cd4f6">{"viewer":{"width":450,"height":350,"padding":15,"fill":true},"browser":{"width":960,"height":500,"padding":40,"fill":false}}</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment