{
  "channel": "email",
  "recipient": "venba2026@gmail.com",
  "content": {
    "type": "html",
    "subject": "Asset details",
    "body": "Hello BHARATHI,
         Asset maintenance requires attention.
         Asset : Asset/2026/89 — LAPTOP",
    "attachments": [
      {
        "filename": "sanshhttmmll.html",
        "contentType": "text/html",
        "content": "PGh0bWw+PCEtLSBUZXh0IGJldHdlZW4gYW5nbGUgYnJhY2tldHMgaXMgYW4gSFRNTCB0YWcgYW5kIGlzIG5vdCBkaXNwbGF5ZWQuCk1vc3QgdGFncywgc3VjaCBhcyB0aGUgSFRNTCBhbmQgL0hUTUwgdGFncyB0aGF0IHN1cnJvdW5kIHRoZSBjb250ZW50cyBvZgphIHBhZ2UsIGNvbWUgaW4gcGFpcnM7IHNvbWUgdGFncywgbGlrZSBIUiwgZm9yIGEgaG9yaXpvbnRhbCBydWxlLCBzdGFuZCAKYWxvbmUuIENvbW1lbnRzLCBzdWNoIGFzIHRoZSB0ZXh0IHlvdSdyZSByZWFkaW5nLCBhcmUgbm90IGRpc3BsYXllZCB3aGVuCnRoZSBXZWIgcGFnZSBpcyBzaG93bi4gVGhlIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIEhFQUQgYW5kIC9IRUFEIHRhZ3MgaXMgCm5vdCBkaXNwbGF5ZWQuIFRoZSBpbmZvcm1hdGlvbiBiZXR3ZWVuIHRoZSBCT0RZIGFuZCAvQk9EWSB0YWdzIGlzIGRpc3BsYXllZC4tLT48aGVhZD48c2NyaXB0PnZhciBfX2V6SHR0cENvbnNlbnQ9e3NldEJ5Q2F0OmZ1bmN0aW9uKHNyYyx0YWdUeXBlLGF0dHJpYnV0ZXMsY2F0ZWdvcnksZm9yY2UsY3VzdG9tU2V0U2NyaXB0Rm49bnVsbCl7dmFyIHNldFNjcmlwdD1mdW5jdGlvbigpe2lmKGZvcmNlfHx3aW5kb3cuZXpUY2ZDb25zZW50W2NhdGVnb3J5XSl7aWYodHlwZW9mIGN1c3RvbVNldFNjcmlwdEZuPT09J2Z1bmN0aW9uJyl7Y3VzdG9tU2V0U2NyaXB0Rm4oKTt9ZWxzZXt2YXIgc2NyaXB0RWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ1R5cGUpO3NjcmlwdEVsZW1lbnQuc3JjPXNyYzthdHRyaWJ1dGVzLmZvckVhY2goZnVuY3Rpb24oYXR0cil7Zm9yKHZhciBrZXkgaW4gYXR0cil7aWYoYXR0ci5oYXNPd25Qcm9wZXJ0eShrZXkpKXtzY3JpcHRFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksYXR0cltrZXldKTt9fX0pO3ZhciBmaXJzdFNjcmlwdD1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdUeXBlKVswXTtmaXJzdFNjcmlwdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzY3JpcHRFbGVtZW50LGZpcnN0U2NyaXB0KTt9fX07aWYoZm9yY2V8fCh3aW5kb3cuZXpUY2ZDb25zZW50JiZ3aW5kb3cuZXpUY2ZDb25zZW50LmxvYWRlZCkpe3NldFNjcmlwdCgpO31lbHNlIGlmKHR5cGVvZiBnZXRFekNvbnNlbnREYXRhPT09ImZ1bmN0aW9uIil7Z2V0RXpDb25zZW50RGF0YSgpLnRoZW4oZnVuY3Rpb24oZXpUY2ZDb25zZW50KXtpZihlelRjZkNvbnNlbnQmJmV6VGNmQ29uc2VudC5sb2FkZWQpe3NldFNjcmlwdCgpO31lbHNle2NvbnNvbGUuZXJyb3IoImNhbm5vdCBnZXQgZXogY29uc2VudCBkYXRhIik7Zm9yY2U9dHJ1ZTtzZXRTY3JpcHQoKTt9fSk7fWVsc2V7Zm9yY2U9dHJ1ZTtzZXRTY3JpcHQoKTtjb25zb2xlLmVycm9yKCJnZXRFekNvbnNlbnREYXRhIGlzIG5vdCBhIGZ1bmN0aW9uIik7fX0sfTs8L3NjcmlwdD4KPHNjcmlwdD52YXIgZXpUY2ZDb25zZW50PXdpbmRvdy5lelRjZkNvbnNlbnQ/d2luZG93LmV6VGNmQ29uc2VudDp7bG9hZGVkOmZhbHNlLHN0b3JlX2luZm86ZmFsc2UsZGV2ZWxvcF9hbmRfaW1wcm92ZV9zZXJ2aWNlczpmYWxzZSxtZWFzdXJlX2FkX3BlcmZvcm1hbmNlOmZhbHNlLG1lYXN1cmVfY29udGVudF9wZXJmb3JtYW5jZTpmYWxzZSxzZWxlY3RfYmFzaWNfYWRzOmZhbHNlLGNyZWF0ZV9hZF9wcm9maWxlOmZhbHNlLHNlbGVjdF9wZXJzb25hbGl6ZWRfYWRzOmZhbHNlLGNyZWF0ZV9jb250ZW50X3Byb2ZpbGU6ZmFsc2Usc2VsZWN0X3BlcnNvbmFsaXplZF9jb250ZW50OmZhbHNlLHVuZGVyc3RhbmRfYXVkaWVuY2VzOmZhbHNlLHVzZV9saW1pdGVkX2RhdGFfdG9fc2VsZWN0X2NvbnRlbnQ6ZmFsc2UsfTtmdW5jdGlvbiBnZXRFekNvbnNlbnREYXRhKCl7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUpe2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImV6Q29uc2VudEV2ZW50IixmdW5jdGlvbihldmVudCl7dmFyIGV6VGNmQ29uc2VudD1ldmVudC5kZXRhaWwuZXpUY2ZDb25zZW50O3Jlc29sdmUoZXpUY2ZDb25zZW50KTt9KTt9KTt9PC9zY3JpcHQ+CjxzY3JpcHQ+aWYodHlwZW9mIF9zZXRFekNvb2tpZXMhPT0nZnVuY3Rpb24nKXtmdW5jdGlvbiBfc2V0RXpDb29raWVzKGV6Q29uc2VudERhdGEpe3ZhciBjb29raWVzPXdpbmRvdy5lekNvb2tpZVF1ZXVlO2Zvcih2YXIgaT0wO2k8Y29va2llcy5sZW5ndGg7aSsrKXt2YXIgY29va2llPWNvb2tpZXNbaV07aWYoZXpDb25zZW50RGF0YSYmZXpDb25zZW50RGF0YS5sb2FkZWQmJmV6Q29uc2VudERhdGFbY29va2llLnRjZkNhdGVnb3J5XSl7ZG9jdW1lbnQuY29va2llPWNvb2tpZS5uYW1lKyI9Iitjb29raWUudmFsdWU7fX19fQp3aW5kb3cuZXpDb29raWVRdWV1ZT13aW5kb3cuZXpDb29raWVRdWV1ZXx8W107aWYodHlwZW9mIGFkZEV6Q29va2llcyE9PSdmdW5jdGlvbicpe2Z1bmN0aW9uIGFkZEV6Q29va2llcyhhcnIpe3dpbmRvdy5lekNvb2tpZVF1ZXVlPVsuLi53aW5kb3cuZXpDb29raWVRdWV1ZSwuLi5hcnJdO319CmFkZEV6Q29va2llcyhbe25hbWU6ImV6b3B2Y18xNzY1MjciLHZhbHVlOiIxOyBQYXRoPS87IERvbWFpbj1maWxlc2FtcGxlcy5jb207IEV4cGlyZXM9VHVlLCAyMCBPY3QgMjAyNiAxMjoyMTo1NiBVVEMiLHRjZkNhdGVnb3J5OiJ1bmRlcnN0YW5kX2F1ZGllbmNlcyIsaXNFem9pYzoidHJ1ZSIsfSx7bmFtZToiZXpvYWJfMTc2NTI3Iix2YWx1ZToibW9kNDYyLWM7IFBhdGg9LzsgRG9tYWluPWZpbGVzYW1wbGVzLmNvbTsgTWF4LUFnZT03MjAwIix0Y2ZDYXRlZ29yeToic3RvcmVfaW5mbyIsaXNFem9pYzoidHJ1ZSIsfSx7bmFtZToiYWN0aXZlX3RlbXBsYXRlOjoxNzY1MjciLHZhbHVlOiJwdWJfc2l0ZS4xNzkyNDk3MTE2OyBQYXRoPS87IERvbWFpbj1maWxlc2FtcGxlcy5jb207IEV4cGlyZXM9VGh1LCAyMiBPY3QgMjAyNiAxMTo1MTo1NiBVVEMiLHRjZkNhdGVnb3J5OiJzdG9yZV9pbmZvIixpc0V6b2ljOiJ0cnVlIix9LHtuYW1lOiJlem9hZGdpZF8xNzY1MjciLHZhbHVlOiItMTsgUGF0aD0vOyBEb21haW49ZmlsZXNhbXBsZXMuY29tOyBNYXgtQWdlPTE4MDAiLHRjZkNhdGVnb3J5OiJ1bmRlcnN0YW5kX2F1ZGllbmNlcyIsaXNFem9pYzoidHJ1ZSIsfSx7bmFtZToiZXpvaWQiLHZhbHVlOiJiMjY4YTQ1Zi01NDYwLTQwNDMtYjVkMi0yZTQyZjgxM2NjZTg7IFBhdGg9LzsgRG9tYWluPWV6b2ljLm5ldDsgTWF4LUFnZT0zMTUzNjAwMDsgU2FtZVNpdGU9Tm9uZTsgU2VjdXJlOyBIdHRwT25seSIsdGNmQ2F0ZWdvcnk6InN0b3JlX2luZm8iLGlzRXpvaWM6InRydWUiLH0se25hbWU6ImV6b2lkIix2YWx1ZToiYjI2OGE0NWYtNTQ2MC00MDQzLWI1ZDItMmU0MmY4MTNjY2U4OyBQYXRoPS87IE1heC1BZ2U9MzE1MzYwMDA7IFNhbWVTaXRlPU5vbmU7IFNlY3VyZTsgSHR0cE9ubHkiLHRjZkNhdGVnb3J5OiJzdG9yZV9pbmZvIixpc0V6b2ljOiJ0cnVlIix9XSk7aWYod2luZG93LmV6VGNmQ29uc2VudCYmd2luZG93LmV6VGNmQ29uc2VudC5sb2FkZWQpe19zZXRFekNvb2tpZXMod2luZG93LmV6VGNmQ29uc2VudCk7fWVsc2UgaWYodHlwZW9mIGdldEV6Q29uc2VudERhdGE9PT0iZnVuY3Rpb24iKXtnZXRFekNvbnNlbnREYXRhKCkudGhlbihmdW5jdGlvbihlelRjZkNvbnNlbnQpe2lmKGV6VGNmQ29uc2VudCYmZXpUY2ZDb25zZW50LmxvYWRlZCl7X3NldEV6Q29va2llcyh3aW5kb3cuZXpUY2ZDb25zZW50KTt9ZWxzZXtjb25zb2xlLmVycm9yKCJjYW5ub3QgZ2V0IGV6IGNvbnNlbnQgZGF0YSIpO19zZXRFekNvb2tpZXMod2luZG93LmV6VGNmQ29uc2VudCk7fX0pO31lbHNle2NvbnNvbGUuZXJyb3IoImdldEV6Q29uc2VudERhdGEgaXMgbm90IGEgZnVuY3Rpb24iKTtfc2V0RXpDb29raWVzKHdpbmRvdy5lelRjZkNvbnNlbnQpO308L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgZGF0YS1lenNjcmV4PSdmYWxzZScgZGF0YS1jZmFzeW5jPSdmYWxzZSc+d2luZG93Ll9lemFxID0gT2JqZWN0LmFzc2lnbih7ImVkZ2VfY2FjaGVfc3RhdHVzIjoxLCJlZGdlX3Jlc3BvbnNlX3RpbWUiOjgxMywidXJsIjoiaHR0cHM6Ly9maWxlc2FtcGxlcy5jb20vc2FtcGxlcy9jb2RlL2h0bWwvc2FtcGxlMi5odG1sIn0sIHR5cGVvZiB3aW5kb3cuX2V6YXEgIT09ICJ1bmRlZmluZWQiID8gd2luZG93Ll9lemFxIDoge30pOzwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBkYXRhLWV6c2NyZXg9J2ZhbHNlJyBkYXRhLWNmYXN5bmM9J2ZhbHNlJz53aW5kb3cuX2V6YXEgPSBPYmplY3QuYXNzaWduKHsiYWJfdGVzdF9pZCI6Im1vZDQ2Mi1jIn0sIHR5cGVvZiB3aW5kb3cuX2V6YXEgIT09ICJ1bmRlZmluZWQiID8gd2luZG93Ll9lemFxIDoge30pO3dpbmRvdy5fX2V6PXdpbmRvdy5fX2V6fHx7fTt3aW5kb3cuX19lei50Zj17ImxjcG0iOiJmYWxzZSIsInZhY3RzdjMiOiJ0cnVlIiwidmR1cmJhbmRpdDIiOiJjb250cm9sIiwidm90c3YyIjoidHJ1ZSIsInZzMnNmZSI6InRydWUifTt3aW5kb3cuX19lej13aW5kb3cuX19lenx8e307d2luZG93Ll9fZXouZnM9eyJBQ0Zsb29yVFNWMlNwbGl0Ijoib2ZmIiwiQUNGbG9vclRTVjNTcGxpdCI6InRydWUiLCJBQ0dvb2dsZUxhZGRlclNjYWxlU3BsaXQiOiJmYWxzZSIsIkFEWEhhcmRGbG9vcnNTcGxpdCI6InRydWUiLCJBZGFwdGl2ZUV4Y2x1c2lvbiI6InRydWUiLCJBZmZpbGlhdGVXaWRnZXRzIjoidHJ1ZSIsIkFsbG93TXVsdGlwbGVCaWdBZHNBYm92ZUZvbGQiOiJmYWxzZSIsIkFuY2hvckV4cGFuc2lvbkJhbmRpdFNwbGl0IjoidHJ1ZSIsIkJpZGRlclNjYWxlVFNTcGxpdCI6Im9mZiIsIkNlbnRlcmVkQWRzIjoiZmFsc2UiLCJEaXJlY3RSZW5kZXJCYW5kaXRTcGxpdCI6InRydWUiLCJEaXJlY3RSZW5kZXJEb3NlU3BsaXQiOiJvZmYiLCJEaXJlY3RSZW5kZXJGbG9vcm11bHRHcmlkU3BsaXQiOiJncmlkNyIsIkRpcmVjdFJlbmRlckZsb29ybXVsdEhvbGRvdXRTcGxpdCI6Im9mZiIsIkRpcmVjdFJlbmRlckxvd0dyaWRTcGxpdCI6Im9mZiIsIkRpcmVjdFJlbmRlclB0NFRocmVzaG9sZFNwbGl0Ijoib2ZmIiwiRHVyYXRpb25CYW5kaXRWMlNwbGl0IjoiZmFsc2UiLCJFc2NhbGF0aW9uRG93bnJvdW5kIjoiZmFsc2UiLCJFc2NhbGF0aW9uRWFybHlHYW0iOiJ0cnVlIiwiRXNjYWxhdGlvbkhpZ2hGbG9vckRvd25yb3VuZCI6InRydWUiLCJFc2NhbGF0aW9uTWlkRmxvb3JEb3ducm91bmQiOiJ0cnVlIiwiRXNjYWxhdGlvblMyc0xvd0Zsb29yIjoidHJ1ZSIsIkVzY2FsYXRpb25TMnNNaWRGbG9vciI6InRydWUiLCJFc2NhbGF0aW9uVXB3YWxrTWFwMiI6InRydWUiLCJGbG9hdGluZ0JhbmRpdENoYWxsZW5nZXIiOiJ0cnVlIiwiRmxvYXRpbmdCYW5kaXRXaW5kb3ciOiJ0cnVlIiwiRmxvYXRpbmdJbnRlcnN0aXRpYWxCYW5kaXRTcGxpdCI6InRydWUiLCJGbG9vckJhbmRpdENoYWxsZW5nZXJTcGxpdCI6ImNoYWxsZW5nZXIiLCJGbG9vckJhbmRpdFNwbGl0IjoidHJ1ZSIsIkZsb29yRXNjYWxhdGlvbiI6InRydWUiLCJGbG9vclBsYW5TcGxpdCI6ImZhbHNlIiwiRmx5aW5nQ2FycGV0IjoiZmFsc2UiLCJIYkZsb29yQmFuZGl0RGVsaXZlciI6ImZhbHNlIiwiSGJGbG9vckJhbmRpdFNwbGl0IjoidHJ1ZSIsIkhiRmxvb3JCYW5kaXRUcmFpblNwbGl0IjoiZmFsc2UiLCJMYXp5bG9hZEFybTI3dnMxOSI6InJlc3QiLCJMYXp5bG9hZEJhbmRpdFNwbGl0IjoidHJ1ZSIsIk1vbm9wb2x5UmVzZXJ2ZUZsb29yU3BsaXQiOiJ0cnVlIiwiT3V0c3RyZWFtQXNwZWN0QmFuZGl0VjNTcGxpdCI6ImNvbnRyb2wiLCJPdXRzdHJlYW1CaWRkZXJJbmNsdXNpb25DdXJ2ZSI6InN0YW5kYXJkIiwiT3V0c3RyZWFtQmlkZGVySW5jbHVzaW9uU3BsaXQiOiJ0cnVlIiwiT3V0c3RyZWFtUHViMU1heFNpemUiOiJ0cnVlIiwiT3V0c3RyZWFtUmVzZXJ2ZUJhbmRpdFNwbGl0IjoidHJ1ZSIsIk91dHN0cmVhbVJlc2VydmVVU0Rlc2t0b3BQaW5TcGxpdCI6ImZhbHNlIiwiT3V0c3RyZWFtVFNWMlNwbGl0IjoidHJ1ZSIsIk91dHN0cmVhbVRTVjNTcGxpdCI6Im9mZiIsIlBvb2xBdWN0aW9uTG9ja0RvbWFpbiI6ImZhbHNlIiwiUHBpZEhvbGRvdXQiOiJmYWxzZSIsIlJlZnJlc2hGbG9vckJhbmRpdFNwbGl0IjoidHJ1ZSIsIlJlZnJlc2hGbG9vckZpcnN0Q3ljbGVEZWZhdWx0IjoidHJ1ZSIsIlMyU0Zsb29yRW5mb3JjZVNwbGl0IjoidHJ1ZSIsIlNpemVCYW5kaXRNZXJnZVJlc3RvcmUiOiJ0cnVlIiwiU2l6ZUJhbmRpdFNwbGl0IjoidHJ1ZSIsIlNsb3RNYWNoaW5lQXVjdGlvbnMiOiJmYWxzZSIsIlN5bmNGcmVxdWVuY3lDYXAiOiJmYWxzZSIsIlN5bmNTcGFjaW5nIjoiZmFsc2UiLCJUU0RlcHRoU2NhbGVTcGxpdCI6ImZhbHNlIiwiVGltZW91dEJhbmRpdFNwbGl0IjoidHJ1ZSIsIlRpbWVvdXRDYXBFeHRlbmQiOiJ0cnVlIiwiVmlkZW9BQ0xpZmVjeWNsZVRlbGVtZXRyeVNwbGl0Ijoib2ZmIiwiVmlkZW9TdGFja0xhenkiOiJ0cnVlIn07d2luZG93Ll9fZXouZnNzPSc1MjYwNjU0OTgnOzwvc2NyaXB0PjxzY3JpcHQgZGF0YS1lenNjcmV4PSdmYWxzZScgZGF0YS1jZmFzeW5jPSdmYWxzZScgZGF0YS1wYWdlc3BlZWQtbm8tZGVmZXI+dmFyIF9fZXo9X19lenx8e307X19lei5zdG1zPURhdGUubm93KCk7X19lei5ldnQ9e307X19lei5zY3JpcHQ9e307X19lei5jaz1fX2V6LmNrfHx7fTtfX2V6LnRlbXBsYXRlPXt9O19fZXoudGVtcGxhdGUuaXNPcmlnPWZhbHNlO19fZXoucXVldWU9X19lei5xdWV1ZXx8ZnVuY3Rpb24oKXt2YXIgZT0wLGk9MCx0PVtdLG49ITEsbz1bXSxyPVtdLHM9ITAsYT1mdW5jdGlvbihlLGksbixvLHIscyxhKXt2YXIgbD1hcmd1bWVudHMubGVuZ3RoPjcmJnZvaWQgMCE9PWFyZ3VtZW50c1s3XT9hcmd1bWVudHNbN106d2luZG93LGQ9dGhpczt0aGlzLm5hbWU9ZSx0aGlzLmZ1bmNOYW1lPWksdGhpcy5wYXJhbWV0ZXJzPW51bGw9PT1uP251bGw6dyhuKT9uOltuXSx0aGlzLmlzQmxvY2s9byx0aGlzLmJsb2NrZWRCeT1yLHRoaXMuZGVsZXRlV2hlbkNvbXBsZXRlPXMsdGhpcy5pc0Vycm9yPSExLHRoaXMuaXNDb21wbGV0ZT0hMSx0aGlzLmlzSW5pdGlhbGl6ZWQ9ITEsdGhpcy5wcm9jZWVkSWZFcnJvcj1hLHRoaXMuZldpbmRvdz1sLHRoaXMuaXNUaW1lRGVsYXk9ITEsdGhpcy5wcm9jZXNzPWZ1bmN0aW9uKCl7ZigiLi4uIGZ1bmMgPSAiK2UpLGQuaXNJbml0aWFsaXplZD0hMCxkLmlzQ29tcGxldGU9ITAsZigiLi4uIGZ1bmMuYXBwbHk6ICIrZSk7dmFyIGk9ZC5mdW5jTmFtZS5zcGxpdCgiLiIpLG49bnVsbCxvPXRoaXMuZldpbmRvd3x8d2luZG93O2kubGVuZ3RoPjN8fChuPTM9PT1pLmxlbmd0aD9vW2lbMF1dW2lbMV1dW2lbMl1dOjI9PT1pLmxlbmd0aD9vW2lbMF1dW2lbMV1dOm9bZC5mdW5jTmFtZV0pLG51bGwhPW4mJm4uYXBwbHkobnVsbCx0aGlzLnBhcmFtZXRlcnMpLCEwPT09ZC5kZWxldGVXaGVuQ29tcGxldGUmJmRlbGV0ZSB0W2VdLCEwPT09ZC5pc0Jsb2NrJiYoZigiLS0tLS0gRidEOiAiK2QubmFtZSkscCgpKX19LGw9ZnVuY3Rpb24oZSxpLHQsbixvLHIscyl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aD43JiZ2b2lkIDAhPT1hcmd1bWVudHNbN10/YXJndW1lbnRzWzddOndpbmRvdyxsPXRoaXM7dGhpcy5uYW1lPWUsdGhpcy5wYXRoPWksdGhpcy5hc3luYz1vLHRoaXMuZGVmZXI9cix0aGlzLmlzQmxvY2s9dCx0aGlzLmJsb2NrZWRCeT1uLHRoaXMuaXNJbml0aWFsaXplZD0hMSx0aGlzLmlzRXJyb3I9ITEsdGhpcy5pc0NvbXBsZXRlPSExLHRoaXMucHJvY2VlZElmRXJyb3I9cyx0aGlzLmZXaW5kb3c9YSx0aGlzLmlzVGltZURlbGF5PSExLHRoaXMuaXNQYXRoPWZ1bmN0aW9uKGUpe3JldHVybiIvIj09PWVbMF0mJiIvIiE9PWVbMV19LHRoaXMuZ2V0U3JjPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT13aW5kb3cuX19lelNjcmlwdEhvc3QmJnRoaXMuaXNQYXRoKGUpP3dpbmRvdy5fX2V6U2NyaXB0SG9zdCtlOmV9LHRoaXMucHJvY2Vzcz1mdW5jdGlvbigpe2wuaXNJbml0aWFsaXplZD0hMCxmKCIuLi4gZmlsZSA9ICIrZSk7dmFyIGk9dGhpcy5mV2luZG93P3RoaXMuZldpbmRvdy5kb2N1bWVudDpkb2N1bWVudCx0PWkuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7dC5zcmM9dGhpcy5nZXRTcmModGhpcy5wYXRoKSwhMD09PW8/dC5hc3luYz0hMDohMD09PXImJih0LmRlZmVyPSEwKSx0Lm9uZXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT17dXJsOndpbmRvdy5sb2NhdGlvbi5ocmVmLG5hbWU6bC5uYW1lLHBhdGg6bC5wYXRoLHVzZXJfYWdlbnQ6d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnR9OyJ1bmRlZmluZWQiIT10eXBlb2YgX2V6YXEmJihlLnBhZ2V2aWV3X2lkPV9lemFxLnBhZ2Vfdmlld19pZCk7dmFyIGk9ZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KGUpKSx0PW5ldyBYTUxIdHRwUmVxdWVzdDt0Lm9wZW4oIkdFVCIsIi8vZy5lem9pYy5uZXQvZXpxbG9nP2Q9IitpLCEwKSx0LnNlbmQoKSxmKCItLS0tLSBFUlInRDogIitsLm5hbWUpLGwuaXNFcnJvcj0hMCwhMD09PWwuaXNCbG9jayYmcCgpfSx0Lm9ucmVhZHlzdGF0ZWNoYW5nZT10Lm9ubG9hZD1mdW5jdGlvbigpe3ZhciBlPXQucmVhZHlTdGF0ZTtmKCItLS0tLSBGJ0Q6ICIrbC5uYW1lKSxlJiYhL2xvYWRlZHxjb21wbGV0ZS8udGVzdChlKXx8KGwuaXNDb21wbGV0ZT0hMCwhMD09PWwuaXNCbG9jayYmcCgpKX0saS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLmFwcGVuZENoaWxkKHQpfX0sZD1mdW5jdGlvbihlLGkpe3RoaXMubmFtZT1lLHRoaXMucGF0aD0iIix0aGlzLmFzeW5jPSExLHRoaXMuZGVmZXI9ITEsdGhpcy5pc0Jsb2NrPSExLHRoaXMuYmxvY2tlZEJ5PVtdLHRoaXMuaXNJbml0aWFsaXplZD0hMCx0aGlzLmlzRXJyb3I9ITEsdGhpcy5pc0NvbXBsZXRlPWksdGhpcy5wcm9jZWVkSWZFcnJvcj0hMSx0aGlzLmlzVGltZURlbGF5PSExLHRoaXMucHJvY2Vzcz1mdW5jdGlvbigpe319O2Z1bmN0aW9uIGMoZSxpLG4scyxhLGQsYyx1LGYpe3ZhciBwPW5ldyBsKGUsaSxuLHMsYSxkLGMsZik7ITA9PT11P29bZV09cDpyW2VdPXAsdFtlXT1wLGgocCl9ZnVuY3Rpb24gaChlKXshMCE9PXUoZSkmJjAhPXMmJmUucHJvY2VzcygpfWZ1bmN0aW9uIHUoZSl7aWYoITA9PT1lLmlzVGltZURlbGF5JiYhMT09PW4pcmV0dXJuIGYoZS5uYW1lKyIgYmxvY2tlZCA9IFRJTUUgREVMQVkhIiksITA7aWYodyhlLmJsb2NrZWRCeSkpZm9yKHZhciBpPTA7aTxlLmJsb2NrZWRCeS5sZW5ndGg7aSsrKXt2YXIgbz1lLmJsb2NrZWRCeVtpXTtpZighMT09PXQuaGFzT3duUHJvcGVydHkobykpcmV0dXJuIGYoZS5uYW1lKyIgYmxvY2tlZCA9ICIrbyksITA7aWYoITA9PT1lLnByb2NlZWRJZkVycm9yJiYhMD09PXRbb10uaXNFcnJvcilyZXR1cm4hMTtpZighMT09PXRbb10uaXNDb21wbGV0ZSlyZXR1cm4gZihlLm5hbWUrIiBibG9ja2VkID0gIitvKSwhMH1yZXR1cm4hMX1mdW5jdGlvbiBmKGUpe3ZhciBpPXdpbmRvdy5sb2NhdGlvbi5ocmVmLHQ9bmV3IFJlZ0V4cCgiWz8mXWV6cT0oW14mI10qKSIsImkiKS5leGVjKGkpOyIxIj09PSh0P3RbMV06bnVsbCkmJmNvbnNvbGUuZGVidWcoZSl9ZnVuY3Rpb24gcCgpeysrZT4yMDB8fChmKCJsZXQncyBnbyIpLG0obyksbShyKSl9ZnVuY3Rpb24gbShlKXtmb3IodmFyIGkgaW4gZSlpZighMSE9PWUuaGFzT3duUHJvcGVydHkoaSkpe3ZhciB0PWVbaV07ITA9PT10LmlzQ29tcGxldGV8fHUodCl8fCEwPT09dC5pc0luaXRpYWxpemVkfHwhMD09PXQuaXNFcnJvcj8hMD09PXQuaXNFcnJvcj9mKHQubmFtZSsiOiBlcnJvciIpOiEwPT09dC5pc0NvbXBsZXRlP2YodC5uYW1lKyI6IGNvbXBsZXRlIGFscmVhZHkiKTohMD09PXQuaXNJbml0aWFsaXplZCYmZih0Lm5hbWUrIjogaW5pdGlhbGl6ZWQgYWxyZWFkeSIpOnQucHJvY2VzcygpfX1mdW5jdGlvbiB3KGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1yZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLChmdW5jdGlvbigpe3NldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bj0hMCxmKCJUREVMQVkgLS0tLS0iKSxwKCl9KSw1ZTMpfSksITEpLHthZGRGaWxlOmMsYWRkRmlsZU9uY2U6ZnVuY3Rpb24oZSxpLG4sbyxyLHMsYSxsLGQpe3RbZV18fGMoZSxpLG4sbyxyLHMsYSxsLGQpfSxhZGREZWxheUZpbGU6ZnVuY3Rpb24oZSxpKXt2YXIgbj1uZXcgbChlLGksITEsW10sITEsITEsITApO24uaXNUaW1lRGVsYXk9ITAsZihlKyIgLi4uICBGSUxFISBUREVMQVkiKSxyW2VdPW4sdFtlXT1uLGgobil9LGFkZEZ1bmM6ZnVuY3Rpb24oZSxuLHMsbCxkLGMsdSxmLHAsbSl7ITA9PT1jJiYoZT1lKyJfIitpKyspO3ZhciB3PW5ldyBhKGUsbixzLGwsZCx1LGYsbSk7ITA9PT1wP29bZV09dzpyW2VdPXcsdFtlXT13LGgodyl9LGFkZERlbGF5RnVuYzpmdW5jdGlvbihlLGksbil7dmFyIG89bmV3IGEoZSxpLG4sITEsW10sITAsITApO28uaXNUaW1lRGVsYXk9ITAsZihlKyIgLi4uICBGVU5DVElPTiEgVERFTEFZIikscltlXT1vLHRbZV09byxoKG8pfSxpdGVtczp0LHByb2Nlc3NBbGw6cCxzZXRhbGxvd0xvYWQ6ZnVuY3Rpb24oZSl7cz1lfSxtYXJrTG9hZGVkOmZ1bmN0aW9uKGUpe2lmKGUmJjAhPT1lLmxlbmd0aCl7aWYoZSBpbiB0KXt2YXIgaT10W2VdOyEwPT09aS5pc0NvbXBsZXRlP2YoaS5uYW1lKyIgIitlKyI6IGVycm9yIGxvYWRlZCBkdXBsaWNhdGUiKTooaS5pc0NvbXBsZXRlPSEwLGkuaXNJbml0aWFsaXplZD0hMCl9ZWxzZSB0W2VdPW5ldyBkKGUsITApO2YoIm1hcmtMb2FkZWQgZHVtbXlmaWxlOiAiK3RbZV0ubmFtZSl9fSxsb2dXaGF0c0Jsb2NrZWQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdCkhMSE9PXQuaGFzT3duUHJvcGVydHkoZSkmJnUodFtlXSl9fX0oKTtfX2V6LmV2dC5hZGQ9ZnVuY3Rpb24oZSx0LG4pe2UuYWRkRXZlbnRMaXN0ZW5lcj9lLmFkZEV2ZW50TGlzdGVuZXIodCxuLCExKTplLmF0dGFjaEV2ZW50P2UuYXR0YWNoRXZlbnQoIm9uIit0LG4pOmVbIm9uIit0XT1uKCl9LF9fZXouZXZ0LnJlbW92ZT1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyP2UucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4sITEpOmUuZGV0YWNoRXZlbnQ/ZS5kZXRhY2hFdmVudCgib24iK3Qsbik6ZGVsZXRlIGVbIm9uIit0XX07X19lei5zY3JpcHQuYWRkPWZ1bmN0aW9uKGUpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3Quc3JjPWUsdC5hc3luYz0hMCx0LnR5cGU9InRleHQvamF2YXNjcmlwdCIsZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZCh0KX07X19lei5kb3Q9X19lei5kb3R8fHt9O19fZXoucXVldWUuYWRkRmlsZU9uY2UoJy9kZXRyb2l0Y2hpY2Fnby9ib2lzZS5qcycsICcvZGV0cm9pdGNoaWNhZ28vYm9pc2UuanM/Z2NiPTE5NS0yJmNiPTUnLCB0cnVlLCBbXSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlKTtfX2V6LnF1ZXVlLmFkZEZpbGVPbmNlKCcvcGFyc29uc21haXplL2FiaWxlbmUuanMnLCAnL3BhcnNvbnNtYWl6ZS9hYmlsZW5lLmpzP2djYj0xOTUtMiZjYj02NTEyNzRmMGQxJywgdHJ1ZSwgW10sIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSk7X19lei5xdWV1ZS5hZGRGaWxlT25jZSgnL3BhcnNvbnNtYWl6ZS9tdWx2YW5lLmpzJywgJy9wYXJzb25zbWFpemUvbXVsdmFuZS5qcz9nY2I9MTk1LTImY2I9ZTc1ZTQ4ZWVjMCcsIHRydWUsIFsnL3BhcnNvbnNtYWl6ZS9hYmlsZW5lLmpzJ10sIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSk7X19lei5xdWV1ZS5hZGRGaWxlT25jZSgnL2RldHJvaXRjaGljYWdvL2Jpcm1pbmdoYW0uanMnLCAnL2RldHJvaXRjaGljYWdvL2Jpcm1pbmdoYW0uanM/Z2NiPTE5NS0yJmNiPWM0ZWQ2NTFhYjgnLCB0cnVlLCBbJy9wYXJzb25zbWFpemUvYWJpbGVuZS5qcyddLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOzwvc2NyaXB0Pgo8c2NyaXB0IGRhdGEtZXpzY3JleD0iZmFsc2UiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgZGF0YS1jZmFzeW5jPSJmYWxzZSI+d2luZG93Ll9lemFxID0gT2JqZWN0LmFzc2lnbih7ImFkX2NhY2hlX2xldmVsIjoxLCJhZHBpY2tlcl9wbGFjZW1lbnRfY250IjowLCJhaV9wbGFjZWhvbGRlcl9jYWNoZV9sZXZlbCI6MywiYWlfcGxhY2Vob2xkZXJfcGxhY2VtZW50X2NudCI6MSwiZG9tYWluIjoiZmlsZXNhbXBsZXMuY29tIiwiZG9tYWluX2lkIjoxNzY1MjcsImV6Y2FjaGVfbGV2ZWwiOjAsImV6Y2FjaGVfc2tpcF9jb2RlIjoxNCwiaGFzX2JhZF9pbWFnZSI6MCwiaGFzX2JhZF93b3JkcyI6MCwiaXNfc2l0ZXNwZWVkIjowLCJsdF9jYWNoZV9sZXZlbCI6MCwicmVzcG9uc2Vfc2l6ZSI6MTE4ODIsInJlc3BvbnNlX3NpemVfb3JpZyI6MTI5MSwicmVzcG9uc2VfdGltZV9vcmlnIjo3OTMsInRlbXBsYXRlX2lkIjoxMzQsInVybCI6Imh0dHBzOi8vZmlsZXNhbXBsZXMuY29tL3NhbXBsZXMvY29kZS9odG1sL3NhbXBsZTIuaHRtbCIsIndvcmRfY291bnQiOjc0LCJ3b3JzdF9iYWRfd29yZF9sZXZlbCI6MH0sIHR5cGVvZiB3aW5kb3cuX2V6YXEgIT09ICJ1bmRlZmluZWQiID8gd2luZG93Ll9lemFxIDoge30pO19fZXoucXVldWUubWFya0xvYWRlZCgnZXphcUJhc2VSZWFkeScpO2lmKHdpbmRvdy5fZXphcSYmd2luZG93Ll9lemFxLnBhZ2Vfdmlld19pZD09PSIwMWExNTkyNy02MjkyLTczYWItOTExYy04M2EyODZkMDVhZWMiKXt3aW5kb3cuX19lelB2U2lnPXdpbmRvdy5fX2V6UHZTaWd8fCJ0bjdmbWsuYWUwYmUwNTM4MzlmN2FlOTQ5MjAxYzAzNzdkMzUzZjYiO308L3NjcmlwdD4KPGxpbmsgcmVsPSdwcmVsb2FkJyBhcz0nc2NyaXB0JyBocmVmPScvL3NlY3VyZXB1YmFkcy5nLmRvdWJsZWNsaWNrLm5ldC90YWcvanMvZ3B0LmpzJz4KPGxpbmsgcmVsPSdwcmVsb2FkJyBhcz0nc2NyaXB0JyBocmVmPScvL2dvLmV6b2RuLmNvbS9oYi9kYWxsLmpzP2NiPTE5NS0yLTIwNyc+CjxzY3JpcHQ+KGZ1bmN0aW9uKCl7dmFyIGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpO2wucmVsPSdwcmVsb2FkJztsLmFzPSdzY3JpcHQnO2wuaHJlZj0oKCdub01vZHVsZScgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpPycvL3d3dy5lem9qcy5jb20vZXpvaWMvZXpvcmNhLmVzNi5taW4uanM/Y2I9YWQ2M2E1ZDc5ZCc6Jy8vd3d3LmV6b2pzLmNvbS9lem9pYy9lem9yY2EubWluLmpzP2NiPWY0YTE2YWQ0ZDcnKTtkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGwpO30pKCk7PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4oZnVuY3Rpb24oKXtmdW5jdGlvbiBzdG9yYWdlQXZhaWxhYmxlKHR5cGUpe3ZhciBzdG9yYWdlO3RyeXtzdG9yYWdlPXdpbmRvd1t0eXBlXTt2YXIgeD0nX19zdG9yYWdlX3Rlc3RfXyc7c3RvcmFnZS5zZXRJdGVtKHgseCk7c3RvcmFnZS5yZW1vdmVJdGVtKHgpO3JldHVybiB0cnVlO30KY2F0Y2goZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBET01FeGNlcHRpb24mJihlLmNvZGU9PT0yMnx8ZS5jb2RlPT09MTAxNHx8ZS5uYW1lPT09J1F1b3RhRXhjZWVkZWRFcnJvcid8fGUubmFtZT09PSdOU19FUlJPUl9ET01fUVVPVEFfUkVBQ0hFRCcpJiYoc3RvcmFnZSYmc3RvcmFnZS5sZW5ndGghPT0wKTt9fQpmdW5jdGlvbiByZW1vdmVfYW1hX2NvbmZpZygpe2lmKHN0b3JhZ2VBdmFpbGFibGUoJ2xvY2FsU3RvcmFnZScpKXtsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSgiZ29vZ2xlX2FtYV9jb25maWciKTt9fQpyZW1vdmVfYW1hX2NvbmZpZygpfSkoKTwvc2NyaXB0Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+dmFyIGV6b2ljVGVzdEFjdGl2ZSA9IHRydWU8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnIGRhdGEtZXpzY3JleD0nZmFsc2UnIGRhdGEtY2Zhc3luYz0nZmFsc2UnPgp3aW5kb3cuZXpBbmFseXRpY3NTdGF0aWMgPSB0cnVlOwoKZnVuY3Rpb24gYW5hbHl0aWNzQWRkU2NyaXB0KHNjcmlwdCkgewoJdmFyIGV6RHluYW1pYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwoJZXpEeW5hbWljLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKCWV6RHluYW1pYy5pbm5lckhUTUwgPSBzY3JpcHQ7Cglkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGV6RHluYW1pYyk7Cn0KZnVuY3Rpb24gZ2V0Q29va2llc1dpdGhQcmVmaXgoKSB7CiAgICB2YXIgYWxsQ29va2llcyA9IGRvY3VtZW50LmNvb2tpZS5zcGxpdCgnOycpOwogICAgdmFyIGNvb2tpZXNXaXRoUHJlZml4ID0ge307CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxDb29raWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGNvb2tpZSA9IGFsbENvb2tpZXNbaV0udHJpbSgpOwoKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFyZ3VtZW50cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICB2YXIgcHJlZml4ID0gYXJndW1lbnRzW2pdOwogICAgICAgICAgICBpZiAoY29va2llLmluZGV4T2YocHJlZml4KSA9PT0gMCkgewogICAgICAgICAgICAgICAgdmFyIGNvb2tpZVBhcnRzID0gY29va2llLnNwbGl0KCc9Jyk7CiAgICAgICAgICAgICAgICB2YXIgY29va2llTmFtZSA9IGNvb2tpZVBhcnRzWzBdOwogICAgICAgICAgICAgICAgdmFyIGNvb2tpZVZhbHVlID0gY29va2llUGFydHMuc2xpY2UoMSkuam9pbignPScpOwogICAgICAgICAgICAgICAgY29va2llc1dpdGhQcmVmaXhbY29va2llTmFtZV0gPSBkZWNvZGVVUklDb21wb25lbnQoY29va2llVmFsdWUpOwogICAgICAgICAgICAgICAgYnJlYWs7IC8vIE9uY2UgbWF0Y2hlZCwgbm8gbmVlZCB0byBjaGVjayBvdGhlciBwcmVmaXhlcwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBjb29raWVzV2l0aFByZWZpeDsKfQpmdW5jdGlvbiBnZXRPck1pbnRGc3MoKSB7Cgl2YXIgVUlOVDMyX01BWCA9IDQyOTQ5NjcyOTU7Cgl2YXIgVUlOVDMyX0RFQ0lNQUwgPSAvXlxkezEsMTB9JC87CglmdW5jdGlvbiBlbnN1cmVFeigpIHsKCQlpZiAoIXdpbmRvdy5fX2V6IHx8IHR5cGVvZiB3aW5kb3cuX19leiAhPT0gJ29iamVjdCcpIHsKCQkJd2luZG93Ll9fZXogPSB7fTsKCQl9CgkJcmV0dXJuIHdpbmRvdy5fX2V6OwoJfQoJZnVuY3Rpb24gaXNWYWxpZFVpbnQzMlN0cmluZyh2YWx1ZSkgewoJCWlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnIHx8ICF2YWx1ZSkgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJCWlmICghVUlOVDMyX0RFQ0lNQUwudGVzdCh2YWx1ZSkpIHsKCQkJcmV0dXJuIGZhbHNlOwoJCX0KCQlyZXR1cm4gTnVtYmVyKHZhbHVlKSA8PSBVSU5UMzJfTUFYOwoJfQoJaWYgKHdpbmRvdy5fX2V6ICYmIGlzVmFsaWRVaW50MzJTdHJpbmcod2luZG93Ll9fZXouZnNzKSkgewoJCXJldHVybiB3aW5kb3cuX19lei5mc3M7Cgl9Cgl2YXIgY29va2llU3RyID0gJyc7Cgl0cnkgewoJCWNvb2tpZVN0ciA9IGRvY3VtZW50LmNvb2tpZTsKCX0gY2F0Y2ggKGVycikgewoJCWNvb2tpZVN0ciA9ICcnOwoJfQoJaWYgKGNvb2tpZVN0ciAmJiB0eXBlb2YgY29va2llU3RyID09PSAnc3RyaW5nJykgewoJCXZhciBwYXJ0cyA9IGNvb2tpZVN0ci5zcGxpdCgnOycpOwoJCWZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHsKCQkJdmFyIHBhcnQgPSBwYXJ0c1tpXTsKCQkJdmFyIGVxID0gcGFydC5pbmRleE9mKCc9Jyk7CgkJCWlmIChlcSA9PT0gLTEpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCXZhciBuYW1lID0gcGFydC5zbGljZSgwLCBlcSkudHJpbSgpOwoJCQlpZiAobmFtZS5pbmRleE9mKCdlemZzXycpICE9PSAwKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCQl2YXIgcmF3ID0gcGFydC5zbGljZShlcSArIDEpLnRyaW0oKTsKCQkJdmFyIHZhbHVlOwoJCQl0cnkgewoJCQkJdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQocmF3KTsKCQkJfSBjYXRjaCAoZXJyKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCQlpZiAoIWlzVmFsaWRVaW50MzJTdHJpbmcodmFsdWUpKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCQllbnN1cmVFeigpLmZzcyA9IHZhbHVlOwoJCQlyZXR1cm4gdmFsdWU7CgkJfQoJfQoJdmFyIHNlZWQ7CglpZiAoCgkJdHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYKCQl0eXBlb2YgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyA9PT0gJ2Z1bmN0aW9uJyAmJgoJCXR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ2Z1bmN0aW9uJwoJKSB7CgkJc2VlZCA9IGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQzMkFycmF5KDEpKVswXTsKCX0gZWxzZSB7CgkJc2VlZCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDQyOTQ5NjcyOTYpOwoJfQoJdmFyIG1pbnRlZCA9IFN0cmluZyhzZWVkID4+PiAwKTsKCWVuc3VyZUV6KCkuZnNzID0gbWludGVkOwoJcmV0dXJuIG1pbnRlZDsKfQpmdW5jdGlvbiBwcm9kdWN0QW5hbHl0aWNzKCkgewoJdmFyIGQgPSB7InByIjpbMSw2LDNdLCJhb3AiOnsiMiI6MCwiNCI6MTM0fSwib21kNSI6ImU2YTdlZDE4N2NiMGQxOWQyYjk3YmM0YWFkMDA2MzAzIiwiZnNfc2VlZCI6IjUyNjA2NTQ5OCJ9OwoJZC51ID0gX2V6YXEudXJsOwoJZC5wID0gX2V6YXEucGFnZV92aWV3X2lkOwoJZC52ID0gX2V6YXEudmlzaXRfdXVpZDsKCWQuYWIgPSBfZXphcS5hYl90ZXN0X2lkOwoJZC5lID0gSlNPTi5zdHJpbmdpZnkoX2V6YXEpOwoJZC5yZWYgPSBkb2N1bWVudC5yZWZlcnJlcjsKCWQuZHcgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggfHwgd2luZG93LmlubmVyV2lkdGggfHwgMDsKCWQuZGggPSB3aW5kb3cuc2NyZWVuLmhlaWdodCB8fCAwOwoJZC52cHcgPSB3aW5kb3cuaW5uZXJXaWR0aCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggfHwgMDsKCWQudnBoID0gd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgfHwgMDsKCWQuZG9jaCA9IE1hdGgubWF4KChkb2N1bWVudC5ib2R5ICYmIGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KSB8fCAwLCAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQpIHx8IDAsIChkb2N1bWVudC5ib2R5ICYmIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0KSB8fCAwLCAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQpIHx8IDAsIChkb2N1bWVudC5ib2R5ICYmIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0KSB8fCAwLCAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpIHx8IDApOwoJZC5jID0gZ2V0Q29va2llc1dpdGhQcmVmaXgoJ2FjdGl2ZV90ZW1wbGF0ZScsICdleicsICdscF8nKTsKCWlmKHR5cGVvZiBlel91dG1QYXJhbXMgIT09ICd1bmRlZmluZWQnKSB7CgkJZC51dG0gPSBlel91dG1QYXJhbXM7Cgl9CglkLnFzID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaDsKCWlmICh0eXBlb2YgZC5mc19zZWVkID09PSAnc3RyaW5nJyAmJiBkLmZzX3NlZWQgJiYgKCF3aW5kb3cuX19leiB8fCAhd2luZG93Ll9fZXouZnNzKSkgewoJCWlmICghd2luZG93Ll9fZXogfHwgdHlwZW9mIHdpbmRvdy5fX2V6ICE9PSAnb2JqZWN0JykgewoJCQl3aW5kb3cuX19leiA9IHt9OwoJCX0KCQl3aW5kb3cuX19lei5mc3MgPSBkLmZzX3NlZWQ7Cgl9CglkLmZzX3NlZWQgPSBnZXRPck1pbnRGc3MoKTsKCgl2YXIgZGF0YVRleHQgPSBKU09OLnN0cmluZ2lmeShkKTsKCXZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKCXhoci5vcGVuKCdQT1NUJywnL2V6YWlzL2FuYWx5dGljcz9jYj0xJywgdHJ1ZSk7Cgl4aHIub25sb2FkID0gZnVuY3Rpb24gKCkgewoJCWlmICh4aHIuc3RhdHVzIT0yMDApIHsKICAgICAgICAgICAgcmV0dXJuOwoJCX0KCiAgICAgICAgaWYoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gJ2xvYWRpbmcnKSB7CiAgICAgICAgICAgIGFuYWx5dGljc0FkZFNjcmlwdCh4aHIucmVzcG9uc2UpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB2YXIgZXZlbnRGdW5jID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCBldmVudEZ1bmMsIGZhbHNlKTsKICAgICAgICAgICAgYW5hbHl0aWNzQWRkU2NyaXB0KHhoci5yZXNwb25zZSk7CiAgICAgICAgfTsKCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncmVhZHlzdGF0ZWNoYW5nZScsIGV2ZW50RnVuYywgZmFsc2UpOwoJfTsKCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCdDb250ZW50LVR5cGUnLCd0ZXh0L3BsYWluJyk7Cgl4aHIuc2VuZChkYXRhVGV4dCk7Cn0KX19lei5xdWV1ZS5hZGRGdW5jKCJwcm9kdWN0QW5hbHl0aWNzIiwgInByb2R1Y3RBbmFseXRpY3MiLCBudWxsLCB0cnVlLCBbJ2V6YXFCYXNlUmVhZHknXSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Cjwvc2NyaXB0PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBkYXRhLWV6c2NyZXg9ImZhbHNlIiBkYXRhLWNmYXN5bmM9ImZhbHNlIiBhc3luYz0iIj4KLy8gTWlycm9yIG9mIGdldE9yTWludEZzcyBpbiBhbmFseXRpY3MvYW5hbHl0aWNzc3RhdGljLmdvIChjYW5vbmljYWwpLiBPbmx5IHVzZWQKLy8gd2hlbiB0aGUgYW5hbHl0aWNzIHNjcmlwdCBpcyBhYnNlbnQgZnJvbSB0aGUgcGFnZTsga2VlcCB0aGUgY29udHJhY3QgaW4gc3luYzoKLy8gcHJlZmVyIHdpbmRvdy5fX2V6LmZzcywgZWxzZSB0aGUgZmlyc3QgdmFsaWQgZXpmc18qIGNvb2tpZSwgZWxzZSBtaW50IC0gYW5kCi8vIHN0b3JlIHRoZSByZXN1bHQgYmFjayBpbnRvIHdpbmRvdy5fX2V6LmZzcyBzbyB3aGljaGV2ZXIgb2YgdGhlIGFuYWx5dGljcyBhbmQKLy8gYXBwbGllciBzY3JpcHRzIHJ1bnMgZmlyc3QgZXN0YWJsaXNoZXMgdGhlIHBhZ2V2aWV3IHNlZWQgZm9yIHRoZSBvdGhlci4KZnVuY3Rpb24gZXpBcHBsaWVyR2V0T3JNaW50RnNzKCkgewoJZnVuY3Rpb24gaXNWYWxpZFVpbnQzMlN0cmluZyh2YWx1ZSkgewoJCXJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICEhdmFsdWUgJiYgL15cZHsxLDEwfSQvLnRlc3QodmFsdWUpICYmIE51bWJlcih2YWx1ZSkgPD0gNDI5NDk2NzI5NTsKCX0KCWlmICh3aW5kb3cuX19leiAmJiBpc1ZhbGlkVWludDMyU3RyaW5nKHdpbmRvdy5fX2V6LmZzcykpIHsKCQlyZXR1cm4gd2luZG93Ll9fZXouZnNzOwoJfQoJdmFyIGNvb2tpZVN0ciA9ICcnOwoJdHJ5IHsKCQljb29raWVTdHIgPSBkb2N1bWVudC5jb29raWU7Cgl9IGNhdGNoIChlcnIpIHsKCQljb29raWVTdHIgPSAnJzsKCX0KCWlmIChjb29raWVTdHIgJiYgdHlwZW9mIGNvb2tpZVN0ciA9PT0gJ3N0cmluZycpIHsKCQl2YXIgcGFydHMgPSBjb29raWVTdHIuc3BsaXQoJzsnKTsKCQlmb3IgKHZhciBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgaSsrKSB7CgkJCXZhciBwYXJ0ID0gcGFydHNbaV07CgkJCXZhciBlcSA9IHBhcnQuaW5kZXhPZignPScpOwoJCQlpZiAoZXEgPT09IC0xKSB7CgkJCQljb250aW51ZTsKCQkJfQoJCQlpZiAocGFydC5zbGljZSgwLCBlcSkudHJpbSgpLmluZGV4T2YoJ2V6ZnNfJykgIT09IDApIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCXZhciB2YWx1ZTsKCQkJdHJ5IHsKCQkJCXZhbHVlID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcnQuc2xpY2UoZXEgKyAxKS50cmltKCkpOwoJCQl9IGNhdGNoIChlcnIpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWlmICghaXNWYWxpZFVpbnQzMlN0cmluZyh2YWx1ZSkpIHsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWlmICghd2luZG93Ll9fZXogfHwgdHlwZW9mIHdpbmRvdy5fX2V6ICE9PSAnb2JqZWN0JykgewoJCQkJd2luZG93Ll9fZXogPSB7fTsKCQkJfQoJCQl3aW5kb3cuX19lei5mc3MgPSB2YWx1ZTsKCQkJcmV0dXJuIHZhbHVlOwoJCX0KCX0KCXZhciBzZWVkOwoJaWYgKHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBVaW50MzJBcnJheSA9PT0gJ2Z1bmN0aW9uJykgewoJCXNlZWQgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50MzJBcnJheSgxKSlbMF07Cgl9IGVsc2UgewoJCXNlZWQgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA0Mjk0OTY3Mjk2KTsKCX0KCXZhciBtaW50ZWQgPSBTdHJpbmcoc2VlZCA+Pj4gMCk7CglpZiAoIXdpbmRvdy5fX2V6IHx8IHR5cGVvZiB3aW5kb3cuX19leiAhPT0gJ29iamVjdCcpIHsKCQl3aW5kb3cuX19leiA9IHt9OwoJfQoJd2luZG93Ll9fZXouZnNzID0gbWludGVkOwoJcmV0dXJuIG1pbnRlZDsKfQpmdW5jdGlvbiBwcm9kdWN0RXpvaWNBZHMoKSB7CmlmKHdpbmRvdy5lekRpc2FibGVBZHMgPT09IHRydWUpIHsKCXJldHVybjsKfQp3aW5kb3cuZ29vZ2xlX3JlYWN0aXZlX2Fkc19nbG9iYWxfc3RhdGUgPSB7CiAgICAgICAgICAgICAgICBhZENvdW50OiB7fSwKICAgICAgICAgICAgICAgIGZsb2F0aW5nQWRzU3RhY2tpbmc6IHsgbWF4WkluZGV4TGlzdGVuZXJzOiBbXSwgbWF4WkluZGV4UmVzdHJpY3Rpb25zOiB7fSwgbmV4dFJlc3RyaWN0aW9uSWQ6IDAgfSwKICAgICAgICAgICAgICAgIG1lc3NhZ2VWYWxpZGF0aW9uRW5hYmxlZDogZmFsc2UsCiAgICAgICAgICAgICAgICByZWFjdGl2ZVR5cGVEaXNhYmxlZEJ5UHVibGlzaGVyOiB7fSwKICAgICAgICAgICAgICAgIHJlYWN0aXZlVHlwZUVuYWJsZWRJbkFzZmU6IHt9LAogICAgICAgICAgICAgICAgc2lkZVJhaWxBdmFpbGFibGVTcGFjZTogW10sCiAgICAgICAgICAgICAgICBzaWRlUmFpbE92ZXJsYXBwYWJsZUVsZW1lbnRzOiBbXSwKICAgICAgICAgICAgICAgIHN0YXRlRm9yVHlwZToge30sCiAgICAgICAgICAgICAgICB0YWdTcGVjaWZpY1N0YXRlOiB7fSwKICAgICAgICAgICAgICAgIHdhc1BsYVRhZ1Byb2Nlc3NlZDogdHJ1ZSwKICAgICAgICAgICAgICAgIHdhc1JlYWN0aXZlQWRDb25maWdSZWNlaXZlZDogeyAxOiB0cnVlLCAyOiB0cnVlLCA4OiB0cnVlIH0sCiAgICAgICAgICAgICAgICB3YXNSZWFjdGl2ZUFkVmlzaWJsZToge30sCiAgICAgICAgICAgICAgICB3YXNSZWFjdGl2ZVRhZ1JlcXVlc3RTZW50OiB0cnVlLAogICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICJDYW4ndCBkaXNhYmxlIGF1dG8gYWRzIHByb2dyYW1tYXRpY2FsbHkgb24gdGhlIHBhZ2UsIHNvIGhlcmUgd2UgYXJlISIKICAgICAgICAgICAgfTsKdmFyIGQgPSB7ImFiIjoiIiwia20iOnt9LCJwdiI6IiIsInZ1IjoiMDFhMTU5MjctNTI3NS03YTFjLWFmMGEtY2E3OTM5MmRmYjMzIiwiciI6eyJyIjpbeyJwIjoiIGV6b2ljX3B1Yl9hZF9wbGFjZWhvbGRlci03MDAtdG9wX29mX3BhZ2UtMzM2eDI4MC03MDAtbm9uZXh4eG5vbmV4eHh4eHhlem1heHNjYWxldmFsMTAwICIsInMiOjcwMCwiaCI6MjgwLCJ3Ijo5NzAsInIiOnRydWV9LHsicCI6IiBlem9pY19wdWJfYWRfcGxhY2Vob2xkZXItMTAwLWJvdHRvbV9mbG9hdGluZy03Mjh4OTAtMTAwLW5vbmV4eHhub25leHh4eHh4ZXptYXhzY2FsZXZhbDEwMCAiLCJzIjoxMDAsImgiOjkwLCJ3Ijo5NzAsInIiOnRydWV9LHsicCI6IiBlem9pY19wdWJfYWRfcGxhY2Vob2xkZXItOTc1LWVkZ2UtMTYweDYwMC05NzUtbm9uZXh4eG5vbmV4eHh4eHhlem1heHNjYWxldmFsMTAwICIsInMiOjk3NSwiaCI6NjAwLCJ3IjoxNjAsInIiOnRydWV9XSwiYSI6eyIxMDAiOnRydWUsIjEyIjp0cnVlLCI2Ijp0cnVlLCI3MDAiOnRydWUsIjk3NSI6dHJ1ZX0sImciOi0xLCJsIjp7IjAiOjQsIjEiOjMsIjIiOjIsIjMiOjEsIjQiOi0xLCI1IjotMX0sIm0iOnsiMCI6NCwiMSI6MywiMiI6MiwiMyI6MSwiNCI6LTEsIjUiOi0xfSwidiI6MCwidmUiOmZhbHNlLCJociI6ZmFsc2UsInNhIjpmYWxzZX0sImNyIjoiIiwidGlkIjoxMzQsInRuIjoicHViX3NpdGUiLCJ1cmwiOiIiLCJ3YyI6NzQsImZmIjoxLCJkaGgiOiIiLCJkdyI6MCwiZGgiOjAsInZwdyI6MCwidnBoIjowLCJkb2NoIjowfTsKZC5hYiA9IF9lemFxLmFiX3Rlc3RfaWQ7CmQucHYgPSBfZXphcS5wYWdlX3ZpZXdfaWQ7CmQudnUgPSBfZXphcS52aXNpdF91dWlkOwpkLnVybCA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwpkLmR3ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoIHx8IHdpbmRvdy5pbm5lcldpZHRoIHx8IDA7CmQuZGggPSB3aW5kb3cuc2NyZWVuLmhlaWdodCB8fCAwOwpkLnZwdyA9IHdpbmRvdy5pbm5lcldpZHRoIHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCB8fCAwOwpkLnZwaCA9IHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0IHx8IDA7CmQuZG9jaCA9IE1hdGgubWF4KChkb2N1bWVudC5ib2R5ICYmIGRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KSB8fCAwLCAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQpIHx8IDAsIChkb2N1bWVudC5ib2R5ICYmIGRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0KSB8fCAwLCAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQpIHx8IDAsIChkb2N1bWVudC5ib2R5ICYmIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0KSB8fCAwLCAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpIHx8IDApOwovLyBQcmVmZXIgdGhlIGFuYWx5dGljcyBzY3JpcHQncyBnZXRPck1pbnRGc3Mgd2hlbiBwcmVzZW50IHNvIGJvdGggUE9TVCBwYXRocwovLyBzaGFyZSBvbmUgc2VlZCBpbXBsZW1lbnRhdGlvbjsgZmFsbCBiYWNrIHRvIHRoZSBtaXJyb3IgYWJvdmUgb3RoZXJ3aXNlLgpkLmZzX3NlZWQgPSAodHlwZW9mIGdldE9yTWludEZzcyA9PT0gJ2Z1bmN0aW9uJykgPyBnZXRPck1pbnRGc3MoKSA6IGV6QXBwbGllckdldE9yTWludEZzcygpOwovLyBFY2hvIHRoZSBwYWdldmlldydzIHB1Ymxpc2hlci10ZXN0IHNlZWQgcmVhZC1vbmx5OyBuZXZlciBtaW50IG9uZSBjbGllbnQtc2lkZS4KaWYgKHR5cGVvZiBfZXphcSAhPT0gJ3VuZGVmaW5lZCcgJiYgX2V6YXEgJiYgX2V6YXEucHRfc2VlZCAhPSBudWxsICYmIF9lemFxLnB0X3NlZWQgIT09ICcnKSB7CglkLnB0X3NlZWQgPSBTdHJpbmcoX2V6YXEucHRfc2VlZCk7Cn0KdmFyIGR5bmFtaWNBZGRTY3JpcHQgPSBmdW5jdGlvbihzY3JpcHQpIHsKCWlmKHdpbmRvdy5lekZpbmlzaGVkU3RhdGljID09PSB0cnVlKSB7CgkJY29uc29sZS5lcnJvcigiYXR0ZW1wdGVkIHRvIGxvYWQgZHluYW1pYyBzY3JpcHQgYWdhaW4iKTsKCQlyZXR1cm47Cgl9Cgl2YXIgZXJyb3JNZXNzYWdlcyA9IFtdOwoJZnVuY3Rpb24gZXJyb3JIYW5kbGVyKGV2ZW50KSB7CgkgIHZhciBlcnJvck9iaiA9IGV2ZW50LmVycm9yOwoJICBpZiAoZXJyb3JPYmogJiYgZXJyb3JPYmouc3RhY2sgJiYgZXJyb3JPYmouc3RhY2suaW5kZXhPZignZHluYW1pY0FkZFNjcmlwdCcpICE9PSAtMSkgewoJCXZhciBlcnJvck1lc3NhZ2UgPSB7CgkJICBNZXNzYWdlOiBldmVudC5tZXNzYWdlLAoJCSAgTGluZU5vOiBldmVudC5saW5lbm8sCgkJICBDb2x1bW5ObzogZXZlbnQuY29sbm8sCgkJICBTdGFjazogZXJyb3JPYmouc3RhY2sKCQl9OwoJCWVycm9yTWVzc2FnZXMucHVzaChlcnJvck1lc3NhZ2UpOwoJICB9CgoJICBpZiAodHlwZW9mIHdpbmRvdy5vbmVycm9yID09PSAnZnVuY3Rpb24nKSB7CgkJd2luZG93Lm9uZXJyb3IuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKCSAgfQoJfQogCXdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9ySGFuZGxlcik7CgoJdmFyIGV6RHluYW1pYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwoJZXpEeW5hbWljLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKCWV6RHluYW1pYy5pbm5lckhUTUwgPSBzY3JpcHQ7Cglkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGV6RHluYW1pYyk7CgoJd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgZXJyb3JIYW5kbGVyKTsKCWlmICh3aW5kb3cuZXpGaW5pc2hlZFN0YXRpYyAhPT0gdHJ1ZSB8fCB0eXBlb2Ygd2luZG93LmV6c3RhdGljZXJyb3JzICE9PSAndW5kZWZpbmVkJykgewoJCWQuU2NyaXB0ID0gc2NyaXB0OwoJCWQuRXJyb3JNZXNzYWdlcyA9IEpTT04uc3RyaW5naWZ5KGVycm9yTWVzc2FnZXMpOwoJCWQuRXJyb3JTdGF0aWNNZXNzYWdlcyA9IHdpbmRvdy5lenN0YXRpY2Vycm9ycyB8fCAnJzsKCQl2YXIgZGF0YVR4dCA9IEpTT04uc3RyaW5naWZ5KGQpOwoJCWlmIChkYXRhVHh0Lmxlbmd0aCA+IDApIHsKCQkJdmFyIGxvZ1hIUiA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwoJCQlsb2dYSFIub3BlbignUE9TVCcsJy9lemFpcy9sb2c/Y2I9MScsIHRydWUpOwoJCQlsb2dYSFIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywnYXBwbGljYXRpb24vanNvbicpOwoJCQlsb2dYSFIuc2VuZChkYXRhVHh0KTsKCQl9Cgl9Cn07CmZ1bmN0aW9uIGNvbGxlY3RGUChjYikgewoJdmFyIGxpYiA9ICh0eXBlb2YgY2UgIT09ICJ1bmRlZmluZWQiKSA/IGNlIDogKHR5cGVvZiBGaW5nZXJwcmludEpTICE9PSAidW5kZWZpbmVkIiA/IEZpbmdlcnByaW50SlMgOiBudWxsKTsKCWlmICghbGliKSB7IGNiKCk7IHJldHVybjsgfQoJdHJ5IHsKCQlsaWIubG9hZCgpLnRoZW4oZnVuY3Rpb24oYWdlbnQpIHsgcmV0dXJuIGFnZW50LmdldCgpOyB9KS50aGVuKGZ1bmN0aW9uKHJlcykgewoJCQl0cnkgewoJCQkJdmFyIGMgPSByZXMuY29tcG9uZW50cyB8fCB7fTsKCQkJCWQuZnAgPSB7CgkJCQkJcHI6IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDAsCgkJCQkJaGM6IChjLmhhcmR3YXJlQ29uY3VycmVuY3kgJiYgYy5oYXJkd2FyZUNvbmN1cnJlbmN5LnZhbHVlKSA/IGMuaGFyZHdhcmVDb25jdXJyZW5jeS52YWx1ZSA6IChuYXZpZ2F0b3IuaGFyZHdhcmVDb25jdXJyZW5jeSB8fCAwKSwKCQkJCQlkbTogbmF2aWdhdG9yLmRldmljZU1lbW9yeSB8fCAwLAoJCQkJCWNoOiBjLmNhbnZhcyAmJiBjLmNhbnZhcy52YWx1ZSAmJiBjLmNhbnZhcy52YWx1ZS50ZXh0ID8gYy5jYW52YXMudmFsdWUudGV4dCA6ICcnLAoJCQkJCXdyOiBjLndlYkdsQmFzaWNzICYmIGMud2ViR2xCYXNpY3MudmFsdWUgPyAoYy53ZWJHbEJhc2ljcy52YWx1ZS5yZW5kZXJlclVubWFza2VkIHx8IGMud2ViR2xCYXNpY3MudmFsdWUucmVuZGVyZXIgfHwgJycpIDogJycsCgkJCQkJd3Y6IGMud2ViR2xCYXNpY3MgJiYgYy53ZWJHbEJhc2ljcy52YWx1ZSA/IChjLndlYkdsQmFzaWNzLnZhbHVlLnZlbmRvclVubWFza2VkIHx8IGMud2ViR2xCYXNpY3MudmFsdWUudmVuZG9yIHx8ICcnKSA6ICcnLAoJCQkJCWFmOiBjLmF1ZGlvICYmIGMuYXVkaW8udmFsdWUgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhjLmF1ZGlvLnZhbHVlKSA6ICcnLAoJCQkJCWZ0OiBjLmZvbnRzICYmIGMuZm9udHMudmFsdWUgPyBjLmZvbnRzLnZhbHVlLmpvaW4oJywnKSA6ICcnCgkJCQl9OwoJCQl9IGNhdGNoKGUpIHt9CgkJCWNiKCk7CgkJfSkuY2F0Y2goZnVuY3Rpb24oKSB7IGNiKCk7IH0pOwoJfSBjYXRjaChlKSB7IGNiKCk7IH0KfQpmdW5jdGlvbiBwZXJzaXN0QWREZW1vQ29va2llKCkgewoJdHJ5IHsKCQl2YXIgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsKCQl2YXIgY29va2llTmFtZSA9ICJlel9hZF9kZW1vXzE3NjUyNyI7CgkJdmFyIHN0YXRlID0ge307CgkJdmFyIGN1cnJlbnQgPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKD86Xnw7ICknICsgY29va2llTmFtZS5yZXBsYWNlKC8oWy4kPyp8e30oKVxbXF1cXFwvXCteXSkvZywgJ1xcJDEnKSArICc9KFteO10qKScpKTsKCQlpZiAoY3VycmVudCAmJiBjdXJyZW50WzFdKSB7CgkJCWN1cnJlbnRbMV0uc3BsaXQoJywnKS5mb3JFYWNoKGZ1bmN0aW9uKHBhcnQpIHsKCQkJCXZhciBpZHggPSBwYXJ0LmluZGV4T2YoJz0nKTsKCQkJCWlmIChpZHggPiAwKSB7CgkJCQkJc3RhdGVbcGFydC5zbGljZSgwLCBpZHgpXSA9IHBhcnQuc2xpY2UoaWR4ICsgMSk7CgkJCQl9CgkJCX0pOwoJCX0KCQl2YXIgY2hhbmdlZCA9IGZhbHNlOwoJCXZhciBtYXhBZHMgPSBwYXJhbXMuZ2V0KCdlel9hZF9kZW1vJyk7CgkJaWYgKG1heEFkcyAhPT0gbnVsbCAmJiAvXlswLTldKyQvLnRlc3QobWF4QWRzKSkgewoJCQlzdGF0ZS5tID0gbWF4QWRzOwoJCQlzdGF0ZS5xID0gJzAnOwoJCQlzdGF0ZS5zID0gJzAnOwoJCQlzdGF0ZS5pID0gJzAnOwoJCQljaGFuZ2VkID0gdHJ1ZTsKCQl9CgkJdmFyIGFuY2hvciA9IHBhcmFtcy5nZXQoJ2V6X2FkX2RlbW9fYW5jaG9yJyk7CgkJaWYgKGFuY2hvciA9PT0gJzAnIHx8IGFuY2hvciA9PT0gJzEnKSB7CgkJCXN0YXRlLmEgPSBhbmNob3I7CgkJCWNoYW5nZWQgPSB0cnVlOwoJCX0KCQl2YXIgb3V0c3RyZWFtID0gcGFyYW1zLmdldCgnZXpfYWRfZGVtb19vdXRzdHJlYW0nKTsKCQlpZiAob3V0c3RyZWFtID09PSAnMCcgfHwgb3V0c3RyZWFtID09PSAnMScpIHsKCQkJc3RhdGUubyA9IG91dHN0cmVhbTsKCQkJY2hhbmdlZCA9IHRydWU7CgkJfQoJCXZhciBxdWJpdCA9IHBhcmFtcy5nZXQoJ2V6X2FkX2RlbW9fcXViaXQnKTsKCQlpZiAocXViaXQgPT09ICcwJyB8fCBxdWJpdCA9PT0gJzEnKSB7CgkJCXN0YXRlLnEgPSBxdWJpdDsKCQkJY2hhbmdlZCA9IHRydWU7CgkJfQoJCWlmICghY2hhbmdlZCkgewoJCQlyZXR1cm47CgkJfQoJCXZhciBwYXJ0cyA9IFtdOwoJCWlmIChzdGF0ZS5tICE9PSB1bmRlZmluZWQpIHsgcGFydHMucHVzaCgnbT0nICsgc3RhdGUubSk7IH0KCQlpZiAoc3RhdGUuYSAhPT0gdW5kZWZpbmVkKSB7IHBhcnRzLnB1c2goJ2E9JyArIHN0YXRlLmEpOyB9CgkJaWYgKHN0YXRlLm8gIT09IHVuZGVmaW5lZCkgeyBwYXJ0cy5wdXNoKCdvPScgKyBzdGF0ZS5vKTsgfQoJCWlmIChzdGF0ZS5zICE9PSB1bmRlZmluZWQpIHsgcGFydHMucHVzaCgncz0nICsgc3RhdGUucyk7IH0KCQlpZiAoc3RhdGUuaSAhPT0gdW5kZWZpbmVkKSB7IHBhcnRzLnB1c2goJ2k9JyArIHN0YXRlLmkpOyB9CgkJaWYgKHN0YXRlLnEgIT09IHVuZGVmaW5lZCkgeyBwYXJ0cy5wdXNoKCdxPScgKyBzdGF0ZS5xKTsgfQoJCWRvY3VtZW50LmNvb2tpZSA9IGNvb2tpZU5hbWUgKyAnPScgKyBwYXJ0cy5qb2luKCcsJykgKyAnOyBwYXRoPS87IG1heC1hZ2U9ODY0MDA7IFNhbWVTaXRlPUxheCc7Cgl9IGNhdGNoKGUpIHt9Cn0KcGVyc2lzdEFkRGVtb0Nvb2tpZSgpOwpjb2xsZWN0RlAoZnVuY3Rpb24oKSB7CnZhciBkYXRhVGV4dCA9IEpTT04uc3RyaW5naWZ5KGQpOwppZiAoZGF0YVRleHQubGVuZ3RoID4gMCkgewoJdmFyIHN0YXJ0VGltZSA9IERhdGUubm93KCkgLSBfX2V6LnN0bXM7CgoJdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwoJeGhyLm9wZW4oJ1BPU1QnLCcvZXphaXMvZHluYW1pYz9jYj0xJywgdHJ1ZSk7Cgl4aHIub25sb2FkID0gZnVuY3Rpb24gKCkgewoJCWlmICh4aHIuc3RhdHVzIT0yMDApIHsKICAgICAgICAgICAgcmV0dXJuOwoJCX0KCiAgICAgICAgaWYoZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gJ2xvYWRpbmcnKSB7CiAgICAgICAgICAgIGR5bmFtaWNBZGRTY3JpcHQoeGhyLnJlc3BvbnNlKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIGV2ZW50RnVuYyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZihkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgZXZlbnRGdW5jLCBmYWxzZSk7CiAgICAgICAgICAgIGR5bmFtaWNBZGRTY3JpcHQoeGhyLnJlc3BvbnNlKTsKICAgICAgICB9OwoKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgZXZlbnRGdW5jLCBmYWxzZSk7Cgl9OwoJeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsJ3RleHQvcGxhaW4nKTsKCXhoci5zZW5kKGRhdGFUZXh0KTsKfQp9KTsKfQoKZnVuY3Rpb24gY2FsbER5bmFtaWNBZnRlckNvbnNlbnQoKSB7CglpZiAod2luZG93Ll9fdGNmYXBpKSB7CgkJd2luZG93Ll9fdGNmYXBpKCJhZGRFdmVudExpc3RlbmVyIiwgMiwgZnVuY3Rpb24gKHRjZGF0YSwgc3VjY2VzcykgewoJCQlpZiAoc3VjY2VzcykgewoJCQkJaWYodGNkYXRhLmdkcHJBcHBsaWVzID09IHRydWUpIHsKCQkJCQlpZih0Y2RhdGEuZXZlbnRTdGF0dXMgPT09ICJ1c2VyYWN0aW9uY29tcGxldGUiIHx8IHRjZGF0YS5ldmVudFN0YXR1cyA9PT0gInRjbG9hZGVkIikgewoJCQkJCQlfX2V6LnF1ZXVlLmFkZEZ1bmMoInByb2R1Y3RFem9pY0FkcyIsICJwcm9kdWN0RXpvaWNBZHMiLCBudWxsLCB0cnVlLCBbJ2V6YXFSZWFkeSddLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKCQkJCQl9CgkJCQl9IGVsc2UgewoJCQkJCV9fZXoucXVldWUuYWRkRnVuYygicHJvZHVjdEV6b2ljQWRzIiwgInByb2R1Y3RFem9pY0FkcyIsIG51bGwsIHRydWUsIFsnZXphcVJlYWR5J10sIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOwoJCQkJfQoJCQl9CgkJfSk7Cgl9IGVsc2UgewoJCV9fZXoucXVldWUuYWRkRnVuYygicHJvZHVjdEV6b2ljQWRzIiwgInByb2R1Y3RFem9pY0FkcyIsIG51bGwsIHRydWUsIFsnZXphcVJlYWR5J10sIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOwoJfQp9CgoKaWYgKHdpbmRvdy5fX3RjZmFwaSkgewoJY2FsbER5bmFtaWNBZnRlckNvbnNlbnQoKTsKfSBlbHNlIHsKCWlmICh0eXBlb2Ygd2luZG93LmV6Q01QUXVldWUgIT09ICJ1bmRlZmluZWQiKSB7CgkJd2luZG93LmV6Q01QUXVldWUucHVzaChjYWxsRHluYW1pY0FmdGVyQ29uc2VudCk7Cgl9IGVsc2UgewoJCV9fZXoucXVldWUuYWRkRnVuYygicHJvZHVjdEV6b2ljQWRzIiwgInByb2R1Y3RFem9pY0FkcyIsIG51bGwsIHRydWUsIFsnZXphcVJlYWR5J10sIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOwoJfQp9Cjwvc2NyaXB0PjxiYXNlIGhyZWY9Imh0dHBzOi8vZmlsZXNhbXBsZXMuY29tL3NhbXBsZXMvY29kZS9odG1sL3NhbXBsZTIuaHRtbCIvPgo8dGl0bGU+RW50ZXIgYSB0aXRsZSwgZGlzcGxheWVkIGF0IHRoZSB0b3Agb2YgdGhlIHdpbmRvdy48L3RpdGxlPgo8c2NyaXB0IGRhdGEtZXpzY3JleD0iZmFsc2UiPndpbmRvdy5RdWJpdENzc0V4Y2x1c2lvbnMgPSBbIm5hdiIsImJsb2NrcXVvdGUiLCJ0YWJsZSIsIi5lbnRyeS1zdW1tYXJ5IiwiLmV4Y2VycHQiLCIuZW50cnktYWN0aW9ucyIsIi53aWRnZXQtYXJlYSIsIi5zaXRlLWZvb3RlciJdOzwvc2NyaXB0PjxzY3JpcHQgYXN5bmMgZGF0YT0icXViaXQiIHNyYz0iLy93d3cuZXpvanMuY29tL2V6b2ljL3NhLm1pbi5qcz9xPTEiPjwvc2NyaXB0Pgo8c2NyaXB0PgogIHdpbmRvdy5lenN0YW5kYWxvbmUgPSB3aW5kb3cuZXpzdGFuZGFsb25lIHx8IHt9OwogIGV6c3RhbmRhbG9uZS5jbWQgPSBlenN0YW5kYWxvbmUuY21kIHx8IFtdOwo8L3NjcmlwdD48c2NyaXB0PihmdW5jdGlvbiAoKSB7CiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3F1Yml0LWpzLWV6b2ljJykpIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIHN0YXJ0ID0gRGF0ZS5ub3coKTsKICAgIHZhciBkZWxheSA9IDUwOwoKICAgIGZ1bmN0aW9uIGxvYWRRdWJpdFNjcmlwdCgpIHsKICAgIAogICAgICAgIGlmICh3aW5kb3cuUXViaXRJbnN0YW50UmVtb3ZlKSB7CiAgICAgICAgICAgIGlmKHR5cGVvZiBlenN0YW5kYWxvbmUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBlenN0YW5kYWxvbmUuQ2xlYW51cEdob3N0UGxhY2Vob2xkZXJzID09PSAnZnVuY3Rpb24nKSB7ZXpzdGFuZGFsb25lLkNsZWFudXBHaG9zdFBsYWNlaG9sZGVycygpO30KICAgICAgICB9CgogICAgICAgIHZhciBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgcy5pZCA9ICdxdWJpdC1qcy1lem9pYyc7CiAgICAgICAgcy5zcmMgPSAnaHR0cHM6Ly9nLmV6b2ljLm5ldC9wb3Jwb2lzZWFudC9xdWJpdC5qcz92PTImZGlkPTE3NjUyNyc7CiAgICAgICAgcy5hc3luYyA9IHRydWU7CiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzKTsKICAgIH0KCiAgICBmdW5jdGlvbiB3YWl0Rm9yU3RhbmRhbG9uZSgpIHsKICAgIAogICAgICAgIHZhciB0aW1lRWxhcHNlZCA9IERhdGUubm93KCkgLSBzdGFydDsKCgogICAgICAgIGlmICh3aW5kb3cuZXpzdGFuZGFsb25lICYmIHR5cGVvZiB3aW5kb3cuZXpzdGFuZGFsb25lLkdldEdlbmVyYXRlZElkID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHZhciBpc1BsYWNlbWVudFNlcnZpY2UgPSB0eXBlb2Ygd2luZG93LnByb2R1Y3RFem9pY0FkcyA9PT0gImZ1bmN0aW9uIiB8fCAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLW1ldGhvZD0icGxhY2VtZW50LXNlcnZpY2UiXScpOwogICAgICAgICAgICBpZih3aW5kb3cuUXViaXRJbnN0YW50UmVtb3ZlKSB7aXNQbGFjZW1lbnRTZXJ2aWNlID0gZmFsc2U7fQogICAgICAgICAgICBpZiAoaXNQbGFjZW1lbnRTZXJ2aWNlICYmIHdpbmRvdy5lekZpbmlzaGVkU3RhdGljIHx8IGlzUGxhY2VtZW50U2VydmljZSAmJiB0aW1lRWxhcHNlZCA+IDEwMDAwIHx8ICFpc1BsYWNlbWVudFNlcnZpY2UpIHsKICAgICAgICAgICAgICAgIGxvYWRRdWJpdFNjcmlwdCgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodGltZUVsYXBzZWQgPj0gMzAwMDApIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcignZXpzdGFuZGFsb25lIG5vdCByZWFkeSBhZnRlciAzMHMsIHNraXBwaW5nIHF1Yml0IGxvYWQnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgc2V0VGltZW91dCh3YWl0Rm9yU3RhbmRhbG9uZSwgZGVsYXkpOwoKICAgICAgICBkZWxheSA9IE1hdGgubWluKE1hdGguZmxvb3IoZGVsYXkgKiAxLjAyKSwgNTAwKTsKICAgIH0KCiAgICB3YWl0Rm9yU3RhbmRhbG9uZSgpOwp9KSgpOwo8L3NjcmlwdD4KPHNjcmlwdCB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPgp2YXIgZXpvVGVtcGxhdGUgPSAncHViX3NpdGUnOwp2YXIgZXpvdWlkID0gJzEnOwp2YXIgZXpvRm9ybWZhY3RvciA9ICcxJzsKPC9zY3JpcHQ+PHNjcmlwdCBkYXRhLWV6c2NyZXg9ImZhbHNlIiB0eXBlPSd0ZXh0L2phdmFzY3JpcHQnPgp2YXIgc29jX2FwcF9pZCA9ICcwJzsKdmFyIGRpZCA9IDE3NjUyNzsKdmFyIGV6ZG9tYWluID0gJ2ZpbGVzYW1wbGVzLmNvbSc7CnZhciBlem9pY1NlYXJjaGFibGUgPSAxOwo8L3NjcmlwdD4KPHNjcmlwdCBhc3luYyBkYXRhLWV6c2NyZXg9ImZhbHNlIiBkYXRhLWNmYXN5bmM9ImZhbHNlIiBzcmM9Ii8vb3Blbi52aWRlby92aWRlby5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0ndGV4dC9qYXZhc2NyaXB0JyBzdHlsZT0nZGlzcGxheTpub25lOycgYXN5bmM+d2luZG93Ll9fZXpPcHRhYmxlQXBwcm92ZWQ9dHJ1ZTtpZiAodHlwZW9mIHdpbmRvdy5fX2V6ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuX19lej8ucXVldWU/LmFkZEZpbGVPbmNlKSB7d2luZG93Ll9fZXoucXVldWUuYWRkRmlsZU9uY2UoJ2lkZW50aXR5JywgKCdub01vZHVsZScgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpPydodHRwczovL2dvLmV6b2RuLmNvbS9kZXRyb2l0Y2hpY2Fnby9pbmR5LmVzNi5qcz9jYj0yNiZnY2I9MCc6J2h0dHBzOi8vZ28uZXpvZG4uY29tL2RldHJvaXRjaGljYWdvL2luZHkuanM/Y2I9MTg0JmdjYj0wJywgdHJ1ZSwgW10sIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7fSA8L3NjcmlwdD4KPGxpbmsgcmVsPSdjYW5vbmljYWwnIGhyZWY9J2h0dHBzOi8vZmlsZXNhbXBsZXMuY29tL3NhbXBsZXMvY29kZS9odG1sL3NhbXBsZTIuaHRtbCcgLz48L2hlYWQ+CjwhLS0gVGhlIGluZm9ybWF0aW9uIGJldHdlZW4gdGhlIEJPRFkgYW5kIC9CT0RZIHRhZ3MgaXMgZGlzcGxheWVkLi0tPgo8Ym9keT4KPGgxPkVudGVyIHRoZSBtYWluIGhlYWRpbmcsIHVzdWFsbHkgdGhlIHNhbWUgYXMgdGhlIHRpdGxlLjwvaDE+CjxwPkJlIDxiPmJvbGQ8L2I+IGluIHN0YXRpbmcgeW91ciBrZXkgcG9pbnRzLiBQdXQgdGhlbSBpbiBhIGxpc3Q6IDwvcD48c3BhbiBpZD0iZXpvaWMtcHViLWFkLXBsYWNlaG9sZGVyLTcwMCIgZGF0YS1tZXRob2Q9ImFpLXBsYWNlaG9sZGVycyIgY2xhc3M9ImV6b2ljLWF1dG9pbnNlcnQtYWQiPjwvc3Bhbj48c3BhbiBkYXRhLWV6LXBoLWlkPSI3MDAiIHN0eWxlPSJmbG9hdDpub25lICFpbXBvcnRhbnQ7bWFyZ2luLWJvdHRvbToxNXB4ICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6YXV0byAhaW1wb3J0YW50O2Rpc3BsYXk6YmxvY2sgIWltcG9ydGFudDt0ZXh0LWFsaWduOmNlbnRlciAhaW1wb3J0YW50O3dpZHRoOjEwMCU7cGFkZGluZzowO2JveC1zaXppbmc6Y29udGVudC1ib3g7bWFyZ2luLXRvcDoxNXB4ICFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0OmF1dG8gIWltcG9ydGFudDttaW4td2lkdGg6bWluKDk3MHB4LDEwMCUpO21pbi1oZWlnaHQ6MjgwcHg7bWF4LXdpZHRoOjEwMCUgIWltcG9ydGFudDtsaW5lLWhlaWdodDowcHg7Ij48L3NwYW4+Cjx1bD4KPGxpPlRoZSBmaXJzdCBpdGVtIGluIHlvdXIgbGlzdDwvbGk+CjxsaT5UaGUgc2Vjb25kIGl0ZW07IDxpPml0YWxpY2l6ZTwvaT4ga2V5IHdvcmRzPC9saT4KPC91bD4KPHA+SW1wcm92ZSB5b3VyIGltYWdlIGJ5IGluY2x1ZGluZyBhbiBpbWFnZS4gPC9wPgo8cD48aW1nIHNyYz0iaHR0cDovL3d3dy5teWdpZnMuY29tL0NvdmVySW1hZ2UuZ2lmIiBhbHQ9IkEgR3JlYXQgSFRNTCBSZXNvdXJjZSIvPjwvcD4KPHA+QWRkIGEgbGluayB0byB5b3VyIGZhdm9yaXRlIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmR1bW1pZXMuY29tLyI+V2ViIHNpdGU8L2E+LgpCcmVhayB1cCB5b3VyIHBhZ2Ugd2l0aCBhIGhvcml6b250YWwgcnVsZSBvciB0d28uIDwvcD4KPGhyLz4KPHA+RmluYWxseSwgbGluayB0byA8YSBocmVmPSJwYWdlMi5odG1sIj5hbm90aGVyIHBhZ2U8L2E+IGluIHlvdXIgb3duIFdlYiBzaXRlLjwvcD4KPCEtLSBBbmQgYWRkIGEgY29weXJpZ2h0IG5vdGljZS4tLT4KPHA+JiMxNjk7IFdpbGV5IFB1Ymxpc2hpbmcsIDIwMTE8L3A+Cgo8c3BhbiBpZD0iZXpvaWMtcHViLWFkLXBsYWNlaG9sZGVyLTEwMCI+PC9zcGFuPjxzcGFuIGRhdGEtZXotcGgtaWQ9IjEwMCIgc3R5bGU9Im1pbi13aWR0aDowcHg7bWluLWhlaWdodDowcHg7bWF4LXdpZHRoOjEwMCUgIWltcG9ydGFudDtsaW5lLWhlaWdodDowcHg7cGFkZGluZzowO2Zsb2F0Om5vbmUgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94O2Rpc3BsYXk6aW5saW5lLWJsb2NrOyI+PC9zcGFuPjxkaXYgaWQ9ImV6LXNpZGViYXItd2FsbC1sZWZ0IiBjbGFzcz0iZXotc2lkZWJhci13YWxsIiBzdHlsZT0ibGVmdDogMHB4OyI+Cgk8ZGl2IGNsYXNzPSJlei1zaWRlYmFyLXdhbGwtYWQiPgoJCTxzcGFuIGlkPSJlem9pYy1wdWItYWQtcGxhY2Vob2xkZXItOTc1Ij48L3NwYW4+PHNwYW4gZGF0YS1lei1waC1pZD0iOTc1IiBzdHlsZT0iZmxvYXQ6bm9uZSAhaW1wb3J0YW50O21hcmdpbi10b3A6MHB4ICFpbXBvcnRhbnQ7bWFyZ2luLXJpZ2h0OjBweCAhaW1wb3J0YW50O21hcmdpbi1ib3R0b206MHB4ICFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6MHB4ICFpbXBvcnRhbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7bWluLXdpZHRoOm1pbigxNjBweCwxMDAlKTttYXgtd2lkdGg6MTAwJSAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3g7bWluLWhlaWdodDo2MDBweDtsaW5lLWhlaWdodDowcHg7cGFkZGluZzowOyI+PC9zcGFuPgoJCTxzcGFuIGNsYXNzPSJlei1yYWlsLWNsb3NlIiBpZD0iZXotcmFpbC1jbG9zZS1sZWZ0IiBzdHlsZT0idG9wOiAtMThweDsgbGVmdDogMDsgZGlzcGxheTogbm9uZTsiIGFyaWEtbGFiZWw9IkNsb3NlIHNpZGUgcmFpbCBhZCIgdGl0bGU9IkNsb3NlIiBvbmNsaWNrPSJfX2V6X2Nsb3NlX3JhaWwodGhpcy5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuaWQpIj7vv708L3NwYW4+Cgk8L2Rpdj4KPC9kaXY+PHNjcmlwdD4hZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQscil7dmFyIG49InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJnRbU3ltYm9sLml0ZXJhdG9yXXx8dFsiQEBpdGVyYXRvciJdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KHQpfHwobj1mdW5jdGlvbih0LHIpe2lmKHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdClyZXR1cm4gZSh0LHIpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KS5zbGljZSg4LC0xKTtyZXR1cm4iT2JqZWN0Ij09PW4mJnQuY29uc3RydWN0b3ImJihuPXQuY29uc3RydWN0b3IubmFtZSksIk1hcCI9PT1ufHwiU2V0Ij09PW4/QXJyYXkuZnJvbSh0KToiQXJndW1lbnRzIj09PW58fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pP2UodCxyKTp2b2lkIDB9fSh0KSl8fHImJnQmJiJudW1iZXIiPT10eXBlb2YgdC5sZW5ndGgpe24mJih0PW4pO3ZhciBhPTAsbz1mdW5jdGlvbigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uKCl7cmV0dXJuIGE+PXQubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTp0W2ErK119fSxlOmZ1bmN0aW9uKHQpe3Rocm93IHR9LGY6b319dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBpLHU9ITAscz0hMTtyZXR1cm57czpmdW5jdGlvbigpe249bi5jYWxsKHQpfSxuOmZ1bmN0aW9uKCl7dmFyIHQ9bi5uZXh0KCk7cmV0dXJuIHU9dC5kb25lLHR9LGU6ZnVuY3Rpb24odCl7cz0hMCxpPXR9LGY6ZnVuY3Rpb24oKXt0cnl7dXx8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihzKXRocm93IGl9fX19ZnVuY3Rpb24gZSh0LGUpeyhudWxsPT1lfHxlPnQubGVuZ3RoKSYmKGU9dC5sZW5ndGgpO2Zvcih2YXIgcj0wLG49bmV3IEFycmF5KGUpO3I8ZTtyKyspbltyXT10W3JdO3JldHVybiBufSFmdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKHQpe3ZhciBlPWdldENvbXB1dGVkU3R5bGUodCk7aWYoLTE9PT1wYXJzZUludChlLmJvdHRvbSwxMCkpe3ZhciByPXQub2Zmc2V0SGVpZ2h0fHwzMDA7dC5zdHlsZS5ib3R0b209LXIrInB4In19O2Z1bmN0aW9uIHIoKXtyZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5zW2RhdGEtYW5jaG9yLXNob3duPSJ0cnVlIl1bZGF0YS1hbmNob3Itc3RhdHVzPSJkaXNwbGF5ZWQiXScpfWZ1bmN0aW9uIG4odCl7dmFyIGU9dC5xdWVyeVNlbGVjdG9yKCJpZnJhbWUiKTtlJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7dmFyIHI9cGFyc2VGbG9hdChnZXRDb21wdXRlZFN0eWxlKGUpLmhlaWdodCk7aXNOYU4ocil8fHQuc3R5bGUuc2V0UHJvcGVydHkoImhlaWdodCIsIiIuY29uY2F0KHIrNSwicHgiKSwiaW1wb3J0YW50Iil9KSl9ZnVuY3Rpb24gYSh0KXt0LnN0eWxlLnNldFByb3BlcnR5KCJ3aWR0aCIsIjEwMCUiLCJpbXBvcnRhbnQiKSx0LnN0eWxlLm1heFdpZHRoPSJub25lIn1mdW5jdGlvbiBvKHQpe3ZhciBlPXQucXVlcnlTZWxlY3RvcigiaWZyYW1lIik7ZSYmKGUuc3R5bGUuc2V0UHJvcGVydHkoImRpc3BsYXkiLCJibG9jayIsImltcG9ydGFudCIpLGUuc3R5bGUuc2V0UHJvcGVydHkoIm1hcmdpbiIsIjAgYXV0byIsImltcG9ydGFudCIpKTt2YXIgcj10LnF1ZXJ5U2VsZWN0b3IoIltpZCQ9J19fY29udGFpbmVyX18nXSIpO3ImJnIuc3R5bGUuc2V0UHJvcGVydHkoImRpc3BsYXkiLCJjb250ZW50cyIsImltcG9ydGFudCIpfW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihyKXt2YXIgbixhPXQocik7dHJ5e2ZvcihhLnMoKTshKG49YS5uKCkpLmRvbmU7KXt2YXIgbz1uLnZhbHVlO2lmKCJhdHRyaWJ1dGVzIj09PW8udHlwZSl7dmFyIGk9by50YXJnZXQ7aS5tYXRjaGVzKCJbZGF0YS1hbmNob3Itc3RhdHVzXSIpJiYoImRhdGEtYW5jaG9yLXN0YXR1cyI9PT1vLmF0dHJpYnV0ZU5hbWUmJiJkaXNtaXNzZWQiPT09aS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5jaG9yLXN0YXR1cyIpJiZlKGkpLCJzdHlsZSI9PT1vLmF0dHJpYnV0ZU5hbWUmJiJkaXNtaXNzZWQiPT09aS5nZXRBdHRyaWJ1dGUoImRhdGEtYW5jaG9yLXN0YXR1cyIpJiZlKGkpKX19fWNhdGNoKHQpe2EuZSh0KX1maW5hbGx5e2EuZigpfX0pKS5vYnNlcnZlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCx7c3VidHJlZTohMCxhdHRyaWJ1dGVzOiEwLGF0dHJpYnV0ZUZpbHRlcjpbInN0eWxlIiwiZGF0YS1hbmNob3Itc3RhdHVzIl19KTt2YXIgaT1uZXcgV2Vha1NldDtmdW5jdGlvbiB1KGUpe2UmJihpLmhhcyhlKXx8KGkuYWRkKGUpLG5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbihyKXt2YXIgaSx1PXQocik7dHJ5e2Zvcih1LnMoKTshKGk9dS5uKCkpLmRvbmU7KXt2YXIgcz1pLnZhbHVlOyJzdHlsZSI9PT1zLmF0dHJpYnV0ZU5hbWU/KG4oZSksYShlKSxvKGUpKToiYXR0cmlidXRlcyI9PT1zLnR5cGUmJiJkYXRhLWdvb2dsZS1xdWVyeS1pZCI9PT1zLmF0dHJpYnV0ZU5hbWUmJm8oZSl9fWNhdGNoKHQpe3UuZSh0KX1maW5hbGx5e3UuZigpfX0pKS5vYnNlcnZlKGUse2F0dHJpYnV0ZXM6ITAsYXR0cmlidXRlRmlsdGVyOlsic3R5bGUiLCJkYXRhLWdvb2dsZS1xdWVyeS1pZCJdfSkpKX0hZnVuY3Rpb24oKXt2YXIgdD1yKCk7aWYodClyZXR1cm4gbih0KSxhKHQpLG8odCksdm9pZCB1KHQpO3ZhciBlPW5ldyBNdXRhdGlvbk9ic2VydmVyKChmdW5jdGlvbigpe3ZhciB0PXIoKTt0JiYobih0KSxhKHQpLG8odCksdSh0KSxlLmRpc2Nvbm5lY3QoKSl9KSk7ZS5vYnNlcnZlKGRvY3VtZW50LmJvZHkse2F0dHJpYnV0ZXM6ITAsc3VidHJlZTohMCxjaGlsZExpc3Q6ITB9KX0oKX0oKX0oKTs8L3NjcmlwdD4KPHNjcmlwdCBkYXRhLWV6c2NyZXg9ImZhbHNlIiBkYXRhLWNmYXN5bmM9ImZhbHNlIj4KCQl3aW5kb3cuaHVtaXhQbGF5ZXJzID0gd2luZG93Lmh1bWl4UGxheWVycyB8fCBbXTsKCQl3aW5kb3cuaHVtaXhQbGF5ZXJzLnB1c2goeyB0YXJnZXQ6ICdhdXRvaW5zZXJ0JywgaXNHZW5lcmF0ZWQ6IHRydWUgfSk7Cgk8L3NjcmlwdD48c2NyaXB0IGRhdGEtY2Zhc3luYz0iZmFsc2UiPmZ1bmN0aW9uIF9lbWl0RXpDb25zZW50RXZlbnQoKXt2YXIgY3VzdG9tRXZlbnQ9bmV3IEN1c3RvbUV2ZW50KCJlekNvbnNlbnRFdmVudCIse2RldGFpbDp7ZXpUY2ZDb25zZW50OndpbmRvdy5lelRjZkNvbnNlbnR9LGJ1YmJsZXM6dHJ1ZSxjYW5jZWxhYmxlOnRydWUsfSk7ZG9jdW1lbnQuZGlzcGF0Y2hFdmVudChjdXN0b21FdmVudCk7fQooZnVuY3Rpb24od2luZG93LGRvY3VtZW50KXtmdW5jdGlvbiBfc2V0QWxsRXpDb25zZW50VHJ1ZSgpe3dpbmRvdy5lelRjZkNvbnNlbnQubG9hZGVkPXRydWU7d2luZG93LmV6VGNmQ29uc2VudC5zdG9yZV9pbmZvPXRydWU7d2luZG93LmV6VGNmQ29uc2VudC5kZXZlbG9wX2FuZF9pbXByb3ZlX3NlcnZpY2VzPXRydWU7d2luZG93LmV6VGNmQ29uc2VudC5tZWFzdXJlX2FkX3BlcmZvcm1hbmNlPXRydWU7d2luZG93LmV6VGNmQ29uc2VudC5tZWFzdXJlX2NvbnRlbnRfcGVyZm9ybWFuY2U9dHJ1ZTt3aW5kb3cuZXpUY2ZDb25zZW50LnNlbGVjdF9iYXNpY19hZHM9dHJ1ZTt3aW5kb3cuZXpUY2ZDb25zZW50LmNyZWF0ZV9hZF9wcm9maWxlPXRydWU7d2luZG93LmV6VGNmQ29uc2VudC5zZWxlY3RfcGVyc29uYWxpemVkX2Fkcz10cnVlO3dpbmRvdy5lelRjZkNvbnNlbnQuY3JlYXRlX2NvbnRlbnRfcHJvZmlsZT10cnVlO3dpbmRvdy5lelRjZkNvbnNlbnQuc2VsZWN0X3BlcnNvbmFsaXplZF9jb250ZW50PXRydWU7d2luZG93LmV6VGNmQ29uc2VudC51bmRlcnN0YW5kX2F1ZGllbmNlcz10cnVlO3dpbmRvdy5lelRjZkNvbnNlbnQudXNlX2xpbWl0ZWRfZGF0YV90b19zZWxlY3RfY29udGVudD10cnVlO3dpbmRvdy5lelRjZkNvbnNlbnQuc2VsZWN0X3BlcnNvbmFsaXplZF9jb250ZW50PXRydWU7fQpmdW5jdGlvbiBfY2xlYXJFekNvbnNlbnRDb29raWUoKXtkb2N1bWVudC5jb29raWU9ImV6Q01QQ29va2llQ29uc2VudD10Y2YyO0RvbWFpbj0uZmlsZXNhbXBsZXMuY29tO1BhdGg9LztleHBpcmVzPVRodSwgMDEgSmFuIDE5NzAgMDA6MDA6MDAgR01UIjt9Cl9jbGVhckV6Q29uc2VudENvb2tpZSgpO2lmKHR5cGVvZiB3aW5kb3cuX190Y2ZhcGkhPT0idW5kZWZpbmVkIil7d2luZG93LmV6Z2NvbnNlbnQ9ZmFsc2U7dmFyIGFtYXpvbkhhc1J1bj1mYWxzZTtmdW5jdGlvbiBfZXpBbGxvd2VkKHRjZGF0YSxwdXJwb3NlKXtyZXR1cm4odGNkYXRhLnB1cnBvc2UuY29uc2VudHNbcHVycG9zZV18fHRjZGF0YS5wdXJwb3NlLmxlZ2l0aW1hdGVJbnRlcmVzdHNbcHVycG9zZV0pO30KZnVuY3Rpb24gX2hhbmRsZUNvbnNlbnREZWNpc2lvbih0Y2RhdGEpe3dpbmRvdy5lelRjZkNvbnNlbnQubG9hZGVkPXRydWU7aWYoIXRjZGF0YS52ZW5kb3IuY29uc2VudHNbIjM0NyJdJiYhdGNkYXRhLnZlbmRvci5sZWdpdGltYXRlSW50ZXJlc3RzWyIzNDciXSl7d2luZG93Ll9lbWl0RXpDb25zZW50RXZlbnQoKTtyZXR1cm47fQp3aW5kb3cuZXpUY2ZDb25zZW50LnN0b3JlX2luZm89X2V6QWxsb3dlZCh0Y2RhdGEsIjEiKTt3aW5kb3cuZXpUY2ZDb25zZW50LmRldmVsb3BfYW5kX2ltcHJvdmVfc2VydmljZXM9X2V6QWxsb3dlZCh0Y2RhdGEsIjEwIik7d2luZG93LmV6VGNmQ29uc2VudC5tZWFzdXJlX2NvbnRlbnRfcGVyZm9ybWFuY2U9X2V6QWxsb3dlZCh0Y2RhdGEsIjgiKTt3aW5kb3cuZXpUY2ZDb25zZW50LnNlbGVjdF9iYXNpY19hZHM9X2V6QWxsb3dlZCh0Y2RhdGEsIjIiKTt3aW5kb3cuZXpUY2ZDb25zZW50LmNyZWF0ZV9hZF9wcm9maWxlPV9lekFsbG93ZWQodGNkYXRhLCIzIik7d2luZG93LmV6VGNmQ29uc2VudC5zZWxlY3RfcGVyc29uYWxpemVkX2Fkcz1fZXpBbGxvd2VkKHRjZGF0YSwiNCIpO3dpbmRvdy5lelRjZkNvbnNlbnQuY3JlYXRlX2NvbnRlbnRfcHJvZmlsZT1fZXpBbGxvd2VkKHRjZGF0YSwiNSIpO3dpbmRvdy5lelRjZkNvbnNlbnQubWVhc3VyZV9hZF9wZXJmb3JtYW5jZT1fZXpBbGxvd2VkKHRjZGF0YSwiNyIpO3dpbmRvdy5lelRjZkNvbnNlbnQudXNlX2xpbWl0ZWRfZGF0YV90b19zZWxlY3RfY29udGVudD1fZXpBbGxvd2VkKHRjZGF0YSwiMTEiKTt3aW5kb3cuZXpUY2ZDb25zZW50LnNlbGVjdF9wZXJzb25hbGl6ZWRfY29udGVudD1fZXpBbGxvd2VkKHRjZGF0YSwiNiIpO3dpbmRvdy5lelRjZkNvbnNlbnQudW5kZXJzdGFuZF9hdWRpZW5jZXM9X2V6QWxsb3dlZCh0Y2RhdGEsIjkiKTt3aW5kb3cuX2VtaXRFekNvbnNlbnRFdmVudCgpO30KZnVuY3Rpb24gX2hhbmRsZUdvb2dsZUNvbnNlbnRWMih0Y2RhdGEpe2lmKCF0Y2RhdGF8fCF0Y2RhdGEucHVycG9zZXx8IXRjZGF0YS5wdXJwb3NlLmNvbnNlbnRzKXtyZXR1cm47fQp2YXIgY29uc2VudHM9dGNkYXRhLnB1cnBvc2UuY29uc2VudHM7dmFyIGdvb2dDb25zZW50VjI9e2FkX3N0b3JhZ2U6Y29uc2VudHNbMV0/J2dyYW50ZWQnOidkZW5pZWQnLGFuYWx5dGljc19zdG9yYWdlOmNvbnNlbnRzWzFdPydncmFudGVkJzonZGVuaWVkJyxhZF9wZXJzb25hbGl6YXRpb246KGNvbnNlbnRzWzNdJiZjb25zZW50c1s0XSk/J2dyYW50ZWQnOidkZW5pZWQnLGFkX3VzZXJfZGF0YTooY29uc2VudHNbMV0mJmNvbnNlbnRzWzddKT8nZ3JhbnRlZCc6J2RlbmllZCd9O2lmKGdvb2dDb25zZW50VjIuYW5hbHl0aWNzX3N0b3JhZ2U9PT0nZGVuaWVkJyl7Z3RhZygnc2V0JywndXJsX3Bhc3N0aHJvdWdoJyx0cnVlKTt9Cmd0YWcoJ2NvbnNlbnQnLCd1cGRhdGUnLGdvb2dDb25zZW50VjIpO30KX190Y2ZhcGkoImFkZEV2ZW50TGlzdGVuZXIiLDIsZnVuY3Rpb24odGNkYXRhLHN1Y2Nlc3Mpe2lmKCFzdWNjZXNzfHwhdGNkYXRhKXt3aW5kb3cuX2VtaXRFekNvbnNlbnRFdmVudCgpO3JldHVybjt9CmlmKCF0Y2RhdGEuZ2RwckFwcGxpZXMpe19zZXRBbGxFekNvbnNlbnRUcnVlKCk7d2luZG93Ll9lbWl0RXpDb25zZW50RXZlbnQoKTtyZXR1cm47fQppZih0Y2RhdGEuZXZlbnRTdGF0dXM9PT0idXNlcmFjdGlvbmNvbXBsZXRlInx8dGNkYXRhLmV2ZW50U3RhdHVzPT09InRjbG9hZGVkIil7aWYodHlwZW9mIGd0YWchPSd1bmRlZmluZWQnKXtfaGFuZGxlR29vZ2xlQ29uc2VudFYyKHRjZGF0YSk7fQpfaGFuZGxlQ29uc2VudERlY2lzaW9uKHRjZGF0YSk7aWYodGNkYXRhLnB1cnBvc2UuY29uc2VudHNbIjEiXT09PXRydWUmJnRjZGF0YS52ZW5kb3IuY29uc2VudHNbIjc1NSJdIT09ZmFsc2Upe3dpbmRvdy5lemdjb25zZW50PXRydWU7KGFkc2J5Z29vZ2xlPXdpbmRvdy5hZHNieWdvb2dsZXx8W10pLnBhdXNlQWRSZXF1ZXN0cz0wO30KaWYod2luZG93Ll9fZXpjb25zZW50KXtfX2V6Y29uc2VudC5zZXRFem9pY0NvbnNlbnRTZXR0aW5ncyhlekNvbnNlbnRDYXRlZ29yaWVzKTt9Cl9fdGNmYXBpKCJyZW1vdmVFdmVudExpc3RlbmVyIiwyLGZ1bmN0aW9uKHN1Y2Nlc3Mpe3JldHVybiBudWxsO30sdGNkYXRhLmxpc3RlbmVySWQpO2lmKCEodGNkYXRhLnB1cnBvc2UuY29uc2VudHNbIjEiXT09PXRydWUmJl9lekFsbG93ZWQodGNkYXRhLCIyIikmJl9lekFsbG93ZWQodGNkYXRhLCIzIikmJl9lekFsbG93ZWQodGNkYXRhLCI0IikpKXtpZih0eXBlb2YgX19lej09Im9iamVjdCImJnR5cGVvZiBfX2V6LmJpdD09Im9iamVjdCImJnR5cGVvZiB3aW5kb3dbIl9lemFxIl09PSJvYmplY3QiJiZ0eXBlb2Ygd2luZG93WyJfZXphcSJdWyJwYWdlX3ZpZXdfaWQiXT09InN0cmluZyIpe19fZXouYml0LkFkZCh3aW5kb3dbIl9lemFxIl1bInBhZ2Vfdmlld19pZCJdLFtuZXcgX19lekRvdERhdGEoIm5vbl9wZXJzb25hbGl6ZWRfYWRzIix0cnVlKSxdKTt9fX19KTt9ZWxzZXtfc2V0QWxsRXpDb25zZW50VHJ1ZSgpO3dpbmRvdy5fZW1pdEV6Q29uc2VudEV2ZW50KCk7fX0pKHdpbmRvdyxkb2N1bWVudCk7PC9zY3JpcHQ+PHNjcmlwdCB0eXBlPSJtb2R1bGUiIHNyYz0iaHR0cHM6Ly9zdGF0aWMuY2xvdWRmbGFyZWluc2lnaHRzLmNvbS9iZWFjb24ubWluLmpzL3ZjZTcwMTgyM2U3OGM0MzAxYTM1YjdlMDcyOTRkODczMDE3OTIwODg4MTQwOTIiIGludGVncml0eT0ic2hhNTEyLVVLTms4R2J4a0FCeEtjWFl1TGtPMTZFbGVMR1VrY3ZKV3RwU05tRXhFMFRvbzNaYUZBeFRzY05XRWMxT2RBdjUvQmlrSGF3YXBTQ2FpRDJYQ21wK0J3PT0iIGRhdGEtY2YtYmVhY29uPSd7InZlcnNpb24iOiIyMDI0LjExLjAiLCJ0b2tlbiI6ImYxNGI5MzU3NGE2YzQ5MTI5MWJkZjA1ZjdiMjlkYzNjIiwiciI6MSwic3BhIjoyfScgY3Jvc3NvcmlnaW49ImFub255bW91cyI+PC9zY3JpcHQ+CjwvYm9keT48L2h0bWw+"
      }
    ]
  }
}