Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@道长仓库Pro@eyJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoi6YGT6ZW/5LuT5bqTUHJvIiwiYXV0aG9yIjoiQExveURnSWsiLCJ1cmwiOiJoaWtlcjovL2VtcHR5IiwidmVyc2lvbiI6MTE2LCJjb2xfdHlwZSI6Imljb25fMl9yb3VuZCIsImNsYXNzX25hbWUiOiIiLCJ0eXBlIjoidG9vbCIsImNsYXNzX3VybCI6IiIsImFyZWFfbmFtZSI6IiIsImFyZWFfdXJsIjoiIiwic29ydF9uYW1lIjoiIiwieWVhcl9uYW1lIjoiIiwic29ydF91cmwiOiIiLCJ5ZWFyX3VybCI6IiIsImZpbmRfcnVsZSI6ImpzOlxuICAgIGNvbnN0IHtcbiAgICAgICAgZ2V0QXBpLFxuICAgICAgICBjb2xvcixcbiAgICAgICAgc21hbGwsXG4gICAgICAgIGdldEZpbGUsXG4gICAgICAgIGh0bWxUYWcsXG4gICAgICAgIGFwaSxcbiAgICAgICAgbWRcbiAgICB9ID0gJC5yZXF1aXJlKFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVwiKTtcblxuY29uc3QgbHNnPSQucmVxdWlyZShcImhpa2VyOi8vcGFnZS9sb2NhbFN0b3JhZ2U/cnVsZT3pgZPplb/ku5PlupNQcm9cIik7XG5sZXQgY2xhc3NBID0gZ2V0VmFyKFwiV2FyZWhvdXNlLmNsYXNzXCIsIFwiMFwiKTtcbmxldCBsaXN0VXJsID0gZ2V0QXBpKFwidXNlcnNVcmxcIikgKyBjbGFzc0EsXG4gICAgbXlVcmwgPSBnZXRBcGkoXCJkZXZTZWxmXCIpO1xuICAgIC8vIG15VXJsID0gZ2V0QXBpKFwicnVsZXNBbGxVcmxcIik7XG5wdXRWYXIoXCJXYXJlaG91c2UuZmlsdGVyXCIsIFwiXCIpO1xudmFyIG5vV2FpdD10cnVlOy8v5peg6ZyA6YeN6K+VXG52YXIgdGltZW91dD0zMDA7XG52YXIgdG1wX2hlYWRlcnM9e1xuICAgIHRpbWVvdXQ6dGltZW91dFxufTtcbnRyeXtcbnZhciB1c2VyTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChsaXN0VXJsLHRtcF9oZWFkZXJzKSkucmVzdWx0LFxuICAgIG5vd0NvbiA9IDAsXG4gICAgcnVsZUNvdW50ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcInJ1bGVDb3VudFVybFwiKSx0bXBfaGVhZGVycykpLnJlc3VsdDtcbn1jYXRjaChlKXtcbiAgICBub1dhaXQ9ZmFsc2U7XG4gICAgc2V0UmVzdWx0KFt7XG4gICAgICAgIHRpdGxlOifku5PlupPlkIzml7borr/pl67ph4/ov4flpKfmiJbnvZHnu5zlt67vvIznuYHlv5nkuK0uLi5cXG7or7fogJDlv4PnrYnlvoXnqI3lkI7lho3or5UnLFxuICAgICAgICBkZXNjOifngrnlh7vlsJ3or5Xph43mlrDorr/pl64nLFxuICAgICAgICBjb2xfdHlwZTondGV4dF8xJyxcbiAgICAgICAgdXJsOiQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCk9PntcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7LliLfmlrAnXG4gICAgICAgIH0pXG4gICAgfV0pO1xufVxuaWYobm9XYWl0KXtcbmxldCBkYXRhID0gW107XG5sZXQgY2xhc3NUYWIgPSBbXG4gICAgW1wi5LiK5qyh5rS76LeDXCIsIFwiMFwiXSxcbiAgICBbXCLop4TliJnmlbBcIiwgXCIxXCJdLFxuICAgIFtcIuazqOWGjOaXtumXtFwiLCBcIi0xXCJdXG5dXG5mb3IgKGxldCBpdGVtIG9mIGNsYXNzVGFiKSB7XG4gICAgZGF0YS5wdXNoKHtcbiAgICAgICAgdGl0bGU6IGl0ZW1bMV0gPT09IGNsYXNzQSA/IFwi4oCc4oCcXCIgKyBpdGVtWzBdICsgXCLigJ3igJ1cIiA6IGl0ZW1bMF0sXG4gICAgICAgIHVybDogJChcIiNub0xvYWRpbmcjXCIpLmxhenlSdWxlKChrZXkpID0+IHtcbiAgICAgICAgICAgIHB1dFZhcihcIldhcmVob3VzZS5jbGFzc1wiLCBrZXkpO1xuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIFwiaGlrZXI6Ly9lbXB0eVwiO1xuICAgICAgICB9LCBpdGVtWzFdKSxcbiAgICAgICAgY29sX3R5cGU6IFwic2Nyb2xsX2J1dHRvblwiXG4gICAgfSk7XG59XG5kYXRhLnB1c2goe1xuICAgIHRpdGxlOiBcIuWFqOmDqOinhOWImVwiLFxuICAgIHVybDogXCJoaWtlcjovL3BhZ2UvQWxsUHVibGljUnVsZT91cmw9aGlrZXI6Ly9lbXB0eSNmeXBhZ2Ujbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXCIsXG4gICAgY29sX3R5cGU6IFwic2Nyb2xsX2J1dHRvblwiXG59KTtcbmRhdGEucHVzaCh7XG4gICAgdGl0bGU6IFwi5Yi35paw5L6d6LWWXCIsXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChqc29uVXJsKT0+e1xuICAgICAgICBqc29uVXJsID0ganNvblVybCsnMjUwNSc7XG4gICAgICAgIC8vIGxvZyhqc29uVXJsKTtcbiAgICAgICAgbGV0IHRleHQgPSByZXF1ZXN0KGpzb25VcmwpO1xuICAgICAgICBpZighL3ZlcnNpb24vLnRlc3QodGV4dCkpe1xuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+acjeWKoeWZqOato+W/mSzor7fnqI3lgJnlho3or5UuLi4nXG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlQ2FjaGUoanNvblVybCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXF1aXJlKGpzb25VcmwpO1xuICAgICAgICAgICAgY29uZmlybSh7dGl0bGU6J+WIt+aWsOaIkOWKn+aPkOekuicsY29udGVudDpcInRvYXN0Oi8v5bey5Yi35pawLOW9k+WJjeeJiOacrOS/oeaBrzpcXG5cIitKU09OLnN0cmluZ2lmeSh2ZXJzaW9uKX0pXG4gICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXG4gICAgICAgIH1jYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+ezn+ezle+8jOacrOWcsOe8k+WtmOaPkuS7tuiiq+a4hemZpOS6hu+8jOS9huaYr+acjeWKoeWZqOmAmuiur+Wksei0pSEnXG4gICAgICAgIH1cbiAgICB9LGdldEFwaShcImltcG9ydFVybFwiKSksXG4gICAgY29sX3R5cGU6IFwic2Nyb2xsX2J1dHRvblwiXG59KTtcbmRhdGEucHVzaCh7XG4gICAgdGl0bGU6XCLpgJrlhY06XCIrY29sb3IobHNnLmdldEl0ZW0oXCLpgJrlhY1cIixcIlg1XCIpLFwiI2ZmNzAwMFwiKSxcbiAgICBjb2xfdHlwZTpcInNjcm9sbF9idXR0b25cIixcbiAgICB1cmw6JCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKT0+e1xuICAgICAgICBjb25zdCBsc2c9JC5yZXF1aXJlKFwiaGlrZXI6Ly9wYWdlL2xvY2FsU3RvcmFnZT9ydWxlPemBk+mVv+S7k+W6k1Byb1wiKTtcbiAgICAgICAgaWYobHNnLmdldEl0ZW0oXCLpgJrlhY1cIixcIlg1XCIpPT1cIlg1XCIpe1xuICAgICAgICAgICAgbHNnLnNldEl0ZW0oXCLpgJrlhY1cIixcIldFQlwiKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBsc2cuc2V0SXRlbShcIumAmuWFjVwiLFwiWDVcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xuICAgICAgICByZXR1cm4gXCJ0b2FzdDovL+W3suiuvue9ruS7k+W6k+mAmuWFjeaooeW8j+S4ujpcIitsc2cuZ2V0SXRlbShcIumAmuWFjVwiKTtcbiAgICB9KVxufSk7XG5kYXRhLnB1c2goe1xuICAgIHRpdGxlOmNvbG9yKFwi5LuT5bqT5YWs5ZGKXCIsXCIjZmY3MDAwXCIpLFxuICAgIGNvbF90eXBlOlwic2Nyb2xsX2J1dHRvblwiLFxuICAgIHVybDokKCdoaWtlcjovL2VtcHR5I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5IycpLnJ1bGUoKG1kKT0+e1xuICAgICAgICByZXF1aXJlKG1kKTtcbiAgICAgICAgbGV0IGQgPSBbXTtcbiAgICAgICAgbGV0IOS7k+W6k+WFrOWRij1cIuaaguaXoOWFrOWRilwiO1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICDku5PlupPlhazlkYo9ZmV0Y2goJ2h0dHBzOi8vaGpkaG54LmNvZGluZy5uZXQvcC9oaWtlci9kL2RyL2dpdC9yYXcvbWFzdGVyL2pzL+S7k+W6k+WFrOWRii5tZCcpO1xuICAgICAgICB9Y2F0Y2goZSl7fVxuICAgICAgICBpZijku5PlupPlhazlkYopIHtcbiAgICAgICAgICAgIGQucHVzaCh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IG1hcmtlZC5wYXJzZSjku5PlupPlhazlkYopLFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcbiAgICAgICAgICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5J1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmVzdWx0KGQpO1xuICAgIH0sbWQpXG59KTtcblxuZGF0YS5wdXNoKHtcbiAgICB0aXRsZTpjb2xvcihcIuWNh+e6p+S7k+W6k1wiLFwiIzE1YWIyMVwiKSxcbiAgICBjb2xfdHlwZTpcInNjcm9sbF9idXR0b25cIixcbiAgICB1cmw6JCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKT0+e1xuICAgICAgICBjb25zdCB7Z2V0QXBpfSA9ICQucmVxdWlyZShcImhpa2VyOi8vcGFnZS91dGlsaXlcIik7XG4gICAgICAgIGxldCBydWxlSGVhZCA9ICfmtbfpmJTop4bnlYzpppbpobXpopHpgZPop4TliJnjgJDpgZPplb/ku5PlupNQcm/jgJHvv6Vob21lX3J1bGVfdXJs77+lJztcbiAgICAgICAgbGV0IHVybCA9IGdldEFwaSgnaW1wb3J0VXJsJykrXCIxMDk0XCI7XG4gICAgICAgIGxldCBpbXBvcnRVcmwgPSAncnVsZTovLycrYmFzZTY0RW5jb2RlKHJ1bGVIZWFkK3VybCk7XG4gICAgICAgIHJldHVybiBpbXBvcnRVcmxcbiAgICB9KVxufSk7XG5cbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XG4gICAgY2xlYXJWYXIoXCJXYXJlaG91c2UuY2xhc3NcIik7XG59KSk7XG5sZXQge1xuICAgIHVzZXJuYW1lLFxuICAgIHBhc3N3b3JkLFxuICAgIHVzZXJcbn0gPSBnZXRGaWxlKCk7XG5cbmxldCBpc19sb2dpbiA9IGZhbHNlO1xubGV0IGlzX21hbmFnZXIgPSBmYWxzZTtcbmlmICh1c2VybmFtZSAhPT0gdm9pZCAwICYmIHBhc3N3b3JkICE9PSB2b2lkIDApIHtcbiAgICBteVVybCArPSAnP3FxPScgKyB1c2VybmFtZSArICcmcGFzc3dvcmQ9JyArIHBhc3N3b3JkO1xuICAgIGxldCBjb2RlX3N0ciA9IHJlcXVlc3QobXlVcmwsdG1wX2hlYWRlcnMpO1xuICAgIGxldCBjb2RlID0ge307XG4gICAgdHJ5e1xuICAgICAgICBjb2RlPUpTT04ucGFyc2UoY29kZV9zdHIpO1xuICAgIH1jYXRjaChlKXt9XG4gICAgaWYgKGNvZGUuc3RhdHVzID09PSAwJiYgY29kZS5yZXN1bHQuYWN0aXZlKSB7XG4gICAgICAgIGlzX2xvZ2luID0gdHJ1ZTtcbiAgICAgICAgaWYoY29kZS5yZXN1bHQuaXNfbWFuYWdlcil7XG4gICAgICAgICAgICBpc19tYW5hZ2VyID0gdHJ1ZTtcbiAgICAgICAgICAgIHB1dFZhcignaG91c2UuaXNfbWFuYWdlcicsJ+ecnycpO1xuICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51c2VybmFtZScsdXNlcm5hbWUpO1xuICAgICAgICAgICAgcHV0VmFyKCdob3VzZS5wYXNzd29yZCcscGFzc3dvcmQpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHB1dFZhcignaG91c2UuaXNfbWFuYWdlcicsJycpO1xuICAgICAgICAgICAgY2xlYXJWYXIoJ2hvdXNlLnVzZXJuYW1lJyk7XG4gICAgICAgICAgICBjbGVhclZhcignaG91c2UucGFzc3dvcmQnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmlmIChpc19sb2dpbikge1xuICAgIHRyeXtcbiAgICBub3dDb24gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFwibm93Q29uVXJsXCIpLHRtcF9oZWFkZXJzKSkucmVzdWx0O1xuICAgIH1jYXRjaChlKXtcbiAgICAgICAgbm93Q29uPSfmnKrnn6UnO1xuICAgIH1cbiAgICBsZXQgZGV2RGF0YSA9IHVzZXJMaXN0LmZpbmQoaXRlbSA9PiBpdGVtLnFxID09PSB1c2VybmFtZSk7XG4gICAgZGF0YS5wdXNoKHtcbiAgICAgICAgdGl0bGU6ICc8c3Ryb25nPjxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjcwMDBcIj4nICsgZGV2RGF0YS5uYW1lICsgJzwvc3Bhbj48L3N0cm9uZz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8c21hbGw+PHU+6KeE5YiZ566h55CGID48L3U+PC9zbWFsbD4nLFxuICAgICAgICBwaWNfdXJsOiBkZXZEYXRhLmF2YXRhcixcbiAgICAgICAgY29sX3R5cGU6IFwiYXZhdGFyXCIsXG4gICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvZGV2TWFuYWdlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1wiLFxuICAgICAgICBleHRyYToge1xuICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxuICAgICAgICAgICAgcGFzc3dvcmQ6IHBhc3N3b3JkLFxuICAgICAgICAgICAgZGV2OiBkZXZEYXRhXG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBkYXRhLnB1c2goe1xuICAgICAgICBjb2xfdHlwZTogJ3RleHRfMScsXG4gICAgICAgIHRpdGxlOiBzbWFsbChcIueOsOaciSBcIiArIGNvbG9yKHVzZXJMaXN0Lmxlbmd0aCwgXCIjZmY3MDAwXCIpICsgXCIg5ZCN5byA5Y+R6ICF77yMXCIgKyBjb2xvcihydWxlQ291bnRbMF0sIFwiI2ZmNzAwMFwiKSArIFwiIOadoeWFrOW8gOinhOWIme+8jFwiICsgY29sb3IocnVsZUNvdW50WzFdLCBcIiNmZjcwMDBcIikgKyBcIiDmnaHpm4boirPpmIHop4TliJnjgILlnKjnur86XCIrY29sb3Iobm93Q29uLCBcIiNmZjcwMDBcIikpLFxuICAgICAgICB1cmw6IFwidG9hc3Q6Ly/llrXllrXllrU/XCIsXG4gICAgfSk7XG59IGVsc2Uge1xuICAgIGRhdGEucHVzaCh7XG4gICAgICAgIHRpdGxlOiBzbWFsbChjb2xvcihcIuW8gOWPkeiAheeZu+W9lVwiLCBcIiMwMEJGRkZcIikpLFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxuICAgICAgICBkZXNjOiBzbWFsbChcIueOsOaciVwiICsgY29sb3IodXNlckxpc3QubGVuZ3RoLCBcIiNmZjcwMDBcIikgKyBcIuWQjeW8gOWPkeiAhe+8jFwiICsgY29sb3IocnVsZUNvdW50WzBdLCBcIiNmZjcwMDBcIikgKyBcIuadoeWFrOW8gOinhOWIme+8jFwiICsgY29sb3IoMCwgXCIjZmY3MDAwXCIpICsgXCLmnaHpm4boirPpmIHop4TliJnjgIJcIiksXG4gICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvZGV2TG9naW5cIlxuICAgIH0pO1xufVxuaWYgKEFycmF5LmlzQXJyYXkodXNlcikgJiYgdXNlci5sZW5ndGggPT09IDIpIHtcbiAgICBsZXQgdXNlcmxvZ2luID0gcmVxdWVzdChhcGkuZGlzX2xvZ2luLCB7XG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgXCJwYXJhbXNcIjoge1xuICAgICAgICAgICAgICAgIFwicXFcIjogdXNlclswXSxcbiAgICAgICAgICAgICAgICBcImF1dGhfY29kZVwiOiB1c2VyWzFdXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgdGltZW91dDp0aW1lb3V0XG4gICAgfSk7XG4gICAgdXNlcmxvZ2luID0gSlNPTi5wYXJzZSh1c2VybG9naW4pLnJlc3VsdDtcbiAgICBpZiAodXNlcmxvZ2luLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICB1c2VybG9naW4gPSB1c2VybG9naW4ucmVzdWx0XG4gICAgICAgIGRhdGEucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogdXNlcmxvZ2luLm5hbWUgKyBcIiZuYnNwOyZuYnNwO1wiICsgdXNlcmxvZ2luLnFxICsgXCImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8c21hbGw+PHU+5pu05o2i6LSm5Y+3ID48L3U+PC9zbWFsbD5cIixcbiAgICAgICAgICAgIGNvbF90eXBlOiAnYXZhdGFyJyxcbiAgICAgICAgICAgIHBpY191cmw6IHVzZXJsb2dpbi5hdmF0YXJfdXJsLFxuICAgICAgICAgICAgdXJsOiBcImhpa2VyOi8vcGFnZS9Vc2VycmVnaXN0cmF0aW9uXCJcbiAgICAgICAgfSk7XG4gICAgICAgIGRhdGEuc3BsaWNlKDMsMCx7XG4gICAgICAgICAgICB0aXRsZTogdXNlcmxvZ2luLmhhc19yZXBseT9cIvCfhpXlm57lpI1cIjpcIvCflJTlm57lpI1cIixcbiAgICAgICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvTXlSZXBseT91cmw9aGlrZXI6Ly9lbXB0eSNmeXBhZ2Ujbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXCIsXG4gICAgICAgICAgICBjb2xfdHlwZTogXCJzY3JvbGxfYnV0dG9uXCIsXG4gICAgICAgICAgICBleHRyYTp7XG4gICAgICAgICAgICAgICAgYXV0aF9jb2RlOnVzZXJbMV0sXG4gICAgICAgICAgICAgICAgcXE6dXNlclswXVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6IHVzZXJsb2dpbi5kZXRhaWwsXG4gICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxuICAgICAgICAgICAgZGVzYzogXCLigJzigJzigJ3igJ08c21hbGw+PHU+6YeN5paw6I635Y+W6aqM6K+B56CBID48L3U+PC9zbWFsbD5cIixcbiAgICAgICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvVXNlcnJlZ2lzdHJhdGlvblwiXG4gICAgICAgIH0pO1xuICAgIH1cbn0gZWxzZSB7XG4gICAgZGF0YS5wdXNoKHtcbiAgICAgICAgdGl0bGU6IFwi6K+E6K6655m75b2VL+azqOWGjFwiLFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxuICAgICAgICBkZXNjOiBcIlwiLFxuICAgICAgICB1cmw6IFwiaGlrZXI6Ly9wYWdlL1VzZXJyZWdpc3RyYXRpb25cIlxuICAgIH0pO1xufVxuZm9yICh2YXIgaXRlbSBvZiB1c2VyTGlzdCkge1xuICAgIGRhdGEucHVzaCh7XG4gICAgICAgIHRpdGxlOiBpdGVtLm5hbWUgKyBcIihcIiArIGl0ZW0ucnVsZV9udW0gKyBcIilcIixcbiAgICAgICAgZGVzYzogaXRlbS5pZCArICc6JyArIGl0ZW0ubmlja19uYW1lLFxuICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcixcbiAgICAgICAgdXJsOiBcImhpa2VyOi8vcGFnZS9ydWxlcyNub0hpc3RvcnkjXCIsXG4gICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICBhdmF0YXJVcmw6IGl0ZW0uYXZhdGFyLFxuICAgICAgICAgICAgcXE6IGl0ZW0ucXEsXG4gICAgICAgICAgICBpZDppdGVtLmlkLFxuICAgICAgICAgICAgY2FuX3VwbG9hZDppdGVtLmNhbl91cGxvYWRcbiAgICAgICAgfVxuICAgIH0pO1xufVxuXG5kYXRhLnB1c2goe1xuICAgIGNvbF90eXBlOiAnbG9uZ190ZXh0J1xufSk7XG5zZXRSZXN1bHQoZGF0YSk7XG5sZXQgaW1nID0gW1xuICAgIFtcbiAgICAgICAgXCJoaWtlcjovL2ZpbGVzL2ljb24v6LWeLnN2Z1wiLCBcImh0dHBzOi8vYmFmeWJlaWFlZXR3YmMzdGhveTIyeTV6ZDdhbDZybmRlcWJyYndoc3pxYjZvaXRuZjdhNXp2c3o1cGUuaXBmcy5jZi1pcGZzLmNvbS9cIlxuICAgIF0sXG4gICAgW1xuICAgICAgICBcImhpa2VyOi8vZmlsZXMvaWNvbi/ouKkuc3ZnXCIsIFwiaHR0cHM6Ly9iYWZ5YmVpZWh4eW5waGFhZmU0bXVrYWNzN3dlNGQ2bHJiMzVrcHBkaWZmanY0dnduc3EyMm5mcW5sNC5pcGZzLmNmLWlwZnMuY29tL1wiXG4gICAgXSxcbiAgICBbXG4gICAgICAgIFwiaGlrZXI6Ly9maWxlcy9pY29uL+ivhOiuui5zdmdcIiwgXCJodHRwczovL2JhZnliZWlmaHhpNXJkbnhxNXhseTdyNHFkYndpY28yMzQzc21lbHhkcW95dGFsZ3VjdGdjMm9qc2R5LmlwZnMuY2YtaXBmcy5jb20vXCJcbiAgICBdXG5dXG5mb3IgKGxldCBpdGVtIG9mIGltZykge1xuICAgIGlmICghZmlsZUV4aXN0KGl0ZW1bMF0pKSB7XG4gICAgICAgIHdyaXRlRmlsZShpdGVtWzBdLCByZXF1ZXN0KGl0ZW1bMV0pKTtcbiAgICB9XG59XG59Iiwic2VhcmNoX3VybCI6Imhpa2VyOi8vZW1wdHkjKioiLCJncm91cCI6IiIsInNlYXJjaEZpbmQiOiJqczpcbnZhciBkID0gW107XG5jb25zdCB7XG4gICAgYXBpLFxuICAgIGdldEFwaSxcbiAgICBsb2NhbFJ1bGVWZXIgICAgXG59ID0gJC5yZXF1aXJlKFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVwiKTtcbnZhciBodG1sID0gcmVxdWVzdChnZXRBcGkoXCJzZWFyY2hcIikgKyBcIj9rZXk9XCIgKyBNWV9VUkwucmVwbGFjZShcImhpa2VyOi8vZW1wdHkjXCIsIFwiXCIpKTsgLy8g6I635Y+W5rqQ56CBXG52YXIgcnVsZV9saXN0ID0gSlNPTi5wYXJzZShodG1sKS5yZXN1bHQ7XG5sZXQgZmlsdGVyID0gZ2V0VmFyKFwiV2FyZWhvdXNlLmZpbHRlclwiLCBcIlwiKTtcbmlmIChmaWx0ZXIgIT09IFwiXCIpIHtcbiAgICBydWxlX2xpc3QgPSBydWxlX2xpc3QuZmlsdGVyKGl0ZW0gPT4gaXRlbS5hdXRob3IgPT09IGZpbHRlcik7XG59XG5pZiAocnVsZV9saXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgIGQucHVzaCh7XG4gICAgICAgIHRpdGxlOiAn5YWx5pCc57Si5YiwJyArIHJ1bGVfbGlzdC5sZW5ndGggKyBcIuadoeiusOW9lVwiLFxuICAgICAgICBkZXNjOiAn6K+m5oOF6K+35om+6YGT6ZW/LHFxIDQzNDg1NzAwNScsXG4gICAgICAgIHVybDogXCJoaWtlcjovL2VtcHR5XCIsXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcbiAgICB9KTtcbn1cbmxldCBob21lTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuaG9tZSkpO1xuXG5mb3IgKGxldCBpdGVtIG9mIHJ1bGVfbGlzdCkge1xuICAgIC8vbGV0IGx2ZXI9bG9jYWxSdWxlVmVyKGhvbWVMaXN0LCBpdGVtKTtcbiAgICBsZXQgbGFiZWwgPSBcIlwiLFxuICAgICAgICBsdmVyID0gLTI7XG4gICAgaWYgKGl0ZW0uZGF0YV90eXBlID09PSBcImhvbWVfcnVsZV91cmxcIikge1xuICAgICAgICBsdmVyID0gbG9jYWxSdWxlVmVyKGhvbWVMaXN0LCBpdGVtKTtcbiAgICAgICAgaWYgKGx2ZXIgPT09IC0xKSB7XG4gICAgICAgICAgICBsYWJlbCA9IFwi8J+GlVwiO1xuICAgICAgICB9IGVsc2UgaWYgKGx2ZXIgPCBpdGVtLnZlcikge1xuICAgICAgICAgICAgbGFiZWwgPSBcIvCfhplcIjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkLnB1c2goe1xuICAgICAgICB0aXRsZTogbGFiZWwraXRlbS5uYW1lLFxuICAgICAgICBkZXNjOiBpdGVtLnR5cGUsXG4gICAgICAgIGNvbnRlbnQ6IGl0ZW0uYXV0aG9yLyorXCJcXG7mnKzlnLDniYjmnKw6XCIrbHZlcitcIlxcdFxcdOS6keerr+eJiOacrDpcIitpdGVtLnZlciovKyAnXFxu5pu05paw5LqOOicgKyBpdGVtLmxhc3RfdXBkYXRlLFxuICAgICAgICB1cmw6IFwiaGlrZXI6Ly9wYWdlL3J1bGVEZXRhaWwjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXCIsXG4gICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICBsdmVyOiBsdmVyLFxuICAgICAgICAgICAgaWQ6IGl0ZW0uaWRcbiAgICAgICAgfSxcbiAgICAgICAgcGljX3VybDogaXRlbS5waWNfdXJsXG4gICAgfSk7XG5cbn1cblxuc2V0UmVzdWx0KGQpOyIsImRldGFpbF9jb2xfdHlwZSI6InRleHRfMSIsImRldGFpbF9maW5kX3J1bGUiOiIiLCJzZGV0YWlsX2NvbF90eXBlIjoidGV4dF8xIiwic2RldGFpbF9maW5kX3J1bGUiOiIiLCJ1YSI6Im1vYmlsZSIsInByZVJ1bGUiOiIiLCJwYWdlcyI6Ilt7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5bel5YW3XCIsXCJwYXRoXCI6XCJ1dGlsaXlcIixcInJ1bGVcIjpcImpzOlxcbmxldCBob3N0ID0gXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzc1xcXCI7XFxuLy9sZXQgaG9zdCA9IFxcXCJodHRwOi8vMTkyLjE2OC4zLjk0OjgwNzlcXFwiO1xcbmxldCBob21lID0gYmFzZTY0RGVjb2RlKFxcXCJhR2xyWlhJNkx5OW9iMjFsXFxcIik7XFxudmFyIGFwaSA9IHtcXG4gICAgaG9zdDogaG9zdCtcXFwiL2hpa2VydWxlXFxcIixcXG4gICAgdXNlcnNVcmw6IFxcXCIvZGV2L3VzZXJzP29yZGVyPVxcXCIsIC8v55So5oi35YiX6KGoXFxuICAgIHJ1bGVDb3VudFVybDogXFxcIi9kZXYvcnVsZWNvdW50XFxcIiwgLy/ojrflj5bop4TliJnmlbDph49cXG4gICAgcnVsZXNVcmw6IFxcXCIvZGV2L2dldFxcXCIsIC8v55So5oi35a+55bqU55qE6KeE5YiZ5YiX6KGo5LuF5LuF6I635Y+W5YWs5byAXFxuICAgIHJ1bGVzQWxsVXJsOiBcXFwiL2Rldi9nZXRhbGxcXFwiLCAvL+W8gOWPkeiAheWvueW6lOeahOinhOWImeWIl+ihqOWPr+iOt+WPluengeaciVxcbiAgICBkZXZTZWxmOicvZGV2L2dldHNlbGYnLC8v6I635Y+W5byA5Y+R6ICF5L+h5oGvXFxuICAgIG1hbkNhblVwbG9hZDonL3NldF9jYW5fdXBsb2FkLycsLy/otoXnrqHorr7nva7lvIDlj5HogIXmmK/lkKblj6/kuIrkvKBcXG4gICAgbWFuUnVsZVNhZmU6Jy9zZXRfcnVsZV9zYWZlLycsLy/otoXnrqHorr7nva7op4TliJnlronlhajmgKdcXG4gICAgbWFuUnVsZUdvb2Q6Jy9zZXRfcnVsZV9nb29kLycsLy/otoXnrqHorr7nva7op4TliJnkvJjotKjmgKdcXG4gICAgaW1wb3J0VXJsOiBcXFwiL3J1bGVsaXN0Lmpzb24/aWQ9XFxcIiwgLy/op4TliJnor6bmg4Xlj6/lr7zlhaVcXG4gICAgaW5mb1NldFVybDogXFxcIi9kZXYvc2V0X2luZm9cXFwiLFxcbiAgICBub3dDb25Vcmw6IFxcXCIvc3FsX2luZm8vZ2V0X25vd19jb25cXFwiLFxcbiAgICBpbmZvR2V0VXJsOiBcXFwiL2Rldi9nZXRfaW5mbz9uYW1lPVxcXCIsXFxuICAgIHNldHRpbmdzR2V0VXJsOiBcXFwiL2Rldi9nZXRfc2V0dGluZ3M/bmFtZT1cXFwiLFxcbiAgICBndXBsb2FkOiBcXFwiL2Rldi9ndXBsb2FkXFxcIixcXG4gICAgZ3RpbWVvdmVyOiBcXFwiL2Rldi9ndGltZW92ZXJcXFwiLFxcbiAgICBnZXRieWlkOiBcXFwiL2Rldi9nZXRieWlkXFxcIixcXG4gICAgcnVsZUxpc3RKc29uOiBcXFwiL3J1bGVsaXN0Lmpzb25cXFwiLFxcbiAgICBhdXRoOiBcXFwiL2Rldi9nZXRfYXV0aFxcXCIsXFxuICAgIHRpbWVvdmVyOiBcXFwiL2Rldi90aW1lb3ZlclxcXCIsXFxuICAgIHNoYXJlOiBcXFwiL2Rldi9zaGFyZVxcXCIsXFxuICAgIGdlbkF1dGg6IFxcXCIvZGV2L2dlbl9hdXRoXFxcIixcXG4gICAgZGVsZXRlVXJsOiBcXFwiL2Rldi9kZWxldGVcXFwiLFxcbiAgICBqc29uTGlzdDogXFxcIi9kZXYvanNvbl9saXN0XFxcIixcXG4gICAgc2VhcmNoOiBcXFwiL2Rldi9zZWFyY2hcXFwiLFxcbiAgICBuZXdfZGV2OiBcXFwiL2Rldl9yZWdpc3QvbmV3XFxcIixcXG4gICAgbmV3X2dldElkOiBcXFwiL2Rldl9yZWdpc3QvZ2V0X2lkXFxcIixcXG4gICAgbmV3X2NvbmZpcm06IFxcXCIvZGV2X3JlZ2lzdC9jb25maXJtXFxcIixcXG4gICAgbW9kaWZ5X3B3ZDogXFxcIi9tb2RpZnkvcGFzc3dvcmRcXFwiLFxcbiAgICBtb2RpZnlfbmFtZTogXFxcIi9tb2RpZnkvbmFtZVxcXCIsXFxuICAgIG1vZGlmeV9hdmE6IFxcXCIvbW9kaWZ5L2F2YXRhclxcXCIsXFxuICAgIHVzZXI6IFxcXCIvZGV2L3VzZXIvXFxcIixcXG4gICAgZ2V0X3J1bGVfbm90ZTogXFxcIi9tb2RpZnkvZ2V0X3J1bGVfbm90ZS9cXFwiLFxcbiAgICBzZXRfcnVsZV9waWM6IFxcXCIvbW9kaWZ5L3J1bGVfcGljL1xcXCIsXFxuICAgIHNldF9ydWxlX25vdGU6IFxcXCIvbW9kaWZ5L3J1bGVfbm90ZS9cXFwiXFxufVxcbiQuZXhwb3J0cy5yYW5nZSA9IGZ1bmN0aW9uKG0sIG4pIHtcXG4gICAgcmV0dXJuIE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChtIC0gbiArIDEpICsgbik7XFxufVxcbiQuZXhwb3J0cy5tYXBDb2xUeXBlID0gZnVuY3Rpb24odGFyZ2V0LCB0eXBlLCBuKSB7XFxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgaSsrKSB7XFxuICAgICAgICB0YXJnZXQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IHR5cGVcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbnZhciBnZXRBcGkgPSBmdW5jdGlvbihrKSB7XFxuICAgIHJldHVybiBhcGkuaG9zdCArIGFwaVtrXTtcXG59O1xcbiQuZXhwb3J0cy5nZXRBcGk9Z2V0QXBpO1xcbiQuZXhwb3J0cy5tZD1nZXRBcGkoJ2ltcG9ydFVybCcpK1xcXCIzMTg3XFxcIjtcXG4kLmV4cG9ydHMubG9jYWxSdWxlVmVyID0gZnVuY3Rpb24obG9jYWxSdWxlTGlzdCwgcnVsZSkge1xcbiAgICBsZXQgbG9jYWxSdWxlO1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsUnVsZUxpc3QubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgIGxldCBpdGVtID0gbG9jYWxSdWxlTGlzdFtpXTtcXG4gICAgICAgIGxldCBhdSA9IGl0ZW0uYXV0aG9yIHx8IFxcXCJcXFwiO1xcbiAgICAgICAgbGV0IHNhbWVBdT1hdS5sZW5ndGggPiAwICYmIHJ1bGUuYXV0aG9yLmluY2x1ZGVzKGF1KTtcXG4gICAgICAgIHNhbWVBdT10cnVlOy8v5LiN5Yik5pat5L2c6ICF6buY6K6k5Li6dHJ1ZVxcbiAgICAgICAgaWYgKGl0ZW0udGl0bGUgPT09IHJ1bGUubmFtZSAmJiBzYW1lQXUpIHtcXG4gICAgICAgICAgICBsb2NhbFJ1bGUgPSBpdGVtO1xcbiAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGlmIChsb2NhbFJ1bGUgPT09IHZvaWQgMCkge1xcbiAgICAgICAgcmV0dXJuIC0xO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIGxvY2FsUnVsZS52ZXJzaW9uO1xcbiAgICB9XFxufVxcbiQuZXhwb3J0cy5jb2xvciA9IGZ1bmN0aW9uKHRleHQsIGNvbG9yKSB7XFxuICAgIHRleHQgKz0gXFxcIlxcXCI7XFxuICAgIGlmICh0ZXh0LmluZGV4T2YoXFxcIuKAnOKAnOKAneKAnVxcXCIpID09PSAwKSB7XFxuICAgICAgICB0ZXh0LnJlcGxhY2UoXFxcIuKAnOKAnOKAneKAnVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgfVxcbiAgICByZXR1cm4gXFxcIuKAnOKAnOKAneKAnTxmb250IGNvbG9yPSdcXFwiICsgY29sb3IgKyBcXFwiJz5cXFwiICsgdGV4dCArIFxcXCI8L2ZvbnQ+XFxcIjtcXG59XFxuXFxuZnVuY3Rpb24gaHRtbFRhZyh0YWcsIHRleHQpIHtcXG4gICAgdGV4dCArPSBcXFwiXFxcIjtcXG4gICAgaWYgKHRleHQuaW5kZXhPZihcXFwi4oCc4oCc4oCd4oCdXFxcIikgPT09IDApIHtcXG4gICAgICAgIHRleHQucmVwbGFjZShcXFwi4oCc4oCc4oCd4oCdXFxcIiwgXFxcIlxcXCIpO1xcbiAgICB9XFxuICAgIHJldHVybiBcXFwi4oCc4oCc4oCd4oCdXFxcIiArIFxcXCI8XFxcIiArIHRhZyArIFxcXCI+XFxcIiArIHRleHQgKyBcXFwiPC9cXFwiICsgdGFnICsgXFxcIj5cXFwiO1xcblxcbn1cXG5cXG5mdW5jdGlvbiBnZXROb3dGb3JtYXREYXRlKCkge1xcbiAgICAgICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoKTtcXG4gICAgICAgICAgICBsZXQgc2VwZXJhdG9yMSA9IFxcXCItXFxcIjtcXG4gICAgICAgICAgICBsZXQgc2VwZXJhdG9yMiA9IFxcXCI6XFxcIjtcXG4gICAgICAgICAgICBsZXQgbW9udGggPSBkYXRlLmdldE1vbnRoKCkgKyAxO1xcbiAgICAgICAgICAgIGxldCBzdHJEYXRlID0gZGF0ZS5nZXREYXRlKCk7XFxuICAgICAgICAgICAgbGV0IHN0ckhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xcbiAgICAgICAgICAgIGxldCBzdHJNaW51dGVzID0gZGF0ZS5nZXRNaW51dGVzKCk7XFxuICAgICAgICAgICAgbGV0IHN0clNlY29uZHMgPSBkYXRlLmdldFNlY29uZHMoKSsxO1xcbiAgICAgICAgICAgIGlmIChtb250aCA+PSAxICYmIG1vbnRoIDw9IDkpIHtcXG4gICAgICAgICAgICAgICAgbW9udGggPSBcXFwiMFxcXCIgKyBtb250aFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoc3RyRGF0ZSA+PSAwICYmIHN0ckRhdGUgPD0gOSkge1xcbiAgICAgICAgICAgICAgICBzdHJEYXRlID0gXFxcIjBcXFwiICsgc3RyRGF0ZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoc3RySG91cnMgPj0gMCAmJiBzdHJIb3VycyA8PSA5KSB7XFxuICAgICAgICAgICAgICAgIHN0ckhvdXJzID0gXFxcIjBcXFwiICsgc3RySG91cnNcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHN0ck1pbnV0ZXMgPj0gMCAmJiBzdHJNaW51dGVzIDw9IDkpIHtcXG4gICAgICAgICAgICAgICAgc3RyTWludXRlcyA9IFxcXCIwXFxcIiArIHN0ck1pbnV0ZXNcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHN0clNlY29uZHMgPj0gMCAmJiBzdHJTZWNvbmRzIDw9IDkpIHtcXG4gICAgICAgICAgICAgICAgc3RyU2Vjb25kcyA9IFxcXCIwXFxcIiArIHN0clNlY29uZHNcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLy9sZXQgY3VycmVudGRhdGUgPSBkYXRlLmdldEZ1bGxZZWFyKCkgKyBzZXBlcmF0b3IxICsgbW9udGggKyBzZXBlcmF0b3IxICsgc3RyRGF0ZSArIFxcXCIgXFxcIiArIHN0ckhvdXJzICsgc2VwZXJhdG9yMiArIHN0ck1pbnV0ZXMgKyBzZXBlcmF0b3IyICsgc3RyU2Vjb25kcztcXG4gICAgICAgICAgICBsZXQgY3VycmVudGRhdGUgPSAoZGF0ZS5nZXRGdWxsWWVhcigpLTIwMjApKycnKyBtb250aCArJycrIHN0ckRhdGUgKycnKyBzdHJIb3VycysnJyArIHN0ck1pbnV0ZXMgKycnKyBNYXRoLmNlaWwoc3RyU2Vjb25kcy83KTtcXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoY3VycmVudGRhdGUpXFxuICAgICAgICB9XFxuJC5leHBvcnRzLmdldE5vd0Zvcm1hdERhdGUgPSBnZXROb3dGb3JtYXREYXRlO1xcbiQuZXhwb3J0cy5odG1sVGFnID0gaHRtbFRhZztcXG4kLmV4cG9ydHMuc21hbGwgPSBmdW5jdGlvbih0ZXh0KSB7XFxuICAgIHJldHVybiBodG1sVGFnKFxcXCJzbWFsbFxcXCIsIHRleHQpO1xcbn1cXG4kLmV4cG9ydHMuZ2V0RmlsZSA9IGZ1bmN0aW9uKCkge1xcbiAgICB2YXIgRmlsZSA9IHJlcXVlc3QoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcIikgfHwgXFxcInt9XFxcIjtcXG4gICAgdHJ5IHtcXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEZpbGUpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcIiwgXFxcInt9XFxcIik7XFxuICAgICAgICByZXR1cm4ge307XFxuICAgIH1cXG59XFxuJC5leHBvcnRzLmdldFVzZXJEYXRlID1mdW5jdGlvbigpe1xcbiAgICB2YXIgRmlsZSA9IHJlcXVlc3QoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUkEuanNvblxcXCIpIHx8IFxcXCJbXVxcXCI7XFxuICAgIHRyeSB7XFxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShGaWxlKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVJBLmpzb25cXFwiLCBcXFwiW11cXFwiKTtcXG4gICAgICAgIHJldHVybiBbXTtcXG4gICAgfVxcbn1cXG4kLmV4cG9ydHMuZXhpc3RGaWxlID0gZnVuY3Rpb24oc3BhdGgsIGlwYXRoLCBoZWFkZXJzKSB7XFxuICAgIGxldCBzY29kZSA9IHJlcXVlc3Qoc3BhdGgpO1xcbiAgICBpZiAoIXNjb2RlKSB7XFxuICAgICAgICB3cml0ZUZpbGUoc3BhdGgsIHJlcXVlc3QoaXBhdGgsIGhlYWRlcnMpKTtcXG4gICAgfVxcbn1cXG5cXG5sZXQgbmV3QXBpID0ge1xcbiAgICBcXFwiZGlzX25ld1xcXCI6IFxcXCIvaGlrZXJ1bGUvbmV3X3J1bGVfZGlzY3Vzcy9cXFwiLFxcbiAgICBcXFwiZGlzX3ZlcmlmeVxcXCI6IFxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL2dldF95em1cXFwiLFxcbiAgICBcXFwiZGlzX2dldFxcXCI6IFxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL1xcXCIsXFxuICAgIFxcXCJkaXNfc2V0XFxcIjogXFxcIi9oaWtlcnVsZS9tb2RpZnkvY2FuX2Rpc2N1c3MvXFxcIixcXG4gICAgXFxcImRpc19uZXdfdXNlclxcXCI6IFxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL25ld191c2VyXFxcIixcXG4gICAgXFxcImRpc19sb2dpblxcXCI6XFxcIi9oaWtlcnVsZS9ydWxlX2Rpc2N1c3MvdXNlcl9sb2dpblxcXCIsXFxuICAgIFxcXCJkaXNfZGV2X2Rpc2N1c3NcXFwiOlxcXCIvaGlrZXJ1bGUvbW9kaWZ5L2Rldl9jYW5fZGlzY3Vzc1xcXCIsXFxuICAgIFxcXCJkaXNfZGV2X2NvbnRyb2xcXFwiOlxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL3JlbW92ZS9cXFwiLFxcbiAgICBcXFwiYWxsX3J1bGVcXFwiOlxcXCIvaGlrZXJ1bGUvZ2V0X3J1bGVzXFxcIixcXG4gICAgXFxcImRpc19nZXRfcmVwbHlcXFwiOlxcXCIvaGlrZXJ1bGUvZ2V0X3JlcGx5X3J1bGVfZGlzY3Vzc1xcXCIsXFxuICAgIFxcXCJkaXNfcmVwbHlcXFwiOlxcXCIvaGlrZXJ1bGUvZGV2X25ld19ydWxlX2Rpc2N1c3MvXFxcIixcXG59XFxuXFxuZnVuY3Rpb24gc2V0QXBpKG9iamVjdCkge1xcbiAgICBsZXQgdGFyZ2V0ID0ge307XFxuICAgIGZvciAobGV0IGtleSBpbiBvYmplY3QpIHtcXG4gICAgICAgIHRhcmdldFtrZXldPWhvc3Qrb2JqZWN0W2tleV1cXG4gICAgfVxcbiAgICByZXR1cm4gdGFyZ2V0O1xcbn1cXG5cXG4kLmV4cG9ydHMuYXBpID0gc2V0QXBpKG5ld0FwaSk7XFxuJC5leHBvcnRzLmFwaS5ob3N0PWhvc3Q7XFxuJC5leHBvcnRzLmFwaS5ob21lPWhvbWU7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlvIDlj5HogIXnmbvlvZVcIixcInBhdGhcIjpcImRldkxvZ2luXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuW8gOWPkeiAheeZu+W9lVxcXCIpO1xcbmNvbnN0IHtcXG4gICAgZ2V0QXBpLFxcbiAgICBodG1sVGFnLFxcbiAgICBtYXBDb2xUeXBlLFxcbiAgICBzbWFsbCxcXG5nZXRGaWxlXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbnZhciBkYXRhID0gW107XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpPT57XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2VVc2VybmFtZVxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlUGFzc3dvcmRcXFwiKTtcXG59KSlcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogJ+i0puWPtycsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZVVzZXJuYW1lJywnJyksXFxuICAgICAgICB0eXBlOlxcXCJudW1iZXJcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZVVzZXJuYW1lXFxcIixpbnB1dCknXFxuICAgIH1cXG59LCB7XFxuICAgIHRpdGxlOiAn5a+G56CBJyxcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlUGFzc3dvcmQnLCAnJyksXFxuICAgICAgICB0eXBlOiBcXFwicGFzc3dvcmRcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZVBhc3N3b3JkXFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwiJm5ic3A7Jm5ic3A7PGEgaHJlZj0naGlrZXI6Ly9wYWdlL1JlZ2lzdGVyJz7ms6jlhow8L2E+XFxcIixcXG4gICAgY29sX3R5cGU6XFxcInJpY2hfdGV4dFxcXCJcXG59KTtcXG5tYXBDb2xUeXBlKGRhdGEsIFxcXCJsaW5lX2JsYW5rXFxcIiwgMSk7XFxubGV0IHVzZXIgPSBnZXRGaWxlKCk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJcXFwiLCBcXFwi55m75b2VXFxcIiksXFxuICAgIHVybDogJCgpLmxhenlSdWxlKCh1cmwsIGYpPT4ge1xcbiAgICAgICAgbGV0IHVzZXJuYW1lID0gZ2V0VmFyKCdXYXJlaG91c2VVc2VybmFtZScsICcnKSxcXG4gICAgICAgICAgICBwYXNzd29yZCA9IGdldFZhcignV2FyZWhvdXNlUGFzc3dvcmQnLCAnJyk7XFxuICAgICAgICBpZih1c2VybmFtZSA9PT0gXFxcIlxcXCIgJiYgcGFzc3dvcmQgPT09XFxcIlxcXCIpe1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/otKblj7flkozlr4bnoIHkuI3og73kuLrnqbpcXFwiXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgbXlVcmwgPSB1cmwgKyAnP3FxPScgKyB1c2VybmFtZSArICcmcGFzc3dvcmQ9JyArIHBhc3N3b3JkO1xcbiAgICAgICAgbGV0IGNvZGVfc3RyID0gcmVxdWVzdChteVVybCk7XFxuICAgICAgICBsZXQgY29kZSA9IEpTT04ucGFyc2UoY29kZV9zdHIpO1xcbiAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09IDApIHtcXG4gICAgICAgICAgICBmLnVzZXJuYW1lPXVzZXJuYW1lO1xcbiAgICAgICAgICAgIGYucGFzc3dvcmQ9cGFzc3dvcmRcXG4gICAgICAgICAgICB3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uJywgSlNPTi5zdHJpbmdpZnkoZikpO1xcbiAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v55m75b2V5oiQ5YqfXFxcIjtcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/otKblj7fmiJblr4bnoIHplJnor69cXFwiO1xcbiAgICAgICAgfVxcbiAgICB9LCBnZXRBcGkoXFxcInJ1bGVzQWxsVXJsXFxcIiksdXNlciksXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG59KTtcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJpY29uXzJfcm91bmRcIixcIm5hbWVcIjpcIuW8gOWPkeiAheeuoeeQhlwiLFwicGF0aFwiOlwiZGV2TWFuYWdlXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuinhOWImeeuoeeQhlxcXCIpO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJ2NsZWFyVmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIsXFxcIlxcXCIpOycpO1xcbmlmIChnZXRWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIikgPT09IFxcXCIxXFxcIikge1xcbiAgICBiYWNrKCk7XFxufVxcbmNvbnN0IHtcXG4gICAgZ2V0QXBpLFxcbiAgICBjb2xvcixcXG4gICAgc21hbGwsXFxuICAgIGdldEZpbGUsXFxuICAgIGV4aXN0RmlsZSxcXG4gICAgbWFwQ29sVHlwZSxcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGRldixcXG4gICAgdXNlcm5hbWUsXFxuICAgIHBhc3N3b3JkXFxufSA9IE1ZX1BBUkFNUztcXG4vL2V4aXN0RmlsZShcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwv5byA5Y+R6ICF5YiG5LqrLmh0bWxcXFwiLCBcXFwiaHR0cHM6Ly9lcnAuc2N3aW5iYW8uY29tL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTM5XFxcIik7XFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZXNBbGxVcmxcXFwiKSArICc/cXE9JyArIHVzZXJuYW1lICsgJyZwYXNzd29yZD0nICsgcGFzc3dvcmQpKS5yZXN1bHQ7XFxubGV0IE1PQklMRV9VQSA9ICdNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgNS4wOyBTTS1HOTAwUCBCdWlsZC9MUlgyMVQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OC4wLjQzMjQuMTQ2IE1vYmlsZSBTYWZhcmkvNTM3LjM2JztcXG5sZXQgaW5mb1NldFVybCA9IGdldEFwaShcXFwiaW5mb1NldFVybFxcXCIpO1xcbmxldCBpbmZvR2V0VXJsID0gZ2V0QXBpKFxcXCJpbmZvR2V0VXJsXFxcIikgKyB1c2VybmFtZTtcXG5sZXQgc2V0dGluZ3NHZXRVcmwgPSBnZXRBcGkoXFxcInNldHRpbmdzR2V0VXJsXFxcIikgKyB1c2VybmFtZTtcXG5wdXRNeVZhcihcXFwiZGV2X3NldF9pbmZvXFxcIiwgW3VzZXJuYW1lLCBwYXNzd29yZCwgaW5mb1NldFVybCwgTU9CSUxFX1VBLCBpbmZvR2V0VXJsXS5qb2luKFxcXCIkJFxcXCIpKTtcXG5sZXQgZGF0YSA9IFtdO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGJpZz7ku5PlupPorr7nva48L2JpZz4mbmJzcDsmbmJzcDsmbmJzcDs8c21hbGw+PHU+77yIIOS4quS6uui1hOaWmSA+77yJPC91Pjwvc21hbGw+JyxcXG4gICAgZGVzYzogJ+KAnOKAnOKAneKAneaCqOWFseaciSA8c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPicgKyBydWxlTGlzdC5sZW5ndGggKyAnPC9zcGFuPicgKyBcXFwiIOadoeinhOWImeOAglxcXFxu54K55Ye76KeE5YiZ5Y+v6L+b6KGM5YiG5Lqr44CB5Yig6Zmk44CB5a+85YWl5pON5L2c5Y+K5p+l55yL6K+m5oOFXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL1BlcnNvbmFsRGF0YSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYTp7aWQ6ZGV2LmlkfSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnXFxufSk7XFxubWFwQ29sVHlwZShkYXRhLCBcXFwibGluZVxcXCIsIDIpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFwi5pu05pS55YWs5ZGK4pyNXFxcIiwgXFxcIiMzNGIxZmZcXFwiKSksXFxuICAgIC8vIHVybDogXFxcIng1Oi8vZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL2Rldl9pbmZvX2VkaXQuaHRtbFxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9kZXZJbmZvRWRpdFxcXCIsXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFwi5pu05aSa5YiG5Lqr8J+TslxcXCIsIFxcXCIjMzRiMWZmXFxcIikpLFxcbiAgICAvL3VybDogXFxcIng1Oi8vZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvcnVsZXMvZHpIb3VzZS9odG1sL+W8gOWPkeiAheWIhuS6qy5odG1sXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL21vcmVTaGFyZVxcXCIsXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBzbWFsbChjb2xvcihcXFwi5Y2H57qn5L6d6LWW8J+TpVxcXCIsIFxcXCIjMzRiMWZmXFxcIikpLFxcbiAgICB1cmw6ICQoXFxcIuWNh+e6p+S8mumHjeaWsOS7juS7k+W6k+aLieWPluebuOWFs+eahOmdmeaAgemhtemdouWIsOacrOWcsFxcXFxu56Gu6K6k5Y2H57qn5ZCXP1xcXCIpLmNvbmZpcm0oKGhvc3QpID0+IHtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwv5byA5Y+R6ICF5YiG5LqrLmh0bWxcXFwiLCByZXF1ZXN0KGhvc3QrJy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUzOScpKTtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwvZGV2X2luZm9fZWRpdC5odG1sXFxcIiwgcmVxdWVzdChob3N0KycvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD00MDInKSk7XFxuICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL2Rldl9pbmZvX2dldC5odG1sXFxcIiwgcmVxdWVzdChob3N0KycvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD00MDQnKSk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey6YeN572u5byA5Y+R6ICF5YiG5LqrLOeugOS7i+afpeeciyznroDku4vnvJbovpHnrYnpnZnmgIHmlofku7ZcXFwiO1xcbiAgICB9LGFwaS5ob3N0KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxufSk7XFxubGV0IGRldlNldEJhY2s7XFxudHJ5IHtcXG4gICAgZGV2U2V0QmFjayA9IEpTT04ucGFyc2UocmVxdWVzdChzZXR0aW5nc0dldFVybCkpO1xcbn0gY2F0Y2ggKGUpIHtcXG4gICAgZGV2U2V0QmFjayA9IHt9O1xcbn1cXG5cXG5mdW5jdGlvbiBzZXRTZXR0aW5nSXRlbShiYXNpYykge1xcbiAgICBsZXQgdGVtcCA9IHtcXG4gICAgICAgIHRpdGxlOiBiYXNpYy50aXRsZSxcXG4gICAgICAgIGNvbF90eXBlOiBiYXNpYy5jb2xfdHlwZSxcXG4gICAgICAgIHVybDogJChiYXNpYy5jb25maXJtKS5jb25maXJtKCh1cmwsIG1zZykgPT4ge1xcbiAgICAgICAgICAgIGxldCBiYWNrID0gcmVxdWVzdCh1cmwpO1xcbiAgICAgICAgICAgIGxldCByZXQgPSBKU09OLnBhcnNlKGJhY2spO1xcbiAgICAgICAgICAgIGlmIChyZXQuc3RhdHVzID09IDApIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgbXNnWzBdO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBtc2dbMV0gKyBcXFwiXFxcXG5cXFwiICsgcmV0LmRldGFpbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBiYXNpYy51cmwsIGJhc2ljLm1zZylcXG4gICAgfTtcXG4gICAgcmV0dXJuIHRlbXA7XFxufVxcbmlmIChkZXZTZXRCYWNrLnN0YXR1cyA9PSAwKSB7XFxuICAgIGxldCBkZXZTZXR0aW5ncyA9IGRldlNldEJhY2sucmVzdWx0O1xcbiAgICBsZXQgc2hhcmUgPSB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgfTtcXG4gICAgaWYgKGRldlNldHRpbmdzLnNoYXJlX3B1YmxpYykge1xcbiAgICAgICAgc2hhcmUudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5YWs5byA5LiK5LygXFxcIiwgXFxcImdyZWVuXFxcIikgKyBjb2xvcihcXFwiKOengeiXjylcXFwiLCBcXFwiIzAwYmZmZlxcXCIpKTtcXG4gICAgICAgIHNoYXJlLnVybCA9IGdldEFwaShcXFwiZ3VwbG9hZFxcXCIpICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZCArIFxcXCImZmxhZz0xXFxcIjtcXG4gICAgICAgIHNoYXJlLmNvbmZpcm0gPSBcXFwi5piv5ZCm56Gu6K6k56eB6JeP5Lul5ZCO5o+Q5Lqk55qE6KeE5YiZP1xcXCI7XFxuICAgICAgICBzaGFyZS5tc2cgPSBbXFxcIuW3suengeiXj1xcXCIsIFxcXCLnp4Hol4/lpLHotKVcXFwiXTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHNoYXJlLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuengeWvhuS4iuS8oFxcXCIsIFxcXCJyZWRcXFwiKSArIGNvbG9yKFxcXCIo5YWs5byAKVxcXCIsIFxcXCIjYWRmZjJmXFxcIikpO1xcbiAgICAgICAgc2hhcmUudXJsID0gZ2V0QXBpKFxcXCJndXBsb2FkXFxcIikgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkO1xcbiAgICAgICAgc2hhcmUuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTlhazlvIDku6XlkI7mj5DkuqTnmoTop4TliJk/XFxcIjtcXG4gICAgICAgIHNoYXJlLm1zZyA9IFtcXFwi5bey5YWs5byAXFxcIiwgXFxcIuWFrOW8gOWksei0pVxcXCJdO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbShzaGFyZSkpO1xcbiAgICBsZXQgdGltZU92ZXIgPSB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgfTtcXG4gICAgaWYgKGRldlNldHRpbmdzLnRpbWVfb3Zlcikge1xcbiAgICAgICAgdGltZU92ZXIudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi55+t5pe256eY6ZKlXFxcIiwgXFxcImdyZWVuXFxcIikgKyBjb2xvcihcXFwiKOawuOS5hSlcXFwiLCBcXFwiIzAwYmZmZlxcXCIpKTtcXG4gICAgICAgIHRpbWVPdmVyLnVybCA9IGdldEFwaShcXFwiZ3RpbWVvdmVyXFxcIikgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkICsgXFxcIiZmbGFnPTFcXFwiO1xcbiAgICAgICAgdGltZU92ZXIuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTku6XlkI7nmoTnp4Hol4/op4TliJnliIbkuqvkuI3ov4fmnJ8/XFxcIjtcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFwi5bey6K6+5Li65rC45LmFXFxcIiwgXFxcIuiuvuS4uuawuOS5heWksei0pVxcXCJdO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgdGltZU92ZXIudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5rC45LmF56eY6ZKlXFxcIiwgXFxcInJlZFxcXCIpICsgY29sb3IoXFxcIijov4fmnJ8pXFxcIiwgXFxcIiNhZGZmMmZcXFwiKSk7XFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcImd0aW1lb3ZlclxcXCIpICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZDtcXG4gICAgICAgIHRpbWVPdmVyLmNvbmZpcm0gPSBcXFwi56Gu6K6k6KaB5Lul5ZCO5YiG5Lqr55qE56eB6JeP6KeE5YiZ6Ieq5Yqo5Yiw5pyfP1xcXCI7XFxuICAgICAgICB0aW1lT3Zlci5tc2cgPSBbXFxcIuW3suiuvuS4uui/h+acn1xcXCIsIFxcXCLorr7kuLrov4fmnJ/lpLHotKVcXFwiXTtcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goc2V0U2V0dGluZ0l0ZW0odGltZU92ZXIpKTtcXG4gICAgbGV0IGRpc2N1c3MgPSB7XFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCJcXG4gICAgfTtcXG4gICAgaWYgKGRldlNldHRpbmdzLmNhbl9kaXNjdXNzKSB7XFxuICAgICAgICBkaXNjdXNzLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuWFgeiuuOivhOiuulxcXCIsIFxcXCJyZWRcXFwiKSArIGNvbG9yKFxcXCIo5LiN6K64KVxcXCIsIFxcXCIjYWRmZjJmXFxcIikpO1xcbiAgICAgICAgZGlzY3Vzcy51cmwgPSBhcGkuZGlzX2Rldl9kaXNjdXNzICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZCsgXFxcIiZmbGFnPTFcXFwiO1xcbiAgICAgICAgZGlzY3Vzcy5jb25maXJtID0gXFxcIuaYr+WQpuehruiupOS7peWQjuS4iuS8oOeahOinhOWImeWFgeiuuOivhOiuuj9cXFwiO1xcbiAgICAgICAgZGlzY3Vzcy5tc2cgPSBbXFxcIuW3suiuvuS4uuS4jeiuuFxcXCIsIFxcXCLorr7nva7lpLHotKVcXFwiXTtcXG5cXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIGRpc2N1c3MudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5LiN6K646K+E6K66XFxcIiwgXFxcImdyZWVuXFxcIikgKyBjb2xvcihcXFwiKOWFgeiuuClcXFwiLCBcXFwiIzAwYmZmZlxcXCIpKTtcXG4gICAgICAgIGRpc2N1c3MudXJsID0gYXBpLmRpc19kZXZfZGlzY3VzcyArIFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQ7XFxuICAgICAgICBkaXNjdXNzLmNvbmZpcm0gPSBcXFwi5piv5ZCm56Gu6K6k5Lul5ZCO5LiK5Lyg55qE6KeE5YiZ5YWB6K646K+E6K66P1xcXCI7XFxuICAgICAgICBkaXNjdXNzLm1zZyA9IFtcXFwi5bey6K6+5Li65YWB6K64XFxcIiwgXFxcIuiuvue9ruWksei0pVxcXCJdO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbShkaXNjdXNzKSk7XFxufVxcbm1hcENvbFR5cGUoZGF0YSwgXFxcImxpbmVcXFwiLCAyKTtcXG5mb3IgKGxldCBpdGVtIG9mIHJ1bGVMaXN0KSB7XFxuICAgIGxldCBteV90X2V4Y29kZTEgPSAnJztcXG4gICAgbGV0IG15X3RfZXhjb2RlMiA9ICcnO1xcbiAgICBpZiAoaXRlbS5zdGF0ZSAhPSAncHVibGljJykge1xcbiAgICAgICAgbXlfdF9leGNvZGUxICs9ICfjipnvuI8nO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgbXlfdF9leGNvZGUxICs9ICcnO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogbXlfdF9leGNvZGUxICsgaXRlbS5uYW1lICsgbXlfdF9leGNvZGUyLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL21hbmFnZVJ1bGUjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsXFxuICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxcbiAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZFxcbiAgICAgICAgfSxcXG4gICAgICAgIHBpY191cmw6IGl0ZW0ucGljLFxcbiAgICB9KVxcbn1cXG5pZiAocnVsZUxpc3QubGVuZ3RoID09PSAwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuW/q+adpeS4iuS8oOS9oOeahOesrOS4gOadoeinhOWImeWQp++8gTwvaDU+XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9KTtcXG59XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeE5YiZ6K+m57uGLWRldlwiLFwicGF0aFwiOlwibWFuYWdlUnVsZVwiLFwicnVsZVwiOlwianM6XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGNvbG9yLFxcbiAgICBzbWFsbCxcXG4gICAgZ2V0RmlsZSxcXG4gICAgZXhpc3RGaWxlLFxcbiAgICBtYXBDb2xUeXBlLFxcbiAgICBodG1sVGFnLFxcbiAgICBhcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgaWQsXFxuICAgIHVzZXJuYW1lLFxcbiAgICBwYXNzd29yZFxcbn0gPSBNWV9QQVJBTVM7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbn0pKTtcXG5sZXQgZGF0YUl0ZW0gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJnZXRieWlkXFxcIikgKyBcXFwiP2lkPVxcXCIgKyBpZCkpLnJlc3VsdDtcXG5zZXRQYWdlVGl0bGUoXFxcIue8lui+keOAjFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcIuOAjVxcXCIpO1xcbmxldCByZXFCeUdldCA9IFxcXCI/aWQ9XFxcIiArIGRhdGFJdGVtLmlkICsgXFxcIiZxcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZDtcXG5sZXQgcnVsZUxpc3RKc29uID0gZ2V0QXBpKFxcXCJydWxlTGlzdEpzb25cXFwiKSArIFxcXCI/aWQ9XFxcIjtcXG5sZXQgZGF0YSA9IFtdO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi54mI5pysXFxcIiksXFxuICAgIGRlc2M6IFxcXCLigJzigJzigJ3igJ3kupHnq6/niYjmnKw6XFxcIiArIGNvbG9yKGRhdGFJdGVtLnZlciwgXFxcIiM1Y2ZmMmNcXFwiKSArIFxcXCJcXFxcbuS4iuasoeaPkOS6pOS6jjogW1xcXCIgKyBjb2xvcihkYXRhSXRlbS5sYXN0X3VwZGF0ZSwgXFxcIiNmZjcwMDBcXFwiKSArIFxcXCJdXFxcIixcXG4gICAgdXJsOiAkKFxcXCI85byA5Y+R6ICFPlxcXFxuXFxcIiArIGRhdGFJdGVtLmF1dGhvciArIFxcXCJcXFxcbjzlkI3np7A+XFxcXG5cXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJcXFxcbjzkupHnq6/niYjmnKw+XFxcXG5cXFwiICsgZGF0YUl0ZW0udmVyICsgXFxcIlxcXFxuPOabtOaWsOaXtumXtD5cXFxcbltcXFwiICsgZGF0YUl0ZW0ubGFzdF91cGRhdGUgKyBcXFwiXVxcXCIpLmNvbmZpcm0oKCkgPT4ge30pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMSdcXG59KTtcXG5sZXQgZGF0YVR5cGUgPSB7XFxuICAgIGhvbWVfcnVsZV91cmw6ICfpppbpobXkupHop4TliJknLFxcbiAgICBwdWJsaXNoOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXG4gICAganNfdXJsOiAn572R6aG15o+S5Lu26KeE5YiZJyxcXG4gICAgaHRtbDogJ+mdmeaAgemhtemdoicsXFxuICAgIGNvbmZpZzogJ+S4u+mhtemFjee9ridcXG59O1xcblxcbmxldCBiYXNpYyA9IHtcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn07XFxubGV0IGRhdGFUeXBlVGlwcyA9IGRhdGFUeXBlW2RhdGFJdGVtLmRhdGFfdHlwZV0gfHwgJ+acquefpeinhOWImTonICsgZGF0YUl0ZW0uZGF0YV90eXBlO1xcblxcbmJhc2ljLnRpdGxlID0gaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuexu+Wei1xcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwiKGlkOlxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXCIpXFxcIik7XFxuYmFzaWMuZGVzYyA9IFxcXCLmlbDmja7nsbvlnovvvJpcXFwiICsgY29sb3IoZGF0YVR5cGVUaXBzLCBcXFwiI2NiNTRmZlxcXCIpICsgXFxcIlxcXFxu5YiG5Lqr54q25oCB5Li677yaXFxcIiArIGRhdGFJdGVtLnN0YXRlO1xcbmlmIChbXFxcImh0bWxcXFwiLCBcXFwiY29uZmlnXFxcIiwgXFxcImpzX3VybFxcXCJdLmluY2x1ZGVzKGRhdGFJdGVtLmRhdGFfdHlwZSkpIHtcXG4gICAgYmFzaWMuZGVzYyArPSBcXFwiXFxcXG7igJzigJzigJ3igJ0gPT5cXFwiICsgc21hbGwoXFxcIueCueatpOmihOiniFxcXCIpO1xcbiAgICBiYXNpYy51cmwgPSBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG59XFxubGV0IGF1dGggPSBcXFwiXFxcIjtcXG5pZiAoZGF0YUl0ZW0uc3RhdGUgPT0gXFxcInByaXZhdGVcXFwiKSB7XFxuICAgIGxldCBhdXRoX2JhY2sgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJhdXRoXFxcIikgKyByZXFCeUdldCkpO1xcbiAgICBiYXNpYy50aXRsZSA9IGJhc2ljLnRpdGxlICsgXFxcIlxcXFxuXFxcIiArIHNtYWxsKGNvbG9yKGF1dGhfYmFjay5yZXN1bHQsIFxcXCJncmV5XFxcIikpO1xcbiAgICBhdXRoID0gJyZhdXRoPScgKyBhdXRoX2JhY2sucmVzdWx0O1xcbiAgICBiYXNpYy51cmwgPSBiYXNpYy51cmwgPT09IFxcXCJoaWtlcjovL2VtcHR5XFxcIiA/IGJhc2ljLnVybCA6IGJhc2ljLnVybCArIGF1dGg7XFxufVxcbmRhdGEucHVzaChiYXNpYyk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLmk43kvZxcXFwiKSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJ0b2FzdDovL+S9oOaJjeaYr+acgOW4heeahOmCo+S4quS6uu+8gVxcXCJcXG59KTtcXG5sZXQgaW1wb3J0VXJsLCBydWxlQ29kZSwgc2hhcmVVcmwsIGJhY2tDb2RlID0gXFxcIlxcXCI7XFxuaWYgKCFkYXRhSXRlbS5pc19qc29uKSB7XFxuICAgIGJhY2tDb2RlID0gcmVxdWVzdChydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArIGF1dGgpO1xcbn1cXG5zd2l0Y2ggKGRhdGFJdGVtLmRhdGFfdHlwZSkge1xcbiAgICBjYXNlIFxcXCJob21lX3J1bGVfdXJsXFxcIjpcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcIua1t+mYlOinhueVjOmmlumhtemikemBk+inhOWImeOAkFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcIuOAke+/pWhvbWVfcnVsZV91cmzvv6VcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyBhdXRoO1xcbiAgICAgICAgaW1wb3J0VXJsID0gXFxcInJ1bGU6Ly9cXFwiICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKVxcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ3B1Ymxpc2gnOlxcbiAgICAgICAgcnVsZUNvZGUgPSAn5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77yaJyArIGRhdGFJdGVtLm5hbWUgKyAn77+lcHVibGlzaO+/pScgKyBiYXNlNjRFbmNvZGUoYmFja0NvZGUpO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdqc191cmwnOlxcbiAgICAgICAgcnVsZUNvZGUgPSAn5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77ya572R6aG15o+S5Lu277+lanNfdXJs77+lJyArIGRhdGFJdGVtLm5hbWUgKyAnQGJhc2U2NDovLycgKyBiYXNlNjRFbmNvZGUoYmFja0NvZGUpO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdodG1sJzpcXG4gICAgICAgIGxldCBmaWxlX3RtcCA9IGRhdGFJdGVtLm5hbWUuc3BsaXQoJy4nKTtcXG4gICAgICAgIGxldCBmaWxlX3BhdGggPSBmaWxlX3RtcC5sZW5ndGggPiAxID8gZmlsZV90bXBbZmlsZV90bXAubGVuZ3RoIC0gMV0gKyBcXFwiL1xcXCIgKyBkYXRhSXRlbS5uYW1lIDogZGF0YUl0ZW0ubmFtZTtcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcIua1t+mYlOinhueVjOacrOWcsOaWh+S7tuWIhuS6q++/pWZpbGVfdXJs77+laGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL1xcXCIgKyBmaWxlX3BhdGggKyBcXFwiQFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArIGF1dGg7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWtcXG4gICAgY2FzZSBcXFwiY29uZmlnXFxcIjpcXG4gICAgICAgIGltcG9ydFVybCA9ICQoKS5ydWxlKHBhc3N3b3JkID0+IHtcXG4gICAgICAgICAgICBldmFsKGZldGNoKFxcXCJoaWtlcjovL2Fzc2V0cy9ob21lLmpzXFxcIikpO1xcbiAgICAgICAgICAgIEhpa2VySG9tZS5sb2FkKFxcXCJpbXBvcnRcXFwiLCBwYXNzd29yZCk7XFxuICAgICAgICB9LCBiYWNrQ29kZSk7XFxuICAgICAgICBicmVhaztcXG59XFxubGV0IG15X2NvbF90eXBlID0gXFxcInRleHRfMlxcXCI7XFxuaWYgKGltcG9ydFVybCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlr7zlhaXop4TliJlcXFwiLFxcbiAgICAgICAgdXJsOiBpbXBvcnRVcmwsXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcbmlmIChydWxlQ29kZSkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLliIbkuqvop4TliJlcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiY29weTovL1xcXCIgKyBydWxlQ29kZSxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0U2V0dGluZ0l0ZW0oYmFzaWMsIHBhdHRlcm4pIHtcXG4gICAgbGV0IHRlbXAgPSB7XFxuICAgICAgICB0aXRsZTogYmFzaWMudGl0bGUsXFxuICAgICAgICBjb2xfdHlwZTogYmFzaWMuY29sX3R5cGUsXFxuICAgICAgICB1cmw6ICQoYmFzaWMuY29uZmlybSkuY29uZmlybSgodXJsLCBtc2csIHBhdHRlcm4pID0+IHtcXG4gICAgICAgICAgICBsZXQgYmFja0EgPSByZXF1ZXN0KHVybCk7XFxuICAgICAgICAgICAgbGV0IHJldCA9IEpTT04ucGFyc2UoYmFja0EpO1xcbiAgICAgICAgICAgIGlmIChyZXQuc3RhdHVzID09IDApIHtcXG4gICAgICAgICAgICAgICAgcGF0dGVybiA/IGJhY2soKSA6IHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBtc2dbMF07XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcGF0dGVybiA/IGJhY2soKSA6IHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBtc2dbMV0gKyBcXFwiXFxcXG5cXFwiICsgcmV0LmRldGFpbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBiYXNpYy51cmwsIGJhc2ljLm1zZywgcGF0dGVybilcXG4gICAgfTtcXG4gICAgcmV0dXJuIHRlbXA7XFxufVxcbmlmIChkYXRhSXRlbS5zdGF0ZSA9PSAncHJpdmF0ZScpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6K6+5Li65YWs5byAXFxcIixcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcInNoYXJlXFxcIikgKyByZXFCeUdldCArIFxcXCImZmxhZ1xcXCIgKyBcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgcmVxdWVzdChpbnB1dCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lorr7kuLrlhazlvIBcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSwge1xcbiAgICAgICAgdGl0bGU6IFxcXCLpmo/mnLrlr4bpkqVcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlLFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFwiZ2VuQXV0aFxcXCIpICsgcmVxQnlHZXQgKyBcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGJhY2sgPSByZXF1ZXN0KGlucHV0KTtcXG4gICAgICAgICAgICBsZXQgcmV0ID0gSlNPTi5wYXJzZShiYWNrKTtcXG4gICAgICAgICAgICBpZiAocmV0LnN0YXR1cyA9PSAwKSB7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sueUn+aIkOmaj+acuuWvhueggVxcXFxuXFxcIiArIHJldC5yZXN1bHRcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+maj+acuuWvhueggeeUn+aIkOWksei0pVxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KVxcbiAgICB9KTtcXG4gICAgbGV0IHRpbWVPdmVyID0ge1xcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH07XFxuICAgIGlmIChkYXRhSXRlbS50aW1lX292ZXIpIHtcXG4gICAgICAgIHRpbWVPdmVyLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuefreaXtuWvhumSpVxcXCIsIFxcXCJncmVlblxcXCIpICsgY29sb3IoXFxcIijihpLmsLjkuYUpXFxcIiwgXFxcInJlZFxcXCIpKTtcXG4gICAgICAgIHRpbWVPdmVyLnVybCA9IGdldEFwaShcXFwidGltZW92ZXJcXFwiKSArIHJlcUJ5R2V0ICsgXFxcIiZmbGFnPTFcXFwiO1xcbiAgICAgICAgdGltZU92ZXIuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTku6XlkI7nmoTnp4Hol4/op4TliJnliIbkuqvkuI3ov4fmnJ8/XFxcIjtcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFwi5bey6K6+5Li65rC45LmFXFxcIiwgXFxcIuiuvuS4uuawuOS5heWksei0pVxcXCJdO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgdGltZU92ZXIudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5rC45LmF5a+G6ZKlXFxcIiwgXFxcInJlZFxcXCIpICsgY29sb3IoXFxcIijihpLnn63ml7YpXFxcIiwgXFxcImdyZWVuXFxcIikpO1xcbiAgICAgICAgdGltZU92ZXIudXJsID0gZ2V0QXBpKFxcXCJ0aW1lb3ZlclxcXCIpICsgcmVxQnlHZXQ7XFxuICAgICAgICB0aW1lT3Zlci5jb25maXJtID0gXFxcIuehruiupOimgeS7peWQjuWIhuS6q+eahOengeiXj+inhOWImeiHquWKqOWIsOacnz9cXFwiO1xcbiAgICAgICAgdGltZU92ZXIubXNnID0gW1xcXCLlt7Lorr7kuLrov4fmnJ9cXFwiLCBcXFwi6K6+5Li66L+H5pyf5aSx6LSlXFxcIl07XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKHRpbWVPdmVyKSk7XFxufSBlbHNlIGlmIChkYXRhSXRlbS5zdGF0ZSA9PSAncHVibGljJykge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLorr7kuLrnp4HmnIlcXFwiLFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFwic2hhcmVcXFwiKSArIHJlcUJ5R2V0ICsgXFxcIiZmbGFnPTEjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICByZXF1ZXN0KGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suiuvuS4uuengeaciVxcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KTtcXG59XFxuZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKHtcXG4gICAgdGl0bGU6IFxcXCLliKDpmaTmlbDmja5cXFwiLFxcbiAgICBjb25maXJtOiBcXFwi5piv5ZCm56Gu6K6k5Yig6ZmkXFxcIixcXG4gICAgbXNnOiBbXFxcIuW3suWIoOmZpFxcXCIsIFxcXCLliKDpmaTlpLHotKVcXFwiXSxcXG4gICAgdXJsOiBnZXRBcGkoXFxcImRlbGV0ZVVybFxcXCIpICsgcmVxQnlHZXQsXFxuICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbn0sIHRydWUpKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuiuvue9ruWbvuagh1xcXCIsXFxuICAgIHVybDogJChkYXRhSXRlbS5waWNfdXJsLCBcXFwi6L6T5YWl5Zu+5qCH5Zyw5Z2AXFxcIikuaW5wdXQoYXBpID0+IHtcXG4gICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L2g5Zyo6YCX5oiR6ZO+5o6l5ZOqP1xcXCJcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGFwaSArIFxcXCImcnVsZV9waWM9XFxcIiArIGlucHV0KTtcXG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxuICAgIH0sIGdldEFwaShcXFwic2V0X3J1bGVfcGljXFxcIikgKyBkYXRhSXRlbS5pZCArIHJlcUJ5R2V0KSxcXG4gICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmNhbl9kaXNjdXNzID8gXFxcIuemgeatouivhOiuulxcXCIgOiBcXFwi5byA5ZCv6K+E6K66XFxcIixcXG4gICAgdXJsOiAkKGFwaS5kaXNfc2V0ICsgZGF0YUl0ZW0uaWQgKyByZXFCeUdldCArIFxcXCImc3RhdGU9XFxcIiArIChkYXRhSXRlbS5jYW5fZGlzY3VzcyA/IFxcXCJcXFwiIDogMSkpLmxhenlSdWxlKChjYW5fZGlzY3VzcykgPT4ge1xcbiAgICAgICAgcmVxdWVzdChpbnB1dCk7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gY2FuX2Rpc2N1c3MgPyBcXFwidG9hc3Q6Ly/lt7LnpoHmraLor4TorrpcXFwiIDogXFxcInRvYXN0Oi8v5bey5byA5ZCv6K+E6K66XFxcIjtcXG4gICAgfSwgZGF0YUl0ZW0uY2FuX2Rpc2N1c3MpLFxcbiAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG59KTtcXG5NWV9QQVJBTVMubmFtZSA9IGRhdGFJdGVtLm5hbWU7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLorr7nva7lpIfms6hcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2Uvc2V0X3J1bGVfbm90ZXNcXFwiLFxcbiAgICBleHRyYTogTVlfUEFSQU1TLFxcbiAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG59KTtcXG5pZiAoZGF0YUl0ZW0uaXNfanNvbiAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT09IFxcXCJob21lX3J1bGVfdXJsXFxcIiAmJiAhZGF0YUl0ZW0uaXNfanNvbl9saXN0KSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+i/m+WFpemikemBkycsXFxuICAgICAgICB1cmw6ICQoIC8qXFxcIiNub0xvYWRpbmcjXFxcIiovICkubGF6eVJ1bGUoKG5hbWUsaG9tZSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChob21lKSk7XFxuICAgICAgICAgICAgbGV0IGhhc1J1bGUgPSBydWxlTGlzdC5zb21lKGl0ZW0gPT4gaXRlbS50aXRsZSA9PT0gbmFtZSk7XFxuICAgICAgICAgICAgaWYgKGhhc1J1bGUpIHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvbWUrXFxcInNAXFxcIiArIG5hbWU7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acquWuieijhVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgZGF0YUl0ZW0ubmFtZSxhcGkuaG9tZSksXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogZGF0YUl0ZW0uZ29vZF9udW0sXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6LWeLnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogZGF0YUl0ZW0uYmFkX251bSxcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/ouKkuc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6K+E6K66XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/or4Torrouc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvUmVwbHkjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHJ1bGVJZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5hdXRob3IsXFxuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXFxuICAgICAgICB1c2VybmFtZTogdXNlcm5hbWVcXG4gICAgfVxcbn0pO1xcbmxldCB0b3RhbFN1bSA9IGRhdGFJdGVtLmdvb2RfbnVtICsgZGF0YUl0ZW0uYmFkX251bTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuivhOiuuihcXFwiICsgdG90YWxTdW0gKyBcXFwiKVxcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXCJ1XFxcIiwgXFxcIuafpeeci+WFqOmDqOivhOiuuijmjqfor4QpID5cXFwiKSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL0NvbW1lbnRcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eSNmeXBhZ2Ujbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIHRvdGFsU3VtOiB0b3RhbFN1bSxcXG4gICAgICAgIG5vX2FjdGl2ZTogdHJ1ZSxcXG4gICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZFxcbiAgICB9XFxufSk7XFxuLy9jb25zdCBsb25nZXN0U3VtPTEyMDtcXG5sZXQgaWNvbiA9IHtcXG4gICAgXFxcImdvb2RcXFwiOiBcXFwi8J+RjVxcXCIsXFxuICAgIFxcXCJiYWRcXFwiOiBcXFwi8J+RjlxcXCIsXFxuICAgIFxcXCJyZXBseVxcXCI6IFxcXCLlvIDlj5HogIXwn5ejXFxcIlxcbn1cXG5pZiAodG90YWxTdW0gPT09IDApIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5LiA5p2h6K+E6K665Lmf5rKh5pyJ77yM5b+r5p2l5oqi5rKZ5Y+R5ZCn77yBPC9oNT5cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn0gZWxzZSB7XFxuICAgIGxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldCArIGRhdGFJdGVtLmlkICsgXFxcIj9saW1pdD01XFxcIikpLnJlc3VsdDtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21tZW50TGlzdCkge1xcbiAgICAgICAgbGV0IFJlcGx5ID0gaXRlbS5kaXNjdXNzX3R5cGU9PT1cXFwicmVwbHlcXFwiJiZpdGVtLnJlcGx5X3RvX25hbWUhPT1mYWxzZSYmaXRlbS5yZXBseV90b19pZCE9PWZhbHNlP1xcXCLigJjigJjlm57lpI1AXFxcIitpdGVtLnJlcGx5X3RvX25hbWUrXFxcIiAjXFxcIitpdGVtLmRpc2N1c3NfaWQrXFxcIuKAmeKAmVxcXFxuXFxcIjpcXFwiXFxcIjtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFwiICsgaXRlbS5pZCArIFxcXCI8L3NtYWxsPjxmb250PlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9SZXBseVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6e1xcbiAgICAgICAgICAgICAgICBydWxlSWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICByZXBseUlkOml0ZW0uaWRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXG4gICAgICAgICAgICBkZXNjOiBSZXBseStpdGVtLmNyZWF0ZV9kYXRlICsgXFxcIsK3XFxcIiArIGljb25baXRlbS5kaXNjdXNzX3R5cGVdLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB0eXBlOiBcXFwibG9uZ190ZXh0XFxcIixcXG4gICAgICAgICAgICAgICAgdGV4dDogaXRlbS5kaXNjdXNzX3RleHRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcImljb25fMl9yb3VuZFwiLFwibmFtZVwiOlwi6KeE5YiZ5YiX6KGoXCIsXCJwYXRoXCI6XCJydWxlc1wiLFwicnVsZVwiOlwianM6XFxuICAgIGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJ2NsZWFyVmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIsXFxcIlxcXCIpO2NsZWFyVmFyKFxcXCJXYXJlaG91c2UuY2FuX3VwbG9hZFxcXCIsXFxcIlxcXCIpO2NsZWFyVmFyKFxcXCJXYXJlaG91c2UuZmlsdGVyXFxcIixcXFwiXFxcIik7Y2xlYXJWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIixcXFwiXFxcIik7Jyk7XFxuXFxuaWYgKGdldFZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiKSA9PT0gXFxcIjFcXFwiKSB7XFxuICAgIGJhY2soZmFsc2UpO1xcbn1cXG5cXG5jb25zdCB7XFxuICAgIGdldEFwaSxcXG4gICAgYXBpLFxcbiAgICBjb2xvcixcXG4gICAgc21hbGwsXFxuICAgIGxvY2FsUnVsZVZlcixcXG4gICAgaHRtbFRhZyxcXG4gICAgbWRcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxuY29uc3QgeyBtZXJnZVNvcnQgfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3NvcnRcXFwiKTtcXG5sZXQge1xcbiAgICBhdmF0YXJVcmwsXFxuICAgIHFxLFxcbiAgICBpZCxcXG4gICAgY2FuX3VwbG9hZFxcbn0gPSBNWV9QQVJBTVM7XFxubGV0IGRhdGFUeXBlID0gZ2V0VmFyKFxcXCJXYXJlaG91c2UudHlwZVxcXCIsXFxcIlxcXCIpO1xcbmxldCBiYWNrQ29kZSA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcInJ1bGVzVXJsXFxcIikgKyBcXFwiP25hbWU9XFxcIiArIHFxK1xcXCImZGF0YV90eXBlPVxcXCIrZGF0YVR5cGUpKTtcXG5sZXQgZGV2TmFtZSA9IGJhY2tDb2RlLmRldl9uYW1lO1xcbnB1dFZhcihcXFwiV2FyZWhvdXNlLmZpbHRlclxcXCIsIGRldk5hbWUpO1xcbmxldCBydWxlTGlzdCA9IGJhY2tDb2RlLnJlc3VsdDtcXG5sZXQgc3ViVXJsID0gZ2V0QXBpKFxcXCJqc29uTGlzdFxcXCIpICsgXFxcIj9uYW1lPVxcXCIgKyBxcTtcXG5sZXQgaGFzU3ViID0gaGFzSG9tZVN1YihzdWJVcmwpO1xcbmxldCBkZXZJbmZvID0gXFxcIui/meS4quS6uuW+iOaHkizku4DkuYjpg73msqHlhpnlk6Z+XFxcIjtcXG5sZXQgdG1wSnNvbiA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcImluZm9HZXRVcmxcXFwiKSArIHFxKSk7XFxuaWYgKHRtcEpzb24uc3RhdHVzID09IDApIHtcXG4gICAgZGV2SW5mbyA9IHRtcEpzb24ucmVzdWx0IHx8IGRldkluZm87XFxufVxcbmxldCBzdWJGbGFnID0gaGFzU3ViID8gJ/CfhpcnIDogJ/Cfk6EnO1xcbmxldCBkYXRhID0gW107XFxucmVxdWlyZShtZCk7XFxuZGV2SW5mbz1tYXJrZWQucGFyc2UoZGV2SW5mbyk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgZGV2TmFtZSArIFxcXCJcXFxcblxcXFxuXFxcIiArIHNtYWxsKGh0bWxUYWcoXFxcInVcXFwiLCBcXFwi54K55Ye75p+l55yL5a6M5pW05YWs5ZGKXFxcIikpLFxcbiAgICBkZXNjOiBzbWFsbChkZXZJbmZvKSxcXG4gICAgdXJsOiAnaGlrZXI6Ly9wYWdlL2luZm8nLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGV4dDogZGV2SW5mbyxcXG4gICAgICAgIG5hbWU6IGRldk5hbWUsXFxuICAgICAgICB0eXBlOlxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0sXFxuICAgIHBpY191cmw6IGF2YXRhclVybCxcXG4gICAgY29sX3R5cGU6ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpYydcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxiaWc+6K6i6ZiF566h55CGPC9iaWc+Jm5ic3A7Jm5ic3A7PHNtYWxsPijlvZPliY1cXFwiICsgKGhhc1N1YiA/IFxcXCLlt7LorqLpmIVcXFwiIDogXFxcIuacquiuoumYhVxcXCIpICsgXFxcIik8L3NtYWxsPlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcblxcbmxldCBzdWJfY29kZSA9ICfmtbfpmJTop4bnlYzlkIjpm4bop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pScgKyBkZXZOYW1lICsgXFxcIuWQiOmbhkBAXFxcIiArIHN1YlVybDtcXG5sZXQgcnVsZXNDb2RlID0gJ+a1t+mYlOinhueVjOWQiOmbhuinhOWIme+/pWhvbWVfcnVsZV91cmzvv6UnICsgc3ViVXJsO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7kuIDplK7orqLpmIU8L3NwYW4+JyxcXG4gICAgZGVzYzogJ+iuoumYheKAnOKAnOKAneKAnTxzcGFuIHN0eWxlPVxcXCJjb2xvcjogIzVjZmYyY1xcXCI+JyArIGRldk5hbWUgKyAnPC9zcGFuPueahOaJgOacieWNleinhOWIme+8jOWQiOmbhumcgOWNleeLrOiuoumYhScsXFxuICAgIHVybDogc3ViX2NvZGUsXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7lr7zlhaXlhajpg6g8L3NwYW4+JyxcXG4gICAgdXJsOiBydWxlc0NvZGUsXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7lr7zlhaXovbvlkIjpm4Y8L3NwYW4+JyxcXG4gICAgdXJsOiAkKCkubGF6eVJ1bGUoKGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCk9PntcXG4gICAgICAgIGNvbnN0IHtnZW5SdWxlfT0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9nZW5BcGlcXFwiKTtcXG4gICAgICAgIGxvZyhcXFwi6L275ZCI6ZuG5Zu+5qCH6ZO+5o6lOlxcXCIrYXZhdGFyVXJsKTtcXG4gICAgICAgIGxldCBpbXBvcnRfcnVsZT1nZW5SdWxlKFxcXCLovbvlkIjpm4YuXFxcIitkZXZOYW1lLHN1YlVybCxhdmF0YXJVcmwpO1xcbiAgICAgICAgLy9jb3B5KGltcG9ydF9ydWxlKTtcXG4gICAgICAgIGxldCBydWxlQ29kZT1wYXJzZVBhc3RlKGltcG9ydF9ydWxlLnNwbGl0KFxcXCJcXFxcblxcXCIpWzBdKTtcXG4gICAgICAgIC8vcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIHJldHVybiBpbXBvcnRVcmxcXG4gICAgfSxkZXZOYW1lLHN1YlVybCxhdmF0YXJVcmwpLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMydcXG59KTtcXG5sZXQgY2FuX3VwbG9hZF9hcGkgPSBnZXRBcGkoXFxcIm1hbkNhblVwbG9hZFxcXCIpK2lkO1xcbmlmKGdldFZhcignaG91c2UuaXNfbWFuYWdlcicpKXtcXG4gICAgbGV0IHRpcHMgPSBjYW5fdXBsb2FkPyfog70nOiflkKYnO1xcbiAgICAvLyBsb2coJ3RpcHM6Jyt0aXBzKTtcXG4gICAgLy8gbG9nKCdjYW5fdXBsb2FkOicrY2FuX3VwbG9hZCk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon4pqg6IO95ZCm5LiK5LygOicrKGdldFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnKXx8dGlwcyksXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICB1cmw6J2hpa2VyOi8vZW1wdHknXFxuICAgIH0pO1xcbiAgICBmdW5jdGlvbiBzZXRVcGxvYWQoZmxhZyxjYW5fdXBsb2FkX2FwaSkge1xcbiAgICAgICAgZmxhZyA9IGZsYWcgfHwgJyc7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2goY2FuX3VwbG9hZF9hcGksIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXCJVc2VyLUFnZW50XFxcIjogTU9CSUxFX1VBfSxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidXNlcm5hbWVcXFwiOiBnZXRWYXIoJ2hvdXNlLnVzZXJuYW1lJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGdldFZhcignaG91c2UucGFzc3dvcmQnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImNhbl91cGxvYWRcXFwiOiAhIWZsYWdcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBjb2RlID0gSlNPTi5wYXJzZShjb2RlKS5yZXN1bHQ7XFxuICAgICAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgZS5tZXNzYWdlXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifwn5qr56aB5q2i5LiK5LygJyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCfnpoHmraLor6XlvIDlj5HogIXkuIrkvKDop4TliJk/5L2g55qE5pON5L2c5bCG6KKr57O757uf6K6w5b2VJykuY29uZmlybSgoaWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRVcGxvYWQoZmFsc2UsY2FuX3VwbG9hZF9hcGkpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICBwdXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJywn5ZCmJyk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGlkLGNhbl91cGxvYWRfYXBpLHNldFVwbG9hZClcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon4pyF5YWB6K645LiK5LygJyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCflhYHorrjor6XlvIDlj5HogIXkuIrkvKDop4TliJk/5L2g55qE5pON5L2c5bCG6KKr57O757uf6K6w5b2VJykuY29uZmlybSgoaWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRVcGxvYWQodHJ1ZSxjYW5fdXBsb2FkX2FwaSk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHB1dFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnLCfmmK8nKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0saWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKVxcbiAgICB9KTtcXG59XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCI8c21hbGw+5o+Q56S677ya5byA5Y+R6ICF5Y2V54us5YiG5Lqr55qE5ZCI6ZuG5paH5Lu25Y+q6IO95Y2V54us5a+85YWl44CCPC9zbWFsbD5cXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxiaWc+6KeE5YiZ5YiX6KGoPC9iaWc+Jm5ic3A7Jm5ic3A7PHNtYWxsPijlhbFcXFwiICsgcnVsZUxpc3QubGVuZ3RoICsgXFxcIuadoSk8L3NtYWxsPlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmxldCBkYXRhVHlwZUxpc3QgPSB7XFxuICAgIFxcXCJcXFwiOlxcXCLlhajpg6hcXFwiLFxcbiAgICBcXFwiaG9tZV9ydWxlX3VybFxcXCI6ICflsI/nqIvluo8nLFxcbiAgICAvL1xcXCJwdWJsaXNoXFxcIjogJ+aPkOS6pOS6keS7k+W6k+inhOWImScsXFxuICAgIFxcXCJqc191cmxcXFwiOiAn572R6aG15o+S5Lu2JyxcXG4gICAgXFxcImh0bWxcXFwiOiAn6Z2Z5oCB6aG16Z2iJyxcXG4gICAgXFxcImNvbmZpZ1xcXCI6ICfkuLvpopgnXFxufTtcXG5mb3IobGV0IGtleSBpbiBkYXRhVHlwZUxpc3Qpe1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ZGF0YVR5cGU9PT1rZXk/XFxcIuKAnOKAnFxcXCIrZGF0YVR5cGVMaXN0W2tleV0rXFxcIuKAneKAnVxcXCI6ZGF0YVR5cGVMaXN0W2tleV0sXFxuICAgICAgICB1cmw6JChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoa2V5KT0+e1xcbiAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLnR5cGVcXFwiLGtleSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LGtleSksXFxuICAgICAgICBjb2xfdHlwZTpcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgfSk7XFxufVxcbmlmIChydWxlTGlzdC5sZW5ndGggPiAyMCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmkJzntKJcXFwiLFxcbiAgICAgICAgdXJsOiAkLnRvU3RyaW5nKG5hbWUgPT4gXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcIiArIGlucHV0ICsgXFxcIiZydWxlPVxcXCIgKyBuYW1lLCBNWV9SVUxFLnRpdGxlKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICAgICAgZGVzYzogXFxcIuaQnOe0ouW9k+WJjeW8gOWPkeiAheeahOinhOWImVxcXCJcXG4gICAgfSk7XFxufVxcbmxldCBob21lTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuaG9tZSkpO1xcbmxldCBtUnVsZUxpc3QgPSBbXTtcXG5mb3IgKHZhciBpdGVtIG9mIHJ1bGVMaXN0KSB7XFxuICAgIHZhciBuYW1lID0gaXRlbS5uYW1lO1xcbiAgICBpZiAoaXRlbS5pc190YXApIHtcXG4gICAgICAgIGxldCBsb2NhdGlvbiA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcInJ1bGVMaXN0SnNvblxcXCIpICsgXFxcIj9pZD1cXFwiICsgaXRlbS5pZCkpO1xcbiAgICAgICAgaXRlbS5pZCA9IGxvY2F0aW9uLmlkO1xcbiAgICAgICAgaXRlbS5uYW1lID0gbG9jYXRpb24ubmFtZTtcXG4gICAgICAgIGl0ZW0uYXV0aG9yID0gbG9jYXRpb24uYXV0aG9yO1xcbiAgICAgICAgaXRlbS5kYXRhX3R5cGUgPSBsb2NhdGlvbi5kYXRhX3R5cGU7XFxuICAgICAgICBpdGVtLnZlciA9IGxvY2F0aW9uLnZlclxcbiAgICB9XFxuICAgIGl0ZW0udmVyc2lvbiA9IGl0ZW0udmVyO1xcbiAgICBsZXQgbGFiZWwgPSBcXFwiXFxcIixcXG4gICAgICAgIGx2ZXIgPSAtMjtcXG4gICAgaWYgKGl0ZW0uaXNfanNvbiAmJiBpdGVtLmRhdGFfdHlwZSA9PT0gXFxcImhvbWVfcnVsZV91cmxcXFwiKSB7XFxuICAgICAgICBsdmVyID0gbG9jYWxSdWxlVmVyKGhvbWVMaXN0LCBpdGVtKTtcXG4gICAgICAgIGlmIChsdmVyID09PSAtMSkge1xcbiAgICAgICAgICAgIGxhYmVsID0gXFxcIvCfhpVcXFwiO1xcbiAgICAgICAgfSBlbHNlIGlmIChsdmVyIDwgaXRlbS52ZXIpIHtcXG4gICAgICAgICAgICBsYWJlbCA9IFxcXCLwn4aZXFxcIjtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBtUnVsZUxpc3QucHVzaCh7XFxuICAgICAgICB0aXRsZTogbGFiZWwgKyBuYW1lLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVEZXRhaWwjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbHZlcjogbHZlcixcXG4gICAgICAgICAgICBpZDogaXRlbS5pZFxcbiAgICAgICAgfSxcXG4gICAgICAgIHBpY191cmw6IGl0ZW0ucGljLFxcbiAgICB9KTtcXG59XFxuLyog5b2S5bm25o6S5bqPIFN0YXJ0ICovXFxubVJ1bGVMaXN0ID0gbWVyZ2VTb3J0KG1SdWxlTGlzdCk7XFxuLyog5b2S5bm25o6S5bqPIEVuZCAqL1xcbmRhdGEucHVzaC5hcHBseShkYXRhLCBtUnVsZUxpc3QpXFxuc2V0UmVzdWx0KGRhdGEpO1xcblwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeE5YiZ6K+m57uGLXVzZXJcIixcInBhdGhcIjpcInJ1bGVEZXRhaWxcIixcInJ1bGVcIjpcImpzOlxcbiAgICBjb25zdCB7XFxuICAgICAgICBnZXRBcGksXFxuICAgICAgICBjb2xvcixcXG4gICAgICAgIHNtYWxsLFxcbiAgICAgICAgaHRtbFRhZyxcXG4gICAgICAgIGFwaSxcXG4gICAgICAgIG1kXFxuICAgIH0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQge1xcbiAgICBpZCxcXG4gICAgbHZlcixcXG4gICAgaXNBbGxcXG59ID0gTVlfUEFSQU1TO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoaXNBbGwpID0+IHtcXG4gICAgaWYoIWlzQWxsKXtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgfVxcbn0saXNBbGwpKTtcXG5sZXQgZGF0YUl0ZW0gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJnZXRieWlkXFxcIikgKyBcXFwiP2lkPVxcXCIgKyBpZCkpLnJlc3VsdDtcXG5zZXRQYWdlVGl0bGUoXFxcIuOAjFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcIuOAjVxcXCIpXFxubGV0IHJ1bGVMaXN0SnNvbiA9IGdldEFwaShcXFwicnVsZUxpc3RKc29uXFxcIikgKyBcXFwiP2lkPVxcXCI7XFxubGV0IGRhdGEgPSBbXTtcXG52YXIgaGFzU3ViID0gZmFsc2U7XFxuXFxuaWYgKGRhdGFJdGVtLmlzX2pzb25fbGlzdCkge1xcbiAgICBoYXNTdWIgPSBoYXNIb21lU3ViKHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKTtcXG59IGVsc2UgaWYgKCFkYXRhSXRlbS5pc19qc29uX2xpc3QgJiYgZGF0YUl0ZW0uZGF0YV90eXBlID09ICdob21lX3J1bGVfdXJsJykge1xcbiAgICBoYXNTdWIgPSBoYXNIb21lU3ViKHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgJyZkZWJ1Zz10cnVlJyk7XFxufVxcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi54mI5pysXFxcIiksXFxuICAgIGRlc2M6IFxcXCLigJzigJzigJ3igJ3lvIDlj5HogIXvvJpcXFwiICsgY29sb3IoZGF0YUl0ZW0uYXV0aG9yLCBcXFwiIzIyOEJFNlxcXCIpICsgXFxcIlxcXFxu5LqR56uv54mI5pys77yaXFxcIiArIGNvbG9yKGRhdGFJdGVtLnZlciwgXFxcIiM1Y2ZmMmNcXFwiKSArIFxcXCJcXFxcdFxcXFx05pys5Zyw54mI5pys77yaXFxcIiArIGNvbG9yKGx2ZXIsIFxcXCIjNWNmZjJjXFxcIikgKyBcXFwiXFxcXG7mm7TmlrDkuo46IFtcXFwiICsgY29sb3IoZGF0YUl0ZW0ubGFzdF91cGRhdGUsIFxcXCIjZmY3MDAwXFxcIikgKyBcXFwiXVxcXCIsXFxuICAgIHVybDogJChcXFwiPOW8gOWPkeiAhT5cXFxcblxcXCIgKyBkYXRhSXRlbS5hdXRob3IgKyBcXFwiXFxcXG485ZCN56ewPlxcXFxuXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwiXFxcXG485LqR56uv54mI5pysPlxcXFxuXFxcIiArIGRhdGFJdGVtLnZlciArIFxcXCJcXFxcbjzmnKzlnLDniYjmnKw+XFxcXG5cXFwiICsgbHZlciArIFxcXCJcXFxcbjzmm7TmlrDml7bpl7Q+XFxcXG5bXFxcIiArIGRhdGFJdGVtLmxhc3RfdXBkYXRlICsgXFxcIl1cXFwiKS5jb25maXJtKCgpID0+IHt9KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnXFxufSk7XFxubGV0IGRhdGFUeXBlID0ge1xcbiAgICBob21lX3J1bGVfdXJsOiAn6aaW6aG15LqR6KeE5YiZJyxcXG4gICAgcHVibGlzaDogJ+aPkOS6pOS6keS7k+W6k+inhOWImScsXFxuICAgIGpzX3VybDogJ+e9kemhteaPkuS7tuinhOWImScsXFxuICAgIGh0bWw6ICfpnZnmgIHpobXpnaInLFxcbiAgICBjb25maWc6ICfkuLvpobXphY3nva4nXFxufTtcXG5cXG5sZXQgYmFzaWMgPSB7XFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59O1xcbmxldCBkYXRhVHlwZVRpcHMgPSBkYXRhVHlwZVtkYXRhSXRlbS5kYXRhX3R5cGVdIHx8ICfmnKrnn6Xop4TliJnvvJonICsgZGF0YUl0ZW0uZGF0YV90eXBlO1xcblxcbmxldCBzYWZlX3RpcD1kYXRhSXRlbS5pc19zYWZlP1xcXCLlronlhahcXFwiOlxcXCLljbHpmalcXFwiO1xcbmxldCBnb29kX3RpcCA9IGRhdGFJdGVtLmlzX2dvb2Q/c21hbGwoY29sb3IoXFxcIuOAkOS8mOi0qOinhOWImeOAkVxcXCIsJyNmZjcwMDAnKSk6XFxcIlxcXCI7XFxubGV0IG5vdF9zYWZlX25vdGU9ZGF0YUl0ZW0ubm90X3NhZmVfbm90ZTtcXG5iYXNpYy50aXRsZSA9IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLnsbvlnotcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoXFxcIihpZDpcXFwiICsgZGF0YUl0ZW0uaWQgKyBcXFwiKVxcXCIpK1xcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoXFxcIijpo47pmanmo4DmtYs6XFxcIiArc2FmZV90aXArXFxcIilcXFwiKStnb29kX3RpcDtcXG5iYXNpYy5kZXNjID0gXFxcIuaVsOaNruexu+Wei++8mlxcXCIgKyBjb2xvcihkYXRhVHlwZVRpcHMsIFxcXCIjY2I1NGZmXFxcIikgKyBcXFwiXFxcXG7liIbkuqvnirbmgIHkuLrvvJpcXFwiICsgZGF0YUl0ZW0uc3RhdGU7XFxuaWYgKFtcXFwiaHRtbFxcXCIsIFxcXCJjb25maWdcXFwiLCBcXFwianNfdXJsXFxcIl0uaW5jbHVkZXMoZGF0YUl0ZW0uZGF0YV90eXBlKSkge1xcbiAgICBiYXNpYy5kZXNjICs9IFxcXCJcXFxcbuKAnOKAnOKAneKAnSA9PlxcXCIgKyBzbWFsbChcXFwi54K55q2k6aKE6KeIXFxcIik7XFxuICAgIGJhc2ljLnVybCA9IHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcbn1cXG5cXG5kYXRhLnB1c2goYmFzaWMpO1xcbmxldCBoYXNTdWJzID0gXFxcIlxcXCI7XFxuaWYgKGhhc1N1Yikge1xcbiAgICBoYXNTdWJzID0gXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwi5bey6K6i6ZiFXFxcIilcXG59XFxuXFxubGV0IG5vdGVzID0gcmVxdWVzdChnZXRBcGkoXFxcImdldF9ydWxlX25vdGVcXFwiKSArIGlkKTtcXG5ub3RlcyA9IEpTT04ucGFyc2Uobm90ZXMpLnJlc3VsdDtcXG5yZXF1aXJlKG1kKTtcXG5sZXQgbm90ZXNIdG1sPVxcXCJcXFwiXFxudHJ5e1xcbiAgICBub3Rlc0h0bWw9bWFya2VkLnBhcnNlKG5vdGVzKTtcXG59Y2F0Y2goZSl7fVxcblxcbmlmIChub3RlcyAhPT0gZmFsc2UpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi5aSH5rOoXFxcIikgKyBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKGh0bWxUYWcoXFxcInVcXFwiLCBcXFwi5p+l55yL5a6M5pW05YWs5ZGKID5cXFwiKSksXFxuICAgICAgICBkZXNjOiBub3RlcyxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdGV4dDogbm90ZXNIdG1sLFxcbiAgICAgICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWUsXFxuICAgICAgICAgICAgLy8gdHlwZTogXFxcImxvbmdfdGV4dFxcXCJcXG4gICAgICAgICAgICB0eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLmk43kvZxcXFwiKSArIGhhc1N1YnMsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwidG9hc3Q6Ly/kvaDmiY3mmK/mnIDluIXnmoTpgqPkuKrkurrvvIFcXFwiXFxufSk7XFxubGV0IGltcG9ydFVybCwgcnVsZUNvZGUsIHNoYXJlVXJsLCBiYWNrQ29kZSA9IFxcXCJcXFwiO1xcbmlmICghZGF0YUl0ZW0uaXNfanNvbikge1xcbiAgICBiYWNrQ29kZSA9IHJlcXVlc3QocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpO1xcbn1cXG5zd2l0Y2ggKGRhdGFJdGVtLmRhdGFfdHlwZSkge1xcbiAgICBjYXNlIFxcXCJob21lX3J1bGVfdXJsXFxcIjpcXG4gICAgICAgIHJ1bGVDb2RlID0gXFxcIua1t+mYlOinhueVjOmmlumhtemikemBk+inhOWImeOAkFxcXCIgKyBkYXRhSXRlbS5uYW1lICsgXFxcIuOAke+/pWhvbWVfcnVsZV91cmzvv6VcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxuICAgICAgICBpbXBvcnRVcmwgPSBcXFwicnVsZTovL1xcXCIgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpXFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAncHVibGlzaCc6XFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJonICsgZGF0YUl0ZW0ubmFtZSArICfvv6VwdWJsaXNo77+lJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ2pzX3VybCc6XFxuICAgICAgICBydWxlQ29kZSA9ICfmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJrnvZHpobXmj5Lku7bvv6Vqc191cmzvv6UnICsgZGF0YUl0ZW0ubmFtZSArICdAYmFzZTY0Oi8vJyArIGJhc2U2NEVuY29kZShiYWNrQ29kZSk7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgJ2h0bWwnOlxcbiAgICAgICAgbGV0IGZpbGVfdG1wID0gZGF0YUl0ZW0ubmFtZS5zcGxpdCgnLicpO1xcbiAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGVfdG1wLmxlbmd0aCA+IDEgPyBmaWxlX3RtcFtmaWxlX3RtcC5sZW5ndGggLSAxXSArIFxcXCIvXFxcIiArIGRhdGFJdGVtLm5hbWUgOiBkYXRhSXRlbS5uYW1lO1xcbiAgICAgICAgcnVsZUNvZGUgPSBcXFwi5rW36ZiU6KeG55WM5pys5Zyw5paH5Lu25YiG5Lqr77+lZmlsZV91cmzvv6VoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvXFxcIiArIGZpbGVfcGF0aCArIFxcXCJAXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrXFxuICAgIGNhc2UgXFxcImNvbmZpZ1xcXCI6XFxuICAgICAgICBpbXBvcnRVcmwgPSAkKCkucnVsZShwYXNzd29yZCA9PiB7XFxuICAgICAgICAgICAgZXZhbChmZXRjaChcXFwiaGlrZXI6Ly9hc3NldHMvaG9tZS5qc1xcXCIpKTtcXG4gICAgICAgICAgICBIaWtlckhvbWUubG9hZChcXFwiaW1wb3J0XFxcIiwgcGFzc3dvcmQpO1xcbiAgICAgICAgfSwgYmFja0NvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxufVxcbmxldCBteV9jb2xfdHlwZSA9IFxcXCJ0ZXh0XzJcXFwiO1xcbmlmIChpbXBvcnRVcmwpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5a+85YWl6KeE5YiZXFxcIixcXG4gICAgICAgIHVybDogZGF0YUl0ZW0uaXNfc2FmZT9pbXBvcnRVcmw6J3RvYXN0Oi8v6aOO6Zmp6KeE5YiZ56aB5q2i5a+85YWlISEhJyxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KTtcXG59XFxuaWYgKHJ1bGVDb2RlKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWIhuS6q+WPo+S7pFxcXCIsXFxuICAgICAgICB1cmw6IFxcXCJjb3B5Oi8vXFxcIiArIHJ1bGVDb2RlLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5cXG5pZiAoaW1wb3J0VXJsKSB7XFxuICAgIGlmIChkYXRhSXRlbS5pc19qc29uX2xpc3QgJiYgIWhhc1N1Yikge1xcbiAgICAgICAgbGV0IHN1Yl9ydWxlX2NvZGUgPSAn5rW36ZiU6KeG55WM5ZCI6ZuG6KeE5YiZ6K6i6ZiF77+laG9tZV9zdWLvv6UnICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJAQFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG4gICAgICAgIGxldCBzdWJfdXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHN1Yl9ydWxlX2NvZGUpO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogJ+iuoumYheWQiOmbhicsXFxuICAgICAgICAgICAgdXJsOiBzdWJfdXJsLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjZmY3MDAwXFxcIj7lr7zlhaXovbvlkIjpm4Y8L3NwYW4+JyxcXG4gICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZGF0YUl0ZW0sc3ViVXJsKT0+e1xcbiAgICAgICAgICAgICAgICBjb25zdCB7Z2VuUnVsZX09JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvZ2VuQXBpXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBpbXBvcnRfcnVsZT1nZW5SdWxlKGRhdGFJdGVtLm5hbWUrXFxcIi5cXFwiK2RhdGFJdGVtLmF1dGhvcixzdWJVcmwpO1xcbiAgICAgICAgICAgICAgICAvL2NvcHkoaW1wb3J0X3J1bGUpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZUNvZGU9cGFyc2VQYXN0ZShpbXBvcnRfcnVsZS5zcGxpdChcXFwiXFxcXG5cXFwiKVswXSk7XFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaW1wb3J0VXJsXFxuICAgICAgICAgICAgfSxkYXRhSXRlbSxydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCksXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCI8c21hbGw+5o+Q56S677ya5byA5Y+R6ICF5Y2V54us5YiG5Lqr55qE5ZCI6ZuG5paH5Lu25Y+q6IO95Y2V54us5a+85YWl44CCPC9zbWFsbD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH0gZWxzZSBpZiAoIWRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiAhaGFzU3ViICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PSAnaG9tZV9ydWxlX3VybCcpIHtcXG4gICAgICAgIGxldCBzdWJfcnVsZV9jb2RlID0gJ+a1t+mYlOinhueVjOWNleinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRhdGFJdGVtLm5hbWUgKyBcXFwiQEBcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyAnJmRlYnVnPXRydWUnO1xcbiAgICAgICAgbGV0IHN1Yl91cmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoc3ViX3J1bGVfY29kZSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn6K6i6ZiF6KeE5YiZJyxcXG4gICAgICAgICAgICB1cmw6IHN1Yl91cmwsXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgICAgICB9KVxcbiAgICB9XFxufVxcbmlmIChkYXRhSXRlbS5pc19qc29uICYmIGRhdGFJdGVtLmRhdGFfdHlwZSA9PT0gXFxcImhvbWVfcnVsZV91cmxcXFwiICYmICFkYXRhSXRlbS5pc19qc29uX2xpc3QpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn6L+b5YWl6aKR6YGTJyxcXG4gICAgICAgIHVybDogJCggLypcXFwiI25vTG9hZGluZyNcXFwiKi8gKS5sYXp5UnVsZSgobmFtZSxob21lKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGhvbWUpKTtcXG4gICAgICAgICAgICBsZXQgaGFzUnVsZSA9IHJ1bGVMaXN0LnNvbWUoaXRlbSA9PiBpdGVtLnRpdGxlID09PSBuYW1lKTtcXG4gICAgICAgICAgICBpZiAoaGFzUnVsZSkge1xcbiAgICAgICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaG9tZStcXFwic0BcXFwiICsgbmFtZTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pyq5a6J6KOFXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBkYXRhSXRlbS5uYW1lLGFwaS5ob21lKSxcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9KVxcbn1cXG5sZXQgbWFuX3J1bGVfc2FmZSA9IGdldEFwaShcXFwibWFuUnVsZVNhZmVcXFwiKStkYXRhSXRlbS5pZDtcXG5sZXQgbWFuX3J1bGVfZ29vZCA9IGdldEFwaShcXFwibWFuUnVsZUdvb2RcXFwiKStkYXRhSXRlbS5pZDtcXG4vLyBkYXRhSXRlbS5pc19zYWZlO1xcbmlmKGdldFZhcignaG91c2UuaXNfbWFuYWdlcicpKXtcXG4gICAgZnVuY3Rpb24gc2V0SXNTYWZlKGZsYWcsbWFuX3J1bGVfc2FmZSkge1xcbiAgICAgICAgZmxhZyA9IGZsYWcgfHwgJyc7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBjb2RlID0gZmV0Y2gobWFuX3J1bGVfc2FmZSwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcIlVzZXItQWdlbnRcXFwiOiBNT0JJTEVfVUF9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VybmFtZVxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiaXNfc2FmZVxcXCI6ICEhZmxhZ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBmdW5jdGlvbiBzZXRJc0dvb2QoZmxhZyxtYW5fcnVsZV9nb29kKSB7XFxuICAgICAgICBmbGFnID0gZmxhZyB8fCAnJztcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChtYW5fcnVsZV9nb29kLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFwiVXNlci1BZ2VudFxcXCI6IE1PQklMRV9VQX0sXFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInVzZXJuYW1lXFxcIjogZ2V0VmFyKCdob3VzZS51c2VybmFtZScpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBnZXRWYXIoJ2hvdXNlLnBhc3N3b3JkJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJpc19nb29kXFxcIjogISFmbGFnXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgY29kZSA9IEpTT04ucGFyc2UoY29kZSkucmVzdWx0O1xcbiAgICAgICAgICAgIGlmIChjb2RlLnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZS5kZXRhaWxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgY29kZS5kZXRhaWxcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGUubWVzc2FnZVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon8J+aq+mjjumZqScsXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li66aOO6ZmpP+mjjumZqeinhOWImeaXoOazleiiq+WvvOWFpScpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc1NhZmUoZmFsc2UsbWFuX3J1bGVfc2FmZSk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifinIXmraPluLgnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uuato+W4uD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9zYWZlLHNldElzU2FmZSk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNTYWZlKHRydWUsbWFuX3J1bGVfc2FmZSk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifimaXpnZ7kvJjotKgnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+agh+iusOivpeinhOWImeS4uumdnuS8mOi0qD8nKS5jb25maXJtKChpZCxtYW5fcnVsZV9nb29kLHNldElzR29vZCk9PntcXG4gICAgICAgICAgICBsZXQgcmV0ID0gc2V0SXNHb29kKGZhbHNlLG1hbl9ydWxlX2dvb2QpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9nb29kLHNldElzR29vZClcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTon8J+SluS8mOi0qCcsXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li65LyY6LSoPycpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc0dvb2QodHJ1ZSxtYW5fcnVsZV9nb29kKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpXFxuICAgIH0pO1xcbn1cXG5cXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmdvb2RfbnVtLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i1ni5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWVcXG4gICAgfVxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBkYXRhSXRlbS5iYWRfbnVtLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+i4qS5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWUsXFxuICAgICAgICBkZWZhdWx0VHlwZTpcXFwiYmFkXFxcIlxcbiAgICB9XFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLor4TorrpcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9maWxlcy9pY29uL+ivhOiuui5zdmdcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfM1xcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9NYWtlQWNvbW1lbnQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIG5hbWU6IGRhdGFJdGVtLm5hbWVcXG4gICAgfVxcbn0pO1xcbmxldCB0b3RhbFN1bSA9IGRhdGFJdGVtLmdvb2RfbnVtICsgZGF0YUl0ZW0uYmFkX251bTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuivhOiuuihcXFwiICsgdG90YWxTdW0gKyBcXFwiKVxcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXCJ1XFxcIiwgXFxcIuafpeeci+WFqOmDqOivhOiuuiA+XFxcIikpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9Db21tZW50XFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vZW1wdHkjZnlwYWdlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICBpZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICB0b3RhbFN1bTogdG90YWxTdW0sXFxuICAgICAgICBub19hY3RpdmU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG4vL2NvbnN0IGxvbmdlc3RTdW09MTIwO1xcbmxldCBpY29uID0ge1xcbiAgICBcXFwiZ29vZFxcXCI6IFxcXCLwn5GNXFxcIixcXG4gICAgXFxcImJhZFxcXCI6IFxcXCLwn5GOXFxcIixcXG4gICAgXFxcInJlcGx5XFxcIjpcXFwi5byA5Y+R6ICF8J+Xo1xcXCJcXG59XFxuaWYgKHRvdGFsU3VtID09PSAwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuS4gOadoeivhOiuuuS5n+ayoeacie+8jOW/q+adpeaKouaymeWPkeWQp++8gTwvaDU+XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9KTtcXG59IGVsc2Uge1xcbiAgICBsZXQgY29tbWVudExpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmRpc19nZXQgKyBkYXRhSXRlbS5pZCArIFxcXCI/bGltaXQ9NVxcXCIpKS5yZXN1bHQ7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXG4gICAgICAgIGxldCBSZXBseSA9IGl0ZW0uZGlzY3Vzc190eXBlPT09XFxcInJlcGx5XFxcIiYmaXRlbS5yZXBseV90b19uYW1lIT09ZmFsc2UmJml0ZW0ucmVwbHlfdG9faWQhPT1mYWxzZT9cXFwi4oCY4oCY5Zue5aSNQFxcXCIraXRlbS5yZXBseV90b19uYW1lK1xcXCIgI1xcXCIraXRlbS5kaXNjdXNzX2lkK1xcXCLigJnigJlcXFxcblxcXCI6XFxcIlxcXCI7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLm5hbWUgKyBcXFwiJm5ic3A7Jm5ic3A7PGZvbnQgY29sb3I9J2dyYXknPjxzbWFsbD4jXFxcIiArIGl0ZW0uaWQgKyBcXFwiPC9zbWFsbD48Zm9udD5cXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgICAgICAvL3VybDogXFxcInRvYXN0Oi8vXFxcIiArIGl0ZW0ucXEsXFxuICAgICAgICAgICAgdXJsOlxcXCJtcXF3cGE6Ly9pbS9jaGF0P2NoYXRfdHlwZT13cGEmdWluPVxcXCIraXRlbS5xcSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5kaXNjdXNzX3RleHQsXFxuICAgICAgICAgICAgZGVzYzogUmVwbHkraXRlbS5jcmVhdGVfZGF0ZSArIFxcXCLCt1xcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgbmFtZTppdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHR5cGU6XFxcImxvbmdfdGV4dFxcXCIsXFxuICAgICAgICAgICAgICAgIHRleHQ6aXRlbS5kaXNjdXNzX3RleHRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxufVxcblxcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcInJpY2hfdGV4dFwiLFwibmFtZVwiOlwi5p+l55yLXCIsXCJwYXRoXCI6XCJpbmZvXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuafpeeci+OAjFxcXCIrTVlfUEFSQU1TLm5hbWUrXFxcIuOAjVxcXCIpXFxuc2V0UmVzdWx0KFt7XFxuICAgIHRpdGxlOiBNWV9QQVJBTVMudGV4dCxcXG4gICAgY29sX3R5cGU6TVlfUEFSQU1TLnR5cGVcXG59XSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlvIDlj5HogIXms6jlhoxcIixcInBhdGhcIjpcIlJlZ2lzdGVyXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuW8gOWPkeiAheazqOWGjFxcXCIpO1xcbmNvbnN0IHtcXG4gICAgZ2V0QXBpLFxcbiAgICBodG1sVGFnLFxcbiAgICBtYXBDb2xUeXBlLFxcbiAgICBzbWFsbFxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG52YXIgZGF0YSA9IFtdO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuUGFzc3dvcmRcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5Vc2VybmFtZVxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLkRlc2NyaXB0aW9uXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuVXNlckFkZHJlc3NcXFwiKTtcXG59KSk7XFxuYWRkTGlzdGVuZXIoJ29uUmVmcmVzaCcsICQudG9TdHJpbmcoKCk9PntcXG4gICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuV2FpdFxcXCIsIFxcXCJcXFwiKTtcXG59KSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfotKblj7cnLFxcbiAgICBkZXNjOiBcXFwi6K+36L6T5YWl6LSm5Y+3KOW/heWhqylcXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuVXNlcm5hbWUnLCAnJyksXFxuICAgICAgICB0eXBlOiBcXFwibnVtYmVyXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UuVXNlcm5hbWVcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0sIHtcXG4gICAgdGl0bGU6ICflr4bnoIEnLFxcbiAgICBkZXNjOiBcXFwi6K+36L6T5YWl5a+G56CBKOW/heWhqylcXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuUGFzc3dvcmQnLCAnJyksXFxuICAgICAgICB0eXBlOiBcXFwicGFzc3dvcmRcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5QYXNzd29yZFxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxubWFwQ29sVHlwZShkYXRhLCBcXFwibGluZV9ibGFua1xcXCIsIDEpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAn5pi156ewJyxcXG4gICAgZGVzYzogXFxcIuivt+i+k+WFpeaYteensCjlv4XloaspXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLlVzZXJBZGRyZXNzJywgJycpLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5Vc2VyQWRkcmVzc1xcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSwge1xcbiAgICB0aXRsZTogJ+aPj+i/sCcsXFxuICAgIGRlc2M6IFxcXCLor7Tor7TkuLrku4DkuYjopoHms6jlhozlkKdcXFxcbijlj6/ku6Xlop7liqDpgJrov4fmpoLnjocs6YCJ5aGrKVxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5EZXNjcmlwdGlvbicsICcnKSxcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLkRlc2NyaXB0aW9uXFxcIixpbnB1dCknXFxuICAgIH1cXG59KVxcblxcbm1hcENvbFR5cGUoZGF0YSwgXFxcImxpbmVfYmxhbmtcXFwiLCAxKTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYlxcXCIsIFxcXCLms6jlhoxcXFwiKSxcXG4gICAgdXJsOiAkKGdldEFwaShcXFwibmV3X2RldlxcXCIpK1xcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChnZXRJZCwgY29uZmlybSkgPT4ge1xcbiAgICAgICAgbGV0IHVzZXJuYW1lID0gZ2V0VmFyKCdXYXJlaG91c2UuVXNlcm5hbWUnLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRWYXIoJ1dhcmVob3VzZS5QYXNzd29yZCcsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGdldFZhcignV2FyZWhvdXNlLkRlc2NyaXB0aW9uJywgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIG5hbWUgPSBnZXRWYXIoXFxcIldhcmVob3VzZS5Vc2VyQWRkcmVzc1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmIChbdXNlcm5hbWUsIHBhc3N3b3JkLCBuYW1lXS5pbmNsdWRlcyhcXFwiXFxcIikpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6LSm5Y+3LOWvhueggeWSjOaYteensOS4jeiDveS4uuepulxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo5o+Q5Lqk55Sz6K+36KGoXFxcIik7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCwge1xcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInJlYXNvblxcXCI6IGRlc2NyaXB0aW9uLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiBuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogcGFzc3dvcmQsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicXFcXFwiOiB1c2VybmFtZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgbWV0aG9kOiAncG9zdCdcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBpZHJlc3VsdCA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRJZCArIFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lKSk7XFxuICAgICAgICBpZiAoaWRyZXN1bHQuc3RhdHVzICE9PSAwKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBpZHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICB9XFxuICAgICAgICBcXG4gICAgICAgIHJldHVybiAkKFxcXCJcXFwiLCBcXFwi6L6T5YWl6YKu566x6aqM6K+B56CBXFxcXG5cXFwiICsgcmVzdWx0LmRldGFpbCkuaW5wdXQoKGNvbmZpcm0sIGlkLCBhY2NvdW50KSA9PiB7XFxuICAgICAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuivt+iAkOW/g+etieW+hVxcXCIpO1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGNvbmZpcm0sIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJyZWdpc3RfaWRcXFwiOiBpZCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInl6bVxcXCI6IGlucHV0XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZVVzZXJuYW1lXFxcIiwgYWNjb3VudFswXSk7XFxuICAgICAgICAgICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZVBhc3N3b3JkXFxcIiwgYWNjb3VudFsxXSk7XFxuICAgICAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aIkOWKn+aPkOS6pOazqOWGjOazqOWGjFxcXFxuXFxcIityZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Ye66ZSZ5LqG5ZGQXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBjb25maXJtLCBpZHJlc3VsdC5yZXN1bHQsIFt1c2VybmFtZSwgcGFzc3dvcmRdKTtcXG4gICAgfSwgZ2V0QXBpKFxcXCJuZXdfZ2V0SWRcXFwiKSwgZ2V0QXBpKFxcXCJuZXdfY29uZmlybVxcXCIpKSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcInRleHRfMVwiLFwibmFtZVwiOlwi5Liq5Lq66LWE5paZXCIsXCJwYXRoXCI6XCJQZXJzb25hbERhdGFcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5Liq5Lq66LWE5paZXFxcIik7XFxudmFyIGRhdGE9W107XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGdldEZpbGUsXFxuICAgIGFwaVxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTpcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5cXG5sZXQge3VzZXJuYW1lLHBhc3N3b3JkfSA9IGdldEZpbGUoKTtcXG5sZXQgZGV2ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwidXNlclxcXCIpK01ZX1BBUkFNUy5pZCkpLnJlc3VsdDtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5aS05YOPXFxcIixcXG4gICAgZGVzYzpkZXYuYXZhdGFyLFxcbiAgICB1cmw6XFxcImhpa2VyOi8vcGFnZS9tb2RpZnlfUGVyc29uYWxEYXRhI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOntcXG4gICAgICAgIGRldjpkZXYsXFxuICAgICAgICB1c2VybmFtZTp1c2VybmFtZSxcXG4gICAgICAgIHBhc3N3b3JkOnBhc3N3b3JkLFxcbiAgICAgICAgUGF0dGVybjowXFxuICAgIH0sXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuXFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuaYteensFxcXCIsXFxuICAgIGRlc2M6ZGV2Lm5hbWUsXFxuICAgIHVybDpcXFwiaGlrZXI6Ly9wYWdlL21vZGlmeV9QZXJzb25hbERhdGEjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6e1xcbiAgICAgICAgZGV2OmRldixcXG4gICAgICAgIHVzZXJuYW1lOnVzZXJuYW1lLFxcbiAgICAgICAgcGFzc3dvcmQ6cGFzc3dvcmQsXFxuICAgICAgICBQYXR0ZXJuOjFcXG4gICAgfSxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5a+G56CBXFxcIixcXG4gICAgdXJsOlxcXCJoaWtlcjovL3BhZ2UvbW9kaWZ5X1BlcnNvbmFsRGF0YSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYTp7XFxuICAgICAgICBkZXY6ZGV2LFxcbiAgICAgICAgdXNlcm5hbWU6dXNlcm5hbWUsXFxuICAgICAgICBwYXNzd29yZDpwYXNzd29yZCxcXG4gICAgICAgIFBhdHRlcm46MlxcbiAgICB9LFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOlxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLotKblj7fvvJpcXFwiK3VzZXJuYW1lLFxcbiAgICB1cmw6XFxcImNvcHk6Ly9cXFwiK3VzZXJuYW1lLFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCJVSUTvvJpcXFwiK2Rldi5pZCxcXG4gICAgdXJsOlxcXCJjb3B5Oi8vXFxcIitkZXYuaWQsXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6XFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuaPkOS6pOS6keS7k+W6k+inhOWImVxcXCIsXFxuICAgIHVybDokKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChob3N0KT0+e1xcbiAgICAgICAgbGV0IGNvZGU9cmVxdWVzdChob3N0K1xcXCIvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0xNDVcXFwiKTtcXG4gICAgICAgIGxldCB3b3JkPVxcXCLvv6VwdWJsaXNo77+lXFxcIitiYXNlNjRFbmNvZGUoY29kZSk7XFxuICAgICAgICByZXR1cm4gXFxcInJ1bGU6Ly9cXFwiK2Jhc2U2NEVuY29kZSh3b3JkKTtcXG4gICAgfSxhcGkuaG9zdCksXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuWQjOatpeaPkOS6pOS6keS7k+W6k+i0puWPt+WvhueggVxcXCIsXFxuICAgIHVybDpcXFwicnVsZTovL1xcXCIrYmFzZTY0RW5jb2RlKFxcXCLvv6VwdWJsaXNoX2FjY291bnTvv6VcXFwiK3VzZXJuYW1lK1xcXCJAXFxcIitwYXNzd29yZCksXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6XFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuS9oOS4gOWFseWPkeW4g+S6huOAjFxcXCIrZGV2LnJ1bGVfbnVtK1xcXCLjgI3mnaHop4TliJlcXFwiLFxcbiAgICB1cmw6XFxcImhpa2VyOi8vZW1wdHlcXFwiLFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOlxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmxldCB1c2VyID0gZ2V0RmlsZSgpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLms6jplIDnmbvlvZVcXFwiLFxcbiAgICB1cmw6JChcXFwi56Gu6K6k5rOo6ZSA55m75b2VP1xcXCIpLmNvbmZpcm0oZiA9PiB7XFxuICAgICAgICBmLnVzZXJuYW1lPVxcXCJcXFwiO1xcbiAgICAgICAgZi5wYXNzd29yZD1cXFwiXFxcIjtcXG4gICAgICAgIHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb24nLCBKU09OLnN0cmluZ2lmeShmKSk7XFxuICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIixcXFwiMVxcXCIpO1xcbiAgICAgICAgYmFjaygpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suazqOmUgFxcXCI7XFxuICAgIH0sdXNlciksXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0X2NlbnRlcl8xXFxcIlxcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuabtOaUueS4quS6uui1hOaWmVwiLFwicGF0aFwiOlwibW9kaWZ5X1BlcnNvbmFsRGF0YVwiLFwicnVsZVwiOlwianM6XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGNvbG9yLFxcbiAgICBzbWFsbCxcXG4gICAgZ2V0RmlsZSxcXG4gICAgaHRtbFRhZ1xcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQge1xcbiAgICBkZXYsXFxuICAgIHVzZXJuYW1lLFxcbiAgICBwYXNzd29yZCxcXG4gICAgUGF0dGVyblxcbn0gPSBNWV9QQVJBTVM7XFxudmFyIGRhdGEgPSBbXTtcXG5sZXQgcGF0aCA9IFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQ7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5tLnBldE5hbWVcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5tLmF2YXRhclxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQuY1xcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQueFxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQueVxcXCIpO1xcbn0pKTtcXG5mdW5jdGlvbiBtX3BldE5hbWUoKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICBkZXNjOiBcXFwi6K+36L6T5YWl5paw5pi156ewXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0ucGV0TmFtZScsICcnKXx8ZGV2Lm5hbWUsXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5tLnBldE5hbWVcXFwiLGlucHV0KSdcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLkv53lrZhcXFwiLFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFwibW9kaWZ5X25hbWVcXFwiKSArIHBhdGgpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBsZXQgbmV3UGV0TmFtZSA9IGdldFZhcignV2FyZWhvdXNlLm0ucGV0TmFtZScsICcnKTtcXG4gICAgICAgICAgICBpZiAobmV3UGV0TmFtZSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5aGr5ZWKIVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0ICsgXFxcIiZuYW1lPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQobmV3UGV0TmFtZSkpO1xcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgfSk7XFxufVxcblxcbmZ1bmN0aW9uIG1fYXZhdGFyKCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICAgICAgZGVzYzogXFxcIuivt+i+k+WFpeaWsOeahOWktOWDj+mTvuaOpVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLmF2YXRhcicsICcnKSB8fCBkZXYuYXZhdGFyLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UubS5hdmF0YXJcXFwiLGlucHV0KSdcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLkv53lrZhcXFwiLFxcbiAgICAgICAgdXJsOiAkKGdldEFwaShcXFwibW9kaWZ5X2F2YVxcXCIpICsgcGF0aCkubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBuZXdBdmF0YXIgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLmF2YXRhcicsICcnKTtcXG4gICAgICAgICAgICBcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCArIFxcXCImYXZhdGFyX3VybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KG5ld0F2YXRhcikpO1xcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgfSk7XFxufVxcblxcbmZ1bmN0aW9uIG1fcHdkKCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOlxcXCLljp/lr4bnoIFcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICBkZXNjOiBcXFwi6K+36L6T5YWl5Y6f5a+G56CBXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdHlwZTpcXFwicGFzc3dvcmRcXFwiLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC55JywgJycpLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC55XFxcIixpbnB1dCknXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOlxcXCLmlrDlr4bnoIFcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICBkZXNjOiBcXFwi6K+36L6T5YWl5paw5a+G56CBXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdHlwZTpcXFwicGFzc3dvcmRcXFwiLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC54JywgJycpLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC54XFxcIixpbnB1dCknXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6XFxcIumHjeWkjeaWsOWvhueggVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgICAgIGRlc2M6IFxcXCLor7fph43lpI3mlrDlr4bnoIFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0eXBlOlxcXCJwYXNzd29yZFxcXCIsXFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQuYycsICcnKSxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLm0uUGFzc3dvcmQuY1xcXCIsaW5wdXQpJ1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXCJtb2RpZnlfcHdkXFxcIikrcGF0aCkubGF6eVJ1bGUoKHBhc3N3b3JkLHVzZXJuYW1lKSA9PiB7XFxuICAgICAgICAgICAgbGV0IG9sZF9wYXNzd29yZCA9IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQueScsICcnKTtcXG4gICAgICAgICAgICBsZXQgbmV3X3Bhc3N3b3JkID0gZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC54JywgJycpO1xcbiAgICAgICAgICAgIGxldCBuZXdfcGFzc3dvcmRfYWdhaW4gPSBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLmMnLCAnJyk7XFxuICAgICAgICAgICAgaWYgKG9sZF9wYXNzd29yZCE9PXBhc3N3b3JkKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/ljp/lr4bnoIHplJnor69cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZihuZXdfcGFzc3dvcmQ9PT1cXFwiXFxcIil7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/or7fovpPlhaXmlrDlr4bnoIFcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZihuZXdfcGFzc3dvcmQhPT1uZXdfcGFzc3dvcmRfYWdhaW4pe1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Lik5qyh5a+G56CB5LiN5ZCMXFxcIlxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCArIFxcXCImbmV3X3Bhc3N3b3JkPVxcXCIgKyBuZXdfcGFzc3dvcmQrXFxcIiZuZXdfcGFzc3dvcmRfcmU9XFxcIituZXdfcGFzc3dvcmRfYWdhaW4pO1xcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KTtcXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcIixKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICB1c2VybmFtZTp1c2VybmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkOm5ld19wYXNzd29yZFxcbiAgICAgICAgICAgICAgICB9KSk7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0scGFzc3dvcmQsdXNlcm5hbWUpLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbiAgICB9KTtcXG59XFxuXFxuc3dpdGNoIChQYXR0ZXJuKSB7XFxuICAgIGNhc2UgMDpcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFwi5L+u5pS55aS05YOPXFxcIik7XFxuICAgICAgICBtX2F2YXRhcigpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgMTpcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFwi5L+u5pS55pi156ewXFxcIik7XFxuICAgICAgICBtX3BldE5hbWUoKTtcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlIDI6XFxuICAgICAgICBzZXRQYWdlVGl0bGUoXFxcIuS/ruaUueWvhueggVxcXCIpO1xcbiAgICAgICAgbV9wd2QoKTtcXG4gICAgICAgIGJyZWFrO1xcbn1cXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnvJbovpHop4TliJnlpIfms6hcIixcInBhdGhcIjpcInNldF9ydWxlX25vdGVzXCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZGF0YSA9IFtdO1xcbmNvbnN0IHtcXG4gICAgZ2V0QXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGlkLFxcbiAgICB1c2VybmFtZSxcXG4gICAgcGFzc3dvcmQsXFxuICAgIG5hbWVcXG59ID0gTVlfUEFSQU1TO1xcbnNldFBhZ2VUaXRsZShcXFwi5aSH5rOo44CMXFxcIituYW1lK1xcXCLjgI1cXFwiKTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsXFxcImNsZWFyVmFyKCdXYXJlaG91c2UucnVsZS5ub3RlcycsICcnKVxcXCIpO1xcbmxldCBub3Rlcz1yZXF1ZXN0KGdldEFwaShcXFwiZ2V0X3J1bGVfbm90ZVxcXCIpK2lkKTtcXG5ub3Rlcz1KU09OLnBhcnNlKG5vdGVzKS5yZXN1bHQ7XFxuZGF0YS5wdXNoKHtcXG4gICAgZGVzYzogXFxcIuinhOWImeWkh+azqC4uLi4uLlxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UucnVsZS5ub3RlcycsICcnKXx8bm90ZXN8fFxcXCJcXFwiLFxcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDotMSxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UucnVsZS5ub3Rlc1xcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLkv53lrZhcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB1cmw6ICQoZ2V0QXBpKFxcXCJzZXRfcnVsZV9ub3RlXFxcIikgKyBpZCkubGF6eVJ1bGUoKHVzZXJuYW1lLCBwYXNzd29yZCkgPT4ge1xcbiAgICAgICAgbGV0IG5vdGVzID0gZ2V0VmFyKCdXYXJlaG91c2UucnVsZS5ub3RlcycsICcnKTtcXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicXFcXFwiOiB1c2VybmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IHBhc3N3b3JkLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIm5vdGVcXFwiOm5vdGVzXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICB9XFxuICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICB9LCB1c2VybmFtZSwgcGFzc3dvcmQpXFxufSk7XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwibGluZVwiLFwibmFtZVwiOlwi6K+E6K665YiX6KGoXCIsXCJwYXRoXCI6XCJDb21tZW50XCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuivhOiuuuWIl+ihqFxcXCIpO1xcbmNvbnN0IHtcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCBkYXRhID0gW107XFxubGV0IHtcXG4gICAgdG90YWxTdW0sXFxuICAgIGlkLFxcbiAgICBub19hY3RpdmUsXFxuICAgIHVzZXJuYW1lLFxcbiAgICBwYXNzd29yZFxcbn0gPSBNWV9QQVJBTVM7XFxubGV0IHBhZ2UgPSBwYXJzZUludChNWV9VUkwuc3BsaXQoXFxcIiNcXFwiKVsxXSk7XFxubGV0IGRpc2N1c3NfdHlwZSA9IGdldFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcIiwgXFxcIlxcXCIpO1xcbmlmIChwYWdlID09PSAxKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBhZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFwiLCBcXFwiXFxcIik7XFxuICAgIH0pKTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5YWo6YOoXFxcIiArIChkaXNjdXNzX3R5cGUgPT09IFxcXCJcXFwiID8gXFxcIuKXiVxcXCIgOiBcXFwi4peLXFxcIiksXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzQnXFxuXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLwn5GN6LWeXFxcIiArIChkaXNjdXNzX3R5cGUgPT09IFxcXCJnb29kXFxcIiA/IFxcXCLil4lcXFwiIDogXFxcIuKXi1xcXCIpLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXCIsIFxcXCJnb29kXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNCdcXG5cXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIvCfkY7ouKlcXFwiICsgKGRpc2N1c3NfdHlwZSA9PT0gXFxcImJhZFxcXCIgPyBcXFwi4peJXFxcIiA6IFxcXCLil4tcXFwiKSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFwiLCBcXFwiYmFkXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNCdcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWbnuWkjVxcXCIgKyAoZGlzY3Vzc190eXBlID09PSBcXFwicmVwbHlcXFwiID8gXFxcIuKXiVxcXCIgOiBcXFwi4peLXFxcIiksXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcIiwgXFxcInJlcGx5XFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNCdcXG4gICAgfSk7XFxufVxcblxcblxcbmxldCBpY29uID0ge1xcbiAgICBcXFwiZ29vZFxcXCI6IFxcXCLwn5GNXFxcIixcXG4gICAgXFxcImJhZFxcXCI6IFxcXCLwn5GOXFxcIixcXG4gICAgXFxcInJlcGx5XFxcIjpcXFwi5byA5Y+R6ICF8J+Xo1xcXCJcXG59XFxubGV0IGNvbnRyb2w9KHBpZCxhY3RpdmUpPT52b2lkIDA7XFxuaWYobm9fYWN0aXZlKXtcXG4gICAgY29udHJvbD1mdW5jdGlvbihwaWQsYWN0aXZlKXtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6YWN0aXZlP1xcXCLpmpDol4/or4TorrpcXFwiOlxcXCLlsZXnpLror4TorrpcXFwiLFxcbiAgICAgICAgICAgIHVybDokKGFwaS5kaXNfZGV2X2NvbnRyb2wrcGlkK1xcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQrXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdD1KU09OLnBhcnNlKHJlcXVlc3QoaW5wdXQpKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiK3Jlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgY29sX3R5cGU6XFxcInRleHRfMlxcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTpcXFwi5Yig6Zmk6K+E6K66XFxcIixcXG4gICAgICAgICAgICB1cmw6JChcXFwi56Gu6K6k5Yig6Zmk6K+l6K+E6K66P1xcXCIpLmNvbmZpcm0oKGlucHV0KT0+e1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0PUpTT04ucGFyc2UocmVxdWVzdChpbnB1dCkpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIrcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICB9LGFwaS5kaXNfZGV2X2NvbnRyb2wrcGlkK1xcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQrXFxcIiZkZWxldGU9MVxcXCIpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzJcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6XFxcImxpbmVcXFwiXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6XFxcImxpbmVcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5pZiAodG90YWxTdW0gPT09IDApIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5LiA5p2h6K+E6K665Lmf5rKh5pyJ77yM5b+r5p2l5oqi5rKZ5Y+R5ZCn77yBPC9oNT5cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn0gZWxzZSB7XFxuICAgIGxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldCArIGlkICsgXFxcIj9saW1pdD01JnBhZ2U9XFxcIiArIHBhZ2UgKyBcXFwiJm5vX2FjdGl2ZT1cXFwiICsgbm9fYWN0aXZlICsgXFxcIiZkaXNjdXNzX3R5cGU9XFxcIiArIGRpc2N1c3NfdHlwZSkpLnJlc3VsdDtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21tZW50TGlzdCkge1xcbiAgICAgICAgbGV0IFJlcGx5ID0gaXRlbS5kaXNjdXNzX3R5cGU9PT1cXFwicmVwbHlcXFwiJiZpdGVtLnJlcGx5X3RvX25hbWUhPT1mYWxzZSYmaXRlbS5yZXBseV90b19pZCE9PWZhbHNlP1xcXCLigJjigJjlm57lpI1AXFxcIitpdGVtLnJlcGx5X3RvX25hbWUrXFxcIiAjXFxcIitpdGVtLmRpc2N1c3NfaWQrXFxcIuKAmeKAmVxcXFxuXFxcIjpcXFwiXFxcIjtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFwiICsgaXRlbS5pZCArIFxcXCI8L3NtYWxsPjxmb250PlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgICAgIC8vdXJsOiBub19hY3RpdmU/XFxcImhpa2VyOi8vcGFnZS9SZXBseVxcXCI6XFxcInRvYXN0Oi8vXFxcIiArIGl0ZW0ucXEsXFxuXFx0XFx0ICAgICAgIHVybDpub19hY3RpdmU/XFxcImhpa2VyOi8vcGFnZS9SZXBseVxcXCI6XFxcIm1xcXdwYTovL2ltL2NoYXQ/Y2hhdF90eXBlPXdwYSZ1aW49XFxcIitpdGVtLnFxLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgcnVsZUlkOiBpZCxcXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXFxuICAgICAgICAgICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcXG4gICAgICAgICAgICAgICAgcmVwbHlJZDppdGVtLmlkXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5kaXNjdXNzX3RleHQsXFxuICAgICAgICAgICAgZGVzYzogUmVwbHkraXRlbS5jcmVhdGVfZGF0ZSArIFxcXCLCt1xcXCIgKyBpY29uW2l0ZW0uZGlzY3Vzc190eXBlXSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgbmFtZTppdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHR5cGU6XFxcImxvbmdfdGV4dFxcXCIsXFxuICAgICAgICAgICAgICAgIHRleHQ6aXRlbS5kaXNjdXNzX3RleHRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgICAgICBjb250cm9sKGl0ZW0uaWQsaXRlbS5hY3RpdmUpO1xcbiAgICB9XFxuICAgIGlmIChjb21tZW50TGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuXFxuc2V0UmVzdWx0KGRhdGEpXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlj5Hooajor4TorrpcIixcInBhdGhcIjpcIk1ha2VBY29tbWVudFwiLFwicnVsZVwiOlwianM6XFxubGV0IGRhdGEgPSBbXTtcXG5jb25zdCB7XFxuICAgIGFwaSxcXG4gICAgZ2V0RmlsZVxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQge1xcbiAgICBpZCxcXG4gICAgbmFtZSxcXG4gICAgZGVmYXVsdFR5cGVcXG59ID0gTVlfUEFSQU1TO1xcbmxldCB1c2VyPWdldEZpbGUoKS51c2VyfHxbXFxcIlxcXCIsXFxcIlxcXCJdO1xcblxcbnNldFBhZ2VUaXRsZShcXFwi6K+E6K66KFxcXCIgKyBuYW1lICsgXFxcIilcXFwiKTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudHlwZVxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQucXFcXFwiKTtcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbn0pKTtcXG5sZXQgdHlwZSA9IGdldFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudHlwZVxcXCIpIHx8IGRlZmF1bHRUeXBlfHxcXFwiZ29vZFxcXCI7XFxuZGF0YS5wdXNoKHtcXG4gICAgZGVzYzogXFxcIuivhOiuui4uLi4uLlxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuY29tbWVudC50ZXh0JywgJycpLFxcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDo3LFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnRleHRcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLotKblj7fvvJpcXFwiKyh1c2VyWzBdfHxcXFwiXFxcIiksXFxuICAgIGRlc2M6XFxcIumqjOivgeegge+8mlxcXCIrKHVzZXJbMV18fFxcXCJcXFwiKSxcXG4gICAgdXJsOlxcXCJoaWtlcjovL3BhZ2UvVXNlcnJlZ2lzdHJhdGlvblxcXCIsXFxuICAgIGNvbF90eXBlOiAndGV4dF8xJyxcXG4gICAgXFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICAodHlwZSA9PT0gXFxcImdvb2RcXFwiID8gXFxcIuKXiVxcXCIgOiBcXFwi4peLXFxcIikrXFxcIiDwn5GNXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudHlwZVxcXCIsIFxcXCJnb29kXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiAndGV4dF8yJ1xcblxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiAgKHR5cGUgPT09IFxcXCJiYWRcXFwiID8gXFxcIuKXiVxcXCIgOiBcXFwi4peLXFxcIikrXFxcIiDwn5GOXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudHlwZVxcXCIsIFxcXCJiYWRcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmj5DkuqRcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB1cmw6ICQoYXBpLmRpc19uZXcgKyBpZCkubGF6eVJ1bGUoKEFjY291bnQpID0+IHtcXG4gICAgICAgIGxldCB0ZXh0ID0gZ2V0VmFyKCdXYXJlaG91c2UuY29tbWVudC50ZXh0JywgJycpO1xcbiAgICAgICAgbGV0IFtxcSxhdXRoX2NvZGVdID0gQWNjb3VudDtcXG4gICAgICAgIGxldCB0eXBlID0gZ2V0VmFyKCdXYXJlaG91c2UuY29tbWVudC50eXBlJykgfHwgJ2dvb2QnO1xcbiAgICAgICAgcXE9cXF8fFxcXCJcXFwiO1xcbiAgICAgICAgYXV0aF9jb2RlPWF1dGhfY29kZXx8XFxcIlxcXCI7XFxuICAgICAgICBpZihxcT09XFxcIlxcXCJ8fGF1dGhfY29kZT09XFxcIlxcXCIpe1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrnmbvlvZXotKblj7dcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYodGV4dD09XFxcIlxcXCIpe1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHlhpnllYpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgZnVuY3Rpb24gcihwKSB7XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwKSxcXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBwID0ge1xcbiAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgIFxcXCJkaXNjdXNzX3RleHRcXFwiOiB0ZXh0LFxcbiAgICAgICAgICAgICAgICBcXFwicXFcXFwiOiBxcSxcXG4gICAgICAgICAgICAgICAgXFxcImRpc2N1c3NfdHlwZVxcXCI6IHR5cGUsXFxuICAgICAgICAgICAgICAgIFxcXCJhdXRoX2NvZGVcXFwiOiBhdXRoX2NvZGVcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcmVzdWx0ID0gcihwKTtcXG4gICAgICAgIGlmKHJlc3VsdC5zdGF0dXM9PT0wKXtcXG4gICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiK3Jlc3VsdC5kZXRhaWw7XFxuXFxuICAgIH0sdXNlcilcXG59KTtcXG5cXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLkvKrnlKjmiLfms6jlhoxcIixcInBhdGhcIjpcIlVzZXJyZWdpc3RyYXRpb25cIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IHtcXG4gICAgYXBpLFxcbiAgICBnZXRGaWxlLFxcbiAgICBnZXRVc2VyRGF0ZVxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQgZGF0YSA9IFtdO1xcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5zZXRQYWdlVGl0bGUoXFxcIueUqOaIt+WIl+ihqOeuoeeQhlxcXCIpO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UubS5xcVxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLm0ueXptXFxcIik7XFxufSkpO1xcbmxldCB1c2VyID0gZ2V0RmlsZSgpO1xcbmxldCB1c2VyTmFtZSA9IHVzZXIudXNlciB8fCBbXFxcIlxcXCJdO1xcbnVzZXJOYW1lID0gdXNlck5hbWVbMF07XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ08YmlnPijmt7vliqAv6aqM6K+BKei0puWPtzwvYmlnPlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuiOt+WPllxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBkZXNjOiBcXFwi6K+36L6T5YWlcXFcXFwiLFxcbiAgICB1cmw6ICQudG9TdHJpbmcoKGEsIGIpID0+IHtcXG4gICAgICAgIGxldCBxcSA9IGlucHV0O1xcbiAgICAgICAgaWYgKHFxID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S9oOi/mOS7gOS5iOmDveayoeWhq+WViiFcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuiOt+WPluS4rS4uLlxcXCIpXFxuICAgICAgICByZXR1cm4gJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgocXEsIGEsIGIpID0+IHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoYSwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInFxXFxcIjogcXFcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICBoaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdDIgPSBKU09OLnBhcnNlKHJlcXVlc3QoYiArIFxcXCI/cXE9XFxcIiArIHFxKSk7XFxuICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0Mi5kZXRhaWw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgdGhyb3cgZTtcXG4gICAgICAgIH1cXG4gICAgICAgIH0sIHFxLCBhLCBiKTtcXG5cXG4gICAgfSwgYXBpLmRpc19uZXdfdXNlciwgYXBpLmRpc192ZXJpZnkpLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdHlwZTogXFxcIm51bWJlclxcXCIsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0ucXEnLCAnJykgfHwgdXNlck5hbWUsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLm0ucXFcXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBkZXNjOiBcXFwi6K+36L6T5YWl6aqM6K+B56CBXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0ueXptJywgJycpLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5tLnl6bVxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6ICdyaWNoX3RleHQnLFxcbiAgICB0aXRsZTogXFxcIjxzbWFsbD7mj5DnpLrvvJoxLuavj+WkqeWPquiDveiOt+WPljXmrKHpqozor4HnoIEuPGJyPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzIuPHM+6aqM6K+B56CB5pyJ5pWI5pyf5oyB57ut5LiA5ZGo5bem5Y+zPC9zPijmmoLml7bkuI3kvJrvvIzlv5jorrDpqozor4HnoIHlj6/pgJrov4dRUeWPt+iOt+WPlik8L3NtYWxsPlxcXCJcXG59KTtcXG5cXG5sZXQgdXNlckxpc3QgPSBnZXRVc2VyRGF0ZSgpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6aqM6K+BL+eZu+W9lVxcXCIsXFxuICAgIHVybDogJChcXFwi56Gu5a6a5L+d5a2Y77yM6aqM6K+B56CB5aGr6ZSZ77yM5peg5rOV6K+E6K665ZOmXFxcIikuY29uZmlybSgoZiwgbCwgbG9naW4pID0+IHtcXG4gICAgICAgIGxldCBxcSA9IGdldFZhcignV2FyZWhvdXNlLm0ucXEnLCAnJyk7XFxuICAgICAgICBsZXQgeXptID0gZ2V0VmFyKCdXYXJlaG91c2UubS55em0nLCAnJyk7XFxuICAgICAgICBpZiAocXEgPT0gXFxcIlxcXCIgfHwgeXptID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL3Fx5oiW6aqM6K+B56CB5Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGxvZ2luLCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicXFcXFwiOiBxcSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJhdXRoX2NvZGVcXFwiOiB5em1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgIGYudXNlciA9IFtxcSwgeXptXTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoZikpO1xcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGwuZmluZEluZGV4KGl0ZW0gPT4gaXRlbVswXSA9PT0gcXEpO1xcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XFxuICAgICAgICAgICAgICAgIGwuc3BsaWNlKGluZGV4LCAxLCBbcXEsIHl6bV0pO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobC5sZW5ndGggPCA2KSB7XFxuICAgICAgICAgICAgICAgIGwucHVzaChbcXEsIHl6bV0pO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGwuc3BsaWNlKDAsIDEpO1xcbiAgICAgICAgICAgICAgICBsLnB1c2goW3FxLCB5em1dKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVJBLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShsKSk7XFxuICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/pqozor4HmiJDlip9cXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICB9LCB1c2VyLCB1c2VyTGlzdCwgYXBpLmRpc19sb2dpbiksXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ08YmlnPui0puWPt+WIl+ihqDwvYmlnPlxcXFx0XFxcXHRcXFxcdDxzbWFsbD4o5L+d55WZNeadoeiusOW9lSk8L3NtYWxsPlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59KTtcXG51c2VyTGlzdC5yZXZlcnNlKCk7XFxuXFxuZm9yIChsZXQgaXRlbSBvZiB1c2VyTGlzdCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLotKblj7fvvJpcXFwiICsgaXRlbVswXSArICh1c2VyTmFtZSA9PT0gaXRlbVswXSA/IFxcXCJcXFxcdFxcXFx0XFxcXHTigJzigJxb5b2T5YmN6LSm5Y+3XeKAneKAnVxcXCIgOiBcXFwiXFxcIiksXFxuICAgICAgICBkZXNjOiBcXFwi6aqM6K+B56CB77yaXFxcIiArIGl0ZW1bMV0sXFxuICAgICAgICB1cmw6ICQoXFxcIuaYr+WQpuWIh+aNouS4uuivpVtcXFwiICsgaXRlbVswXSArIFxcXCJd6LSm5Y+3XFxcIikuY29uZmlybSgoZiwgaXRlbSkgPT4ge1xcbiAgICAgICAgICAgIGYudXNlciA9IGl0ZW07XFxuICAgICAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGYpKTtcXG4gICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WIh+aNouaIkOWKn1xcXCI7XFxuICAgICAgICB9LCB1c2VyLCBpdGVtKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIlxcbiAgICB9KTtcXG59XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YCA5Ye66LSm5Y+3XFxcIixcXG4gICAgdXJsOiAkKFxcXCLnoa7orqTpgIDlh7rnmbvlvZXnirbmgIFcXFwiKS5jb25maXJtKChmKSA9PiB7XFxuICAgICAgICBmLnVzZXIgPSBbXTtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShmKSk7XFxuICAgICAgICBiYWNrKCk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6YCA5Ye65oiQ5YqfXFxcIjtcXG4gICAgfSwgdXNlciksXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG59KTtcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLliJfooajmjpLluo/nrpfms5VcIixcInBhdGhcIjpcInNvcnRcIixcInJ1bGVcIjpcImpzOlxcbi8qIOinhOWImeWIl+ihqOaOkuW6jyBbIFVQ44CBTkVX44CB5peg5pu05pawIF0g6aG65bqPICovXFxuLyog5b2S5bm25o6S5bqPIFN0YXJ0ICovXFxuZnVuY3Rpb24gbWVyZ2VTb3J0KGFycikge1xcbiAgICB2YXIgbGVuID0gYXJyLmxlbmd0aDtcXG4gICAgaWYgKGxlbiA8IDIpIHtcXG4gICAgICAgIHJldHVybiBhcnI7XFxuICAgIH1cXG4gICAgdmFyIG1pZGRsZSA9IE1hdGguZmxvb3IobGVuIC8gMiksXFxuICAgICAgICBsZWZ0ID0gYXJyLnNsaWNlKDAsIG1pZGRsZSksXFxuICAgICAgICByaWdodCA9IGFyci5zbGljZShtaWRkbGUpO1xcbiAgICByZXR1cm4gbWVyZ2UobWVyZ2VTb3J0KGxlZnQpLCBtZXJnZVNvcnQocmlnaHQpKTtcXG59XFxuZnVuY3Rpb24gbWVyZ2UobGVmdCwgcmlnaHQpIHtcXG4gICAgdmFyIHJlc3VsdCA9IFtdO1xcbiAgICB2YXIgaXNUaGlzVmVyc2lvbkxpc3QgPSBbXTtcXG5cXG4gICAgd2hpbGUgKGxlZnQubGVuZ3RoID4gMCAmJiByaWdodC5sZW5ndGggPiAwKSB7XFxuICAgICAgICBpZiAobGVmdFswXS50aXRsZS5pbmNsdWRlcyhcXFwi8J+GmVxcXCIpKSB7XFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gobGVmdC5zaGlmdCgpKTtcXG4gICAgICAgIH0gZWxzZSBpZiAocmlnaHRbMF0udGl0bGUuaW5jbHVkZXMoXFxcIvCfhplcXFwiKSkge1xcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpO1xcbiAgICAgICAgfSBlbHNlIGlmIChsZWZ0WzBdLnRpdGxlLmluY2x1ZGVzKFxcXCLwn4aVXFxcIikpIHtcXG4gICAgICAgICAgICByZXN1bHQucHVzaChsZWZ0LnNoaWZ0KCkpO1xcbiAgICAgICAgfSBlbHNlIGlmIChyaWdodFswXS50aXRsZS5pbmNsdWRlcyhcXFwi8J+GlVxcXCIpKSB7XFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGlzVGhpc1ZlcnNpb25MaXN0LnB1c2gobGVmdC5zaGlmdCgpKTtcXG4gICAgICAgICAgICBpc1RoaXNWZXJzaW9uTGlzdC5wdXNoKHJpZ2h0LnNoaWZ0KCkpO1xcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuICAgIHdoaWxlIChpc1RoaXNWZXJzaW9uTGlzdC5sZW5ndGgpIHJlc3VsdC5wdXNoKGlzVGhpc1ZlcnNpb25MaXN0LnNoaWZ0KCkpO1xcblxcbiAgICB3aGlsZSAobGVmdC5sZW5ndGgpXFxuICAgICAgICByZXN1bHQucHVzaChsZWZ0LnNoaWZ0KCkpO1xcblxcbiAgICB3aGlsZSAocmlnaHQubGVuZ3RoKVxcbiAgICAgICAgcmVzdWx0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxuXFxuICAgIHJldHVybiByZXN1bHQ7XFxufVxcbiQuZXhwb3J0cy5tZXJnZVNvcnQgPSBtZXJnZVNvcnQ7XFxuLyog5b2S5bm25o6S5bqPIEVuZCAqL1wifSx7XCJjb2xfdHlwZVwiOlwiaWNvbl8yX3JvdW5kXCIsXCJuYW1lXCI6XCLlhajpg6jlhazlvIDop4TliJlcIixcInBhdGhcIjpcIkFsbFB1YmxpY1J1bGVcIixcInJ1bGVcIjpcImpzOlxcbiAgICBjb25zdCB7XFxuICAgICAgICBhcGksXFxuICAgICAgICBsb2NhbFJ1bGVWZXIsXFxuICAgICAgICBnZXRBcGlcXG4gICAgfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmNvbnN0IHtcXG4gICAgbWVyZ2VTb3J0XFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3NvcnRcXFwiKTtcXG5sZXQgZGF0YVR5cGUgPSBnZXRWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIiwgXFxcIlxcXCIpO1xcbmxldCBvcmRlciA9IGdldFZhcihcXFwiV2FyZWhvdXNlLm9yZGVyXFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgc29ydCA9IGdldFZhcihcXFwiV2FyZWhvdXNlLnNvcnRcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCBnb29kID0gZ2V0VmFyKFxcXCJXYXJlaG91c2UuZ29vZFxcXCIsIFxcXCJcXFwiKTtcXG5sZXQgcGFnZSA9IE1ZX1VSTC5zcGxpdChcXFwiI1xcXCIpWzFdIHx8IDE7XFxubGV0IHJ1bGVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5hbGxfcnVsZSArIFxcXCI/ZGF0YV90eXBlPVxcXCIgKyBkYXRhVHlwZSArIFxcXCImcGFnZT1cXFwiICsgcGFnZSArIFxcXCImbGltaXQ9MjAmb3JkZXI9XFxcIiArIG9yZGVyICsgXFxcIiZzb3J0PVxcXCIgKyBzb3J0KyBcXFwiJmlzX2dvb2Q9XFxcIiArIGdvb2QpKS5yZXN1bHQ7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2Uub3JkZXJcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5zb3J0XFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuZ29vZFxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiKTtcXG59KSk7XFxubGV0IGRhdGEgPSBbXTtcXG5pZiAoZ2V0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgYmFjaygpO1xcbn1cXG5mdW5jdGlvbiB0YWIoYXJyLCB0eXBlLCBjb250cmFzdCkge1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGFycikge1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbVsxXSA9PT0gY29udHJhc3QgPyBcXFwi4oCc4oCcXFxcIiArIGl0ZW1bMF0gKyBcXFwi4oCd4oCdXFxcIiA6IGl0ZW1bMF0sXFxuICAgICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChrZXksIHR5cGUpID0+IHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKHR5cGUsIGtleSk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICB9LCBpdGVtWzFdLCB0eXBlKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInNjcm9sbF9idXR0b25cXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gICAgfSk7XFxufVxcbmlmIChwYWdlID09PSBcXFwiMVxcXCIpIHtcXG4gICAgdGFiKFtcXG4gICAgICAgIFtcXFwi5YWo6YOoXFxcIiwgXFxcIlxcXCJdLFxcbiAgICAgICAgW1xcXCLlsI/nqIvluo9cXFwiLCBcXFwiaG9tZV9ydWxlX3VybFxcXCJdLFxcbiAgICAgICAgW1xcXCLmj5DkuqTkupHku5PlupPop4TliJlcXFwiLCBcXFwicHVibGlzaFxcXCJdLFxcbiAgICAgICAgW1xcXCLnvZHpobXmj5Lku7ZcXFwiLCBcXFwianNfdXJsXFxcIl0sXFxuICAgICAgICBbXFxcIumdmeaAgemhtemdolxcXCIsIFxcXCJodG1sXFxcIl0sXFxuICAgICAgICBbXFxcIuS4u+mimFxcXCIsIFxcXCJjb25maWdcXFwiXVxcbiAgICBdLCBcXFwiV2FyZWhvdXNlLnR5cGVcXFwiLCBkYXRhVHlwZSk7XFxuICAgIHRhYihbXFxuICAgICAgICBbXFxcIuaXtumXtFxcXCIsIFxcXCIwXFxcIl0sXFxuICAgICAgICBbXFxcIklEXFxcIiwgXFxcIjFcXFwiXSxcXG4gICAgICAgIFtcXFwi5aW96K+E5bqmXFxcIiwgXFxcIjJcXFwiXSxcXG4gICAgICAgIFtcXFwi5beu6K+E5bqmXFxcIiwgXFxcIjNcXFwiXSxcXG4gICAgICAgIFtcXFwi5Zue5aSN5pWwXFxcIiwgXFxcIjRcXFwiXVxcbiAgICBdLCBcXFwiV2FyZWhvdXNlLm9yZGVyXFxcIiwgb3JkZXIpO1xcbiAgICB0YWIoW1xcbiAgICAgICAgW1xcXCLlgJLluo9cXFwiLCBcXFwiMFxcXCJdLFxcbiAgICAgICAgW1xcXCLmraPluo9cXFwiLCBcXFwiMVxcXCJdXFxuICAgIF0sIFxcXCJXYXJlaG91c2Uuc29ydFxcXCIsIHNvcnQpO1xcbiAgICB0YWIoW1xcbiAgICAgICAgW1xcXCLkuI3orrpcXFwiLCBcXFwiXFxcIl0sXFxuICAgICAgICBbXFxcIuS8mOi0qFxcXCIsIFxcXCIxXFxcIl1cXG4gICAgXSwgXFxcIldhcmVob3VzZS5nb29kXFxcIiwgZ29vZCk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcobmFtZSA9PiBcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFwiICsgaW5wdXQgKyBcXFwiJnJ1bGU9XFxcIiArIG5hbWUsIE1ZX1JVTEUudGl0bGUpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwi5pCc57Si5YWo6YOo6KeE5YiZXFxcIlxcbiAgICB9KTtcXG59XFxuXFxubGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5ob21lKSk7XFxubGV0IG1SdWxlTGlzdCA9IFtdO1xcbmZvciAodmFyIGl0ZW0gb2YgcnVsZUxpc3QpIHtcXG4gICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7XFxuICAgIGlmIChpdGVtLmlzX3RhcCkge1xcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZUxpc3RKc29uXFxcIikgKyBcXFwiP2lkPVxcXCIgKyBpdGVtLmlkKSk7XFxuICAgICAgICBpdGVtLmlkID0gbG9jYXRpb24uaWQ7XFxuICAgICAgICBpdGVtLm5hbWUgPSBsb2NhdGlvbi5uYW1lO1xcbiAgICAgICAgaXRlbS5hdXRob3IgPSBsb2NhdGlvbi5hdXRob3I7XFxuICAgICAgICBpdGVtLmRhdGFfdHlwZSA9IGxvY2F0aW9uLmRhdGFfdHlwZTtcXG4gICAgICAgIGl0ZW0udmVyID0gbG9jYXRpb24udmVyXFxuICAgIH1cXG4gICAgaXRlbS52ZXJzaW9uID0gaXRlbS52ZXI7XFxuICAgIGxldCBsYWJlbCA9IFxcXCJcXFwiLFxcbiAgICAgICAgbHZlciA9IC0yO1xcbiAgICBpZiAoaXRlbS5pc19qc29uICYmIGl0ZW0uZGF0YV90eXBlID09PSBcXFwiaG9tZV9ydWxlX3VybFxcXCIpIHtcXG4gICAgICAgIGx2ZXIgPSBsb2NhbFJ1bGVWZXIoaG9tZUxpc3QsIGl0ZW0pO1xcbiAgICAgICAgaWYgKGx2ZXIgPT09IC0xKSB7XFxuICAgICAgICAgICAgbGFiZWwgPSBcXFwi8J+GlVxcXCI7XFxuICAgICAgICB9IGVsc2UgaWYgKGx2ZXIgPCBpdGVtLnZlcikge1xcbiAgICAgICAgICAgIGxhYmVsID0gXFxcIvCfhplcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIG1SdWxlTGlzdC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBsYWJlbCArIG5hbWUsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBsdmVyOiBsdmVyLFxcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkLFxcbiAgICAgICAgICAgIGlzQWxsOnRydWVcXG4gICAgICAgIH0sXFxuICAgICAgICBwaWNfdXJsOiBpdGVtLnBpYyxcXG4gICAgfSlcXG59XFxuLyog5b2S5bm25o6S5bqPIFN0YXJ0ICovXFxuLy9tUnVsZUxpc3QgPSBtZXJnZVNvcnQobVJ1bGVMaXN0KTtcXG4vKiDlvZLlubbmjpLluo8gRW5kICovXFxuZGF0YS5wdXNoLmFwcGx5KGRhdGEsIG1SdWxlTGlzdClcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlm57lpI1cIixcInBhdGhcIjpcIlJlcGx5XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZGF0YSA9IFtdO1xcbmNvbnN0IHtcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIHJlcGx5SWQsXFxuICAgIHJ1bGVJZCxcXG4gICAgbmFtZSxcXG4gICAgcGFzc3dvcmQsXFxuICAgIHVzZXJuYW1lXFxufSA9IE1ZX1BBUkFNUztcXG5cXG5cXG5zZXRQYWdlVGl0bGUoXFxcIuWbnuWkjShcXFwiICsgbmFtZSArIFxcXCIpXFxcIik7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LnRleHRcXFwiKTtcXG4gICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbn0pKTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICBkZXNjOiBcXFwi5Zue5aSNLi4uLi4uXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyksXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OjcsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuXFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmj5DkuqRcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB1cmw6ICQoYXBpLmRpc19yZXBseSArIHJ1bGVJZCkubGF6eVJ1bGUoKHBhc3N3b3JkLCB1c2VybmFtZSwgcnVsZUlkKSA9PiB7XFxuICAgICAgICBsZXQgdGV4dCA9IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKTtcXG4gICAgICAgIGlmIChwYXNzd29yZCA9PSBcXFwiXFxcIiB8fCB1c2VybmFtZSA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrnmbvlvZXotKblj7dcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHRleHQgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5YaZ5ZWKXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwiZGlzY3Vzc190ZXh0XFxcIjogdGV4dCxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJxcVxcXCI6IHVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogcGFzc3dvcmQsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiZGlzY3Vzc19pZFxcXCI6IHJ1bGVJZFxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuXFxuICAgIH0sIHBhc3N3b3JkLCB1c2VybmFtZSwgcmVwbHlJZClcXG59KTtcXG5cXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmiJHnmoTlm57lpI1cIixcInBhdGhcIjpcIk15UmVwbHlcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IHtcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGF1dGhfY29kZSxcXG4gICAgcXFcXG59ID0gTVlfUEFSQU1TO1xcbmxldCBwYWdlID0gcGFyc2VJbnQoTVlfVVJMLnNwbGl0KFxcXCIjXFxcIilbMV0pO1xcbmxldCBkYXRhPVtdO1xcbmxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldF9yZXBseSArIFxcXCI/bGltaXQ9NSZwYWdlPVxcXCIgKyBwYWdlICsgXFxcIiZxcT1cXFwiICsgcXEgKyBcXFwiJmF1dGhfY29kZT1cXFwiICsgYXV0aF9jb2RlKSkucmVzdWx0O1xcbmlmIChjb21tZW50TGlzdC5sZW5ndGggPT09IDApIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5Yir5ouJ5LqG5LiA5p2h5Lmf5LiN5Ymp5LqGPC9oNT5cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn0gZWxzZSB7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgY29tbWVudExpc3QpIHtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFwiICsgaXRlbS5pZCArIFxcXCI8L3NtYWxsPjxmb250PlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbHZlcjogXFxcIuWbnuWkjei/m+WFpeS4jeaUr+aMgeafpeeci1xcXCIsXFxuICAgICAgICAgICAgICAgIGlkOiBpdGVtLnJ1bGVfaWRbMF1cXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXG4gICAgICAgICAgICBkZXNjOiBpdGVtLmNyZWF0ZV9kYXRlICsgXFxcIsK3XFxcIitpdGVtLnJ1bGVfaWRbMV0rXFxcIsK3XFxcIitcXFwi5byA5Y+R6ICF8J+Xo1xcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9pbmZvXFxcIixcXG4gICAgICAgICAgICBleHRyYTp7XFxuICAgICAgICAgICAgICAgIG5hbWU6aXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB0eXBlOlxcXCJsb25nX3RleHRcXFwiLFxcbiAgICAgICAgICAgICAgICB0ZXh0Oml0ZW0uZGlzY3Vzc190ZXh0XFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBpdGVtLmF2YXRhcl91cmxcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIFxcbn1cXG5zZXRSZXN1bHQoZGF0YSk7XFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmm7TlpJrliIbkuqtcIixcInBhdGhcIjpcIm1vcmVTaGFyZVwiLFwicnVsZVwiOlwianM6XFxuICAgIGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKT0+e1xcbiAgICAgICAgY2xlYXJWYXIoXFxcImhvdXNlLnVwbG9hZF9jb2RlXFxcIik7XFxuICAgIH0pKTtcXG5jb25zdCB7Y29sb3Isc21hbGwsYXBpLCBnZXRGaWxlfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXG5sZXQgcHV0X3VybCA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvZGV2L3B1dCc7XFxuaWYoIWhvdXNlRmlsZSl7XFxuICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcbn1cXG5sZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcbi8vIGxvZyhob3VzZV9kYXRhLnVzZXJuYW1lKyctJytob3VzZV9kYXRhLnBhc3N3b3JkKTtcXG52YXIgY2FudXAgPSBob3VzZV9kYXRhLnVzZXJuYW1lLmxlbmd0aCA+PSA2ICYmIGhvdXNlX2RhdGEucGFzc3dvcmQubGVuZ3RoID4gMjtcXG5sb2coJ+WPr+S7peS4iuS8oD8nK2NhbnVwKTtcXG5sZXQgZCA9IFtdO1xcbmxldCBmaWxlX3R5cGUgPSBbe25hbWU6J+mdmeaAgeaWh+S7ticsdmFsdWU6J2h0bWwnfSx7bmFtZTon572R6aG15o+S5Lu2Jyx2YWx1ZTonanNfdXJsJ30se25hbWU6J+S4u+mhtemFjee9ricsdmFsdWU6J2NvbmZpZyd9XTsgLy/kuIrkvKDnsbvlnotcXG5sZXQgZmlsZV9yZWRpcmVjdCA9IFt7bmFtZTon5pys5ZywJyx2YWx1ZTonZmFsc2UnfSx7bmFtZTon55u06ZO+MzAyJyx2YWx1ZTondHJ1ZSd9XTsgLy/mmK/lkKbph43lrprlkJFcXG5sZXQgZmlsZV91YSA9IFt7bmFtZTon55S16ISRJyx2YWx1ZToncGMnfSx7bmFtZTon5omL5py6Jyx2YWx1ZTonbW9iaWxlJ31dO1xcbmxldCBmaWxlX3R5cGVfdGl0bGUgPSBmaWxlX3R5cGUubWFwKChpdGVtKSA9PiB7XFxuICAgIGxldCBuYW1lID0gZ2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2Jyk7XFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxuICAgIH1lbHNle1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXG4gICAgfVxcbn0pO1xcbmxldCBmaWxlX3JlZGlyZWN0X3RpdGxlID0gZmlsZV9yZWRpcmVjdC5tYXAoKGl0ZW0pID0+IHtcXG4gICAgbGV0IG5hbWUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0Jywn5pys5ZywJyk7XFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxuICAgIH1lbHNle1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXG4gICAgfVxcbn0pO1xcbmxldCBmaWxlX3VhX3RpdGxlID0gZmlsZV91YS5tYXAoKGl0ZW0pID0+IHtcXG4gICAgbGV0IG5hbWUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJywn55S16ISRJyk7XFxuICAgIGlmKGl0ZW0ubmFtZT09PW5hbWUpe1xcbiAgICAgICAgcmV0dXJuICfwn5GJJytpdGVtLm5hbWU7XFxuICAgIH1lbHNle1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZTtcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7Y29sX3R5cGU6ICd4NV93ZWJ2aWV3X3NpbmdsZScsIGV4dHJhOiB7anM6ICdjb25zb2xlLmxvZyhcXFwi5oiR5Yqg6L295LqGXFxcIiknfX0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAn6I635Y+WJyxcXG4gICAgZGVzYzogXFxcIuaWh+S7tui3r+W+hCzmlK/mjIFoaWtlcixmaWxlLGh0dHAs5Li76aKYXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIG9uQ2hhbmdlOiBcXFwicHV0VmFyKCdob3VzZS53ZWJfdXJsJyxpbnB1dClcXFwiLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiB0cnVlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOmdldFZhcignaG91c2Uud2ViX3VybCcpXFxuICAgIH0sXFxuICAgIHVybDokLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIGxldCBpbnB1dCA9IGdldFZhcignaG91c2Uud2ViX3VybCcsJycpO1xcbiAgICAgICAgaWYoaW5wdXQubGVuZ3RoPDIpe1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/pk77mjqXkuI3lj6/ku6XkuLrnqbonXFxuICAgICAgICB9IGVsc2UgaWYoL15oaWtlcjp8XmZpbGU6fF5odHRwOnxeaHR0cHM6fF5cXFxcL3N0b3JhZ2VcXFxcL3xeXFxcXC9zZGNhcmRcXFxcLy8udGVzdChpbnB1dCkpe1xcbiAgICAgICAgICAgIGlmKC9eXFxcXC9zdG9yYWdlXFxcXC98XlxcXFwvc2RjYXJkXFxcXC8vLnRlc3QoaW5wdXQpKXtcXG4gICAgICAgICAgICAgICAgaW5wdXQgPSAnZmlsZTovLycraW5wdXQ7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxvZygn5q2j5bi46ZO+5o6lOicraW5wdXQpO1xcbiAgICAgICAgICAgIGxldCB1YSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKT09PSfnlLXohJEnPydNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODguMC40MzI0LjE0NiBTYWZhcmkvNTM3LjM2JzonTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDk7IE1JIDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OS4wLjQzODkuOTAgTW9iaWxlIFNhZmFyaS81MzcuMzYnO1xcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsX2FyciA9IGlucHV0LnNwbGl0KCc7Jyk7XFxuICAgICAgICAgICAgbGV0IHdlYl91cmwgPSB3ZWJfdXJsX2FyclswXTtcXG4gICAgICAgICAgICBsZXQgaGVhZGVycyA9IHtcXG4gICAgICAgICAgICAgICAgJ1JlZmVyZXInOidodHRwczovL2Jsb2cuY3Nkbi5uZXQnLFxcbiAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6dWEsXFxuICAgICAgICAgICAgICAgICdBY2NlcHQnOidhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQsICovKjsgcT0wLjAxJyxcXG4gICAgICAgICAgICAgICAgJ0FjY2VwdC1MYW5ndWFnZSc6J3poLUNOJyxcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIGlmKHdlYl91cmxfYXJyLmxlbmd0aD49MyYmd2ViX3VybF9hcnJbMl0ubGVuZ3RoPjIpeyAvL+iuvue9rue8lueggVxcbiAgICAgICAgICAgICAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdjaGFyc2V0PScrd2ViX3VybF9hcnJbMl0udG9VcHBlckNhc2UoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHtoZWFkZXJzOmhlYWRlcnMsd2l0aEhlYWRlcnM6ZmFsc2UscmVkaXJlY3Q6ZmFsc2V9O1xcbiAgICAgICAgICAgIGlmKHdlYl91cmxfYXJyLmxlbmd0aD49MiYmd2ViX3VybF9hcnJbMV0ubGVuZ3RoPjIpeyAvLyDorr7nva7or7fmsYLmlrnms5VcXG4gICAgICAgICAgICAgICAgcGFyYW1zWydtZXRob2QnXSA9IHdlYl91cmxfYXJyWzFdLnRvVXBwZXJDYXNlKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxvZygn5byA5aeL6I635Y+W5rqQ56CBJyk7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgLypcXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFzeW5jKHdlYl91cmwscGFyYW1zLGZ1bmN0aW9uIChrZXksY29kZSkge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tfY29kZSA9IGNvZGU7XFxuICAgICAgICAgICAgICAgICAgICBpZihiYWNrX2NvZGUubGVuZ3RoPjIwKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyxiYWNrX2NvZGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mupDnoIHlt7Lojrflj5Ys5bm26YOo5YiG5o+S5YWl5Yiw5paH5pys5Yy65Z+fJ1xcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOacrOasoeiOt+WPluWIsOepuuaWh+acrO+8jOeWkeS8vOS9oOayoeacieatpOaWh+S7tiEnO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICAgICAgbGV0IGJhY2tfY29kZSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKT09PSfnlLXohJEnP2ZldGNoKHdlYl91cmwscGFyYW1zKTpyZXF1ZXN0KHdlYl91cmwscGFyYW1zKTtcXG4gICAgICAgICAgICAgICAgaWYoYmFja19jb2RlLmxlbmd0aD4yMCl7XFxuICAgICAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyxiYWNrX2NvZGUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5bey6I635Y+WLOW5tumDqOWIhuaPkuWFpeWIsOaWh+acrOWMuuWfnydcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+v77yM5pys5qyh6I635Y+W5Yiw56m65paH5pys77yM55aR5Ly85L2g5rKh5pyJ5q2k5paH5Lu2ISc7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lj5HnlJ/kuobplJnor686XFxcXG4nK2UubWVzc2FnZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9ZWxzZSBpZigv5Li76aKY77+lfOWFg+e0oO+/pS8udGVzdChpbnB1dCkpe1xcbiAgICAgICAgICAgIGxvZygn5Li76aKY6ZO+5o6lJyk7XFxuICAgICAgICAgICAgbGV0IHdlYl91cmxfYXJyID0gaW5wdXQuc3BsaXQoJ++/pScpO1xcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsID0gd2ViX3VybF9hcnJbd2ViX3VybF9hcnIubGVuZ3RoLTFdO1xcbiAgICAgICAgICAgIGxldCBiYWNrX2NvZGUgPSBwYXJzZVBhc3RlKHdlYl91cmwpO1xcbiAgICAgICAgICAgIGlmKGJhY2tfY29kZS5sZW5ndGg+MjApIHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51cGxvYWRfY29kZScsYmFja19jb2RlKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mupDnoIHlt7Lojrflj5Ys5bm26YOo5YiG5o+S5YWl5Yiw5paH5pys5Yy65Z+fJ1xcbiAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+v77yM5pys5qyh6I635Y+W6L+U5Zue5Li6OlxcXFxuJytiYWNrX2NvZGU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mdnuazlemTvuaOpTpcXFxcbicrZ2V0VmFyKCdob3VzZS53ZWJfdXJsJyk7XFxuICAgICAgICB9XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIlxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifkuIrkvKDnsbvlnosnLFxcbiAgICBkZXNjOifkuIrkvKDmlofku7bnmoTnsbvlnoss5b2T5YmN5Li6OicrY29sb3IoZ2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2JyksJyNmZjcwMDAnKSxcXG4gICAgY29sX3R5cGU6J3RleHRfMScsXFxuICAgIHVybDokKGZpbGVfdHlwZV90aXRsZSwyKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgc2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJyxpbnB1dC5yZXBsYWNlKCfwn5GJJywnJykpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L2g6YCJ5oup5LqGOicraW5wdXQ7XFxuICAgIH0pXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J+aWh+S7tuWumuS9jScsXFxuICAgIGRlc2M6J+aWh+S7tuaYr+WQpuWxnuS6jumHjeWumuWQkSzlvZPliY3kuLo6Jytjb2xvcihnZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0Jywn5pys5ZywJyksJyNmZjcwMDAnKSxcXG4gICAgY29sX3R5cGU6J3RleHRfMScsXFxuICAgIHVybDokKGZpbGVfcmVkaXJlY3RfdGl0bGUsMikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgIHNldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLGlucHV0LnJlcGxhY2UoJ/CfkYknLCcnKSk7XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/kvaDpgInmi6nkuoY6JytpbnB1dDtcXG4gICAgfSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon6K6+5aSHVUEnLFxcbiAgICBkZXNjOiflj5HotbfnvZHpobXor7fmsYLlpLTmoIfor4Ys5b2T5YmN5Li6OicrY29sb3IoZ2V0SXRlbSgnaG91c2UuZmlsZV91YScsJ+eUteiEkScpLCcjZmY3MDAwJyksXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcbiAgICB1cmw6JChmaWxlX3VhX3RpdGxlLDIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICBzZXRJdGVtKCdob3VzZS5maWxlX3VhJyxpbnB1dC5yZXBsYWNlKCfwn5GJJywnJykpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L2g6YCJ5oup5LqGOicraW5wdXQ7XFxuICAgIH0pXFxufSk7XFxuZnVuY3Rpb24gY29tcGFyZShuYW1lKSB7XFxuICAgIHJldHVybiBmdW5jdGlvbihpdGVtKSB7XFxuICAgICAgICByZXR1cm4gaXRlbS5uYW1lID09PSBuYW1lO1xcbiAgICB9XFxufVxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifwn5eE77iP546v5aKDJyxcXG4gICAgY29sX3R5cGU6J2ZsZXhfYnV0dG9uJyxcXG4gICAgdXJsOiQoKS5sYXp5UnVsZSgoZmlsZV90eXBlLGNvbXBhcmUpPT57XFxuICAgICAgICBsb2coJ+afpeeci+eOr+Wig+WPmOmHjycpO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgdXBfY29kZSA9IGdldFZhcignaG91c2UudXBsb2FkX2NvZGUnLCcnKTtcXG4gICAgICAgICAgICBsZXQgZnR5cGUgPSAgZmlsZV90eXBlLmZpbHRlcihjb21wYXJlKGdldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsJ+mdmeaAgeaWh+S7ticpKSlbMF0udmFsdWU7XFxuICAgICAgICAgICAgbGV0IHJlZGlyZWN0ID0gZ2V0SXRlbSgnaG91c2UuZmlsZV9yZWRpcmVjdCcsJ+acrOWcsCcpIT09J+acrOWcsCc7XFxuICAgICAgICAgICAgbGV0IGNvZGUgPSAhcmVkaXJlY3Q/dXBfY29kZTppbnB1dDtcXG4gICAgICAgICAgICBsZXQgZW52ID0ge1xcbiAgICAgICAgICAgICAgICB3ZWJfdXJsOmdldFZhcignaG91c2Uud2ViX3VybCcsJycpLFxcbiAgICAgICAgICAgICAgICBkZXZpY2U6Z2V0SXRlbSgnaG91c2UuZmlsZV91YScsJ+eUteiEkScpLFxcbiAgICAgICAgICAgICAgICBmdHlwZTpmdHlwZXx8XFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgIHJlZGlyZWN0OnJlZGlyZWN0LFxcbiAgICAgICAgICAgICAgICBjb2RlOmNvZGUuc3Vic3RyaW5nKDAsNDApfHxcXFwiXFxcIixcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbG9nKGVudik7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrSlNPTi5zdHJpbmdpZnkoZW52KTtcXG4gICAgICAgICAgICAvLyBhbGVydChKU09OLnN0cmluZ2lmeShlbnYpKTtcXG4gICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK2UubWVzc2FnZTtcXG4gICAgICAgICAgICAvLyBhbGVydChlLm1lc3NhZ2UpO1xcbiAgICAgICAgfVxcbiAgICB9LGZpbGVfdHlwZSxjb21wYXJlKVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifwn5OD5pWZ56iLJyxcXG4gICAgY29sX3R5cGU6J2ZsZXhfYnV0dG9uJyxcXG4gICAgdXJsOiQoKS54NVJ1bGUoKCk9PntcXG4gICAgICAgIGxldCBtc2cgPSAn5qyi6L+O5L2/55So5byA5Y+R6ICF5pu05aSa5YiG5Lqr5bel5YW3XFxcXG4xLui+k+WFpee9keWdgOS4uuacrOWcsOaWh+S7tui3r+W+hCxoaWtlcjovL+aIluiAhWZpbGU6Ly/lvIDlpLRcXFxcbjIu54K55Ye7572R5Z2A6L6T5YWl5qCP5ZCO6Z2i55qE5oyJ6ZKuXFxcXG4zLueci+aWh+acrOmihOiniOWMuuaYr+WQpuato+ehrlxcXFxuNC7ngrnlh7vkuIrkvKDmjInpkq7mj5DkuqTliLDku5PlupMnO1xcbiAgICAgICAgYWxlcnQobXNnKTtcXG4gICAgfSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon8J+Xke+4j+a4heepuicsXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxuICAgIHVybDokKCkubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgIGNsZWFyVmFyKCdob3VzZS51cGxvYWRfY29kZScpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bey5riF6Zmk6aKE6KeI5Yy65Z+f5YaF5a65J1xcbiAgICB9KVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifwn5Oy56S65L6LJyxcXG4gICAgY29sX3R5cGU6J2ZsZXhfYnV0dG9uJyxcXG4gICAgdXJsOiQoKS5sYXp5UnVsZSgoKT0+e1xcbiAgICAgICAgbGV0IGRlbW9fY29kZSA9IGdldEl0ZW0oJ2hvdXNlLmRlbW8nLCcwJyk7XFxuICAgICAgICBpZihkZW1vX2NvZGU9PScwJyl7XFxuICAgICAgICAgICAgcHV0VmFyKCdob3VzZS53ZWJfdXJsJywnaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwv6LWE5rqQ572R5Lmm562+Lmh0bWwnKTtcXG4gICAgICAgICAgICBkZW1vX2NvZGUgPSBwYXJzZUludChkZW1vX2NvZGUpKzE7XFxuICAgICAgICAgICAgc2V0SXRlbSgnaG91c2UuZGVtbycsZGVtb19jb2RlKycnKTtcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHB1dFZhcignaG91c2Uud2ViX3VybCcsJ2ZpbGU6Ly8vc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL3J1bGVzL2R6SG91c2UvaHRtbC/otYTmupDnvZHkuabnrb4uaHRtbCcpO1xcbiAgICAgICAgICAgIHNldEl0ZW0oJ2hvdXNlLmRlbW8nLCcwJyk7XFxuICAgICAgICB9XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7Lorr7nva7npLrkvovlnLDlnYAnXFxuICAgIH0pXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J/Cfk6TkuIrkvKAnLFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcbiAgICB1cmw6JCgpLmxhenlSdWxlKChjYW51cCxob3VzZV9kYXRhLHB1dF91cmwsZmlsZV90eXBlKSA9PntcXG4gICAgICAgIGZ1bmN0aW9uIGNvbXBhcmUobmFtZSkge1xcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbihpdGVtKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLm5hbWUgPT09IG5hbWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgY29uc3Qge2dldE5vd0Zvcm1hdERhdGV9PSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbiAgICAgICAgbGV0IHVwX2NvZGUgPSBnZXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJywnJyk7XFxuICAgICAgICBpZih1cF9jb2RlLmxlbmd0aCA8IDIpe1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mupDnoIHljLrml6DlhoXlrrnvvIzor7flhYjorr/pl67kuIDkuKrpnZnmgIHpobXpnaInXFxuICAgICAgICB9XFxuICAgICAgICBpZighY2FudXApe1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/kvaDkuI3mmK/lvIDlj5HogIXvvIzmsqHmnInmj5DkuqTliLDku5PlupPnmoTmnYPliKkhJ1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGlucHV0ID0gZ2V0VmFyKCdob3VzZS53ZWJfdXJsJywnJyk7XFxuICAgICAgICBsZXQgd2ViX3VybCA9IGlucHV0LnNwbGl0KCc7JylbMF07XFxuICAgICAgICBsZXQgZmlsZU5hbWUgPSAnJztcXG4gICAgICAgIGlmKC9eaGlrZXI6fF5maWxlOnxeaHR0cDp8Xmh0dHBzOnxeXFxcXC9zdG9yYWdlXFxcXC98XlxcXFwvc2RjYXJkXFxcXC8vLnRlc3Qod2ViX3VybCkpe1xcbiAgICAgICAgICAgIGZpbGVOYW1lID0gd2ViX3VybC5zcGxpdCgnLycpW3dlYl91cmwuc3BsaXQoJy8nKS5sZW5ndGgtMV07XFxuICAgICAgICB9ZWxzZSBpZigv5Li76aKY77+lfOWFg+e0oO+/pS8udGVzdChpbnB1dCkpe1xcbiAgICAgICAgICAgIGxldCBia2FyciA9IHVwX2NvZGUuc3BsaXQoJ++/pScpO1xcbiAgICAgICAgICAgIGlmKGJrYXJyLmxlbmd0aDwzKXtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+S6keWJqui0tOadv+WGheWuueacieivrydcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgc3dpdGNoIChia2FyclsxXSkge1xcbiAgICAgICAgICAgICAgICBjYXNlICdteV9ob21lX3RoZW1lJzpcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gdXBfY29kZS5zcGxpdCgn44CMJylbMV0uc3BsaXQoJ+OAjScpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgIGNhc2UgJ215X2hvbWVfc2luZ2xlJzpcXG4gICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lID0gdXBfY29kZS5zcGxpdCgn44CMJylbMV0uc3BsaXQoJ+OAjScpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgIGNhc2UgJ2pzX3VybCc6XFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHVwX2NvZGUuc3BsaXQoJ++/pScpWzJdLnNwbGl0KCdAJylbMF07XFxuICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+v77yM572R6aG16ZO+5o6l5peg5YaF5a65ISc7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgdWEgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz8nTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg4LjAuNDMyNC4xNDYgU2FmYXJpLzUzNy4zNic6J01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA5OyBNSSA2KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODkuMC40Mzg5LjkwIE1vYmlsZSBTYWZhcmkvNTM3LjM2JztcXG4gICAgICAgIGxldCBoZWFkZXJzID0ge1xcbiAgICAgICAgICAgICdSZWZlcmVyJzonaHR0cHM6Ly9ibG9nLmNzZG4ubmV0JyxcXG4gICAgICAgICAgICBcXFwiY29udGVudC10eXBlXFxcIjogXFxcImFwcGxpY2F0aW9uL2pzb25cXFwiLFxcbiAgICAgICAgICAgICdVc2VyLUFnZW50Jzp1YSxcXG4gICAgICAgICAgICAnQWNjZXB0JzonYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0LCAqLyo7IHE9MC4wMScsXFxuICAgICAgICAgICAgJ0FjY2VwdC1MYW5ndWFnZSc6J3poLUNOJyxcXG4gICAgICAgIH07XFxuICAgICAgICBsZXQgdG9Db21wYXJlID0gJyc7XFxuICAgICAgICBpZihmaWxlTmFtZS5lbmRzV2l0aCgnLmh0bWwnKSl7XFxuICAgICAgICAgICAgdG9Db21wYXJlID0gJ+mdmeaAgeaWh+S7tic7XFxuICAgICAgICB9ZWxzZSBpZigv5Li76aKYLy50ZXN0KGZpbGVOYW1lKSl7XFxuICAgICAgICAgICAgdG9Db21wYXJlID0gJ+S4u+mhtemFjee9ridcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBmdHlwZSA9ICBmaWxlX3R5cGUuZmlsdGVyKGNvbXBhcmUodG9Db21wYXJlfHxnZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLCfpnZnmgIHmlofku7YnKSkpWzBdLnZhbHVlO1xcbiAgICAgICAgbGV0IHJlZGlyZWN0ID0gZ2V0SXRlbSgnaG91c2UuZmlsZV9yZWRpcmVjdCcsJ+acrOWcsCcpIT09J+acrOWcsCc7XFxuICAgICAgICBpZihyZWRpcmVjdCYmIXdlYl91cmwuc3RhcnRzV2l0aCgnaHR0cCcpKXtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v55u06ZO+MzAy6YeN5a6a5ZCR572R5Z2A6ZO+5o6l5b+F6aG7aHR0cOW8gOWktCc7XFxuICAgICAgICB9XFxuICAgICAgICBsZXQgY29kZSA9ICFyZWRpcmVjdD91cF9jb2RlOndlYl91cmw7XFxuICAgICAgICBsZXQgZGF0YSA9IHtcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAge1xcXCJkYXRhXFxcIjoge3J1bGVfbmFtZTogZmlsZU5hbWUsIFxcXCJydWxlX3R5cGVcXFwiOiAn5pu05aSa5YiG5LqrJywgXFxcInZlcnNpb25cXFwiOmdldE5vd0Zvcm1hdERhdGUoKSxcXFwicnVsZV92YWx1ZVxcXCI6IGNvZGUsXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV90eXBlOmZ0eXBlLCBpc19yZWRpcmVjdDpyZWRpcmVjdCxkZXZpY2VVYTpnZXRJdGVtKCdob3VzZS5maWxlX3VhJyksXFxuICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiBob3VzZV9kYXRhLnVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogaG91c2VfZGF0YS5wYXNzd29yZH1cXG4gICAgICAgIH07XFxuICAgICAgICBsZXQgdXBwYXJhbXMgPSB7aGVhZGVyczpoZWFkZXJzLGJvZHk6SlNPTi5zdHJpbmdpZnkoZGF0YSksd2l0aEhlYWRlcnM6ZmFsc2UscmVkaXJlY3Q6ZmFsc2UsbWV0aG9kOidQT1NUJ307XFxuICAgICAgICBsZXQgYmFja21zZyA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKT09PSfnlLXohJEnP2ZldGNoKHB1dF91cmwsdXBwYXJhbXMpOnJlcXVlc3QocHV0X3VybCx1cHBhcmFtcyk7XFxuICAgICAgICB0cnl7XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoYmFja21zZykucmVzdWx0O1xcbiAgICAgICAgICAgIGxldCBkZXRhaWwgPSByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK2RldGFpbDtcXG4gICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lj5HnlJ/kuobplJnor69cXFxcbicrZS5tZXNzYWdlO1xcbiAgICAgICAgfVxcbiAgICB9LGNhbnVwLGhvdXNlX2RhdGEscHV0X3VybCxmaWxlX3R5cGUpXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J+mVv+aWh+acrOmihOiniOWMuuWfnycsXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcbiAgICB1cmw6J2hpa2VyOi8vZW1wdHknLFxcbiAgICBleHRyYToge3RleHRTaXplOiAxMSxsaW5lVmlzaWJsZTpmYWxzZX1cXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTpnZXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJywnJykuc3Vic3RyaW5nKDAsMTAyNDApLFxcbiAgICBjb2xfdHlwZTonbG9uZ190ZXh0JyxcXG4gICAgZXh0cmE6IHt0ZXh0U2l6ZTogMTF9XFxufSk7XFxuc2V0UGFnZVRpdGxlKFxcXCLmm7TlpJrliIbkuqtcXFwiKTtcXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLovbvlkIjpm4bnlJ/miJDmjqXlj6NcIixcInBhdGhcIjpcImdlbkFwaVwiLFwicnVsZVwiOlwianM6XFxuZnVuY3Rpb24gZ2VuUnVsZShuYW1lLHVybCxpY29uKXtcXG4gICAgaWNvbj1pY29ufHwnaHR0cHM6Ly96My5heDF4LmNvbS8yMDIxLzExLzE2L0lXSmh4Zi5wbmcnO1xcbiAgICBjb25zdCB7Z2V0Tm93Rm9ybWF0RGF0ZSxhcGksZ2V0QXBpfT0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsID0gZnVuY3Rpb24ob2xkLG5ld19zdHIpe1xcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXQob2xkKS5qb2luKG5ld19zdHIpO1xcbiAgICB9O1xcbiAgICBsZXQgbXViYW4gPSBnZXRBcGkoJ2ltcG9ydFVybCcpK1xcXCIxNjkwXFxcIjtcXG4gICAgbGV0IG11YmFuX3dvcmQ9e25hbWU6XFxcIkDovbvlkIjpm4ZcXFwiLHVybDpcXFwiQOWcsOWdgFxcXCIsdmVyOlxcXCJA54mI5pysXFxcIixpY29uOlxcXCJA5Zu+5qCHXFxcIn07XFxuICAgIGxldCBtdWJhbl9jb2RlID0gZmV0Y2gobXViYW4pO1xcbiAgICBtdWJhbl9jb2RlPW11YmFuX2NvZGUucmVwbGFjZUFsbChtdWJhbl93b3JkLm5hbWUsbmFtZSkucmVwbGFjZUFsbChtdWJhbl93b3JkLnZlcixnZXROb3dGb3JtYXREYXRlKCkpLnJlcGxhY2VBbGwobXViYW5fd29yZC51cmwsdXJsKS5yZXBsYWNlQWxsKG11YmFuX3dvcmQuaWNvbixpY29uKTtcXG4gICAgbGV0IGltcG9ydF9jb2RlPVxcXCLmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJrlsI/nqIvluo/vvIzml6DmoLnmoJHvvIzoirHmraPmuIXvvIzkuI3mlq3ojaTohaXkuI3miJLmt6vvv6Vob21lX3J1bGVfdjLvv6ViYXNlNjQ6Ly9AXFxcIituYW1lK1xcXCJAXFxcIitiYXNlNjRFbmNvZGUobXViYW5fY29kZSk7XFxuICAgIHZhciBwYXN0ZXMgPSBnZXRQYXN0ZXMoKTtcXG4gICAgdmFyIHVybCA9IHNoYXJlUGFzdGUoaW1wb3J0X2NvZGUscGFzdGVzLnNsaWNlKC0xKVswXSk7XFxuICAgIGxldCBpbXBvcnRfcnVsZT0gdXJsK1xcXCJcXFxcblxcXFxu5bCP56iL5bqP77yaXFxcIituYW1lO1xcbiAgICByZXR1cm4gaW1wb3J0X3J1bGU7XFxufVxcbiQuZXhwb3J0cy5nZW5SdWxlPWdlblJ1bGU7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLlhajlsYDop6PmnpDlhY3ll4VcIixcInBhdGhcIjpcImdsb2JhbFBhcnNlXCIsXCJydWxlXCI6XCJqczpcXG4gICAgZnVuY3Rpb24gZ2V0SGVhZGVycyhwbGF5VXJsKXtcXG4gICAgICAgIGxldCBoZWFkZXJzID0ge307XFxuICAgICAgICBsZXQgcmVmZXI9cGxheVVybC5zcGxpdChcXFwiLy9cXFwiKVswXStcXFwiLy9cXFwiK3BsYXlVcmwuc3BsaXQoXFxcIi8vXFxcIilbMV0uc3BsaXQoXFxcIi9cXFwiKVswXTtcXG4gICAgICAgIGlmKC9sZWNsb3VkXFxcXC5jb218YmlsaXZpZGVvXFxcXC5jb20vLnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgICAgIGhlYWRlcnMgPSB7XFxcIlJlZmVyZXJcXFwiOiAnaHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tLycsXFxcIlVzZXItQWdlbnRcXFwiOlxcXCJNb3ppbGxhLzUuMFxcXCJ9XFxuICAgICAgICB9ZWxzZSBpZigvbWd0dlxcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICBoZWFkZXJzID0ge1xcXCJSZWZlcmVyXFxcIjogcmVmZXIsXFxcIlVzZXItQWdlbnRcXFwiOlxcXCJNb3ppbGxhLzUuMFxcXCJ9XFxuICAgICAgICB9ZWxzZSBpZigvaXhpZ3VhXFxcXC5jb20vLnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgICAgIGhlYWRlcnMgPSB7XFxcIlJlZmVyZXJcXFwiOiAnaHR0cHM6Ly93d3cuaXhpZ3VhLmNvbS8nLFxcXCJVc2VyLUFnZW50XFxcIjpcXFwiTW96aWxsYS81LjBcXFwifVxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgaGVhZGVycyA9IHtcXFwiUmVmZXJlclxcXCI6IHJlZmVyLCdVc2VyLUFnZW50JzonRGFydC8yLjEzIChkYXJ0OmlvKSd9XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gaGVhZGVyc1xcbiAgICB9XFxuZnVuY3Rpb24gaXNQaWMoc3RyKXtcXG4gICAgcmV0dXJuIC9cXFxcLihnaWZ8anBnfGpwZWd8cG5nfEdJRnxKUEd8UE5HKSQvLnRlc3Qoc3RyKTtcXG59XFxuZnVuY3Rpb24gaXNWaWRlbyhwbGF5VXJsLHJlY2hhbmdlKXtcXG4gICAgLy/ms6jmhI8ucGhw5LiN5Y+v5Lul6KKr5o6S6Zmk5ZCm5YiZ6J6N5YW06Kej5p6Q5LiN5LqGIHwucGhwJFxcbiAgICAvL+WmguaenOaYr+aSreaUvuWcsOWdgOWwseebtOaOpei/lOWbnuWcsOWdgOWKoOS4ilVB77yM5LiN5piv55qE6K+d5bCx6L+U5ZueZmFsc2VcXG4gICAgcmVjaGFuZ2U9dHlwZW9mKHJlY2hhbmdlKT09PVxcXCJmdW5jdGlvblxcXCI/cmVjaGFuZ2U6ZnVuY3Rpb24ocGxheVVybCl7cmV0dXJuIHBsYXlVcmx9O1xcbiAgICBsZXQgZXhjZXB0V29yZHMgPSAnLmpzJHwuY3NzJHwudHMkfC5odG1sJHwuaHRtJHwuZ2lmJHwuanBnJHwuanBlZyR8LnBuZyR8LmljbyR8LnN2ZyR8LnR4dCQnLnNwbGl0KCd8JykubWFwKGl0PT4nXFxcXFxcXFwnK2l0KS5qb2luKCd8Jyk7XFxuICAgIHZhciBleGNlcHRLZXlzID0gbmV3IFJlZ0V4cChleGNlcHRXb3Jkcyk7XFxuICAgIGxldCBleGNlcHRXb3JkczEgPSAncmVmZXJlcj18dXJsPScuc3BsaXQoJ3wnKS5tYXAoaXQ9Pml0KS5qb2luKCd8Jyk7XFxuICAgIHZhciBleGNlcHRLZXlzMSA9IG5ldyBSZWdFeHAoZXhjZXB0V29yZHMxKTtcXG4gICAgbGV0IHJlcGxhY2VXb3JkcyA9ICdwbGF5bTN1OHxtM3U4XFxcXC50dicuc3BsaXQoJ3wnKS5tYXAoaXQ9Pml0KS5qb2luKCd8Jyk7XFxuICAgIGxldCByZXBsYWNlS2V5cyA9IG5ldyBSZWdFeHAocmVwbGFjZVdvcmRzLCdnJyk7XFxuICAgIGxldCB2aWRlb1dvcmRzID0gXFxcIi5tcDQkfC5tM3U4JHwuZmx2JHwuYXZpJHwuM2dwJHwubXBlZyR8LndtdiR8Lm1vdiR8cm12YnwuZGF0JHwubXAzJHwubTRhJHxxcUJGZG93bmxvYWR8bWltZT12aWRlbyUyRnxtaW1lX3R5cGU9dmlkZW9ffHR5cGU9bTN1OHxwdD1tM3U4XFxcIi5zcGxpdCgnfCcpLm1hcCgoaXQpPT57XFxuICAgICAgICAvL3R5cGU9bXA0XFxuICAgICAgICBpZihpdC5zdGFydHNXaXRoKFxcXCIuXFxcIikpe1xcbiAgICAgICAgICAgIHJldHVybiAnXFxcXFxcXFwnK2l0XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICByZXR1cm4gaXRcXG4gICAgICAgIH1cXG4gICAgfSkuam9pbihcXFwifFxcXCIpO1xcbiAgICBsZXQgdmlkZW9LZXlzID0gbmV3IFJlZ0V4cCh2aWRlb1dvcmRzKTtcXG4gICAgbGV0IHBVcmw9cGxheVVybC5zcGxpdChcXFwiO1xcXCIpWzBdO1xcbiAgICBsZXQgcFVybDI9cGxheVVybC5zcGxpdChcXFwiO1xcXCIpWzBdLnNwbGl0KFxcXCImXFxcIilbMF0uc3BsaXQoXFxcIj9cXFwiKVswXTtcXG4gICAgaWYoKHZpZGVvS2V5cy50ZXN0KHBVcmwpfHx2aWRlb0tleXMudGVzdChwVXJsMikpJiYhZXhjZXB0S2V5czEudGVzdChwVXJsLnJlcGxhY2UocFVybC5zcGxpdChcXFwiP1xcXCIpWzBdLCcnKSkpe1xcbiAgICAgICAgbGV0IHRpcHMgPSAn5qOA5rWL5Yiw55aR5Ly85aSa5aqS5L2T55qE5Zyw5Z2AOic7XFxuICAgICAgICB0cnl7XFxuICAgICAgICAgICAgbG9nKFxcXCJqc+S4rVxcXCIrdGlwcytwVXJsKTtcXG4gICAgICAgICAgICAvLyBsb2cocFVybC5yZXBsYWNlKHBVcmwuc3BsaXQoXFxcIj9cXFwiKVswXSwnJykpO1xcbiAgICAgICAgICAgIC8vIGxvZyhleGNlcHRLZXlzMSk7XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBmeV9icmlkZ2VfYXBwLmxvZygneDXkuK0nK3RpcHMrcFVybCk7XFxuICAgICAgICAgICAgZnlfYnJpZGdlX2FwcC5sb2coXFxcIuWIhuWJsumXruWPt+WQjjpcXFwiK3BVcmwucmVwbGFjZShwVXJsLnNwbGl0KFxcXCI/XFxcIilbMF0sJycpKTtcXG4gICAgICAgICAgICAvLyBmeV9icmlkZ2VfYXBwKGV4Y2VwdEtleXMxKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICAvLyBsb2coJzE6JysodmlkZW9LZXlzLnRlc3QocFVybCl8fHZpZGVvS2V5cy50ZXN0KHBVcmwyKXx8dmlkZW9LZXlzLnRlc3QocFVybC5yZXBsYWNlKHJlcGxhY2VLZXlzLFxcXCJcXFwiKS5zcGxpdChcXFwiJlxcXCIpWzBdLnNwbGl0KFxcXCI/XFxcIilbMF0pKSk7XFxuICAgIC8vIGxvZygnMjonKyFleGNlcHRLZXlzLnRlc3QocFVybC5zcGxpdChcXFwiP1xcXCIpWzBdLnNwbGl0KCcmJylbMF0pKTtcXG4gICAgLy8gbG9nKCczOicrIWV4Y2VwdEtleXMxLnRlc3QocFVybC5yZXBsYWNlKHBVcmwuc3BsaXQoXFxcIj9cXFwiKVswXSwnJykpKTtcXG4gICAgaWYgKCh2aWRlb0tleXMudGVzdChwVXJsKXx8dmlkZW9LZXlzLnRlc3QocFVybDIpfHx2aWRlb0tleXMudGVzdChwVXJsLnJlcGxhY2UocmVwbGFjZUtleXMsXFxcIlxcXCIpLnNwbGl0KFxcXCImXFxcIilbMF0uc3BsaXQoXFxcIj9cXFwiKVswXSkgKSYmICFleGNlcHRLZXlzLnRlc3QocFVybC5zcGxpdChcXFwiP1xcXCIpWzBdLnNwbGl0KCcmJylbMF0pJiYhZXhjZXB0S2V5czEudGVzdChwVXJsLnJlcGxhY2UocFVybC5zcGxpdChcXFwiP1xcXCIpWzBdLCcnKSkpIHtcXG4gICAgICAgIGlmKCEoL1VzZXItQWdlbnR8UmVmZXJlckAvLnRlc3QocGxheVVybCkpKXtcXG4gICAgICAgICAgICBpZigvbGVjbG91ZFxcXFwuY29tfGJpbGl2aWRlby8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgICAgIHBsYXlVcmwrPVxcXCI7e1JlZmVyZXJAaHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tLyYmVXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgICAgIH1lbHNlIGlmKC9peGlndWFcXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgICAgIHBsYXlVcmwrPVxcXCIjLm1wNDt7UmVmZXJlckBodHRwczovL3d3dy5peGlndWEuY29tLyYmVXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBlbHNlIGlmKC9tZ3R2XFxcXC5jb218Ynl0ZWFtb25lLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICAgICAgcGxheVVybCs9XFxcIjt7VXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgICAgIH1lbHNlIGlmKC9wdHdvXFxcXC53a2ZpbGVcXFxcLmNvbS8udGVzdChwbGF5VXJsKSYmL3VybD0vLnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgICAgICAgICBwbGF5VXJsPXBsYXlVcmwuc3BsaXQoXFxcInVybD1cXFwiKVsxXStcXFwiO3tSZWZlcmVyQGh0dHBzOi8vZmFudHVhbi50dn1cXFwiXFxuICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgIHBsYXlVcmw9cmVjaGFuZ2UocGxheVVybCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIC8vIOWkhOeQhuWkp+W4iOWFhOS5i+exu+eahGFwcFxcbiAgICAgICAgICAgIC8vIGVsc2V7XFxuICAgICAgICAgICAgLy8gICAgIHBsYXlVcmwrPVxcXCI7e1VzZXItQWdlbnRATW96aWxsYS81LjB9XFxcIjtcXG4gICAgICAgICAgICAvLyB9XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gcGxheVVybCtcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiO1xcbiAgICB9ZWxzZXtcXG4gICAgICAgIHJldHVybiBmYWxzZTtcXG4gICAgfVxcbn1cXG5mdW5jdGlvbiBjb21QYXJzZShwYXJTdHIsZWosb25seWJhY2ssaHRtbCl7XFxuICAgIC8v5YiX6KGo77yM5qCH6aKY77yM5Zu+54mH77yM5o+P6L+w77yM6ZO+5o6l77yM5YaF5a65XFxuICAgIGVqID0gZWp8fGZhbHNlOy8v5pyJ5LqM57qnXFxuICAgIG9ubHliYWNrPW9ubHliYWNrfHxmYWxzZTsvL+WPqui/lOWbnuaVsOaNrlxcbiAgICBodG1sID0gaHRtbHx8Z2V0UmVzQ29kZSgpO1xcbiAgICBodG1sID0gdHlwZW9mKGh0bWwpPT09J3N0cmluZyc/aHRtbDpodG1sLmh0bWw7XFxuICAgIHJldHVybiAkLnRvU3RyaW5nKChwYXJTdHIsZWosb25seWJhY2ssaHRtbCxpc1BpYyk9PntcXG4gICAgICAgIGxldCB0PXBhclN0ci5zcGxpdChcXFwiO1xcXCIpO1xcbiAgICAgICAgbGV0IGQ9W107XFxuICAgICAgICAvLyBsZXQgbGlzdD1wZGZhKGdldFJlc0NvZGUoKSx0WzBdKTtcXG4gICAgICAgIGxldCBsaXN0PXBkZmEoaHRtbCx0WzBdKTtcXG4gICAgICAgIGxldCBsYXp5ID0gJCgnJykubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgICAgICBjb25zdCB7bGF6eVBhcnNlfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2dsb2JhbFBhcnNlP3J1bGU96YGT6ZW/5LuT5bqTUHJvJyk7XFxuICAgICAgICAgICAgcmV0dXJuIGxhenlQYXJzZShpbnB1dClcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZm9yKGxldCBpIGluIGxpc3Qpe1xcbiAgICAgICAgICAgIGxldCBfcGljID0gdFsyXT9wZChsaXN0W2ldLHRbMl0pOicnO1xcbiAgICAgICAgICAgIGlmKGlzUGljKF9waWMpJiYhL0BSZWZlcmVyPS8udGVzdChfcGljKSl7XFxuICAgICAgICAgICAgICAgIF9waWMrPSdAUmVmZXJlcj0nXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCBpdD17XFxuICAgICAgICAgICAgICAgIHRpdGxlOnBkZmgobGlzdFtpXSx0WzFdKSxcXG4gICAgICAgICAgICAgICAgcGljX3VybDpfcGljLFxcbiAgICAgICAgICAgICAgICBkZXNjOnBkZmgobGlzdFtpXSx0WzNdKSxcXG4gICAgICAgICAgICAgICAgdXJsOmVqP3BkKGxpc3RbaV0sdFs0XSk6cGQobGlzdFtpXSx0WzRdKStsYXp5XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICBpZih0Lmxlbmd0aD41KXsvL+WGheWuue+8jOeUqOS6juaQnOe0olxcbiAgICAgICAgICAgICAgICBpdC5jb250ZW50PXBkZmgobGlzdFtpXSx0WzVdKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBkLnB1c2goaXQpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYob25seWJhY2spe1xcbiAgICAgICAgICAgIHJldHVybiBkXFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICBzZXRSZXN1bHQoZClcXG4gICAgICAgIH1cXG4gICAgfSxwYXJTdHIsZWosb25seWJhY2ssaHRtbCxpc1BpYylcXG59XFxuXFxuZnVuY3Rpb24gbGF6eVBhcnNlKHBsYXlVcmwsbXMsdG0scmVjaGFuZ2Upe1xcbiAgICAvLyBsb2coJ+iwg+eUqOS7k+W6k+WFjeWXheaOouS8oOWPgui2heaXtuS4ujonK21zKTtcXG4gICAgdG0gPSBwYXJzZUludCh0bSl8fDUwMDA7XFxuICAgIGNvbnN0IHtpc1ZpZGVvLGdldEhlYWRlcnN9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZ2xvYmFsUGFyc2U/cnVsZT3pgZPplb/ku5PlupNQcm8nKTtcXG4gICAgbGV0IHJlYWxVcmwgPSBpc1ZpZGVvKHBsYXlVcmwscmVjaGFuZ2UpO1xcbiAgICAvL2xvZyhyZWFsVXJsKTtcXG4gICAgaWYodHlwZW9mKHJlYWxVcmwpPT0nc3RyaW5nJyl7Ly9ib29s5YC85bCx5piv5aSx6LSlXFxuICAgICAgICB0cnl7XFxuICAgICAgICAgICAgbGV0IHJ1cmw9cmVhbFVybC5zcGxpdChcXFwiO1xcXCIpWzBdLnNwbGl0KFxcXCIjXFxcIilbMF07XFxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVxdWVzdChydXJsLHt0aW1lb3V0OnRtfSkpLnVybFxcbiAgICAgICAgfWNhdGNoKGUpe1xcbiAgICAgICAgICAgIHJldHVybiByZWFsVXJsXFxuICAgICAgICB9XFxuICAgICAgICAvL3JldHVybiByZWFsVXJsXFxuICAgIH1cXG5cXG4gICAgLy9sb2coXFxcIuiuv+mXrui2heaXtjpcXFwiK3RtKTtcXG4gICAgbG9nKFxcXCLlsJ3or5XpgZPplb/ku5PlupN4NeWFjeWXhTpcXFwiK3BsYXlVcmwpO1xcbiAgICBjbGVhclZhcihcXFwiX3g1anhVcmxcXFwiKTtcXG4gICAgbGV0IGJhZD0kKFxcXCLnvZHnu5zkuI3kvbPmiJbogIXnlpHkvLzlr7nmlrnnvZHnq5nmjILkuobvvIzkvaDopoHmn6XnnIvlhbbnvZHpobXlkJfvvJ9cXFwiKS5jb25maXJtKChwbGF5VXJsKT0+e1xcbiAgICAgICAgbG9nKFxcXCLnvZHnq5nnnIvotbfmnaXmjILkuoY6XFxcIitwbGF5VXJsKTtcXG4gICAgICAgIHJldHVybiBwbGF5VXJsXFxuICAgIH0scGxheVVybCk7XFxuICAgIHRyeXtcXG4gICAgICAgIC8vIHZhciBiYWNrPXJlcXVlc3QocGxheVVybCx7aGVhZGVyczogZ2V0SGVhZGVycyhwbGF5VXJsKSx0aW1lb3V0OnRtfSk7XFxuICAgICAgICB2YXIgYmFjaz1mZXRjaChwbGF5VXJsLFxcbiAgICAgICAgICAgIHtoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6IFBDX1VBXFxuICAgICAgICAgICAgICAgIH19KTtcXG4gICAgICAgIGlmKCFiYWNrKXtcXG4gICAgICAgICAgICBsb2coXFxcIue9keermVxcXCIrcGxheVVybCtcXFwi56Gu5a6e5ZWl5Lmf5rKh6L+U5ZueXFxcIik7XFxuICAgICAgICAgICAgcmV0dXJuIGJhZFxcbiAgICAgICAgfWVsc2UgaWYoLyNFWFRJTkYvLnRlc3QoYmFjaykpe1xcbiAgICAgICAgICAgIC8vbGV0IGxjYWNoZT1cXFwiL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9jYWNoZS92aWRlby5tM3U4XFxcIjtcXG4gICAgICAgICAgICAvL3dyaXRlRmlsZShsY2FjaGUsYmFjayk7XFxuICAgICAgICAgICAgLy9yZXR1cm4gbGNhY2hlK1xcXCIjI1xcXCIrcGxheVVybCtcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiXFxuICAgICAgICAgICAgcGxheVVybD1jYWNoZU0zdTgocGxheVVybCk7XFxuICAgICAgICAgICAgcmV0dXJuIHBsYXlVcmxcXG4gICAgICAgIH1lbHNlIGlmKCghL+inpuWPkeS6humYsuebl+mTvnzmnKrmjojmnYN85o6l5Y+j6Ziy55uXLy50ZXN0KGJhY2spKSYmKCEvaHR0cHx1cmwvLnRlc3QoYmFjaykpJiYoIS9tc2d8Y29kZXxodG1sLy50ZXN0KGJhY2spKSl7XFxuICAgICAgICAgICAgbG9nKGJhY2spO1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/nlpHkvLzlr7nmlrnmlbDmja7liqDlr4bkuobvvIzlhbfkvZPmlbDmja7nnIvml6Xlv5cnXFxuICAgICAgICB9XFxuICAgIH1jYXRjaChlKXtcXG4gICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgcmV0dXJuIGJhZFxcbiAgICB9XFxuICAgIHRyeSB7XFxuICAgICAgICBiYWNrPUpTT04ucGFyc2UoYmFjayk7XFxuICAgICAgICBsZXQgcmVhbFVybD1iYWNrLnVybDtcXG4gICAgICAgIGlmKHR5cGVvZihyZWFsVXJsKT09XFxcInVuZGVmaW5lZFxcXCJ8fCFyZWFsVXJsKXtcXG4gICAgICAgICAgICBsb2coYmFjayk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+mBk+mVv+S7k+W6k+ino+aekOWksei0pe+8gei/lOWbnuaSreaUvuWcsOWdgOS4uuepulxcXCJcXG4gICAgICAgIH0gZWxzZSBpZih0eXBlb2YoaXNWaWRlbyhyZWFsVXJsLHJlY2hhbmdlKSk9PSdzdHJpbmcnKXtcXG4gICAgICAgICAgICByZXR1cm4gaXNWaWRlbyhyZWFsVXJsLHJlY2hhbmdlKTtcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiByZWFsVXJsK1xcXCIjaXNWaWRlbz10cnVlI1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICAvL2Vsc2V7XFxuICAgICAgICAvL3JlYWxVcmwrPVxcXCI7e1VzZXItQWdlbnRATW96aWxsYS81LjB9XFxcIjtcXG4gICAgICAgIC8vIH1cXG4gICAgfWNhdGNoIChlKSB7XFxuICAgICAgICBsb2coXFxcIuajgOa1i+WIsOino+aekOWPo+mdnmpzb27plJnor686XFxcIitlLm1lc3NhZ2UrJyzlvIDlp4t4NeWFjeWXheaOoicpO1xcbiAgICAgICAgbGV0IG1zID0gcGFyc2VJbnQobXMpfHw1MDAwO1xcbiAgICAgICAgbGV0IG1heF9jb3VudD1NYXRoLmNlaWwobXMvMjUwKTtcXG4gICAgICAgIGxvZyhcXFwi5pys5qyh5ZeF5o6i6LaF5pe2OlxcXCIrbXMrXFxcIuWFseiuoeW+heaKk+WMhTpcXFwiK21heF9jb3VudCtcXFwi5qyhXFxcIik7XFxuICAgICAgICBzaG93TG9hZGluZygn5ZeF5o6i5Lit77yM6Iul5aSx6LSl5bCx6YeN6KOFeDUuLi4nKTtcXG4gICAgICAgIGxldCBfeDUgPSAkLnRvU3RyaW5nKChpc1ZpZGVvLHJlY2hhbmdlLHBsYXlVcmwsbWF4X2NvdW50LFBDX1VBKT0+e1xcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGlmKHR5cGVvZihmYmEpPT0ndW5kZWZpbmVkJ3x8IWZiYSl7XFxuICAgICAgICAgICAgICAgICAgICB2YXIgZmJhID0gZnlfYnJpZGdlX2FwcDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mKHJlcXVlc3QpPT0ndW5kZWZpbmVkJ3x8IXJlcXVlc3Qpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWwoZmJhLmdldEludGVybmFsSnMoKSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGZiYS5wdXRWYXIoXFxcIl94NWp4VXJsXFxcIixwbGF5VXJsKTtcXG4gICAgICAgICAgICAgICAgaWYod2luZG93LmNvdW50ID09IG51bGwpe1xcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmNvdW50PTE7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFwiYm9keVxcXCIpLmlubmVyVGV4dDtcXG4gICAgICAgICAgICAgICAgaWYoL+inpuWPkeS6humYsuebl+mTvnzmnKrmjojmnYN85o6l5Y+j6Ziy55uXLy50ZXN0KHRleHQpJiZ3aW5kb3cuY291bnQ9PT0xKXtcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIuajgOa1i+WIsOacieaOiOadg++8jOW8gOWni+i/h+aOiOadg1xcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgLy9sb2NhdGlvbi5yZWxvYWQoKTtcXG4gICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLmhyZWY9ZmJhLmdldFZhcihcXFwiX3g1anhVcmxcXFwiKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB3aW5kb3cuY291bnQrKztcXG4gICAgICAgICAgICAgICAgLy8gZmJhLmxvZygnY291bnQ6Jyt3aW5kb3cuY291bnQrJyxtYXhfY291bnQ6JyttYXhfY291bnQpO1xcbiAgICAgICAgICAgICAgICBpZiggd2luZG93LmNvdW50ID49IG1heF9jb3VudCl7XFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCLotoXov4dcXFwiK21heF9jb3VudCoyNTArXFxcIuavq+enkuacquiOt+WPluWIsOi1hOa6kOWcsOWdgO+8jOi3s+WIsOa6kOe9kemhtSzku6XkuIvmmK/liqDovb3ov4fnmoTlnLDlnYBcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0PWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXFxcImJvZHlcXFwiKS5pbm5lclRleHQ7XFxuICAgICAgICAgICAgICAgICAgICAvLyBmYmEubG9nKHRleHQpO1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhKU09OLnN0cmluZ2lmeShfZ2V0VXJscygpKSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmJhLmdldFZhcihcXFwiX3g1anhVcmxcXFwiKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiBtdXRlTWUoZWxlbSkge1xcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLnBhdXNlKCk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHZhciB2aWRlb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCJ2aWRlb1xcXCIpLCBhdWRpb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCJhdWRpb1xcXCIpLCB2MiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcImVtYmVkXFxcIiksIHYzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiI3BsYXllclxcXCIpO1xcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHZpZGVvcywgZnVuY3Rpb24gKHZpZGVvKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKHZpZGVvKTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKGF1ZGlvcywgZnVuY3Rpb24gKGF1ZGlvKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKGF1ZGlvKTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYyLCBmdW5jdGlvbiAodikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKHYzLCBmdW5jdGlvbiAodikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICAgICAgICAgICAgICB2YXIgdXJscyA9IF9nZXRVcmxzKCk7XFxuICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coSlNPTi5zdHJpbmdpZnkodXJscykpO1xcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIHVybHMpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdT11cmxzW2ldO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeXt1PWRlY29kZVVSSUNvbXBvbmVudCh1KTt9Y2F0Y2goZSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU9dW5lc2NhcGUodSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYoL3VybD1odHRwLy50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IHUuc3BsaXQoXFxcInVybD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcInVybOWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKC91cmw9XFxcXC8vLnRlc3QodSkmJi9cXFxcLm0zdTgvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaG9zdCA9IHUubWF0Y2goLyguKilcXFxcL1xcXFwvKC4qPylcXFxcLy8pWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gaG9zdCt1LnNwbGl0KFxcXCJ1cmw9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCJ1cmzliIblibI6XFxcIit1KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvdmlkPWh0dHAvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFwidmlkPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwidmlk5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3ZpZD1cXFxcLy8udGVzdCh1KSYmL1xcXFwubTN1OC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3N0ID0gdS5tYXRjaCgvKC4qKVxcXFwvXFxcXC8oLio/KVxcXFwvLylbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBob3N0K3Uuc3BsaXQoXFxcInZpZD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcInZpZOWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC9cXFxcPyguKik9aHR0cC8udGVzdCh1KSYmL1xcXFwubTN1OC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBcXFwiaHR0cFxcXCIrdS5zcGxpdCgvXFxcXD8oLiopPWh0dHAvKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIuWFtuS7luWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3xpbmRleFxcXFwubTN1OCRcXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC9cXFxcLzFcXFxcLm0zdTgvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICB1PXUucmVwbGFjZSgvJmZyb209Lip8Jm5leHQ9Lip8Jmp1bXA9LiovLCcnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhbFVybCA9IGlzVmlkZW8odSxyZWNoYW5nZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mKHJlYWxVcmwpPT0nc3RyaW5nJyl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIuS7k+W6k3g15YWN5ZeF57uT5p6cOlxcXCIrcmVhbFVybCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZnlfYnJpZGdlX2FwcC5zZXRXZWJVYShQQ19VQSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsVXJsXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIC8vIGZ5X2JyaWRnZV9hcHAubG9nKCd4NeWkp+iMg+WbtOmUmeivrzonK2UubWVzc2FnZSk7XFxuICAgICAgICAgICAgICAgIGFsZXJ0KCd4NeWkp+iMg+WbtOmUmeivrzonK2UubWVzc2FnZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/miqXplJnnu5PmnZ94NSdcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LGlzVmlkZW8scmVjaGFuZ2UscGxheVVybCxtYXhfY291bnQsUENfVUEpO1xcbiAgICAgICAgY29uc3QgbHNnPSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xvY2FsU3RvcmFnZT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICAgICAgbGV0IHVzZVdlYj1sc2cuZ2V0SXRlbShcXFwi6YCa5YWNXFxcIixcXFwiWDVcXFwiKT09PVxcXCJXRUJcXFwiO1xcbiAgICAgICAgLy9sb2coXFxcIuS7k+W6k+S9v+eUqHdlYumAmuWFjeabv+S7o3g1OlxcXCIrdXNlV2ViKTtcXG4gICAgICAgIGxldCBydWxlSGVhZD11c2VXZWImJnBhcnNlSW50KGdldEFwcFZlcnNpb24oKSk+PTIzMzk/XFxcIndlYlJ1bGU6Ly9cXFwiOlxcXCJ4NVJ1bGU6Ly9cXFwiO1xcbiAgICAgICAgbGV0IHg1VXJsID0gcnVsZUhlYWQrcGxheVVybCsgJ0AnICtfeDU7XFxuICAgICAgICByZXR1cm4geDVVcmxcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiB4NVBhcnNlUHJvKHg1bGlzdCx4NVRpbWVvdXQsaXNWaWRlbyl7XFxuICAgIGxldCBicGF0aCA9ICdmaWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9ydWxlcy9kekhvdXNlL2h0bWwv5rW36ZiU5ZeF5o6i5ZmoLmh0bWwnO1xcbiAgICBsZXQgYmNvZGUgPSBmZXRjaChicGF0aCk7XFxuICAgIGlmKCFiY29kZXx8IS9meV9icmlkZ2VfYXBwLy50ZXN0KGJjb2RlKSl7XFxuICAgICAgICBsb2coJ+acrOWcsOacquWuieijheWXheaOouWZqO+8jOW8gOWni+WuieijhScpO1xcbiAgICAgICAgY29uc3Qge2FwaX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgICAgIHdyaXRlRmlsZShicGF0aCxmZXRjaChhcGkuaG9zdCsnL3J1bGVsaXN0Lmpzb24/aWQ9MjA1NScpKTtcXG4gICAgfVxcbiAgICB4NVRpbWVvdXQgPSBwYXJzZUludCh4NVRpbWVvdXQpfHw1MDAwO1xcbiAgICBsZXQgbWF4X2NvdW50PSh4NVRpbWVvdXQvMjUwKTsgLy/moLnmja7otoXml7boh6rliqjorqHnrpfkuoblj6/miafooYznmoTmrKHmlbBcXG4gICAgcHV0VmFyKCd4NUxpc3QnLEpTT04uc3RyaW5naWZ5KHg1bGlzdCkpO1xcbiAgICBsZXQgX3g1ID0gJC50b1N0cmluZygoaXNWaWRlbywgbWF4X2NvdW50LHg1VGltZW91dCkgPT4ge1xcbiAgICAgICAgLy/liJ3lp4vljJZmYmHlkoxyZXF1c3RcXG4gICAgICAgIGlmICh0eXBlb2YgKGZiYSkgPT0gJ3VuZGVmaW5lZCcgfHwgIWZiYSkge1xcbiAgICAgICAgICAgIHZhciBmYmEgPSBmeV9icmlkZ2VfYXBwO1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBpZiAodHlwZW9mIChyZXF1ZXN0KSA9PSAndW5kZWZpbmVkJyB8fCAhcmVxdWVzdCkge1xcbiAgICAgICAgICAgICAgICBldmFsKGZiYS5nZXRJbnRlcm5hbEpzKCkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSk7XFxuICAgICAgICB9XFxuICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBpZiAod2luZG93LmNvdW50ID09IG51bGwpIHtcXG4gICAgICAgICAgICAgICAgd2luZG93LmNvdW50ID0gMTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFwiYm9keVxcXCIpLmlubmVyVGV4dDtcXG4gICAgICAgICAgICBpZigv6Kem5Y+R5LqG6Ziy55uX6ZO+fOacquaOiOadg3zmjqXlj6PpmLLnm5cvLnRlc3QodGV4dCkmJndpbmRvdy5jb3VudD09MSl7XFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xcbiAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCLmo4DmtYvliLDmnInmjojmnYPvvIzlvIDlp4vov4fmjojmnYNcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgd2luZG93LmNvdW50Kys7XFxuICAgICAgICAgICAgLy8gZmJhLmxvZygnY291bnQ6JyArIHdpbmRvdy5jb3VudCArICcsbWF4X2NvdW50OicgKyBtYXhfY291bnQpO1xcbiAgICAgICAgICAgIGlmICh3aW5kb3cuY291bnQgPj0gbWF4X2NvdW50KSB7XFxuICAgICAgICAgICAgICAgIGZiYS5jbGVhclZhcigneDVMaXN0Jyk7XFxuICAgICAgICAgICAgICAgIGZiYS5oaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICBsZXQgZm1zZyA9ICfpgZPplb/ku5PlupPpgJrlhY3op6PmnpDlpLHotKUs5Y6f5ZugOui2heaXticreDVUaW1lb3V0Kyfmr6vnp5InO1xcbiAgICAgICAgICAgICAgICBmYmEubG9nKGZtc2cpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytmbXNnO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGZ1bmN0aW9uIG11dGVNZShlbGVtKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgZWxlbS5wYXVzZSgpO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuXFxuICAgICAgICB2YXIgdmlkZW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwidmlkZW9cXFwiKSwgYXVkaW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiYXVkaW9cXFwiKSxcXG4gICAgICAgICAgICB2MiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcImVtYmVkXFxcIiksIHYzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiI3BsYXllclxcXCIpO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodmlkZW9zLCBmdW5jdGlvbiAodmlkZW8pIHtcXG4gICAgICAgICAgICAgICAgbXV0ZU1lKHZpZGVvKTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKGF1ZGlvcywgZnVuY3Rpb24gKGF1ZGlvKSB7XFxuICAgICAgICAgICAgICAgIG11dGVNZShhdWRpbyk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2MiwgZnVuY3Rpb24gKHYpIHtcXG4gICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjMsIGZ1bmN0aW9uICh2KSB7XFxuICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIH1cXG4gICAgICAgIHZhciB1cmxzID0gX2dldFVybHMoKTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB1cmxzKSB7XFxuICAgICAgICAgICAgICAgIGxldCB1PXVybHNbaV07XFxuICAgICAgICAgICAgICAgIC8vdT1kZWNvZGVVUklDb21wb25lbnQodSk7XFxuICAgICAgICAgICAgICAgIHRyeXt1PWRlY29kZVVSSUNvbXBvbmVudCh1KTt9Y2F0Y2goZSl7XFxuICAgICAgICAgICAgICAgICAgICB1PXVuZXNjYXBlKHUpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmKC91cmw9aHR0cC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFwidXJsPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoL3ZpZD1odHRwLy50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgIHUgPSB1LnNwbGl0KFxcXCJ2aWQ9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZigvXFxcXD8oLiopPWh0dHAvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgdSA9IFxcXCJodHRwXFxcIit1LnNwbGl0KC9cXFxcPyguKik9aHR0cC8pLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIC8vZmJhLmxvZyhcXFwi5YW25LuW5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKC9cXFxcLzFcXFxcLm0zdTgkLy50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHU9dS5yZXBsYWNlKC8mZnJvbT0uKnwmbmV4dD0uKnwmanVtcD0uKi8sJycpO1xcbiAgICAgICAgICAgICAgICBsZXQgcmVhbFVybCA9IGlzVmlkZW8odSk7XFxuICAgICAgICAgICAgICAgIGlmIChyZWFsVXJsKSB7XFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCLku5PlupN4NeWFjeWXhee7k+aenDpcXFwiICsgcmVhbFVybCk7XFxuICAgICAgICAgICAgICAgICAgICBmYmEuY2xlYXJWYXIoJ3g1TGlzdCcpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxVcmxcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSlcXG4gICAgICAgIH1cXG4gICAgfSwgaXNWaWRlbywgbWF4X2NvdW50LHg1VGltZW91dCk7XFxuICAgIGNvbnN0IGxzZz0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9sb2NhbFN0b3JhZ2U/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IHVzZVdlYj1sc2cuZ2V0SXRlbShcXFwi6YCa5YWNXFxcIixcXFwiWDVcXFwiKT09PVxcXCJXRUJcXFwiO1xcbiAgICAvL2xvZyhcXFwi5LuT5bqT5L2/55Sod2Vi6YCa5YWN5pu/5LujeDU6XFxcIit1c2VXZWIpO1xcbiAgICBsZXQgcnVsZUhlYWQ9dXNlV2ViJiZwYXJzZUludChnZXRBcHBWZXJzaW9uKCkpPj0yMzM5P1xcXCJ3ZWJSdWxlOi8vXFxcIjpcXFwieDVSdWxlOi8vXFxcIjtcXG4gICAgcmV0dXJuIHJ1bGVIZWFkK2JwYXRoKydAJyArIF94NTtcXG59XFxuXFxuZnVuY3Rpb24gTGF6eVBhcnNlRmFzdChwbGF5VXJsTGlzdCxnZXRUaW1lb3V0LHg1VGltZW91dCl7XFxuICAgIGNvbnN0IHtpc1ZpZGVvLGdldEhlYWRlcnMseDVQYXJzZVByb30gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9nbG9iYWxQYXJzZT9ydWxlPemBk+mVv+S7k+W6k1BybycpO1xcbiAgICAvLyBsb2coJ+W8gOWni+aJp+ihjCcrcGxheVVybExpc3QubGVuZ3RoKyfkuKrlnLDlnYDnmoTmibnph4/ll4XmjqI6JytwbGF5VXJsTGlzdCk7XFxuICAgIGxvZygn5byA5aeL5omn6KGMJytwbGF5VXJsTGlzdC5sZW5ndGgrJ+S4quWcsOWdgOeahOaJuemHj+WXheaOoicpO1xcbiAgICBsZXQgcGxheVVybHMgPSBwbGF5VXJsTGlzdC5tYXAoKGl0KT0+e1xcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICB1cmw6aXQuc3BsaXQoXFxcIjtcXFwiKVswXSxcXG4gICAgICAgICAgICBvcHRpb25zOiB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIC8vXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiRGFydC8yLjEzIChkYXJ0OmlvKVxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6XFxcIk1vemlsbGEvNS4wXFxcIlxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiBnZXRUaW1lb3V0XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgbGV0IGJodG1sID0gYmF0Y2hGZXRjaChwbGF5VXJscyk7XFxuICAgIGxldCB2aWRlb3MgPSBbXTtcXG4gICAgbGV0IHg1bGlzdCA9IFtdO1xcbiAgICBmb3IobGV0IGkgaW4gYmh0bWwpe1xcbiAgICAgICAgbGV0IG9yZGVyID0gcGFyc2VJbnQoaSkrMTtcXG4gICAgICAgIGxldCB0bmFtZT1vcmRlcisn5Y+36Kej5p6Q572R5Z2AOic7XFxuICAgICAgICAvL2xvZyh0bmFtZSk7XFxuICAgICAgICBsZXQgdHVybD1wbGF5VXJsTGlzdFtpXS5zcGxpdChcXFwiO1xcXCIpWzBdO1xcbiAgICAgICAgbGV0IGpuYW1lPXBsYXlVcmxMaXN0W2ldLnNwbGl0KFxcXCI7XFxcIikubGVuZ3RoPjE/cGxheVVybExpc3RbaV0uc3BsaXQoXFxcIjtcXFwiKVsxXTpcXFwiXFxcIjtcXG4gICAgICAgIHRuYW1lKz1qbmFtZTtcXG4gICAgICAgIGxldCBiYWNrY29kZSA9IGJodG1sW2ldO1xcbiAgICAgICAgaWYoKCEvdXJsfGh0dHAvLnRlc3QoYmFja2NvZGUpKSYmKCEvI0VYVElORi8udGVzdChiYWNrY29kZSkpKXtcXG4gICAgICAgICAgICBsb2codG5hbWUrdHVybCsn5pyJ6Zeu6aKYLOWPr+iDveWKoOWvhuaIluiAheaMguS6hicpO1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgfWVsc2UgaWYoLyNFWFRJTkYvLnRlc3QoYmFja2NvZGUpKXtcXG4gICAgICAgICAgICAvL2xldCBsY2FjaGU9XFxcIi9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5leGFtcGxlLmhpa2Vydmlldy9maWxlcy9Eb2N1bWVudHMvY2FjaGUvdmlkZW9fXFxcIit0bmFtZStcXFwiLm0zdThcXFwiO1xcbiAgICAgICAgICAgIC8vd3JpdGVGaWxlKGxjYWNoZSxiYWNrY29kZSk7XFxuICAgICAgICAgICAgLy92aWRlb3MucHVzaChsY2FjaGUpO1xcbiAgICAgICAgICAgIGxldCBwVXJsPWNhY2hlTTN1OCh0dXJsKTtcXG4gICAgICAgICAgICB2aWRlb3MucHVzaChwVXJsKTtcXG4gICAgICAgICAgICBjb250aW51ZTtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9IEpTT04ucGFyc2UoYmFja2NvZGUpLnVybDtcXG4gICAgICAgICAgICBpZigvXmh0dHAvLnRlc3QodXJsKSl7XFxuICAgICAgICAgICAgICAgIGxldCByZWFsVmlkZW8gPSBpc1ZpZGVvKHVybCk7XFxuICAgICAgICAgICAgICAgIGlmKHR5cGVvZihyZWFsVmlkZW8pPT0nc3RyaW5nJyl7XFxuICAgICAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+W3suino+aekOWHuuinhumikTonK3JlYWxWaWRlbyk7XFxuICAgICAgICAgICAgICAgICAgICBpZihqbmFtZSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFZpZGVvKz1cXFwi4piFXFxcIitqbmFtZVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9zLnB1c2gocmVhbFZpZGVvKTtcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+ino+aekOWHuuS4jeefpemBk+S7gOS5iOS4nOilvzonK3VybCk7XFxuICAgICAgICAgICAgICAgICAgICB1cmwrPVxcXCIjaXNWaWRlbz10cnVlI1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICBpZihqbmFtZSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsKz1cXFwi4piFXFxcIitqbmFtZVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9zLnB1c2godXJsKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICBsb2codG5hbWUrJ+S4umpzb27mjqXlj6PkuJTml6Dov5Tlm57op4bpopHlnLDlnYDmlbDmja46JytwbGF5VXJsTGlzdFtpXSsnXFxcXG4nK2JhY2tjb2RlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2codG5hbWUrJ+S4ung15o6l5Y+jLOWKoOWFpXg15ZeF5o6i5YiX6KGoJyk7XFxuICAgICAgICAgICAgeDVsaXN0LnB1c2gocGxheVVybExpc3RbaV0pO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIC8vIGxvZyh2aWRlb3MpO1xcbiAgICBpZih2aWRlb3MubGVuZ3RoPjApe1xcbiAgICAgICAgaWYoZ2V0VmFyKCdkcC5jYWNoZVZpZGVvJywndHJ1ZScpPT09J3RydWUnJiZwYXJzZUludChnZXRBcHBWZXJzaW9uKCkpPj0yMjU1KVxcbiAgICAgICAge1xcbiAgICAgICAgICAgIGxvZyhcXFwi5bCK5pWs55qE6a2U5pat55So5oi377yM6KeG6aKR57yT5a2Y5bey5ZCv55So77yM6K+35bC95oOF5Lqr5Y+X55yL5Ymn5pe25YWJXFxcIik7XFxuICAgICAgICAgICAgbGV0IHZpZGVvc0NhY2hlPXZpZGVvcy5tYXAoKGl0KT0+e1xcbiAgICAgICAgICAgICAgICBsZXQgaGVhZGVycz17fTtcXG4gICAgICAgICAgICAgICAgaWYoaXQuc3BsaXQoXFxcIjtcXFwiKS5sZW5ndGg+MSl7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZCA9IGl0LnNwbGl0KCc7JylbMV07XFxuICAgICAgICAgICAgICAgICAgICBpZigvQC8udGVzdChoZWFkKSYmL3t8fS8udGVzdChoZWFkKSl7XFxuLy9oZWFkID0gaGVhZC5yZXBsYWNlKC97fH0vZywnJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCA9IGhlYWQuc3BsaXQoXFxcIntcXFwiKVsxXS5zcGxpdChcXFwifVxcXCIpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgPSBoZWFkLnNwbGl0KCcmJicpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcihsZXQgaSBpbiBoZWFkKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IGhlYWRbaV0uc3BsaXQoJ0AnKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID1oZWFkW2ldLnNwbGl0KCdAJylbMV0ucmVwbGFjZSgvOy8sJ++8m++8mycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzW2tleV0gPSB2YWx1ZTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgICAgICAgICAgIHVybDppdC5zcGxpdChcXFwiO1xcXCIpWzBdLnNwbGl0KFxcXCLimIVcXFwiKVswXSxcXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6e1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6aGVhZGVyc1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgdmFyIGRhdGE9YmF0Y2hDYWNoZU0zdTgodmlkZW9zQ2FjaGUpO1xcbiAgICAgICAgICAgIGRhdGE9ZGF0YS5tYXAoKGl0LGlkKT0+e1xcbiAgICAgICAgICAgICAgICBsZXQgZXh0cmE9XFxcIlxcXCI7XFxuICAgICAgICAgICAgICAgIGlmKHZpZGVvc1tpZF0uc3BsaXQoXFxcIjtcXFwiKS5sZW5ndGg+MSl7XFxuICAgICAgICAgICAgICAgICAgICBleHRyYT1cXFwiO1xcXCIrdmlkZW9zW2lkXS5zcGxpdChcXFwiO1xcXCIpWzFdO1xcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZih2aWRlb3NbaWRdLnNwbGl0KFxcXCLimIVcXFwiKS5sZW5ndGg+MSl7XFxuICAgICAgICAgICAgICAgICAgICBleHRyYT1cXFwi4piFXFxcIit2aWRlb3NbaWRdLnNwbGl0KFxcXCLimIVcXFwiKVsxXTtcXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICBpZihpdCtcXFwiXFxcIiE9XFxcIm51bGxcXFwiKXtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdCtleHRyYVxcbiAgICAgICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2aWRlb3NbaWRdXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAvL2xvZyhkYXRhKTtcXG4gICAgICAgICAgICByZXR1cm4gZGF0YVxcbiAgICAgICAgICAgIC8vcmV0dXJuIHZpZGVvc1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuIHZpZGVvc1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxvZygn5YWx5pyJJyt4NWxpc3QubGVuZ3RoKyfkuKp4NeWcsOWdgOi/m+ihjOi9rua1geWXheaOoicpO1xcbiAgICAvL+ayoeacieeahOivneWwseW8gOWni+S+neasoXg15ZeF5o6iXFxuICAgIHNob3dMb2FkaW5nKCfll4XmjqLkuK3vvIzoi6XlpLHotKXlsLHph43oo4V4NS4uLicpO1xcbiAgICByZXR1cm4geDVQYXJzZVBybyh4NWxpc3QseDVUaW1lb3V0LGlzVmlkZW8pO1xcbn1cXG52YXIgbGF6eT0kKCcnKS5sYXp5UnVsZSgoKT0+e1xcbiAgICB0cnl7XFxuICAgICAgICByZWFsVXJsPWlucHV0O1xcbiAgICAgICAgZXZhbChcXFwidmFyIGNvbmZpZyA9XFxcIiArIGZldGNoKFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL015UGFyc2VTZXQuanNvblxcXCIpKTtcXG4gICAgICAgIGV2YWwoZmV0Y2goY29uZmlnLmNqKSk7XFxuICAgICAgICBsb2coaW5wdXQrJy0+5q2j5Zyo5pat5o+S6a2U5pS554mI6Kej5p6QLi4uJyk7XFxuICAgICAgICAvLyDliqDlhaXotoXml7borr7nva7vvIzlu7rorq7lnKjpppbpobXorr7nva5cXG4gICAgICAgIHJldHVybiBheXRtUGFyc2UocmVhbFVybClcXG4gICAgfWNhdGNoKGUpe1xcbiAgICAgICAgcmV0dXJuIGlucHV0XFxuICAgIH1cXG59KTtcXG4kLmV4cG9ydHMuaXNQaWM9aXNQaWM7XFxuJC5leHBvcnRzLmlzVmlkZW89aXNWaWRlbztcXG4kLmV4cG9ydHMuY29tUGFyc2U9Y29tUGFyc2U7XFxuJC5leHBvcnRzLmdldEhlYWRlcnM9Z2V0SGVhZGVycztcXG4kLmV4cG9ydHMubGF6eVBhcnNlPWxhenlQYXJzZTtcXG4kLmV4cG9ydHMueDVQYXJzZVBybz14NVBhcnNlUHJvO1xcbiQuZXhwb3J0cy5MYXp5UGFyc2VGYXN0PUxhenlQYXJzZUZhc3Q7XFxuJC5leHBvcnRzLmxhenk9bGF6eTtcIn0se1wibmFtZVwiOlwi5Lu75Yqh5LuT5bqT5o6l5Y+jXCIsXCJwYXRoXCI6XCJ0YXNrQ2FsbFwiLFwicnVsZVwiOlwianM6XFxuU3RyaW5nLnByb3RvdHlwZS5zdHJpcCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMucmVwbGFjZSgvKF5cXFxccyopfChcXFxccyokKS9nLCBcXFwiXFxcIik7IH07XFxuZnVuY3Rpb24gdGFza19yZXEodGFza19hcGksdGFzaykgeyAvLyDpgJrnlKjlj5HpgIHku5PlupNwb3N06LCD55So5Lu75Yqh6K+35rGCXFxuICAgIGNvbnN0IHtnZXRGaWxlfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxuICAgIGlmKCFob3VzZUZpbGUpe1xcbiAgICAgICAgc2V0SXRlbSgnaXNfaG91c2VfdmlwJywgJ2ZhbHNlJyk7XFxuICAgIH1cXG4gICAgbGV0IGhvdXNlX2RhdGEgPSBob3VzZUZpbGUoKTtcXG4gICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QodGFza19hcGksIHtcXG4gICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICB9LFxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgIFxcXCJkYXRhXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInR5cGVcXFwiOiB0YXNrLm1vZGV8fCdydW4nLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcImZ1bmNcXFwiOiB0YXNrLmZ1bmN8fCcnLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHRhc2sucGFyYW1zfHxbXVxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYXV0aFxcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogaG91c2VfZGF0YS51c2VybmFtZXx8XFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBob3VzZV9kYXRhLnBhc3N3b3JkfHxcXFwiXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSksXFxuICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICB9KTtcXG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxufVxcblxcbmZ1bmN0aW9uIHRhc2tfdXBsb2FkKHRhc2speyAvLyDpgJrnlKjku7vliqHlj5HluIPmlrDlop7lj4rkv67mlLnlip/og71cXG4gICAgY29uc3Qge2FwaSxnZXRGaWxlfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxuICAgIGlmKCFob3VzZUZpbGUpe1xcbiAgICAgICAgc2V0SXRlbSgnaXNfaG91c2VfdmlwJywgJ2ZhbHNlJyk7XFxuICAgIH1cXG4gICAgbGV0IGFwaV91cmwgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svYWRkJztcXG4gICAgbGV0IGhvdXNlX2RhdGEgPSBob3VzZUZpbGUoKTtcXG4gICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoYXBpX3VybCwge1xcbiAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgIH0sXFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgXFxcImRhdGFcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IHRhc2submFtZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJweWNvZGVcXFwiOiB0YXNrLnB5Y29kZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJub3RlXFxcIjogdGFzay5ub3RlLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInRlc3RfY29kZVxcXCI6IHRhc2sudGVzdF9jb2RlLFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBcXFwiYXV0aFxcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogaG91c2VfZGF0YS51c2VybmFtZXx8XFxcIlxcXCIsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBob3VzZV9kYXRhLnBhc3N3b3JkfHxcXFwiXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSksXFxuICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICB9KTtcXG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxufVxcblxcbmZ1bmN0aW9uIHRhc2tfY2FsbChpZCxmdW5jLHBhcmFtcyl7XFxuICAgIGNvbnN0IHthcGl9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9ydW4vJytpZDtcXG4gICAgbGV0IHRhc2sgPSB7XFxuICAgICAgICBtb2RlOidjYWxsJyxcXG4gICAgICAgIGZ1bmM6ZnVuYyxcXG4gICAgICAgIHBhcmFtczpwYXJhbXN8fFtdXFxuICAgIH07XFxuICAgIHJldHVybiB0YXNrX3JlcSh0YXNrX2FwaSx0YXNrKTtcXG59XFxuXFxuZnVuY3Rpb24gdGFza19yZW5hbWUoaWQsbmV3X3Rhc2tfbmFtZSl7XFxuICAgIGNvbnN0IHthcGksZ2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcbiAgICBpZighaG91c2VGaWxlKXtcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcbiAgICB9XFxuICAgIGxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9yZW5hbWUvJytpZDtcXG4gICAgdGFza19hcGkgPSB0YXNrX2FwaSsnP25hbWU9Jytob3VzZV9kYXRhLnVzZXJuYW1lKycmcGFzc3dvcmQ9Jytob3VzZV9kYXRhLnBhc3N3b3JkKycmdGFza19uYW1lPScrbmV3X3Rhc2tfbmFtZTtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGZldGNoKHRhc2tfYXBpLHt9KSk7XFxuICAgICAgICBpZihyZXN1bHQuc3RhdHVzPT0wKXtcXG4gICAgICAgICAgICByZXR1cm4gIHJlc3VsdC5kZXRhaWxcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzdWx0KycnK3Jlc3VsdC5kZXRhaWxcXG4gICAgICAgIH1cXG4gICAgfWNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS5tZXNzYWdlKTtcXG4gICAgICAgIHJldHVybiAnJytlLm1lc3NhZ2VcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiB0YXNrX2NoYW5nZV9zdGF0ZShpZCl7XFxuICAgIGNvbnN0IHthcGksZ2V0RmlsZX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcbiAgICBpZighaG91c2VGaWxlKXtcXG4gICAgICAgIHNldEl0ZW0oJ2lzX2hvdXNlX3ZpcCcsICdmYWxzZScpO1xcbiAgICB9XFxuICAgIGxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxuICAgIGxldCB0YXNrX2FwaSA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9jaGFuZ2Vfc3RhdGUvJytpZDtcXG4gICAgdGFza19hcGkgPSB0YXNrX2FwaSsnP25hbWU9Jytob3VzZV9kYXRhLnVzZXJuYW1lKycmcGFzc3dvcmQ9Jytob3VzZV9kYXRhLnBhc3N3b3JkO1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoZmV0Y2godGFza19hcGkse30pKTtcXG4gICAgICAgIGlmKHJlc3VsdC5zdGF0dXM9PTApe1xcbiAgICAgICAgICAgIHJldHVybiAgcmVzdWx0LmRldGFpbFxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQrJycrcmVzdWx0LmRldGFpbFxcbiAgICAgICAgfVxcbiAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgcmV0dXJuICcnK2UubWVzc2FnZVxcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIHRhc2tfcnVuKGlkKXtcXG4gICAgY29uc3Qge2FwaX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IHRhc2tfYXBpID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL3J1bi8nK2lkO1xcbiAgICBsZXQgdGFzayA9IHt9O1xcbiAgICByZXR1cm4gdGFza19yZXEodGFza19hcGksdGFzayk7XFxufVxcblxcbiQuZXhwb3J0cy50YXNrQ2FsbCA9IHRhc2tfY2FsbDtcXG4kLmV4cG9ydHMudGFza1J1biA9IHRhc2tfcnVuO1xcbiQuZXhwb3J0cy50YXNrUmVxID0gdGFza19yZXE7XFxuJC5leHBvcnRzLnRhc2tVcGxvYWQgPSB0YXNrX3VwbG9hZDtcXG4kLmV4cG9ydHMudGFza1JlbmFtZSA9IHRhc2tfcmVuYW1lO1xcbiQuZXhwb3J0cy50YXNrQ2hhbmdlU3RhdGUgPSB0YXNrX2NoYW5nZV9zdGF0ZTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWFqOWxgOWCqOWtmFwiLFwicGF0aFwiOlwibG9jYWxTdG9yYWdlXCIsXCJydWxlXCI6XCJsZXQgbG9jYWxTdG9yYWdlID0gKGZ1bmN0aW9uKCkge1xcbiAgICBldmFsUHJpdmF0ZUpTKFxcXCJqd1VLd05UaVBHY1dTTENYQjVYdEFYd2I2TFFiVnlIRCswWEo3bDA3Y2UwPVxcXCIpO1xcbiAgICAvL3BhdGh0bz11bmRlZmluZWQ7XFxuICAgIGV2YWxQcml2YXRlSlMoXFxcIjRDMFl4UlluR0NZa2dGUlh0cGwvQ3o1ekw1aGg0akNDenRiK25nK1dva3ltUThvVXJ6UzlsQTh5eEM1YUZhZG5TRW15SEtNYnJhZmxScVhDbk5SSERsazZ1ZTh5SFRPMTZsQlBycHdnczVqZjBQaHJBdG9USklFMFpIbjltS2FRNEpkMmVycWI0STU1YmVXSWV1Z0tzRHMyMTFTeklOUTV5SmdTaDFkVnVOenp4UkdKZzQwRm1UdVZtWFZmTjF4ZzJXSUdIQkVta1ZuR3htT1JoUE9OQStRNVZ3UG1kcDQxL2h6ZTNlSXNVdmhvN1ZDQmdLNHJhSm1QYWxJUkJCVmxDVmduOEZrV21mS3FabytWVytvQmNIN2hyY3JzU2xDU2pCYW5nVC83c3lXSHhLWWhlaFUwa2FNWWpuV0ZnMUVtMGNtTlJ0b21Dc0h6MUI4cTMyT2VRSG9hd2RXeHpLT2FNSE9YREJqUm9qQThFL2FoMFdST3l6aXFSU3hsL204ZGhCZDBmOXBoWXovNVNVL3pKRDUyWC85RUMxNldWVmRwU1czM2FrUkhSc2xQcFJsVFdGOStBeVJtUncwZVpPRXMxbzlRTVBBUVVmQXhiWXlGSGd6dHcvTzJkSlJwSHlUbWlCaWFhcVRjaXZ4NnY5enl2QnowNHdJMUFhU0N1aStkVHVVM2x1NXhkRXQzQWp0NlozaURYT1ZjRVAwRURGNzQ3NFBRVTZKRVp1d2U5N1NjaDRiaTF3QjFYSFpTZkl0ZGxZWW9HZWQzTExwYm1EQUlSY2l2MHJBb3A4Vm1RY1R0MkszTGZoMVJEWVkwWXR2UmNINDlPdnBEUkgveGE1RmM4TVkzRHJGb0E3cWNvRjRlQ2dpVkJmQmdKUjY4K0xwUUs3dE9rZzhrOWVjKzNOU3hKVGhjbDhkNnlOd3hUOVRrMTd6ZUpnZDZNb3lZWklwV1FMbEY2WXZiT2RFV2hqbW5BNzh3QzBoV3orWG02aFFNU3F0RncrYmhGZjdjQkdVM2FhdFBGbWRDWTJFZFhmaDBJWVc4NXdkT3lNZml3VzcvdlZUcDlpRTAwSTNGMDl3R0hrR0toVmJMdWVBa1llN3p6SlhSN3RoYUZvcjZIN3FMbUpqYlJRazlldk50QlFYTlI3RGlmaVh1UWYybHQ3bk9IODBTV20xZkRISHpqbVBzTklwczJUWEdUK2l3VlY2OWcvdFdpcFZRNkQ4QlR4K2NDUXA0N25tVElyWStxTjRraDJGWWg1TGx3WGRnSXl5MVZJdUMzeDA1M2V3QUlJVW1sWTluaUVwcVl0KzFmRlBYT0N0Q0d0WWJTZDM3dlZSMUVPajJrNUd1Lys5SldnMnF2d2wxdHdlbGcxSjB0eGFySWk0a1RiVHJ2cm5GTE45MnBvZnBaUVVmb1dvNGNlN0hXTmRidTRKS0VyYUxRVWZkZkdFUGQxVEl1ZnV1UlZhMzllcTlHWnlTRHVCTDYwTVBkbGR4S3cxem8rZkI1WlkrWU1qM0xMMmdHdERiczk4K0FzUlY5TEpXbVVtc3g5MWhtSnRGVU1XRDN4bmo4SE1aV3MwTlBsQ0ZVcjk0ODVLcVRwbzVrUnpHZkYray9ObDJKenJ2NWN2a3F0VW5MZ0twWEVPai9zZS9vRHpPQXJRS0k1VE5VYnZZd2N3Y2Rqak1TZmpLNjhLcndocytuNlNtV1o0WmRnUkhnQUs1TW9GaTNYbUxWNDdQM3ZTUld1NXp5RXNNazR5M3V1Q0ZpdVJQUmx1NFE1cEp2dU9lbTdIN1VMaUloQ2VtdjVEZ2tHdERMMWNHTDRFUWhZUkI2SVN6VnZzYjJFYVA5d1FFNkRWUm5NN08rcG5TemV0Nmx6cDNwRmRHbmJveDFMUmZDNjB1dFhaK0NqSW00aUVNbXRiQjJONXpEU2hHYmVNM1hVYkpRZENCaXM4WElyaGgyYmlCNWhCQ1Z3bjNZM2V0dDdHRFBWdG9pMUdSanorSmJnTStZUjkyOEtiZFdTNXRGYU1NM0tqM1h2Nm90SXh6TUJuREM5dVczZCtJWHg2dkxQSjBKUnVoM3lQN3BUbGE2YzNpUjRwOW5XWURxSitaU21wckhGbkRPenNMV21GamFwamUvTXF3TUpkNlRrM25BV3dpY01PUHVZcE15cUlGMDRmbDRtcWd0c0hMU01XUlJOSFBaakVUUTlnUm1lRFllNmFSdGxXMDJxTDJvbERFTnFMUU10QWRvaXJOV1JjUDlWTDNUZDhIYVVPNmZTbEdOYWJNYWtKRC8wMFhDaE9TVU9JUCs3Zk03VjAvbDFiTFdQdEV6MWk3THlnVFY3cGRHb0RudHFTQ0VuSnJCeWhCQXpMUmc1UUljOTQzOEloS215Zm4wLzNhd29EMUlyNzgwZXlwL1hjSTZ4TmN3NlR2L0VUZkhnMGU3aVlDMFVZY0pJRTVRVVh2MHMrWW9HSUVxNUdJekt1YjhITmpTVFVwc3Zua1Z4K2RiZTJqUm4zWWI5VzdKQ1o1WVM2RjVNeVVWc3BqTUQ3TlljK0RXalVMMmIyc1Z5QWZlWXBDOFVoYWg5dHVtYXZiQnY3YTNhOWtnRmJxNThsckh4elk3aUpRVmlnenEzZTFhMkJTYjBQY1cxYUo4QkQ3TmtOcGhLWWF5VHh5a2d3aWxFUkw4anFxQkVuaUhWZEJ4REpZTGIrWHczYWxMbWx0dVRFVjZLR3RCbnRCWCt5ejM2UlBETXlHSUtlKzNmemN4Zm5DRG4yME1vZFZWa1ZOb3pQcU1YWjBHNUw0YUxUQVFha1lLVWpzVk1RakFoUWtUbEhCZU8vYUxQeDlzeGwrK2oxWjVyTGdHMTJUTjRYSjFlaWN2dzRBVkU1OExvcmFxMFFpRTBjUzdQSDFwYnJaV3JmdDdMWUdpeUJTaG9yNyswamlvVWgxcGRXcTJxTVlMcWVNRWV1Q1JPUXQ1N21Gck9qeVBINDlxcDk3Y1dPcmdlZzJXeWZXU0RHUVBqZTUrUDB5UW9DcEQvRDNSQU11V21iOXdsQnRjcTJqOFdKUHQ5MUUza0thd3VRSXl2ZDJyMlVqeDQrSFROdFZLYjlrTUxPTzg1STY1Yk5HQkgrNGlyU3k1Z1FZbEUyNkEyY1NHSWNMS1FSbHZKb01uYTdMLzl3eXJ5NEh6T3J6a3JBdkxkZ3NTTmxZanBIUUVSaU9JODBzSjVqTkNDbmZ3MDEzRitBK3NBZkxteVMvQkRMTlExcWFRM3A2aDgvSnFBZmhYNU9HSGdTaVJWT0NFanVhREIvTXdaTkN1M1FMOWVoaG9Bajd1T2Y4UGtyM21JamJoaDlIaWpzangxOTErMGUySlFyRmEwMUFWSktFVnR1UHRJYzJoLzFwUEtNdnllbnhqVE8yT3hQbmpqdCs4NG5JS0toeERKL2doUHQ3aXY4UG1USjBsS0t5UFJzc2w4Zi9RZEhkeHVwYjZqVHNJNlVLbXo5WTQ2UE1CdUQ2UDN3aDhxcDM2TzZvaWJORGlRZDFzRTEwdkpoOXoxRnlzS0llOEVxTXBuTmRFbUcyVGZFQnhScG1RcmhLRXFlZTBwNithNnNRbzhjVmxSSmtLUUFZS2F3Y2FORVM1WGM2ZFFZNW5xZWlxOHNVaXpmMXNwZkhlSGVsRHUxTTZCUlh1Q2pGYWZYaHo4aTNsUFdnWXFWcGZ4MTNpZ1ZDUmY0N1VINjUyeUxuc21lcENCV2d5QlRXQWNPeUYxUXg4WUd0Wm5vYjFUTis2eEV3enBjV1Z5N1FPOVA5MnNLQTlTSysvTkhzcWYxM0NPdDBKSEN0VFYxT2xUUVcrSkFLeXhlMUhsNytzOTV6M0tDZ0ZLUVMrM0FzMUpWN05hK2crTENSMklldnU4ZDVEMEw3R3dvRHJlVXY0Mzc0TFJhRmtOc0hPcVdiVTluaFFqZE1WcjdhL2k4Ty80aGJwdGFTenFxa2dZRmlORlUvb21XNXF3SXo3c3A0bnNjSVRSRTNndWE2YnprbE1aOEVDbjFpcUFXdDBhNmdla2k1RGFMOHFZYXBUQ0NoamxXc0V4cUZ1eGlXUDM1VFVDZGRFZDhBQ2JNR3MrZ1FGeURPb3pmQkRHMTdkWk8wbUN3VytQekNMMmpiSUNETmFpNS9qbTFRcjZNTDU2anpVYUlEejBHTFBUU2FleDFVRER3a1E5bzdtWFdDMFI3alduemJrSFJXY29tVmJXbUdxTDFyamRvYWNzL1I5dWpxVXVCQTZBNVZML3FrUTF4SEw0MkVYb29wckM4d3JyZlI2OHpNTUZ4T3dVN0NZSEo3YmhHL1E0ck5zWERCY01vMUFkaXE5TFhiWG0vUUpqMHUvamdaR3NzejBubktLVUZKY3h6dUFOSzk2eld3ZjFEWGFzVWNPb0V1RWF0bTFybVA1d3JCSm1XL1p3VDZhQkJpUjJPU0oweHI4dFE2T2JtZEtqeWIrMWVFWGIxNDM3UjJJZGhEVWRrNVBSenRIMllGdDJwbXVMNC9MbUlMRkF2UGRpeU10REhOaitLaDRzVjRNbFhiV1Byckk5N1lCT0ZwRmxYK2duZXdLS2ZGWmtIRTdkaXR5MzRkVVEyR25lNnNBR3gxenh5alp2NUtCTTI2bFJIRjQ1WHFGTkoxUlEzaE15bUpIc3lZTnNNTzQxQldyR3YxOVBBNDY4ZWN3OUhjUk4wd2hqVVRnbnM4WlZhQzRoaUpzZ1kwN2FBRUJIbTkwL3VoaGpPL1dtYjd3dVZhZGhsOVJuSGVRanB4NGd3Q3JMejVpNXM1SXQxc0J3ZkRiMEZlK1BDcExrYyt3SUlOSzJZODZrUHRoUjZnSndXNzV6dW9ONUMwQ0FpRHdmVTczdmFBWmFoemY0VkxObE0wVTA0T3RIWUJpMTNZZ1BvTm1HSFJlbFpWRXkyS3VLVlpnaEQxNHZTbFkrSnJNQkRkbTJ5MnRoRlYrQnJpaEw3K2ZRNXdjWW54R2VsYXdEdW9TUjUrYkREa3I2Ukw0MEw0eHlmQWh4bHJPbjB1QTI4Z2hHZVdndWFXS0V2NW5CcnJ2ZXUxdWVWeTFNdkdVWUJZK0lsRXI4TmRETlJkbUV6WHQzOWtHbGQ4NnhPZkFIL3hMMVZtdWdhWE9HYVBCMnFjN1dEUmtXNms1RjZuM1BrSXpkUFh5T05LcDFEa09nM29jU01aTVRzNkdLajlDM3ZPRFo2WlFwd05EWUxNVCtDbUVMMThHUmpYTmNabFAvTG5oaUFJc2NZVEwxK2lIV0RZdlJtdlBNd3RPSGhDbkVYSVUzRlRiUCs2UVJHQTZxeWRibm5lcVZoWG93Y0xtYk1JejE2SUMxa3doWmo3NS9NNTNzS1lYMnpSZ09TVEFmTlNELzVsWllTTlV4SmZLVERnaWFGRWdnckNyZCszQ2MrY2h6c2xJM3pEWEVLVHJ2bGNYMkluQzl1SCtmc3lweUh3K0F2WTJPbUJHUU1JSWM4ZkUzdE5PMGdCVFZxWHNkc0U3Nll3SHIyOWR6UWNrdXN1eUpzQmZTVmNscnZzTkNaMVBRREw4SDNjUnMzSEU5blVreDViYkpZV3NQeGI4MjVnbkVwV1U5WjlLdHp2c2xpNy9oZU9sREtwSHhKYjF1Q3JXcWY4Z1JuV21xM3pmU1NyVVhCSFNMdTYyTXJrWFRqV2dhcFVWeE1Ha3JuelIwRTRQTXkxYkZjeURwRVFlMTVUYXlXQk0xQjZqcklHKzBEUlI5T2FDVVB3RDdleE5talpiOU04MXVzK0FJUmZ5ekpQWkdtZkh1VDlTTnpGZk51UWRGWnlpWlZ0YVlhb3ZXdU4yaXJJM3pRYXRLQ0RuUUlYcHIwVmhHMEdvcDhjL3pyb1dCb04vYVZLbW44c2tTRnZBRE9qb1pBaXhnNksxeTl3Rmk4cGVDbWltRlozWnpDVnNHNkVVOVN2bGJxNSt3bjdENnkrZEFZZGFQbXM0Z3dDckx6NWk1czVJdDFzQndmRGJ6NFg0VnhxSXBjVEM5TmFZS3FBN0dLSythVHJaV1V3d04yMVFPdHI4ZXF4U2dKMVU5ZUNPY1dYUWQrcDM2R3k0ZlkrdDljMkNzVk5iTmwxZ2h4YTliSThVNmU2RlRkL3Z2QmFxOWpyS2RpdHE0bU5DYWlvZ21mUEs2TTQ4VVlJOGpaTUNkZC85QzhCcXZVajRiWVU1YnlXQVNFRzZCQkdkSzhLbGZpL2E0TFd0M2l2QzR1OVFCVGZiL3ZDbU5KaS9RQWZhYmNQRytVc1dtc1lOUksrZzhoTWNzdUJtaGg0OE5waFJ2ZWJWUXFxNm5jS3hjMW5GSFdNVzVNNm9mK3o4YzFIZGRuaWVEUDlHYUJzcSt5c2xqS3NsWXJ0OTg5UFk5eHNibWtyM1gvb0NmaUZVNE5mY09oZWUrK25nVzBYcFpBVnQxSTJRbmMxYWx3Ym5vTnFNTWhYSUI5NWlrTHhTRnFIMjI2WnE5c0cvdHJkcjJTQVZ1cm55V3NmSE5qdUlsQldLRE9yZDdWcllGSnZROXhiVm9tS3FRanVoOWR6ZjJudlZyQnpiRUYwQ1pZNml6a1kvUlFZNXI5azkzL3kyTkc3bzA3bk1Zak90WllZZU5Vb2lrN0diSy9IelFsMVM3cy9GQ2hudDlNNmZFMFV5dVBtdHRPOThocXp4UWJ0ZU1hbE10U2NlMldMY2p5WFZHZnBxZEJrWXltNGdaQnljY1M2YW50dDRvTGRsdVdTU0pzSFgxSWNYaFF5Nm9KK0Foanc5aEZZd1hMSFBMb0NvM2pFbGlVQUs0MTc5d3RZdEhzTzBhYkx4NCtobXRNNUZ6N3dVVmFoQkE5c3VwT1RmL0ZENHNpWk1Nb2Y1VzN2bTVEZWRocUdBTmxodDNtSTZSbUlodjQ4UVZ0bmVNc1V6WUM0TkRoWkQ0TTVSNnA3R1hCcWNwdTNGYUVGLzBJMGUzTGNlWDFITitpRHFLUlB1R3p2cGFjLzF0c0dQSXRlQUR4dTlPWW9hcDJ6M0YxQ3pTZy9VdWE4bC9LRXp0QUtEY3ZiaE5VL1lVYzJsaGd4Z2ZkYjRlK1A5VFo3UmFYODJzNjI3dTBDYkZzZkdFLzFoTHBiNU1jMnZrMXVER3JkSWNiV0E2eGhwWUFIWWhFWVVsOWM3NVkvUi8wZ2w2cjkrbTZjSTBCdkJZNUFhNU5CUmM2VU12c08vUE93NUNjcjc5c0p6aWNlYVYzWXdyWUVranA2S2krT1lyR3U5NTRBQStkSjlXc3ZOR0JGR01yS0FmUTlWVUMvQVRrSmZUbG9NbHREZVY1QW85emthYXkzZEtBYTUvUHhBR1JEQVVjUUxERjd1VlhiRDF2RmdFLytSWGl3elM1TjdjcjNhRkJkUlk3WEFtRnovZmIwL0tTcFI4Q1EvbG9rcG1NMm1sdEo5dkdQZ2lxYjVuWmw5S3U3ZDJHbGdBZGlFUmhTWDF6dmxqOUgvU0J1akJQb08xZnBvT3U1RjM1Y2RIYTVrU0Z2QURPam9aQWl4ZzZLMXk5d0ZsajBFejVrc1VXM1dVNjNFN2U0cXREVUNLV3dqalU1ZjBGZDU3VnlWenBDNkNkQ1NjQmpZU3pUOXJaTFZza3E2MWFPV3JERFVOS3FBUTMrblgvQkJXM2NRVEVjT1ZkYzE1bmdWWGNTUy9hSzJRRk1kaUtRbHFtMTVmRXJKZHdxeWV6YTdoZmxLVGlDelVkdTVWR2xGVzlxQ3Q4c3lIb29zQTJOemZvc0pkVGROOGJXSG5vRHI1TjI1ZXQrcC9udmpqT3paUmFMWW9ZL2ZyL2s1aHFwdE9rPVxcXCIpO1xcbiAgICByZXR1cm4gJC5leHBvcnRzO1xcbn0pKCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLnvJbovpHlhazlkYpcIixcInBhdGhcIjpcImRldkluZm9FZGl0XCIsXCJydWxlXCI6XCJqczpcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCk9PntcXG4gICAgcHV0TXlWYXIoXFxcImRldkluZm9cXFwiLCcnKTsgLy/muIXpmaTljoblj7LlhazlkYpcXG59KSk7XFxuc2V0UGFnZVRpdGxlKCfnvJbovpHlhazlkYonKTtcXG4vLyBsZXQge25vd0p4LE15SmlleGksanhzUm91dGV9ID0gTVlfUEFSQU1TO1xcbmNvbnN0IHtjb2xvcixzbWFsbCxhcGksIGdldEZpbGUsZ2V0QXBpfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbi8vIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXG52YXIgZGV2X2luZm9fdXJsID0gZ2V0QXBpKCdpbmZvR2V0VXJsJyk7XFxuLy8gbG9nKGRldl9pbmZvX3VybCk7XFxudmFyIGdldF9pbmZvID0gZnVuY3Rpb24ocXEpe1xcbiAgICBxcSA9IHFxfHwnNDM0ODU3MDA1JztcXG4gICAgbGV0IGRldl9pbmZvX3VybCA9IGRldl9pbmZvX3VybCtxcTtcXG4gICAgbGV0IGJhY2tfY29kZSA9IEpTT04ucGFyc2UocmVxdWVzdChkZXZfaW5mb191cmwpKTtcXG4gICAgbGV0IGRldl9pbmZvPWJhY2tfY29kZS5yZXN1bHR8fGJhY2tfY29kZS5kZXRhaWw7XFxuICAgIHJldHVybiBkZXZfaW5mbztcXG59O1xcbnZhciBiZWZvcmVfcmVmcmVzaCA9IGZ1bmN0aW9uKCl7XFxuICAgIGxldCBkZXZfc2V0X2luZm8gPSBnZXRNeVZhcihcXFwiZGV2X3NldF9pbmZvXFxcIikuc3BsaXQoJyQkJyk7XFxuICAgIGxldCBkZXZfaW5mb191cmwgPSBkZXZfc2V0X2luZm8uc2xpY2UoLTEpWzBdO1xcbiAgICBsZXQgYmFja19jb2RlID0gSlNPTi5wYXJzZShyZXF1ZXN0KGRldl9pbmZvX3VybCkpO1xcbiAgICBsZXQgZGV2X2luZm89YmFja19jb2RlLnJlc3VsdHx8YmFja19jb2RlLmRldGFpbDtcXG4gICAgcHV0TXlWYXIoXFxcImRldkluZm9cXFwiLGRldl9pbmZvKTtcXG4gICAgcmV0dXJuIGRldl9pbmZvXFxufTtcXG5sZXQgZCA9IFtdO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOifnvJbovpHlhazlkYonLFxcbiAgICBkZXNjOifmlK/mjIFtZOivreazlSzngrnlh7vov5vlhaXlrabkuaBNZOivreazlVxcXFxu5L+d5a2Y5YWs5ZGK5oyJ6ZKu5Zyo5paH5pys5qGG5pyA5LiL6Z2iJyxcXG4gICAgY29sX3R5cGU6J3RleHRfMScsXFxuICAgIHVybDonaHR0cHM6Ly93d3cucnVub29iLmNvbS9tYXJrZG93bi9tZC10dXRvcmlhbC5odG1sJ1xcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOifov5Tlm54nLFxcbiAgICBjb2xfdHlwZTondGV4dF8yJyxcXG4gICAgdXJsOiQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICB9KVxcbn0pO1xcbmlmKCFnZXRNeVZhcignZGV2SW5mbycpKXtcXG4gICAgYmVmb3JlX3JlZnJlc2goKTtcXG59XFxubGV0IGVtcHR5ID0gJ2hpa2VyOi8vZW1wdHknO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOifpmIXop4jmn6XpmIUnLFxcbiAgICBjb2xfdHlwZTondGV4dF8yJyxcXG4gICAgLy8gdXJsOiQoZ2V0TXlWYXIoJ2RldkluZm8nKSkuY29uZmlybSgpXFxuICAgIHVybDokKGVtcHR5KS5ydWxlKCgpPT57XFxuICAgICAgICByZXF1aXJlKFxcXCJodHRwczovL2dpdGxhYi5jb20vaGpkaG54L2hpa2VyLy0vcmF3L21haW4vanMvbWFya2VkLm1pbi5qc1xcXCIpO1xcbiAgICAgICBsZXQgZGV2SW5mbz1cXFwiXFxcIjtcXG4gICAgICAgdHJ5e1xcbiAgICAgICAgICBkZXZJbmZvPW1hcmtlZC5wYXJzZShnZXRNeVZhcignZGV2SW5mbycpKTtcXG4gICAgICAgfWNhdGNoKGUpe31cXG4gICAgICAgIHNldFJlc3VsdChbXFxuICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICB0aXRsZTpkZXZJbmZvLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZToncmljaF90ZXh0JyxcXG4gICAgICAgICAgICB9XFxuICAgICAgICBdKTtcXG4gICAgfSlcXG59KTtcXG5kLnB1c2goe1xcbiAgICBkZXNjOiBcXFwi5b+r5p2l57yW6L6R5L2g55qE5YWs5ZGK5ZCnflxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoJ2RldkluZm8nLCAnJyl8fFxcXCJcXFwiLFxcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDotMSxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0TXlWYXIoXFxcImRldkluZm9cXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLkv53lrZjlhazlkYpcXFwiLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICB1cmw6JCgn56Gu6K6k5L+d5a2Y5YWs5ZGK5ZCX77yf5bCG5Lya5LiO6YGT6ZW/5LuT5bqT5pyN5Yqh5Zmo6YCa6K6vJykuY29uZmlybSgoKT0+e1xcbiAgICAgICAgbGV0IGRldl9zZXRfaW5mbyA9IGdldE15VmFyKFxcXCJkZXZfc2V0X2luZm9cXFwiKS5zcGxpdCgnJCQnKTtcXG4gICAgICAgIGxldCBpbnB1dF90ZXh0ID0gZ2V0TXlWYXIoJ2RldkluZm8nLCAnJyk7XFxuICAgICAgICBpZihpbnB1dF90ZXh0Lmxlbmd0aCA+PSA0KXtcXG4gICAgICAgICAgICBsZXQgaW5mb19zZXRfdXJsPSBkZXZfc2V0X2luZm9bMl07XFxuICAgICAgICAgICAgbGV0IHNlbmRfZGF0YSA9IHtcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgIHtcXFwiZGF0YVxcXCI6IHtcXFwiaW5mb1xcXCI6IGlucHV0X3RleHR9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogZGV2X3NldF9pbmZvWzBdLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGRldl9zZXRfaW5mb1sxXX1cXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIC8vIGxvZyhzZW5kX2RhdGEpO1xcbiAgICAgICAgICAgIGxldCBwYXIyID0ge2hlYWRlcnM6eydjb250ZW50LXR5cGUnOidhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9VVRGLTgnLCdVc2VyLUFnZW50JzpkZXZfc2V0X2luZm9bM119LGJvZHk6SlNPTi5zdHJpbmdpZnkoc2VuZF9kYXRhKSxtZXRob2Q6J1BPU1QnfTtcXG4gICAgICAgICAgICAvLyBwYXIyID0gSlNPTi5zdHJpbmdpZnkocGFyMik7IC8veDXph4zpnaLor7fmsYLmiY3pnIDopoHnvJbnoIFcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBsZXQgYmFja19yZXQgPSByZXF1ZXN0KGluZm9fc2V0X3VybCwgcGFyMik7XFxuICAgICAgICAgICAgICAgIGJhY2tfcmV0ID0gSlNPTi5wYXJzZShiYWNrX3JldCkucmVzdWx0O1xcbiAgICAgICAgICAgICAgICBpZihiYWNrX3JldC5zdGF0dXM9PT0wKXtcXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L+d5a2Y5oiQ5YqfXFxcXG4nK2JhY2tfcmV0LmRldGFpbDtcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L+d5a2Y5aSx6LSlXFxcXG4nK2JhY2tfcmV0LmRldGFpbDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+vXFxcXG4nK2UubWVzc2FnZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICBjb25maXJtKHt0aXRsZTon6YGT6ZW/5o+Q56S6Jyxjb250ZW50Oifomb3nhLbkvaDlvojmh5LvvIzkvYbmmK/lhazlkYroh7PlsJHlhpk05Liq5a2X5ZCn77yBJ30pO1xcbiAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICAgIH1cXG4gICAgfSlcXG59KTtcXG5cXG5zZXRSZXN1bHQoZCk7XCJ9XSIsImljb24iOiJodHRwczovL2xhbm1laWd1b2ppYW5nLmNvbS90dWJpYW8vb3RoZXIvMzAuc3ZnIn0=
Add Comment
Please, Sign In to add comment