Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥拷贝@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImdtdE1vZGlmaWVkXCI6MCxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcInRleHRfMVwiLFwibmFtZVwiOlwiQ2xhc3NUYWJcIixcInBhdGhcIjpcIkNsYXNzVGFiXCIsXCJydWxlXCI6XCJ2YXIge1xcbiAgICBRSU5HX1RJVExFLCB0aXRsZSwgdXJsLFxcbiAgICBjbGFzc19uYW1lLCBjbGFzc191cmwsXFxuICAgIGFyZWFfbmFtZSwgYXJlYV91cmwsXFxuICAgIHllYXJfbmFtZSwgeWVhcl91cmwsXFxuICAgIHNvcnRfbmFtZSwgc29ydF91cmxcXG59ID0gJC5pbXBvcnRQYXJhbVxcbmNvbnN0IENsYXNzVGFiID0gZnVuY3Rpb24oY2xhc3NBcnJheSwgcGFyYW1zKSB7XFxuICAgIE9iamVjdC5hc3NpZ24odGhpcywgcGFyYW1zKVxcbiAgICB0aGlzLmFyciA9IGNsYXNzQXJyYXkubWFwKHYgPT4gdGhpcy5pbml0KHYpKVxcbiAgICB0aGlzLnNpZ24gPSAnJCcgKyBRSU5HX1RJVExFICsgJ18nICsgKHRoaXMubmFtZSB8fCAnJykgKyAnXydcXG4gICAgdGhpcy5jb2xvciA9IHRoaXMuY29sb3IgfHwgJyMxMmI2NjgnXFxuICAgIHRoaXMuYm91bmRhcnkgPSB0aGlzLmJvdW5kYXJ5IHx8ICdibGFua19ibG9jaydcXG59XFxuQ2xhc3NUYWIucHJvdG90eXBlID0ge1xcbiAgICBjb25zdHJ1Y3RvcjogQ2xhc3NUYWIsXFxuICAgIGxvYWQoZWwpIHtcXG4gICAgICAgIGxldCBmb2xkZWQgPSB0aGlzLmZvbGQgJiYgZ2V0VmFyKCckZm9sZF8nICsgdGhpcy5zaWduLCAnJylcXG4gICAgICAgIGlmICh0aGlzLmFyci5sZW5ndGggPiAxICYmIHRoaXMuZm9sZCkgZWwucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgKGZvbGRlZCA/ICfilrYnIDogJ+KWvCcpLmZvbnRjb2xvcignIzA0OWVmZicpLFxcbiAgICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoc2lnbiwgZm9sZGVkKSA9PiB7XFxuICAgICAgICAgICAgICAgIHB1dFZhcignJGZvbGRfJyArIHNpZ24sIGZvbGRlZCA/ICcnIDogJ1QnKVxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXG4gICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICAgICAgICAgIH0sIHRoaXMuc2lnbiwgZm9sZGVkKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxuICAgICAgICB9KVxcbiAgICAgICAgbGV0IGFyciA9IGZvbGRlZCA/IFt0aGlzLmFyclswXV0gOiB0aGlzLmFyclxcbiAgICAgICAgYXJyLmZvckVhY2goKHYpID0+IHtcXG4gICAgICAgICAgICBsZXQgeyBpZCwgY2xhc3NfbmFtZSwgY2xhc3NfdXJsIH0gPSB2LFxcbiAgICAgICAgICAgIHNlbGVjdGVkID0gSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRDbGFzcyhpZCkpXFxuICAgICAgICAgICAgY2xhc3NfbmFtZS5mb3JFYWNoKChuYW1lLCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBjbGFzc191cmxbaV0sXFxuICAgICAgICAgICAgICAgICAgICBub3cgPSBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IG5hbWUsIHVybDogdXJsIH0pXFxuICAgICAgICAgICAgICAgIGVsLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHNlbGVjdGVkID09IG5vdyA/ICfigJzigJzigJ3igJ0nICsgbmFtZS5mb250Y29sb3IodGhpcy5jb2xvcikuYm9sZCgpIDogbmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogc2VsZWN0ZWQgPT0gbm93ID8gJ2hpa2VyOi8vZW1wdHknIDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoc2lnbiwgaWQsIG5vdykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dFZhcihzaWduICsgaWQsIG5vdylcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLnNpZ24sIGlkLCBub3cpLFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcbiAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgZWwucHVzaCh7IGNvbF90eXBlOiB0aGlzLmJvdW5kYXJ5IH0pXFxuICAgICAgICB9KVxcbiAgICB9LFxcbiAgICBpbml0KGNsYXNzT2JqZWN0KSB7XFxuICAgICAgICBpZiAodHlwZW9mIGNsYXNzT2JqZWN0LmNsYXNzX25hbWUgPT0gJ3N0cmluZycpXFxuICAgICAgICAgICAgY2xhc3NPYmplY3QuY2xhc3NfbmFtZSA9IGNsYXNzT2JqZWN0LmNsYXNzX25hbWUuc3BsaXQoJyYnKVxcbiAgICAgICAgaWYgKHR5cGVvZiBjbGFzc09iamVjdC5jbGFzc191cmwgPT0gJ3N0cmluZycpXFxuICAgICAgICAgICAgY2xhc3NPYmplY3QuY2xhc3NfdXJsID0gY2xhc3NPYmplY3QuY2xhc3NfdXJsLnNwbGl0KCcmJykubWFwKCh2KSA9PiB2LnRyaW0oKSlcXG4gICAgICAgIHJldHVybiBjbGFzc09iamVjdFxcbiAgICB9LFxcbiAgICBwdXNoKGNsYXNzT2JqZWN0KSB7XFxuICAgICAgICB0aGlzLmFyci5wdXNoKHRoaXMuaW5pdChjbGFzc09iamVjdCkpXFxuICAgIH0sXFxuICAgIGdldENsYXNzKGlkKSB7XFxuICAgICAgICBsZXQgZGVmYXVsdENsYXNzID0gdGhpcy5hcnIuZmluZChpdGVtID0+IGl0ZW0uaWQgPT0gaWQpXFxuICAgICAgICBkZWZhdWx0Q2xhc3MgPSBKU09OLnN0cmluZ2lmeShkZWZhdWx0Q2xhc3MgPyB7XFxuICAgICAgICAgICAgbmFtZTogZGVmYXVsdENsYXNzLmNsYXNzX25hbWVbMF0sXFxuICAgICAgICAgICAgdXJsOiBkZWZhdWx0Q2xhc3MuY2xhc3NfdXJsWzBdXFxuICAgICAgICB9IDogeyBuYW1lOiAgJ2Nhbm5vdCBmaW5kIGlkOiAnICsgaWQgKyAnIGluIGNsYXNzVGFiOiAnICsgdGhpcy5zaWduLCB1cmw6ICcnfSlcXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGdldFZhcih0aGlzLnNpZ24gKyBpZCwgZGVmYXVsdENsYXNzKSlcXG4gICAgfSxcXG4gICAgc2V0VXJsKHVybCkge1xcbiAgICAgICAgcmV0dXJuIHVybC5yZXBsYWNlKC9cXFxcJFxcXFx7KFtefV0qKVxcXFx9L2csIChfLCBpZCkgPT4gdGhpcy5nZXRDbGFzcyhpZCkudXJsKVxcbiAgICB9XFxufVxcbi8vIOeUn+aIkOWktOmDqOWIhuexu1xcbmxldCBmeUFsbCA9IHVybC5pbmNsdWRlcygnZnlBbGwnKSxcXG4gICAgdGFiSGVhZGVyID0gW11cXG5pZiAoY2xhc3NfbmFtZSkgdGFiSGVhZGVyLnB1c2goe1xcbiAgICBpZDogZnlBbGwgPyAnZnlBbGwnIDogJ2Z5Y2xhc3MnLFxcbiAgICBjbGFzc19uYW1lOiBjbGFzc19uYW1lLFxcbiAgICBjbGFzc191cmw6IGNsYXNzX3VybFxcbn0pXFxuaWYgKGFyZWFfbmFtZSkgdGFiSGVhZGVyLnB1c2goe1xcbiAgICBpZDogZnlBbGwgPyAnZnlBbGwnIDogJ2Z5YXJlYScsXFxuICAgIGNsYXNzX25hbWU6IGFyZWFfbmFtZSxcXG4gICAgY2xhc3NfdXJsOiBhcmVhX3VybFxcbn0pXFxuaWYgKHllYXJfbmFtZSkgdGFiSGVhZGVyLnB1c2goe1xcbiAgICBpZDogZnlBbGwgPyAnZnlBbGwnIDogJ2Z5eWVhcicsXFxuICAgIGNsYXNzX25hbWU6IHllYXJfbmFtZSxcXG4gICAgY2xhc3NfdXJsOiB5ZWFyX3VybFxcbn0pXFxuaWYgKHNvcnRfbmFtZSkgdGFiSGVhZGVyLnB1c2goe1xcbiAgICBpZDogZnlBbGwgPyAnZnlBbGwnIDogJ2Z5c29ydCcsXFxuICAgIGNsYXNzX25hbWU6IHNvcnRfbmFtZSxcXG4gICAgY2xhc3NfdXJsOiBzb3J0X3VybFxcbn0pXFxuJC5leHBvcnRzID0ge1xcbiAgICBmeUFsbDogZnlBbGwsXFxuICAgIHRhYkhlYWRlcjogbmV3IENsYXNzVGFiKHRhYkhlYWRlciwgeyBuYW1lOiB0aXRsZSwgZm9sZDogcmVhZEZpbGUoJ3RhYkZvbGQnKSwgfSlcXG59XFxuXCJ9LHtcImNvbF90eXBlXCI6XCJpY29uXzJfcm91bmRcIixcIm5hbWVcIjpcIuiuvue9rlwiLFwicGF0aFwiOlwiQ29uZmlnXCIsXCJydWxlXCI6XCJqczpcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICdjbGVhck15VmFyKFxcXCJzb3J0RmxhZ1xcXCIpO3JlZnJlc2hQYWdlKCknKVxcbnNldFBhZ2VUaXRsZSgn4pqZIOmYhea8q+WQm+iuvue9riDimpknKVxcbmNvbnN0IFFJTkdfVElUTEUgPSBnZXRNeVZhcignbXlDb2xsZWN0aW9uJyksXFxuICAgIHVybCA9IGdldE15VmFyKCdyZW1vdGVVcmwnKVxcbmxldCBkYXRhID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZGF0YUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRSwgdHJ1ZSksXFxuICAgIGVsID0gW3tcXG4gICAgICAgIHRpdGxlOiAnPGI+IOa4hemZpOe8k+WtmO+8jOeri+WNs+abtOaWsCA8c21hbGw+IO+8iOWfuuS6jui/nOeoi+S7k+W6k++8jOayoeS6i+WIq+eCue+8jOWPr+avj+aciOeCueS4gOasoeabtOaWsO+8iScsXFxuICAgICAgICB1cmw6ICQoXFxcIua4hemZpOe8k+WtmO+8jOeri+WNs+abtOaWsFxcXCIpLmNvbmZpcm0oKHVybCkgPT4ge1xcbiAgICAgICAgICAgIC8v6L+c56iL5L6d6LWW57Si5byV5paH5Lu25Luj55CG5Zyw5Z2A5YiX6KGoXFxuICAgICAgICAgICAgbGV0IHJlcXVpcmVsaXN0ID0gWydodHRwczovL2docHJveHkubmV0L2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9RUTE5OTNIVUFORy9BL21haW4vJ11cXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcXVpcmVsaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIHRyeSB7IC8v6L+c56iL5L6d6LWW57Si5byVXFxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVzID0gcmVxdWVzdChyZXF1aXJlbGlzdFtpXSArICdRUTE5OTNIVUFORy9BL21haW4nLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFN0YXR1c0NvZGU6IHRydWVcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICBpZiAoSlNPTi5wYXJzZShyZXMpLnN0YXR1c0NvZGUgPT0gMjAwKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVFeGlzdCh1cmwpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUodXJsKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlRG93bmxvYWQocmVxdWlyZWxpc3RbaV0gKyAnUVExOTkzSFVBTkcvQS9tYWluJyx1cmwpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZURvd25sb2FkKHJlcXVpcmVsaXN0W2ldICsgJ1FRMTk5M0hVQU5HL0EvbWFpbicsdXJsKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSlcXG4gICAgICAgICAgICBiYWNrKGZhbHNlKVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7Lmm7TmlrAnXFxuICAgICAgICB9LCB1cmwpLFxcbiAgICAgICAgaW1nOiAnaGlrZXI6Ly9pbWFnZXMvaWNvbjQnLFxcbiAgICAgICAgY29sX3R5cGU6ICdhdmF0YXInXFxuICAgIH1dLFxcbiAgICB1cGRhdGVJbnRlcnZhbCA9IHJlYWRGaWxlKCd1cGRhdGVJbnRlcnZhbCcpIHx8ICcxJyxcXG4gICAgbmV3V2luZG93ID0gcmVhZEZpbGUoJ25ld1dpbmRvdycpLFxcbiAgICB0YWJGb2xkID0gcmVhZEZpbGUoJ3RhYkZvbGQnKSxcXG4gICAgZGlzYWJsZUN1c3RvbSA9IHJlYWRGaWxlKCdkaXNhYmxlQ3VzdG9tJyksXFxuICAgIGVkaXRNb2RlID0gZGlzYWJsZUN1c3RvbSA/ICflr7zlhaXmtbfpmJQnIDogZ2V0TXlWYXIoJ2VkaXRNb2RlJywgJ+WQr+eUqC/npoHnlKgnKVxcblxcbmVsLnB1c2goe1xcbiAgICB0aXRsZTogJyAg8J+SoSDmm7TmlrDpopHnjoc6ICcgKyAodXBkYXRlSW50ZXJ2YWwgPT0gMCA/ICfmiYvliqgnIDogdXBkYXRlSW50ZXJ2YWwgKyAn5aSpJykgKyAnICAnLFxcbiAgICB1cmw6ICQodXBkYXRlSW50ZXJ2YWwsICfovpPlhaXmm7TmlrDpl7TpmpTvvIjlpKnvvInvvIzkuLow5YiZ5omL5Yqo5pu05pawXFxcXG7mnKzlnLDmlofku7bpk77mjqXml6DmlYgnKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICBpbnB1dCA9IHBhcnNlSW50KGlucHV0KVxcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihpbnB1dCkpIGlucHV0ID0gMVxcbiAgICAgICAgZWxzZSBpZiAoaW5wdXQgPCAxKSBpbnB1dCA9IDBcXG4gICAgICAgIHNhdmVGaWxlKCd1cGRhdGVJbnRlcnZhbCcsIGlucHV0LnRvU3RyaW5nKCkpXFxuICAgICAgICByZWZyZXNoUGFnZSgpXFxuICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxufSwge1xcbiAgICB0aXRsZTogJyAg8J+WpSDni6znq4vpppbpobU6ICcgKyAobmV3V2luZG93ID8gJ+aYrycgOiAn5ZCmJykgKyAnICAnLFxcbiAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKG5ld1dpbmRvdykgPT4ge1xcbiAgICAgICAgc2F2ZUZpbGUoJ25ld1dpbmRvdycsIG5ld1dpbmRvdyA/ICcnIDogJ1QnKVxcbiAgICAgICAgcmVmcmVzaFBhZ2UoKVxcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICB9LCBuZXdXaW5kb3cpLFxcbiAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxufSwge1xcbiAgICB0aXRsZTogJyAg8J+SoCDliIbnsbvmipjlj6A6ICcgKyAodGFiRm9sZCA/ICfmmK8nIDogJ+WQpicpICsgJyAgJyxcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKCh0YWJGb2xkKSA9PiB7XFxuICAgICAgICBzYXZlRmlsZSgndGFiRm9sZCcsIHRhYkZvbGQgPyAnJyA6ICdUJylcXG4gICAgICAgIHJlZnJlc2hQYWdlKClcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgfSwgdGFiRm9sZCksXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXG59LCB7XFxuICAgIHRpdGxlOiAnICDwn5K8IOWkh+S7veaBouWkjSAgJyxcXG4gICAgdXJsOiAkKFsn5aSH5Lu9JywgJ+aBouWkjSddLCAxKS5zZWxlY3QoKFFJTkdfVElUTEUsIHVwZGF0ZUludGVydmFsLCBuZXdXaW5kb3csIHRhYkZvbGQsIGRpc2FibGVDdXN0b20pID0+IHtcXG4gICAgICAgIGxldCB1cmwgPSBnZXRNeVZhcigncmVtb3RlVXJsJylcXG4gICAgICAgIGlmICghdXJsLnN0YXJ0c1dpdGgoJ2hpa2VyOi8vJykgJiYgIXVybC5zdGFydHNXaXRoKCdmaWxlOi8vJykpXFxuICAgICAgICAgICAgdXJsID0gJ2hpa2VyOi8vZmlsZXMvbGlicy8nICsgbWQ1KHVybCkgKyAnLmpzJ1xcbiAgICAgICAgZWxzZSBpZiAodXJsLnN0YXJ0c1dpdGgoJ2hpa2VyOi8vcGFnZS8nKSkgdXJsID0gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICBpZiAoaW5wdXQgPT0gJ+Wkh+S7vScpIHJldHVybiAkKCdoaWtlcjovL2ZpbGVzL3RtcC8nICsgUUlOR19USVRMRSArICdfYmFja3VwLmpzb24nLCAn6L6T5YWl5aSH5Lu96Lev5b6EJylcXG4gICAgICAgICAgICAuaW5wdXQoKHVybCwgdXBkYXRlSW50ZXJ2YWwsIG5ld1dpbmRvdywgdGFiRm9sZCwgZGlzYWJsZUN1c3RvbSkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSByZXF1ZXN0KHVybCksXFxuICAgICAgICAgICAgICAgICAgICBjdXN0b21EYXRhID0gcmVhZEZpbGUoJ2N1c3RvbURhdGEnKVxcbiAgICAgICAgICAgICAgICB3cml0ZUZpbGUoaW5wdXQsIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUludGVydmFsOiB1cGRhdGVJbnRlcnZhbCxcXG4gICAgICAgICAgICAgICAgICAgIG5ld1dpbmRvdzogbmV3V2luZG93LFxcbiAgICAgICAgICAgICAgICAgICAgdGFiRm9sZDogdGFiRm9sZCxcXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVDdXN0b206IGRpc2FibGVDdXN0b20sXFxuICAgICAgICAgICAgICAgICAgICBjdXN0b21EYXRhOiBjdXN0b21EYXRhLFxcbiAgICAgICAgICAgICAgICAgICAgcnVsZXM6IHJ1bGVzXFxuICAgICAgICAgICAgICAgIH0pKVxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bey5aSH5Lu977yM5rOo5oSP6Iul5LuT5bqT5Li65a2Q6aG16Z2i5YiZ5LiN5aSH5Lu9J1xcbiAgICAgICAgICAgIH0sIHVybCwgdXBkYXRlSW50ZXJ2YWwsIG5ld1dpbmRvdywgdGFiRm9sZCwgZGlzYWJsZUN1c3RvbSlcXG4gICAgICAgIGVsc2UgcmV0dXJuICQoJ2hpa2VyOi8vZmlsZXMvdG1wLycgKyBRSU5HX1RJVExFICsgJ19iYWNrdXAuanNvbicsICfovpPlhaXlpIfku73ot6/lvoQnKS5pbnB1dCgodXJsKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHsgdXBkYXRlSW50ZXJ2YWwsIG5ld1dpbmRvdywgdGFiRm9sZCwgZGlzYWJsZUN1c3RvbSwgY3VzdG9tRGF0YSwgcnVsZXMgfSA9IEpTT04ucGFyc2UocmVxdWVzdChpbnB1dCkpXFxuICAgICAgICAgICAgc2F2ZUZpbGUoJ3VwZGF0ZUludGVydmFsJywgdXBkYXRlSW50ZXJ2YWwpXFxuICAgICAgICAgICAgc2F2ZUZpbGUoJ25ld1dpbmRvdycsIG5ld1dpbmRvdylcXG4gICAgICAgICAgICBzYXZlRmlsZSgndGFiRm9sZCcsIHRhYkZvbGQpXFxuICAgICAgICAgICAgc2F2ZUZpbGUoJ2Rpc2FibGVDdXN0b20nLCBkaXNhYmxlQ3VzdG9tKVxcbiAgICAgICAgICAgIHNhdmVGaWxlKCdjdXN0b21EYXRhJywgY3VzdG9tRGF0YSlcXG4gICAgICAgICAgICBpZiAocnVsZXMpIHdyaXRlRmlsZSh1cmwsIHJ1bGVzKVxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKClcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bey5oGi5aSN77yM5aaC5p6c5LiN5oOz5ZCM5q2l6L+c56iL5LuT5bqT77yM5Y+v5Lul6K6+572u5pu05paw6aKR546H5Li65omL5YqoJ1xcbiAgICAgICAgfSwgdXJsKVxcbiAgICB9LCBRSU5HX1RJVExFLCB1cGRhdGVJbnRlcnZhbCwgbmV3V2luZG93LCB0YWJGb2xkLCBkaXNhYmxlQ3VzdG9tKSxcXG4gICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcbn0sIHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08Zm9udCBjb2xvcj1cXFwiIzY2NjY2NlxcXCI+PHNtYWxsPueJueWIq+m4o+iwou+8jOWwj+eoi+W6j+aPkOS+m+iAhe+8muWbouWtkC/lopnkvawv6YGT6ZW/LyAgICDlsI/nqIvluo/nu7TmiqTvvJrlsI/nsbPnsqVcXFxcbidcXG4gICAgICAgIC8qZGF0YS5yZWR1Y2UoKHNlbGYsIHYpID0+IHYuYXV0aG9yID8gc2VsZi5jb25jYXQodi5hdXRob3Iuc3BsaXQoJyYnKSkgOiBzZWxmLCBbXSlcXG4gICAgICAgIC5maWx0ZXIoKHYsIGksIGFycikgPT4gdiAmJiBhcnIuaW5kZXhPZih2KSA9PSBpKS5qb2luKCfjgIEnKSovLFxcbiAgICB1cmw6ICdoaWtlcjovL2VtcHR5JyxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbn0pXFxuZWwucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi5pu05pawJuWPjemmiFxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9VcCNub1JlZnJlc2gjI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB2ZXJzaW9uOiBNWV9QQVJBTVMudmVyc2lvbiB8fCBcXFwi6I635Y+W54mI5pys5aSx6LSl77yM6Ieq6KGM5p+l55yLXFxcIlxcbiAgICB9LFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxufSk7XFxuZWwucHVzaCh7IGNvbF90eXBlOiAnbGluZScgfSwge1xcbiAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyAn8J+TnScuc21hbGwoKSArICcmbmJzcCDpmIXmvKvlkJvoh6rlrprkuYkgJm5ic3AnLmJvbGQoKS5mb250Y29sb3IoJyM3NTc1NzUnKSArIChkaXNhYmxlQ3VzdG9tID8gJ+KdjCcgOiAn4q2VJykuc21hbGwoKSxcXG4gICAgdXJsOiAkKFsoZGlzYWJsZUN1c3RvbSA/ICflkK/nlKgnIDogJ+emgeeUqCcpICsgJ+WQiOmbhuiHquWumuS5iScsICfmuIXpmaToh6rlrprkuYnmlbDmja4nLCAn57yW6L6RSlNPTiddLCAxKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgc3dpdGNoIChpbnB1dC5zbGljZSgwLCAyKSkge1xcbiAgICAgICAgICAgIGNhc2UgJ+a4hemZpCc6XFxuICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUoJ2N1c3RvbURhdGEnKVxcbiAgICAgICAgICAgICAgICBicmVha1xcbiAgICAgICAgICAgIGNhc2UgJ+WQr+eUqCc6XFxuICAgICAgICAgICAgICAgIHNhdmVGaWxlKCdkaXNhYmxlQ3VzdG9tJywgJycpXFxuICAgICAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICAgICAgY2FzZSAn56aB55SoJzpcXG4gICAgICAgICAgICAgICAgc2F2ZUZpbGUoJ2Rpc2FibGVDdXN0b20nLCAnVCcpXFxuICAgICAgICAgICAgICAgIGlucHV0ICs9ICdcXFxcbuWwj+eoi+W6j+WQr+eUqC/npoHnlKjjgIHph43mlrDmjpLluo/nrYnmk43kvZzlnYfkuI3kvJrkvZPnjrDlnKjpppbpobXlsI/nqIvluo/liJfooajkuK0nXFxuICAgICAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICAgICAgY2FzZSAn57yW6L6RJzpcXG4gICAgICAgICAgICAgICAgbGV0IHVybCA9IGdldE15VmFyKCdyZW1vdGVVcmwnKVxcbiAgICAgICAgICAgICAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdoaWtlcjovL2ZpbGVzLycpICYmICF1cmwuc3RhcnRzV2l0aCgnZmlsZTovLycpKVxcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gJ2hpa2VyOi8vZmlsZXMvbGlicy8nICsgbWQ1KHVybCkgKyAnLmpzJ1xcbiAgICAgICAgICAgICAgICByZXR1cm4gICdoaWtlcjovL3BhZ2UvaW50ZXJmYWNlI25vUmVmcmVzaCMjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP3J1bGU9SlNPTue8lui+keWZqCZKc29uPScrYmFzZTY0RW5jb2RlKHVybClcXG4gICAgICAgIH1cXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+W3sicgKyBpbnB1dFxcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXG4gICAgZXh0cmE6IHsgbGluZVZpc2libGU6IGZhbHNlIH1cXG59KTsvKlxcbihkaXNhYmxlQ3VzdG9tID8gWyflr7zlhaXmtbfpmJQnXSA6IFsn5ZCv55SoL+emgeeUqCcsICfph43mlrDmjpLluo8nLCAn5pu05pS55Zu+5qCHJywgJ+WvvOWFpea1t+mYlCddKS5mb3JFYWNoKCh2KSA9PiB7XFxuICAgIGVsLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IHYgPT0gZWRpdE1vZGUgPyAn4oCc4oCc4oCd4oCdJyArIHYuYm9sZCgpLmZvbnRjb2xvcignIzEyYjY2OCcpIDogdixcXG4gICAgICAgIHVybDogdiA9PSBlZGl0TW9kZSA/ICdoaWtlcjovL2VtcHR5JyA6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHYpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcignZWRpdE1vZGUnLCB2KVxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICAgIH0sIHYpLFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcbiAgICB9KVxcbn0pO1xcbmlmIChlZGl0TW9kZSA9PSAn5a+85YWl5rW36ZiUJykgZWwucHVzaCh7XFxuICAgIHRpdGxlOiAn5YWo6YOo5a+85YWlJyxcXG4gICAgdXJsOiAn5rW36ZiU6KeG55WM77+laG9tZV9ydWxlX3VybO+/pScgKyAodXJsLnN0YXJ0c1dpdGgoJ2hpa2VyOi8vJykgfHwgdXJsLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSA/IHVybCA6ICdoaWtlcjovL2ZpbGVzL2xpYnMvJyArIG1kNSh1cmwpICsgJy5qcycpLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICBleHRyYTogeyBsaW5lVmlzaWJsZTogZmFsc2UgfVxcbn0pO1xcbihkaXNhYmxlQ3VzdG9tID8gZGF0YSA6IEpTT04ucGFyc2UocmVhZEZpbGUoJ2N1c3RvbURhdGEnKSB8fCAnW10nKSkuZm9yRWFjaCgodiwgaSkgPT4ge1xcbiAgICBsZXQgZCA9IHsgdGl0bGU6IHYudGl0bGUsIGltZzogZGF0YVtpXS5pY29uIH1cXG4gICAgc3dpdGNoIChlZGl0TW9kZSkge1xcbiAgICAgICAgY2FzZSAn5ZCv55SoL+emgeeUqCc6XFxuICAgICAgICAgICAgZC50aXRsZSA9ICh2LnZpc2libGUgPyAn8J+foiAgJyA6ICfwn5S0ICAnKSArIGQudGl0bGVcXG4gICAgICAgICAgICBkLnVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gSlNPTi5wYXJzZShyZWFkRmlsZSgnY3VzdG9tRGF0YScpIHx8ICdbXScpXFxuICAgICAgICAgICAgICAgIHJ1bGVzW2ldLnZpc2libGUgPSAhcnVsZXNbaV0udmlzaWJsZVxcbiAgICAgICAgICAgICAgICBzYXZlRmlsZSgnY3VzdG9tRGF0YScsIEpTT04uc3RyaW5naWZ5KHJ1bGVzKSlcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxuICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICAgICAgICB9LCBpKVxcbiAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICBjYXNlICfph43mlrDmjpLluo8nOlxcbiAgICAgICAgICAgIGxldCBzb3J0RmxhZyA9IHBhcnNlSW50KGdldE15VmFyKCdzb3J0RmxhZycsICctMScpKVxcbiAgICAgICAgICAgIGQudGl0bGUgPSAoc29ydEZsYWcgPT0gaSA/ICfwn5SDICAnIDogJycpICsgZC50aXRsZVxcbiAgICAgICAgICAgIGlmIChzb3J0RmxhZyA9PSAtMSlcXG4gICAgICAgICAgICAgICAgZC51cmwgPSAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcignc29ydEZsYWcnLCBpLnRvU3RyaW5nKCkpXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/pgInmi6nopoHnp7vliqjliLDnmoTkvY3nva4nXFxuICAgICAgICAgICAgICAgIH0sIGkpXFxuICAgICAgICAgICAgZWxzZVxcbiAgICAgICAgICAgICAgICBkLnVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKG9sZEluZGV4LCBuZXdJbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gSlNPTi5wYXJzZShyZWFkRmlsZSgnY3VzdG9tRGF0YScpIHx8ICdbXScpXFxuICAgICAgICAgICAgICAgICAgICBydWxlcy5zcGxpY2UobmV3SW5kZXgsIDAsIHJ1bGVzLnNwbGljZShvbGRJbmRleCwgMSlbMF0pXFxuICAgICAgICAgICAgICAgICAgICBzYXZlRmlsZSgnY3VzdG9tRGF0YScsIEpTT04uc3RyaW5naWZ5KHJ1bGVzKSlcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCdzb3J0RmxhZycsICctMScpXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXG4gICAgICAgICAgICAgICAgfSwgc29ydEZsYWcsIGkpXFxuICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgIGNhc2UgJ+abtOaUueWbvuaghyc6XFxuICAgICAgICAgICAgZC51cmwgPSAkKHYuaWNvbiB8fCAnJywgJ+i+k+WFpeaWsOWbvuagh+WcsOWdgOaIluminOiJsuS7o+egge+8micpLmlucHV0KChpKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IEpTT04ucGFyc2UocmVhZEZpbGUoJ2N1c3RvbURhdGEnKSB8fCAnW10nKVxcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQpXFxuICAgICAgICAgICAgICAgICAgICBydWxlc1tpXS5pY29uID0gaW5wdXRcXG4gICAgICAgICAgICAgICAgZWxzZVxcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJ1bGVzW2ldLmljb25cXG4gICAgICAgICAgICAgICAgc2F2ZUZpbGUoJ2N1c3RvbURhdGEnLCBKU09OLnN0cmluZ2lmeShydWxlcykpXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICAgICAgfSwgaSlcXG4gICAgICAgICAgICBicmVha1xcbiAgICAgICAgY2FzZSAn5a+85YWl5rW36ZiUJzpcXG4gICAgICAgICAgICBkLnVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9kYXRhTG9hZD9ydWxlPScgKyBnZXRNeVZhcignbXlDb2xsZWN0aW9uJyksIHRydWUpXFxuICAgICAgICAgICAgICAgIHJldHVybiAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoZGF0YVtpXSkpXFxuICAgICAgICAgICAgfSwgaSlcXG4gICAgICAgICAgICBicmVha1xcbiAgICB9XFxuICAgIGVsLnB1c2goZClcXG59KSovXFxuKGRpc2FibGVDdXN0b20gPyBbJ+WvvOWFpea1t+mYlCddIDogWyflkK/nlKgv56aB55SoJywgJ+mHjeaWsOaOkuW6jycsICfmm7TmlLnlm77moIcnLCAn5a+85YWl5rW36ZiUJ10pLmZvckVhY2goKHYpID0+IHtcXG4gICAgZWwucHVzaCh7XFxuICAgICAgICB0aXRsZTogdiA9PSBlZGl0TW9kZSA/ICfigJzigJzigJ3igJ0nICsgdi5ib2xkKCkuZm9udGNvbG9yKCcjMTJiNjY4JykgOiB2LFxcbiAgICAgICAgdXJsOiB2ID09IGVkaXRNb2RlID8gJ2hpa2VyOi8vZW1wdHknIDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgodikgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKCdlZGl0TW9kZScsIHYpXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxuICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICAgICAgfSwgdiksXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxuICAgIH0pXFxufSk7XFxuaWYoZWRpdE1vZGUgPT09ICflr7zlhaXmtbfpmJQnKSB7XFxuICAgIGVsLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J+aQnOe0oicsXFxuICAgICAgICBkZXNjOifovpPlhaXlsI/nqIvluo/moIfpoph85Zyw5Z2A6L+b6KGM5pCc57SiLi4uJyxcXG4gICAgICAgIHVybDokLnRvU3RyaW5nKCgpPT57XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTonaW5wdXQnLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBvbkNoYW5nZTogXFxcInB1dE15VmFyKCdpbXBvcnRTZWFyY2hLZXknLGlucHV0KVxcXCIsXFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiB0cnVlLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTpnZXRNeVZhcignaW1wb3J0U2VhcmNoS2V5JywnJylcXG4gICAgICAgIH0sXFxuICAgIH0pO1xcbiAgICBlbC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn5YWo6YOo5a+85YWlKOmdnuaQnOe0oui/h+a7pOWQjue7k+aenCknLFxcbiAgICAgICAgdXJsOiAn5rW36ZiU6KeG55WM77+laG9tZV9ydWxlX3VybO+/pScgKyAodXJsLnN0YXJ0c1dpdGgoJ2hpa2VyOi8vJykgfHwgdXJsLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSA/IHVybCA6ICdoaWtlcjovL2ZpbGVzL2xpYnMvJyArIG1kNSh1cmwpICsgJy5qcycpLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXG4gICAgICAgIGV4dHJhOiB7bGluZVZpc2libGU6IGZhbHNlfVxcbiAgICB9KTtcXG59XFxudmFyIGRhdGFzID0gKGRpc2FibGVDdXN0b20gPyBkYXRhIDogSlNPTi5wYXJzZShyZWFkRmlsZSgnY3VzdG9tRGF0YScpIHx8ICdbXScpKTtcXG5sZXQgc2sgPSBnZXRNeVZhcignaW1wb3J0U2VhcmNoS2V5JywnJyk7XFxuaWYoZWRpdE1vZGUgPT09ICflr7zlhaXmtbfpmJQnJiZzaykge1xcbiAgICBkYXRhcyA9IGRhdGFzLmZpbHRlcihpdD0+aXQudGl0bGUuaW5jbHVkZXMoc2spfHwoaXQudXJsJiZpdC51cmwuaW5jbHVkZXMoc2spKSk7XFxuICAgIGRhdGEgPSBkYXRhLmZpbHRlcihpdD0+aXQudGl0bGUuaW5jbHVkZXMoc2spfHwoaXQudXJsJiZpdC51cmwuaW5jbHVkZXMoc2spKSk7XFxufVxcbmRhdGFzLmZvckVhY2goKHYsIGkpID0+IHtcXG4gICAgbGV0IGQgPSB7IHRpdGxlOiB2LnRpdGxlLCBpbWc6IGRhdGFbaV0uaWNvbiB9XFxuICAgIHN3aXRjaCAoZWRpdE1vZGUpIHtcXG4gICAgICAgIGNhc2UgJ+WQr+eUqC/npoHnlKgnOlxcbiAgICAgICAgICAgIGQudGl0bGUgPSAodi52aXNpYmxlID8gJ/Cfn6IgICcgOiAn8J+UtCAgJykgKyBkLnRpdGxlXFxuICAgICAgICAgICAgZC51cmwgPSAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IEpTT04ucGFyc2UocmVhZEZpbGUoJ2N1c3RvbURhdGEnKSB8fCAnW10nKVxcbiAgICAgICAgICAgICAgICBydWxlc1tpXS52aXNpYmxlID0gIXJ1bGVzW2ldLnZpc2libGVcXG4gICAgICAgICAgICAgICAgc2F2ZUZpbGUoJ2N1c3RvbURhdGEnLCBKU09OLnN0cmluZ2lmeShydWxlcykpXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICAgICAgfSwgaSlcXG4gICAgICAgICAgICBicmVha1xcbiAgICAgICAgY2FzZSAn6YeN5paw5o6S5bqPJzpcXG4gICAgICAgICAgICBsZXQgc29ydEZsYWcgPSBwYXJzZUludChnZXRNeVZhcignc29ydEZsYWcnLCAnLTEnKSlcXG4gICAgICAgICAgICBkLnRpdGxlID0gKHNvcnRGbGFnID09IGkgPyAn8J+UgyAgJyA6ICcnKSArIGQudGl0bGVcXG4gICAgICAgICAgICBpZiAoc29ydEZsYWcgPT0gLTEpXFxuICAgICAgICAgICAgICAgIGQudXJsID0gJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoJ3NvcnRGbGFnJywgaS50b1N0cmluZygpKVxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6YCJ5oup6KaB56e75Yqo5Yiw55qE5L2N572uJ1xcbiAgICAgICAgICAgICAgICB9LCBpKVxcbiAgICAgICAgICAgIGVsc2VcXG4gICAgICAgICAgICAgICAgZC51cmwgPSAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChvbGRJbmRleCwgbmV3SW5kZXgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IEpTT04ucGFyc2UocmVhZEZpbGUoJ2N1c3RvbURhdGEnKSB8fCAnW10nKVxcbiAgICAgICAgICAgICAgICAgICAgcnVsZXMuc3BsaWNlKG5ld0luZGV4LCAwLCBydWxlcy5zcGxpY2Uob2xkSW5kZXgsIDEpWzBdKVxcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbGUoJ2N1c3RvbURhdGEnLCBKU09OLnN0cmluZ2lmeShydWxlcykpXFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcignc29ydEZsYWcnLCAnLTEnKVxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgICAgICAgICAgICAgIH0sIHNvcnRGbGFnLCBpKVxcbiAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICBjYXNlICfmm7TmlLnlm77moIcnOlxcbiAgICAgICAgICAgIGQudXJsID0gJCh2Lmljb24gfHwgJycsICfovpPlhaXmlrDlm77moIflnLDlnYDmiJbpopzoibLku6PnoIHvvJonKS5pbnB1dCgoaSkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBKU09OLnBhcnNlKHJlYWRGaWxlKCdjdXN0b21EYXRhJykgfHwgJ1tdJylcXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0KVxcbiAgICAgICAgICAgICAgICAgICAgcnVsZXNbaV0uaWNvbiA9IGlucHV0XFxuICAgICAgICAgICAgICAgIGVsc2VcXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBydWxlc1tpXS5pY29uXFxuICAgICAgICAgICAgICAgIHNhdmVGaWxlKCdjdXN0b21EYXRhJywgSlNPTi5zdHJpbmdpZnkocnVsZXMpKVxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXG4gICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICAgICAgICAgIH0sIGkpXFxuICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgIGNhc2UgJ+WvvOWFpea1t+mYlCc6XFxuICAgICAgICAgICAgZC51cmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoZGF0YVtpXSkpO1xcbiAgICAgICAgICAgIGJyZWFrXFxuICAgIH1cXG4gICAgZWwucHVzaChkKVxcbn0pXFxuc2V0UmVzdWx0KGVsKVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6aG16Z2i6L295YWlXCIsXCJwYXRoXCI6XCJmcmFtZUxvYWRcIixcInJ1bGVcIjpcImpzOlxcbmNvbnN0IFFJTkdfVElUTEUgPSBnZXRNeVZhcignbXlDb2xsZWN0aW9uJylcXG52YXIgbXlDb2xsX2VsID0gW11cXG5ldmFsKEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vcGFnZS9oaWphY2tFbnY/cnVsZT0nICsgUUlOR19USVRMRSkpLnJ1bGUpXFxuXFxuaWYgKCFpc0luZGV4KSB7XFxuICAgIGlmIChwYWdlVGl0bGUpIHNldFBhZ2VUaXRsZShwYWdlVGl0bGUpXFxuICAgIHNldExhc3RDaGFwdGVyUnVsZShvcmlSVUxFLmxhc3RfY2hhcHRlcl9ydWxlKVxcbiAgICBNWV9QQVJBTVMgPSBNWV9SVUxFLnBhcmFtc1xcbn0gZWxzZSBpZiAoTVlfUEFHRSA9PSAxKSB7XFxuICAgIHRhYkhlYWRlci5sb2FkKG15Q29sbF9lbClcXG4gICAgaWYgKFJVTEUuc2VhcmNoX3VybCkgbXlDb2xsX2VsLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLmkJzntKJcXFwiLFxcbiAgICAgICAgZGVzYzogXFxcIui/meaYr+mYhea8q+WQm+eahOaQnOe0ouWTpn5+XFxcIixcXG4gICAgICAgIHVybDogJ1xcXCJoaWtlcjovL3NlYXJjaD9zPVxcXCIraW5wdXQnLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBydWxlczogJC50b1N0cmluZygoUUlOR19USVRMRSwgdGl0bGUpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZGF0YUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRSlcXG4gICAgICAgICAgICAgICAgcnVsZXMgPSBbcnVsZXMuZmluZCgodikgPT4gdi50aXRsZSA9PSB0aXRsZSldXFxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShydWxlcylcXG4gICAgICAgICAgICB9LCBRSU5HX1RJVExFLCBSVUxFLnRpdGxlKSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKCdzZWFyY2hLZXknLCAnJyksXFxuICAgICAgICAgICAgb25DaGFuZ2U6IFxcXCJwdXRNeVZhcignc2VhcmNoS2V5JyxpbnB1dClcXFwiXFxuICAgICAgICB9LFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIH0pXFxufVxcbi8vIOato+aWh+ino+aekFxcbnZhciB7XFxuICAgIHBhcmFtSGFuZGxlLFxcbiAgICBydW5QcmVSdWxlLFxcbiAgICBnZW5FeFVybCxcXG4gICAgaGlqYWNrTGF6eVJ1bGVcXG59ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZnVuY1Rvb2xzP3J1bGU9JyArIFFJTkdfVElUTEUpXFxucnVuUHJlUnVsZShvcmlSVUxFLnByZVJ1bGUpXFxuaWYgKE1ZX1JVTEUuZmluZF9ydWxlLnN0YXJ0c1dpdGgoJ2pzOicpKSB7XFxuICAgIGxldCB7IGhpamFja0VsIH0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9mdW5jVG9vbHM/cnVsZT0nICsgUUlOR19USVRMRSlcXG4gICAgc2V0UmVzdWx0ID0gZnVuY3Rpb24ocGFyYW0wLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKSB7XFxuICAgICAgICBwYXJhbTEgPSBDQUxMQkFDS19LRVlcXG4gICAgICAgIHBhcmFtMiA9IE1ZX1JVTEVcXG4gICAgICAgIHBhcmFtMyA9IE1ZX1RZUEVcXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtMC5kYXRhKSkgcGFyYW0wID0gcGFyYW0wLmRhdGFcXG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KG15Q29sbF9lbCwgcGFyYW0wLm1hcChoaWphY2tFbCkpXFxuICAgICAgICBtZXRob2Rfc2V0UmVzdWx0Lmludm9rZShqYXZhQ29udGV4dCwgbXlDb2xsX2VsLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zKVxcbiAgICB9XFxuICAgIHNldEhvbWVSZXN1bHQgPSBzZXRSZXN1bHRcXG4gICAgc2V0U2VhcmNoUmVzdWx0ID0gc2V0UmVzdWx0XFxuXFxuICAgIGV2YWwoTVlfUlVMRS5maW5kX3J1bGUuc2xpY2UoMykpXFxufSBlbHNlIHtcXG4gICAgbGV0IHsgcnVuQ29kZSB9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZnVuY1Rvb2xzP3J1bGU9JyArIFFJTkdfVElUTEUpLFxcbiAgICAgICAgW18sIGZpbmRSdWxlLCBkZXRhaWxGaW5kUnVsZV0gPSBNWV9SVUxFLmZpbmRfcnVsZS5tYXRjaCgvXihbXFxcXHNcXFxcU10qPykoPzo9PT4oW1xcXFxzXFxcXFNdKikpPyQvKVxcbiAgICBmaW5kUnVsZSA9IGZpbmRSdWxlLnNwbGl0KCc7JylcXG4gICAgcGFyc2VEb21Gb3JBcnJheShnZXRSZXNDb2RlKCksIGZpbmRSdWxlLnNoaWZ0KCkpLmZvckVhY2goKGRhdGEpID0+IHtcXG4gICAgICAgIGxldCBbdGl0bGUsIGltZywgZGVzYywgdXJsXSA9IGZpbmRSdWxlLm1hcCgodiwgaSkgPT4ge1xcbiAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHYgPT0gJyonKSByZXR1cm4gJydcXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgdiA9IChpID09IDEgfHwgaSA9PSAzKSA/XFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VEb20oZGF0YSwgdikgOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlRG9tRm9ySHRtbChkYXRhLCB2KVxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gMykgdiA9IHJ1bkNvZGUodilcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuICcnIH1cXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICByZXMgPSB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZSwgdXJsOiB1cmwsXFxuICAgICAgICAgICAgICAgIGRlc2M6IGRlc2MsIGltZzogaW1nLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogTVlfUlVMRS5jb2xfdHlwZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIGlmIChyZXMudXJsKSB7XFxuICAgICAgICAgICAgaWYgKHJlcy51cmwuaW5jbHVkZXMoJ0BsYXp5UnVsZT0nKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgcmVJbmRleCA9IHJlcy51cmwuaW5kZXhPZignLmpzOicpXFxuICAgICAgICAgICAgICAgIGlmIChyZUluZGV4ID49IDApIHJlcy51cmwgPSByZXMudXJsLnNsaWNlKDAsIHJlSW5kZXgpICsgJy5qczonICsgaGlqYWNrTGF6eVJ1bGUgKyAnOycgKyByZXMudXJsLnNsaWNlKHJlSW5kZXggKyA0KVxcbiAgICAgICAgICAgIH0gZWxzZSAgaWYgKGRldGFpbEZpbmRSdWxlKSB7XFxuICAgICAgICAgICAgICAgIHJlcy5leHRyYSA9IHtcXG4gICAgICAgICAgICAgICAgICAgIHVybDogZ2VuRXhVcmwodXJsKSxcXG4gICAgICAgICAgICAgICAgICAgIFJVTEU6IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShPYmplY3QuYXNzaWduKGdlbk15UnVsZSgpLCB7IGRldGFpbF9maW5kX3J1bGU6IGRldGFpbEZpbmRSdWxlIH0pKSksXFxuICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IGlzSW5kZXggJiYgdGl0bGVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXMudXJsID0gJ2hpa2VyOi8vcGFnZS9mcmFtZUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRVxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoTVlfUlVMRS5kZXRhaWxfZmluZF9ydWxlKSB7XFxuICAgICAgICAgICAgICAgIHJlcy5leHRyYSA9IHtcXG4gICAgICAgICAgICAgICAgICAgIHVybDogZ2VuRXhVcmwodXJsKSxcXG4gICAgICAgICAgICAgICAgICAgIFJVTEU6IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShnZW5NeVJ1bGUoKSkpLFxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBpc0luZGV4ICYmIHRpdGxlXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmVzLnVybCA9ICdoaWtlcjovL3BhZ2UvZnJhbWVMb2FkP3J1bGU9JyArIFFJTkdfVElUTEVcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBteUNvbGxfZWwucHVzaChyZXMpXFxuICAgIH0pXFxuICAgIHNldFJlc3VsdChteUNvbGxfZWwpXFxufVxcblwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5pWw5o2u6L295YWlXCIsXCJwYXRoXCI6XCJkYXRhTG9hZFwiLFwicnVsZVwiOlwibGV0IHNob3dBbGwgPSAkLmltcG9ydFBhcmFtLFxcbiAgICB1cmwgPSBnZXRNeVZhcigncmVtb3RlVXJsJyksXFxuICAgIGRhdGEgPSBbXVxcbmlmICh1cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XFxuICAgIC8vIOWmguaenOS4uuacrOWcsOaWh+S7tuWImeS4jei/m+ihjOe8k+WtmFxcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IG9yaURhdGEgPSBmZXRjaCh1cmwpXFxuICAgICAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2hpa2VyOi8vcGFnZS8nKSlcXG4gICAgICAgICAgICBvcmlEYXRhID0gSlNPTi5wYXJzZShvcmlEYXRhKS5ydWxlXFxuICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShvcmlEYXRhKVxcbiAgICB9IGNhdGNoIChlKSB7fVxcbn0gZWxzZSB7XFxuICAgIC8vIOiOt+WPlui/nOeoi+aVsOaNru+8jOajgOafpemXtOmalOm7mOiupOS4gOWkqVxcbiAgICBsZXQgaW50ZXJ2YWwgPSBwYXJzZUludChyZWFkRmlsZSgndXBkYXRlSW50ZXJ2YWwnKSB8fCAnMScpLFxcbiAgICAgICAgb2xkRGF0YSA9IGZldGNoKCdoaWtlcjovL2ZpbGVzL2xpYnMvJyArIG1kNSh1cmwpICsgJy5qcycpLFxcbiAgICAgICAgcmVtb3RlRGF0YSA9IFtdXFxuICAgIGlmIChpbnRlcnZhbCA9PSAwKSBpbnRlcnZhbCA9IC0xXFxuICAgIHRyeSB7IHJlbW90ZURhdGEgPSBKU09OLnBhcnNlKGZldGNoQ2FjaGUodXJsLCAyNCAqIGludGVydmFsLCB7IHRpbWVvdXQ6IDUwMDAwIH0pKSB9IGNhdGNoIChlKSB7fVxcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkocmVtb3RlRGF0YSkpIHJlbW90ZURhdGEgPSBbXVxcbiAgICBpZiAocmVtb3RlRGF0YS5sZW5ndGggPCAzKSB7XFxuICAgICAgICBsb2coJ+acquiOt+WPluWIsOaVsOaNricpXFxuICAgICAgICBpZiAob2xkRGF0YSkgd3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL2xpYnMvJyArIG1kNSh1cmwpICsgJy5qcycsIG9sZERhdGEpXFxuICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShvbGREYXRhIHx8ICdbXScpXFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBsb2coJ+W3suiOt+WPluWIsOaVsOaNricpXFxuICAgICAgICBkYXRhID0gcmVtb3RlRGF0YVxcbiAgICB9XFxufVxcbmRhdGEgPSBkYXRhLmZpbHRlcigodikgPT4gdi50aXRsZSAhPSBnZXRNeVZhcignbXlDb2xsZWN0aW9uJykgJiYgISh2LmF1dGhvciB8fCAnJykuaW5jbHVkZXMoJ+mYhea8q+WQm+eUn+aIkOWZqCcpKVxcbmlmIChyZWFkRmlsZSgnZGlzYWJsZUN1c3RvbScpKSAkLmV4cG9ydHMgPSBkYXRhXFxuZWxzZSB7IC8vIOWGmeWFpeiHquWumuS5ieaVsOaNrlxcbiAgICBsZXQgY3VzdG9tRGF0YSA9IEpTT04ucGFyc2UocmVhZEZpbGUoJ2N1c3RvbURhdGEnKSB8fCAnW10nKSxcXG4gICAgICAgIHJld3JpdGVEYXRhID0gW11cXG4gICAgY3VzdG9tRGF0YSA9IGN1c3RvbURhdGEucmVkdWNlKChzZWxmLCB2KSA9PiB7XFxuICAgICAgICBsZXQgaW5kZXggPSBkYXRhLmZpbmRJbmRleCgodnYpID0+IHYudGl0bGUgPT0gdnYudGl0bGUpXFxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xcbiAgICAgICAgICAgIHNlbGYucHVzaCh2KVxcbiAgICAgICAgICAgIGxldCBydWxlID0gZGF0YS5zcGxpY2UoaW5kZXgsIDEpWzBdXFxuICAgICAgICAgICAgaWYgKHNob3dBbGwgfHwgdi52aXNpYmxlKVxcbiAgICAgICAgICAgICAgICByZXdyaXRlRGF0YS5wdXNoKE9iamVjdC5hc3NpZ24ocnVsZSwgdikpXFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gc2VsZlxcbiAgICB9LCBbXSlcXG4gICAgZGF0YS5mb3JFYWNoKCh2KSA9PiBjdXN0b21EYXRhLnB1c2goeyB0aXRsZTogdi50aXRsZSwgdmlzaWJsZTogdHJ1ZSB9KSlcXG4gICAgc2F2ZUZpbGUoJ2N1c3RvbURhdGEnLCBKU09OLnN0cmluZ2lmeShjdXN0b21EYXRhKSlcXG4gICAgJC5leHBvcnRzID0gcmV3cml0ZURhdGEuY29uY2F0KGRhdGEpXFxufVxcblwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6ZO+5o6l5aSE55CGKlwiLFwicGF0aFwiOlwidXJsUGFyc2VcIixcInJ1bGVcIjpcIi8vIOmmlumhtemTvuaOpeabv+aNouWIhuexu1xcbmZ1bmN0aW9uIGluZGV4VXJsKHBhcmFtKSB7XFxuICAgIGZ1bmN0aW9uIHJ1bkNvZGUocnVsZSkge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgW2lucHV0LCBjb2RlXSA9IHJ1bGUuc3BsaXQoJy5qczonKVxcbiAgICAgICAgICAgIHJldHVybiBjb2RlID8gZXZhbChjb2RlKSA6IHJ1bGVcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgcmV0dXJuIHJ1bGUgfVxcbiAgICB9XFxuICAgIGxldCB7IFJVTEUsIHBhZ2VOdW0sIFFJTkdfVElUTEUgfSA9IEpTT04ucGFyc2UocGFyYW0uc3BsaXQoJyMjIycpWzFdKVxcbiAgICBSVUxFID0gSlNPTi5wYXJzZShiYXNlNjREZWNvZGUoUlVMRSkpXFxuICAgIHBhZ2VOdW0gPSBwYXJzZUludChwYWdlTnVtKVxcbiAgICBsZXQgdXJsID0gUlVMRS51cmxcXG5cXG4gICAgZXZhbChKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL3BhZ2UvQ2xhc3NUYWI/cnVsZT0nICsgUUlOR19USVRMRSkpLnJ1bGUpXFxuICAgIHVybCA9IHRhYkhlYWRlci5zZXRVcmwoZnlBbGwgPyB1cmwucmVwbGFjZSgvZnlBbGwvZywgJyQke2Z5QWxsfScpIDogdXJsLnJlcGxhY2UoL2Z5KGNsYXNzfGFyZWF8eWVhcnxzb3J0KS9nLCAnJCR7ZnkkMX0nKSlcXG4gICAgdXJsID0gdXJsLnJlcGxhY2UoL2Z5cGFnZSg/OkAoLT9cXFxcZCspQCk/KD86XFxcXCooXFxcXGQrKUApPy9nLCAoXywgc3RhcnQsIHNwYWNlKSA9PiBwYXJzZUludChzdGFydCB8fCAwKSArIDEgKyAocGFnZU51bSAtIDEpICogcGFyc2VJbnQoc3BhY2UgfHwgMSkpXFxuICAgIHVybCA9IC9eKFtcXFxcc1xcXFxTXSo/KSg/OlxcXFxbZmlyc3RQYWdlPShbXFxcXHNcXFxcU10qPylcXFxcXSk/KD86KFxcXFwuanM6W1xcXFxzXFxcXFNdKj8pKT8kLy5leGVjKHVybClcXG4gICAgaWYgKHBhZ2VOdW0gPT0gMSAmJiB1cmxbMl0pIHVybFsxXSA9IHVybFsyXVxcbiAgICBpZiAodXJsWzNdICYmICF1cmxbMV0uaW5jbHVkZXMoJy5qczonKSkgdXJsWzFdICs9IHVybFszXVxcbiAgICByZXR1cm4gcnVuQ29kZSh1cmxbMV0pXFxufVxcbmZ1bmN0aW9uIHBhcmFtSGFuZGxlKHVybFBhcmFtLCB1YSwgdXJsVG1wKSB7XFxuICAgIGxldCBjaGFyc2V0LCBwYXJhbVRtcFxcbiAgICB0cnkgeyAvLyDpk77mjqXnmoTnvJbnoIHjgIFVQeWSjFJlZmVyZXLlupTor6XmmK/pppblhYjnu6fmib/pppbpobXpk77mjqVcXG4gICAgICAgIFssICwgY2hhcnNldCwgcGFyYW1UbXBdID0gdXJsVG1wLnNwbGl0KCc7JylcXG4gICAgICAgIHBhcmFtVG1wID0gcGFyYW1UbXAubWF0Y2goL157KC4qKX0kLylbMV0uc3BsaXQoJyYmJylcXG4gICAgfSBjYXRjaCAoZSkgeyBwYXJhbVRtcCA9IFtdIH1cXG4gICAgbGV0IFVzZXJBZ2VudCA9IHBhcmFtVG1wLmZpbmQoKHYpID0+IHYuc3RhcnRzV2l0aCgnVXNlci1BZ2VudEAnKSksXFxuICAgICAgICBSZWZlcmVyID0gcGFyYW1UbXAuZmluZCgodikgPT4gdi5zdGFydHNXaXRoKCdSZWZlcmVyQCcpKVxcbiAgICB1cmxQYXJhbVswXSA9IHVybFBhcmFtWzBdIHx8ICdHRVQnXFxuICAgIHVybFBhcmFtWzFdID0gdXJsUGFyYW1bMV0gfHwgY2hhcnNldCB8fCAnVVRGLTgnXFxuICAgIHRyeSB7XFxuICAgICAgICB1cmxQYXJhbVsyXSA9IHVybFBhcmFtWzJdLm1hdGNoKC9eeyguKil9JC8pWzFdLnNwbGl0KCcmJicpXFxuICAgIH0gY2F0Y2ggKGUpIHsgdXJsUGFyYW1bMl0gPSBbXSB9XFxuICAgIC8vIOa3u+WKoOWFqOWxgFVB5ZKM5LiK57qnUmVmZXJlclxcbiAgICBpZiAoIXVybFBhcmFtWzJdLnNvbWUoKHYpID0+IHYuc3RhcnRzV2l0aCgnVXNlci1BZ2VudEAnKSkpIHtcXG4gICAgICAgIGlmIChVc2VyQWdlbnQpIHVybFBhcmFtWzJdLnB1c2goVXNlckFnZW50KVxcbiAgICAgICAgZWxzZSBpZiAodWEgPT0gJ3BjJylcXG4gICAgICAgICAgICB1cmxQYXJhbVsyXS5wdXNoKCdVc2VyLUFnZW50QCcgKyBQQ19VQS5yZXBsYWNlKC87L2csICfvvJvvvJsnKS5yZXBsYWNlKC9cXFxcPy8sICfvvJ/vvJ8nKSlcXG4gICAgICAgIGVsc2UgaWYgKHVhID09ICdtb2JpbGUnKVxcbiAgICAgICAgICAgIHVybFBhcmFtWzJdLnB1c2goJ1VzZXItQWdlbnRAJyArIE1PQklMRV9VQS5yZXBsYWNlKC87L2csICfvvJvvvJsnKS5yZXBsYWNlKC9cXFxcPy8sICfvvJ/vvJ8nKSlcXG4gICAgfVxcbiAgICBpZiAoUmVmZXJlciAmJiAhdXJsUGFyYW1bMl0uc29tZSgodikgPT4gdi5zdGFydHNXaXRoKCdSZWZlcmVyQCcpKSlcXG4gICAgICAgIHVybFBhcmFtWzJdLnB1c2goUmVmZXJlcilcXG4gICAgdXJsUGFyYW1bMl0gPSAneycgKyB1cmxQYXJhbVsyXS5qb2luKCcmJicpICsgJ30nXFxuICAgIHJldHVybiB1cmxQYXJhbS5qb2luKCc7JylcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLkuoznuqdb5LiAXSpcIixcInBhdGhcIjpcImVqdG9vbFwiLFwicnVsZVwiOlwiZnVuY3Rpb24gY292ZXIo5qCH6aKYLCDkvZzogIUsIOWIhuexuywg54q25oCBLCDnq6DoioIsIOabtOaWsCwg566A5LuLLOWwgemdouWbvueJhyx0cnVlX3VybCwgaGFzTGluZSkge1xcclxcbnZhciDmoIfpopgsIOS9nOiAhSwg5YiG57G7LCDnirbmgIEsIOeroOiKgiwg5pu05pawLCDnroDku4ss5bCB6Z2i5Zu+54mHLHRydWVfdXJsLCBoYXNMaW5lO1xcclxcblxcdHRyeSB7XFxyXFxuXFx0XFx0ZC5wdXNoKHtcXHJcXG5cXHRcXHRcXHR0aXRsZTogJ+KAmOKAmOKAmeKAmTxzbWFsbD48Zm9udCBjb2xvcj1cXFwiI0ZBNzI5OFxcXCI+JyvkvZzogIUuc2xpY2UoMCwxNSkrXFxcIiZuYnNwO1xcXCIr54q25oCBKyc8L2ZvbnQ+PC9zbWFsbD4nKyfigJjigJjigJnigJk8c21hbGw+PGZvbnQgY29sb3I9XFxcIiNCMTVCRkZcXFwiPicrXFxcIlxcXFxuXFxcIivliIbnsbsrJzwvZm9udD48L3NtYWxsPicrJ+KAmOKAmOKAmeKAmTxzbWFsbD48Zm9udCBjb2xvcj1cXFwiI0ZGMzU5QVxcXCI+JytcXFwiXFxcXG5cXFwiK+eroOiKgitcXFwiJm5ic3A7XFxcIivmm7TmlrArJzwvZm9udD48L3NtYWxsPicsXFxyXFxuXFx0XFx0XFx0ZGVzYzon4oCY4oCY4oCZ4oCZPHNtYWxsPicgK+eugOS7iysgJzwvc21hbGw+JyxcXHJcXG5cXHRcXHRcXHRwaWNfdXJsOiAg5bCB6Z2i5Zu+54mHLFxcclxcblxcdFxcdFxcdHVybDogdHJ1ZV91cmwsXFxyXFxuXFx0XFx0XFx0Y29sX3R5cGU6ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpY19ibHVyJ1xcclxcblxcdFxcdH0pO1xcblxcdFxcdGQucHVzaCh7XFxyXFxuXFx0XFx0XFx0Y29sX3R5cGU6ICdsaW5lX2JsYW5rJyxcXHJcXG5cXHRcXHR9KTtcXG5cXHRcXHRkLnB1c2goe1xcclxcblxcdFxcdFxcdGNvbF90eXBlOiAnbGluZScsXFxyXFxuXFx0XFx0fSk7XFxyXFxuXFx0XFx0aWYgKGhhc0xpbmUpIHtcXHJcXG5cXHRcXHRcXHRpdGVtLmV4dHJhID0ge1xcclxcblxcdFxcdFxcdFxcdGxpbmVWaXNpYmxlOiBmYWxzZVxcclxcblxcdFxcdFxcdH1cXHJcXG5cXHRcXHR9XFxyXFxuXFx0XFx0ZC5wdXNoKGl0ZW0pO1xcclxcblxcdH0gY2F0Y2ggKGUpIHt9XFxyXFxufVxcclxcbmZ1bmN0aW9uIGNoYXB0ZXIodGl0bGUscGljX3VybCxjaGFwdGVyTGlzdCwgY2hhcHRlclRpdGxlLCBjaGFwdGVyVXJsLCBkZWZhdWx0T3JkZXIsIGhhc0xpbmUsZG93bmxvYWRsYXp5KSB7XFxyXFxuXFx0dmFyIGxpc3QgPSBjaGFwdGVyTGlzdDtcXHJcXG5cXHR2YXIgb3JpZ2luYWwgPSBbe1xcclxcblxcdFxcdHVybDogTVlfVVJMLFxcclxcblxcdFxcdG9yZGVyOiBkZWZhdWx0T3JkZXJcXHJcXG5cXHR9XTtcXHJcXG5cXHQhZmlsZUV4aXN0KCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpID8gKHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnLCBKU09OLnN0cmluZ2lmeShvcmlnaW5hbCkpKSA6IDA7XFxyXFxuXFx0dmFyIGxvZyA9IEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJykpO1xcclxcblxcdGZvciAodmFyIGkgaW4gbG9nKSB7XFxyXFxuXFx0XFx0aWYgKGxvZ1tpXS51cmwgPT0gTVlfVVJMKSB7XFxyXFxuXFx0XFx0XFx0dmFyIG5vdyA9IGk7XFxyXFxuXFx0XFx0XFx0dmFyIG9yZGVyID0gbG9nW2ldLm9yZGVyO1xcclxcblxcdFxcdFxcdGJyZWFrO1xcclxcblxcdFxcdH0gZWxzZSB7XFxyXFxuXFx0XFx0XFx0dmFyIG5vdyA9ICcnO1xcclxcblxcdFxcdFxcdHZhciBvcmRlciA9IGRlZmF1bHRPcmRlcjtcXHJcXG5cXHRcXHR9XFxyXFxuXFx0fVxcclxcblxcdGxldCBvcmRlckl0ZW0gPSB7XFxyXFxuXFx0XFx0dGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgJzxzdHJvbmc+PGZvbnQgY29sb3I9XFxcIiMwOThBQzFcXFwiPicgKyAn56ug6IqC5o6S5bqP4oeFJyArICc8L2ZvbnQ+PC9zdHJvbmc+JyxcXHJcXG5cXHRcXHR1cmw6IE1ZX1VSTCArIGBAbGF6eVJ1bGU9LmpzOnZhciBsb2cgPSBKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpKTt2YXIgbm93PSdgICsgbm93ICsgYCc7aWYobm93IT0nJyl7dmFyIG5vdz1wYXJzZUludChub3cpO3ZhciBvcmRlcj1sb2dbbm93XS5vcmRlcn1lbHNle3ZhciBub3c9cGFyc2VJbnQobG9nLmxlbmd0aCk7dmFyIG9yZGVyPWAgKyBkZWZhdWx0T3JkZXIgKyBgO2xvZy5wdXNoKHt1cmw6aW5wdXQsb3JkZXI6b3JkZXJ9KTt9aWYobG9nW25vd10ub3JkZXIpe2xvZ1tub3ddLm9yZGVyPTA7fWVsc2V7bG9nW25vd10ub3JkZXI9MTt9O3dyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnLCBKU09OLnN0cmluZ2lmeShsb2cpKTtyZWZyZXNoUGFnZSgpOydoaWtlcjovL2VtcHR5J2AsXFxyXFxuXFx0XFx0Y29sX3R5cGU6ICd0ZXh0XzInXFxyXFxuXFx0fVxcclxcblxcdGlmIChoYXNMaW5lKSB7XFxyXFxuXFx0XFx0b3JkZXJJdGVtLnRpdGxlID0gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAnPHN0cm9uZz48Zm9udCBjb2xvcj1cXFwiIzA5OEFDMVxcXCI+JyArICfpm4bmlbDmjpLluo/ih4UnICsgJzwvZm9udD48L3N0cm9uZz4nO1xcclxcblxcdFxcdG9yZGVySXRlbS5jb2xfdHlwZSA9IFxcXCJ0ZXh0XzJcXFwiXFxyXFxuXFx0fVxcclxcblxcdGxldCBjaGFwdGVyTGlzdHMgPSBsaXN0Lm1hcCgoaXRlbSk9Pih7XFxyXFxuXFx0XFx0dGl0bGU6IHBkZmgoaXRlbSxcXFwiYSYmVGV4dFxcXCIpLFxcclxcblxcdFxcdHVybDogcGQoaXRlbSxcXFwiYSYmaHJlZlxcXCIpLFxcclxcblxcdH0pKTtcXHJcXG5kLnB1c2goe1xcclxcblxcdHRpdGxlOiAn4oCY4oCY4oCZ4oCZPHN0cm9uZz48Zm9udCBjb2xvcj0gXFxcIiMwOThBQzFcXFwiPicgKyBcXFwi5LiL6L295ryr55S7XFxcIiArICc8L2Zyb250Pjwvc3Ryb25nPicsXFxyXFxuXFx0dXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2Rvd25sb2FkLnZpZXcjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjI25vUmVmcmVzaCM/cnVsZT3mnKzlnLDotYTmupDnrqHnkIZcXFwiLFxcclxcblxcdGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXHJcXG5cXHRleHRyYToge1xcclxcblxcdFxcdGNoYXB0ZXJMaXN0OiBjaGFwdGVyTGlzdHMsXFxyXFxuXFx0XFx0aW5mbzp7XFxyXFxuXFx0XFx0XFx0Ym9va05hbWU6IHRpdGxlLFxcclxcblxcdFxcdFxcdHJ1bGVOYW1lOiBNWV9SVUxFLnRpdGxlLFxcclxcblxcdFxcdFxcdGJvb2tUb3BQaWM6IHBpY191cmwsXFxyXFxuXFx0XFx0XFx0cGFyc2VDb2RlOiBkb3dubG9hZGxhenlcXHJcXG5cXHRcXHR9LFxcclxcblxcdFxcdGRlZmF1bHRWaWV3OlxcXCIxXFxcIlxcclxcblxcdH1cXHJcXG59KTtcXHJcXG5cXHRkLnB1c2goe1xcclxcblxcdFxcdHRpdGxlOiAn4oCY4oCY4oCZ4oCZPHN0cm9uZz48Zm9udCBjb2xvcj0gXFxcIiMwOThBQzFcXFwiPicgKyBcXFwi5pys5Zyw5Lmm5p62XFxcIiArICc8L2Zyb250Pjwvc3Ryb25nPicsXFxyXFxuXFx0XFx0dXJsOiBcXFwiaGlrZXI6Ly9wYWdlL01haW4udmlldz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhlxcXCIsXFxyXFxuXFx0XFx0Y29sX3R5cGU6IFxcXCJ0ZXh0XzJcXFwiLFxcclxcblxcdH0pOyAgXFxyXFxuXFx0ZC5wdXNoKG9yZGVySXRlbSk7XFxyXFxuXFx0ZC5wdXNoKHtjb2xfdHlwZTogJ2xpbmUnfSk7XFx0XFxyXFxuXFx0dmFyIGxpc3QgPSBvcmRlciA/IGxpc3QgOiBsaXN0LnJldmVyc2UoKTtcXG5cXHRpZighbGlzdHx8bGlzdD09XFxcIlxcXCIpe1xcclxcblxcdFxcdGQucHVzaCh7XFxyXFxuXFx0XFx0XFx0dGl0bGU6ICfmraTmvKvnlLvlt7LkuIvmnrYhIScsXFxyXFxuXFx0XFx0XFx0Y29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXHJcXG5cXHRcXHR9KTtcXHJcXG5cXHR9XFxyXFxuXFx0Zm9yICh2YXIgaSBpbiBsaXN0KSB7XFxyXFxuXFx0XFx0dHJ5IHtcXHJcXG5cXHRcXHRcXHRkLnB1c2goe1xcclxcblxcdFxcdFxcdFxcdHRpdGxlOiBwZGZoKGxpc3RbaV0sIGNoYXB0ZXJUaXRsZSksXFxyXFxuXFx0XFx0XFx0XFx0dXJsOiBwZChsaXN0W2ldLCBjaGFwdGVyVXJsKSArIGxhenksXFxyXFxuXFx0XFx0XFx0XFx0Y29sX3R5cGU6ICd0ZXh0XzInLFxcclxcblxcdFxcdFxcdH0pO1xcclxcblxcdFxcdH1jYXRjaCAoZSkge31cXHJcXG5cXHR9XFxyXFxufVxcclxcblxcclxcbmZ1bmN0aW9uIGxpbmUobGluZUxpc3QsIGxpbmVUaXRsZVJ1bGUsIHZhcktleSkge1xcclxcblxcdGxldCBsaXN0ID0gbGluZUxpc3RcXHJcXG5cXHR2YXJLZXkgPSB2YXJLZXkgPT0gbnVsbCA/IChNWV9SVUxFLnVybCArICcjbGluZS1pbmRleCcpOiB2YXJLZXk7XFxyXFxuXFx0YWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChrZXlMaXN0KSA9PiB7XFxyXFxuXFx0XFx0Zm9yIChsZXQgaSBpbiBrZXlMaXN0KSB7Y2xlYXJWYXIoa2V5TGlzdFtpXSl9XFxyXFxuXFx0fSwgW3ZhcktleSwgTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZSddKSlcXHJcXG5cXHRsZXQgbGluZTBUaXRsZSA9ICcnO1xcclxcblxcdHRyeSB7XFxyXFxuXFx0XFx0bGluZTBUaXRsZSA9IHBkZmgobGlzdFswXSwgbGluZVRpdGxlUnVsZSkucmVwbGFjZShcXFwi56ug6IqC5YiX6KGo77yaXFxcIixcXFwiXFxcIik7XFxyXFxuXFx0fSBjYXRjaCAoZSkge31cXHJcXG5cXHRsb2coTVlfUlVMRS50aXRsZSArIGdldE15VmFyKChNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJykpKVxcclxcblxcdGZvciAobGV0IGkgaW4gbGlzdCkge1xcclxcblxcdFxcdHRyeSB7XFxyXFxuXFx0XFx0XFx0bGV0IGxpbmVUaXRsZSA9IHBkZmgobGlzdFtpXSwgbGluZVRpdGxlUnVsZSkucmVwbGFjZShcXFwi56ug6IqC5YiX6KGo77yaXFxcIixcXFwiXFxcIik7XFxyXFxuXFx0XFx0XFx0ZC5wdXNoKHtcXHJcXG5cXHRcXHRcXHRcXHR0aXRsZTogZ2V0TXlWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSwgbGluZTBUaXRsZSkgPT09IGxpbmVUaXRsZSA/IFxcXCLliIfmjaI64oCY4oCYXFxcIiArIGxpbmVUaXRsZStcXFwiXFxcIjpsaW5lVGl0bGUrXFxcIuKAmOKAmDrliIfmjaJcXFwiLFxcclxcblxcdFxcdFxcdFxcdHVybDogJCgpLmxhenlSdWxlKCh2YXJLZXksIGxpbmVJbmRleCwgbGluZVRpdGxlKSA9PiB7XFxyXFxuXFx0XFx0XFx0XFx0XFx0cHV0TXlWYXIodmFyS2V5LCBsaW5lSW5kZXgudG9TdHJpbmcoKSk7XFxyXFxuXFx0XFx0XFx0XFx0XFx0cHV0TXlWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSwgbGluZVRpdGxlKTtcXHJcXG5cXHRcXHRcXHRcXHRcXHRsb2coTVlfUlVMRS50aXRsZSArIGdldE15VmFyKChNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJykpKTtcXHJcXG5cXHRcXHRcXHRcXHRcXHRyZWZyZXNoUGFnZSgpO1xcclxcblxcdFxcdFxcdFxcdFxcdHJldHVybiBcXFwidG9hc3Q6Ly/lt7LliIfmjaLoh7NcXFwiICsgbGluZVRpdGxlO1xcclxcblxcdFxcdFxcdFxcdH0sIHZhcktleSwgaSwgbGluZVRpdGxlKSxcXHJcXG5cXHRcXHRcXHRcXHRjb2xfdHlwZTogJ3RleHRfMicsXFxyXFxuXFx0XFx0XFx0fSk7XFxyXFxuXFx0XFx0fSBjYXRjaCAoZSkge31cXHJcXG5cXHR9XFxyXFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5LqM57qnW+S6jF0qXCIsXCJwYXRoXCI6XCJjb21pY0Z1bmN0aW9uRmlsZS5qc1wiLFwicnVsZVwiOlwiZnVuY3Rpb24gY292ZXIoY292ZXJUaXRsZSwgY292ZXJUaXRsZTEsIGNvdmVyVGl0bGUyLCBjb3ZlclRpdGxlMywgY292ZXJEZXNjLCBjb3ZlclBpYywgY292ZXJVcmwsIGhhc0xpbmUpIHtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGNvbnN0IENvbG9yID0gXFxcIiMxOUI4OURcXFwiO1xcbiAgICAgICAgdmFyIGRlc19kZXNjID0gcGRmaChodG1sLCBjb3ZlckRlc2MpLnJlcGxhY2UoJ+eugOOAgOOAgOS7i++8micsICcnKS5yZXBsYWNlKCfmvKvnlLvnroDku4vvvJonLCAnJyk7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZPD48Zm9udCBjb2xvcj1cXFwiI0ZBNzI5OFxcXCI+JyArIHBkZmgoaHRtbCwgY292ZXJUaXRsZSkgKyAnXFxcXG4nICsgJ+KAmOKAmOKAmeKAmTw+PGZvbnQgY29sb3I9XFxcIiM3MzQzMzhcXFwiPicgKyBwZGZoKGh0bWwsIGNvdmVyVGl0bGUxKSArICdcXFxcbicsXFxuICAgICAgICAgICAgZGVzYzogJ+KAmOKAmOKAmeKAmTw+PGZvbnQgY29sb3I9XFxcIiM5NTRBNDVcXFwiPicgKyBwZGZoKGh0bWwsIGNvdmVyVGl0bGUyKSArICdcXFxcbicgKyAn4oCY4oCY4oCZ4oCZPD48Zm9udCBjb2xvcj1cXFwiIzk1NEE0NVxcXCI+JyArIHBkZmgoaHRtbCwgY292ZXJUaXRsZTMpLFxcbiAgICAgICAgICAgIHBpY191cmw6IHBkKGh0bWwsIGNvdmVyUGljKXx8Y292ZXJQaWMsXFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9zZWFyY2g/cz0nK01ZX1BBUkFNUy55dGl0bGUrJyZydWxlPemYhea8q+WQmycsXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpY19ibHVyJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiAnbGluZSdcXG4gICAgICAgIH0pO1xcbiAgICAgICAgLy92YXIgamogPSBnZXRNeVZhcihcXFwiampzXFxcIiwgXFxcIuaUtui1t1xcXCIpO1xcbiAgICAgICAgLy92YXIgamp1cmwgPSAnaGlrZXI6Ly9lbXB0eUBsYXp5UnVsZT0uanM6Z2V0TXlWYXIoXFxcImpqc1xcXCIpID09IFxcXCLmlLbotbdcXFwiP3B1dE15VmFyKFxcXCJqanNcXFwiLFxcXCLlsZXlvIBcXFwiKTpwdXRNeVZhcihcXFwiampzXFxcIixcXFwi5pS26LW3XFxcIik7XFxcImhpa2VyOi8vZW1wdHlcXFwiJztcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfnroDku4sgPHNtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT1cXFwiY29sb3I6IzE5Qjg5RFxcXCI+5bGV5byAPjwvc3Bhbj48L3NtYWxsPjwvc21hbGw+JyxcXG4gICAgICAgICAgICBpbWc6IFxcXCJodHRwczovL2xhbm1laWd1b2ppYW5nLmNvbS90dWJpYW8vbW9yZS8xOTcucG5nXFxcIixcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGpqaWQsIGRlY2lkLCBkZXNfZGVzYykgPT4ge1xcbiAgICAgICAgICAgICAgICBpZiAoZ2V0TXlWYXIoXFxcImpqc1xcXCIsIFxcXCLmlLbotbdcXFwiKSA9PSBcXFwi5pS26LW3XFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcImpqc1xcXCIsIFxcXCLlsZXlvIBcXFwiKTtcXG5cXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBqamlkXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+eugOS7iyA8c21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjojMTlCODlEXFxcIj7mlLbotbc+PC9zcGFuPjwvc21hbGw+PC9zbWFsbD4nXFxuICAgICAgICAgICAgICAgICAgICB9KVxcblxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFNpemU6IDE0LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogMyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGRlY2lkXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJzxzcGFuIHN0eWxlPVxcXCJjb2xvcjojODA4MDgwXFxcIj4nICsgZGVzX2Rlc2MgKyAnLi4uPC9zcGFuPidcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFwiampzXFxcIiwgXFxcIuaUtui1t1xcXCIpO1xcblxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGpqaWRcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAn566A5LuLIDxzbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9XFxcImNvbG9yOiMxOUI4OURcXFwiPuWxleW8gD48L3NwYW4+PC9zbWFsbD48L3NtYWxsPidcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U2l6ZTogMTQsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiAzLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZGVjaWRcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiM4MDgwODBcXFwiPicgKyBkZXNfZGVzYy5zdWJzdHIoMCwgMzApICsgJy4uLjwvc3Bhbj4nXFxuICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgfSwgTVlfUlVMRSArIFxcXCJfamppZFxcXCIsIE1ZX1JVTEUgKyBcXFwiX2RlY2lkXFxcIiwgZGVzX2Rlc2MpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDogTVlfUlVMRSArIFxcXCJfamppZFxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICc8c3BhbiBzdHlsZT1cXFwiY29sb3I6IzgwODA4MFxcXCI+JyArIGRlc19kZXNjLnN1YnN0cigwLCAzMCkgKyAnLi4uPC9zcGFuPicsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIHRleHRTaXplOiAxNCxcXG4gICAgICAgICAgICAgICAgbGluZVNwYWNpbmc6IDMsXFxuICAgICAgICAgICAgICAgIGlkOiBNWV9SVUxFICsgXFxcIl9kZWNpZFxcXCJcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6ICdsaW5lJ1xcbiAgICAgICAgfSlcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6ICdsaW5lJ1xcbiAgICAgICAgfSlcXG4gICAgfSBjYXRjaCAoZSkge31cXG59XFxuXFxuZnVuY3Rpb24gZG93bihUaXRsZSwgY2hhcHRlclBpYywgbGlzdCwgY2hhcHRlclRpdGxlLCBjaGFwdGVyTGluZSwgZG93bmxvYWRsYXp5KSB7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgZG9MaXN0ID0gbGlzdC5tYXAoKGl0ZW0pID0+ICh7XFxuICAgICAgICAgICAgdGl0bGU6IHBkZmgoaXRlbSwgY2hhcHRlclRpdGxlKSxcXG4gICAgICAgICAgICB1cmw6IHBkKGl0ZW0sIGNoYXB0ZXJMaW5lKSxcXG4gICAgICAgIH0pKTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFwiY29sb3I6ICMxYWFkMTlcXFwiPuS4i+i9vea8q+eUu/CflLk8L3NwYW4+PC9iPicsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2Rvd25sb2FkLnZpZXcjbm9SZWNvcmRIaXN0b3J5IyNub1JlZnJlc2gjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgIGNoYXB0ZXJMaXN0OiBkb0xpc3QsXFxuICAgICAgICAgICAgICAgIGluZm86IHtcXG4gICAgICAgICAgICAgICAgICAgIGJvb2tOYW1lOiBwZGZoKGh0bWwsIFRpdGxlKSxcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVOYW1lOiBNWV9SVUxFLnRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgYm9va1RvcFBpYzogcGQoaHRtbCwgY2hhcHRlclBpYyksXFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUNvZGU6IGRvd25sb2FkbGF6eVxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmlldzogXFxcIjFcXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiAnbGluZSdcXG4gICAgICAgIH0pO1xcbiAgICB9IGNhdGNoIChlKSB7fVxcbn1cXG5cXG5mdW5jdGlvbiBjaGFwdGVyKGNoYXB0ZXJMaXN0LCBjaGFwdGVyVGl0bGUsIGNoYXB0ZXJVcmwsIGRlZmF1bHRPcmRlciwgaGFzTGluZSkge1xcbiAgICB2YXIgbGlzdCA9IGNoYXB0ZXJMaXN0O1xcbiAgICB2YXIgb3JpZ2luYWwgPSBbe1xcbiAgICAgICAgdXJsOiBNWV9VUkwsXFxuICAgICAgICBvcmRlcjogZGVmYXVsdE9yZGVyXFxuICAgIH1dO1xcbiAgICAhZmlsZUV4aXN0KCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpID8gKHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnLCBKU09OLnN0cmluZ2lmeShvcmlnaW5hbCkpKSA6IDA7XFxuICAgIHZhciBsb2cgPSBKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpKTtcXG4gICAgZm9yICh2YXIgaSBpbiBsb2cpIHtcXG4gICAgICAgIGlmIChsb2dbaV0udXJsID09IE1ZX1VSTCkge1xcbiAgICAgICAgICAgIHZhciBub3cgPSBpO1xcbiAgICAgICAgICAgIHZhciBvcmRlciA9IGxvZ1tpXS5vcmRlcjtcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdmFyIG5vdyA9ICcnO1xcbiAgICAgICAgICAgIHZhciBvcmRlciA9IGRlZmF1bHRPcmRlcjtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBsZXQgb3JkZXJJdGVtID0ge1xcbiAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgJzxmb250IGNvbG9yPVxcXCIjZjM3MzM1XFxcIj4nICsgJ+eroOiKguaOkuW6j+KHhScgKyAnPC9mb250PicsXFxuICAgICAgICB1cmw6IE1ZX1VSTCArIGBAbGF6eVJ1bGU9LmpzOnZhciBsb2cgPSBKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpKTt2YXIgbm93PSdgICsgbm93ICsgYCc7aWYobm93IT0nJyl7dmFyIG5vdz1wYXJzZUludChub3cpO3ZhciBvcmRlcj1sb2dbbm93XS5vcmRlcn1lbHNle3ZhciBub3c9cGFyc2VJbnQobG9nLmxlbmd0aCk7dmFyIG9yZGVyPWAgKyBkZWZhdWx0T3JkZXIgKyBgO2xvZy5wdXNoKHt1cmw6aW5wdXQsb3JkZXI6b3JkZXJ9KTt9aWYobG9nW25vd10ub3JkZXIpe2xvZ1tub3ddLm9yZGVyPTA7fWVsc2V7bG9nW25vd10ub3JkZXI9MTt9O3dyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnLCBKU09OLnN0cmluZ2lmeShsb2cpKTtyZWZyZXNoUGFnZSgpOydoaWtlcjovL2VtcHR5J2AsXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxuICAgIH1cXG4gICAgaWYgKGhhc0xpbmUpIHtcXG4gICAgICAgIG9yZGVySXRlbS50aXRsZSA9IFxcXCLigJzigJzigJ3igJ1cXFwiICsgJzxmb250IGNvbG9yPVxcXCIjZjM3MzM1XFxcIj4nICsgJ+mbhuaVsOaOkuW6j+KHhScgKyAnPC9mb250Pic7XFxuICAgICAgICBvcmRlckl0ZW0uY29sX3R5cGUgPSBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gICAgfVxcbiAgICBkLnB1c2gob3JkZXJJdGVtKTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnbGluZSdcXG4gICAgfSk7XFxuXFxuICAgIHZhciBsaXN0ID0gb3JkZXIgPyBsaXN0IDogbGlzdC5yZXZlcnNlKCk7XFxuICAgIGZvciAobGV0IGkgaW4gbGlzdCkge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzbWFsbD4nICsgcGRmaChsaXN0W2ldLCBjaGFwdGVyVGl0bGUpICsgJzwvc21hbGw+JyxcXG4gICAgICAgICAgICAgICAgdXJsOiBwZChsaXN0W2ldLCBjaGFwdGVyVXJsKSArIGxhenksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF8yJyxcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gbGluZShsaW5lTGlzdCwgbGluZVRpdGxlUnVsZSwgdmFyS2V5KSB7XFxuICAgIGxldCBsaXN0ID0gbGluZUxpc3RcXG4gICAgdmFyS2V5ID0gdmFyS2V5ID09IG51bGwgPyAoTVlfUlVMRS51cmwgKyAnI2xpbmUtaW5kZXgnKSA6IHZhcktleTtcXG4gICAgYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChrZXlMaXN0KSA9PiB7XFxuICAgICAgICBmb3IgKGxldCBpIGluIGtleUxpc3QpIHtcXG4gICAgICAgICAgICBjbGVhclZhcihrZXlMaXN0W2ldKVxcbiAgICAgICAgfVxcblxcbiAgICB9LCBbdmFyS2V5LCBNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJ10pKVxcbiAgICBsZXQgbGluZTBUaXRsZSA9ICcnXFxuICAgIHRyeSB7XFxuICAgICAgICBsaW5lMFRpdGxlID0gcGRmaChsaXN0WzBdLCBsaW5lVGl0bGVSdWxlKTtcXG4gICAgfSBjYXRjaCAoZSkge31cXG4gICAgbG9nKE1ZX1JVTEUudGl0bGUgKyBnZXRNeVZhcigoTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZScpKSlcXG4gICAgZm9yIChsZXQgaSBpbiBsaXN0KSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGxldCBsaW5lVGl0bGUgPSBwZGZoKGxpc3RbaV0sIGxpbmVUaXRsZVJ1bGUpO1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBnZXRNeVZhcigoTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZScpLCBsaW5lMFRpdGxlKSA9PT0gbGluZVRpdGxlID8gXFxcIuWIh+aNojrigJjigJhcXFwiICsgbGluZVRpdGxlICsgXFxcIlxcXCIgOiBsaW5lVGl0bGUgKyBcXFwi4oCY4oCYOuWIh+aNolxcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKCh2YXJLZXksIGxpbmVJbmRleCwgbGluZVRpdGxlKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcih2YXJLZXksIGxpbmVJbmRleC50b1N0cmluZygpKVxcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nKE1ZX1JVTEUudXJsKVxcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSwgbGluZVRpdGxlKVxcbiAgICAgICAgICAgICAgICAgICAgbG9nKE1ZX1JVTEUudGl0bGUgKyBnZXRNeVZhcigoTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZScpKSlcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKClcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LliIfmjaLoh7NcXFwiICsgbGluZVRpdGxlXFxuICAgICAgICAgICAgICAgIH0sIHZhcktleSwgaSwgbGluZVRpdGxlKSxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICdmbGV4X2J1dHRvbidcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgIH1cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICdsaW5lJ1xcbiAgICAgICAgICAgIH0pO1xcbn1cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWKqOaAgVvkuoxdKlwiLFwicGF0aFwiOlwiZHRmbFwiLFwicnVsZVwiOlwiY29uc3QgZW1wdHkgPSBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG5cXG5pZiAodHlwZW9mKOaLvOaOpeWIhuexuykgIT0gJ3VuZGVmaW5lZCcgJiYg5ou85o6l5YiG57G7ICE9ICcnKSB7XFxuICAgIHZhciBjYXRlZ29yaWVzID0gcGRmYShodG1sLCDlpKfnsbvlrprkvY0pLmNvbmNhdChwZGZhKGh0bWwsIOaLvOaOpeWIhuexuykpXFxufSBlbHNlIHtcXG4gICAgdmFyIGNhdGVnb3JpZXMgPSBwZGZhKGh0bWwsIOWkp+exu+WumuS9jSlcXG59XFxuXFxubGV0IGluaXRfY2F0ZSA9IFtdXFxuXFxuZm9yIChsZXQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7XFxuICAgIGluaXRfY2F0ZS5wdXNoKFxcXCIwXFxcIilcXG59XFxuXFxuY29uc3QgZm9sZCA9IGdldE15VmFyKE1ZX1JVTEUuZ3JvdXAsIFxcXCIwXFxcIilcXG5jb25zdCBjYXRlX3RlbXBfanNvbiA9IGdldE15VmFyKE1ZX1JVTEUudGl0bGUsIEpTT04uc3RyaW5naWZ5KGluaXRfY2F0ZSkpXFxuY29uc3QgY2F0ZV90ZW1wID0gSlNPTi5wYXJzZShjYXRlX3RlbXBfanNvbilcXG5cXG5pZiAocGFyc2VJbnQocGFnZSkgPT09IDEpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBmb2xkID09PSAnMScgPyAn4oCc4oCc4oCd4oCdPGI+JyArICfiiKgnLmZvbnRjb2xvcihcXFwiI0ZGMDAwMFxcXCIpICsgJzwvYj4nIDogJ+KAnOKAnOKAneKAnTxiPicgKyAn4oinJy5mb250Y29sb3IoXFxcIiMxYWFkMTlcXFwiKSArICc8L2I+JyxcXG4gICAgICAgIHVybDogJCgpLmxhenlSdWxlKChmb2xkKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoTVlfUlVMRS5ncm91cCwgZm9sZCA9PT0gJzEnID8gJzAnIDogJzEnKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSwgZm9sZCksXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICB9KVxcbiAgICBjYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5LCBpbmRleCkgPT4ge1xcbiAgICAgICAgbGV0IHN1Yl9jYXRlZ29yaWVzID0gcGRmYShjYXRlZ29yeSwg5bCP57G75a6a5L2NKTtcXG4gICAgICAgIGlmIChpbmRleCA9PT0gMCkge1xcbiAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSBwZGZoKGl0ZW0sIOWIhuexu+agh+mimClcXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZijmjpLpmaQpICE9ICd1bmRlZmluZWQnICYmIOaOkumZpCAhPSAnJykge1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKG5ldyBSZWdFeHAo5o6S6ZmkLCBcXFwiZ1xcXCIpLCBcXFwiXFxcIilcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGtleS50b1N0cmluZygpID09PSBjYXRlX3RlbXBbaW5kZXhdID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyB0aXRsZS5mb250Y29sb3Io5YiG57G76aKc6ImyKSA6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiAkKHBkKGl0ZW0sIOWIhuexu+mTvuaOpSkgKyAnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgocGFyYW1zKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld19jYXRlID0gW11cXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wLmZvckVhY2goKGNhdGUsIGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jYXRlLnB1c2goaW5kZXggPT09IDAgPyBwYXJhbXMua2V5LnRvU3RyaW5nKCkgOiBcXFwiMFxcXCIpXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihNWV9SVUxFLnRpdGxlLCBKU09OLnN0cmluZ2lmeShuZXdfY2F0ZSkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoTVlfUlVMRS51cmwsIGlucHV0KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVfdGVtcDogY2F0ZV90ZW1wLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHBhZ2UsXFxuICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIlxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIGlmIChmb2xkID09PSAnMScpIHtcXG4gICAgICAgICAgICBzdWJfY2F0ZWdvcmllcy5mb3JFYWNoKChpdGVtLCBrZXkpID0+IHtcXG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcGRmaChpdGVtLCDliIbnsbvmoIfpopgpXFxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yo5o6S6ZmkKSAhPSAndW5kZWZpbmVkJyAmJiDmjpLpmaQgIT0gJycpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUucmVwbGFjZShuZXcgUmVnRXhwKOaOkumZpCwgXFxcImdcXFwiKSwgXFxcIlxcXCIpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBrZXkudG9TdHJpbmcoKSA9PT0gY2F0ZV90ZW1wW2luZGV4XSA/IFxcXCLigJzigJzigJ3igJ1cXFwiICsgdGl0bGUuZm9udGNvbG9yKOWIhuexu+minOiJsikgOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogJChwZChpdGVtLCDliIbnsbvpk77mjqUpICsgJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHBhcmFtcykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYXRlX3RlbXBbcGFyYW1zLmluZGV4XSA9IHBhcmFtcy5rZXkudG9TdHJpbmcoKVxcblxcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKE1ZX1JVTEUudGl0bGUsIEpTT04uc3RyaW5naWZ5KHBhcmFtcy5jYXRlX3RlbXApKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKE1ZX1JVTEUudXJsLCBpbnB1dClcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKVxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogcGFnZSxcXG4gICAgICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiYmxhbmtfYmxvY2tcXFwiXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9XFxuICAgIH0pXFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Yqo5oCBW+S4gF0qXCIsXCJwYXRoXCI6XCJjYXRlZ29yaWVzLWhlYWRlclwiLFwicnVsZVwiOlwiLyoqXFxuICog5pys5Zyw572R6aG15o+S5Lu26ZO+5o6lIGhpa2VyOi8vZmlsZXMvcnVsZXMvanMvY2F0ZWdvcmllcy1oZWFkZXIuanNcXG4gKiDlrZDpobXpnaLpk77mjqUgaGlrZXI6Ly9wYWdlL2NhdGVnb3JpZXMtaGVhZGVyXFxuICog6YGT6ZW/5LuT5bqT6ZO+5o6lIGh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTI3MDVcXG4gKiDnoIHkupEgR2l0ZWUg6ZO+5o6lIGh0dHBzOi8vZ2l0ZWUuY29tL3JlYm9ybjAvSGlrZXJSdWxlcy9yYXcvbWFzdGVyL3BsdWdpbnMvY2F0ZWdvcmllcy1oZWFkZXIuanNcXG4gKi9cXG4vKipcXG4gKiBPYmplY3QuYXNzaWduIOeUqOazleWPguiAg+mTvuaOpVxcbiAqXFxuICogMS5odHRwczovL3d3dy5kYWltYWppYW9saXUuY29tL2RhaW1hLzQ3MTM5YTllNzEwMDQwN1xcbiAqIDIuaHR0cHM6Ly9zZWdtZW50ZmF1bHQuY29tL2EvMTE5MDAwMDAxMTc3ODg3NVxcbiAqIDMuaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvemgtQ04vZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnblxcbiAqL1xcbi8vIOWIqeeUqCBTeW1ib2wg5a6e546w56eB5pyJ5Y+Y6YeP5ZKM56eB5pyJ5pa55rOV77yM5aSW55WM5LiN5Y+v6K6/6Zeu77yI5Y+C6ICD6ZO+5o6lMu+8iVxcbmNvbnN0IHN5bWJvbE1hcCA9IHtcXG4gICAgLy8gY2hlY2tQYXJhbXM6IFN5bWJvbCgnY2hlY2tQYXJhbXMnKSxcXG4gICAgbUxheW91dDogU3ltYm9sKCdtTGF5b3V0JyksXFxuICAgIHRydWVfdXJsOiBTeW1ib2woJ3RydWVfdXJsJyksXFxuICAgIG1QYWdlOiBTeW1ib2woJ21QYWdlJyksXFxuICAgIHNyYzogU3ltYm9sKCdzcmMnKSxcXG4gICAgcnVsZU9iakxpc3Q6IFN5bWJvbCgncnVsZU9iakxpc3QnKSxcXG4gICAgbUZvbGQ6IFN5bWJvbCgnbUZvbGQnKSxcXG4gICAgbUZvbGRJbm5lckVuYWJsZTogU3ltYm9sKCdtRm9sZElubmVyRW5hYmxlJyksXFxuICAgIG1Gb2xkSW5kZXg6IFN5bWJvbCgnbUZvbGRJbmRleCcpLFxcbiAgICBtRm9sZExheW91dDogU3ltYm9sKCdtRm9sZExheW91dCcpLFxcbiAgICBtQ29sb3I6IFN5bWJvbCgnbUNvbG9yJyksXFxuICAgIG1UYWc6IFN5bWJvbCgnbVRhZycpLFxcbn1cXG5cXG5mdW5jdGlvbiBDYXRlZ29yaWVzSGVhZGVyKGNvbG9yKSB7XFxuICAgIC8vICd1c2Ugc3RyaWN0JztcXG4gICAgLy8gLi4uXFxuICAgIC8vIHRoaXNbc3ltYm9sTWFwLmxpc3RSdWxlXSA9IFtdXFxuICAgIC8vIHRoaXNbc3ltYm9sTWFwLnN1Ykxpc3RSdWxlXSA9IFtdXFxuICAgIHRoaXNbc3ltYm9sTWFwLm1Db2xvcl0gPSBjb2xvciB8fCBcXFwiI0ZBNzI5OFxcXCI7XFxuICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XSA9IFtdXFxuICAgIHRoaXMuVkFSTUFQID0ge1xcbiAgICAgICAgQ0FURUdPUlk6IFxcXCJoZWFkZXIuY2F0ZWdvcnlcXFwiLFxcbiAgICAgICAgVVJMOiBcXFwiaGVhZGVyLnVybFxcXCIsXFxuICAgICAgICBGT0xEOiBcXFwiaGVhZGVyLmZvbGRcXFwiLFxcbiAgICB9XFxuICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XSA9IHtcXG4gICAgICAgIGluamVjdEluZGV4OiAxXFxuICAgIH1cXG4gICAgdGhpc1tzeW1ib2xNYXAubUZvbGRJbmRleF0gPSAxXFxufVxcblxcbk9iamVjdC5hc3NpZ24oQ2F0ZWdvcmllc0hlYWRlci5wcm90b3R5cGUsIHtcXG4gICAgLy8gT3ZlcnJpZGUg5p6E6YCg5pa55rOV77yM55u45b2T5LqOIGZ1bmN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICguLi4pID0+IHsuLi5977yMbmV3IGZ1bmN0aW9uKCkg55qE5pe25YCZ5Lya6Ieq5Yqo5omn6KGMXFxuICAgIGNvbnN0cnVjdG9yOiBDYXRlZ29yaWVzSGVhZGVyLFxcbiAgICAvLyDlrprkuYnnp4HmnInmlrnms5VcXG4gICAgVkVSU0lPTjogMjAyMTExMzAxOTAwLFxcbiAgICBjaGVja1BhcmFtcygpIHtcXG4gICAgICAgIGlmICghdGhpc1tzeW1ib2xNYXAubUxheW91dF0pIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivt+iwg+eUqCBsYXlvdXQoZCkg5Lyg5YWl5b2T5YmN55WM6Z2iXFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghdGhpc1tzeW1ib2xNYXAudHJ1ZV91cmxdKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7fosIPnlKggdHJ1ZVVybCh1cmwpIOS8oOWFpeW9k+WJjeWIhuexu+eahOmTvuaOpVxcXCIpXFxuICAgICAgICB9XFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLm1QYWdlXSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+36LCD55SoIHBhZ2UobVBhZ2UpIOS8oOWFpeW9k+WJjemhteaVsFxcXCIpXFxuICAgICAgICB9XFxuICAgICAgICBpZiAodGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLmxlbmd0aCA8IDEpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivt+iwg+eUqOebuOWFs+aWueazleS8oOWFpeWumuS9jeinhOWImVxcXCIpXFxuICAgICAgICB9XFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLm1Gb2xkXSkge1xcbiAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkXSA9ICcwJ1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICBsYXlvdXQobUxheW91dCkge1xcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubUxheW91dF0gPSBtTGF5b3V0XFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICB0cnVlVXJsKHVybCkge1xcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAudHJ1ZV91cmxdID0gdXJsXFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICBwYWdlKG1QYWdlKSB7XFxuICAgICAgICBpZiAodHlwZW9mIChtUGFnZSkgPT09ICdzdHJpbmcnKSB7XFxuICAgICAgICAgICAgbVBhZ2UgPSBwYXJzZUludChtUGFnZSlcXG4gICAgICAgIH1cXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLm1QYWdlXSA9IG1QYWdlXFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICBodG1sKG1TcmMpIHtcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnNyY10gPSBtU3JjXFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICBsaXN0KHJ1bGUpIHtcXG4gICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0ubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwibGlzdChydWxlKSBhZGQocnVsZU9iaikg5Y+q6IO95LqM6YCJ5LiA77yBXFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XSA9IFt7fV1cXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS5saXN0UnVsZSA9IHJ1bGVcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5LiA57qn5YiG57G7J10gPSBydWxlXFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICBzdWJMaXN0KHJ1bGUpIHtcXG4gICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0ubGVuZ3RoID4gMSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwic3ViTGlzdChydWxlKSBhZGQocnVsZU9iaikg5Y+q6IO95LqM6YCJ5LiA77yBXFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICghdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdIHx8ICghdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLmxpc3RSdWxlICYmICF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF1bJ+S4gOe6p+WIhuexuyddKSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+35YWI6LCD55SoIGxpc3QocnVsZSkg5oiWIOS4gOe6p+WIhuexuyhydWxlKSDlrprkvY3kuIDnuqfliIbnsbtcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLnN1Ykxpc3RSdWxlID0gcnVsZVxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyflrZDliIbnsbsnXSA9IHJ1bGVcXG4gICAgICAgIHJldHVybiB0aGlzXFxuICAgIH0sXFxuICAgIHRpdGxlKHJ1bGUpIHtcXG4gICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0ubGVuZ3RoID4gMSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwidGl0bGUocnVsZSkgYWRkKHJ1bGVPYmopIOWPquiDveS6jOmAieS4gO+8gVxcXCIpXFxuICAgICAgICB9XFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXSB8fCAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS5saXN0UnVsZSAmJiAhdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyfkuIDnuqfliIbnsbsnXSkpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivt+WFiOiwg+eUqCBsaXN0KHJ1bGUpIOaIliDkuIDnuqfliIbnsbsocnVsZSkg5a6a5L2N5LiA57qn5YiG57G7XFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS50aXRsZVJ1bGUgPSBydWxlXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF1bJ+WIhuexu+agh+mimCddID0gdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLnRpdGxlUnVsZVxcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgdXJsKHJ1bGUpIHtcXG4gICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0ubGVuZ3RoID4gMSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwidXJsKHJ1bGUpIGFkZChydWxlT2JqKSDlj6rog73kuozpgInkuIDvvIFcXFwiKVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKCF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0gfHwgKCF0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0ubGlzdFJ1bGUgJiYgIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5LiA57qn5YiG57G7J10pKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7flhYjosIPnlKggbGlzdChydWxlKSDmiJYg5LiA57qn5YiG57G7KHJ1bGUpIOWumuS9jeS4gOe6p+WIhuexu1xcXCIpXFxuICAgICAgICB9XFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0udXJsUnVsZSA9IHJ1bGVcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5YiG57G76ZO+5o6lJ10gPSB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0udXJsUnVsZVxcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgLyoqXFxuICAgICAqIOaYr+WQpuW8gOWQr+aKmOWPoOWKn+iDvVxcbiAgICAgKlxcbiAgICAgKiBAcGFyYW0gZW5hYmxlZCB0cnVlIOihqOekuuW8gOWQr++8jGZhbHNlIOihqOekuuemgeeUqFxcbiAgICAgKiBAcmV0dXJucyB7Q2F0ZWdvcmllc0hlYWRlcn1cXG4gICAgICovXFxuICAgIGZvbGRJbm5lcihlbmFibGVkKSB7XFxuICAgICAgICBpZiAoISh0eXBlb2YgKGVuYWJsZWQpID09PSAnYm9vbGVhbicpKSB7XFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLor7fkvKDlhaUgdHJ1ZSDmiJYgZmFsc2Ug6KGo56S65byA5ZCv5oiW5YWz6Zet5oqY5Y+g5Yqf6IO977yBXFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkSW5uZXJFbmFibGVdID0gZW5hYmxlZFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgLyoqXFxuICAgICAqIOS7juesrCBpbmRleCDooYzlvIDlp4vmipjlj6BcXG4gICAgICpcXG4gICAgICogQHBhcmFtIGluZGV4IOW8gOWni+aKmOWPoOeahOihjOaVsFxcbiAgICAgKiBAcmV0dXJucyB7Q2F0ZWdvcmllc0hlYWRlcn1cXG4gICAgICovXFxuICAgIGZvbGRJbmRleChpbmRleCkge1xcbiAgICAgICAgaWYgKCEodHlwZW9mIChpbmRleCkgPT09ICdudW1iZXInKSkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi5byA5aeL5oqY5Y+g6KGM6K+35Lyg5YWl5pWw5a2X77yBXFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChpbmRleCA8IDEpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuW8gOWni+aKmOWPoOihjOivt+S8oOWFpeWkp+S6jiAwIOeahOaVtOaVsO+8gVxcXCIpXFxuICAgICAgICB9XFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5tRm9sZEluZGV4XSA9IGluZGV4IHx8IDE7XFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICAvKipcXG4gICAgICog5oqY5Y+g5oyJ6ZKu55qE55WM6Z2iXFxuICAgICAqXFxuICAgICAqIEBwYXJhbSBsYXlvdXQg5LiOIGQucHVzaCDnu5PmnoTkuIDoh7TvvIxcXG4gICAgICogICAgICAgIOS+i++8mnsgdGl0bGU6XFxcIuagh+mimDFcXFwiLCB1cmw6XFxcInh4eFxcXCIsIGNvbF90eXBlOlxcXCJzY3JvbGxfYnV0dG9uXFxcIiB9O1xcbiAgICAgKiAgICAgICAg5Y+C5pWw6YeH55So5Y+v6YCJ6KaG55uW5qih5byP77yM5LiN5YaZ55qE5Y+C5pWw5YiZ5L2/55So6buY6K6kO1xcbiAgICAgKiAgICAgICAg5q+U5aaC5Lyg5YWlIHsgY29sX3R5cGU6XFxcInRleHRfMVxcXCIgfe+8jOmCo+acgOe7iOe7k+aenOWwseaYryB7IHRpdGxlOlxcXCLmoIfpopgxXFxcIiwgdXJsOlxcXCJ4eHhcXFwiLCBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIiB9XFxuICAgICAqIEByZXR1cm5zIHtDYXRlZ29yaWVzSGVhZGVyfVxcbiAgICAgKi9cXG4gICAgZm9sZExheW91dChsYXlvdXQpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgbGF5b3V0ID09PSAnb2JqZWN0Jykge1xcbiAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMobGF5b3V0KVxcbiAgICAgICAgICAgIGxldCBpbmplY3RJbmRleCA9IGxheW91dC5pbmplY3RJbmRleCB8fCBsYXlvdXRbJ+aKmOWPoOaMiemSruaPkuWFpeihjCddXFxuICAgICAgICAgICAgaWYgKGxheW91dC50aXRsZSB8fCBsYXlvdXQudXJsIHx8IGxheW91dC5jb2xfdHlwZSB8fCBpbmplY3RJbmRleCkge1xcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV1cXG4gICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XVtrZXldID0gbGF5b3V0W2tleV07XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivt+S8oOWFpeato+ehrueahOaKmOWPoOeVjOmdouWFg+e0oO+8gVxcXCIpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIC8vIGluamVjdEluZGV4IOaKmOWPoOaMiemSruaPkuWFpeesrCBpbmplY3RJbmRleCDooYxcXG4gICAgICAgICAgICBpZiAoaW5qZWN0SW5kZXgpIHtcXG4gICAgICAgICAgICAgICAgaWYgKCEodHlwZW9mIChpbmplY3RJbmRleCkgPT09ICdudW1iZXInKSkge1xcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLmipjlj6DmjInpkq7mj5LlhaXooYzor7fkvKDlhaXmlbDlrZfvvIFcXFwiKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChpbmplY3RJbmRleCA8IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi5oqY5Y+g5oyJ6ZKu5o+S5YWl6KGM6K+35Lyg5YWl5aSn5LqOIDAg55qE5pW05pWw77yBXFxcIilcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpZiAoaW5qZWN0SW5kZXggPiB0aGlzW3N5bWJvbE1hcC5tRm9sZEluZGV4XSkge1xcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXCLmipjlj6DmjInpkq7mj5LlhaXooYzkuI3lvpflpKfkuo7mmL7npLrmipjlj6DooYzmlbDvvIHor7fosIPnlKggLmZvbGRJbmRleChpbmRleCkg5oiWIC7nrKzlh6DooYzlvIDlp4vmipjlj6AoaW5kZXgpIOS8oOWFpeato+ehrueahOaYvuekuuaKmOWPoOihjOaVsFxcXCIpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdLmluamVjdEluZGV4ID0gaW5qZWN0SW5kZXggfHwgMTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+35Lyg5YWl5q2j56Gu55qE5oqY5Y+g55WM6Z2i5YWD57Sg77yBXFxcIilcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICAvLyDlvZPliY3mmK/lkKbmipjlj6BcXG4gICAgZm9sZChpc0ZvbGQpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgKGlzRm9sZCkgPT09ICdzdHJpbmcnKSB7XFxuICAgICAgICAgICAgaXNGb2xkID0gaXNGb2xkID09PSAnMSdcXG4gICAgICAgIH1cXG4gICAgICAgIGlmIChpc0ZvbGQpIHtcXG4gICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5tRm9sZF0gPSAnMSc7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkXSA9ICcwJztcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB0aGlzXFxuICAgIH0sXFxuICAgIGNvbG9yKG1Db2xvcikge1xcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubUNvbG9yXSA9IG1Db2xvclxcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgdGFnKG1UYWcpIHtcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLm1UYWddID0gbVRhZ1xcbiAgICAgICAgcmV0dXJuIHRoaXNcXG4gICAgfSxcXG4gICAgYWRkKHJ1bGVPYmopIHtcXG4gICAgICAgIC8vIGxvZygkLnN0cmluZ2lmeShydWxlT2JqKSlcXG4gICAgICAgIGlmIChydWxlT2JqLmNvbnN0cnVjdG9yID09PSBBcnJheSkge1xcbiAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XSA9IHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5jb25jYXQocnVsZU9iailcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLnB1c2gocnVsZU9iailcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBldmFsSlNSdWxlKGl0ZW0sIGpzUnVsZSkge1xcbiAgICAgICAgbGV0IHJ1bGUgPSBqc1J1bGUucmVwbGFjZShcXFwiQGpzOlxcXCIsIFxcXCJcXFwiKVxcbiAgICAgICAgcnVsZSA9IHJ1bGUudHJpbSgpXFxuICAgICAgICAvLyBsb2coJC5zdHJpbmdpZnkocnVsZSkpXFxuICAgICAgICBsZXQgaW5wdXQgPSBpdGVtXFxuICAgICAgICBpZiAocnVsZS5zdGFydHNXaXRoKFxcXCIoXFxcIikpIHtcXG4gICAgICAgICAgICBldmFsKCdyZXN1bHQgPSAnICsgcnVsZSlcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgLyoqXFxuICAgICAgICAgICAgICog6L+Y5Y6f5oiQICQudG9TdHJpbmcoLi4uKSDnmoTmnIDnu4jnu5PmnpzvvIzovr7liLDmnIDnu4jlpITnkIbmlrnlvI/ot5/kuIrpnaLnmoQgaWYg5LiA6Ie055qE55uu55qEXFxuICAgICAgICAgICAgICovXFxuICAgICAgICAgICAgZXZhbCgncmVzdWx0ID0gJyArICcoKCkgPT4geycgKyBydWxlICsgJ30pKCknKVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIChyZXN1bHQgfHwgJycpXFxuICAgIH0sXFxuICAgIGdldFRpdGxlKHNyYywgY2F0ZWdvcnkpIHtcXG4gICAgICAgIGxldCB0aXRsZSA9ICcnXFxuICAgICAgICBsZXQgdGl0bGVSdWxlID0gY2F0ZWdvcnkudGl0bGVSdWxlIHx8ICdhJiZUZXh0J1xcbiAgICAgICAgaWYgKHRpdGxlUnVsZS5zdGFydHNXaXRoKFxcXCJAanM6XFxcIikpIHtcXG4gICAgICAgICAgICB0aXRsZSA9IHRoaXMuZXZhbEpTUnVsZShzcmMsIHRpdGxlUnVsZSlcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgdGl0bGUgPSBwYXJzZURvbUZvckh0bWwoc3JjLCB0aXRsZVJ1bGUpXFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gdGl0bGUgfHwgXFxcIlxcXCI7XFxuICAgIH0sXFxuICAgIGdldFVybChzcmMsIGNhdGVnb3J5KSB7XFxuICAgICAgICBsZXQgdXJsID0gJydcXG4gICAgICAgIGxldCB1cmxSdWxlID0gY2F0ZWdvcnkudXJsUnVsZSB8fCAnYSYmaHJlZidcXG4gICAgICAgIGlmICh0eXBlb2YgdXJsUnVsZSA9PT0gJ29iamVjdCcpIHtcXG4gICAgICAgICAgICBsZXQgbVVybFJ1bGUgPSB1cmxSdWxlLnJ1bGUgfHwgdXJsUnVsZVsn6Kej5p6Q6KeE5YiZJ10gfHwgJ2EmJmhyZWYnO1xcbiAgICAgICAgICAgIGlmIChtVXJsUnVsZS5zdGFydHNXaXRoKFxcXCJAanM6XFxcIikpIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gdGhpcy5ldmFsSlNSdWxlKHNyYywgbVVybFJ1bGUpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIGxldCBwYXJzZSA9IHBhcnNlRG9tO1xcbiAgICAgICAgICAgICAgICBpZiAodXJsUnVsZS5wYXJzZU9wdGlvbikge1xcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh1cmxSdWxlLnBhcnNlT3B0aW9uKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwicGFyc2VEb21cXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcInBkXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2UgPSBwYXJzZURvbTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwicGFyc2VEb21Gb3JIdG1sXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCJwZGZoXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2UgPSBwYXJzZURvbUZvckh0bWw7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlID0gcGFyc2VEb207XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXJsUnVsZVtcXFwi6Kej5p6Q5pa55rOVXFxcIl0pIHtcXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodXJsUnVsZVtcXFwi6Kej5p6Q5pa55rOVXFxcIl0pIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCJwYXJzZURvbVxcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFwicGRcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlRG9tO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXCJwYXJzZURvbUZvckh0bWxcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcInBkZmhcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlRG9tRm9ySHRtbDtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2UgPSBwYXJzZURvbTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB1cmwgPSBwYXJzZShzcmMsIG1VcmxSdWxlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHVybFJ1bGUuZGVhbFVybCkge1xcbiAgICAgICAgICAgICAgICB1cmwgPSB1cmxSdWxlLmRlYWxVcmwodXJsKVxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodXJsUnVsZVsn5LqM5qyh5aSE55CGJ10pIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gdXJsUnVsZVsn5LqM5qyh5aSE55CGJ10odXJsKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaWYgKHVybFJ1bGUuc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IHRoaXMuZXZhbEpTUnVsZShzcmMsIHVybFJ1bGUpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHVybCA9IHBhcnNlRG9tKHNyYywgdXJsUnVsZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHVybCB8fCBcXFwiXFxcIjtcXG4gICAgfSxcXG4gICAgYnVpbGQoKSB7XFxuICAgICAgICAvLyDmo4DmtYvmmK/lkKbkvKDlhaXpnIDopoHnmoTlj4LmlbBcXG4gICAgICAgIHRoaXMuY2hlY2tQYXJhbXMoKVxcbiAgICAgICAgLy8g5q+P5LiA5Liq5YiG57G755qE5ZSv5LiA5qCH6K+GXFxuICAgICAgICBsZXQgbVRhZyA9IHRoaXNbc3ltYm9sTWFwLm1UYWddIHx8IFxcXCJcXFwiXFxuICAgICAgICAvL+e/u+mhtSDpnIDopoHmoLnmja7lrp7pmYXmm7/mjaJcXG4gICAgICAgIGNvbnN0IGh0bWwgPSB0aGlzW3N5bWJvbE1hcC5zcmNdIHx8IHJlcXVlc3QodGhpc1tzeW1ib2xNYXAudHJ1ZV91cmxdKVxcbiAgICAgICAgY29uc3QgZW1wdHkgPSBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgIC8v6I635Y+W5YiX6KGoXFxuICAgICAgICBjb25zdCBjYXRlZ29yaWVzID0gW11cXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5tYXAocnVsZU9iaiA9PiB7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBbXVxcbiAgICAgICAgICAgIGxldCBsaXN0UnVsZSA9IHJ1bGVPYmoubGlzdFJ1bGUgfHwgcnVsZU9ialtcXFwi5LiA57qn5YiG57G7XFxcIl1cXG4gICAgICAgICAgICBpZiAobGlzdFJ1bGUuc3RhcnRzV2l0aChcXFwiQGpzOlxcXCIpKSB7XFxuICAgICAgICAgICAgICAgIC8vIGxvZygkLnN0cmluZ2lmeShsaXN0UnVsZSkpXFxuICAgICAgICAgICAgICAgIGxpc3QgPSB0aGlzLmV2YWxKU1J1bGUoaHRtbCwgbGlzdFJ1bGUpXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgbGlzdCA9IHBhcnNlRG9tRm9yQXJyYXkoaHRtbCwgbGlzdFJ1bGUpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIC8vIGxvZyhsaXN0KVxcbiAgICAgICAgICAgIGxpc3QubWFwKGNhdGVnb3J5ID0+IHtcXG4gICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgIGxpc3Q6IGNhdGVnb3J5LFxcbiAgICAgICAgICAgICAgICAgICAgc3ViTGlzdFJ1bGU6IHJ1bGVPYmouc3ViTGlzdFJ1bGUgfHwgcnVsZU9ialtcXFwi5a2Q5YiG57G7XFxcIl0sXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZVJ1bGU6IHJ1bGVPYmoudGl0bGVSdWxlIHx8IHJ1bGVPYmpbXFxcIuWIhuexu+agh+mimFxcXCJdLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsUnVsZTogcnVsZU9iai51cmxSdWxlIHx8IHJ1bGVPYmpbXFxcIuWIhuexu+mTvuaOpVxcXCJdLFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgfSlcXG5cXG4gICAgICAgIC8vIGxvZygkLnN0cmluZ2lmeShjYXRlZ29yaWVzKSlcXG5cXG4gICAgICAgIGxldCBpbml0X2NhdGUgPSBbXVxcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7XFxuICAgICAgICAgICAgaW5pdF9jYXRlLnB1c2goXFxcIjBcXFwiKVxcbiAgICAgICAgfVxcblxcbiAgICAgICAgY29uc3QgY2F0ZV90ZW1wX2pzb24gPSBnZXRNeVZhcihtVGFnICsgdGhpcy5WQVJNQVAuQ0FURUdPUlksIEpTT04uc3RyaW5naWZ5KGluaXRfY2F0ZSkpXFxuICAgICAgICBjb25zdCBjYXRlX3RlbXAgPSBKU09OLnBhcnNlKGNhdGVfdGVtcF9qc29uKVxcblxcbiAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLm1QYWdlXSA9PT0gMSkge1xcblxcbiAgICAgICAgICAgIGNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0ZWdvcnksIGluZGV4KSA9PiB7XFxuXFxuICAgICAgICAgICAgICAgIC8vIOaKmOWPoCBVSVxcbiAgICAgICAgICAgICAgICBpZiAodGhpc1tzeW1ib2xNYXAubUZvbGRJbm5lckVuYWJsZV0gJiYgdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdLmluamVjdEluZGV4ID09PSAoaW5kZXgrMSkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2xkTGF5b3V0ID0ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzW3N5bWJvbE1hcC5tRm9sZExheW91dF0udGl0bGUgfHwgKHRoaXNbc3ltYm9sTWFwLm1Gb2xkXSA9PT0gJzEnID8gJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI0ZGMDAwMFxcXCI+4oioPC9zcGFuPjwvYj4nIDogJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjogIzFhYWQxOVxcXCI+4oinPC9zcGFuPjwvYj4nKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XS51cmwgfHwgJChcXFwiaGlrZXI6Ly9lbXB0eSNub0hpc3RvcnkjXFxcIikubGF6eVJ1bGUoKHBhcmFtcykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMubVRhZyArIHBhcmFtcy5WQVJNQVAuRk9MRCwgZ2V0TXlWYXIocGFyYW1zLm1UYWcgKyBwYXJhbXMuVkFSTUFQLkZPTEQsIHBhcmFtcy5pc0ZvbGQpID09PSAnMScgPyAnMCcgOiAnMScpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRhZzogbVRhZyxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGb2xkOiB0aGlzW3N5bWJvbE1hcC5tRm9sZF0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUk1BUDogdGhpcy5WQVJNQVBcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdLmNvbF90eXBlIHx8IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdLnB1c2goZm9sZExheW91dClcXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgICAgICAvL+WFt+S9k+WIl+ihqOS4i+eahOWIhuexu1xcbiAgICAgICAgICAgICAgICBsZXQgc3ViX2NhdGVnb3JpZXMgPSBbXTtcXG4gICAgICAgICAgICAgICAgaWYgKGNhdGVnb3J5LnN1Ykxpc3RSdWxlLnN0YXJ0c1dpdGgoXFxcIkBqczpcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMgPSB0aGlzLmV2YWxKU1J1bGUoY2F0ZWdvcnkubGlzdCwgY2F0ZWdvcnkuc3ViTGlzdFJ1bGUpXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcyA9IHBhcnNlRG9tRm9yQXJyYXkoY2F0ZWdvcnkubGlzdCwgY2F0ZWdvcnkuc3ViTGlzdFJ1bGUpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8ICh0aGlzW3N5bWJvbE1hcC5tRm9sZEluZGV4XSB8fCAxKSkge1xcbiAgICAgICAgICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMuZm9yRWFjaCgoaXRlbSwga2V5KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gdGhpcy5nZXRUaXRsZShpdGVtLCBjYXRlZ29yeSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gdGhpcy5nZXRVcmwoaXRlbSwgY2F0ZWdvcnkpXFxuXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUxheW91dF0ucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBrZXkudG9TdHJpbmcoKSA9PT0gY2F0ZV90ZW1wW2luZGV4XSA/ICfigJzigJzigJ3igJ08Yj48Zm9udCBjb2xvcj0nICsgdGhpc1tzeW1ib2xNYXAubUNvbG9yXSArICc+JyArIHRpdGxlICsgJyA8L2ZvbnQ+PC9iPicgOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKHVybCkubGF6eVJ1bGUoKHBhcmFtcykgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld19jYXRlID0gW11cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuaW5kZXggPT09IDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wLmZvckVhY2goKGNhdGUsIGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19jYXRlLnB1c2goaW5kZXggPT09IDAgPyBwYXJhbXMua2V5LnRvU3RyaW5nKCkgOiBcXFwiMFxcXCIpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYXRlX3RlbXBbcGFyYW1zLmluZGV4XSA9IHBhcmFtcy5rZXkudG9TdHJpbmcoKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGFyYW1zLnRhZyArIHBhcmFtcy5WQVJNQVAuQ0FURUdPUlksIEpTT04uc3RyaW5naWZ5KHBhcmFtcy5pbmRleCA9PT0gMCA/IG5ld19jYXRlIDogcGFyYW1zLmNhdGVfdGVtcCkpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMudGFnICsgcGFyYW1zLlZBUk1BUC5VUkwsIGlucHV0KVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZV90ZW1wOiBjYXRlX3RlbXAsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJNQVA6IHRoaXMuVkFSTUFQLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiBtVGFnLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiB0aGlzW3N5bWJvbE1hcC5tUGFnZV0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUxheW91dF0ucHVzaCh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNbc3ltYm9sTWFwLm1Gb2xkXSA9PT0gJzAnKSB7XFxuICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcy5mb3JFYWNoKChpdGVtLCBrZXkpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSB0aGlzLmdldFRpdGxlKGl0ZW0sIGNhdGVnb3J5KVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB0aGlzLmdldFVybChpdGVtLCBjYXRlZ29yeSlcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5tTGF5b3V0XS5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGtleS50b1N0cmluZygpID09PSBjYXRlX3RlbXBbaW5kZXhdID8gJ+KAnOKAnOKAneKAnTxiPjxmb250IGNvbG9yPScgKyB0aGlzW3N5bWJvbE1hcC5tQ29sb3JdICsgJz4nICsgdGl0bGUgKyAnIDwvZm9udD48L2I+JyA6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQodXJsKS5sYXp5UnVsZSgocGFyYW1zKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wW3BhcmFtcy5pbmRleF0gPSBwYXJhbXMua2V5LnRvU3RyaW5nKClcXG5cXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhcmFtcy50YWcgKyBwYXJhbXMuVkFSTUFQLkNBVEVHT1JZLCBKU09OLnN0cmluZ2lmeShwYXJhbXMuY2F0ZV90ZW1wKSlcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHBhcmFtcy50YWcgKyBwYXJhbXMuVkFSTUFQLlVSTCwgaW5wdXQpXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBpbmRleCxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUk1BUDogdGhpcy5WQVJNQVAsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6IG1UYWcsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXNbc3ltYm9sTWFwLm1QYWdlXSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5tTGF5b3V0XS5wdXNoKHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH1cXG4gICAgfSxcXG5cXG4gICAg55WM6Z2iKGxheW91dCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0KGxheW91dClcXG4gICAgfSxcXG4gICAg5YiG57G76ZO+5o6lKHRydWVVcmwpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnRydWVVcmwodHJ1ZVVybCk7XFxuICAgIH0sXFxuICAgIOmhteeggShwYWdlKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5wYWdlKHBhZ2UpO1xcbiAgICB9LFxcbiAgICDmupDnoIEoaHRtbCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuaHRtbChodG1sKTtcXG4gICAgfSxcXG4gICAg5a6a5L2N5LiA57qn5YiG57G7KGxpc3QpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3QobGlzdCk7XFxuICAgIH0sXFxuICAgIOWumuS9jeWtkOWIhuexuyhzdWJMaXN0KSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5zdWJMaXN0KHN1Ykxpc3QpO1xcbiAgICB9LFxcbiAgICDlrprkvY3liIbnsbvmoIfpopgodGl0bGUpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnRpdGxlKHRpdGxlKTtcXG4gICAgfSxcXG4gICAg5a6a5L2N5YiG57G76ZO+5o6lKHVybCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMudXJsKHVybCk7XFxuICAgIH0sXFxuICAgIOW8gOWQr+WGhee9ruaKmOWPoOWKn+iDvSgpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmZvbGRJbm5lcih0cnVlKTtcXG4gICAgfSxcXG4gICAg5YWz6Zet5YaF572u5oqY5Y+g5Yqf6IO9KCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9sZElubmVyKGZhbHNlKTtcXG4gICAgfSxcXG4gICAg56ys5Yeg6KGM5byA5aeL5oqY5Y+gKGluZGV4KSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5mb2xkSW5kZXgoaW5kZXgpO1xcbiAgICB9LFxcbiAgICDmipjlj6DmjInpkq7moLflvI8obGF5b3V0KSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5mb2xkTGF5b3V0KGxheW91dClcXG4gICAgfSxcXG4gICAg5oqY5Y+gKGZvbGQpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmZvbGQoZm9sZCk7XFxuICAgIH0sXFxuICAgIOmAieS4reeahOWIhuexu+minOiJsihjb2xvcikge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sb3IoY29sb3IpO1xcbiAgICB9LFxcbiAgICDllK/kuIDmoIfor4YobVRhZykge1xcbiAgICAgICAgcmV0dXJuIHRoaXMudGFnKG1UYWcpXFxuICAgIH0sXFxuICAgIOa3u+WKoOWIhuexu+WumuS9jShydWxlT2JqKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5hZGQocnVsZU9iaik7XFxuICAgIH0sXFxuICAgIOW8gOWni+aJk+mAoOWIhuexuygpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkKCk7XFxuICAgIH0sXFxuXFxufSlcXG4kLmV4cG9ydHMgPSBuZXcgQ2F0ZWdvcmllc0hlYWRlcigpO1xcbiQuZXhwb3J0c1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6ZO+5o6l5aSE55CGW+S6jF0qXCIsXCJwYXRoXCI6XCJ1cmwtcHJvY2Vzc29yXCIsXCJydWxlXCI6XCIvKipcXG4gKiDmnKzlnLDnvZHpobXmj5Lku7bpk77mjqUgaGlrZXI6Ly9maWxlcy9ydWxlcy9qcy9VcmxQcm9jZXNzb3IuanNcXG4gKiDlrZDpobXpnaLpk77mjqUgaGlrZXI6Ly9wYWdlL3VybC1wcm9jZXNzb3JcXG4gKiDpgZPplb/ku5PlupPpk77mjqUgaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9Mjg0OVxcbiAqIOeggeS6kSBHaXRlZSDpk77mjqUgaHR0cHM6Ly9naXRlZS5jb20vcmVib3JuMC9IaWtlclJ1bGVzL3Jhdy9tYXN0ZXIvcGx1Z2lucy9VcmxQcm9jZXNzb3IuanNcXG4gKi9cXG5mdW5jdGlvbiBVcmxQcm9jZXNzb3IoKSB7XFxuICAgIHRoaXMucGFyYW1zID0ge31cXG4gICAgdGhpcy5yZWdleE1hcCA9IFtcXG4gICAgICAgIHtcXG4gICAgICAgICAgICByZWc6ICcodm9kdHlwZXx2aWRlb3QpXFxcXFxcXFwvXFxcXFxcXFx3KycsXFxuICAgICAgICAgICAgZXhlYzogKCkgPT4ge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXMudXJsXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvLVxcXFxkKy5odG1sLywgJy0nICsgdGhpcy5wYXJhbXMucGFnZSArICcuaHRtbCcpXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKCh2b2R0eXBlfHZpZGVvdClcXFxcL1xcXFx3KykuaHRtbC8sICckMS0nICsgdGhpcy5wYXJhbXMucGFnZSArICcuaHRtbCcpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG4gICAgICAgIHtcXG4gICAgICAgICAgICByZWc6ICdcXFxcXFxcXC8/W1xcXFxcXFxcd1xcXFxcXFxcZF0rLS4qPy0uKj8tLio/LS4qPy0uKj8tLio/LS4qPy1cXFxcXFxcXGQqLS0tXFxcXFxcXFxkKi5odG1sJyxcXG4gICAgICAgICAgICBleGVjOiAoKSA9PiB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmFtcy51cmxcXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcZCooLS0tLmh0bWwpLywgdGhpcy5wYXJhbXMucGFnZSArICckMScpXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKC0tLVxcXFxkKy5odG1sKS8sIHRoaXMucGFyYW1zLnBhZ2UgKyAnJDEnKTsgLy8g5ou85o6l6aG156CBXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxcXG4gICAgICAgIHtcXG4gICAgICAgICAgICByZWc6ICcoKFxcXFxcXFxcL3ZvZFxcXFxcXFxcL3Nob3cpPyhcXFxcXFxcXC9hcmVhXFxcXFxcXFwvW1xcXFxcXFxcd1xcXFxcXFxcZCVdKyk/KFxcXFxcXFxcL2J5XFxcXFxcXFwvW1xcXFxcXFxcd1xcXFxcXFxcZCVdKyk/KFxcXFxcXFxcL2lkXFxcXFxcXFwvXFxcXFxcXFxkKyk/KFxcXFxcXFxcL2xldHRlclxcXFxcXFxcL1tcXFxcXFxcXHdcXFxcXFxcXGQlXSspPykoXFxcXFxcXFwvcGFnZVxcXFxcXFxcL1xcXFxcXFxcZCspPyhcXFxcXFxcXC95ZWFyXFxcXFxcXFwvXFxcXFxcXFxkKyk/XFxcXFxcXFwuaHRtbCcsXFxuICAgICAgICAgICAgZXhlYzogKCkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgcmVnRXhwID0gLygoXFxcXC92b2RcXFxcL3Nob3cpPyhcXFxcL2FyZWFcXFxcL1tcXFxcd1xcXFxkJV0rKT8oXFxcXC9ieVxcXFwvW1xcXFx3XFxcXGQlXSspPyhcXFxcL2lkXFxcXC9cXFxcZCspPyhcXFxcL2xldHRlclxcXFwvW1xcXFx3XFxcXGQlXSspPykoXFxcXC9wYWdlXFxcXC9cXFxcZCspPyhcXFxcL3llYXJcXFxcL1xcXFxkKyk/XFxcXC5odG1sL1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXMudXJsXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShyZWdFeHAsICckMScgKyAoXFxcIi9wYWdlL1xcXCIgKyB0aGlzLnBhcmFtcy5wYWdlKSArICckOCcgKyBcXFwiLmh0bWxcXFwiKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgXVxcbn1cXG5cXG5PYmplY3QuYXNzaWduKFVybFByb2Nlc3Nvci5wcm90b3R5cGUsIHtcXG4gICAgY29uc3RydWN0b3I6IFVybFByb2Nlc3NvcixcXG4gICAgY2hlY2tQYXJhbXMoKSB7XFxuICAgICAgICBpZiAoIXRoaXMucGFyYW1zLnVybCkge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+35YWI6LCD55SoIC5iYXNlVXJsKHVybCkg5Lyg5YWl6ZO+5o6l6L+b6KGM5Yid5aeL5YyWIVxcXCIpXFxuICAgICAgICB9XFxuICAgICAgICBpZiAoIXRoaXMucGFyYW1zLnBhZ2UpIHtcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuivt+WFiOiwg+eUqCAucGFnZShwYWdlKSDkvKDlhaXpobXnoIHov5vooYzliJ3lp4vljJYhXFxcIilcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAgYmFzZVVybCh1cmwpe1xcbiAgICAgICAgdGhpcy5wYXJhbXMudXJsID0gdXJsXFxuICAgICAgICByZXR1cm4gdGhpc1xcbiAgICB9LFxcbiAgICBwYWdlKHBhZ2Upe1xcbiAgICAgICAgdGhpcy5wYXJhbXMucGFnZSA9IHBhZ2VcXG4gICAgICAgIHJldHVybiB0aGlzXFxuICAgIH0sXFxuICAgIGFkZEV4dHJhKHJlZ0V4cCkge1xcbiAgICAgICAgaWYgKHJlZ0V4cC5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHtcXG4gICAgICAgICAgICB0aGlzLnJlZ2V4TWFwID0gdGhpcy5yZWdleE1hcC5jb25jYXQocmVnRXhwKVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICB0aGlzLnJlZ2V4TWFwLnB1c2gocmVnRXhwKVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGRlYnVnKCkge1xcbiAgICAgICAgdGhpcy5wYXJhbXMuZGVidWcgPSB0cnVlXFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgZXhlYygpIHtcXG4gICAgICAgIHRoaXMuY2hlY2tQYXJhbXMoKVxcbiAgICAgICAgbGV0IHRydWVfdXJsID0gJydcXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZWdleE1hcC5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgIGxldCByZWdPYmogPSB0aGlzLnJlZ2V4TWFwW2ldO1xcbiAgICAgICAgICAgIGxldCB1cmxFeHAgPSByZWdPYmoucmVnO1xcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsRXhwID09PSAnc3RyaW5nJykge1xcbiAgICAgICAgICAgICAgICB1cmxFeHAgPSBuZXcgUmVnRXhwKHVybEV4cClcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHVybEV4cC50ZXN0KHRoaXMucGFyYW1zLnVybCkpIHtcXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1zLmRlYnVnKSB7XFxuICAgICAgICAgICAgICAgICAgICBsb2codXJsRXhwLnRvU3RyaW5nKCkpXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdHJ1ZV91cmwgPSByZWdPYmouZXhlYygpO1xcbiAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodHJ1ZV91cmwpIHtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZV91cmw7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmFtcy51cmxcXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAg6I635Y+W5aSE55CG57uT5p6cKCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhlYygpXFxuICAgIH0sXFxuICAgIOmTvuaOpSh1cmwpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VVcmwodXJsKVxcbiAgICB9LFxcbiAgICDpobXnoIEocGFnZSkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnZShwYWdlKVxcbiAgICB9LFxcbiAgICDmj5LlhaXmlrDlpITnkIbop4TliJkocmVnRXhwKSB7XFxuICAgICAgICByZXR1cm4gdGhpcy5hZGRFeHRyYShyZWdFeHApXFxuICAgIH0sXFxuICAgIOiwg+ivleaooeW8jygpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLmRlYnVnKCk7XFxuICAgIH1cXG59KVxcbiQuZXhwb3J0cz1uZXcgVXJsUHJvY2Vzc29yKClcXG4kLmV4cG9ydHNcXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuS4gOe6pypcIixcInBhdGhcIjpcInlqdG9vbFwiLFwicnVsZVwiOlwiZnVuY3Rpb24gY29udmVydDEoc3RyKSB7XFxuICAgIGxldCBjID0gc3RyLnNwbGl0KFxcXCI7XFxcIilcXG4gICAgcmV0dXJuIHtcXG4gICAgICAgIOWIl+ihqDogY1swXSxcXG4gICAgICAgIOagh+mimDogY1sxXSxcXG4gICAgICAgIOWbvueJhzogY1syXSxcXG4gICAgICAgIOaPj+i/sDogY1szXSxcXG4gICAgICAgIOmTvuaOpTogY1s0XVxcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIG1lcmdlKHNvdXJjZSwgdGFyZ2V0KSB7XFxuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlKVxcbiAgICBmb3IgKGxldCBpIGluIGtleXMpIHtcXG4gICAgICAgIHRhcmdldFtrZXlzW2ldXSA9IHNvdXJjZVtrZXlzW2ldXVxcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIOS4gOe6pyhvYmopIHtcXG4gICAgdmFyIGQgPSBbXTtcXG4gICAgaWYgKCQudHlwZShvYmopID09IFxcXCJzdHJpbmdcXFwiKSB7XFxuICAgICAgICBvYmogPSBjb252ZXJ0MShvYmopXFxuICAgIH1cXG4gICAgaWYgKG9iai7op4TliJkpIHtcXG4gICAgICAgIGxldCBjID0gY29udmVydDEob2JqLuinhOWImSlcXG4gICAgICAgIG1lcmdlKGMsIG9iailcXG4gICAgfVxcbiAgICBsZXQgYXJyID0gcGRmYShnZXRSZXNDb2RlKCksIG9iai7liJfooagpO1xcbiAgICAgICBpZiAob2JqLuWIl+ihqOWkhOeQhiAhPSBudWxsKSB7XFxuICAgICAgICAgICAgYXJyID0gb2JqLumTvuaOpeWkhOeQhihhcnIpXFxuICAgICAgICB9XFxuICAgIGZvciAobGV0IGl0IG9mIGFycikge1xcbiAgICAgICAgbGV0IHVybCA9IHBkKGl0LCBvYmou6ZO+5o6lKVxcbiAgICAgICAgaWYgKG9iai7pk77mjqXlpITnkIYgIT0gbnVsbCkge1xcbiAgICAgICAgICAgIHVybCA9IG9iai7pk77mjqXlpITnkIYodXJsKVxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHRpdGxlID0gcGRmaChpdCwgb2JqLuagh+mimClcXG4gICAgICAgIGlmIChvYmou5qCH6aKY5aSE55CGICE9IG51bGwpIHtcXG4gICAgICAgICAgICB0aXRsZSA9IG9iai7moIfpopjlpITnkIYodGl0bGUpXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcGljID0gcGQoaXQsIG9iai7lm77niYcpXFxuICAgICAgICBpZiAob2JqLuWbvueJh+WkhOeQhiAhPSBudWxsKSB7XFxuICAgICAgICAgICAgcGljID0gb2JqLuWbvueJh+WkhOeQhihwaWMpXFxuICAgICAgICB9XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBvYmou5qCH6aKYID8gcGRmaChpdCwgb2JqLuagh+mimCkgOiBcXFwiXFxcIixcXG4gICAgICAgICAgICB1cmw6IHVybCsnI2F1dG9DYWNoZSMnLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwiXFxcIixcXG4gICAgICAgICAgICBkZXNjOiBvYmou5o+P6L+wID8gcGRmaChpdCwgb2JqLuaPj+i/sCkgOiBcXFwiXFxcIixcXG4gICAgICAgICAgICBwaWNfdXJsOiBwaWMsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgeXRpdGxlOiB0aXRsZSxcXG4gICAgICAgICAgICAgICAgeXBpYzogcGljLFxcbiAgICAgICAgICAgICAgICB5dXJsOiB1cmwucmVwbGFjZSgnaGlrZXI6Ly9lbXB0eSMjJywnJylcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgfVxcbiAgICBzZXRSZXN1bHQoZCk7XFxufVxcbnZhciB0b29sID0ge1xcbiAgICDkuIDnuqc6IOS4gOe6p1xcbn1cXG4kLmV4cG9ydHMgPSB0b29sXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLkuIDnuqdb5LqMXSpcIixcInBhdGhcIjpcInlpamlcIixcInJ1bGVcIjpcImZ1bmN0aW9uIOS4gOe6pygpIHt9O1xcclxcbk9iamVjdC5hc3NpZ24o5LiA57qnLnByb3RvdHlwZSwge1xcclxcblxcdGNvbnN0cnVjdG9yOiDkuIDnuqcsXFxyXFxuXFx0dGVzdCgpIHt9LFxcclxcblxcdOiOt+WPlua6kOeggSh1cmwsIGhlYWRlcikge3JldHVybiBmZXRjaCh0cnVlX3VybCwge2hlYWRlcnM6IGhlYWRlciB8fCB7J1VzZXItQWdlbnQnOiBQQ19VQX19KSB9LC8vIOm7mOiupOe7n+S4gOS9v+eUqE1PQklMRV9VQVxcclxcblxcdOaQnOe0ouahhuaetihwYWdlKSB7XFxyXFxuXFx0XFx0aWYgKHBhZ2UgPT0gJzEnKSB7XFxuLypcXHJcXG5cXHRcXHRcXHRkLnB1c2goe1xcclxcblxcdFxcdFxcdFxcdHRpdGxlOiBcXFwi5pCc57Si5pys6KeE5YiZXFxcIixcXHJcXG5cXHRcXHRcXHRcXHR1cmw6IFxcXCInaGlrZXI6Ly9zZWFyY2g/cnVsZT1cXFwiICsgTVlfUlVMRS50aXRsZSArIFxcXCImcz0nK2lucHV0XFxcIixcXHJcXG5cXHRcXHRcXHRcXHRkZXNjOiBcXFwiIFxcXCIsXFxyXFxuXFx0XFx0XFx0XFx0Y29sX3R5cGU6IFxcXCJpbnB1dFxcXCJcXHJcXG5cXHRcXHRcXHR9KTtcXG4qL1xcclxcblxcdFxcdH1cXHJcXG5cXHR9LFxcclxcblxcdOiOt+WPlumTvuaOpShwYWdlLCByZWdleCkge1xcclxcblxcdFxcdGxldCB0cnVlX3VybCA9IGdldE15VmFyKCdoZWFkZXIudXJsJywgTVlfVVJMKTtcXHJcXG5cXHRcXHQvL2xldCDpk77mjqXlpITnkIblt6XlhbcgPSByZXF1aXJlQ2FjaGUoY29uZmlnLumTvuaOpeWkhOeQhuW3peWFt+S+nei1lilcXHJcXG5cXHRcXHQvL2xldCDpk77mjqXlpITnkIblt6XlhbcgPSByZXF1aXJlQ2FjaGUoJ2h0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTI4NDknKVxcclxcblxcdFxcdC8vbGV0IOmTvuaOpeWkhOeQhuW3peWFtyA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL3VybC1wcm9jZXNzb3InKVxcclxcblxcdFxcdGxldCDpk77mjqXlpITnkIblt6XlhbcgPSByZXF1aXJlQ2FjaGUoJ2h0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTI4NDknKVxcclxcblxcdFxcdHRydWVfdXJsID0g6ZO+5o6l5aSE55CG5bel5YW3XFxyXFxuXFx0XFx0XFx0LumTvuaOpSh0cnVlX3VybClcXHJcXG5cXHRcXHRcXHQu6aG156CBKHBhZ2UpXFxyXFxuXFx0XFx0XFx0LuaPkuWFpeaWsOWkhOeQhuinhOWImShyZWdleCB8fCBbXSlcXHJcXG5cXHRcXHRcXHQu6I635Y+W5aSE55CG57uT5p6cKCk7XFxyXFxuXFx0XFx0cmV0dXJuIHRydWVfdXJsO1xcclxcblxcdH0sXFxyXFxuXFx05omT6YCg5YiG57G7KHJ1bGVMaXN0KSB7XFxyXFxuXFx0XFx0Ly8gIGxldCBodG1sQ2F0ZWdvcmllcyA9IHJlcXVpcmVDYWNoZShjb25maWcu5Yqo5oCB5YiG57G75L6d6LWWKVxcclxcblxcdFxcdC8vbGV0IGh0bWxDYXRlZ29yaWVzID0gcmVxdWlyZUNhY2hlKCdodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0yNzA1JylcXHJcXG5cXHRcXHRpZiAoIXJ1bGVMaXN0KSB7XFxyXFxuXFx0XFx0XFx0bGV0IOWIhuexu+WumuS9jSA9IFt7XFxyXFxuXFx0XFx0XFx0XFx0XFx05LiA57qn5YiG57G7OiDkuIDnuqflrprkvY1BLFxcclxcblxcdFxcdFxcdFxcdFxcdOWtkOWIhuexuzog57uf5LiA5a6a5L2NQiB8fCDkuIDnuqflrprkvY1CLFxcclxcblxcdFxcdFxcdFxcdFxcdOWIhuexu+mTvuaOpToge+S6jOasoeWkhOeQhih1cmwpIHt0cnkge3JldHVybiDkuIDnuqflpITnkIZDKHVybCl9IGNhdGNoIChlKSB7cmV0dXJuIHVybH19fVxcclxcblxcdFxcdFxcdH1dXFxyXFxuXFx0XFx0XFx0aWYgKOS6jOe6p+WumuS9jUEgJiYgKOe7n+S4gOWumuS9jUIgfHwg5LqM57qn5a6a5L2NQikpIHtcXHJcXG5cXHRcXHRcXHRcXHTliIbnsbvlrprkvY0ucHVzaCh7XFxyXFxuXFx0XFx0XFx0XFx0XFx0XFx05LiA57qn5YiG57G7OiDkuoznuqflrprkvY1BLFxcclxcblxcdFxcdFxcdFxcdFxcdFxcdOWtkOWIhuexuzog57uf5LiA5a6a5L2NQiB8fCDkuoznuqflrprkvY1CLFxcclxcblxcdFxcdFxcdFxcdFxcdFxcdOWIhuexu+mTvuaOpToge+S6jOasoeWkhOeQhih1cmwpIHt0cnkge3JldHVybiDkuoznuqflpITnkIZDKHVybCl9IGNhdGNoIChlKSB7cmV0dXJuIHVybH19fVxcclxcblxcdFxcdFxcdFxcdH0pXFxyXFxuXFx0XFx0XFx0fVxcclxcblxcdFxcdFxcdGlmICjkuInnuqflrprkvY1BICYmICjnu5/kuIDlrprkvY1CIHx8IOS4iee6p+WumuS9jUIpKSB7XFxyXFxuXFx0XFx0XFx0XFx05YiG57G75a6a5L2NLnB1c2goe1xcclxcblxcdFxcdFxcdFxcdFxcdFxcdOS4gOe6p+WIhuexuzog5LiJ57qn5a6a5L2NQSxcXHJcXG5cXHRcXHRcXHRcXHRcXHRcXHTlrZDliIbnsbs6IOe7n+S4gOWumuS9jUIgfHwg5LiJ57qn5a6a5L2NQixcXHJcXG5cXHRcXHRcXHRcXHRcXHRcXHTliIbnsbvpk77mjqU6IHvkuozmrKHlpITnkIYodXJsKSB7dHJ5IHtyZXR1cm4g5LiJ57qn5aSE55CGQyh1cmwpfSBjYXRjaCAoZSkge3JldHVybiB1cmx9fX1cXHJcXG5cXHRcXHRcXHRcXHR9KVxcclxcblxcdFxcdFxcdH1cXHJcXG5cXHRcXHRcXHRpZiAo5Zub57qn5a6a5L2NQSAmJiAo57uf5LiA5a6a5L2NQiB8fCDlm5vnuqflrprkvY1CKSkge1xcclxcblxcdFxcdFxcdFxcdOWIhuexu+WumuS9jS5wdXNoKHtcXHJcXG5cXHRcXHRcXHRcXHRcXHRcXHTkuIDnuqfliIbnsbs6IOWbm+e6p+WumuS9jUEsXFxyXFxuXFx0XFx0XFx0XFx0XFx0XFx05a2Q5YiG57G7OiDnu5/kuIDlrprkvY1CIHx8IOWbm+e6p+WumuS9jUIsXFxyXFxuXFx0XFx0XFx0XFx0XFx0XFx05YiG57G76ZO+5o6lOiB75LqM5qyh5aSE55CGKHVybCkge3RyeSB7cmV0dXJuIOWbm+e6p+WkhOeQhkModXJsKX0gY2F0Y2ggKGUpIHtyZXR1cm4gdXJsfX19XFxyXFxuXFx0XFx0XFx0XFx0fSlcXHJcXG5cXHRcXHRcXHR9XFxyXFxuXFx0XFx0XFx0cnVsZUxpc3QgPSDliIbnsbvlrprkvY07XFxyXFxuXFx0XFx0fVxcclxcblxcdFxcdC8vICcwJyDkuLrpu5jorqTkuI3mipjlj6DvvIwnMScg5Li66buY6K6k5oqY5Y+gXFxyXFxuXFx0XFx0Y29uc3Qg5b2T5YmN5oqY5Y+g54q25oCBID0gZ2V0TXlWYXIoJ2hlYWRlci5mb2xkJywgJzAnKVxcclxcblxcdFxcdC8vIOW8leWFpeWKqOaAgeWIhuexu+S+nei1llxcclxcblxcdFxcdGxldCBodG1sQ2F0ZWdvcmllcyA9IHJlcXVpcmVDYWNoZSgnaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9MjcwNScpXFxyXFxuXFx0XFx0dmFyIGdldFJhbmdlQ29sb3JzID0gZnVuY3Rpb24oKSB7XFxyXFxuXFx0XFx0XFx0cmV0dXJuICcjJyArICgnMDAwMDAnICsgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAgPDwgMCkudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTYpO1xcclxcblxcdFxcdH0gLy8g6ZqP5py66YCJ5Lit55qE5YiG57G76aKc6ImyXFxyXFxuXFx0XFx0dmFyIGNvbG91cjtcXHJcXG5cXHRcXHRpZiAo5YiG57G76aKc6ImyICE9PSAnJykge1xcclxcblxcdFxcdFxcdGNvbG91ciA9IOWIhuexu+minOiJslxcclxcblxcdFxcdH0gZWxzZSB7XFxyXFxuXFx0XFx0XFx0Y29sb3VyID0gZ2V0UmFuZ2VDb2xvcnMoKVxcclxcblxcdFxcdH1cXHJcXG5cXHRcXHRodG1sQ2F0ZWdvcmllcy7nlYzpnaIoZClcXHJcXG5cXHRcXHRcXHQvLy7liIbnsbvpk77mjqUodHJ1ZV91cmwpXFxyXFxuXFx0XFx0XFx0Lua6kOeggShodG1sKVxcclxcblxcdFxcdFxcdC7pobXnoIEocGFnZSlcXHJcXG5cXHRcXHRcXHQu5re75Yqg5YiG57G75a6a5L2NKHJ1bGVMaXN0KVxcclxcblxcdFxcdFxcdC7lvIDlkK/lhoXnva7mipjlj6Dlip/og70oKSAvLyDlv4XpobtcXHJcXG5cXHRcXHRcXHQu5oqY5Y+gKOW9k+WJjeaKmOWPoOeKtuaAgSkgLy8g5b+F6aG7XFxyXFxuXFx0XFx0XFx0LuaKmOWPoOaMiemSruagt+W8jyh7XFxyXFxuXFx0XFx0XFx0XFx0dGl0bGU6IOW9k+WJjeaKmOWPoOeKtuaAgSA9PSBcXFwiMVxcXCIgPyBcXFwi4oCc4oCc4oCd4oCdPGJpZz48Yj48Zm9udCBjb2xvcj0nIzU5NTlBQic+XFxcIiArIOWKqOaAgee8qeWwjyArIFxcXCI8L2ZvbnQ+PC9iPjwvYmlnPlxcXCIgOiBcXFwi4oCc4oCc4oCd4oCdPGJpZz48Yj48Zm9udCBjb2xvcj0nI0Y3NUQ1OSc+XFxcIiArIOWKqOaAgeaJqeWxlSArIFxcXCI8L2ZvbnQ+PC9iPjwvYmlnPlxcXCJcXHJcXG5cXHRcXHRcXHR9KSAvLyDlj6/pgIlcXHJcXG5cXHRcXHRcXHQvLyAu56ys5Yeg6KGM5byA5aeL5oqY5Y+gKDIpIC8vIOWPr+mAiVxcclxcblxcdFxcdFxcdC8vIC7mipjlj6DmjInpkq7moLflvI8oeyDmipjlj6DmjInpkq7mj5LlhaXooYw6IDIgfSkgIC8vIOWPr+mAie+8jOS9huW/hemhu+WFiOiwg+eUqCAu56ys5Yeg6KGM5byA5aeL5oqY5Y+gKGluZGV4Ke+8jOeEtuWQjuWGjeS8oOWFpSB7IOaKmOWPoOaMiemSruaPkuWFpeihjDogaW5kZXggfVxcclxcblxcdFxcdFxcdC7pgInkuK3nmoTliIbnsbvpopzoibIoY29sb3VyKVxcclxcblxcdFxcdFxcdC7lvIDlp4vmiZPpgKDliIbnsbsoKTtcXHJcXG5cXHR9LFxcclxcblxcclxcblxcdOeUn+aIkOeJh+WNlShkLGh0bWwpIHtcXHJcXG5cXHJcXG5cXHRcXHR2YXIg5YiX6KGoXFxyXFxuXFx0XFx0dmFyIOagh+mimFxcclxcblxcdFxcdHZhciDmj4/ov7BcXHJcXG5cXHRcXHR2YXIg5Zu+54mHXFxyXFxuXFx0XFx0dmFyIOmTvuaOpVxcclxcblxcclxcblxcdFxcdGlmICjmoYbmnrbnsbvlnosgPT09ICdteXVpLXZvZGxpc3QnKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0gJy5teXVpLXZvZGxpc3QmJmxpJztcXHJcXG5cXHRcXHRcXHTmoIfpopggPSAnaDQmJlRleHQnO1xcclxcblxcdFxcdFxcdOaPj+i/sCA9ICcucGljLXRhZ3x8LnBpYy10ZXh0JiZUZXh0JztcXHJcXG5cXHRcXHRcXHTlm77niYcgPSAnLmxhenlsb2FkJiZkYXRhLW9yaWdpbmFsJztcXHJcXG5cXHRcXHRcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxyXFxuXFx0XFx0XFx0Ly9sb2coJ+ahhuaetuexu+Wei8K3bXl1aS12b2RsaXN0JylcXHJcXG5cXHRcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJyNkYXRhX2xpc3QnKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0gJyNkYXRhX2xpc3QmJmxpJztcXHJcXG5cXHRcXHRcXHTmoIfpopggPSAnYSYmdGl0bGUnO1xcclxcblxcdFxcdFxcdOaPj+i/sCA9ICdlbSYmVGV4dCc7XFxyXFxuXFx0XFx0XFx05Zu+54mHID0gJ2ltZyYmZGF0YS1zcmNsJztcXHJcXG5cXHRcXHRcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxyXFxuXFx0XFx0XFx0Ly9sb2coJ+ahhuaetuexu+Wei8K3ZGF0YV9saXN0JylcXHJcXG5cXHRcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJ2ZlZC1saXN0LXRpdGxlJykge1xcclxcblxcdFxcdFxcdOWIl+ihqCA9ICcuZmVkLWxpc3QtaW5mbyYmbGknO1xcclxcblxcdFxcdFxcdOagh+mimCA9ICcuZmVkLWxpc3QtdGl0bGUmJlRleHQnO1xcclxcblxcdFxcdFxcdOaPj+i/sCA9ICcuZmVkLXRleHQtY2VudGVyJiZUZXh0JztcXHJcXG5cXHRcXHRcXHTlm77niYcgPSAnYSYmZGF0YS1vcmlnaW5hbCc7XFxyXFxuXFx0XFx0XFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcclxcblxcdFxcdFxcdC8vbG9nKCfmoYbmnrbnsbvlnovCty5mZWQtbGlzdC1pbmZvJylcXHJcXG5cXHRcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJ2l0ZW0nKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0gJ2JvZHkmJi5pdGVtJztcXHJcXG5cXHRcXHRcXHTmoIfpopggPSAnaW1nJiZhbHQnO1xcclxcblxcdFxcdFxcdOaPj+i/sCA9ICdwJiZUZXh0JztcXHJcXG5cXHRcXHRcXHTlm77niYcgPSAnaW1nJiZzcmNsJztcXHJcXG5cXHRcXHRcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxyXFxuXFx0XFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICdtb2R1bGUtaXRlbXMnKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0gJy5tb2R1bGUtaXRlbXMmJi5tb2R1bGUtaXRlbSc7XFxyXFxuXFx0XFx0XFx05qCH6aKYID0gJ2EmJnRpdGxlJztcXHJcXG5cXHRcXHRcXHTmj4/ov7AgPSAnLm1vZHVsZS1pdGVtLXRleHQmJlRleHQnO1xcclxcblxcdFxcdFxcdOWbvueJhyA9ICdpbWd8fC5sYXp5JiZkYXRhLXNyYyc7XFxyXFxuXFx0XFx0XFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcclxcblxcdFxcdH0gZWxzZSBpZiAo5qGG5p6257G75Z6LID09PSAncGFjay15a3BhY2snKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0gJ2JvZHkmJi5wYWNrLXlrcGFjayc7XFxyXFxuXFx0XFx0XFx05qCH6aKYID0gJ2EmJnRpdGxlJztcXHJcXG5cXHRcXHRcXHTmj4/ov7AgPSAnc3BhbiwtMSYmVGV4dCc7XFxyXFxuXFx0XFx0XFx05Zu+54mHID0gJy5lY2xhenkmJmRhdGEtb3JpZ2luYWwnO1xcclxcblxcdFxcdFxcdOmTvuaOpSA9ICdhJiZocmVmJztcXHJcXG5cXHRcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJ3N0dWktdm9kbGlzdCcpIHtcXHJcXG5cXHRcXHRcXHTliJfooaggPSAnLnN0dWktdm9kbGlzdCYmbGknO1xcclxcblxcdFxcdFxcdOagh+mimCA9ICdhJiZ0aXRsZSc7XFxyXFxuXFx0XFx0XFx05o+P6L+wID0gJy5waWMtdGV4dCYmVGV4dCc7XFxyXFxuXFx0XFx0XFx05Zu+54mHID0gJy5sYXp5bG9hZHx8YSYmZGF0YS1vcmlnaW5hbCc7XFxyXFxuXFx0XFx0XFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcclxcblxcdFxcdH0gZWxzZSBpZiAo5qGG5p6257G75Z6LID09PSAndm9kbGlzdCcpIHtcXHJcXG5cXHRcXHRcXHTliJfooaggPSAnLnZvZGxpc3QmJmxpJztcXHJcXG5cXHRcXHRcXHTmoIfpopggPSAnYSYmdGl0bGUnO1xcclxcblxcdFxcdFxcdOaPj+i/sCA9ICdhJiZUZXh0JztcXHJcXG5cXHRcXHRcXHTlm77niYcgPSAnLmxhenlsb2FkJiZkYXRhLW9yaWdpbmFsJztcXHJcXG5cXHRcXHRcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxyXFxuXFx0XFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICfmtYvor5UnKSB7XFxyXFxuXFx0XFx0XFx05YiX6KGoID0gJ2JvZHkmJmEnO1xcclxcblxcdFxcdFxcdOagh+mimCA9ICdib2R5JiZhJztcXHJcXG5cXHRcXHRcXHTmj4/ov7AgPSAnYm9keSYmYSc7XFxyXFxuXFx0XFx0XFx05Zu+54mHID0gJ2JvZHkmJmEnO1xcclxcblxcdFxcdFxcdOmTvuaOpSA9ICdib2R5JiZhJztcXHJcXG5cXHRcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJycpIHtcXHJcXG5cXHRcXHRcXHTliJfooaggPSDmoYbmnrbliJfooag7XFxyXFxuXFx0XFx0XFx05qCH6aKYID0g5qGG5p625qCH6aKYO1xcclxcblxcdFxcdFxcdOaPj+i/sCA9IOahhuaetuaPj+i/sDtcXHJcXG5cXHRcXHRcXHTlm77niYcgPSDmoYbmnrblm77niYc7XFxyXFxuXFx0XFx0XFx06ZO+5o6lID0g5qGG5p626ZO+5o6lO1xcclxcblxcdFxcdH1cXHJcXG5cXHRcXHRsZXQgbGlzdCA9IHBkZmEoaHRtbCwg5YiX6KGoKTtcXHJcXG5cXHRcXHRmb3IgKGxldCBrIGluIGxpc3QpIHtcXHJcXG5cXHRcXHRcXHRkLnB1c2goe1xcclxcblxcdFxcdFxcdFxcdHRpdGxlOiBwZGZoKGxpc3Rba10sIOagh+mimCksXFxyXFxuXFx0XFx0XFx0XFx0ZGVzYzogcGRmaChsaXN0W2tdLCDmj4/ov7ApLFxcclxcblxcdFxcdFxcdFxcdGltZzogcGQobGlzdFtrXSwg5Zu+54mHKSArICdAUmVmZXJlcj0nLFxcclxcblxcdFxcdFxcdFxcdHVybDogcGQobGlzdFtrXSwg6ZO+5o6lKStcXFwiI2ltbWVyc2l2ZVRoZW1lIyNhdXRvQ2FjaGUjXFxcIixcXHJcXG5cXHRcXHRcXHR9KTtcXHJcXG5cXHRcXHR9XFxyXFxuXFx0XFx0ZC5wdXNoKHtcXHJcXG5cXHRcXHRcXHRjb2xfdHlwZTogJ2JpZ19iaWdfYmxhbmtfYmxvY2snLFxcclxcblxcdFxcdH0pO1xcclxcblxcdH1cXHJcXG59KVxcclxcblxcclxcbiQuZXhwb3J0cyA9IG5ldyDkuIDnuqcoKTtcXHJcXG4kLmV4cG9ydHNcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWHveaVsOe7hOS7tipcIixcInBhdGhcIjpcInFzXCIsXCJydWxlXCI6XCJmdW5jdGlvbiDkvJjljJbot6/nur/nq6DoioLmlbDmja4o5aSa6Lev57q/5ZCmLCDmupDmlbDmja4sIOi3r+e6v+WIl+ihqCwg6Lev57q/5ZCNLCDpgInpm4bmgLvliJfooagsIOmAiembhuWIl+ihqCwg6ZuG5ZCNLCDpm4Z1cmwsIOWJjee8gCwg5qCH6aKYLCDlm77niYcpIHtcXG5cXG4gICAgLy/lvZPlpJrot6/nur/lkKYg6YCJ6ZuG5oC75YiX6KGo5Li656m6XFxuICAgIC8v5pyA57uI6L+U5ZueIFt7dGl0bGU6ICfot6/nur/lkI0nLGxpc3Q6IFt7dGl0bGU6J+mAiembhuWQjScsdXJsOifpgInpm4Z1cmwnLC4uLn1dLHNqc3M6J+S4i+i9vei1hOaWmSd9LC4uLi5dXFxuICAgIC8v6YCJ6ZuG5YiX6KGoIOesrOS4gOmhueaYr2Nzc+mAieaLqeWZqO+8jOS5i+WQjuWPr+S7peeUqCTliIblibLmt7vliqDopoHliKDpmaTnq6DoioLlkI1cXG5cXG5cXG4gICAgdmFyIOeroOiKgmpzb24gPSBbXTtcXG4gICAgdmFyIOWNlei3r+e6v+eroOiKgiA9ICfnq6DoioLliJfooagnXFxuXFxuICAgIHZhciDliJfooajlkI0gPSBbXTtcXG4gICAgaWYgKCHlpJrot6/nur/lkKYpIHtcXG5cXG4gICAgICAgIOWIl+ihqOWQjS5wdXNoKOWNlei3r+e6v+eroOiKgilcXG5cXG4gICAgfSBlbHNlIHtcXG5cXG4gICAgICAgIHBkZmEo5rqQ5pWw5o2uLCDot6/nur/liJfooagpLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcbiAgICAgICAgICAgIOWIl+ihqOWQjS5wdXNoKHBkZmgoZGF0YSwg6Lev57q/5ZCNKSlcXG4gICAgICAgIH0pO1xcblxcbiAgICB9XFxuXFxuICAgIHZhciDpm4bmlbDnu4QgPSBbXTtcXG5cXG5cXG52YXIg5o6S6Zmk56ug6IqCID0gW107XFxuaWYo6YCJ6ZuG5YiX6KGoLmluY2x1ZGVzKCckJykpe1xcbuaOkumZpOeroOiKgiA9IOmAiembhuWIl+ihqC5zcGxpdCgnJCcpXFxu6YCJ6ZuG5YiX6KGoID0g5o6S6Zmk56ug6IqCLnNoaWZ0KClcXG59XFxuXFxuICAgIGlmICgh5aSa6Lev57q/5ZCmKSB7XFxuICAgICAgICDpm4bmlbDnu4QucHVzaChwZGZhKOa6kOaVsOaNriwg6YCJ6ZuG5YiX6KGoKSlcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHBkZmEo5rqQ5pWw5o2uLCDpgInpm4bmgLvliJfooagpLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcbiAgICAgICAgICAgIOmbhuaVsOe7hC5wdXNoKHBkZmEoZGF0YSwg6YCJ6ZuG5YiX6KGoKSlcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuXFxuXFxuICAgIGZvciAobGV0IGkgaW4g6ZuG5pWw57uEKSB7XFxuXFxuICAgICAgICB2YXIgZG9MaXN0ID0gW107XFxuXFxu5o6S6Zmk56ug6IqCLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcbiAgICB2YXIg5qCH6K+GaWQgPSDpm4bmlbDnu4RbaV0uZmluZEluZGV4KOi/lOWbniA9PiDov5Tlm54uaW5kZXhPZihkYXRhKSAhPSAtMSk7XFxuICAgIGlmICjmoIfor4ZpZCAhPSAtMSkge1xcbiAgICAgIOmbhuaVsOe7hFtpXS5zcGxpY2Uo5qCH6K+GaWQsIDEpXFxuICAgIH07XFxuICB9KTtcXG5cXG4gICAgICAgIGZvciAobGV0IGl0IG9mIOmbhuaVsOe7hFtpXSkge1xcbiAgICAgICAgICAgIHZhciBkb0xpc3R1cmwgPSBwZGZoKGl0LCDpm4Z1cmwpXFxuICAgICAgICAgICAgZG9MaXN0dXJsID0gZG9MaXN0dXJsLmluY2x1ZGVzKFxcXCJodHRwXFxcIikgPyBkb0xpc3R1cmwgOiDliY3nvIAgKyBkb0xpc3R1cmxcXG4gICAgICAgICAgICBkb0xpc3QucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNtYWxsPicgKyBwZGZoKGl0LCDpm4blkI0pICsgJzwvc21hbGw+JyxcXG4gICAgICAgICAgICAgICAgdXJsOiBkb0xpc3R1cmxcXG4gICAgICAgICAgICB9KVxcbiAgICAgICAgfVxcblxcbiAgICAgICAgdmFyIGJvb2tOYW1lID0gIeWkmui3r+e6v+WQpiA/IOagh+mimCA6IOagh+mimCArICctJyArIOWIl+ihqOWQjVtpXVxcblxcbiAgICAgICAg56ug6IqCanNvbi5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTog5YiX6KGo5ZCNW2ldLFxcbiAgICAgICAgICAgIGxpc3Q6IGRvTGlzdCxcXG4gICAgICAgICAgICBzanNzOiB7XFxuICAgICAgICAgICAgICAgIGNoYXB0ZXJMaXN0OiBkb0xpc3QsXFxuICAgICAgICAgICAgICAgIGluZm86IHtcXG4gICAgICAgICAgICAgICAgICAgIGJvb2tOYW1lOiBib29rTmFtZSwgLy/mvKvnlLvlkI3np7AsXFxuICAgICAgICAgICAgICAgICAgICBydWxlTmFtZTogTVlfUlVMRS50aXRsZSxcXG4gICAgICAgICAgICAgICAgICAgIGJvb2tUb3BQaWM6IOWbvueJhyxcXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlQ29kZTogZG93bmxvYWRsYXp5LFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmlldzogXFxcIjFcXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgfVxcbiAgICByZXR1cm4g56ug6IqCanNvblxcbn1cXG5cXG5cXG5mdW5jdGlvbiDmt7vliqDlpLTpg6jliJfooagoZCwg5qCH6aKYLCDlm77niYcsIOaPj+i/sCwg5L2c6ICFLCDml7bpl7QsIOWIhuexuyzpobVVUkwpIHtcXG5cXG4gICAg5qCH6aKYID0gIeagh+mimCA/ICcnIDog5qCH6aKYICsgJ1xcXFxuJ1xcbiAgICDlm77niYcgPSAh5Zu+54mHID8gJycgOiDlm77niYdcXG4gICAg5o+P6L+wID0gIeaPj+i/sCA/ICcnIDog5o+P6L+wLnJlcGxhY2UoXFxcIuabtOaWsOiHs++8mlxcXCIsICcnKVxcblxcbiAgICDkvZzogIUgPSAh5L2c6ICFID8gJycgOiAnXFxcXG4nICsg5L2c6ICFXFxuICAgIOaXtumXtCA9ICHml7bpl7QgPyAnJyA6ICdcXFxcbicgKyDml7bpl7RcXG4gICAg5YiG57G7ID0gIeWIhuexuyA/ICcnIDogJ1xcXFxuJyArIOWIhuexu1xcblxcblxcbiAgICB2YXIg5aS06YOodGl0bGUgPSBbJ+KAmOKAmOKAmeKAmTxiPicsJzwvYj4gPHNtYWxsPjxmb250IGNvbG9yPSNGQTcyOTg+JywnPC9mb250PicsJzwvc21hbGw+J11cXG4gICAgdmFyIOWktOmDqGRlc2MgPSBbJ+KAmOKAmOKAmeKAmTxmb250IGNvbG9yPSNmOGVjYzk+JywnPC9mb250PiddXFxuXFxuXFxuXFxuICAgIOWktOmDqHRpdGxlID0g5aS06YOodGl0bGVbMF0r5qCH6aKYK+WktOmDqHRpdGxlWzFdK+aPj+i/sCvlpLTpg6h0aXRsZVsyXSvkvZzogIUr5aS06YOodGl0bGVbM11cXG5cXG4gICAg5aS06YOoZGVzYyA9IOWktOmDqGRlc2NbMF0r5pe26Ze0K+WIhuexuyvlpLTpg6hkZXNjWzFdXFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTog5aS06YOodGl0bGUsXFxuICAgICAgICBkZXNjOiDlpLTpg6hkZXNjLFxcbiAgICAgICAgcGljX3VybDog5Zu+54mHLFxcbiAgICAgICAgdXJsOiAnaGlrZXI6Ly9zZWFyY2g/cz0nK2dldFBhcmFtKCdOYW1lJykrJyZydWxlPemYhea8q+WQmycsXFxuICAgICAgICBjb2xfdHlwZTogJ21vdmllXzFfdmVydGljYWxfcGljX2JsdXInXFxuICAgIH0pO1xcblxcbn1cXG5cXG5cXG5mdW5jdGlvbiDmt7vliqDnroDku4soZCwg5pWw5o2u5rqQLCDpobVVUkwsIOWbvueJhykge1xcbiAgICAvL+iOt+WPluaVsOaNrlxcbiAgICB2YXIg566A5LuL5YaF5a65ID0g5pWw5o2u5rqQXFxuICAgIOeugOS7i+WGheWuuSA9IOeugOS7i+WGheWuuS5yZXBsYWNlKFxcXCLnroDku4vvvJpcXFwiLCBcXFwiXFxcIikucmVwbGFjZShcXFwi5LuL57uNOlxcXCIsIFxcXCJcXFwiKS5yZXBsYWNlKFxcXCLmvKvnlLtcXFwiLCBcXFwiXFxcIikucmVwbGFjZShcXFwi4oCm4oCmXFxcIiwgXFxcIlxcXCIpLnJlcGxhY2UoXFxcIueugOS7i1xcXCIsIFxcXCJcXFwiKVxcblxcbiAgICB2YXIg566A5LuL5YaF5a655pS2O1xcbiAgICBpZiAo566A5LuL5YaF5a65Lmxlbmd0aCA+IDQ1KSB7XFxuICAgICAgICDnroDku4vlhoXlrrnmlLYgPSDnroDku4vlhoXlrrkuc3Vic3RyKDAsIDQ1KSArICcuLi4nXFxuICAgIH0gZWxzZSB7XFxuICAgICAgICDnroDku4vlhoXlrrnmlLYgPSDnroDku4vlhoXlrrkgKyAnLi4uJ1xcbiAgICB9XFxuXFxuICAgIC8v5Zu+5qCH6I635Y+WXFxuICAgIGlmICgh5Zu+54mHKSB7XFxuICAgICAgICDlm77niYcgPSAnaHR0cHM6Ly9sYW5tZWlndW9qaWFuZy5jb20vdHViaWFvL3EvMTA3LnBuZydcXG4gICAgfVxcblxcbiAgICAvL+mhtVVSTCDojrflj5ZcXG4gICAgaWYgKCHpobVVUkwpIHtcXG4gICAgICAgIOmhtVVSTCA9IE1ZX1JVTEUudGl0bGVcXG4gICAgfVxcblxcbiAgICAvL+agh+mimOS4jueugOS7i+agt+W8j1xcbiAgICB2YXIgbXp0ZXh0ID0gXFxcIiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzxzbWFsbD7nroDku4s8L3NtYWxsPjxicj5cXFwiXFxuICAgIHZhciBidHRpdGxlID0gJzxmb250IGNvbG9yPVxcXCIjMDk4QUMxXFxcIj7mvKvnlLvnroDku4sgIDwvZm9udD48c21hbGw+PHNtYWxsPjxmb250IGNvbG9yPVxcXCIjZjQ3OTgzXFxcIj7nroDku4vmlLY+PC9mb250Pjwvc21hbGw+PC9zbWFsbD4nXFxuXFxuICAgIC8v5bGV5byA5LiO5pS257yp5pON5L2cXFxuICAgIHZhciBqaiA9IGdldE15VmFyKOmhtVVSTCArIFxcXCLnroDku4vmlLZcXFwiLCBcXFwi5bey5pS26LW3XFxcIik7XFxuICAgIHZhciBqanVybCA9ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKOeugOS7i+WGheWuuSwg566A5LuL5YaF5a655pS2LCDmlLYsIOaUtuWGheWuuSwg5b2T5YmNVVJMKSA9PiB7XFxuICAgICAgICB2YXIganNibCA9IOW9k+WJjVVSTCArIFxcXCLnroDku4vmlLZcXFwiO1xcbiAgICAgICAgdmFyIGpqID0gZ2V0TXlWYXIo5b2T5YmNVVJMICsgXFxcIueugOS7i+aUtlxcXCIsIFxcXCLlt7LmlLbotbdcXFwiKTtcXG4gICAgICAgIGpqID0gamogPT0gXFxcIuW3suaUtui1t1xcXCIgPyBcXFwi5bGV5byAXFxcIiA6IFxcXCLlt7LmlLbotbdcXFwiO1xcbiAgICAgICAgcHV0TXlWYXIoanNibCwgamopXFxuICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBpZDog5b2T5YmNVVJMICsgXFxcIl9idFxcXCJcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHRpdGxlOiDmlLYucmVwbGFjZShcXFwi566A5LuL5pS2XFxcIiwgamopXFxuICAgICAgICB9KVxcblxcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IOW9k+WJjVVSTCArIFxcXCJfbXpcXFwiXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICB0aXRsZTogamogPT0gXFxcIuW3suaUtui1t1xcXCIgPyDmlLblhoXlrrkucmVwbGFjZShcXFwi566A5LuLXFxcIiwg566A5LuL5YaF5a655pS2KSA6IOaUtuWGheWuuS5yZXBsYWNlKFxcXCLnroDku4tcXFwiLCDnroDku4vlhoXlrrkpXFxuICAgICAgICB9KVxcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCDnroDku4vlhoXlrrksIOeugOS7i+WGheWuueaUtiwgYnR0aXRsZSwgbXp0ZXh0LCDpobVVUkwpXFxuXFxuXFxuICAgIC8v5qCH6aKYXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogYnR0aXRsZS5yZXBsYWNlKFxcXCLnroDku4vmlLZcXFwiLCBqaiksXFxuICAgICAgICB1cmw6IGpqdXJsLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgcGljX3VybDog5Zu+54mHLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcIl9idFxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuXFxuICAgIC8v566A5LuLXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogamogPT0gXFxcIuW3suaUtui1t1xcXCIgPyBtenRleHQucmVwbGFjZShcXFwi566A5LuLXFxcIiwg566A5LuL5YaF5a655pS2KSA6IG16dGV4dC5yZXBsYWNlKFxcXCLnroDku4tcXFwiLCDnroDku4vlhoXlrrkpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcIl9telxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuXFxufVxcblxcbmZ1bmN0aW9uIOa3u+WKoOWIl+ihqOeroOiKgihkLCDmoIfpopjmlbDmja4sIOWIl+ihqOaVsOaNriwg6Kej5p6Q5Luj56CBLCDpobVVUkwsIOWbvueJhykge1xcblxcblxcbiAgICAvL2TkuI7lpJbnlYxk77yM5Li65ZCM5YaF5a2Y5Zyw5Z2A77yM5LiN55So6L+U5ZueXFxuICAgIC8v5qCH6aKY5pWw5o2uICDljbPmoIfpopjlkI3lrZdcXG4gICAgLy/liJfooajmlbDmja7lv4XpobvmmK9KU09OICDmoLzlvI/mmK9be3RpdGxlOicnLHVybDonJyx9LC4uLi4uXSAg5LiUdXJs5b+F6aG75pyJ5YmN57yAXFxuXFxuICAgIC8v5Zu+5qCH6I635Y+WXFxuICAgIGlmICgh5Zu+54mHKSB7XFxuICAgICAgICDlm77niYcgPSAnaHR0cHM6Ly9sYW5tZWlndW9qaWFuZy5jb20vdHViaWFvL3EvMTgucG5nJ1xcbiAgICB9XFxuXFxuICAgIC8v6aG1VVJMIOiOt+WPllxcbiAgICBpZiAoIemhtVVSTCkge1xcbiAgICAgICAg6aG1VVJMID0gTVlfUlVMRS50aXRsZVxcbiAgICB9XFxuXFxuICAgIC8v5qCH6aKY5ZCNXFxuICAgIHZhciDmoIfpopjlkI0gPSAnPGI+6Lev57q/PC9iPiAgPHNtYWxsPjxzbWFsbD48Zm9udCBjb2xvcj0jZjk5MDZmPuaOkuW6jyA+PC9mb250Pjwvc21hbGw+PC9zbWFsbD4nXFxuXFxuXFxuICAgIHZhciDmjpLluo8gPSBnZXRNeVZhcijpobVVUkwgKyBcXFwi56ug6IqC5o6S5bqPXFxcIiwgXFxcIuato+W6j1xcXCIpO1xcbiAgICB2YXIg5o+Q56S6ID0g5o6S5bqPID09ICflgJLluo8nID8gJ+ato+W6jycgOiAn5YCS5bqPJztcXG5cXG4gICAgdmFyIOaOkuW6j3VybCA9ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKOagh+mimOWQjSwg5qCH6aKY5pWw5o2uLCDliJfooajmlbDmja4sIOino+aekOS7o+eggSwg6aG1VVJMKSA9PiB7XFxuICAgICAgICB2YXIg5o6S5bqPID0gZ2V0TXlWYXIo6aG1VVJMICsgXFxcIueroOiKguaOkuW6j1xcXCIsIFxcXCLmraPluo9cXFwiKTtcXG4gICAgICAgIHZhciDmj5DnpLogPSDmjpLluo8gPT0gJ+WAkuW6jycgPyAn5q2j5bqPJyA6ICflgJLluo8nO1xcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXCJf5o6S5bqPXFxcIlxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgdGl0bGU6IOagh+mimOWQjS5yZXBsYWNlKCfot6/nur8nLCDmoIfpopjmlbDmja4pLnJlcGxhY2UoJ+aOkuW6jycsIOaPkOekuilcXG4gICAgICAgIH0pXFxuXFxuXFxuICAgICAgICBpZiAo5o+Q56S6ID09ICflgJLluo8nKSB7XFxuICAgICAgICAgICAg5YiX6KGo5pWw5o2uLnJldmVyc2UoKVxcbiAgICAgICAgfVxcbiAgICAgICAg5YiX6KGo5pWw5o2uLmZvckVhY2goZnVuY3Rpb24oZGF0YSwgc3NpZCkge1xcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogZGF0YS50aXRsZSxcXG4gICAgICAgICAgICAgICAgdXJsOiBkYXRhLnVybCArIOino+aekOS7o+eggSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiDpobVVUkwgKyBcXFwiX+mAiembhlxcXCIgKyBzc2lkXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0pO1xcblxcblxcbiAgICAgICAgcHV0TXlWYXIo6aG1VVJMICsgXFxcIueroOiKguaOkuW6j1xcXCIsIOaPkOekuilcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwg5qCH6aKY5ZCNLCDmoIfpopjmlbDmja4sIOWIl+ihqOaVsOaNriwg6Kej5p6Q5Luj56CBLCDpobVVUkwpXFxuXFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTog5qCH6aKY5ZCNLnJlcGxhY2UoJ+i3r+e6vycsIOagh+mimOaVsOaNrikucmVwbGFjZSgn5o6S5bqPJywg5o6S5bqPKSxcXG4gICAgICAgIHBpY191cmw6IOWbvueJhyxcXG4gICAgICAgIHVybDog5o6S5bqPdXJsLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcIl/mjpLluo9cXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcblxcbiAgICBpZiAo5o6S5bqPID09ICflgJLluo8nKSB7XFxuICAgICAgICDliJfooajmlbDmja4ucmV2ZXJzZSgpXFxuICAgIH1cXG5cXG4gICAg5YiX6KGo5pWw5o2uLmZvckVhY2goZnVuY3Rpb24oZGF0YSwgaWQpIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGRhdGEudGl0bGUsXFxuICAgICAgICAgICAgdXJsOiBkYXRhLnVybCArIOino+aekOS7o+eggSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXCJf6YCJ6ZuGXFxcIiArIGlkXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH0pO1xcblxcbn1cXG5cXG4vKlxcbmZ1bmN0aW9uIOa3u+WKoOmYsuatoue9kemhtSjpobl1cmwsIFVBKSB7XFxuXFxuICAgIC8v5LiK57qn6Lez6L2s5Yiw5b2T5YmN6aG155qE6ZO+5o6l5b+F6aG75pivaGlrZXI6Ly9lbXB0ee+8m+S4jeeEtuS4gOWIt+aWsOi/mOaYr+S8mumHjeWkjeWKoOi9vVxcbiAgICAvL1VBICcn5oiWZmFsc2XmiJYn5omL5py6JyDpu5jorqTmmK/miYvmnLrnq68gOyDnlLXohJEgJ1BDJ1xcblxcbiAgICB2YXIg5Yi35paw6YeN5aSNID0gTVlfUlVMRS50aXRsZSArIFxcXCLnvZHpobXmupDnoIFcXFwiXFxuICAgIHZhciBwY+mTvuaOpSA9IOmhuXVybC5yZXBsYWNlKFxcXCJtLlxcXCIsIFxcXCJ3d3cuXFxcIilcXG4gICAgdmFyIOaJi+acuumTvuaOpSA9IOmhuXVybC5yZXBsYWNlKFxcXCJ3d3cuXFxcIiwgXFxcIm0uXFxcIilcXG5cXG4gICAgdmFyIGNvZGU7XFxuICAgIGlmIChnZXRNeVZhcijliLfmlrDph43lpI0sIFxcXCJmYWxzZVxcXCIpID09IFxcXCJmYWxzZVxcXCIpIHtcXG5cXG4gICAgICAgIGNvZGUgPSBVQSA9PSAnUEMnID8gZmV0Y2gocGPpk77mjqUpIDogcmVxdWVzdCjmiYvmnLrpk77mjqUpO1xcbiAgICAgICAgcHV0TXlWYXIo5Yi35paw6YeN5aSNLCBnZXRQYXJhbSgndXJsJykgKyBcXFwi77+lJu+/pVxcXCIgKyBjb2RlKVxcblxcbiAgICB9IGVsc2Uge1xcblxcbiAgICAgICAgdmFyIHBtID0gZ2V0TXlWYXIo5Yi35paw6YeN5aSNKS5zcGxpdChcXFwi77+lJu+/pVxcXCIpXFxuICAgICAgICBpZiAocG1bMF0gPT0gZ2V0UGFyYW0oJ3VybCcpKSB7XFxuICAgICAgICAgICAgY29kZSA9IHBtWzFdXFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGNvZGUgPSBVQSA9PSAnUEMnID8gZmV0Y2gocGPpk77mjqUpIDogcmVxdWVzdCjmiYvmnLrpk77mjqUpO1xcbiAgICAgICAgICAgIHB1dE15VmFyKOWIt+aWsOmHjeWkjSwgZ2V0UGFyYW0oJ3VybCcpICsgXFxcIu+/pSbvv6VcXFwiICsgY29kZSlcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICByZXR1cm4gY29kZVxcbn1cXG4qL1xcblxcbmZ1bmN0aW9uIOa3u+WKoOmAieaLqei3r+e6vyhkLCDot6/nur/mlbDmja4sIOmhtVVSTCwg5aSa6Lev57q/5ZCmKSB7XFxuXFxuICAgIC8v6Lev57q/5pWw5o2uIOagvOW8j1t7dGl0bGU6J+i3r+e6v+WQjSd9LC4uLi5dXFxuICAgIC8v5aSa6Lev57q/5ZCmICBmYWxzZSDliJnkuI3lkK/nlKjpgInmi6not6/nur/vvJt0cnVlIOWImeWQr+eUqFxcblxcbiAgICB2YXIg6YCJ5oup5YiX6KGoID0gZ2V0SXRlbSjpobVVUkwgKyBcXFwi6YCJ5oup5YiX6KGoXFxcIiwgXFxcIjBcXFwiKVxcblxcbiAgICBpZiAo5aSa6Lev57q/5ZCmKSB7XFxuXFxuICAgICAgICB2YXIg6Lev57q/6YCJ5LitID0gJ+KAmOKAmOKAmeKAmTxmb250IGNvbG9yPSMwOThBQzE+6YCJ5LitPC9mb250PidcXG5cXG5cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJjigJjigJnigJnwn5OWPGZvbnQgY29sb3I9XFxcIiNGQTcyOThcXFwiPiDlm77mupDliJfooag8L2ZvbnQ+IO+8micsXFxuICAgICAgICAgICAgdXJsOiBcXFwidG9hc3Q6Ly/ngrnmiJHlubLllaXlkaJcXFwiLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnZmxleF9idXR0b24nXFxuICAgICAgICB9KTtcXG5cXG5cXG4gICAgICAgIOi3r+e6v+aVsOaNri5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEsIGlkKSB7XFxuXFxuICAgICAgICAgICAgdmFyIGpqdXJsID0gJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgo6aG1VVJMLGlkKSA9PiB7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0o6aG1VVJMICsgJ+mAieaLqeWIl+ihqCcsaWQrJycpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICAgfSzpobVVUkwsaWQpO1xcblxcbiAgICAgICAgICAgIHZhciDmoIfpopjlkI0gPSBpZCA9PSDpgInmi6nliJfooaggPyDot6/nur/pgInkuK0ucmVwbGFjZSgn6YCJ5LitJywgZGF0YS50aXRsZSkgOiBkYXRhLnRpdGxlO1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiDmoIfpopjlkI0sXFxuICAgICAgICAgICAgICAgIHVybDogamp1cmwsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnZmxleF9idXR0b24nLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXCJf6Lev57q/XFxcIiArIGlkXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0pO1xcblxcbiAgICB9XFxuICAgIHJldHVybiDpgInmi6nliJfooahcXG59XFxuXFxuXFxuZnVuY3Rpb24g5re75Yqg6YCJ5oup5LiL6L29KGQsIOi3r+e6v+aVsOaNriwg5aSa6Lev57q/5ZCmKSB7XFxuICAgIGQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZ8J+Xszxmb250IGNvbG9yPVxcXCIjZjQ3OTgzXFxcIj4g5Lmm5p62PC9mb250PiAnLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvQm9va3JhY2sudmlldz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhiZydWxlTmFtZT1cXFwiK01ZX1JVTEUudGl0bGUsXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXG59KTtcXG5cXG4gICAgLy/ot6/nur/mlbDmja4g5qC85byPW3t0aXRsZTon6Lev57q/5ZCNJyxzanNzOifkuIvovb3otYTmlpnkv6Hmga8nfSwuLi4uXVxcbiAgICAvL+Wkmui3r+e6v+WQpiAgZmFsc2Ug5YiZ5Y+q5pyJ4pGg5Liq5LiL6L29IOagh+mimOS4uiDngrnlh7vkuIvovb3vvJt0cnVlIOWImeWkmuS4quS4i+i9vVxcblxcbmlmKOWkmui3r+e6v+WQpil7XFxuXFxuZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZ8J+TpTxmb250IGNvbG9yPVxcXCIjZjQ3OTgzXFxcIj4g5LiL6L29PC9mb250PiDvvJonLFxcbiAgICAgICAgdXJsOiBcXFwidG9hc3Q6Ly/ngrnmiJHlubLllaXlkaJcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcbiAgICB9KTtcXG5cXG59XFxuXFxuICAgIOi3r+e6v+aVsOaNri5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEsIGlkKSB7XFxuXFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLmluY2x1ZGVzKCfnq6DoioLliJfooagnKSA/ICfngrnlh7vkuIvovb0nIDogZGF0YS50aXRsZSxcXG4gICAgICAgICAgICB1cmw6ICdoaWtlcjovL3BhZ2UvZG93bmxvYWQudmlldyNub1JlY29yZEhpc3RvcnkjI25vUmVmcmVzaCMjbm9IaXN0b3J5Iz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhicsXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgICAgICBleHRyYTogZGF0YS5zanNzXFxuICAgICAgICB9KTtcXG4gICAgfSk7XFxuXFxuICAgIGlmICjlpJrot6/nur/lkKYpIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICAgICAgfSk7XFxuICAgIH1cXG5cXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJDU1PpgInmi6nlmajmqKHniYgqXCIsXCJwYXRoXCI6XCJlandiLmpzXCIsXCJydWxlXCI6XCJmdW5jdGlvbiDkuIDnuqco5YiX6KGoLCDmoIfpopgsIOWbvueJhywg6ZuG5pWwLCDpk77mjqUsIOiuv+mXruWktCkge1xcbiAgICDorr/pl67lpLQgPSAh6K6/6Zeu5aS0ID8gJycgOiDorr/pl67lpLRcXG4gICAgdmFyIGQgPSBbXTtcXG4gICAgdmFyIGNvZGUgPSBnZXRDb2RlKClcXG4gICAgcGRmYShjb2RlLCDliJfooagpLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogcGRmaChkYXRhLCDmoIfpopgpLFxcbiAgICAgICAgICAgIGRlc2M6IHBkZmgoZGF0YSwg6ZuG5pWwKSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBwZChkYXRhLCDlm77niYcpfHzlm77niYcgKyBcXFwiQFJlZmVyZXI9XFxcIiArIOiuv+mXruWktCxcXG4gICAgICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5I2ltbWVyc2l2ZVRoZW1lIyNhdXRvQ2FjaGUjJyxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcIm1vdmllXzNcXFwiLFxcbmV4dHJhOiB7XFxuICAgICAgICAgICAgbmFtZTogcGRmaChkYXRhLCDmoIfpopgpLFxcbiAgICAgICAgICAgIHVybDogcGQoZGF0YSwg6ZO+5o6lKSxcXG4gICAgICAgICAgICBxejogTVlfSE9NRVxcbiAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH0pO1xcbiAgICBzZXRSZXN1bHQoZCk7XFxufVxcblxcblxcblxcbmZ1bmN0aW9uIOaQnOe0oijliJfooagsIOagh+mimCwg6ZO+5o6lLCDmj4/ov7AsIOivpuaDhSwg5Zu+54mHLCDorr/pl67lpLQpIHtcXG4gICAgdmFyIGQgPSBbXTtcXG4gICAg6K6/6Zeu5aS0ID0gIeiuv+mXruWktCA/ICcnIDog6K6/6Zeu5aS0XFxuICAgIHBkZmEoZ2V0UmVzQ29kZSgpLCDliJfooagpLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogcGRmaChkYXRhLCDmoIfpopgpLFxcbiAgICAgICAgICAgIGRlc2M6IHBkZmgoZGF0YSwg5o+P6L+wKSxcXG4gICAgICAgICAgICBwaWNfdXJsOiBwZChkYXRhLCDlm77niYcpICsgXFxcIkBSZWZlcmVyPVxcXCIgKyDorr/pl67lpLQsXFxuICAgICAgICAgICAgdXJsOiAnaGlrZXI6Ly9lbXB0eSNpbW1lcnNpdmVUaGVtZSMjYXV0b0NhY2hlIycsXFxuICAgICAgICAgICAgY29udGVudDogcGRmaChkYXRhLCDor6bmg4UpLFxcblxcbmV4dHJhOiB7XFxuICAgICAgICAgICAgbmFtZTogcGRmaChkYXRhLCDmoIfpopgpLFxcbiAgICAgICAgICAgIHVybDogcGQoZGF0YSwg6ZO+5o6lKSxcXG4gICAgICAgICAgICBxejogTVlfSE9NRVxcbiAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH0pO1xcbiAgICBzZXRSZXN1bHQoZCk7XFxufVxcblxcblxcblxcblxcbmZ1bmN0aW9uIOacgOaWsCjpgInmi6nlmagsIFVBKSB7XFxuICAgIGlmIChVQSA9PSBcXFwiUENcXFwiKSB7XFxuICAgICAgICB2YXIgY29kZSA9IGZldGNoKGdldFBhcmFtKCd1cmwnKS5yZXBsYWNlKFxcXCJtLlxcXCIsIFxcXCJ3d3cuXFxcIikpO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgdmFyIGNvZGUgPSByZXF1ZXN0KGdldFBhcmFtKCd1cmwnKS5yZXBsYWNlKFxcXCJ3d3cuXFxcIiwgXFxcIm0uXFxcIikpO1xcbiAgICB9XFxuICAgIHNldFJlc3VsdChwZGZoKGNvZGUsIOmAieaLqeWZqCkpXFxufVxcblxcblxcblxcbmV2YWwoSlNPTi5wYXJzZShyZXF1ZXN0KFxcXCJoaWtlcjovL3BhZ2UvcXM/cnVsZT3pmIXmvKvlkJtcXFwiKSkucnVsZSlcXG5cXG5mdW5jdGlvbiDkuoznuqco5aS06YOo5YiX6KGoLCDmoIfpopgsIOWbvueJhywg5o+P6L+wLCDorr/pl67lpLQsIOS9nOiAhSwg5pe26Ze0LCDliIbnsbssIOeugOS7iywg5aSa6Lev57q/5ZCmLCDot6/nur/liJfooagsIOi3r+e6v+WQjSwg6YCJ6ZuG5oC75YiX6KGoLCDpgInpm4bliJfooagsIOmbhuWQjSwg6ZuGdXJsLCBkb3dubG9hZGxhenks5b2T5YmNVVJMLOW9k+WJjemhteWQjSzliY3nvIAsVUEs6Ziy6YeN6L295ZCmKSB7XFxuICAgIHZhciBkID0gW107XFxuXFxuLy/lpLTpg6jliJfooaggIOWImem7mOiupOS9v+eUqCBjb2RlIOadpeS9nOS4uuWktOmDqOWIl+ihqOaVsOaNrlxcbi8v5aSa6Lev57q/5ZCmICB0cnVlIOWImeS9v+eUqOWkmui3r+e6v++8m2ZhbHNlIOWImeS9v+eUqOeroOi3r+e6v1xcbi8vVUEgIOS4jeWhq+WImeS9v+eUqOaJi+acuuerryAgJ1BDJ+WImeaJi+acuuerr1xcblxcbmlmICjlvZPliY3pobXlkI0pIHtcXG4gICAgc2V0UGFnZVRpdGxlKOW9k+WJjemhteWQjSlcXG59XFxuXFxuaWYo6Ziy6YeN6L295ZCmKXtcXG4vL+e9kemhteWGheWuuSvpmLLmraLph43mi4lcXG4gICAgdmFyIGNvZGUgPSDmt7vliqDpmLLmraLnvZHpobUo5b2T5YmNVVJMLCBVQSlcXG59ZWxzZXtcXG4gICAgdmFyIGNvZGUgPSBnZXRDb2RlKClcXG59XFxuICAgIFxcblxcbiAgICAvL+WktOmDqOWIl+ihqOaVsOaNrlxcbiAgICB2YXIg5aS06YOoID0gIeWktOmDqOWIl+ihqCA/IGNvZGUgOiBwZGZhKGNvZGUsIOWktOmDqOWIl+ihqClbMF07XFxuICAgIOagh+mimCA9IHBkZmgo5aS06YOoLCDmoIfpopgpXFxuICAgIOWbvueJhyA9IHBkZmgo5aS06YOoLCDlm77niYcpfHzlm77niYdcXG4gICAgaWYgKOWbvueJhykge1xcbiAgICAgICAg5Zu+54mHID0g5Zu+54mHLmluY2x1ZGVzKCdodHRwJykgPyDlm77niYcgOiDliY3nvIAgKyDlm77niYdcXG4gICAgICAgIGlmICgh6K6/6Zeu5aS0KSB7fSBlbHNlIGlmICjorr/pl67lpLQuc3Vic3RyKDAsIDEpID09ICdAJykge1xcbiAgICAgICAgICAgIOWbvueJhyA9IOWbvueJhyArIOiuv+mXruWktFxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICDlm77niYcgPSDlm77niYcgKyBcXFwiQFJlZmVyZXI9XFxcIiArIOiuv+mXruWktFxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIFxcblxcbuaPj+i/sCA9IOaPj+i/sC5pbmNsdWRlcygnJCcpID8g5o+P6L+wLnNwbGl0KCckJylbMV0gKyBwZGZoKOWktOmDqCwg5o+P6L+wLnNwbGl0KCckJylbMF0pIDogcGRmaCjlpLTpg6gsIOaPj+i/sClcXG5cXG7kvZzogIUgPSDkvZzogIUuaW5jbHVkZXMoJyQnKSA/IOS9nOiAhS5zcGxpdCgnJCcpWzFdICsgcGRmaCjlpLTpg6gsIOS9nOiAhS5zcGxpdCgnJCcpWzBdKSA6IHBkZmgo5aS06YOoLCDkvZzogIUpXFxuICAgIFxcbuaXtumXtCA9IOaXtumXtC5pbmNsdWRlcygnJCcpID8g5pe26Ze0LnNwbGl0KCckJylbMV0gKyBwZGZoKOWktOmDqCwg5pe26Ze0LnNwbGl0KCckJylbMF0pIDogcGRmaCjlpLTpg6gsIOaXtumXtClcXG5cXG7liIbnsbsgPSDliIbnsbsuaW5jbHVkZXMoJyQnKSA/IOWIhuexuy5zcGxpdCgnJCcpWzFdICsgcGRmaCjlpLTpg6gsIOWIhuexuy5zcGxpdCgnJCcpWzBdKSA6IHBkZmgo5aS06YOoLCDliIbnsbspXFxuXFxuICAgIFxcbiAgICAvL+WktOmDqOWIl+ihqFxcbiAgICDmt7vliqDlpLTpg6jliJfooagoZCwg5qCH6aKYLCDlm77niYcsIOaPj+i/sCwg5L2c6ICFLCDml7bpl7QsIOWIhuexuyzlvZPliY1VUkwpXFxuICAgIFxcbiAgICAvL+i3r+e6v+WQjeS4jumAiembhuaVsOaNrlxcbiAgICB2YXIg56ug6IqCanNvbiA9IOS8mOWMlui3r+e6v+eroOiKguaVsOaNrijlpJrot6/nur/lkKYsIGNvZGUsIOi3r+e6v+WIl+ihqCzot6/nur/lkI0s6YCJ6ZuG5oC75YiX6KGoLOmAiembhuWIl+ihqCzpm4blkI0s6ZuGdXJsLOWJjee8gCzlvZPliY3pobXlkI0s5Zu+54mHKVxcblxcbiAgICAvL+eugOS7i1xcbiAgICDmt7vliqDnroDku4soZCwgcGRmaChjb2RlLCDnroDku4spLCDlvZPliY1VUkwsICcnKVxcblxcbiAgIC8v5b2T5rKh5pyJ56ug6IqC5YaF5a6577yM5bCx5LiN5pi+56S6XFxuICAgIGlmICjnq6DoioJqc29uLmxlbmd0aCA+IDApIHtcXG5cXG4gICAgICAgIC8v6Lev57q/6YCJ5oupXFxuICAgICAgICB2YXIg6YCJ5oup5YiX6KGoID0g5re75Yqg6YCJ5oup6Lev57q/KGQsIOeroOiKgmpzb24sIOW9k+WJjVVSTCwg5aSa6Lev57q/5ZCmKVxcblxcbiAgICAgICAgLy/pgInmi6nkuIvovb1cXG4gICAgICAgIOa3u+WKoOmAieaLqeS4i+i9vShkLCDnq6DoioJqc29uLOWkmui3r+e6v+WQpilcXG5cXG4gICAgICAgIC8v5o6S5bqP5LiO6YCJ6ZuGXFxuICAgICAgICDmt7vliqDliJfooajnq6DoioIoZCwg56ug6IqCanNvblvpgInmi6nliJfooahdLnRpdGxlLCDnq6DoioJqc29uW+mAieaLqeWIl+ihqF0ubGlzdCwgbGF6eSwg5b2T5YmNVVJMLCAnJylcXG5cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJsb25nX3RleHRcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBzZXRSZXN1bHQoZClcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLkuoznuqfliJfooagqXCIsXCJwYXRoXCI6XCJlamxiXCIsXCJydWxlXCI6XCJ2YXIgdGFicyA9IFtdXFxudmFyIGxpc3RzID0gW11cXG52YXIgYXJ0cyA9IHBkZmEoaHRtbCwg57q/6LevKTtcXG5hcnRzLmZvckVhY2goKGRhdGEsIGlkKSA9PiB7XFxuICAgIHRhYnMucHVzaChwZGZoKGRhdGEsIOe6v+i3r+WQjSkpXFxufSlcXG52YXIgY29udHMgPSBwZGZhKGh0bWwsIOmAiembhik7XFxuY29udHMuZm9yRWFjaCgoZGF0YSwgaWQpID0+IHtcXG4gICAgbGlzdHMucHVzaChwZGZhKGRhdGEsIOmAiembhuWIl+ihqCkpXFxufSlcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhck15VmFyKFxcXCJsaXN0c1xcXCIpO1xcbn0pKTtcXG5zdG9yYWdlMC5wdXRNeVZhcihcXFwibGlzdHNcXFwiLCBsaXN0cyk7XFxudmFyIGxpc3QgPSBsaXN0c1tnZXRNeVZhcihNWV9VUkwsICcwJyldO1xcbnZhciDmjpLluo8gPSBnZXRNeVZhcihNWV9VUkwgKyBcXFwi56ug6IqC5o6S5bqPXFxcIiwgJyMxYWFkMTlcXFwiPuato+W6jycpO1xcbnZhciDmj5DnpLogPSDmjpLluo8gPT0gJyNGRjAwMDBcXFwiPuWAkuW6jycgPyAnIzFhYWQxOVxcXCI+5q2j5bqPJyA6ICcjRkYwMDAwXFxcIj7lgJLluo8nO1xcbnZhciDmjpLluo/lkI0gPSAn4oCc4oCc4oCd4oCdPGI+PHNwYW4gc3R5bGU9XFxcImNvbG9yOuaOkuW6jzwvc3Bhbj48L2I+J1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGI+PHNwYW4gc3R5bGU9XFxcImNvbG9yOiAnICsg5o6S5bqPICsgJzwvc3Bhbj48L2I+JyxcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCjmjpLluo/lkI0sIGxhenkpID0+IHtcXG4gICAgICAgIHZhciBsaXN0cyA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJsaXN0c1xcXCIpO1xcbiAgICAgICAgdmFyIOeroOiKgiA9IGxpc3RzW2dldE15VmFyKE1ZX1VSTCwgJzAnKV07XFxuICAgICAgICB2YXIg5o6S5bqPID0gZ2V0TXlWYXIoTVlfVVJMICsgXFxcIueroOiKguaOkuW6j1xcXCIsICcjMWFhZDE5XFxcIj7mraPluo8nKTtcXG4gICAgICAgIHZhciDmj5DnpLogPSDmjpLluo8gPT0gJyNGRjAwMDBcXFwiPuWAkuW6jycgPyAnIzFhYWQxOVxcXCI+5q2j5bqPJyA6ICcjRkYwMDAwXFxcIj7lgJLluo8nO1xcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX1VSTCArIFxcXCJf5o6S5bqPXFxcIlxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgdGl0bGU6IOaOkuW6j+WQjS5yZXBsYWNlKCfmjpLluo8nLCDmj5DnpLopXFxuICAgICAgICB9KVxcbiAgICAgICAgaWYgKOaOkuW6jyA9PSAnIzFhYWQxOVxcXCI+5q2j5bqPJykge1xcbiAgICAgICAgICAgIOeroOiKgi5yZXZlcnNlKClcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBjcCA9IOeroOiKgi5tYXAoKGRhdGEsIHNzaWQpID0+IHtcXG4gICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChkYXRhLCAnYSYmVGV4dCcpLFxcbiAgICAgICAgICAgICAgICB1cmw6IHBkKGRhdGEsICdhJiZocmVmJykgKyBsYXp5LFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfMicsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBjbHM6IE1ZX1VSTCArIFxcXCJf6YCJ6ZuGXFxcIlxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfTtcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKE1ZX1VSTCArIFxcXCJf6YCJ6ZuGXFxcIik7XFxuICAgICAgICBhZGRJdGVtQmVmb3JlKE1ZX1VSTCArIFxcXCJmb290ZXJcXFwiLCBjcCk7XFxuICAgICAgICBwdXRNeVZhcihNWV9VUkwgKyBcXFwi56ug6IqC5o6S5bqPXFxcIiwg5o+Q56S6KVxcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCDmjpLluo/lkI0sIGxhenkpLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IE1ZX1VSTCArIFxcXCJf5o6S5bqPXFxcIlxcbiAgICB9XFxufSlcXG50YWJzLmZvckVhY2goKGRhdGEsIGlkKSA9PiB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogZ2V0TXlWYXIoTVlfVVJMLCAnMCcpID09IGlkID8gJ+KAnOKAnCcgKyBkYXRhICsgJ+KAneKAnScgOiBkYXRhLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCjnur/ot68sIGxhenksIGlkKSA9PiB7XFxuICAgICAgICAgICAgdmFyIGxpc3RzID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcImxpc3RzXFxcIik7XFxuICAgICAgICAgICAgdmFyIOaOkuW6jyA9IGdldE15VmFyKE1ZX1VSTCArIFxcXCLnq6DoioLmjpLluo9cXFwiLCAnIzFhYWQxOVxcXCI+5q2j5bqPJyk7XFxuICAgICAgICAgICAgdmFyIOaPkOekuiA9IOaOkuW6jyA9PSAnI0ZGMDAwMFxcXCI+5YCS5bqPJyA/ICcjMWFhZDE5XFxcIj7mraPluo8nIDogJyNGRjAwMDBcXFwiPuWAkuW6jyc7XFxuXFxuICAgICAgICAgICAg57q/6LevLmZvckVhY2goKGRhdGEsIHhsaWQpID0+IHtcXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogaWQgPT0geGxpZCA/ICfigJzigJwnICsgZGF0YSArICfigJ3igJ0nIDogZGF0YSxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IE1ZX1VSTCArIFxcXCJf57q/6LevXFxcIiArIHhsaWRcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICBwdXRNeVZhcihNWV9VUkwsIGlkKVxcbiAgICAgICAgICAgIHZhciDnq6DoioIgPSBsaXN0c1tnZXRNeVZhcihNWV9VUkwsICcwJyldO1xcbiAgICAgICAgICAgIGlmICjmjpLluo8gPT0gJyNGRjAwMDBcXFwiPuWAkuW6jycpIHtcXG4gICAgICAgICAgICAgICAg56ug6IqCLnJldmVyc2UoKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgY3AgPSDnq6DoioIubWFwKChkYXRhLCBzc2lkKSA9PiB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChkYXRhLCAnYSYmVGV4dCcpLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBwZChkYXRhLCAnYSYmaHJlZicpICsgbGF6eSxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF8yJyxcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xzOiBNWV9VUkwgKyBcXFwiX+mAiembhlxcXCJcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBkZWxldGVJdGVtQnlDbHMoTVlfVVJMICsgXFxcIl/pgInpm4ZcXFwiKTtcXG4gICAgICAgICAgICBhZGRJdGVtQmVmb3JlKE1ZX1VSTCArIFxcXCJmb290ZXJcXFwiLCBjcCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSwgdGFicywgbGF6eSwgaWQpLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgaWQ6IE1ZX1VSTCArIFxcXCJf57q/6LevXFxcIiArIGlkXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn0pXFxuXFxuaWYgKOaOkuW6jyA9PSAnI0ZGMDAwMFxcXCI+5YCS5bqPJykge1xcbiAgICBsaXN0LnJldmVyc2UoKVxcbn1cXG5saXN0LmZvckVhY2goKGRhdGEsIGlkKSA9PiB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogcGRmaChkYXRhLCAnYSYmVGV4dCcpLFxcbiAgICAgICAgdXJsOiBwZChkYXRhLCAnYSYmaHJlZicpICsgbGF6eSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF8yJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgY2xzOiBNWV9VUkwgKyBcXFwiX+mAiembhlxcXCJcXG4gICAgICAgIH1cXG4gICAgfSk7XFxufSlcXG5sZXQgbmV3c3RpcCA9IGxpc3QubGVuZ3RoO1xcbmlmIChuZXdzdGlwKSB7XFxuICAgIHNldExhc3RDaGFwdGVyUnVsZSgnanM6JyArICQudG9TdHJpbmcoKG5ld3N0aXApID0+IHtcXG4gICAgICAgIHNldFJlc3VsdCgn5pu05paw6IezOiDnrKwnICsgbmV3c3RpcCArIFxcXCLpm4ZcXFwiKTtcXG4gICAgfSwgbmV3c3RpcCkpO1xcbn1cXG5cXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImJpZ19ibGFua19ibG9ja1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBpZDogTVlfVVJMICsgXFxcImZvb3RlclxcXCJcXG4gICAgfVxcbn0pO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi546v5aKD5Yqr5oyBXCIsXCJwYXRoXCI6XCJoaWphY2tFbnZcIixcInJ1bGVcIjpcInZhciB7IFJVTEUsIGlzSW5kZXgsIHBhZ2VUaXRsZSB9ID0gTVlfUEFSQU1TXFxuUlVMRSA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKFJVTEUpKVxcbnZhciBvcmlSVUxFID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZGF0YUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRSkuZmluZCgodikgPT4gdi50aXRsZSA9PSBSVUxFLnRpdGxlKVxcbmlmIChpc0luZGV4KSB7XFxuICAgIFJVTEUgPSBvcmlSVUxFXFxuICAgIHZhciB7IHRhYkhlYWRlciwgZnlBbGwgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL0NsYXNzVGFiP3J1bGU9JyArIFFJTkdfVElUTEUsIE9iamVjdC5hc3NpZ24oeyBRSU5HX1RJVExFOiBRSU5HX1RJVExFIH0sIFJVTEUpKVxcbiAgICAvLyDlpITnkIZNWV9SVUxFXFxuICAgIE1ZX1JVTEUuY2xhc3NfdXJsID0gdGFiSGVhZGVyLmdldENsYXNzKGZ5QWxsID8gJ2Z5QWxsJyA6ICdmeWNsYXNzJykudXJsXFxuICAgIE1ZX1JVTEUuYXJlYV91cmwgPSBmeUFsbCA/IE1ZX1JVTEUuY2xhc3NfdXJsIDogdGFiSGVhZGVyLmdldENsYXNzKCdmeWFyZWEnKS51cmxcXG4gICAgTVlfUlVMRS55ZWFyX3VybCA9IGZ5QWxsID8gTVlfUlVMRS5jbGFzc191cmwgOiB0YWJIZWFkZXIuZ2V0Q2xhc3MoJ2Z5eWVhcicpLnVybFxcbiAgICBNWV9SVUxFLnNvcnRfdXJsID0gZnlBbGwgPyBNWV9SVUxFLmNsYXNzX3VybCA6IHRhYkhlYWRlci5nZXRDbGFzcygnZnlzb3J0JykudXJsXFxuICAgIE1ZX1JVTEUudXJsID0gUlVMRS51cmxcXG4gICAgTVlfUlVMRS5jb2xfdHlwZSA9IFJVTEUuY29sX3R5cGVcXG4gICAgTVlfUlVMRS5kZXRhaWxfY29sX3R5cGUgPSBSVUxFLmRldGFpbF9jb2xfdHlwZVxcbiAgICBNWV9SVUxFLmZpbmRfcnVsZSA9IFJVTEUuZmluZF9ydWxlXFxuICAgIE1ZX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSA9IFJVTEUuZGV0YWlsX2ZpbmRfcnVsZVxcbiAgICBNWV9SVUxFLnBhcmFtcyA9IHt9XFxufSBlbHNlIHtcXG4gICAgUlVMRS5wYWdlcyA9IG9yaVJVTEUucGFnZXNcXG4gICAgLy8g5aSE55CGTVlfUlVMRVxcbiAgICBNWV9SVUxFLnVybCA9IE1ZX1BBUkFNUy51cmxcXG4gICAgTVlfUlVMRS5jb2xfdHlwZSA9IFJVTEUuZGV0YWlsX2NvbF90eXBlXFxuICAgIE1ZX1JVTEUuZmluZF9ydWxlID0gUlVMRS5kZXRhaWxfZmluZF9ydWxlXFxuICAgIE1ZX1JVTEUucGFyYW1zID0gUlVMRS5wYXJhbXNcXG59XFxuTVlfUlVMRS5wYWdlcyA9IFJVTEUucGFnZXNcXG5NWV9SVUxFLnBhZ2VMaXN0ID0gSlNPTi5wYXJzZShNWV9SVUxFLnBhZ2VzIHx8ICdbXScpXFxuTVlfUlVMRS50aXRsZSA9IFJVTEUudGl0bGVcXG5NWV9SVUxFLnVhID0gUlVMRS51YVxcbmxvZyhNWV9SVUxFLnVybClcXG4vLyDovb3lhaXlh73mlbDlt6XlhbdcXG52YXIgeyBnZW5NeVJ1bGUgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2Z1bmNUb29scz9ydWxlPScgKyBRSU5HX1RJVExFLCB7XFxuICAgIFFJTkdfVElUTEU6IFFJTkdfVElUTEUsXFxuICAgIE1ZX1JVTEU6IE1ZX1JVTEUsXFxuICAgIGlzSW5kZXg6IGlzSW5kZXhcXG59KVxcbi8vIOmYsuatonJlcXVpcmXlpJrmrKHov5DooYxcXG5jb25zdCBteUNvbGxfcmVxdWlyZWQgPSB7fVxcbnJlcXVpcmUgPSBmdW5jdGlvbihwYXJhbTAsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCkge1xcbiAgICBpZiAobXlDb2xsX3JlcXVpcmVkW3BhcmFtMF0pIHJldHVyblxcbiAgICBteUNvbGxfcmVxdWlyZWRbcGFyYW0wXSA9IHRydWVcXG4gICAgcGFyYW0yID0gcGFyYW0yICE9IG51bGwgPyBwYXJhbTIgOiAwXFxuICAgIHBhcmFtMyA9IE1ZX1RJQ0tFVFxcbiAgICBwYXJhbTQgPSBldmFsXFxuICAgIHJldHVybiBtZXRob2RfcmVxdWlyZS5pbnZva2UoamF2YUNvbnRleHQsIHBhcmFtMCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00KVxcbn1cXG5yZXF1aXJlQ2FjaGUgPSBmdW5jdGlvbihwYXJhbTAsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KSB7XFxuICAgIGlmIChteUNvbGxfcmVxdWlyZWRbcGFyYW0wXSkgcmV0dXJuXFxuICAgIG15Q29sbF9yZXF1aXJlZFtwYXJhbTBdID0gdHJ1ZVxcbiAgICBwYXJhbTMgPSBwYXJhbTMgIT0gbnVsbCA/IHBhcmFtMyA6IDBcXG4gICAgcGFyYW00ID0gTVlfVElDS0VUXFxuICAgIHBhcmFtNSA9IGV2YWxcXG4gICAgcmV0dXJuIG1ldGhvZF9yZXF1aXJlQ2FjaGUuaW52b2tlKGphdmFDb250ZXh0LCBwYXJhbTAsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNCwgcGFyYW01KVxcbn1cXG5yYyA9IHJlcXVpcmVDYWNoZVxcbi8vIOacgOaWsOeroOiKguinhOWImeeOr+Wig+WKq+aMgVxcbnNldExhc3RDaGFwdGVyUnVsZSA9IGZ1bmN0aW9uKHBhcmFtMCkge1xcbiAgICBpZiAocGFyYW0wLnN0YXJ0c1dpdGgoXFxcImpzOlxcXCIpKSB7XFxuICAgICAgICBwYXJhbTAgPSAnanM6JyArICQudG9TdHJpbmcoKFFJTkdfVElUTEUsIE1ZX1BBUkFNUykgPT4ge1xcbiAgICAgICAgICAgIGV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL2hpamFja0Vudj9ydWxlPScgKyBRSU5HX1RJVExFKSkucnVsZSlcXG4gICAgICAgICAgICB2YXIgeyBydW5QcmVSdWxlIH0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9mdW5jVG9vbHM/cnVsZT0nICsgUUlOR19USVRMRSlcXG4gICAgICAgICAgICBydW5QcmVSdWxlKG9yaVJVTEUucHJlUnVsZSlcXG4gICAgICAgIH0sIFFJTkdfVElUTEUsIHsgdXJsOiBNWV9SVUxFLnVybCwgUlVMRTogYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KGdlbk15UnVsZSgpKSksIGlzSW5kZXg6IGlzSW5kZXggfSkgKyAnOycgKyBwYXJhbTAuc2xpY2UoMylcXG4gICAgfVxcbiAgICBtZXRob2Rfc2V0TGFzdENoYXB0ZXJSdWxlLmludm9rZShqYXZhQ29udGV4dCwgcGFyYW0wKVxcbn1cXG4vLyDliqjmgIHmlrDlop7lh73mlbDliqvmjIFcXG5hZGRJdGVtQWZ0ZXIgPSBmdW5jdGlvbihwYXJhbTAsIHBhcmFtMSkge1xcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbTEpKSBwYXJhbTEgPSBwYXJhbTEubWFwKGhpamFja0VsKVxcbiAgICBlbHNlIHBhcmFtMSA9IGhpamFja0VsKHBhcmFtMSlcXG4gICAgbWV0aG9kX2FkZEl0ZW1BZnRlci5pbnZva2UoamF2YUNvbnRleHQsIHBhcmFtMCwgcGFyYW0xKVxcbn1cXG5hZGRJdGVtQmVmb3JlID0gZnVuY3Rpb24ocGFyYW0wLCBwYXJhbTEpIHtcXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW0xKSkgcGFyYW0xID0gcGFyYW0xLm1hcChoaWphY2tFbClcXG4gICAgZWxzZSBwYXJhbTEgPSBoaWphY2tFbChwYXJhbTEpXFxuICAgIG1ldGhvZF9hZGRJdGVtQmVmb3JlLmludm9rZShqYXZhQ29udGV4dCwgcGFyYW0wLCBwYXJhbTEpXFxufVxcbi8vQOiPnOWboiDnjq/looPliqvmjIHliqvmjIHlk6rph4zliqDkuKrov5nkuKotTOS9rFxcbnJlcXVlc3QgPSBmdW5jdGlvbihwYXJhbTAsIHBhcmFtMSwgcGFyYW0yKSB7XFxuICAgIGlmIChwYXJhbTAuaW5jbHVkZXMoXFxcImhpa2VyOi8vcGFnZS9cXFwiKSkge1xcbiAgICAgICAgbGV0IHJ1bGUgPSAocGFyYW0wLnNwbGl0KC9cXFxcPy4qcnVsZT0vKVsxXSB8fCBcXFwiXFxcIikuc3BsaXQoXFxcIiZcXFwiKVswXTtcXG4gICAgICAgIGxldCBwYWdlVXJsID0gcGFyYW0wLnNwbGl0KFxcXCJoaWtlcjovL3BhZ2UvXFxcIilbMV0uc3BsaXQoXFxcIj9cXFwiKVswXTtcXG4gICAgICAgIGlmIChydWxlICE9PSBRSU5HX1RJVExFKSB7XFxuICAgICAgICAgICAgbGV0IHJ1bGVDb2RlO1xcbiAgICAgICAgICAgIGlmICghcnVsZSB8fCBydWxlID09PSBSVUxFLnRpdGxlKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGVDb2RlID0gKFJVTEUucGFnZUxpc3QgfHwgKFJVTEUucGFnZUxpc3QgPSBKU09OLnBhcnNlKFJVTEUucGFnZXMpKSkuZmluZCh2ID0+IHYucGF0aCA9PT0gcGFnZVVybCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmKHJ1bGVDb2RlKXtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJ1bGVDb2RlKTtcXG4gICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBwYXJhbTIgPSBNWV9SVUxFO1xcbiAgICB2YXIgcmV0U3RyID0gbWV0aG9kX3JlcXVlc3QuaW52b2tlKGphdmFDb250ZXh0LCBwYXJhbTAsIHBhcmFtMSwgcGFyYW0yKTtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGlmIChyZXRTdHIgaW5zdGFuY2VvZiBqYXZhLmlvLklucHV0U3RyZWFtKSB7XFxuICAgICAgICAgICAgcmV0dXJuIHJldFN0cjtcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge31cXG4gICAgcmV0dXJuIHJldFN0ciA9PSBudWxsID8gcmV0U3RyIDogcmV0U3RyICsgXFxcIlxcXCI7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Ye95pWw5bel5YW3XCIsXCJwYXRoXCI6XCJmdW5jVG9vbHNcIixcInJ1bGVcIjpcImxldCB7IFFJTkdfVElUTEUsIE1ZX1JVTEUsIGlzSW5kZXggfSA9ICQuaW1wb3J0UGFyYW1cXG5pZiAoIU1ZX1JVTEUpIE1ZX1JVTEUgPSB7fVxcblxcbmZ1bmN0aW9uIHJ1bkNvZGUocnVsZSkge1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IFtpbnB1dCwgY29kZV0gPSBydWxlLnNwbGl0KCcuanM6JylcXG4gICAgICAgIHJldHVybiBjb2RlID8gZXZhbChjb2RlKSA6IHJ1bGVcXG4gICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gcnVsZSB9XFxufVxcbi8vIOmmlumhtemTvuaOpeabv+aNouWIhuexu1xcbmZ1bmN0aW9uIGluZGV4VXJsKHBhcmFtKSB7XFxuICAgIE1ZX1JVTEUgPSBKU09OLnBhcnNlKGJhc2U2NERlY29kZShNWV9SVUxFKSlcXG4gICAgbGV0IHBhZ2VOdW0gPSBwYXJzZUludChwYXJhbS5zcGxpdCgnIyMjJylbMV0pLFxcbiAgICAgICAgdXJsID0gTVlfUlVMRS51cmwsXFxuICAgICAgICB7IGZ5QWxsLCB0YWJIZWFkZXIgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL0NsYXNzVGFiP3J1bGU9JyArIFFJTkdfVElUTEUsIE9iamVjdC5hc3NpZ24oeyBRSU5HX1RJVExFOiBRSU5HX1RJVExFIH0sIE1ZX1JVTEUpKVxcblxcbiAgICB1cmwgPSB0YWJIZWFkZXIuc2V0VXJsKGZ5QWxsID8gdXJsLnJlcGxhY2UoL2Z5QWxsL2csICckJHtmeUFsbH0nKSA6IHVybC5yZXBsYWNlKC9meShjbGFzc3xhcmVhfHllYXJ8c29ydCkvZywgJyQke2Z5JDF9JykpXFxuICAgIHVybCA9IHVybC5yZXBsYWNlKC9meXBhZ2UoPzpAKC0/XFxcXGQrKUApPyg/OlxcXFwqKFxcXFxkKylAKT8vZywgKF8sIHN0YXJ0LCBzcGFjZSkgPT4gcGFyc2VJbnQoc3RhcnQgfHwgMCkgKyAxICsgKHBhZ2VOdW0gLSAxKSAqIHBhcnNlSW50KHNwYWNlIHx8IDEpKVxcbiAgICB1cmwgPSAvXihbXFxcXHNcXFxcU10qPykoPzpcXFxcW2ZpcnN0UGFnZT0oW1xcXFxzXFxcXFNdKj8pXFxcXF0pPyg/OihcXFxcLmpzOltcXFxcc1xcXFxTXSo/KSk/JC8uZXhlYyh1cmwpXFxuICAgIGlmIChwYWdlTnVtID09IDEgJiYgdXJsWzJdKSB1cmxbMV0gPSB1cmxbMl1cXG4gICAgaWYgKHVybFszXSAmJiAhdXJsWzFdLmluY2x1ZGVzKCcuanM6JykpIHVybFsxXSArPSB1cmxbM11cXG4gICAgcmV0dXJuIHJ1bkNvZGUodXJsWzFdKVxcbn1cXG5cXG5mdW5jdGlvbiBwYXJhbUhhbmRsZSh1cmxQYXJhbSwgdWEsIHVybFRtcCkge1xcbiAgICBsZXQgY2hhcnNldCwgcGFyYW1UbXBcXG4gICAgdHJ5IHsgLy8g6ZO+5o6l55qE57yW56CB44CBVUHlkoxSZWZlcmVy5bqU6K+l5piv6aaW5YWI57un5om/6aaW6aG16ZO+5o6lXFxuICAgICAgICBbLCAsIGNoYXJzZXQsIHBhcmFtVG1wXSA9IHVybFRtcC5zcGxpdCgnOycpXFxuICAgICAgICBwYXJhbVRtcCA9IHBhcmFtVG1wLm1hdGNoKC9eeyguKil9JC8pWzFdLnNwbGl0KCcmJicpXFxuICAgIH0gY2F0Y2ggKGUpIHsgcGFyYW1UbXAgPSBbXSB9XFxuICAgIGxldCBVc2VyQWdlbnQgPSBwYXJhbVRtcC5maW5kKCh2KSA9PiB2LnN0YXJ0c1dpdGgoJ1VzZXItQWdlbnRAJykpLFxcbiAgICAgICAgUmVmZXJlciA9IHBhcmFtVG1wLmZpbmQoKHYpID0+IHYuc3RhcnRzV2l0aCgnUmVmZXJlckAnKSlcXG4gICAgdXJsUGFyYW1bMF0gPSB1cmxQYXJhbVswXSB8fCAnR0VUJ1xcbiAgICB1cmxQYXJhbVsxXSA9IHVybFBhcmFtWzFdIHx8IGNoYXJzZXQgfHwgJ1VURi04J1xcbiAgICB0cnkge1xcbiAgICAgICAgdXJsUGFyYW1bMl0gPSB1cmxQYXJhbVsyXS5tYXRjaCgvXnsoLiopfSQvKVsxXS5zcGxpdCgnJiYnKVxcbiAgICB9IGNhdGNoIChlKSB7IHVybFBhcmFtWzJdID0gW10gfVxcbiAgICAvLyDmt7vliqDlhajlsYBVQeWSjOS4iue6p1JlZmVyZXJcXG4gICAgaWYgKCF1cmxQYXJhbVsyXS5zb21lKCh2KSA9PiB2LnN0YXJ0c1dpdGgoJ1VzZXItQWdlbnRAJykpKSB7XFxuICAgICAgICBpZiAoVXNlckFnZW50KSB1cmxQYXJhbVsyXS5wdXNoKFVzZXJBZ2VudClcXG4gICAgICAgIGVsc2UgaWYgKHVhID09ICdwYycpXFxuICAgICAgICAgICAgdXJsUGFyYW1bMl0ucHVzaCgnVXNlci1BZ2VudEAnICsgUENfVUEucmVwbGFjZSgvOy9nLCAn77yb77ybJykucmVwbGFjZSgvXFxcXD8vLCAn77yf77yfJykpXFxuICAgICAgICBlbHNlIGlmICh1YSA9PSAnbW9iaWxlJylcXG4gICAgICAgICAgICB1cmxQYXJhbVsyXS5wdXNoKCdVc2VyLUFnZW50QCcgKyBNT0JJTEVfVUEucmVwbGFjZSgvOy9nLCAn77yb77ybJykucmVwbGFjZSgvXFxcXD8vLCAn77yf77yfJykpXFxuICAgIH1cXG4gICAgaWYgKFJlZmVyZXIgJiYgIXVybFBhcmFtWzJdLnNvbWUoKHYpID0+IHYuc3RhcnRzV2l0aCgnUmVmZXJlckAnKSkpXFxuICAgICAgICB1cmxQYXJhbVsyXS5wdXNoKFJlZmVyZXIpXFxuICAgIHVybFBhcmFtWzJdID0gJ3snICsgdXJsUGFyYW1bMl0uam9pbignJiYnKSArICd9J1xcbiAgICByZXR1cm4gdXJsUGFyYW0uam9pbignOycpXFxufVxcbi8vIOmihOWkhOeQhuW5tuWIneWni+WMlmNvbmZpZ1xcbmZ1bmN0aW9uIHJ1blByZVJ1bGUocnVsZSkge1xcbiAgICBpZiAoKHR5cGVvZiBNWV9QQUdFICE9ICd1bmRlZmluZWQnICYmICBNWV9QQUdFID09IDEpICYmXFxuICAgICAgICAgKGlzSW5kZXggfHwgIWdldE15VmFyKCckcHJlUnVsZV8nICsgTVlfUlVMRS50aXRsZSkpKSB7XFxuICAgICAgICBldmFsKHJ1bGUpXFxuICAgICAgICBwdXRNeVZhcignJHByZVJ1bGVfJyArIE1ZX1JVTEUudGl0bGUsICdUJylcXG4gICAgfVxcbiAgICBsZXQgX2NmZyA9IGdldE15VmFyKCdpbml0Q29uZmlnJywgJ3t9JylcXG4gICAgaWYgKF9jZmcgJiYgX2NmZy5sZW5ndGggPiAwKSB7XFxuICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKF9jZmcpXFxuICAgIH1cXG59XFxuLy8g5q2j5paH6Kej5p6Q6YCa55So5Y+Y6YePXFxuZnVuY3Rpb24gZ2VuTXlSdWxlKCkge1xcbiAgICBsZXQgUlVMRSA9IE9iamVjdC5hc3NpZ24oe30sIE1ZX1JVTEUpXFxuICAgIGRlbGV0ZSBSVUxFLmxhc3RfY2hhcHRlcl9ydWxlXFxuICAgIGRlbGV0ZSBSVUxFLnByZVJ1bGVcXG4gICAgZGVsZXRlIFJVTEUucGFnZUxpc3RcXG4gICAgZGVsZXRlIFJVTEUucGFnZXNcXG4gICAgcmV0dXJuIFJVTEVcXG59XFxuXFxuZnVuY3Rpb24gZ2VuRXhVcmwodXJsKSB7XFxuICAgIHVybCA9IHVybC5zcGxpdCgnOycpXFxuICAgIHJldHVybiB1cmwuc2hpZnQoKSArICc7JyArIHBhcmFtSGFuZGxlKHVybCwgTVlfUlVMRS51YSwgTVlfUlVMRS51cmwpXFxufVxcblxcbmhpamFja0xhenlSdWxlID0gJC50b1N0cmluZygoUUlOR19USVRMRSwgTVlfUEFSQU1TKSA9PiB7XFxuICAgIGlmICghTVlfUlVMRSkgTVlfUlVMRSA9IHt9XFxuICAgIE1ZX1BBUkFNUyA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKE1ZX1BBUkFNUykpXFxuICAgIGV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL2hpamFja0Vudj9ydWxlPScgKyBRSU5HX1RJVExFKSkucnVsZSlcXG4gICAgdmFyIHtcXG4gICAgICAgIHBhcmFtSGFuZGxlLFxcbiAgICAgICAgZ2VuRXhVcmwsXFxuICAgICAgICBoaWphY2tMYXp5UnVsZSxcXG4gICAgICAgIGhpamFja0VsXFxuICAgIH0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9mdW5jVG9vbHM/cnVsZT0nICsgUUlOR19USVRMRSlcXG59LCBRSU5HX1RJVExFLCBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoeyB1cmw6IE1ZX1JVTEUudXJsLCBSVUxFOiBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoZ2VuTXlSdWxlKCkpKSwgaXNJbmRleDogaXNJbmRleCB9KSkpXFxuXFxuZnVuY3Rpb24gaGlqYWNrRWwoZWwpIHtcXG4gICAgaWYoIWVsIHx8IHR5cGVvZiBlbCAhPSAnb2JqZWN0JykgcmV0dXJuXFxuICAgIGlmICghZWwuZXh0cmEpIGVsLmV4dHJhID0ge31cXG4gICAgZWwuY29sX3R5cGUgPSBlbC5jb2xfdHlwZSB8fCBNWV9SVUxFLmNvbF90eXBlXFxuICAgIGxldCBOT1dfUlVMRSA9IE9iamVjdC5hc3NpZ24oZ2VuTXlSdWxlKCksIHsgcGFyYW1zOiBlbC5leHRyYSB9KVxcblxcbiAgICBpZiAodHlwZW9mIGVsLnVybCAhPSAnc3RyaW5nJyB8fFxcbiAgICAgICAgWyd4NV93ZWJ2aWV3X3NpbmdsZScsICdpbnB1dCddLnNvbWUoKHYpID0+IGVsLmNvbF90eXBlID09IHYpIHx8XFxuICAgICAgICBbJ+a1t+mYlOinhueVjCcsICdqYXZhc2NyaXB0OiddLnNvbWUoKHYpID0+IGVsLnVybC5zdGFydHNXaXRoKHYpKSB8fFxcbiAgICAgICAgWydydWxlJywgJ3BpY3MnLCAndG9hc3QnLCAnY29weScsICdlZGl0RmlsZScsICd4NScsICd4NVdlYlZpZXcnLCAneDVQbGF5JywgJ3dlYicsICd4NVJ1bGUnLCAnd2ViUnVsZScsXFxuICAgICAgICAgICAgJ2Rvd25sb2FkJywgJ3NoYXJlJywgJ2ZpbGVTZWxlY3QnLCAndmlkZW8nXS5zb21lKCh2KSA9PiBlbC51cmwuc3RhcnRzV2l0aCh2ICsgJzovLycpKSkge1xcbiAgICAgICAgcmV0dXJuIGVsXFxuICAgIH0gZWxzZSBpZiAoZWwudXJsLnN0YXJ0c1dpdGgoJ2lucHV0Oi8vJykpIHtcXG4gICAgICAgIGxldCBwYXJhID0gSlNPTi5wYXJzZShlbC51cmwuc2xpY2UoOCkpXFxuICAgICAgICBpZiAocGFyYS5qcykgcGFyYS5qcyA9IGhpamFja0xhenlSdWxlICsgJzsnICsgcGFyYS5qc1xcbiAgICAgICAgZWwudXJsID0gJ2lucHV0Oi8vJyArIEpTT04uc3RyaW5naWZ5KHBhcmEpXFxuICAgICAgICByZXR1cm4gZWxcXG4gICAgfSBlbHNlIGlmIChlbC51cmwuc3RhcnRzV2l0aCgnY29uZmlybTovLycpKSB7XFxuICAgICAgICBsZXQgcmVJbmRleCA9IGVsLnVybC5pbmRleE9mKCcuanM6JylcXG4gICAgICAgIGlmIChyZUluZGV4ID49IDApIGVsLnVybCA9IGVsLnVybC5zbGljZSgwLCByZUluZGV4KSArICcuanM6JyArIGhpamFja0xhenlSdWxlICsgJzsnICsgZWwudXJsLnNsaWNlKHJlSW5kZXggKyA0KVxcbiAgICAgICAgcmV0dXJuIGVsXFxuICAgIH0gZWxzZSBpZiAoZWwudXJsLnN0YXJ0c1dpdGgoJ3NlbGVjdDovLycpKSB7XFxuICAgICAgICBsZXQgcGFyYSA9IEpTT04ucGFyc2UoZWwudXJsLnNsaWNlKDkpKVxcbiAgICAgICAgaWYgKHBhcmEuanMpIHBhcmEuanMgPSBoaWphY2tMYXp5UnVsZSArICc7JyArIHBhcmEuanNcXG4gICAgICAgIGVsLnVybCA9ICdzZWxlY3Q6Ly8nICsgSlNPTi5zdHJpbmdpZnkocGFyYSlcXG4gICAgICAgIHJldHVybiBlbFxcbiAgICB9IGVsc2UgaWYgKGVsLnVybC5pbmNsdWRlcygnQHJ1bGU9JykpIHtcXG4gICAgICAgIGxldCBbXywgdXJsLCBydWxlXSA9IGVsLnVybC5tYXRjaCgvXihbXFxcXHNcXFxcU10qPylAcnVsZT0oW1xcXFxzXFxcXFNdKikkLylcXG4gICAgICAgIGVsLnVybCA9IHVybFxcbiAgICAgICAgTk9XX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSA9IHJ1bGVcXG4gICAgICAgIE5PV19SVUxFLmRldGFpbF9jb2xfdHlwZSA9IE1ZX1JVTEUuY29sX3R5cGVcXG4gICAgfSBlbHNlIGlmIChlbC51cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly9wYWdlLycpKSB7XFxuICAgICAgICBpZiAoZWwudXJsLmluY2x1ZGVzKCdydWxlPScpIHx8IGVsLmV4dHJhLnJ1bGUpXFxuICAgICAgICAgICAgcmV0dXJuIGVsXFxuICAgICAgICBsZXQgW18sIHBhdGgsIGZsYWcsIHBhcmFtc10gPSBlbC51cmwubWF0Y2goL15oaWtlcjpcXFxcL1xcXFwvcGFnZVxcXFwvKC4rPykoIy4qPyk/KD86XFxcXD8oLiopKT8kLyksXFxuICAgICAgICAgICAgc3ViUGFnZSA9IE1ZX1JVTEUucGFnZUxpc3QuZmluZCgodikgPT4gdi5wYXRoID09IHBhdGgpLFxcbiAgICAgICAgICAgIHN1YlVybCA9IChwYXJhbXMgfHwgJycpLnNwbGl0KCcmJykuZmluZCgodikgPT4gdi5zdGFydHNXaXRoKCd1cmw9JykpXFxuICAgICAgICBlbC51cmwgPSAoc3ViVXJsID8gc3ViVXJsLnNsaWNlKDQpLnJlcGxhY2UoL++8n++8ny9nLCAnPycpLnJlcGxhY2UoL++8hu+8hi9nLCAnJicpIDogKGVsLmV4dHJhIHx8IHt9KS51cmwpIHx8ICdoaWtlcjovL2VtcHR5JyArIGZsYWcgKyAnPycgKyAocGFyYW1zIHx8ICcnKVxcbiAgICAgICAgTk9XX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSA9IHN1YlBhZ2UucnVsZVxcbiAgICAgICAgTk9XX1JVTEUuZGV0YWlsX2NvbF90eXBlID0gc3ViUGFnZS5jb2xfdHlwZVxcbiAgICB9IGVsc2UgaWYgKGVsLnVybC5pbmNsdWRlcygnQGxhenlSdWxlPScpKSB7XFxuICAgICAgICBsZXQgcmVJbmRleCA9IGVsLnVybC5pbmRleE9mKCcuanM6JylcXG4gICAgICAgIGlmIChyZUluZGV4ID49IDApIGVsLnVybCA9IGVsLnVybC5zbGljZSgwLCByZUluZGV4KSArICcuanM6JyArIGhpamFja0xhenlSdWxlICsgJzsnICsgZWwudXJsLnNsaWNlKHJlSW5kZXggKyA0KVxcbiAgICAgICAgcmV0dXJuIGVsXFxuICAgIH0gZWxzZSBpZiAoaXNJbmRleCkge1xcbiAgICAgICAgaWYgKCFNWV9SVUxFLmRldGFpbF9maW5kX3J1bGUgfHwgL2hpa2VyOlxcXFwvXFxcXC8oPyFlbXB0eS4rJCkvLnRlc3QoZWwudXJsKSkgcmV0dXJuIGVsXFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gZWxcXG4gICAgfVxcbiAgICBlbC5leHRyYSA9IE9iamVjdC5hc3NpZ24oe30sIGVsLmV4dHJhLCB7XFxuICAgICAgICB1cmw6IGdlbkV4VXJsKGVsLnVybCksXFxuICAgICAgICBSVUxFOiBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoTk9XX1JVTEUpKSxcXG4gICAgICAgIHBhZ2VUaXRsZTogaXNJbmRleCAmJiBlbC50aXRsZVxcbiAgICB9KVxcbiAgICBlbC51cmwgPSAnaGlrZXI6Ly9wYWdlL2ZyYW1lTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFXFxuICAgIHJldHVybiBlbFxcbn1cXG4kLmV4cG9ydHMgPSB7XFxuICAgIHJ1bkNvZGU6IHJ1bkNvZGUsXFxuICAgIGluZGV4VXJsOiBpbmRleFVybCxcXG4gICAgcGFyYW1IYW5kbGU6IHBhcmFtSGFuZGxlLFxcbiAgICBydW5QcmVSdWxlOiBydW5QcmVSdWxlLFxcbiAgICBnZW5NeVJ1bGU6IGdlbk15UnVsZSxcXG4gICAgZ2VuRXhVcmw6IGdlbkV4VXJsLFxcbiAgICBoaWphY2tMYXp5UnVsZTogaGlqYWNrTGF6eVJ1bGUsXFxuICAgIGhpamFja0VsOiBoaWphY2tFbFxcbn1cXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIua8q+eUu+ino+aekCpcIixcInBhdGhcIjpcImpzXCIsXCJydWxlXCI6XCJmdW5jdGlvbiDniLHnsbPmjqjnsbsoaW5wdXQpIHtcXG5cXHR0cnl7XFxuICAgICAgICB2YXIgdXJsID0gaW5wdXRcXG4gICAgICAgIC5yZXBsYWNlKCdtLid8fCdtaC4nfHwnd2FwLicsICd3d3cuJylcXG4gICAgICAgIC5yZXBsYWNlKCdpa3IuJywgJ2ljZWtyLicpO1xcbiAgICAgICAgdmFyIGh0bWwgPSByZXF1ZXN0KHVybCwge1xcbiAgICBoZWFkZXJzOiB7XFxuICAgICAgICAnVXNlci1BZ2VudCc6IFBDX1VBLFxcbiAgICAgICAgJ1JlZmVyZXInOiB1cmxcXG4gICAgfVxcbn0pXFxuICAgIGV2YWwocGRmaChwZGZhKGh0bWwsICdib2R5JiZzY3JpcHQ6bm90KFtzcmNdKTpub3QoW3R5cGVdKScpWzBdLCAnc2NyaXB0JiZIdG1sJykpO1xcbiAgICB2YXIgcGljcyA9IFtdO1xcbiAgICBpZiAoY2hhcHRlckltYWdlcy5sZW5ndGggPiAwKSB7XFxuICAgICAgICB2YXIgaG9zdCA9IHJlcXVlc3QoaW5wdXQpLm1hdGNoKC9pbWcgc3JjPVxcXCIoLio/KVxcXFwvaW1hZ2UvKVsxXTtcXG4gICAgICAgIGNoYXB0ZXJJbWFnZXMuZm9yRWFjaChpbWcgPT4ge1xcbiAgICAgICAgICAgIGlmIChpbWcuaW5kZXhPZihcXFwiaHR0cFxcXCIpID4gLTEpIHtcXG4gICAgICAgICAgICBwaWNzLnB1c2goaW1nICsgJ0BSZWZlcmVyPScgKyB1cmwpXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBwaWNzLnB1c2goaG9zdCArIGltZyArICdAUmVmZXJlcj0nICsgdXJsKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgIH0gZWxzZSB7XFxuICAgICAgICB2YXIgaHRtbCA9IHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgdmFyIHBpY3MgPSBbXTtcXG4gICAgICAgIGlmKC9rX3RvdGFsLy50ZXN0KGh0bWwpKXtcXG4gICAgICAgICAgICB2YXIgUGFnZSA9IHBkZmgoaHRtbCwgJyNrX3RvdGFsJiZUZXh0Jyk7XFxuICAgICAgICAgICAgaWYoUGFnZS5sZW5ndGggPiAwKXtcXG4gICAgICAgICAgICAgICAgdmFyIGhvc3QgPSBodG1sLm1hdGNoKC9taXAtaW1nIHNyYz1cXFwiKC4qPylpbWFnZS8pWzFdO1xcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgUGFnZTsgaSsrKSB7XFxuICAgICAgICBwaWNzLnB1c2goaG9zdCArICdpbWFnZS92aWV3LycgKyBpbnB1dC5tYXRjaCgvXFxcXGQrLylbMF0gKyAnLycgKyBpICsgJy53ZWJwJysgJ0BSZWZlcmVyPScpXFxuICAgICAgICAgICAgfVxcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgdmFyIHJlczEgPSB7fTtcXG4gICAgICAgIHZhciBkMSA9IFtdO1xcbiAgICAgICAgdmFyIGpzSHRtbCA9IGZldGNoKGlucHV0LCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICBcXFwiY29udGVudC10eXBlXFxcIjogXFxcIlVURi04XFxcIixcXG4gICAgICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiTW9iaWxlXFxcIlxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgbWV0aG9kOiBcXFwiR0VUXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICB2YXIgcGljcyA9IFtdO1xcbiAgICAgICAgZm9yICh2YXIgayA9IDE7OyBrKyspIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICB2YXIganNIdG1sID0gZmV0Y2goaW5wdXQuc3BsaXQoXFxcIi5odG1sXFxcIilbMF0gKyBcXFwiLVxcXCIgKyBrICsgXFxcIi5odG1sXFxcIiwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJjb250ZW50LXR5cGVcXFwiOiBcXFwiVVRGLThcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogXFxcIk1vYmlsZVxcXCJcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFxcXCJHRVRcXFwiXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBsZXQgcGFnZSA9IHBkZmgoanNIdG1sLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgICAgIGlmIChwYWdlICYmIHBhZ2UuaW5jbHVkZXMoXFxcIi9cXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgcGFnZSA9IHBhcnNlSW50KHBhZ2Uuc3BsaXQoXFxcIi9cXFwiKVsxXSk7XFxuICAgICAgICAgICAgICAgICAgICB2YXIganNVcmwgPSBwYXJzZURvbUZvckh0bWwoanNIdG1sLCBcXFwiLmVyUGFnJiZtaXAtaW1nfHxpbWcmJnNyY1xcXCIpKyAnQFJlZmVyZXI9JztcXG4gICAgICAgICAgICAgICAgICAgIGlmIChqc1VybC5pbmRleE9mKFxcXCJwbmdcXFwiKSA+IC0xKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmxzID0gW107XFxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMjsgaSA8PSBwYWdlOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmxzLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGlucHV0LnNwbGl0KFxcXCIuaHRtbFxcXCIpWzBdICsgXFxcIi1cXFwiICsgaSArIFxcXCIuaHRtbFxcXCIsXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiY29udGVudC10eXBlXFxcIjogXFxcIlVURi04XFxcIixcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiVXNlci1BZ2VudFxcXCI6IFxcXCJNb2JpbGVcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBcXFwiR0VUXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGxldCBodG1scyA9IGJmKHVybHMpO1xcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBodG1scy5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBqc1VybCA9IHBhcnNlRG9tRm9ySHRtbChodG1sc1tpXSwgXFxcIi5lclBhZyYmbWlwLWltZ3x8aW1nJiZzcmNcXFwiKSsgJ0BSZWZlcmVyPSc7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpzVXJsLmluZGV4T2YoXFxcInBuZ1xcXCIpID4gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBwaWNzLnB1c2goanNVcmwpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHZhciBqc1VybCA9IHBhcnNlRG9tRm9ySHRtbChqc0h0bWwsIFxcXCIuZXJQYWcmJm1pcC1pbWd8fGltZyYmc3JjXFxcIikrICdAUmVmZXJlcj0nO1xcbiAgICAgICAgICAgICAgICBpZiAoanNVcmwuaW5kZXhPZihcXFwicG5nXFxcIikgPiAtMSkge1xcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHBpY3MucHVzaChqc1VybCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIGJyZWFrXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHZhciBsaXN0ID0gcGRmYShodG1sLCAnYm9keSYmLnNjcm9sbC1pdGVtfHwuaW1hZ2UtY29udGVudHx8I3Njcm9sbC1pbWFnZScpO1xcbiAgICAgICAgdmFyIGZpcnN0ID0gcGRmYShodG1sLCAnYm9keSYmI2ltYWdlJyk7XFxuICAgICAgICBsaXN0ID0gZmlyc3QuY29uY2F0KGxpc3QpO1xcbiAgICAgICAgbGlzdC5mb3JFYWNoKGltZyA9PiB7XFxuICAgICAgICAgICAgcGljcy5wdXNoKHBkZmgoaW1nLCAnaW1nJiZkYXRhLXNyY3x8c3JjJykgKyAnQFJlZmVyZXI9JyArIGlucHV0KVxcbiAgICAgICAgfSlcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICB9IGNhdGNoKGUpIHtcXG4gICAgICAgIHZhciBodG1sID0gcmVxdWVzdChpbnB1dCk7XFxuICAgICAgICB2YXIgcGljcyA9IFtdO1xcbiAgICAgICAgdmFyIGxpc3QgPSBwZGZhKGh0bWwsICdib2R5JiYuc2Nyb2xsLWl0ZW18fC5pbWFnZS1jb250ZW50fHwjc2Nyb2xsLWltYWdlJyk7XFxuICAgICAgICB2YXIgZmlyc3QgPSBwZGZhKGh0bWwsICdib2R5JiYjaW1hZ2UnKTtcXG4gICAgICAgIGxpc3QgPSBmaXJzdC5jb25jYXQobGlzdCk7XFxuICAgICAgICBsaXN0LmZvckVhY2goaW1nID0+IHtcXG4gICAgICAgICAgICBwaWNzLnB1c2gocGRmaChpbWcsICdpbWcmJmRhdGEtc3JjfHxzcmMnKSArICdAUmVmZXJlcj0nICsgaW5wdXQpXFxuICAgICAgICB9KVxcbiAgICB9XFxuICAgIHJldHVybiBcXFwicGljczovL1xcXCIgKyBwaWNzLmpvaW4oXFxcIiYmXFxcIilcXG59XFxuJC5leHBvcnRzLmp4PeeIseexs+aOqOexuztcXG5cXG5mdW5jdGlvbiDljIXlrZAoaW5wdXQpIHtcXG4gICAgdmFyIGlkID0gdHJ1ZTtcXG4gICAgdmFyIGNvZGUgPSByZXF1ZXN0KGlucHV0KVxcbiAgICB2YXIgcGljcyA9IFtdO1xcbiAgICB2YXIgdG9fUmVwZWF0ID0gZmFsc2U7XFxuXFxuXFxuICAgIHdoaWxlIChpZCkge1xcbiAgICAgICAgcGRmYShjb2RlLCBcXFwiLmNoYXB0ZXItbWFpbiYmYW1wLWltZ1xcXCIpXFxuICAgICAgICAgICAgLmZvckVhY2goZGF0YSA9PiBwaWNzLnB1c2gocGRmaChkYXRhLCBcXFwiYW1wLWltZyYmc3JjXFxcIikgKyAnQFJlZmVyZXI9aHR0cHM6Ly93d3cud2VibW90YS5jb20vJykpO1xcbiAgICAgICAgdmFyIG5leHRfUGFnZSA9IHBkZmgoY29kZSwgXFxcIi5uZXh0X2NoYXB0ZXIsLTEmJkh0bWxcXFwiKVxcbiAgICAgICAgaWYgKG5leHRfUGFnZS5pbmNsdWRlcygn5LiL5LiA6aG1JykpIHtcXG4gICAgICAgICAgICBjb2RlID0gcmVxdWVzdChwZGZoKG5leHRfUGFnZSwgXFxcImEmJmhyZWZcXFwiKSlcXG4gICAgICAgICAgICB0b19SZXBlYXQgPSB0cnVlO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBpZCA9IGZhbHNlO1xcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuICAgIC8v5Y676Zmk6YeN5aSN5Zu+54mHXFxuICAgIGlmICh0b19SZXBlYXQpIHtcXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGljcy5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgICAgIHdoaWxlIChwaWNzLmluZGV4T2YocGljc1tpXSwgaSArIDEpICE9IC0xKSB7XFxuICAgICAgICAgICAgICAgIHBpY3Muc3BsaWNlKHBpY3MuaW5kZXhPZihwaWNzW2ldLCBpICsgMSksIDEpXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICB9XFxuXFxuICAgIHJldHVybiBcXFwicGljczovL1xcXCIgKyBwaWNzLmpvaW4oXFxcIiYmXFxcIik7XFxufVxcbiQuZXhwb3J0cy5iej3ljIXlrZA7XFxuXFxuZnVuY3Rpb24g5Y+k6aOOKGlucHV0KSB7XFxuXFx0dmFyIGh0bWwgPSBmZXRjaFBDKGlucHV0KTtcXG5cXHRldmFsKHBkZmgocGRmYShodG1sLCAnYm9keSYmc2NyaXB0Om5vdChbc3JjXSk6bm90KFt0eXBlXSknKVswXSwgJ3NjcmlwdCYmSHRtbCcpKTtcXG5cXHR2YXIgcGljcyA9IFtdO1xcblxcdGZvciAodmFyIGkgaW4gY2hhcHRlckltYWdlcykge1xcblxcdFxcdHBpY3MucHVzaCgnaHR0cHM6Ly9yZXMueGlhb3FpbnJlLmNvbS8nICsgY2hhcHRlclBhdGggKyBjaGFwdGVySW1hZ2VzW2ldICsgJ0BSZWZlcmVyPWh0dHBzOi8vd3d3LjEyM2dmLmNvbScpXFxuXFx0XFx0fVxcblxcdHJldHVybiBcXFwicGljczovL1xcXCIgKyBwaWNzLmpvaW4oXFxcIiYmXFxcIilcXG59XFxuJC5leHBvcnRzLkdGPeWPpOmjjjtcXG5cXG5mdW5jdGlvbiDniLHnsbMoaW5wdXQpIHtcXG4gICAgICAgIHZhciBodG1sID0gcmVxdWVzdChpbnB1dCk7XFxuICAgICAgICB2YXIgcGljcyA9IFtdO1xcbiAgICAgICAgdmFyIGxpc3QgPSBwZGZhKGh0bWwsICdib2R5JiYuc2Nyb2xsLWl0ZW18fC5pbWFnZS1jb250ZW50fHwjc2Nyb2xsLWltYWdlJyk7XFxuICAgICAgICB2YXIgZmlyc3QgPSBwZGZhKGh0bWwsICdib2R5JiYjaW1hZ2UnKTtcXG4gICAgICAgIGxpc3QgPSBmaXJzdC5jb25jYXQobGlzdCk7XFxuICAgICAgICBsaXN0LmZvckVhY2goaW1nID0+IHtcXG4gICAgICAgICAgICBwaWNzLnB1c2gocGRmaChpbWcsICdpbWcmJmRhdGEtc3JjfHxzcmMnKSArICdAUmVmZXJlcj0nICsgaW5wdXQpXFxuICAgICAgICB9KVxcbiAgICAgICAgcmV0dXJuIFxcXCJwaWNzOi8vXFxcIiArIHBpY3Muam9pbihcXFwiJiZcXFwiKVxcbn1cXG4kLmV4cG9ydHMuSU0954ix57GzO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5LqR5Y+j5LukKlwiLFwicGF0aFwiOlwiaW1wb3J0XCIsXCJydWxlXCI6XCJ3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvL3J1bGVzL1R6L0pNJyxmZXRjaChpbnB1dCkpXFxuJ3RvYXN0Oi8v5bey5LuO5LqR5Y+j5Luk6I635Y+W6ZiF5ryr5ZCb5rqQJ1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5pu05paw6K+m5oOFKlwiLFwicGF0aFwiOlwiVXBcIixcInJ1bGVcIjpcImpzOlxcbnZhciByZXMgPSB7fTtcXG52YXIgaXRlbXMgPSBbXTtcXG52YXIgaW1nID0gJ2h0dHBzOi8vYmluZy5pbWcucnVuLzEzNjZ4NzY4LnBocCc7XFxuaXRlbXMucHVzaCh7XFxuICAgIGltZzogaW1nLFxcbiAgICB1cmw6IGltZyArIFxcXCIjLmpwZ1xcXCIsXFxuICAgIGRlc2M6ICcwJyxcXG4gICAgY29sX3R5cGU6ICdjYXJkX3BpY18xJ1xcbn0pO1xcblxcbml0ZW1zLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxoND7jgJDpmIXmvKvlkJvlj43ppojmlLbpm4bjgJE8L2g0PlxcXCIgKyAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiBncmV5XFxcIj7lsI/lsI88L3NwYW4+JyxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL21hbmFnZVJ1bGUjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGx2ZXI6IE1ZX1BBUkFNUy52ZXJzaW9uIHx8IFxcXCLojrflj5bniYjmnKzlpLHotKXvvIzoh6rooYzmn6XnnItcXFwiLFxcbiAgICAgICAgaWQ6IFxcXCI2NzkxXFxcIlxcbiAgICB9XFxufSk7XFxuXFxuaWYgKGdldEl0ZW0oXFxcInJlYWRfcG9saWN5XFxcIikgIT09IFxcXCIxXFxcIikge1xcbiAgICBpdGVtcy5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPHNtYWxsPjxmb250IGNvbG9yPSM4NzFmNzg+5pys6KeE5YiZ5pWw5o2u5p2l5rqQ5LqO572R57uc77yM5aaC5oKo5Zac5qyi77yM6K+35pSv5oyB5a6Y5pa5PC9mb250Pjwvc21hbGw+JyxcXG4gICAgICAgIGRlc2M6ICfigJzigJzigJ3igJ08c21hbGw+PGZvbnQgY29sb3I9I2YyMGMwMD7mnKzop4TliJnku4XpmZDlhY3otLnlrabkuaDkuqTmtYHkvb/nlKjvvIzor7fkuo7lr7zlhaXlkI4yNOWwj+aXtuWGheWIoOmZpO+8jOS7u+S9lee7hOe7h+aIluS4quS6uuS4jeW+l+S7peS7u+S9leaWueW8j+aWueazleS8oOaSreaIluWUruWNluatpOinhOWImeeahOaVtOS9k+aIlumDqOWIhu+8gTwvZm9udD48L3NtYWxsPicsXFxuICAgICAgICB1cmw6ICQoJyNub0hpc3RvcnkjJykubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInJlYWRfcG9saWN5XFxcIiwgXFxcIjFcXFwiKVxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kvaDlt7LlkIzmhI/or6XljY/orq5cXFwiXFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMSdcXG4gICAgfSlcXG59XFxuXFxuaXRlbXMucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGI+5L2/55So6K+05piOPC9iPicsXFxuICAgIHVybDogXFxcIuWIh+aNouWIhue7hOaQnOe0ouWNs+WPr1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIlxcbn0pO1xcblxcbmxldCBuZXdWZXJzaW9uO1xcbmxldCBteVZlcnNpb24gPSBNWV9QQVJBTVMudmVyc2lvbjtcXG50cnkge1xcbiAgICBuZXdWZXJzaW9uID0gSlNPTi5wYXJzZShmZXRjaFBDKFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvZGV2L2dldGJ5aWQ/aWQ9Njc0OVxcXCIsIHtcXG4gICAgICAgIHRpbWVvdXQ6IDEwMDBcXG4gICAgfSkpLnJlc3VsdC52ZXI7XFxufSBjYXRjaCAoZSkge1xcbiAgICB0b2FzdChcXFwi6YGT6ZW/5LuT5bqT5oq96aOO5LqG77yM5pys5qyh5pyq5qOA5rWL5Yiw5paw54mI5L+h5oGvXFxcIik7XFxuICAgIG5ld1ZlcnNpb24gPSBteVZlcnNpb247XFxufVxcbmxldCBpc1VwZGF0ZSA9IE51bWJlcihuZXdWZXJzaW9uKSA+IE51bWJlcihteVZlcnNpb24pO1xcbmxldCBpc1ZlciA9IE51bWJlcihuZXdWZXJzaW9uKSA9PT0gTnVtYmVyKG15VmVyc2lvbik7XFxuaWYgKGlzVXBkYXRlKSB7XFxuICAgIGxvZygn5pyJ5paw54mI5pysOicgKyBuZXdWZXJzaW9uICsgJyzlvZPliY06JyArIG15VmVyc2lvbik7XFxufVxcbml0ZW1zLnB1c2goe1xcbiAgICB0aXRsZTogaXNVcGRhdGUgPyBcXFwi8J+GmeaWsOeJiOacrFxcXCIgOiBcXFwi6KeE5YiZ5Y+R5biD6aG1JuWPjemmiFxcXCIsXFxuICAgIHVybDogaXNVcGRhdGUgPyBcXFwicnVsZTovLzVyVzM2WmlVNktlRzU1V002YWFXNmFHMTZhS1I2WUdUNktlRTVZaVo0NENRNklHYTVyeXI4SitVcnVPQWtlKy9wV2h2YldWZmNuVnNaVjkxY216dnY2Vm9kSFJ3T2k4dmFHbHJaWEl1Ym05cmFXRXVjSEpsYzNNdmFHbHJaWEoxYkdVdmNuVnNaV3hwYzNRdWFuTnZiajlwWkQweU9EUTNcXFwiIDogXFxcImhpa2VyOi8vcGFnZS9tYW5hZ2VSdWxlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5Iz9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8yXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGx2ZXI6IE1ZX1BBUkFNUy52ZXJzaW9uIHx8IFxcXCLojrflj5bniYjmnKzlpLHotKXvvIzoh6rooYzmn6XnnItcXFwiLFxcbiAgICAgICAgaWQ6IFxcXCI2NzkxXFxcIlxcbiAgICB9XFxufSk7XFxuY29uc3QgQ29sb3IgPSBcXFwiIzE5Qjg5RFxcXCI7XFxudmFyIGRlc19kZXNjID0gXFxuJzxoMSBzdHlsZT1cXFwidGV4dC1hbGlnbjogY2VudGVyO1xcXCI+8J+QvuabtOaWsFsyMDI0MDYwMl08L2gxPicgK1xcbiAgICAnPDxibG9ja3F1b3RlPjxmb250IGNvbG9yPVxcXCJyZWRcXFwiPuKRoOWJlOmZpOWkseaViOa6kO+8jOa8q+ibmS/mi7fotJ3lm73lhoUv5YiG57G7L+aQnOe0ouS/ruWkjTwvYnI+PC88YmxvY2txdW90ZT4nICtcXG5cXG4nPGgxIHN0eWxlPVxcXCJ0ZXh0LWFsaWduOiBjZW50ZXI7XFxcIj7wn5C+5pu05pawWzExMDVdPC9oMT4nICtcXG4gICAgJzw8YmxvY2txdW90ZT48Zm9udCBjb2xvcj1cXFwicmVkXFxcIj7ikaDmm7TmjaLov5znqIvku5PlupPvvIzkvJjljJbliqDovb3pgJ/luqYg5bm25aKe5Yqg5pu05paw6ZW/5oyJ6KeE5YiZ5ZCNIOa4hemZpOe8k+WtmOWNs+WPrzwvYnI+4pGh5L+u5aSN5ryr6JuZ5Zu+5rqQ5Yqg6L295LiN5Ye65p2lPGJyPjwvPGJsb2NrcXVvdGU+JyArXFxuXFxuJzxoMSBzdHlsZT1cXFwidGV4dC1hbGlnbjogY2VudGVyO1xcXCI+8J+QvuabtOaWsFsyMzEwMjNdPC9oMT4nICtcXG4gICAgJzw8YmxvY2txdW90ZT48Zm9udCBjb2xvcj1cXFwicmVkXFxcIj7ikaDlop7liqDmvKvnpZ4v6YeO6Juu5ryr55S7PC9icj48YnI+4pGh5LyY5YyW6ZiF5ryr5ZCb5pys5L2T77yM5LiO5pen6KeE5YiZ5LiN5YW85a6577yM6ZyA5Yig6Zmk5pu05paw6KeE5YiZ5pys5ZywPC9icj48YnI+4pGi5YmU6Zmk5peg55So5rqQ77yM5L+u5aSN6YOo5YiG5rqQ5oql6ZSZPC9icj48LzxibG9ja3F1b3RlPidcXG5cXG5pdGVtcy5wdXNoKHtcXG4gICAgdGl0bGU6ICfmm7TmlrDor6bmg4UgPHNtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT1cXFwiY29sb3I6IzE5Qjg5RFxcXCI+5bGV5byAPjwvc3Bhbj48L3NtYWxsPjwvc21hbGw+JyxcXG4gICAgaW1nOiBcXFwiaHR0cHM6Ly9sYW5tZWlndW9qaWFuZy5jb20vdHViaWFvL21vcmUvMTk3LnBuZ1xcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoamppZCwgZGVjaWQsIGRlc19kZXNjKSA9PiB7XFxuICAgICAgICBpZiAoZ2V0TXlWYXIoXFxcImpqc1xcXCIsIFxcXCLmlLbotbdcXFwiKSA9PSBcXFwi5pS26LW3XFxcIikge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJqanNcXFwiLCBcXFwi5bGV5byAXFxcIik7XFxuXFxuICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogamppZFxcbiAgICAgICAgICAgICAgICB9LFxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+abtOaWsOivpuaDhSA8c21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjojMTlCODlEXFxcIj7mlLbotbc+PC9zcGFuPjwvc21hbGw+PC9zbWFsbD4nXFxuICAgICAgICAgICAgfSlcXG5cXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIHRleHRTaXplOiAxNCxcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiAzLFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGRlY2lkXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiM4MDgwODBcXFwiPicgKyBkZXNfZGVzYyArICc8L3NwYW4+J1xcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwiampzXFxcIiwgXFxcIuaUtui1t1xcXCIpO1xcblxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGpqaWRcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfmm7TmlrDor6bmg4U8c21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPVxcXCJjb2xvcjojMTlCODlEXFxcIj7lsZXlvIA+PC9zcGFuPjwvc21hbGw+PC9zbWFsbD4nXFxuICAgICAgICAgICAgfSlcXG5cXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIHRleHRTaXplOiAxNCxcXG4gICAgICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiAzLFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGRlY2lkXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiM4MDgwODBcXFwiPicgKyBkZXNfZGVzYy5zdWJzdHIoMCwgMTUwKVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgfVxcblxcbiAgICB9LCBNWV9SVUxFICsgXFxcIl9qamlkXFxcIiwgTVlfUlVMRSArIFxcXCJfZGVjaWRcXFwiLCBkZXNfZGVzYyksXFxuICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGlkOiBNWV9SVUxFICsgXFxcIl9qamlkXFxcIlxcbiAgICB9XFxufSk7XFxuXFxuaXRlbXMucHVzaCh7XFxuICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcImNvbG9yOiM4MDgwODBcXFwiPicgKyBkZXNfZGVzYy5zdWJzdHIoMCwgMTUwKSxcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGV4dFNpemU6IDE0LFxcbiAgICAgICAgbGluZVNwYWNpbmc6IDMsXFxuICAgICAgICBpZDogTVlfUlVMRSArIFxcXCJfZGVjaWRcXFwiXFxuICAgIH1cXG59KTtcXG5cXG5yZXMuZGF0YSA9IGl0ZW1zO1xcbnNldEhvbWVSZXN1bHQocmVzKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuS9v+eUqOW4ruWKqSpcIixcInBhdGhcIjpcIkhlbHBcIixcInJ1bGVcIjpcImpzOlxcbnZhciByZXMgPSB7fTtcXG52YXIgaXRlbXMgPSBbXTtcXG5cXG5pdGVtcy5wdXNoKHtcXG4gICAgdGl0bGU6J+S6jOe6p+mhtemdouagh+mimOWPjOWHu+S8mOWMlu+8jOWcqOmhtumDqOWImeWPjOWHu+WIsOW6lemDqO+8jOWQpuWImeWPjOWHu+WbnumhtumDqCcsXFxuICAgIGNvbF90eXBlOiAncmljaF90ZXh0J1xcbn0pO1xcblxcbml0ZW1zLnB1c2goe1xcbiAgICBpbWc6ICdodHRwczovL3MxLmF4MXguY29tLzIwMjIvMTEvMDQveExoZ29SLmpwZycsXFxuICAgIGRlc2M6ICcwJyxcXG4gICAgY29sX3R5cGU6ICdwaWNfMV9mdWxsJ1xcbn0pO1xcblxcbml0ZW1zLnB1c2goe1xcbiAgICBpbWc6ICdodHRwczovL3MxLmF4MXguY29tLzIwMjIvMTEvMDQveExoY3c5LmpwZycsXFxuICAgIGRlc2M6ICcwJyxcXG4gICAgY29sX3R5cGU6ICdwaWNfMV9mdWxsJ1xcbn0pO1xcblxcbnJlcy5kYXRhID0gaXRlbXM7XFxuc2V0SG9tZVJlc3VsdChyZXMpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5pCc57SiKlwiLFwicGF0aFwiOlwic2VhcmNoXCIsXCJydWxlXCI6XCJmdW5jdGlvbiBjb252ZXJ0MShzdHIpIHtcXG4gICAgbGV0IGMgPSBzdHIuc3BsaXQoXFxcIjtcXFwiKVxcbiAgICByZXR1cm4ge1xcbiAgICAgICAg5YiX6KGoOiBjWzBdLFxcbiAgICAgICAg5qCH6aKYOiBjWzFdLFxcbiAgICAgICAg6ZO+5o6lOiBjWzJdLFxcbiAgICAgICAg5o+P6L+wOiBjWzNdLFxcbiAgICAgICAg6K+m5oOFOiBjWzRdLFxcbiAgICAgICAg5Zu+54mHOiBjWzVdXFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gbWVyZ2Uoc291cmNlLCB0YXJnZXQpIHtcXG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpXFxuICAgIGZvciAobGV0IGkgaW4ga2V5cykge1xcbiAgICAgICAgdGFyZ2V0W2tleXNbaV1dID0gc291cmNlW2tleXNbaV1dXFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24g5pCc57SiKG9iaikge1xcbiAgICB2YXIgZCA9IFtdO1xcbiAgICBpZiAoJC50eXBlKG9iaikgPT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgICAgIG9iaiA9IGNvbnZlcnQxKG9iailcXG4gICAgfVxcbiAgICBpZiAob2JqLuinhOWImSkge1xcbiAgICAgICAgbGV0IGMgPSBjb252ZXJ0MShvYmou6KeE5YiZKVxcbiAgICAgICAgbWVyZ2UoYywgb2JqKVxcbiAgICB9XFxuICAgIGxldCBhcnIgPSBwZGZhKGdldFJlc0NvZGUoKSwgb2JqLuWIl+ihqCk7XFxuICAgICAgIGlmIChvYmou5YiX6KGo5aSE55CGICE9IG51bGwpIHtcXG4gICAgICAgICAgICBhcnIgPSBvYmou6ZO+5o6l5aSE55CGKGFycilcXG4gICAgICAgIH1cXG4gICAgZm9yIChsZXQgaXQgb2YgYXJyKSB7XFxuICAgICAgICBsZXQgdXJsID0gcGQoaXQsIG9iai7pk77mjqUpXFxuICAgICAgICBpZiAob2JqLumTvuaOpeWkhOeQhiAhPSBudWxsKSB7XFxuICAgICAgICAgICAgdXJsID0gb2JqLumTvuaOpeWkhOeQhih1cmwpXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgdGl0bGUgPSBwZGZoKGl0LCBvYmou5qCH6aKYKVxcbiAgICAgICAgaWYgKG9iai7moIfpopjlpITnkIYgIT0gbnVsbCkge1xcbiAgICAgICAgICAgIHRpdGxlID0gb2JqLuagh+mimOWkhOeQhih0aXRsZSlcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBwaWMgPSBwZChpdCwgb2JqLuWbvueJhylcXG4gICAgICAgIGlmIChvYmou5Zu+54mH5aSE55CGICE9IG51bGwpIHtcXG4gICAgICAgICAgICBwaWMgPSBvYmou5Zu+54mH5aSE55CGKHBpYylcXG4gICAgICAgIH1cXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IG9iai7moIfpopggPyBwZGZoKGl0LCBvYmou5qCH6aKYKSA6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIHVybDogdXJsKycjYXV0b0NhY2hlIycsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIGRlc2M6IG9iai7mj4/ov7AgPyBwZGZoKGl0LCBvYmou5o+P6L+wKSA6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIGNvbnRlbnQ6IG9iai7or6bmg4UgPyBwZGZoKGl0LCBvYmou6K+m5oOFKSA6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIHBpY191cmw6IHBpYyxcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICB5dGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgICB5cGljOiBwaWMsXFxuICAgICAgICAgICAgICAgIHl1cmw6IHVybC5yZXBsYWNlKCdoaWtlcjovL2VtcHR5IyMnLCcnKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcblxcbiAgICB9XFxuICAgIHNldFJlc3VsdChkKTtcXG59XFxudmFyIHRvb2wgPSB7XFxuICAgIOaQnOe0ojog5pCc57SiXFxufVxcbiQuZXhwb3J0cyA9IHRvb2xcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWbvueJh+ino+WvhipcIixcInBhdGhcIjpcImltZ0RFU1wiLFwicnVsZVwiOlwiJC5leHBvcnRzLmltZ0RlY3J5cHQgPSBmdW5jdGlvbigpIHtcXG4gICAgdmFyIGphdmFJbXBvcnQgPSBuZXcgSmF2YUltcG9ydGVyKCk7XFxuICAgIGphdmFJbXBvcnQuaW1wb3J0UGFja2FnZShcXG4gICAgICAgIFBhY2thZ2VzLmNvbS5leGFtcGxlLmhpa2Vydmlldy51dGlscyxcXG4gICAgICAgIFBhY2thZ2VzLmphdmEubGFuZyxcXG4gICAgICAgIFBhY2thZ2VzLmphdmEuc2VjdXJpdHksXFxuICAgICAgICBQYWNrYWdlcy5qYXZhLnV0aWwsXFxuICAgICAgICBQYWNrYWdlcy5qYXZhLmlvLFxcbiAgICAgICAgUGFja2FnZXMuamF2YS50ZXh0LFxcbiAgICAgICAgUGFja2FnZXMuamF2YXguY3J5cHRvLFxcbiAgICAgICAgUGFja2FnZXMuamF2YXguY3J5cHRvLnNwZWNcXG4gICAgKTtcXG4gICAgd2l0aChqYXZhSW1wb3J0KSB7XFxuICAgICAgICBsZXQgYnl0ZXMgPSBGaWxlVXRpbC50b0J5dGVzKGlucHV0KTtcXG4gICAgICAgIGZ1bmN0aW9uIGRlY3J5cHREYXRhKGJBcnIpIHtcXG4gICAgICAgICAgICB2YXIgZ2VuZXJhdGVTZWNyZXQgPSBTZWNyZXRLZXlGYWN0b3J5LmdldEluc3RhbmNlKFxcXCJkZXNlZGVcXFwiKS5nZW5lcmF0ZVNlY3JldChuZXcgREVTZWRlS2V5U3BlYyhTdHJpbmcoJ09XODRVOEVlcmRiOTlydHNUWFdTSUxETycpLmdldEJ5dGVzKCkpKTtcXG4gICAgICAgICAgICB2YXIgY2lwaGVyID0gQ2lwaGVyLmdldEluc3RhbmNlKFxcXCJkZXNlZGUvQ0JDL1BLQ1M1UGFkZGluZ1xcXCIpO1xcbiAgICAgICAgICAgIGNpcGhlci5pbml0KDIsIGdlbmVyYXRlU2VjcmV0LCBuZXcgSXZQYXJhbWV0ZXJTcGVjKFN0cmluZygnU0s4Ym5jVnUnKS5nZXRCeXRlcygpKSk7XFxuICAgICAgICAgICAgcmV0dXJuIGNpcGhlci5kb0ZpbmFsKGJBcnIpO1xcbiAgICAgICAgfVxcbiAgICAgICAgLy9kZWNyeXB0RGF0YeS4uuino+WvhuaWueazlVxcbiAgICAgICAgYnl0ZXMgPSBkZWNyeXB0RGF0YShieXRlcyk7XFxuICAgICAgICByZXR1cm4gRmlsZVV0aWwudG9JbnB1dFN0cmVhbShieXRlcyk7XFxuICAgIH1cXG5cXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJERVMqXCIsXCJwYXRoXCI6XCJkZXNcIixcInJ1bGVcIjpcInZhciBqYXZhSW1wb3J0ID0gbmV3IEphdmFJbXBvcnRlcigpO1xcbmphdmFJbXBvcnQuaW1wb3J0UGFja2FnZShcXG4gICAgUGFja2FnZXMuamF2YS5sYW5nLFxcbiAgICBQYWNrYWdlcy5qYXZhLnNlY3VyaXR5LFxcbiAgICBQYWNrYWdlcy5qYXZhLnV0aWwsXFxuICAgIFBhY2thZ2VzLmphdmEuaW8sXFxuICAgIFBhY2thZ2VzLmphdmEudGV4dCxcXG4gICAgUGFja2FnZXMuamF2YXguY3J5cHRvLFxcbiAgICBQYWNrYWdlcy5qYXZheC5jcnlwdG8uc3BlY1xcbik7XFxud2l0aChqYXZhSW1wb3J0KSB7XFxuICAgZnVuY3Rpb24gRGUoc3RyKSB7XFxuICAgICAgICB2YXIgZ2VuZXJhdGVTZWNyZXQgPSBTZWNyZXRLZXlGYWN0b3J5LmdldEluc3RhbmNlKFxcXCJkZXNlZGVcXFwiKS5nZW5lcmF0ZVNlY3JldChuZXcgREVTZWRlS2V5U3BlYyhTdHJpbmcoJ09XODRVOEVlcmRiOTlydHNUWFdTSUxETycpLmdldEJ5dGVzKCkpKTtcXG4gICAgICAgIHZhciBpbnN0YW5jZSA9IENpcGhlci5nZXRJbnN0YW5jZShcXFwiZGVzZWRlL0NCQy9QS0NTNVBhZGRpbmdcXFwiKTtcXG4gICAgICAgIGluc3RhbmNlLmluaXQoMiwgZ2VuZXJhdGVTZWNyZXQsIG5ldyBJdlBhcmFtZXRlclNwZWMoU3RyaW5nKCdTSzhibmNWdScpLmdldEJ5dGVzKCkpKTtcXG4gICAgICAgIHJldHVybiBTdHJpbmcoaW5zdGFuY2UuZG9GaW5hbChfYmFzZTY0LmRlY29kZShzdHIsIDIpKSk7ICAgICAgICBcXG4gICAgfVxcbn1cXG5cXG4vKlxcbmV2YWwoZ2V0Q3J5cHRvSlMoKSlcXG52YXIga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoJ09XODRVOEVlcmRiOTlydHNUWFdTSUxETycpXFxudmFyIGl2ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoJ1NLOGJuY1Z1JylcXG5cXG5mdW5jdGlvbiBEZShkYXRhLCBlbmNvZGluZykge1xcbiAgICB2YXIgZGVjcnlwdGVkID0gQ3J5cHRvSlMuVHJpcGxlREVTLmRlY3J5cHQoZGF0YSwga2V5LCB7XFxuICAgICAgICBpdjogaXYsXFxuICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcXG4gICAgICAgIHBhZGRpbmc6IENyeXB0b0pTLnBhZC5Qa2NzN1xcbiAgICB9KTtcXG4gICAgaWYgKCFlbmNvZGluZykge1xcbiAgICAgICAgcmV0dXJuIGRlY3J5cHRlZC50b1N0cmluZyhDcnlwdG9KUy5lbmMuVXRmOCk7XFxuICAgIH1cXG4gICAgcmV0dXJuIGRlY3J5cHRlZC50b1N0cmluZyhDcnlwdG9KUy5lbmMuQmFzZTY0KTtcXG59O1xcbiovXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmvKvom5kqXCIsXCJwYXRoXCI6XCJpbWFnZVwiLFwicnVsZVwiOlwianM6XFxuY29uc3QgU29mdFJlZmVyZW5jZSA9IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTtcXG5jb25zdCBDaXBoZXIgPSBDaXBoZXIgPSBqYXZheC5jcnlwdG8uQ2lwaGVyO1xcbmNvbnN0IEl2UGFyYW1ldGVyU3BlYyA9IGphdmF4LmNyeXB0by5zcGVjLkl2UGFyYW1ldGVyU3BlYztcXG5jb25zdCBTZWNyZXRLZXlTcGVjID0gamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYztcXG5jb25zdCBLRVkgPSBuZXcgamF2YS5sYW5nLlN0cmluZyhcXFwibXkyZWNyZXQ3ODJlY3JldFxcXCIpO1xcbmNvbnN0IGYyMzE5SVYgPSBuZXcgamF2YS5sYW5nLlN0cmluZyhcXFwibXkyZWNyZXQ3ODJlY3JldFxcXCIpO1xcbmNvbnN0IEtFWV9BTEdPUklUSE0gPSBcXFwiQUVTXFxcIjtcXG5jb25zdCBBRVNfTU9ERSA9IFxcXCJBRVMvQ0JDL1BLQ1M3UGFkZGluZ1xcXCI7XFxuXFxuZnVuY3Rpb24gZGVjcnlwdERhdGEoZmlsZTJCeXRlcykge1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IHNlY3JldEtleVNwZWMgPSBuZXcgU2VjcmV0S2V5U3BlYyhLRVkuZ2V0Qnl0ZXMoKSwgS0VZX0FMR09SSVRITSk7XFxuICAgICAgICBsZXQgaXZQYXJhbWV0ZXJTcGVjID0gbmV3IEl2UGFyYW1ldGVyU3BlYyhmMjMxOUlWLmdldEJ5dGVzKCkpO1xcbiAgICAgICAgbGV0IGNpcGhlciA9IENpcGhlci5nZXRJbnN0YW5jZShBRVNfTU9ERSk7XFxuICAgICAgICBjaXBoZXIuaW5pdCgyLCBzZWNyZXRLZXlTcGVjLCBpdlBhcmFtZXRlclNwZWMpO1xcbiAgICAgICAgcmV0dXJuIGNpcGhlci5kb0ZpbmFsKGZpbGUyQnl0ZXMpO1xcbiAgICAgICAgcmV0dXJuIG5ldyBTb2Z0UmVmZXJlbmNlKGNpcGhlci5kb0ZpbmFsKGZpbGUyQnl0ZXMpKS5nZXQoKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpO1xcbiAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICByZXR1cm4gbnVsbDtcXG4gICAgfVxcbn1cXG5cXG4kLmV4cG9ydHMuaW1hZ2VEZWNyeXB0ID0gZnVuY3Rpb24oKSB7XFxuICAgIGxldCBqYXZhSW1wb3J0ID0gbmV3IEphdmFJbXBvcnRlcigpO1xcbiAgICBqYXZhSW1wb3J0LmltcG9ydFBhY2thZ2UoXFxuICAgICAgICBQYWNrYWdlcy5jb20uZXhhbXBsZS5oaWtlcnZpZXcudXRpbHNcXG4gICAgKTtcXG4gICAgd2l0aChqYXZhSW1wb3J0KSB7XFxuICAgICAgICBsZXQgYnl0ZXMgPSBGaWxlVXRpbC50b0J5dGVzKGlucHV0KTtcXG4gICAgICAgIGJ5dGVzID0gZGVjcnlwdERhdGEoYnl0ZXMpO1xcbiAgICAgICAgcmV0dXJuIEZpbGVVdGlsLnRvSW5wdXRTdHJlYW0oYnl0ZXMpO1xcbiAgICB9XFxufVxcblwifV0sXCJwYXJhbXNcIjpcIntcXFwiUlVMRVxcXCI6XFxcImV5SjBhWFJzWlNJNkl1YUx0K2kwblNKOVxcXCIsXFxcImlzSW5kZXhcXFwiOnRydWUsXFxcInVybFxcXCI6XFxcImh0dHBzOi8vd3d3Lm1hbmdhY29weS5jb20vI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5IyMjI2Z5cGFnZS5qczpsZXQgeyBydW5Db2RlLCBpbmRleFVybCB9ID0gJC5yZXF1aXJlKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2Z1bmNUb29sc++8n++8n3J1bGU96ZiF5ryr5ZCbXFxcXFxcXCIsIHtcXFxcXFxcIk1ZX1JVTEVcXFxcXFxcIjpcXFxcXFxcImV5SjBhWFJzWlNJNkl1YUx0K2kwblNJc0luVnliQ0k2SW1oMGRIQnpPaTh2ZDNkM0xtMWhibWRoWTI5d2VTNWpiMjB2WVhCcEwzWXpMMk52YldsamN6OXNhVzFwZEQweE9DWnZabVp6WlhROVpubHdZV2RsUUMweFFDb3hPRUFtWm5KbFpWOTBlWEJsUFRFbWIzSmtaWEpwYm1jOVpubHpiM0owSm1aNVkyeGhjM01tZEc5d1BXWjVZWEpsWVNad2JHRjBabTl5YlQweklpd2lZMnhoYzNOZmJtRnRaU0k2SXVXRnFPbURxQ2JtaEp2bWc0VW01cTJoNXFpQzVaQ1JKdVdHa3VtWnFTYm5tYjdsa0lnbTVhV0g1Ym03SnVhZ29lV2JyU2JtbmJIbWxya201NmVSNWJtN0p1ZVVuK2EwdXlib3ZidmxzSS9vcjdRbTVxQzg2YXlsSnVhQ3JPZVdrU2JucFo3cHJMd202SUM5NTc2T0p1V0Z0dVM3bGlib2dZemxuTG9tNklpd0lPV29tQ2Jtc3J2bWhJZ201WnViNXFDOEp1aVFqT2V6dXlicGxiZm1vcDBtNUx5cTVhaVlKdWVybnVhS2dDYm1rSjduckpFbTZJcUNJT2FUalNibWdLY2c2TDJzNW8yaUp1UytwdWFPb2libHZvemxycTRtNTRPdDZLR0FKdWUranVtam55YnBuN1BrdVpEb2lKN291WWdtUVVFbTVZcXg1YitYSnVXOXFlaUpzaWJsdklMa3VKYm5sWXdtNW9pWTVMcUpKdVdPaHVXUHNpYm1uTHJtaUpnbVF6azNKa001TmlibHJvWG5zN3NtUXprNEp1ZXB2K2kyaWlicGg0M25sSjhtUXprMUp1YUJrQ0RtZ0pZbVJrRlVSU2JtZzRybWdwb202WU85NWJpQ0p1YXRwdVMrb0NibmxKL2xyWmdtVEc5MlpVeHBkbVVtNkwyczU1U2ZKdWVVdCtXUWpDYmt1NW5rdnFBaUxDSmpiR0Z6YzE5MWNtd2lPaUowYUdWdFpUMG1kR2hsYldVOVlXbHhhVzVuSm5Sb1pXMWxQV2gxWVc1c1pYaHBZVzVuSm5Sb1pXMWxQVzFoYjNocFlXNG1kR2hsYldVOVltRnBhR1VtZEdobGJXVTljV2xvZFdGdUpuUm9aVzFsUFhocFlXOTVkV0Z1Sm5Sb1pXMWxQV1J2Ym1kbVlXNW5KblJvWlcxbFBXdGxhSFZoYmlaMGFHVnRaVDF6YUdWdVoyaDFieVowYUdWdFpUMXhhVzVuZUdsaGIzTm9kVzhtZEdobGJXVTlaMlZrYjNVbWRHaGxiV1U5ZUhWaGJubHBKblJvWlcxbFBYTm9aVzVuZFdrbWRHaGxiV1U5WkdGdWJXVnBKblJvWlcxbFBYRnBkR0VtZEdobGJXVTllbWhwWTJoaGJtY21kR2hsYldVOWFtbGhibTVwWVc1bkpuUm9aVzFsUFhwb2FYbDFKblJvWlcxbFBYTnBaMlVtZEdobGJXVTliV1Z1WjNocEpuUm9aVzFsUFdOb1lXNW5kR2xoYnlaMGFHVnRaVDEzWldsdWFXRnVaeVowYUdWdFpUMXFhVzVuYW1rbWRHaGxiV1U5WjJGdmVHbGhieVowYUdWdFpUMXFhV1ZqWVc4bWRHaGxiV1U5ZUdsdVozcG9kV0Z1YUhWaGJpWjBhR1Z0WlQxNmFHVnVkR0Z1Sm5Sb1pXMWxQV2h2ZFdkdmJtY21kR2hsYldVOWNtVjRkV1VtZEdobGJXVTliV1ZwYzJocEpuUm9aVzFsUFhscGJubDFaWGQxWkdGdkpuUm9aVzFsUFdGaEpuUm9aVzFsUFd4cGVtaHBKblJvWlcxbFBVTlBURTlTSm5Sb1pXMWxQWGxwYzJocGFtbGxKblJvWlcxbFBYcG9ZVzU2YUdWdVp5WjBhR1Z0WlQxc2FYTm9hU1owYUdWdFpUMXFhWHBvWVc0bWRHaGxiV1U5WTI5dGFXdGxkRGszSm5Sb1pXMWxQV052YldsclpYUTVOaVowYUdWdFpUMTZhR0ZwZUdrbWRHaGxiV1U5UXprNEpuUm9aVzFsUFdOb2RXRnVlWFZsSm5Sb1pXMWxQV05vYjI1bmMyaGxibWNtZEdobGJXVTlZMjl0YVd0bGREazFKblJvWlcxbFBlYUJrQ0RtZ0pZbWRHaGxiV1U5Wm1GMFpTWjBhR1Z0WlQxcWFXNW5jMjl1WnlaMGFHVnRaVDFrZFhOb2FTWjBhR1Z0WlQxM2RYaHBZU1owYUdWdFpUMXphR1Z1WjJOMWJpWjBhR1Z0WlQxc2IzWmxUR2wyWlNaMGFHVnRaVDE2YUhWaGJuTm9aVzVuSm5Sb1pXMWxQVzVoYm5SdmJtY21kR2hsYldVOUlpd2lZWEpsWVY5dVlXMWxJam9pNVlXbzZZT29KdWFYcGVhOHF5YnBuNm5tdktzbTU3Nk81cnlySnVXdWpPZTdreUlzSW1GeVpXRmZkWEpzSWpvaUptcGhjR0Z1Sm10dmNtVmhKbmRsYzNRbVptbHVhWE5vSWl3aWVXVmhjbDl1WVcxbElqb2lJaXdpZVdWaGNsOTFjbXdpT2lJaUxDSnpiM0owWDI1aGJXVWlPaUxtbDdicGw3VGlocE1tNXBlMjZaZTA0b2FSSnVlRHJlbVhxT0tHa3libmc2M3BsNmppaHBFaUxDSnpiM0owWDNWeWJDSTZJaTFrWVhSbGRHbHRaVjkxY0dSaGRHVmtKbVJoZEdWMGFXMWxYM1Z3WkdGMFpXUW1MWEJ2Y0hWc1lYSW1jRzl3ZFd4aGNpSjlcXFxcXFxcIixcXFxcXFxcIlFJTkdfVElUTEVcXFxcXFxcIjpcXFxcXFxcIumYhea8q+WQm1xcXFxcXFwifSnvvJvvvJtpbmRleFVybChpbnB1dCk7R0VUO1VURi04O3tVc2VyLUFnZW50QE1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjDvvJvvvJsgV2luNjTvvJvvvJsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTI2LjAuMC4wIFNhZmFyaS81MzcuMzZ9XFxcIn1cIixcInNhdmVkXCI6ZmFsc2UsXCJ0aXRsZVwiOlwi6ZiF5ryr5ZCbXCIsXCJ2ZXJzaW9uXCI6MCxcInVybFwiOlwiaHR0cHM6Ly93d3cubWFuZ2Fjb3B5LmNvbS8jbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjIyMjZnlwYWdlLmpzOmxldCB7IHJ1bkNvZGUsIGluZGV4VXJsIH0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9mdW5jVG9vbHPvvJ/vvJ9ydWxlPemYhea8q+WQm1xcXCIsIHtcXFwiTVlfUlVMRVxcXCI6XFxcImV5SjBhWFJzWlNJNkl1YUx0K2kwblNJc0luVnliQ0k2SW1oMGRIQnpPaTh2ZDNkM0xtMWhibWRoWTI5d2VTNWpiMjB2WVhCcEwzWXpMMk52YldsamN6OXNhVzFwZEQweE9DWnZabVp6WlhROVpubHdZV2RsUUMweFFDb3hPRUFtWm5KbFpWOTBlWEJsUFRFbWIzSmtaWEpwYm1jOVpubHpiM0owSm1aNVkyeGhjM01tZEc5d1BXWjVZWEpsWVNad2JHRjBabTl5YlQweklpd2lZMnhoYzNOZmJtRnRaU0k2SXVXRnFPbURxQ2JtaEp2bWc0VW01cTJoNXFpQzVaQ1JKdVdHa3VtWnFTYm5tYjdsa0lnbTVhV0g1Ym03SnVhZ29lV2JyU2JtbmJIbWxya201NmVSNWJtN0p1ZVVuK2EwdXlib3ZidmxzSS9vcjdRbTVxQzg2YXlsSnVhQ3JPZVdrU2JucFo3cHJMd202SUM5NTc2T0p1V0Z0dVM3bGlib2dZemxuTG9tNklpd0lPV29tQ2Jtc3J2bWhJZ201WnViNXFDOEp1aVFqT2V6dXlicGxiZm1vcDBtNUx5cTVhaVlKdWVybnVhS2dDYm1rSjduckpFbTZJcUNJT2FUalNibWdLY2c2TDJzNW8yaUp1UytwdWFPb2libHZvemxycTRtNTRPdDZLR0FKdWUranVtam55YnBuN1BrdVpEb2lKN291WWdtUVVFbTVZcXg1YitYSnVXOXFlaUpzaWJsdklMa3VKYm5sWXdtNW9pWTVMcUpKdVdPaHVXUHNpYm1uTHJtaUpnbVF6azNKa001TmlibHJvWG5zN3NtUXprNEp1ZXB2K2kyaWlicGg0M25sSjhtUXprMUp1YUJrQ0RtZ0pZbVJrRlVSU2JtZzRybWdwb202WU85NWJpQ0p1YXRwdVMrb0NibmxKL2xyWmdtVEc5MlpVeHBkbVVtNkwyczU1U2ZKdWVVdCtXUWpDYmt1NW5rdnFBaUxDSmpiR0Z6YzE5MWNtd2lPaUowYUdWdFpUMG1kR2hsYldVOVlXbHhhVzVuSm5Sb1pXMWxQV2gxWVc1c1pYaHBZVzVuSm5Sb1pXMWxQVzFoYjNocFlXNG1kR2hsYldVOVltRnBhR1VtZEdobGJXVTljV2xvZFdGdUpuUm9aVzFsUFhocFlXOTVkV0Z1Sm5Sb1pXMWxQV1J2Ym1kbVlXNW5KblJvWlcxbFBXdGxhSFZoYmlaMGFHVnRaVDF6YUdWdVoyaDFieVowYUdWdFpUMXhhVzVuZUdsaGIzTm9kVzhtZEdobGJXVTlaMlZrYjNVbWRHaGxiV1U5ZUhWaGJubHBKblJvWlcxbFBYTm9aVzVuZFdrbWRHaGxiV1U5WkdGdWJXVnBKblJvWlcxbFBYRnBkR0VtZEdobGJXVTllbWhwWTJoaGJtY21kR2hsYldVOWFtbGhibTVwWVc1bkpuUm9aVzFsUFhwb2FYbDFKblJvWlcxbFBYTnBaMlVtZEdobGJXVTliV1Z1WjNocEpuUm9aVzFsUFdOb1lXNW5kR2xoYnlaMGFHVnRaVDEzWldsdWFXRnVaeVowYUdWdFpUMXFhVzVuYW1rbWRHaGxiV1U5WjJGdmVHbGhieVowYUdWdFpUMXFhV1ZqWVc4bWRHaGxiV1U5ZUdsdVozcG9kV0Z1YUhWaGJpWjBhR1Z0WlQxNmFHVnVkR0Z1Sm5Sb1pXMWxQV2h2ZFdkdmJtY21kR2hsYldVOWNtVjRkV1VtZEdobGJXVTliV1ZwYzJocEpuUm9aVzFsUFhscGJubDFaWGQxWkdGdkpuUm9aVzFsUFdGaEpuUm9aVzFsUFd4cGVtaHBKblJvWlcxbFBVTlBURTlTSm5Sb1pXMWxQWGxwYzJocGFtbGxKblJvWlcxbFBYcG9ZVzU2YUdWdVp5WjBhR1Z0WlQxc2FYTm9hU1owYUdWdFpUMXFhWHBvWVc0bWRHaGxiV1U5WTI5dGFXdGxkRGszSm5Sb1pXMWxQV052YldsclpYUTVOaVowYUdWdFpUMTZhR0ZwZUdrbWRHaGxiV1U5UXprNEpuUm9aVzFsUFdOb2RXRnVlWFZsSm5Sb1pXMWxQV05vYjI1bmMyaGxibWNtZEdobGJXVTlZMjl0YVd0bGREazFKblJvWlcxbFBlYUJrQ0RtZ0pZbWRHaGxiV1U5Wm1GMFpTWjBhR1Z0WlQxcWFXNW5jMjl1WnlaMGFHVnRaVDFrZFhOb2FTWjBhR1Z0WlQxM2RYaHBZU1owYUdWdFpUMXphR1Z1WjJOMWJpWjBhR1Z0WlQxc2IzWmxUR2wyWlNaMGFHVnRaVDE2YUhWaGJuTm9aVzVuSm5Sb1pXMWxQVzVoYm5SdmJtY21kR2hsYldVOUlpd2lZWEpsWVY5dVlXMWxJam9pNVlXbzZZT29KdWFYcGVhOHF5YnBuNm5tdktzbTU3Nk81cnlySnVXdWpPZTdreUlzSW1GeVpXRmZkWEpzSWpvaUptcGhjR0Z1Sm10dmNtVmhKbmRsYzNRbVptbHVhWE5vSWl3aWVXVmhjbDl1WVcxbElqb2lJaXdpZVdWaGNsOTFjbXdpT2lJaUxDSnpiM0owWDI1aGJXVWlPaUxtbDdicGw3VGlocE1tNXBlMjZaZTA0b2FSSnVlRHJlbVhxT0tHa3libmc2M3BsNmppaHBFaUxDSnpiM0owWDNWeWJDSTZJaTFrWVhSbGRHbHRaVjkxY0dSaGRHVmtKbVJoZEdWMGFXMWxYM1Z3WkdGMFpXUW1MWEJ2Y0hWc1lYSW1jRzl3ZFd4aGNpSjlcXFwiLFxcXCJRSU5HX1RJVExFXFxcIjpcXFwi6ZiF5ryr5ZCbXFxcIn0p77yb77ybaW5kZXhVcmwoaW5wdXQpO0dFVDtVVEYtODt7VXNlci1BZ2VudEBNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4w77yb77ybIFdpbjY077yb77ybIHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEyNi4wLjAuMCBTYWZhcmkvNTM3LjM2fVwiLFwiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcImZpbmRfcnVsZVwiOlwianM6XFxuY29uc3QgUUlOR19USVRMRSA9IGdldE15VmFyKCdteUNvbGxlY3Rpb24nKVxcbnZhciBteUNvbGxfZWwgPSBbXVxcbmV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL2hpamFja0Vudj9ydWxlPScgKyBRSU5HX1RJVExFKSkucnVsZSlcXG5cXG5pZiAoIWlzSW5kZXgpIHtcXG4gICAgaWYgKHBhZ2VUaXRsZSkgc2V0UGFnZVRpdGxlKHBhZ2VUaXRsZSlcXG4gICAgc2V0TGFzdENoYXB0ZXJSdWxlKG9yaVJVTEUubGFzdF9jaGFwdGVyX3J1bGUpXFxuICAgIE1ZX1BBUkFNUyA9IE1ZX1JVTEUucGFyYW1zXFxufSBlbHNlIGlmIChNWV9QQUdFID09IDEpIHtcXG4gICAgdGFiSGVhZGVyLmxvYWQobXlDb2xsX2VsKVxcbiAgICBpZiAoUlVMRS5zZWFyY2hfdXJsKSBteUNvbGxfZWwucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwi6L+Z5piv6ZiF5ryr5ZCb55qE5pCc57Si5ZOmfn5cXFwiLFxcbiAgICAgICAgdXJsOiAnXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcIitpbnB1dCcsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHJ1bGVzOiAkLnRvU3RyaW5nKChRSU5HX1RJVExFLCB0aXRsZSkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9kYXRhTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFKVxcbiAgICAgICAgICAgICAgICBydWxlcyA9IFtydWxlcy5maW5kKCh2KSA9PiB2LnRpdGxlID09IHRpdGxlKV1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJ1bGVzKVxcbiAgICAgICAgICAgIH0sIFFJTkdfVElUTEUsIFJVTEUudGl0bGUpLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0TXlWYXIoJ3NlYXJjaEtleScsICcnKSxcXG4gICAgICAgICAgICBvbkNoYW5nZTogXFxcInB1dE15VmFyKCdzZWFyY2hLZXknLGlucHV0KVxcXCJcXG4gICAgICAgIH0sXFxuICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgfSlcXG59XFxuLy8g5q2j5paH6Kej5p6QXFxudmFyIHtcXG4gICAgcGFyYW1IYW5kbGUsXFxuICAgIHJ1blByZVJ1bGUsXFxuICAgIGdlbkV4VXJsLFxcbiAgICBoaWphY2tMYXp5UnVsZVxcbn0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9mdW5jVG9vbHM/cnVsZT0nICsgUUlOR19USVRMRSlcXG5ydW5QcmVSdWxlKG9yaVJVTEUucHJlUnVsZSlcXG5pZiAoTVlfUlVMRS5maW5kX3J1bGUuc3RhcnRzV2l0aCgnanM6JykpIHtcXG4gICAgbGV0IHsgaGlqYWNrRWwgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2Z1bmNUb29scz9ydWxlPScgKyBRSU5HX1RJVExFKVxcbiAgICBzZXRSZXN1bHQgPSBmdW5jdGlvbihwYXJhbTAsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpIHtcXG4gICAgICAgIHBhcmFtMSA9IENBTExCQUNLX0tFWVxcbiAgICAgICAgcGFyYW0yID0gTVlfUlVMRVxcbiAgICAgICAgcGFyYW0zID0gTVlfVFlQRVxcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW0wLmRhdGEpKSBwYXJhbTAgPSBwYXJhbTAuZGF0YVxcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkobXlDb2xsX2VsLCBwYXJhbTAubWFwKGhpamFja0VsKSlcXG4gICAgICAgIG1ldGhvZF9zZXRSZXN1bHQuaW52b2tlKGphdmFDb250ZXh0LCBteUNvbGxfZWwsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMpXFxuICAgIH1cXG4gICAgc2V0SG9tZVJlc3VsdCA9IHNldFJlc3VsdFxcbiAgICBzZXRTZWFyY2hSZXN1bHQgPSBzZXRSZXN1bHRcXG5cXG4gICAgZXZhbChNWV9SVUxFLmZpbmRfcnVsZS5zbGljZSgzKSlcXG59IGVsc2Uge1xcbiAgICBsZXQgeyBydW5Db2RlIH0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9mdW5jVG9vbHM/cnVsZT0nICsgUUlOR19USVRMRSksXFxuICAgICAgICBbXywgZmluZFJ1bGUsIGRldGFpbEZpbmRSdWxlXSA9IE1ZX1JVTEUuZmluZF9ydWxlLm1hdGNoKC9eKFtcXFxcc1xcXFxTXSo/KSg/Oj09PihbXFxcXHNcXFxcU10qKSk/JC8pXFxuICAgIGZpbmRSdWxlID0gZmluZFJ1bGUuc3BsaXQoJzsnKVxcbiAgICBwYXJzZURvbUZvckFycmF5KGdldFJlc0NvZGUoKSwgZmluZFJ1bGUuc2hpZnQoKSkuZm9yRWFjaCgoZGF0YSkgPT4ge1xcbiAgICAgICAgbGV0IFt0aXRsZSwgaW1nLCBkZXNjLCB1cmxdID0gZmluZFJ1bGUubWFwKCh2LCBpKSA9PiB7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSAnKicpIHJldHVybiAnJ1xcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB2ID0gKGkgPT0gMSB8fCBpID09IDMpID9cXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZURvbShkYXRhLCB2KSA6XFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VEb21Gb3JIdG1sKGRhdGEsIHYpXFxuICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSAzKSB2ID0gcnVuQ29kZSh2KVxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gJycgfVxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIHJlcyA9IHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLCB1cmw6IHVybCxcXG4gICAgICAgICAgICAgICAgZGVzYzogZGVzYywgaW1nOiBpbWcsXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBNWV9SVUxFLmNvbF90eXBlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgaWYgKHJlcy51cmwpIHtcXG4gICAgICAgICAgICBpZiAocmVzLnVybC5pbmNsdWRlcygnQGxhenlSdWxlPScpKSB7XFxuICAgICAgICAgICAgICAgIGxldCByZUluZGV4ID0gcmVzLnVybC5pbmRleE9mKCcuanM6JylcXG4gICAgICAgICAgICAgICAgaWYgKHJlSW5kZXggPj0gMCkgcmVzLnVybCA9IHJlcy51cmwuc2xpY2UoMCwgcmVJbmRleCkgKyAnLmpzOicgKyBoaWphY2tMYXp5UnVsZSArICc7JyArIHJlcy51cmwuc2xpY2UocmVJbmRleCArIDQpXFxuICAgICAgICAgICAgfSBlbHNlICBpZiAoZGV0YWlsRmluZFJ1bGUpIHtcXG4gICAgICAgICAgICAgICAgcmVzLmV4dHJhID0ge1xcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBnZW5FeFVybCh1cmwpLFxcbiAgICAgICAgICAgICAgICAgICAgUlVMRTogYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KE9iamVjdC5hc3NpZ24oZ2VuTXlSdWxlKCksIHsgZGV0YWlsX2ZpbmRfcnVsZTogZGV0YWlsRmluZFJ1bGUgfSkpKSxcXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUaXRsZTogaXNJbmRleCAmJiB0aXRsZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJlcy51cmwgPSAnaGlrZXI6Ly9wYWdlL2ZyYW1lTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFXFxuICAgICAgICAgICAgfSBlbHNlIGlmIChNWV9SVUxFLmRldGFpbF9maW5kX3J1bGUpIHtcXG4gICAgICAgICAgICAgICAgcmVzLmV4dHJhID0ge1xcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBnZW5FeFVybCh1cmwpLFxcbiAgICAgICAgICAgICAgICAgICAgUlVMRTogYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KGdlbk15UnVsZSgpKSksXFxuICAgICAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IGlzSW5kZXggJiYgdGl0bGVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXMudXJsID0gJ2hpa2VyOi8vcGFnZS9mcmFtZUxvYWQ/cnVsZT0nICsgUUlOR19USVRMRVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIG15Q29sbF9lbC5wdXNoKHJlcylcXG4gICAgfSlcXG4gICAgc2V0UmVzdWx0KG15Q29sbF9lbClcXG59XFxuXCIsXCJncm91cFwiOlwi4pGj6ZiF6K+7XCIsXCJ1YVwiOlwibW9iaWxlXCIsXCJwcmVSdWxlXCI6XCJwdXRNeVZhcignbXlDb2xsZWN0aW9uJywgTVlfUlVMRS50aXRsZSlcXG5wdXRNeVZhcigncmVtb3RlVXJsJywgJ2h0dHBzOi8vZ2guY29uLnNoL2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9RUTE5OTNIVUFORy9BL21haW4v6ZiF5ryr5ZCbLmpzb24nKVxcbi8vIFxcbi8qXFxuKi9cIixcInBhZ2VzXCI6XCJbe1xcXCJjb2xfdHlwZVxcXCI6XFxcInRleHRfMVxcXCIsXFxcIm5hbWVcXFwiOlxcXCJDbGFzc1RhYlxcXCIsXFxcInBhdGhcXFwiOlxcXCJDbGFzc1RhYlxcXCIsXFxcInJ1bGVcXFwiOlxcXCJ2YXIge1xcXFxuICAgIFFJTkdfVElUTEUsIHRpdGxlLCB1cmwsXFxcXG4gICAgY2xhc3NfbmFtZSwgY2xhc3NfdXJsLFxcXFxuICAgIGFyZWFfbmFtZSwgYXJlYV91cmwsXFxcXG4gICAgeWVhcl9uYW1lLCB5ZWFyX3VybCxcXFxcbiAgICBzb3J0X25hbWUsIHNvcnRfdXJsXFxcXG59ID0gJC5pbXBvcnRQYXJhbVxcXFxuY29uc3QgQ2xhc3NUYWIgPSBmdW5jdGlvbihjbGFzc0FycmF5LCBwYXJhbXMpIHtcXFxcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIHBhcmFtcylcXFxcbiAgICB0aGlzLmFyciA9IGNsYXNzQXJyYXkubWFwKHYgPT4gdGhpcy5pbml0KHYpKVxcXFxuICAgIHRoaXMuc2lnbiA9ICckJyArIFFJTkdfVElUTEUgKyAnXycgKyAodGhpcy5uYW1lIHx8ICcnKSArICdfJ1xcXFxuICAgIHRoaXMuY29sb3IgPSB0aGlzLmNvbG9yIHx8ICcjMTJiNjY4J1xcXFxuICAgIHRoaXMuYm91bmRhcnkgPSB0aGlzLmJvdW5kYXJ5IHx8ICdibGFua19ibG9jaydcXFxcbn1cXFxcbkNsYXNzVGFiLnByb3RvdHlwZSA9IHtcXFxcbiAgICBjb25zdHJ1Y3RvcjogQ2xhc3NUYWIsXFxcXG4gICAgbG9hZChlbCkge1xcXFxuICAgICAgICBsZXQgZm9sZGVkID0gdGhpcy5mb2xkICYmIGdldFZhcignJGZvbGRfJyArIHRoaXMuc2lnbiwgJycpXFxcXG4gICAgICAgIGlmICh0aGlzLmFyci5sZW5ndGggPiAxICYmIHRoaXMuZm9sZCkgZWwucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnScgKyAoZm9sZGVkID8gJ+KWticgOiAn4pa8JykuZm9udGNvbG9yKCcjMDQ5ZWZmJyksXFxcXG4gICAgICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHNpZ24sIGZvbGRlZCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHB1dFZhcignJGZvbGRfJyArIHNpZ24sIGZvbGRlZCA/ICcnIDogJ1QnKVxcXFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICAgICAgICAgIH0sIHRoaXMuc2lnbiwgZm9sZGVkKSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXFxcbiAgICAgICAgfSlcXFxcbiAgICAgICAgbGV0IGFyciA9IGZvbGRlZCA/IFt0aGlzLmFyclswXV0gOiB0aGlzLmFyclxcXFxuICAgICAgICBhcnIuZm9yRWFjaCgodikgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IHsgaWQsIGNsYXNzX25hbWUsIGNsYXNzX3VybCB9ID0gdixcXFxcbiAgICAgICAgICAgIHNlbGVjdGVkID0gSlNPTi5zdHJpbmdpZnkodGhpcy5nZXRDbGFzcyhpZCkpXFxcXG4gICAgICAgICAgICBjbGFzc19uYW1lLmZvckVhY2goKG5hbWUsIGkpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgdXJsID0gY2xhc3NfdXJsW2ldLFxcXFxuICAgICAgICAgICAgICAgICAgICBub3cgPSBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IG5hbWUsIHVybDogdXJsIH0pXFxcXG4gICAgICAgICAgICAgICAgZWwucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBzZWxlY3RlZCA9PSBub3cgPyAn4oCc4oCc4oCd4oCdJyArIG5hbWUuZm9udGNvbG9yKHRoaXMuY29sb3IpLmJvbGQoKSA6IG5hbWUsXFxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogc2VsZWN0ZWQgPT0gbm93ID8gJ2hpa2VyOi8vZW1wdHknIDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoc2lnbiwgaWQsIG5vdykgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcHV0VmFyKHNpZ24gKyBpZCwgbm93KVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgICAgICAgICAgICAgICAgIH0sIHRoaXMuc2lnbiwgaWQsIG5vdyksXFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXFxcbiAgICAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgIGVsLnB1c2goeyBjb2xfdHlwZTogdGhpcy5ib3VuZGFyeSB9KVxcXFxuICAgICAgICB9KVxcXFxuICAgIH0sXFxcXG4gICAgaW5pdChjbGFzc09iamVjdCkge1xcXFxuICAgICAgICBpZiAodHlwZW9mIGNsYXNzT2JqZWN0LmNsYXNzX25hbWUgPT0gJ3N0cmluZycpXFxcXG4gICAgICAgICAgICBjbGFzc09iamVjdC5jbGFzc19uYW1lID0gY2xhc3NPYmplY3QuY2xhc3NfbmFtZS5zcGxpdCgnJicpXFxcXG4gICAgICAgIGlmICh0eXBlb2YgY2xhc3NPYmplY3QuY2xhc3NfdXJsID09ICdzdHJpbmcnKVxcXFxuICAgICAgICAgICAgY2xhc3NPYmplY3QuY2xhc3NfdXJsID0gY2xhc3NPYmplY3QuY2xhc3NfdXJsLnNwbGl0KCcmJykubWFwKCh2KSA9PiB2LnRyaW0oKSlcXFxcbiAgICAgICAgcmV0dXJuIGNsYXNzT2JqZWN0XFxcXG4gICAgfSxcXFxcbiAgICBwdXNoKGNsYXNzT2JqZWN0KSB7XFxcXG4gICAgICAgIHRoaXMuYXJyLnB1c2godGhpcy5pbml0KGNsYXNzT2JqZWN0KSlcXFxcbiAgICB9LFxcXFxuICAgIGdldENsYXNzKGlkKSB7XFxcXG4gICAgICAgIGxldCBkZWZhdWx0Q2xhc3MgPSB0aGlzLmFyci5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PSBpZClcXFxcbiAgICAgICAgZGVmYXVsdENsYXNzID0gSlNPTi5zdHJpbmdpZnkoZGVmYXVsdENsYXNzID8ge1xcXFxuICAgICAgICAgICAgbmFtZTogZGVmYXVsdENsYXNzLmNsYXNzX25hbWVbMF0sXFxcXG4gICAgICAgICAgICB1cmw6IGRlZmF1bHRDbGFzcy5jbGFzc191cmxbMF1cXFxcbiAgICAgICAgfSA6IHsgbmFtZTogICdjYW5ub3QgZmluZCBpZDogJyArIGlkICsgJyBpbiBjbGFzc1RhYjogJyArIHRoaXMuc2lnbiwgdXJsOiAnJ30pXFxcXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGdldFZhcih0aGlzLnNpZ24gKyBpZCwgZGVmYXVsdENsYXNzKSlcXFxcbiAgICB9LFxcXFxuICAgIHNldFVybCh1cmwpIHtcXFxcbiAgICAgICAgcmV0dXJuIHVybC5yZXBsYWNlKC9cXFxcXFxcXCRcXFxcXFxcXHsoW159XSopXFxcXFxcXFx9L2csIChfLCBpZCkgPT4gdGhpcy5nZXRDbGFzcyhpZCkudXJsKVxcXFxuICAgIH1cXFxcbn1cXFxcbi8vIOeUn+aIkOWktOmDqOWIhuexu1xcXFxubGV0IGZ5QWxsID0gdXJsLmluY2x1ZGVzKCdmeUFsbCcpLFxcXFxuICAgIHRhYkhlYWRlciA9IFtdXFxcXG5pZiAoY2xhc3NfbmFtZSkgdGFiSGVhZGVyLnB1c2goe1xcXFxuICAgIGlkOiBmeUFsbCA/ICdmeUFsbCcgOiAnZnljbGFzcycsXFxcXG4gICAgY2xhc3NfbmFtZTogY2xhc3NfbmFtZSxcXFxcbiAgICBjbGFzc191cmw6IGNsYXNzX3VybFxcXFxufSlcXFxcbmlmIChhcmVhX25hbWUpIHRhYkhlYWRlci5wdXNoKHtcXFxcbiAgICBpZDogZnlBbGwgPyAnZnlBbGwnIDogJ2Z5YXJlYScsXFxcXG4gICAgY2xhc3NfbmFtZTogYXJlYV9uYW1lLFxcXFxuICAgIGNsYXNzX3VybDogYXJlYV91cmxcXFxcbn0pXFxcXG5pZiAoeWVhcl9uYW1lKSB0YWJIZWFkZXIucHVzaCh7XFxcXG4gICAgaWQ6IGZ5QWxsID8gJ2Z5QWxsJyA6ICdmeXllYXInLFxcXFxuICAgIGNsYXNzX25hbWU6IHllYXJfbmFtZSxcXFxcbiAgICBjbGFzc191cmw6IHllYXJfdXJsXFxcXG59KVxcXFxuaWYgKHNvcnRfbmFtZSkgdGFiSGVhZGVyLnB1c2goe1xcXFxuICAgIGlkOiBmeUFsbCA/ICdmeUFsbCcgOiAnZnlzb3J0JyxcXFxcbiAgICBjbGFzc19uYW1lOiBzb3J0X25hbWUsXFxcXG4gICAgY2xhc3NfdXJsOiBzb3J0X3VybFxcXFxufSlcXFxcbiQuZXhwb3J0cyA9IHtcXFxcbiAgICBmeUFsbDogZnlBbGwsXFxcXG4gICAgdGFiSGVhZGVyOiBuZXcgQ2xhc3NUYWIodGFiSGVhZGVyLCB7IG5hbWU6IHRpdGxlLCBmb2xkOiByZWFkRmlsZSgndGFiRm9sZCcpLCB9KVxcXFxufVxcXFxuXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcImljb25fMl9yb3VuZFxcXCIsXFxcIm5hbWVcXFwiOlxcXCLorr7nva5cXFwiLFxcXCJwYXRoXFxcIjpcXFwiQ29uZmlnXFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAnY2xlYXJNeVZhcihcXFxcXFxcInNvcnRGbGFnXFxcXFxcXCIpO3JlZnJlc2hQYWdlKCknKVxcXFxuc2V0UGFnZVRpdGxlKCfimpkg6ZiF5ryr5ZCb6K6+572uIOKamScpXFxcXG5jb25zdCBRSU5HX1RJVExFID0gZ2V0TXlWYXIoJ215Q29sbGVjdGlvbicpLFxcXFxuICAgIHVybCA9IGdldE15VmFyKCdyZW1vdGVVcmwnKVxcXFxubGV0IGRhdGEgPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9kYXRhTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFLCB0cnVlKSxcXFxcbiAgICBlbCA9IFt7XFxcXG4gICAgICAgIHRpdGxlOiAnPGI+IOa4hemZpOe8k+WtmO+8jOeri+WNs+abtOaWsCA8c21hbGw+IO+8iOWfuuS6jui/nOeoi+S7k+W6k++8jOayoeS6i+WIq+eCue+8jOWPr+avj+aciOeCueS4gOasoeabtOaWsO+8iScsXFxcXG4gICAgICAgIHVybDogJChcXFxcXFxcIua4hemZpOe8k+WtmO+8jOeri+WNs+abtOaWsFxcXFxcXFwiKS5jb25maXJtKCh1cmwpID0+IHtcXFxcbiAgICAgICAgICAgIC8v6L+c56iL5L6d6LWW57Si5byV5paH5Lu25Luj55CG5Zyw5Z2A5YiX6KGoXFxcXG4gICAgICAgICAgICBsZXQgcmVxdWlyZWxpc3QgPSBbJ2h0dHBzOi8vZ2hwcm94eS5uZXQvaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL1FRMTk5M0hVQU5HL0EvbWFpbi8nXVxcXFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXF1aXJlbGlzdC5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAgICAgICAgIHRyeSB7IC8v6L+c56iL5L6d6LWW57Si5byVXFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXMgPSByZXF1ZXN0KHJlcXVpcmVsaXN0W2ldICsgJ1FRMTk5M0hVQU5HL0EvbWFpbicsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhTdGF0dXNDb2RlOiB0cnVlXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICAgICAgICAgIGlmIChKU09OLnBhcnNlKHJlcykuc3RhdHVzQ29kZSA9PSAyMDApIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWxlRXhpc3QodXJsKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZpbGUodXJsKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVEb3dubG9hZChyZXF1aXJlbGlzdFtpXSArICdRUTE5OTNIVUFORy9BL21haW4nLHVybClcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlRG93bmxvYWQocmVxdWlyZWxpc3RbaV0gKyAnUVExOTkzSFVBTkcvQS9tYWluJyx1cmwpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKVxcXFxuICAgICAgICAgICAgYmFjayhmYWxzZSlcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7Lmm7TmlrAnXFxcXG4gICAgICAgIH0sIHVybCksXFxcXG4gICAgICAgIGltZzogJ2hpa2VyOi8vaW1hZ2VzL2ljb240JyxcXFxcbiAgICAgICAgY29sX3R5cGU6ICdhdmF0YXInXFxcXG4gICAgfV0sXFxcXG4gICAgdXBkYXRlSW50ZXJ2YWwgPSByZWFkRmlsZSgndXBkYXRlSW50ZXJ2YWwnKSB8fCAnMScsXFxcXG4gICAgbmV3V2luZG93ID0gcmVhZEZpbGUoJ25ld1dpbmRvdycpLFxcXFxuICAgIHRhYkZvbGQgPSByZWFkRmlsZSgndGFiRm9sZCcpLFxcXFxuICAgIGRpc2FibGVDdXN0b20gPSByZWFkRmlsZSgnZGlzYWJsZUN1c3RvbScpLFxcXFxuICAgIGVkaXRNb2RlID0gZGlzYWJsZUN1c3RvbSA/ICflr7zlhaXmtbfpmJQnIDogZ2V0TXlWYXIoJ2VkaXRNb2RlJywgJ+WQr+eUqC/npoHnlKgnKVxcXFxuXFxcXG5lbC5wdXNoKHtcXFxcbiAgICB0aXRsZTogJyAg8J+SoSDmm7TmlrDpopHnjoc6ICcgKyAodXBkYXRlSW50ZXJ2YWwgPT0gMCA/ICfmiYvliqgnIDogdXBkYXRlSW50ZXJ2YWwgKyAn5aSpJykgKyAnICAnLFxcXFxuICAgIHVybDogJCh1cGRhdGVJbnRlcnZhbCwgJ+i+k+WFpeabtOaWsOmXtOmalO+8iOWkqe+8ie+8jOS4ujDliJnmiYvliqjmm7TmlrBcXFxcXFxcXG7mnKzlnLDmlofku7bpk77mjqXml6DmlYgnKS5pbnB1dCgoKSA9PiB7XFxcXG4gICAgICAgIGlucHV0ID0gcGFyc2VJbnQoaW5wdXQpXFxcXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4oaW5wdXQpKSBpbnB1dCA9IDFcXFxcbiAgICAgICAgZWxzZSBpZiAoaW5wdXQgPCAxKSBpbnB1dCA9IDBcXFxcbiAgICAgICAgc2F2ZUZpbGUoJ3VwZGF0ZUludGVydmFsJywgaW5wdXQudG9TdHJpbmcoKSlcXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoKVxcXFxuICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgfSksXFxcXG4gICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcXFxufSwge1xcXFxuICAgIHRpdGxlOiAnICDwn5alIOeLrOeri+mmlumhtTogJyArIChuZXdXaW5kb3cgPyAn5pivJyA6ICflkKYnKSArICcgICcsXFxcXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChuZXdXaW5kb3cpID0+IHtcXFxcbiAgICAgICAgc2F2ZUZpbGUoJ25ld1dpbmRvdycsIG5ld1dpbmRvdyA/ICcnIDogJ1QnKVxcXFxuICAgICAgICByZWZyZXNoUGFnZSgpXFxcXG4gICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICB9LCBuZXdXaW5kb3cpLFxcXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXFxcbn0sIHtcXFxcbiAgICB0aXRsZTogJyAg8J+SoCDliIbnsbvmipjlj6A6ICcgKyAodGFiRm9sZCA/ICfmmK8nIDogJ+WQpicpICsgJyAgJyxcXFxcbiAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHRhYkZvbGQpID0+IHtcXFxcbiAgICAgICAgc2F2ZUZpbGUoJ3RhYkZvbGQnLCB0YWJGb2xkID8gJycgOiAnVCcpXFxcXG4gICAgICAgIHJlZnJlc2hQYWdlKClcXFxcbiAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcXFxuICAgIH0sIHRhYkZvbGQpLFxcXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXFxcbn0sIHtcXFxcbiAgICB0aXRsZTogJyAg8J+SvCDlpIfku73mgaLlpI0gICcsXFxcXG4gICAgdXJsOiAkKFsn5aSH5Lu9JywgJ+aBouWkjSddLCAxKS5zZWxlY3QoKFFJTkdfVElUTEUsIHVwZGF0ZUludGVydmFsLCBuZXdXaW5kb3csIHRhYkZvbGQsIGRpc2FibGVDdXN0b20pID0+IHtcXFxcbiAgICAgICAgbGV0IHVybCA9IGdldE15VmFyKCdyZW1vdGVVcmwnKVxcXFxuICAgICAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdoaWtlcjovLycpICYmICF1cmwuc3RhcnRzV2l0aCgnZmlsZTovLycpKVxcXFxuICAgICAgICAgICAgdXJsID0gJ2hpa2VyOi8vZmlsZXMvbGlicy8nICsgbWQ1KHVybCkgKyAnLmpzJ1xcXFxuICAgICAgICBlbHNlIGlmICh1cmwuc3RhcnRzV2l0aCgnaGlrZXI6Ly9wYWdlLycpKSB1cmwgPSAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICAgICAgaWYgKGlucHV0ID09ICflpIfku70nKSByZXR1cm4gJCgnaGlrZXI6Ly9maWxlcy90bXAvJyArIFFJTkdfVElUTEUgKyAnX2JhY2t1cC5qc29uJywgJ+i+k+WFpeWkh+S7vei3r+W+hCcpXFxcXG4gICAgICAgICAgICAuaW5wdXQoKHVybCwgdXBkYXRlSW50ZXJ2YWwsIG5ld1dpbmRvdywgdGFiRm9sZCwgZGlzYWJsZUN1c3RvbSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IHJlcXVlc3QodXJsKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRGF0YSA9IHJlYWRGaWxlKCdjdXN0b21EYXRhJylcXFxcbiAgICAgICAgICAgICAgICB3cml0ZUZpbGUoaW5wdXQsIEpTT04uc3RyaW5naWZ5KHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSW50ZXJ2YWw6IHVwZGF0ZUludGVydmFsLFxcXFxuICAgICAgICAgICAgICAgICAgICBuZXdXaW5kb3c6IG5ld1dpbmRvdyxcXFxcbiAgICAgICAgICAgICAgICAgICAgdGFiRm9sZDogdGFiRm9sZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZUN1c3RvbTogZGlzYWJsZUN1c3RvbSxcXFxcbiAgICAgICAgICAgICAgICAgICAgY3VzdG9tRGF0YTogY3VzdG9tRGF0YSxcXFxcbiAgICAgICAgICAgICAgICAgICAgcnVsZXM6IHJ1bGVzXFxcXG4gICAgICAgICAgICAgICAgfSkpXFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+W3suWkh+S7ve+8jOazqOaEj+iLpeS7k+W6k+S4uuWtkOmhtemdouWImeS4jeWkh+S7vSdcXFxcbiAgICAgICAgICAgIH0sIHVybCwgdXBkYXRlSW50ZXJ2YWwsIG5ld1dpbmRvdywgdGFiRm9sZCwgZGlzYWJsZUN1c3RvbSlcXFxcbiAgICAgICAgZWxzZSByZXR1cm4gJCgnaGlrZXI6Ly9maWxlcy90bXAvJyArIFFJTkdfVElUTEUgKyAnX2JhY2t1cC5qc29uJywgJ+i+k+WFpeWkh+S7vei3r+W+hCcpLmlucHV0KCh1cmwpID0+IHtcXFxcbiAgICAgICAgICAgIGxldCB7IHVwZGF0ZUludGVydmFsLCBuZXdXaW5kb3csIHRhYkZvbGQsIGRpc2FibGVDdXN0b20sIGN1c3RvbURhdGEsIHJ1bGVzIH0gPSBKU09OLnBhcnNlKHJlcXVlc3QoaW5wdXQpKVxcXFxuICAgICAgICAgICAgc2F2ZUZpbGUoJ3VwZGF0ZUludGVydmFsJywgdXBkYXRlSW50ZXJ2YWwpXFxcXG4gICAgICAgICAgICBzYXZlRmlsZSgnbmV3V2luZG93JywgbmV3V2luZG93KVxcXFxuICAgICAgICAgICAgc2F2ZUZpbGUoJ3RhYkZvbGQnLCB0YWJGb2xkKVxcXFxuICAgICAgICAgICAgc2F2ZUZpbGUoJ2Rpc2FibGVDdXN0b20nLCBkaXNhYmxlQ3VzdG9tKVxcXFxuICAgICAgICAgICAgc2F2ZUZpbGUoJ2N1c3RvbURhdGEnLCBjdXN0b21EYXRhKVxcXFxuICAgICAgICAgICAgaWYgKHJ1bGVzKSB3cml0ZUZpbGUodXJsLCBydWxlcylcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKClcXFxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7LmgaLlpI3vvIzlpoLmnpzkuI3mg7PlkIzmraXov5znqIvku5PlupPvvIzlj6/ku6Xorr7nva7mm7TmlrDpopHnjofkuLrmiYvliqgnXFxcXG4gICAgICAgIH0sIHVybClcXFxcbiAgICB9LCBRSU5HX1RJVExFLCB1cGRhdGVJbnRlcnZhbCwgbmV3V2luZG93LCB0YWJGb2xkLCBkaXNhYmxlQ3VzdG9tKSxcXFxcbiAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxcXG59LCB7XFxcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08Zm9udCBjb2xvcj1cXFxcXFxcIiM2NjY2NjZcXFxcXFxcIj48c21hbGw+54m55Yir6bij6LCi77yM5bCP56iL5bqP5o+Q5L6b6ICF77ya5Zui5a2QL+WimeS9rC/pgZPplb8vICAgIOWwj+eoi+W6j+e7tOaKpO+8muWwj+exs+eypVxcXFxcXFxcbidcXFxcbiAgICAgICAgLypkYXRhLnJlZHVjZSgoc2VsZiwgdikgPT4gdi5hdXRob3IgPyBzZWxmLmNvbmNhdCh2LmF1dGhvci5zcGxpdCgnJicpKSA6IHNlbGYsIFtdKVxcXFxuICAgICAgICAuZmlsdGVyKCh2LCBpLCBhcnIpID0+IHYgJiYgYXJyLmluZGV4T2YodikgPT0gaSkuam9pbign44CBJykqLyxcXFxcbiAgICB1cmw6ICdoaWtlcjovL2VtcHR5JyxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxcXG59KVxcXFxuZWwucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi5pu05pawJuWPjemmiFxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvVXAjbm9SZWZyZXNoIyNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB2ZXJzaW9uOiBNWV9QQVJBTVMudmVyc2lvbiB8fCBcXFxcXFxcIuiOt+WPlueJiOacrOWksei0pe+8jOiHquihjOafpeeci1xcXFxcXFwiXFxcXG4gICAgfSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCJcXFxcbn0pO1xcXFxuZWwucHVzaCh7IGNvbF90eXBlOiAnbGluZScgfSwge1xcXFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArICfwn5OdJy5zbWFsbCgpICsgJyZuYnNwIOmYhea8q+WQm+iHquWumuS5iSAmbmJzcCcuYm9sZCgpLmZvbnRjb2xvcignIzc1NzU3NScpICsgKGRpc2FibGVDdXN0b20gPyAn4p2MJyA6ICfirZUnKS5zbWFsbCgpLFxcXFxuICAgIHVybDogJChbKGRpc2FibGVDdXN0b20gPyAn5ZCv55SoJyA6ICfnpoHnlKgnKSArICflkIjpm4boh6rlrprkuYknLCAn5riF6Zmk6Ieq5a6a5LmJ5pWw5o2uJywgJ+e8lui+kUpTT04nXSwgMSkuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgc3dpdGNoIChpbnB1dC5zbGljZSgwLCAyKSkge1xcXFxuICAgICAgICAgICAgY2FzZSAn5riF6ZmkJzpcXFxcbiAgICAgICAgICAgICAgICBkZWxldGVGaWxlKCdjdXN0b21EYXRhJylcXFxcbiAgICAgICAgICAgICAgICBicmVha1xcXFxuICAgICAgICAgICAgY2FzZSAn5ZCv55SoJzpcXFxcbiAgICAgICAgICAgICAgICBzYXZlRmlsZSgnZGlzYWJsZUN1c3RvbScsICcnKVxcXFxuICAgICAgICAgICAgICAgIGJyZWFrXFxcXG4gICAgICAgICAgICBjYXNlICfnpoHnlKgnOlxcXFxuICAgICAgICAgICAgICAgIHNhdmVGaWxlKCdkaXNhYmxlQ3VzdG9tJywgJ1QnKVxcXFxuICAgICAgICAgICAgICAgIGlucHV0ICs9ICdcXFxcXFxcXG7lsI/nqIvluo/lkK/nlKgv56aB55So44CB6YeN5paw5o6S5bqP562J5pON5L2c5Z2H5LiN5Lya5L2T546w5Zyo6aaW6aG15bCP56iL5bqP5YiX6KGo5LitJ1xcXFxuICAgICAgICAgICAgICAgIGJyZWFrXFxcXG4gICAgICAgICAgICBjYXNlICfnvJbovpEnOlxcXFxuICAgICAgICAgICAgICAgIGxldCB1cmwgPSBnZXRNeVZhcigncmVtb3RlVXJsJylcXFxcbiAgICAgICAgICAgICAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdoaWtlcjovL2ZpbGVzLycpICYmICF1cmwuc3RhcnRzV2l0aCgnZmlsZTovLycpKVxcXFxuICAgICAgICAgICAgICAgICAgICB1cmwgPSAnaGlrZXI6Ly9maWxlcy9saWJzLycgKyBtZDUodXJsKSArICcuanMnXFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICAnaGlrZXI6Ly9wYWdlL2ludGVyZmFjZSNub1JlZnJlc2gjI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5Iz9ydWxlPUpTT07nvJbovpHlmagmSnNvbj0nK2Jhc2U2NEVuY29kZSh1cmwpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7InICsgaW5wdXRcXFxcbiAgICB9KSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcXFxuICAgIGV4dHJhOiB7IGxpbmVWaXNpYmxlOiBmYWxzZSB9XFxcXG59KTsvKlxcXFxuKGRpc2FibGVDdXN0b20gPyBbJ+WvvOWFpea1t+mYlCddIDogWyflkK/nlKgv56aB55SoJywgJ+mHjeaWsOaOkuW6jycsICfmm7TmlLnlm77moIcnLCAn5a+85YWl5rW36ZiUJ10pLmZvckVhY2goKHYpID0+IHtcXFxcbiAgICBlbC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IHYgPT0gZWRpdE1vZGUgPyAn4oCc4oCc4oCd4oCdJyArIHYuYm9sZCgpLmZvbnRjb2xvcignIzEyYjY2OCcpIDogdixcXFxcbiAgICAgICAgdXJsOiB2ID09IGVkaXRNb2RlID8gJ2hpa2VyOi8vZW1wdHknIDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgodikgPT4ge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoJ2VkaXRNb2RlJywgdilcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcXFxuICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcXFxuICAgICAgICB9LCB2KSxcXFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJ1xcXFxuICAgIH0pXFxcXG59KTtcXFxcbmlmIChlZGl0TW9kZSA9PSAn5a+85YWl5rW36ZiUJykgZWwucHVzaCh7XFxcXG4gICAgdGl0bGU6ICflhajpg6jlr7zlhaUnLFxcXFxuICAgIHVybDogJ+a1t+mYlOinhueVjO+/pWhvbWVfcnVsZV91cmzvv6UnICsgKHVybC5zdGFydHNXaXRoKCdoaWtlcjovLycpIHx8IHVybC5zdGFydHNXaXRoKCdmaWxlOi8vJykgPyB1cmwgOiAnaGlrZXI6Ly9maWxlcy9saWJzLycgKyBtZDUodXJsKSArICcuanMnKSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcXFxuICAgIGV4dHJhOiB7IGxpbmVWaXNpYmxlOiBmYWxzZSB9XFxcXG59KTtcXFxcbihkaXNhYmxlQ3VzdG9tID8gZGF0YSA6IEpTT04ucGFyc2UocmVhZEZpbGUoJ2N1c3RvbURhdGEnKSB8fCAnW10nKSkuZm9yRWFjaCgodiwgaSkgPT4ge1xcXFxuICAgIGxldCBkID0geyB0aXRsZTogdi50aXRsZSwgaW1nOiBkYXRhW2ldLmljb24gfVxcXFxuICAgIHN3aXRjaCAoZWRpdE1vZGUpIHtcXFxcbiAgICAgICAgY2FzZSAn5ZCv55SoL+emgeeUqCc6XFxcXG4gICAgICAgICAgICBkLnRpdGxlID0gKHYudmlzaWJsZSA/ICfwn5+iICAnIDogJ/CflLQgICcpICsgZC50aXRsZVxcXFxuICAgICAgICAgICAgZC51cmwgPSAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gSlNPTi5wYXJzZShyZWFkRmlsZSgnY3VzdG9tRGF0YScpIHx8ICdbXScpXFxcXG4gICAgICAgICAgICAgICAgcnVsZXNbaV0udmlzaWJsZSA9ICFydWxlc1tpXS52aXNpYmxlXFxcXG4gICAgICAgICAgICAgICAgc2F2ZUZpbGUoJ2N1c3RvbURhdGEnLCBKU09OLnN0cmluZ2lmeShydWxlcykpXFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcXFxuICAgICAgICAgICAgfSwgaSlcXFxcbiAgICAgICAgICAgIGJyZWFrXFxcXG4gICAgICAgIGNhc2UgJ+mHjeaWsOaOkuW6jyc6XFxcXG4gICAgICAgICAgICBsZXQgc29ydEZsYWcgPSBwYXJzZUludChnZXRNeVZhcignc29ydEZsYWcnLCAnLTEnKSlcXFxcbiAgICAgICAgICAgIGQudGl0bGUgPSAoc29ydEZsYWcgPT0gaSA/ICfwn5SDICAnIDogJycpICsgZC50aXRsZVxcXFxuICAgICAgICAgICAgaWYgKHNvcnRGbGFnID09IC0xKVxcXFxuICAgICAgICAgICAgICAgIGQudXJsID0gJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcignc29ydEZsYWcnLCBpLnRvU3RyaW5nKCkpXFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6YCJ5oup6KaB56e75Yqo5Yiw55qE5L2N572uJ1xcXFxuICAgICAgICAgICAgICAgIH0sIGkpXFxcXG4gICAgICAgICAgICBlbHNlXFxcXG4gICAgICAgICAgICAgICAgZC51cmwgPSAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChvbGRJbmRleCwgbmV3SW5kZXgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gSlNPTi5wYXJzZShyZWFkRmlsZSgnY3VzdG9tRGF0YScpIHx8ICdbXScpXFxcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVzLnNwbGljZShuZXdJbmRleCwgMCwgcnVsZXMuc3BsaWNlKG9sZEluZGV4LCAxKVswXSlcXFxcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbGUoJ2N1c3RvbURhdGEnLCBKU09OLnN0cmluZ2lmeShydWxlcykpXFxcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCdzb3J0RmxhZycsICctMScpXFxcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgICAgICAgICAgICAgfSwgc29ydEZsYWcsIGkpXFxcXG4gICAgICAgICAgICBicmVha1xcXFxuICAgICAgICBjYXNlICfmm7TmlLnlm77moIcnOlxcXFxuICAgICAgICAgICAgZC51cmwgPSAkKHYuaWNvbiB8fCAnJywgJ+i+k+WFpeaWsOWbvuagh+WcsOWdgOaIluminOiJsuS7o+egge+8micpLmlucHV0KChpKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gSlNPTi5wYXJzZShyZWFkRmlsZSgnY3VzdG9tRGF0YScpIHx8ICdbXScpXFxcXG4gICAgICAgICAgICAgICAgaWYgKGlucHV0KVxcXFxuICAgICAgICAgICAgICAgICAgICBydWxlc1tpXS5pY29uID0gaW5wdXRcXFxcbiAgICAgICAgICAgICAgICBlbHNlXFxcXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBydWxlc1tpXS5pY29uXFxcXG4gICAgICAgICAgICAgICAgc2F2ZUZpbGUoJ2N1c3RvbURhdGEnLCBKU09OLnN0cmluZ2lmeShydWxlcykpXFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcXFxuICAgICAgICAgICAgfSwgaSlcXFxcbiAgICAgICAgICAgIGJyZWFrXFxcXG4gICAgICAgIGNhc2UgJ+WvvOWFpea1t+mYlCc6XFxcXG4gICAgICAgICAgICBkLnVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2RhdGFMb2FkP3J1bGU9JyArIGdldE15VmFyKCdteUNvbGxlY3Rpb24nKSwgdHJ1ZSlcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KGRhdGFbaV0pKVxcXFxuICAgICAgICAgICAgfSwgaSlcXFxcbiAgICAgICAgICAgIGJyZWFrXFxcXG4gICAgfVxcXFxuICAgIGVsLnB1c2goZClcXFxcbn0pKi9cXFxcbihkaXNhYmxlQ3VzdG9tID8gWyflr7zlhaXmtbfpmJQnXSA6IFsn5ZCv55SoL+emgeeUqCcsICfph43mlrDmjpLluo8nLCAn5pu05pS55Zu+5qCHJywgJ+WvvOWFpea1t+mYlCddKS5mb3JFYWNoKCh2KSA9PiB7XFxcXG4gICAgZWwucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiB2ID09IGVkaXRNb2RlID8gJ+KAnOKAnOKAneKAnScgKyB2LmJvbGQoKS5mb250Y29sb3IoJyMxMmI2NjgnKSA6IHYsXFxcXG4gICAgICAgIHVybDogdiA9PSBlZGl0TW9kZSA/ICdoaWtlcjovL2VtcHR5JyA6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHYpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKCdlZGl0TW9kZScsIHYpXFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXFxcbiAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICAgICAgfSwgdiksXFxcXG4gICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXFxcbiAgICB9KVxcXFxufSk7XFxcXG5pZihlZGl0TW9kZSA9PT0gJ+WvvOWFpea1t+mYlCcpIHtcXFxcbiAgICBlbC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6J+aQnOe0oicsXFxcXG4gICAgICAgIGRlc2M6J+i+k+WFpeWwj+eoi+W6j+agh+mimHzlnLDlnYDov5vooYzmkJzntKIuLi4nLFxcXFxuICAgICAgICB1cmw6JC50b1N0cmluZygoKT0+e1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICB9KSxcXFxcbiAgICAgICAgY29sX3R5cGU6J2lucHV0JyxcXFxcbiAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBcXFxcXFxcInB1dE15VmFyKCdpbXBvcnRTZWFyY2hLZXknLGlucHV0KVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiB0cnVlLFxcXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOmdldE15VmFyKCdpbXBvcnRTZWFyY2hLZXknLCcnKVxcXFxuICAgICAgICB9LFxcXFxuICAgIH0pO1xcXFxuICAgIGVsLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogJ+WFqOmDqOWvvOWFpSjpnZ7mkJzntKLov4fmu6TlkI7nu5PmnpwpJyxcXFxcbiAgICAgICAgdXJsOiAn5rW36ZiU6KeG55WM77+laG9tZV9ydWxlX3VybO+/pScgKyAodXJsLnN0YXJ0c1dpdGgoJ2hpa2VyOi8vJykgfHwgdXJsLnN0YXJ0c1dpdGgoJ2ZpbGU6Ly8nKSA/IHVybCA6ICdoaWtlcjovL2ZpbGVzL2xpYnMvJyArIG1kNSh1cmwpICsgJy5qcycpLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcXFxuICAgICAgICBleHRyYToge2xpbmVWaXNpYmxlOiBmYWxzZX1cXFxcbiAgICB9KTtcXFxcbn1cXFxcbnZhciBkYXRhcyA9IChkaXNhYmxlQ3VzdG9tID8gZGF0YSA6IEpTT04ucGFyc2UocmVhZEZpbGUoJ2N1c3RvbURhdGEnKSB8fCAnW10nKSk7XFxcXG5sZXQgc2sgPSBnZXRNeVZhcignaW1wb3J0U2VhcmNoS2V5JywnJyk7XFxcXG5pZihlZGl0TW9kZSA9PT0gJ+WvvOWFpea1t+mYlCcmJnNrKSB7XFxcXG4gICAgZGF0YXMgPSBkYXRhcy5maWx0ZXIoaXQ9Pml0LnRpdGxlLmluY2x1ZGVzKHNrKXx8KGl0LnVybCYmaXQudXJsLmluY2x1ZGVzKHNrKSkpO1xcXFxuICAgIGRhdGEgPSBkYXRhLmZpbHRlcihpdD0+aXQudGl0bGUuaW5jbHVkZXMoc2spfHwoaXQudXJsJiZpdC51cmwuaW5jbHVkZXMoc2spKSk7XFxcXG59XFxcXG5kYXRhcy5mb3JFYWNoKCh2LCBpKSA9PiB7XFxcXG4gICAgbGV0IGQgPSB7IHRpdGxlOiB2LnRpdGxlLCBpbWc6IGRhdGFbaV0uaWNvbiB9XFxcXG4gICAgc3dpdGNoIChlZGl0TW9kZSkge1xcXFxuICAgICAgICBjYXNlICflkK/nlKgv56aB55SoJzpcXFxcbiAgICAgICAgICAgIGQudGl0bGUgPSAodi52aXNpYmxlID8gJ/Cfn6IgICcgOiAn8J+UtCAgJykgKyBkLnRpdGxlXFxcXG4gICAgICAgICAgICBkLnVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBKU09OLnBhcnNlKHJlYWRGaWxlKCdjdXN0b21EYXRhJykgfHwgJ1tdJylcXFxcbiAgICAgICAgICAgICAgICBydWxlc1tpXS52aXNpYmxlID0gIXJ1bGVzW2ldLnZpc2libGVcXFxcbiAgICAgICAgICAgICAgICBzYXZlRmlsZSgnY3VzdG9tRGF0YScsIEpTT04uc3RyaW5naWZ5KHJ1bGVzKSlcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgICAgICAgICB9LCBpKVxcXFxuICAgICAgICAgICAgYnJlYWtcXFxcbiAgICAgICAgY2FzZSAn6YeN5paw5o6S5bqPJzpcXFxcbiAgICAgICAgICAgIGxldCBzb3J0RmxhZyA9IHBhcnNlSW50KGdldE15VmFyKCdzb3J0RmxhZycsICctMScpKVxcXFxuICAgICAgICAgICAgZC50aXRsZSA9IChzb3J0RmxhZyA9PSBpID8gJ/CflIMgICcgOiAnJykgKyBkLnRpdGxlXFxcXG4gICAgICAgICAgICBpZiAoc29ydEZsYWcgPT0gLTEpXFxcXG4gICAgICAgICAgICAgICAgZC51cmwgPSAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKCdzb3J0RmxhZycsIGkudG9TdHJpbmcoKSlcXFxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/pgInmi6nopoHnp7vliqjliLDnmoTkvY3nva4nXFxcXG4gICAgICAgICAgICAgICAgfSwgaSlcXFxcbiAgICAgICAgICAgIGVsc2VcXFxcbiAgICAgICAgICAgICAgICBkLnVybCA9ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKG9sZEluZGV4LCBuZXdJbmRleCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBKU09OLnBhcnNlKHJlYWRGaWxlKCdjdXN0b21EYXRhJykgfHwgJ1tdJylcXFxcbiAgICAgICAgICAgICAgICAgICAgcnVsZXMuc3BsaWNlKG5ld0luZGV4LCAwLCBydWxlcy5zcGxpY2Uob2xkSW5kZXgsIDEpWzBdKVxcXFxuICAgICAgICAgICAgICAgICAgICBzYXZlRmlsZSgnY3VzdG9tRGF0YScsIEpTT04uc3RyaW5naWZ5KHJ1bGVzKSlcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoJ3NvcnRGbGFnJywgJy0xJylcXFxcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnaGlrZXI6Ly9lbXB0eSdcXFxcbiAgICAgICAgICAgICAgICB9LCBzb3J0RmxhZywgaSlcXFxcbiAgICAgICAgICAgIGJyZWFrXFxcXG4gICAgICAgIGNhc2UgJ+abtOaUueWbvuaghyc6XFxcXG4gICAgICAgICAgICBkLnVybCA9ICQodi5pY29uIHx8ICcnLCAn6L6T5YWl5paw5Zu+5qCH5Zyw5Z2A5oiW6aKc6Imy5Luj56CB77yaJykuaW5wdXQoKGkpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSBKU09OLnBhcnNlKHJlYWRGaWxlKCdjdXN0b21EYXRhJykgfHwgJ1tdJylcXFxcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQpXFxcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVzW2ldLmljb24gPSBpbnB1dFxcXFxuICAgICAgICAgICAgICAgIGVsc2VcXFxcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJ1bGVzW2ldLmljb25cXFxcbiAgICAgICAgICAgICAgICBzYXZlRmlsZSgnY3VzdG9tRGF0YScsIEpTT04uc3RyaW5naWZ5KHJ1bGVzKSlcXFxcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxcXG4gICAgICAgICAgICB9LCBpKVxcXFxuICAgICAgICAgICAgYnJlYWtcXFxcbiAgICAgICAgY2FzZSAn5a+85YWl5rW36ZiUJzpcXFxcbiAgICAgICAgICAgIGQudXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KGRhdGFbaV0pKTtcXFxcbiAgICAgICAgICAgIGJyZWFrXFxcXG4gICAgfVxcXFxuICAgIGVsLnB1c2goZClcXFxcbn0pXFxcXG5zZXRSZXN1bHQoZWwpXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi6aG16Z2i6L295YWlXFxcIixcXFwicGF0aFxcXCI6XFxcImZyYW1lTG9hZFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmNvbnN0IFFJTkdfVElUTEUgPSBnZXRNeVZhcignbXlDb2xsZWN0aW9uJylcXFxcbnZhciBteUNvbGxfZWwgPSBbXVxcXFxuZXZhbChKU09OLnBhcnNlKGZldGNoKCdoaWtlcjovL3BhZ2UvaGlqYWNrRW52P3J1bGU9JyArIFFJTkdfVElUTEUpKS5ydWxlKVxcXFxuXFxcXG5pZiAoIWlzSW5kZXgpIHtcXFxcbiAgICBpZiAocGFnZVRpdGxlKSBzZXRQYWdlVGl0bGUocGFnZVRpdGxlKVxcXFxuICAgIHNldExhc3RDaGFwdGVyUnVsZShvcmlSVUxFLmxhc3RfY2hhcHRlcl9ydWxlKVxcXFxuICAgIE1ZX1BBUkFNUyA9IE1ZX1JVTEUucGFyYW1zXFxcXG59IGVsc2UgaWYgKE1ZX1BBR0UgPT0gMSkge1xcXFxuICAgIHRhYkhlYWRlci5sb2FkKG15Q29sbF9lbClcXFxcbiAgICBpZiAoUlVMRS5zZWFyY2hfdXJsKSBteUNvbGxfZWwucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuaQnOe0olxcXFxcXFwiLFxcXFxuICAgICAgICBkZXNjOiBcXFxcXFxcIui/meaYr+mYhea8q+WQm+eahOaQnOe0ouWTpn5+XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJ1xcXFxcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFxcXFxcIitpbnB1dCcsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBydWxlczogJC50b1N0cmluZygoUUlOR19USVRMRSwgdGl0bGUpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcnVsZXMgPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9kYXRhTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFKVxcXFxuICAgICAgICAgICAgICAgIHJ1bGVzID0gW3J1bGVzLmZpbmQoKHYpID0+IHYudGl0bGUgPT0gdGl0bGUpXVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShydWxlcylcXFxcbiAgICAgICAgICAgIH0sIFFJTkdfVElUTEUsIFJVTEUudGl0bGUpLFxcXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcignc2VhcmNoS2V5JywgJycpLFxcXFxuICAgICAgICAgICAgb25DaGFuZ2U6IFxcXFxcXFwicHV0TXlWYXIoJ3NlYXJjaEtleScsaW5wdXQpXFxcXFxcXCJcXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaW5wdXRcXFxcXFxcIixcXFxcbiAgICB9KVxcXFxufVxcXFxuLy8g5q2j5paH6Kej5p6QXFxcXG52YXIge1xcXFxuICAgIHBhcmFtSGFuZGxlLFxcXFxuICAgIHJ1blByZVJ1bGUsXFxcXG4gICAgZ2VuRXhVcmwsXFxcXG4gICAgaGlqYWNrTGF6eVJ1bGVcXFxcbn0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9mdW5jVG9vbHM/cnVsZT0nICsgUUlOR19USVRMRSlcXFxcbnJ1blByZVJ1bGUob3JpUlVMRS5wcmVSdWxlKVxcXFxuaWYgKE1ZX1JVTEUuZmluZF9ydWxlLnN0YXJ0c1dpdGgoJ2pzOicpKSB7XFxcXG4gICAgbGV0IHsgaGlqYWNrRWwgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2Z1bmNUb29scz9ydWxlPScgKyBRSU5HX1RJVExFKVxcXFxuICAgIHNldFJlc3VsdCA9IGZ1bmN0aW9uKHBhcmFtMCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMykge1xcXFxuICAgICAgICBwYXJhbTEgPSBDQUxMQkFDS19LRVlcXFxcbiAgICAgICAgcGFyYW0yID0gTVlfUlVMRVxcXFxuICAgICAgICBwYXJhbTMgPSBNWV9UWVBFXFxcXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtMC5kYXRhKSkgcGFyYW0wID0gcGFyYW0wLmRhdGFcXFxcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkobXlDb2xsX2VsLCBwYXJhbTAubWFwKGhpamFja0VsKSlcXFxcbiAgICAgICAgbWV0aG9kX3NldFJlc3VsdC5pbnZva2UoamF2YUNvbnRleHQsIG15Q29sbF9lbCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMylcXFxcbiAgICB9XFxcXG4gICAgc2V0SG9tZVJlc3VsdCA9IHNldFJlc3VsdFxcXFxuICAgIHNldFNlYXJjaFJlc3VsdCA9IHNldFJlc3VsdFxcXFxuXFxcXG4gICAgZXZhbChNWV9SVUxFLmZpbmRfcnVsZS5zbGljZSgzKSlcXFxcbn0gZWxzZSB7XFxcXG4gICAgbGV0IHsgcnVuQ29kZSB9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZnVuY1Rvb2xzP3J1bGU9JyArIFFJTkdfVElUTEUpLFxcXFxuICAgICAgICBbXywgZmluZFJ1bGUsIGRldGFpbEZpbmRSdWxlXSA9IE1ZX1JVTEUuZmluZF9ydWxlLm1hdGNoKC9eKFtcXFxcXFxcXHNcXFxcXFxcXFNdKj8pKD86PT0+KFtcXFxcXFxcXHNcXFxcXFxcXFNdKikpPyQvKVxcXFxuICAgIGZpbmRSdWxlID0gZmluZFJ1bGUuc3BsaXQoJzsnKVxcXFxuICAgIHBhcnNlRG9tRm9yQXJyYXkoZ2V0UmVzQ29kZSgpLCBmaW5kUnVsZS5zaGlmdCgpKS5mb3JFYWNoKChkYXRhKSA9PiB7XFxcXG4gICAgICAgIGxldCBbdGl0bGUsIGltZywgZGVzYywgdXJsXSA9IGZpbmRSdWxlLm1hcCgodiwgaSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmICh2ID09ICcqJykgcmV0dXJuICcnXFxcXG4gICAgICAgICAgICAgICAgICAgIGVsc2UgdiA9IChpID09IDEgfHwgaSA9PSAzKSA/XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZURvbShkYXRhLCB2KSA6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZURvbUZvckh0bWwoZGF0YSwgdilcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gMykgdiA9IHJ1bkNvZGUodilcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZcXFxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IHJldHVybiAnJyB9XFxcXG4gICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgIHJlcyA9IHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUsIHVybDogdXJsLFxcXFxuICAgICAgICAgICAgICAgIGRlc2M6IGRlc2MsIGltZzogaW1nLFxcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBNWV9SVUxFLmNvbF90eXBlXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIGlmIChyZXMudXJsKSB7XFxcXG4gICAgICAgICAgICBpZiAocmVzLnVybC5pbmNsdWRlcygnQGxhenlSdWxlPScpKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHJlSW5kZXggPSByZXMudXJsLmluZGV4T2YoJy5qczonKVxcXFxuICAgICAgICAgICAgICAgIGlmIChyZUluZGV4ID49IDApIHJlcy51cmwgPSByZXMudXJsLnNsaWNlKDAsIHJlSW5kZXgpICsgJy5qczonICsgaGlqYWNrTGF6eVJ1bGUgKyAnOycgKyByZXMudXJsLnNsaWNlKHJlSW5kZXggKyA0KVxcXFxuICAgICAgICAgICAgfSBlbHNlICBpZiAoZGV0YWlsRmluZFJ1bGUpIHtcXFxcbiAgICAgICAgICAgICAgICByZXMuZXh0cmEgPSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogZ2VuRXhVcmwodXJsKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgUlVMRTogYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KE9iamVjdC5hc3NpZ24oZ2VuTXlSdWxlKCksIHsgZGV0YWlsX2ZpbmRfcnVsZTogZGV0YWlsRmluZFJ1bGUgfSkpKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBpc0luZGV4ICYmIHRpdGxlXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHJlcy51cmwgPSAnaGlrZXI6Ly9wYWdlL2ZyYW1lTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFXFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKE1ZX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSkge1xcXFxuICAgICAgICAgICAgICAgIHJlcy5leHRyYSA9IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBnZW5FeFVybCh1cmwpLFxcXFxuICAgICAgICAgICAgICAgICAgICBSVUxFOiBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoZ2VuTXlSdWxlKCkpKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVRpdGxlOiBpc0luZGV4ICYmIHRpdGxlXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHJlcy51cmwgPSAnaGlrZXI6Ly9wYWdlL2ZyYW1lTG9hZD9ydWxlPScgKyBRSU5HX1RJVExFXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbXlDb2xsX2VsLnB1c2gocmVzKVxcXFxuICAgIH0pXFxcXG4gICAgc2V0UmVzdWx0KG15Q29sbF9lbClcXFxcbn1cXFxcblxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuaVsOaNrui9veWFpVxcXCIsXFxcInBhdGhcXFwiOlxcXCJkYXRhTG9hZFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJsZXQgc2hvd0FsbCA9ICQuaW1wb3J0UGFyYW0sXFxcXG4gICAgdXJsID0gZ2V0TXlWYXIoJ3JlbW90ZVVybCcpLFxcXFxuICAgIGRhdGEgPSBbXVxcXFxuaWYgKHVybC5zdGFydHNXaXRoKCdoaWtlcjovLycpIHx8IHVybC5zdGFydHNXaXRoKCdmaWxlOi8vJykpIHtcXFxcbiAgICAvLyDlpoLmnpzkuLrmnKzlnLDmlofku7bliJnkuI3ov5vooYznvJPlrZhcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBsZXQgb3JpRGF0YSA9IGZldGNoKHVybClcXFxcbiAgICAgICAgaWYgKHVybC5zdGFydHNXaXRoKCdoaWtlcjovL3BhZ2UvJykpXFxcXG4gICAgICAgICAgICBvcmlEYXRhID0gSlNPTi5wYXJzZShvcmlEYXRhKS5ydWxlXFxcXG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKG9yaURhdGEpXFxcXG4gICAgfSBjYXRjaCAoZSkge31cXFxcbn0gZWxzZSB7XFxcXG4gICAgLy8g6I635Y+W6L+c56iL5pWw5o2u77yM5qOA5p+l6Ze06ZqU6buY6K6k5LiA5aSpXFxcXG4gICAgbGV0IGludGVydmFsID0gcGFyc2VJbnQocmVhZEZpbGUoJ3VwZGF0ZUludGVydmFsJykgfHwgJzEnKSxcXFxcbiAgICAgICAgb2xkRGF0YSA9IGZldGNoKCdoaWtlcjovL2ZpbGVzL2xpYnMvJyArIG1kNSh1cmwpICsgJy5qcycpLFxcXFxuICAgICAgICByZW1vdGVEYXRhID0gW11cXFxcbiAgICBpZiAoaW50ZXJ2YWwgPT0gMCkgaW50ZXJ2YWwgPSAtMVxcXFxuICAgIHRyeSB7IHJlbW90ZURhdGEgPSBKU09OLnBhcnNlKGZldGNoQ2FjaGUodXJsLCAyNCAqIGludGVydmFsLCB7IHRpbWVvdXQ6IDUwMDAwIH0pKSB9IGNhdGNoIChlKSB7fVxcXFxuICAgIGlmICghQXJyYXkuaXNBcnJheShyZW1vdGVEYXRhKSkgcmVtb3RlRGF0YSA9IFtdXFxcXG4gICAgaWYgKHJlbW90ZURhdGEubGVuZ3RoIDwgMykge1xcXFxuICAgICAgICBsb2coJ+acquiOt+WPluWIsOaVsOaNricpXFxcXG4gICAgICAgIGlmIChvbGREYXRhKSB3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvbGlicy8nICsgbWQ1KHVybCkgKyAnLmpzJywgb2xkRGF0YSlcXFxcbiAgICAgICAgZGF0YSA9IEpTT04ucGFyc2Uob2xkRGF0YSB8fCAnW10nKVxcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIGxvZygn5bey6I635Y+W5Yiw5pWw5o2uJylcXFxcbiAgICAgICAgZGF0YSA9IHJlbW90ZURhdGFcXFxcbiAgICB9XFxcXG59XFxcXG5kYXRhID0gZGF0YS5maWx0ZXIoKHYpID0+IHYudGl0bGUgIT0gZ2V0TXlWYXIoJ215Q29sbGVjdGlvbicpICYmICEodi5hdXRob3IgfHwgJycpLmluY2x1ZGVzKCfpmIXmvKvlkJvnlJ/miJDlmagnKSlcXFxcbmlmIChyZWFkRmlsZSgnZGlzYWJsZUN1c3RvbScpKSAkLmV4cG9ydHMgPSBkYXRhXFxcXG5lbHNlIHsgLy8g5YaZ5YWl6Ieq5a6a5LmJ5pWw5o2uXFxcXG4gICAgbGV0IGN1c3RvbURhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlKCdjdXN0b21EYXRhJykgfHwgJ1tdJyksXFxcXG4gICAgICAgIHJld3JpdGVEYXRhID0gW11cXFxcbiAgICBjdXN0b21EYXRhID0gY3VzdG9tRGF0YS5yZWR1Y2UoKHNlbGYsIHYpID0+IHtcXFxcbiAgICAgICAgbGV0IGluZGV4ID0gZGF0YS5maW5kSW5kZXgoKHZ2KSA9PiB2LnRpdGxlID09IHZ2LnRpdGxlKVxcXFxuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xcXFxuICAgICAgICAgICAgc2VsZi5wdXNoKHYpXFxcXG4gICAgICAgICAgICBsZXQgcnVsZSA9IGRhdGEuc3BsaWNlKGluZGV4LCAxKVswXVxcXFxuICAgICAgICAgICAgaWYgKHNob3dBbGwgfHwgdi52aXNpYmxlKVxcXFxuICAgICAgICAgICAgICAgIHJld3JpdGVEYXRhLnB1c2goT2JqZWN0LmFzc2lnbihydWxlLCB2KSlcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gc2VsZlxcXFxuICAgIH0sIFtdKVxcXFxuICAgIGRhdGEuZm9yRWFjaCgodikgPT4gY3VzdG9tRGF0YS5wdXNoKHsgdGl0bGU6IHYudGl0bGUsIHZpc2libGU6IHRydWUgfSkpXFxcXG4gICAgc2F2ZUZpbGUoJ2N1c3RvbURhdGEnLCBKU09OLnN0cmluZ2lmeShjdXN0b21EYXRhKSlcXFxcbiAgICAkLmV4cG9ydHMgPSByZXdyaXRlRGF0YS5jb25jYXQoZGF0YSlcXFxcbn1cXFxcblxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIumTvuaOpeWkhOeQhipcXFwiLFxcXCJwYXRoXFxcIjpcXFwidXJsUGFyc2VcXFwiLFxcXCJydWxlXFxcIjpcXFwiLy8g6aaW6aG16ZO+5o6l5pu/5o2i5YiG57G7XFxcXG5mdW5jdGlvbiBpbmRleFVybChwYXJhbSkge1xcXFxuICAgIGZ1bmN0aW9uIHJ1bkNvZGUocnVsZSkge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IFtpbnB1dCwgY29kZV0gPSBydWxlLnNwbGl0KCcuanM6JylcXFxcbiAgICAgICAgICAgIHJldHVybiBjb2RlID8gZXZhbChjb2RlKSA6IHJ1bGVcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gcnVsZSB9XFxcXG4gICAgfVxcXFxuICAgIGxldCB7IFJVTEUsIHBhZ2VOdW0sIFFJTkdfVElUTEUgfSA9IEpTT04ucGFyc2UocGFyYW0uc3BsaXQoJyMjIycpWzFdKVxcXFxuICAgIFJVTEUgPSBKU09OLnBhcnNlKGJhc2U2NERlY29kZShSVUxFKSlcXFxcbiAgICBwYWdlTnVtID0gcGFyc2VJbnQocGFnZU51bSlcXFxcbiAgICBsZXQgdXJsID0gUlVMRS51cmxcXFxcblxcXFxuICAgIGV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL0NsYXNzVGFiP3J1bGU9JyArIFFJTkdfVElUTEUpKS5ydWxlKVxcXFxuICAgIHVybCA9IHRhYkhlYWRlci5zZXRVcmwoZnlBbGwgPyB1cmwucmVwbGFjZSgvZnlBbGwvZywgJyQke2Z5QWxsfScpIDogdXJsLnJlcGxhY2UoL2Z5KGNsYXNzfGFyZWF8eWVhcnxzb3J0KS9nLCAnJCR7ZnkkMX0nKSlcXFxcbiAgICB1cmwgPSB1cmwucmVwbGFjZSgvZnlwYWdlKD86QCgtP1xcXFxcXFxcZCspQCk/KD86XFxcXFxcXFwqKFxcXFxcXFxcZCspQCk/L2csIChfLCBzdGFydCwgc3BhY2UpID0+IHBhcnNlSW50KHN0YXJ0IHx8IDApICsgMSArIChwYWdlTnVtIC0gMSkgKiBwYXJzZUludChzcGFjZSB8fCAxKSlcXFxcbiAgICB1cmwgPSAvXihbXFxcXFxcXFxzXFxcXFxcXFxTXSo/KSg/OlxcXFxcXFxcW2ZpcnN0UGFnZT0oW1xcXFxcXFxcc1xcXFxcXFxcU10qPylcXFxcXFxcXF0pPyg/OihcXFxcXFxcXC5qczpbXFxcXFxcXFxzXFxcXFxcXFxTXSo/KSk/JC8uZXhlYyh1cmwpXFxcXG4gICAgaWYgKHBhZ2VOdW0gPT0gMSAmJiB1cmxbMl0pIHVybFsxXSA9IHVybFsyXVxcXFxuICAgIGlmICh1cmxbM10gJiYgIXVybFsxXS5pbmNsdWRlcygnLmpzOicpKSB1cmxbMV0gKz0gdXJsWzNdXFxcXG4gICAgcmV0dXJuIHJ1bkNvZGUodXJsWzFdKVxcXFxufVxcXFxuZnVuY3Rpb24gcGFyYW1IYW5kbGUodXJsUGFyYW0sIHVhLCB1cmxUbXApIHtcXFxcbiAgICBsZXQgY2hhcnNldCwgcGFyYW1UbXBcXFxcbiAgICB0cnkgeyAvLyDpk77mjqXnmoTnvJbnoIHjgIFVQeWSjFJlZmVyZXLlupTor6XmmK/pppblhYjnu6fmib/pppbpobXpk77mjqVcXFxcbiAgICAgICAgWywgLCBjaGFyc2V0LCBwYXJhbVRtcF0gPSB1cmxUbXAuc3BsaXQoJzsnKVxcXFxuICAgICAgICBwYXJhbVRtcCA9IHBhcmFtVG1wLm1hdGNoKC9eeyguKil9JC8pWzFdLnNwbGl0KCcmJicpXFxcXG4gICAgfSBjYXRjaCAoZSkgeyBwYXJhbVRtcCA9IFtdIH1cXFxcbiAgICBsZXQgVXNlckFnZW50ID0gcGFyYW1UbXAuZmluZCgodikgPT4gdi5zdGFydHNXaXRoKCdVc2VyLUFnZW50QCcpKSxcXFxcbiAgICAgICAgUmVmZXJlciA9IHBhcmFtVG1wLmZpbmQoKHYpID0+IHYuc3RhcnRzV2l0aCgnUmVmZXJlckAnKSlcXFxcbiAgICB1cmxQYXJhbVswXSA9IHVybFBhcmFtWzBdIHx8ICdHRVQnXFxcXG4gICAgdXJsUGFyYW1bMV0gPSB1cmxQYXJhbVsxXSB8fCBjaGFyc2V0IHx8ICdVVEYtOCdcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICB1cmxQYXJhbVsyXSA9IHVybFBhcmFtWzJdLm1hdGNoKC9eeyguKil9JC8pWzFdLnNwbGl0KCcmJicpXFxcXG4gICAgfSBjYXRjaCAoZSkgeyB1cmxQYXJhbVsyXSA9IFtdIH1cXFxcbiAgICAvLyDmt7vliqDlhajlsYBVQeWSjOS4iue6p1JlZmVyZXJcXFxcbiAgICBpZiAoIXVybFBhcmFtWzJdLnNvbWUoKHYpID0+IHYuc3RhcnRzV2l0aCgnVXNlci1BZ2VudEAnKSkpIHtcXFxcbiAgICAgICAgaWYgKFVzZXJBZ2VudCkgdXJsUGFyYW1bMl0ucHVzaChVc2VyQWdlbnQpXFxcXG4gICAgICAgIGVsc2UgaWYgKHVhID09ICdwYycpXFxcXG4gICAgICAgICAgICB1cmxQYXJhbVsyXS5wdXNoKCdVc2VyLUFnZW50QCcgKyBQQ19VQS5yZXBsYWNlKC87L2csICfvvJvvvJsnKS5yZXBsYWNlKC9cXFxcXFxcXD8vLCAn77yf77yfJykpXFxcXG4gICAgICAgIGVsc2UgaWYgKHVhID09ICdtb2JpbGUnKVxcXFxuICAgICAgICAgICAgdXJsUGFyYW1bMl0ucHVzaCgnVXNlci1BZ2VudEAnICsgTU9CSUxFX1VBLnJlcGxhY2UoLzsvZywgJ++8m++8mycpLnJlcGxhY2UoL1xcXFxcXFxcPy8sICfvvJ/vvJ8nKSlcXFxcbiAgICB9XFxcXG4gICAgaWYgKFJlZmVyZXIgJiYgIXVybFBhcmFtWzJdLnNvbWUoKHYpID0+IHYuc3RhcnRzV2l0aCgnUmVmZXJlckAnKSkpXFxcXG4gICAgICAgIHVybFBhcmFtWzJdLnB1c2goUmVmZXJlcilcXFxcbiAgICB1cmxQYXJhbVsyXSA9ICd7JyArIHVybFBhcmFtWzJdLmpvaW4oJyYmJykgKyAnfSdcXFxcbiAgICByZXR1cm4gdXJsUGFyYW0uam9pbignOycpXFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5LqM57qnW+S4gF0qXFxcIixcXFwicGF0aFxcXCI6XFxcImVqdG9vbFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJmdW5jdGlvbiBjb3ZlcijmoIfpopgsIOS9nOiAhSwg5YiG57G7LCDnirbmgIEsIOeroOiKgiwg5pu05pawLCDnroDku4ss5bCB6Z2i5Zu+54mHLHRydWVfdXJsLCBoYXNMaW5lKSB7XFxcXHJcXFxcbnZhciDmoIfpopgsIOS9nOiAhSwg5YiG57G7LCDnirbmgIEsIOeroOiKgiwg5pu05pawLCDnroDku4ss5bCB6Z2i5Zu+54mHLHRydWVfdXJsLCBoYXNMaW5lO1xcXFxyXFxcXG5cXFxcdHRyeSB7XFxcXHJcXFxcblxcXFx0XFxcXHRkLnB1c2goe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHR0aXRsZTogJ+KAmOKAmOKAmeKAmTxzbWFsbD48Zm9udCBjb2xvcj1cXFxcXFxcIiNGQTcyOThcXFxcXFxcIj4nK+S9nOiAhS5zbGljZSgwLDE1KStcXFxcXFxcIiZuYnNwO1xcXFxcXFwiK+eKtuaAgSsnPC9mb250Pjwvc21hbGw+Jysn4oCY4oCY4oCZ4oCZPHNtYWxsPjxmb250IGNvbG9yPVxcXFxcXFwiI0IxNUJGRlxcXFxcXFwiPicrXFxcXFxcXCJcXFxcXFxcXG5cXFxcXFxcIivliIbnsbsrJzwvZm9udD48L3NtYWxsPicrJ+KAmOKAmOKAmeKAmTxzbWFsbD48Zm9udCBjb2xvcj1cXFxcXFxcIiNGRjM1OUFcXFxcXFxcIj4nK1xcXFxcXFwiXFxcXFxcXFxuXFxcXFxcXCIr56ug6IqCK1xcXFxcXFwiJm5ic3A7XFxcXFxcXCIr5pu05pawKyc8L2ZvbnQ+PC9zbWFsbD4nLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRkZXNjOifigJjigJjigJnigJk8c21hbGw+JyAr566A5LuLKyAnPC9zbWFsbD4nLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRwaWNfdXJsOiAg5bCB6Z2i5Zu+54mHLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHR1cmw6IHRydWVfdXJsLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRjb2xfdHlwZTogJ21vdmllXzFfdmVydGljYWxfcGljX2JsdXInXFxcXHJcXFxcblxcXFx0XFxcXHR9KTtcXFxcblxcXFx0XFxcXHRkLnB1c2goe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRjb2xfdHlwZTogJ2xpbmVfYmxhbmsnLFxcXFxyXFxcXG5cXFxcdFxcXFx0fSk7XFxcXG5cXFxcdFxcXFx0ZC5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Y29sX3R5cGU6ICdsaW5lJyxcXFxcclxcXFxuXFxcXHRcXFxcdH0pO1xcXFxyXFxcXG5cXFxcdFxcXFx0aWYgKGhhc0xpbmUpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0aXRlbS5leHRyYSA9IHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRsaW5lVmlzaWJsZTogZmFsc2VcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0fVxcXFxyXFxcXG5cXFxcdFxcXFx0fVxcXFxyXFxcXG5cXFxcdFxcXFx0ZC5wdXNoKGl0ZW0pO1xcXFxyXFxcXG5cXFxcdH0gY2F0Y2ggKGUpIHt9XFxcXHJcXFxcbn1cXFxcclxcXFxuZnVuY3Rpb24gY2hhcHRlcih0aXRsZSxwaWNfdXJsLGNoYXB0ZXJMaXN0LCBjaGFwdGVyVGl0bGUsIGNoYXB0ZXJVcmwsIGRlZmF1bHRPcmRlciwgaGFzTGluZSxkb3dubG9hZGxhenkpIHtcXFxcclxcXFxuXFxcXHR2YXIgbGlzdCA9IGNoYXB0ZXJMaXN0O1xcXFxyXFxcXG5cXFxcdHZhciBvcmlnaW5hbCA9IFt7XFxcXHJcXFxcblxcXFx0XFxcXHR1cmw6IE1ZX1VSTCxcXFxcclxcXFxuXFxcXHRcXFxcdG9yZGVyOiBkZWZhdWx0T3JkZXJcXFxcclxcXFxuXFxcXHR9XTtcXFxcclxcXFxuXFxcXHQhZmlsZUV4aXN0KCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycpID8gKHdyaXRlRmlsZSgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnLCBKU09OLnN0cmluZ2lmeShvcmlnaW5hbCkpKSA6IDA7XFxcXHJcXFxcblxcXFx0dmFyIGxvZyA9IEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJykpO1xcXFxyXFxcXG5cXFxcdGZvciAodmFyIGkgaW4gbG9nKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRpZiAobG9nW2ldLnVybCA9PSBNWV9VUkwpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0dmFyIG5vdyA9IGk7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdHZhciBvcmRlciA9IGxvZ1tpXS5vcmRlcjtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0YnJlYWs7XFxcXHJcXFxcblxcXFx0XFxcXHR9IGVsc2Uge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHR2YXIgbm93ID0gJyc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdHZhciBvcmRlciA9IGRlZmF1bHRPcmRlcjtcXFxcclxcXFxuXFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHR9XFxcXHJcXFxcblxcXFx0bGV0IG9yZGVySXRlbSA9IHtcXFxcclxcXFxuXFxcXHRcXFxcdHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgJzxzdHJvbmc+PGZvbnQgY29sb3I9XFxcXFxcXCIjMDk4QUMxXFxcXFxcXCI+JyArICfnq6DoioLmjpLluo/ih4UnICsgJzwvZm9udD48L3N0cm9uZz4nLFxcXFxyXFxcXG5cXFxcdFxcXFx0dXJsOiBNWV9VUkwgKyBgQGxhenlSdWxlPS5qczp2YXIgbG9nID0gSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnKSk7dmFyIG5vdz0nYCArIG5vdyArIGAnO2lmKG5vdyE9Jycpe3ZhciBub3c9cGFyc2VJbnQobm93KTt2YXIgb3JkZXI9bG9nW25vd10ub3JkZXJ9ZWxzZXt2YXIgbm93PXBhcnNlSW50KGxvZy5sZW5ndGgpO3ZhciBvcmRlcj1gICsgZGVmYXVsdE9yZGVyICsgYDtsb2cucHVzaCh7dXJsOmlucHV0LG9yZGVyOm9yZGVyfSk7fWlmKGxvZ1tub3ddLm9yZGVyKXtsb2dbbm93XS5vcmRlcj0wO31lbHNle2xvZ1tub3ddLm9yZGVyPTE7fTt3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJywgSlNPTi5zdHJpbmdpZnkobG9nKSk7cmVmcmVzaFBhZ2UoKTsnaGlrZXI6Ly9lbXB0eSdgLFxcXFxyXFxcXG5cXFxcdFxcXFx0Y29sX3R5cGU6ICd0ZXh0XzInXFxcXHJcXFxcblxcXFx0fVxcXFxyXFxcXG5cXFxcdGlmIChoYXNMaW5lKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRvcmRlckl0ZW0udGl0bGUgPSBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgJzxzdHJvbmc+PGZvbnQgY29sb3I9XFxcXFxcXCIjMDk4QUMxXFxcXFxcXCI+JyArICfpm4bmlbDmjpLluo/ih4UnICsgJzwvZm9udD48L3N0cm9uZz4nO1xcXFxyXFxcXG5cXFxcdFxcXFx0b3JkZXJJdGVtLmNvbF90eXBlID0gXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIlxcXFxyXFxcXG5cXFxcdH1cXFxcclxcXFxuXFxcXHRsZXQgY2hhcHRlckxpc3RzID0gbGlzdC5tYXAoKGl0ZW0pPT4oe1xcXFxyXFxcXG5cXFxcdFxcXFx0dGl0bGU6IHBkZmgoaXRlbSxcXFxcXFxcImEmJlRleHRcXFxcXFxcIiksXFxcXHJcXFxcblxcXFx0XFxcXHR1cmw6IHBkKGl0ZW0sXFxcXFxcXCJhJiZocmVmXFxcXFxcXCIpLFxcXFxyXFxcXG5cXFxcdH0pKTtcXFxcclxcXFxuZC5wdXNoKHtcXFxcclxcXFxuXFxcXHR0aXRsZTogJ+KAmOKAmOKAmeKAmTxzdHJvbmc+PGZvbnQgY29sb3I9IFxcXFxcXFwiIzA5OEFDMVxcXFxcXFwiPicgKyBcXFxcXFxcIuS4i+i9vea8q+eUu1xcXFxcXFwiICsgJzwvZnJvbnQ+PC9zdHJvbmc+JyxcXFxcclxcXFxuXFxcXHR1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2Rvd25sb2FkLnZpZXcjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjI25vUmVmcmVzaCM/cnVsZT3mnKzlnLDotYTmupDnrqHnkIZcXFxcXFxcIixcXFxcclxcXFxuXFxcXHRjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIixcXFxcclxcXFxuXFxcXHRleHRyYToge1xcXFxyXFxcXG5cXFxcdFxcXFx0Y2hhcHRlckxpc3Q6IGNoYXB0ZXJMaXN0cyxcXFxcclxcXFxuXFxcXHRcXFxcdGluZm86e1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRib29rTmFtZTogdGl0bGUsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdHJ1bGVOYW1lOiBNWV9SVUxFLnRpdGxlLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRib29rVG9wUGljOiBwaWNfdXJsLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRwYXJzZUNvZGU6IGRvd25sb2FkbGF6eVxcXFxyXFxcXG5cXFxcdFxcXFx0fSxcXFxcclxcXFxuXFxcXHRcXFxcdGRlZmF1bHRWaWV3OlxcXFxcXFwiMVxcXFxcXFwiXFxcXHJcXFxcblxcXFx0fVxcXFxyXFxcXG59KTtcXFxcclxcXFxuXFxcXHRkLnB1c2goe1xcXFxyXFxcXG5cXFxcdFxcXFx0dGl0bGU6ICfigJjigJjigJnigJk8c3Ryb25nPjxmb250IGNvbG9yPSBcXFxcXFxcIiMwOThBQzFcXFxcXFxcIj4nICsgXFxcXFxcXCLmnKzlnLDkuabmnrZcXFxcXFxcIiArICc8L2Zyb250Pjwvc3Ryb25nPicsXFxcXHJcXFxcblxcXFx0XFxcXHR1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL01haW4udmlldz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhlxcXFxcXFwiLFxcXFxyXFxcXG5cXFxcdFxcXFx0Y29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCIsXFxcXHJcXFxcblxcXFx0fSk7ICBcXFxcclxcXFxuXFxcXHRkLnB1c2gob3JkZXJJdGVtKTtcXFxcclxcXFxuXFxcXHRkLnB1c2goe2NvbF90eXBlOiAnbGluZSd9KTtcXFxcdFxcXFxyXFxcXG5cXFxcdHZhciBsaXN0ID0gb3JkZXIgPyBsaXN0IDogbGlzdC5yZXZlcnNlKCk7XFxcXG5cXFxcdGlmKCFsaXN0fHxsaXN0PT1cXFxcXFxcIlxcXFxcXFwiKXtcXFxcclxcXFxuXFxcXHRcXFxcdGQucHVzaCh7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdHRpdGxlOiAn5q2k5ryr55S75bey5LiL5p62ISEnLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcXFxyXFxcXG5cXFxcdFxcXFx0fSk7XFxcXHJcXFxcblxcXFx0fVxcXFxyXFxcXG5cXFxcdGZvciAodmFyIGkgaW4gbGlzdCkge1xcXFxyXFxcXG5cXFxcdFxcXFx0dHJ5IHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0ZC5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHR0aXRsZTogcGRmaChsaXN0W2ldLCBjaGFwdGVyVGl0bGUpLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdHVybDogcGQobGlzdFtpXSwgY2hhcHRlclVybCkgKyBsYXp5LFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdGNvbF90eXBlOiAndGV4dF8yJyxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0fSk7XFxcXHJcXFxcblxcXFx0XFxcXHR9Y2F0Y2ggKGUpIHt9XFxcXHJcXFxcblxcXFx0fVxcXFxyXFxcXG59XFxcXHJcXFxcblxcXFxyXFxcXG5mdW5jdGlvbiBsaW5lKGxpbmVMaXN0LCBsaW5lVGl0bGVSdWxlLCB2YXJLZXkpIHtcXFxcclxcXFxuXFxcXHRsZXQgbGlzdCA9IGxpbmVMaXN0XFxcXHJcXFxcblxcXFx0dmFyS2V5ID0gdmFyS2V5ID09IG51bGwgPyAoTVlfUlVMRS51cmwgKyAnI2xpbmUtaW5kZXgnKTogdmFyS2V5O1xcXFxyXFxcXG5cXFxcdGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoa2V5TGlzdCkgPT4ge1xcXFxyXFxcXG5cXFxcdFxcXFx0Zm9yIChsZXQgaSBpbiBrZXlMaXN0KSB7Y2xlYXJWYXIoa2V5TGlzdFtpXSl9XFxcXHJcXFxcblxcXFx0fSwgW3ZhcktleSwgTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZSddKSlcXFxcclxcXFxuXFxcXHRsZXQgbGluZTBUaXRsZSA9ICcnO1xcXFxyXFxcXG5cXFxcdHRyeSB7XFxcXHJcXFxcblxcXFx0XFxcXHRsaW5lMFRpdGxlID0gcGRmaChsaXN0WzBdLCBsaW5lVGl0bGVSdWxlKS5yZXBsYWNlKFxcXFxcXFwi56ug6IqC5YiX6KGo77yaXFxcXFxcXCIsXFxcXFxcXCJcXFxcXFxcIik7XFxcXHJcXFxcblxcXFx0fSBjYXRjaCAoZSkge31cXFxcclxcXFxuXFxcXHRsb2coTVlfUlVMRS50aXRsZSArIGdldE15VmFyKChNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJykpKVxcXFxyXFxcXG5cXFxcdGZvciAobGV0IGkgaW4gbGlzdCkge1xcXFxyXFxcXG5cXFxcdFxcXFx0dHJ5IHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0bGV0IGxpbmVUaXRsZSA9IHBkZmgobGlzdFtpXSwgbGluZVRpdGxlUnVsZSkucmVwbGFjZShcXFxcXFxcIueroOiKguWIl+ihqO+8mlxcXFxcXFwiLFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRkLnB1c2goe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdHRpdGxlOiBnZXRNeVZhcigoTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZScpLCBsaW5lMFRpdGxlKSA9PT0gbGluZVRpdGxlID8gXFxcXFxcXCLliIfmjaI64oCY4oCYXFxcXFxcXCIgKyBsaW5lVGl0bGUrXFxcXFxcXCJcXFxcXFxcIjpsaW5lVGl0bGUrXFxcXFxcXCLigJjigJg65YiH5o2iXFxcXFxcXCIsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0dXJsOiAkKCkubGF6eVJ1bGUoKHZhcktleSwgbGluZUluZGV4LCBsaW5lVGl0bGUpID0+IHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdHB1dE15VmFyKHZhcktleSwgbGluZUluZGV4LnRvU3RyaW5nKCkpO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0cHV0TXlWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSwgbGluZVRpdGxlKTtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdGxvZyhNWV9SVUxFLnRpdGxlICsgZ2V0TXlWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSkpO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx0cmVmcmVzaFBhZ2UoKTtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey5YiH5o2i6IezXFxcXFxcXCIgKyBsaW5lVGl0bGU7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0fSwgdmFyS2V5LCBpLCBsaW5lVGl0bGUpLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdGNvbF90eXBlOiAndGV4dF8yJyxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0fSk7XFxcXHJcXFxcblxcXFx0XFxcXHR9IGNhdGNoIChlKSB7fVxcXFxyXFxcXG5cXFxcdH1cXFxcclxcXFxufVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuS6jOe6p1vkuoxdKlxcXCIsXFxcInBhdGhcXFwiOlxcXCJjb21pY0Z1bmN0aW9uRmlsZS5qc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJmdW5jdGlvbiBjb3Zlcihjb3ZlclRpdGxlLCBjb3ZlclRpdGxlMSwgY292ZXJUaXRsZTIsIGNvdmVyVGl0bGUzLCBjb3ZlckRlc2MsIGNvdmVyUGljLCBjb3ZlclVybCwgaGFzTGluZSkge1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGNvbnN0IENvbG9yID0gXFxcXFxcXCIjMTlCODlEXFxcXFxcXCI7XFxcXG4gICAgICAgIHZhciBkZXNfZGVzYyA9IHBkZmgoaHRtbCwgY292ZXJEZXNjKS5yZXBsYWNlKCfnroDjgIDjgIDku4vvvJonLCAnJykucmVwbGFjZSgn5ryr55S7566A5LuL77yaJywgJycpO1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6ICfigJjigJjigJnigJk8Pjxmb250IGNvbG9yPVxcXFxcXFwiI0ZBNzI5OFxcXFxcXFwiPicgKyBwZGZoKGh0bWwsIGNvdmVyVGl0bGUpICsgJ1xcXFxcXFxcbicgKyAn4oCY4oCY4oCZ4oCZPD48Zm9udCBjb2xvcj1cXFxcXFxcIiM3MzQzMzhcXFxcXFxcIj4nICsgcGRmaChodG1sLCBjb3ZlclRpdGxlMSkgKyAnXFxcXFxcXFxuJyxcXFxcbiAgICAgICAgICAgIGRlc2M6ICfigJjigJjigJnigJk8Pjxmb250IGNvbG9yPVxcXFxcXFwiIzk1NEE0NVxcXFxcXFwiPicgKyBwZGZoKGh0bWwsIGNvdmVyVGl0bGUyKSArICdcXFxcXFxcXG4nICsgJ+KAmOKAmOKAmeKAmTw+PGZvbnQgY29sb3I9XFxcXFxcXCIjOTU0QTQ1XFxcXFxcXCI+JyArIHBkZmgoaHRtbCwgY292ZXJUaXRsZTMpLFxcXFxuICAgICAgICAgICAgcGljX3VybDogcGQoaHRtbCwgY292ZXJQaWMpfHxjb3ZlclBpYyxcXFxcbiAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vc2VhcmNoP3M9JytNWV9QQVJBTVMueXRpdGxlKycmcnVsZT3pmIXmvKvlkJsnLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpY19ibHVyJ1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnbGluZSdcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIC8vdmFyIGpqID0gZ2V0TXlWYXIoXFxcXFxcXCJqanNcXFxcXFxcIiwgXFxcXFxcXCLmlLbotbdcXFxcXFxcIik7XFxcXG4gICAgICAgIC8vdmFyIGpqdXJsID0gJ2hpa2VyOi8vZW1wdHlAbGF6eVJ1bGU9LmpzOmdldE15VmFyKFxcXFxcXFwiampzXFxcXFxcXCIpID09IFxcXFxcXFwi5pS26LW3XFxcXFxcXCI/cHV0TXlWYXIoXFxcXFxcXCJqanNcXFxcXFxcIixcXFxcXFxcIuWxleW8gFxcXFxcXFwiKTpwdXRNeVZhcihcXFxcXFxcImpqc1xcXFxcXFwiLFxcXFxcXFwi5pS26LW3XFxcXFxcXCIpO1xcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiJztcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiAn566A5LuLIDxzbWFsbD48c21hbGw+PHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjojMTlCODlEXFxcXFxcXCI+5bGV5byAPjwvc3Bhbj48L3NtYWxsPjwvc21hbGw+JyxcXFxcbiAgICAgICAgICAgIGltZzogXFxcXFxcXCJodHRwczovL2xhbm1laWd1b2ppYW5nLmNvbS90dWJpYW8vbW9yZS8xOTcucG5nXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgoamppZCwgZGVjaWQsIGRlc19kZXNjKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgaWYgKGdldE15VmFyKFxcXFxcXFwiampzXFxcXFxcXCIsIFxcXFxcXFwi5pS26LW3XFxcXFxcXCIpID09IFxcXFxcXFwi5pS26LW3XFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJqanNcXFxcXFxcIiwgXFxcXFxcXCLlsZXlvIBcXFxcXFxcIik7XFxcXG5cXFxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBqamlkXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICfnroDku4sgPHNtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiMxOUI4OURcXFxcXFxcIj7mlLbotbc+PC9zcGFuPjwvc21hbGw+PC9zbWFsbD4nXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxcXG5cXFxcbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTaXplOiAxNCxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogMyxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogZGVjaWRcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJzxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6IzgwODA4MFxcXFxcXFwiPicgKyBkZXNfZGVzYyArICcuLi48L3NwYW4+J1xcXFxuICAgICAgICAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihcXFxcXFxcImpqc1xcXFxcXFwiLCBcXFxcXFxcIuaUtui1t1xcXFxcXFwiKTtcXFxcblxcXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGpqaWRcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ+eugOS7iyA8c21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6IzE5Qjg5RFxcXFxcXFwiPuWxleW8gD48L3NwYW4+PC9zbWFsbD48L3NtYWxsPidcXFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXFxcblxcXFxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFNpemU6IDE0LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVTcGFjaW5nOiAzLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBkZWNpZFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnPHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjojODA4MDgwXFxcXFxcXCI+JyArIGRlc19kZXNjLnN1YnN0cigwLCAzMCkgKyAnLi4uPC9zcGFuPidcXFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICB9LCBNWV9SVUxFICsgXFxcXFxcXCJfamppZFxcXFxcXFwiLCBNWV9SVUxFICsgXFxcXFxcXCJfZGVjaWRcXFxcXFxcIiwgZGVzX2Rlc2MpLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGlkOiBNWV9SVUxFICsgXFxcXFxcXCJfamppZFxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuXFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJzxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6IzgwODA4MFxcXFxcXFwiPicgKyBkZXNfZGVzYy5zdWJzdHIoMCwgMzApICsgJy4uLjwvc3Bhbj4nLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwicmljaF90ZXh0XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIHRleHRTaXplOiAxNCxcXFxcbiAgICAgICAgICAgICAgICBsaW5lU3BhY2luZzogMyxcXFxcbiAgICAgICAgICAgICAgICBpZDogTVlfUlVMRSArIFxcXFxcXFwiX2RlY2lkXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxcXG4gICAgICAgIH0pXFxcXG4gICAgfSBjYXRjaCAoZSkge31cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZG93bihUaXRsZSwgY2hhcHRlclBpYywgbGlzdCwgY2hhcHRlclRpdGxlLCBjaGFwdGVyTGluZSwgZG93bmxvYWRsYXp5KSB7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgbGV0IGRvTGlzdCA9IGxpc3QubWFwKChpdGVtKSA9PiAoe1xcXFxuICAgICAgICAgICAgdGl0bGU6IHBkZmgoaXRlbSwgY2hhcHRlclRpdGxlKSxcXFxcbiAgICAgICAgICAgIHVybDogcGQoaXRlbSwgY2hhcHRlckxpbmUpLFxcXFxuICAgICAgICB9KSk7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxiPjxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6ICMxYWFkMTlcXFxcXFxcIj7kuIvovb3mvKvnlLvwn5S5PC9zcGFuPjwvYj4nLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9kb3dubG9hZC52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9SZWZyZXNoIz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBjaGFwdGVyTGlzdDogZG9MaXN0LFxcXFxuICAgICAgICAgICAgICAgIGluZm86IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgYm9va05hbWU6IHBkZmgoaHRtbCwgVGl0bGUpLFxcXFxuICAgICAgICAgICAgICAgICAgICBydWxlTmFtZTogTVlfUlVMRS50aXRsZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgYm9va1RvcFBpYzogcGQoaHRtbCwgY2hhcHRlclBpYyksXFxcXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlQ29kZTogZG93bmxvYWRsYXp5XFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICBkZWZhdWx0VmlldzogXFxcXFxcXCIxXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGNoYXB0ZXIoY2hhcHRlckxpc3QsIGNoYXB0ZXJUaXRsZSwgY2hhcHRlclVybCwgZGVmYXVsdE9yZGVyLCBoYXNMaW5lKSB7XFxcXG4gICAgdmFyIGxpc3QgPSBjaGFwdGVyTGlzdDtcXFxcbiAgICB2YXIgb3JpZ2luYWwgPSBbe1xcXFxuICAgICAgICB1cmw6IE1ZX1VSTCxcXFxcbiAgICAgICAgb3JkZXI6IGRlZmF1bHRPcmRlclxcXFxuICAgIH1dO1xcXFxuICAgICFmaWxlRXhpc3QoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJykgPyAod3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL3J1bGVzL2NvbWljL2NvbWljTG9nRmlsZS5qcycsIEpTT04uc3RyaW5naWZ5KG9yaWdpbmFsKSkpIDogMDtcXFxcbiAgICB2YXIgbG9nID0gSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnKSk7XFxcXG4gICAgZm9yICh2YXIgaSBpbiBsb2cpIHtcXFxcbiAgICAgICAgaWYgKGxvZ1tpXS51cmwgPT0gTVlfVVJMKSB7XFxcXG4gICAgICAgICAgICB2YXIgbm93ID0gaTtcXFxcbiAgICAgICAgICAgIHZhciBvcmRlciA9IGxvZ1tpXS5vcmRlcjtcXFxcbiAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgdmFyIG5vdyA9ICcnO1xcXFxuICAgICAgICAgICAgdmFyIG9yZGVyID0gZGVmYXVsdE9yZGVyO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGxldCBvcmRlckl0ZW0gPSB7XFxcXG4gICAgICAgIHRpdGxlOiBcXFxcXFxcIuKAnOKAnOKAneKAnVxcXFxcXFwiICsgJzxmb250IGNvbG9yPVxcXFxcXFwiI2YzNzMzNVxcXFxcXFwiPicgKyAn56ug6IqC5o6S5bqP4oeFJyArICc8L2ZvbnQ+JyxcXFxcbiAgICAgICAgdXJsOiBNWV9VUkwgKyBgQGxhenlSdWxlPS5qczp2YXIgbG9nID0gSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9maWxlcy9ydWxlcy9jb21pYy9jb21pY0xvZ0ZpbGUuanMnKSk7dmFyIG5vdz0nYCArIG5vdyArIGAnO2lmKG5vdyE9Jycpe3ZhciBub3c9cGFyc2VJbnQobm93KTt2YXIgb3JkZXI9bG9nW25vd10ub3JkZXJ9ZWxzZXt2YXIgbm93PXBhcnNlSW50KGxvZy5sZW5ndGgpO3ZhciBvcmRlcj1gICsgZGVmYXVsdE9yZGVyICsgYDtsb2cucHVzaCh7dXJsOmlucHV0LG9yZGVyOm9yZGVyfSk7fWlmKGxvZ1tub3ddLm9yZGVyKXtsb2dbbm93XS5vcmRlcj0wO31lbHNle2xvZ1tub3ddLm9yZGVyPTE7fTt3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvcnVsZXMvY29taWMvY29taWNMb2dGaWxlLmpzJywgSlNPTi5zdHJpbmdpZnkobG9nKSk7cmVmcmVzaFBhZ2UoKTsnaGlrZXI6Ly9lbXB0eSdgLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxcXG4gICAgfVxcXFxuICAgIGlmIChoYXNMaW5lKSB7XFxcXG4gICAgICAgIG9yZGVySXRlbS50aXRsZSA9IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyAnPGZvbnQgY29sb3I9XFxcXFxcXCIjZjM3MzM1XFxcXFxcXCI+JyArICfpm4bmlbDmjpLluo/ih4UnICsgJzwvZm9udD4nO1xcXFxuICAgICAgICBvcmRlckl0ZW0uY29sX3R5cGUgPSBcXFxcXFxcInRleHRfY2VudGVyXzFcXFxcXFxcIlxcXFxuICAgIH1cXFxcbiAgICBkLnB1c2gob3JkZXJJdGVtKTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogJ2xpbmUnXFxcXG4gICAgfSk7XFxcXG5cXFxcbiAgICB2YXIgbGlzdCA9IG9yZGVyID8gbGlzdCA6IGxpc3QucmV2ZXJzZSgpO1xcXFxuICAgIGZvciAobGV0IGkgaW4gbGlzdCkge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+KAnOKAnOKAneKAnTxzbWFsbD4nICsgcGRmaChsaXN0W2ldLCBjaGFwdGVyVGl0bGUpICsgJzwvc21hbGw+JyxcXFxcbiAgICAgICAgICAgICAgICB1cmw6IHBkKGxpc3RbaV0sIGNoYXB0ZXJVcmwpICsgbGF6eSxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfMicsXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBjYXRjaCAoZSkge31cXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGxpbmUobGluZUxpc3QsIGxpbmVUaXRsZVJ1bGUsIHZhcktleSkge1xcXFxuICAgIGxldCBsaXN0ID0gbGluZUxpc3RcXFxcbiAgICB2YXJLZXkgPSB2YXJLZXkgPT0gbnVsbCA/IChNWV9SVUxFLnVybCArICcjbGluZS1pbmRleCcpIDogdmFyS2V5O1xcXFxuICAgIGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoa2V5TGlzdCkgPT4ge1xcXFxuICAgICAgICBmb3IgKGxldCBpIGluIGtleUxpc3QpIHtcXFxcbiAgICAgICAgICAgIGNsZWFyVmFyKGtleUxpc3RbaV0pXFxcXG4gICAgICAgIH1cXFxcblxcXFxuICAgIH0sIFt2YXJLZXksIE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnXSkpXFxcXG4gICAgbGV0IGxpbmUwVGl0bGUgPSAnJ1xcXFxuICAgIHRyeSB7XFxcXG4gICAgICAgIGxpbmUwVGl0bGUgPSBwZGZoKGxpc3RbMF0sIGxpbmVUaXRsZVJ1bGUpO1xcXFxuICAgIH0gY2F0Y2ggKGUpIHt9XFxcXG4gICAgbG9nKE1ZX1JVTEUudGl0bGUgKyBnZXRNeVZhcigoTVlfUlVMRS50aXRsZSArICcjbGluZS10aXRsZScpKSlcXFxcbiAgICBmb3IgKGxldCBpIGluIGxpc3QpIHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCBsaW5lVGl0bGUgPSBwZGZoKGxpc3RbaV0sIGxpbmVUaXRsZVJ1bGUpO1xcXFxuICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogZ2V0TXlWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSwgbGluZTBUaXRsZSkgPT09IGxpbmVUaXRsZSA/IFxcXFxcXFwi5YiH5o2iOuKAmOKAmFxcXFxcXFwiICsgbGluZVRpdGxlICsgXFxcXFxcXCJcXFxcXFxcIiA6IGxpbmVUaXRsZSArIFxcXFxcXFwi4oCY4oCYOuWIh+aNolxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKCh2YXJLZXksIGxpbmVJbmRleCwgbGluZVRpdGxlKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKHZhcktleSwgbGluZUluZGV4LnRvU3RyaW5nKCkpXFxcXG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZyhNWV9SVUxFLnVybClcXFxcbiAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIoKE1ZX1JVTEUudGl0bGUgKyAnI2xpbmUtdGl0bGUnKSwgbGluZVRpdGxlKVxcXFxuICAgICAgICAgICAgICAgICAgICBsb2coTVlfUlVMRS50aXRsZSArIGdldE15VmFyKChNWV9SVUxFLnRpdGxlICsgJyNsaW5lLXRpdGxlJykpKVxcXFxuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpXFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5bey5YiH5o2i6IezXFxcXFxcXCIgKyBsaW5lVGl0bGVcXFxcbiAgICAgICAgICAgICAgICB9LCB2YXJLZXksIGksIGxpbmVUaXRsZSksXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICdmbGV4X2J1dHRvbidcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgIH1cXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAnbGluZSdcXFxcbiAgICAgICAgICAgIH0pO1xcXFxufVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuWKqOaAgVvkuoxdKlxcXCIsXFxcInBhdGhcXFwiOlxcXCJkdGZsXFxcIixcXFwicnVsZVxcXCI6XFxcImNvbnN0IGVtcHR5ID0gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcblxcXFxuaWYgKHR5cGVvZijmi7zmjqXliIbnsbspICE9ICd1bmRlZmluZWQnICYmIOaLvOaOpeWIhuexuyAhPSAnJykge1xcXFxuICAgIHZhciBjYXRlZ29yaWVzID0gcGRmYShodG1sLCDlpKfnsbvlrprkvY0pLmNvbmNhdChwZGZhKGh0bWwsIOaLvOaOpeWIhuexuykpXFxcXG59IGVsc2Uge1xcXFxuICAgIHZhciBjYXRlZ29yaWVzID0gcGRmYShodG1sLCDlpKfnsbvlrprkvY0pXFxcXG59XFxcXG5cXFxcbmxldCBpbml0X2NhdGUgPSBbXVxcXFxuXFxcXG5mb3IgKGxldCBpID0gMDsgaSA8IDIwOyBpKyspIHtcXFxcbiAgICBpbml0X2NhdGUucHVzaChcXFxcXFxcIjBcXFxcXFxcIilcXFxcbn1cXFxcblxcXFxuY29uc3QgZm9sZCA9IGdldE15VmFyKE1ZX1JVTEUuZ3JvdXAsIFxcXFxcXFwiMFxcXFxcXFwiKVxcXFxuY29uc3QgY2F0ZV90ZW1wX2pzb24gPSBnZXRNeVZhcihNWV9SVUxFLnRpdGxlLCBKU09OLnN0cmluZ2lmeShpbml0X2NhdGUpKVxcXFxuY29uc3QgY2F0ZV90ZW1wID0gSlNPTi5wYXJzZShjYXRlX3RlbXBfanNvbilcXFxcblxcXFxuaWYgKHBhcnNlSW50KHBhZ2UpID09PSAxKSB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGZvbGQgPT09ICcxJyA/ICfigJzigJzigJ3igJ08Yj4nICsgJ+KIqCcuZm9udGNvbG9yKFxcXFxcXFwiI0ZGMDAwMFxcXFxcXFwiKSArICc8L2I+JyA6ICfigJzigJzigJ3igJ08Yj4nICsgJ+KIpycuZm9udGNvbG9yKFxcXFxcXFwiIzFhYWQxOVxcXFxcXFwiKSArICc8L2I+JyxcXFxcbiAgICAgICAgdXJsOiAkKCkubGF6eVJ1bGUoKGZvbGQpID0+IHtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX1JVTEUuZ3JvdXAsIGZvbGQgPT09ICcxJyA/ICcwJyA6ICcxJyk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgfSwgZm9sZCksXFxcXG4gICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgfSlcXFxcbiAgICBjYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5LCBpbmRleCkgPT4ge1xcXFxuICAgICAgICBsZXQgc3ViX2NhdGVnb3JpZXMgPSBwZGZhKGNhdGVnb3J5LCDlsI/nsbvlrprkvY0pO1xcXFxuICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcXFxcbiAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHBkZmgoaXRlbSwg5YiG57G75qCH6aKYKVxcXFxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yo5o6S6ZmkKSAhPSAndW5kZWZpbmVkJyAmJiDmjpLpmaQgIT0gJycpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKG5ldyBSZWdFeHAo5o6S6ZmkLCBcXFxcXFxcImdcXFxcXFxcIiksIFxcXFxcXFwiXFxcXFxcXCIpXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBrZXkudG9TdHJpbmcoKSA9PT0gY2F0ZV90ZW1wW2luZGV4XSA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyB0aXRsZS5mb250Y29sb3Io5YiG57G76aKc6ImyKSA6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6ICQocGQoaXRlbSwg5YiG57G76ZO+5o6lKSArICcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdfY2F0ZSA9IFtdXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wLmZvckVhY2goKGNhdGUsIGluZGV4KSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NhdGUucHVzaChpbmRleCA9PT0gMCA/IHBhcmFtcy5rZXkudG9TdHJpbmcoKSA6IFxcXFxcXFwiMFxcXFxcXFwiKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKE1ZX1JVTEUudGl0bGUsIEpTT04uc3RyaW5naWZ5KG5ld19jYXRlKSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKE1ZX1JVTEUudXJsLCBpbnB1dClcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZV90ZW1wOiBjYXRlX3RlbXAsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHBhZ2UsXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcXFxuICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChmb2xkID09PSAnMScpIHtcXFxcbiAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIGxldCB0aXRsZSA9IHBkZmgoaXRlbSwg5YiG57G75qCH6aKYKVxcXFxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yo5o6S6ZmkKSAhPSAndW5kZWZpbmVkJyAmJiDmjpLpmaQgIT0gJycpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKG5ldyBSZWdFeHAo5o6S6ZmkLCBcXFxcXFxcImdcXFxcXFxcIiksIFxcXFxcXFwiXFxcXFxcXCIpXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBrZXkudG9TdHJpbmcoKSA9PT0gY2F0ZV90ZW1wW2luZGV4XSA/IFxcXFxcXFwi4oCc4oCc4oCd4oCdXFxcXFxcXCIgKyB0aXRsZS5mb250Y29sb3Io5YiG57G76aKc6ImyKSA6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmw6ICQocGQoaXRlbSwg5YiG57G76ZO+5o6lKSArICcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5jYXRlX3RlbXBbcGFyYW1zLmluZGV4XSA9IHBhcmFtcy5rZXkudG9TdHJpbmcoKVxcXFxuXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihNWV9SVUxFLnRpdGxlLCBKU09OLnN0cmluZ2lmeShwYXJhbXMuY2F0ZV90ZW1wKSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKE1ZX1JVTEUudXJsLCBpbnB1dClcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfSwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZV90ZW1wOiBjYXRlX3RlbXAsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHBhZ2UsXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pLFxcXFxuICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcXFxuICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiXFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pXFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5Yqo5oCBW+S4gF0qXFxcIixcXFwicGF0aFxcXCI6XFxcImNhdGVnb3JpZXMtaGVhZGVyXFxcIixcXFwicnVsZVxcXCI6XFxcIi8qKlxcXFxuICog5pys5Zyw572R6aG15o+S5Lu26ZO+5o6lIGhpa2VyOi8vZmlsZXMvcnVsZXMvanMvY2F0ZWdvcmllcy1oZWFkZXIuanNcXFxcbiAqIOWtkOmhtemdoumTvuaOpSBoaWtlcjovL3BhZ2UvY2F0ZWdvcmllcy1oZWFkZXJcXFxcbiAqIOmBk+mVv+S7k+W6k+mTvuaOpSBodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0yNzA1XFxcXG4gKiDnoIHkupEgR2l0ZWUg6ZO+5o6lIGh0dHBzOi8vZ2l0ZWUuY29tL3JlYm9ybjAvSGlrZXJSdWxlcy9yYXcvbWFzdGVyL3BsdWdpbnMvY2F0ZWdvcmllcy1oZWFkZXIuanNcXFxcbiAqL1xcXFxuLyoqXFxcXG4gKiBPYmplY3QuYXNzaWduIOeUqOazleWPguiAg+mTvuaOpVxcXFxuICpcXFxcbiAqIDEuaHR0cHM6Ly93d3cuZGFpbWFqaWFvbGl1LmNvbS9kYWltYS80NzEzOWE5ZTcxMDA0MDdcXFxcbiAqIDIuaHR0cHM6Ly9zZWdtZW50ZmF1bHQuY29tL2EvMTE5MDAwMDAxMTc3ODg3NVxcXFxuICogMy5odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy96aC1DTi9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9PYmplY3QvYXNzaWduXFxcXG4gKi9cXFxcbi8vIOWIqeeUqCBTeW1ib2wg5a6e546w56eB5pyJ5Y+Y6YeP5ZKM56eB5pyJ5pa55rOV77yM5aSW55WM5LiN5Y+v6K6/6Zeu77yI5Y+C6ICD6ZO+5o6lMu+8iVxcXFxuY29uc3Qgc3ltYm9sTWFwID0ge1xcXFxuICAgIC8vIGNoZWNrUGFyYW1zOiBTeW1ib2woJ2NoZWNrUGFyYW1zJyksXFxcXG4gICAgbUxheW91dDogU3ltYm9sKCdtTGF5b3V0JyksXFxcXG4gICAgdHJ1ZV91cmw6IFN5bWJvbCgndHJ1ZV91cmwnKSxcXFxcbiAgICBtUGFnZTogU3ltYm9sKCdtUGFnZScpLFxcXFxuICAgIHNyYzogU3ltYm9sKCdzcmMnKSxcXFxcbiAgICBydWxlT2JqTGlzdDogU3ltYm9sKCdydWxlT2JqTGlzdCcpLFxcXFxuICAgIG1Gb2xkOiBTeW1ib2woJ21Gb2xkJyksXFxcXG4gICAgbUZvbGRJbm5lckVuYWJsZTogU3ltYm9sKCdtRm9sZElubmVyRW5hYmxlJyksXFxcXG4gICAgbUZvbGRJbmRleDogU3ltYm9sKCdtRm9sZEluZGV4JyksXFxcXG4gICAgbUZvbGRMYXlvdXQ6IFN5bWJvbCgnbUZvbGRMYXlvdXQnKSxcXFxcbiAgICBtQ29sb3I6IFN5bWJvbCgnbUNvbG9yJyksXFxcXG4gICAgbVRhZzogU3ltYm9sKCdtVGFnJyksXFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIENhdGVnb3JpZXNIZWFkZXIoY29sb3IpIHtcXFxcbiAgICAvLyAndXNlIHN0cmljdCc7XFxcXG4gICAgLy8gLi4uXFxcXG4gICAgLy8gdGhpc1tzeW1ib2xNYXAubGlzdFJ1bGVdID0gW11cXFxcbiAgICAvLyB0aGlzW3N5bWJvbE1hcC5zdWJMaXN0UnVsZV0gPSBbXVxcXFxuICAgIHRoaXNbc3ltYm9sTWFwLm1Db2xvcl0gPSBjb2xvciB8fCBcXFxcXFxcIiNGQTcyOThcXFxcXFxcIjtcXFxcbiAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0gPSBbXVxcXFxuICAgIHRoaXMuVkFSTUFQID0ge1xcXFxuICAgICAgICBDQVRFR09SWTogXFxcXFxcXCJoZWFkZXIuY2F0ZWdvcnlcXFxcXFxcIixcXFxcbiAgICAgICAgVVJMOiBcXFxcXFxcImhlYWRlci51cmxcXFxcXFxcIixcXFxcbiAgICAgICAgRk9MRDogXFxcXFxcXCJoZWFkZXIuZm9sZFxcXFxcXFwiLFxcXFxuICAgIH1cXFxcbiAgICB0aGlzW3N5bWJvbE1hcC5tRm9sZExheW91dF0gPSB7XFxcXG4gICAgICAgIGluamVjdEluZGV4OiAxXFxcXG4gICAgfVxcXFxuICAgIHRoaXNbc3ltYm9sTWFwLm1Gb2xkSW5kZXhdID0gMVxcXFxufVxcXFxuXFxcXG5PYmplY3QuYXNzaWduKENhdGVnb3JpZXNIZWFkZXIucHJvdG90eXBlLCB7XFxcXG4gICAgLy8gT3ZlcnJpZGUg5p6E6YCg5pa55rOV77yM55u45b2T5LqOIGZ1bmN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9ICguLi4pID0+IHsuLi5977yMbmV3IGZ1bmN0aW9uKCkg55qE5pe25YCZ5Lya6Ieq5Yqo5omn6KGMXFxcXG4gICAgY29uc3RydWN0b3I6IENhdGVnb3JpZXNIZWFkZXIsXFxcXG4gICAgLy8g5a6a5LmJ56eB5pyJ5pa55rOVXFxcXG4gICAgVkVSU0lPTjogMjAyMTExMzAxOTAwLFxcXFxuICAgIGNoZWNrUGFyYW1zKCkge1xcXFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7fosIPnlKggbGF5b3V0KGQpIOS8oOWFpeW9k+WJjeeVjOmdolxcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmICghdGhpc1tzeW1ib2xNYXAudHJ1ZV91cmxdKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7fosIPnlKggdHJ1ZVVybCh1cmwpIOS8oOWFpeW9k+WJjeWIhuexu+eahOmTvuaOpVxcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmICghdGhpc1tzeW1ib2xNYXAubVBhZ2VdKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7fosIPnlKggcGFnZShtUGFnZSkg5Lyg5YWl5b2T5YmN6aG15pWwXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5sZW5ndGggPCAxKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7fosIPnlKjnm7jlhbPmlrnms5XkvKDlhaXlrprkvY3op4TliJlcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLm1Gb2xkXSkge1xcXFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRdID0gJzAnXFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIGxheW91dChtTGF5b3V0KSB7XFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdID0gbUxheW91dFxcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgdHJ1ZVVybCh1cmwpIHtcXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAudHJ1ZV91cmxdID0gdXJsXFxcXG4gICAgICAgIHJldHVybiB0aGlzXFxcXG4gICAgfSxcXFxcbiAgICBwYWdlKG1QYWdlKSB7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgKG1QYWdlKSA9PT0gJ3N0cmluZycpIHtcXFxcbiAgICAgICAgICAgIG1QYWdlID0gcGFyc2VJbnQobVBhZ2UpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubVBhZ2VdID0gbVBhZ2VcXFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXFxcbiAgICB9LFxcXFxuICAgIGh0bWwobVNyYykge1xcXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5zcmNdID0gbVNyY1xcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgbGlzdChydWxlKSB7XFxcXG4gICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0ubGVuZ3RoID4gMCkge1xcXFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwibGlzdChydWxlKSBhZGQocnVsZU9iaikg5Y+q6IO95LqM6YCJ5LiA77yBXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdID0gW3t9XVxcXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0ubGlzdFJ1bGUgPSBydWxlXFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5LiA57qn5YiG57G7J10gPSBydWxlXFxcXG4gICAgICAgIHJldHVybiB0aGlzXFxcXG4gICAgfSxcXFxcbiAgICBzdWJMaXN0KHJ1bGUpIHtcXFxcbiAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5sZW5ndGggPiAxKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCJzdWJMaXN0KHJ1bGUpIGFkZChydWxlT2JqKSDlj6rog73kuozpgInkuIDvvIFcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXSB8fCAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS5saXN0UnVsZSAmJiAhdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyfkuIDnuqfliIbnsbsnXSkpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+WFiOiwg+eUqCBsaXN0KHJ1bGUpIOaIliDkuIDnuqfliIbnsbsocnVsZSkg5a6a5L2N5LiA57qn5YiG57G7XFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLnN1Ykxpc3RSdWxlID0gcnVsZVxcXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF1bJ+WtkOWIhuexuyddID0gcnVsZVxcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgdGl0bGUocnVsZSkge1xcXFxuICAgICAgICBpZiAodGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLmxlbmd0aCA+IDEpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcInRpdGxlKHJ1bGUpIGFkZChydWxlT2JqKSDlj6rog73kuozpgInkuIDvvIFcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXSB8fCAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS5saXN0UnVsZSAmJiAhdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyfkuIDnuqfliIbnsbsnXSkpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+WFiOiwg+eUqCBsaXN0KHJ1bGUpIOaIliDkuIDnuqfliIbnsbsocnVsZSkg5a6a5L2N5LiA57qn5YiG57G7XFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLnRpdGxlUnVsZSA9IHJ1bGVcXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyfliIbnsbvmoIfpopgnXSA9IHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS50aXRsZVJ1bGVcXFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXFxcbiAgICB9LFxcXFxuICAgIHVybChydWxlKSB7XFxcXG4gICAgICAgIGlmICh0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF0ubGVuZ3RoID4gMSkge1xcXFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwidXJsKHJ1bGUpIGFkZChydWxlT2JqKSDlj6rog73kuozpgInkuIDvvIFcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXSB8fCAoIXRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXS5saXN0UnVsZSAmJiAhdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdWyfkuIDnuqfliIbnsbsnXSkpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+WFiOiwg+eUqCBsaXN0KHJ1bGUpIOaIliDkuIDnuqfliIbnsbsocnVsZSkg5a6a5L2N5LiA57qn5YiG57G7XFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdWzBdLnVybFJ1bGUgPSBydWxlXFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XVswXVsn5YiG57G76ZO+5o6lJ10gPSB0aGlzW3N5bWJvbE1hcC5ydWxlT2JqTGlzdF1bMF0udXJsUnVsZVxcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgLyoqXFxcXG4gICAgICog5piv5ZCm5byA5ZCv5oqY5Y+g5Yqf6IO9XFxcXG4gICAgICpcXFxcbiAgICAgKiBAcGFyYW0gZW5hYmxlZCB0cnVlIOihqOekuuW8gOWQr++8jGZhbHNlIOihqOekuuemgeeUqFxcXFxuICAgICAqIEByZXR1cm5zIHtDYXRlZ29yaWVzSGVhZGVyfVxcXFxuICAgICAqL1xcXFxuICAgIGZvbGRJbm5lcihlbmFibGVkKSB7XFxcXG4gICAgICAgIGlmICghKHR5cGVvZiAoZW5hYmxlZCkgPT09ICdib29sZWFuJykpIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+S8oOWFpSB0cnVlIOaIliBmYWxzZSDooajnpLrlvIDlkK/miJblhbPpl63mipjlj6Dlip/og73vvIFcXFxcXFxcIilcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICB0aGlzW3N5bWJvbE1hcC5tRm9sZElubmVyRW5hYmxlXSA9IGVuYWJsZWRcXFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXFxcbiAgICB9LFxcXFxuICAgIC8qKlxcXFxuICAgICAqIOS7juesrCBpbmRleCDooYzlvIDlp4vmipjlj6BcXFxcbiAgICAgKlxcXFxuICAgICAqIEBwYXJhbSBpbmRleCDlvIDlp4vmipjlj6DnmoTooYzmlbBcXFxcbiAgICAgKiBAcmV0dXJucyB7Q2F0ZWdvcmllc0hlYWRlcn1cXFxcbiAgICAgKi9cXFxcbiAgICBmb2xkSW5kZXgoaW5kZXgpIHtcXFxcbiAgICAgICAgaWYgKCEodHlwZW9mIChpbmRleCkgPT09ICdudW1iZXInKSkge1xcXFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi5byA5aeL5oqY5Y+g6KGM6K+35Lyg5YWl5pWw5a2X77yBXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKGluZGV4IDwgMSkge1xcXFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi5byA5aeL5oqY5Y+g6KGM6K+35Lyg5YWl5aSn5LqOIDAg55qE5pW05pWw77yBXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRJbmRleF0gPSBpbmRleCB8fCAxO1xcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgLyoqXFxcXG4gICAgICog5oqY5Y+g5oyJ6ZKu55qE55WM6Z2iXFxcXG4gICAgICpcXFxcbiAgICAgKiBAcGFyYW0gbGF5b3V0IOS4jiBkLnB1c2gg57uT5p6E5LiA6Ie077yMXFxcXG4gICAgICogICAgICAgIOS+i++8mnsgdGl0bGU6XFxcXFxcXCLmoIfpopgxXFxcXFxcXCIsIHVybDpcXFxcXFxcInh4eFxcXFxcXFwiLCBjb2xfdHlwZTpcXFxcXFxcInNjcm9sbF9idXR0b25cXFxcXFxcIiB9O1xcXFxuICAgICAqICAgICAgICDlj4LmlbDph4fnlKjlj6/pgInopobnm5bmqKHlvI/vvIzkuI3lhpnnmoTlj4LmlbDliJnkvb/nlKjpu5jorqQ7XFxcXG4gICAgICogICAgICAgIOavlOWmguS8oOWFpSB7IGNvbF90eXBlOlxcXFxcXFwidGV4dF8xXFxcXFxcXCIgfe+8jOmCo+acgOe7iOe7k+aenOWwseaYryB7IHRpdGxlOlxcXFxcXFwi5qCH6aKYMVxcXFxcXFwiLCB1cmw6XFxcXFxcXCJ4eHhcXFxcXFxcIiwgY29sX3R5cGU6XFxcXFxcXCJ0ZXh0XzFcXFxcXFxcIiB9XFxcXG4gICAgICogQHJldHVybnMge0NhdGVnb3JpZXNIZWFkZXJ9XFxcXG4gICAgICovXFxcXG4gICAgZm9sZExheW91dChsYXlvdXQpIHtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBsYXlvdXQgPT09ICdvYmplY3QnKSB7XFxcXG4gICAgICAgICAgICBsZXQga2V5cyA9IE9iamVjdC5rZXlzKGxheW91dClcXFxcbiAgICAgICAgICAgIGxldCBpbmplY3RJbmRleCA9IGxheW91dC5pbmplY3RJbmRleCB8fCBsYXlvdXRbJ+aKmOWPoOaMiemSruaPkuWFpeihjCddXFxcXG4gICAgICAgICAgICBpZiAobGF5b3V0LnRpdGxlIHx8IGxheW91dC51cmwgfHwgbGF5b3V0LmNvbF90eXBlIHx8IGluamVjdEluZGV4KSB7XFxcXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV1cXFxcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdW2tleV0gPSBsYXlvdXRba2V5XTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+S8oOWFpeato+ehrueahOaKmOWPoOeVjOmdouWFg+e0oO+8gVxcXFxcXFwiKVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgLy8gaW5qZWN0SW5kZXgg5oqY5Y+g5oyJ6ZKu5o+S5YWl56ysIGluamVjdEluZGV4IOihjFxcXFxuICAgICAgICAgICAgaWYgKGluamVjdEluZGV4KSB7XFxcXG4gICAgICAgICAgICAgICAgaWYgKCEodHlwZW9mIChpbmplY3RJbmRleCkgPT09ICdudW1iZXInKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLmipjlj6DmjInpkq7mj5LlhaXooYzor7fkvKDlhaXmlbDlrZfvvIFcXFxcXFxcIilcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgaWYgKGluamVjdEluZGV4IDwgMSkge1xcXFxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLmipjlj6DmjInpkq7mj5LlhaXooYzor7fkvKDlhaXlpKfkuo4gMCDnmoTmlbTmlbDvvIFcXFxcXFxcIilcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgaWYgKGluamVjdEluZGV4ID4gdGhpc1tzeW1ib2xNYXAubUZvbGRJbmRleF0pIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxcXFxcXFwi5oqY5Y+g5oyJ6ZKu5o+S5YWl6KGM5LiN5b6X5aSn5LqO5pi+56S65oqY5Y+g6KGM5pWw77yB6K+36LCD55SoIC5mb2xkSW5kZXgoaW5kZXgpIOaIliAu56ys5Yeg6KGM5byA5aeL5oqY5Y+gKGluZGV4KSDkvKDlhaXmraPnoa7nmoTmmL7npLrmipjlj6DooYzmlbBcXFxcXFxcIilcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdLmluamVjdEluZGV4ID0gaW5qZWN0SW5kZXggfHwgMTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFxcXFxcIuivt+S8oOWFpeato+ehrueahOaKmOWPoOeVjOmdouWFg+e0oO+8gVxcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgLy8g5b2T5YmN5piv5ZCm5oqY5Y+gXFxcXG4gICAgZm9sZChpc0ZvbGQpIHtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiAoaXNGb2xkKSA9PT0gJ3N0cmluZycpIHtcXFxcbiAgICAgICAgICAgIGlzRm9sZCA9IGlzRm9sZCA9PT0gJzEnXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKGlzRm9sZCkge1xcXFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRdID0gJzEnO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUZvbGRdID0gJzAnO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiB0aGlzXFxcXG4gICAgfSxcXFxcbiAgICBjb2xvcihtQ29sb3IpIHtcXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubUNvbG9yXSA9IG1Db2xvclxcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgdGFnKG1UYWcpIHtcXFxcbiAgICAgICAgdGhpc1tzeW1ib2xNYXAubVRhZ10gPSBtVGFnXFxcXG4gICAgICAgIHJldHVybiB0aGlzXFxcXG4gICAgfSxcXFxcbiAgICBhZGQocnVsZU9iaikge1xcXFxuICAgICAgICAvLyBsb2coJC5zdHJpbmdpZnkocnVsZU9iaikpXFxcXG4gICAgICAgIGlmIChydWxlT2JqLmNvbnN0cnVjdG9yID09PSBBcnJheSkge1xcXFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdID0gdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLmNvbmNhdChydWxlT2JqKVxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAucnVsZU9iakxpc3RdLnB1c2gocnVsZU9iailcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIGV2YWxKU1J1bGUoaXRlbSwganNSdWxlKSB7XFxcXG4gICAgICAgIGxldCBydWxlID0ganNSdWxlLnJlcGxhY2UoXFxcXFxcXCJAanM6XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpXFxcXG4gICAgICAgIHJ1bGUgPSBydWxlLnRyaW0oKVxcXFxuICAgICAgICAvLyBsb2coJC5zdHJpbmdpZnkocnVsZSkpXFxcXG4gICAgICAgIGxldCBpbnB1dCA9IGl0ZW1cXFxcbiAgICAgICAgaWYgKHJ1bGUuc3RhcnRzV2l0aChcXFxcXFxcIihcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIGV2YWwoJ3Jlc3VsdCA9ICcgKyBydWxlKVxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgLyoqXFxcXG4gICAgICAgICAgICAgKiDov5jljp/miJAgJC50b1N0cmluZyguLi4pIOeahOacgOe7iOe7k+aenO+8jOi+vuWIsOacgOe7iOWkhOeQhuaWueW8j+i3n+S4iumdoueahCBpZiDkuIDoh7TnmoTnm67nmoRcXFxcbiAgICAgICAgICAgICAqL1xcXFxuICAgICAgICAgICAgZXZhbCgncmVzdWx0ID0gJyArICcoKCkgPT4geycgKyBydWxlICsgJ30pKCknKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiAocmVzdWx0IHx8ICcnKVxcXFxuICAgIH0sXFxcXG4gICAgZ2V0VGl0bGUoc3JjLCBjYXRlZ29yeSkge1xcXFxuICAgICAgICBsZXQgdGl0bGUgPSAnJ1xcXFxuICAgICAgICBsZXQgdGl0bGVSdWxlID0gY2F0ZWdvcnkudGl0bGVSdWxlIHx8ICdhJiZUZXh0J1xcXFxuICAgICAgICBpZiAodGl0bGVSdWxlLnN0YXJ0c1dpdGgoXFxcXFxcXCJAanM6XFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICB0aXRsZSA9IHRoaXMuZXZhbEpTUnVsZShzcmMsIHRpdGxlUnVsZSlcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHRpdGxlID0gcGFyc2VEb21Gb3JIdG1sKHNyYywgdGl0bGVSdWxlKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiB0aXRsZSB8fCBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0VXJsKHNyYywgY2F0ZWdvcnkpIHtcXFxcbiAgICAgICAgbGV0IHVybCA9ICcnXFxcXG4gICAgICAgIGxldCB1cmxSdWxlID0gY2F0ZWdvcnkudXJsUnVsZSB8fCAnYSYmaHJlZidcXFxcbiAgICAgICAgaWYgKHR5cGVvZiB1cmxSdWxlID09PSAnb2JqZWN0Jykge1xcXFxuICAgICAgICAgICAgbGV0IG1VcmxSdWxlID0gdXJsUnVsZS5ydWxlIHx8IHVybFJ1bGVbJ+ino+aekOinhOWImSddIHx8ICdhJiZocmVmJztcXFxcbiAgICAgICAgICAgIGlmIChtVXJsUnVsZS5zdGFydHNXaXRoKFxcXFxcXFwiQGpzOlxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgIHVybCA9IHRoaXMuZXZhbEpTUnVsZShzcmMsIG1VcmxSdWxlKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHBhcnNlID0gcGFyc2VEb207XFxcXG4gICAgICAgICAgICAgICAgaWYgKHVybFJ1bGUucGFyc2VPcHRpb24pIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh1cmxSdWxlLnBhcnNlT3B0aW9uKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXFxcXFwicGFyc2VEb21cXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXFxcXFxcXCJwZFxcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlID0gcGFyc2VEb207XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXFxcXFwicGFyc2VEb21Gb3JIdG1sXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXFxcXFwicGRmaFxcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlID0gcGFyc2VEb21Gb3JIdG1sO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlRG9tO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1cmxSdWxlW1xcXFxcXFwi6Kej5p6Q5pa55rOVXFxcXFxcXCJdKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodXJsUnVsZVtcXFxcXFxcIuino+aekOaWueazlVxcXFxcXFwiXSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFxcXFxcInBhcnNlRG9tXFxcXFxcXCI6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFxcXFxcXFwicGRcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlRG9tO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFxcXFxcInBhcnNlRG9tRm9ySHRtbFxcXFxcXFwiOlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcXFxcXFxcInBkZmhcXFxcXFxcIjpcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZSA9IHBhcnNlRG9tRm9ySHRtbDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2UgPSBwYXJzZURvbTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB1cmwgPSBwYXJzZShzcmMsIG1VcmxSdWxlKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIGlmICh1cmxSdWxlLmRlYWxVcmwpIHtcXFxcbiAgICAgICAgICAgICAgICB1cmwgPSB1cmxSdWxlLmRlYWxVcmwodXJsKVxcXFxuICAgICAgICAgICAgfSBlbHNlIGlmICh1cmxSdWxlWyfkuozmrKHlpITnkIYnXSkge1xcXFxuICAgICAgICAgICAgICAgIHVybCA9IHVybFJ1bGVbJ+S6jOasoeWkhOeQhiddKHVybClcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGlmICh1cmxSdWxlLnN0YXJ0c1dpdGgoXFxcXFxcXCJAanM6XFxcXFxcXCIpKSB7XFxcXG4gICAgICAgICAgICAgICAgdXJsID0gdGhpcy5ldmFsSlNSdWxlKHNyYywgdXJsUnVsZSk7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHVybCA9IHBhcnNlRG9tKHNyYywgdXJsUnVsZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIHVybCB8fCBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgIH0sXFxcXG4gICAgYnVpbGQoKSB7XFxcXG4gICAgICAgIC8vIOajgOa1i+aYr+WQpuS8oOWFpemcgOimgeeahOWPguaVsFxcXFxuICAgICAgICB0aGlzLmNoZWNrUGFyYW1zKClcXFxcbiAgICAgICAgLy8g5q+P5LiA5Liq5YiG57G755qE5ZSv5LiA5qCH6K+GXFxcXG4gICAgICAgIGxldCBtVGFnID0gdGhpc1tzeW1ib2xNYXAubVRhZ10gfHwgXFxcXFxcXCJcXFxcXFxcIlxcXFxuICAgICAgICAvL+e/u+mhtSDpnIDopoHmoLnmja7lrp7pmYXmm7/mjaJcXFxcbiAgICAgICAgY29uc3QgaHRtbCA9IHRoaXNbc3ltYm9sTWFwLnNyY10gfHwgcmVxdWVzdCh0aGlzW3N5bWJvbE1hcC50cnVlX3VybF0pXFxcXG4gICAgICAgIGNvbnN0IGVtcHR5ID0gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgLy/ojrflj5bliJfooahcXFxcbiAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IFtdXFxcXG4gICAgICAgIHRoaXNbc3ltYm9sTWFwLnJ1bGVPYmpMaXN0XS5tYXAocnVsZU9iaiA9PiB7XFxcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IFtdXFxcXG4gICAgICAgICAgICBsZXQgbGlzdFJ1bGUgPSBydWxlT2JqLmxpc3RSdWxlIHx8IHJ1bGVPYmpbXFxcXFxcXCLkuIDnuqfliIbnsbtcXFxcXFxcIl1cXFxcbiAgICAgICAgICAgIGlmIChsaXN0UnVsZS5zdGFydHNXaXRoKFxcXFxcXFwiQGpzOlxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgIC8vIGxvZygkLnN0cmluZ2lmeShsaXN0UnVsZSkpXFxcXG4gICAgICAgICAgICAgICAgbGlzdCA9IHRoaXMuZXZhbEpTUnVsZShodG1sLCBsaXN0UnVsZSlcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgbGlzdCA9IHBhcnNlRG9tRm9yQXJyYXkoaHRtbCwgbGlzdFJ1bGUpXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAvLyBsb2cobGlzdClcXFxcbiAgICAgICAgICAgIGxpc3QubWFwKGNhdGVnb3J5ID0+IHtcXFxcbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICBsaXN0OiBjYXRlZ29yeSxcXFxcbiAgICAgICAgICAgICAgICAgICAgc3ViTGlzdFJ1bGU6IHJ1bGVPYmouc3ViTGlzdFJ1bGUgfHwgcnVsZU9ialtcXFxcXFxcIuWtkOWIhuexu1xcXFxcXFwiXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVSdWxlOiBydWxlT2JqLnRpdGxlUnVsZSB8fCBydWxlT2JqW1xcXFxcXFwi5YiG57G75qCH6aKYXFxcXFxcXCJdLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmxSdWxlOiBydWxlT2JqLnVybFJ1bGUgfHwgcnVsZU9ialtcXFxcXFxcIuWIhuexu+mTvuaOpVxcXFxcXFwiXSxcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIH0pXFxcXG4gICAgICAgIH0pXFxcXG5cXFxcbiAgICAgICAgLy8gbG9nKCQuc3RyaW5naWZ5KGNhdGVnb3JpZXMpKVxcXFxuXFxcXG4gICAgICAgIGxldCBpbml0X2NhdGUgPSBbXVxcXFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIwOyBpKyspIHtcXFxcbiAgICAgICAgICAgIGluaXRfY2F0ZS5wdXNoKFxcXFxcXFwiMFxcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgY29uc3QgY2F0ZV90ZW1wX2pzb24gPSBnZXRNeVZhcihtVGFnICsgdGhpcy5WQVJNQVAuQ0FURUdPUlksIEpTT04uc3RyaW5naWZ5KGluaXRfY2F0ZSkpXFxcXG4gICAgICAgIGNvbnN0IGNhdGVfdGVtcCA9IEpTT04ucGFyc2UoY2F0ZV90ZW1wX2pzb24pXFxcXG5cXFxcbiAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLm1QYWdlXSA9PT0gMSkge1xcXFxuXFxcXG4gICAgICAgICAgICBjYXRlZ29yaWVzLmZvckVhY2goKGNhdGVnb3J5LCBpbmRleCkgPT4ge1xcXFxuXFxcXG4gICAgICAgICAgICAgICAgLy8g5oqY5Y+gIFVJXFxcXG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbc3ltYm9sTWFwLm1Gb2xkSW5uZXJFbmFibGVdICYmIHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XS5pbmplY3RJbmRleCA9PT0gKGluZGV4KzEpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2xkTGF5b3V0ID0ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRoaXNbc3ltYm9sTWFwLm1Gb2xkTGF5b3V0XS50aXRsZSB8fCAodGhpc1tzeW1ib2xNYXAubUZvbGRdID09PSAnMScgPyAn4oCc4oCc4oCd4oCdPGI+PHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogI0ZGMDAwMFxcXFxcXFwiPuKIqDwvc3Bhbj48L2I+JyA6ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiAjMWFhZDE5XFxcXFxcXCI+4oinPC9zcGFuPjwvYj4nKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdLnVybCB8fCAkKFxcXFxcXFwiaGlrZXI6Ly9lbXB0eSNub0hpc3RvcnkjXFxcXFxcXCIpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMubVRhZyArIHBhcmFtcy5WQVJNQVAuRk9MRCwgZ2V0TXlWYXIocGFyYW1zLm1UYWcgKyBwYXJhbXMuVkFSTUFQLkZPTEQsIHBhcmFtcy5pc0ZvbGQpID09PSAnMScgPyAnMCcgOiAnMScpXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UYWc6IG1UYWcsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNGb2xkOiB0aGlzW3N5bWJvbE1hcC5tRm9sZF0sXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFSTUFQOiB0aGlzLlZBUk1BUFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogdGhpc1tzeW1ib2xNYXAubUZvbGRMYXlvdXRdLmNvbF90eXBlIHx8IFxcXFxcXFwic2Nyb2xsX2J1dHRvblxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdLnB1c2goZm9sZExheW91dClcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgICAgICAgICAvL+WFt+S9k+WIl+ihqOS4i+eahOWIhuexu1xcXFxuICAgICAgICAgICAgICAgIGxldCBzdWJfY2F0ZWdvcmllcyA9IFtdO1xcXFxuICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yeS5zdWJMaXN0UnVsZS5zdGFydHNXaXRoKFxcXFxcXFwiQGpzOlxcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcyA9IHRoaXMuZXZhbEpTUnVsZShjYXRlZ29yeS5saXN0LCBjYXRlZ29yeS5zdWJMaXN0UnVsZSlcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICBzdWJfY2F0ZWdvcmllcyA9IHBhcnNlRG9tRm9yQXJyYXkoY2F0ZWdvcnkubGlzdCwgY2F0ZWdvcnkuc3ViTGlzdFJ1bGUpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAodGhpc1tzeW1ib2xNYXAubUZvbGRJbmRleF0gfHwgMSkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgc3ViX2NhdGVnb3JpZXMuZm9yRWFjaCgoaXRlbSwga2V5KSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGl0bGUgPSB0aGlzLmdldFRpdGxlKGl0ZW0sIGNhdGVnb3J5KVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IHRoaXMuZ2V0VXJsKGl0ZW0sIGNhdGVnb3J5KVxcXFxuXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzW3N5bWJvbE1hcC5tTGF5b3V0XS5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZToga2V5LnRvU3RyaW5nKCkgPT09IGNhdGVfdGVtcFtpbmRleF0gPyAn4oCc4oCc4oCd4oCdPGI+PGZvbnQgY29sb3I9JyArIHRoaXNbc3ltYm9sTWFwLm1Db2xvcl0gKyAnPicgKyB0aXRsZSArICcgPC9mb250PjwvYj4nIDogdGl0bGUsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiAkKHVybCkubGF6eVJ1bGUoKHBhcmFtcykgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3X2NhdGUgPSBbXVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1zLmluZGV4ID09PSAwKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wLmZvckVhY2goKGNhdGUsIGluZGV4KSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2NhdGUucHVzaChpbmRleCA9PT0gMCA/IHBhcmFtcy5rZXkudG9TdHJpbmcoKSA6IFxcXFxcXFwiMFxcXFxcXFwiKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuY2F0ZV90ZW1wW3BhcmFtcy5pbmRleF0gPSBwYXJhbXMua2V5LnRvU3RyaW5nKClcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMudGFnICsgcGFyYW1zLlZBUk1BUC5DQVRFR09SWSwgSlNPTi5zdHJpbmdpZnkocGFyYW1zLmluZGV4ID09PSAwID8gbmV3X2NhdGUgOiBwYXJhbXMuY2F0ZV90ZW1wKSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGFyYW1zLnRhZyArIHBhcmFtcy5WQVJNQVAuVVJMLCBpbnB1dClcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQVJNQVA6IHRoaXMuVkFSTUFQLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6IG1UYWcsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiB0aGlzW3N5bWJvbE1hcC5tUGFnZV0sXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sTWFwLm1MYXlvdXRdLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYmxhbmtfYmxvY2tcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNbc3ltYm9sTWFwLm1Gb2xkXSA9PT0gJzAnKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHN1Yl9jYXRlZ29yaWVzLmZvckVhY2goKGl0ZW0sIGtleSkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gdGhpcy5nZXRUaXRsZShpdGVtLCBjYXRlZ29yeSlcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB0aGlzLmdldFVybChpdGVtLCBjYXRlZ29yeSlcXFxcblxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUxheW91dF0ucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGtleS50b1N0cmluZygpID09PSBjYXRlX3RlbXBbaW5kZXhdID8gJ+KAnOKAnOKAneKAnTxiPjxmb250IGNvbG9yPScgKyB0aGlzW3N5bWJvbE1hcC5tQ29sb3JdICsgJz4nICsgdGl0bGUgKyAnIDwvZm9udD48L2I+JyA6IHRpdGxlLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogJCh1cmwpLmxhenlSdWxlKChwYXJhbXMpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmNhdGVfdGVtcFtwYXJhbXMuaW5kZXhdID0gcGFyYW1zLmtleS50b1N0cmluZygpXFxcXG5cXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHV0TXlWYXIocGFyYW1zLnRhZyArIHBhcmFtcy5WQVJNQVAuQ0FURUdPUlksIEpTT04uc3RyaW5naWZ5KHBhcmFtcy5jYXRlX3RlbXApKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXRNeVZhcihwYXJhbXMudGFnICsgcGFyYW1zLlZBUk1BUC5VUkwsIGlucHV0KVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVfdGVtcDogY2F0ZV90ZW1wLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUk1BUDogdGhpcy5WQVJNQVAsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZzogbVRhZyxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiBrZXksXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXNbc3ltYm9sTWFwLm1QYWdlXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xNYXAubUxheW91dF0ucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJibGFua19ibG9ja1xcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSxcXFxcblxcXFxuICAgIOeVjOmdoihsYXlvdXQpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMubGF5b3V0KGxheW91dClcXFxcbiAgICB9LFxcXFxuICAgIOWIhuexu+mTvuaOpSh0cnVlVXJsKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLnRydWVVcmwodHJ1ZVVybCk7XFxcXG4gICAgfSxcXFxcbiAgICDpobXnoIEocGFnZSkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5wYWdlKHBhZ2UpO1xcXFxuICAgIH0sXFxcXG4gICAg5rqQ56CBKGh0bWwpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuaHRtbChodG1sKTtcXFxcbiAgICB9LFxcXFxuICAgIOWumuS9jeS4gOe6p+WIhuexuyhsaXN0KSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmxpc3QobGlzdCk7XFxcXG4gICAgfSxcXFxcbiAgICDlrprkvY3lrZDliIbnsbsoc3ViTGlzdCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5zdWJMaXN0KHN1Ykxpc3QpO1xcXFxuICAgIH0sXFxcXG4gICAg5a6a5L2N5YiG57G75qCH6aKYKHRpdGxlKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLnRpdGxlKHRpdGxlKTtcXFxcbiAgICB9LFxcXFxuICAgIOWumuS9jeWIhuexu+mTvuaOpSh1cmwpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMudXJsKHVybCk7XFxcXG4gICAgfSxcXFxcbiAgICDlvIDlkK/lhoXnva7mipjlj6Dlip/og70oKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmZvbGRJbm5lcih0cnVlKTtcXFxcbiAgICB9LFxcXFxuICAgIOWFs+mXreWGhee9ruaKmOWPoOWKn+iDvSgpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9sZElubmVyKGZhbHNlKTtcXFxcbiAgICB9LFxcXFxuICAgIOesrOWHoOihjOW8gOWni+aKmOWPoChpbmRleCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5mb2xkSW5kZXgoaW5kZXgpO1xcXFxuICAgIH0sXFxcXG4gICAg5oqY5Y+g5oyJ6ZKu5qC35byPKGxheW91dCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5mb2xkTGF5b3V0KGxheW91dClcXFxcbiAgICB9LFxcXFxuICAgIOaKmOWPoChmb2xkKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmZvbGQoZm9sZCk7XFxcXG4gICAgfSxcXFxcbiAgICDpgInkuK3nmoTliIbnsbvpopzoibIoY29sb3IpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuY29sb3IoY29sb3IpO1xcXFxuICAgIH0sXFxcXG4gICAg5ZSv5LiA5qCH6K+GKG1UYWcpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMudGFnKG1UYWcpXFxcXG4gICAgfSxcXFxcbiAgICDmt7vliqDliIbnsbvlrprkvY0ocnVsZU9iaikge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5hZGQocnVsZU9iaik7XFxcXG4gICAgfSxcXFxcbiAgICDlvIDlp4vmiZPpgKDliIbnsbsoKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkKCk7XFxcXG4gICAgfSxcXFxcblxcXFxufSlcXFxcbiQuZXhwb3J0cyA9IG5ldyBDYXRlZ29yaWVzSGVhZGVyKCk7XFxcXG4kLmV4cG9ydHNcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLpk77mjqXlpITnkIZb5LqMXSpcXFwiLFxcXCJwYXRoXFxcIjpcXFwidXJsLXByb2Nlc3NvclxcXCIsXFxcInJ1bGVcXFwiOlxcXCIvKipcXFxcbiAqIOacrOWcsOe9kemhteaPkuS7tumTvuaOpSBoaWtlcjovL2ZpbGVzL3J1bGVzL2pzL1VybFByb2Nlc3Nvci5qc1xcXFxuICog5a2Q6aG16Z2i6ZO+5o6lIGhpa2VyOi8vcGFnZS91cmwtcHJvY2Vzc29yXFxcXG4gKiDpgZPplb/ku5PlupPpk77mjqUgaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9Mjg0OVxcXFxuICog56CB5LqRIEdpdGVlIOmTvuaOpSBodHRwczovL2dpdGVlLmNvbS9yZWJvcm4wL0hpa2VyUnVsZXMvcmF3L21hc3Rlci9wbHVnaW5zL1VybFByb2Nlc3Nvci5qc1xcXFxuICovXFxcXG5mdW5jdGlvbiBVcmxQcm9jZXNzb3IoKSB7XFxcXG4gICAgdGhpcy5wYXJhbXMgPSB7fVxcXFxuICAgIHRoaXMucmVnZXhNYXAgPSBbXFxcXG4gICAgICAgIHtcXFxcbiAgICAgICAgICAgIHJlZzogJyh2b2R0eXBlfHZpZGVvdClcXFxcXFxcXFxcXFxcXFxcL1xcXFxcXFxcXFxcXFxcXFx3KycsXFxcXG4gICAgICAgICAgICBleGVjOiAoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyYW1zLnVybFxcXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvLVxcXFxcXFxcZCsuaHRtbC8sICctJyArIHRoaXMucGFyYW1zLnBhZ2UgKyAnLmh0bWwnKVxcXFxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKCh2b2R0eXBlfHZpZGVvdClcXFxcXFxcXC9cXFxcXFxcXHcrKS5odG1sLywgJyQxLScgKyB0aGlzLnBhcmFtcy5wYWdlICsgJy5odG1sJylcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSxcXFxcbiAgICAgICAge1xcXFxuICAgICAgICAgICAgcmVnOiAnXFxcXFxcXFxcXFxcXFxcXC8/W1xcXFxcXFxcXFxcXFxcXFx3XFxcXFxcXFxcXFxcXFxcXGRdKy0uKj8tLio/LS4qPy0uKj8tLio/LS4qPy0uKj8tXFxcXFxcXFxcXFxcXFxcXGQqLS0tXFxcXFxcXFxcXFxcXFxcXGQqLmh0bWwnLFxcXFxuICAgICAgICAgICAgZXhlYzogKCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmFtcy51cmxcXFxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcXFxcZCooLS0tLmh0bWwpLywgdGhpcy5wYXJhbXMucGFnZSArICckMScpXFxcXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oLS0tXFxcXFxcXFxkKy5odG1sKS8sIHRoaXMucGFyYW1zLnBhZ2UgKyAnJDEnKTsgLy8g5ou85o6l6aG156CBXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0sXFxcXG4gICAgICAgIHtcXFxcbiAgICAgICAgICAgIHJlZzogJygoXFxcXFxcXFxcXFxcXFxcXC92b2RcXFxcXFxcXFxcXFxcXFxcL3Nob3cpPyhcXFxcXFxcXFxcXFxcXFxcL2FyZWFcXFxcXFxcXFxcXFxcXFxcL1tcXFxcXFxcXFxcXFxcXFxcd1xcXFxcXFxcXFxcXFxcXFxkJV0rKT8oXFxcXFxcXFxcXFxcXFxcXC9ieVxcXFxcXFxcXFxcXFxcXFwvW1xcXFxcXFxcXFxcXFxcXFx3XFxcXFxcXFxcXFxcXFxcXGQlXSspPyhcXFxcXFxcXFxcXFxcXFxcL2lkXFxcXFxcXFxcXFxcXFxcXC9cXFxcXFxcXFxcXFxcXFxcZCspPyhcXFxcXFxcXFxcXFxcXFxcL2xldHRlclxcXFxcXFxcXFxcXFxcXFwvW1xcXFxcXFxcXFxcXFxcXFx3XFxcXFxcXFxcXFxcXFxcXGQlXSspPykoXFxcXFxcXFxcXFxcXFxcXC9wYWdlXFxcXFxcXFxcXFxcXFxcXC9cXFxcXFxcXFxcXFxcXFxcZCspPyhcXFxcXFxcXFxcXFxcXFxcL3llYXJcXFxcXFxcXFxcXFxcXFxcL1xcXFxcXFxcXFxcXFxcXFxkKyk/XFxcXFxcXFxcXFxcXFxcXC5odG1sJyxcXFxcbiAgICAgICAgICAgIGV4ZWM6ICgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcmVnRXhwID0gLygoXFxcXFxcXFwvdm9kXFxcXFxcXFwvc2hvdyk/KFxcXFxcXFxcL2FyZWFcXFxcXFxcXC9bXFxcXFxcXFx3XFxcXFxcXFxkJV0rKT8oXFxcXFxcXFwvYnlcXFxcXFxcXC9bXFxcXFxcXFx3XFxcXFxcXFxkJV0rKT8oXFxcXFxcXFwvaWRcXFxcXFxcXC9cXFxcXFxcXGQrKT8oXFxcXFxcXFwvbGV0dGVyXFxcXFxcXFwvW1xcXFxcXFxcd1xcXFxcXFxcZCVdKyk/KShcXFxcXFxcXC9wYWdlXFxcXFxcXFwvXFxcXFxcXFxkKyk/KFxcXFxcXFxcL3llYXJcXFxcXFxcXC9cXFxcXFxcXGQrKT9cXFxcXFxcXC5odG1sL1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmFtcy51cmxcXFxcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UocmVnRXhwLCAnJDEnICsgKFxcXFxcXFwiL3BhZ2UvXFxcXFxcXCIgKyB0aGlzLnBhcmFtcy5wYWdlKSArICckOCcgKyBcXFxcXFxcIi5odG1sXFxcXFxcXCIpXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICBdXFxcXG59XFxcXG5cXFxcbk9iamVjdC5hc3NpZ24oVXJsUHJvY2Vzc29yLnByb3RvdHlwZSwge1xcXFxuICAgIGNvbnN0cnVjdG9yOiBVcmxQcm9jZXNzb3IsXFxcXG4gICAgY2hlY2tQYXJhbXMoKSB7XFxcXG4gICAgICAgIGlmICghdGhpcy5wYXJhbXMudXJsKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7flhYjosIPnlKggLmJhc2VVcmwodXJsKSDkvKDlhaXpk77mjqXov5vooYzliJ3lp4vljJYhXFxcXFxcXCIpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKCF0aGlzLnBhcmFtcy5wYWdlKSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLor7flhYjosIPnlKggLnBhZ2UocGFnZSkg5Lyg5YWl6aG156CB6L+b6KGM5Yid5aeL5YyWIVxcXFxcXFwiKVxcXFxuICAgICAgICB9XFxcXG4gICAgfSxcXFxcbiAgICBiYXNlVXJsKHVybCl7XFxcXG4gICAgICAgIHRoaXMucGFyYW1zLnVybCA9IHVybFxcXFxuICAgICAgICByZXR1cm4gdGhpc1xcXFxuICAgIH0sXFxcXG4gICAgcGFnZShwYWdlKXtcXFxcbiAgICAgICAgdGhpcy5wYXJhbXMucGFnZSA9IHBhZ2VcXFxcbiAgICAgICAgcmV0dXJuIHRoaXNcXFxcbiAgICB9LFxcXFxuICAgIGFkZEV4dHJhKHJlZ0V4cCkge1xcXFxuICAgICAgICBpZiAocmVnRXhwLmNvbnN0cnVjdG9yID09PSBBcnJheSkge1xcXFxuICAgICAgICAgICAgdGhpcy5yZWdleE1hcCA9IHRoaXMucmVnZXhNYXAuY29uY2F0KHJlZ0V4cClcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHRoaXMucmVnZXhNYXAucHVzaChyZWdFeHApXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBkZWJ1ZygpIHtcXFxcbiAgICAgICAgdGhpcy5wYXJhbXMuZGVidWcgPSB0cnVlXFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgZXhlYygpIHtcXFxcbiAgICAgICAgdGhpcy5jaGVja1BhcmFtcygpXFxcXG4gICAgICAgIGxldCB0cnVlX3VybCA9ICcnXFxcXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yZWdleE1hcC5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAgICAgbGV0IHJlZ09iaiA9IHRoaXMucmVnZXhNYXBbaV07XFxcXG4gICAgICAgICAgICBsZXQgdXJsRXhwID0gcmVnT2JqLnJlZztcXFxcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdXJsRXhwID09PSAnc3RyaW5nJykge1xcXFxuICAgICAgICAgICAgICAgIHVybEV4cCA9IG5ldyBSZWdFeHAodXJsRXhwKVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKHVybEV4cC50ZXN0KHRoaXMucGFyYW1zLnVybCkpIHtcXFxcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJhbXMuZGVidWcpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbG9nKHVybEV4cC50b1N0cmluZygpKVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB0cnVlX3VybCA9IHJlZ09iai5leGVjKCk7XFxcXG4gICAgICAgICAgICAgICAgYnJlYWs7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHRydWVfdXJsKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZV91cmw7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJhbXMudXJsXFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIOiOt+WPluWkhOeQhue7k+aenCgpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhlYygpXFxcXG4gICAgfSxcXFxcbiAgICDpk77mjqUodXJsKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmJhc2VVcmwodXJsKVxcXFxuICAgIH0sXFxcXG4gICAg6aG156CBKHBhZ2UpIHtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXMucGFnZShwYWdlKVxcXFxuICAgIH0sXFxcXG4gICAg5o+S5YWl5paw5aSE55CG6KeE5YiZKHJlZ0V4cCkge1xcXFxuICAgICAgICByZXR1cm4gdGhpcy5hZGRFeHRyYShyZWdFeHApXFxcXG4gICAgfSxcXFxcbiAgICDosIPor5XmqKHlvI8oKSB7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLmRlYnVnKCk7XFxcXG4gICAgfVxcXFxufSlcXFxcbiQuZXhwb3J0cz1uZXcgVXJsUHJvY2Vzc29yKClcXFxcbiQuZXhwb3J0c1xcXFxuXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5LiA57qnKlxcXCIsXFxcInBhdGhcXFwiOlxcXCJ5anRvb2xcXFwiLFxcXCJydWxlXFxcIjpcXFwiZnVuY3Rpb24gY29udmVydDEoc3RyKSB7XFxcXG4gICAgbGV0IGMgPSBzdHIuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpXFxcXG4gICAgcmV0dXJuIHtcXFxcbiAgICAgICAg5YiX6KGoOiBjWzBdLFxcXFxuICAgICAgICDmoIfpopg6IGNbMV0sXFxcXG4gICAgICAgIOWbvueJhzogY1syXSxcXFxcbiAgICAgICAg5o+P6L+wOiBjWzNdLFxcXFxuICAgICAgICDpk77mjqU6IGNbNF1cXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIG1lcmdlKHNvdXJjZSwgdGFyZ2V0KSB7XFxcXG4gICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpXFxcXG4gICAgZm9yIChsZXQgaSBpbiBrZXlzKSB7XFxcXG4gICAgICAgIHRhcmdldFtrZXlzW2ldXSA9IHNvdXJjZVtrZXlzW2ldXVxcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24g5LiA57qnKG9iaikge1xcXFxuICAgIHZhciBkID0gW107XFxcXG4gICAgaWYgKCQudHlwZShvYmopID09IFxcXFxcXFwic3RyaW5nXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgb2JqID0gY29udmVydDEob2JqKVxcXFxuICAgIH1cXFxcbiAgICBpZiAob2JqLuinhOWImSkge1xcXFxuICAgICAgICBsZXQgYyA9IGNvbnZlcnQxKG9iai7op4TliJkpXFxcXG4gICAgICAgIG1lcmdlKGMsIG9iailcXFxcbiAgICB9XFxcXG4gICAgbGV0IGFyciA9IHBkZmEoZ2V0UmVzQ29kZSgpLCBvYmou5YiX6KGoKTtcXFxcbiAgICAgICBpZiAob2JqLuWIl+ihqOWkhOeQhiAhPSBudWxsKSB7XFxcXG4gICAgICAgICAgICBhcnIgPSBvYmou6ZO+5o6l5aSE55CGKGFycilcXFxcbiAgICAgICAgfVxcXFxuICAgIGZvciAobGV0IGl0IG9mIGFycikge1xcXFxuICAgICAgICBsZXQgdXJsID0gcGQoaXQsIG9iai7pk77mjqUpXFxcXG4gICAgICAgIGlmIChvYmou6ZO+5o6l5aSE55CGICE9IG51bGwpIHtcXFxcbiAgICAgICAgICAgIHVybCA9IG9iai7pk77mjqXlpITnkIYodXJsKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGxldCB0aXRsZSA9IHBkZmgoaXQsIG9iai7moIfpopgpXFxcXG4gICAgICAgIGlmIChvYmou5qCH6aKY5aSE55CGICE9IG51bGwpIHtcXFxcbiAgICAgICAgICAgIHRpdGxlID0gb2JqLuagh+mimOWkhOeQhih0aXRsZSlcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcGljID0gcGQoaXQsIG9iai7lm77niYcpXFxcXG4gICAgICAgIGlmIChvYmou5Zu+54mH5aSE55CGICE9IG51bGwpIHtcXFxcbiAgICAgICAgICAgIHBpYyA9IG9iai7lm77niYflpITnkIYocGljKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogb2JqLuagh+mimCA/IHBkZmgoaXQsIG9iai7moIfpopgpIDogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogdXJsKycjYXV0b0NhY2hlIycsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGRlc2M6IG9iai7mj4/ov7AgPyBwZGZoKGl0LCBvYmou5o+P6L+wKSA6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBwaWMsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIHl0aXRsZTogdGl0bGUsXFxcXG4gICAgICAgICAgICAgICAgeXBpYzogcGljLFxcXFxuICAgICAgICAgICAgICAgIHl1cmw6IHVybC5yZXBsYWNlKCdoaWtlcjovL2VtcHR5IyMnLCcnKVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcblxcXFxuICAgIH1cXFxcbiAgICBzZXRSZXN1bHQoZCk7XFxcXG59XFxcXG52YXIgdG9vbCA9IHtcXFxcbiAgICDkuIDnuqc6IOS4gOe6p1xcXFxufVxcXFxuJC5leHBvcnRzID0gdG9vbFxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuS4gOe6p1vkuoxdKlxcXCIsXFxcInBhdGhcXFwiOlxcXCJ5aWppXFxcIixcXFwicnVsZVxcXCI6XFxcImZ1bmN0aW9uIOS4gOe6pygpIHt9O1xcXFxyXFxcXG5PYmplY3QuYXNzaWduKOS4gOe6py5wcm90b3R5cGUsIHtcXFxcclxcXFxuXFxcXHRjb25zdHJ1Y3Rvcjog5LiA57qnLFxcXFxyXFxcXG5cXFxcdHRlc3QoKSB7fSxcXFxcclxcXFxuXFxcXHTojrflj5bmupDnoIEodXJsLCBoZWFkZXIpIHtyZXR1cm4gZmV0Y2godHJ1ZV91cmwsIHtoZWFkZXJzOiBoZWFkZXIgfHwgeydVc2VyLUFnZW50JzogUENfVUF9fSkgfSwvLyDpu5jorqTnu5/kuIDkvb/nlKhNT0JJTEVfVUFcXFxcclxcXFxuXFxcXHTmkJzntKLmoYbmnrYocGFnZSkge1xcXFxyXFxcXG5cXFxcdFxcXFx0aWYgKHBhZ2UgPT0gJzEnKSB7XFxcXG4vKlxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRkLnB1c2goe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdHRpdGxlOiBcXFxcXFxcIuaQnOe0ouacrOinhOWImVxcXFxcXFwiLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdHVybDogXFxcXFxcXCInaGlrZXI6Ly9zZWFyY2g/cnVsZT1cXFxcXFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFxcXFxcIiZzPScraW5wdXRcXFxcXFxcIixcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRkZXNjOiBcXFxcXFxcIiBcXFxcXFxcIixcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRjb2xfdHlwZTogXFxcXFxcXCJpbnB1dFxcXFxcXFwiXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdH0pO1xcXFxuKi9cXFxcclxcXFxuXFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHR9LFxcXFxyXFxcXG5cXFxcdOiOt+WPlumTvuaOpShwYWdlLCByZWdleCkge1xcXFxyXFxcXG5cXFxcdFxcXFx0bGV0IHRydWVfdXJsID0gZ2V0TXlWYXIoJ2hlYWRlci51cmwnLCBNWV9VUkwpO1xcXFxyXFxcXG5cXFxcdFxcXFx0Ly9sZXQg6ZO+5o6l5aSE55CG5bel5YW3ID0gcmVxdWlyZUNhY2hlKGNvbmZpZy7pk77mjqXlpITnkIblt6Xlhbfkvp3otZYpXFxcXHJcXFxcblxcXFx0XFxcXHQvL2xldCDpk77mjqXlpITnkIblt6XlhbcgPSByZXF1aXJlQ2FjaGUoJ2h0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTI4NDknKVxcXFxyXFxcXG5cXFxcdFxcXFx0Ly9sZXQg6ZO+5o6l5aSE55CG5bel5YW3ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvdXJsLXByb2Nlc3NvcicpXFxcXHJcXFxcblxcXFx0XFxcXHRsZXQg6ZO+5o6l5aSE55CG5bel5YW3ID0gcmVxdWlyZUNhY2hlKCdodHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD0yODQ5JylcXFxcclxcXFxuXFxcXHRcXFxcdHRydWVfdXJsID0g6ZO+5o6l5aSE55CG5bel5YW3XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC7pk77mjqUodHJ1ZV91cmwpXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC7pobXnoIEocGFnZSlcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0LuaPkuWFpeaWsOWkhOeQhuinhOWImShyZWdleCB8fCBbXSlcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0LuiOt+WPluWkhOeQhue7k+aenCgpO1xcXFxyXFxcXG5cXFxcdFxcXFx0cmV0dXJuIHRydWVfdXJsO1xcXFxyXFxcXG5cXFxcdH0sXFxcXHJcXFxcblxcXFx05omT6YCg5YiG57G7KHJ1bGVMaXN0KSB7XFxcXHJcXFxcblxcXFx0XFxcXHQvLyAgbGV0IGh0bWxDYXRlZ29yaWVzID0gcmVxdWlyZUNhY2hlKGNvbmZpZy7liqjmgIHliIbnsbvkvp3otZYpXFxcXHJcXFxcblxcXFx0XFxcXHQvL2xldCBodG1sQ2F0ZWdvcmllcyA9IHJlcXVpcmVDYWNoZSgnaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9MjcwNScpXFxcXHJcXFxcblxcXFx0XFxcXHRpZiAoIXJ1bGVMaXN0KSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdGxldCDliIbnsbvlrprkvY0gPSBbe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05LiA57qn5YiG57G7OiDkuIDnuqflrprkvY1BLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05a2Q5YiG57G7OiDnu5/kuIDlrprkvY1CIHx8IOS4gOe6p+WumuS9jUIsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHTliIbnsbvpk77mjqU6IHvkuozmrKHlpITnkIYodXJsKSB7dHJ5IHtyZXR1cm4g5LiA57qn5aSE55CGQyh1cmwpfSBjYXRjaCAoZSkge3JldHVybiB1cmx9fX1cXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0fV1cXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0aWYgKOS6jOe6p+WumuS9jUEgJiYgKOe7n+S4gOWumuS9jUIgfHwg5LqM57qn5a6a5L2NQikpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHTliIbnsbvlrprkvY0ucHVzaCh7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOS4gOe6p+WIhuexuzog5LqM57qn5a6a5L2NQSxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05a2Q5YiG57G7OiDnu5/kuIDlrprkvY1CIHx8IOS6jOe6p+WumuS9jUIsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOWIhuexu+mTvuaOpToge+S6jOasoeWkhOeQhih1cmwpIHt0cnkge3JldHVybiDkuoznuqflpITnkIZDKHVybCl9IGNhdGNoIChlKSB7cmV0dXJuIHVybH19fVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdH0pXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0aWYgKOS4iee6p+WumuS9jUEgJiYgKOe7n+S4gOWumuS9jUIgfHwg5LiJ57qn5a6a5L2NQikpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHTliIbnsbvlrprkvY0ucHVzaCh7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOS4gOe6p+WIhuexuzog5LiJ57qn5a6a5L2NQSxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05a2Q5YiG57G7OiDnu5/kuIDlrprkvY1CIHx8IOS4iee6p+WumuS9jUIsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOWIhuexu+mTvuaOpToge+S6jOasoeWkhOeQhih1cmwpIHt0cnkge3JldHVybiDkuInnuqflpITnkIZDKHVybCl9IGNhdGNoIChlKSB7cmV0dXJuIHVybH19fVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdH0pXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0aWYgKOWbm+e6p+WumuS9jUEgJiYgKOe7n+S4gOWumuS9jUIgfHwg5Zub57qn5a6a5L2NQikpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHTliIbnsbvlrprkvY0ucHVzaCh7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOS4gOe6p+WIhuexuzog5Zub57qn5a6a5L2NQSxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdFxcXFx05a2Q5YiG57G7OiDnu5/kuIDlrprkvY1CIHx8IOWbm+e6p+WumuS9jUIsXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdFxcXFx0XFxcXHRcXFxcdOWIhuexu+mTvuaOpToge+S6jOasoeWkhOeQhih1cmwpIHt0cnkge3JldHVybiDlm5vnuqflpITnkIZDKHVybCl9IGNhdGNoIChlKSB7cmV0dXJuIHVybH19fVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdH0pXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdH1cXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0cnVsZUxpc3QgPSDliIbnsbvlrprkvY07XFxcXHJcXFxcblxcXFx0XFxcXHR9XFxcXHJcXFxcblxcXFx0XFxcXHQvLyAnMCcg5Li66buY6K6k5LiN5oqY5Y+g77yMJzEnIOS4uum7mOiupOaKmOWPoFxcXFxyXFxcXG5cXFxcdFxcXFx0Y29uc3Qg5b2T5YmN5oqY5Y+g54q25oCBID0gZ2V0TXlWYXIoJ2hlYWRlci5mb2xkJywgJzAnKVxcXFxyXFxcXG5cXFxcdFxcXFx0Ly8g5byV5YWl5Yqo5oCB5YiG57G75L6d6LWWXFxcXHJcXFxcblxcXFx0XFxcXHRsZXQgaHRtbENhdGVnb3JpZXMgPSByZXF1aXJlQ2FjaGUoJ2h0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTI3MDUnKVxcXFxyXFxcXG5cXFxcdFxcXFx0dmFyIGdldFJhbmdlQ29sb3JzID0gZnVuY3Rpb24oKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdHJldHVybiAnIycgKyAoJzAwMDAwJyArIChNYXRoLnJhbmRvbSgpICogMHgxMDAwMDAwIDw8IDApLnRvU3RyaW5nKDE2KSkuc3Vic3RyKC02KTtcXFxcclxcXFxuXFxcXHRcXFxcdH0gLy8g6ZqP5py66YCJ5Lit55qE5YiG57G76aKc6ImyXFxcXHJcXFxcblxcXFx0XFxcXHR2YXIgY29sb3VyO1xcXFxyXFxcXG5cXFxcdFxcXFx0aWYgKOWIhuexu+minOiJsiAhPT0gJycpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Y29sb3VyID0g5YiG57G76aKc6ImyXFxcXHJcXFxcblxcXFx0XFxcXHR9IGVsc2Uge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRjb2xvdXIgPSBnZXRSYW5nZUNvbG9ycygpXFxcXHJcXFxcblxcXFx0XFxcXHR9XFxcXHJcXFxcblxcXFx0XFxcXHRodG1sQ2F0ZWdvcmllcy7nlYzpnaIoZClcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ly8u5YiG57G76ZO+5o6lKHRydWVfdXJsKVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQu5rqQ56CBKGh0bWwpXFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC7pobXnoIEocGFnZSlcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Lua3u+WKoOWIhuexu+WumuS9jShydWxlTGlzdClcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0LuW8gOWQr+WGhee9ruaKmOWPoOWKn+iDvSgpIC8vIOW/hemhu1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQu5oqY5Y+gKOW9k+WJjeaKmOWPoOeKtuaAgSkgLy8g5b+F6aG7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC7mipjlj6DmjInpkq7moLflvI8oe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdHRpdGxlOiDlvZPliY3mipjlj6DnirbmgIEgPT0gXFxcXFxcXCIxXFxcXFxcXCIgPyBcXFxcXFxcIuKAnOKAnOKAneKAnTxiaWc+PGI+PGZvbnQgY29sb3I9JyM1OTU5QUInPlxcXFxcXFwiICsg5Yqo5oCB57yp5bCPICsgXFxcXFxcXCI8L2ZvbnQ+PC9iPjwvYmlnPlxcXFxcXFwiIDogXFxcXFxcXCLigJzigJzigJ3igJ08YmlnPjxiPjxmb250IGNvbG9yPScjRjc1RDU5Jz5cXFxcXFxcIiArIOWKqOaAgeaJqeWxlSArIFxcXFxcXFwiPC9mb250PjwvYj48L2JpZz5cXFxcXFxcIlxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHR9KSAvLyDlj6/pgIlcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ly8gLuesrOWHoOihjOW8gOWni+aKmOWPoCgyKSAvLyDlj6/pgIlcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ly8gLuaKmOWPoOaMiemSruagt+W8jyh7IOaKmOWPoOaMiemSruaPkuWFpeihjDogMiB9KSAgLy8g5Y+v6YCJ77yM5L2G5b+F6aG75YWI6LCD55SoIC7nrKzlh6DooYzlvIDlp4vmipjlj6AoaW5kZXgp77yM54S25ZCO5YaN5Lyg5YWlIHsg5oqY5Y+g5oyJ6ZKu5o+S5YWl6KGMOiBpbmRleCB9XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC7pgInkuK3nmoTliIbnsbvpopzoibIoY29sb3VyKVxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHQu5byA5aeL5omT6YCg5YiG57G7KCk7XFxcXHJcXFxcblxcXFx0fSxcXFxcclxcXFxuXFxcXHJcXFxcblxcXFx055Sf5oiQ54mH5Y2VKGQsaHRtbCkge1xcXFxyXFxcXG5cXFxcclxcXFxuXFxcXHRcXFxcdHZhciDliJfooahcXFxcclxcXFxuXFxcXHRcXFxcdHZhciDmoIfpophcXFxcclxcXFxuXFxcXHRcXFxcdHZhciDmj4/ov7BcXFxcclxcXFxuXFxcXHRcXFxcdHZhciDlm77niYdcXFxcclxcXFxuXFxcXHRcXFxcdHZhciDpk77mjqVcXFxcclxcXFxuXFxcXHJcXFxcblxcXFx0XFxcXHRpZiAo5qGG5p6257G75Z6LID09PSAnbXl1aS12b2RsaXN0Jykge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTliJfooaggPSAnLm15dWktdm9kbGlzdCYmbGknO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmoIfpopggPSAnaDQmJlRleHQnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmj4/ov7AgPSAnLnBpYy10YWd8fC5waWMtdGV4dCYmVGV4dCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICcubGF6eWxvYWQmJmRhdGEtb3JpZ2luYWwnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdC8vbG9nKCfmoYbmnrbnsbvlnovCt215dWktdm9kbGlzdCcpXFxcXHJcXFxcblxcXFx0XFxcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJyNkYXRhX2xpc3QnKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9ICcjZGF0YV9saXN0JiZsaSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOagh+mimCA9ICdhJiZ0aXRsZSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOaPj+i/sCA9ICdlbSYmVGV4dCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICdpbWcmJmRhdGEtc3JjbCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOmTvuaOpSA9ICdhJiZocmVmJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ly9sb2coJ+ahhuaetuexu+Wei8K3ZGF0YV9saXN0JylcXFxcclxcXFxuXFxcXHRcXFxcdH0gZWxzZSBpZiAo5qGG5p6257G75Z6LID09PSAnZmVkLWxpc3QtdGl0bGUnKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9ICcuZmVkLWxpc3QtaW5mbyYmbGknO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmoIfpopggPSAnLmZlZC1saXN0LXRpdGxlJiZUZXh0JztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05o+P6L+wID0gJy5mZWQtdGV4dC1jZW50ZXImJlRleHQnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTlm77niYcgPSAnYSYmZGF0YS1vcmlnaW5hbCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOmTvuaOpSA9ICdhJiZocmVmJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0Ly9sb2coJ+ahhuaetuexu+Wei8K3LmZlZC1saXN0LWluZm8nKVxcXFxyXFxcXG5cXFxcdFxcXFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICdpdGVtJykge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTliJfooaggPSAnYm9keSYmLml0ZW0nO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmoIfpopggPSAnaW1nJiZhbHQnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmj4/ov7AgPSAncCYmVGV4dCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICdpbWcmJnNyY2wnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTpk77mjqUgPSAnYSYmaHJlZic7XFxcXHJcXFxcblxcXFx0XFxcXHR9IGVsc2UgaWYgKOahhuaetuexu+WeiyA9PT0gJ21vZHVsZS1pdGVtcycpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05YiX6KGoID0gJy5tb2R1bGUtaXRlbXMmJi5tb2R1bGUtaXRlbSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOagh+mimCA9ICdhJiZ0aXRsZSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOaPj+i/sCA9ICcubW9kdWxlLWl0ZW0tdGV4dCYmVGV4dCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICdpbWd8fC5sYXp5JiZkYXRhLXNyYyc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOmTvuaOpSA9ICdhJiZocmVmJztcXFxcclxcXFxuXFxcXHRcXFxcdH0gZWxzZSBpZiAo5qGG5p6257G75Z6LID09PSAncGFjay15a3BhY2snKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9ICdib2R5JiYucGFjay15a3BhY2snO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmoIfpopggPSAnYSYmdGl0bGUnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmj4/ov7AgPSAnc3BhbiwtMSYmVGV4dCc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICcuZWNsYXp5JiZkYXRhLW9yaWdpbmFsJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcXFxyXFxcXG5cXFxcdFxcXFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICdzdHVpLXZvZGxpc3QnKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9ICcuc3R1aS12b2RsaXN0JiZsaSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOagh+mimCA9ICdhJiZ0aXRsZSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOaPj+i/sCA9ICcucGljLXRleHQmJlRleHQnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTlm77niYcgPSAnLmxhenlsb2FkfHxhJiZkYXRhLW9yaWdpbmFsJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcXFxyXFxcXG5cXFxcdFxcXFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICd2b2RsaXN0Jykge1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTliJfooaggPSAnLnZvZGxpc3QmJmxpJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05qCH6aKYID0gJ2EmJnRpdGxlJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05o+P6L+wID0gJ2EmJlRleHQnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTlm77niYcgPSAnLmxhenlsb2FkJiZkYXRhLW9yaWdpbmFsJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx06ZO+5o6lID0gJ2EmJmhyZWYnO1xcXFxyXFxcXG5cXFxcdFxcXFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICfmtYvor5UnKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9ICdib2R5JiZhJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05qCH6aKYID0gJ2JvZHkmJmEnO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmj4/ov7AgPSAnYm9keSYmYSc7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9ICdib2R5JiZhJztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx06ZO+5o6lID0gJ2JvZHkmJmEnO1xcXFxyXFxcXG5cXFxcdFxcXFx0fSBlbHNlIGlmICjmoYbmnrbnsbvlnosgPT09ICcnKSB7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWIl+ihqCA9IOahhuaetuWIl+ihqDtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx05qCH6aKYID0g5qGG5p625qCH6aKYO1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHTmj4/ov7AgPSDmoYbmnrbmj4/ov7A7XFxcXHJcXFxcblxcXFx0XFxcXHRcXFxcdOWbvueJhyA9IOahhuaetuWbvueJhztcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx06ZO+5o6lID0g5qGG5p626ZO+5o6lO1xcXFxyXFxcXG5cXFxcdFxcXFx0fVxcXFxyXFxcXG5cXFxcdFxcXFx0bGV0IGxpc3QgPSBwZGZhKGh0bWwsIOWIl+ihqCk7XFxcXHJcXFxcblxcXFx0XFxcXHRmb3IgKGxldCBrIGluIGxpc3QpIHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0ZC5wdXNoKHtcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHR0aXRsZTogcGRmaChsaXN0W2tdLCDmoIfpopgpLFxcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRcXFxcdGRlc2M6IHBkZmgobGlzdFtrXSwg5o+P6L+wKSxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHRpbWc6IHBkKGxpc3Rba10sIOWbvueJhykgKyAnQFJlZmVyZXI9JyxcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0XFxcXHR1cmw6IHBkKGxpc3Rba10sIOmTvuaOpSkrXFxcXFxcXCIjaW1tZXJzaXZlVGhlbWUjI2F1dG9DYWNoZSNcXFxcXFxcIixcXFxcclxcXFxuXFxcXHRcXFxcdFxcXFx0fSk7XFxcXHJcXFxcblxcXFx0XFxcXHR9XFxcXHJcXFxcblxcXFx0XFxcXHRkLnB1c2goe1xcXFxyXFxcXG5cXFxcdFxcXFx0XFxcXHRjb2xfdHlwZTogJ2JpZ19iaWdfYmxhbmtfYmxvY2snLFxcXFxyXFxcXG5cXFxcdFxcXFx0fSk7XFxcXHJcXFxcblxcXFx0fVxcXFxyXFxcXG59KVxcXFxyXFxcXG5cXFxcclxcXFxuJC5leHBvcnRzID0gbmV3IOS4gOe6pygpO1xcXFxyXFxcXG4kLmV4cG9ydHNcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlh73mlbDnu4Tku7YqXFxcIixcXFwicGF0aFxcXCI6XFxcInFzXFxcIixcXFwicnVsZVxcXCI6XFxcImZ1bmN0aW9uIOS8mOWMlui3r+e6v+eroOiKguaVsOaNrijlpJrot6/nur/lkKYsIOa6kOaVsOaNriwg6Lev57q/5YiX6KGoLCDot6/nur/lkI0sIOmAiembhuaAu+WIl+ihqCwg6YCJ6ZuG5YiX6KGoLCDpm4blkI0sIOmbhnVybCwg5YmN57yALCDmoIfpopgsIOWbvueJhykge1xcXFxuXFxcXG4gICAgLy/lvZPlpJrot6/nur/lkKYg6YCJ6ZuG5oC75YiX6KGo5Li656m6XFxcXG4gICAgLy/mnIDnu4jov5Tlm54gW3t0aXRsZTogJ+i3r+e6v+WQjScsbGlzdDogW3t0aXRsZTon6YCJ6ZuG5ZCNJyx1cmw6J+mAiembhnVybCcsLi4ufV0sc2pzczon5LiL6L296LWE5paZJ30sLi4uLl1cXFxcbiAgICAvL+mAiembhuWIl+ihqCDnrKzkuIDpobnmmK9jc3PpgInmi6nlmajvvIzkuYvlkI7lj6/ku6XnlKgk5YiG5Ymy5re75Yqg6KaB5Yig6Zmk56ug6IqC5ZCNXFxcXG5cXFxcblxcXFxuICAgIHZhciDnq6DoioJqc29uID0gW107XFxcXG4gICAgdmFyIOWNlei3r+e6v+eroOiKgiA9ICfnq6DoioLliJfooagnXFxcXG5cXFxcbiAgICB2YXIg5YiX6KGo5ZCNID0gW107XFxcXG4gICAgaWYgKCHlpJrot6/nur/lkKYpIHtcXFxcblxcXFxuICAgICAgICDliJfooajlkI0ucHVzaCjljZXot6/nur/nq6DoioIpXFxcXG5cXFxcbiAgICB9IGVsc2Uge1xcXFxuXFxcXG4gICAgICAgIHBkZmEo5rqQ5pWw5o2uLCDot6/nur/liJfooagpLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcXFxuICAgICAgICAgICAg5YiX6KGo5ZCNLnB1c2gocGRmaChkYXRhLCDot6/nur/lkI0pKVxcXFxuICAgICAgICB9KTtcXFxcblxcXFxuICAgIH1cXFxcblxcXFxuICAgIHZhciDpm4bmlbDnu4QgPSBbXTtcXFxcblxcXFxuXFxcXG52YXIg5o6S6Zmk56ug6IqCID0gW107XFxcXG5pZijpgInpm4bliJfooaguaW5jbHVkZXMoJyQnKSl7XFxcXG7mjpLpmaTnq6DoioIgPSDpgInpm4bliJfooaguc3BsaXQoJyQnKVxcXFxu6YCJ6ZuG5YiX6KGoID0g5o6S6Zmk56ug6IqCLnNoaWZ0KClcXFxcbn1cXFxcblxcXFxuICAgIGlmICgh5aSa6Lev57q/5ZCmKSB7XFxcXG4gICAgICAgIOmbhuaVsOe7hC5wdXNoKHBkZmEo5rqQ5pWw5o2uLCDpgInpm4bliJfooagpKVxcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIHBkZmEo5rqQ5pWw5o2uLCDpgInpm4bmgLvliJfooagpLmZvckVhY2goZnVuY3Rpb24oZGF0YSkge1xcXFxuICAgICAgICAgICAg6ZuG5pWw57uELnB1c2gocGRmYShkYXRhLCDpgInpm4bliJfooagpKVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG5cXFxcblxcXFxuICAgIGZvciAobGV0IGkgaW4g6ZuG5pWw57uEKSB7XFxcXG5cXFxcbiAgICAgICAgdmFyIGRvTGlzdCA9IFtdO1xcXFxuXFxcXG7mjpLpmaTnq6DoioIuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7XFxcXG4gICAgdmFyIOagh+ivhmlkID0g6ZuG5pWw57uEW2ldLmZpbmRJbmRleCjov5Tlm54gPT4g6L+U5ZueLmluZGV4T2YoZGF0YSkgIT0gLTEpO1xcXFxuICAgIGlmICjmoIfor4ZpZCAhPSAtMSkge1xcXFxuICAgICAg6ZuG5pWw57uEW2ldLnNwbGljZSjmoIfor4ZpZCwgMSlcXFxcbiAgICB9O1xcXFxuICB9KTtcXFxcblxcXFxuICAgICAgICBmb3IgKGxldCBpdCBvZiDpm4bmlbDnu4RbaV0pIHtcXFxcbiAgICAgICAgICAgIHZhciBkb0xpc3R1cmwgPSBwZGZoKGl0LCDpm4Z1cmwpXFxcXG4gICAgICAgICAgICBkb0xpc3R1cmwgPSBkb0xpc3R1cmwuaW5jbHVkZXMoXFxcXFxcXCJodHRwXFxcXFxcXCIpID8gZG9MaXN0dXJsIDog5YmN57yAICsgZG9MaXN0dXJsXFxcXG4gICAgICAgICAgICBkb0xpc3QucHVzaCh7XFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08c21hbGw+JyArIHBkZmgoaXQsIOmbhuWQjSkgKyAnPC9zbWFsbD4nLFxcXFxuICAgICAgICAgICAgICAgIHVybDogZG9MaXN0dXJsXFxcXG4gICAgICAgICAgICB9KVxcXFxuICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgdmFyIGJvb2tOYW1lID0gIeWkmui3r+e6v+WQpiA/IOagh+mimCA6IOagh+mimCArICctJyArIOWIl+ihqOWQjVtpXVxcXFxuXFxcXG4gICAgICAgIOeroOiKgmpzb24ucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTog5YiX6KGo5ZCNW2ldLFxcXFxuICAgICAgICAgICAgbGlzdDogZG9MaXN0LFxcXFxuICAgICAgICAgICAgc2pzczoge1xcXFxuICAgICAgICAgICAgICAgIGNoYXB0ZXJMaXN0OiBkb0xpc3QsXFxcXG4gICAgICAgICAgICAgICAgaW5mbzoge1xcXFxuICAgICAgICAgICAgICAgICAgICBib29rTmFtZTogYm9va05hbWUsIC8v5ryr55S75ZCN56ewLFxcXFxuICAgICAgICAgICAgICAgICAgICBydWxlTmFtZTogTVlfUlVMRS50aXRsZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgYm9va1RvcFBpYzog5Zu+54mHLFxcXFxuICAgICAgICAgICAgICAgICAgICBwYXJzZUNvZGU6IGRvd25sb2FkbGF6eSxcXFxcbiAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgIGRlZmF1bHRWaWV3OiBcXFxcXFxcIjFcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4g56ug6IqCanNvblxcXFxufVxcXFxuXFxcXG5cXFxcbmZ1bmN0aW9uIOa3u+WKoOWktOmDqOWIl+ihqChkLCDmoIfpopgsIOWbvueJhywg5o+P6L+wLCDkvZzogIUsIOaXtumXtCwg5YiG57G7LOmhtVVSTCkge1xcXFxuXFxcXG4gICAg5qCH6aKYID0gIeagh+mimCA/ICcnIDog5qCH6aKYICsgJ1xcXFxcXFxcbidcXFxcbiAgICDlm77niYcgPSAh5Zu+54mHID8gJycgOiDlm77niYdcXFxcbiAgICDmj4/ov7AgPSAh5o+P6L+wID8gJycgOiDmj4/ov7AucmVwbGFjZShcXFxcXFxcIuabtOaWsOiHs++8mlxcXFxcXFwiLCAnJylcXFxcblxcXFxuICAgIOS9nOiAhSA9ICHkvZzogIUgPyAnJyA6ICdcXFxcXFxcXG4nICsg5L2c6ICFXFxcXG4gICAg5pe26Ze0ID0gIeaXtumXtCA/ICcnIDogJ1xcXFxcXFxcbicgKyDml7bpl7RcXFxcbiAgICDliIbnsbsgPSAh5YiG57G7ID8gJycgOiAnXFxcXFxcXFxuJyArIOWIhuexu1xcXFxuXFxcXG5cXFxcbiAgICB2YXIg5aS06YOodGl0bGUgPSBbJ+KAmOKAmOKAmeKAmTxiPicsJzwvYj4gPHNtYWxsPjxmb250IGNvbG9yPSNGQTcyOTg+JywnPC9mb250PicsJzwvc21hbGw+J11cXFxcbiAgICB2YXIg5aS06YOoZGVzYyA9IFsn4oCY4oCY4oCZ4oCZPGZvbnQgY29sb3I9I2Y4ZWNjOT4nLCc8L2ZvbnQ+J11cXFxcblxcXFxuXFxcXG5cXFxcbiAgICDlpLTpg6h0aXRsZSA9IOWktOmDqHRpdGxlWzBdK+agh+mimCvlpLTpg6h0aXRsZVsxXSvmj4/ov7Ar5aS06YOodGl0bGVbMl0r5L2c6ICFK+WktOmDqHRpdGxlWzNdXFxcXG5cXFxcbiAgICDlpLTpg6hkZXNjID0g5aS06YOoZGVzY1swXSvml7bpl7Qr5YiG57G7K+WktOmDqGRlc2NbMV1cXFxcblxcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiDlpLTpg6h0aXRsZSxcXFxcbiAgICAgICAgZGVzYzog5aS06YOoZGVzYyxcXFxcbiAgICAgICAgcGljX3VybDog5Zu+54mHLFxcXFxuICAgICAgICB1cmw6ICdoaWtlcjovL3NlYXJjaD9zPScrZ2V0UGFyYW0oJ05hbWUnKSsnJnJ1bGU96ZiF5ryr5ZCbJyxcXFxcbiAgICAgICAgY29sX3R5cGU6ICdtb3ZpZV8xX3ZlcnRpY2FsX3BpY19ibHVyJ1xcXFxuICAgIH0pO1xcXFxuXFxcXG59XFxcXG5cXFxcblxcXFxuZnVuY3Rpb24g5re75Yqg566A5LuLKGQsIOaVsOaNrua6kCwg6aG1VVJMLCDlm77niYcpIHtcXFxcbiAgICAvL+iOt+WPluaVsOaNrlxcXFxuICAgIHZhciDnroDku4vlhoXlrrkgPSDmlbDmja7mupBcXFxcbiAgICDnroDku4vlhoXlrrkgPSDnroDku4vlhoXlrrkucmVwbGFjZShcXFxcXFxcIueugOS7i++8mlxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKS5yZXBsYWNlKFxcXFxcXFwi5LuL57uNOlxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKS5yZXBsYWNlKFxcXFxcXFwi5ryr55S7XFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpLnJlcGxhY2UoXFxcXFxcXCLigKbigKZcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikucmVwbGFjZShcXFxcXFxcIueugOS7i1xcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKVxcXFxuXFxcXG4gICAgdmFyIOeugOS7i+WGheWuueaUtjtcXFxcbiAgICBpZiAo566A5LuL5YaF5a65Lmxlbmd0aCA+IDQ1KSB7XFxcXG4gICAgICAgIOeugOS7i+WGheWuueaUtiA9IOeugOS7i+WGheWuuS5zdWJzdHIoMCwgNDUpICsgJy4uLidcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICDnroDku4vlhoXlrrnmlLYgPSDnroDku4vlhoXlrrkgKyAnLi4uJ1xcXFxuICAgIH1cXFxcblxcXFxuICAgIC8v5Zu+5qCH6I635Y+WXFxcXG4gICAgaWYgKCHlm77niYcpIHtcXFxcbiAgICAgICAg5Zu+54mHID0gJ2h0dHBzOi8vbGFubWVpZ3VvamlhbmcuY29tL3R1Ymlhby9xLzEwNy5wbmcnXFxcXG4gICAgfVxcXFxuXFxcXG4gICAgLy/pobVVUkwg6I635Y+WXFxcXG4gICAgaWYgKCHpobVVUkwpIHtcXFxcbiAgICAgICAg6aG1VVJMID0gTVlfUlVMRS50aXRsZVxcXFxuICAgIH1cXFxcblxcXFxuICAgIC8v5qCH6aKY5LiO566A5LuL5qC35byPXFxcXG4gICAgdmFyIG16dGV4dCA9IFxcXFxcXFwiJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PHNtYWxsPueugOS7izwvc21hbGw+PGJyPlxcXFxcXFwiXFxcXG4gICAgdmFyIGJ0dGl0bGUgPSAnPGZvbnQgY29sb3I9XFxcXFxcXCIjMDk4QUMxXFxcXFxcXCI+5ryr55S7566A5LuLICA8L2ZvbnQ+PHNtYWxsPjxzbWFsbD48Zm9udCBjb2xvcj1cXFxcXFxcIiNmNDc5ODNcXFxcXFxcIj7nroDku4vmlLY+PC9mb250Pjwvc21hbGw+PC9zbWFsbD4nXFxcXG5cXFxcbiAgICAvL+WxleW8gOS4juaUtue8qeaTjeS9nFxcXFxuICAgIHZhciBqaiA9IGdldE15VmFyKOmhtVVSTCArIFxcXFxcXFwi566A5LuL5pS2XFxcXFxcXCIsIFxcXFxcXFwi5bey5pS26LW3XFxcXFxcXCIpO1xcXFxuICAgIHZhciBqanVybCA9ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgo566A5LuL5YaF5a65LCDnroDku4vlhoXlrrnmlLYsIOaUtiwg5pS25YaF5a65LCDlvZPliY1VUkwpID0+IHtcXFxcbiAgICAgICAgdmFyIGpzYmwgPSDlvZPliY1VUkwgKyBcXFxcXFxcIueugOS7i+aUtlxcXFxcXFwiO1xcXFxuICAgICAgICB2YXIgamogPSBnZXRNeVZhcijlvZPliY1VUkwgKyBcXFxcXFxcIueugOS7i+aUtlxcXFxcXFwiLCBcXFxcXFxcIuW3suaUtui1t1xcXFxcXFwiKTtcXFxcbiAgICAgICAgamogPSBqaiA9PSBcXFxcXFxcIuW3suaUtui1t1xcXFxcXFwiID8gXFxcXFxcXCLlsZXlvIBcXFxcXFxcIiA6IFxcXFxcXFwi5bey5pS26LW3XFxcXFxcXCI7XFxcXG4gICAgICAgIHB1dE15VmFyKGpzYmwsIGpqKVxcXFxuICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IOW9k+WJjVVSTCArIFxcXFxcXFwiX2J0XFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICB0aXRsZTog5pS2LnJlcGxhY2UoXFxcXFxcXCLnroDku4vmlLZcXFxcXFxcIiwgamopXFxcXG4gICAgICAgIH0pXFxcXG5cXFxcbiAgICAgICAgdXBkYXRlSXRlbSh7XFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGlkOiDlvZPliY1VUkwgKyBcXFxcXFxcIl9telxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgdGl0bGU6IGpqID09IFxcXFxcXFwi5bey5pS26LW3XFxcXFxcXCIgPyDmlLblhoXlrrkucmVwbGFjZShcXFxcXFxcIueugOS7i1xcXFxcXFwiLCDnroDku4vlhoXlrrnmlLYpIDog5pS25YaF5a65LnJlcGxhY2UoXFxcXFxcXCLnroDku4tcXFxcXFxcIiwg566A5LuL5YaF5a65KVxcXFxuICAgICAgICB9KVxcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICB9LCDnroDku4vlhoXlrrksIOeugOS7i+WGheWuueaUtiwgYnR0aXRsZSwgbXp0ZXh0LCDpobVVUkwpXFxcXG5cXFxcblxcXFxuICAgIC8v5qCH6aKYXFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGJ0dGl0bGUucmVwbGFjZShcXFxcXFxcIueugOS7i+aUtlxcXFxcXFwiLCBqaiksXFxcXG4gICAgICAgIHVybDogamp1cmwsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImF2YXRhclxcXFxcXFwiLFxcXFxuICAgICAgICBwaWNfdXJsOiDlm77niYcsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcXFxcXCJfYnRcXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG5cXFxcbiAgICAvL+eugOS7i1xcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBqaiA9PSBcXFxcXFxcIuW3suaUtui1t1xcXFxcXFwiID8gbXp0ZXh0LnJlcGxhY2UoXFxcXFxcXCLnroDku4tcXFxcXFxcIiwg566A5LuL5YaF5a655pS2KSA6IG16dGV4dC5yZXBsYWNlKFxcXFxcXFwi566A5LuLXFxcXFxcXCIsIOeugOS7i+WGheWuuSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInJpY2hfdGV4dFxcXFxcXFwiLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXFxcXFwiX216XFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuXFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIOa3u+WKoOWIl+ihqOeroOiKgihkLCDmoIfpopjmlbDmja4sIOWIl+ihqOaVsOaNriwg6Kej5p6Q5Luj56CBLCDpobVVUkwsIOWbvueJhykge1xcXFxuXFxcXG5cXFxcbiAgICAvL2TkuI7lpJbnlYxk77yM5Li65ZCM5YaF5a2Y5Zyw5Z2A77yM5LiN55So6L+U5ZueXFxcXG4gICAgLy/moIfpopjmlbDmja4gIOWNs+agh+mimOWQjeWtl1xcXFxuICAgIC8v5YiX6KGo5pWw5o2u5b+F6aG75pivSlNPTiAg5qC85byP5pivW3t0aXRsZTonJyx1cmw6JycsfSwuLi4uLl0gIOS4lHVybOW/hemhu+acieWJjee8gFxcXFxuXFxcXG4gICAgLy/lm77moIfojrflj5ZcXFxcbiAgICBpZiAoIeWbvueJhykge1xcXFxuICAgICAgICDlm77niYcgPSAnaHR0cHM6Ly9sYW5tZWlndW9qaWFuZy5jb20vdHViaWFvL3EvMTgucG5nJ1xcXFxuICAgIH1cXFxcblxcXFxuICAgIC8v6aG1VVJMIOiOt+WPllxcXFxuICAgIGlmICgh6aG1VVJMKSB7XFxcXG4gICAgICAgIOmhtVVSTCA9IE1ZX1JVTEUudGl0bGVcXFxcbiAgICB9XFxcXG5cXFxcbiAgICAvL+agh+mimOWQjVxcXFxuICAgIHZhciDmoIfpopjlkI0gPSAnPGI+6Lev57q/PC9iPiAgPHNtYWxsPjxzbWFsbD48Zm9udCBjb2xvcj0jZjk5MDZmPuaOkuW6jyA+PC9mb250Pjwvc21hbGw+PC9zbWFsbD4nXFxcXG5cXFxcblxcXFxuICAgIHZhciDmjpLluo8gPSBnZXRNeVZhcijpobVVUkwgKyBcXFxcXFxcIueroOiKguaOkuW6j1xcXFxcXFwiLCBcXFxcXFxcIuato+W6j1xcXFxcXFwiKTtcXFxcbiAgICB2YXIg5o+Q56S6ID0g5o6S5bqPID09ICflgJLluo8nID8gJ+ato+W6jycgOiAn5YCS5bqPJztcXFxcblxcXFxuICAgIHZhciDmjpLluo91cmwgPSAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKOagh+mimOWQjSwg5qCH6aKY5pWw5o2uLCDliJfooajmlbDmja4sIOino+aekOS7o+eggSwg6aG1VVJMKSA9PiB7XFxcXG4gICAgICAgIHZhciDmjpLluo8gPSBnZXRNeVZhcijpobVVUkwgKyBcXFxcXFxcIueroOiKguaOkuW6j1xcXFxcXFwiLCBcXFxcXFxcIuato+W6j1xcXFxcXFwiKTtcXFxcbiAgICAgICAgdmFyIOaPkOekuiA9IOaOkuW6jyA9PSAn5YCS5bqPJyA/ICfmraPluo8nIDogJ+WAkuW6jyc7XFxcXG4gICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcXFxcXCJf5o6S5bqPXFxcXFxcXCJcXFxcbiAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICB0aXRsZTog5qCH6aKY5ZCNLnJlcGxhY2UoJ+i3r+e6vycsIOagh+mimOaVsOaNrikucmVwbGFjZSgn5o6S5bqPJywg5o+Q56S6KVxcXFxuICAgICAgICB9KVxcXFxuXFxcXG5cXFxcbiAgICAgICAgaWYgKOaPkOekuiA9PSAn5YCS5bqPJykge1xcXFxuICAgICAgICAgICAg5YiX6KGo5pWw5o2uLnJldmVyc2UoKVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIOWIl+ihqOaVsOaNri5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEsIHNzaWQpIHtcXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLFxcXFxuICAgICAgICAgICAgICAgIHVybDogZGF0YS51cmwgKyDop6PmnpDku6PnoIEsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IOmhtVVSTCArIFxcXFxcXFwiX+mAiembhlxcXFxcXFwiICsgc3NpZFxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9KTtcXFxcblxcXFxuXFxcXG4gICAgICAgIHB1dE15VmFyKOmhtVVSTCArIFxcXFxcXFwi56ug6IqC5o6S5bqPXFxcXFxcXCIsIOaPkOekuilcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgfSwg5qCH6aKY5ZCNLCDmoIfpopjmlbDmja4sIOWIl+ihqOaVsOaNriwg6Kej5p6Q5Luj56CBLCDpobVVUkwpXFxcXG5cXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTog5qCH6aKY5ZCNLnJlcGxhY2UoJ+i3r+e6vycsIOagh+mimOaVsOaNrikucmVwbGFjZSgn5o6S5bqPJywg5o6S5bqPKSxcXFxcbiAgICAgICAgcGljX3VybDog5Zu+54mHLFxcXFxuICAgICAgICB1cmw6IOaOkuW6j3VybCxcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiYXZhdGFyXFxcXFxcXCIsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcXFxcXCJf5o6S5bqPXFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuICAgIH0pO1xcXFxuXFxcXG4gICAgaWYgKOaOkuW6jyA9PSAn5YCS5bqPJykge1xcXFxuICAgICAgICDliJfooajmlbDmja4ucmV2ZXJzZSgpXFxcXG4gICAgfVxcXFxuXFxcXG4gICAg5YiX6KGo5pWw5o2uLmZvckVhY2goZnVuY3Rpb24oZGF0YSwgaWQpIHtcXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLFxcXFxuICAgICAgICAgICAgdXJsOiBkYXRhLnVybCArIOino+aekOS7o+eggSxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcInRleHRfMlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcXFxcXCJf6YCJ6ZuGXFxcXFxcXCIgKyBpZFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KTtcXFxcbiAgICB9KTtcXFxcblxcXFxufVxcXFxuXFxcXG4vKlxcXFxuZnVuY3Rpb24g5re75Yqg6Ziy5q2i572R6aG1KOmhuXVybCwgVUEpIHtcXFxcblxcXFxuICAgIC8v5LiK57qn6Lez6L2s5Yiw5b2T5YmN6aG155qE6ZO+5o6l5b+F6aG75pivaGlrZXI6Ly9lbXB0ee+8m+S4jeeEtuS4gOWIt+aWsOi/mOaYr+S8mumHjeWkjeWKoOi9vVxcXFxuICAgIC8vVUEgJyfmiJZmYWxzZeaIlifmiYvmnLonIOm7mOiupOaYr+aJi+acuuerryA7IOeUteiEkSAnUEMnXFxcXG5cXFxcbiAgICB2YXIg5Yi35paw6YeN5aSNID0gTVlfUlVMRS50aXRsZSArIFxcXFxcXFwi572R6aG15rqQ56CBXFxcXFxcXCJcXFxcbiAgICB2YXIgcGPpk77mjqUgPSDpobl1cmwucmVwbGFjZShcXFxcXFxcIm0uXFxcXFxcXCIsIFxcXFxcXFwid3d3LlxcXFxcXFwiKVxcXFxuICAgIHZhciDmiYvmnLrpk77mjqUgPSDpobl1cmwucmVwbGFjZShcXFxcXFxcInd3dy5cXFxcXFxcIiwgXFxcXFxcXCJtLlxcXFxcXFwiKVxcXFxuXFxcXG4gICAgdmFyIGNvZGU7XFxcXG4gICAgaWYgKGdldE15VmFyKOWIt+aWsOmHjeWkjSwgXFxcXFxcXCJmYWxzZVxcXFxcXFwiKSA9PSBcXFxcXFxcImZhbHNlXFxcXFxcXCIpIHtcXFxcblxcXFxuICAgICAgICBjb2RlID0gVUEgPT0gJ1BDJyA/IGZldGNoKHBj6ZO+5o6lKSA6IHJlcXVlc3Qo5omL5py66ZO+5o6lKTtcXFxcbiAgICAgICAgcHV0TXlWYXIo5Yi35paw6YeN5aSNLCBnZXRQYXJhbSgndXJsJykgKyBcXFxcXFxcIu+/pSbvv6VcXFxcXFxcIiArIGNvZGUpXFxcXG5cXFxcbiAgICB9IGVsc2Uge1xcXFxuXFxcXG4gICAgICAgIHZhciBwbSA9IGdldE15VmFyKOWIt+aWsOmHjeWkjSkuc3BsaXQoXFxcXFxcXCLvv6Um77+lXFxcXFxcXCIpXFxcXG4gICAgICAgIGlmIChwbVswXSA9PSBnZXRQYXJhbSgndXJsJykpIHtcXFxcbiAgICAgICAgICAgIGNvZGUgPSBwbVsxXVxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgY29kZSA9IFVBID09ICdQQycgPyBmZXRjaChwY+mTvuaOpSkgOiByZXF1ZXN0KOaJi+acuumTvuaOpSk7XFxcXG4gICAgICAgICAgICBwdXRNeVZhcijliLfmlrDph43lpI0sIGdldFBhcmFtKCd1cmwnKSArIFxcXFxcXFwi77+lJu+/pVxcXFxcXFwiICsgY29kZSlcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gY29kZVxcXFxufVxcXFxuKi9cXFxcblxcXFxuZnVuY3Rpb24g5re75Yqg6YCJ5oup6Lev57q/KGQsIOi3r+e6v+aVsOaNriwg6aG1VVJMLCDlpJrot6/nur/lkKYpIHtcXFxcblxcXFxuICAgIC8v6Lev57q/5pWw5o2uIOagvOW8j1t7dGl0bGU6J+i3r+e6v+WQjSd9LC4uLi5dXFxcXG4gICAgLy/lpJrot6/nur/lkKYgIGZhbHNlIOWImeS4jeWQr+eUqOmAieaLqei3r+e6v++8m3RydWUg5YiZ5ZCv55SoXFxcXG5cXFxcbiAgICB2YXIg6YCJ5oup5YiX6KGoID0gZ2V0SXRlbSjpobVVUkwgKyBcXFxcXFxcIumAieaLqeWIl+ihqFxcXFxcXFwiLCBcXFxcXFxcIjBcXFxcXFxcIilcXFxcblxcXFxuICAgIGlmICjlpJrot6/nur/lkKYpIHtcXFxcblxcXFxuICAgICAgICB2YXIg6Lev57q/6YCJ5LitID0gJ+KAmOKAmOKAmeKAmTxmb250IGNvbG9yPSMwOThBQzE+6YCJ5LitPC9mb250PidcXFxcblxcXFxuXFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmfCfk5Y8Zm9udCBjb2xvcj1cXFxcXFxcIiNGQTcyOThcXFxcXFxcIj4g5Zu+5rqQ5YiX6KGoPC9mb250PiDvvJonLFxcXFxuICAgICAgICAgICAgdXJsOiBcXFxcXFxcInRvYXN0Oi8v54K55oiR5bmy5ZWl5ZGiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2ZsZXhfYnV0dG9uJ1xcXFxuICAgICAgICB9KTtcXFxcblxcXFxuXFxcXG4gICAgICAgIOi3r+e6v+aVsOaNri5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEsIGlkKSB7XFxcXG5cXFxcbiAgICAgICAgICAgIHZhciBqanVybCA9ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZSgo6aG1VVJMLGlkKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgc2V0SXRlbSjpobVVUkwgKyAn6YCJ5oup5YiX6KGoJyxpZCsnJyk7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0s6aG1VVJMLGlkKTtcXFxcblxcXFxuICAgICAgICAgICAgdmFyIOagh+mimOWQjSA9IGlkID09IOmAieaLqeWIl+ihqCA/IOi3r+e6v+mAieS4rS5yZXBsYWNlKCfpgInkuK0nLCBkYXRhLnRpdGxlKSA6IGRhdGEudGl0bGU7XFxcXG4gICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiDmoIfpopjlkI0sXFxcXG4gICAgICAgICAgICAgICAgdXJsOiBqanVybCxcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ2ZsZXhfYnV0dG9uJyxcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZDog6aG1VVJMICsgXFxcXFxcXCJf6Lev57q/XFxcXFxcXCIgKyBpZFxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICB9KTtcXFxcblxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4g6YCJ5oup5YiX6KGoXFxcXG59XFxcXG5cXFxcblxcXFxuZnVuY3Rpb24g5re75Yqg6YCJ5oup5LiL6L29KGQsIOi3r+e6v+aVsOaNriwg5aSa6Lev57q/5ZCmKSB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICB0aXRsZTogJ+KAmOKAmOKAmeKAmfCfl7M8Zm9udCBjb2xvcj1cXFxcXFxcIiNmNDc5ODNcXFxcXFxcIj4g5Lmm5p62PC9mb250PiAnLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvQm9va3JhY2sudmlldz9ydWxlPeacrOWcsOi1hOa6kOeuoeeQhiZydWxlTmFtZT1cXFxcXFxcIitNWV9SVUxFLnRpdGxlLFxcXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbidcXFxcbn0pO1xcXFxuXFxcXG4gICAgLy/ot6/nur/mlbDmja4g5qC85byPW3t0aXRsZTon6Lev57q/5ZCNJyxzanNzOifkuIvovb3otYTmlpnkv6Hmga8nfSwuLi4uXVxcXFxuICAgIC8v5aSa6Lev57q/5ZCmICBmYWxzZSDliJnlj6rmnInikaDkuKrkuIvovb0g5qCH6aKY5Li6IOeCueWHu+S4i+i9ve+8m3RydWUg5YiZ5aSa5Liq5LiL6L29XFxcXG5cXFxcbmlmKOWkmui3r+e6v+WQpil7XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiAn4oCY4oCY4oCZ4oCZ8J+TpTxmb250IGNvbG9yPVxcXFxcXFwiI2Y0Nzk4M1xcXFxcXFwiPiDkuIvovb08L2ZvbnQ+IO+8micsXFxcXG4gICAgICAgIHVybDogXFxcXFxcXCJ0b2FzdDovL+eCueaIkeW5suWVpeWRolxcXFxcXFwiLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nXFxcXG4gICAgfSk7XFxcXG5cXFxcbn1cXFxcblxcXFxuICAgIOi3r+e6v+aVsOaNri5mb3JFYWNoKGZ1bmN0aW9uKGRhdGEsIGlkKSB7XFxcXG5cXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlLmluY2x1ZGVzKCfnq6DoioLliJfooagnKSA/ICfngrnlh7vkuIvovb0nIDogZGF0YS50aXRsZSxcXFxcbiAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vcGFnZS9kb3dubG9hZC52aWV3I25vUmVjb3JkSGlzdG9yeSMjbm9SZWZyZXNoIyNub0hpc3RvcnkjP3J1bGU95pys5Zyw6LWE5rqQ566h55CGJyxcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxcXG4gICAgICAgICAgICBleHRyYTogZGF0YS5zanNzXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH0pO1xcXFxuXFxcXG4gICAgaWYgKOWkmui3r+e6v+WQpikge1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcblxcXFxufVxcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIkNTU+mAieaLqeWZqOaooeeJiCpcXFwiLFxcXCJwYXRoXFxcIjpcXFwiZWp3Yi5qc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJmdW5jdGlvbiDkuIDnuqco5YiX6KGoLCDmoIfpopgsIOWbvueJhywg6ZuG5pWwLCDpk77mjqUsIOiuv+mXruWktCkge1xcXFxuICAgIOiuv+mXruWktCA9ICHorr/pl67lpLQgPyAnJyA6IOiuv+mXruWktFxcXFxuICAgIHZhciBkID0gW107XFxcXG4gICAgdmFyIGNvZGUgPSBnZXRDb2RlKClcXFxcbiAgICBwZGZhKGNvZGUsIOWIl+ihqCkuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogcGRmaChkYXRhLCDmoIfpopgpLFxcXFxuICAgICAgICAgICAgZGVzYzogcGRmaChkYXRhLCDpm4bmlbApLFxcXFxuICAgICAgICAgICAgcGljX3VybDogcGQoZGF0YSwg5Zu+54mHKXx85Zu+54mHICsgXFxcXFxcXCJAUmVmZXJlcj1cXFxcXFxcIiArIOiuv+mXruWktCxcXFxcbiAgICAgICAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHkjaW1tZXJzaXZlVGhlbWUjI2F1dG9DYWNoZSMnLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwibW92aWVfM1xcXFxcXFwiLFxcXFxuZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIG5hbWU6IHBkZmgoZGF0YSwg5qCH6aKYKSxcXFxcbiAgICAgICAgICAgIHVybDogcGQoZGF0YSwg6ZO+5o6lKSxcXFxcbiAgICAgICAgICAgIHF6OiBNWV9IT01FXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSk7XFxcXG4gICAgc2V0UmVzdWx0KGQpO1xcXFxufVxcXFxuXFxcXG5cXFxcblxcXFxuZnVuY3Rpb24g5pCc57SiKOWIl+ihqCwg5qCH6aKYLCDpk77mjqUsIOaPj+i/sCwg6K+m5oOFLCDlm77niYcsIOiuv+mXruWktCkge1xcXFxuICAgIHZhciBkID0gW107XFxcXG4gICAg6K6/6Zeu5aS0ID0gIeiuv+mXruWktCA/ICcnIDog6K6/6Zeu5aS0XFxcXG4gICAgcGRmYShnZXRSZXNDb2RlKCksIOWIl+ihqCkuZm9yRWFjaChmdW5jdGlvbihkYXRhKSB7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogcGRmaChkYXRhLCDmoIfpopgpLFxcXFxuICAgICAgICAgICAgZGVzYzogcGRmaChkYXRhLCDmj4/ov7ApLFxcXFxuICAgICAgICAgICAgcGljX3VybDogcGQoZGF0YSwg5Zu+54mHKSArIFxcXFxcXFwiQFJlZmVyZXI9XFxcXFxcXCIgKyDorr/pl67lpLQsXFxcXG4gICAgICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5I2ltbWVyc2l2ZVRoZW1lIyNhdXRvQ2FjaGUjJyxcXFxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHBkZmgoZGF0YSwg6K+m5oOFKSxcXFxcblxcXFxuZXh0cmE6IHtcXFxcbiAgICAgICAgICAgIG5hbWU6IHBkZmgoZGF0YSwg5qCH6aKYKSxcXFxcbiAgICAgICAgICAgIHVybDogcGQoZGF0YSwg6ZO+5o6lKSxcXFxcbiAgICAgICAgICAgIHF6OiBNWV9IT01FXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSk7XFxcXG4gICAgc2V0UmVzdWx0KGQpO1xcXFxufVxcXFxuXFxcXG5cXFxcblxcXFxuXFxcXG5mdW5jdGlvbiDmnIDmlrAo6YCJ5oup5ZmoLCBVQSkge1xcXFxuICAgIGlmIChVQSA9PSBcXFxcXFxcIlBDXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgdmFyIGNvZGUgPSBmZXRjaChnZXRQYXJhbSgndXJsJykucmVwbGFjZShcXFxcXFxcIm0uXFxcXFxcXCIsIFxcXFxcXFwid3d3LlxcXFxcXFwiKSk7XFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgdmFyIGNvZGUgPSByZXF1ZXN0KGdldFBhcmFtKCd1cmwnKS5yZXBsYWNlKFxcXFxcXFwid3d3LlxcXFxcXFwiLCBcXFxcXFxcIm0uXFxcXFxcXCIpKTtcXFxcbiAgICB9XFxcXG4gICAgc2V0UmVzdWx0KHBkZmgoY29kZSwg6YCJ5oup5ZmoKSlcXFxcbn1cXFxcblxcXFxuXFxcXG5cXFxcbmV2YWwoSlNPTi5wYXJzZShyZXF1ZXN0KFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3FzP3J1bGU96ZiF5ryr5ZCbXFxcXFxcXCIpKS5ydWxlKVxcXFxuXFxcXG5mdW5jdGlvbiDkuoznuqco5aS06YOo5YiX6KGoLCDmoIfpopgsIOWbvueJhywg5o+P6L+wLCDorr/pl67lpLQsIOS9nOiAhSwg5pe26Ze0LCDliIbnsbssIOeugOS7iywg5aSa6Lev57q/5ZCmLCDot6/nur/liJfooagsIOi3r+e6v+WQjSwg6YCJ6ZuG5oC75YiX6KGoLCDpgInpm4bliJfooagsIOmbhuWQjSwg6ZuGdXJsLCBkb3dubG9hZGxhenks5b2T5YmNVVJMLOW9k+WJjemhteWQjSzliY3nvIAsVUEs6Ziy6YeN6L295ZCmKSB7XFxcXG4gICAgdmFyIGQgPSBbXTtcXFxcblxcXFxuLy/lpLTpg6jliJfooaggIOWImem7mOiupOS9v+eUqCBjb2RlIOadpeS9nOS4uuWktOmDqOWIl+ihqOaVsOaNrlxcXFxuLy/lpJrot6/nur/lkKYgIHRydWUg5YiZ5L2/55So5aSa6Lev57q/77ybZmFsc2Ug5YiZ5L2/55So56ug6Lev57q/XFxcXG4vL1VBICDkuI3loavliJnkvb/nlKjmiYvmnLrnq68gICdQQyfliJnmiYvmnLrnq69cXFxcblxcXFxuaWYgKOW9k+WJjemhteWQjSkge1xcXFxuICAgIHNldFBhZ2VUaXRsZSjlvZPliY3pobXlkI0pXFxcXG59XFxcXG5cXFxcbmlmKOmYsumHjei9veWQpil7XFxcXG4vL+e9kemhteWGheWuuSvpmLLmraLph43mi4lcXFxcbiAgICB2YXIgY29kZSA9IOa3u+WKoOmYsuatoue9kemhtSjlvZPliY1VUkwsIFVBKVxcXFxufWVsc2V7XFxcXG4gICAgdmFyIGNvZGUgPSBnZXRDb2RlKClcXFxcbn1cXFxcbiAgICBcXFxcblxcXFxuICAgIC8v5aS06YOo5YiX6KGo5pWw5o2uXFxcXG4gICAgdmFyIOWktOmDqCA9ICHlpLTpg6jliJfooaggPyBjb2RlIDogcGRmYShjb2RlLCDlpLTpg6jliJfooagpWzBdO1xcXFxuICAgIOagh+mimCA9IHBkZmgo5aS06YOoLCDmoIfpopgpXFxcXG4gICAg5Zu+54mHID0gcGRmaCjlpLTpg6gsIOWbvueJhyl8fOWbvueJh1xcXFxuICAgIGlmICjlm77niYcpIHtcXFxcbiAgICAgICAg5Zu+54mHID0g5Zu+54mHLmluY2x1ZGVzKCdodHRwJykgPyDlm77niYcgOiDliY3nvIAgKyDlm77niYdcXFxcbiAgICAgICAgaWYgKCHorr/pl67lpLQpIHt9IGVsc2UgaWYgKOiuv+mXruWktC5zdWJzdHIoMCwgMSkgPT0gJ0AnKSB7XFxcXG4gICAgICAgICAgICDlm77niYcgPSDlm77niYcgKyDorr/pl67lpLRcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIOWbvueJhyA9IOWbvueJhyArIFxcXFxcXFwiQFJlZmVyZXI9XFxcXFxcXCIgKyDorr/pl67lpLRcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICBcXFxcblxcXFxu5o+P6L+wID0g5o+P6L+wLmluY2x1ZGVzKCckJykgPyDmj4/ov7Auc3BsaXQoJyQnKVsxXSArIHBkZmgo5aS06YOoLCDmj4/ov7Auc3BsaXQoJyQnKVswXSkgOiBwZGZoKOWktOmDqCwg5o+P6L+wKVxcXFxuXFxcXG7kvZzogIUgPSDkvZzogIUuaW5jbHVkZXMoJyQnKSA/IOS9nOiAhS5zcGxpdCgnJCcpWzFdICsgcGRmaCjlpLTpg6gsIOS9nOiAhS5zcGxpdCgnJCcpWzBdKSA6IHBkZmgo5aS06YOoLCDkvZzogIUpXFxcXG4gICAgXFxcXG7ml7bpl7QgPSDml7bpl7QuaW5jbHVkZXMoJyQnKSA/IOaXtumXtC5zcGxpdCgnJCcpWzFdICsgcGRmaCjlpLTpg6gsIOaXtumXtC5zcGxpdCgnJCcpWzBdKSA6IHBkZmgo5aS06YOoLCDml7bpl7QpXFxcXG5cXFxcbuWIhuexuyA9IOWIhuexuy5pbmNsdWRlcygnJCcpID8g5YiG57G7LnNwbGl0KCckJylbMV0gKyBwZGZoKOWktOmDqCwg5YiG57G7LnNwbGl0KCckJylbMF0pIDogcGRmaCjlpLTpg6gsIOWIhuexuylcXFxcblxcXFxuICAgIFxcXFxuICAgIC8v5aS06YOo5YiX6KGoXFxcXG4gICAg5re75Yqg5aS06YOo5YiX6KGoKGQsIOagh+mimCwg5Zu+54mHLCDmj4/ov7AsIOS9nOiAhSwg5pe26Ze0LCDliIbnsbss5b2T5YmNVVJMKVxcXFxuICAgIFxcXFxuICAgIC8v6Lev57q/5ZCN5LiO6YCJ6ZuG5pWw5o2uXFxcXG4gICAgdmFyIOeroOiKgmpzb24gPSDkvJjljJbot6/nur/nq6DoioLmlbDmja4o5aSa6Lev57q/5ZCmLCBjb2RlLCDot6/nur/liJfooags6Lev57q/5ZCNLOmAiembhuaAu+WIl+ihqCzpgInpm4bliJfooags6ZuG5ZCNLOmbhnVybCzliY3nvIAs5b2T5YmN6aG15ZCNLOWbvueJhylcXFxcblxcXFxuICAgIC8v566A5LuLXFxcXG4gICAg5re75Yqg566A5LuLKGQsIHBkZmgoY29kZSwg566A5LuLKSwg5b2T5YmNVVJMLCAnJylcXFxcblxcXFxuICAgLy/lvZPmsqHmnInnq6DoioLlhoXlrrnvvIzlsLHkuI3mmL7npLpcXFxcbiAgICBpZiAo56ug6IqCanNvbi5sZW5ndGggPiAwKSB7XFxcXG5cXFxcbiAgICAgICAgLy/ot6/nur/pgInmi6lcXFxcbiAgICAgICAgdmFyIOmAieaLqeWIl+ihqCA9IOa3u+WKoOmAieaLqei3r+e6vyhkLCDnq6DoioJqc29uLCDlvZPliY1VUkwsIOWkmui3r+e6v+WQpilcXFxcblxcXFxuICAgICAgICAvL+mAieaLqeS4i+i9vVxcXFxuICAgICAgICDmt7vliqDpgInmi6nkuIvovb0oZCwg56ug6IqCanNvbizlpJrot6/nur/lkKYpXFxcXG5cXFxcbiAgICAgICAgLy/mjpLluo/kuI7pgInpm4ZcXFxcbiAgICAgICAg5re75Yqg5YiX6KGo56ug6IqCKGQsIOeroOiKgmpzb25b6YCJ5oup5YiX6KGoXS50aXRsZSwg56ug6IqCanNvblvpgInmi6nliJfooahdLmxpc3QsIGxhenksIOW9k+WJjVVSTCwgJycpXFxcXG5cXFxcbiAgICAgICAgZC5wdXNoKHtcXFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImxvbmdfdGV4dFxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbiAgICBzZXRSZXN1bHQoZClcXFxcbn1cXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLkuoznuqfliJfooagqXFxcIixcXFwicGF0aFxcXCI6XFxcImVqbGJcXFwiLFxcXCJydWxlXFxcIjpcXFwidmFyIHRhYnMgPSBbXVxcXFxudmFyIGxpc3RzID0gW11cXFxcbnZhciBhcnRzID0gcGRmYShodG1sLCDnur/ot68pO1xcXFxuYXJ0cy5mb3JFYWNoKChkYXRhLCBpZCkgPT4ge1xcXFxuICAgIHRhYnMucHVzaChwZGZoKGRhdGEsIOe6v+i3r+WQjSkpXFxcXG59KVxcXFxudmFyIGNvbnRzID0gcGRmYShodG1sLCDpgInpm4YpO1xcXFxuY29udHMuZm9yRWFjaCgoZGF0YSwgaWQpID0+IHtcXFxcbiAgICBsaXN0cy5wdXNoKHBkZmEoZGF0YSwg6YCJ6ZuG5YiX6KGoKSlcXFxcbn0pXFxcXG5hZGRMaXN0ZW5lcihcXFxcXFxcIm9uQ2xvc2VcXFxcXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxcXG4gICAgY2xlYXJNeVZhcihcXFxcXFxcImxpc3RzXFxcXFxcXCIpO1xcXFxufSkpO1xcXFxuc3RvcmFnZTAucHV0TXlWYXIoXFxcXFxcXCJsaXN0c1xcXFxcXFwiLCBsaXN0cyk7XFxcXG52YXIgbGlzdCA9IGxpc3RzW2dldE15VmFyKE1ZX1VSTCwgJzAnKV07XFxcXG52YXIg5o6S5bqPID0gZ2V0TXlWYXIoTVlfVVJMICsgXFxcXFxcXCLnq6DoioLmjpLluo9cXFxcXFxcIiwgJyMxYWFkMTlcXFxcXFxcIj7mraPluo8nKTtcXFxcbnZhciDmj5DnpLogPSDmjpLluo8gPT0gJyNGRjAwMDBcXFxcXFxcIj7lgJLluo8nID8gJyMxYWFkMTlcXFxcXFxcIj7mraPluo8nIDogJyNGRjAwMDBcXFxcXFxcIj7lgJLluo8nO1xcXFxudmFyIOaOkuW6j+WQjSA9ICfigJzigJzigJ3igJ08Yj48c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOuaOkuW6jzwvc3Bhbj48L2I+J1xcXFxuXFxcXG5kLnB1c2goe1xcXFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdPGI+PHNwYW4gc3R5bGU9XFxcXFxcXCJjb2xvcjogJyArIOaOkuW6jyArICc8L3NwYW4+PC9iPicsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKOaOkuW6j+WQjSwgbGF6eSkgPT4ge1xcXFxuICAgICAgICB2YXIgbGlzdHMgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFxcXFxcImxpc3RzXFxcXFxcXCIpO1xcXFxuICAgICAgICB2YXIg56ug6IqCID0gbGlzdHNbZ2V0TXlWYXIoTVlfVVJMLCAnMCcpXTtcXFxcbiAgICAgICAgdmFyIOaOkuW6jyA9IGdldE15VmFyKE1ZX1VSTCArIFxcXFxcXFwi56ug6IqC5o6S5bqPXFxcXFxcXCIsICcjMWFhZDE5XFxcXFxcXCI+5q2j5bqPJyk7XFxcXG4gICAgICAgIHZhciDmj5DnpLogPSDmjpLluo8gPT0gJyNGRjAwMDBcXFxcXFxcIj7lgJLluo8nID8gJyMxYWFkMTlcXFxcXFxcIj7mraPluo8nIDogJyNGRjAwMDBcXFxcXFxcIj7lgJLluo8nO1xcXFxuICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgaWQ6IE1ZX1VSTCArIFxcXFxcXFwiX+aOkuW6j1xcXFxcXFwiXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgdGl0bGU6IOaOkuW6j+WQjS5yZXBsYWNlKCfmjpLluo8nLCDmj5DnpLopXFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgIGlmICjmjpLluo8gPT0gJyMxYWFkMTlcXFxcXFxcIj7mraPluo8nKSB7XFxcXG4gICAgICAgICAgICDnq6DoioIucmV2ZXJzZSgpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IGNwID0g56ug6IqCLm1hcCgoZGF0YSwgc3NpZCkgPT4ge1xcXFxuICAgICAgICAgICAgcmV0dXJuIHtcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogcGRmaChkYXRhLCAnYSYmVGV4dCcpLFxcXFxuICAgICAgICAgICAgICAgIHVybDogcGQoZGF0YSwgJ2EmJmhyZWYnKSArIGxhenksXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzInLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGNsczogTVlfVVJMICsgXFxcXFxcXCJf6YCJ6ZuGXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9O1xcXFxuICAgICAgICB9KTtcXFxcbiAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKE1ZX1VSTCArIFxcXFxcXFwiX+mAiembhlxcXFxcXFwiKTtcXFxcbiAgICAgICAgYWRkSXRlbUJlZm9yZShNWV9VUkwgKyBcXFxcXFxcImZvb3RlclxcXFxcXFwiLCBjcCk7XFxcXG4gICAgICAgIHB1dE15VmFyKE1ZX1VSTCArIFxcXFxcXFwi56ug6IqC5o6S5bqPXFxcXFxcXCIsIOaPkOekuilcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9lbXB0eVxcXFxcXFwiXFxcXG4gICAgfSwg5o6S5bqP5ZCNLCBsYXp5KSxcXFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcXFxuICAgIGV4dHJhOiB7XFxcXG4gICAgICAgIGlkOiBNWV9VUkwgKyBcXFxcXFxcIl/mjpLluo9cXFxcXFxcIlxcXFxuICAgIH1cXFxcbn0pXFxcXG50YWJzLmZvckVhY2goKGRhdGEsIGlkKSA9PiB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGdldE15VmFyKE1ZX1VSTCwgJzAnKSA9PSBpZCA/ICfigJzigJwnICsgZGF0YSArICfigJ3igJ0nIDogZGF0YSxcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKOe6v+i3rywgbGF6eSwgaWQpID0+IHtcXFxcbiAgICAgICAgICAgIHZhciBsaXN0cyA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXFxcXFwibGlzdHNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB2YXIg5o6S5bqPID0gZ2V0TXlWYXIoTVlfVVJMICsgXFxcXFxcXCLnq6DoioLmjpLluo9cXFxcXFxcIiwgJyMxYWFkMTlcXFxcXFxcIj7mraPluo8nKTtcXFxcbiAgICAgICAgICAgIHZhciDmj5DnpLogPSDmjpLluo8gPT0gJyNGRjAwMDBcXFxcXFxcIj7lgJLluo8nID8gJyMxYWFkMTlcXFxcXFxcIj7mraPluo8nIDogJyNGRjAwMDBcXFxcXFxcIj7lgJLluo8nO1xcXFxuXFxcXG4gICAgICAgICAgICDnur/ot68uZm9yRWFjaCgoZGF0YSwgeGxpZCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogaWQgPT0geGxpZCA/ICfigJzigJwnICsgZGF0YSArICfigJ3igJ0nIDogZGF0YSxcXFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBNWV9VUkwgKyBcXFxcXFxcIl/nur/ot69cXFxcXFxcIiArIHhsaWRcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgfSlcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKE1ZX1VSTCwgaWQpXFxcXG4gICAgICAgICAgICB2YXIg56ug6IqCID0gbGlzdHNbZ2V0TXlWYXIoTVlfVVJMLCAnMCcpXTtcXFxcbiAgICAgICAgICAgIGlmICjmjpLluo8gPT0gJyNGRjAwMDBcXFxcXFxcIj7lgJLluo8nKSB7XFxcXG4gICAgICAgICAgICAgICAg56ug6IqCLnJldmVyc2UoKVxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbGV0IGNwID0g56ug6IqCLm1hcCgoZGF0YSwgc3NpZCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwZGZoKGRhdGEsICdhJiZUZXh0JyksXFxcXG4gICAgICAgICAgICAgICAgICAgIHVybDogcGQoZGF0YSwgJ2EmJmhyZWYnKSArIGxhenksXFxcXG4gICAgICAgICAgICAgICAgICAgIGNvbF90eXBlOiAndGV4dF8yJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsczogTVlfVVJMICsgXFxcXFxcXCJf6YCJ6ZuGXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH07XFxcXG4gICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIGRlbGV0ZUl0ZW1CeUNscyhNWV9VUkwgKyBcXFxcXFxcIl/pgInpm4ZcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBhZGRJdGVtQmVmb3JlKE1ZX1VSTCArIFxcXFxcXFwiZm9vdGVyXFxcXFxcXCIsIGNwKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vZW1wdHlcXFxcXFxcIlxcXFxuICAgICAgICB9LCB0YWJzLCBsYXp5LCBpZCksXFxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxcXG4gICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICBpZDogTVlfVVJMICsgXFxcXFxcXCJf57q/6LevXFxcXFxcXCIgKyBpZFxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG59KVxcXFxuXFxcXG5pZiAo5o6S5bqPID09ICcjRkYwMDAwXFxcXFxcXCI+5YCS5bqPJykge1xcXFxuICAgIGxpc3QucmV2ZXJzZSgpXFxcXG59XFxcXG5saXN0LmZvckVhY2goKGRhdGEsIGlkKSA9PiB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IHBkZmgoZGF0YSwgJ2EmJlRleHQnKSxcXFxcbiAgICAgICAgdXJsOiBwZChkYXRhLCAnYSYmaHJlZicpICsgbGF6eSxcXFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzInLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgY2xzOiBNWV9VUkwgKyBcXFxcXFxcIl/pgInpm4ZcXFxcXFxcIlxcXFxuICAgICAgICB9XFxcXG4gICAgfSk7XFxcXG59KVxcXFxubGV0IG5ld3N0aXAgPSBsaXN0Lmxlbmd0aDtcXFxcbmlmIChuZXdzdGlwKSB7XFxcXG4gICAgc2V0TGFzdENoYXB0ZXJSdWxlKCdqczonICsgJC50b1N0cmluZygobmV3c3RpcCkgPT4ge1xcXFxuICAgICAgICBzZXRSZXN1bHQoJ+abtOaWsOiHszog56ysJyArIG5ld3N0aXAgKyBcXFxcXFxcIumbhlxcXFxcXFwiKTtcXFxcbiAgICB9LCBuZXdzdGlwKSk7XFxcXG59XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwiYmlnX2JsYW5rX2Jsb2NrXFxcXFxcXCIsXFxcXG4gICAgZXh0cmE6IHtcXFxcbiAgICAgICAgaWQ6IE1ZX1VSTCArIFxcXFxcXFwiZm9vdGVyXFxcXFxcXCJcXFxcbiAgICB9XFxcXG59KTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLnjq/looPliqvmjIFcXFwiLFxcXCJwYXRoXFxcIjpcXFwiaGlqYWNrRW52XFxcIixcXFwicnVsZVxcXCI6XFxcInZhciB7IFJVTEUsIGlzSW5kZXgsIHBhZ2VUaXRsZSB9ID0gTVlfUEFSQU1TXFxcXG5SVUxFID0gSlNPTi5wYXJzZShiYXNlNjREZWNvZGUoUlVMRSkpXFxcXG52YXIgb3JpUlVMRSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2RhdGFMb2FkP3J1bGU9JyArIFFJTkdfVElUTEUpLmZpbmQoKHYpID0+IHYudGl0bGUgPT0gUlVMRS50aXRsZSlcXFxcbmlmIChpc0luZGV4KSB7XFxcXG4gICAgUlVMRSA9IG9yaVJVTEVcXFxcbiAgICB2YXIgeyB0YWJIZWFkZXIsIGZ5QWxsIH0gPSAkLnJlcXVpcmUoJ2hpa2VyOi8vcGFnZS9DbGFzc1RhYj9ydWxlPScgKyBRSU5HX1RJVExFLCBPYmplY3QuYXNzaWduKHsgUUlOR19USVRMRTogUUlOR19USVRMRSB9LCBSVUxFKSlcXFxcbiAgICAvLyDlpITnkIZNWV9SVUxFXFxcXG4gICAgTVlfUlVMRS5jbGFzc191cmwgPSB0YWJIZWFkZXIuZ2V0Q2xhc3MoZnlBbGwgPyAnZnlBbGwnIDogJ2Z5Y2xhc3MnKS51cmxcXFxcbiAgICBNWV9SVUxFLmFyZWFfdXJsID0gZnlBbGwgPyBNWV9SVUxFLmNsYXNzX3VybCA6IHRhYkhlYWRlci5nZXRDbGFzcygnZnlhcmVhJykudXJsXFxcXG4gICAgTVlfUlVMRS55ZWFyX3VybCA9IGZ5QWxsID8gTVlfUlVMRS5jbGFzc191cmwgOiB0YWJIZWFkZXIuZ2V0Q2xhc3MoJ2Z5eWVhcicpLnVybFxcXFxuICAgIE1ZX1JVTEUuc29ydF91cmwgPSBmeUFsbCA/IE1ZX1JVTEUuY2xhc3NfdXJsIDogdGFiSGVhZGVyLmdldENsYXNzKCdmeXNvcnQnKS51cmxcXFxcbiAgICBNWV9SVUxFLnVybCA9IFJVTEUudXJsXFxcXG4gICAgTVlfUlVMRS5jb2xfdHlwZSA9IFJVTEUuY29sX3R5cGVcXFxcbiAgICBNWV9SVUxFLmRldGFpbF9jb2xfdHlwZSA9IFJVTEUuZGV0YWlsX2NvbF90eXBlXFxcXG4gICAgTVlfUlVMRS5maW5kX3J1bGUgPSBSVUxFLmZpbmRfcnVsZVxcXFxuICAgIE1ZX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSA9IFJVTEUuZGV0YWlsX2ZpbmRfcnVsZVxcXFxuICAgIE1ZX1JVTEUucGFyYW1zID0ge31cXFxcbn0gZWxzZSB7XFxcXG4gICAgUlVMRS5wYWdlcyA9IG9yaVJVTEUucGFnZXNcXFxcbiAgICAvLyDlpITnkIZNWV9SVUxFXFxcXG4gICAgTVlfUlVMRS51cmwgPSBNWV9QQVJBTVMudXJsXFxcXG4gICAgTVlfUlVMRS5jb2xfdHlwZSA9IFJVTEUuZGV0YWlsX2NvbF90eXBlXFxcXG4gICAgTVlfUlVMRS5maW5kX3J1bGUgPSBSVUxFLmRldGFpbF9maW5kX3J1bGVcXFxcbiAgICBNWV9SVUxFLnBhcmFtcyA9IFJVTEUucGFyYW1zXFxcXG59XFxcXG5NWV9SVUxFLnBhZ2VzID0gUlVMRS5wYWdlc1xcXFxuTVlfUlVMRS5wYWdlTGlzdCA9IEpTT04ucGFyc2UoTVlfUlVMRS5wYWdlcyB8fCAnW10nKVxcXFxuTVlfUlVMRS50aXRsZSA9IFJVTEUudGl0bGVcXFxcbk1ZX1JVTEUudWEgPSBSVUxFLnVhXFxcXG5sb2coTVlfUlVMRS51cmwpXFxcXG4vLyDovb3lhaXlh73mlbDlt6XlhbdcXFxcbnZhciB7IGdlbk15UnVsZSB9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZnVuY1Rvb2xzP3J1bGU9JyArIFFJTkdfVElUTEUsIHtcXFxcbiAgICBRSU5HX1RJVExFOiBRSU5HX1RJVExFLFxcXFxuICAgIE1ZX1JVTEU6IE1ZX1JVTEUsXFxcXG4gICAgaXNJbmRleDogaXNJbmRleFxcXFxufSlcXFxcbi8vIOmYsuatonJlcXVpcmXlpJrmrKHov5DooYxcXFxcbmNvbnN0IG15Q29sbF9yZXF1aXJlZCA9IHt9XFxcXG5yZXF1aXJlID0gZnVuY3Rpb24ocGFyYW0wLCBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQpIHtcXFxcbiAgICBpZiAobXlDb2xsX3JlcXVpcmVkW3BhcmFtMF0pIHJldHVyblxcXFxuICAgIG15Q29sbF9yZXF1aXJlZFtwYXJhbTBdID0gdHJ1ZVxcXFxuICAgIHBhcmFtMiA9IHBhcmFtMiAhPSBudWxsID8gcGFyYW0yIDogMFxcXFxuICAgIHBhcmFtMyA9IE1ZX1RJQ0tFVFxcXFxuICAgIHBhcmFtNCA9IGV2YWxcXFxcbiAgICByZXR1cm4gbWV0aG9kX3JlcXVpcmUuaW52b2tlKGphdmFDb250ZXh0LCBwYXJhbTAsIHBhcmFtMSwgcGFyYW0yLCBwYXJhbTMsIHBhcmFtNClcXFxcbn1cXFxcbnJlcXVpcmVDYWNoZSA9IGZ1bmN0aW9uKHBhcmFtMCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUpIHtcXFxcbiAgICBpZiAobXlDb2xsX3JlcXVpcmVkW3BhcmFtMF0pIHJldHVyblxcXFxuICAgIG15Q29sbF9yZXF1aXJlZFtwYXJhbTBdID0gdHJ1ZVxcXFxuICAgIHBhcmFtMyA9IHBhcmFtMyAhPSBudWxsID8gcGFyYW0zIDogMFxcXFxuICAgIHBhcmFtNCA9IE1ZX1RJQ0tFVFxcXFxuICAgIHBhcmFtNSA9IGV2YWxcXFxcbiAgICByZXR1cm4gbWV0aG9kX3JlcXVpcmVDYWNoZS5pbnZva2UoamF2YUNvbnRleHQsIHBhcmFtMCwgcGFyYW0xLCBwYXJhbTIsIHBhcmFtMywgcGFyYW00LCBwYXJhbTUpXFxcXG59XFxcXG5yYyA9IHJlcXVpcmVDYWNoZVxcXFxuLy8g5pyA5paw56ug6IqC6KeE5YiZ546v5aKD5Yqr5oyBXFxcXG5zZXRMYXN0Q2hhcHRlclJ1bGUgPSBmdW5jdGlvbihwYXJhbTApIHtcXFxcbiAgICBpZiAocGFyYW0wLnN0YXJ0c1dpdGgoXFxcXFxcXCJqczpcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgcGFyYW0wID0gJ2pzOicgKyAkLnRvU3RyaW5nKChRSU5HX1RJVExFLCBNWV9QQVJBTVMpID0+IHtcXFxcbiAgICAgICAgICAgIGV2YWwoSlNPTi5wYXJzZShmZXRjaCgnaGlrZXI6Ly9wYWdlL2hpamFja0Vudj9ydWxlPScgKyBRSU5HX1RJVExFKSkucnVsZSlcXFxcbiAgICAgICAgICAgIHZhciB7IHJ1blByZVJ1bGUgfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2Z1bmNUb29scz9ydWxlPScgKyBRSU5HX1RJVExFKVxcXFxuICAgICAgICAgICAgcnVuUHJlUnVsZShvcmlSVUxFLnByZVJ1bGUpXFxcXG4gICAgICAgIH0sIFFJTkdfVElUTEUsIHsgdXJsOiBNWV9SVUxFLnVybCwgUlVMRTogYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KGdlbk15UnVsZSgpKSksIGlzSW5kZXg6IGlzSW5kZXggfSkgKyAnOycgKyBwYXJhbTAuc2xpY2UoMylcXFxcbiAgICB9XFxcXG4gICAgbWV0aG9kX3NldExhc3RDaGFwdGVyUnVsZS5pbnZva2UoamF2YUNvbnRleHQsIHBhcmFtMClcXFxcbn1cXFxcbi8vIOWKqOaAgeaWsOWinuWHveaVsOWKq+aMgVxcXFxuYWRkSXRlbUFmdGVyID0gZnVuY3Rpb24ocGFyYW0wLCBwYXJhbTEpIHtcXFxcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbTEpKSBwYXJhbTEgPSBwYXJhbTEubWFwKGhpamFja0VsKVxcXFxuICAgIGVsc2UgcGFyYW0xID0gaGlqYWNrRWwocGFyYW0xKVxcXFxuICAgIG1ldGhvZF9hZGRJdGVtQWZ0ZXIuaW52b2tlKGphdmFDb250ZXh0LCBwYXJhbTAsIHBhcmFtMSlcXFxcbn1cXFxcbmFkZEl0ZW1CZWZvcmUgPSBmdW5jdGlvbihwYXJhbTAsIHBhcmFtMSkge1xcXFxuICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmFtMSkpIHBhcmFtMSA9IHBhcmFtMS5tYXAoaGlqYWNrRWwpXFxcXG4gICAgZWxzZSBwYXJhbTEgPSBoaWphY2tFbChwYXJhbTEpXFxcXG4gICAgbWV0aG9kX2FkZEl0ZW1CZWZvcmUuaW52b2tlKGphdmFDb250ZXh0LCBwYXJhbTAsIHBhcmFtMSlcXFxcbn1cXFxcbi8vQOiPnOWboiDnjq/looPliqvmjIHliqvmjIHlk6rph4zliqDkuKrov5nkuKotTOS9rFxcXFxucmVxdWVzdCA9IGZ1bmN0aW9uKHBhcmFtMCwgcGFyYW0xLCBwYXJhbTIpIHtcXFxcbiAgICBpZiAocGFyYW0wLmluY2x1ZGVzKFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1xcXFxcXFwiKSkge1xcXFxuICAgICAgICBsZXQgcnVsZSA9IChwYXJhbTAuc3BsaXQoL1xcXFxcXFxcPy4qcnVsZT0vKVsxXSB8fCBcXFxcXFxcIlxcXFxcXFwiKS5zcGxpdChcXFxcXFxcIiZcXFxcXFxcIilbMF07XFxcXG4gICAgICAgIGxldCBwYWdlVXJsID0gcGFyYW0wLnNwbGl0KFxcXFxcXFwiaGlrZXI6Ly9wYWdlL1xcXFxcXFwiKVsxXS5zcGxpdChcXFxcXFxcIj9cXFxcXFxcIilbMF07XFxcXG4gICAgICAgIGlmIChydWxlICE9PSBRSU5HX1RJVExFKSB7XFxcXG4gICAgICAgICAgICBsZXQgcnVsZUNvZGU7XFxcXG4gICAgICAgICAgICBpZiAoIXJ1bGUgfHwgcnVsZSA9PT0gUlVMRS50aXRsZSkge1xcXFxuICAgICAgICAgICAgICAgIHJ1bGVDb2RlID0gKFJVTEUucGFnZUxpc3QgfHwgKFJVTEUucGFnZUxpc3QgPSBKU09OLnBhcnNlKFJVTEUucGFnZXMpKSkuZmluZCh2ID0+IHYucGF0aCA9PT0gcGFnZVVybCk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZihydWxlQ29kZSl7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJ1bGVDb2RlKTtcXFxcbiAgICAgICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIHBhcmFtMiA9IE1ZX1JVTEU7XFxcXG4gICAgdmFyIHJldFN0ciA9IG1ldGhvZF9yZXF1ZXN0Lmludm9rZShqYXZhQ29udGV4dCwgcGFyYW0wLCBwYXJhbTEsIHBhcmFtMik7XFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgaWYgKHJldFN0ciBpbnN0YW5jZW9mIGphdmEuaW8uSW5wdXRTdHJlYW0pIHtcXFxcbiAgICAgICAgICAgIHJldHVybiByZXRTdHI7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgIHJldHVybiByZXRTdHIgPT0gbnVsbCA/IHJldFN0ciA6IHJldFN0ciArIFxcXFxcXFwiXFxcXFxcXCI7XFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5Ye95pWw5bel5YW3XFxcIixcXFwicGF0aFxcXCI6XFxcImZ1bmNUb29sc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJsZXQgeyBRSU5HX1RJVExFLCBNWV9SVUxFLCBpc0luZGV4IH0gPSAkLmltcG9ydFBhcmFtXFxcXG5pZiAoIU1ZX1JVTEUpIE1ZX1JVTEUgPSB7fVxcXFxuXFxcXG5mdW5jdGlvbiBydW5Db2RlKHJ1bGUpIHtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBsZXQgW2lucHV0LCBjb2RlXSA9IHJ1bGUuc3BsaXQoJy5qczonKVxcXFxuICAgICAgICByZXR1cm4gY29kZSA/IGV2YWwoY29kZSkgOiBydWxlXFxcXG4gICAgfSBjYXRjaCAoZSkgeyByZXR1cm4gcnVsZSB9XFxcXG59XFxcXG4vLyDpppbpobXpk77mjqXmm7/mjaLliIbnsbtcXFxcbmZ1bmN0aW9uIGluZGV4VXJsKHBhcmFtKSB7XFxcXG4gICAgTVlfUlVMRSA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKE1ZX1JVTEUpKVxcXFxuICAgIGxldCBwYWdlTnVtID0gcGFyc2VJbnQocGFyYW0uc3BsaXQoJyMjIycpWzFdKSxcXFxcbiAgICAgICAgdXJsID0gTVlfUlVMRS51cmwsXFxcXG4gICAgICAgIHsgZnlBbGwsIHRhYkhlYWRlciB9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvQ2xhc3NUYWI/cnVsZT0nICsgUUlOR19USVRMRSwgT2JqZWN0LmFzc2lnbih7IFFJTkdfVElUTEU6IFFJTkdfVElUTEUgfSwgTVlfUlVMRSkpXFxcXG5cXFxcbiAgICB1cmwgPSB0YWJIZWFkZXIuc2V0VXJsKGZ5QWxsID8gdXJsLnJlcGxhY2UoL2Z5QWxsL2csICckJHtmeUFsbH0nKSA6IHVybC5yZXBsYWNlKC9meShjbGFzc3xhcmVhfHllYXJ8c29ydCkvZywgJyQke2Z5JDF9JykpXFxcXG4gICAgdXJsID0gdXJsLnJlcGxhY2UoL2Z5cGFnZSg/OkAoLT9cXFxcXFxcXGQrKUApPyg/OlxcXFxcXFxcKihcXFxcXFxcXGQrKUApPy9nLCAoXywgc3RhcnQsIHNwYWNlKSA9PiBwYXJzZUludChzdGFydCB8fCAwKSArIDEgKyAocGFnZU51bSAtIDEpICogcGFyc2VJbnQoc3BhY2UgfHwgMSkpXFxcXG4gICAgdXJsID0gL14oW1xcXFxcXFxcc1xcXFxcXFxcU10qPykoPzpcXFxcXFxcXFtmaXJzdFBhZ2U9KFtcXFxcXFxcXHNcXFxcXFxcXFNdKj8pXFxcXFxcXFxdKT8oPzooXFxcXFxcXFwuanM6W1xcXFxcXFxcc1xcXFxcXFxcU10qPykpPyQvLmV4ZWModXJsKVxcXFxuICAgIGlmIChwYWdlTnVtID09IDEgJiYgdXJsWzJdKSB1cmxbMV0gPSB1cmxbMl1cXFxcbiAgICBpZiAodXJsWzNdICYmICF1cmxbMV0uaW5jbHVkZXMoJy5qczonKSkgdXJsWzFdICs9IHVybFszXVxcXFxuICAgIHJldHVybiBydW5Db2RlKHVybFsxXSlcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gcGFyYW1IYW5kbGUodXJsUGFyYW0sIHVhLCB1cmxUbXApIHtcXFxcbiAgICBsZXQgY2hhcnNldCwgcGFyYW1UbXBcXFxcbiAgICB0cnkgeyAvLyDpk77mjqXnmoTnvJbnoIHjgIFVQeWSjFJlZmVyZXLlupTor6XmmK/pppblhYjnu6fmib/pppbpobXpk77mjqVcXFxcbiAgICAgICAgWywgLCBjaGFyc2V0LCBwYXJhbVRtcF0gPSB1cmxUbXAuc3BsaXQoJzsnKVxcXFxuICAgICAgICBwYXJhbVRtcCA9IHBhcmFtVG1wLm1hdGNoKC9eeyguKil9JC8pWzFdLnNwbGl0KCcmJicpXFxcXG4gICAgfSBjYXRjaCAoZSkgeyBwYXJhbVRtcCA9IFtdIH1cXFxcbiAgICBsZXQgVXNlckFnZW50ID0gcGFyYW1UbXAuZmluZCgodikgPT4gdi5zdGFydHNXaXRoKCdVc2VyLUFnZW50QCcpKSxcXFxcbiAgICAgICAgUmVmZXJlciA9IHBhcmFtVG1wLmZpbmQoKHYpID0+IHYuc3RhcnRzV2l0aCgnUmVmZXJlckAnKSlcXFxcbiAgICB1cmxQYXJhbVswXSA9IHVybFBhcmFtWzBdIHx8ICdHRVQnXFxcXG4gICAgdXJsUGFyYW1bMV0gPSB1cmxQYXJhbVsxXSB8fCBjaGFyc2V0IHx8ICdVVEYtOCdcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICB1cmxQYXJhbVsyXSA9IHVybFBhcmFtWzJdLm1hdGNoKC9eeyguKil9JC8pWzFdLnNwbGl0KCcmJicpXFxcXG4gICAgfSBjYXRjaCAoZSkgeyB1cmxQYXJhbVsyXSA9IFtdIH1cXFxcbiAgICAvLyDmt7vliqDlhajlsYBVQeWSjOS4iue6p1JlZmVyZXJcXFxcbiAgICBpZiAoIXVybFBhcmFtWzJdLnNvbWUoKHYpID0+IHYuc3RhcnRzV2l0aCgnVXNlci1BZ2VudEAnKSkpIHtcXFxcbiAgICAgICAgaWYgKFVzZXJBZ2VudCkgdXJsUGFyYW1bMl0ucHVzaChVc2VyQWdlbnQpXFxcXG4gICAgICAgIGVsc2UgaWYgKHVhID09ICdwYycpXFxcXG4gICAgICAgICAgICB1cmxQYXJhbVsyXS5wdXNoKCdVc2VyLUFnZW50QCcgKyBQQ19VQS5yZXBsYWNlKC87L2csICfvvJvvvJsnKS5yZXBsYWNlKC9cXFxcXFxcXD8vLCAn77yf77yfJykpXFxcXG4gICAgICAgIGVsc2UgaWYgKHVhID09ICdtb2JpbGUnKVxcXFxuICAgICAgICAgICAgdXJsUGFyYW1bMl0ucHVzaCgnVXNlci1BZ2VudEAnICsgTU9CSUxFX1VBLnJlcGxhY2UoLzsvZywgJ++8m++8mycpLnJlcGxhY2UoL1xcXFxcXFxcPy8sICfvvJ/vvJ8nKSlcXFxcbiAgICB9XFxcXG4gICAgaWYgKFJlZmVyZXIgJiYgIXVybFBhcmFtWzJdLnNvbWUoKHYpID0+IHYuc3RhcnRzV2l0aCgnUmVmZXJlckAnKSkpXFxcXG4gICAgICAgIHVybFBhcmFtWzJdLnB1c2goUmVmZXJlcilcXFxcbiAgICB1cmxQYXJhbVsyXSA9ICd7JyArIHVybFBhcmFtWzJdLmpvaW4oJyYmJykgKyAnfSdcXFxcbiAgICByZXR1cm4gdXJsUGFyYW0uam9pbignOycpXFxcXG59XFxcXG4vLyDpooTlpITnkIblubbliJ3lp4vljJZjb25maWdcXFxcbmZ1bmN0aW9uIHJ1blByZVJ1bGUocnVsZSkge1xcXFxuICAgIGlmICgodHlwZW9mIE1ZX1BBR0UgIT0gJ3VuZGVmaW5lZCcgJiYgIE1ZX1BBR0UgPT0gMSkgJiZcXFxcbiAgICAgICAgIChpc0luZGV4IHx8ICFnZXRNeVZhcignJHByZVJ1bGVfJyArIE1ZX1JVTEUudGl0bGUpKSkge1xcXFxuICAgICAgICBldmFsKHJ1bGUpXFxcXG4gICAgICAgIHB1dE15VmFyKCckcHJlUnVsZV8nICsgTVlfUlVMRS50aXRsZSwgJ1QnKVxcXFxuICAgIH1cXFxcbiAgICBsZXQgX2NmZyA9IGdldE15VmFyKCdpbml0Q29uZmlnJywgJ3t9JylcXFxcbiAgICBpZiAoX2NmZyAmJiBfY2ZnLmxlbmd0aCA+IDApIHtcXFxcbiAgICAgICAgY29uZmlnID0gSlNPTi5wYXJzZShfY2ZnKVxcXFxuICAgIH1cXFxcbn1cXFxcbi8vIOato+aWh+ino+aekOmAmueUqOWPmOmHj1xcXFxuZnVuY3Rpb24gZ2VuTXlSdWxlKCkge1xcXFxuICAgIGxldCBSVUxFID0gT2JqZWN0LmFzc2lnbih7fSwgTVlfUlVMRSlcXFxcbiAgICBkZWxldGUgUlVMRS5sYXN0X2NoYXB0ZXJfcnVsZVxcXFxuICAgIGRlbGV0ZSBSVUxFLnByZVJ1bGVcXFxcbiAgICBkZWxldGUgUlVMRS5wYWdlTGlzdFxcXFxuICAgIGRlbGV0ZSBSVUxFLnBhZ2VzXFxcXG4gICAgcmV0dXJuIFJVTEVcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2VuRXhVcmwodXJsKSB7XFxcXG4gICAgdXJsID0gdXJsLnNwbGl0KCc7JylcXFxcbiAgICByZXR1cm4gdXJsLnNoaWZ0KCkgKyAnOycgKyBwYXJhbUhhbmRsZSh1cmwsIE1ZX1JVTEUudWEsIE1ZX1JVTEUudXJsKVxcXFxufVxcXFxuXFxcXG5oaWphY2tMYXp5UnVsZSA9ICQudG9TdHJpbmcoKFFJTkdfVElUTEUsIE1ZX1BBUkFNUykgPT4ge1xcXFxuICAgIGlmICghTVlfUlVMRSkgTVlfUlVMRSA9IHt9XFxcXG4gICAgTVlfUEFSQU1TID0gSlNPTi5wYXJzZShiYXNlNjREZWNvZGUoTVlfUEFSQU1TKSlcXFxcbiAgICBldmFsKEpTT04ucGFyc2UoZmV0Y2goJ2hpa2VyOi8vcGFnZS9oaWphY2tFbnY/cnVsZT0nICsgUUlOR19USVRMRSkpLnJ1bGUpXFxcXG4gICAgdmFyIHtcXFxcbiAgICAgICAgcGFyYW1IYW5kbGUsXFxcXG4gICAgICAgIGdlbkV4VXJsLFxcXFxuICAgICAgICBoaWphY2tMYXp5UnVsZSxcXFxcbiAgICAgICAgaGlqYWNrRWxcXFxcbiAgICB9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZnVuY1Rvb2xzP3J1bGU9JyArIFFJTkdfVElUTEUpXFxcXG59LCBRSU5HX1RJVExFLCBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoeyB1cmw6IE1ZX1JVTEUudXJsLCBSVUxFOiBiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkoZ2VuTXlSdWxlKCkpKSwgaXNJbmRleDogaXNJbmRleCB9KSkpXFxcXG5cXFxcbmZ1bmN0aW9uIGhpamFja0VsKGVsKSB7XFxcXG4gICAgaWYoIWVsIHx8IHR5cGVvZiBlbCAhPSAnb2JqZWN0JykgcmV0dXJuXFxcXG4gICAgaWYgKCFlbC5leHRyYSkgZWwuZXh0cmEgPSB7fVxcXFxuICAgIGVsLmNvbF90eXBlID0gZWwuY29sX3R5cGUgfHwgTVlfUlVMRS5jb2xfdHlwZVxcXFxuICAgIGxldCBOT1dfUlVMRSA9IE9iamVjdC5hc3NpZ24oZ2VuTXlSdWxlKCksIHsgcGFyYW1zOiBlbC5leHRyYSB9KVxcXFxuXFxcXG4gICAgaWYgKHR5cGVvZiBlbC51cmwgIT0gJ3N0cmluZycgfHxcXFxcbiAgICAgICAgWyd4NV93ZWJ2aWV3X3NpbmdsZScsICdpbnB1dCddLnNvbWUoKHYpID0+IGVsLmNvbF90eXBlID09IHYpIHx8XFxcXG4gICAgICAgIFsn5rW36ZiU6KeG55WMJywgJ2phdmFzY3JpcHQ6J10uc29tZSgodikgPT4gZWwudXJsLnN0YXJ0c1dpdGgodikpIHx8XFxcXG4gICAgICAgIFsncnVsZScsICdwaWNzJywgJ3RvYXN0JywgJ2NvcHknLCAnZWRpdEZpbGUnLCAneDUnLCAneDVXZWJWaWV3JywgJ3g1UGxheScsICd3ZWInLCAneDVSdWxlJywgJ3dlYlJ1bGUnLFxcXFxuICAgICAgICAgICAgJ2Rvd25sb2FkJywgJ3NoYXJlJywgJ2ZpbGVTZWxlY3QnLCAndmlkZW8nXS5zb21lKCh2KSA9PiBlbC51cmwuc3RhcnRzV2l0aCh2ICsgJzovLycpKSkge1xcXFxuICAgICAgICByZXR1cm4gZWxcXFxcbiAgICB9IGVsc2UgaWYgKGVsLnVybC5zdGFydHNXaXRoKCdpbnB1dDovLycpKSB7XFxcXG4gICAgICAgIGxldCBwYXJhID0gSlNPTi5wYXJzZShlbC51cmwuc2xpY2UoOCkpXFxcXG4gICAgICAgIGlmIChwYXJhLmpzKSBwYXJhLmpzID0gaGlqYWNrTGF6eVJ1bGUgKyAnOycgKyBwYXJhLmpzXFxcXG4gICAgICAgIGVsLnVybCA9ICdpbnB1dDovLycgKyBKU09OLnN0cmluZ2lmeShwYXJhKVxcXFxuICAgICAgICByZXR1cm4gZWxcXFxcbiAgICB9IGVsc2UgaWYgKGVsLnVybC5zdGFydHNXaXRoKCdjb25maXJtOi8vJykpIHtcXFxcbiAgICAgICAgbGV0IHJlSW5kZXggPSBlbC51cmwuaW5kZXhPZignLmpzOicpXFxcXG4gICAgICAgIGlmIChyZUluZGV4ID49IDApIGVsLnVybCA9IGVsLnVybC5zbGljZSgwLCByZUluZGV4KSArICcuanM6JyArIGhpamFja0xhenlSdWxlICsgJzsnICsgZWwudXJsLnNsaWNlKHJlSW5kZXggKyA0KVxcXFxuICAgICAgICByZXR1cm4gZWxcXFxcbiAgICB9IGVsc2UgaWYgKGVsLnVybC5zdGFydHNXaXRoKCdzZWxlY3Q6Ly8nKSkge1xcXFxuICAgICAgICBsZXQgcGFyYSA9IEpTT04ucGFyc2UoZWwudXJsLnNsaWNlKDkpKVxcXFxuICAgICAgICBpZiAocGFyYS5qcykgcGFyYS5qcyA9IGhpamFja0xhenlSdWxlICsgJzsnICsgcGFyYS5qc1xcXFxuICAgICAgICBlbC51cmwgPSAnc2VsZWN0Oi8vJyArIEpTT04uc3RyaW5naWZ5KHBhcmEpXFxcXG4gICAgICAgIHJldHVybiBlbFxcXFxuICAgIH0gZWxzZSBpZiAoZWwudXJsLmluY2x1ZGVzKCdAcnVsZT0nKSkge1xcXFxuICAgICAgICBsZXQgW18sIHVybCwgcnVsZV0gPSBlbC51cmwubWF0Y2goL14oW1xcXFxcXFxcc1xcXFxcXFxcU10qPylAcnVsZT0oW1xcXFxcXFxcc1xcXFxcXFxcU10qKSQvKVxcXFxuICAgICAgICBlbC51cmwgPSB1cmxcXFxcbiAgICAgICAgTk9XX1JVTEUuZGV0YWlsX2ZpbmRfcnVsZSA9IHJ1bGVcXFxcbiAgICAgICAgTk9XX1JVTEUuZGV0YWlsX2NvbF90eXBlID0gTVlfUlVMRS5jb2xfdHlwZVxcXFxuICAgIH0gZWxzZSBpZiAoZWwudXJsLnN0YXJ0c1dpdGgoJ2hpa2VyOi8vcGFnZS8nKSkge1xcXFxuICAgICAgICBpZiAoZWwudXJsLmluY2x1ZGVzKCdydWxlPScpIHx8IGVsLmV4dHJhLnJ1bGUpXFxcXG4gICAgICAgICAgICByZXR1cm4gZWxcXFxcbiAgICAgICAgbGV0IFtfLCBwYXRoLCBmbGFnLCBwYXJhbXNdID0gZWwudXJsLm1hdGNoKC9eaGlrZXI6XFxcXFxcXFwvXFxcXFxcXFwvcGFnZVxcXFxcXFxcLyguKz8pKCMuKj8pPyg/OlxcXFxcXFxcPyguKikpPyQvKSxcXFxcbiAgICAgICAgICAgIHN1YlBhZ2UgPSBNWV9SVUxFLnBhZ2VMaXN0LmZpbmQoKHYpID0+IHYucGF0aCA9PSBwYXRoKSxcXFxcbiAgICAgICAgICAgIHN1YlVybCA9IChwYXJhbXMgfHwgJycpLnNwbGl0KCcmJykuZmluZCgodikgPT4gdi5zdGFydHNXaXRoKCd1cmw9JykpXFxcXG4gICAgICAgIGVsLnVybCA9IChzdWJVcmwgPyBzdWJVcmwuc2xpY2UoNCkucmVwbGFjZSgv77yf77yfL2csICc/JykucmVwbGFjZSgv77yG77yGL2csICcmJykgOiAoZWwuZXh0cmEgfHwge30pLnVybCkgfHwgJ2hpa2VyOi8vZW1wdHknICsgZmxhZyArICc/JyArIChwYXJhbXMgfHwgJycpXFxcXG4gICAgICAgIE5PV19SVUxFLmRldGFpbF9maW5kX3J1bGUgPSBzdWJQYWdlLnJ1bGVcXFxcbiAgICAgICAgTk9XX1JVTEUuZGV0YWlsX2NvbF90eXBlID0gc3ViUGFnZS5jb2xfdHlwZVxcXFxuICAgIH0gZWxzZSBpZiAoZWwudXJsLmluY2x1ZGVzKCdAbGF6eVJ1bGU9JykpIHtcXFxcbiAgICAgICAgbGV0IHJlSW5kZXggPSBlbC51cmwuaW5kZXhPZignLmpzOicpXFxcXG4gICAgICAgIGlmIChyZUluZGV4ID49IDApIGVsLnVybCA9IGVsLnVybC5zbGljZSgwLCByZUluZGV4KSArICcuanM6JyArIGhpamFja0xhenlSdWxlICsgJzsnICsgZWwudXJsLnNsaWNlKHJlSW5kZXggKyA0KVxcXFxuICAgICAgICByZXR1cm4gZWxcXFxcbiAgICB9IGVsc2UgaWYgKGlzSW5kZXgpIHtcXFxcbiAgICAgICAgaWYgKCFNWV9SVUxFLmRldGFpbF9maW5kX3J1bGUgfHwgL2hpa2VyOlxcXFxcXFxcL1xcXFxcXFxcLyg/IWVtcHR5LiskKS8udGVzdChlbC51cmwpKSByZXR1cm4gZWxcXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICByZXR1cm4gZWxcXFxcbiAgICB9XFxcXG4gICAgZWwuZXh0cmEgPSBPYmplY3QuYXNzaWduKHt9LCBlbC5leHRyYSwge1xcXFxuICAgICAgICB1cmw6IGdlbkV4VXJsKGVsLnVybCksXFxcXG4gICAgICAgIFJVTEU6IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShOT1dfUlVMRSkpLFxcXFxuICAgICAgICBwYWdlVGl0bGU6IGlzSW5kZXggJiYgZWwudGl0bGVcXFxcbiAgICB9KVxcXFxuICAgIGVsLnVybCA9ICdoaWtlcjovL3BhZ2UvZnJhbWVMb2FkP3J1bGU9JyArIFFJTkdfVElUTEVcXFxcbiAgICByZXR1cm4gZWxcXFxcbn1cXFxcbiQuZXhwb3J0cyA9IHtcXFxcbiAgICBydW5Db2RlOiBydW5Db2RlLFxcXFxuICAgIGluZGV4VXJsOiBpbmRleFVybCxcXFxcbiAgICBwYXJhbUhhbmRsZTogcGFyYW1IYW5kbGUsXFxcXG4gICAgcnVuUHJlUnVsZTogcnVuUHJlUnVsZSxcXFxcbiAgICBnZW5NeVJ1bGU6IGdlbk15UnVsZSxcXFxcbiAgICBnZW5FeFVybDogZ2VuRXhVcmwsXFxcXG4gICAgaGlqYWNrTGF6eVJ1bGU6IGhpamFja0xhenlSdWxlLFxcXFxuICAgIGhpamFja0VsOiBoaWphY2tFbFxcXFxufVxcXFxuXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5ryr55S76Kej5p6QKlxcXCIsXFxcInBhdGhcXFwiOlxcXCJqc1xcXCIsXFxcInJ1bGVcXFwiOlxcXCJmdW5jdGlvbiDniLHnsbPmjqjnsbsoaW5wdXQpIHtcXFxcblxcXFx0dHJ5e1xcXFxuICAgICAgICB2YXIgdXJsID0gaW5wdXRcXFxcbiAgICAgICAgLnJlcGxhY2UoJ20uJ3x8J21oLid8fCd3YXAuJywgJ3d3dy4nKVxcXFxuICAgICAgICAucmVwbGFjZSgnaWtyLicsICdpY2Vrci4nKTtcXFxcbiAgICAgICAgdmFyIGh0bWwgPSByZXF1ZXN0KHVybCwge1xcXFxuICAgIGhlYWRlcnM6IHtcXFxcbiAgICAgICAgJ1VzZXItQWdlbnQnOiBQQ19VQSxcXFxcbiAgICAgICAgJ1JlZmVyZXInOiB1cmxcXFxcbiAgICB9XFxcXG59KVxcXFxuICAgIGV2YWwocGRmaChwZGZhKGh0bWwsICdib2R5JiZzY3JpcHQ6bm90KFtzcmNdKTpub3QoW3R5cGVdKScpWzBdLCAnc2NyaXB0JiZIdG1sJykpO1xcXFxuICAgIHZhciBwaWNzID0gW107XFxcXG4gICAgaWYgKGNoYXB0ZXJJbWFnZXMubGVuZ3RoID4gMCkge1xcXFxuICAgICAgICB2YXIgaG9zdCA9IHJlcXVlc3QoaW5wdXQpLm1hdGNoKC9pbWcgc3JjPVxcXFxcXFwiKC4qPylcXFxcXFxcXC9pbWFnZS8pWzFdO1xcXFxuICAgICAgICBjaGFwdGVySW1hZ2VzLmZvckVhY2goaW1nID0+IHtcXFxcbiAgICAgICAgICAgIGlmIChpbWcuaW5kZXhPZihcXFxcXFxcImh0dHBcXFxcXFxcIikgPiAtMSkge1xcXFxuICAgICAgICAgICAgcGljcy5wdXNoKGltZyArICdAUmVmZXJlcj0nICsgdXJsKVxcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHBpY3MucHVzaChob3N0ICsgaW1nICsgJ0BSZWZlcmVyPScgKyB1cmwpXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pXFxcXG4gICAgfSBlbHNlIHtcXFxcbiAgICAgICAgdmFyIGh0bWwgPSByZXF1ZXN0KGlucHV0KTtcXFxcbiAgICAgICAgdmFyIHBpY3MgPSBbXTtcXFxcbiAgICAgICAgaWYoL2tfdG90YWwvLnRlc3QoaHRtbCkpe1xcXFxuICAgICAgICAgICAgdmFyIFBhZ2UgPSBwZGZoKGh0bWwsICcja190b3RhbCYmVGV4dCcpO1xcXFxuICAgICAgICAgICAgaWYoUGFnZS5sZW5ndGggPiAwKXtcXFxcbiAgICAgICAgICAgICAgICB2YXIgaG9zdCA9IGh0bWwubWF0Y2goL21pcC1pbWcgc3JjPVxcXFxcXFwiKC4qPylpbWFnZS8pWzFdO1xcXFxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBQYWdlOyBpKyspIHtcXFxcbiAgICAgICAgcGljcy5wdXNoKGhvc3QgKyAnaW1hZ2Uvdmlldy8nICsgaW5wdXQubWF0Y2goL1xcXFxcXFxcZCsvKVswXSArICcvJyArIGkgKyAnLndlYnAnKyAnQFJlZmVyZXI9JylcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICB9IGVsc2Uge1xcXFxuICAgICAgICB2YXIgcmVzMSA9IHt9O1xcXFxuICAgICAgICB2YXIgZDEgPSBbXTtcXFxcbiAgICAgICAgdmFyIGpzSHRtbCA9IGZldGNoKGlucHV0LCB7XFxcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgXFxcXFxcXCJjb250ZW50LXR5cGVcXFxcXFxcIjogXFxcXFxcXCJVVEYtOFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgIFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOiBcXFxcXFxcIk1vYmlsZVxcXFxcXFwiXFxcXG4gICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgbWV0aG9kOiBcXFxcXFxcIkdFVFxcXFxcXFwiXFxcXG4gICAgICAgIH0pO1xcXFxuICAgICAgICB2YXIgcGljcyA9IFtdO1xcXFxuICAgICAgICBmb3IgKHZhciBrID0gMTs7IGsrKykge1xcXFxuICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICB2YXIganNIdG1sID0gZmV0Y2goaW5wdXQuc3BsaXQoXFxcXFxcXCIuaHRtbFxcXFxcXFwiKVswXSArIFxcXFxcXFwiLVxcXFxcXFwiICsgayArIFxcXFxcXFwiLmh0bWxcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImNvbnRlbnQtdHlwZVxcXFxcXFwiOiBcXFxcXFxcIlVURi04XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjogXFxcXFxcXCJNb2JpbGVcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFxcXFxcXFwiR0VUXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcGFnZSA9IHBkZmgoanNIdG1sLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICBpZiAocGFnZSAmJiBwYWdlLmluY2x1ZGVzKFxcXFxcXFwiL1xcXFxcXFwiKSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBwYWdlID0gcGFyc2VJbnQocGFnZS5zcGxpdChcXFxcXFxcIi9cXFxcXFxcIilbMV0pO1xcXFxuICAgICAgICAgICAgICAgICAgICB2YXIganNVcmwgPSBwYXJzZURvbUZvckh0bWwoanNIdG1sLCBcXFxcXFxcIi5lclBhZyYmbWlwLWltZ3x8aW1nJiZzcmNcXFxcXFxcIikrICdAUmVmZXJlcj0nO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoanNVcmwuaW5kZXhPZihcXFxcXFxcInBuZ1xcXFxcXFwiKSA+IC0xKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmxzID0gW107XFxcXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAyOyBpIDw9IHBhZ2U7IGkrKykge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJscy5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGlucHV0LnNwbGl0KFxcXFxcXFwiLmh0bWxcXFxcXFxcIilbMF0gKyBcXFxcXFxcIi1cXFxcXFxcIiArIGkgKyBcXFxcXFxcIi5odG1sXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcImNvbnRlbnQtdHlwZVxcXFxcXFwiOiBcXFxcXFxcIlVURi04XFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjogXFxcXFxcXCJNb2JpbGVcXFxcXFxcIlxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IFxcXFxcXFwiR0VUXFxcXFxcXCJcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBodG1scyA9IGJmKHVybHMpO1xcXFxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGh0bWxzLmxlbmd0aDsgaSsrKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIganNVcmwgPSBwYXJzZURvbUZvckh0bWwoaHRtbHNbaV0sIFxcXFxcXFwiLmVyUGFnJiZtaXAtaW1nfHxpbWcmJnNyY1xcXFxcXFwiKSsgJ0BSZWZlcmVyPSc7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNVcmwuaW5kZXhPZihcXFxcXFxcInBuZ1xcXFxcXFwiKSA+IC0xKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICBwaWNzLnB1c2goanNVcmwpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB2YXIganNVcmwgPSBwYXJzZURvbUZvckh0bWwoanNIdG1sLCBcXFxcXFxcIi5lclBhZyYmbWlwLWltZ3x8aW1nJiZzcmNcXFxcXFxcIikrICdAUmVmZXJlcj0nO1xcXFxuICAgICAgICAgICAgICAgIGlmIChqc1VybC5pbmRleE9mKFxcXFxcXFwicG5nXFxcXFxcXCIpID4gLTEpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgYnJlYWtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICBwaWNzLnB1c2goanNVcmwpO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICBicmVha1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgdmFyIGxpc3QgPSBwZGZhKGh0bWwsICdib2R5JiYuc2Nyb2xsLWl0ZW18fC5pbWFnZS1jb250ZW50fHwjc2Nyb2xsLWltYWdlJyk7XFxcXG4gICAgICAgIHZhciBmaXJzdCA9IHBkZmEoaHRtbCwgJ2JvZHkmJiNpbWFnZScpO1xcXFxuICAgICAgICBsaXN0ID0gZmlyc3QuY29uY2F0KGxpc3QpO1xcXFxuICAgICAgICBsaXN0LmZvckVhY2goaW1nID0+IHtcXFxcbiAgICAgICAgICAgIHBpY3MucHVzaChwZGZoKGltZywgJ2ltZyYmZGF0YS1zcmN8fHNyYycpICsgJ0BSZWZlcmVyPScgKyBpbnB1dClcXFxcbiAgICAgICAgfSlcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbiAgICB9IGNhdGNoKGUpIHtcXFxcbiAgICAgICAgdmFyIGh0bWwgPSByZXF1ZXN0KGlucHV0KTtcXFxcbiAgICAgICAgdmFyIHBpY3MgPSBbXTtcXFxcbiAgICAgICAgdmFyIGxpc3QgPSBwZGZhKGh0bWwsICdib2R5JiYuc2Nyb2xsLWl0ZW18fC5pbWFnZS1jb250ZW50fHwjc2Nyb2xsLWltYWdlJyk7XFxcXG4gICAgICAgIHZhciBmaXJzdCA9IHBkZmEoaHRtbCwgJ2JvZHkmJiNpbWFnZScpO1xcXFxuICAgICAgICBsaXN0ID0gZmlyc3QuY29uY2F0KGxpc3QpO1xcXFxuICAgICAgICBsaXN0LmZvckVhY2goaW1nID0+IHtcXFxcbiAgICAgICAgICAgIHBpY3MucHVzaChwZGZoKGltZywgJ2ltZyYmZGF0YS1zcmN8fHNyYycpICsgJ0BSZWZlcmVyPScgKyBpbnB1dClcXFxcbiAgICAgICAgfSlcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIFxcXFxcXFwicGljczovL1xcXFxcXFwiICsgcGljcy5qb2luKFxcXFxcXFwiJiZcXFxcXFxcIilcXFxcbn1cXFxcbiQuZXhwb3J0cy5qeD3niLHnsbPmjqjnsbs7XFxcXG5cXFxcbmZ1bmN0aW9uIOWMheWtkChpbnB1dCkge1xcXFxuICAgIHZhciBpZCA9IHRydWU7XFxcXG4gICAgdmFyIGNvZGUgPSByZXF1ZXN0KGlucHV0KVxcXFxuICAgIHZhciBwaWNzID0gW107XFxcXG4gICAgdmFyIHRvX1JlcGVhdCA9IGZhbHNlO1xcXFxuXFxcXG5cXFxcbiAgICB3aGlsZSAoaWQpIHtcXFxcbiAgICAgICAgcGRmYShjb2RlLCBcXFxcXFxcIi5jaGFwdGVyLW1haW4mJmFtcC1pbWdcXFxcXFxcIilcXFxcbiAgICAgICAgICAgIC5mb3JFYWNoKGRhdGEgPT4gcGljcy5wdXNoKHBkZmgoZGF0YSwgXFxcXFxcXCJhbXAtaW1nJiZzcmNcXFxcXFxcIikgKyAnQFJlZmVyZXI9aHR0cHM6Ly93d3cud2VibW90YS5jb20vJykpO1xcXFxuICAgICAgICB2YXIgbmV4dF9QYWdlID0gcGRmaChjb2RlLCBcXFxcXFxcIi5uZXh0X2NoYXB0ZXIsLTEmJkh0bWxcXFxcXFxcIilcXFxcbiAgICAgICAgaWYgKG5leHRfUGFnZS5pbmNsdWRlcygn5LiL5LiA6aG1JykpIHtcXFxcbiAgICAgICAgICAgIGNvZGUgPSByZXF1ZXN0KHBkZmgobmV4dF9QYWdlLCBcXFxcXFxcImEmJmhyZWZcXFxcXFxcIikpXFxcXG4gICAgICAgICAgICB0b19SZXBlYXQgPSB0cnVlO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgaWQgPSBmYWxzZTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcblxcXFxuICAgIC8v5Y676Zmk6YeN5aSN5Zu+54mHXFxcXG4gICAgaWYgKHRvX1JlcGVhdCkge1xcXFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBpY3MubGVuZ3RoOyBpKyspIHtcXFxcbiAgICAgICAgICAgIHdoaWxlIChwaWNzLmluZGV4T2YocGljc1tpXSwgaSArIDEpICE9IC0xKSB7XFxcXG4gICAgICAgICAgICAgICAgcGljcy5zcGxpY2UocGljcy5pbmRleE9mKHBpY3NbaV0sIGkgKyAxKSwgMSlcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcblxcXFxuICAgIHJldHVybiBcXFxcXFxcInBpY3M6Ly9cXFxcXFxcIiArIHBpY3Muam9pbihcXFxcXFxcIiYmXFxcXFxcXCIpO1xcXFxufVxcXFxuJC5leHBvcnRzLmJ6PeWMheWtkDtcXFxcblxcXFxuZnVuY3Rpb24g5Y+k6aOOKGlucHV0KSB7XFxcXG5cXFxcdHZhciBodG1sID0gZmV0Y2hQQyhpbnB1dCk7XFxcXG5cXFxcdGV2YWwocGRmaChwZGZhKGh0bWwsICdib2R5JiZzY3JpcHQ6bm90KFtzcmNdKTpub3QoW3R5cGVdKScpWzBdLCAnc2NyaXB0JiZIdG1sJykpO1xcXFxuXFxcXHR2YXIgcGljcyA9IFtdO1xcXFxuXFxcXHRmb3IgKHZhciBpIGluIGNoYXB0ZXJJbWFnZXMpIHtcXFxcblxcXFx0XFxcXHRwaWNzLnB1c2goJ2h0dHBzOi8vcmVzLnhpYW9xaW5yZS5jb20vJyArIGNoYXB0ZXJQYXRoICsgY2hhcHRlckltYWdlc1tpXSArICdAUmVmZXJlcj1odHRwczovL3d3dy4xMjNnZi5jb20nKVxcXFxuXFxcXHRcXFxcdH1cXFxcblxcXFx0cmV0dXJuIFxcXFxcXFwicGljczovL1xcXFxcXFwiICsgcGljcy5qb2luKFxcXFxcXFwiJiZcXFxcXFxcIilcXFxcbn1cXFxcbiQuZXhwb3J0cy5HRj3lj6Tpo447XFxcXG5cXFxcbmZ1bmN0aW9uIOeIseexsyhpbnB1dCkge1xcXFxuICAgICAgICB2YXIgaHRtbCA9IHJlcXVlc3QoaW5wdXQpO1xcXFxuICAgICAgICB2YXIgcGljcyA9IFtdO1xcXFxuICAgICAgICB2YXIgbGlzdCA9IHBkZmEoaHRtbCwgJ2JvZHkmJi5zY3JvbGwtaXRlbXx8LmltYWdlLWNvbnRlbnR8fCNzY3JvbGwtaW1hZ2UnKTtcXFxcbiAgICAgICAgdmFyIGZpcnN0ID0gcGRmYShodG1sLCAnYm9keSYmI2ltYWdlJyk7XFxcXG4gICAgICAgIGxpc3QgPSBmaXJzdC5jb25jYXQobGlzdCk7XFxcXG4gICAgICAgIGxpc3QuZm9yRWFjaChpbWcgPT4ge1xcXFxuICAgICAgICAgICAgcGljcy5wdXNoKHBkZmgoaW1nLCAnaW1nJiZkYXRhLXNyY3x8c3JjJykgKyAnQFJlZmVyZXI9JyArIGlucHV0KVxcXFxuICAgICAgICB9KVxcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJwaWNzOi8vXFxcXFxcXCIgKyBwaWNzLmpvaW4oXFxcXFxcXCImJlxcXFxcXFwiKVxcXFxufVxcXFxuJC5leHBvcnRzLklNPeeIseexsztcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLkupHlj6Pku6QqXFxcIixcXFwicGF0aFxcXCI6XFxcImltcG9ydFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJ3cml0ZUZpbGUoJ2hpa2VyOi8vZmlsZXMvL3J1bGVzL1R6L0pNJyxmZXRjaChpbnB1dCkpXFxcXG4ndG9hc3Q6Ly/lt7Lku47kupHlj6Pku6Tojrflj5bpmIXmvKvlkJvmupAnXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5pu05paw6K+m5oOFKlxcXCIsXFxcInBhdGhcXFwiOlxcXCJVcFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbnZhciByZXMgPSB7fTtcXFxcbnZhciBpdGVtcyA9IFtdO1xcXFxudmFyIGltZyA9ICdodHRwczovL2JpbmcuaW1nLnJ1bi8xMzY2eDc2OC5waHAnO1xcXFxuaXRlbXMucHVzaCh7XFxcXG4gICAgaW1nOiBpbWcsXFxcXG4gICAgdXJsOiBpbWcgKyBcXFxcXFxcIiMuanBnXFxcXFxcXCIsXFxcXG4gICAgZGVzYzogJzAnLFxcXFxuICAgIGNvbF90eXBlOiAnY2FyZF9waWNfMSdcXFxcbn0pO1xcXFxuXFxcXG5pdGVtcy5wdXNoKHtcXFxcbiAgICB0aXRsZTogXFxcXFxcXCLigJzigJzigJ3igJ08aDQ+44CQ6ZiF5ryr5ZCb5Y+N6aaI5pS26ZuG44CRPC9oND5cXFxcXFxcIiArICc8c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiBncmV5XFxcXFxcXCI+5bCP5bCPPC9zcGFuPicsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiLFxcXFxuICAgIHVybDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvbWFuYWdlUnVsZSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSM/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBsdmVyOiBNWV9QQVJBTVMudmVyc2lvbiB8fCBcXFxcXFxcIuiOt+WPlueJiOacrOWksei0pe+8jOiHquihjOafpeeci1xcXFxcXFwiLFxcXFxuICAgICAgICBpZDogXFxcXFxcXCI2NzkxXFxcXFxcXCJcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxuaWYgKGdldEl0ZW0oXFxcXFxcXCJyZWFkX3BvbGljeVxcXFxcXFwiKSAhPT0gXFxcXFxcXCIxXFxcXFxcXCIpIHtcXFxcbiAgICBpdGVtcy5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08c21hbGw+PGZvbnQgY29sb3I9Izg3MWY3OD7mnKzop4TliJnmlbDmja7mnaXmupDkuo7nvZHnu5zvvIzlpoLmgqjllpzmrKLvvIzor7fmlK/mjIHlrpjmlrk8L2ZvbnQ+PC9zbWFsbD4nLFxcXFxuICAgICAgICBkZXNjOiAn4oCc4oCc4oCd4oCdPHNtYWxsPjxmb250IGNvbG9yPSNmMjBjMDA+5pys6KeE5YiZ5LuF6ZmQ5YWN6LS55a2m5Lmg5Lqk5rWB5L2/55So77yM6K+35LqO5a+85YWl5ZCOMjTlsI/ml7blhoXliKDpmaTvvIzku7vkvZXnu4Tnu4fmiJbkuKrkurrkuI3lvpfku6Xku7vkvZXmlrnlvI/mlrnms5XkvKDmkq3miJbllK7ljZbmraTop4TliJnnmoTmlbTkvZPmiJbpg6jliIbvvIE8L2ZvbnQ+PC9zbWFsbD4nLFxcXFxuICAgICAgICB1cmw6ICQoJyNub0hpc3RvcnkjJykubGF6eVJ1bGUoKCkgPT4ge1xcXFxuICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcInJlYWRfcG9saWN5XFxcXFxcXCIsIFxcXFxcXFwiMVxcXFxcXFwiKVxcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpXFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S9oOW3suWQjOaEj+ivpeWNj+iurlxcXFxcXFwiXFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxcXG4gICAgfSlcXFxcbn1cXFxcblxcXFxuaXRlbXMucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08Yj7kvb/nlKjor7TmmI48L2I+JyxcXFxcbiAgICB1cmw6IFxcXFxcXFwi5YiH5o2i5YiG57uE5pCc57Si5Y2z5Y+vXFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF8yXFxcXFxcXCJcXFxcbn0pO1xcXFxuXFxcXG5sZXQgbmV3VmVyc2lvbjtcXFxcbmxldCBteVZlcnNpb24gPSBNWV9QQVJBTVMudmVyc2lvbjtcXFxcbnRyeSB7XFxcXG4gICAgbmV3VmVyc2lvbiA9IEpTT04ucGFyc2UoZmV0Y2hQQyhcXFxcXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9kZXYvZ2V0YnlpZD9pZD02NzQ5XFxcXFxcXCIsIHtcXFxcbiAgICAgICAgdGltZW91dDogMTAwMFxcXFxuICAgIH0pKS5yZXN1bHQudmVyO1xcXFxufSBjYXRjaCAoZSkge1xcXFxuICAgIHRvYXN0KFxcXFxcXFwi6YGT6ZW/5LuT5bqT5oq96aOO5LqG77yM5pys5qyh5pyq5qOA5rWL5Yiw5paw54mI5L+h5oGvXFxcXFxcXCIpO1xcXFxuICAgIG5ld1ZlcnNpb24gPSBteVZlcnNpb247XFxcXG59XFxcXG5sZXQgaXNVcGRhdGUgPSBOdW1iZXIobmV3VmVyc2lvbikgPiBOdW1iZXIobXlWZXJzaW9uKTtcXFxcbmxldCBpc1ZlciA9IE51bWJlcihuZXdWZXJzaW9uKSA9PT0gTnVtYmVyKG15VmVyc2lvbik7XFxcXG5pZiAoaXNVcGRhdGUpIHtcXFxcbiAgICBsb2coJ+acieaWsOeJiOacrDonICsgbmV3VmVyc2lvbiArICcs5b2T5YmNOicgKyBteVZlcnNpb24pO1xcXFxufVxcXFxuaXRlbXMucHVzaCh7XFxcXG4gICAgdGl0bGU6IGlzVXBkYXRlID8gXFxcXFxcXCLwn4aZ5paw54mI5pysXFxcXFxcXCIgOiBcXFxcXFxcIuinhOWImeWPkeW4g+mhtSblj43ppohcXFxcXFxcIixcXFxcbiAgICB1cmw6IGlzVXBkYXRlID8gXFxcXFxcXCJydWxlOi8vNXJXMzZaaVU2S2VHNTVXTTZhYVc2YUcxNmFLUjZZR1Q2S2VFNVlpWjQ0Q1E2SUdhNXJ5cjhKK1VydU9Ba2UrL3BXaHZiV1ZmY25Wc1pWOTFjbXp2djZWb2RIUndPaTh2YUdsclpYSXVibTlyYVdFdWNISmxjM012YUdsclpYSjFiR1V2Y25Wc1pXeHBjM1F1YW5OdmJqOXBaRDB5T0RRM1xcXFxcXFwiIDogXFxcXFxcXCJoaWtlcjovL3BhZ2UvbWFuYWdlUnVsZSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSM/cnVsZT3pgZPplb/ku5PlupNQcm9cXFxcXFxcIixcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0XzJcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBsdmVyOiBNWV9QQVJBTVMudmVyc2lvbiB8fCBcXFxcXFxcIuiOt+WPlueJiOacrOWksei0pe+8jOiHquihjOafpeeci1xcXFxcXFwiLFxcXFxuICAgICAgICBpZDogXFxcXFxcXCI2NzkxXFxcXFxcXCJcXFxcbiAgICB9XFxcXG59KTtcXFxcbmNvbnN0IENvbG9yID0gXFxcXFxcXCIjMTlCODlEXFxcXFxcXCI7XFxcXG52YXIgZGVzX2Rlc2MgPSBcXFxcbic8aDEgc3R5bGU9XFxcXFxcXCJ0ZXh0LWFsaWduOiBjZW50ZXI7XFxcXFxcXCI+8J+QvuabtOaWsFsyMDI0MDYwMl08L2gxPicgK1xcXFxuICAgICc8PGJsb2NrcXVvdGU+PGZvbnQgY29sb3I9XFxcXFxcXCJyZWRcXFxcXFxcIj7ikaDliZTpmaTlpLHmlYjmupDvvIzmvKvom5kv5ou36LSd5Zu95YaFL+WIhuexuy/mkJzntKLkv67lpI08L2JyPjwvPGJsb2NrcXVvdGU+JyArXFxcXG5cXFxcbic8aDEgc3R5bGU9XFxcXFxcXCJ0ZXh0LWFsaWduOiBjZW50ZXI7XFxcXFxcXCI+8J+QvuabtOaWsFsxMTA1XTwvaDE+JyArXFxcXG4gICAgJzw8YmxvY2txdW90ZT48Zm9udCBjb2xvcj1cXFxcXFxcInJlZFxcXFxcXFwiPuKRoOabtOaNoui/nOeoi+S7k+W6k++8jOS8mOWMluWKoOi9vemAn+W6piDlubblop7liqDmm7TmlrDplb/mjInop4TliJnlkI0g5riF6Zmk57yT5a2Y5Y2z5Y+vPC9icj7ikaHkv67lpI3mvKvom5nlm77mupDliqDovb3kuI3lh7rmnaU8YnI+PC88YmxvY2txdW90ZT4nICtcXFxcblxcXFxuJzxoMSBzdHlsZT1cXFxcXFxcInRleHQtYWxpZ246IGNlbnRlcjtcXFxcXFxcIj7wn5C+5pu05pawWzIzMTAyM108L2gxPicgK1xcXFxuICAgICc8PGJsb2NrcXVvdGU+PGZvbnQgY29sb3I9XFxcXFxcXCJyZWRcXFxcXFxcIj7ikaDlop7liqDmvKvnpZ4v6YeO6Juu5ryr55S7PC9icj48YnI+4pGh5LyY5YyW6ZiF5ryr5ZCb5pys5L2T77yM5LiO5pen6KeE5YiZ5LiN5YW85a6577yM6ZyA5Yig6Zmk5pu05paw6KeE5YiZ5pys5ZywPC9icj48YnI+4pGi5YmU6Zmk5peg55So5rqQ77yM5L+u5aSN6YOo5YiG5rqQ5oql6ZSZPC9icj48LzxibG9ja3F1b3RlPidcXFxcblxcXFxuaXRlbXMucHVzaCh7XFxcXG4gICAgdGl0bGU6ICfmm7TmlrDor6bmg4UgPHNtYWxsPjxzbWFsbD48c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiMxOUI4OURcXFxcXFxcIj7lsZXlvIA+PC9zcGFuPjwvc21hbGw+PC9zbWFsbD4nLFxcXFxuICAgIGltZzogXFxcXFxcXCJodHRwczovL2xhbm1laWd1b2ppYW5nLmNvbS90dWJpYW8vbW9yZS8xOTcucG5nXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGpqaWQsIGRlY2lkLCBkZXNfZGVzYykgPT4ge1xcXFxuICAgICAgICBpZiAoZ2V0TXlWYXIoXFxcXFxcXCJqanNcXFxcXFxcIiwgXFxcXFxcXCLmlLbotbdcXFxcXFxcIikgPT0gXFxcXFxcXCLmlLbotbdcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcXFxcXCJqanNcXFxcXFxcIiwgXFxcXFxcXCLlsZXlvIBcXFxcXFxcIik7XFxcXG5cXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBqamlkXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICB0aXRsZTogJ+abtOaWsOivpuaDhSA8c21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6IzE5Qjg5RFxcXFxcXFwiPuaUtui1tz48L3NwYW4+PC9zbWFsbD48L3NtYWxsPidcXFxcbiAgICAgICAgICAgIH0pXFxcXG5cXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRleHRTaXplOiAxNCxcXFxcbiAgICAgICAgICAgICAgICAgICAgbGluZVNwYWNpbmc6IDMsXFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBkZWNpZFxcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICc8c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiM4MDgwODBcXFxcXFxcIj4nICsgZGVzX2Rlc2MgKyAnPC9zcGFuPidcXFxcbiAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXFxcXFwiampzXFxcXFxcXCIsIFxcXFxcXFwi5pS26LW3XFxcXFxcXCIpO1xcXFxuXFxcXG4gICAgICAgICAgICB1cGRhdGVJdGVtKHtcXFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgICAgICBpZDogamppZFxcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICfmm7TmlrDor6bmg4U8c21hbGw+PHNtYWxsPjxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6IzE5Qjg5RFxcXFxcXFwiPuWxleW8gD48L3NwYW4+PC9zbWFsbD48L3NtYWxsPidcXFxcbiAgICAgICAgICAgIH0pXFxcXG5cXFxcbiAgICAgICAgICAgIHVwZGF0ZUl0ZW0oe1xcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHRleHRTaXplOiAxNCxcXFxcbiAgICAgICAgICAgICAgICAgICAgbGluZVNwYWNpbmc6IDMsXFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBkZWNpZFxcXFxuICAgICAgICAgICAgICAgIH0sXFxcXG4gICAgICAgICAgICAgICAgdGl0bGU6ICc8c3BhbiBzdHlsZT1cXFxcXFxcImNvbG9yOiM4MDgwODBcXFxcXFxcIj4nICsgZGVzX2Rlc2Muc3Vic3RyKDAsIDE1MClcXFxcbiAgICAgICAgICAgIH0pXFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL2VtcHR5XFxcXFxcXCJcXFxcbiAgICAgICAgfVxcXFxuXFxcXG4gICAgfSwgTVlfUlVMRSArIFxcXFxcXFwiX2pqaWRcXFxcXFxcIiwgTVlfUlVMRSArIFxcXFxcXFwiX2RlY2lkXFxcXFxcXCIsIGRlc19kZXNjKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJhdmF0YXJcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICBpZDogTVlfUlVMRSArIFxcXFxcXFwiX2pqaWRcXFxcXFxcIlxcXFxuICAgIH1cXFxcbn0pO1xcXFxuXFxcXG5pdGVtcy5wdXNoKHtcXFxcbiAgICB0aXRsZTogJzxzcGFuIHN0eWxlPVxcXFxcXFwiY29sb3I6IzgwODA4MFxcXFxcXFwiPicgKyBkZXNfZGVzYy5zdWJzdHIoMCwgMTUwKSxcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJyaWNoX3RleHRcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB0ZXh0U2l6ZTogMTQsXFxcXG4gICAgICAgIGxpbmVTcGFjaW5nOiAzLFxcXFxuICAgICAgICBpZDogTVlfUlVMRSArIFxcXFxcXFwiX2RlY2lkXFxcXFxcXCJcXFxcbiAgICB9XFxcXG59KTtcXFxcblxcXFxucmVzLmRhdGEgPSBpdGVtcztcXFxcbnNldEhvbWVSZXN1bHQocmVzKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLkvb/nlKjluK7liqkqXFxcIixcXFwicGF0aFxcXCI6XFxcIkhlbHBcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG52YXIgcmVzID0ge307XFxcXG52YXIgaXRlbXMgPSBbXTtcXFxcblxcXFxuaXRlbXMucHVzaCh7XFxcXG4gICAgdGl0bGU6J+S6jOe6p+mhtemdouagh+mimOWPjOWHu+S8mOWMlu+8jOWcqOmhtumDqOWImeWPjOWHu+WIsOW6lemDqO+8jOWQpuWImeWPjOWHu+WbnumhtumDqCcsXFxcXG4gICAgY29sX3R5cGU6ICdyaWNoX3RleHQnXFxcXG59KTtcXFxcblxcXFxuaXRlbXMucHVzaCh7XFxcXG4gICAgaW1nOiAnaHR0cHM6Ly9zMS5heDF4LmNvbS8yMDIyLzExLzA0L3hMaGdvUi5qcGcnLFxcXFxuICAgIGRlc2M6ICcwJyxcXFxcbiAgICBjb2xfdHlwZTogJ3BpY18xX2Z1bGwnXFxcXG59KTtcXFxcblxcXFxuaXRlbXMucHVzaCh7XFxcXG4gICAgaW1nOiAnaHR0cHM6Ly9zMS5heDF4LmNvbS8yMDIyLzExLzA0L3hMaGN3OS5qcGcnLFxcXFxuICAgIGRlc2M6ICcwJyxcXFxcbiAgICBjb2xfdHlwZTogJ3BpY18xX2Z1bGwnXFxcXG59KTtcXFxcblxcXFxucmVzLmRhdGEgPSBpdGVtcztcXFxcbnNldEhvbWVSZXN1bHQocmVzKTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLmkJzntKIqXFxcIixcXFwicGF0aFxcXCI6XFxcInNlYXJjaFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJmdW5jdGlvbiBjb252ZXJ0MShzdHIpIHtcXFxcbiAgICBsZXQgYyA9IHN0ci5zcGxpdChcXFxcXFxcIjtcXFxcXFxcIilcXFxcbiAgICByZXR1cm4ge1xcXFxuICAgICAgICDliJfooag6IGNbMF0sXFxcXG4gICAgICAgIOagh+mimDogY1sxXSxcXFxcbiAgICAgICAg6ZO+5o6lOiBjWzJdLFxcXFxuICAgICAgICDmj4/ov7A6IGNbM10sXFxcXG4gICAgICAgIOivpuaDhTogY1s0XSxcXFxcbiAgICAgICAg5Zu+54mHOiBjWzVdXFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBtZXJnZShzb3VyY2UsIHRhcmdldCkge1xcXFxuICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMoc291cmNlKVxcXFxuICAgIGZvciAobGV0IGkgaW4ga2V5cykge1xcXFxuICAgICAgICB0YXJnZXRba2V5c1tpXV0gPSBzb3VyY2Vba2V5c1tpXV1cXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIOaQnOe0oihvYmopIHtcXFxcbiAgICB2YXIgZCA9IFtdO1xcXFxuICAgIGlmICgkLnR5cGUob2JqKSA9PSBcXFxcXFxcInN0cmluZ1xcXFxcXFwiKSB7XFxcXG4gICAgICAgIG9iaiA9IGNvbnZlcnQxKG9iailcXFxcbiAgICB9XFxcXG4gICAgaWYgKG9iai7op4TliJkpIHtcXFxcbiAgICAgICAgbGV0IGMgPSBjb252ZXJ0MShvYmou6KeE5YiZKVxcXFxuICAgICAgICBtZXJnZShjLCBvYmopXFxcXG4gICAgfVxcXFxuICAgIGxldCBhcnIgPSBwZGZhKGdldFJlc0NvZGUoKSwgb2JqLuWIl+ihqCk7XFxcXG4gICAgICAgaWYgKG9iai7liJfooajlpITnkIYgIT0gbnVsbCkge1xcXFxuICAgICAgICAgICAgYXJyID0gb2JqLumTvuaOpeWkhOeQhihhcnIpXFxcXG4gICAgICAgIH1cXFxcbiAgICBmb3IgKGxldCBpdCBvZiBhcnIpIHtcXFxcbiAgICAgICAgbGV0IHVybCA9IHBkKGl0LCBvYmou6ZO+5o6lKVxcXFxuICAgICAgICBpZiAob2JqLumTvuaOpeWkhOeQhiAhPSBudWxsKSB7XFxcXG4gICAgICAgICAgICB1cmwgPSBvYmou6ZO+5o6l5aSE55CGKHVybClcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgdGl0bGUgPSBwZGZoKGl0LCBvYmou5qCH6aKYKVxcXFxuICAgICAgICBpZiAob2JqLuagh+mimOWkhOeQhiAhPSBudWxsKSB7XFxcXG4gICAgICAgICAgICB0aXRsZSA9IG9iai7moIfpopjlpITnkIYodGl0bGUpXFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgbGV0IHBpYyA9IHBkKGl0LCBvYmou5Zu+54mHKVxcXFxuICAgICAgICBpZiAob2JqLuWbvueJh+WkhOeQhiAhPSBudWxsKSB7XFxcXG4gICAgICAgICAgICBwaWMgPSBvYmou5Zu+54mH5aSE55CGKHBpYylcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IG9iai7moIfpopggPyBwZGZoKGl0LCBvYmou5qCH6aKYKSA6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IHVybCsnI2F1dG9DYWNoZSMnLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBkZXNjOiBvYmou5o+P6L+wID8gcGRmaChpdCwgb2JqLuaPj+i/sCkgOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29udGVudDogb2JqLuivpuaDhSA/IHBkZmgoaXQsIG9iai7or6bmg4UpIDogXFxcXFxcXCJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHBpY191cmw6IHBpYyxcXFxcbiAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgeXRpdGxlOiB0aXRsZSxcXFxcbiAgICAgICAgICAgICAgICB5cGljOiBwaWMsXFxcXG4gICAgICAgICAgICAgICAgeXVybDogdXJsLnJlcGxhY2UoJ2hpa2VyOi8vZW1wdHkjIycsJycpXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuXFxcXG4gICAgfVxcXFxuICAgIHNldFJlc3VsdChkKTtcXFxcbn1cXFxcbnZhciB0b29sID0ge1xcXFxuICAgIOaQnOe0ojog5pCc57SiXFxcXG59XFxcXG4kLmV4cG9ydHMgPSB0b29sXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5Zu+54mH6Kej5a+GKlxcXCIsXFxcInBhdGhcXFwiOlxcXCJpbWdERVNcXFwiLFxcXCJydWxlXFxcIjpcXFwiJC5leHBvcnRzLmltZ0RlY3J5cHQgPSBmdW5jdGlvbigpIHtcXFxcbiAgICB2YXIgamF2YUltcG9ydCA9IG5ldyBKYXZhSW1wb3J0ZXIoKTtcXFxcbiAgICBqYXZhSW1wb3J0LmltcG9ydFBhY2thZ2UoXFxcXG4gICAgICAgIFBhY2thZ2VzLmNvbS5leGFtcGxlLmhpa2Vydmlldy51dGlscyxcXFxcbiAgICAgICAgUGFja2FnZXMuamF2YS5sYW5nLFxcXFxuICAgICAgICBQYWNrYWdlcy5qYXZhLnNlY3VyaXR5LFxcXFxuICAgICAgICBQYWNrYWdlcy5qYXZhLnV0aWwsXFxcXG4gICAgICAgIFBhY2thZ2VzLmphdmEuaW8sXFxcXG4gICAgICAgIFBhY2thZ2VzLmphdmEudGV4dCxcXFxcbiAgICAgICAgUGFja2FnZXMuamF2YXguY3J5cHRvLFxcXFxuICAgICAgICBQYWNrYWdlcy5qYXZheC5jcnlwdG8uc3BlY1xcXFxuICAgICk7XFxcXG4gICAgd2l0aChqYXZhSW1wb3J0KSB7XFxcXG4gICAgICAgIGxldCBieXRlcyA9IEZpbGVVdGlsLnRvQnl0ZXMoaW5wdXQpO1xcXFxuICAgICAgICBmdW5jdGlvbiBkZWNyeXB0RGF0YShiQXJyKSB7XFxcXG4gICAgICAgICAgICB2YXIgZ2VuZXJhdGVTZWNyZXQgPSBTZWNyZXRLZXlGYWN0b3J5LmdldEluc3RhbmNlKFxcXFxcXFwiZGVzZWRlXFxcXFxcXCIpLmdlbmVyYXRlU2VjcmV0KG5ldyBERVNlZGVLZXlTcGVjKFN0cmluZygnT1c4NFU4RWVyZGI5OXJ0c1RYV1NJTERPJykuZ2V0Qnl0ZXMoKSkpO1xcXFxuICAgICAgICAgICAgdmFyIGNpcGhlciA9IENpcGhlci5nZXRJbnN0YW5jZShcXFxcXFxcImRlc2VkZS9DQkMvUEtDUzVQYWRkaW5nXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgY2lwaGVyLmluaXQoMiwgZ2VuZXJhdGVTZWNyZXQsIG5ldyBJdlBhcmFtZXRlclNwZWMoU3RyaW5nKCdTSzhibmNWdScpLmdldEJ5dGVzKCkpKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBjaXBoZXIuZG9GaW5hbChiQXJyKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICAvL2RlY3J5cHREYXRh5Li66Kej5a+G5pa55rOVXFxcXG4gICAgICAgIGJ5dGVzID0gZGVjcnlwdERhdGEoYnl0ZXMpO1xcXFxuICAgICAgICByZXR1cm4gRmlsZVV0aWwudG9JbnB1dFN0cmVhbShieXRlcyk7XFxcXG4gICAgfVxcXFxuXFxcXG59XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwiREVTKlxcXCIsXFxcInBhdGhcXFwiOlxcXCJkZXNcXFwiLFxcXCJydWxlXFxcIjpcXFwidmFyIGphdmFJbXBvcnQgPSBuZXcgSmF2YUltcG9ydGVyKCk7XFxcXG5qYXZhSW1wb3J0LmltcG9ydFBhY2thZ2UoXFxcXG4gICAgUGFja2FnZXMuamF2YS5sYW5nLFxcXFxuICAgIFBhY2thZ2VzLmphdmEuc2VjdXJpdHksXFxcXG4gICAgUGFja2FnZXMuamF2YS51dGlsLFxcXFxuICAgIFBhY2thZ2VzLmphdmEuaW8sXFxcXG4gICAgUGFja2FnZXMuamF2YS50ZXh0LFxcXFxuICAgIFBhY2thZ2VzLmphdmF4LmNyeXB0byxcXFxcbiAgICBQYWNrYWdlcy5qYXZheC5jcnlwdG8uc3BlY1xcXFxuKTtcXFxcbndpdGgoamF2YUltcG9ydCkge1xcXFxuICAgZnVuY3Rpb24gRGUoc3RyKSB7XFxcXG4gICAgICAgIHZhciBnZW5lcmF0ZVNlY3JldCA9IFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoXFxcXFxcXCJkZXNlZGVcXFxcXFxcIikuZ2VuZXJhdGVTZWNyZXQobmV3IERFU2VkZUtleVNwZWMoU3RyaW5nKCdPVzg0VThFZXJkYjk5cnRzVFhXU0lMRE8nKS5nZXRCeXRlcygpKSk7XFxcXG4gICAgICAgIHZhciBpbnN0YW5jZSA9IENpcGhlci5nZXRJbnN0YW5jZShcXFxcXFxcImRlc2VkZS9DQkMvUEtDUzVQYWRkaW5nXFxcXFxcXCIpO1xcXFxuICAgICAgICBpbnN0YW5jZS5pbml0KDIsIGdlbmVyYXRlU2VjcmV0LCBuZXcgSXZQYXJhbWV0ZXJTcGVjKFN0cmluZygnU0s4Ym5jVnUnKS5nZXRCeXRlcygpKSk7XFxcXG4gICAgICAgIHJldHVybiBTdHJpbmcoaW5zdGFuY2UuZG9GaW5hbChfYmFzZTY0LmRlY29kZShzdHIsIDIpKSk7ICAgICAgICBcXFxcbiAgICB9XFxcXG59XFxcXG5cXFxcbi8qXFxcXG5ldmFsKGdldENyeXB0b0pTKCkpXFxcXG52YXIga2V5ID0gQ3J5cHRvSlMuZW5jLlV0ZjgucGFyc2UoJ09XODRVOEVlcmRiOTlydHNUWFdTSUxETycpXFxcXG52YXIgaXYgPSBDcnlwdG9KUy5lbmMuVXRmOC5wYXJzZSgnU0s4Ym5jVnUnKVxcXFxuXFxcXG5mdW5jdGlvbiBEZShkYXRhLCBlbmNvZGluZykge1xcXFxuICAgIHZhciBkZWNyeXB0ZWQgPSBDcnlwdG9KUy5UcmlwbGVERVMuZGVjcnlwdChkYXRhLCBrZXksIHtcXFxcbiAgICAgICAgaXY6IGl2LFxcXFxuICAgICAgICBtb2RlOiBDcnlwdG9KUy5tb2RlLkNCQyxcXFxcbiAgICAgICAgcGFkZGluZzogQ3J5cHRvSlMucGFkLlBrY3M3XFxcXG4gICAgfSk7XFxcXG4gICAgaWYgKCFlbmNvZGluZykge1xcXFxuICAgICAgICByZXR1cm4gZGVjcnlwdGVkLnRvU3RyaW5nKENyeXB0b0pTLmVuYy5VdGY4KTtcXFxcbiAgICB9XFxcXG4gICAgcmV0dXJuIGRlY3J5cHRlZC50b1N0cmluZyhDcnlwdG9KUy5lbmMuQmFzZTY0KTtcXFxcbn07XFxcXG4qL1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIua8q+ibmSpcXFwiLFxcXCJwYXRoXFxcIjpcXFwiaW1hZ2VcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5jb25zdCBTb2Z0UmVmZXJlbmNlID0gamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlO1xcXFxuY29uc3QgQ2lwaGVyID0gQ2lwaGVyID0gamF2YXguY3J5cHRvLkNpcGhlcjtcXFxcbmNvbnN0IEl2UGFyYW1ldGVyU3BlYyA9IGphdmF4LmNyeXB0by5zcGVjLkl2UGFyYW1ldGVyU3BlYztcXFxcbmNvbnN0IFNlY3JldEtleVNwZWMgPSBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjO1xcXFxuY29uc3QgS0VZID0gbmV3IGphdmEubGFuZy5TdHJpbmcoXFxcXFxcXCJteTJlY3JldDc4MmVjcmV0XFxcXFxcXCIpO1xcXFxuY29uc3QgZjIzMTlJViA9IG5ldyBqYXZhLmxhbmcuU3RyaW5nKFxcXFxcXFwibXkyZWNyZXQ3ODJlY3JldFxcXFxcXFwiKTtcXFxcbmNvbnN0IEtFWV9BTEdPUklUSE0gPSBcXFxcXFxcIkFFU1xcXFxcXFwiO1xcXFxuY29uc3QgQUVTX01PREUgPSBcXFxcXFxcIkFFUy9DQkMvUEtDUzdQYWRkaW5nXFxcXFxcXCI7XFxcXG5cXFxcbmZ1bmN0aW9uIGRlY3J5cHREYXRhKGZpbGUyQnl0ZXMpIHtcXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBsZXQgc2VjcmV0S2V5U3BlYyA9IG5ldyBTZWNyZXRLZXlTcGVjKEtFWS5nZXRCeXRlcygpLCBLRVlfQUxHT1JJVEhNKTtcXFxcbiAgICAgICAgbGV0IGl2UGFyYW1ldGVyU3BlYyA9IG5ldyBJdlBhcmFtZXRlclNwZWMoZjIzMTlJVi5nZXRCeXRlcygpKTtcXFxcbiAgICAgICAgbGV0IGNpcGhlciA9IENpcGhlci5nZXRJbnN0YW5jZShBRVNfTU9ERSk7XFxcXG4gICAgICAgIGNpcGhlci5pbml0KDIsIHNlY3JldEtleVNwZWMsIGl2UGFyYW1ldGVyU3BlYyk7XFxcXG4gICAgICAgIHJldHVybiBjaXBoZXIuZG9GaW5hbChmaWxlMkJ5dGVzKTtcXFxcbiAgICAgICAgcmV0dXJuIG5ldyBTb2Z0UmVmZXJlbmNlKGNpcGhlci5kb0ZpbmFsKGZpbGUyQnl0ZXMpKS5nZXQoKTtcXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIC8vZS5wcmludFN0YWNrVHJhY2UoKTtcXFxcbiAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxcXG4gICAgICAgIHJldHVybiBudWxsO1xcXFxuICAgIH1cXFxcbn1cXFxcblxcXFxuJC5leHBvcnRzLmltYWdlRGVjcnlwdCA9IGZ1bmN0aW9uKCkge1xcXFxuICAgIGxldCBqYXZhSW1wb3J0ID0gbmV3IEphdmFJbXBvcnRlcigpO1xcXFxuICAgIGphdmFJbXBvcnQuaW1wb3J0UGFja2FnZShcXFxcbiAgICAgICAgUGFja2FnZXMuY29tLmV4YW1wbGUuaGlrZXJ2aWV3LnV0aWxzXFxcXG4gICAgKTtcXFxcbiAgICB3aXRoKGphdmFJbXBvcnQpIHtcXFxcbiAgICAgICAgbGV0IGJ5dGVzID0gRmlsZVV0aWwudG9CeXRlcyhpbnB1dCk7XFxcXG4gICAgICAgIGJ5dGVzID0gZGVjcnlwdERhdGEoYnl0ZXMpO1xcXFxuICAgICAgICByZXR1cm4gRmlsZVV0aWwudG9JbnB1dFN0cmVhbShieXRlcyk7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcIn1dXCIsXCJwcm94eVwiOlwiXCJ9IiwicGljVXJsIjoiaHR0cHM6Ly92aXAuaGVsbG9pbWcuY29tL2ltYWdlcy8yMDIzLzEwLzEyL29NT1pPaC5qcGciLCJ0aXRsZSI6IuaLt+i0nSJ9
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement