diff --git a/release/connect-streams-dr-min.js b/release/connect-streams-dr-min.js index 4a4f144..a1940ab 100644 --- a/release/connect-streams-dr-min.js +++ b/release/connect-streams-dr-min.js @@ -1 +1 @@ -(()=>{var l;(l={772:()=>{!function(){var l=this||globalThis,Z=l.connect||{};l.connect=Z,l.globalConnect={},l.lily=Z,globalConnect.Container=null;var b=window.atob("KCgpPT57dmFyIGU9ezM0MDooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuYWdlbnRBcHA9e307dmFyIG49e0NDUDoiY2NwIixHVUlERVM6ImN1c3RvbXZpZXdzIn07dC5hZ2VudEFwcC5pbml0Q0NQPXQuY29yZS5pbml0Q0NQLHQuYWdlbnRBcHAuaXNJbml0aWFsaXplZD1mdW5jdGlvbihlKXt9LHQuYWdlbnRBcHAuaW5pdEFwcENvbW11bmljYXRpb249ZnVuY3Rpb24oZSxuKXt2YXIgcj1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKSxvPW5ldyB0LklGcmFtZUNvbmR1aXQobix3aW5kb3csciksaT1bdC5BZ2VudEV2ZW50cy5VUERBVEUsdC5Db250YWN0RXZlbnRzLlZJRVcsdC5FdmVudFR5cGUuQUNLTk9XTEVER0UsdC5FdmVudFR5cGUuVEVSTUlOQVRFRCx0LlRhc2tFdmVudHMuQ1JFQVRFRF07ci5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oZSl7aS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKGUsKGZ1bmN0aW9uKHQpe28uc2VuZFVwc3RyZWFtKGUsdCl9KSl9KSl9KSl9O3ZhciByPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaW5kZXhPZigiY2NwLXYyIik7cmV0dXJuIGUuc2xpY2UoMCx0LTEpfSxvPWZ1bmN0aW9uKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gZTt0cnl7cmV0dXJuIGUuZ2V0Q29udGFjdElkKCl9Y2F0Y2godCl7cmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiW0N1c3RvbVZpZXdzXTogSW52YWxpZCBDb250YWN0IFByb3ZpZGVkOiAiLGUpfX07dC5hZ2VudEFwcC5pbml0QXBwPWZ1bmN0aW9uKGUsaSxhLHMpe3M9c3x8e307dmFyIGMsdT1hLmVuZHNXaXRoKCIvIil8fC9bPyZdP1tePT8mXSs9W149PyZdKy9nLnRlc3QoYSk/YTphKyIvIixsPXMub25Mb2FkP3Mub25Mb2FkOm51bGwscD17ZW5kcG9pbnQ6dSxzdHlsZTpzLnN0eWxlLG9uTG9hZDpsfTtpZihlPT09bi5DQ1BfRFIpYz1uLkNDUDtlbHNlIGlmKGU9PT1uLkdVSURFUyYmcy5jdXN0b21WaWV3c1BhcmFtcyl7dmFyIGQ9cy5jdXN0b21WaWV3c1BhcmFtcy5pZnJhbWVTdWZmaXg7aWYoYz1kPyIiLmNvbmNhdChuLkdVSURFUykuY29uY2F0KGQpOiIiLmNvbmNhdChuLkdVSURFUyksdm9pZCAwIT09dC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5nZXQoYykpdGhyb3cgbmV3IEVycm9yKCJbQ3VzdG9tVmlld3NdOiBDdXN0b20gdmlld3MgYXBwbGljYXRpb24gd2l0aCB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLiBQbGVhc2UgcHJvdmlkZSBhIGRpZmZlcmVudCBpZnJhbWVTdWZmaXggZm9yIHRoZSBjdXN0b20gdmlld3MgYXBwbGljYXRpb24uIil9ZWxzZSBjPWU7dmFyIGY9InN0cmluZyI9PXR5cGVvZiBpP2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKGkpOmk7dC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5yZWdpc3RlcihjLHAsZiksdC5hZ2VudEFwcC5BcHBSZWdpc3RyeS5zdGFydChjLChmdW5jdGlvbihpKXt2YXIgYT1pLmVuZHBvaW50LHU9aS5jb250YWluZXJET007cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtzd2l0Y2goZSl7Y2FzZSBuLkNDUDpyZXR1cm4gcy5jY3BQYXJhbXM9cy5jY3BQYXJhbXM/cy5jY3BQYXJhbXM6e30scy5zdHlsZSYmKHMuY2NwUGFyYW1zLnN0eWxlPXMuc3R5bGUpLGZ1bmN0aW9uKGUsbixvKXt2YXIgaT17Y2NwVXJsOmUsY2NwTG9hZFRpbWVvdXQ6MWU0LGxvZ2luUG9wdXA6ITAsbG9naW5Vcmw6cihlKSsiL2xvZ2luIixzb2Z0cGhvbmU6e2FsbG93RnJhbWVkU29mdHBob25lOiEwLGRpc2FibGVSaW5ndG9uZTohMSxhbGxvd0ZyYW1lZFZpZGVvQ2FsbDohMCxhbGxvd0ZyYW1lZFNjcmVlblNoYXJpbmc6ITAsYWxsb3dGcmFtZWRTY3JlZW5TaGFyaW5nUG9wVXA6ITF9fSxhPXQubWVyZ2UoaSxvLmNjcFBhcmFtcyk7dC5jb3JlLmluaXRDQ1AobixhKX0oYSx1LHMpO2Nhc2Ugbi5HVUlERVM6cmV0dXJuIHZvaWQgMCE9PXMuY3VzdG9tVmlld3NQYXJhbXM/KHQuYWdlbnRBcHAuaW5pdEFwcENvbW11bmljYXRpb24oYyxhLHUpLGZ1bmN0aW9uKGUscixpKXt2YXIgYSxzLGM9aS5jdXN0b21WaWV3c1BhcmFtcyx1PWMuY29udGFjdCxsPWMuZGlzYWJsZUF1dG9EZXN0cm95LHA9Yy5pZnJhbWVTdWZmaXgsZD1jLnRlcm1pbmF0ZUN1c3RvbVZpZXdPcHRpb25zLGY9dm9pZCAwPT09ZD97fTpkLGg9aS5jdXN0b21WaWV3c1BhcmFtcy5jb250YWN0Rmxvd0lkO3ZvaWQgMCE9PXUmJigoYT1vKHUpKSYmITAhPT1sJiYic3RyaW5nIiE9dHlwZW9mIHUmJnUub25EZXN0cm95KChmdW5jdGlvbihuKXt0LmNvcmUudGVybWluYXRlQ3VzdG9tVmlldyhlLHAse3RpbWVvdXQ6Zi50aW1lb3V0fHw1ZTMsaGlkZUlmcmFtZTp2b2lkIDA9PT1mLmhpZGVJZnJhbWV8fGYuaGlkZUlmcmFtZSxyZXNvbHZlSWZyYW1lOnZvaWQgMD09PWYucmVzb2x2ZUlmcmFtZXx8Zi5yZXNvbHZlSWZyYW1lfSl9KSksaHx8Y29uc29sZS53YXJuKCJbQ3VzdG9tVmlld3NdOiBOZWVkIHRvIHByb3ZpZGUgYSBjb250YWN0Rmxvd0lkIHdoZW4gZGVmaW5pbmcgY29udGFjdCBwYXJhbWV0ZXIgZm9yIGluaXRhbGl6aW5nIGN1c3RvbXZpZXdzIGFwcGxpY2F0aW9uIikpLHM9cD8iIi5jb25jYXQobi5HVUlERVMpLmNvbmNhdChwKToiIi5jb25jYXQobi5HVUlERVMpO3ZhciBnPSJpZnJhbWVbaWQ9JyIuY29uY2F0KHMsIiddIiksbT0obnVsbD09cj92b2lkIDA6ci5xdWVyeVNlbGVjdG9yKGcpKXx8ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocyl8fHdpbmRvdy50b3AuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocyk7aWYoIW0pdGhyb3cgbmV3IEVycm9yKCJbQ3VzdG9tVmlld3NdOiBObyBpZnJhbWUgZm91bmQgZm9yIHRoZSBhcHA6ICIscyk7dmFyIHY9QVdTLnV0aWwudXVpZC52NCgpO2E/bS5zcmM9IiIuY29uY2F0KGUsIj9jb250YWN0Rmxvd0lkPSIpLmNvbmNhdChoLCImY3VycmVudENvbnRhY3RJZD0iKS5jb25jYXQoYSwiJmFnZW50QXBwVGFiSWQ9IikuY29uY2F0KHYsIi10YWIiKTpoJiYobS5zcmM9IiIuY29uY2F0KGUsIj9jb250YWN0Rmxvd0lkPSIpLmNvbmNhdChoLCImYWdlbnRBcHBUYWJJZD0iKS5jb25jYXQodiwiLXRhYiIpKX0oYSx1LHMpKTp0LmFnZW50QXBwLmluaXRBcHBDb21tdW5pY2F0aW9uKGMsYSx1KTtkZWZhdWx0OnJldHVybiB0LmFnZW50QXBwLmluaXRBcHBDb21tdW5pY2F0aW9uKGMsYSx1KX19LGRlc3Ryb3k6ZnVuY3Rpb24oKXtzd2l0Y2goZSl7Y2FzZSBuLkNDUDpyZXR1cm4gaT1yKGEpKyIvbG9nb3V0Iix0LmZldGNoKGkse2NyZWRlbnRpYWxzOiJpbmNsdWRlIn0pLnRoZW4oKGZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIodC5FdmVudFR5cGUuVEVSTUlOQVRFKSwhMH0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuZ2V0TG9nKCkuZXJyb3IoIkFuIGVycm9yIG9jY3VyZWQgb24gbG9nb3V0LiIrZSkud2l0aEV4Y2VwdGlvbihlKSx3aW5kb3cubG9jYXRpb24uaHJlZj1pLCExfSkpO2Nhc2Ugbi5HVUlERVM6cmV0dXJuIHZvaWQgMCE9PXMuY3VzdG9tVmlld3NQYXJhbXM/KG89Yyx2b2lkIHQuYWdlbnRBcHAuQXBwUmVnaXN0cnkuZGVsZXRlKG8pKTpudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9dmFyIG8saX19fSkpfSx0LmFnZW50QXBwLnN0b3BBcHA9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuYWdlbnRBcHAuQXBwUmVnaXN0cnkuc3RvcChlKX19KCl9LDIyODooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10O3ZhciBuLHI9ImNjcCI7ZS5jb25uZWN0LmFnZW50QXBwLkFwcFJlZ2lzdHJ5PShuPXt9LHtyZWdpc3RlcjpmdW5jdGlvbihlLHQscil7bltlXT17Y29udGFpbmVyRE9NOnIsZW5kcG9pbnQ6dC5lbmRwb2ludCxzdHlsZTp0LnN0eWxlLGluc3RhbmNlOnZvaWQgMCxvbkxvYWQ6dC5vbkxvYWR9fSxzdGFydDpmdW5jdGlvbihlLHQpe2lmKG5bZV0pe3ZhciBvPW5bZV0uY29udGFpbmVyRE9NLGk9bltlXS5lbmRwb2ludCxhPW5bZV0uc3R5bGUscz1uW2VdLm9uTG9hZDtpZihlIT09cil7dmFyIGM9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7cmV0dXJuIG8uc3JjPXQsby5zdHlsZT1ufHwid2lkdGg6IDEwMCU7IGhlaWdodDoxMDAlOyIsby5pZD1lLG9bImFyaWEtbGFiZWwiXT1lLG8ub25sb2FkPXIsby5hbGxvdz0iY2xpcGJvYXJkLXJlYWQ7IGNsaXBib2FyZC13cml0ZSIsby5zZXRBdHRyaWJ1dGUoInNhbmRib3giLCJhbGxvdy1mb3JtcyBhbGxvdy1wb3B1cHMgYWxsb3ctcG9wdXBzLXRvLWVzY2FwZS1zYW5kYm94IGFsbG93LXNhbWUtb3JpZ2luIGFsbG93LXNjcmlwdHMiKSxvfShlLGksYSxzKTtvLmFwcGVuZENoaWxkKGMpfXJldHVybiBuW2VdLmluc3RhbmNlPXQobltlXSksbltlXS5pbnN0YW5jZS5pbml0KCl9fSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV19LGRlbGV0ZTpmdW5jdGlvbihlKXtkZWxldGUgbltlXX0sc3RvcDpmdW5jdGlvbihlKXtpZihuW2VdKXt2YXIgdCxyPW5bZV0sbz1yLmNvbnRhaW5lckRPTS5xdWVyeVNlbGVjdG9yKCJpZnJhbWUiKTtpZihlLmluY2x1ZGVzKCJjdXN0b212aWV3cyIpKXt2YXIgaT0iaWZyYW1lW2lkPSciLmNvbmNhdChlLCInXSIpO289ci5jb250YWluZXJET00ucXVlcnlTZWxlY3RvcihpKX1yZXR1cm4gci5jb250YWluZXJET00ucmVtb3ZlQ2hpbGQobyksci5pbnN0YW5jZSYmKHQ9ci5pbnN0YW5jZS5kZXN0cm95KCksZGVsZXRlIHIuaW5zdGFuY2UpLHR9fX0pfSgpfSwzNTooKT0+e2Z1bmN0aW9uIGUodCl7cmV0dXJuIGU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9LGUodCl9ZnVuY3Rpb24gdChlLHQpe3ZhciBuPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gbihlKXtmb3IodmFyIG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXt2YXIgcj1udWxsIT1hcmd1bWVudHNbbl0/YXJndW1lbnRzW25dOnt9O24lMj90KE9iamVjdChyKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7bChlLHQsclt0XSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyKSk6dChPYmplY3QocikpLmZvckVhY2goKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihyLHQpKX0pKX1yZXR1cm4gZX1mdW5jdGlvbiByKCl7InVzZSBzdHJpY3QiO3I9ZnVuY3Rpb24oKXtyZXR1cm4gdH07dmFyIHQ9e30sbj1PYmplY3QucHJvdG90eXBlLG89bi5oYXNPd25Qcm9wZXJ0eSxpPU9iamVjdC5kZWZpbmVQcm9wZXJ0eXx8ZnVuY3Rpb24oZSx0LG4pe2VbdF09bi52YWx1ZX0sYT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sP1N5bWJvbDp7fSxzPWEuaXRlcmF0b3J8fCJAQGl0ZXJhdG9yIixjPWEuYXN5bmNJdGVyYXRvcnx8IkBAYXN5bmNJdGVyYXRvciIsdT1hLnRvU3RyaW5nVGFnfHwiQEB0b1N0cmluZ1RhZyI7ZnVuY3Rpb24gbChlLHQsbil7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KSxlW3RdfXRyeXtsKHt9LCIiKX1jYXRjaChlKXtsPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZVt0XT1ufX1mdW5jdGlvbiBwKGUsdCxuLHIpe3ZhciBvPXQmJnQucHJvdG90eXBlIGluc3RhbmNlb2YgaD90OmgsYT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSxzPW5ldyBfKHJ8fFtdKTtyZXR1cm4gaShhLCJfaW52b2tlIix7dmFsdWU6VChlLG4scyl9KSxhfWZ1bmN0aW9uIGQoZSx0LG4pe3RyeXtyZXR1cm57dHlwZToibm9ybWFsIixhcmc6ZS5jYWxsKHQsbil9fWNhdGNoKGUpe3JldHVybnt0eXBlOiJ0aHJvdyIsYXJnOmV9fX10LndyYXA9cDt2YXIgZj17fTtmdW5jdGlvbiBoKCl7fWZ1bmN0aW9uIGcoKXt9ZnVuY3Rpb24gbSgpe312YXIgdj17fTtsKHYscywoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKTt2YXIgeT1PYmplY3QuZ2V0UHJvdG90eXBlT2YsYj15JiZ5KHkoUihbXSkpKTtiJiZiIT09biYmby5jYWxsKGIscykmJih2PWIpO3ZhciBFPW0ucHJvdG90eXBlPWgucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodik7ZnVuY3Rpb24gUyhlKXtbIm5leHQiLCJ0aHJvdyIsInJldHVybiJdLmZvckVhY2goKGZ1bmN0aW9uKHQpe2woZSx0LChmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5faW52b2tlKHQsZSl9KSl9KSl9ZnVuY3Rpb24gQyh0LG4pe2Z1bmN0aW9uIHIoaSxhLHMsYyl7dmFyIHU9ZCh0W2ldLHQsYSk7aWYoInRocm93IiE9PXUudHlwZSl7dmFyIGw9dS5hcmcscD1sLnZhbHVlO3JldHVybiBwJiYib2JqZWN0Ij09ZShwKSYmby5jYWxsKHAsIl9fYXdhaXQiKT9uLnJlc29sdmUocC5fX2F3YWl0KS50aGVuKChmdW5jdGlvbihlKXtyKCJuZXh0IixlLHMsYyl9KSwoZnVuY3Rpb24oZSl7cigidGhyb3ciLGUscyxjKX0pKTpuLnJlc29sdmUocCkudGhlbigoZnVuY3Rpb24oZSl7bC52YWx1ZT1lLHMobCl9KSwoZnVuY3Rpb24oZSl7cmV0dXJuIHIoInRocm93IixlLHMsYyl9KSl9Yyh1LmFyZyl9dmFyIGE7aSh0aGlzLCJfaW52b2tlIix7dmFsdWU6ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBvKCl7cmV0dXJuIG5ldyBuKChmdW5jdGlvbihuLG8pe3IoZSx0LG4sbyl9KSl9cmV0dXJuIGE9YT9hLnRoZW4obyxvKTpvKCl9fSl9ZnVuY3Rpb24gVChlLHQsbil7dmFyIHI9InN1c3BlbmRlZFN0YXJ0IjtyZXR1cm4gZnVuY3Rpb24obyxpKXtpZigiZXhlY3V0aW5nIj09PXIpdGhyb3cgbmV3IEVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBydW5uaW5nIik7aWYoImNvbXBsZXRlZCI9PT1yKXtpZigidGhyb3ciPT09byl0aHJvdyBpO3JldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19Zm9yKG4ubWV0aG9kPW8sbi5hcmc9aTs7KXt2YXIgYT1uLmRlbGVnYXRlO2lmKGEpe3ZhciBzPUkoYSxuKTtpZihzKXtpZihzPT09Ziljb250aW51ZTtyZXR1cm4gc319aWYoIm5leHQiPT09bi5tZXRob2Qpbi5zZW50PW4uX3NlbnQ9bi5hcmc7ZWxzZSBpZigidGhyb3ciPT09bi5tZXRob2Qpe2lmKCJzdXNwZW5kZWRTdGFydCI9PT1yKXRocm93IHI9ImNvbXBsZXRlZCIsbi5hcmc7bi5kaXNwYXRjaEV4Y2VwdGlvbihuLmFyZyl9ZWxzZSJyZXR1cm4iPT09bi5tZXRob2QmJm4uYWJydXB0KCJyZXR1cm4iLG4uYXJnKTtyPSJleGVjdXRpbmciO3ZhciBjPWQoZSx0LG4pO2lmKCJub3JtYWwiPT09Yy50eXBlKXtpZihyPW4uZG9uZT8iY29tcGxldGVkIjoic3VzcGVuZGVkWWllbGQiLGMuYXJnPT09Ziljb250aW51ZTtyZXR1cm57dmFsdWU6Yy5hcmcsZG9uZTpuLmRvbmV9fSJ0aHJvdyI9PT1jLnR5cGUmJihyPSJjb21wbGV0ZWQiLG4ubWV0aG9kPSJ0aHJvdyIsbi5hcmc9Yy5hcmcpfX19ZnVuY3Rpb24gSShlLHQpe3ZhciBuPXQubWV0aG9kLHI9ZS5pdGVyYXRvcltuXTtpZih2b2lkIDA9PT1yKXJldHVybiB0LmRlbGVnYXRlPW51bGwsInRocm93Ij09PW4mJmUuaXRlcmF0b3IucmV0dXJuJiYodC5tZXRob2Q9InJldHVybiIsdC5hcmc9dm9pZCAwLEkoZSx0KSwidGhyb3ciPT09dC5tZXRob2QpfHwicmV0dXJuIiE9PW4mJih0Lm1ldGhvZD0idGhyb3ciLHQuYXJnPW5ldyBUeXBlRXJyb3IoIlRoZSBpdGVyYXRvciBkb2VzIG5vdCBwcm92aWRlIGEgJyIrbisiJyBtZXRob2QiKSksZjt2YXIgbz1kKHIsZS5pdGVyYXRvcix0LmFyZyk7aWYoInRocm93Ij09PW8udHlwZSlyZXR1cm4gdC5tZXRob2Q9InRocm93Iix0LmFyZz1vLmFyZyx0LmRlbGVnYXRlPW51bGwsZjt2YXIgaT1vLmFyZztyZXR1cm4gaT9pLmRvbmU/KHRbZS5yZXN1bHROYW1lXT1pLnZhbHVlLHQubmV4dD1lLm5leHRMb2MsInJldHVybiIhPT10Lm1ldGhvZCYmKHQubWV0aG9kPSJuZXh0Iix0LmFyZz12b2lkIDApLHQuZGVsZWdhdGU9bnVsbCxmKTppOih0Lm1ldGhvZD0idGhyb3ciLHQuYXJnPW5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksdC5kZWxlZ2F0ZT1udWxsLGYpfWZ1bmN0aW9uIHcoZSl7dmFyIHQ9e3RyeUxvYzplWzBdfTsxIGluIGUmJih0LmNhdGNoTG9jPWVbMV0pLDIgaW4gZSYmKHQuZmluYWxseUxvYz1lWzJdLHQuYWZ0ZXJMb2M9ZVszXSksdGhpcy50cnlFbnRyaWVzLnB1c2godCl9ZnVuY3Rpb24gQShlKXt2YXIgdD1lLmNvbXBsZXRpb258fHt9O3QudHlwZT0ibm9ybWFsIixkZWxldGUgdC5hcmcsZS5jb21wbGV0aW9uPXR9ZnVuY3Rpb24gXyhlKXt0aGlzLnRyeUVudHJpZXM9W3t0cnlMb2M6InJvb3QifV0sZS5mb3JFYWNoKHcsdGhpcyksdGhpcy5yZXNldCghMCl9ZnVuY3Rpb24gUihlKXtpZihlKXt2YXIgdD1lW3NdO2lmKHQpcmV0dXJuIHQuY2FsbChlKTtpZigiZnVuY3Rpb24iPT10eXBlb2YgZS5uZXh0KXJldHVybiBlO2lmKCFpc05hTihlLmxlbmd0aCkpe3ZhciBuPS0xLHI9ZnVuY3Rpb24gdCgpe2Zvcig7KytuPGUubGVuZ3RoOylpZihvLmNhbGwoZSxuKSlyZXR1cm4gdC52YWx1ZT1lW25dLHQuZG9uZT0hMSx0O3JldHVybiB0LnZhbHVlPXZvaWQgMCx0LmRvbmU9ITAsdH07cmV0dXJuIHIubmV4dD1yfX1yZXR1cm57bmV4dDpMfX1mdW5jdGlvbiBMKCl7cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX1yZXR1cm4gZy5wcm90b3R5cGU9bSxpKEUsImNvbnN0cnVjdG9yIix7dmFsdWU6bSxjb25maWd1cmFibGU6ITB9KSxpKG0sImNvbnN0cnVjdG9yIix7dmFsdWU6Zyxjb25maWd1cmFibGU6ITB9KSxnLmRpc3BsYXlOYW1lPWwobSx1LCJHZW5lcmF0b3JGdW5jdGlvbiIpLHQuaXNHZW5lcmF0b3JGdW5jdGlvbj1mdW5jdGlvbihlKXt2YXIgdD0iZnVuY3Rpb24iPT10eXBlb2YgZSYmZS5jb25zdHJ1Y3RvcjtyZXR1cm4hIXQmJih0PT09Z3x8IkdlbmVyYXRvckZ1bmN0aW9uIj09PSh0LmRpc3BsYXlOYW1lfHx0Lm5hbWUpKX0sdC5tYXJrPWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mKGUsbSk6KGUuX19wcm90b19fPW0sbChlLHUsIkdlbmVyYXRvckZ1bmN0aW9uIikpLGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoRSksZX0sdC5hd3JhcD1mdW5jdGlvbihlKXtyZXR1cm57X19hd2FpdDplfX0sUyhDLnByb3RvdHlwZSksbChDLnByb3RvdHlwZSxjLChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkpLHQuQXN5bmNJdGVyYXRvcj1DLHQuYXN5bmM9ZnVuY3Rpb24oZSxuLHIsbyxpKXt2b2lkIDA9PT1pJiYoaT1Qcm9taXNlKTt2YXIgYT1uZXcgQyhwKGUsbixyLG8pLGkpO3JldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24obik/YTphLm5leHQoKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gZS5kb25lP2UudmFsdWU6YS5uZXh0KCl9KSl9LFMoRSksbChFLHUsIkdlbmVyYXRvciIpLGwoRSxzLChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkpLGwoRSwidG9TdHJpbmciLChmdW5jdGlvbigpe3JldHVybiJbb2JqZWN0IEdlbmVyYXRvcl0ifSkpLHQua2V5cz1mdW5jdGlvbihlKXt2YXIgdD1PYmplY3QoZSksbj1bXTtmb3IodmFyIHIgaW4gdCluLnB1c2gocik7cmV0dXJuIG4ucmV2ZXJzZSgpLGZ1bmN0aW9uIGUoKXtmb3IoO24ubGVuZ3RoOyl7dmFyIHI9bi5wb3AoKTtpZihyIGluIHQpcmV0dXJuIGUudmFsdWU9cixlLmRvbmU9ITEsZX1yZXR1cm4gZS5kb25lPSEwLGV9fSx0LnZhbHVlcz1SLF8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpfLHJlc2V0OmZ1bmN0aW9uKGUpe2lmKHRoaXMucHJldj0wLHRoaXMubmV4dD0wLHRoaXMuc2VudD10aGlzLl9zZW50PXZvaWQgMCx0aGlzLmRvbmU9ITEsdGhpcy5kZWxlZ2F0ZT1udWxsLHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLmFyZz12b2lkIDAsdGhpcy50cnlFbnRyaWVzLmZvckVhY2goQSksIWUpZm9yKHZhciB0IGluIHRoaXMpInQiPT09dC5jaGFyQXQoMCkmJm8uY2FsbCh0aGlzLHQpJiYhaXNOYU4oK3Quc2xpY2UoMSkpJiYodGhpc1t0XT12b2lkIDApfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5kb25lPSEwO3ZhciBlPXRoaXMudHJ5RW50cmllc1swXS5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT1lLnR5cGUpdGhyb3cgZS5hcmc7cmV0dXJuIHRoaXMucnZhbH0sZGlzcGF0Y2hFeGNlcHRpb246ZnVuY3Rpb24oZSl7aWYodGhpcy5kb25lKXRocm93IGU7dmFyIHQ9dGhpcztmdW5jdGlvbiBuKG4scil7cmV0dXJuIGEudHlwZT0idGhyb3ciLGEuYXJnPWUsdC5uZXh0PW4sciYmKHQubWV0aG9kPSJuZXh0Iix0LmFyZz12b2lkIDApLCEhcn1mb3IodmFyIHI9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO3I+PTA7LS1yKXt2YXIgaT10aGlzLnRyeUVudHJpZXNbcl0sYT1pLmNvbXBsZXRpb247aWYoInJvb3QiPT09aS50cnlMb2MpcmV0dXJuIG4oImVuZCIpO2lmKGkudHJ5TG9jPD10aGlzLnByZXYpe3ZhciBzPW8uY2FsbChpLCJjYXRjaExvYyIpLGM9by5jYWxsKGksImZpbmFsbHlMb2MiKTtpZihzJiZjKXtpZih0aGlzLnByZXY8aS5jYXRjaExvYylyZXR1cm4gbihpLmNhdGNoTG9jLCEwKTtpZih0aGlzLnByZXY8aS5maW5hbGx5TG9jKXJldHVybiBuKGkuZmluYWxseUxvYyl9ZWxzZSBpZihzKXtpZih0aGlzLnByZXY8aS5jYXRjaExvYylyZXR1cm4gbihpLmNhdGNoTG9jLCEwKX1lbHNle2lmKCFjKXRocm93IG5ldyBFcnJvcigidHJ5IHN0YXRlbWVudCB3aXRob3V0IGNhdGNoIG9yIGZpbmFsbHkiKTtpZih0aGlzLnByZXY8aS5maW5hbGx5TG9jKXJldHVybiBuKGkuZmluYWxseUxvYyl9fX19LGFicnVwdDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7bj49MDstLW4pe3ZhciByPXRoaXMudHJ5RW50cmllc1tuXTtpZihyLnRyeUxvYzw9dGhpcy5wcmV2JiZvLmNhbGwociwiZmluYWxseUxvYyIpJiZ0aGlzLnByZXY8ci5maW5hbGx5TG9jKXt2YXIgaT1yO2JyZWFrfX1pJiYoImJyZWFrIj09PWV8fCJjb250aW51ZSI9PT1lKSYmaS50cnlMb2M8PXQmJnQ8PWkuZmluYWxseUxvYyYmKGk9bnVsbCk7dmFyIGE9aT9pLmNvbXBsZXRpb246e307cmV0dXJuIGEudHlwZT1lLGEuYXJnPXQsaT8odGhpcy5tZXRob2Q9Im5leHQiLHRoaXMubmV4dD1pLmZpbmFsbHlMb2MsZik6dGhpcy5jb21wbGV0ZShhKX0sY29tcGxldGU6ZnVuY3Rpb24oZSx0KXtpZigidGhyb3ciPT09ZS50eXBlKXRocm93IGUuYXJnO3JldHVybiJicmVhayI9PT1lLnR5cGV8fCJjb250aW51ZSI9PT1lLnR5cGU/dGhpcy5uZXh0PWUuYXJnOiJyZXR1cm4iPT09ZS50eXBlPyh0aGlzLnJ2YWw9dGhpcy5hcmc9ZS5hcmcsdGhpcy5tZXRob2Q9InJldHVybiIsdGhpcy5uZXh0PSJlbmQiKToibm9ybWFsIj09PWUudHlwZSYmdCYmKHRoaXMubmV4dD10KSxmfSxmaW5pc2g6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTt0Pj0wOy0tdCl7dmFyIG49dGhpcy50cnlFbnRyaWVzW3RdO2lmKG4uZmluYWxseUxvYz09PWUpcmV0dXJuIHRoaXMuY29tcGxldGUobi5jb21wbGV0aW9uLG4uYWZ0ZXJMb2MpLEEobiksZn19LGNhdGNoOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7dD49MDstLXQpe3ZhciBuPXRoaXMudHJ5RW50cmllc1t0XTtpZihuLnRyeUxvYz09PWUpe3ZhciByPW4uY29tcGxldGlvbjtpZigidGhyb3ciPT09ci50eXBlKXt2YXIgbz1yLmFyZztBKG4pfXJldHVybiBvfX10aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgY2F0Y2ggYXR0ZW1wdCIpfSxkZWxlZ2F0ZVlpZWxkOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5kZWxlZ2F0ZT17aXRlcmF0b3I6UihlKSxyZXN1bHROYW1lOnQsbmV4dExvYzpufSwibmV4dCI9PT10aGlzLm1ldGhvZCYmKHRoaXMuYXJnPXZvaWQgMCksZn19LHR9ZnVuY3Rpb24gbyhlLHQsbixyLG8saSxhKXt0cnl7dmFyIHM9ZVtpXShhKSxjPXMudmFsdWV9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgbihlKX1zLmRvbmU/dChjKTpQcm9taXNlLnJlc29sdmUoYykudGhlbihyLG8pfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxuPWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsaSl7dmFyIGE9ZS5hcHBseSh0LG4pO2Z1bmN0aW9uIHMoZSl7byhhLHIsaSxzLGMsIm5leHQiLGUpfWZ1bmN0aW9uIGMoZSl7byhhLHIsaSxzLGMsInRocm93IixlKX1zKHZvaWQgMCl9KSl9fWZ1bmN0aW9uIGEoZSx0KXt2YXIgbj0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlWyJAQGl0ZXJhdG9yIl07aWYoIW4pe2lmKEFycmF5LmlzQXJyYXkoZSl8fChuPWZ1bmN0aW9uKGUsdCl7aWYoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBzKGUsdCk7dmFyIG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsLTEpO3JldHVybiJPYmplY3QiPT09biYmZS5jb25zdHJ1Y3RvciYmKG49ZS5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PW58fCJTZXQiPT09bj9BcnJheS5mcm9tKGUpOiJBcmd1bWVudHMiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/cyhlLHQpOnZvaWQgMH19KGUpKXx8dCYmZSYmIm51bWJlciI9PXR5cGVvZiBlLmxlbmd0aCl7biYmKGU9bik7dmFyIHI9MCxvPWZ1bmN0aW9uKCl7fTtyZXR1cm57czpvLG46ZnVuY3Rpb24oKXtyZXR1cm4gcj49ZS5sZW5ndGg/e2RvbmU6ITB9Ontkb25lOiExLHZhbHVlOmVbcisrXX19LGU6ZnVuY3Rpb24oZSl7dGhyb3cgZX0sZjpvfX10aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gaXRlcmF0ZSBub24taXRlcmFibGUgaW5zdGFuY2UuXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuIil9dmFyIGksYT0hMCxjPSExO3JldHVybntzOmZ1bmN0aW9uKCl7bj1uLmNhbGwoZSl9LG46ZnVuY3Rpb24oKXt2YXIgZT1uLm5leHQoKTtyZXR1cm4gYT1lLmRvbmUsZX0sZTpmdW5jdGlvbihlKXtjPSEwLGk9ZX0sZjpmdW5jdGlvbigpe3RyeXthfHxudWxsPT1uLnJldHVybnx8bi5yZXR1cm4oKX1maW5hbGx5e2lmKGMpdGhyb3cgaX19fX1mdW5jdGlvbiBzKGUsdCl7KG51bGw9PXR8fHQ+ZS5sZW5ndGgpJiYodD1lLmxlbmd0aCk7Zm9yKHZhciBuPTAscj1uZXcgQXJyYXkodCk7bjx0O24rKylyW25dPWVbbl07cmV0dXJuIHJ9ZnVuY3Rpb24gYyhlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscChyLmtleSkscil9fWZ1bmN0aW9uIHUoZSx0LG4pe3JldHVybiB0JiZjKGUucHJvdG90eXBlLHQpLG4mJmMoZSxuKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfWZ1bmN0aW9uIGwoZSx0LG4pe3JldHVybih0PXAodCkpaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1uLGV9ZnVuY3Rpb24gcCh0KXt2YXIgbj1mdW5jdGlvbih0LG4pe2lmKCJvYmplY3QiIT09ZSh0KXx8bnVsbD09PXQpcmV0dXJuIHQ7dmFyIHI9dFtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PXIpe3ZhciBvPXIuY2FsbCh0LG58fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPT1lKG8pKXJldHVybiBvO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKCJzdHJpbmciPT09bj9TdHJpbmc6TnVtYmVyKSh0KX0odCwic3RyaW5nIik7cmV0dXJuInN5bWJvbCI9PT1lKG4pP246U3RyaW5nKG4pfSFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10LHQuQWdlbnRTdGF0ZVR5cGU9dC5tYWtlRW51bShbImluaXQiLCJyb3V0YWJsZSIsIm5vdF9yb3V0YWJsZSIsIm9mZmxpbmUiXSksdC5BZ2VudFN0YXR1c1R5cGU9dC5BZ2VudFN0YXRlVHlwZSx0LkFnZW50QXZhaWxTdGF0ZXM9dC5tYWtlRW51bShbIkluaXQiLCJCdXN5IiwiQWZ0ZXJDYWxsV29yayIsIkNhbGxpbmdDdXN0b21lciIsIkRpYWxpbmciLCJKb2luaW5nIiwiUGVuZGluZ0F2YWlsYWJsZSIsIlBlbmRpbmdCdXN5Il0pLHQuQWdlbnRFcnJvclN0YXRlcz10Lm1ha2VFbnVtKFsiRXJyb3IiLCJBZ2VudEh1bmdVcCIsIkJhZEFkZHJlc3NBZ2VudCIsIkJhZEFkZHJlc3NDdXN0b21lciIsIkRlZmF1bHQiLCJGYWlsZWRDb25uZWN0QWdlbnQiLCJGYWlsZWRDb25uZWN0Q3VzdG9tZXIiLCJJbnZhbGlkTG9jYWxlIiwiTGluZUVuZ2FnZWRBZ2VudCIsIkxpbmVFbmdhZ2VkQ3VzdG9tZXIiLCJNaXNzZWRDYWxsQWdlbnQiLCJNaXNzZWRDYWxsQ3VzdG9tZXIiLCJNdWx0aXBsZUNjcFdpbmRvd3MiLCJSZWFsdGltZUNvbW11bmljYXRpb25FcnJvciJdKSx0LkVuZHBvaW50VHlwZT10Lm1ha2VFbnVtKFsicGhvbmVfbnVtYmVyIiwiYWdlbnQiLCJxdWV1ZSJdKSx0LkFkZHJlc3NUeXBlPXQuRW5kcG9pbnRUeXBlLHQuQ29ubmVjdGlvblR5cGU9dC5tYWtlRW51bShbImFnZW50IiwiaW5ib3VuZCIsIm91dGJvdW5kIiwibW9uaXRvcmluZyJdKSx0LkNvbm5lY3Rpb25TdGF0ZVR5cGU9dC5tYWtlRW51bShbImluaXQiLCJjb25uZWN0aW5nIiwiY29ubmVjdGVkIiwiaG9sZCIsImRpc2Nvbm5lY3RlZCIsInNpbGVudF9tb25pdG9yIiwiYmFyZ2UiXSksdC5Db25uZWN0aW9uU3RhdHVzVHlwZT10LkNvbm5lY3Rpb25TdGF0ZVR5cGUsdC5DT05ORUNUSU9OX0FDVElWRV9TVEFURVM9dC5zZXQoW3QuQ29ubmVjdGlvblN0YXRlVHlwZS5DT05ORUNUSU5HLHQuQ29ubmVjdGlvblN0YXRlVHlwZS5DT05ORUNURUQsdC5Db25uZWN0aW9uU3RhdGVUeXBlLkhPTEQsdC5Db25uZWN0aW9uU3RhdGVUeXBlLlNJTEVOVF9NT05JVE9SLHQuQ29ubmVjdGlvblN0YXRlVHlwZS5CQVJHRV0pLHQuQ09OTkVDVElPTl9DT05ORUNURURfU1RBVEVTPXQuc2V0KFt0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQ09OTkVDVEVELHQuQ29ubmVjdGlvblN0YXRlVHlwZS5TSUxFTlRfTU9OSVRPUix0LkNvbm5lY3Rpb25TdGF0ZVR5cGUuQkFSR0VdKSx0LkNvbnRhY3RTdGF0ZVR5cGU9dC5tYWtlRW51bShbImluaXQiLCJpbmNvbWluZyIsInBlbmRpbmciLCJjb25uZWN0aW5nIiwiY29ubmVjdGVkIiwibWlzc2VkIiwiZXJyb3IiLCJlbmRlZCIsInJlamVjdGVkIiwicGF1c2VkIl0pLHQuQ29udGFjdFN0YXR1c1R5cGU9dC5Db250YWN0U3RhdGVUeXBlLHQuQ09OVEFDVF9BQ1RJVkVfU1RBVEVTPXQubWFrZUVudW0oWyJwYXVzZWQiLCJpbmNvbWluZyIsInBlbmRpbmciLCJjb25uZWN0aW5nIiwiY29ubmVjdGVkIl0pLHQuQ29udGFjdFR5cGU9dC5tYWtlRW51bShbInZvaWNlIiwicXVldWVfY2FsbGJhY2siLCJjaGF0IiwidGFzayJdKSx0LkNvbnRhY3RJbml0aWF0aW9uTWV0aG9kPXQubWFrZUVudW0oWyJpbmJvdW5kIiwib3V0Ym91bmQiLCJ0cmFuc2ZlciIsInF1ZXVlX3RyYW5zZmVyIiwiY2FsbGJhY2siLCJhcGkiLCJkaXNjb25uZWN0Iiwid2VicnRjX2FwaSJdKSx0Lk1vbml0b3JpbmdNb2RlPXQubWFrZUVudW0oWyJTSUxFTlRfTU9OSVRPUiIsIkJBUkdFIl0pLHQuTW9uaXRvcmluZ0Vycm9yVHlwZXM9dC5tYWtlRW51bShbImludmFsaWRfdGFyZ2V0X3N0YXRlIl0pLHQuQ2hhbm5lbFR5cGU9dC5tYWtlRW51bShbIlZPSUNFIiwiQ0hBVCIsIlRBU0siXSksdC5NZWRpYVR5cGU9dC5tYWtlRW51bShbInNvZnRwaG9uZSIsImNoYXQiLCJ0YXNrIl0pLHQuU29mdHBob25lQ2FsbFR5cGU9dC5tYWtlRW51bShbImF1ZGlvX3ZpZGVvIiwidmlkZW9fb25seSIsImF1ZGlvX29ubHkiLCJub25lIl0pLHQuU29mdHBob25lRXJyb3JUeXBlcz10Lm1ha2VFbnVtKFsidW5zdXBwb3J0ZWRfYnJvd3NlciIsIm1pY3JvcGhvbmVfbm90X3NoYXJlZCIsInNpZ25hbGxpbmdfaGFuZHNoYWtlX2ZhaWx1cmUiLCJzaWduYWxsaW5nX2Nvbm5lY3Rpb25fZmFpbHVyZSIsImljZV9jb2xsZWN0aW9uX3RpbWVvdXQiLCJ1c2VyX2J1c3lfZXJyb3IiLCJ3ZWJydGNfZXJyb3IiLCJyZWFsdGltZV9jb21tdW5pY2F0aW9uX2Vycm9yIiwidmRpX3N0cmF0ZWd5X25vdF9zdXBwb3J0ZWQiLCJ2ZGlfcmVkaXJfbm90X3N1cHBvcnRlZCIsIm90aGVyIl0pLHQuQ2xpY2tUeXBlPXQubWFrZUVudW0oWyJBY2NlcHQiLCJSZWplY3QiLCJIYW5ndXAiXSksdC5Wb2ljZUlkRXJyb3JUeXBlcz10Lm1ha2VFbnVtKFsibm9fc3BlYWtlcl9pZF9mb3VuZCIsInNwZWFrZXJfaWRfbm90X2Vucm9sbGVkIiwiZ2V0X3NwZWFrZXJfaWRfZmFpbGVkIiwiZ2V0X3NwZWFrZXJfc3RhdHVzX2ZhaWxlZCIsIm9wdF9vdXRfc3BlYWtlcl9mYWlsZWQiLCJvcHRfb3V0X3NwZWFrZXJfaW5fbGNtc19mYWlsZWQiLCJkZWxldGVfc3BlYWtlcl9mYWlsZWQiLCJzdGFydF9zZXNzaW9uX2ZhaWxlZCIsImV2YWx1YXRlX3NwZWFrZXJfZmFpbGVkIiwic2Vzc2lvbl9ub3RfZXhpc3RzIiwiZGVzY3JpYmVfc2Vzc2lvbl9mYWlsZWQiLCJlbnJvbGxfc3BlYWtlcl9mYWlsZWQiLCJ1cGRhdGVfc3BlYWtlcl9pZF9mYWlsZWQiLCJ1cGRhdGVfc3BlYWtlcl9pZF9pbl9sY21zX2ZhaWxlZCIsIm5vdF9zdXBwb3J0ZWRfb25fY29uZmVyZW5jZV9jYWxscyIsImVucm9sbF9zcGVha2VyX3RpbWVvdXQiLCJldmFsdWF0ZV9zcGVha2VyX3RpbWVvdXQiLCJnZXRfZG9tYWluX2lkX2ZhaWxlZCIsIm5vX2RvbWFpbl9pZF9mb3VuZCJdKSx0LkNUSUV4Y2VwdGlvbnM9dC5tYWtlRW51bShbIkFjY2Vzc0RlbmllZEV4Y2VwdGlvbiIsIkludmFsaWRTdGF0ZUV4Y2VwdGlvbiIsIkJhZEVuZHBvaW50RXhjZXB0aW9uIiwiSW52YWxpZEFnZW50QVJORXhjZXB0aW9uIiwiSW52YWxpZENvbmZpZ3VyYXRpb25FeGNlcHRpb24iLCJJbnZhbGlkQ29udGFjdFR5cGVFeGNlcHRpb24iLCJQYWdpbmF0aW9uRXhjZXB0aW9uIiwiUmVmcmVzaFRva2VuRXhwaXJlZEV4Y2VwdGlvbiIsIlNlbmREYXRhRmFpbGVkRXhjZXB0aW9uIiwiVW5hdXRob3JpemVkRXhjZXB0aW9uIiwiUXVvdGFFeGNlZWRlZEV4Y2VwdGlvbiJdKSx0LlZvaWNlSWRTdHJlYW1pbmdTdGF0dXM9dC5tYWtlRW51bShbIk9OR09JTkciLCJFTkRFRCIsIlBFTkRJTkdfQ09ORklHVVJBVElPTiJdKSx0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJBQ0NFUFQiLCJSRUpFQ1QiLCJOT1RfRU5PVUdIX1NQRUVDSCIsIlNQRUFLRVJfTk9UX0VOUk9MTEVEIiwiU1BFQUtFUl9PUFRFRF9PVVQiLCJTUEVBS0VSX0lEX05PVF9QUk9WSURFRCIsIlNQRUFLRVJfRVhQSVJFRCJdKSx0LlZvaWNlSWRGcmF1ZERldGVjdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJOT1RfRU5PVUdIX1NQRUVDSCIsIkhJR0hfUklTSyIsIkxPV19SSVNLIl0pLHQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uPXQubWFrZUVudW0oWyJBdXRoZW50aWNhdGVkIiwiTm90QXV0aGVudGljYXRlZCIsIkluY29uY2x1c2l2ZSIsIk5vdEVucm9sbGVkIiwiT3B0ZWRPdXQiLCJOb3RFbmFibGVkIiwiRXJyb3IiXSksdC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb249dC5tYWtlRW51bShbIkhpZ2hSaXNrIiwiTG93UmlzayIsIkluY29uY2x1c2l2ZSIsIk5vdEVuYWJsZWQiLCJFcnJvciJdKSx0LlZpZGVvQ2FwYWJpbGl0eT10Lm1ha2VFbnVtKFsiU0VORCJdKSx0LlNjcmVlblNoYXJlQ2FwYWJpbGl0eT10Lm1ha2VFbnVtKFsiU0VORCJdKSx0LlZvaWNlSWRFbnJvbGxtZW50UmVxdWVzdFN0YXR1cz10Lm1ha2VFbnVtKFsiTk9UX0VOT1VHSF9TUEVFQ0giLCJJTl9QUk9HUkVTUyIsIkNPTVBMRVRFRCIsIkZBSUxFRCJdKSx0LlZvaWNlSWRTcGVha2VyU3RhdHVzPXQubWFrZUVudW0oWyJPUFRFRF9PVVQiLCJFTlJPTExFRCIsIlBFTkRJTkciXSksdC5Wb2ljZUlkQ29uc3RhbnRzPXtFVkFMVUFURV9TRVNTSU9OX0RFTEFZOjFlNCxFVkFMVUFUSU9OX01BWF9QT0xMX1RJTUVTOjI0LEVWQUxVQVRJT05fUE9MTElOR19JTlRFUlZBTDo1ZTMsRU5ST0xMTUVOVF9NQVhfUE9MTF9USU1FUzoxMjAsRU5ST0xMTUVOVF9QT0xMSU5HX0lOVEVSVkFMOjVlMyxTVEFSVF9TRVNTSU9OX0RFTEFZOjhlM30sdC5BZ2VudFBlcm1pc3Npb25zPXtPVVRCT1VORF9DQUxMOiJvdXRib3VuZENhbGwiLFZPSUNFX0lEOiJ2b2ljZUlkIn07dmFyIG89dSgoZnVuY3Rpb24gZSgpeyFmdW5jdGlvbihlLHQpe2lmKCEoZSBpbnN0YW5jZW9mIHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvbiIpfSh0aGlzLGUpfSkpO2wobywiaXNFbmFibGVkIiwoZnVuY3Rpb24oKXt2YXIgZT10LmlzQ1JNKCk/dC5jb3JlLmdldENsaWVudCgpOnQuY29yZS5nZXRBcGlQcm94eUNsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24obixyKXtlLmNhbGwodC5BcGlQcm94eUNsaWVudE1ldGhvZHMuUVJfSU5URUdSQVRJT05fRVhJU1RTLG51bGwse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJRdWljayBSZXNwb25zZXMgaXNFbmFibGVkIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIlF1aWNrIFJlc3BvbnNlcyBpc0VuYWJsZWQgZmFpbGVkIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZSl9fSl9KSl9KSksbChvLCJzZWFyY2hRdWlja1Jlc3BvbnNlcyIsKGZ1bmN0aW9uKGUpe3ZhciByPXQuaXNDUk0oKT90LmNvcmUuZ2V0Q2xpZW50KCk6dC5jb3JlLmdldEFwaVByb3h5Q2xpZW50KCksbz1udWxsIT1lJiZlLmNvbnRhY3RJZD9uZXcgcChlLmNvbnRhY3RJZCkuZ2V0QXR0cmlidXRlcygpOnZvaWQgMDtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGksYSl7ci5jYWxsKHQuQXBpUHJveHlDbGllbnRNZXRob2RzLlFSX1NFQVJDSF9RVUlDS19SRVNQT05TRVMsbihuKHt9LGUpLHt9LHthdHRyaWJ1dGVzOm99KSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oInNlYXJjaFF1aWNrUmVzcG9uc2VzIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInNlYXJjaFF1aWNrUmVzcG9uc2VzIGZhaWxlZCIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxhKGUpfX0pfSkpfSkpO3ZhciBzPWZ1bmN0aW9uKCl7aWYoIXQuYWdlbnQuaW5pdGlhbGl6ZWQpdGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiVGhlIGFnZW50IGlzIG5vdCB5ZXQgaW5pdGlhbGl6ZWQhIil9O3MucHJvdG90eXBlLl9nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFnZW50RGF0YSgpfSxzLnByb3RvdHlwZS5fY3JlYXRlQ29udGFjdEFQST1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQuQ29udGFjdChlLmNvbnRhY3RJZCl9LHMucHJvdG90eXBlLm9uUmVmcmVzaD1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuUkVGUkVTSCxlKX0scy5wcm90b3R5cGUub25Sb3V0YWJsZT1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuUk9VVEFCTEUsZSl9LHMucHJvdG90eXBlLm9uTm90Um91dGFibGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLk5PVF9ST1VUQUJMRSxlKX0scy5wcm90b3R5cGUub25PZmZsaW5lPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5PRkZMSU5FLGUpfSxzLnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5FUlJPUixlKX0scy5wcm90b3R5cGUub25Tb2Z0cGhvbmVFcnJvcj1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuU09GVFBIT05FX0VSUk9SLGUpfSxzLnByb3RvdHlwZS5vbldlYlNvY2tldENvbm5lY3Rpb25Mb3N0PWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5XRUJTT0NLRVRfQ09OTkVDVElPTl9MT1NULGUpfSxzLnByb3RvdHlwZS5vbldlYlNvY2tldENvbm5lY3Rpb25HYWluZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLldFQlNPQ0tFVF9DT05ORUNUSU9OX0dBSU5FRCxlKX0scy5wcm90b3R5cGUub25BZnRlckNhbGxXb3JrPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5BQ1csZSl9LHMucHJvdG90eXBlLm9uU3RhdGVDaGFuZ2U9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkFnZW50RXZlbnRzLlNUQVRFX0NIQU5HRSxlKX0scy5wcm90b3R5cGUub25NdXRlVG9nZ2xlPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5BZ2VudEV2ZW50cy5NVVRFX1RPR0dMRSxlKX0scy5wcm90b3R5cGUub25Mb2NhbE1lZGlhU3RyZWFtQ3JlYXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuTE9DQUxfTUVESUFfU1RSRUFNX0NSRUFURUQsZSl9LHMucHJvdG90eXBlLm9uU3BlYWtlckRldmljZUNoYW5nZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuU1BFQUtFUl9ERVZJQ0VfQ0hBTkdFRCxlKX0scy5wcm90b3R5cGUub25NaWNyb3Bob25lRGV2aWNlQ2hhbmdlZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5NSUNST1BIT05FX0RFVklDRV9DSEFOR0VELGUpfSxzLnByb3RvdHlwZS5vblJpbmdlckRldmljZUNoYW5nZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuUklOR0VSX0RFVklDRV9DSEFOR0VELGUpfSxzLnByb3RvdHlwZS5vbkNhbWVyYURldmljZUNoYW5nZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbmZpZ3VyYXRpb25FdmVudHMuQ0FNRVJBX0RFVklDRV9DSEFOR0VELGUpfSxzLnByb3RvdHlwZS5vbkJhY2tncm91bmRCbHVyQ2hhbmdlZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQ29uZmlndXJhdGlvbkV2ZW50cy5CQUNLR1JPVU5EX0JMVVJfQ0hBTkdFRCxlKX0scy5wcm90b3R5cGUubXV0ZT1mdW5jdGlvbigpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuRXZlbnRUeXBlLk1VVEUsZGF0YTp7bXV0ZTohMH19KX0scy5wcm90b3R5cGUudW5tdXRlPWZ1bmN0aW9uKCl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5FdmVudFR5cGUuTVVURSxkYXRhOnttdXRlOiExfX0pfSxzLnByb3RvdHlwZS5zZXRTcGVha2VyRGV2aWNlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfU1BFQUtFUl9ERVZJQ0UsZGF0YTp7ZGV2aWNlSWQ6ZX19KX0scy5wcm90b3R5cGUuc2V0TWljcm9waG9uZURldmljZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX01JQ1JPUEhPTkVfREVWSUNFLGRhdGE6e2RldmljZUlkOmV9fSl9LHMucHJvdG90eXBlLnNldFJpbmdlckRldmljZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDp0LkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX1JJTkdFUl9ERVZJQ0UsZGF0YTp7ZGV2aWNlSWQ6ZX19KX0scy5wcm90b3R5cGUuc2V0Q2FtZXJhRGV2aWNlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29uZmlndXJhdGlvbkV2ZW50cy5DQU1FUkFfREVWSUNFX0NIQU5HRUQsZGF0YTp7ZGV2aWNlSWQ6ZX19KX0scy5wcm90b3R5cGUuc2V0QmFja2dyb3VuZEJsdXI9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db25maWd1cmF0aW9uRXZlbnRzLkJBQ0tHUk9VTkRfQkxVUl9DSEFOR0VELGRhdGE6e2lzQmFja2dyb3VuZEJsdXJFbmFibGVkOmV9fSl9LHMucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zbmFwc2hvdC5zdGF0ZX0scy5wcm90b3R5cGUuZ2V0TmV4dFN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zbmFwc2hvdC5uZXh0U3RhdGV9LHMucHJvdG90eXBlLmdldEF2YWlsYWJpbGl0eVN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zbmFwc2hvdC5hZ2VudEF2YWlsYWJpbGl0eVN0YXRlfSxzLnByb3RvdHlwZS5nZXRTdGF0dXM9cy5wcm90b3R5cGUuZ2V0U3RhdGUscy5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0Lm5vdygpLXRoaXMuX2dldERhdGEoKS5zbmFwc2hvdC5zdGF0ZS5zdGFydFRpbWVzdGFtcC5nZXRUaW1lKCkrdC5jb3JlLmdldFNrZXcoKX0scy5wcm90b3R5cGUuZ2V0U3RhdHVzRHVyYXRpb249cy5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbixzLnByb3RvdHlwZS5nZXRQZXJtaXNzaW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5wZXJtaXNzaW9uc30scy5wcm90b3R5cGUuZ2V0Q29udGFjdHM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNuYXBzaG90LmNvbnRhY3RzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuX2NyZWF0ZUNvbnRhY3RBUEkoZSl9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4hZXx8dC5nZXRUeXBlKCk9PT1lfSkpfSxzLnByb3RvdHlwZS5nZXRDb25maWd1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb25maWd1cmF0aW9ufSxzLnByb3RvdHlwZS5nZXRBZ2VudFN0YXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5hZ2VudFN0YXRlc30scy5wcm90b3R5cGUuZ2V0Um91dGluZ1Byb2ZpbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkucm91dGluZ1Byb2ZpbGV9LHMucHJvdG90eXBlLmdldENoYW5uZWxDb25jdXJyZW5jeT1mdW5jdGlvbihlKXt2YXIgbj10aGlzLmdldFJvdXRpbmdQcm9maWxlKCkuY2hhbm5lbENvbmN1cnJlbmN5TWFwO3JldHVybiBufHwobj1PYmplY3Qua2V5cyh0LkNoYW5uZWxUeXBlKS5yZWR1Y2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIlRBU0siIT09biYmKGVbdC5DaGFubmVsVHlwZVtuXV09MSksZX0pLHt9KSksZT9uW2VdfHwwOm59LHMucHJvdG90eXBlLmdldE5hbWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkubmFtZX0scy5wcm90b3R5cGUuZ2V0QWdlbnRBUk49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuYWdlbnRBUk59LHMucHJvdG90eXBlLmdldEV4dGVuc2lvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5leHRlbnNpb259LHMucHJvdG90eXBlLmdldERpYWxhYmxlQ291bnRyaWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29uZmlndXJhdGlvbigpLmRpYWxhYmxlQ291bnRyaWVzfSxzLnByb3RvdHlwZS5pc1NvZnRwaG9uZUVuYWJsZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRDb25maWd1cmF0aW9uKCkuc29mdHBob25lRW5hYmxlZH0scy5wcm90b3R5cGUuc2V0Q29uZmlndXJhdGlvbj1mdW5jdGlvbihlLG4pe3ZhciByPXQuY29yZS5nZXRDbGllbnQoKTtlJiZlLmFnZW50UHJlZmVyZW5jZXMmJmUuYWdlbnRQcmVmZXJlbmNlcy5MQU5HVUFHRSYmIWUuYWdlbnRQcmVmZXJlbmNlcy5sb2NhbGUmJihlLmFnZW50UHJlZmVyZW5jZXMubG9jYWxlPWUuYWdlbnRQcmVmZXJlbmNlcy5MQU5HVUFHRSksZSYmZS5hZ2VudFByZWZlcmVuY2VzJiYhdC5pc1ZhbGlkTG9jYWxlKGUuYWdlbnRQcmVmZXJlbmNlcy5sb2NhbGUpP24mJm4uZmFpbHVyZSYmbi5mYWlsdXJlKHQuQWdlbnRFcnJvclN0YXRlcy5JTlZBTElEX0xPQ0FMRSk6ci5jYWxsKHQuQ2xpZW50TWV0aG9kcy5VUERBVEVfQUdFTlRfQ09ORklHVVJBVElPTix7Y29uZmlndXJhdGlvbjp0LmFzc2VydE5vdE51bGwoZSwiY29uZmlndXJhdGlvbiIpfSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0odC5FdmVudFR5cGUuUkVMT0FEX0FHRU5UX0NPTkZJR1VSQVRJT04pLG4uc3VjY2VzcyYmbi5zdWNjZXNzKGUpfSxmYWlsdXJlOm4mJm4uZmFpbHVyZX0pfSxzLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLG4scil7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLlBVVF9BR0VOVF9TVEFURSx7c3RhdGU6dC5hc3NlcnROb3ROdWxsKGUsInN0YXRlIiksZW5xdWV1ZU5leHRTdGF0ZTpyJiYhIXIuZW5xdWV1ZU5leHRTdGF0ZX0sbil9LHMucHJvdG90eXBlLm9uRW5xdWV1ZWROZXh0U3RhdGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuRU5RVUVVRURfTkVYVF9TVEFURSxlKX0scy5wcm90b3R5cGUuc2V0U3RhdHVzPXMucHJvdG90eXBlLnNldFN0YXRlLHMucHJvdG90eXBlLmNvbm5lY3Q9ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCksbz1uZXcgdC5FbmRwb2ludChlKTtkZWxldGUgby5lbmRwb2ludElkO3ZhciBpPXtlbmRwb2ludDp0LmFzc2VydE5vdE51bGwobywiZW5kcG9pbnQiKSxxdWV1ZUFSTjpuJiYobi5xdWV1ZUFSTnx8bi5xdWV1ZUlkKXx8dGhpcy5nZXRSb3V0aW5nUHJvZmlsZSgpLmRlZmF1bHRPdXRib3VuZFF1ZXVlLnF1ZXVlQVJOfTtuJiZuLnJlbGF0ZWRDb250YWN0SWQmJm51bGwhPT1uLnJlbGF0ZWRDb250YWN0SWQmJihpLnJlbGF0ZWRDb250YWN0SWQ9bi5yZWxhdGVkQ29udGFjdElkLG4ucHJldmlvdXNDb250YWN0SWQmJmRlbGV0ZSBpLnByZXZpb3VzQ29udGFjdElkKSxyLmNhbGwodC5DbGllbnRNZXRob2RzLkNSRUFURV9PVVRCT1VORF9DT05UQUNULGksbiYme3N1Y2Nlc3M6bi5zdWNjZXNzLGZhaWx1cmU6bi5mYWlsdXJlfSl9LHMucHJvdG90eXBlLmdldEFsbFF1ZXVlQVJOcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbmZpZ3VyYXRpb24oKS5yb3V0aW5nUHJvZmlsZS5xdWV1ZXMubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5xdWV1ZUFSTn0pKX0scy5wcm90b3R5cGUuZ2V0RW5kcG9pbnRzPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLGk9dC5jb3JlLmdldENsaWVudCgpO3QuYXNzZXJ0Tm90TnVsbChuLCJjYWxsYmFja3MiKSx0LmFzc2VydE5vdE51bGwobi5zdWNjZXNzLCJjYWxsYmFja3Muc3VjY2VzcyIpO3ZhciBhPXJ8fHt9O2EuZW5kcG9pbnRzPWEuZW5kcG9pbnRzfHxbXSxhLm1heFJlc3VsdHM9YS5tYXhSZXN1bHRzfHx0LkRFRkFVTFRfQkFUQ0hfU0laRSx0LmlzQXJyYXkoZSl8fChlPVtlXSksaS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfRU5EUE9JTlRTLHtxdWV1ZUFSTnM6ZSxuZXh0VG9rZW46YS5uZXh0VG9rZW58fG51bGwsbWF4UmVzdWx0czphLm1heFJlc3VsdHN9LHtzdWNjZXNzOmZ1bmN0aW9uKHIpe2lmKHIubmV4dFRva2VuKW8uZ2V0RW5kcG9pbnRzKGUsbix7bmV4dFRva2VuOnIubmV4dFRva2VuLG1heFJlc3VsdHM6YS5tYXhSZXN1bHRzLGVuZHBvaW50czphLmVuZHBvaW50cy5jb25jYXQoci5lbmRwb2ludHMpfSk7ZWxzZXthLmVuZHBvaW50cz1hLmVuZHBvaW50cy5jb25jYXQoci5lbmRwb2ludHMpO3ZhciBpPWEuZW5kcG9pbnRzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0LkVuZHBvaW50KGUpfSkpO24uc3VjY2Vzcyh7ZW5kcG9pbnRzOmksYWRkcmVzc2VzOml9KX19LGZhaWx1cmU6bi5mYWlsdXJlfSl9LHMucHJvdG90eXBlLmdldEFkZHJlc3Nlcz1zLnByb3RvdHlwZS5nZXRFbmRwb2ludHMscy5wcm90b3R5cGUuX2dldFJlc291cmNlSWQ9ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXMuZ2V0QWxsUXVldWVBUk5zKCksbj1hKHQpO3RyeXtmb3Iobi5zKCk7IShlPW4ubigpKS5kb25lOyl7dmFyIHI9ZS52YWx1ZS5tYXRjaCgvXC9hZ2VudFwvKFteL10rKS8pO2lmKHIpcmV0dXJuIHJbMV19fWNhdGNoKGUpe24uZShlKX1maW5hbGx5e24uZigpfXJldHVybiBuZXcgRXJyb3IoIkFnZW50LnByb3RvdHlwZS5fZ2V0UmVzb3VyY2VJZDogcXVldWVBcm5zIGRpZCBub3QgY29udGFpbiBhZ2VudFJlc291cmNlSWQ6ICIsdCl9LHMucHJvdG90eXBlLnRvU25hcHNob3Q9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuQWdlbnRTbmFwc2hvdCh0aGlzLl9nZXREYXRhKCkpfTt2YXIgYz1mdW5jdGlvbihlKXt0LkFnZW50LmNhbGwodGhpcyksdGhpcy5hZ2VudERhdGE9ZX07KGMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUocy5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1jLGMucHJvdG90eXBlLl9nZXREYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWdlbnREYXRhfSxjLnByb3RvdHlwZS5fY3JlYXRlQ29udGFjdEFQST1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHQuQ29udGFjdFNuYXBzaG90KGUpfTt2YXIgcD1mdW5jdGlvbihlKXt0aGlzLmNvbnRhY3RJZD1lfTtwLnByb3RvdHlwZS5fZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmdldENvbnRhY3RJZCgpKX0scC5wcm90b3R5cGUuX2NyZWF0ZUNvbm5lY3Rpb25BUEk9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuZ2V0VHlwZSgpPT09dC5Db250YWN0VHlwZS5DSEFUP25ldyB0LkNoYXRDb25uZWN0aW9uKHRoaXMuY29udGFjdElkLGUuY29ubmVjdGlvbklkKTp0aGlzLmdldFR5cGUoKT09PXQuQ29udGFjdFR5cGUuVEFTSz9uZXcgdC5UYXNrQ29ubmVjdGlvbih0aGlzLmNvbnRhY3RJZCxlLmNvbm5lY3Rpb25JZCk6bmV3IHQuVm9pY2VDb25uZWN0aW9uKHRoaXMuY29udGFjdElkLGUuY29ubmVjdGlvbklkKX0scC5wcm90b3R5cGUuZ2V0RXZlbnROYW1lPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZShlLHRoaXMuZ2V0Q29udGFjdElkKCkpfSxwLnByb3RvdHlwZS5vblJlZnJlc2g9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuUkVGUkVTSCksZSl9LHAucHJvdG90eXBlLm9uSW5jb21pbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuSU5DT01JTkcpLGUpfSxwLnByb3RvdHlwZS5vbkNvbm5lY3Rpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQ09OTkVDVElORyksZSl9LHAucHJvdG90eXBlLm9uUGVuZGluZz1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5QRU5ESU5HKSxlKX0scC5wcm90b3R5cGUub25BY2NlcHRlZD1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCksZSl9LHAucHJvdG90eXBlLm9uTWlzc2VkPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodGhpcy5nZXRFdmVudE5hbWUodC5Db250YWN0RXZlbnRzLk1JU1NFRCksZSl9LHAucHJvdG90eXBlLm9uRW5kZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuRU5ERUQpLGUpfSxwLnByb3RvdHlwZS5vbkRlc3Ryb3k9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuREVTVFJPWUVEKSxlKX0scC5wcm90b3R5cGUub25BQ1c9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQUNXKSxlKX0scC5wcm90b3R5cGUub25Db25uZWN0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0aGlzLmdldEV2ZW50TmFtZSh0LkNvbnRhY3RFdmVudHMuQ09OTkVDVEVEKSxlKX0scC5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbihlKXtyZXR1cm4gdC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHRoaXMuZ2V0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5FUlJPUiksZSl9LHAucHJvdG90eXBlLmdldENvbnRhY3RJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbnRhY3RJZH0scC5wcm90b3R5cGUuZ2V0T3JpZ2luYWxDb250YWN0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmluaXRpYWxDb250YWN0SWR9LHAucHJvdG90eXBlLmdldEluaXRpYWxDb250YWN0SWQ9cC5wcm90b3R5cGUuZ2V0T3JpZ2luYWxDb250YWN0SWQscC5wcm90b3R5cGUuZ2V0VHlwZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkudHlwZX0scC5wcm90b3R5cGUuZ2V0Q29udGFjdER1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb250YWN0RHVyYXRpb259LHAucHJvdG90eXBlLmdldFN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zdGF0ZX0scC5wcm90b3R5cGUuZ2V0U3RhdHVzPXAucHJvdG90eXBlLmdldFN0YXRlLHAucHJvdG90eXBlLmdldFN0YXRlRHVyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdC5ub3coKS10aGlzLl9nZXREYXRhKCkuc3RhdGUudGltZXN0YW1wLmdldFRpbWUoKSt0LmNvcmUuZ2V0U2tldygpfSxwLnByb3RvdHlwZS5nZXRTdGF0dXNEdXJhdGlvbj1wLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uLHAucHJvdG90eXBlLmdldFF1ZXVlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5xdWV1ZX0scC5wcm90b3R5cGUuZ2V0UXVldWVUaW1lc3RhbXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnF1ZXVlVGltZXN0YW1wfSxwLnByb3RvdHlwZS5nZXRDb25uZWN0aW9ucz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb25uZWN0aW9ucy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBlLmdldFR5cGUoKT09PXQuQ29udGFjdFR5cGUuQ0hBVD9uZXcgdC5DaGF0Q29ubmVjdGlvbihlLmNvbnRhY3RJZCxuLmNvbm5lY3Rpb25JZCk6ZS5nZXRUeXBlKCk9PT10LkNvbnRhY3RUeXBlLlRBU0s/bmV3IHQuVGFza0Nvbm5lY3Rpb24oZS5jb250YWN0SWQsbi5jb25uZWN0aW9uSWQpOm5ldyB0LlZvaWNlQ29ubmVjdGlvbihlLmNvbnRhY3RJZCxuLmNvbm5lY3Rpb25JZCl9KSl9LHAucHJvdG90eXBlLmdldEluaXRpYWxDb25uZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzSW5pdGlhbENvbm5lY3Rpb24oKX0pKXx8bnVsbH0scC5wcm90b3R5cGUuZ2V0QWN0aXZlSW5pdGlhbENvbm5lY3Rpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldEluaXRpYWxDb25uZWN0aW9uKCk7cmV0dXJuIG51bGwhPWUmJmUuaXNBY3RpdmUoKT9lOm51bGx9LHAucHJvdG90eXBlLmdldFRoaXJkUGFydHlDb25uZWN0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldENvbm5lY3Rpb25zKCkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hZS5pc0luaXRpYWxDb25uZWN0aW9uKCkmJmUuZ2V0VHlwZSgpIT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVH0pKX0scC5wcm90b3R5cGUuZ2V0U2luZ2xlQWN0aXZlVGhpcmRQYXJ0eUNvbm5lY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRUaGlyZFBhcnR5Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzQWN0aXZlKCl9KSlbMF18fG51bGx9LHAucHJvdG90eXBlLmdldEFnZW50Q29ubmVjdGlvbj1mdW5jdGlvbigpe3JldHVybiB0LmZpbmQodGhpcy5nZXRDb25uZWN0aW9ucygpLChmdW5jdGlvbihlKXt2YXIgbj1lLmdldFR5cGUoKTtyZXR1cm4gbj09PXQuQ29ubmVjdGlvblR5cGUuQUdFTlR8fG49PT10LkNvbm5lY3Rpb25UeXBlLk1PTklUT1JJTkd9KSl9LHAucHJvdG90eXBlLmdldEFjdGl2ZUNvbm5lY3Rpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzQWN0aXZlKCl9KSl9LHAucHJvdG90eXBlLmhhc1R3b0FjdGl2ZVBhcnRpY2lwYW50cz1mdW5jdGlvbigpe3JldHVybiAyPT09dGhpcy5nZXRBY3RpdmVDb25uZWN0aW9ucygpLmxlbmd0aH0scC5wcm90b3R5cGUuZ2V0TmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubmFtZX0scC5wcm90b3R5cGUuZ2V0Q29udGFjdE1ldGFkYXRhPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb250YWN0TWV0YWRhdGF9LHAucHJvdG90eXBlLmdldERlc2NyaXB0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5kZXNjcmlwdGlvbn0scC5wcm90b3R5cGUuZ2V0UmVmZXJlbmNlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkucmVmZXJlbmNlc30scC5wcm90b3R5cGUuZ2V0QXR0cmlidXRlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuYXR0cmlidXRlc30scC5wcm90b3R5cGUuZ2V0Q29udGFjdEZlYXR1cmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jb250YWN0RmVhdHVyZXN9LHAucHJvdG90eXBlLmdldENoYW5uZWxDb250ZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jaGFubmVsQ29udGV4dH0scC5wcm90b3R5cGUuZ2V0U2VnbWVudEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLnNlZ21lbnRBdHRyaWJ1dGVzfSxwLnByb3RvdHlwZS5nZXRDb250YWN0U3VidHlwZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0U2VnbWVudEF0dHJpYnV0ZXMoKTtyZXR1cm4gZSYmZVsiY29ubmVjdDpTdWJ0eXBlIl0/ZVsiY29ubmVjdDpTdWJ0eXBlIl0uVmFsdWVTdHJpbmc6bnVsbH0scC5wcm90b3R5cGUuaXNTb2Z0cGhvbmVDYWxsPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPXQuZmluZCh0aGlzLmdldENvbm5lY3Rpb25zKCksKGZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lLmdldFNvZnRwaG9uZU1lZGlhSW5mbygpfSkpfSxwLnByb3RvdHlwZS5oYXNWaWRlb1JUQ0NhcGFiaWxpdGllcz1mdW5jdGlvbigpe3JldHVybiBudWxsIT09dC5maW5kKHRoaXMuZ2V0Q29ubmVjdGlvbnMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2FuU2VuZFZpZGVvJiZlLmNhblNlbmRWaWRlbygpfSkpfSxwLnByb3RvdHlwZS5jYW5BZ2VudFNlbmRWaWRlbz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0QWdlbnRDb25uZWN0aW9uKCk7cmV0dXJuIGUuY2FuU2VuZFZpZGVvJiZlLmNhblNlbmRWaWRlbygpfSxwLnByb3RvdHlwZS5jYW5BZ2VudFJlY2VpdmVWaWRlbz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0SW5pdGlhbENvbm5lY3Rpb24oKTtpZihlLmNhblNlbmRWaWRlbyYmZS5jYW5TZW5kVmlkZW8oKSlyZXR1cm4hMDt2YXIgdD10aGlzLmdldFRoaXJkUGFydHlDb25uZWN0aW9ucygpO3JldHVybiB0JiZ0Lmxlbmd0aD4wJiZ0aGlzLmNhbkFnZW50U2VuZFZpZGVvKCl9LHAucHJvdG90eXBlLmhhc1NjcmVlblNoYXJlQ2FwYWJpbGl0eT1mdW5jdGlvbigpe3JldHVybiBudWxsIT09dC5maW5kKHRoaXMuZ2V0Q29ubmVjdGlvbnMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2FuU2VuZFNjcmVlblNoYXJlJiZlLmNhblNlbmRTY3JlZW5TaGFyZSgpfSkpfSxwLnByb3RvdHlwZS5jYW5BZ2VudFNlbmRTY3JlZW5TaGFyZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0QWdlbnRDb25uZWN0aW9uKCk7cmV0dXJuIGUuY2FuU2VuZFNjcmVlblNoYXJlJiZlLmNhblNlbmRTY3JlZW5TaGFyZSgpfSxwLnByb3RvdHlwZS5jYW5DdXN0b21lclNlbmRTY3JlZW5TaGFyZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0SW5pdGlhbENvbm5lY3Rpb24oKTtyZXR1cm4gZS5jYW5TZW5kU2NyZWVuU2hhcmUmJmUuY2FuU2VuZFNjcmVlblNoYXJlKCl9LHAucHJvdG90eXBlLnN0YXJ0U2NyZWVuU2hhcmluZz1mdW5jdGlvbigpe3ZhciBlPWkocigpLm1hcmsoKGZ1bmN0aW9uIGUobil7dmFyIG8saSxhO3JldHVybiByKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYobz10aGlzLmdldENvbnRhY3RJZCgpLCJjb25uZWN0OldlYlJUQyI9PT10aGlzLmdldENvbnRhY3RTdWJ0eXBlKCkpe2UubmV4dD0zO2JyZWFrfXRocm93IG5ldyBFcnJvcigiU2NyZWVuIHNoYXJpbmcgaXMgb25seSBzdXBwb3J0ZWQgZm9yIFdlYlJUQyBjb250YWN0cy4iKTtjYXNlIDM6aWYodGhpcy5pc0Nvbm5lY3RlZCgpKXtlLm5leHQ9NTticmVha310aHJvdyBuZXcgdC5TdGF0ZUVycm9yKCJDb250YWN0ICVzIGlzIG5vdCBjb25uZWN0ZWQuIixvKTtjYXNlIDU6aWYobil7ZS5uZXh0PTExO2JyZWFrfXJldHVybiBpPXQuaXNDUk0oKT90LmNvcmUuZ2V0Q2xpZW50KCk6dC5jb3JlLmdldEFwaVByb3h5Q2xpZW50KCksYT17SW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksQ29udGFjdElkOm8sUGFydGljaXBhbnRJZDp0aGlzLmdldEFnZW50Q29ubmVjdGlvbigpLmdldENvbm5lY3Rpb25JZCgpfSxlLmFicnVwdCgicmV0dXJuIixuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxuKXtpLmNhbGwodC5BcGlQcm94eUNsaWVudE1ldGhvZHMuU1RBUlRfU0NSRUVOX1NIQVJJTkcsYSx7c3VjY2VzczpmdW5jdGlvbihuKXt0LmdldExvZygpLmluZm8oInN0YXJ0U2NyZWVuU2hhcmluZyBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHQuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6dC5Db250YWN0RXZlbnRzLlNDUkVFTl9TSEFSSU5HX1NUQVJURUQsZGF0YTp7Y29udGFjdElkOm99fSksZShuKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJzdGFydFNjcmVlblNoYXJpbmcgZmFpbGVkIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29udGFjdEV2ZW50cy5TQ1JFRU5fU0hBUklOR19FUlJPUixkYXRhOntjb250YWN0SWQ6b319KSxuKGUpfX0pfSkpKTtjYXNlIDExOnQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29udGFjdEV2ZW50cy5TQ1JFRU5fU0hBUklOR19TVEFSVEVELGRhdGE6e2NvbnRhY3RJZDpvfX0pO2Nhc2UgMTI6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSxlLHRoaXMpfSkpKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSxwLnByb3RvdHlwZS5vblNjcmVlblNoYXJpbmdTdGFydGVkPWZ1bmN0aW9uKGUpe3JldHVybiB0LmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUodC5Db250YWN0RXZlbnRzLlNDUkVFTl9TSEFSSU5HX1NUQVJURUQsZSl9LHAucHJvdG90eXBlLnN0b3BTY3JlZW5TaGFyaW5nPWkocigpLm1hcmsoKGZ1bmN0aW9uIGUoKXt2YXIgbjtyZXR1cm4gcigpLndyYXAoKGZ1bmN0aW9uKGUpe2Zvcig7Oylzd2l0Y2goZS5wcmV2PWUubmV4dCl7Y2FzZSAwOmlmKG49dGhpcy5nZXRDb250YWN0SWQoKSwiY29ubmVjdDpXZWJSVEMiPT09dGhpcy5nZXRDb250YWN0U3VidHlwZSgpKXtlLm5leHQ9MzticmVha310aHJvdyBuZXcgRXJyb3IoIlNjcmVlbiBzaGFyaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGZvciBXZWJSVEMgY29udGFjdHMuIik7Y2FzZSAzOmlmKHRoaXMuaXNDb25uZWN0ZWQoKSl7ZS5uZXh0PTU7YnJlYWt9dGhyb3cgbmV3IHQuU3RhdGVFcnJvcigiQ29udGFjdCAlcyBpcyBub3QgY29ubmVjdGVkLiIsbik7Y2FzZSA1OnQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29udGFjdEV2ZW50cy5TQ1JFRU5fU0hBUklOR19TVE9QUEVELGRhdGE6e2NvbnRhY3RJZDpufX0pO2Nhc2UgNjpjYXNlImVuZCI6cmV0dXJuIGUuc3RvcCgpfX0pLGUsdGhpcyl9KSkpLHAucHJvdG90eXBlLm9uU2NyZWVuU2hhcmluZ1N0b3BwZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbnRhY3RFdmVudHMuU0NSRUVOX1NIQVJJTkdfU1RPUFBFRCxlKX0scC5wcm90b3R5cGUub25TY3JlZW5TaGFyaW5nRXJyb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbnRhY3RFdmVudHMuU0NSRUVOX1NIQVJJTkdfRVJST1IsZSl9LHAucHJvdG90eXBlLl9pc0luYm91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmluaXRpYXRpb25NZXRob2QhPT10LkNvbnRhY3RJbml0aWF0aW9uTWV0aG9kLk9VVEJPVU5EfSxwLnByb3RvdHlwZS5pc0luYm91bmQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldEluaXRpYWxDb25uZWN0aW9uKCk7cmV0dXJuIGUuZ2V0TWVkaWFUeXBlKCk9PT10Lk1lZGlhVHlwZS5UQVNLP3RoaXMuX2lzSW5ib3VuZCgpOiEhZSYmZS5nZXRUeXBlKCk9PT10LkNvbm5lY3Rpb25UeXBlLklOQk9VTkR9LHAucHJvdG90eXBlLmlzQ29ubmVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNURUR9LHAucHJvdG90eXBlLmFjY2VwdD1mdW5jdGlvbihlKXt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCkscj10aGlzLG89dGhpcy5nZXRDb250YWN0SWQoKTt0LnB1Ymxpc2hDbGlja1N0cmVhbURhdGEoe2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNsaWNrVHlwZTp0LkNsaWNrVHlwZS5BQ0NFUFQsY2xpY2tUaW1lOihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKX0pLG4uY2FsbCh0LkNsaWVudE1ldGhvZHMuQUNDRVBUX0NPTlRBQ1Qse2NvbnRhY3RJZDpvfSx7c3VjY2VzczpmdW5jdGlvbihuKXt2YXIgaT10LmNvcmUuZ2V0VXBzdHJlYW0oKTtpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCxkYXRhOm5ldyB0LkNvbnRhY3Qobyl9KSxpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKHQuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCxyLmdldENvbnRhY3RJZCgpKSxkYXRhOm5ldyB0LkNvbnRhY3Qobyl9KTt2YXIgYT1uZXcgdC5Db250YWN0KG8pO3QuaXNGaXJlZm94QnJvd3NlcigpJiZhLmlzU29mdHBob25lQ2FsbCgpJiZ0LmNvcmUudHJpZ2dlclJlYWR5VG9TdGFydFNlc3Npb25FdmVudCgpLGUmJmUuc3VjY2VzcyYmZS5zdWNjZXNzKG4pfSxmYWlsdXJlOmZ1bmN0aW9uKG4scil7dC5nZXRMb2coKS5lcnJvcigiQWNjZXB0IENvbnRhY3QgZmFpbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoRXhjZXB0aW9uKG4pLndpdGhPYmplY3Qoe2RhdGE6cn0pLHQucHVibGlzaE1ldHJpYyh7bmFtZToiQ29udGFjdEFjY2VwdEZhaWx1cmUiLGRhdGE6e2NvdW50OjF9fSksZSYmZS5mYWlsdXJlJiZlLmZhaWx1cmUodC5Db250YWN0U3RhdGVUeXBlLkVSUk9SKX19KX0scC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3QuZ2V0TG9nKCkud2FybigiY29udGFjdC5kZXN0cm95KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4iKX0scC5wcm90b3R5cGUucmVqZWN0PWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKTt0LnB1Ymxpc2hDbGlja1N0cmVhbURhdGEoe2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNsaWNrVHlwZTp0LkNsaWNrVHlwZS5SRUpFQ1QsY2xpY2tUaW1lOihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKX0pLG4uY2FsbCh0LkNsaWVudE1ldGhvZHMuUkVKRUNUX0NPTlRBQ1Qse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpfSxlKX0scC5wcm90b3R5cGUuY29tcGxldGU9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLkNPTVBMRVRFX0NPTlRBQ1Qse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpfSxlKX0scC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLkNMRUFSX0NPTlRBQ1Qse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpfSxlKX0scC5wcm90b3R5cGUubm90aWZ5SXNzdWU9ZnVuY3Rpb24oZSxuLHIpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5OT1RJRllfQ09OVEFDVF9JU1NVRSx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksaXNzdWVDb2RlOmUsZGVzY3JpcHRpb246bn0scil9LHAucHJvdG90eXBlLmFkZENvbm5lY3Rpb249ZnVuY3Rpb24oZSxuKXt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCksbz1uZXcgdC5FbmRwb2ludChlKTtkZWxldGUgby5lbmRwb2ludElkLHIuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX0FERElUSU9OQUxfQ09OTkVDVElPTix7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksZW5kcG9pbnQ6b30sbil9LHAucHJvdG90eXBlLnRvZ2dsZUFjdGl2ZUNvbm5lY3Rpb25zPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRDbGllbnQoKSxyPW51bGwsbz10LmZpbmQodGhpcy5nZXRDb25uZWN0aW9ucygpLChmdW5jdGlvbihlKXtyZXR1cm4gZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db25uZWN0aW9uU3RhdGVUeXBlLkhPTER9KSk7aWYobnVsbCE9bylyPW8uZ2V0Q29ubmVjdGlvbklkKCk7ZWxzZXt2YXIgaT10aGlzLmdldENvbm5lY3Rpb25zKCkuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5pc0FjdGl2ZSgpfSkpO2kubGVuZ3RoPjAmJihyPWlbMF0uZ2V0Q29ubmVjdGlvbklkKCkpfW4uY2FsbCh0LkNsaWVudE1ldGhvZHMuVE9HR0xFX0FDVElWRV9DT05ORUNUSU9OUyx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnJ9LGUpfSxwLnByb3RvdHlwZS5zZW5kU29mdHBob25lTWV0cmljcz1mdW5jdGlvbihuLHIpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX01FVFJJQ1Mse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNjcFZlcnNpb246ZS5jY3BWZXJzaW9uLHNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M6bn0sciksdC5wdWJsaXNoU29mdHBob25lU3RhdHMoe2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNjcFZlcnNpb246ZS5jY3BWZXJzaW9uLHN0YXRzOm59KX0scC5wcm90b3R5cGUuc2VuZFNvZnRwaG9uZVJlcG9ydD1mdW5jdGlvbihuLHIpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX1JFUE9SVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY2NwVmVyc2lvbjplLmNjcFZlcnNpb24scmVwb3J0Om59LHIpfSxwLnByb3RvdHlwZS5jb25mZXJlbmNlQ29ubmVjdGlvbnM9ZnVuY3Rpb24oZSl7dC5jb3JlLmdldENsaWVudCgpLmNhbGwodC5DbGllbnRNZXRob2RzLkNPTkZFUkVOQ0VfQ09OTkVDVElPTlMse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpfSxlKX0scC5wcm90b3R5cGUudG9TbmFwc2hvdD1mdW5jdGlvbigpe3JldHVybiBuZXcgdC5Db250YWN0U25hcHNob3QodGhpcy5fZ2V0RGF0YSgpKX0scC5wcm90b3R5cGUuaXNNdWx0aVBhcnR5Q29uZmVyZW5jZUVuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldENvbnRhY3RGZWF0dXJlcygpO3JldHVybiEoIWV8fCFlLm11bHRpUGFydHlDb25mZXJlbmNlRW5hYmxlZCl9LHAucHJvdG90eXBlLnVwZGF0ZU1vbml0b3JQYXJ0aWNpcGFudFN0YXRlPWZ1bmN0aW9uKGUsbil7ZSYmT2JqZWN0LnZhbHVlcyh0Lk1vbml0b3JpbmdNb2RlKS5pbmNsdWRlcyhlLnRvVXBwZXJDYXNlKCkpP3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5VUERBVEVfTU9OSVRPUl9QQVJUSUNJUEFOVF9TVEFURSx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksdGFyZ2V0TW9uaXRvck1vZGU6ZS50b1VwcGVyQ2FzZSgpfSxuKToodC5nZXRMb2coKS5lcnJvcigiSW52YWxpZCB0YXJnZXQgc3RhdGUgd2FzIHByb3ZpZGVkOiAiLmNvbmNhdChlKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuJiZuLmZhaWx1cmUmJm4uZmFpbHVyZSh0Lk1vbml0b3JpbmdFcnJvclR5cGVzLklOVkFMSURfVEFSR0VUX1NUQVRFKSl9LHAucHJvdG90eXBlLmlzVW5kZXJTdXBlcnZpc2lvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Q29ubmVjdGlvbnMoKS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldFR5cGUoKSE9PXQuQ29ubmVjdGlvblR5cGUuQUdFTlR9KSk7cmV0dXJuIHZvaWQgMCE9PShlJiZlLmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlzQmFyZ2UoKSYmZS5pc0FjdGl2ZSgpfSkpKX0scC5wcm90b3R5cGUuc2lsZW50TW9uaXRvcj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy51cGRhdGVNb25pdG9yUGFydGljaXBhbnRTdGF0ZSh0Lk1vbml0b3JpbmdNb2RlLlNJTEVOVF9NT05JVE9SLGUpfSxwLnByb3RvdHlwZS5iYXJnZUluPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnVwZGF0ZU1vbml0b3JQYXJ0aWNpcGFudFN0YXRlKHQuTW9uaXRvcmluZ01vZGUuQkFSR0UsZSl9LHAucHJvdG90eXBlLnBhdXNlPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5QQVVTRV9DT05UQUNULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKX0sZSl9LHAucHJvdG90eXBlLnJlc3VtZT1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuUkVTVU1FX0NPTlRBQ1Qse2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpfSxlKX07dmFyIGQ9ZnVuY3Rpb24oZSl7dC5Db250YWN0LmNhbGwodGhpcyxlLmNvbnRhY3RJZCksdGhpcy5jb250YWN0RGF0YT1lfTsoZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShwLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWQsZC5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWN0RGF0YX0sZC5wcm90b3R5cGUuX2NyZWF0ZUNvbm5lY3Rpb25BUEk9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0LkNvbm5lY3Rpb25TbmFwc2hvdChlKX07dmFyIGY9ZnVuY3Rpb24oZSx0KXt0aGlzLmNvbnRhY3RJZD1lLHRoaXMuY29ubmVjdGlvbklkPXQsdGhpcy5faW5pdE1lZGlhQ29udHJvbGxlcigpfTtmLnByb3RvdHlwZS5fZ2V0RGF0YT1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb25uZWN0aW9uRGF0YSh0aGlzLmdldENvbnRhY3RJZCgpLHRoaXMuZ2V0Q29ubmVjdGlvbklkKCkpfSxmLnByb3RvdHlwZS5nZXRDb250YWN0SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb250YWN0SWR9LGYucHJvdG90eXBlLmdldENvbm5lY3Rpb25JZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbm5lY3Rpb25JZH0sZi5wcm90b3R5cGUuZ2V0RW5kcG9pbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHQuRW5kcG9pbnQodGhpcy5fZ2V0RGF0YSgpLmVuZHBvaW50KX0sZi5wcm90b3R5cGUuZ2V0QWRkcmVzcz1mLnByb3RvdHlwZS5nZXRFbmRwb2ludCxmLnByb3RvdHlwZS5nZXRTdGF0ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc3RhdGV9LGYucHJvdG90eXBlLmdldFN0YXR1cz1mLnByb3RvdHlwZS5nZXRTdGF0ZSxmLnByb3RvdHlwZS5nZXRTdGF0ZUR1cmF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHQubm93KCktdGhpcy5fZ2V0RGF0YSgpLnN0YXRlLnRpbWVzdGFtcC5nZXRUaW1lKCkrdC5jb3JlLmdldFNrZXcoKX0sZi5wcm90b3R5cGUuZ2V0U3RhdHVzRHVyYXRpb249Zi5wcm90b3R5cGUuZ2V0U3RhdGVEdXJhdGlvbixmLnByb3RvdHlwZS5nZXRUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS50eXBlfSxmLnByb3RvdHlwZS5pc0luaXRpYWxDb25uZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5pbml0aWFsfSxmLnByb3RvdHlwZS5pc0FjdGl2ZT1mdW5jdGlvbigpe3JldHVybiB0LmNvbnRhaW5zKHQuQ09OTkVDVElPTl9BQ1RJVkVfU1RBVEVTLHRoaXMuZ2V0U3RhdHVzKCkudHlwZSl9LGYucHJvdG90eXBlLmlzQ29ubmVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHQuY29udGFpbnModC5DT05ORUNUSU9OX0NPTk5FQ1RFRF9TVEFURVMsdGhpcy5nZXRTdGF0dXMoKS50eXBlKX0sZi5wcm90b3R5cGUuaXNDb25uZWN0aW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0U3RhdHVzKCkudHlwZT09PXQuQ29ubmVjdGlvblN0YXRlVHlwZS5DT05ORUNUSU5HfSxmLnByb3RvdHlwZS5pc09uSG9sZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldFN0YXR1cygpLnR5cGU9PT10LkNvbm5lY3Rpb25TdGF0ZVR5cGUuSE9MRH0sZi5wcm90b3R5cGUuZ2V0U29mdHBob25lTWVkaWFJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zb2Z0cGhvbmVNZWRpYUluZm99LGYucHJvdG90eXBlLmdldE1vbml0b3JJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yaW5nSW5mb30sZi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbihlKXt0LnB1Ymxpc2hDbGlja1N0cmVhbURhdGEoe2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNsaWNrVHlwZTp0LkNsaWNrVHlwZS5IQU5HVVAsY2xpY2tUaW1lOihuZXcgRGF0ZSkudG9JU09TdHJpbmcoKX0pLHQuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5ERVNUUk9ZX0NPTk5FQ1RJT04se2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX0sZi5wcm90b3R5cGUuc2VuZERpZ2l0cz1mdW5jdGlvbihlLG4pe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5TRU5EX0RJR0lUUyx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCksZGlnaXRzOmV9LG4pfSxmLnByb3RvdHlwZS5ob2xkPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5IT0xEX0NPTk5FQ1RJT04se2NvbnRhY3RJZDp0aGlzLmdldENvbnRhY3RJZCgpLGNvbm5lY3Rpb25JZDp0aGlzLmdldENvbm5lY3Rpb25JZCgpfSxlKX0sZi5wcm90b3R5cGUucmVzdW1lPWZ1bmN0aW9uKGUpe3QuY29yZS5nZXRDbGllbnQoKS5jYWxsKHQuQ2xpZW50TWV0aG9kcy5SRVNVTUVfQ09OTkVDVElPTix7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCl9LGUpfSxmLnByb3RvdHlwZS50b1NuYXBzaG90PWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0LkNvbm5lY3Rpb25TbmFwc2hvdCh0aGlzLl9nZXREYXRhKCkpfSxmLnByb3RvdHlwZS5faW5pdE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3RoaXMuZ2V0TWVkaWFJbmZvKCkmJnQuY29yZS5tZWRpYUZhY3RvcnkuZ2V0KHRoaXMpLmNhdGNoKChmdW5jdGlvbigpe30pKX0sZi5wcm90b3R5cGUuX2lzQWdlbnRDb25uZWN0aW9uVHlwZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VHlwZSgpO3JldHVybiBlPT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVHx8ZT09PXQuQ29ubmVjdGlvblR5cGUuTU9OSVRPUklOR30sZi5wcm90b3R5cGUuX2lzQWdlbnRDb25uZWN0aW9uVHlwZT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0VHlwZSgpO3JldHVybiBlPT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVHx8ZT09PXQuQ29ubmVjdGlvblR5cGUuTU9OSVRPUklOR307dmFyIGg9ZnVuY3Rpb24oZSl7dGhpcy5jb250YWN0SWQ9ZX07aC5wcm90b3R5cGUuZ2V0U3BlYWtlcklkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe3ZhciBpPXtjb250YWN0SWQ6ZS5jb250YWN0SWQsaW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksYXdzQWNjb3VudElkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFXU0FjY291bnRJZCgpfTt0LmdldExvZygpLmluZm8oImdldFNwZWFrZXJJZCBjYWxsZWQiKS53aXRoT2JqZWN0KGkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkdFVF9DT05UQUNULGkse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7aWYoZS5jb250YWN0RGF0YS5jdXN0b21lcklkKXt2YXIgbj17c3BlYWtlcklkOmUuY29udGFjdERhdGEuY3VzdG9tZXJJZH07dC5nZXRMb2coKS5pbmZvKCJnZXRTcGVha2VySWQgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIobil9ZWxzZXt2YXIgaT10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLk5PX1NQRUFLRVJfSURfRk9VTkQsIk5vIHNwZWFrZXJJZCBhc3NvdGlhdGVkIHdpdGggdGhpcyBjYWxsIik7byhpKX19LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiR2V0IFNwZWFrZXJJZCBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5HRVRfU1BFQUtFUl9JRF9GQUlMRUQsIkdldCBTcGVha2VySWQgZmFpbGVkIixlKTtvKG4pfX0pfSkpfSxoLnByb3RvdHlwZS5nZXRTcGVha2VyU3RhdHVzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuZ2V0U3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24oaSl7ZS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe3ZhciBhPXtTcGVha2VySWQ6dC5hc3NlcnROb3ROdWxsKGkuc3BlYWtlcklkLCJzcGVha2VySWQiKSxEb21haW5JZDplfTt0LmdldExvZygpLmluZm8oImdldFNwZWFrZXJTdGF0dXMgY2FsbGVkIikud2l0aE9iamVjdChhKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5ERVNDUklCRV9TUEVBS0VSLGEse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJnZXRTcGVha2VyU3RhdHVzIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3ZhciBuPUpTT04ucGFyc2UoZSk7c3dpdGNoKG4uc3RhdHVzKXtjYXNlIDQwMDpjYXNlIDQwNDp2YXIgaT1uO2kudHlwZT1pLnR5cGU/aS50eXBlOnQuVm9pY2VJZEVycm9yVHlwZXMuU1BFQUtFUl9JRF9OT1RfRU5ST0xMRUQsdC5nZXRMb2coKS5pbmZvKCJTcGVha2VyIGlzIG5vdCBlbnJvbGxlZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoaSk7YnJlYWs7ZGVmYXVsdDp0LmdldExvZygpLmVycm9yKCJnZXRTcGVha2VyU3RhdHVzIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgYT10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkdFVF9TUEVBS0VSX1NUQVRVU19GQUlMRUQsIkdldCBTcGVha2VyU3RhdHVzIGZhaWxlZCIsZSk7byhhKX19fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe28oZSl9KSl9KSl9LGgucHJvdG90eXBlLl9vcHRPdXRTcGVha2VySW5MY21zPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcyxvPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGksYSl7dmFyIHM9e0NvbnRhY3RJZDpyLmNvbnRhY3RJZCxJbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxBV1NBY2NvdW50SWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QVdTQWNjb3VudElkKCksQ3VzdG9tZXJJZDp0LmFzc2VydE5vdE51bGwoZSwic3BlYWtlcklkIiksVm9pY2VJZFJlc3VsdDp7U3BlYWtlck9wdGVkT3V0OiEwLGdlbmVyYXRlZFNwZWFrZXJJZDpufX07dC5nZXRMb2coKS5pbmZvKCJfb3B0T3V0U3BlYWtlckluTGNtcyBjYWxsZWQiKS53aXRoT2JqZWN0KHMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksby5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLlVQREFURV9WT0lDRV9JRF9EQVRBLHMse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJvcHRPdXRTcGVha2VySW5MY21zIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoIm9wdE91dFNwZWFrZXJJbkxjbXMgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuT1BUX09VVF9TUEVBS0VSX0lOX0xDTVNfRkFJTEVELCJvcHRPdXRTcGVha2VySW5MY21zIGZhaWxlZCIsZSk7YShuKX19KX0pKX0saC5wcm90b3R5cGUub3B0T3V0U3BlYWtlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtlLmdldFNwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKGkpe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihhKXt2YXIgcz1pLnNwZWFrZXJJZCxjPXtTcGVha2VySWQ6dC5hc3NlcnROb3ROdWxsKHMsInNwZWFrZXJJZCIpLERvbWFpbklkOmF9O3QuZ2V0TG9nKCkuaW5mbygib3B0T3V0U3BlYWtlciBjYWxsZWQiKS53aXRoT2JqZWN0KGMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLk9QVF9PVVRfU1BFQUtFUixjLHtzdWNjZXNzOmZ1bmN0aW9uKG4pe2UuX29wdE91dFNwZWFrZXJJbkxjbXMocyxuLmdlbmVyYXRlZFNwZWFrZXJJZCkuY2F0Y2goKGZ1bmN0aW9uKCl7fSkpLHQuZ2V0TG9nKCkuaW5mbygib3B0T3V0U3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihuKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJvcHRPdXRTcGVha2VyIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLk9QVF9PVVRfU1BFQUtFUl9GQUlMRUQsIm9wdE91dFNwZWFrZXIgZmFpbGVkLiIsZSk7byhuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0saC5wcm90b3R5cGUuZGVsZXRlU3BlYWtlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIG49dC5jb3JlLmdldENsaWVudCgpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24ocixvKXtlLmdldFNwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKGkpe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihlKXt2YXIgYT17U3BlYWtlcklkOnQuYXNzZXJ0Tm90TnVsbChpLnNwZWFrZXJJZCwic3BlYWtlcklkIiksRG9tYWluSWQ6ZX07dC5nZXRMb2coKS5pbmZvKCJkZWxldGVTcGVha2VyIGNhbGxlZCIpLndpdGhPYmplY3QoYSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuREVMRVRFX1NQRUFLRVIsYSx7c3VjY2VzczpmdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImRlbGV0ZVNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiZGVsZXRlU3BlYWtlciBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5ERUxFVEVfU1BFQUtFUl9GQUlMRUQsImRlbGV0ZVNwZWFrZXIgZmFpbGVkLiIsZSk7byhuKX19KX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKX0pKX0saC5wcm90b3R5cGUuc3RhcnRTZXNzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgbj10LmNvcmUuZ2V0Q2xpZW50KCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihpKXt2YXIgYT17Y29udGFjdElkOmUuY29udGFjdElkLGluc3RhbmNlSWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0SW5zdGFuY2VJZCgpLGN1c3RvbWVyQWNjb3VudElkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFXU0FjY291bnRJZCgpLGNsaWVudFRva2VuOkFXUy51dGlsLnV1aWQudjQoKSxkb21haW5JZDppfTt0LmdldExvZygpLmluZm8oInN0YXJ0U2Vzc2lvbiBjYWxsZWQiKS53aXRoT2JqZWN0KGEpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLlNUQVJUX1ZPSUNFX0lEX1NFU1NJT04sYSx7c3VjY2VzczpmdW5jdGlvbihlKXtpZihlLnNlc3Npb25JZClyKGUpO2Vsc2V7dC5nZXRMb2coKS5lcnJvcigic3RhcnRWb2ljZUlkU2Vzc2lvbiBmYWlsZWQsIG5vIHNlc3Npb24gaWQgcmV0dXJuZWQiKS53aXRoT2JqZWN0KHtkYXRhOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuU1RBUlRfU0VTU0lPTl9GQUlMRUQsIk5vIHNlc3Npb24gaWQgcmV0dXJuZWQgZnJvbSBzdGFydCBzZXNzaW9uIGFwaSIpO28obil9fSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInN0YXJ0Vm9pY2VJZFNlc3Npb24gZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuU1RBUlRfU0VTU0lPTl9GQUlMRUQsInN0YXJ0Vm9pY2VJZFNlc3Npb24gZmFpbGVkIixlKTtvKG4pfX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpfSxoLnByb3RvdHlwZS5ldmFsdWF0ZVNwZWFrZXI9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztuLmNoZWNrQ29uZmVyZW5jZUNhbGwoKTt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCksbz10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCksaT0wO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oYSxzKXtmdW5jdGlvbiBjKCl7bi5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe3ZhciB1PXtTZXNzaW9uTmFtZU9ySWQ6by5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxEb21haW5JZDplfTt0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBjYWxsZWQiKS53aXRoT2JqZWN0KHUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5jYWxsKHQuQWdlbnRBcHBDbGllbnRNZXRob2RzLkVWQUxVQVRFX1NFU1NJT04sdSx7c3VjY2VzczpmdW5jdGlvbihlKXtpZigrK2k8dC5Wb2ljZUlkQ29uc3RhbnRzLkVWQUxVQVRJT05fTUFYX1BPTExfVElNRVMpaWYoZS5TdHJlYW1pbmdTdGF0dXM9PT10LlZvaWNlSWRTdHJlYW1pbmdTdGF0dXMuUEVORElOR19DT05GSUdVUkFUSU9OKXNldFRpbWVvdXQoYyx0LlZvaWNlSWRDb25zdGFudHMuRVZBTFVBVElPTl9QT0xMSU5HX0lOVEVSVkFMKTtlbHNle2lmKGUuQXV0aGVudGljYXRpb25SZXN1bHR8fChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0PXt9LGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uTk9UX0VOQUJMRUQpLGUuRnJhdWREZXRlY3Rpb25SZXN1bHR8fChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0PXt9LGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTk9UX0VOQUJMRUQpLCFuLmlzQXV0aEVuYWJsZWQoZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJiFuLmlzRnJhdWRFbmFibGVkKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pKXJldHVybiB0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZCBhKGUpO2lmKGUuU3RyZWFtaW5nU3RhdHVzPT09dC5Wb2ljZUlkU3RyZWFtaW5nU3RhdHVzLkVOREVEJiYobi5pc0F1dGhSZXN1bHROb3RFbm91Z2hTcGVlY2goZS5BdXRoZW50aWNhdGlvblJlc3VsdC5EZWNpc2lvbikmJihlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLklOQ09OQ0xVU0lWRSksbi5pc0ZyYXVkUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pJiYoZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5JTkNPTkNMVVNJVkUpKSxuLmlzQXV0aFJlc3VsdEluY29uY2x1c2l2ZShlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSYmbi5pc0ZyYXVkUmVzdWx0SW5jb25jbHVzaXZlKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pKXJldHVybiB0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZCBhKGUpO2lmKCFuLmlzQXV0aFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKSYmbi5pc0F1dGhFbmFibGVkKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pKXN3aXRjaChlLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uKXtjYXNlIHQuVm9pY2VJZEF1dGhlbnRpY2F0aW9uRGVjaXNpb24uQUNDRVBUOmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uQVVUSEVOVElDQVRFRDticmVhaztjYXNlIHQuVm9pY2VJZEF1dGhlbnRpY2F0aW9uRGVjaXNpb24uUkVKRUNUOmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uTk9UX0FVVEhFTlRJQ0FURUQ7YnJlYWs7Y2FzZSB0LlZvaWNlSWRBdXRoZW50aWNhdGlvbkRlY2lzaW9uLlNQRUFLRVJfT1BURURfT1VUOmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uT1BURURfT1VUO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbi5TUEVBS0VSX05PVF9FTlJPTExFRDplLkF1dGhlbnRpY2F0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dBdXRoZW50aWNhdGlvbkRlY2lzaW9uLk5PVF9FTlJPTExFRDticmVhaztkZWZhdWx0OmUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uRVJST1J9aWYoIW4uaXNGcmF1ZFJlc3VsdE5vdEVub3VnaFNwZWVjaChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSYmbi5pc0ZyYXVkRW5hYmxlZChlLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uKSlzd2l0Y2goZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbil7Y2FzZSB0LlZvaWNlSWRGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkhJR0hfUklTSzplLkZyYXVkRGV0ZWN0aW9uUmVzdWx0LkRlY2lzaW9uPXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLkhJR0hfUklTSzticmVhaztjYXNlIHQuVm9pY2VJZEZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uTE9XX1JJU0s6ZS5GcmF1ZERldGVjdGlvblJlc3VsdC5EZWNpc2lvbj10LkNvbnRhY3RGbG93RnJhdWREZXRlY3Rpb25EZWNpc2lvbi5MT1dfUklTSzticmVhaztkZWZhdWx0OmUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb249dC5Db250YWN0Rmxvd0ZyYXVkRGV0ZWN0aW9uRGVjaXNpb24uRVJST1J9aWYoIW4uaXNBdXRoUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuQXV0aGVudGljYXRpb25SZXN1bHQuRGVjaXNpb24pJiYhbi5pc0ZyYXVkUmVzdWx0Tm90RW5vdWdoU3BlZWNoKGUuRnJhdWREZXRlY3Rpb25SZXN1bHQuRGVjaXNpb24pKXJldHVybiB0LmdldExvZygpLmluZm8oImV2YWx1YXRlU3BlYWtlciBzdWNjZWVkZWQiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZCBhKGUpO3NldFRpbWVvdXQoYyx0LlZvaWNlSWRDb25zdGFudHMuRVZBTFVBVElPTl9QT0xMSU5HX0lOVEVSVkFMKX1lbHNle3QuZ2V0TG9nKCkuZXJyb3IoImV2YWx1YXRlU3BlYWtlciB0aW1lb3V0Iikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgcj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVWQUxVQVRFX1NQRUFLRVJfVElNRU9VVCwiZXZhbHVhdGVTcGVha2VyIHRpbWVvdXQiKTtzKHIpfX0sZmFpbHVyZTpmdW5jdGlvbihlKXt2YXIgbjtzd2l0Y2goSlNPTi5wYXJzZShlKS5zdGF0dXMpe2Nhc2UgNDAwOmNhc2UgNDA0Om49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5TRVNTSU9OX05PVF9FWElTVFMsImV2YWx1YXRlU3BlYWtlciBmYWlsZWQsIHNlc3Npb24gbm90IGV4aXN0cyIsZSksdC5nZXRMb2coKS5lcnJvcigiZXZhbHVhdGVTcGVha2VyIGZhaWxlZCwgc2Vzc2lvbiBub3QgZXhpc3RzIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2JyZWFrO2RlZmF1bHQ6bj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkVWQUxVQVRFX1NQRUFLRVJfRkFJTEVELCJldmFsdWF0ZVNwZWFrZXIgZmFpbGVkIixlKSx0LmdldExvZygpLmVycm9yKCJldmFsdWF0ZVNwZWFrZXIgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXMobil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3MoZSl9KSl9ZT9uLnN0YXJ0U2Vzc2lvbigpLnRoZW4oKGZ1bmN0aW9uKGUpe24uc3luY1NwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoYyx0LlZvaWNlSWRDb25zdGFudHMuRVZBTFVBVEVfU0VTU0lPTl9ERUxBWSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInN5bmNTcGVha2VySWQgZmFpbGVkIHdoZW4gc2Vzc2lvbiBzdGFydE5ldz10cnVlIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHMoZSl9KSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInN0YXJ0U2Vzc2lvbiBmYWlsZWQgd2hlbiBzZXNzaW9uIHN0YXJ0TmV3PXRydWUiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscyhlKX0pKTpuLnN5bmNTcGVha2VySWQoKS50aGVuKChmdW5jdGlvbigpe2MoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigic3luY1NwZWFrZXJJZCBmYWlsZWQgd2hlbiBzZXNzaW9uIHN0YXJ0TmV3PWZhbHNlIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHMoZSl9KSl9KSl9LGgucHJvdG90eXBlLmRlc2NyaWJlU2Vzc2lvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj10LmNvcmUuZ2V0Q2xpZW50KCkscj10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGkpe2UuZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihlKXt2YXIgYT17U2Vzc2lvbk5hbWVPcklkOnIuaW5pdGlhbENvbnRhY3RJZHx8dGhpcy5jb250YWN0SWQsRG9tYWluSWQ6ZX07dC5nZXRMb2coKS5pbmZvKCJkZXNjcmliZVNlc3Npb24gY2FsbGVkIikud2l0aE9iamVjdChhKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5ERVNDUklCRV9TRVNTSU9OLGEse3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7byhlKX0sZmFpbHVyZTpmdW5jdGlvbihlKXt0LmdldExvZygpLmVycm9yKCJkZXNjcmliZVNlc3Npb24gZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuREVTQ1JJQkVfU0VTU0lPTl9GQUlMRUQsImRlc2NyaWJlU2Vzc2lvbiBmYWlsZWQiLGUpO2kobil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2koZSl9KSl9KSl9LGgucHJvdG90eXBlLmNoZWNrRW5yb2xsbWVudFN0YXR1cz1mdW5jdGlvbihlKXt0LmdldExvZygpLmluZm8oImNoZWNrRW5yb2xsbWVudFN0YXR1cyBjYWxsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBuPXRoaXMscj0wLG89ITE7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihpLGEpeyFmdW5jdGlvbiBzKCl7aWYoKytyPHQuVm9pY2VJZENvbnN0YW50cy5FTlJPTExNRU5UX01BWF9QT0xMX1RJTUVTKW4uZGVzY3JpYmVTZXNzaW9uKCkudGhlbigoZnVuY3Rpb24ocil7c3dpdGNoKHIuU2Vzc2lvbi5FbnJvbGxtZW50UmVxdWVzdERldGFpbHMuU3RhdHVzKXtjYXNlIHQuVm9pY2VJZEVucm9sbG1lbnRSZXF1ZXN0U3RhdHVzLkNPTVBMRVRFRDppKHIpO2JyZWFrO2Nhc2UgdC5Wb2ljZUlkRW5yb2xsbWVudFJlcXVlc3RTdGF0dXMuSU5fUFJPR1JFU1M6b3x8ImZ1bmN0aW9uIiE9dHlwZW9mIGV8fChlKHIpLG89ITApLHNldFRpbWVvdXQocyx0LlZvaWNlSWRDb25zdGFudHMuRU5ST0xMTUVOVF9QT0xMSU5HX0lOVEVSVkFMKTticmVhaztjYXNlIHQuVm9pY2VJZEVucm9sbG1lbnRSZXF1ZXN0U3RhdHVzLk5PVF9FTk9VR0hfU1BFRUNIOnIuU2Vzc2lvbi5TdHJlYW1pbmdTdGF0dXMhPT10LlZvaWNlSWRTdHJlYW1pbmdTdGF0dXMuRU5ERUQ/c2V0VGltZW91dChzLHQuVm9pY2VJZENvbnN0YW50cy5FTlJPTExNRU5UX1BPTExJTkdfSU5URVJWQUwpOnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bi5zdGFydFNlc3Npb24oKS50aGVuKChmdW5jdGlvbihlKXtzKCl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUsdCl7YShlKX0pKX0pLHQuVm9pY2VJZENvbnN0YW50cy5TVEFSVF9TRVNTSU9OX0RFTEFZKTticmVhaztkZWZhdWx0OnZhciBjPXIuU2Vzc2lvbi5FbnJvbGxtZW50UmVxdWVzdERldGFpbHMuTWVzc2FnZT9yLlNlc3Npb24uRW5yb2xsbWVudFJlcXVlc3REZXRhaWxzLk1lc3NhZ2U6ImVucm9sbFNwZWFrZXIgZmFpbGVkLiBVbmtub3duIGVucm9sbG1lbnQgc3RhdHVzIGhhcyBiZWVuIHJlY2VpdmVkIjt0LmdldExvZygpLmVycm9yKGMpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHU9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FTlJPTExfU1BFQUtFUl9GQUlMRUQsYyxyLlNlc3Npb24uRW5yb2xsbWVudFJlcXVlc3REZXRhaWxzLlN0YXR1cyk7YSh1KX19KSk7ZWxzZXt0LmdldExvZygpLmVycm9yKCJlbnJvbGxTcGVha2VyIHRpbWVvdXQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBjPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuRU5ST0xMX1NQRUFLRVJfVElNRU9VVCwiZW5yb2xsU3BlYWtlciB0aW1lb3V0Iik7YShjKX19KCl9KSl9LGgucHJvdG90eXBlLmVucm9sbFNwZWFrZXI9ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJlbnJvbGxTcGVha2VyIGNhbGxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dGhpcztyZXR1cm4gbi5jaGVja0NvbmZlcmVuY2VDYWxsKCksbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7bi5zeW5jU3BlYWtlcklkKCkudGhlbigoZnVuY3Rpb24oKXtuLmdldFNwZWFrZXJTdGF0dXMoKS50aGVuKChmdW5jdGlvbihpKXtpLlNwZWFrZXImJmkuU3BlYWtlci5TdGF0dXM9PXQuVm9pY2VJZFNwZWFrZXJTdGF0dXMuT1BURURfT1VUP24uZGVsZXRlU3BlYWtlcigpLnRoZW4oKGZ1bmN0aW9uKCl7bi5lbnJvbGxTcGVha2VySGVscGVyKHIsbyxlKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7byhlKX0pKTpuLmVucm9sbFNwZWFrZXJIZWxwZXIocixvLGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtvKGUpfSkpfSkpfSxoLnByb3RvdHlwZS5lbnJvbGxTcGVha2VySGVscGVyPWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLGk9dC5jb3JlLmdldENsaWVudCgpLGE9dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpO28uZ2V0RG9tYWluSWQoKS50aGVuKChmdW5jdGlvbihzKXt2YXIgYz17U2Vzc2lvbk5hbWVPcklkOmEuaW5pdGlhbENvbnRhY3RJZHx8dGhpcy5jb250YWN0SWQsRG9tYWluSWQ6c307dC5nZXRMb2coKS5pbmZvKCJlbnJvbGxTcGVha2VySGVscGVyIGNhbGxlZCIpLndpdGhPYmplY3QoYykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmNhbGwodC5BZ2VudEFwcENsaWVudE1ldGhvZHMuRU5ST0xMX0JZX1NFU1NJT04sYyx7c3VjY2VzczpmdW5jdGlvbihpKXtpLlN0YXR1cz09PXQuVm9pY2VJZEVucm9sbG1lbnRSZXF1ZXN0U3RhdHVzLkNPTVBMRVRFRD8odC5nZXRMb2coKS5pbmZvKCJlbnJvbGxTcGVha2VyIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoaSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlKGkpKTpvLmNoZWNrRW5yb2xsbWVudFN0YXR1cyhyKS50aGVuKChmdW5jdGlvbihuKXt0LmdldExvZygpLmluZm8oImVucm9sbFNwZWFrZXIgc3VjY2VlZGVkIikud2l0aE9iamVjdChuKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUobil9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe24oZSl9KSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5lcnJvcigiZW5yb2xsU3BlYWtlciBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHI9dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5FTlJPTExfU1BFQUtFUl9GQUlMRUQsImVucm9sbFNwZWFrZXIgZmFpbGVkIixlKTtuKHIpfX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtuKGUpfSkpfSxoLnByb3RvdHlwZS5fdXBkYXRlU3BlYWtlcklkSW5MY21zPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcyxvPXQuY29yZS5nZXRDbGllbnQoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKGksYSl7dmFyIHM9e0NvbnRhY3RJZDpyLmNvbnRhY3RJZCxJbnN0YW5jZUlkOnQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEluc3RhbmNlSWQoKSxBV1NBY2NvdW50SWQ6dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QVdTQWNjb3VudElkKCksQ3VzdG9tZXJJZDp0LmFzc2VydE5vdE51bGwoZSwic3BlYWtlcklkIiksVm9pY2VJZFJlc3VsdDp7Z2VuZXJhdGVkU3BlYWtlcklkOm59fTt0LmdldExvZygpLmluZm8oIl91cGRhdGVTcGVha2VySWRJbkxjbXMgY2FsbGVkIikud2l0aE9iamVjdChzKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG8uY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5VUERBVEVfVk9JQ0VfSURfREFUQSxzLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygidXBkYXRlU3BlYWtlcklkSW5MY21zIHN1Y2NlZWRlZCIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpKGUpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoInVwZGF0ZVNwZWFrZXJJZEluTGNtcyBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5Wb2ljZUlkRXJyb3IodC5Wb2ljZUlkRXJyb3JUeXBlcy5VUERBVEVfU1BFQUtFUl9JRF9JTl9MQ01TX0ZBSUxFRCwidXBkYXRlU3BlYWtlcklkSW5MY21zIGZhaWxlZCIsZSk7YShuKX19KX0pKX0saC5wcm90b3R5cGUudXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7bi5jaGVja0NvbmZlcmVuY2VDYWxsKCk7dmFyIHI9dC5jb3JlLmdldENsaWVudCgpLG89dC5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0Q29udGFjdERhdGEodGhpcy5jb250YWN0SWQpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxhKXtuLmdldERvbWFpbklkKCkudGhlbigoZnVuY3Rpb24ocyl7dmFyIGM9e1Nlc3Npb25OYW1lT3JJZDpvLmluaXRpYWxDb250YWN0SWR8fHRoaXMuY29udGFjdElkLFNwZWFrZXJJZDp0LmFzc2VydE5vdE51bGwoZSwic3BlYWtlcklkIiksRG9tYWluSWQ6c307dC5nZXRMb2coKS5pbmZvKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgY2FsbGVkIikud2l0aE9iamVjdChjKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5VUERBVEVfU0VTU0lPTixjLHtzdWNjZXNzOmZ1bmN0aW9uKHIpe3QuZ2V0TG9nKCkuaW5mbygidXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkIHN1Y2NlZWRlZCIpLndpdGhPYmplY3Qocikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgbz1yJiZyLlNlc3Npb24mJnIuU2Vzc2lvbi5HZW5lcmF0ZWRTcGVha2VySWQ7bi5fdXBkYXRlU3BlYWtlcklkSW5MY21zKGUsbykudGhlbigoZnVuY3Rpb24oKXtpKHIpfSkpLmNhdGNoKChmdW5jdGlvbihlKXthKGUpfSkpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3ZhciBuO3N3aXRjaChKU09OLnBhcnNlKGUpLnN0YXR1cyl7Y2FzZSA0MDA6Y2FzZSA0MDQ6bj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLlNFU1NJT05fTk9UX0VYSVNUUywidXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkIGZhaWxlZCwgc2Vzc2lvbiBub3QgZXhpc3RzIixlKSx0LmdldExvZygpLmVycm9yKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkLCBzZXNzaW9uIG5vdCBleGlzdHMiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7YnJlYWs7ZGVmYXVsdDpuPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuVVBEQVRFX1NQRUFLRVJfSURfRkFJTEVELCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkIixlKSx0LmdldExvZygpLmVycm9yKCJ1cGRhdGVTcGVha2VySWRJblZvaWNlSWQgZmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWEobil9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2EoZSl9KSl9KSl9LGgucHJvdG90eXBlLnN5bmNTcGVha2VySWQ9ZnVuY3Rpb24oKXt0LmdldExvZygpLmluZm8oInN5bmNTcGVha2VySWQgY2FsbGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgZT10aGlzO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24odCxuKXtlLmdldFNwZWFrZXJJZCgpLnRoZW4oKGZ1bmN0aW9uKHIpe2UudXBkYXRlU3BlYWtlcklkSW5Wb2ljZUlkKHIuc3BlYWtlcklkKS50aGVuKChmdW5jdGlvbihlKXt0KGUpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtuKGUpfSkpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtuKGUpfSkpfSkpfSxoLnByb3RvdHlwZS5nZXREb21haW5JZD1mdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxuKXtpZigobmV3IHQuQWdlbnQpLmdldFBlcm1pc3Npb25zKCkuaW5jbHVkZXModC5BZ2VudFBlcm1pc3Npb25zLlZPSUNFX0lEKSlpZih0LmNvcmUudm9pY2VJZERvbWFpbklkKWUodC5jb3JlLnZvaWNlSWREb21haW5JZCk7ZWxzZXt2YXIgcj10LmNvcmUuZ2V0Q2xpZW50KCksbz17SW5zdGFuY2VJZDp0LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRJbnN0YW5jZUlkKCksSW50ZWdyYXRpb25UeXBlOiJWT0lDRV9JRCJ9O3QuZ2V0TG9nKCkuaW5mbygiZ2V0RG9tYWluSWQgY2FsbGVkIikud2l0aE9iamVjdChvKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuY2FsbCh0LkFnZW50QXBwQ2xpZW50TWV0aG9kcy5MSVNUX0lOVEVHUkFUSU9OX0FTU09DSUFUSU9OUyxvLHtzdWNjZXNzOmZ1bmN0aW9uKHIpe3RyeXt2YXIgbztpZihyLkludGVncmF0aW9uQXNzb2NpYXRpb25TdW1tYXJ5TGlzdC5sZW5ndGg+PTEmJihvPXIuSW50ZWdyYXRpb25Bc3NvY2lhdGlvblN1bW1hcnlMaXN0WzBdLkludGVncmF0aW9uQXJuLnJlcGxhY2UoL14uKmRvbWFpblwvL2ksIiIpKSwhbyl7dC5nZXRMb2coKS5pbmZvKCJnZXREb21haW5JZDogbm8gZG9tYWluSWQgZm91bmQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBpPXQuVm9pY2VJZEVycm9yKHQuVm9pY2VJZEVycm9yVHlwZXMuTk9fRE9NQUlOX0lEX0ZPVU5EKTtyZXR1cm4gdm9pZCBuKGkpfXQuZ2V0TG9nKCkuaW5mbygiZ2V0RG9tYWluSWQgc3VjY2VlZGVkIikud2l0aE9iamVjdChyKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnQuVm9pY2VJZEV2ZW50cy5VUERBVEVfRE9NQUlOX0lELGRhdGE6e2RvbWFpbklkOm99fSksZShvKX1jYXRjaChlKXt0LmdldExvZygpLmVycm9yKCJnZXREb21haW5JZCBmYWlsZWQiKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaT10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkdFVF9ET01BSU5fSURfRkFJTEVELCJnZXREb21haW5JZCBmYWlsZWQiLGUpLG4oaSl9fSxmYWlsdXJlOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZXJyb3IoImdldERvbWFpbklkIGZhaWxlZCIpLndpdGhPYmplY3Qoe2VycjplfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt2YXIgcj10LlZvaWNlSWRFcnJvcih0LlZvaWNlSWRFcnJvclR5cGVzLkdFVF9ET01BSU5fSURfRkFJTEVELCJnZXREb21haW5JZCBmYWlsZWQiLGUpO24ocil9fSl9ZWxzZSBuKG5ldyBFcnJvcigiQWdlbnQgZG9lc24ndCBoYXZlIHRoZSBwZXJtaXNzaW9uIGZvciBWb2ljZSBJRCIpKX0pKX0saC5wcm90b3R5cGUuY2hlY2tDb25mZXJlbmNlQ2FsbD1mdW5jdGlvbigpe2lmKHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKS5jb25uZWN0aW9ucy5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiB0LmNvbnRhaW5zKHQuQ09OTkVDVElPTl9BQ1RJVkVfU1RBVEVTLGUuc3RhdGUudHlwZSl9KSkubGVuZ3RoPjIpdGhyb3cgbmV3IHQuTm90SW1wbGVtZW50ZWRFcnJvcigiVm9pY2VJZCBpcyBub3Qgc3VwcG9ydGVkIGZvciBjb25mZXJlbmNlIGNhbGxzIil9LGgucHJvdG90eXBlLmlzQXV0aEVuYWJsZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUhPT10LkNvbnRhY3RGbG93QXV0aGVudGljYXRpb25EZWNpc2lvbi5OT1RfRU5BQkxFRH0saC5wcm90b3R5cGUuaXNBdXRoUmVzdWx0Tm90RW5vdWdoU3BlZWNoPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Wb2ljZUlkQXV0aGVudGljYXRpb25EZWNpc2lvbi5OT1RfRU5PVUdIX1NQRUVDSH0saC5wcm90b3R5cGUuaXNBdXRoUmVzdWx0SW5jb25jbHVzaXZlPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Db250YWN0Rmxvd0F1dGhlbnRpY2F0aW9uRGVjaXNpb24uSU5DT05DTFVTSVZFfSxoLnByb3RvdHlwZS5pc0ZyYXVkRW5hYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gZSE9PXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLk5PVF9FTkFCTEVEfSxoLnByb3RvdHlwZS5pc0ZyYXVkUmVzdWx0Tm90RW5vdWdoU3BlZWNoPWZ1bmN0aW9uKGUpe3JldHVybiBlPT09dC5Wb2ljZUlkRnJhdWREZXRlY3Rpb25EZWNpc2lvbi5OT1RfRU5PVUdIX1NQRUVDSH0saC5wcm90b3R5cGUuaXNGcmF1ZFJlc3VsdEluY29uY2x1c2l2ZT1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXQuQ29udGFjdEZsb3dGcmF1ZERldGVjdGlvbkRlY2lzaW9uLklOQ09OQ0xVU0lWRX07dmFyIGc9ZnVuY3Rpb24oZSx0KXt0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvcj1uZXcgaChlKSxmLmNhbGwodGhpcyxlLHQpfTsoZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShmLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWcsZy5wcm90b3R5cGUuZ2V0U29mdHBob25lTWVkaWFJbmZvPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5zb2Z0cGhvbmVNZWRpYUluZm99LGcucHJvdG90eXBlLmdldE1lZGlhSW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkuc29mdHBob25lTWVkaWFJbmZvfSxnLnByb3RvdHlwZS5nZXRNZWRpYVR5cGU9ZnVuY3Rpb24oKXtyZXR1cm4gdC5NZWRpYVR5cGUuU09GVFBIT05FfSxnLnByb3RvdHlwZS5nZXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLm1lZGlhRmFjdG9yeS5nZXQodGhpcyl9LGcucHJvdG90eXBlLmdldFZvaWNlSWRTcGVha2VySWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3IuZ2V0U3BlYWtlcklkKCl9LGcucHJvdG90eXBlLmdldFZvaWNlSWRTcGVha2VyU3RhdHVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmdldFNwZWFrZXJTdGF0dXMoKX0sZy5wcm90b3R5cGUub3B0T3V0Vm9pY2VJZFNwZWFrZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc3BlYWtlckF1dGhlbnRpY2F0b3Iub3B0T3V0U3BlYWtlcigpfSxnLnByb3RvdHlwZS5kZWxldGVWb2ljZUlkU3BlYWtlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5kZWxldGVTcGVha2VyKCl9LGcucHJvdG90eXBlLmV2YWx1YXRlU3BlYWtlcldpdGhWb2ljZUlkPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9zcGVha2VyQXV0aGVudGljYXRvci5ldmFsdWF0ZVNwZWFrZXIoZSl9LGcucHJvdG90eXBlLmVucm9sbFNwZWFrZXJJblZvaWNlSWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLmVucm9sbFNwZWFrZXIoZSl9LGcucHJvdG90eXBlLnVwZGF0ZVZvaWNlSWRTcGVha2VySWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX3NwZWFrZXJBdXRoZW50aWNhdG9yLnVwZGF0ZVNwZWFrZXJJZEluVm9pY2VJZChlKX0sZy5wcm90b3R5cGUuZ2V0UXVpY2tDb25uZWN0TmFtZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkucXVpY2tDb25uZWN0TmFtZX0sZy5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5TSUxFTlRfTU9OSVRPUn0sZy5wcm90b3R5cGUuaXNCYXJnZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldE1vbml0b3JTdGF0dXMoKT09PXQuTW9uaXRvcmluZ01vZGUuQkFSR0V9LGcucHJvdG90eXBlLmlzQmFyZ2VFbmFibGVkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5nZXRNb25pdG9yQ2FwYWJpbGl0aWVzKCk7cmV0dXJuIGUmJmUuaW5jbHVkZXModC5Nb25pdG9yaW5nTW9kZS5CQVJHRSl9LGcucHJvdG90eXBlLmlzU2lsZW50TW9uaXRvckVuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldE1vbml0b3JDYXBhYmlsaXRpZXMoKTtyZXR1cm4gZSYmZS5pbmNsdWRlcyh0Lk1vbml0b3JpbmdNb2RlLlNJTEVOVF9NT05JVE9SKX0sZy5wcm90b3R5cGUuZ2V0TW9uaXRvckNhcGFiaWxpdGllcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvckNhcGFiaWxpdGllc30sZy5wcm90b3R5cGUuZ2V0TW9uaXRvclN0YXR1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvclN0YXR1c30sZy5wcm90b3R5cGUuaXNNdXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tdXRlfSxnLnByb3RvdHlwZS5pc0ZvcmNlZE11dGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0RGF0YSgpLmZvcmNlZE11dGV9LGcucHJvdG90eXBlLm11dGVQYXJ0aWNpcGFudD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuTVVURV9QQVJUSUNJUEFOVCx7Y29udGFjdElkOnRoaXMuZ2V0Q29udGFjdElkKCksY29ubmVjdGlvbklkOnRoaXMuZ2V0Q29ubmVjdGlvbklkKCl9LGUpfSxnLnByb3RvdHlwZS51bm11dGVQYXJ0aWNpcGFudD1mdW5jdGlvbihlKXt0LmNvcmUuZ2V0Q2xpZW50KCkuY2FsbCh0LkNsaWVudE1ldGhvZHMuVU5NVVRFX1BBUlRJQ0lQQU5ULHtjb250YWN0SWQ6dGhpcy5nZXRDb250YWN0SWQoKSxjb25uZWN0aW9uSWQ6dGhpcy5nZXRDb25uZWN0aW9uSWQoKX0sZSl9LGcucHJvdG90eXBlLmNhblNlbmRWaWRlbz1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0Q2FwYWJpbGl0aWVzKCk7cmV0dXJuIGUmJmUuVmlkZW89PT10LlZpZGVvQ2FwYWJpbGl0eS5TRU5EfSxnLnByb3RvdHlwZS5jYW5TZW5kU2NyZWVuU2hhcmU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldENhcGFiaWxpdGllcygpO3JldHVybiBlJiZlLlNjcmVlblNoYXJlPT09dC5TY3JlZW5TaGFyZUNhcGFiaWxpdHkuU0VORH0sZy5wcm90b3R5cGUuZ2V0Q2FwYWJpbGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5jYXBhYmlsaXRpZXN9LGcucHJvdG90eXBlLmdldFZpZGVvQ29ubmVjdGlvbkluZm89ZnVuY3Rpb24oKXt2YXIgZT10LmNvcmUuZ2V0Q2xpZW50KCksbj17dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5XRUJfUlRDLGNvbnRhY3RJZDp0aGlzLmNvbnRhY3RJZH07cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCxuLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZ2V0VmlkZW9Db25uZWN0aW9uSW5mbyBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoZS53ZWJSVENUcmFuc3BvcnQpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiZ2V0VmlkZW9Db25uZWN0aW9uSW5mbyBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pLG8oRXJyb3IoImdldFZpZGVvQ29ubmVjdGlvbkluZm8gZmFpbGVkIikpfX0pfSkpfTt2YXIgbT1mdW5jdGlvbihlLHQpe2YuY2FsbCh0aGlzLGUsdCl9OyhtLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGYucHJvdG90eXBlKSkuY29uc3RydWN0b3I9bSxtLnByb3RvdHlwZS5nZXRNZWRpYUluZm89ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9nZXREYXRhKCkuY2hhdE1lZGlhSW5mbztpZihlKXt2YXIgbj10LmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS5nZXRDb250YWN0RGF0YSh0aGlzLmNvbnRhY3RJZCkscj17Y29udGFjdElkOnRoaXMuY29udGFjdElkLGluaXRpYWxDb250YWN0SWQ6bi5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZCxwYXJ0aWNpcGFudElkOnRoaXMuY29ubmVjdGlvbklkLGdldENvbm5lY3Rpb25Ub2tlbjp0LmhpdGNoKHRoaXMsdGhpcy5nZXRDb25uZWN0aW9uVG9rZW4pfTtpZihlLmNvbm5lY3Rpb25EYXRhKXRyeXtyLnBhcnRpY2lwYW50VG9rZW49SlNPTi5wYXJzZShlLmNvbm5lY3Rpb25EYXRhKS5Db25uZWN0aW9uQXV0aGVudGljYXRpb25Ub2tlbn1jYXRjaChuKXt0LmdldExvZygpLmVycm9yKHQuTG9nQ29tcG9uZW50LkNIQVQsIkNvbm5lY3Rpb24gZGF0YSBpcyBpbnZhbGlkIikud2l0aE9iamVjdChlKS53aXRoRXhjZXB0aW9uKG4pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5wYXJ0aWNpcGFudFRva2VuPW51bGx9cmV0dXJuIHIucGFydGljaXBhbnRUb2tlbj1yLnBhcnRpY2lwYW50VG9rZW58fG51bGwsci5vcmlnaW5hbEluZm89dGhpcy5fZ2V0RGF0YSgpLmNoYXRNZWRpYUluZm8scn1yZXR1cm4gbnVsbH0sbS5wcm90b3R5cGUuZ2V0Q29ubmVjdGlvblRva2VuPWZ1bmN0aW9uKCl7dmFyIGU9dC5jb3JlLmdldENsaWVudCgpLG49KHQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKSx7dHJhbnNwb3J0VHlwZTp0LlRSQU5TUE9SVF9UWVBFUy5DSEFUX1RPS0VOLHBhcnRpY2lwYW50SWQ6dGhpcy5jb25uZWN0aW9uSWQsY29udGFjdElkOnRoaXMuY29udGFjdElkfSk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8pe2UuY2FsbCh0LkNsaWVudE1ldGhvZHMuQ1JFQVRFX1RSQU5TUE9SVCxuLHtzdWNjZXNzOmZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuaW5mbygiZ2V0Q29ubmVjdGlvblRva2VuIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoImdldENvbm5lY3Rpb25Ub2tlbiBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pLG8oRXJyb3IoImdldENvbm5lY3Rpb25Ub2tlbiBmYWlsZWQiKSl9fSl9KSl9LG0ucHJvdG90eXBlLmdldE1lZGlhVHlwZT1mdW5jdGlvbigpe3JldHVybiB0Lk1lZGlhVHlwZS5DSEFUfSxtLnByb3RvdHlwZS5nZXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdC5jb3JlLm1lZGlhRmFjdG9yeS5nZXQodGhpcyl9LG0ucHJvdG90eXBlLl9pbml0TWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKCl7dGhpcy5faXNBZ2VudENvbm5lY3Rpb25UeXBlKCkmJnQuY29yZS5tZWRpYUZhY3RvcnkuZ2V0KHRoaXMpLmNhdGNoKChmdW5jdGlvbigpe30pKX0sbS5wcm90b3R5cGUuaXNCYXJnZUVuYWJsZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmdldE1vbml0b3JDYXBhYmlsaXRpZXMoKTtyZXR1cm4gZSYmZS5pbmNsdWRlcyh0Lk1vbml0b3JpbmdNb2RlLkJBUkdFKX0sbS5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yRW5hYmxlZD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuZ2V0TW9uaXRvckNhcGFiaWxpdGllcygpO3JldHVybiBlJiZlLmluY2x1ZGVzKHQuTW9uaXRvcmluZ01vZGUuU0lMRU5UX01PTklUT1IpfSxtLnByb3RvdHlwZS5nZXRNb25pdG9yQ2FwYWJpbGl0aWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldERhdGEoKS5tb25pdG9yQ2FwYWJpbGl0aWVzfSxtLnByb3RvdHlwZS5pc0JhcmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5CQVJHRX0sbS5wcm90b3R5cGUuaXNTaWxlbnRNb25pdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TW9uaXRvclN0YXR1cygpPT09dC5Nb25pdG9yaW5nTW9kZS5TSUxFTlRfTU9OSVRPUn0sbS5wcm90b3R5cGUuZ2V0TW9uaXRvclN0YXR1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXREYXRhKCkubW9uaXRvclN0YXR1c307dmFyIHY9ZnVuY3Rpb24oZSx0KXtmLmNhbGwodGhpcyxlLHQpfTsodi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShmLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXYsdi5wcm90b3R5cGUuZ2V0TWVkaWFUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHQuTWVkaWFUeXBlLlRBU0t9LHYucHJvdG90eXBlLmdldE1lZGlhSW5mbz1mdW5jdGlvbigpe3ZhciBlPXQuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldENvbnRhY3REYXRhKHRoaXMuY29udGFjdElkKTtyZXR1cm57Y29udGFjdElkOnRoaXMuY29udGFjdElkLGluaXRpYWxDb250YWN0SWQ6ZS5pbml0aWFsQ29udGFjdElkfHx0aGlzLmNvbnRhY3RJZH19LHYucHJvdG90eXBlLmdldE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbigpe3JldHVybiB0LmNvcmUubWVkaWFGYWN0b3J5LmdldCh0aGlzKX07dmFyIHk9ZnVuY3Rpb24oZSl7dC5Db25uZWN0aW9uLmNhbGwodGhpcyxlLmNvbnRhY3RJZCxlLmNvbm5lY3Rpb25JZCksdGhpcy5jb25uZWN0aW9uRGF0YT1lfTsoeS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShmLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXkseS5wcm90b3R5cGUuX2dldERhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25uZWN0aW9uRGF0YX0seS5wcm90b3R5cGUuX2luaXRNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oKXt9O3ZhciBiPWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9O3RoaXMuZW5kcG9pbnRBUk49dC5lbmRwb2ludElkfHx0LmVuZHBvaW50QVJOfHxudWxsLHRoaXMuZW5kcG9pbnRJZD10aGlzLmVuZHBvaW50QVJOLHRoaXMudHlwZT10LnR5cGV8fG51bGwsdGhpcy5uYW1lPXQubmFtZXx8bnVsbCx0aGlzLnBob25lTnVtYmVyPXQucGhvbmVOdW1iZXJ8fG51bGwsdGhpcy5hZ2VudExvZ2luPXQuYWdlbnRMb2dpbnx8bnVsbCx0aGlzLnF1ZXVlPXQucXVldWV8fG51bGx9O2IucHJvdG90eXBlLnN0cmlwUGhvbmVOdW1iZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5waG9uZU51bWJlcj90aGlzLnBob25lTnVtYmVyLnJlcGxhY2UoL3NpcDooW15AXSopQC4qLywiJDEiKToiIn0sYi5ieVBob25lTnVtYmVyPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyBiKHt0eXBlOnQuRW5kcG9pbnRUeXBlLlBIT05FX05VTUJFUixwaG9uZU51bWJlcjplLG5hbWU6bnx8bnVsbH0pfTt2YXIgRT1mdW5jdGlvbihlLHQsbil7dGhpcy5lcnJvclR5cGU9ZSx0aGlzLmVycm9yTWVzc2FnZT10LHRoaXMuZW5kUG9pbnRVcmw9bn07RS5wcm90b3R5cGUuZ2V0RXJyb3JUeXBlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXJyb3JUeXBlfSxFLnByb3RvdHlwZS5nZXRFcnJvck1lc3NhZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcnJvck1lc3NhZ2V9LEUucHJvdG90eXBlLmdldEVuZFBvaW50VXJsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW5kUG9pbnRVcmx9LHQuYWdlbnQ9ZnVuY3Rpb24oZSl7dmFyIG49dC5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHQuQWdlbnRFdmVudHMuSU5JVCxlKTtyZXR1cm4gdC5hZ2VudC5pbml0aWFsaXplZCYmZShuZXcgdC5BZ2VudCksbn0sdC5hZ2VudC5pbml0aWFsaXplZD0hMSx0LmNvbnRhY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LkNvbnRhY3RFdmVudHMuSU5JVCxlKX0sdC5vbldlYnNvY2tldEluaXRGYWlsdXJlPWZ1bmN0aW9uKGUpe3ZhciBuPXQuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZSh0LldlYlNvY2tldEV2ZW50cy5JTklUX0ZBSUxVUkUsZSk7cmV0dXJuIHQud2ViU29ja2V0SW5pdEZhaWxlZCYmZSgpLG59LHQuaWZNYXN0ZXI9ZnVuY3Rpb24oZSxuLHIsbyl7aWYodC5hc3NlcnROb3ROdWxsKGUsIkEgdG9waWMgbXVzdCBiZSBwcm92aWRlZC4iKSx0LmFzc2VydE5vdE51bGwobiwiQSB0cnVlIGNhbGxiYWNrIG11c3QgYmUgcHJvdmlkZWQuIiksIXQuY29yZS5tYXN0ZXJDbGllbnQpcmV0dXJuIHQuZ2V0TG9nKCkud2FybigiV2UgY2FuJ3QgYmUgdGhlIG1hc3RlciBmb3IgdG9waWMgJyVzJyBiZWNhdXNlIHRoZXJlIGlzIG5vIG1hc3RlciBjbGllbnQhIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHZvaWQociYmcigpKTt0LmNvcmUuZ2V0TWFzdGVyQ2xpZW50KCkuY2FsbCh0Lk1hc3Rlck1ldGhvZHMuQ0hFQ0tfTUFTVEVSLHt0b3BpYzplLHNob3VsZE5vdEJlY29tZU1hc3RlcklmTm9uZTpvfSx7c3VjY2VzczpmdW5jdGlvbihlKXtlLmlzTWFzdGVyP24oKTpyJiZyKCl9fSl9LHQuYmVjb21lTWFzdGVyPWZ1bmN0aW9uKGUsbixyKXt0LmFzc2VydE5vdE51bGwoZSwiQSB0b3BpYyBtdXN0IGJlIHByb3ZpZGVkLiIpLHQuY29yZS5tYXN0ZXJDbGllbnQ/dC5jb3JlLmdldE1hc3RlckNsaWVudCgpLmNhbGwodC5NYXN0ZXJNZXRob2RzLkJFQ09NRV9NQVNURVIse3RvcGljOmV9LHtzdWNjZXNzOmZ1bmN0aW9uKCl7biYmbigpfX0pOih0LmdldExvZygpLndhcm4oIldlIGNhbid0IGJlIHRoZSBtYXN0ZXIgZm9yIHRvcGljICclcycgYmVjYXVzZSB0aGVyZSBpcyBubyBtYXN0ZXIgY2xpZW50ISIsZSksciYmcigpKX0sdC5BZ2VudD1zLHQuQWdlbnRTbmFwc2hvdD1jLHQuQ29udGFjdD1wLHQuQ29udGFjdFNuYXBzaG90PWQsdC5Db25uZWN0aW9uPWcsdC5CYXNlQ29ubmVjdGlvbj1mLHQuVm9pY2VDb25uZWN0aW9uPWcsdC5DaGF0Q29ubmVjdGlvbj1tLHQuVGFza0Nvbm5lY3Rpb249dix0LkNvbm5lY3Rpb25TbmFwc2hvdD15LHQuRW5kcG9pbnQ9Yix0LkFkZHJlc3M9Yix0LlNvZnRwaG9uZUVycm9yPUUsdC5Wb2ljZUlkPWgsdC5RdWlja1Jlc3BvbnNlcz1vfSgpfSw1Mzg6KGUsdCxuKT0+e3ZhciByO2Z1bmN0aW9uIG8oZSl7cmV0dXJuIG89ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9LG8oZSl9IWZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIG8oYSxzKXtpZighblthXSl7aWYoIXRbYV0pe2lmKGkpcmV0dXJuIGkoYSwhMCk7dmFyIGM9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrYSsiJyIpO3Rocm93IGMuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsY312YXIgdT1uW2FdPXtleHBvcnRzOnt9fTt0W2FdWzBdLmNhbGwodS5leHBvcnRzLChmdW5jdGlvbihlKXtyZXR1cm4gbyh0W2FdWzFdW2VdfHxlKX0pLHUsdS5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW2FdLmV4cG9ydHN9Zm9yKHZhciBpPXZvaWQgMCxhPTA7YTxyLmxlbmd0aDthKyspbyhyW2FdKTtyZXR1cm4gb30oezE6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3ZlcnNpb246IjIuMCIsbWV0YWRhdGE6e2FwaVZlcnNpb246IjIwMTQtMDYtMzAiLGVuZHBvaW50UHJlZml4OiJjb2duaXRvLWlkZW50aXR5Iixqc29uVmVyc2lvbjoiMS4xIixwcm90b2NvbDoianNvbiIsc2VydmljZUZ1bGxOYW1lOiJBbWF6b24gQ29nbml0byBJZGVudGl0eSIsc2VydmljZUlkOiJDb2duaXRvIElkZW50aXR5IixzaWduYXR1cmVWZXJzaW9uOiJ2NCIsdGFyZ2V0UHJlZml4OiJBV1NDb2duaXRvSWRlbnRpdHlTZXJ2aWNlIix1aWQ6ImNvZ25pdG8taWRlbnRpdHktMjAxNC0wNi0zMCJ9LG9wZXJhdGlvbnM6e0NyZWF0ZUlkZW50aXR5UG9vbDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xOYW1lIiwiQWxsb3dVbmF1dGhlbnRpY2F0ZWRJZGVudGl0aWVzIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sTmFtZTp7fSxBbGxvd1VuYXV0aGVudGljYXRlZElkZW50aXRpZXM6e3R5cGU6ImJvb2xlYW4ifSxBbGxvd0NsYXNzaWNGbG93Ont0eXBlOiJib29sZWFuIn0sU3VwcG9ydGVkTG9naW5Qcm92aWRlcnM6e3NoYXBlOiJTNSJ9LERldmVsb3BlclByb3ZpZGVyTmFtZTp7fSxPcGVuSWRDb25uZWN0UHJvdmlkZXJBUk5zOntzaGFwZToiUzkifSxDb2duaXRvSWRlbnRpdHlQcm92aWRlcnM6e3NoYXBlOiJTYiJ9LFNhbWxQcm92aWRlckFSTnM6e3NoYXBlOiJTZyJ9LElkZW50aXR5UG9vbFRhZ3M6e3NoYXBlOiJTaCJ9fX0sb3V0cHV0OntzaGFwZToiU2sifX0sRGVsZXRlSWRlbnRpdGllczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkc1RvRGVsZXRlIl0sbWVtYmVyczp7SWRlbnRpdHlJZHNUb0RlbGV0ZTp7dHlwZToibGlzdCIsbWVtYmVyOnt9fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntVbnByb2Nlc3NlZElkZW50aXR5SWRzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxFcnJvckNvZGU6e319fX19fX0sRGVsZXRlSWRlbnRpdHlQb29sOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e319fX0sRGVzY3JpYmVJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fX19LG91dHB1dDp7c2hhcGU6IlN2In19LERlc2NyaWJlSWRlbnRpdHlQb29sOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e319fSxvdXRwdXQ6e3NoYXBlOiJTayJ9fSxHZXRDcmVkZW50aWFsc0ZvcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5SWQiXSxtZW1iZXJzOntJZGVudGl0eUlkOnt9LExvZ2luczp7c2hhcGU6IlMxMCJ9LEN1c3RvbVJvbGVBcm46e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxDcmVkZW50aWFsczp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntBY2Nlc3NLZXlJZDp7fSxTZWNyZXRLZXk6e30sU2Vzc2lvblRva2VuOnt9LEV4cGlyYXRpb246e3R5cGU6InRpbWVzdGFtcCJ9fX19fSxhdXRodHlwZToibm9uZSJ9LEdldElkOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7QWNjb3VudElkOnt9LElkZW50aXR5UG9vbElkOnt9LExvZ2luczp7c2hhcGU6IlMxMCJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e319fSxhdXRodHlwZToibm9uZSJ9LEdldElkZW50aXR5UG9vbFJvbGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sUm9sZXM6e3NoYXBlOiJTMWMifSxSb2xlTWFwcGluZ3M6e3NoYXBlOiJTMWUifX19fSxHZXRPcGVuSWRUb2tlbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eUlkIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LFRva2VuOnt9fX0sYXV0aHR5cGU6Im5vbmUifSxHZXRPcGVuSWRUb2tlbkZvckRldmVsb3BlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIiwiTG9naW5zIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn0sVG9rZW5EdXJhdGlvbjp7dHlwZToibG9uZyJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sVG9rZW46e319fX0sR2V0UHJpbmNpcGFsVGFnQXR0cmlidXRlTWFwOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIiwiSWRlbnRpdHlQcm92aWRlck5hbWUiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0eVByb3ZpZGVyTmFtZTp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0eVByb3ZpZGVyTmFtZTp7fSxVc2VEZWZhdWx0czp7dHlwZToiYm9vbGVhbiJ9LFByaW5jaXBhbFRhZ3M6e3NoYXBlOiJTMXMifX19fSxMaXN0SWRlbnRpdGllczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIk1heFJlc3VsdHMiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxNYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn0sTmV4dFRva2VuOnt9LEhpZGVEaXNhYmxlZDp7dHlwZToiYm9vbGVhbiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5UG9vbElkOnt9LElkZW50aXRpZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7c2hhcGU6IlN2In19LE5leHRUb2tlbjp7fX19fSxMaXN0SWRlbnRpdHlQb29sczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJNYXhSZXN1bHRzIl0sbWVtYmVyczp7TWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9LE5leHRUb2tlbjp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eVBvb2xzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQb29sTmFtZTp7fX19fSxOZXh0VG9rZW46e319fX0sTGlzdFRhZ3NGb3JSZXNvdXJjZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSZXNvdXJjZUFybiJdLG1lbWJlcnM6e1Jlc291cmNlQXJuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e1RhZ3M6e3NoYXBlOiJTaCJ9fX19LExvb2t1cERldmVsb3BlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlJZDp7fSxEZXZlbG9wZXJVc2VySWRlbnRpZmllcjp7fSxNYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn0sTmV4dFRva2VuOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0lkZW50aXR5SWQ6e30sRGV2ZWxvcGVyVXNlcklkZW50aWZpZXJMaXN0Ont0eXBlOiJsaXN0IixtZW1iZXI6e319LE5leHRUb2tlbjp7fX19fSxNZXJnZURldmVsb3BlcklkZW50aXRpZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiU291cmNlVXNlcklkZW50aWZpZXIiLCJEZXN0aW5hdGlvblVzZXJJZGVudGlmaWVyIiwiRGV2ZWxvcGVyUHJvdmlkZXJOYW1lIiwiSWRlbnRpdHlQb29sSWQiXSxtZW1iZXJzOntTb3VyY2VVc2VySWRlbnRpZmllcjp7fSxEZXN0aW5hdGlvblVzZXJJZGVudGlmaWVyOnt9LERldmVsb3BlclByb3ZpZGVyTmFtZTp7fSxJZGVudGl0eVBvb2xJZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9fX19LFNldElkZW50aXR5UG9vbFJvbGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5UG9vbElkIiwiUm9sZXMiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxSb2xlczp7c2hhcGU6IlMxYyJ9LFJvbGVNYXBwaW5nczp7c2hhcGU6IlMxZSJ9fX19LFNldFByaW5jaXBhbFRhZ0F0dHJpYnV0ZU1hcDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIklkZW50aXR5UHJvdmlkZXJOYW1lIl0sbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e30sVXNlRGVmYXVsdHM6e3R5cGU6ImJvb2xlYW4ifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7SWRlbnRpdHlQb29sSWQ6e30sSWRlbnRpdHlQcm92aWRlck5hbWU6e30sVXNlRGVmYXVsdHM6e3R5cGU6ImJvb2xlYW4ifSxQcmluY2lwYWxUYWdzOntzaGFwZToiUzFzIn19fX0sVGFnUmVzb3VyY2U6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUmVzb3VyY2VBcm4iLCJUYWdzIl0sbWVtYmVyczp7UmVzb3VyY2VBcm46e30sVGFnczp7c2hhcGU6IlNoIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVubGlua0RldmVsb3BlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIklkZW50aXR5SWQiLCJJZGVudGl0eVBvb2xJZCIsIkRldmVsb3BlclByb3ZpZGVyTmFtZSIsIkRldmVsb3BlclVzZXJJZGVudGlmaWVyIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxJZGVudGl0eVBvb2xJZDp7fSxEZXZlbG9wZXJQcm92aWRlck5hbWU6e30sRGV2ZWxvcGVyVXNlcklkZW50aWZpZXI6e319fX0sVW5saW5rSWRlbnRpdHk6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiSWRlbnRpdHlJZCIsIkxvZ2lucyIsIkxvZ2luc1RvUmVtb3ZlIl0sbWVtYmVyczp7SWRlbnRpdHlJZDp7fSxMb2dpbnM6e3NoYXBlOiJTMTAifSxMb2dpbnNUb1JlbW92ZTp7c2hhcGU6IlN3In19fSxhdXRodHlwZToibm9uZSJ9LFVudGFnUmVzb3VyY2U6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUmVzb3VyY2VBcm4iLCJUYWdLZXlzIl0sbWVtYmVyczp7UmVzb3VyY2VBcm46e30sVGFnS2V5czp7dHlwZToibGlzdCIsbWVtYmVyOnt9fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sVXBkYXRlSWRlbnRpdHlQb29sOntpbnB1dDp7c2hhcGU6IlNrIn0sb3V0cHV0OntzaGFwZToiU2sifX19LHNoYXBlczp7UzU6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxTOTp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxTYjp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e1Byb3ZpZGVyTmFtZTp7fSxDbGllbnRJZDp7fSxTZXJ2ZXJTaWRlVG9rZW5DaGVjazp7dHlwZToiYm9vbGVhbiJ9fX19LFNnOnt0eXBlOiJsaXN0IixtZW1iZXI6e319LFNoOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX0sU2s6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJJZGVudGl0eVBvb2xJZCIsIklkZW50aXR5UG9vbE5hbWUiLCJBbGxvd1VuYXV0aGVudGljYXRlZElkZW50aXRpZXMiXSxtZW1iZXJzOntJZGVudGl0eVBvb2xJZDp7fSxJZGVudGl0eVBvb2xOYW1lOnt9LEFsbG93VW5hdXRoZW50aWNhdGVkSWRlbnRpdGllczp7dHlwZToiYm9vbGVhbiJ9LEFsbG93Q2xhc3NpY0Zsb3c6e3R5cGU6ImJvb2xlYW4ifSxTdXBwb3J0ZWRMb2dpblByb3ZpZGVyczp7c2hhcGU6IlM1In0sRGV2ZWxvcGVyUHJvdmlkZXJOYW1lOnt9LE9wZW5JZENvbm5lY3RQcm92aWRlckFSTnM6e3NoYXBlOiJTOSJ9LENvZ25pdG9JZGVudGl0eVByb3ZpZGVyczp7c2hhcGU6IlNiIn0sU2FtbFByb3ZpZGVyQVJOczp7c2hhcGU6IlNnIn0sSWRlbnRpdHlQb29sVGFnczp7c2hhcGU6IlNoIn19fSxTdjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntJZGVudGl0eUlkOnt9LExvZ2luczp7c2hhcGU6IlN3In0sQ3JlYXRpb25EYXRlOnt0eXBlOiJ0aW1lc3RhbXAifSxMYXN0TW9kaWZpZWREYXRlOnt0eXBlOiJ0aW1lc3RhbXAifX19LFN3Ont0eXBlOiJsaXN0IixtZW1iZXI6e319LFMxMDp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319LFMxYzp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e319LFMxZTp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJUeXBlIl0sbWVtYmVyczp7VHlwZTp7fSxBbWJpZ3VvdXNSb2xlUmVzb2x1dGlvbjp7fSxSdWxlc0NvbmZpZ3VyYXRpb246e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSdWxlcyJdLG1lbWJlcnM6e1J1bGVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJDbGFpbSIsIk1hdGNoVHlwZSIsIlZhbHVlIiwiUm9sZUFSTiJdLG1lbWJlcnM6e0NsYWltOnt9LE1hdGNoVHlwZTp7fSxWYWx1ZTp7fSxSb2xlQVJOOnt9fX19fX19fX0sUzFzOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7fX19fX0se31dLDI6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3BhZ2luYXRpb246e0xpc3RJZGVudGl0eVBvb2xzOntpbnB1dF90b2tlbjoiTmV4dFRva2VuIixsaW1pdF9rZXk6Ik1heFJlc3VsdHMiLG91dHB1dF90b2tlbjoiTmV4dFRva2VuIixyZXN1bHRfa2V5OiJJZGVudGl0eVBvb2xzIn19fX0se31dLDM6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3ZlcnNpb246IjIuMCIsbWV0YWRhdGE6e2FwaVZlcnNpb246IjIwMTctMDItMTUiLGVuZHBvaW50UHJlZml4OiJjb25uZWN0Iixqc29uVmVyc2lvbjoiMS4wIixwcm90b2NvbDoianNvbiIsc2VydmljZUFiYnJldmlhdGlvbjoiQ29ubmVjdCIsc2VydmljZUZ1bGxOYW1lOiJBbWF6b25Db25uZWN0Q1RJU2VydmljZSIsc2lnbmF0dXJlVmVyc2lvbjoiIix0YXJnZXRQcmVmaXg6IkFtYXpvbkNvbm5lY3RDVElTZXJ2aWNlIix1aWQ6ImNvbm5lY3QtMjAxNy0wMi0xNSJ9LG9wZXJhdGlvbnM6e0FjY2VwdENvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDbGVhckNvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDb21wbGV0ZUNvbnRhY3Q6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIl0sbWVtYmVyczp7Y29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDb25mZXJlbmNlQ29ubmVjdGlvbnM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDcmVhdGVBZGRpdGlvbmFsQ29ubmVjdGlvbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsImVuZHBvaW50Il0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxlbmRwb2ludDp7c2hhcGU6IlNlIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LENyZWF0ZU91dGJvdW5kQ29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImVuZHBvaW50Il0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGVuZHBvaW50OntzaGFwZToiU2UifSxxdWV1ZUFSTjp7fSxyZWxhdGVkQ29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxDcmVhdGVUYXNrQ29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJlbmRwb2ludCIsIm5hbWUiXSxtZW1iZXJzOntlbmRwb2ludDp7c2hhcGU6IlNlIn0scHJldmlvdXNDb250YWN0SWQ6e30sbmFtZTp7fSxkZXNjcmlwdGlvbjp7fSxyZWZlcmVuY2VzOntzaGFwZToiU3IifSxpZGVtcG90ZW5jeVRva2VuOnt9LHNjaGVkdWxlZFRpbWU6e3R5cGU6ImxvbmcifSxyZWxhdGVkQ29udGFjdElkOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NvbnRhY3RJZDp7fX19fSxDcmVhdGVUcmFuc3BvcnQ6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidHJhbnNwb3J0VHlwZSIsImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7dHJhbnNwb3J0VHlwZTp7fSxwYXJ0aWNpcGFudElkOnt9LGNvbnRhY3RJZDp7fSxzb2Z0cGhvbmVDbGllbnRJZDp7fSxhdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7d2ViU29ja2V0VHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidXJsIiwidHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHMiXSxtZW1iZXJzOnt1cmw6e30sdHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHM6e3R5cGU6ImxvbmcifSxleHBpcnk6e319fSxjaGF0VG9rZW5UcmFuc3BvcnQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJwYXJ0aWNpcGFudFRva2VuIiwiZXhwaXJ5Il0sbWVtYmVyczp7cGFydGljaXBhbnRUb2tlbjp7fSxleHBpcnk6e319fSxzb2Z0cGhvbmVUcmFuc3BvcnQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJzb2Z0cGhvbmVNZWRpYUNvbm5lY3Rpb25zIl0sbWVtYmVyczp7c29mdHBob25lTWVkaWFDb25uZWN0aW9uczp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidXNlcm5hbWUiLCJjcmVkZW50aWFsIiwidXJscyJdLG1lbWJlcnM6e3VzZXJuYW1lOnt9LGNyZWRlbnRpYWw6e30sdXJsczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fX19fX19LGFnZW50RGlzY292ZXJ5VHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsicHJlc2lnbmVkVXJsIl0sbWVtYmVyczp7cHJlc2lnbmVkVXJsOnt9fX0sd2ViUlRDVHJhbnNwb3J0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsibWVldGluZyIsImF0dGVuZGVlIl0sbWVtYmVyczp7bWVldGluZzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnttZWV0aW5nSWQ6e30sbWVkaWFSZWdpb246e30sbWVkaWFQbGFjZW1lbnQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YXVkaW9Ib3N0VXJsOnt9LGF1ZGlvRmFsbGJhY2tVcmw6e30sc2lnbmFsaW5nVXJsOnt9LHR1cm5Db250cm9sVXJsOnt9LGV2ZW50SW5nZXN0aW9uVXJsOnt9fX0sbWVldGluZ0ZlYXR1cmVzOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2F1ZGlvOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2VjaG9SZWR1Y3Rpb246e319fX19fX0sYXR0ZW5kZWU6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YXR0ZW5kZWVJZDp7fSxqb2luVG9rZW46e3R5cGU6InN0cmluZyIsc2Vuc2l0aXZlOiEwfX19fX19fX0sRGVzdHJveUNvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sR2V0QWdlbnRDb25maWd1cmF0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29uZmlndXJhdGlvbiJdLG1lbWJlcnM6e2NvbmZpZ3VyYXRpb246e3NoYXBlOiJTMXEifX19fSxHZXRBZ2VudFBlcm1pc3Npb25zOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSxtYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJwZXJtaXNzaW9ucyJdLG1lbWJlcnM6e3Blcm1pc3Npb25zOnt0eXBlOiJsaXN0IixtZW1iZXI6e319LG5leHRUb2tlbjp7fX19fSxHZXRBZ2VudFNuYXBzaG90OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSx0aW1lb3V0Ont0eXBlOiJsb25nIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJzbmFwc2hvdCIsIm5leHRUb2tlbiJdLG1lbWJlcnM6e3NuYXBzaG90Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsic3RhdGUiLCJjb250YWN0cyIsInNuYXBzaG90VGltZXN0YW1wIl0sbWVtYmVyczp7c3RhdGU6e3NoYXBlOiJTMjkifSxuZXh0U3RhdGU6e3NoYXBlOiJTMjkifSxhZ2VudEF2YWlsYWJpbGl0eVN0YXRlOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3N0YXRlOnt9LHRpbWVTdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSxjb250YWN0czp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiY29udGFjdElkIiwidHlwZSIsInN0YXRlIiwiY29ubmVjdGlvbnMiLCJhdHRyaWJ1dGVzIl0sbWVtYmVyczp7Y29udGFjdElkOnt9LGluaXRpYWxDb250YWN0SWQ6e30sdHlwZTp7fSxzdGF0ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInR5cGUiLCJ0aW1lc3RhbXAiXSxtZW1iZXJzOnt0eXBlOnt9LHRpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSxxdWV1ZTp7c2hhcGU6IlNrIn0scXVldWVUaW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9LGNvbm5lY3Rpb25zOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb25uZWN0aW9uSWQiLCJzdGF0ZSIsInR5cGUiLCJpbml0aWFsIl0sbWVtYmVyczp7Y29ubmVjdGlvbklkOnt9LGVuZHBvaW50OntzaGFwZToiU2UifSxzdGF0ZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInR5cGUiLCJ0aW1lc3RhbXAiXSxtZW1iZXJzOnt0eXBlOnt9LHRpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSx0eXBlOnt9LGluaXRpYWw6e3R5cGU6ImJvb2xlYW4ifSxzb2Z0cGhvbmVNZWRpYUluZm86e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Y2FsbFR5cGU6e30sYXV0b0FjY2VwdDp7dHlwZToiYm9vbGVhbiJ9LG1lZGlhTGVnQ29udGV4dFRva2VuOnt9LGNhbGxDb250ZXh0VG9rZW46e30sY2FsbENvbmZpZ0pzb246e319fSxjaGF0TWVkaWFJbmZvOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2NoYXRBdXRvQWNjZXB0Ont0eXBlOiJib29sZWFuIn0sY29ubmVjdGlvbkRhdGE6e30sY3VzdG9tZXJOYW1lOnt9fX0sbW9uaXRvcmluZ0luZm86e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YWdlbnQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YWdlbnROYW1lOnt9fX0sam9pblRpbWVTdGFtcDp7dHlwZToidGltZXN0YW1wIn19fSxtdXRlOnt0eXBlOiJib29sZWFuIn0sZm9yY2VkTXV0ZTp7dHlwZToiYm9vbGVhbiJ9LHF1aWNrQ29ubmVjdE5hbWU6e30sbW9uaXRvckNhcGFiaWxpdGllczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxtb25pdG9yU3RhdHVzOnt9LGNhcGFiaWxpdGllczp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntWaWRlbzp7fX19fX19LGF0dHJpYnV0ZXM6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsibmFtZSJdLG1lbWJlcnM6e25hbWU6e30sdmFsdWU6e319fX0sY29udGFjdER1cmF0aW9uOnt9LG5hbWU6e30sZGVzY3JpcHRpb246e30scmVmZXJlbmNlczp7c2hhcGU6IlNyIn0saW5pdGlhdGlvbk1ldGhvZDp7fSxjb250YWN0RmVhdHVyZXM6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7YXR0YWNobWVudHNFbmFibGVkOnt0eXBlOiJib29sZWFuIn0sbWVzc2FnaW5nTWFya2Rvd25FbmFibGVkOnt0eXBlOiJib29sZWFuIn0sbXVsdGlQYXJ0eUNvbmZlcmVuY2VFbmFibGVkOnt0eXBlOiJib29sZWFuIn0sc2NyZWVuUmVjb3JkaW5nRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LHNjcmVlblJlY29yZGluZ1N0YXRlOnt9LHNjcmVlblJlY29yZGluZ0NvbmZpZzp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntzY3JlZW5SZWNvcmRpbmdFbmFibGVkOnt0eXBlOiJib29sZWFuIn0sc2NyZWVuUmVjb3JkaW5nU3RhdGU6e319fX19LGNoYW5uZWxDb250ZXh0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3NjaGVkdWxlZFRpbWU6e3R5cGU6ImxvbmcifSx0YXNrVGVtcGxhdGVJZDp7fSx0YXNrVGVtcGxhdGVWZXJzaW9uOnt0eXBlOiJpbnRlZ2VyIn19fSxzZWdtZW50QXR0cmlidXRlczp7dHlwZToibWFwIixrZXk6e30sdmFsdWU6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7VmFsdWVTdHJpbmc6e319fX19fX0sc25hcHNob3RUaW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sbmV4dFRva2VuOnt9fX19LEdldEFnZW50U3RhdGVzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LG5leHRUb2tlbjp7fSxtYXhSZXN1bHRzOnt0eXBlOiJpbnRlZ2VyIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJzdGF0ZXMiXSxtZW1iZXJzOntzdGF0ZXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7c2hhcGU6IlMyOSJ9fSxuZXh0VG9rZW46e319fX0sR2V0RGlhbGFibGVDb3VudHJ5Q29kZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sbmV4dFRva2VuOnt9LG1heFJlc3VsdHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvdW50cnlDb2RlcyJdLG1lbWJlcnM6e2NvdW50cnlDb2Rlczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxuZXh0VG9rZW46e319fX0sR2V0RW5kcG9pbnRzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwicXVldWVBUk5zIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LHF1ZXVlQVJOczp7dHlwZToibGlzdCIsbWVtYmVyOnt9fSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2VuZHBvaW50czp7dHlwZToibGlzdCIsbWVtYmVyOntzaGFwZToiU2UifX0sbmV4dFRva2VuOnt9fX19LEdldE5ld0F1dGhUb2tlbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsInJlZnJlc2hUb2tlbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxyZWZyZXNoVG9rZW46e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7bmV3QXV0aFRva2VuOnt9LGV4cGlyYXRpb25EYXRlVGltZTp7dHlwZToidGltZXN0YW1wIn19fX0sR2V0Um91dGluZ1Byb2ZpbGVRdWV1ZXM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJyb3V0aW5nUHJvZmlsZUFSTiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxyb3V0aW5nUHJvZmlsZUFSTjp7fSxuZXh0VG9rZW46e30sbWF4UmVzdWx0czp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsicXVldWVzIl0sbWVtYmVyczp7cXVldWVzOnt0eXBlOiJsaXN0IixtZW1iZXI6e3NoYXBlOiJTayJ9fSxuZXh0VG9rZW46e319fX0sSG9sZENvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sTXV0ZVBhcnRpY2lwYW50OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29udGFjdElkIiwiY29ubmVjdGlvbklkIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGNvbnRhY3RJZDp7fSxjb25uZWN0aW9uSWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LE5vdGlmeUNvbnRhY3RJc3N1ZTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30saXNzdWVDb2RlOnt9LGRlc2NyaXB0aW9uOnt9LGNsaWVudExvZ3M6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFBhdXNlQ29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiXSxtZW1iZXJzOntjb250YWN0SWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFB1dEFnZW50U3RhdGU6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJzdGF0ZSJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxzdGF0ZTp7c2hhcGU6IlMyOSJ9LGVucXVldWVOZXh0U3RhdGU6e3R5cGU6ImJvb2xlYW4ifX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sUmVqZWN0Q29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiXSxtZW1iZXJzOntjb250YWN0SWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFJlc3VtZUNvbm5lY3Rpb246e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sUmVzdW1lQ29udGFjdDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJjb250YWN0SWQiXSxtZW1iZXJzOntjb250YWN0SWQ6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFNlbmRDbGllbnRMb2dzOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwibG9nRXZlbnRzIl0sbWVtYmVyczp7YXV0aGVudGljYXRpb246e3NoYXBlOiJTMiJ9LGxvZ0V2ZW50czp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e3RpbWVzdGFtcDp7dHlwZToidGltZXN0YW1wIn0sY29tcG9uZW50Ont9LG1lc3NhZ2U6e319fX19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFNlbmREaWdpdHM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiLCJkaWdpdHMiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fSxkaWdpdHM6e319fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFNlbmRTb2Z0cGhvbmVDYWxsTWV0cmljczp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsInNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3MiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNjcFZlcnNpb246e30sc29mdHBob25lU3RyZWFtU3RhdGlzdGljczp7c2hhcGU6IlM0ZiJ9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fSxTZW5kU29mdHBob25lQ2FsbFJlcG9ydDp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJhdXRoZW50aWNhdGlvbiIsImNvbnRhY3RJZCIsInJlcG9ydCJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb250YWN0SWQ6e30sY2NwVmVyc2lvbjp7fSxyZXBvcnQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Y2FsbFN0YXJ0VGltZTp7dHlwZToidGltZXN0YW1wIn0sY2FsbEVuZFRpbWU6e3R5cGU6InRpbWVzdGFtcCJ9LHNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M6e3NoYXBlOiJTNGYifSxndW1UaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0saW5pdGlhbGl6YXRpb25UaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0saWNlQ29sbGVjdGlvblRpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSxzaWduYWxsaW5nQ29ubmVjdFRpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSxoYW5kc2hha2VUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0scHJlVGFsa1RpbWVNaWxsaXM6e3R5cGU6ImxvbmcifSx0YWxrVGltZU1pbGxpczp7dHlwZToibG9uZyJ9LGNsZWFudXBUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn0saWNlQ29sbGVjdGlvbkZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxzaWduYWxsaW5nQ29ubmVjdGlvbkZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxoYW5kc2hha2VGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sZ3VtT3RoZXJGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sZ3VtVGltZW91dEZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxjcmVhdGVPZmZlckZhaWx1cmU6e3R5cGU6ImJvb2xlYW4ifSxzZXRMb2NhbERlc2NyaXB0aW9uRmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LHVzZXJCdXN5RmFpbHVyZTp7dHlwZToiYm9vbGVhbiJ9LGludmFsaWRSZW1vdGVTRFBGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sbm9SZW1vdGVJY2VDYW5kaWRhdGVGYWlsdXJlOnt0eXBlOiJib29sZWFuIn0sc2V0UmVtb3RlRGVzY3JpcHRpb25GYWlsdXJlOnt0eXBlOiJib29sZWFuIn19fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sVG9nZ2xlQWN0aXZlQ29ubmVjdGlvbnM6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sVW5tdXRlUGFydGljaXBhbnQ6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiYXV0aGVudGljYXRpb24iLCJjb250YWN0SWQiLCJjb25uZWN0aW9uSWQiXSxtZW1iZXJzOnthdXRoZW50aWNhdGlvbjp7c2hhcGU6IlMyIn0sY29udGFjdElkOnt9LGNvbm5lY3Rpb25JZDp7fX19LG91dHB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fX0sVXBkYXRlQWdlbnRDb25maWd1cmF0aW9uOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImF1dGhlbnRpY2F0aW9uIiwiY29uZmlndXJhdGlvbiJdLG1lbWJlcnM6e2F1dGhlbnRpY2F0aW9uOntzaGFwZToiUzIifSxjb25maWd1cmF0aW9uOntzaGFwZToiUzFxIn19fSxvdXRwdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7fX19LFVwZGF0ZU1vbml0b3JQYXJ0aWNpcGFudFN0YXRlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbImNvbnRhY3RJZCIsInRhcmdldE1vbml0b3JNb2RlIl0sbWVtYmVyczp7Y29udGFjdElkOnt9LHRhcmdldE1vbml0b3JNb2RlOnt9fX0sb3V0cHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319fX0sc2hhcGVzOntTMjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnthZ2VudEFSTjp7fSxhdXRoVG9rZW46e319fSxTZTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInR5cGUiXSxtZW1iZXJzOntlbmRwb2ludEFSTjp7fSx0eXBlOnt9LG5hbWU6e30scGhvbmVOdW1iZXI6e30sYWdlbnRMb2dpbjp7fSxxdWV1ZTp7c2hhcGU6IlNrIn19fSxTazp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntxdWV1ZUFSTjp7fSxuYW1lOnt9fX0sU3I6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsidmFsdWUiLCJ0eXBlIl0sbWVtYmVyczp7dmFsdWU6e30sdHlwZTp7fX19fSxTMXE6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJuYW1lIiwic29mdHBob25lRW5hYmxlZCIsInNvZnRwaG9uZUF1dG9BY2NlcHQiLCJleHRlbnNpb24iLCJyb3V0aW5nUHJvZmlsZSJdLG1lbWJlcnM6e25hbWU6e30sdXNlcm5hbWU6e30sc29mdHBob25lRW5hYmxlZDp7dHlwZToiYm9vbGVhbiJ9LHNvZnRwaG9uZUF1dG9BY2NlcHQ6e3R5cGU6ImJvb2xlYW4ifSxleHRlbnNpb246e30scm91dGluZ1Byb2ZpbGU6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7bmFtZTp7fSxyb3V0aW5nUHJvZmlsZUFSTjp7fSxkZWZhdWx0T3V0Ym91bmRRdWV1ZTp7c2hhcGU6IlNrIn0sY2hhbm5lbENvbmN1cnJlbmN5TWFwOnt0eXBlOiJtYXAiLGtleTp7fSx2YWx1ZTp7dHlwZToibG9uZyJ9fX19LGFnZW50UHJlZmVyZW5jZXM6e3R5cGU6Im1hcCIsa2V5Ont9LHZhbHVlOnt9fSxhZ2VudEFSTjp7fX19LFMyOTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbInR5cGUiLCJuYW1lIl0sbWVtYmVyczp7YWdlbnRTdGF0ZUFSTjp7fSx0eXBlOnt9LG5hbWU6e30sc3RhcnRUaW1lc3RhbXA6e3R5cGU6InRpbWVzdGFtcCJ9fX0sUzRmOnt0eXBlOiJsaXN0IixtZW1iZXI6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7dGltZXN0YW1wOnt0eXBlOiJ0aW1lc3RhbXAifSxzb2Z0cGhvbmVTdHJlYW1UeXBlOnt9LHBhY2tldENvdW50Ont0eXBlOiJsb25nIn0scGFja2V0c0xvc3Q6e3R5cGU6ImxvbmcifSxhdWRpb0xldmVsOnt0eXBlOiJkb3VibGUifSxqaXR0ZXJCdWZmZXJNaWxsaXM6e3R5cGU6ImxvbmcifSxyb3VuZFRyaXBUaW1lTWlsbGlzOnt0eXBlOiJsb25nIn19fX19fX0se31dLDQ6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2FjbTp7bmFtZToiQUNNIixjb3JzOiEwfSxhcGlnYXRld2F5OntuYW1lOiJBUElHYXRld2F5Iixjb3JzOiEwfSxhcHBsaWNhdGlvbmF1dG9zY2FsaW5nOntwcmVmaXg6ImFwcGxpY2F0aW9uLWF1dG9zY2FsaW5nIixuYW1lOiJBcHBsaWNhdGlvbkF1dG9TY2FsaW5nIixjb3JzOiEwfSxhcHBzdHJlYW06e25hbWU6IkFwcFN0cmVhbSJ9LGF1dG9zY2FsaW5nOntuYW1lOiJBdXRvU2NhbGluZyIsY29yczohMH0sYmF0Y2g6e25hbWU6IkJhdGNoIn0sYnVkZ2V0czp7bmFtZToiQnVkZ2V0cyJ9LGNsb3VkZGlyZWN0b3J5OntuYW1lOiJDbG91ZERpcmVjdG9yeSIsdmVyc2lvbnM6WyIyMDE2LTA1LTEwKiJdfSxjbG91ZGZvcm1hdGlvbjp7bmFtZToiQ2xvdWRGb3JtYXRpb24iLGNvcnM6ITB9LGNsb3VkZnJvbnQ6e25hbWU6IkNsb3VkRnJvbnQiLHZlcnNpb25zOlsiMjAxMy0wNS0xMioiLCIyMDEzLTExLTExKiIsIjIwMTQtMDUtMzEqIiwiMjAxNC0xMC0yMSoiLCIyMDE0LTExLTA2KiIsIjIwMTUtMDQtMTcqIiwiMjAxNS0wNy0yNyoiLCIyMDE1LTA5LTE3KiIsIjIwMTYtMDEtMTMqIiwiMjAxNi0wMS0yOCoiLCIyMDE2LTA4LTAxKiIsIjIwMTYtMDgtMjAqIiwiMjAxNi0wOS0wNyoiLCIyMDE2LTA5LTI5KiIsIjIwMTYtMTEtMjUqIiwiMjAxNy0wMy0yNSoiLCIyMDE3LTEwLTMwKiIsIjIwMTgtMDYtMTgqIiwiMjAxOC0xMS0wNSoiLCIyMDE5LTAzLTI2KiJdLGNvcnM6ITB9LGNsb3VkaHNtOntuYW1lOiJDbG91ZEhTTSIsY29yczohMH0sY2xvdWRzZWFyY2g6e25hbWU6IkNsb3VkU2VhcmNoIn0sY2xvdWRzZWFyY2hkb21haW46e25hbWU6IkNsb3VkU2VhcmNoRG9tYWluIn0sY2xvdWR0cmFpbDp7bmFtZToiQ2xvdWRUcmFpbCIsY29yczohMH0sY2xvdWR3YXRjaDp7cHJlZml4OiJtb25pdG9yaW5nIixuYW1lOiJDbG91ZFdhdGNoIixjb3JzOiEwfSxjbG91ZHdhdGNoZXZlbnRzOntwcmVmaXg6ImV2ZW50cyIsbmFtZToiQ2xvdWRXYXRjaEV2ZW50cyIsdmVyc2lvbnM6WyIyMDE0LTAyLTAzKiJdLGNvcnM6ITB9LGNsb3Vkd2F0Y2hsb2dzOntwcmVmaXg6ImxvZ3MiLG5hbWU6IkNsb3VkV2F0Y2hMb2dzIixjb3JzOiEwfSxjb2RlYnVpbGQ6e25hbWU6IkNvZGVCdWlsZCIsY29yczohMH0sY29kZWNvbW1pdDp7bmFtZToiQ29kZUNvbW1pdCIsY29yczohMH0sY29kZWRlcGxveTp7bmFtZToiQ29kZURlcGxveSIsY29yczohMH0sY29kZXBpcGVsaW5lOntuYW1lOiJDb2RlUGlwZWxpbmUiLGNvcnM6ITB9LGNvZ25pdG9pZGVudGl0eTp7cHJlZml4OiJjb2duaXRvLWlkZW50aXR5IixuYW1lOiJDb2duaXRvSWRlbnRpdHkiLGNvcnM6ITB9LGNvZ25pdG9pZGVudGl0eXNlcnZpY2Vwcm92aWRlcjp7cHJlZml4OiJjb2duaXRvLWlkcCIsbmFtZToiQ29nbml0b0lkZW50aXR5U2VydmljZVByb3ZpZGVyIixjb3JzOiEwfSxjb2duaXRvc3luYzp7cHJlZml4OiJjb2duaXRvLXN5bmMiLG5hbWU6IkNvZ25pdG9TeW5jIixjb3JzOiEwfSxjb25maWdzZXJ2aWNlOntwcmVmaXg6ImNvbmZpZyIsbmFtZToiQ29uZmlnU2VydmljZSIsY29yczohMH0sY3VyOntuYW1lOiJDVVIiLGNvcnM6ITB9LGRhdGFwaXBlbGluZTp7bmFtZToiRGF0YVBpcGVsaW5lIn0sZGV2aWNlZmFybTp7bmFtZToiRGV2aWNlRmFybSIsY29yczohMH0sZGlyZWN0Y29ubmVjdDp7bmFtZToiRGlyZWN0Q29ubmVjdCIsY29yczohMH0sZGlyZWN0b3J5c2VydmljZTp7cHJlZml4OiJkcyIsbmFtZToiRGlyZWN0b3J5U2VydmljZSJ9LGRpc2NvdmVyeTp7bmFtZToiRGlzY292ZXJ5In0sZG1zOntuYW1lOiJETVMifSxkeW5hbW9kYjp7bmFtZToiRHluYW1vREIiLGNvcnM6ITB9LGR5bmFtb2Ric3RyZWFtczp7cHJlZml4OiJzdHJlYW1zLmR5bmFtb2RiIixuYW1lOiJEeW5hbW9EQlN0cmVhbXMiLGNvcnM6ITB9LGVjMjp7bmFtZToiRUMyIix2ZXJzaW9uczpbIjIwMTMtMDYtMTUqIiwiMjAxMy0xMC0xNSoiLCIyMDE0LTAyLTAxKiIsIjIwMTQtMDUtMDEqIiwiMjAxNC0wNi0xNSoiLCIyMDE0LTA5LTAxKiIsIjIwMTQtMTAtMDEqIiwiMjAxNS0wMy0wMSoiLCIyMDE1LTA0LTE1KiIsIjIwMTUtMTAtMDEqIiwiMjAxNi0wNC0wMSoiLCIyMDE2LTA5LTE1KiJdLGNvcnM6ITB9LGVjcjp7bmFtZToiRUNSIixjb3JzOiEwfSxlY3M6e25hbWU6IkVDUyIsY29yczohMH0sZWZzOntwcmVmaXg6ImVsYXN0aWNmaWxlc3lzdGVtIixuYW1lOiJFRlMiLGNvcnM6ITB9LGVsYXN0aWNhY2hlOntuYW1lOiJFbGFzdGlDYWNoZSIsdmVyc2lvbnM6WyIyMDEyLTExLTE1KiIsIjIwMTQtMDMtMjQqIiwiMjAxNC0wNy0xNSoiLCIyMDE0LTA5LTMwKiJdLGNvcnM6ITB9LGVsYXN0aWNiZWFuc3RhbGs6e25hbWU6IkVsYXN0aWNCZWFuc3RhbGsiLGNvcnM6ITB9LGVsYjp7cHJlZml4OiJlbGFzdGljbG9hZGJhbGFuY2luZyIsbmFtZToiRUxCIixjb3JzOiEwfSxlbGJ2Mjp7cHJlZml4OiJlbGFzdGljbG9hZGJhbGFuY2luZ3YyIixuYW1lOiJFTEJ2MiIsY29yczohMH0sZW1yOntwcmVmaXg6ImVsYXN0aWNtYXByZWR1Y2UiLG5hbWU6IkVNUiIsY29yczohMH0sZXM6e25hbWU6IkVTIn0sZWxhc3RpY3RyYW5zY29kZXI6e25hbWU6IkVsYXN0aWNUcmFuc2NvZGVyIixjb3JzOiEwfSxmaXJlaG9zZTp7bmFtZToiRmlyZWhvc2UiLGNvcnM6ITB9LGdhbWVsaWZ0OntuYW1lOiJHYW1lTGlmdCIsY29yczohMH0sZ2xhY2llcjp7bmFtZToiR2xhY2llciJ9LGhlYWx0aDp7bmFtZToiSGVhbHRoIn0saWFtOntuYW1lOiJJQU0iLGNvcnM6ITB9LGltcG9ydGV4cG9ydDp7bmFtZToiSW1wb3J0RXhwb3J0In0saW5zcGVjdG9yOntuYW1lOiJJbnNwZWN0b3IiLHZlcnNpb25zOlsiMjAxNS0wOC0xOCoiXSxjb3JzOiEwfSxpb3Q6e25hbWU6IklvdCIsY29yczohMH0saW90ZGF0YTp7cHJlZml4OiJpb3QtZGF0YSIsbmFtZToiSW90RGF0YSIsY29yczohMH0sa2luZXNpczp7bmFtZToiS2luZXNpcyIsY29yczohMH0sa2luZXNpc2FuYWx5dGljczp7bmFtZToiS2luZXNpc0FuYWx5dGljcyJ9LGttczp7bmFtZToiS01TIixjb3JzOiEwfSxsYW1iZGE6e25hbWU6IkxhbWJkYSIsY29yczohMH0sbGV4cnVudGltZTp7cHJlZml4OiJydW50aW1lLmxleCIsbmFtZToiTGV4UnVudGltZSIsY29yczohMH0sbGlnaHRzYWlsOntuYW1lOiJMaWdodHNhaWwifSxtYWNoaW5lbGVhcm5pbmc6e25hbWU6Ik1hY2hpbmVMZWFybmluZyIsY29yczohMH0sbWFya2V0cGxhY2Vjb21tZXJjZWFuYWx5dGljczp7bmFtZToiTWFya2V0cGxhY2VDb21tZXJjZUFuYWx5dGljcyIsY29yczohMH0sbWFya2V0cGxhY2VtZXRlcmluZzp7cHJlZml4OiJtZXRlcmluZ21hcmtldHBsYWNlIixuYW1lOiJNYXJrZXRwbGFjZU1ldGVyaW5nIn0sbXR1cms6e3ByZWZpeDoibXR1cmstcmVxdWVzdGVyIixuYW1lOiJNVHVyayIsY29yczohMH0sbW9iaWxlYW5hbHl0aWNzOntuYW1lOiJNb2JpbGVBbmFseXRpY3MiLGNvcnM6ITB9LG9wc3dvcmtzOntuYW1lOiJPcHNXb3JrcyIsY29yczohMH0sb3Bzd29ya3NjbTp7bmFtZToiT3BzV29ya3NDTSJ9LG9yZ2FuaXphdGlvbnM6e25hbWU6Ik9yZ2FuaXphdGlvbnMifSxwaW5wb2ludDp7bmFtZToiUGlucG9pbnQifSxwb2xseTp7bmFtZToiUG9sbHkiLGNvcnM6ITB9LHJkczp7bmFtZToiUkRTIix2ZXJzaW9uczpbIjIwMTQtMDktMDEqIl0sY29yczohMH0scmVkc2hpZnQ6e25hbWU6IlJlZHNoaWZ0Iixjb3JzOiEwfSxyZWtvZ25pdGlvbjp7bmFtZToiUmVrb2duaXRpb24iLGNvcnM6ITB9LHJlc291cmNlZ3JvdXBzdGFnZ2luZ2FwaTp7bmFtZToiUmVzb3VyY2VHcm91cHNUYWdnaW5nQVBJIn0scm91dGU1Mzp7bmFtZToiUm91dGU1MyIsY29yczohMH0scm91dGU1M2RvbWFpbnM6e25hbWU6IlJvdXRlNTNEb21haW5zIixjb3JzOiEwfSxzMzp7bmFtZToiUzMiLGR1YWxzdGFja0F2YWlsYWJsZTohMCxjb3JzOiEwfSxzM2NvbnRyb2w6e25hbWU6IlMzQ29udHJvbCIsZHVhbHN0YWNrQXZhaWxhYmxlOiEwLHhtbE5vRGVmYXVsdExpc3RzOiEwfSxzZXJ2aWNlY2F0YWxvZzp7bmFtZToiU2VydmljZUNhdGFsb2ciLGNvcnM6ITB9LHNlczp7cHJlZml4OiJlbWFpbCIsbmFtZToiU0VTIixjb3JzOiEwfSxzaGllbGQ6e25hbWU6IlNoaWVsZCJ9LHNpbXBsZWRiOntwcmVmaXg6InNkYiIsbmFtZToiU2ltcGxlREIifSxzbXM6e25hbWU6IlNNUyJ9LHNub3diYWxsOntuYW1lOiJTbm93YmFsbCJ9LHNuczp7bmFtZToiU05TIixjb3JzOiEwfSxzcXM6e25hbWU6IlNRUyIsY29yczohMH0sc3NtOntuYW1lOiJTU00iLGNvcnM6ITB9LHN0b3JhZ2VnYXRld2F5OntuYW1lOiJTdG9yYWdlR2F0ZXdheSIsY29yczohMH0sc3RlcGZ1bmN0aW9uczp7cHJlZml4OiJzdGF0ZXMiLG5hbWU6IlN0ZXBGdW5jdGlvbnMifSxzdHM6e25hbWU6IlNUUyIsY29yczohMH0sc3VwcG9ydDp7bmFtZToiU3VwcG9ydCJ9LHN3Zjp7bmFtZToiU1dGIn0seHJheTp7bmFtZToiWFJheSIsY29yczohMH0sd2FmOntuYW1lOiJXQUYiLGNvcnM6ITB9LHdhZnJlZ2lvbmFsOntwcmVmaXg6IndhZi1yZWdpb25hbCIsbmFtZToiV0FGUmVnaW9uYWwifSx3b3JrZG9jczp7bmFtZToiV29ya0RvY3MiLGNvcnM6ITB9LHdvcmtzcGFjZXM6e25hbWU6IldvcmtTcGFjZXMifSxjb2Rlc3Rhcjp7bmFtZToiQ29kZVN0YXIifSxsZXhtb2RlbGJ1aWxkaW5nc2VydmljZTp7cHJlZml4OiJsZXgtbW9kZWxzIixuYW1lOiJMZXhNb2RlbEJ1aWxkaW5nU2VydmljZSIsY29yczohMH0sbWFya2V0cGxhY2VlbnRpdGxlbWVudHNlcnZpY2U6e3ByZWZpeDoiZW50aXRsZW1lbnQubWFya2V0cGxhY2UiLG5hbWU6Ik1hcmtldHBsYWNlRW50aXRsZW1lbnRTZXJ2aWNlIn0sYXRoZW5hOntuYW1lOiJBdGhlbmEiLGNvcnM6ITB9LGdyZWVuZ3Jhc3M6e25hbWU6IkdyZWVuZ3Jhc3MifSxkYXg6e25hbWU6IkRBWCJ9LG1pZ3JhdGlvbmh1Yjp7cHJlZml4OiJBV1NNaWdyYXRpb25IdWIiLG5hbWU6Ik1pZ3JhdGlvbkh1YiJ9LGNsb3VkaHNtdjI6e25hbWU6IkNsb3VkSFNNVjIiLGNvcnM6ITB9LGdsdWU6e25hbWU6IkdsdWUifSxtb2JpbGU6e25hbWU6Ik1vYmlsZSJ9LHByaWNpbmc6e25hbWU6IlByaWNpbmciLGNvcnM6ITB9LGNvc3RleHBsb3Jlcjp7cHJlZml4OiJjZSIsbmFtZToiQ29zdEV4cGxvcmVyIixjb3JzOiEwfSxtZWRpYWNvbnZlcnQ6e25hbWU6Ik1lZGlhQ29udmVydCJ9LG1lZGlhbGl2ZTp7bmFtZToiTWVkaWFMaXZlIn0sbWVkaWFwYWNrYWdlOntuYW1lOiJNZWRpYVBhY2thZ2UifSxtZWRpYXN0b3JlOntuYW1lOiJNZWRpYVN0b3JlIn0sbWVkaWFzdG9yZWRhdGE6e3ByZWZpeDoibWVkaWFzdG9yZS1kYXRhIixuYW1lOiJNZWRpYVN0b3JlRGF0YSIsY29yczohMH0sYXBwc3luYzp7bmFtZToiQXBwU3luYyJ9LGd1YXJkZHV0eTp7bmFtZToiR3VhcmREdXR5In0sbXE6e25hbWU6Ik1RIn0sY29tcHJlaGVuZDp7bmFtZToiQ29tcHJlaGVuZCIsY29yczohMH0saW90am9ic2RhdGFwbGFuZTp7cHJlZml4OiJpb3Qtam9icy1kYXRhIixuYW1lOiJJb1RKb2JzRGF0YVBsYW5lIn0sa2luZXNpc3ZpZGVvYXJjaGl2ZWRtZWRpYTp7cHJlZml4OiJraW5lc2lzLXZpZGVvLWFyY2hpdmVkLW1lZGlhIixuYW1lOiJLaW5lc2lzVmlkZW9BcmNoaXZlZE1lZGlhIixjb3JzOiEwfSxraW5lc2lzdmlkZW9tZWRpYTp7cHJlZml4OiJraW5lc2lzLXZpZGVvLW1lZGlhIixuYW1lOiJLaW5lc2lzVmlkZW9NZWRpYSIsY29yczohMH0sa2luZXNpc3ZpZGVvOntuYW1lOiJLaW5lc2lzVmlkZW8iLGNvcnM6ITB9LHNhZ2VtYWtlcnJ1bnRpbWU6e3ByZWZpeDoicnVudGltZS5zYWdlbWFrZXIiLG5hbWU6IlNhZ2VNYWtlclJ1bnRpbWUifSxzYWdlbWFrZXI6e25hbWU6IlNhZ2VNYWtlciJ9LHRyYW5zbGF0ZTp7bmFtZToiVHJhbnNsYXRlIixjb3JzOiEwfSxyZXNvdXJjZWdyb3Vwczp7cHJlZml4OiJyZXNvdXJjZS1ncm91cHMiLG5hbWU6IlJlc291cmNlR3JvdXBzIixjb3JzOiEwfSxhbGV4YWZvcmJ1c2luZXNzOntuYW1lOiJBbGV4YUZvckJ1c2luZXNzIn0sY2xvdWQ5OntuYW1lOiJDbG91ZDkifSxzZXJ2ZXJsZXNzYXBwbGljYXRpb25yZXBvc2l0b3J5OntwcmVmaXg6InNlcnZlcmxlc3NyZXBvIixuYW1lOiJTZXJ2ZXJsZXNzQXBwbGljYXRpb25SZXBvc2l0b3J5In0sc2VydmljZWRpc2NvdmVyeTp7bmFtZToiU2VydmljZURpc2NvdmVyeSJ9LHdvcmttYWlsOntuYW1lOiJXb3JrTWFpbCJ9LGF1dG9zY2FsaW5ncGxhbnM6e3ByZWZpeDoiYXV0b3NjYWxpbmctcGxhbnMiLG5hbWU6IkF1dG9TY2FsaW5nUGxhbnMifSx0cmFuc2NyaWJlc2VydmljZTp7cHJlZml4OiJ0cmFuc2NyaWJlIixuYW1lOiJUcmFuc2NyaWJlU2VydmljZSJ9LGNvbm5lY3Q6e25hbWU6IkNvbm5lY3QiLGNvcnM6ITB9LGFjbXBjYTp7cHJlZml4OiJhY20tcGNhIixuYW1lOiJBQ01QQ0EifSxmbXM6e25hbWU6IkZNUyJ9LHNlY3JldHNtYW5hZ2VyOntuYW1lOiJTZWNyZXRzTWFuYWdlciIsY29yczohMH0saW90YW5hbHl0aWNzOntuYW1lOiJJb1RBbmFseXRpY3MiLGNvcnM6ITB9LGlvdDFjbGlja2RldmljZXNzZXJ2aWNlOntwcmVmaXg6ImlvdDFjbGljay1kZXZpY2VzIixuYW1lOiJJb1QxQ2xpY2tEZXZpY2VzU2VydmljZSJ9LGlvdDFjbGlja3Byb2plY3RzOntwcmVmaXg6ImlvdDFjbGljay1wcm9qZWN0cyIsbmFtZToiSW9UMUNsaWNrUHJvamVjdHMifSxwaTp7bmFtZToiUEkifSxuZXB0dW5lOntuYW1lOiJOZXB0dW5lIn0sbWVkaWF0YWlsb3I6e25hbWU6Ik1lZGlhVGFpbG9yIn0sZWtzOntuYW1lOiJFS1MifSxtYWNpZTp7bmFtZToiTWFjaWUifSxkbG06e25hbWU6IkRMTSJ9LHNpZ25lcjp7bmFtZToiU2lnbmVyIn0sY2hpbWU6e25hbWU6IkNoaW1lIn0scGlucG9pbnRlbWFpbDp7cHJlZml4OiJwaW5wb2ludC1lbWFpbCIsbmFtZToiUGlucG9pbnRFbWFpbCJ9LHJhbTp7bmFtZToiUkFNIn0scm91dGU1M3Jlc29sdmVyOntuYW1lOiJSb3V0ZTUzUmVzb2x2ZXIifSxwaW5wb2ludHNtc3ZvaWNlOntwcmVmaXg6InNtcy12b2ljZSIsbmFtZToiUGlucG9pbnRTTVNWb2ljZSJ9LHF1aWNrc2lnaHQ6e25hbWU6IlF1aWNrU2lnaHQifSxyZHNkYXRhc2VydmljZTp7cHJlZml4OiJyZHMtZGF0YSIsbmFtZToiUkRTRGF0YVNlcnZpY2UifSxhbXBsaWZ5OntuYW1lOiJBbXBsaWZ5In0sZGF0YXN5bmM6e25hbWU6IkRhdGFTeW5jIn0scm9ib21ha2VyOntuYW1lOiJSb2JvTWFrZXIifSx0cmFuc2Zlcjp7bmFtZToiVHJhbnNmZXIifSxnbG9iYWxhY2NlbGVyYXRvcjp7bmFtZToiR2xvYmFsQWNjZWxlcmF0b3IifSxjb21wcmVoZW5kbWVkaWNhbDp7bmFtZToiQ29tcHJlaGVuZE1lZGljYWwiLGNvcnM6ITB9LGtpbmVzaXNhbmFseXRpY3N2Mjp7bmFtZToiS2luZXNpc0FuYWx5dGljc1YyIn0sbWVkaWFjb25uZWN0OntuYW1lOiJNZWRpYUNvbm5lY3QifSxmc3g6e25hbWU6IkZTeCJ9LHNlY3VyaXR5aHViOntuYW1lOiJTZWN1cml0eUh1YiJ9LGFwcG1lc2g6e25hbWU6IkFwcE1lc2giLHZlcnNpb25zOlsiMjAxOC0xMC0wMSoiXX0sbGljZW5zZW1hbmFnZXI6e3ByZWZpeDoibGljZW5zZS1tYW5hZ2VyIixuYW1lOiJMaWNlbnNlTWFuYWdlciJ9LGthZmthOntuYW1lOiJLYWZrYSJ9LGFwaWdhdGV3YXltYW5hZ2VtZW50YXBpOntuYW1lOiJBcGlHYXRld2F5TWFuYWdlbWVudEFwaSJ9LGFwaWdhdGV3YXl2Mjp7bmFtZToiQXBpR2F0ZXdheVYyIn0sZG9jZGI6e25hbWU6IkRvY0RCIn0sYmFja3VwOntuYW1lOiJCYWNrdXAifSx3b3JrbGluazp7bmFtZToiV29ya0xpbmsifSx0ZXh0cmFjdDp7bmFtZToiVGV4dHJhY3QifSxtYW5hZ2VkYmxvY2tjaGFpbjp7bmFtZToiTWFuYWdlZEJsb2NrY2hhaW4ifSxtZWRpYXBhY2thZ2V2b2Q6e3ByZWZpeDoibWVkaWFwYWNrYWdlLXZvZCIsbmFtZToiTWVkaWFQYWNrYWdlVm9kIn0sZ3JvdW5kc3RhdGlvbjp7bmFtZToiR3JvdW5kU3RhdGlvbiJ9LGlvdHRoaW5nc2dyYXBoOntuYW1lOiJJb1RUaGluZ3NHcmFwaCJ9LGlvdGV2ZW50czp7bmFtZToiSW9URXZlbnRzIn0saW90ZXZlbnRzZGF0YTp7cHJlZml4OiJpb3RldmVudHMtZGF0YSIsbmFtZToiSW9URXZlbnRzRGF0YSJ9LHBlcnNvbmFsaXplOntuYW1lOiJQZXJzb25hbGl6ZSIsY29yczohMH0scGVyc29uYWxpemVldmVudHM6e3ByZWZpeDoicGVyc29uYWxpemUtZXZlbnRzIixuYW1lOiJQZXJzb25hbGl6ZUV2ZW50cyIsY29yczohMH0scGVyc29uYWxpemVydW50aW1lOntwcmVmaXg6InBlcnNvbmFsaXplLXJ1bnRpbWUiLG5hbWU6IlBlcnNvbmFsaXplUnVudGltZSIsY29yczohMH0sYXBwbGljYXRpb25pbnNpZ2h0czp7cHJlZml4OiJhcHBsaWNhdGlvbi1pbnNpZ2h0cyIsbmFtZToiQXBwbGljYXRpb25JbnNpZ2h0cyJ9LHNlcnZpY2VxdW90YXM6e3ByZWZpeDoic2VydmljZS1xdW90YXMiLG5hbWU6IlNlcnZpY2VRdW90YXMifSxlYzJpbnN0YW5jZWNvbm5lY3Q6e3ByZWZpeDoiZWMyLWluc3RhbmNlLWNvbm5lY3QiLG5hbWU6IkVDMkluc3RhbmNlQ29ubmVjdCJ9LGV2ZW50YnJpZGdlOntuYW1lOiJFdmVudEJyaWRnZSJ9LGxha2Vmb3JtYXRpb246e25hbWU6Ikxha2VGb3JtYXRpb24ifSxmb3JlY2FzdHNlcnZpY2U6e3ByZWZpeDoiZm9yZWNhc3QiLG5hbWU6IkZvcmVjYXN0U2VydmljZSIsY29yczohMH0sZm9yZWNhc3RxdWVyeXNlcnZpY2U6e3ByZWZpeDoiZm9yZWNhc3RxdWVyeSIsbmFtZToiRm9yZWNhc3RRdWVyeVNlcnZpY2UiLGNvcnM6ITB9LHFsZGI6e25hbWU6IlFMREIifSxxbGRic2Vzc2lvbjp7cHJlZml4OiJxbGRiLXNlc3Npb24iLG5hbWU6IlFMREJTZXNzaW9uIn0sd29ya21haWxtZXNzYWdlZmxvdzp7bmFtZToiV29ya01haWxNZXNzYWdlRmxvdyJ9LGNvZGVzdGFybm90aWZpY2F0aW9uczp7cHJlZml4OiJjb2Rlc3Rhci1ub3RpZmljYXRpb25zIixuYW1lOiJDb2RlU3Rhck5vdGlmaWNhdGlvbnMifSxzYXZpbmdzcGxhbnM6e25hbWU6IlNhdmluZ3NQbGFucyJ9LHNzbzp7bmFtZToiU1NPIn0sc3Nvb2lkYzp7cHJlZml4OiJzc28tb2lkYyIsbmFtZToiU1NPT0lEQyJ9LG1hcmtldHBsYWNlY2F0YWxvZzp7cHJlZml4OiJtYXJrZXRwbGFjZS1jYXRhbG9nIixuYW1lOiJNYXJrZXRwbGFjZUNhdGFsb2ciLGNvcnM6ITB9LGRhdGFleGNoYW5nZTp7bmFtZToiRGF0YUV4Y2hhbmdlIn0sc2VzdjI6e25hbWU6IlNFU1YyIn0sbWlncmF0aW9uaHViY29uZmlnOntwcmVmaXg6Im1pZ3JhdGlvbmh1Yi1jb25maWciLG5hbWU6Ik1pZ3JhdGlvbkh1YkNvbmZpZyJ9LGNvbm5lY3RwYXJ0aWNpcGFudDp7bmFtZToiQ29ubmVjdFBhcnRpY2lwYW50In0sYXBwY29uZmlnOntuYW1lOiJBcHBDb25maWcifSxpb3RzZWN1cmV0dW5uZWxpbmc6e25hbWU6IklvVFNlY3VyZVR1bm5lbGluZyJ9LHdhZnYyOntuYW1lOiJXQUZWMiJ9LGVsYXN0aWNpbmZlcmVuY2U6e3ByZWZpeDoiZWxhc3RpYy1pbmZlcmVuY2UiLG5hbWU6IkVsYXN0aWNJbmZlcmVuY2UifSxpbWFnZWJ1aWxkZXI6e25hbWU6IkltYWdlYnVpbGRlciJ9LHNjaGVtYXM6e25hbWU6IlNjaGVtYXMifSxhY2Nlc3NhbmFseXplcjp7bmFtZToiQWNjZXNzQW5hbHl6ZXIifSxjb2RlZ3VydXJldmlld2VyOntwcmVmaXg6ImNvZGVndXJ1LXJldmlld2VyIixuYW1lOiJDb2RlR3VydVJldmlld2VyIn0sY29kZWd1cnVwcm9maWxlcjp7bmFtZToiQ29kZUd1cnVQcm9maWxlciJ9LGNvbXB1dGVvcHRpbWl6ZXI6e3ByZWZpeDoiY29tcHV0ZS1vcHRpbWl6ZXIiLG5hbWU6IkNvbXB1dGVPcHRpbWl6ZXIifSxmcmF1ZGRldGVjdG9yOntuYW1lOiJGcmF1ZERldGVjdG9yIn0sa2VuZHJhOntuYW1lOiJLZW5kcmEifSxuZXR3b3JrbWFuYWdlcjp7bmFtZToiTmV0d29ya01hbmFnZXIifSxvdXRwb3N0czp7bmFtZToiT3V0cG9zdHMifSxhdWdtZW50ZWRhaXJ1bnRpbWU6e3ByZWZpeDoic2FnZW1ha2VyLWEyaS1ydW50aW1lIixuYW1lOiJBdWdtZW50ZWRBSVJ1bnRpbWUifSxlYnM6e25hbWU6IkVCUyJ9LGtpbmVzaXN2aWRlb3NpZ25hbGluZ2NoYW5uZWxzOntwcmVmaXg6ImtpbmVzaXMtdmlkZW8tc2lnbmFsaW5nIixuYW1lOiJLaW5lc2lzVmlkZW9TaWduYWxpbmdDaGFubmVscyIsY29yczohMH0sZGV0ZWN0aXZlOntuYW1lOiJEZXRlY3RpdmUifSxjb2Rlc3RhcmNvbm5lY3Rpb25zOntwcmVmaXg6ImNvZGVzdGFyLWNvbm5lY3Rpb25zIixuYW1lOiJDb2RlU3RhcmNvbm5lY3Rpb25zIn0sc3ludGhldGljczp7bmFtZToiU3ludGhldGljcyJ9LGlvdHNpdGV3aXNlOntuYW1lOiJJb1RTaXRlV2lzZSJ9LG1hY2llMjp7bmFtZToiTWFjaWUyIn0sY29kZWFydGlmYWN0OntuYW1lOiJDb2RlQXJ0aWZhY3QifSxob25leWNvZGU6e25hbWU6IkhvbmV5Y29kZSJ9LGl2czp7bmFtZToiSVZTIn0sYnJha2V0OntuYW1lOiJCcmFrZXQifSxpZGVudGl0eXN0b3JlOntuYW1lOiJJZGVudGl0eVN0b3JlIn0sYXBwZmxvdzp7bmFtZToiQXBwZmxvdyJ9LHJlZHNoaWZ0ZGF0YTp7cHJlZml4OiJyZWRzaGlmdC1kYXRhIixuYW1lOiJSZWRzaGlmdERhdGEifSxzc29hZG1pbjp7cHJlZml4OiJzc28tYWRtaW4iLG5hbWU6IlNTT0FkbWluIn0sdGltZXN0cmVhbXF1ZXJ5OntwcmVmaXg6InRpbWVzdHJlYW0tcXVlcnkiLG5hbWU6IlRpbWVzdHJlYW1RdWVyeSJ9LHRpbWVzdHJlYW13cml0ZTp7cHJlZml4OiJ0aW1lc3RyZWFtLXdyaXRlIixuYW1lOiJUaW1lc3RyZWFtV3JpdGUifSxzM291dHBvc3RzOntuYW1lOiJTM091dHBvc3RzIn0sZGF0YWJyZXc6e25hbWU6IkRhdGFCcmV3In0sc2VydmljZWNhdGFsb2dhcHByZWdpc3RyeTp7cHJlZml4OiJzZXJ2aWNlY2F0YWxvZy1hcHByZWdpc3RyeSIsbmFtZToiU2VydmljZUNhdGFsb2dBcHBSZWdpc3RyeSJ9LG5ldHdvcmtmaXJld2FsbDp7cHJlZml4OiJuZXR3b3JrLWZpcmV3YWxsIixuYW1lOiJOZXR3b3JrRmlyZXdhbGwifSxtd2FhOntuYW1lOiJNV0FBIn0sYW1wbGlmeWJhY2tlbmQ6e25hbWU6IkFtcGxpZnlCYWNrZW5kIn0sYXBwaW50ZWdyYXRpb25zOntuYW1lOiJBcHBJbnRlZ3JhdGlvbnMifSxjb25uZWN0Y29udGFjdGxlbnM6e3ByZWZpeDoiY29ubmVjdC1jb250YWN0LWxlbnMiLG5hbWU6IkNvbm5lY3RDb250YWN0TGVucyJ9LGRldm9wc2d1cnU6e3ByZWZpeDoiZGV2b3BzLWd1cnUiLG5hbWU6IkRldk9wc0d1cnUifSxlY3JwdWJsaWM6e3ByZWZpeDoiZWNyLXB1YmxpYyIsbmFtZToiRUNSUFVCTElDIn0sbG9va291dHZpc2lvbjp7bmFtZToiTG9va291dFZpc2lvbiJ9LHNhZ2VtYWtlcmZlYXR1cmVzdG9yZXJ1bnRpbWU6e3ByZWZpeDoic2FnZW1ha2VyLWZlYXR1cmVzdG9yZS1ydW50aW1lIixuYW1lOiJTYWdlTWFrZXJGZWF0dXJlU3RvcmVSdW50aW1lIn0sY3VzdG9tZXJwcm9maWxlczp7cHJlZml4OiJjdXN0b21lci1wcm9maWxlcyIsbmFtZToiQ3VzdG9tZXJQcm9maWxlcyJ9LGF1ZGl0bWFuYWdlcjp7bmFtZToiQXVkaXRNYW5hZ2VyIn0sZW1yY29udGFpbmVyczp7cHJlZml4OiJlbXItY29udGFpbmVycyIsbmFtZToiRU1SY29udGFpbmVycyJ9LGhlYWx0aGxha2U6e25hbWU6IkhlYWx0aExha2UifSxzYWdlbWFrZXJlZGdlOntwcmVmaXg6InNhZ2VtYWtlci1lZGdlIixuYW1lOiJTYWdlbWFrZXJFZGdlIn0sYW1wOntuYW1lOiJBbXAiLGNvcnM6ITB9LGdyZWVuZ3Jhc3N2Mjp7bmFtZToiR3JlZW5ncmFzc1YyIn0saW90ZGV2aWNlYWR2aXNvcjp7bmFtZToiSW90RGV2aWNlQWR2aXNvciJ9LGlvdGZsZWV0aHViOntuYW1lOiJJb1RGbGVldEh1YiJ9LGlvdHdpcmVsZXNzOntuYW1lOiJJb1RXaXJlbGVzcyJ9LGxvY2F0aW9uOntuYW1lOiJMb2NhdGlvbiIsY29yczohMH0sd2VsbGFyY2hpdGVjdGVkOntuYW1lOiJXZWxsQXJjaGl0ZWN0ZWQifSxsZXhtb2RlbHN2Mjp7cHJlZml4OiJtb2RlbHMubGV4LnYyIixuYW1lOiJMZXhNb2RlbHNWMiJ9LGxleHJ1bnRpbWV2Mjp7cHJlZml4OiJydW50aW1lLmxleC52MiIsbmFtZToiTGV4UnVudGltZVYyIixjb3JzOiEwfSxmaXM6e25hbWU6IkZpcyJ9LGxvb2tvdXRtZXRyaWNzOntuYW1lOiJMb29rb3V0TWV0cmljcyJ9LG1nbjp7bmFtZToiTWduIn0sbG9va291dGVxdWlwbWVudDp7bmFtZToiTG9va291dEVxdWlwbWVudCJ9LG5pbWJsZTp7bmFtZToiTmltYmxlIn0sZmluc3BhY2U6e25hbWU6IkZpbnNwYWNlIn0sZmluc3BhY2VkYXRhOntwcmVmaXg6ImZpbnNwYWNlLWRhdGEiLG5hbWU6IkZpbnNwYWNlZGF0YSJ9LHNzbWNvbnRhY3RzOntwcmVmaXg6InNzbS1jb250YWN0cyIsbmFtZToiU1NNQ29udGFjdHMifSxzc21pbmNpZGVudHM6e3ByZWZpeDoic3NtLWluY2lkZW50cyIsbmFtZToiU1NNSW5jaWRlbnRzIn0sYXBwbGljYXRpb25jb3N0cHJvZmlsZXI6e25hbWU6IkFwcGxpY2F0aW9uQ29zdFByb2ZpbGVyIn0sYXBwcnVubmVyOntuYW1lOiJBcHBSdW5uZXIifSxwcm90b246e25hbWU6IlByb3RvbiJ9LHJvdXRlNTNyZWNvdmVyeWNsdXN0ZXI6e3ByZWZpeDoicm91dGU1My1yZWNvdmVyeS1jbHVzdGVyIixuYW1lOiJSb3V0ZTUzUmVjb3ZlcnlDbHVzdGVyIn0scm91dGU1M3JlY292ZXJ5Y29udHJvbGNvbmZpZzp7cHJlZml4OiJyb3V0ZTUzLXJlY292ZXJ5LWNvbnRyb2wtY29uZmlnIixuYW1lOiJSb3V0ZTUzUmVjb3ZlcnlDb250cm9sQ29uZmlnIn0scm91dGU1M3JlY292ZXJ5cmVhZGluZXNzOntwcmVmaXg6InJvdXRlNTMtcmVjb3ZlcnktcmVhZGluZXNzIixuYW1lOiJSb3V0ZTUzUmVjb3ZlcnlSZWFkaW5lc3MifSxjaGltZXNka2lkZW50aXR5OntwcmVmaXg6ImNoaW1lLXNkay1pZGVudGl0eSIsbmFtZToiQ2hpbWVTREtJZGVudGl0eSJ9LGNoaW1lc2RrbWVzc2FnaW5nOntwcmVmaXg6ImNoaW1lLXNkay1tZXNzYWdpbmciLG5hbWU6IkNoaW1lU0RLTWVzc2FnaW5nIn0sc25vd2RldmljZW1hbmFnZW1lbnQ6e3ByZWZpeDoic25vdy1kZXZpY2UtbWFuYWdlbWVudCIsbmFtZToiU25vd0RldmljZU1hbmFnZW1lbnQifSxtZW1vcnlkYjp7bmFtZToiTWVtb3J5REIifSxvcGVuc2VhcmNoOntuYW1lOiJPcGVuU2VhcmNoIn0sa2Fma2Fjb25uZWN0OntuYW1lOiJLYWZrYUNvbm5lY3QifSx2b2ljZWlkOntwcmVmaXg6InZvaWNlLWlkIixuYW1lOiJWb2ljZUlEIn0sd2lzZG9tOntuYW1lOiJXaXNkb20ifSxhY2NvdW50OntuYW1lOiJBY2NvdW50In0sY2xvdWRjb250cm9sOntuYW1lOiJDbG91ZENvbnRyb2wifSxncmFmYW5hOntuYW1lOiJHcmFmYW5hIn0scGFub3JhbWE6e25hbWU6IlBhbm9yYW1hIn0sY2hpbWVzZGttZWV0aW5nczp7cHJlZml4OiJjaGltZS1zZGstbWVldGluZ3MiLG5hbWU6IkNoaW1lU0RLTWVldGluZ3MifSxyZXNpbGllbmNlaHViOntuYW1lOiJSZXNpbGllbmNlaHViIn0sbWlncmF0aW9uaHVic3RyYXRlZ3k6e25hbWU6Ik1pZ3JhdGlvbkh1YlN0cmF0ZWd5In0sYXBwY29uZmlnZGF0YTp7bmFtZToiQXBwQ29uZmlnRGF0YSJ9LGRyczp7bmFtZToiRHJzIn0sbWlncmF0aW9uaHVicmVmYWN0b3JzcGFjZXM6e3ByZWZpeDoibWlncmF0aW9uLWh1Yi1yZWZhY3Rvci1zcGFjZXMiLG5hbWU6Ik1pZ3JhdGlvbkh1YlJlZmFjdG9yU3BhY2VzIn0sZXZpZGVudGx5OntuYW1lOiJFdmlkZW50bHkifSxpbnNwZWN0b3IyOntuYW1lOiJJbnNwZWN0b3IyIn0scmJpbjp7bmFtZToiUmJpbiJ9LHJ1bTp7bmFtZToiUlVNIn0sYmFja3VwZ2F0ZXdheTp7cHJlZml4OiJiYWNrdXAtZ2F0ZXdheSIsbmFtZToiQmFja3VwR2F0ZXdheSJ9LGlvdHR3aW5tYWtlcjp7bmFtZToiSW9UVHdpbk1ha2VyIn0sd29ya3NwYWNlc3dlYjp7cHJlZml4OiJ3b3Jrc3BhY2VzLXdlYiIsbmFtZToiV29ya1NwYWNlc1dlYiJ9LGFtcGxpZnl1aWJ1aWxkZXI6e25hbWU6IkFtcGxpZnlVSUJ1aWxkZXIifSxrZXlzcGFjZXM6e25hbWU6IktleXNwYWNlcyJ9LGJpbGxpbmdjb25kdWN0b3I6e25hbWU6IkJpbGxpbmdjb25kdWN0b3IifSxnYW1lc3BhcmtzOntuYW1lOiJHYW1lU3BhcmtzIn0scGlucG9pbnRzbXN2b2ljZXYyOntwcmVmaXg6InBpbnBvaW50LXNtcy12b2ljZS12MiIsbmFtZToiUGlucG9pbnRTTVNWb2ljZVYyIn0saXZzY2hhdDp7bmFtZToiSXZzY2hhdCJ9LGNoaW1lc2RrbWVkaWFwaXBlbGluZXM6e3ByZWZpeDoiY2hpbWUtc2RrLW1lZGlhLXBpcGVsaW5lcyIsbmFtZToiQ2hpbWVTREtNZWRpYVBpcGVsaW5lcyJ9LGVtcnNlcnZlcmxlc3M6e3ByZWZpeDoiZW1yLXNlcnZlcmxlc3MiLG5hbWU6IkVNUlNlcnZlcmxlc3MifSxtMjp7bmFtZToiTTIifSxjb25uZWN0Y2FtcGFpZ25zOntuYW1lOiJDb25uZWN0Q2FtcGFpZ25zIn0scmVkc2hpZnRzZXJ2ZXJsZXNzOntwcmVmaXg6InJlZHNoaWZ0LXNlcnZlcmxlc3MiLG5hbWU6IlJlZHNoaWZ0U2VydmVybGVzcyJ9LHJvbGVzYW55d2hlcmU6e25hbWU6IlJvbGVzQW55d2hlcmUifSxsaWNlbnNlbWFuYWdlcnVzZXJzdWJzY3JpcHRpb25zOntwcmVmaXg6ImxpY2Vuc2UtbWFuYWdlci11c2VyLXN1YnNjcmlwdGlvbnMiLG5hbWU6IkxpY2Vuc2VNYW5hZ2VyVXNlclN1YnNjcmlwdGlvbnMifSxiYWNrdXBzdG9yYWdlOntuYW1lOiJCYWNrdXBTdG9yYWdlIn0scHJpdmF0ZW5ldHdvcmtzOntuYW1lOiJQcml2YXRlTmV0d29ya3MifSxzdXBwb3J0YXBwOntwcmVmaXg6InN1cHBvcnQtYXBwIixuYW1lOiJTdXBwb3J0QXBwIn0sY29udHJvbHRvd2VyOntuYW1lOiJDb250cm9sVG93ZXIifSxpb3RmbGVldHdpc2U6e25hbWU6IklvVEZsZWV0V2lzZSJ9LG1pZ3JhdGlvbmh1Ym9yY2hlc3RyYXRvcjp7bmFtZToiTWlncmF0aW9uSHViT3JjaGVzdHJhdG9yIn0sY29ubmVjdGNhc2VzOntuYW1lOiJDb25uZWN0Q2FzZXMifSxyZXNvdXJjZWV4cGxvcmVyMjp7cHJlZml4OiJyZXNvdXJjZS1leHBsb3Jlci0yIixuYW1lOiJSZXNvdXJjZUV4cGxvcmVyMiJ9LHNjaGVkdWxlcjp7bmFtZToiU2NoZWR1bGVyIn0sY2hpbWVzZGt2b2ljZTp7cHJlZml4OiJjaGltZS1zZGstdm9pY2UiLG5hbWU6IkNoaW1lU0RLVm9pY2UifSxpb3Ryb2JvcnVubmVyOntwcmVmaXg6ImlvdC1yb2JvcnVubmVyIixuYW1lOiJJb1RSb2JvUnVubmVyIn0sc3Ntc2FwOntwcmVmaXg6InNzbS1zYXAiLG5hbWU6IlNzbVNhcCJ9LG9hbTp7bmFtZToiT0FNIn0sYXJjem9uYWxzaGlmdDp7cHJlZml4OiJhcmMtem9uYWwtc2hpZnQiLG5hbWU6IkFSQ1pvbmFsU2hpZnQifSxvbWljczp7bmFtZToiT21pY3MifSxvcGVuc2VhcmNoc2VydmVybGVzczp7bmFtZToiT3BlblNlYXJjaFNlcnZlcmxlc3MifSxzZWN1cml0eWxha2U6e25hbWU6IlNlY3VyaXR5TGFrZSJ9LHNpbXNwYWNld2VhdmVyOntuYW1lOiJTaW1TcGFjZVdlYXZlciJ9LGRvY2RiZWxhc3RpYzp7cHJlZml4OiJkb2NkYi1lbGFzdGljIixuYW1lOiJEb2NEQkVsYXN0aWMifSxzYWdlbWFrZXJnZW9zcGF0aWFsOntwcmVmaXg6InNhZ2VtYWtlci1nZW9zcGF0aWFsIixuYW1lOiJTYWdlTWFrZXJHZW9zcGF0aWFsIn0sY29kZWNhdGFseXN0OntuYW1lOiJDb2RlQ2F0YWx5c3QifSxwaXBlczp7bmFtZToiUGlwZXMifSxzYWdlbWFrZXJtZXRyaWNzOntwcmVmaXg6InNhZ2VtYWtlci1tZXRyaWNzIixuYW1lOiJTYWdlTWFrZXJNZXRyaWNzIn0sa2luZXNpc3ZpZGVvd2VicnRjc3RvcmFnZTp7cHJlZml4OiJraW5lc2lzLXZpZGVvLXdlYnJ0Yy1zdG9yYWdlIixuYW1lOiJLaW5lc2lzVmlkZW9XZWJSVENTdG9yYWdlIn0sbGljZW5zZW1hbmFnZXJsaW51eHN1YnNjcmlwdGlvbnM6e3ByZWZpeDoibGljZW5zZS1tYW5hZ2VyLWxpbnV4LXN1YnNjcmlwdGlvbnMiLG5hbWU6IkxpY2Vuc2VNYW5hZ2VyTGludXhTdWJzY3JpcHRpb25zIn0sa2VuZHJhcmFua2luZzp7cHJlZml4OiJrZW5kcmEtcmFua2luZyIsbmFtZToiS2VuZHJhUmFua2luZyJ9LGNsZWFucm9vbXM6e25hbWU6IkNsZWFuUm9vbXMifSxjbG91ZHRyYWlsZGF0YTp7cHJlZml4OiJjbG91ZHRyYWlsLWRhdGEiLG5hbWU6IkNsb3VkVHJhaWxEYXRhIn0sdG5iOntuYW1lOiJUbmIifSxpbnRlcm5ldG1vbml0b3I6e25hbWU6IkludGVybmV0TW9uaXRvciJ9LGl2c3JlYWx0aW1lOntwcmVmaXg6Iml2cy1yZWFsdGltZSIsbmFtZToiSVZTUmVhbFRpbWUifSx2cGNsYXR0aWNlOntwcmVmaXg6InZwYy1sYXR0aWNlIixuYW1lOiJWUENMYXR0aWNlIn0sb3Npczp7bmFtZToiT1NJUyJ9LG1lZGlhcGFja2FnZXYyOntuYW1lOiJNZWRpYVBhY2thZ2VWMiJ9LHBheW1lbnRjcnlwdG9ncmFwaHk6e3ByZWZpeDoicGF5bWVudC1jcnlwdG9ncmFwaHkiLG5hbWU6IlBheW1lbnRDcnlwdG9ncmFwaHkifSxwYXltZW50Y3J5cHRvZ3JhcGh5ZGF0YTp7cHJlZml4OiJwYXltZW50LWNyeXB0b2dyYXBoeS1kYXRhIixuYW1lOiJQYXltZW50Q3J5cHRvZ3JhcGh5RGF0YSJ9LGNvZGVndXJ1c2VjdXJpdHk6e3ByZWZpeDoiY29kZWd1cnUtc2VjdXJpdHkiLG5hbWU6IkNvZGVHdXJ1U2VjdXJpdHkifSx2ZXJpZmllZHBlcm1pc3Npb25zOntuYW1lOiJWZXJpZmllZFBlcm1pc3Npb25zIn0sYXBwZmFicmljOntuYW1lOiJBcHBGYWJyaWMifSxtZWRpY2FsaW1hZ2luZzp7cHJlZml4OiJtZWRpY2FsLWltYWdpbmciLG5hbWU6Ik1lZGljYWxJbWFnaW5nIn0sZW50aXR5cmVzb2x1dGlvbjp7bmFtZToiRW50aXR5UmVzb2x1dGlvbiJ9LG1hbmFnZWRibG9ja2NoYWlucXVlcnk6e3ByZWZpeDoibWFuYWdlZGJsb2NrY2hhaW4tcXVlcnkiLG5hbWU6Ik1hbmFnZWRCbG9ja2NoYWluUXVlcnkifSxuZXB0dW5lZGF0YTp7bmFtZToiTmVwdHVuZWRhdGEifSxwY2Fjb25uZWN0b3JhZDp7cHJlZml4OiJwY2EtY29ubmVjdG9yLWFkIixuYW1lOiJQY2FDb25uZWN0b3JBZCJ9fX0se31dLDU6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3ZlcnNpb246IjIuMCIsbWV0YWRhdGE6e2FwaVZlcnNpb246IjIwMTEtMDYtMTUiLGVuZHBvaW50UHJlZml4OiJzdHMiLGdsb2JhbEVuZHBvaW50OiJzdHMuYW1hem9uYXdzLmNvbSIscHJvdG9jb2w6InF1ZXJ5IixzZXJ2aWNlQWJicmV2aWF0aW9uOiJBV1MgU1RTIixzZXJ2aWNlRnVsbE5hbWU6IkFXUyBTZWN1cml0eSBUb2tlbiBTZXJ2aWNlIixzZXJ2aWNlSWQ6IlNUUyIsc2lnbmF0dXJlVmVyc2lvbjoidjQiLHVpZDoic3RzLTIwMTEtMDYtMTUiLHhtbE5hbWVzcGFjZToiaHR0cHM6Ly9zdHMuYW1hem9uYXdzLmNvbS9kb2MvMjAxMS0wNi0xNS8ifSxvcGVyYXRpb25zOntBc3N1bWVSb2xlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIlJvbGVBcm4iLCJSb2xlU2Vzc2lvbk5hbWUiXSxtZW1iZXJzOntSb2xlQXJuOnt9LFJvbGVTZXNzaW9uTmFtZTp7fSxQb2xpY3lBcm5zOntzaGFwZToiUzQifSxQb2xpY3k6e30sRHVyYXRpb25TZWNvbmRzOnt0eXBlOiJpbnRlZ2VyIn0sVGFnczp7c2hhcGU6IlM4In0sVHJhbnNpdGl2ZVRhZ0tleXM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7fX0sRXh0ZXJuYWxJZDp7fSxTZXJpYWxOdW1iZXI6e30sVG9rZW5Db2RlOnt9LFNvdXJjZUlkZW50aXR5Ont9LFByb3ZpZGVkQ29udGV4dHM6e3R5cGU6Imxpc3QiLG1lbWJlcjp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOntQcm92aWRlckFybjp7fSxDb250ZXh0QXNzZXJ0aW9uOnt9fX19fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJBc3N1bWVSb2xlUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2wifSxBc3N1bWVkUm9sZVVzZXI6e3NoYXBlOiJTcSJ9LFBhY2tlZFBvbGljeVNpemU6e3R5cGU6ImludGVnZXIifSxTb3VyY2VJZGVudGl0eTp7fX19fSxBc3N1bWVSb2xlV2l0aFNBTUw6e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiUm9sZUFybiIsIlByaW5jaXBhbEFybiIsIlNBTUxBc3NlcnRpb24iXSxtZW1iZXJzOntSb2xlQXJuOnt9LFByaW5jaXBhbEFybjp7fSxTQU1MQXNzZXJ0aW9uOnt0eXBlOiJzdHJpbmciLHNlbnNpdGl2ZTohMH0sUG9saWN5QXJuczp7c2hhcGU6IlM0In0sUG9saWN5Ont9LER1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJBc3N1bWVSb2xlV2l0aFNBTUxSZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Q3JlZGVudGlhbHM6e3NoYXBlOiJTbCJ9LEFzc3VtZWRSb2xlVXNlcjp7c2hhcGU6IlNxIn0sUGFja2VkUG9saWN5U2l6ZTp7dHlwZToiaW50ZWdlciJ9LFN1YmplY3Q6e30sU3ViamVjdFR5cGU6e30sSXNzdWVyOnt9LEF1ZGllbmNlOnt9LE5hbWVRdWFsaWZpZXI6e30sU291cmNlSWRlbnRpdHk6e319fX0sQXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eTp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJSb2xlQXJuIiwiUm9sZVNlc3Npb25OYW1lIiwiV2ViSWRlbnRpdHlUb2tlbiJdLG1lbWJlcnM6e1JvbGVBcm46e30sUm9sZVNlc3Npb25OYW1lOnt9LFdlYklkZW50aXR5VG9rZW46e3R5cGU6InN0cmluZyIsc2Vuc2l0aXZlOiEwfSxQcm92aWRlcklkOnt9LFBvbGljeUFybnM6e3NoYXBlOiJTNCJ9LFBvbGljeTp7fSxEdXJhdGlvblNlY29uZHM6e3R5cGU6ImludGVnZXIifX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiQXNzdW1lUm9sZVdpdGhXZWJJZGVudGl0eVJlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntDcmVkZW50aWFsczp7c2hhcGU6IlNsIn0sU3ViamVjdEZyb21XZWJJZGVudGl0eVRva2VuOnt9LEFzc3VtZWRSb2xlVXNlcjp7c2hhcGU6IlNxIn0sUGFja2VkUG9saWN5U2l6ZTp7dHlwZToiaW50ZWdlciJ9LFByb3ZpZGVyOnt9LEF1ZGllbmNlOnt9LFNvdXJjZUlkZW50aXR5Ont9fX19LERlY29kZUF1dGhvcml6YXRpb25NZXNzYWdlOntpbnB1dDp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIkVuY29kZWRNZXNzYWdlIl0sbWVtYmVyczp7RW5jb2RlZE1lc3NhZ2U6e319fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkRlY29kZUF1dGhvcml6YXRpb25NZXNzYWdlUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0RlY29kZWRNZXNzYWdlOnt9fX19LEdldEFjY2Vzc0tleUluZm86e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiQWNjZXNzS2V5SWQiXSxtZW1iZXJzOntBY2Nlc3NLZXlJZDp7fX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiR2V0QWNjZXNzS2V5SW5mb1Jlc3VsdCIsdHlwZToic3RydWN0dXJlIixtZW1iZXJzOntBY2NvdW50Ont9fX19LEdldENhbGxlcklkZW50aXR5OntpbnB1dDp7dHlwZToic3RydWN0dXJlIixtZW1iZXJzOnt9fSxvdXRwdXQ6e3Jlc3VsdFdyYXBwZXI6IkdldENhbGxlcklkZW50aXR5UmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e1VzZXJJZDp7fSxBY2NvdW50Ont9LEFybjp7fX19fSxHZXRGZWRlcmF0aW9uVG9rZW46e2lucHV0Ont0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiTmFtZSJdLG1lbWJlcnM6e05hbWU6e30sUG9saWN5Ont9LFBvbGljeUFybnM6e3NoYXBlOiJTNCJ9LER1cmF0aW9uU2Vjb25kczp7dHlwZToiaW50ZWdlciJ9LFRhZ3M6e3NoYXBlOiJTOCJ9fX0sb3V0cHV0OntyZXN1bHRXcmFwcGVyOiJHZXRGZWRlcmF0aW9uVG9rZW5SZXN1bHQiLHR5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7Q3JlZGVudGlhbHM6e3NoYXBlOiJTbCJ9LEZlZGVyYXRlZFVzZXI6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJGZWRlcmF0ZWRVc2VySWQiLCJBcm4iXSxtZW1iZXJzOntGZWRlcmF0ZWRVc2VySWQ6e30sQXJuOnt9fX0sUGFja2VkUG9saWN5U2l6ZTp7dHlwZToiaW50ZWdlciJ9fX19LEdldFNlc3Npb25Ub2tlbjp7aW5wdXQ6e3R5cGU6InN0cnVjdHVyZSIsbWVtYmVyczp7RHVyYXRpb25TZWNvbmRzOnt0eXBlOiJpbnRlZ2VyIn0sU2VyaWFsTnVtYmVyOnt9LFRva2VuQ29kZTp7fX19LG91dHB1dDp7cmVzdWx0V3JhcHBlcjoiR2V0U2Vzc2lvblRva2VuUmVzdWx0Iix0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e0NyZWRlbnRpYWxzOntzaGFwZToiU2wifX19fX0sc2hhcGVzOntTNDp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e2Fybjp7fX19fSxTODp7dHlwZToibGlzdCIsbWVtYmVyOnt0eXBlOiJzdHJ1Y3R1cmUiLHJlcXVpcmVkOlsiS2V5IiwiVmFsdWUiXSxtZW1iZXJzOntLZXk6e30sVmFsdWU6e319fX0sU2w6e3R5cGU6InN0cnVjdHVyZSIscmVxdWlyZWQ6WyJBY2Nlc3NLZXlJZCIsIlNlY3JldEFjY2Vzc0tleSIsIlNlc3Npb25Ub2tlbiIsIkV4cGlyYXRpb24iXSxtZW1iZXJzOntBY2Nlc3NLZXlJZDp7fSxTZWNyZXRBY2Nlc3NLZXk6e3R5cGU6InN0cmluZyIsc2Vuc2l0aXZlOiEwfSxTZXNzaW9uVG9rZW46e30sRXhwaXJhdGlvbjp7dHlwZToidGltZXN0YW1wIn19fSxTcTp7dHlwZToic3RydWN0dXJlIixyZXF1aXJlZDpbIkFzc3VtZWRSb2xlSWQiLCJBcm4iXSxtZW1iZXJzOntBc3N1bWVkUm9sZUlkOnt9LEFybjp7fX19fX19LHt9XSw2OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtwYWdpbmF0aW9uOnt9fX0se31dLDc6W2Z1bmN0aW9uKGUsdCxuKXtlKCIuLi9saWIvbm9kZV9sb2FkZXIiKTt2YXIgcj1lKCIuLi9saWIvY29yZSIpLG89ci5TZXJ2aWNlLGk9ci5hcGlMb2FkZXI7aS5zZXJ2aWNlcy5jb2duaXRvaWRlbnRpdHk9e30sci5Db2duaXRvSWRlbnRpdHk9by5kZWZpbmVTZXJ2aWNlKCJjb2duaXRvaWRlbnRpdHkiLFsiMjAxNC0wNi0zMCJdKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaS5zZXJ2aWNlcy5jb2duaXRvaWRlbnRpdHksIjIwMTQtMDYtMzAiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1lKCIuLi9hcGlzL2NvZ25pdG8taWRlbnRpdHktMjAxNC0wNi0zMC5taW4uanNvbiIpO3JldHVybiB0LnBhZ2luYXRvcnM9ZSgiLi4vYXBpcy9jb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAucGFnaW5hdG9ycy5qc29uIikucGFnaW5hdGlvbix0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQuZXhwb3J0cz1yLkNvZ25pdG9JZGVudGl0eX0seyIuLi9hcGlzL2NvZ25pdG8taWRlbnRpdHktMjAxNC0wNi0zMC5taW4uanNvbiI6MSwiLi4vYXBpcy9jb2duaXRvLWlkZW50aXR5LTIwMTQtMDYtMzAucGFnaW5hdG9ycy5qc29uIjoyLCIuLi9saWIvY29yZSI6MTksIi4uL2xpYi9ub2RlX2xvYWRlciI6MTZ9XSw4OltmdW5jdGlvbihlLHQsbil7ZSgiLi4vbGliL25vZGVfbG9hZGVyIik7dmFyIHI9ZSgiLi4vbGliL2NvcmUiKSxvPXIuU2VydmljZSxpPXIuYXBpTG9hZGVyO2kuc2VydmljZXMuc3RzPXt9LHIuU1RTPW8uZGVmaW5lU2VydmljZSgic3RzIixbIjIwMTEtMDYtMTUiXSksZSgiLi4vbGliL3NlcnZpY2VzL3N0cyIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLnNlcnZpY2VzLnN0cywiMjAxMS0wNi0xNSIse2dldDpmdW5jdGlvbigpe3ZhciB0PWUoIi4uL2FwaXMvc3RzLTIwMTEtMDYtMTUubWluLmpzb24iKTtyZXR1cm4gdC5wYWdpbmF0b3JzPWUoIi4uL2FwaXMvc3RzLTIwMTEtMDYtMTUucGFnaW5hdG9ycy5qc29uIikucGFnaW5hdGlvbix0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQuZXhwb3J0cz1yLlNUU30seyIuLi9hcGlzL3N0cy0yMDExLTA2LTE1Lm1pbi5qc29uIjo1LCIuLi9hcGlzL3N0cy0yMDExLTA2LTE1LnBhZ2luYXRvcnMuanNvbiI6NiwiLi4vbGliL2NvcmUiOjE5LCIuLi9saWIvbm9kZV9sb2FkZXIiOjE2LCIuLi9saWIvc2VydmljZXMvc3RzIjo2M31dLDk6W2Z1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUsdCl7aWYoIXIuc2VydmljZXMuaGFzT3duUHJvcGVydHkoZSkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkU2VydmljZTogRmFpbGVkIHRvIGxvYWQgYXBpIGZvciAiK2UpO3JldHVybiByLnNlcnZpY2VzW2VdW3RdfXIuc2VydmljZXM9e30sdC5leHBvcnRzPXJ9LHt9XSwxMDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vYnJvd3NlckhtYWMiKSxvPWUoIi4vYnJvd3Nlck1kNSIpLGk9ZSgiLi9icm93c2VyU2hhMSIpLGE9ZSgiLi9icm93c2VyU2hhMjU2Iik7dC5leHBvcnRzPXtjcmVhdGVIYXNoOmZ1bmN0aW9uKGUpe2lmKCJtZDUiPT09KGU9ZS50b0xvd2VyQ2FzZSgpKSlyZXR1cm4gbmV3IG87aWYoInNoYTI1NiI9PT1lKXJldHVybiBuZXcgYTtpZigic2hhMSI9PT1lKXJldHVybiBuZXcgaTt0aHJvdyBuZXcgRXJyb3IoIkhhc2ggYWxnb3JpdGhtICIrZSsiIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhlIGJyb3dzZXIgU0RLIil9LGNyZWF0ZUhtYWM6ZnVuY3Rpb24oZSx0KXtpZigibWQ1Ij09PShlPWUudG9Mb3dlckNhc2UoKSkpcmV0dXJuIG5ldyByKG8sdCk7aWYoInNoYTI1NiI9PT1lKXJldHVybiBuZXcgcihhLHQpO2lmKCJzaGExIj09PWUpcmV0dXJuIG5ldyByKGksdCk7dGhyb3cgbmV3IEVycm9yKCJITUFDIGFsZ29yaXRobSAiK2UrIiBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIFNESyIpfSxjcmVhdGVTaWduOmZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJjcmVhdGVTaWduIGlzIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgYnJvd3NlciIpfX19LHsiLi9icm93c2VySG1hYyI6MTIsIi4vYnJvd3Nlck1kNSI6MTMsIi4vYnJvd3NlclNoYTEiOjE0LCIuL2Jyb3dzZXJTaGEyNTYiOjE1fV0sMTE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCJidWZmZXIvIikuQnVmZmVyOyJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnZvaWQgMD09PUFycmF5QnVmZmVyLmlzVmlldyYmKEFycmF5QnVmZmVyLmlzVmlldz1mdW5jdGlvbihlKXtyZXR1cm4gby5pbmRleE9mKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSk+LTF9KTt2YXIgbz1bIltvYmplY3QgSW50OEFycmF5XSIsIltvYmplY3QgVWludDhBcnJheV0iLCJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSIsIltvYmplY3QgSW50MTZBcnJheV0iLCJbb2JqZWN0IFVpbnQxNkFycmF5XSIsIltvYmplY3QgSW50MzJBcnJheV0iLCJbb2JqZWN0IFVpbnQzMkFycmF5XSIsIltvYmplY3QgRmxvYXQzMkFycmF5XSIsIltvYmplY3QgRmxvYXQ2NEFycmF5XSIsIltvYmplY3QgRGF0YVZpZXddIl07dC5leHBvcnRzPXtpc0VtcHR5RGF0YTpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/MD09PWUubGVuZ3RoOjA9PT1lLmJ5dGVMZW5ndGh9LGNvbnZlcnRUb0J1ZmZlcjpmdW5jdGlvbihlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGUmJihlPW5ldyByKGUsInV0ZjgiKSksQXJyYXlCdWZmZXIuaXNWaWV3KGUpP25ldyBVaW50OEFycmF5KGUuYnVmZmVyLGUuYnl0ZU9mZnNldCxlLmJ5dGVMZW5ndGgvVWludDhBcnJheS5CWVRFU19QRVJfRUxFTUVOVCk6bmV3IFVpbnQ4QXJyYXkoZSl9fX0seyJidWZmZXIvIjo4Nn1dLDEyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9icm93c2VySGFzaFV0aWxzIik7ZnVuY3Rpb24gbyhlLHQpe3RoaXMuaGFzaD1uZXcgZSx0aGlzLm91dGVyPW5ldyBlO3ZhciBuPWZ1bmN0aW9uKGUsdCl7dmFyIG49ci5jb252ZXJ0VG9CdWZmZXIodCk7aWYobi5ieXRlTGVuZ3RoPmUuQkxPQ0tfU0laRSl7dmFyIG89bmV3IGU7by51cGRhdGUobiksbj1vLmRpZ2VzdCgpfXZhciBpPW5ldyBVaW50OEFycmF5KGUuQkxPQ0tfU0laRSk7cmV0dXJuIGkuc2V0KG4pLGl9KGUsdCksbz1uZXcgVWludDhBcnJheShlLkJMT0NLX1NJWkUpO28uc2V0KG4pO2Zvcih2YXIgaT0wO2k8ZS5CTE9DS19TSVpFO2krKyluW2ldXj01NCxvW2ldXj05Mjtmb3IodGhpcy5oYXNoLnVwZGF0ZShuKSx0aGlzLm91dGVyLnVwZGF0ZShvKSxpPTA7aTxuLmJ5dGVMZW5ndGg7aSsrKW5baV09MH10LmV4cG9ydHM9byxvLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYoci5pc0VtcHR5RGF0YShlKXx8dGhpcy5lcnJvcilyZXR1cm4gdGhpczt0cnl7dGhpcy5oYXNoLnVwZGF0ZShyLmNvbnZlcnRUb0J1ZmZlcihlKSl9Y2F0Y2goZSl7dGhpcy5lcnJvcj1lfXJldHVybiB0aGlzfSxvLnByb3RvdHlwZS5kaWdlc3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMub3V0ZXIuZmluaXNoZWR8fHRoaXMub3V0ZXIudXBkYXRlKHRoaXMuaGFzaC5kaWdlc3QoKSksdGhpcy5vdXRlci5kaWdlc3QoZSl9fSx7Ii4vYnJvd3Nlckhhc2hVdGlscyI6MTF9XSwxMzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vYnJvd3Nlckhhc2hVdGlscyIpLG89ZSgiYnVmZmVyLyIpLkJ1ZmZlcixpPTY0O2Z1bmN0aW9uIGEoKXt0aGlzLnN0YXRlPVsxNzMyNTg0MTkzLDQwMjMyMzM0MTcsMjU2MjM4MzEwMiwyNzE3MzM4NzhdLHRoaXMuYnVmZmVyPW5ldyBEYXRhVmlldyhuZXcgQXJyYXlCdWZmZXIoaSkpLHRoaXMuYnVmZmVyTGVuZ3RoPTAsdGhpcy5ieXRlc0hhc2hlZD0wLHRoaXMuZmluaXNoZWQ9ITF9ZnVuY3Rpb24gcyhlLHQsbixyLG8saSl7cmV0dXJuKCh0PSh0K2UmNDI5NDk2NzI5NSkrKHIraSY0Mjk0OTY3Mjk1KSY0Mjk0OTY3Mjk1KTw8b3x0Pj4+MzItbykrbiY0Mjk0OTY3Mjk1fWZ1bmN0aW9uIGMoZSx0LG4scixvLGksYSl7cmV0dXJuIHModCZufH50JnIsZSx0LG8saSxhKX1mdW5jdGlvbiB1KGUsdCxuLHIsbyxpLGEpe3JldHVybiBzKHQmcnxuJn5yLGUsdCxvLGksYSl9ZnVuY3Rpb24gbChlLHQsbixyLG8saSxhKXtyZXR1cm4gcyh0Xm5ecixlLHQsbyxpLGEpfWZ1bmN0aW9uIHAoZSx0LG4scixvLGksYSl7cmV0dXJuIHMobl4odHx+ciksZSx0LG8saSxhKX10LmV4cG9ydHM9YSxhLkJMT0NLX1NJWkU9aSxhLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYoci5pc0VtcHR5RGF0YShlKSlyZXR1cm4gdGhpcztpZih0aGlzLmZpbmlzaGVkKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIHVwZGF0ZSBhbiBhbHJlYWR5IGZpbmlzaGVkIGhhc2guIik7dmFyIHQ9ci5jb252ZXJ0VG9CdWZmZXIoZSksbj0wLG89dC5ieXRlTGVuZ3RoO2Zvcih0aGlzLmJ5dGVzSGFzaGVkKz1vO28+MDspdGhpcy5idWZmZXIuc2V0VWludDgodGhpcy5idWZmZXJMZW5ndGgrKyx0W24rK10pLG8tLSx0aGlzLmJ1ZmZlckxlbmd0aD09PWkmJih0aGlzLmhhc2hCdWZmZXIoKSx0aGlzLmJ1ZmZlckxlbmd0aD0wKTtyZXR1cm4gdGhpc30sYS5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmZpbmlzaGVkKXt2YXIgdD10aGlzLG49dC5idWZmZXIscj10LmJ1ZmZlckxlbmd0aCxhPTgqdC5ieXRlc0hhc2hlZDtpZihuLnNldFVpbnQ4KHRoaXMuYnVmZmVyTGVuZ3RoKyssMTI4KSxyJWk+PTU2KXtmb3IodmFyIHM9dGhpcy5idWZmZXJMZW5ndGg7czxpO3MrKyluLnNldFVpbnQ4KHMsMCk7dGhpcy5oYXNoQnVmZmVyKCksdGhpcy5idWZmZXJMZW5ndGg9MH1mb3Iocz10aGlzLmJ1ZmZlckxlbmd0aDtzPDU2O3MrKyluLnNldFVpbnQ4KHMsMCk7bi5zZXRVaW50MzIoNTYsYT4+PjAsITApLG4uc2V0VWludDMyKDYwLE1hdGguZmxvb3IoYS80Mjk0OTY3Mjk2KSwhMCksdGhpcy5oYXNoQnVmZmVyKCksdGhpcy5maW5pc2hlZD0hMH12YXIgYz1uZXcgRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDE2KSk7Zm9yKHM9MDtzPDQ7cysrKWMuc2V0VWludDMyKDQqcyx0aGlzLnN0YXRlW3NdLCEwKTt2YXIgdT1uZXcgbyhjLmJ1ZmZlcixjLmJ5dGVPZmZzZXQsYy5ieXRlTGVuZ3RoKTtyZXR1cm4gZT91LnRvU3RyaW5nKGUpOnV9LGEucHJvdG90eXBlLmhhc2hCdWZmZXI9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmJ1ZmZlcix0PXRoaXMuc3RhdGUsbj10WzBdLHI9dFsxXSxvPXRbMl0saT10WzNdO249YyhuLHIsbyxpLGUuZ2V0VWludDMyKDAsITApLDcsMzYxNDA5MDM2MCksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoNCwhMCksMTIsMzkwNTQwMjcxMCksbz1jKG8saSxuLHIsZS5nZXRVaW50MzIoOCwhMCksMTcsNjA2MTA1ODE5KSxyPWMocixvLGksbixlLmdldFVpbnQzMigxMiwhMCksMjIsMzI1MDQ0MTk2Niksbj1jKG4scixvLGksZS5nZXRVaW50MzIoMTYsITApLDcsNDExODU0ODM5OSksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoMjAsITApLDEyLDEyMDAwODA0MjYpLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDI0LCEwKSwxNywyODIxNzM1OTU1KSxyPWMocixvLGksbixlLmdldFVpbnQzMigyOCwhMCksMjIsNDI0OTI2MTMxMyksbj1jKG4scixvLGksZS5nZXRVaW50MzIoMzIsITApLDcsMTc3MDAzNTQxNiksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoMzYsITApLDEyLDIzMzY1NTI4NzkpLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDQwLCEwKSwxNyw0Mjk0OTI1MjMzKSxyPWMocixvLGksbixlLmdldFVpbnQzMig0NCwhMCksMjIsMjMwNDU2MzEzNCksbj1jKG4scixvLGksZS5nZXRVaW50MzIoNDgsITApLDcsMTgwNDYwMzY4MiksaT1jKGksbixyLG8sZS5nZXRVaW50MzIoNTIsITApLDEyLDQyNTQ2MjYxOTUpLG89YyhvLGksbixyLGUuZ2V0VWludDMyKDU2LCEwKSwxNywyNzkyOTY1MDA2KSxuPXUobixyPWMocixvLGksbixlLmdldFVpbnQzMig2MCwhMCksMjIsMTIzNjUzNTMyOSksbyxpLGUuZ2V0VWludDMyKDQsITApLDUsNDEyOTE3MDc4NiksaT11KGksbixyLG8sZS5nZXRVaW50MzIoMjQsITApLDksMzIyNTQ2NTY2NCksbz11KG8saSxuLHIsZS5nZXRVaW50MzIoNDQsITApLDE0LDY0MzcxNzcxMykscj11KHIsbyxpLG4sZS5nZXRVaW50MzIoMCwhMCksMjAsMzkyMTA2OTk5NCksbj11KG4scixvLGksZS5nZXRVaW50MzIoMjAsITApLDUsMzU5MzQwODYwNSksaT11KGksbixyLG8sZS5nZXRVaW50MzIoNDAsITApLDksMzgwMTYwODMpLG89dShvLGksbixyLGUuZ2V0VWludDMyKDYwLCEwKSwxNCwzNjM0NDg4OTYxKSxyPXUocixvLGksbixlLmdldFVpbnQzMigxNiwhMCksMjAsMzg4OTQyOTQ0OCksbj11KG4scixvLGksZS5nZXRVaW50MzIoMzYsITApLDUsNTY4NDQ2NDM4KSxpPXUoaSxuLHIsbyxlLmdldFVpbnQzMig1NiwhMCksOSwzMjc1MTYzNjA2KSxvPXUobyxpLG4scixlLmdldFVpbnQzMigxMiwhMCksMTQsNDEwNzYwMzMzNSkscj11KHIsbyxpLG4sZS5nZXRVaW50MzIoMzIsITApLDIwLDExNjM1MzE1MDEpLG49dShuLHIsbyxpLGUuZ2V0VWludDMyKDUyLCEwKSw1LDI4NTAyODU4MjkpLGk9dShpLG4scixvLGUuZ2V0VWludDMyKDgsITApLDksNDI0MzU2MzUxMiksbz11KG8saSxuLHIsZS5nZXRVaW50MzIoMjgsITApLDE0LDE3MzUzMjg0NzMpLG49bChuLHI9dShyLG8saSxuLGUuZ2V0VWludDMyKDQ4LCEwKSwyMCwyMzY4MzU5NTYyKSxvLGksZS5nZXRVaW50MzIoMjAsITApLDQsNDI5NDU4ODczOCksaT1sKGksbixyLG8sZS5nZXRVaW50MzIoMzIsITApLDExLDIyNzIzOTI4MzMpLG89bChvLGksbixyLGUuZ2V0VWludDMyKDQ0LCEwKSwxNiwxODM5MDMwNTYyKSxyPWwocixvLGksbixlLmdldFVpbnQzMig1NiwhMCksMjMsNDI1OTY1Nzc0MCksbj1sKG4scixvLGksZS5nZXRVaW50MzIoNCwhMCksNCwyNzYzOTc1MjM2KSxpPWwoaSxuLHIsbyxlLmdldFVpbnQzMigxNiwhMCksMTEsMTI3Mjg5MzM1Myksbz1sKG8saSxuLHIsZS5nZXRVaW50MzIoMjgsITApLDE2LDQxMzk0Njk2NjQpLHI9bChyLG8saSxuLGUuZ2V0VWludDMyKDQwLCEwKSwyMywzMjAwMjM2NjU2KSxuPWwobixyLG8saSxlLmdldFVpbnQzMig1MiwhMCksNCw2ODEyNzkxNzQpLGk9bChpLG4scixvLGUuZ2V0VWludDMyKDAsITApLDExLDM5MzY0MzAwNzQpLG89bChvLGksbixyLGUuZ2V0VWludDMyKDEyLCEwKSwxNiwzNTcyNDQ1MzE3KSxyPWwocixvLGksbixlLmdldFVpbnQzMigyNCwhMCksMjMsNzYwMjkxODkpLG49bChuLHIsbyxpLGUuZ2V0VWludDMyKDM2LCEwKSw0LDM2NTQ2MDI4MDkpLGk9bChpLG4scixvLGUuZ2V0VWludDMyKDQ4LCEwKSwxMSwzODczMTUxNDYxKSxvPWwobyxpLG4scixlLmdldFVpbnQzMig2MCwhMCksMTYsNTMwNzQyNTIwKSxuPXAobixyPWwocixvLGksbixlLmdldFVpbnQzMig4LCEwKSwyMywzMjk5NjI4NjQ1KSxvLGksZS5nZXRVaW50MzIoMCwhMCksNiw0MDk2MzM2NDUyKSxpPXAoaSxuLHIsbyxlLmdldFVpbnQzMigyOCwhMCksMTAsMTEyNjg5MTQxNSksbz1wKG8saSxuLHIsZS5nZXRVaW50MzIoNTYsITApLDE1LDI4Nzg2MTIzOTEpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDIwLCEwKSwyMSw0MjM3NTMzMjQxKSxuPXAobixyLG8saSxlLmdldFVpbnQzMig0OCwhMCksNiwxNzAwNDg1NTcxKSxpPXAoaSxuLHIsbyxlLmdldFVpbnQzMigxMiwhMCksMTAsMjM5OTk4MDY5MCksbz1wKG8saSxuLHIsZS5nZXRVaW50MzIoNDAsITApLDE1LDQyOTM5MTU3NzMpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDQsITApLDIxLDIyNDAwNDQ0OTcpLG49cChuLHIsbyxpLGUuZ2V0VWludDMyKDMyLCEwKSw2LDE4NzMzMTMzNTkpLGk9cChpLG4scixvLGUuZ2V0VWludDMyKDYwLCEwKSwxMCw0MjY0MzU1NTUyKSxvPXAobyxpLG4scixlLmdldFVpbnQzMigyNCwhMCksMTUsMjczNDc2ODkxNikscj1wKHIsbyxpLG4sZS5nZXRVaW50MzIoNTIsITApLDIxLDEzMDkxNTE2NDkpLG49cChuLHIsbyxpLGUuZ2V0VWludDMyKDE2LCEwKSw2LDQxNDk0NDQyMjYpLGk9cChpLG4scixvLGUuZ2V0VWludDMyKDQ0LCEwKSwxMCwzMTc0NzU2OTE3KSxvPXAobyxpLG4scixlLmdldFVpbnQzMig4LCEwKSwxNSw3MTg3ODcyNTkpLHI9cChyLG8saSxuLGUuZ2V0VWludDMyKDM2LCEwKSwyMSwzOTUxNDgxNzQ1KSx0WzBdPW4rdFswXSY0Mjk0OTY3Mjk1LHRbMV09cit0WzFdJjQyOTQ5NjcyOTUsdFsyXT1vK3RbMl0mNDI5NDk2NzI5NSx0WzNdPWkrdFszXSY0Mjk0OTY3Mjk1fX0seyIuL2Jyb3dzZXJIYXNoVXRpbHMiOjExLCJidWZmZXIvIjo4Nn1dLDE0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiYnVmZmVyLyIpLkJ1ZmZlcixvPWUoIi4vYnJvd3Nlckhhc2hVdGlscyIpO2Z1bmN0aW9uIGkoKXt0aGlzLmgwPTE3MzI1ODQxOTMsdGhpcy5oMT00MDIzMjMzNDE3LHRoaXMuaDI9MjU2MjM4MzEwMix0aGlzLmgzPTI3MTczMzg3OCx0aGlzLmg0PTMyODUzNzc1MjAsdGhpcy5ibG9jaz1uZXcgVWludDMyQXJyYXkoODApLHRoaXMub2Zmc2V0PTAsdGhpcy5zaGlmdD0yNCx0aGlzLnRvdGFsTGVuZ3RoPTB9bmV3IFVpbnQzMkFycmF5KFsxNTE4NTAwMjQ5LDE4NTk3NzUzOTMsLTE4OTQwMDc1ODgsLTg5OTQ5NzUxNF0pLE1hdGgucG93KDIsNTMpLHQuZXhwb3J0cz1pLGkuQkxPQ0tfU0laRT02NCxpLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oZSl7aWYodGhpcy5maW5pc2hlZCl0aHJvdyBuZXcgRXJyb3IoIkF0dGVtcHRlZCB0byB1cGRhdGUgYW4gYWxyZWFkeSBmaW5pc2hlZCBoYXNoLiIpO2lmKG8uaXNFbXB0eURhdGEoZSkpcmV0dXJuIHRoaXM7dmFyIHQ9KGU9by5jb252ZXJ0VG9CdWZmZXIoZSkpLmxlbmd0aDt0aGlzLnRvdGFsTGVuZ3RoKz04KnQ7Zm9yKHZhciBuPTA7bjx0O24rKyl0aGlzLndyaXRlKGVbbl0pO3JldHVybiB0aGlzfSxpLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlKXt0aGlzLmJsb2NrW3RoaXMub2Zmc2V0XXw9KDI1NSZlKTw8dGhpcy5zaGlmdCx0aGlzLnNoaWZ0P3RoaXMuc2hpZnQtPTg6KHRoaXMub2Zmc2V0KyssdGhpcy5zaGlmdD0yNCksMTY9PT10aGlzLm9mZnNldCYmdGhpcy5wcm9jZXNzQmxvY2soKX0saS5wcm90b3R5cGUuZGlnZXN0PWZ1bmN0aW9uKGUpe3RoaXMud3JpdGUoMTI4KSwodGhpcy5vZmZzZXQ+MTR8fDE0PT09dGhpcy5vZmZzZXQmJnRoaXMuc2hpZnQ8MjQpJiZ0aGlzLnByb2Nlc3NCbG9jaygpLHRoaXMub2Zmc2V0PTE0LHRoaXMuc2hpZnQ9MjQsdGhpcy53cml0ZSgwKSx0aGlzLndyaXRlKDApLHRoaXMud3JpdGUodGhpcy50b3RhbExlbmd0aD4weGZmZmZmZmZmZmY/dGhpcy50b3RhbExlbmd0aC8xMDk5NTExNjI3Nzc2OjApLHRoaXMud3JpdGUodGhpcy50b3RhbExlbmd0aD40Mjk0OTY3Mjk1P3RoaXMudG90YWxMZW5ndGgvNDI5NDk2NzI5NjowKTtmb3IodmFyIHQ9MjQ7dD49MDt0LT04KXRoaXMud3JpdGUodGhpcy50b3RhbExlbmd0aD4+dCk7dmFyIG49bmV3IHIoMjApLG89bmV3IERhdGFWaWV3KG4uYnVmZmVyKTtyZXR1cm4gby5zZXRVaW50MzIoMCx0aGlzLmgwLCExKSxvLnNldFVpbnQzMig0LHRoaXMuaDEsITEpLG8uc2V0VWludDMyKDgsdGhpcy5oMiwhMSksby5zZXRVaW50MzIoMTIsdGhpcy5oMywhMSksby5zZXRVaW50MzIoMTYsdGhpcy5oNCwhMSksZT9uLnRvU3RyaW5nKGUpOm59LGkucHJvdG90eXBlLnByb2Nlc3NCbG9jaz1mdW5jdGlvbigpe2Zvcih2YXIgZT0xNjtlPDgwO2UrKyl7dmFyIHQ9dGhpcy5ibG9ja1tlLTNdXnRoaXMuYmxvY2tbZS04XV50aGlzLmJsb2NrW2UtMTRdXnRoaXMuYmxvY2tbZS0xNl07dGhpcy5ibG9ja1tlXT10PDwxfHQ+Pj4zMX12YXIgbixyLG89dGhpcy5oMCxpPXRoaXMuaDEsYT10aGlzLmgyLHM9dGhpcy5oMyxjPXRoaXMuaDQ7Zm9yKGU9MDtlPDgwO2UrKyl7ZTwyMD8obj1zXmkmKGFecykscj0xNTE4NTAwMjQ5KTplPDQwPyhuPWleYV5zLHI9MTg1OTc3NTM5Myk6ZTw2MD8obj1pJmF8cyYoaXxhKSxyPTI0MDA5NTk3MDgpOihuPWleYV5zLHI9MzM5NTQ2OTc4Mik7dmFyIHU9KG88PDV8bz4+PjI3KStuK2MrcisoMHx0aGlzLmJsb2NrW2VdKTtjPXMscz1hLGE9aTw8MzB8aT4+PjIsaT1vLG89dX1mb3IodGhpcy5oMD10aGlzLmgwK298MCx0aGlzLmgxPXRoaXMuaDEraXwwLHRoaXMuaDI9dGhpcy5oMithfDAsdGhpcy5oMz10aGlzLmgzK3N8MCx0aGlzLmg0PXRoaXMuaDQrY3wwLHRoaXMub2Zmc2V0PTAsZT0wO2U8MTY7ZSsrKXRoaXMuYmxvY2tbZV09MH19LHsiLi9icm93c2VySGFzaFV0aWxzIjoxMSwiYnVmZmVyLyI6ODZ9XSwxNTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoImJ1ZmZlci8iKS5CdWZmZXIsbz1lKCIuL2Jyb3dzZXJIYXNoVXRpbHMiKSxpPTY0LGE9bmV3IFVpbnQzMkFycmF5KFsxMTE2MzUyNDA4LDE4OTk0NDc0NDEsMzA0OTMyMzQ3MSwzOTIxMDA5NTczLDk2MTk4NzE2MywxNTA4OTcwOTkzLDI0NTM2MzU3NDgsMjg3MDc2MzIyMSwzNjI0MzgxMDgwLDMxMDU5ODQwMSw2MDcyMjUyNzgsMTQyNjg4MTk4NywxOTI1MDc4Mzg4LDIxNjIwNzgyMDYsMjYxNDg4ODEwMywzMjQ4MjIyNTgwLDM4MzUzOTA0MDEsNDAyMjIyNDc3NCwyNjQzNDcwNzgsNjA0ODA3NjI4LDc3MDI1NTk4MywxMjQ5MTUwMTIyLDE1NTUwODE2OTIsMTk5NjA2NDk4NiwyNTU0MjIwODgyLDI4MjE4MzQzNDksMjk1Mjk5NjgwOCwzMjEwMzEzNjcxLDMzMzY1NzE4OTEsMzU4NDUyODcxMSwxMTM5MjY5OTMsMzM4MjQxODk1LDY2NjMwNzIwNSw3NzM1Mjk5MTIsMTI5NDc1NzM3MiwxMzk2MTgyMjkxLDE2OTUxODM3MDAsMTk4NjY2MTA1MSwyMTc3MDI2MzUwLDI0NTY5NTYwMzcsMjczMDQ4NTkyMSwyODIwMzAyNDExLDMyNTk3MzA4MDAsMzM0NTc2NDc3MSwzNTE2MDY1ODE3LDM2MDAzNTI4MDQsNDA5NDU3MTkwOSwyNzU0MjMzNDQsNDMwMjI3NzM0LDUwNjk0ODYxNiw2NTkwNjA1NTYsODgzOTk3ODc3LDk1ODEzOTU3MSwxMzIyODIyMjE4LDE1MzcwMDIwNjMsMTc0Nzg3Mzc3OSwxOTU1NTYyMjIyLDIwMjQxMDQ4MTUsMjIyNzczMDQ1MiwyMzYxODUyNDI0LDI0Mjg0MzY0NzQsMjc1NjczNDE4NywzMjA0MDMxNDc5LDMzMjkzMjUyOThdKSxzPU1hdGgucG93KDIsNTMpLTE7ZnVuY3Rpb24gYygpe3RoaXMuc3RhdGU9WzE3NzkwMzM3MDMsMzE0NDEzNDI3NywxMDEzOTA0MjQyLDI3NzM0ODA3NjIsMTM1OTg5MzExOSwyNjAwODIyOTI0LDUyODczNDYzNSwxNTQxNDU5MjI1XSx0aGlzLnRlbXA9bmV3IEludDMyQXJyYXkoNjQpLHRoaXMuYnVmZmVyPW5ldyBVaW50OEFycmF5KDY0KSx0aGlzLmJ1ZmZlckxlbmd0aD0wLHRoaXMuYnl0ZXNIYXNoZWQ9MCx0aGlzLmZpbmlzaGVkPSExfXQuZXhwb3J0cz1jLGMuQkxPQ0tfU0laRT1pLGMucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlKXtpZih0aGlzLmZpbmlzaGVkKXRocm93IG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIHVwZGF0ZSBhbiBhbHJlYWR5IGZpbmlzaGVkIGhhc2guIik7aWYoby5pc0VtcHR5RGF0YShlKSlyZXR1cm4gdGhpczt2YXIgdD0wLG49KGU9by5jb252ZXJ0VG9CdWZmZXIoZSkpLmJ5dGVMZW5ndGg7aWYodGhpcy5ieXRlc0hhc2hlZCs9biw4KnRoaXMuYnl0ZXNIYXNoZWQ+cyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBoYXNoIG1vcmUgdGhhbiAyXjUzIC0gMSBiaXRzIik7Zm9yKDtuPjA7KXRoaXMuYnVmZmVyW3RoaXMuYnVmZmVyTGVuZ3RoKytdPWVbdCsrXSxuLS0sdGhpcy5idWZmZXJMZW5ndGg9PT1pJiYodGhpcy5oYXNoQnVmZmVyKCksdGhpcy5idWZmZXJMZW5ndGg9MCk7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLmRpZ2VzdD1mdW5jdGlvbihlKXtpZighdGhpcy5maW5pc2hlZCl7dmFyIHQ9OCp0aGlzLmJ5dGVzSGFzaGVkLG49bmV3IERhdGFWaWV3KHRoaXMuYnVmZmVyLmJ1ZmZlcix0aGlzLmJ1ZmZlci5ieXRlT2Zmc2V0LHRoaXMuYnVmZmVyLmJ5dGVMZW5ndGgpLG89dGhpcy5idWZmZXJMZW5ndGg7aWYobi5zZXRVaW50OCh0aGlzLmJ1ZmZlckxlbmd0aCsrLDEyOCksbyVpPj01Nil7Zm9yKHZhciBhPXRoaXMuYnVmZmVyTGVuZ3RoO2E8aTthKyspbi5zZXRVaW50OChhLDApO3RoaXMuaGFzaEJ1ZmZlcigpLHRoaXMuYnVmZmVyTGVuZ3RoPTB9Zm9yKGE9dGhpcy5idWZmZXJMZW5ndGg7YTw1NjthKyspbi5zZXRVaW50OChhLDApO24uc2V0VWludDMyKDU2LE1hdGguZmxvb3IodC80Mjk0OTY3Mjk2KSwhMCksbi5zZXRVaW50MzIoNjAsdCksdGhpcy5oYXNoQnVmZmVyKCksdGhpcy5maW5pc2hlZD0hMH12YXIgcz1uZXcgcigzMik7Zm9yKGE9MDthPDg7YSsrKXNbNCphXT10aGlzLnN0YXRlW2FdPj4+MjQmMjU1LHNbNCphKzFdPXRoaXMuc3RhdGVbYV0+Pj4xNiYyNTUsc1s0KmErMl09dGhpcy5zdGF0ZVthXT4+PjgmMjU1LHNbNCphKzNdPXRoaXMuc3RhdGVbYV0+Pj4wJjI1NTtyZXR1cm4gZT9zLnRvU3RyaW5nKGUpOnN9LGMucHJvdG90eXBlLmhhc2hCdWZmZXI9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5idWZmZXIsdD10aGlzLnN0YXRlLG49dFswXSxyPXRbMV0sbz10WzJdLHM9dFszXSxjPXRbNF0sdT10WzVdLGw9dFs2XSxwPXRbN10sZD0wO2Q8aTtkKyspe2lmKGQ8MTYpdGhpcy50ZW1wW2RdPSgyNTUmZVs0KmRdKTw8MjR8KDI1NSZlWzQqZCsxXSk8PDE2fCgyNTUmZVs0KmQrMl0pPDw4fDI1NSZlWzQqZCszXTtlbHNle3ZhciBmPXRoaXMudGVtcFtkLTJdLGg9KGY+Pj4xN3xmPDwxNSleKGY+Pj4xOXxmPDwxMyleZj4+PjEwLGc9KChmPXRoaXMudGVtcFtkLTE1XSk+Pj43fGY8PDI1KV4oZj4+PjE4fGY8PDE0KV5mPj4+Mzt0aGlzLnRlbXBbZF09KGgrdGhpcy50ZW1wW2QtN118MCkrKGcrdGhpcy50ZW1wW2QtMTZdfDApfXZhciBtPSgoKGM+Pj42fGM8PDI2KV4oYz4+PjExfGM8PDIxKV4oYz4+PjI1fGM8PDcpKSsoYyZ1Xn5jJmwpfDApKyhwKyhhW2RdK3RoaXMudGVtcFtkXXwwKXwwKXwwLHY9KChuPj4+MnxuPDwzMCleKG4+Pj4xM3xuPDwxOSleKG4+Pj4yMnxuPDwxMCkpKyhuJnJebiZvXnImbyl8MDtwPWwsbD11LHU9YyxjPXMrbXwwLHM9byxvPXIscj1uLG49bSt2fDB9dFswXSs9bix0WzFdKz1yLHRbMl0rPW8sdFszXSs9cyx0WzRdKz1jLHRbNV0rPXUsdFs2XSs9bCx0WzddKz1wfX0seyIuL2Jyb3dzZXJIYXNoVXRpbHMiOjExLCJidWZmZXIvIjo4Nn1dLDE2OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciBuPWUoIi4vdXRpbCIpO24uY3J5cHRvLmxpYj1lKCIuL2Jyb3dzZXJDcnlwdG9MaWIiKSxuLkJ1ZmZlcj1lKCJidWZmZXIvIikuQnVmZmVyLG4udXJsPWUoInVybC8iKSxuLnF1ZXJ5c3RyaW5nPWUoInF1ZXJ5c3RyaW5nLyIpLG4ucmVhbENsb2NrPWUoIi4vcmVhbGNsb2NrL2Jyb3dzZXJDbG9jayIpLG4uZW52aXJvbm1lbnQ9ImpzIixuLmNyZWF0ZUV2ZW50U3RyZWFtPWUoIi4vZXZlbnQtc3RyZWFtL2J1ZmZlcmVkLWNyZWF0ZS1ldmVudC1zdHJlYW0iKS5jcmVhdGVFdmVudFN0cmVhbSxuLmlzQnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybiEwfSxuLmlzTm9kZT1mdW5jdGlvbigpe3JldHVybiExfTt2YXIgcj1lKCIuL2NvcmUiKTtpZih0LmV4cG9ydHM9cixlKCIuL2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy9jcmVkZW50aWFsX3Byb3ZpZGVyX2NoYWluIiksZSgiLi9jcmVkZW50aWFscy90ZW1wb3JhcnlfY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL2NoYWluYWJsZV90ZW1wb3JhcnlfY3JlZGVudGlhbHMiKSxlKCIuL2NyZWRlbnRpYWxzL3dlYl9pZGVudGl0eV9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvY29nbml0b19pZGVudGl0eV9jcmVkZW50aWFscyIpLGUoIi4vY3JlZGVudGlhbHMvc2FtbF9jcmVkZW50aWFscyIpLHIuWE1MLlBhcnNlcj1lKCIuL3htbC9icm93c2VyX3BhcnNlciIpLGUoIi4vaHR0cC94aHIiKSx2b2lkIDA9PT1vKXZhciBvPXticm93c2VyOiEwfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9icm93c2VyQ3J5cHRvTGliIjoxMCwiLi9jb3JlIjoxOSwiLi9jcmVkZW50aWFscyI6MjAsIi4vY3JlZGVudGlhbHMvY2hhaW5hYmxlX3RlbXBvcmFyeV9jcmVkZW50aWFscyI6MjEsIi4vY3JlZGVudGlhbHMvY29nbml0b19pZGVudGl0eV9jcmVkZW50aWFscyI6MjIsIi4vY3JlZGVudGlhbHMvY3JlZGVudGlhbF9wcm92aWRlcl9jaGFpbiI6MjMsIi4vY3JlZGVudGlhbHMvc2FtbF9jcmVkZW50aWFscyI6MjQsIi4vY3JlZGVudGlhbHMvdGVtcG9yYXJ5X2NyZWRlbnRpYWxzIjoyNSwiLi9jcmVkZW50aWFscy93ZWJfaWRlbnRpdHlfY3JlZGVudGlhbHMiOjI2LCIuL2V2ZW50LXN0cmVhbS9idWZmZXJlZC1jcmVhdGUtZXZlbnQtc3RyZWFtIjoyOCwiLi9odHRwL3hociI6MzYsIi4vcmVhbGNsb2NrL2Jyb3dzZXJDbG9jayI6NTQsIi4vdXRpbCI6NzQsIi4veG1sL2Jyb3dzZXJfcGFyc2VyIjo3NSxfcHJvY2Vzczo5MSwiYnVmZmVyLyI6ODYsInF1ZXJ5c3RyaW5nLyI6OTgsInVybC8iOjEwMH1dLDE3OltmdW5jdGlvbihlLHQsbil7dmFyIHIsbz1lKCIuL2NvcmUiKTtlKCIuL2NyZWRlbnRpYWxzIiksZSgiLi9jcmVkZW50aWFscy9jcmVkZW50aWFsX3Byb3ZpZGVyX2NoYWluIiksby5Db25maWc9by51dGlsLmluaGVyaXQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPXt9KSxlPXRoaXMuZXh0cmFjdENyZWRlbnRpYWxzKGUpLG8udXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLmtleXMsKGZ1bmN0aW9uKHQsbil7dGhpcy5zZXQodCxlW3RdLG4pfSkpfSxnZXRDcmVkZW50aWFsczpmdW5jdGlvbihlKXt2YXIgdCxuPXRoaXM7ZnVuY3Rpb24gcih0KXtlKHQsdD9udWxsOm4uY3JlZGVudGlhbHMpfWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm4gbmV3IG8udXRpbC5lcnJvcih0fHxuZXcgRXJyb3Ise2NvZGU6IkNyZWRlbnRpYWxzRXJyb3IiLG1lc3NhZ2U6ZSxuYW1lOiJDcmVkZW50aWFsc0Vycm9yIn0pfW4uY3JlZGVudGlhbHM/ImZ1bmN0aW9uIj09dHlwZW9mIG4uY3JlZGVudGlhbHMuZ2V0P24uY3JlZGVudGlhbHMuZ2V0KChmdW5jdGlvbihlKXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCBjcmVkZW50aWFscyBmcm9tICIrbi5jcmVkZW50aWFscy5jb25zdHJ1Y3Rvci5uYW1lLGUpKSxyKGUpfSkpOih0PW51bGwsbi5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCYmbi5jcmVkZW50aWFscy5zZWNyZXRBY2Nlc3NLZXl8fCh0PWkoIk1pc3NpbmcgY3JlZGVudGlhbHMiKSkscih0KSk6bi5jcmVkZW50aWFsUHJvdmlkZXI/bi5jcmVkZW50aWFsUHJvdmlkZXIucmVzb2x2ZSgoZnVuY3Rpb24oZSx0KXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCBjcmVkZW50aWFscyBmcm9tIGFueSBwcm92aWRlcnMiLGUpKSxuLmNyZWRlbnRpYWxzPXQscihlKX0pKTpyKGkoIk5vIGNyZWRlbnRpYWxzIHRvIGxvYWQiKSl9LGdldFRva2VuOmZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcztmdW5jdGlvbiByKHQpe2UodCx0P251bGw6bi50b2tlbil9ZnVuY3Rpb24gaShlLHQpe3JldHVybiBuZXcgby51dGlsLmVycm9yKHR8fG5ldyBFcnJvcix7Y29kZToiVG9rZW5FcnJvciIsbWVzc2FnZTplLG5hbWU6IlRva2VuRXJyb3IifSl9bi50b2tlbj8iZnVuY3Rpb24iPT10eXBlb2Ygbi50b2tlbi5nZXQ/bi50b2tlbi5nZXQoKGZ1bmN0aW9uKGUpe2UmJihlPWkoIkNvdWxkIG5vdCBsb2FkIHRva2VuIGZyb20gIituLnRva2VuLmNvbnN0cnVjdG9yLm5hbWUsZSkpLHIoZSl9KSk6KHQ9bnVsbCxuLnRva2VuLnRva2VufHwodD1pKCJNaXNzaW5nIHRva2VuIikpLHIodCkpOm4udG9rZW5Qcm92aWRlcj9uLnRva2VuUHJvdmlkZXIucmVzb2x2ZSgoZnVuY3Rpb24oZSx0KXtlJiYoZT1pKCJDb3VsZCBub3QgbG9hZCB0b2tlbiBmcm9tIGFueSBwcm92aWRlcnMiLGUpKSxuLnRva2VuPXQscihlKX0pKTpyKGkoIk5vIHRva2VuIHRvIGxvYWQiKSl9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ITEsZT10aGlzLmV4dHJhY3RDcmVkZW50aWFscyhlKSxvLnV0aWwuZWFjaC5jYWxsKHRoaXMsZSwoZnVuY3Rpb24oZSxuKXsodHx8T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMua2V5cyxlKXx8by5TZXJ2aWNlLmhhc1NlcnZpY2UoZSkpJiZ0aGlzLnNldChlLG4pfSkpfSxsb2FkRnJvbVBhdGg6ZnVuY3Rpb24oZSl7dGhpcy5jbGVhcigpO3ZhciB0PUpTT04ucGFyc2Uoby51dGlsLnJlYWRGaWxlU3luYyhlKSksbj1uZXcgby5GaWxlU3lzdGVtQ3JlZGVudGlhbHMoZSkscj1uZXcgby5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbjtyZXR1cm4gci5wcm92aWRlcnMudW5zaGlmdChuKSxyLnJlc29sdmUoKGZ1bmN0aW9uKGUsbil7aWYoZSl0aHJvdyBlO3QuY3JlZGVudGlhbHM9bn0pKSx0aGlzLmNvbnN0cnVjdG9yKHQpLHRoaXN9LGNsZWFyOmZ1bmN0aW9uKCl7by51dGlsLmVhY2guY2FsbCh0aGlzLHRoaXMua2V5cywoZnVuY3Rpb24oZSl7ZGVsZXRlIHRoaXNbZV19KSksdGhpcy5zZXQoImNyZWRlbnRpYWxzIix2b2lkIDApLHRoaXMuc2V0KCJjcmVkZW50aWFsUHJvdmlkZXIiLHZvaWQgMCl9LHNldDpmdW5jdGlvbihlLHQsbil7dm9pZCAwPT09dD8odm9pZCAwPT09biYmKG49dGhpcy5rZXlzW2VdKSx0aGlzW2VdPSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uY2FsbCh0aGlzKTpuKToiaHR0cE9wdGlvbnMiPT09ZSYmdGhpc1tlXT90aGlzW2VdPW8udXRpbC5tZXJnZSh0aGlzW2VdLHQpOnRoaXNbZV09dH0sa2V5czp7Y3JlZGVudGlhbHM6bnVsbCxjcmVkZW50aWFsUHJvdmlkZXI6bnVsbCxyZWdpb246bnVsbCxsb2dnZXI6bnVsbCxhcGlWZXJzaW9uczp7fSxhcGlWZXJzaW9uOm51bGwsZW5kcG9pbnQ6dm9pZCAwLGh0dHBPcHRpb25zOnt0aW1lb3V0OjEyZTR9LG1heFJldHJpZXM6dm9pZCAwLG1heFJlZGlyZWN0czoxMCxwYXJhbVZhbGlkYXRpb246ITAsc3NsRW5hYmxlZDohMCxzM0ZvcmNlUGF0aFN0eWxlOiExLHMzQnVja2V0RW5kcG9pbnQ6ITEsczNEaXNhYmxlQm9keVNpZ25pbmc6ITAsczNVc0Vhc3QxUmVnaW9uYWxFbmRwb2ludDoibGVnYWN5IixzM1VzZUFyblJlZ2lvbjp2b2lkIDAsY29tcHV0ZUNoZWNrc3VtczohMCxjb252ZXJ0UmVzcG9uc2VUeXBlczohMCxjb3JyZWN0Q2xvY2tTa2V3OiExLGN1c3RvbVVzZXJBZ2VudDpudWxsLGR5bmFtb0RiQ3JjMzI6ITAsc3lzdGVtQ2xvY2tPZmZzZXQ6MCxzaWduYXR1cmVWZXJzaW9uOm51bGwsc2lnbmF0dXJlQ2FjaGU6ITAscmV0cnlEZWxheU9wdGlvbnM6e30sdXNlQWNjZWxlcmF0ZUVuZHBvaW50OiExLGNsaWVudFNpZGVNb25pdG9yaW5nOiExLGVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZDp2b2lkIDAsZW5kcG9pbnRDYWNoZVNpemU6MWUzLGhvc3RQcmVmaXhFbmFibGVkOiEwLHN0c1JlZ2lvbmFsRW5kcG9pbnRzOiJsZWdhY3kiLHVzZUZpcHNFbmRwb2ludDohMSx1c2VEdWFsc3RhY2tFbmRwb2ludDohMSx0b2tlbjpudWxsfSxleHRyYWN0Q3JlZGVudGlhbHM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuYWNjZXNzS2V5SWQmJmUuc2VjcmV0QWNjZXNzS2V5JiYoKGU9by51dGlsLmNvcHkoZSkpLmNyZWRlbnRpYWxzPW5ldyBvLkNyZWRlbnRpYWxzKGUpKSxlfSxzZXRQcm9taXNlc0RlcGVuZGVuY3k6ZnVuY3Rpb24oZSl7cj1lLG51bGw9PT1lJiYiZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZSYmKHI9UHJvbWlzZSk7dmFyIHQ9W28uUmVxdWVzdCxvLkNyZWRlbnRpYWxzLG8uQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW5dO28uUzMmJih0LnB1c2goby5TMyksby5TMy5NYW5hZ2VkVXBsb2FkJiZ0LnB1c2goby5TMy5NYW5hZ2VkVXBsb2FkKSksby51dGlsLmFkZFByb21pc2VzKHQscil9LGdldFByb21pc2VzRGVwZW5kZW5jeTpmdW5jdGlvbigpe3JldHVybiByfX0pLG8uY29uZmlnPW5ldyBvLkNvbmZpZ30seyIuL2NvcmUiOjE5LCIuL2NyZWRlbnRpYWxzIjoyMCwiLi9jcmVkZW50aWFscy9jcmVkZW50aWFsX3Byb3ZpZGVyX2NoYWluIjoyM31dLDE4OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciByPWUoIi4vY29yZSIpO2Z1bmN0aW9uIG8oZSx0KXtpZigic3RyaW5nIj09dHlwZW9mIGUpe2lmKFsibGVnYWN5IiwicmVnaW9uYWwiXS5pbmRleE9mKGUudG9Mb3dlckNhc2UoKSk+PTApcmV0dXJuIGUudG9Mb3dlckNhc2UoKTt0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLHQpfX10LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgaTtpZigoZT1lfHx7fSlbdC5jbGllbnRDb25maWddJiYoaT1vKGVbdC5jbGllbnRDb25maWddLHtjb2RlOiJJbnZhbGlkQ29uZmlndXJhdGlvbiIsbWVzc2FnZTonaW52YWxpZCAiJyt0LmNsaWVudENvbmZpZysnIiBjb25maWd1cmF0aW9uLiBFeHBlY3QgImxlZ2FjeSIgIG9yICJyZWdpb25hbCIuIEdvdCAiJytlW3QuY2xpZW50Q29uZmlnXSsnIi4nfSkpKXJldHVybiBpO2lmKCFyLnV0aWwuaXNOb2RlKCkpcmV0dXJuIGk7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4uZW52LHQuZW52KSYmKGk9byhuLmVudlt0LmVudl0se2NvZGU6IkludmFsaWRFbnZpcm9ubWVudGFsVmFyaWFibGUiLG1lc3NhZ2U6ImludmFsaWQgIit0LmVudisnIGVudmlyb25tZW50YWwgdmFyaWFibGUuIEV4cGVjdCAibGVnYWN5IiAgb3IgInJlZ2lvbmFsIi4gR290ICInK24uZW52W3QuZW52XSsnIi4nfSkpKXJldHVybiBpO3ZhciBhPXt9O3RyeXthPXIudXRpbC5nZXRQcm9maWxlc0Zyb21TaGFyZWRDb25maWcoci51dGlsLmluaUxvYWRlcilbbi5lbnYuQVdTX1BST0ZJTEV8fHIudXRpbC5kZWZhdWx0UHJvZmlsZV19Y2F0Y2goZSl7fXJldHVybiBhJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYSx0LnNoYXJlZENvbmZpZykmJihpPW8oYVt0LnNoYXJlZENvbmZpZ10se2NvZGU6IkludmFsaWRDb25maWd1cmF0aW9uIixtZXNzYWdlOiJpbnZhbGlkICIrdC5zaGFyZWRDb25maWcrJyBwcm9maWxlIGNvbmZpZy4gRXhwZWN0ICJsZWdhY3kiICBvciAicmVnaW9uYWwiLiBHb3QgIicrYVt0LnNoYXJlZENvbmZpZ10rJyIuJ30pKSxpfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSxfcHJvY2Vzczo5MX1dLDE5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9e3V0aWw6ZSgiLi91dGlsIil9Oyh7fSkudG9TdHJpbmcoKSx0LmV4cG9ydHM9cixyLnV0aWwudXBkYXRlKHIse1ZFUlNJT046IjIuMTQ1NS4wIixTaWduZXJzOnt9LFByb3RvY29sOntKc29uOmUoIi4vcHJvdG9jb2wvanNvbiIpLFF1ZXJ5OmUoIi4vcHJvdG9jb2wvcXVlcnkiKSxSZXN0OmUoIi4vcHJvdG9jb2wvcmVzdCIpLFJlc3RKc29uOmUoIi4vcHJvdG9jb2wvcmVzdF9qc29uIiksUmVzdFhtbDplKCIuL3Byb3RvY29sL3Jlc3RfeG1sIil9LFhNTDp7QnVpbGRlcjplKCIuL3htbC9idWlsZGVyIiksUGFyc2VyOm51bGx9LEpTT046e0J1aWxkZXI6ZSgiLi9qc29uL2J1aWxkZXIiKSxQYXJzZXI6ZSgiLi9qc29uL3BhcnNlciIpfSxNb2RlbDp7QXBpOmUoIi4vbW9kZWwvYXBpIiksT3BlcmF0aW9uOmUoIi4vbW9kZWwvb3BlcmF0aW9uIiksU2hhcGU6ZSgiLi9tb2RlbC9zaGFwZSIpLFBhZ2luYXRvcjplKCIuL21vZGVsL3BhZ2luYXRvciIpLFJlc291cmNlV2FpdGVyOmUoIi4vbW9kZWwvcmVzb3VyY2Vfd2FpdGVyIil9LGFwaUxvYWRlcjplKCIuL2FwaV9sb2FkZXIiKSxFbmRwb2ludENhY2hlOmUoIi4uL3ZlbmRvci9lbmRwb2ludC1jYWNoZSIpLkVuZHBvaW50Q2FjaGV9KSxlKCIuL3NlcXVlbnRpYWxfZXhlY3V0b3IiKSxlKCIuL3NlcnZpY2UiKSxlKCIuL2NvbmZpZyIpLGUoIi4vaHR0cCIpLGUoIi4vZXZlbnRfbGlzdGVuZXJzIiksZSgiLi9yZXF1ZXN0IiksZSgiLi9yZXNwb25zZSIpLGUoIi4vcmVzb3VyY2Vfd2FpdGVyIiksZSgiLi9zaWduZXJzL3JlcXVlc3Rfc2lnbmVyIiksZSgiLi9wYXJhbV92YWxpZGF0b3IiKSxlKCIuL21haW50ZW5hbmNlX21vZGVfbWVzc2FnZSIpLHIuZXZlbnRzPW5ldyByLlNlcXVlbnRpYWxFeGVjdXRvcixyLnV0aWwubWVtb2l6ZWRQcm9wZXJ0eShyLCJlbmRwb2ludENhY2hlIiwoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHIuRW5kcG9pbnRDYWNoZShyLmNvbmZpZy5lbmRwb2ludENhY2hlU2l6ZSl9KSwhMCl9LHsiLi4vdmVuZG9yL2VuZHBvaW50LWNhY2hlIjoxMTEsIi4vYXBpX2xvYWRlciI6OSwiLi9jb25maWciOjE3LCIuL2V2ZW50X2xpc3RlbmVycyI6MzQsIi4vaHR0cCI6MzUsIi4vanNvbi9idWlsZGVyIjozNywiLi9qc29uL3BhcnNlciI6MzgsIi4vbWFpbnRlbmFuY2VfbW9kZV9tZXNzYWdlIjozOSwiLi9tb2RlbC9hcGkiOjQwLCIuL21vZGVsL29wZXJhdGlvbiI6NDIsIi4vbW9kZWwvcGFnaW5hdG9yIjo0MywiLi9tb2RlbC9yZXNvdXJjZV93YWl0ZXIiOjQ0LCIuL21vZGVsL3NoYXBlIjo0NSwiLi9wYXJhbV92YWxpZGF0b3IiOjQ2LCIuL3Byb3RvY29sL2pzb24iOjQ4LCIuL3Byb3RvY29sL3F1ZXJ5Ijo0OSwiLi9wcm90b2NvbC9yZXN0Ijo1MCwiLi9wcm90b2NvbC9yZXN0X2pzb24iOjUxLCIuL3Byb3RvY29sL3Jlc3RfeG1sIjo1MiwiLi9yZXF1ZXN0Ijo1OCwiLi9yZXNvdXJjZV93YWl0ZXIiOjU5LCIuL3Jlc3BvbnNlIjo2MCwiLi9zZXF1ZW50aWFsX2V4ZWN1dG9yIjo2MSwiLi9zZXJ2aWNlIjo2MiwiLi9zaWduZXJzL3JlcXVlc3Rfc2lnbmVyIjo2NiwiLi91dGlsIjo3NCwiLi94bWwvYnVpbGRlciI6NzZ9XSwyMDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpO3IuQ3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKCl7aWYoci51dGlsLmhpZGVQcm9wZXJ0aWVzKHRoaXMsWyJzZWNyZXRBY2Nlc3NLZXkiXSksdGhpcy5leHBpcmVkPSExLHRoaXMuZXhwaXJlVGltZT1udWxsLHRoaXMucmVmcmVzaENhbGxiYWNrcz1bXSwxPT09YXJndW1lbnRzLmxlbmd0aCYmIm9iamVjdCI9PT1vKGFyZ3VtZW50c1swXSkpe3ZhciBlPWFyZ3VtZW50c1swXS5jcmVkZW50aWFsc3x8YXJndW1lbnRzWzBdO3RoaXMuYWNjZXNzS2V5SWQ9ZS5hY2Nlc3NLZXlJZCx0aGlzLnNlY3JldEFjY2Vzc0tleT1lLnNlY3JldEFjY2Vzc0tleSx0aGlzLnNlc3Npb25Ub2tlbj1lLnNlc3Npb25Ub2tlbn1lbHNlIHRoaXMuYWNjZXNzS2V5SWQ9YXJndW1lbnRzWzBdLHRoaXMuc2VjcmV0QWNjZXNzS2V5PWFyZ3VtZW50c1sxXSx0aGlzLnNlc3Npb25Ub2tlbj1hcmd1bWVudHNbMl19LGV4cGlyeVdpbmRvdzoxNSxuZWVkc1JlZnJlc2g6ZnVuY3Rpb24oKXt2YXIgZT1yLnV0aWwuZGF0ZS5nZXREYXRlKCkuZ2V0VGltZSgpLHQ9bmV3IERhdGUoZSsxZTMqdGhpcy5leHBpcnlXaW5kb3cpO3JldHVybiEhKHRoaXMuZXhwaXJlVGltZSYmdD50aGlzLmV4cGlyZVRpbWUpfHx0aGlzLmV4cGlyZWR8fCF0aGlzLmFjY2Vzc0tleUlkfHwhdGhpcy5zZWNyZXRBY2Nlc3NLZXl9LGdldDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMubmVlZHNSZWZyZXNoKCk/dGhpcy5yZWZyZXNoKChmdW5jdGlvbihuKXtufHwodC5leHBpcmVkPSExKSxlJiZlKG4pfSkpOmUmJmUoKX0scmVmcmVzaDpmdW5jdGlvbihlKXt0aGlzLmV4cGlyZWQ9ITEsZSgpfSxjb2FsZXNjZVJlZnJlc2g6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzOzE9PT1uLnJlZnJlc2hDYWxsYmFja3MucHVzaChlKSYmbi5sb2FkKChmdW5jdGlvbihlKXtyLnV0aWwuYXJyYXlFYWNoKG4ucmVmcmVzaENhbGxiYWNrcywoZnVuY3Rpb24obil7dD9uKGUpOnIudXRpbC5kZWZlcigoZnVuY3Rpb24oKXtuKGUpfSkpfSkpLG4ucmVmcmVzaENhbGxiYWNrcy5sZW5ndGg9MH0pKX0sbG9hZDpmdW5jdGlvbihlKXtlKCl9fSksci5DcmVkZW50aWFscy5hZGRQcm9taXNlc1RvQ2xhc3M9ZnVuY3Rpb24oZSl7dGhpcy5wcm90b3R5cGUuZ2V0UHJvbWlzZT1yLnV0aWwucHJvbWlzaWZ5TWV0aG9kKCJnZXQiLGUpLHRoaXMucHJvdG90eXBlLnJlZnJlc2hQcm9taXNlPXIudXRpbC5wcm9taXNpZnlNZXRob2QoInJlZnJlc2giLGUpfSxyLkNyZWRlbnRpYWxzLmRlbGV0ZVByb21pc2VzRnJvbUNsYXNzPWZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXMucHJvdG90eXBlLmdldFByb21pc2UsZGVsZXRlIHRoaXMucHJvdG90eXBlLnJlZnJlc2hQcm9taXNlfSxyLnV0aWwuYWRkUHJvbWlzZXMoci5DcmVkZW50aWFscyl9LHsiLi9jb3JlIjoxOX1dLDIxOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLkNoYWluYWJsZVRlbXBvcmFyeUNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSxlPWV8fHt9LHRoaXMuZXJyb3JDb2RlPSJDaGFpbmFibGVUZW1wb3JhcnlDcmVkZW50aWFsc1Byb3ZpZGVyRmFpbHVyZSIsdGhpcy5leHBpcmVkPSEwLHRoaXMudG9rZW5Db2RlRm49bnVsbDt2YXIgdD1yLnV0aWwuY29weShlLnBhcmFtcyl8fHt9O2lmKHQuUm9sZUFybiYmKHQuUm9sZVNlc3Npb25OYW1lPXQuUm9sZVNlc3Npb25OYW1lfHwidGVtcG9yYXJ5LWNyZWRlbnRpYWxzIiksdC5TZXJpYWxOdW1iZXIpe2lmKCFlLnRva2VuQ29kZUZufHwiZnVuY3Rpb24iIT10eXBlb2YgZS50b2tlbkNvZGVGbil0aHJvdyBuZXcgci51dGlsLmVycm9yKG5ldyBFcnJvcigidG9rZW5Db2RlRm4gbXVzdCBiZSBhIGZ1bmN0aW9uIHdoZW4gcGFyYW1zLlNlcmlhbE51bWJlciBpcyBnaXZlbiIpLHtjb2RlOnRoaXMuZXJyb3JDb2RlfSk7dGhpcy50b2tlbkNvZGVGbj1lLnRva2VuQ29kZUZufXZhciBuPXIudXRpbC5tZXJnZSh7cGFyYW1zOnQsY3JlZGVudGlhbHM6ZS5tYXN0ZXJDcmVkZW50aWFsc3x8ci5jb25maWcuY3JlZGVudGlhbHN9LGUuc3RzQ29uZmlnfHx7fSk7dGhpcy5zZXJ2aWNlPW5ldyBvKG4pfSxyZWZyZXNoOmZ1bmN0aW9uKGUpe3RoaXMuY29hbGVzY2VSZWZyZXNoKGV8fHIudXRpbC5mbi5jYWxsYmFjayl9LGxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXQuc2VydmljZS5jb25maWcucGFyYW1zLlJvbGVBcm4/ImFzc3VtZVJvbGUiOiJnZXRTZXNzaW9uVG9rZW4iO3RoaXMuZ2V0VG9rZW5Db2RlKChmdW5jdGlvbihyLG8pe3ZhciBpPXt9O3I/ZShyKToobyYmKGkuVG9rZW5Db2RlPW8pLHQuc2VydmljZVtuXShpLChmdW5jdGlvbihuLHIpe258fHQuc2VydmljZS5jcmVkZW50aWFsc0Zyb20ocix0KSxlKG4pfSkpKX0pKX0sZ2V0VG9rZW5Db2RlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy50b2tlbkNvZGVGbj90aGlzLnRva2VuQ29kZUZuKHRoaXMuc2VydmljZS5jb25maWcucGFyYW1zLlNlcmlhbE51bWJlciwoZnVuY3Rpb24obixvKXtpZihuKXt2YXIgaT1uO3JldHVybiBuIGluc3RhbmNlb2YgRXJyb3ImJihpPW4ubWVzc2FnZSksdm9pZCBlKHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIkVycm9yIGZldGNoaW5nIE1GQSB0b2tlbjogIitpKSx7Y29kZTp0LmVycm9yQ29kZX0pKX1lKG51bGwsbyl9KSk6ZShudWxsKX19KX0seyIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyMjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxpPWUoIi4uLy4uL2NsaWVudHMvY29nbml0b2lkZW50aXR5IiksYT1lKCIuLi8uLi9jbGllbnRzL3N0cyIpO3IuQ29nbml0b0lkZW50aXR5Q3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7bG9jYWxTdG9yYWdlS2V5OntpZDoiYXdzLmNvZ25pdG8uaWRlbnRpdHktaWQuIixwcm92aWRlcnM6ImF3cy5jb2duaXRvLmlkZW50aXR5LXByb3ZpZGVycy4ifSxjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe3IuQ3JlZGVudGlhbHMuY2FsbCh0aGlzKSx0aGlzLmV4cGlyZWQ9ITAsdGhpcy5wYXJhbXM9ZSx0aGlzLmRhdGE9bnVsbCx0aGlzLl9pZGVudGl0eUlkPW51bGwsdGhpcy5fY2xpZW50Q29uZmlnPXIudXRpbC5jb3B5KHR8fHt9KSx0aGlzLmxvYWRDYWNoZWRJZCgpO3ZhciBuPXRoaXM7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkZW50aXR5SWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbi5sb2FkQ2FjaGVkSWQoKSxuLl9pZGVudGl0eUlkfHxuLnBhcmFtcy5JZGVudGl0eUlkfSxzZXQ6ZnVuY3Rpb24oZSl7bi5faWRlbnRpdHlJZD1lfX0pfSxyZWZyZXNoOmZ1bmN0aW9uKGUpe3RoaXMuY29hbGVzY2VSZWZyZXNoKGV8fHIudXRpbC5mbi5jYWxsYmFjayl9LGxvYWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LmNyZWF0ZUNsaWVudHMoKSx0LmRhdGE9bnVsbCx0Ll9pZGVudGl0eUlkPW51bGwsdC5nZXRJZCgoZnVuY3Rpb24obil7bj8odC5jbGVhcklkT25Ob3RBdXRob3JpemVkKG4pLGUobikpOnQucGFyYW1zLlJvbGVBcm4/dC5nZXRDcmVkZW50aWFsc0Zyb21TVFMoZSk6dC5nZXRDcmVkZW50aWFsc0ZvcklkZW50aXR5KGUpfSkpfSxjbGVhckNhY2hlZElkOmZ1bmN0aW9uKCl7dGhpcy5faWRlbnRpdHlJZD1udWxsLGRlbGV0ZSB0aGlzLnBhcmFtcy5JZGVudGl0eUlkO3ZhciBlPXRoaXMucGFyYW1zLklkZW50aXR5UG9vbElkLHQ9dGhpcy5wYXJhbXMuTG9naW5JZHx8IiI7ZGVsZXRlIHRoaXMuc3RvcmFnZVt0aGlzLmxvY2FsU3RvcmFnZUtleS5pZCtlK3RdLGRlbGV0ZSB0aGlzLnN0b3JhZ2VbdGhpcy5sb2NhbFN0b3JhZ2VLZXkucHJvdmlkZXJzK2UrdF19LGNsZWFySWRPbk5vdEF1dGhvcml6ZWQ6ZnVuY3Rpb24oZSl7Ik5vdEF1dGhvcml6ZWRFeGNlcHRpb24iPT1lLmNvZGUmJnRoaXMuY2xlYXJDYWNoZWRJZCgpfSxnZXRJZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKCJzdHJpbmciPT10eXBlb2YgdC5wYXJhbXMuSWRlbnRpdHlJZClyZXR1cm4gZShudWxsLHQucGFyYW1zLklkZW50aXR5SWQpO3QuY29nbml0by5nZXRJZCgoZnVuY3Rpb24obixyKXshbiYmci5JZGVudGl0eUlkPyh0LnBhcmFtcy5JZGVudGl0eUlkPXIuSWRlbnRpdHlJZCxlKG51bGwsci5JZGVudGl0eUlkKSk6ZShuKX0pKX0sbG9hZENyZWRlbnRpYWxzOmZ1bmN0aW9uKGUsdCl7ZSYmdCYmKHQuZXhwaXJlZD0hMSx0LmFjY2Vzc0tleUlkPWUuQ3JlZGVudGlhbHMuQWNjZXNzS2V5SWQsdC5zZWNyZXRBY2Nlc3NLZXk9ZS5DcmVkZW50aWFscy5TZWNyZXRLZXksdC5zZXNzaW9uVG9rZW49ZS5DcmVkZW50aWFscy5TZXNzaW9uVG9rZW4sdC5leHBpcmVUaW1lPWUuQ3JlZGVudGlhbHMuRXhwaXJhdGlvbil9LGdldENyZWRlbnRpYWxzRm9ySWRlbnRpdHk6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LmNvZ25pdG8uZ2V0Q3JlZGVudGlhbHNGb3JJZGVudGl0eSgoZnVuY3Rpb24obixyKXtuP3QuY2xlYXJJZE9uTm90QXV0aG9yaXplZChuKToodC5jYWNoZUlkKHIpLHQuZGF0YT1yLHQubG9hZENyZWRlbnRpYWxzKHQuZGF0YSx0KSksZShuKX0pKX0sZ2V0Q3JlZGVudGlhbHNGcm9tU1RTOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dC5jb2duaXRvLmdldE9wZW5JZFRva2VuKChmdW5jdGlvbihuLHIpe24/KHQuY2xlYXJJZE9uTm90QXV0aG9yaXplZChuKSxlKG4pKToodC5jYWNoZUlkKHIpLHQucGFyYW1zLldlYklkZW50aXR5VG9rZW49ci5Ub2tlbix0LndlYklkZW50aXR5Q3JlZGVudGlhbHMucmVmcmVzaCgoZnVuY3Rpb24obil7bnx8KHQuZGF0YT10LndlYklkZW50aXR5Q3JlZGVudGlhbHMuZGF0YSx0LnN0cy5jcmVkZW50aWFsc0Zyb20odC5kYXRhLHQpKSxlKG4pfSkpKX0pKX0sbG9hZENhY2hlZElkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZihyLnV0aWwuaXNCcm93c2VyKCkmJiFlLnBhcmFtcy5JZGVudGl0eUlkKXt2YXIgdD1lLmdldFN0b3JhZ2UoImlkIik7aWYodCYmZS5wYXJhbXMuTG9naW5zKXt2YXIgbj1PYmplY3Qua2V5cyhlLnBhcmFtcy5Mb2dpbnMpOzAhPT0oZS5nZXRTdG9yYWdlKCJwcm92aWRlcnMiKXx8IiIpLnNwbGl0KCIsIikuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4tMSE9PW4uaW5kZXhPZihlKX0pKS5sZW5ndGgmJihlLnBhcmFtcy5JZGVudGl0eUlkPXQpfWVsc2UgdCYmKGUucGFyYW1zLklkZW50aXR5SWQ9dCl9fSxjcmVhdGVDbGllbnRzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fY2xpZW50Q29uZmlnO2lmKHRoaXMud2ViSWRlbnRpdHlDcmVkZW50aWFscz10aGlzLndlYklkZW50aXR5Q3JlZGVudGlhbHN8fG5ldyByLldlYklkZW50aXR5Q3JlZGVudGlhbHModGhpcy5wYXJhbXMsZSksIXRoaXMuY29nbml0byl7dmFyIHQ9ci51dGlsLm1lcmdlKHt9LGUpO3QucGFyYW1zPXRoaXMucGFyYW1zLHRoaXMuY29nbml0bz1uZXcgaSh0KX10aGlzLnN0cz10aGlzLnN0c3x8bmV3IGEoZSl9LGNhY2hlSWQ6ZnVuY3Rpb24oZSl7dGhpcy5faWRlbnRpdHlJZD1lLklkZW50aXR5SWQsdGhpcy5wYXJhbXMuSWRlbnRpdHlJZD10aGlzLl9pZGVudGl0eUlkLHIudXRpbC5pc0Jyb3dzZXIoKSYmKHRoaXMuc2V0U3RvcmFnZSgiaWQiLGUuSWRlbnRpdHlJZCksdGhpcy5wYXJhbXMuTG9naW5zJiZ0aGlzLnNldFN0b3JhZ2UoInByb3ZpZGVycyIsT2JqZWN0LmtleXModGhpcy5wYXJhbXMuTG9naW5zKS5qb2luKCIsIikpKX0sZ2V0U3RvcmFnZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5zdG9yYWdlW3RoaXMubG9jYWxTdG9yYWdlS2V5W2VdK3RoaXMucGFyYW1zLklkZW50aXR5UG9vbElkKyh0aGlzLnBhcmFtcy5Mb2dpbklkfHwiIildfSxzZXRTdG9yYWdlOmZ1bmN0aW9uKGUsdCl7dHJ5e3RoaXMuc3RvcmFnZVt0aGlzLmxvY2FsU3RvcmFnZUtleVtlXSt0aGlzLnBhcmFtcy5JZGVudGl0eVBvb2xJZCsodGhpcy5wYXJhbXMuTG9naW5JZHx8IiIpXT10fWNhdGNoKGUpe319LHN0b3JhZ2U6ZnVuY3Rpb24oKXt0cnl7dmFyIGU9ci51dGlsLmlzQnJvd3NlcigpJiZudWxsIT09d2luZG93LmxvY2FsU3RvcmFnZSYmIm9iamVjdCI9PT1vKHdpbmRvdy5sb2NhbFN0b3JhZ2UpP3dpbmRvdy5sb2NhbFN0b3JhZ2U6e307cmV0dXJuIGVbImF3cy50ZXN0LXN0b3JhZ2UiXT0iZm9vYmFyIixkZWxldGUgZVsiYXdzLnRlc3Qtc3RvcmFnZSJdLGV9Y2F0Y2goZSl7cmV0dXJue319fSgpfSl9LHsiLi4vLi4vY2xpZW50cy9jb2duaXRvaWRlbnRpdHkiOjcsIi4uLy4uL2NsaWVudHMvc3RzIjo4LCIuLi9jb3JlIjoxOX1dLDIzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpO3IuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW49ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSl7dGhpcy5wcm92aWRlcnM9ZXx8ci5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbi5kZWZhdWx0UHJvdmlkZXJzLnNsaWNlKDApLHRoaXMucmVzb2x2ZUNhbGxiYWNrcz1bXX0scmVzb2x2ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKDA9PT10LnByb3ZpZGVycy5sZW5ndGgpcmV0dXJuIGUobmV3IEVycm9yKCJObyBwcm92aWRlcnMiKSksdDtpZigxPT09dC5yZXNvbHZlQ2FsbGJhY2tzLnB1c2goZSkpe3ZhciBuPWZ1bmN0aW9uKGUsYSl7aWYoIWUmJmF8fG89PT1pLmxlbmd0aClyZXR1cm4gci51dGlsLmFycmF5RWFjaCh0LnJlc29sdmVDYWxsYmFja3MsKGZ1bmN0aW9uKHQpe3QoZSxhKX0pKSx2b2lkKHQucmVzb2x2ZUNhbGxiYWNrcy5sZW5ndGg9MCk7dmFyIHM9aVtvKytdOyhhPSJmdW5jdGlvbiI9PXR5cGVvZiBzP3MuY2FsbCgpOnMpLmdldD9hLmdldCgoZnVuY3Rpb24oZSl7bihlLGU/bnVsbDphKX0pKTpuKG51bGwsYSl9LG89MCxpPXQucHJvdmlkZXJzLnNsaWNlKDApO24oKX1yZXR1cm4gdH19KSxyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluLmRlZmF1bHRQcm92aWRlcnM9W10sci5DcmVkZW50aWFsUHJvdmlkZXJDaGFpbi5hZGRQcm9taXNlc1RvQ2xhc3M9ZnVuY3Rpb24oZSl7dGhpcy5wcm90b3R5cGUucmVzb2x2ZVByb21pc2U9ci51dGlsLnByb21pc2lmeU1ldGhvZCgicmVzb2x2ZSIsZSl9LHIuQ3JlZGVudGlhbFByb3ZpZGVyQ2hhaW4uZGVsZXRlUHJvbWlzZXNGcm9tQ2xhc3M9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5wcm90b3R5cGUucmVzb2x2ZVByb21pc2V9LHIudXRpbC5hZGRQcm9taXNlcyhyLkNyZWRlbnRpYWxQcm92aWRlckNoYWluKX0seyIuLi9jb3JlIjoxOX1dLDI0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vLi4vY2xpZW50cy9zdHMiKTtyLlNBTUxDcmVkZW50aWFscz1yLnV0aWwuaW5oZXJpdChyLkNyZWRlbnRpYWxzLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksdGhpcy5leHBpcmVkPSEwLHRoaXMucGFyYW1zPWV9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5jb2FsZXNjZVJlZnJlc2goZXx8ci51dGlsLmZuLmNhbGxiYWNrKX0sbG9hZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY3JlYXRlQ2xpZW50cygpLHQuc2VydmljZS5hc3N1bWVSb2xlV2l0aFNBTUwoKGZ1bmN0aW9uKG4scil7bnx8dC5zZXJ2aWNlLmNyZWRlbnRpYWxzRnJvbShyLHQpLGUobil9KSl9LGNyZWF0ZUNsaWVudHM6ZnVuY3Rpb24oKXt0aGlzLnNlcnZpY2U9dGhpcy5zZXJ2aWNlfHxuZXcgbyh7cGFyYW1zOnRoaXMucGFyYW1zfSl9fSl9LHsiLi4vLi4vY2xpZW50cy9zdHMiOjgsIi4uL2NvcmUiOjE5fV0sMjU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi8uLi9jbGllbnRzL3N0cyIpO3IuVGVtcG9yYXJ5Q3JlZGVudGlhbHM9ci51dGlsLmluaGVyaXQoci5DcmVkZW50aWFscyx7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtyLkNyZWRlbnRpYWxzLmNhbGwodGhpcyksdGhpcy5sb2FkTWFzdGVyQ3JlZGVudGlhbHModCksdGhpcy5leHBpcmVkPSEwLHRoaXMucGFyYW1zPWV8fHt9LHRoaXMucGFyYW1zLlJvbGVBcm4mJih0aGlzLnBhcmFtcy5Sb2xlU2Vzc2lvbk5hbWU9dGhpcy5wYXJhbXMuUm9sZVNlc3Npb25OYW1lfHwidGVtcG9yYXJ5LWNyZWRlbnRpYWxzIil9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5jb2FsZXNjZVJlZnJlc2goZXx8ci51dGlsLmZuLmNhbGxiYWNrKX0sbG9hZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY3JlYXRlQ2xpZW50cygpLHQubWFzdGVyQ3JlZGVudGlhbHMuZ2V0KChmdW5jdGlvbigpe3Quc2VydmljZS5jb25maWcuY3JlZGVudGlhbHM9dC5tYXN0ZXJDcmVkZW50aWFscywodC5wYXJhbXMuUm9sZUFybj90LnNlcnZpY2UuYXNzdW1lUm9sZTp0LnNlcnZpY2UuZ2V0U2Vzc2lvblRva2VuKS5jYWxsKHQuc2VydmljZSwoZnVuY3Rpb24obixyKXtufHx0LnNlcnZpY2UuY3JlZGVudGlhbHNGcm9tKHIsdCksZShuKX0pKX0pKX0sbG9hZE1hc3RlckNyZWRlbnRpYWxzOmZ1bmN0aW9uKGUpe2Zvcih0aGlzLm1hc3RlckNyZWRlbnRpYWxzPWV8fHIuY29uZmlnLmNyZWRlbnRpYWxzO3RoaXMubWFzdGVyQ3JlZGVudGlhbHMubWFzdGVyQ3JlZGVudGlhbHM7KXRoaXMubWFzdGVyQ3JlZGVudGlhbHM9dGhpcy5tYXN0ZXJDcmVkZW50aWFscy5tYXN0ZXJDcmVkZW50aWFsczsiZnVuY3Rpb24iIT10eXBlb2YgdGhpcy5tYXN0ZXJDcmVkZW50aWFscy5nZXQmJih0aGlzLm1hc3RlckNyZWRlbnRpYWxzPW5ldyByLkNyZWRlbnRpYWxzKHRoaXMubWFzdGVyQ3JlZGVudGlhbHMpKX0sY3JlYXRlQ2xpZW50czpmdW5jdGlvbigpe3RoaXMuc2VydmljZT10aGlzLnNlcnZpY2V8fG5ldyBvKHtwYXJhbXM6dGhpcy5wYXJhbXN9KX19KX0seyIuLi8uLi9jbGllbnRzL3N0cyI6OCwiLi4vY29yZSI6MTl9XSwyNjpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uLy4uL2NsaWVudHMvc3RzIik7ci5XZWJJZGVudGl0eUNyZWRlbnRpYWxzPXIudXRpbC5pbmhlcml0KHIuQ3JlZGVudGlhbHMse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCl7ci5DcmVkZW50aWFscy5jYWxsKHRoaXMpLHRoaXMuZXhwaXJlZD0hMCx0aGlzLnBhcmFtcz1lLHRoaXMucGFyYW1zLlJvbGVTZXNzaW9uTmFtZT10aGlzLnBhcmFtcy5Sb2xlU2Vzc2lvbk5hbWV8fCJ3ZWItaWRlbnRpdHkiLHRoaXMuZGF0YT1udWxsLHRoaXMuX2NsaWVudENvbmZpZz1yLnV0aWwuY29weSh0fHx7fSl9LHJlZnJlc2g6ZnVuY3Rpb24oZSl7dGhpcy5jb2FsZXNjZVJlZnJlc2goZXx8ci51dGlsLmZuLmNhbGxiYWNrKX0sbG9hZDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuY3JlYXRlQ2xpZW50cygpLHQuc2VydmljZS5hc3N1bWVSb2xlV2l0aFdlYklkZW50aXR5KChmdW5jdGlvbihuLHIpe3QuZGF0YT1udWxsLG58fCh0LmRhdGE9cix0LnNlcnZpY2UuY3JlZGVudGlhbHNGcm9tKHIsdCkpLGUobil9KSl9LGNyZWF0ZUNsaWVudHM6ZnVuY3Rpb24oKXtpZighdGhpcy5zZXJ2aWNlKXt2YXIgZT1yLnV0aWwubWVyZ2Uoe30sdGhpcy5fY2xpZW50Q29uZmlnKTtlLnBhcmFtcz10aGlzLnBhcmFtcyx0aGlzLnNlcnZpY2U9bmV3IG8oZSl9fX0pfSx7Ii4uLy4uL2NsaWVudHMvc3RzIjo4LCIuLi9jb3JlIjoxOX1dLDI3OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKG4peyhmdW5jdGlvbigpe3ZhciByPWUoIi4vY29yZSIpLG89ZSgiLi91dGlsIiksaT1bIkFXU19FTkFCTEVfRU5EUE9JTlRfRElTQ09WRVJZIiwiQVdTX0VORFBPSU5UX0RJU0NPVkVSWV9FTkFCTEVEIl07ZnVuY3Rpb24gYShlKXt2YXIgdD1lLnNlcnZpY2Usbj10LmFwaXx8e30scj0obi5vcGVyYXRpb25zLHt9KTtyZXR1cm4gdC5jb25maWcucmVnaW9uJiYoci5yZWdpb249dC5jb25maWcucmVnaW9uKSxuLnNlcnZpY2VJZCYmKHIuc2VydmljZUlkPW4uc2VydmljZUlkKSx0LmNvbmZpZy5jcmVkZW50aWFscy5hY2Nlc3NLZXlJZCYmKHIuYWNjZXNzS2V5SWQ9dC5jb25maWcuY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQpLHJ9ZnVuY3Rpb24gcyhlLHQsbil7biYmbnVsbCE9dCYmInN0cnVjdHVyZSI9PT1uLnR5cGUmJm4ucmVxdWlyZWQmJm4ucmVxdWlyZWQubGVuZ3RoPjAmJm8uYXJyYXlFYWNoKG4ucmVxdWlyZWQsKGZ1bmN0aW9uKHIpe3ZhciBvPW4ubWVtYmVyc1tyXTtpZighMD09PW8uZW5kcG9pbnREaXNjb3ZlcnlJZCl7dmFyIGk9by5pc0xvY2F0aW9uTmFtZT9vLm5hbWU6cjtlW2ldPVN0cmluZyh0W3JdKX1lbHNlIHMoZSx0W3JdLG8pfSkpfWZ1bmN0aW9uIGMoZSx0KXt2YXIgbj17fTtyZXR1cm4gcyhuLGUucGFyYW1zLHQpLG59ZnVuY3Rpb24gdShlKXt2YXIgdD1lLnNlcnZpY2Usbj10LmFwaSxpPW4ub3BlcmF0aW9ucz9uLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dOnZvaWQgMCxzPWMoZSxpP2kuaW5wdXQ6dm9pZCAwKSx1PWEoZSk7T2JqZWN0LmtleXMocykubGVuZ3RoPjAmJih1PW8udXBkYXRlKHUscyksaSYmKHUub3BlcmF0aW9uPWkubmFtZSkpO3ZhciBsPXIuZW5kcG9pbnRDYWNoZS5nZXQodSk7aWYoIWx8fDEhPT1sLmxlbmd0aHx8IiIhPT1sWzBdLkFkZHJlc3MpaWYobCYmbC5sZW5ndGg+MCllLmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KGxbMF0uQWRkcmVzcyk7ZWxzZXt2YXIgcD10Lm1ha2VSZXF1ZXN0KG4uZW5kcG9pbnRPcGVyYXRpb24se09wZXJhdGlvbjppLm5hbWUsSWRlbnRpZmllcnM6c30pO2QocCkscC5yZW1vdmVMaXN0ZW5lcigidmFsaWRhdGUiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5WQUxJREFURV9QQVJBTUVURVJTKSxwLnJlbW92ZUxpc3RlbmVyKCJyZXRyeSIsci5FdmVudExpc3RlbmVycy5Db3JlLlJFVFJZX0NIRUNLKSxyLmVuZHBvaW50Q2FjaGUucHV0KHUsW3tBZGRyZXNzOiIiLENhY2hlUGVyaW9kSW5NaW51dGVzOjF9XSkscC5zZW5kKChmdW5jdGlvbihlLHQpe3QmJnQuRW5kcG9pbnRzP3IuZW5kcG9pbnRDYWNoZS5wdXQodSx0LkVuZHBvaW50cyk6ZSYmci5lbmRwb2ludENhY2hlLnB1dCh1LFt7QWRkcmVzczoiIixDYWNoZVBlcmlvZEluTWludXRlczoxfV0pfSkpfX12YXIgbD17fTtmdW5jdGlvbiBwKGUsdCl7dmFyIG49ZS5zZXJ2aWNlLGk9bi5hcGkscz1pLm9wZXJhdGlvbnM/aS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTp2b2lkIDAsdT1zP3MuaW5wdXQ6dm9pZCAwLHA9YyhlLHUpLGY9YShlKTtPYmplY3Qua2V5cyhwKS5sZW5ndGg+MCYmKGY9by51cGRhdGUoZixwKSxzJiYoZi5vcGVyYXRpb249cy5uYW1lKSk7dmFyIGg9ci5FbmRwb2ludENhY2hlLmdldEtleVN0cmluZyhmKSxnPXIuZW5kcG9pbnRDYWNoZS5nZXQoaCk7aWYoZyYmMT09PWcubGVuZ3RoJiYiIj09PWdbMF0uQWRkcmVzcylyZXR1cm4gbFtoXXx8KGxbaF09W10pLHZvaWQgbFtoXS5wdXNoKHtyZXF1ZXN0OmUsY2FsbGJhY2s6dH0pO2lmKGcmJmcubGVuZ3RoPjApZS5odHRwUmVxdWVzdC51cGRhdGVFbmRwb2ludChnWzBdLkFkZHJlc3MpLHQoKTtlbHNle3ZhciBtPW4ubWFrZVJlcXVlc3QoaS5lbmRwb2ludE9wZXJhdGlvbix7T3BlcmF0aW9uOnMubmFtZSxJZGVudGlmaWVyczpwfSk7bS5yZW1vdmVMaXN0ZW5lcigidmFsaWRhdGUiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5WQUxJREFURV9QQVJBTUVURVJTKSxkKG0pLHIuZW5kcG9pbnRDYWNoZS5wdXQoaCxbe0FkZHJlc3M6IiIsQ2FjaGVQZXJpb2RJbk1pbnV0ZXM6NjB9XSksbS5zZW5kKChmdW5jdGlvbihuLGkpe2lmKG4pe2lmKGUucmVzcG9uc2UuZXJyb3I9by5lcnJvcihuLHtyZXRyeWFibGU6ITF9KSxyLmVuZHBvaW50Q2FjaGUucmVtb3ZlKGYpLGxbaF0pe3ZhciBhPWxbaF07by5hcnJheUVhY2goYSwoZnVuY3Rpb24oZSl7ZS5yZXF1ZXN0LnJlc3BvbnNlLmVycm9yPW8uZXJyb3Iobix7cmV0cnlhYmxlOiExfSksZS5jYWxsYmFjaygpfSkpLGRlbGV0ZSBsW2hdfX1lbHNlIGkmJihyLmVuZHBvaW50Q2FjaGUucHV0KGgsaS5FbmRwb2ludHMpLGUuaHR0cFJlcXVlc3QudXBkYXRlRW5kcG9pbnQoaS5FbmRwb2ludHNbMF0uQWRkcmVzcyksbFtoXSkmJihhPWxbaF0sby5hcnJheUVhY2goYSwoZnVuY3Rpb24oZSl7ZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LnVwZGF0ZUVuZHBvaW50KGkuRW5kcG9pbnRzWzBdLkFkZHJlc3MpLGUuY2FsbGJhY2soKX0pKSxkZWxldGUgbFtoXSk7dCgpfSkpfX1mdW5jdGlvbiBkKGUpe3ZhciB0PWUuc2VydmljZS5hcGkuYXBpVmVyc2lvbjt0JiYhZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1hcGktdmVyc2lvbiJdJiYoZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1hcGktdmVyc2lvbiJdPXQpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ9ZS5lcnJvcixuPWUuaHR0cFJlc3BvbnNlO2lmKHQmJigiSW52YWxpZEVuZHBvaW50RXhjZXB0aW9uIj09PXQuY29kZXx8NDIxPT09bi5zdGF0dXNDb2RlKSl7dmFyIGk9ZS5yZXF1ZXN0LHM9aS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zfHx7fSx1PWMoaSxzW2kub3BlcmF0aW9uXT9zW2kub3BlcmF0aW9uXS5pbnB1dDp2b2lkIDApLGw9YShpKTtPYmplY3Qua2V5cyh1KS5sZW5ndGg+MCYmKGw9by51cGRhdGUobCx1KSxzW2kub3BlcmF0aW9uXSYmKGwub3BlcmF0aW9uPXNbaS5vcGVyYXRpb25dLm5hbWUpKSxyLmVuZHBvaW50Q2FjaGUucmVtb3ZlKGwpfX1mdW5jdGlvbiBoKGUpe3JldHVyblsiZmFsc2UiLCIwIl0uaW5kZXhPZihlKT49MH10LmV4cG9ydHM9e2Rpc2NvdmVyRW5kcG9pbnQ6ZnVuY3Rpb24oZSx0KXt2YXIgYT1lLnNlcnZpY2V8fHt9O2lmKGZ1bmN0aW9uKGUpe2lmKGUuX29yaWdpbmFsQ29uZmlnJiZlLl9vcmlnaW5hbENvbmZpZy5lbmRwb2ludCYmITA9PT1lLl9vcmlnaW5hbENvbmZpZy5lbmRwb2ludERpc2NvdmVyeUVuYWJsZWQpdGhyb3cgby5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ3VyYXRpb25FeGNlcHRpb24iLG1lc3NhZ2U6IkN1c3RvbSBlbmRwb2ludCBpcyBzdXBwbGllZDsgZW5kcG9pbnREaXNjb3ZlcnlFbmFibGVkIG11c3Qgbm90IGJlIHRydWUuIn0pO3ZhciB0PXIuY29uZmlnW2Uuc2VydmljZUlkZW50aWZpZXJdfHx7fTtyZXR1cm4gQm9vbGVhbihyLmNvbmZpZy5lbmRwb2ludHx8dC5lbmRwb2ludHx8ZS5fb3JpZ2luYWxDb25maWcmJmUuX29yaWdpbmFsQ29uZmlnLmVuZHBvaW50KX0oYSl8fGUuaXNQcmVzaWduZWQoKSlyZXR1cm4gdCgpO3ZhciBzPShhLmFwaS5vcGVyYXRpb25zfHx7fSlbZS5vcGVyYXRpb25dLGM9cz9zLmVuZHBvaW50RGlzY292ZXJ5UmVxdWlyZWQ6Ik5VTEwiLGw9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlfHx7fTtpZih2b2lkIDAhPT10LmNvbmZpZy5lbmRwb2ludERpc2NvdmVyeUVuYWJsZWQpcmV0dXJuIHQuY29uZmlnLmVuZHBvaW50RGlzY292ZXJ5RW5hYmxlZDtpZighby5pc0Jyb3dzZXIoKSl7Zm9yKHZhciBhPTA7YTxpLmxlbmd0aDthKyspe3ZhciBzPWlbYV07aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4uZW52LHMpKXtpZigiIj09PW4uZW52W3NdfHx2b2lkIDA9PT1uLmVudltzXSl0aHJvdyBvLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsbWVzc2FnZToiZW52aXJvbm1lbnRhbCB2YXJpYWJsZSAiK3MrIiBjYW5ub3QgYmUgc2V0IHRvIG5vdGhpbmcifSk7cmV0dXJuIWgobi5lbnZbc10pfX12YXIgYz17fTt0cnl7Yz1yLnV0aWwuaW5pTG9hZGVyP3IudXRpbC5pbmlMb2FkZXIubG9hZEZyb20oe2lzQ29uZmlnOiEwLGZpbGVuYW1lOm4uZW52W3IudXRpbC5zaGFyZWRDb25maWdGaWxlRW52XX0pOnt9fWNhdGNoKGUpe312YXIgdT1jW24uZW52LkFXU19QUk9GSUxFfHxyLnV0aWwuZGVmYXVsdFByb2ZpbGVdfHx7fTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodSwiZW5kcG9pbnRfZGlzY292ZXJ5X2VuYWJsZWQiKSl7aWYodm9pZCAwPT09dS5lbmRwb2ludF9kaXNjb3ZlcnlfZW5hYmxlZCl0aHJvdyBvLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiIsbWVzc2FnZToiY29uZmlnIGZpbGUgZW50cnkgJ2VuZHBvaW50X2Rpc2NvdmVyeV9lbmFibGVkJyBjYW5ub3QgYmUgc2V0IHRvIG5vdGhpbmcifSk7cmV0dXJuIWgodS5lbmRwb2ludF9kaXNjb3ZlcnlfZW5hYmxlZCl9fX0oZSksZD1hLmFwaS5oYXNSZXF1aXJlZEVuZHBvaW50RGlzY292ZXJ5O3N3aXRjaCgobHx8ZCkmJmUuaHR0cFJlcXVlc3QuYXBwZW5kVG9Vc2VyQWdlbnQoImVuZHBvaW50LWRpc2NvdmVyeSIpLGMpe2Nhc2UiT1BUSU9OQUwiOihsfHxkKSYmKHUoZSksZS5hZGROYW1lZExpc3RlbmVyKCJJTlZBTElEQVRFX0NBQ0hFRF9FTkRQT0lOVFMiLCJleHRyYWN0RXJyb3IiLGYpKSx0KCk7YnJlYWs7Y2FzZSJSRVFVSVJFRCI6aWYoITE9PT1sKXtlLnJlc3BvbnNlLmVycm9yPW8uZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWd1cmF0aW9uRXhjZXB0aW9uIixtZXNzYWdlOiJFbmRwb2ludCBEaXNjb3ZlcnkgaXMgZGlzYWJsZWQgYnV0ICIrYS5hcGkuY2xhc3NOYW1lKyIuIitlLm9wZXJhdGlvbisiKCkgcmVxdWlyZXMgaXQuIFBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb25zLiJ9KSx0KCk7YnJlYWt9ZS5hZGROYW1lZExpc3RlbmVyKCJJTlZBTElEQVRFX0NBQ0hFRF9FTkRQT0lOVFMiLCJleHRyYWN0RXJyb3IiLGYpLHAoZSx0KTticmVhaztkZWZhdWx0OnQoKX19LHJlcXVpcmVkRGlzY292ZXJFbmRwb2ludDpwLG9wdGlvbmFsRGlzY292ZXJFbmRwb2ludDp1LG1hcnNoYWxsQ3VzdG9tSWRlbnRpZmllcnM6YyxnZXRDYWNoZUtleTphLGludmFsaWRhdGVDYWNoZWRFbmRwb2ludDpmfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSwiLi91dGlsIjo3NCxfcHJvY2Vzczo5MX1dLDI4OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vZXZlbnQtc3RyZWFtL2V2ZW50LW1lc3NhZ2UtY2h1bmtlciIpLmV2ZW50TWVzc2FnZUNodW5rZXIsbz1lKCIuL3BhcnNlLWV2ZW50IikucGFyc2VFdmVudDt0LmV4cG9ydHM9e2NyZWF0ZUV2ZW50U3RyZWFtOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIGk9cihlKSxhPVtdLHM9MDtzPGkubGVuZ3RoO3MrKylhLnB1c2gobyh0LGlbc10sbikpO3JldHVybiBhfX19LHsiLi4vZXZlbnQtc3RyZWFtL2V2ZW50LW1lc3NhZ2UtY2h1bmtlciI6MjksIi4vcGFyc2UtZXZlbnQiOjMxfV0sMjk6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e2V2ZW50TWVzc2FnZUNodW5rZXI6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOyl7dmFyIHI9ZS5yZWFkSW50MzJCRShuKSxvPWUuc2xpY2UobixyK24pO24rPXIsdC5wdXNoKG8pfXJldHVybiB0fX19LHt9XSwzMDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKS51dGlsLG89ci5idWZmZXIudG9CdWZmZXI7ZnVuY3Rpb24gaShlKXtpZig4IT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKCJJbnQ2NCBidWZmZXJzIG11c3QgYmUgZXhhY3RseSA4IGJ5dGVzIik7ci5CdWZmZXIuaXNCdWZmZXIoZSl8fChlPW8oZSkpLHRoaXMuYnl0ZXM9ZX1mdW5jdGlvbiBhKGUpe2Zvcih2YXIgdD0wO3Q8ODt0KyspZVt0XV49MjU1O2Zvcih0PTc7dD4tMSYmKGVbdF0rKywwPT09ZVt0XSk7dC0tKTt9aS5mcm9tTnVtYmVyPWZ1bmN0aW9uKGUpe2lmKGU+MHg4MDAwMDAwMDAwMDAwMDAwfHxlPC0weDgwMDAwMDAwMDAwMDAwMDApdGhyb3cgbmV3IEVycm9yKGUrIiBpcyB0b28gbGFyZ2UgKG9yLCBpZiBuZWdhdGl2ZSwgdG9vIHNtYWxsKSB0byByZXByZXNlbnQgYXMgYW4gSW50NjQiKTtmb3IodmFyIHQ9bmV3IFVpbnQ4QXJyYXkoOCksbj03LHI9TWF0aC5hYnMoTWF0aC5yb3VuZChlKSk7bj4tMSYmcj4wO24tLSxyLz0yNTYpdFtuXT1yO3JldHVybiBlPDAmJmEodCksbmV3IGkodCl9LGkucHJvdG90eXBlLnZhbHVlT2Y9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLmJ5dGVzLnNsaWNlKDApLHQ9MTI4JmVbMF07cmV0dXJuIHQmJmEoZSkscGFyc2VJbnQoZS50b1N0cmluZygiaGV4IiksMTYpKih0Py0xOjEpfSxpLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiBTdHJpbmcodGhpcy52YWx1ZU9mKCkpfSx0LmV4cG9ydHM9e0ludDY0Oml9fSx7Ii4uL2NvcmUiOjE5fV0sMzE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL3BhcnNlLW1lc3NhZ2UiKS5wYXJzZU1lc3NhZ2U7dC5leHBvcnRzPXtwYXJzZUV2ZW50OmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1yKHQpLGk9by5oZWFkZXJzWyI6bWVzc2FnZS10eXBlIl07aWYoaSl7aWYoImVycm9yIj09PWkudmFsdWUpdGhyb3cgZnVuY3Rpb24oZSl7dmFyIHQ9ZS5oZWFkZXJzWyI6ZXJyb3ItY29kZSJdLG49ZS5oZWFkZXJzWyI6ZXJyb3ItbWVzc2FnZSJdLHI9bmV3IEVycm9yKG4udmFsdWV8fG4pO3JldHVybiByLmNvZGU9ci5uYW1lPXQudmFsdWV8fHQscn0obyk7aWYoImV2ZW50IiE9PWkudmFsdWUpcmV0dXJufXZhciBhPW8uaGVhZGVyc1siOmV2ZW50LXR5cGUiXSxzPW4ubWVtYmVyc1thLnZhbHVlXTtpZihzKXt2YXIgYz17fSx1PXMuZXZlbnRQYXlsb2FkTWVtYmVyTmFtZTtpZih1KXt2YXIgbD1zLm1lbWJlcnNbdV07ImJpbmFyeSI9PT1sLnR5cGU/Y1t1XT1vLmJvZHk6Y1t1XT1lLnBhcnNlKG8uYm9keS50b1N0cmluZygpLGwpfWZvcih2YXIgcD1zLmV2ZW50SGVhZGVyTWVtYmVyTmFtZXMsZD0wO2Q8cC5sZW5ndGg7ZCsrKXt2YXIgZj1wW2RdO28uaGVhZGVyc1tmXSYmKGNbZl09cy5tZW1iZXJzW2ZdLnRvVHlwZShvLmhlYWRlcnNbZl0udmFsdWUpKX12YXIgaD17fTtyZXR1cm4gaFthLnZhbHVlXT1jLGh9fX19LHsiLi9wYXJzZS1tZXNzYWdlIjozMn1dLDMyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9pbnQ2NCIpLkludDY0LG89ZSgiLi9zcGxpdC1tZXNzYWdlIikuc3BsaXRNZXNzYWdlLGk9ImJvb2xlYW4iLGE9ImJ5dGUiLHM9InNob3J0IixjPSJpbnRlZ2VyIix1PSJsb25nIixsPSJiaW5hcnkiLHA9InN0cmluZyIsZD0idGltZXN0YW1wIixmPSJ1dWlkIjtmdW5jdGlvbiBoKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDspe3ZhciBvPWUucmVhZFVJbnQ4KG4rKyksaD1lLnNsaWNlKG4sbitvKS50b1N0cmluZygpO3N3aXRjaChuKz1vLGUucmVhZFVJbnQ4KG4rKykpe2Nhc2UgMDp0W2hdPXt0eXBlOmksdmFsdWU6ITB9O2JyZWFrO2Nhc2UgMTp0W2hdPXt0eXBlOmksdmFsdWU6ITF9O2JyZWFrO2Nhc2UgMjp0W2hdPXt0eXBlOmEsdmFsdWU6ZS5yZWFkSW50OChuKyspfTticmVhaztjYXNlIDM6dFtoXT17dHlwZTpzLHZhbHVlOmUucmVhZEludDE2QkUobil9LG4rPTI7YnJlYWs7Y2FzZSA0OnRbaF09e3R5cGU6Yyx2YWx1ZTplLnJlYWRJbnQzMkJFKG4pfSxuKz00O2JyZWFrO2Nhc2UgNTp0W2hdPXt0eXBlOnUsdmFsdWU6bmV3IHIoZS5zbGljZShuLG4rOCkpfSxuKz04O2JyZWFrO2Nhc2UgNjp2YXIgZz1lLnJlYWRVSW50MTZCRShuKTtuKz0yLHRbaF09e3R5cGU6bCx2YWx1ZTplLnNsaWNlKG4sbitnKX0sbis9ZzticmVhaztjYXNlIDc6dmFyIG09ZS5yZWFkVUludDE2QkUobik7bis9Mix0W2hdPXt0eXBlOnAsdmFsdWU6ZS5zbGljZShuLG4rbSkudG9TdHJpbmcoKX0sbis9bTticmVhaztjYXNlIDg6dFtoXT17dHlwZTpkLHZhbHVlOm5ldyBEYXRlKG5ldyByKGUuc2xpY2UobixuKzgpKS52YWx1ZU9mKCkpfSxuKz04O2JyZWFrO2Nhc2UgOTp2YXIgdj1lLnNsaWNlKG4sbisxNikudG9TdHJpbmcoImhleCIpO24rPTE2LHRbaF09e3R5cGU6Zix2YWx1ZTp2LnN1YnN0cigwLDgpKyItIit2LnN1YnN0cig4LDQpKyItIit2LnN1YnN0cigxMiw0KSsiLSIrdi5zdWJzdHIoMTYsNCkrIi0iK3Yuc3Vic3RyKDIwKX07YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCBoZWFkZXIgdHlwZSB0YWciKX19cmV0dXJuIHR9dC5leHBvcnRzPXtwYXJzZU1lc3NhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQ9byhlKTtyZXR1cm57aGVhZGVyczpoKHQuaGVhZGVycyksYm9keTp0LmJvZHl9fX19LHsiLi9pbnQ2NCI6MzAsIi4vc3BsaXQtbWVzc2FnZSI6MzN9XSwzMzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKS51dGlsLG89ci5idWZmZXIudG9CdWZmZXI7dC5leHBvcnRzPXtzcGxpdE1lc3NhZ2U6ZnVuY3Rpb24oZSl7aWYoci5CdWZmZXIuaXNCdWZmZXIoZSl8fChlPW8oZSkpLGUubGVuZ3RoPDE2KXRocm93IG5ldyBFcnJvcigiUHJvdmlkZWQgbWVzc2FnZSB0b28gc2hvcnQgdG8gYWNjb21tb2RhdGUgZXZlbnQgc3RyZWFtIG1lc3NhZ2Ugb3ZlcmhlYWQiKTtpZihlLmxlbmd0aCE9PWUucmVhZFVJbnQzMkJFKDApKXRocm93IG5ldyBFcnJvcigiUmVwb3J0ZWQgbWVzc2FnZSBsZW5ndGggZG9lcyBub3QgbWF0Y2ggcmVjZWl2ZWQgbWVzc2FnZSBsZW5ndGgiKTt2YXIgdD1lLnJlYWRVSW50MzJCRSg4KTtpZih0IT09ci5jcnlwdG8uY3JjMzIoZS5zbGljZSgwLDgpKSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBwcmVsdWRlIGNoZWNrc3VtIHNwZWNpZmllZCBpbiB0aGUgbWVzc2FnZSAoIit0KyIpIGRvZXMgbm90IG1hdGNoIHRoZSBjYWxjdWxhdGVkIENSQzMyIGNoZWNrc3VtLiIpO3ZhciBuPWUucmVhZFVJbnQzMkJFKGUubGVuZ3RoLTQpO2lmKG4hPT1yLmNyeXB0by5jcmMzMihlLnNsaWNlKDAsZS5sZW5ndGgtNCkpKXRocm93IG5ldyBFcnJvcigiVGhlIG1lc3NhZ2UgY2hlY2tzdW0gZGlkIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgIituKTt2YXIgaT0xMitlLnJlYWRVSW50MzJCRSg0KTtyZXR1cm57aGVhZGVyczplLnNsaWNlKDEyLGkpLGJvZHk6ZS5zbGljZShpLGUubGVuZ3RoLTQpfX19fSx7Ii4uL2NvcmUiOjE5fV0sMzQ6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24odCl7KGZ1bmN0aW9uKCl7dmFyIG49ZSgiLi9jb3JlIikscj1lKCIuL3NlcXVlbnRpYWxfZXhlY3V0b3IiKSxvPWUoIi4vZGlzY292ZXJfZW5kcG9pbnQiKS5kaXNjb3ZlckVuZHBvaW50O2Z1bmN0aW9uIGkoZSl7aWYoIWUuc2VydmljZS5hcGkub3BlcmF0aW9ucylyZXR1cm4iIjt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dO3JldHVybiB0P3QuYXV0aHR5cGU6IiJ9ZnVuY3Rpb24gYShlKXt2YXIgdD1lLnNlcnZpY2U7cmV0dXJuIHQuY29uZmlnLnNpZ25hdHVyZVZlcnNpb24/dC5jb25maWcuc2lnbmF0dXJlVmVyc2lvbjp0LmFwaS5zaWduYXR1cmVWZXJzaW9uP3QuYXBpLnNpZ25hdHVyZVZlcnNpb246aShlKX1uLkV2ZW50TGlzdGVuZXJzPXtDb3JlOnt9fSxuLkV2ZW50TGlzdGVuZXJzPXtDb3JlOihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKGUscil7cigiVkFMSURBVEVfQ1JFREVOVElBTFMiLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKGUsdCl7aWYoIWUuc2VydmljZS5hcGkuc2lnbmF0dXJlVmVyc2lvbiYmIWUuc2VydmljZS5jb25maWcuc2lnbmF0dXJlVmVyc2lvbilyZXR1cm4gdCgpOyJiZWFyZXIiIT09YShlKT9lLnNlcnZpY2UuY29uZmlnLmdldENyZWRlbnRpYWxzKChmdW5jdGlvbihyKXtyJiYoZS5yZXNwb25zZS5lcnJvcj1uLnV0aWwuZXJyb3Iocix7Y29kZToiQ3JlZGVudGlhbHNFcnJvciIsbWVzc2FnZToiTWlzc2luZyBjcmVkZW50aWFscyBpbiBjb25maWcsIGlmIHVzaW5nIEFXU19DT05GSUdfRklMRSwgc2V0IEFXU19TREtfTE9BRF9DT05GSUc9MSJ9KSksdCgpfSkpOmUuc2VydmljZS5jb25maWcuZ2V0VG9rZW4oKGZ1bmN0aW9uKHIpe3ImJihlLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihyLHtjb2RlOiJUb2tlbkVycm9yIn0pKSx0KCl9KSl9KSksZSgiVkFMSURBVEVfUkVHSU9OIiwidmFsaWRhdGUiLChmdW5jdGlvbihlKXtpZighZS5zZXJ2aWNlLmlzR2xvYmFsRW5kcG9pbnQpe3ZhciB0PW5ldyBSZWdFeHAoL14oW2EtekEtWjAtOV18W2EtekEtWjAtOV1bYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSkkLyk7ZS5zZXJ2aWNlLmNvbmZpZy5yZWdpb24/dC50ZXN0KGUuc2VydmljZS5jb25maWcucmVnaW9uKXx8KGUucmVzcG9uc2UuZXJyb3I9bi51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiQ29uZmlnRXJyb3IiLG1lc3NhZ2U6IkludmFsaWQgcmVnaW9uIGluIGNvbmZpZyJ9KSk6ZS5yZXNwb25zZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJDb25maWdFcnJvciIsbWVzc2FnZToiTWlzc2luZyByZWdpb24gaW4gY29uZmlnIn0pfX0pKSxlKCJCVUlMRF9JREVNUE9URU5DWV9UT0tFTlMiLCJ2YWxpZGF0ZSIsKGZ1bmN0aW9uKGUpe2lmKGUuc2VydmljZS5hcGkub3BlcmF0aW9ucyl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXTtpZih0KXt2YXIgcj10LmlkZW1wb3RlbnRNZW1iZXJzO2lmKHIubGVuZ3RoKXtmb3IodmFyIG89bi51dGlsLmNvcHkoZS5wYXJhbXMpLGk9MCxhPXIubGVuZ3RoO2k8YTtpKyspb1tyW2ldXXx8KG9bcltpXV09bi51dGlsLnV1aWQudjQoKSk7ZS5wYXJhbXM9b319fX0pKSxlKCJWQUxJREFURV9QQVJBTUVURVJTIiwidmFsaWRhdGUiLChmdW5jdGlvbihlKXtpZihlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnMpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaW5wdXQscj1lLnNlcnZpY2UuY29uZmlnLnBhcmFtVmFsaWRhdGlvbjtuZXcgbi5QYXJhbVZhbGlkYXRvcihyKS52YWxpZGF0ZSh0LGUucGFyYW1zKX19KSksZSgiQ09NUFVURV9DSEVDS1NVTSIsImFmdGVyQnVpbGQiLChmdW5jdGlvbihlKXtpZihlLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnMpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl07aWYodCl7dmFyIHI9ZS5odHRwUmVxdWVzdC5ib2R5LG89ciYmKG4udXRpbC5CdWZmZXIuaXNCdWZmZXIocil8fCJzdHJpbmciPT10eXBlb2YgciksaT1lLmh0dHBSZXF1ZXN0LmhlYWRlcnM7aWYodC5odHRwQ2hlY2tzdW1SZXF1aXJlZCYmZS5zZXJ2aWNlLmNvbmZpZy5jb21wdXRlQ2hlY2tzdW1zJiZvJiYhaVsiQ29udGVudC1NRDUiXSl7dmFyIGE9bi51dGlsLmNyeXB0by5tZDUociwiYmFzZTY0Iik7aVsiQ29udGVudC1NRDUiXT1hfX19fSkpLHIoIkNPTVBVVEVfU0hBMjU2IiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUsdCl7aWYoZS5oYWx0SGFuZGxlcnNPbkVycm9yKCksZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zKXt2YXIgcj1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLG89cj9yLmF1dGh0eXBlOiIiO2lmKCFlLnNlcnZpY2UuYXBpLnNpZ25hdHVyZVZlcnNpb24mJiFvJiYhZS5zZXJ2aWNlLmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uKXJldHVybiB0KCk7aWYoZS5zZXJ2aWNlLmdldFNpZ25lckNsYXNzKGUpPT09bi5TaWduZXJzLlY0KXt2YXIgaT1lLmh0dHBSZXF1ZXN0LmJvZHl8fCIiO2lmKG8uaW5kZXhPZigidW5zaWduZWQtYm9keSIpPj0wKXJldHVybiBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlgtQW16LUNvbnRlbnQtU2hhMjU2Il09IlVOU0lHTkVELVBBWUxPQUQiLHQoKTtuLnV0aWwuY29tcHV0ZVNoYTI1NihpLChmdW5jdGlvbihuLHIpe24/dChuKTooZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1Db250ZW50LVNoYTI1NiJdPXIsdCgpKX0pKX1lbHNlIHQoKX19KSksZSgiU0VUX0NPTlRFTlRfTEVOR1RIIiwiYWZ0ZXJCdWlsZCIsKGZ1bmN0aW9uKGUpe3ZhciB0PWkoZSkscj1uLnV0aWwuZ2V0UmVxdWVzdFBheWxvYWRTaGFwZShlKTtpZih2b2lkIDA9PT1lLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl0pdHJ5e3ZhciBvPW4udXRpbC5zdHJpbmcuYnl0ZUxlbmd0aChlLmh0dHBSZXF1ZXN0LmJvZHkpO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXT1vfWNhdGNoKG4pe2lmKHImJnIuaXNTdHJlYW1pbmcpe2lmKHIucmVxdWlyZXNMZW5ndGgpdGhyb3cgbjtpZih0LmluZGV4T2YoInVuc2lnbmVkLWJvZHkiKT49MClyZXR1cm4gdm9pZChlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlRyYW5zZmVyLUVuY29kaW5nIl09ImNodW5rZWQiKTt0aHJvdyBufXRocm93IG59fSkpLGUoIlNFVF9IVFRQX0hPU1QiLCJhZnRlckJ1aWxkIiwoZnVuY3Rpb24oZSl7ZS5odHRwUmVxdWVzdC5oZWFkZXJzLkhvc3Q9ZS5odHRwUmVxdWVzdC5lbmRwb2ludC5ob3N0fSkpLGUoIlNFVF9UUkFDRV9JRCIsImFmdGVyQnVpbGQiLChmdW5jdGlvbihlKXt2YXIgcj0iWC1BbXpuLVRyYWNlLUlkIjtpZihuLnV0aWwuaXNOb2RlKCkmJiFPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChlLmh0dHBSZXF1ZXN0LmhlYWRlcnMscikpe3ZhciBvPXQuZW52LkFXU19MQU1CREFfRlVOQ1RJT05fTkFNRSxpPXQuZW52Ll9YX0FNWk5fVFJBQ0VfSUQ7InN0cmluZyI9PXR5cGVvZiBvJiZvLmxlbmd0aD4wJiYic3RyaW5nIj09dHlwZW9mIGkmJmkubGVuZ3RoPjAmJihlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbcl09aSl9fSkpLGUoIlJFU1RBUlQiLCJyZXN0YXJ0IiwoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlc3BvbnNlLmVycm9yO2UmJmUucmV0cnlhYmxlJiYodGhpcy5odHRwUmVxdWVzdD1uZXcgbi5IdHRwUmVxdWVzdCh0aGlzLnNlcnZpY2UuZW5kcG9pbnQsdGhpcy5zZXJ2aWNlLnJlZ2lvbiksdGhpcy5yZXNwb25zZS5yZXRyeUNvdW50PHRoaXMuc2VydmljZS5jb25maWcubWF4UmV0cmllcz90aGlzLnJlc3BvbnNlLnJldHJ5Q291bnQrKzp0aGlzLnJlc3BvbnNlLmVycm9yPW51bGwpfSkpLHIoIkRJU0NPVkVSX0VORFBPSU5UIiwic2lnbiIsbywhMCkscigiU0lHTiIsInNpZ24iLChmdW5jdGlvbihlLHQpe3ZhciBuPWUuc2VydmljZSxyPWEoZSk7aWYoIXJ8fDA9PT1yLmxlbmd0aClyZXR1cm4gdCgpOyJiZWFyZXIiPT09cj9uLmNvbmZpZy5nZXRUb2tlbigoZnVuY3Rpb24ocixvKXtpZihyKXJldHVybiBlLnJlc3BvbnNlLmVycm9yPXIsdCgpO3RyeXtuZXcobi5nZXRTaWduZXJDbGFzcyhlKSkoZS5odHRwUmVxdWVzdCkuYWRkQXV0aG9yaXphdGlvbihvKX1jYXRjaCh0KXtlLnJlc3BvbnNlLmVycm9yPXR9dCgpfSkpOm4uY29uZmlnLmdldENyZWRlbnRpYWxzKChmdW5jdGlvbihyLG8pe2lmKHIpcmV0dXJuIGUucmVzcG9uc2UuZXJyb3I9cix0KCk7dHJ5e3ZhciBpPW4uZ2V0U2tld0NvcnJlY3RlZERhdGUoKSxhPW4uZ2V0U2lnbmVyQ2xhc3MoZSkscz0oZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zfHx7fSlbZS5vcGVyYXRpb25dLGM9bmV3IGEoZS5odHRwUmVxdWVzdCxuLmdldFNpZ25pbmdOYW1lKGUpLHtzaWduYXR1cmVDYWNoZTpuLmNvbmZpZy5zaWduYXR1cmVDYWNoZSxvcGVyYXRpb246cyxzaWduYXR1cmVWZXJzaW9uOm4uYXBpLnNpZ25hdHVyZVZlcnNpb259KTtjLnNldFNlcnZpY2VDbGllbnRJZChuLl9jbGllbnRJZCksZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnMuRGF0ZSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1EYXRlIl0sYy5hZGRBdXRob3JpemF0aW9uKG8saSksZS5zaWduZWRBdD1pfWNhdGNoKHQpe2UucmVzcG9uc2UuZXJyb3I9dH10KCl9KSl9KSksZSgiVkFMSURBVEVfUkVTUE9OU0UiLCJ2YWxpZGF0ZVJlc3BvbnNlIiwoZnVuY3Rpb24oZSl7dGhpcy5zZXJ2aWNlLnN1Y2Nlc3NmdWxSZXNwb25zZShlLHRoaXMpPyhlLmRhdGE9e30sZS5lcnJvcj1udWxsKTooZS5kYXRhPW51bGwsZS5lcnJvcj1uLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJVbmtub3duRXJyb3IiLG1lc3NhZ2U6IkFuIHVua25vd24gZXJyb3Igb2NjdXJyZWQuIn0pKX0pKSxlKCJFUlJPUiIsImVycm9yIiwoZnVuY3Rpb24oZSx0KXtpZih0LnJlcXVlc3Quc2VydmljZS5hcGkuYXdzUXVlcnlDb21wYXRpYmxlKXt2YXIgbj10Lmh0dHBSZXNwb25zZS5oZWFkZXJzLHI9bj9uWyJ4LWFtem4tcXVlcnktZXJyb3IiXTp2b2lkIDA7ciYmci5pbmNsdWRlcygiOyIpJiYodC5lcnJvci5jb2RlPXIuc3BsaXQoIjsiKVswXSl9fSksITApLHIoIlNFTkQiLCJzZW5kIiwoZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKHIpe2UuaHR0cFJlc3BvbnNlLnN0cmVhbT1yO3ZhciBvPWUucmVxdWVzdC5odHRwUmVxdWVzdC5zdHJlYW0saT1lLnJlcXVlc3Quc2VydmljZSxhPWkuYXBpLHM9ZS5yZXF1ZXN0Lm9wZXJhdGlvbixjPWEub3BlcmF0aW9uc1tzXXx8e307ci5vbigiaGVhZGVycyIsKGZ1bmN0aW9uKG8sYSxzKXtpZihlLnJlcXVlc3QuZW1pdCgiaHR0cEhlYWRlcnMiLFtvLGEsZSxzXSksIWUuaHR0cFJlc3BvbnNlLnN0cmVhbWluZylpZigyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uKXtpZihjLmhhc0V2ZW50T3V0cHV0JiZpLnN1Y2Nlc3NmdWxSZXNwb25zZShlKSlyZXR1cm4gZS5yZXF1ZXN0LmVtaXQoImh0dHBEb25lIiksdm9pZCB0KCk7ci5vbigicmVhZGFibGUiLChmdW5jdGlvbigpe3ZhciB0PXIucmVhZCgpO251bGwhPT10JiZlLnJlcXVlc3QuZW1pdCgiaHR0cERhdGEiLFt0LGVdKX0pKX1lbHNlIHIub24oImRhdGEiLChmdW5jdGlvbih0KXtlLnJlcXVlc3QuZW1pdCgiaHR0cERhdGEiLFt0LGVdKX0pKX0pKSxyLm9uKCJlbmQiLChmdW5jdGlvbigpe2lmKCFvfHwhby5kaWRDYWxsYmFjayl7aWYoMj09PW4uSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbiYmYy5oYXNFdmVudE91dHB1dCYmaS5zdWNjZXNzZnVsUmVzcG9uc2UoZSkpcmV0dXJuO2UucmVxdWVzdC5lbWl0KCJodHRwRG9uZSIpLHQoKX19KSl9ZnVuY3Rpb24gbyhyKXtpZigiUmVxdWVzdEFib3J0ZWRFcnJvciIhPT1yLmNvZGUpe3ZhciBvPSJUaW1lb3V0RXJyb3IiPT09ci5jb2RlP3IuY29kZToiTmV0d29ya2luZ0Vycm9yIjtyPW4udXRpbC5lcnJvcihyLHtjb2RlOm8scmVnaW9uOmUucmVxdWVzdC5odHRwUmVxdWVzdC5yZWdpb24saG9zdG5hbWU6ZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3RuYW1lLHJldHJ5YWJsZTohMH0pfWUuZXJyb3I9cixlLnJlcXVlc3QuZW1pdCgiaHR0cEVycm9yIixbZS5lcnJvcixlXSwoZnVuY3Rpb24oKXt0KCl9KSl9ZnVuY3Rpb24gaSgpe3ZhciB0LGk9bi5IdHRwQ2xpZW50LmdldEluc3RhbmNlKCksYT1lLnJlcXVlc3Quc2VydmljZS5jb25maWcuaHR0cE9wdGlvbnN8fHt9O3RyeXt2YXIgcz1pLmhhbmRsZVJlcXVlc3QoZS5yZXF1ZXN0Lmh0dHBSZXF1ZXN0LGEscixvKTsodD1zKS5vbigic2VuZFByb2dyZXNzIiwoZnVuY3Rpb24odCl7ZS5yZXF1ZXN0LmVtaXQoImh0dHBVcGxvYWRQcm9ncmVzcyIsW3QsZV0pfSkpLHQub24oInJlY2VpdmVQcm9ncmVzcyIsKGZ1bmN0aW9uKHQpe2UucmVxdWVzdC5lbWl0KCJodHRwRG93bmxvYWRQcm9ncmVzcyIsW3QsZV0pfSkpfWNhdGNoKGUpe28oZSl9fWUuaHR0cFJlc3BvbnNlLl9hYm9ydENhbGxiYWNrPXQsZS5lcnJvcj1udWxsLGUuZGF0YT1udWxsLChlLnJlcXVlc3Quc2VydmljZS5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLXRoaXMuc2lnbmVkQXQpLzFlMz49NjAwP3RoaXMuZW1pdCgic2lnbiIsW3RoaXNdLChmdW5jdGlvbihlKXtlP3QoZSk6aSgpfSkpOmkoKX0pKSxlKCJIVFRQX0hFQURFUlMiLCJodHRwSGVhZGVycyIsKGZ1bmN0aW9uKGUsdCxyLG8pe3IuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU9ZSxyLmh0dHBSZXNwb25zZS5zdGF0dXNNZXNzYWdlPW8sci5odHRwUmVzcG9uc2UuaGVhZGVycz10LHIuaHR0cFJlc3BvbnNlLmJvZHk9bi51dGlsLmJ1ZmZlci50b0J1ZmZlcigiIiksci5odHRwUmVzcG9uc2UuYnVmZmVycz1bXSxyLmh0dHBSZXNwb25zZS5udW1CeXRlcz0wO3ZhciBpPXQuZGF0ZXx8dC5EYXRlLGE9ci5yZXF1ZXN0LnNlcnZpY2U7aWYoaSl7dmFyIHM9RGF0ZS5wYXJzZShpKTthLmNvbmZpZy5jb3JyZWN0Q2xvY2tTa2V3JiZhLmlzQ2xvY2tTa2V3ZWQocykmJmEuYXBwbHlDbG9ja09mZnNldChzKX19KSksZSgiSFRUUF9EQVRBIiwiaHR0cERhdGEiLChmdW5jdGlvbihlLHQpe2lmKGUpe2lmKG4udXRpbC5pc05vZGUoKSl7dC5odHRwUmVzcG9uc2UubnVtQnl0ZXMrPWUubGVuZ3RoO3ZhciByPXQuaHR0cFJlc3BvbnNlLmhlYWRlcnNbImNvbnRlbnQtbGVuZ3RoIl0sbz17bG9hZGVkOnQuaHR0cFJlc3BvbnNlLm51bUJ5dGVzLHRvdGFsOnJ9O3QucmVxdWVzdC5lbWl0KCJodHRwRG93bmxvYWRQcm9ncmVzcyIsW28sdF0pfXQuaHR0cFJlc3BvbnNlLmJ1ZmZlcnMucHVzaChuLnV0aWwuYnVmZmVyLnRvQnVmZmVyKGUpKX19KSksZSgiSFRUUF9ET05FIiwiaHR0cERvbmUiLChmdW5jdGlvbihlKXtpZihlLmh0dHBSZXNwb25zZS5idWZmZXJzJiZlLmh0dHBSZXNwb25zZS5idWZmZXJzLmxlbmd0aD4wKXt2YXIgdD1uLnV0aWwuYnVmZmVyLmNvbmNhdChlLmh0dHBSZXNwb25zZS5idWZmZXJzKTtlLmh0dHBSZXNwb25zZS5ib2R5PXR9ZGVsZXRlIGUuaHR0cFJlc3BvbnNlLm51bUJ5dGVzLGRlbGV0ZSBlLmh0dHBSZXNwb25zZS5idWZmZXJzfSkpLGUoIkZJTkFMSVpFX0VSUk9SIiwicmV0cnkiLChmdW5jdGlvbihlKXtlLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlJiYoZS5lcnJvci5zdGF0dXNDb2RlPWUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsdm9pZCAwPT09ZS5lcnJvci5yZXRyeWFibGUmJihlLmVycm9yLnJldHJ5YWJsZT10aGlzLnNlcnZpY2UucmV0cnlhYmxlRXJyb3IoZS5lcnJvcix0aGlzKSkpfSkpLGUoIklOVkFMSURBVEVfQ1JFREVOVElBTFMiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2lmKGUuZXJyb3Ipc3dpdGNoKGUuZXJyb3IuY29kZSl7Y2FzZSJSZXF1ZXN0RXhwaXJlZCI6Y2FzZSJFeHBpcmVkVG9rZW5FeGNlcHRpb24iOmNhc2UiRXhwaXJlZFRva2VuIjplLmVycm9yLnJldHJ5YWJsZT0hMCxlLnJlcXVlc3Quc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMuZXhwaXJlZD0hMH19KSksZSgiRVhQSVJFRF9TSUdOQVRVUkUiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe3ZhciB0PWUuZXJyb3I7dCYmInN0cmluZyI9PXR5cGVvZiB0LmNvZGUmJiJzdHJpbmciPT10eXBlb2YgdC5tZXNzYWdlJiZ0LmNvZGUubWF0Y2goL1NpZ25hdHVyZS8pJiZ0Lm1lc3NhZ2UubWF0Y2goL2V4cGlyZWQvKSYmKGUuZXJyb3IucmV0cnlhYmxlPSEwKX0pKSxlKCJDTE9DS19TS0VXRUQiLCJyZXRyeSIsKGZ1bmN0aW9uKGUpe2UuZXJyb3ImJnRoaXMuc2VydmljZS5jbG9ja1NrZXdFcnJvcihlLmVycm9yKSYmdGhpcy5zZXJ2aWNlLmNvbmZpZy5jb3JyZWN0Q2xvY2tTa2V3JiYoZS5lcnJvci5yZXRyeWFibGU9ITApfSkpLGUoIlJFRElSRUNUIiwicmV0cnkiLChmdW5jdGlvbihlKXtlLmVycm9yJiZlLmVycm9yLnN0YXR1c0NvZGU+PTMwMCYmZS5lcnJvci5zdGF0dXNDb2RlPDQwMCYmZS5odHRwUmVzcG9uc2UuaGVhZGVycy5sb2NhdGlvbiYmKHRoaXMuaHR0cFJlcXVlc3QuZW5kcG9pbnQ9bmV3IG4uRW5kcG9pbnQoZS5odHRwUmVzcG9uc2UuaGVhZGVycy5sb2NhdGlvbiksdGhpcy5odHRwUmVxdWVzdC5oZWFkZXJzLkhvc3Q9dGhpcy5odHRwUmVxdWVzdC5lbmRwb2ludC5ob3N0LGUuZXJyb3IucmVkaXJlY3Q9ITAsZS5lcnJvci5yZXRyeWFibGU9ITApfSkpLGUoIlJFVFJZX0NIRUNLIiwicmV0cnkiLChmdW5jdGlvbihlKXtlLmVycm9yJiYoZS5lcnJvci5yZWRpcmVjdCYmZS5yZWRpcmVjdENvdW50PGUubWF4UmVkaXJlY3RzP2UuZXJyb3IucmV0cnlEZWxheT0wOmUucmV0cnlDb3VudDxlLm1heFJldHJpZXMmJihlLmVycm9yLnJldHJ5RGVsYXk9dGhpcy5zZXJ2aWNlLnJldHJ5RGVsYXlzKGUucmV0cnlDb3VudCxlLmVycm9yKXx8MCkpfSkpLHIoIlJFU0VUX1JFVFJZX1NUQVRFIiwiYWZ0ZXJSZXRyeSIsKGZ1bmN0aW9uKGUsdCl7dmFyIG4scj0hMTtlLmVycm9yJiYobj1lLmVycm9yLnJldHJ5RGVsYXl8fDAsZS5lcnJvci5yZXRyeWFibGUmJmUucmV0cnlDb3VudDxlLm1heFJldHJpZXM/KGUucmV0cnlDb3VudCsrLHI9ITApOmUuZXJyb3IucmVkaXJlY3QmJmUucmVkaXJlY3RDb3VudDxlLm1heFJlZGlyZWN0cyYmKGUucmVkaXJlY3RDb3VudCsrLHI9ITApKSxyJiZuPj0wPyhlLmVycm9yPW51bGwsc2V0VGltZW91dCh0LG4pKTp0KCl9KSl9KSksQ29yZVBvc3Q6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24oZSl7ZSgiRVhUUkFDVF9SRVFVRVNUX0lEIiwiZXh0cmFjdERhdGEiLG4udXRpbC5leHRyYWN0UmVxdWVzdElkKSxlKCJFWFRSQUNUX1JFUVVFU1RfSUQiLCJleHRyYWN0RXJyb3IiLG4udXRpbC5leHRyYWN0UmVxdWVzdElkKSxlKCJFTk9URk9VTkRfRVJST1IiLCJodHRwRXJyb3IiLChmdW5jdGlvbihlKXtpZigiTmV0d29ya2luZ0Vycm9yIj09PWUuY29kZSYmZnVuY3Rpb24oZSl7cmV0dXJuIkVOT1RGT1VORCI9PT1lLmVycm5vfHwibnVtYmVyIj09dHlwZW9mIGUuZXJybm8mJiJmdW5jdGlvbiI9PXR5cGVvZiBuLnV0aWwuZ2V0U3lzdGVtRXJyb3JOYW1lJiZbIkVBSV9OT05BTUUiLCJFQUlfTk9EQVRBIl0uaW5kZXhPZihuLnV0aWwuZ2V0U3lzdGVtRXJyb3JOYW1lKGUuZXJybm8pPj0wKX0oZSkpe3ZhciB0PSJJbmFjY2Vzc2libGUgaG9zdDogYCIrZS5ob3N0bmFtZSsiJyBhdCBwb3J0IGAiK2UucG9ydCsiJy4gVGhpcyBzZXJ2aWNlIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSBgIitlLnJlZ2lvbisiJyByZWdpb24uIjt0aGlzLnJlc3BvbnNlLmVycm9yPW4udXRpbC5lcnJvcihuZXcgRXJyb3IodCkse2NvZGU6IlVua25vd25FbmRwb2ludCIscmVnaW9uOmUucmVnaW9uLGhvc3RuYW1lOmUuaG9zdG5hbWUscmV0cnlhYmxlOiEwLG9yaWdpbmFsRXJyb3I6ZX0pfX0pKX0pKSxMb2dnZXI6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dCgiTE9HX1JFUVVFU1QiLCJjb21wbGV0ZSIsKGZ1bmN0aW9uKHQpe3ZhciByPXQucmVxdWVzdCxvPXIuc2VydmljZS5jb25maWcubG9nZ2VyO2lmKG8pe3ZhciBpPWZ1bmN0aW9uKCl7dmFyIGk9KHQucmVxdWVzdC5zZXJ2aWNlLmdldFNrZXdDb3JyZWN0ZWREYXRlKCkuZ2V0VGltZSgpLXIuc3RhcnRUaW1lLmdldFRpbWUoKSkvMWUzLHM9ISFvLmlzVFRZLGM9dC5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSx1PXIucGFyYW1zO3Iuc2VydmljZS5hcGkub3BlcmF0aW9ucyYmci5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Iub3BlcmF0aW9uXSYmci5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Iub3BlcmF0aW9uXS5pbnB1dCYmKHU9YShyLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbci5vcGVyYXRpb25dLmlucHV0LHIucGFyYW1zKSk7dmFyIGw9ZSgidXRpbCIpLmluc3BlY3QodSwhMCxudWxsKSxwPSIiO3JldHVybiBzJiYocCs9IhtbMzNtIikscCs9IltBV1MgIityLnNlcnZpY2Uuc2VydmljZUlkZW50aWZpZXIrIiAiK2MscCs9IiAiK2kudG9TdHJpbmcoKSsicyAiK3QucmV0cnlDb3VudCsiIHJldHJpZXNdIixzJiYocCs9IhtbMDsxbSIpLHArPSIgIituLnV0aWwuc3RyaW5nLmxvd2VyRmlyc3Qoci5vcGVyYXRpb24pLHArPSIoIitsKyIpIixzJiYocCs9IhtbMG0iKSxwfSgpOyJmdW5jdGlvbiI9PXR5cGVvZiBvLmxvZz9vLmxvZyhpKToiZnVuY3Rpb24iPT10eXBlb2Ygby53cml0ZSYmby53cml0ZShpKyJcbiIpfWZ1bmN0aW9uIGEoZSx0KXtpZighdClyZXR1cm4gdDtpZihlLmlzU2Vuc2l0aXZlKXJldHVybiIqKipTZW5zaXRpdmVJbmZvcm1hdGlvbioqKiI7c3dpdGNoKGUudHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnZhciByPXt9O3JldHVybiBuLnV0aWwuZWFjaCh0LChmdW5jdGlvbih0LG4pe09iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLm1lbWJlcnMsdCk/clt0XT1hKGUubWVtYmVyc1t0XSxuKTpyW3RdPW59KSkscjtjYXNlImxpc3QiOnZhciBvPVtdO3JldHVybiBuLnV0aWwuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQsbil7by5wdXNoKGEoZS5tZW1iZXIsdCkpfSkpLG87Y2FzZSJtYXAiOnZhciBpPXt9O3JldHVybiBuLnV0aWwuZWFjaCh0LChmdW5jdGlvbih0LG4pe2lbdF09YShlLnZhbHVlLG4pfSkpLGk7ZGVmYXVsdDpyZXR1cm4gdH19fSkpfSkpLEpzb246KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dmFyIG49ZSgiLi9wcm90b2NvbC9qc29uIik7dCgiQlVJTEQiLCJidWlsZCIsbi5idWlsZFJlcXVlc3QpLHQoIkVYVFJBQ1RfREFUQSIsImV4dHJhY3REYXRhIixuLmV4dHJhY3REYXRhKSx0KCJFWFRSQUNUX0VSUk9SIiwiZXh0cmFjdEVycm9yIixuLmV4dHJhY3RFcnJvcil9KSksUmVzdDoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL3Jlc3QiKTt0KCJCVUlMRCIsImJ1aWxkIixuLmJ1aWxkUmVxdWVzdCksdCgiRVhUUkFDVF9EQVRBIiwiZXh0cmFjdERhdGEiLG4uZXh0cmFjdERhdGEpLHQoIkVYVFJBQ1RfRVJST1IiLCJleHRyYWN0RXJyb3IiLG4uZXh0cmFjdEVycm9yKX0pKSxSZXN0SnNvbjoobmV3IHIpLmFkZE5hbWVkTGlzdGVuZXJzKChmdW5jdGlvbih0KXt2YXIgbj1lKCIuL3Byb3RvY29sL3Jlc3RfanNvbiIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpLHQoIlVOU0VUX0NPTlRFTlRfTEVOR1RIIiwiYWZ0ZXJCdWlsZCIsbi51bnNldENvbnRlbnRMZW5ndGgpfSkpLFJlc3RYbWw6KG5ldyByKS5hZGROYW1lZExpc3RlbmVycygoZnVuY3Rpb24odCl7dmFyIG49ZSgiLi9wcm90b2NvbC9yZXN0X3htbCIpO3QoIkJVSUxEIiwiYnVpbGQiLG4uYnVpbGRSZXF1ZXN0KSx0KCJFWFRSQUNUX0RBVEEiLCJleHRyYWN0RGF0YSIsbi5leHRyYWN0RGF0YSksdCgiRVhUUkFDVF9FUlJPUiIsImV4dHJhY3RFcnJvciIsbi5leHRyYWN0RXJyb3IpfSkpLFF1ZXJ5OihuZXcgcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKHQpe3ZhciBuPWUoIi4vcHJvdG9jb2wvcXVlcnkiKTt0KCJCVUlMRCIsImJ1aWxkIixuLmJ1aWxkUmVxdWVzdCksdCgiRVhUUkFDVF9EQVRBIiwiZXh0cmFjdERhdGEiLG4uZXh0cmFjdERhdGEpLHQoIkVYVFJBQ1RfRVJST1IiLCJleHRyYWN0RXJyb3IiLG4uZXh0cmFjdEVycm9yKX0pKX19KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7Ii4vY29yZSI6MTksIi4vZGlzY292ZXJfZW5kcG9pbnQiOjI3LCIuL3Byb3RvY29sL2pzb24iOjQ4LCIuL3Byb3RvY29sL3F1ZXJ5Ijo0OSwiLi9wcm90b2NvbC9yZXN0Ijo1MCwiLi9wcm90b2NvbC9yZXN0X2pzb24iOjUxLCIuL3Byb3RvY29sL3Jlc3RfeG1sIjo1MiwiLi9zZXF1ZW50aWFsX2V4ZWN1dG9yIjo2MSxfcHJvY2Vzczo5MSx1dGlsOjg1fV0sMzU6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuRW5kcG9pbnQ9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXtpZihyLnV0aWwuaGlkZVByb3BlcnRpZXModGhpcyxbInNsYXNoZXMiLCJhdXRoIiwiaGFzaCIsInNlYXJjaCIsInF1ZXJ5Il0pLG51bGw9PWUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGVuZHBvaW50OiAiK2UpO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gci51dGlsLmNvcHkoZSk7ZS5tYXRjaCgvXmh0dHAvKXx8KGU9KCh0JiZ2b2lkIDAhPT10LnNzbEVuYWJsZWQ/dC5zc2xFbmFibGVkOnIuY29uZmlnLnNzbEVuYWJsZWQpPyJodHRwcyI6Imh0dHAiKSsiOi8vIitlKSxyLnV0aWwudXBkYXRlKHRoaXMsci51dGlsLnVybFBhcnNlKGUpKSx0aGlzLnBvcnQ/dGhpcy5wb3J0PXBhcnNlSW50KHRoaXMucG9ydCwxMCk6dGhpcy5wb3J0PSJodHRwczoiPT09dGhpcy5wcm90b2NvbD80NDM6ODB9fSksci5IdHRwUmVxdWVzdD1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQpe2U9bmV3IHIuRW5kcG9pbnQoZSksdGhpcy5tZXRob2Q9IlBPU1QiLHRoaXMucGF0aD1lLnBhdGh8fCIvIix0aGlzLmhlYWRlcnM9e30sdGhpcy5ib2R5PSIiLHRoaXMuZW5kcG9pbnQ9ZSx0aGlzLnJlZ2lvbj10LHRoaXMuX3VzZXJBZ2VudD0iIix0aGlzLnNldFVzZXJBZ2VudCgpfSxzZXRVc2VyQWdlbnQ6ZnVuY3Rpb24oKXt0aGlzLl91c2VyQWdlbnQ9dGhpcy5oZWFkZXJzW3RoaXMuZ2V0VXNlckFnZW50SGVhZGVyTmFtZSgpXT1yLnV0aWwudXNlckFnZW50KCl9LGdldFVzZXJBZ2VudEhlYWRlck5hbWU6ZnVuY3Rpb24oKXtyZXR1cm4oci51dGlsLmlzQnJvd3NlcigpPyJYLUFtei0iOiIiKSsiVXNlci1BZ2VudCJ9LGFwcGVuZFRvVXNlckFnZW50OmZ1bmN0aW9uKGUpeyJzdHJpbmciPT10eXBlb2YgZSYmZSYmKHRoaXMuX3VzZXJBZ2VudCs9IiAiK2UpLHRoaXMuaGVhZGVyc1t0aGlzLmdldFVzZXJBZ2VudEhlYWRlck5hbWUoKV09dGhpcy5fdXNlckFnZW50fSxnZXRVc2VyQWdlbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXNlckFnZW50fSxwYXRobmFtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhdGguc3BsaXQoIj8iLDEpWzBdfSxzZWFyY2g6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnBhdGguc3BsaXQoIj8iLDIpWzFdO3JldHVybiBlPyhlPXIudXRpbC5xdWVyeVN0cmluZ1BhcnNlKGUpLHIudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKGUpKToiIn0sdXBkYXRlRW5kcG9pbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHIuRW5kcG9pbnQoZSk7dGhpcy5lbmRwb2ludD10LHRoaXMucGF0aD10LnBhdGh8fCIvIix0aGlzLmhlYWRlcnMuSG9zdCYmKHRoaXMuaGVhZGVycy5Ib3N0PXQuaG9zdCl9fSksci5IdHRwUmVzcG9uc2U9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLnN0YXR1c0NvZGU9dm9pZCAwLHRoaXMuaGVhZGVycz17fSx0aGlzLmJvZHk9dm9pZCAwLHRoaXMuc3RyZWFtaW5nPSExLHRoaXMuc3RyZWFtPW51bGx9LGNyZWF0ZVVuYnVmZmVyZWRTdHJlYW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJlYW1pbmc9ITAsdGhpcy5zdHJlYW19fSksci5IdHRwQ2xpZW50PW8oe30pLHIuSHR0cENsaWVudC5nZXRJbnN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLnNpbmdsZXRvbiYmKHRoaXMuc2luZ2xldG9uPW5ldyB0aGlzKSx0aGlzLnNpbmdsZXRvbn19LHsiLi9jb3JlIjoxOX1dLDM2OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLGk9ZSgiZXZlbnRzIikuRXZlbnRFbWl0dGVyO2UoIi4uL2h0dHAiKSxyLlhIUkNsaWVudD1yLnV0aWwuaW5oZXJpdCh7aGFuZGxlUmVxdWVzdDpmdW5jdGlvbihlLHQsbixhKXt2YXIgcz10aGlzLGM9ZS5lbmRwb2ludCx1PW5ldyBpLGw9Yy5wcm90b2NvbCsiLy8iK2MuaG9zdG5hbWU7ODAhPT1jLnBvcnQmJjQ0MyE9PWMucG9ydCYmKGwrPSI6IitjLnBvcnQpLGwrPWUucGF0aDt2YXIgcD1uZXcgWE1MSHR0cFJlcXVlc3QsZD0hMTtlLnN0cmVhbT1wLHAuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsKGZ1bmN0aW9uKCl7dHJ5e2lmKDA9PT1wLnN0YXR1cylyZXR1cm59Y2F0Y2goZSl7cmV0dXJufXRoaXMucmVhZHlTdGF0ZT49dGhpcy5IRUFERVJTX1JFQ0VJVkVEJiYhZCYmKHUuc3RhdHVzQ29kZT1wLnN0YXR1cyx1LmhlYWRlcnM9cy5wYXJzZUhlYWRlcnMocC5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSksdS5lbWl0KCJoZWFkZXJzIix1LnN0YXR1c0NvZGUsdS5oZWFkZXJzLHAuc3RhdHVzVGV4dCksZD0hMCksdGhpcy5yZWFkeVN0YXRlPT09dGhpcy5ET05FJiZzLmZpbmlzaFJlcXVlc3QocCx1KX0pLCExKSxwLnVwbG9hZC5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsKGZ1bmN0aW9uKGUpe3UuZW1pdCgic2VuZFByb2dyZXNzIixlKX0pKSxwLmFkZEV2ZW50TGlzdGVuZXIoInByb2dyZXNzIiwoZnVuY3Rpb24oZSl7dS5lbWl0KCJyZWNlaXZlUHJvZ3Jlc3MiLGUpfSksITEpLHAuYWRkRXZlbnRMaXN0ZW5lcigidGltZW91dCIsKGZ1bmN0aW9uKCl7YShyLnV0aWwuZXJyb3IobmV3IEVycm9yKCJUaW1lb3V0Iikse2NvZGU6IlRpbWVvdXRFcnJvciJ9KSl9KSwhMSkscC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGZ1bmN0aW9uKCl7YShyLnV0aWwuZXJyb3IobmV3IEVycm9yKCJOZXR3b3JrIEZhaWx1cmUiKSx7Y29kZToiTmV0d29ya2luZ0Vycm9yIn0pKX0pLCExKSxwLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IiwoZnVuY3Rpb24oKXthKHIudXRpbC5lcnJvcihuZXcgRXJyb3IoIlJlcXVlc3QgYWJvcnRlZCIpLHtjb2RlOiJSZXF1ZXN0QWJvcnRlZEVycm9yIn0pKX0pLCExKSxuKHUpLHAub3BlbihlLm1ldGhvZCxsLCExIT09dC54aHJBc3luYyksci51dGlsLmVhY2goZS5oZWFkZXJzLChmdW5jdGlvbihlLHQpeyJDb250ZW50LUxlbmd0aCIhPT1lJiYiVXNlci1BZ2VudCIhPT1lJiYiSG9zdCIhPT1lJiZwLnNldFJlcXVlc3RIZWFkZXIoZSx0KX0pKSx0LnRpbWVvdXQmJiExIT09dC54aHJBc3luYyYmKHAudGltZW91dD10LnRpbWVvdXQpLHQueGhyV2l0aENyZWRlbnRpYWxzJiYocC53aXRoQ3JlZGVudGlhbHM9ITApO3RyeXtwLnJlc3BvbnNlVHlwZT0iYXJyYXlidWZmZXIifWNhdGNoKGUpe310cnl7ZS5ib2R5P3Auc2VuZChlLmJvZHkpOnAuc2VuZCgpfWNhdGNoKHQpe2lmKCFlLmJvZHl8fCJvYmplY3QiIT09byhlLmJvZHkuYnVmZmVyKSl0aHJvdyB0O3Auc2VuZChlLmJvZHkuYnVmZmVyKX1yZXR1cm4gdX0scGFyc2VIZWFkZXJzOmZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiByLnV0aWwuYXJyYXlFYWNoKGUuc3BsaXQoL1xyP1xuLyksKGZ1bmN0aW9uKGUpe3ZhciBuPWUuc3BsaXQoIjoiLDEpWzBdLHI9ZS5zdWJzdHJpbmcobi5sZW5ndGgrMik7bi5sZW5ndGg+MCYmKHRbbi50b0xvd2VyQ2FzZSgpXT1yKX0pKSx0fSxmaW5pc2hSZXF1ZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG47aWYoImFycmF5YnVmZmVyIj09PWUucmVzcG9uc2VUeXBlJiZlLnJlc3BvbnNlKXt2YXIgbz1lLnJlc3BvbnNlO249bmV3IHIudXRpbC5CdWZmZXIoby5ieXRlTGVuZ3RoKTtmb3IodmFyIGk9bmV3IFVpbnQ4QXJyYXkobyksYT0wO2E8bi5sZW5ndGg7KythKW5bYV09aVthXX10cnl7bnx8InN0cmluZyIhPXR5cGVvZiBlLnJlc3BvbnNlVGV4dHx8KG49bmV3IHIudXRpbC5CdWZmZXIoZS5yZXNwb25zZVRleHQpKX1jYXRjaChlKXt9biYmdC5lbWl0KCJkYXRhIixuKSx0LmVtaXQoImVuZCIpfX0pLHIuSHR0cENsaWVudC5wcm90b3R5cGU9ci5YSFJDbGllbnQucHJvdG90eXBlLHIuSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj0xfSx7Ii4uL2NvcmUiOjE5LCIuLi9odHRwIjozNSxldmVudHM6ODd9XSwzNzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKTtmdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIGkoZSx0KXtpZih0JiZudWxsIT1lKXN3aXRjaCh0LnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZih0LmlzRG9jdW1lbnQpcmV0dXJuIGU7dmFyIG49e307cmV0dXJuIHIuZWFjaChlLChmdW5jdGlvbihlLHIpe3ZhciBvPXQubWVtYmVyc1tlXTtpZihvKXtpZigiYm9keSIhPT1vLmxvY2F0aW9uKXJldHVybjt2YXIgYT1vLmlzTG9jYXRpb25OYW1lP28ubmFtZTplLHM9aShyLG8pO3ZvaWQgMCE9PXMmJihuW2FdPXMpfX0pKSxufShlLHQpO2Nhc2UibWFwIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtyZXR1cm4gci5lYWNoKGUsKGZ1bmN0aW9uKGUscil7dmFyIG89aShyLHQudmFsdWUpO3ZvaWQgMCE9PW8mJihuW2VdPW8pfSkpLG59KGUsdCk7Y2FzZSJsaXN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj1bXTtyZXR1cm4gci5hcnJheUVhY2goZSwoZnVuY3Rpb24oZSl7dmFyIHI9aShlLHQubWVtYmVyKTt2b2lkIDAhPT1yJiZuLnB1c2gocil9KSksbn0oZSx0KTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvV2lyZUZvcm1hdChlKX0oZSx0KX19by5wcm90b3R5cGUuYnVpbGQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaShlLHQpKX0sdC5leHBvcnRzPW99LHsiLi4vdXRpbCI6NzR9XSwzODpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKTtmdW5jdGlvbiBvKCl7fWZ1bmN0aW9uIGkoZSx0KXtpZih0JiZ2b2lkIDAhPT1lKXN3aXRjaCh0LnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gZnVuY3Rpb24oZSx0KXtpZihudWxsIT1lKXtpZih0LmlzRG9jdW1lbnQpcmV0dXJuIGU7dmFyIG49e30sbz10Lm1lbWJlcnM7cmV0dXJuIHIuZWFjaChvLChmdW5jdGlvbih0LHIpe3ZhciBvPXIuaXNMb2NhdGlvbk5hbWU/ci5uYW1lOnQ7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbykpe3ZhciBhPWkoZVtvXSxyKTt2b2lkIDAhPT1hJiYoblt0XT1hKX19KSksbn19KGUsdCk7Y2FzZSJtYXAiOnJldHVybiBmdW5jdGlvbihlLHQpe2lmKG51bGwhPWUpe3ZhciBuPXt9O3JldHVybiByLmVhY2goZSwoZnVuY3Rpb24oZSxyKXt2YXIgbz1pKHIsdC52YWx1ZSk7bltlXT12b2lkIDA9PT1vP251bGw6b30pKSxufX0oZSx0KTtjYXNlImxpc3QiOnJldHVybiBmdW5jdGlvbihlLHQpe2lmKG51bGwhPWUpe3ZhciBuPVtdO3JldHVybiByLmFycmF5RWFjaChlLChmdW5jdGlvbihlKXt2YXIgcj1pKGUsdC5tZW1iZXIpO3ZvaWQgMD09PXI/bi5wdXNoKG51bGwpOm4ucHVzaChyKX0pKSxufX0oZSx0KTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVHlwZShlKX0oZSx0KX19by5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaShKU09OLnBhcnNlKGUpLHQpfSx0LmV4cG9ydHM9b30seyIuLi91dGlsIjo3NH1dLDM5OltmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKGUpeyhmdW5jdGlvbigpe3ZhciBuPVsiV2UgYXJlIGZvcm1hbGl6aW5nIG91ciBwbGFucyB0byBlbnRlciBBV1MgU0RLIGZvciBKYXZhU2NyaXB0ICh2MikgaW50byBtYWludGVuYW5jZSBtb2RlIGluIDIwMjMuXG4iLCJQbGVhc2UgbWlncmF0ZSB5b3VyIGNvZGUgdG8gdXNlIEFXUyBTREsgZm9yIEphdmFTY3JpcHQgKHYzKS4iLCJGb3IgbW9yZSBpbmZvcm1hdGlvbiwgY2hlY2sgdGhlIG1pZ3JhdGlvbiBndWlkZSBhdCBodHRwczovL2EuY28vN1B6TUNjeSJdLmpvaW4oIlxuIik7dC5leHBvcnRzPXtzdXBwcmVzczohMX0sc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LmV4cG9ydHMuc3VwcHJlc3N8fHZvaWQgMCE9PWUmJigib2JqZWN0Ij09PW8oZS5lbnYpJiZ2b2lkIDAhPT1lLmVudi5BV1NfRVhFQ1VUSU9OX0VOViYmMD09PWUuZW52LkFXU19FWEVDVVRJT05fRU5WLmluZGV4T2YoIkFXU19MYW1iZGFfIil8fCJvYmplY3QiPT09byhlLmVudikmJnZvaWQgMCE9PWUuZW52LkFXU19TREtfSlNfU1VQUFJFU1NfTUFJTlRFTkFOQ0VfTU9ERV9NRVNTQUdFfHwiZnVuY3Rpb24iPT10eXBlb2YgZS5lbWl0V2FybmluZyYmZS5lbWl0V2FybmluZyhuLHt0eXBlOiJOT1RFIn0pKX0pLDApfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpKX0se19wcm9jZXNzOjkxfV0sNDA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvbGxlY3Rpb24iKSxvPWUoIi4vb3BlcmF0aW9uIiksaT1lKCIuL3NoYXBlIiksYT1lKCIuL3BhZ2luYXRvciIpLHM9ZSgiLi9yZXNvdXJjZV93YWl0ZXIiKSxjPWUoIi4uLy4uL2FwaXMvbWV0YWRhdGEuanNvbiIpLHU9ZSgiLi4vdXRpbCIpLGw9dS5wcm9wZXJ0eSxwPXUubWVtb2l6ZWRQcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2U9ZXx8e30sKHQ9dHx8e30pLmFwaT10aGlzLGUubWV0YWRhdGE9ZS5tZXRhZGF0YXx8e307dmFyIGQ9dC5zZXJ2aWNlSWRlbnRpZmllcjtkZWxldGUgdC5zZXJ2aWNlSWRlbnRpZmllcixsKHRoaXMsImlzQXBpIiwhMCwhMSksbCh0aGlzLCJhcGlWZXJzaW9uIixlLm1ldGFkYXRhLmFwaVZlcnNpb24pLGwodGhpcywiZW5kcG9pbnRQcmVmaXgiLGUubWV0YWRhdGEuZW5kcG9pbnRQcmVmaXgpLGwodGhpcywic2lnbmluZ05hbWUiLGUubWV0YWRhdGEuc2lnbmluZ05hbWUpLGwodGhpcywiZ2xvYmFsRW5kcG9pbnQiLGUubWV0YWRhdGEuZ2xvYmFsRW5kcG9pbnQpLGwodGhpcywic2lnbmF0dXJlVmVyc2lvbiIsZS5tZXRhZGF0YS5zaWduYXR1cmVWZXJzaW9uKSxsKHRoaXMsImpzb25WZXJzaW9uIixlLm1ldGFkYXRhLmpzb25WZXJzaW9uKSxsKHRoaXMsInRhcmdldFByZWZpeCIsZS5tZXRhZGF0YS50YXJnZXRQcmVmaXgpLGwodGhpcywicHJvdG9jb2wiLGUubWV0YWRhdGEucHJvdG9jb2wpLGwodGhpcywidGltZXN0YW1wRm9ybWF0IixlLm1ldGFkYXRhLnRpbWVzdGFtcEZvcm1hdCksbCh0aGlzLCJ4bWxOYW1lc3BhY2VVcmkiLGUubWV0YWRhdGEueG1sTmFtZXNwYWNlKSxsKHRoaXMsImFiYnJldmlhdGlvbiIsZS5tZXRhZGF0YS5zZXJ2aWNlQWJicmV2aWF0aW9uKSxsKHRoaXMsImZ1bGxOYW1lIixlLm1ldGFkYXRhLnNlcnZpY2VGdWxsTmFtZSksbCh0aGlzLCJzZXJ2aWNlSWQiLGUubWV0YWRhdGEuc2VydmljZUlkKSxkJiZjW2RdJiZsKHRoaXMsInhtbE5vRGVmYXVsdExpc3RzIixjW2RdLnhtbE5vRGVmYXVsdExpc3RzLCExKSxwKHRoaXMsImNsYXNzTmFtZSIsKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5tZXRhZGF0YS5zZXJ2aWNlQWJicmV2aWF0aW9ufHxlLm1ldGFkYXRhLnNlcnZpY2VGdWxsTmFtZTtyZXR1cm4gdD8oIkVsYXN0aWNMb2FkQmFsYW5jaW5nIj09PSh0PXQucmVwbGFjZSgvXkFtYXpvbnxBV1Nccyp8XCguKnxccyt8XFcrL2csIiIpKSYmKHQ9IkVMQiIpLHQpOm51bGx9KSksbCh0aGlzLCJvcGVyYXRpb25zIixuZXcgcihlLm9wZXJhdGlvbnMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IG8oZSxuLHQpfSksdS5zdHJpbmcubG93ZXJGaXJzdCwoZnVuY3Rpb24oZSx0KXshMD09PXQuZW5kcG9pbnRvcGVyYXRpb24mJmwobiwiZW5kcG9pbnRPcGVyYXRpb24iLHUuc3RyaW5nLmxvd2VyRmlyc3QoZSkpLHQuZW5kcG9pbnRkaXNjb3ZlcnkmJiFuLmhhc1JlcXVpcmVkRW5kcG9pbnREaXNjb3ZlcnkmJmwobiwiaGFzUmVxdWlyZWRFbmRwb2ludERpc2NvdmVyeSIsITA9PT10LmVuZHBvaW50ZGlzY292ZXJ5LnJlcXVpcmVkKX0pKSksbCh0aGlzLCJzaGFwZXMiLG5ldyByKGUuc2hhcGVzLHQsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGkuY3JlYXRlKG4sdCl9KSkpLGwodGhpcywicGFnaW5hdG9ycyIsbmV3IHIoZS5wYWdpbmF0b3JzLHQsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyBhKGUsbix0KX0pKSksbCh0aGlzLCJ3YWl0ZXJzIixuZXcgcihlLndhaXRlcnMsdCwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IHMoZSxuLHQpfSksdS5zdHJpbmcubG93ZXJGaXJzdCkpLHQuZG9jdW1lbnRhdGlvbiYmKGwodGhpcywiZG9jdW1lbnRhdGlvbiIsZS5kb2N1bWVudGF0aW9uKSxsKHRoaXMsImRvY3VtZW50YXRpb25VcmwiLGUuZG9jdW1lbnRhdGlvblVybCkpLGwodGhpcywiYXdzUXVlcnlDb21wYXRpYmxlIixlLm1ldGFkYXRhLmF3c1F1ZXJ5Q29tcGF0aWJsZSl9fSx7Ii4uLy4uL2FwaXMvbWV0YWRhdGEuanNvbiI6NCwiLi4vdXRpbCI6NzQsIi4vY29sbGVjdGlvbiI6NDEsIi4vb3BlcmF0aW9uIjo0MiwiLi9wYWdpbmF0b3IiOjQzLCIuL3Jlc291cmNlX3dhaXRlciI6NDQsIi4vc2hhcGUiOjQ1fV0sNDE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIikubWVtb2l6ZWRQcm9wZXJ0eTtmdW5jdGlvbiBvKGUsdCxuLG8pe3IodGhpcyxvKGUpLChmdW5jdGlvbigpe3JldHVybiBuKGUsdCl9KSl9dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIsaSl7Zm9yKHZhciBhIGluIHI9cnx8U3RyaW5nLGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsYSkmJihvLmNhbGwodGhpcyxhLGVbYV0sbixyKSxpJiZpKGEsZVthXSkpfX0seyIuLi91dGlsIjo3NH1dLDQyOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi9zaGFwZSIpLG89ZSgiLi4vdXRpbCIpLGk9by5wcm9wZXJ0eSxhPW8ubWVtb2l6ZWRQcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXRoaXM7bj1ufHx7fSxpKHRoaXMsIm5hbWUiLHQubmFtZXx8ZSksaSh0aGlzLCJhcGkiLG4uYXBpLCExKSx0Lmh0dHA9dC5odHRwfHx7fSxpKHRoaXMsImVuZHBvaW50Iix0LmVuZHBvaW50KSxpKHRoaXMsImh0dHBNZXRob2QiLHQuaHR0cC5tZXRob2R8fCJQT1NUIiksaSh0aGlzLCJodHRwUGF0aCIsdC5odHRwLnJlcXVlc3RVcml8fCIvIiksaSh0aGlzLCJhdXRodHlwZSIsdC5hdXRodHlwZXx8IiIpLGkodGhpcywiZW5kcG9pbnREaXNjb3ZlcnlSZXF1aXJlZCIsdC5lbmRwb2ludGRpc2NvdmVyeT90LmVuZHBvaW50ZGlzY292ZXJ5LnJlcXVpcmVkPyJSRVFVSVJFRCI6Ik9QVElPTkFMIjoiTlVMTCIpO3ZhciBzPXQuaHR0cENoZWNrc3VtUmVxdWlyZWR8fHQuaHR0cENoZWNrc3VtJiZ0Lmh0dHBDaGVja3N1bS5yZXF1ZXN0Q2hlY2tzdW1SZXF1aXJlZDtpKHRoaXMsImh0dHBDaGVja3N1bVJlcXVpcmVkIixzLCExKSxhKHRoaXMsImlucHV0IiwoZnVuY3Rpb24oKXtyZXR1cm4gdC5pbnB1dD9yLmNyZWF0ZSh0LmlucHV0LG4pOm5ldyByLmNyZWF0ZSh7dHlwZToic3RydWN0dXJlIn0sbil9KSksYSh0aGlzLCJvdXRwdXQiLChmdW5jdGlvbigpe3JldHVybiB0Lm91dHB1dD9yLmNyZWF0ZSh0Lm91dHB1dCxuKTpuZXcgci5jcmVhdGUoe3R5cGU6InN0cnVjdHVyZSJ9LG4pfSkpLGEodGhpcywiZXJyb3JzIiwoZnVuY3Rpb24oKXt2YXIgZT1bXTtpZighdC5lcnJvcnMpcmV0dXJuIG51bGw7Zm9yKHZhciBvPTA7bzx0LmVycm9ycy5sZW5ndGg7bysrKWUucHVzaChyLmNyZWF0ZSh0LmVycm9yc1tvXSxuKSk7cmV0dXJuIGV9KSksYSh0aGlzLCJwYWdpbmF0b3IiLChmdW5jdGlvbigpe3JldHVybiBuLmFwaS5wYWdpbmF0b3JzW2VdfSkpLG4uZG9jdW1lbnRhdGlvbiYmKGkodGhpcywiZG9jdW1lbnRhdGlvbiIsdC5kb2N1bWVudGF0aW9uKSxpKHRoaXMsImRvY3VtZW50YXRpb25VcmwiLHQuZG9jdW1lbnRhdGlvblVybCkpLGEodGhpcywiaWRlbXBvdGVudE1lbWJlcnMiLChmdW5jdGlvbigpe3ZhciBlPVtdLHQ9by5pbnB1dCxuPXQubWVtYmVycztpZighdC5tZW1iZXJzKXJldHVybiBlO2Zvcih2YXIgciBpbiBuKW4uaGFzT3duUHJvcGVydHkocikmJiEwPT09bltyXS5pc0lkZW1wb3RlbnQmJmUucHVzaChyKTtyZXR1cm4gZX0pKSxhKHRoaXMsImhhc0V2ZW50T3V0cHV0IiwoZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5tZW1iZXJzLG49ZS5wYXlsb2FkO2lmKCFlLm1lbWJlcnMpcmV0dXJuITE7aWYobilyZXR1cm4gdFtuXS5pc0V2ZW50U3RyZWFtO2Zvcih2YXIgciBpbiB0KWlmKCF0Lmhhc093blByb3BlcnR5KHIpJiYhMD09PXRbcl0uaXNFdmVudFN0cmVhbSlyZXR1cm4hMDtyZXR1cm4hMX0oby5vdXRwdXQpfSkpfX0seyIuLi91dGlsIjo3NCwiLi9zaGFwZSI6NDV9XSw0MzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKS5wcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyKHRoaXMsImlucHV0VG9rZW4iLHQuaW5wdXRfdG9rZW4pLHIodGhpcywibGltaXRLZXkiLHQubGltaXRfa2V5KSxyKHRoaXMsIm1vcmVSZXN1bHRzIix0Lm1vcmVfcmVzdWx0cykscih0aGlzLCJvdXRwdXRUb2tlbiIsdC5vdXRwdXRfdG9rZW4pLHIodGhpcywicmVzdWx0S2V5Iix0LnJlc3VsdF9rZXkpfX0seyIuLi91dGlsIjo3NH1dLDQ0OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ci5wcm9wZXJ0eTt0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe249bnx8e30sbyh0aGlzLCJuYW1lIixlKSxvKHRoaXMsImFwaSIsbi5hcGksITEpLHQub3BlcmF0aW9uJiZvKHRoaXMsIm9wZXJhdGlvbiIsci5zdHJpbmcubG93ZXJGaXJzdCh0Lm9wZXJhdGlvbikpO3ZhciBpPXRoaXM7WyJ0eXBlIiwiZGVzY3JpcHRpb24iLCJkZWxheSIsIm1heEF0dGVtcHRzIiwiYWNjZXB0b3JzIl0uZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49dFtlXTtuJiZvKGksZSxuKX0pKX19LHsiLi4vdXRpbCI6NzR9XSw0NTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29sbGVjdGlvbiIpLGk9ZSgiLi4vdXRpbCIpO2Z1bmN0aW9uIGEoZSx0LG4pe251bGwhPW4mJmkucHJvcGVydHkuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIHMoZSx0KXtlLmNvbnN0cnVjdG9yLnByb3RvdHlwZVt0XXx8aS5tZW1vaXplZFByb3BlcnR5LmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBjKGUsdCxuKXt0PXR8fHt9LGEodGhpcywic2hhcGUiLGUuc2hhcGUpLGEodGhpcywiYXBpIix0LmFwaSwhMSksYSh0aGlzLCJ0eXBlIixlLnR5cGUpLGEodGhpcywiZW51bSIsZS5lbnVtKSxhKHRoaXMsIm1pbiIsZS5taW4pLGEodGhpcywibWF4IixlLm1heCksYSh0aGlzLCJwYXR0ZXJuIixlLnBhdHRlcm4pLGEodGhpcywibG9jYXRpb24iLGUubG9jYXRpb258fHRoaXMubG9jYXRpb258fCJib2R5IiksYSh0aGlzLCJuYW1lIix0aGlzLm5hbWV8fGUueG1sTmFtZXx8ZS5xdWVyeU5hbWV8fGUubG9jYXRpb25OYW1lfHxuKSxhKHRoaXMsImlzU3RyZWFtaW5nIixlLnN0cmVhbWluZ3x8dGhpcy5pc1N0cmVhbWluZ3x8ITEpLGEodGhpcywicmVxdWlyZXNMZW5ndGgiLGUucmVxdWlyZXNMZW5ndGgsITEpLGEodGhpcywiaXNDb21wb3NpdGUiLGUuaXNDb21wb3NpdGV8fCExKSxhKHRoaXMsImlzU2hhcGUiLCEwLCExKSxhKHRoaXMsImlzUXVlcnlOYW1lIixCb29sZWFuKGUucXVlcnlOYW1lKSwhMSksYSh0aGlzLCJpc0xvY2F0aW9uTmFtZSIsQm9vbGVhbihlLmxvY2F0aW9uTmFtZSksITEpLGEodGhpcywiaXNJZGVtcG90ZW50IiwhMD09PWUuaWRlbXBvdGVuY3lUb2tlbiksYSh0aGlzLCJpc0pzb25WYWx1ZSIsITA9PT1lLmpzb252YWx1ZSksYSh0aGlzLCJpc1NlbnNpdGl2ZSIsITA9PT1lLnNlbnNpdGl2ZXx8ZS5wcm90b3R5cGUmJiEwPT09ZS5wcm90b3R5cGUuc2Vuc2l0aXZlKSxhKHRoaXMsImlzRXZlbnRTdHJlYW0iLEJvb2xlYW4oZS5ldmVudHN0cmVhbSksITEpLGEodGhpcywiaXNFdmVudCIsQm9vbGVhbihlLmV2ZW50KSwhMSksYSh0aGlzLCJpc0V2ZW50UGF5bG9hZCIsQm9vbGVhbihlLmV2ZW50cGF5bG9hZCksITEpLGEodGhpcywiaXNFdmVudEhlYWRlciIsQm9vbGVhbihlLmV2ZW50aGVhZGVyKSwhMSksYSh0aGlzLCJpc1RpbWVzdGFtcEZvcm1hdFNldCIsQm9vbGVhbihlLnRpbWVzdGFtcEZvcm1hdCl8fGUucHJvdG90eXBlJiYhMD09PWUucHJvdG90eXBlLmlzVGltZXN0YW1wRm9ybWF0U2V0LCExKSxhKHRoaXMsImVuZHBvaW50RGlzY292ZXJ5SWQiLEJvb2xlYW4oZS5lbmRwb2ludGRpc2NvdmVyeWlkKSwhMSksYSh0aGlzLCJob3N0TGFiZWwiLEJvb2xlYW4oZS5ob3N0TGFiZWwpLCExKSx0LmRvY3VtZW50YXRpb24mJihhKHRoaXMsImRvY3VtZW50YXRpb24iLGUuZG9jdW1lbnRhdGlvbiksYSh0aGlzLCJkb2N1bWVudGF0aW9uVXJsIixlLmRvY3VtZW50YXRpb25VcmwpKSxlLnhtbEF0dHJpYnV0ZSYmYSh0aGlzLCJpc1htbEF0dHJpYnV0ZSIsZS54bWxBdHRyaWJ1dGV8fCExKSxhKHRoaXMsImRlZmF1bHRWYWx1ZSIsbnVsbCksdGhpcy50b1dpcmVGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZX0sdGhpcy50b1R5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9fWZ1bmN0aW9uIHUoZSl7Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyksYSh0aGlzLCJpc0NvbXBvc2l0ZSIsITApLGUuZmxhdHRlbmVkJiZhKHRoaXMsImZsYXR0ZW5lZCIsZS5mbGF0dGVuZWR8fCExKX1mdW5jdGlvbiBsKGUsdCl7dmFyIG49dGhpcyxpPW51bGwsbD0hdGhpcy5pc1NoYXBlO3UuYXBwbHkodGhpcyxhcmd1bWVudHMpLGwmJihhKHRoaXMsImRlZmF1bHRWYWx1ZSIsKGZ1bmN0aW9uKCl7cmV0dXJue319KSksYSh0aGlzLCJtZW1iZXJzIix7fSksYSh0aGlzLCJtZW1iZXJOYW1lcyIsW10pLGEodGhpcywicmVxdWlyZWQiLFtdKSxhKHRoaXMsImlzUmVxdWlyZWQiLChmdW5jdGlvbigpe3JldHVybiExfSkpLGEodGhpcywiaXNEb2N1bWVudCIsQm9vbGVhbihlLmRvY3VtZW50KSkpLGUubWVtYmVycyYmKGEodGhpcywibWVtYmVycyIsbmV3IHIoZS5tZW1iZXJzLHQsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGMuY3JlYXRlKG4sdCxlKX0pKSkscyh0aGlzLCJtZW1iZXJOYW1lcyIsKGZ1bmN0aW9uKCl7cmV0dXJuIGUueG1sT3JkZXJ8fE9iamVjdC5rZXlzKGUubWVtYmVycyl9KSksZS5ldmVudCYmKHModGhpcywiZXZlbnRQYXlsb2FkTWVtYmVyTmFtZSIsKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPW4ubWVtYmVycyx0PW4ubWVtYmVyTmFtZXMscj0wLG89dC5sZW5ndGg7cjxvO3IrKylpZihlW3Rbcl1dLmlzRXZlbnRQYXlsb2FkKXJldHVybiB0W3JdfSkpLHModGhpcywiZXZlbnRIZWFkZXJNZW1iZXJOYW1lcyIsKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPW4ubWVtYmVycyx0PW4ubWVtYmVyTmFtZXMscj1bXSxvPTAsaT10Lmxlbmd0aDtvPGk7bysrKWVbdFtvXV0uaXNFdmVudEhlYWRlciYmci5wdXNoKHRbb10pO3JldHVybiByfSkpKSksZS5yZXF1aXJlZCYmKGEodGhpcywicmVxdWlyZWQiLGUucmVxdWlyZWQpLGEodGhpcywiaXNSZXF1aXJlZCIsKGZ1bmN0aW9uKHQpe2lmKCFpKXtpPXt9O2Zvcih2YXIgbj0wO248ZS5yZXF1aXJlZC5sZW5ndGg7bisrKWlbZS5yZXF1aXJlZFtuXV09ITB9cmV0dXJuIGlbdF19KSwhMSwhMCkpLGEodGhpcywicmVzdWx0V3JhcHBlciIsZS5yZXN1bHRXcmFwcGVyfHxudWxsKSxlLnBheWxvYWQmJmEodGhpcywicGF5bG9hZCIsZS5wYXlsb2FkKSwic3RyaW5nIj09dHlwZW9mIGUueG1sTmFtZXNwYWNlP2EodGhpcywieG1sTmFtZXNwYWNlVXJpIixlLnhtbE5hbWVzcGFjZSk6Im9iamVjdCI9PT1vKGUueG1sTmFtZXNwYWNlKSYmKGEodGhpcywieG1sTmFtZXNwYWNlUHJlZml4IixlLnhtbE5hbWVzcGFjZS5wcmVmaXgpLGEodGhpcywieG1sTmFtZXNwYWNlVXJpIixlLnhtbE5hbWVzcGFjZS51cmkpKX1mdW5jdGlvbiBwKGUsdCl7dmFyIG49dGhpcyxyPSF0aGlzLmlzU2hhcGU7aWYodS5hcHBseSh0aGlzLGFyZ3VtZW50cyksciYmYSh0aGlzLCJkZWZhdWx0VmFsdWUiLChmdW5jdGlvbigpe3JldHVybltdfSkpLGUubWVtYmVyJiZzKHRoaXMsIm1lbWJlciIsKGZ1bmN0aW9uKCl7cmV0dXJuIGMuY3JlYXRlKGUubWVtYmVyLHQpfSkpLHRoaXMuZmxhdHRlbmVkKXt2YXIgbz10aGlzLm5hbWU7cyh0aGlzLCJuYW1lIiwoZnVuY3Rpb24oKXtyZXR1cm4gbi5tZW1iZXIubmFtZXx8b30pKX19ZnVuY3Rpb24gZChlLHQpe3ZhciBuPSF0aGlzLmlzU2hhcGU7dS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbiYmKGEodGhpcywiZGVmYXVsdFZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm57fX0pKSxhKHRoaXMsImtleSIsYy5jcmVhdGUoe3R5cGU6InN0cmluZyJ9LHQpKSxhKHRoaXMsInZhbHVlIixjLmNyZWF0ZSh7dHlwZToic3RyaW5nIn0sdCkpKSxlLmtleSYmcyh0aGlzLCJrZXkiLChmdW5jdGlvbigpe3JldHVybiBjLmNyZWF0ZShlLmtleSx0KX0pKSxlLnZhbHVlJiZzKHRoaXMsInZhbHVlIiwoZnVuY3Rpb24oKXtyZXR1cm4gYy5jcmVhdGUoZS52YWx1ZSx0KX0pKX1mdW5jdGlvbiBmKCl7Yy5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dmFyIGU9WyJyZXN0LXhtbCIsInF1ZXJ5IiwiZWMyIl07dGhpcy50b1R5cGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9dGhpcy5hcGkmJmUuaW5kZXhPZih0aGlzLmFwaS5wcm90b2NvbCk+LTE/dHx8IiI6dCx0aGlzLmlzSnNvblZhbHVlP0pTT04ucGFyc2UodCk6dCYmImZ1bmN0aW9uIj09dHlwZW9mIHQudG9TdHJpbmc/dC50b1N0cmluZygpOnR9LHRoaXMudG9XaXJlRm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmlzSnNvblZhbHVlP0pTT04uc3RyaW5naWZ5KGUpOmV9fWZ1bmN0aW9uIGgoKXtjLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXt2YXIgdD1pLmJhc2U2NC5kZWNvZGUoZSk7aWYodGhpcy5pc1NlbnNpdGl2ZSYmaS5pc05vZGUoKSYmImZ1bmN0aW9uIj09dHlwZW9mIGkuQnVmZmVyLmFsbG9jKXt2YXIgbj1pLkJ1ZmZlci5hbGxvYyh0Lmxlbmd0aCx0KTt0LmZpbGwoMCksdD1ufXJldHVybiB0fSx0aGlzLnRvV2lyZUZvcm1hdD1pLmJhc2U2NC5lbmNvZGV9ZnVuY3Rpb24gZygpe2guYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIG0oKXtjLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlP2U6bnVsbD09ZT9udWxsOiJ0cnVlIj09PWV9fWMubm9ybWFsaXplZFR5cGVzPXtjaGFyYWN0ZXI6InN0cmluZyIsZG91YmxlOiJmbG9hdCIsbG9uZzoiaW50ZWdlciIsc2hvcnQ6ImludGVnZXIiLGJpZ2ludGVnZXI6ImludGVnZXIiLGJpZ2RlY2ltYWw6ImZsb2F0IixibG9iOiJiaW5hcnkifSxjLnR5cGVzPXtzdHJ1Y3R1cmU6bCxsaXN0OnAsbWFwOmQsYm9vbGVhbjptLHRpbWVzdGFtcDpmdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKGMuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudGltZXN0YW1wRm9ybWF0KWEodGhpcywidGltZXN0YW1wRm9ybWF0IixlLnRpbWVzdGFtcEZvcm1hdCk7ZWxzZSBpZih0LmlzVGltZXN0YW1wRm9ybWF0U2V0JiZ0aGlzLnRpbWVzdGFtcEZvcm1hdClhKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsdGhpcy50aW1lc3RhbXBGb3JtYXQpO2Vsc2UgaWYoImhlYWRlciI9PT10aGlzLmxvY2F0aW9uKWEodGhpcywidGltZXN0YW1wRm9ybWF0IiwicmZjODIyIik7ZWxzZSBpZigicXVlcnlzdHJpbmciPT09dGhpcy5sb2NhdGlvbilhKHRoaXMsInRpbWVzdGFtcEZvcm1hdCIsImlzbzg2MDEiKTtlbHNlIGlmKHRoaXMuYXBpKXN3aXRjaCh0aGlzLmFwaS5wcm90b2NvbCl7Y2FzZSJqc29uIjpjYXNlInJlc3QtanNvbiI6YSh0aGlzLCJ0aW1lc3RhbXBGb3JtYXQiLCJ1bml4VGltZXN0YW1wIik7YnJlYWs7Y2FzZSJyZXN0LXhtbCI6Y2FzZSJxdWVyeSI6Y2FzZSJlYzIiOmEodGhpcywidGltZXN0YW1wRm9ybWF0IiwiaXNvODYwMSIpfXRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIGUudG9VVENTdHJpbmc/ZToic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZT9pLmRhdGUucGFyc2VUaW1lc3RhbXAoZSk6bnVsbH0sdGhpcy50b1dpcmVGb3JtYXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGkuZGF0ZS5mb3JtYXQoZSx0LnRpbWVzdGFtcEZvcm1hdCl9fSxmbG9hdDpmdW5jdGlvbigpe2MuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMudG9UeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP251bGw6cGFyc2VGbG9hdChlKX0sdGhpcy50b1dpcmVGb3JtYXQ9dGhpcy50b1R5cGV9LGludGVnZXI6ZnVuY3Rpb24oKXtjLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnRvVHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT9udWxsOnBhcnNlSW50KGUsMTApfSx0aGlzLnRvV2lyZUZvcm1hdD10aGlzLnRvVHlwZX0sc3RyaW5nOmYsYmFzZTY0OmcsYmluYXJ5Omh9LGMucmVzb2x2ZT1mdW5jdGlvbihlLHQpe2lmKGUuc2hhcGUpe3ZhciBuPXQuYXBpLnNoYXBlc1tlLnNoYXBlXTtpZighbil0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBmaW5kIHNoYXBlIHJlZmVyZW5jZTogIitlLnNoYXBlKTtyZXR1cm4gbn1yZXR1cm4gbnVsbH0sYy5jcmVhdGU9ZnVuY3Rpb24oZSx0LG4pe2lmKGUuaXNTaGFwZSlyZXR1cm4gZTt2YXIgcj1jLnJlc29sdmUoZSx0KTtpZihyKXt2YXIgbz1PYmplY3Qua2V5cyhlKTt0LmRvY3VtZW50YXRpb258fChvPW8uZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4hZS5tYXRjaCgvZG9jdW1lbnRhdGlvbi8pfSkpKTt2YXIgaT1mdW5jdGlvbigpe3IuY29uc3RydWN0b3IuY2FsbCh0aGlzLGUsdCxuKX07cmV0dXJuIGkucHJvdG90eXBlPXIsbmV3IGl9ZS50eXBlfHwoZS5tZW1iZXJzP2UudHlwZT0ic3RydWN0dXJlIjplLm1lbWJlcj9lLnR5cGU9Imxpc3QiOmUua2V5P2UudHlwZT0ibWFwIjplLnR5cGU9InN0cmluZyIpO3ZhciBhPWUudHlwZTtpZihjLm5vcm1hbGl6ZWRUeXBlc1tlLnR5cGVdJiYoZS50eXBlPWMubm9ybWFsaXplZFR5cGVzW2UudHlwZV0pLGMudHlwZXNbZS50eXBlXSlyZXR1cm4gbmV3IGMudHlwZXNbZS50eXBlXShlLHQsbik7dGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgc2hhcGUgdHlwZTogIithKX0sYy5zaGFwZXM9e1N0cnVjdHVyZVNoYXBlOmwsTGlzdFNoYXBlOnAsTWFwU2hhcGU6ZCxTdHJpbmdTaGFwZTpmLEJvb2xlYW5TaGFwZTptLEJhc2U2NFNoYXBlOmd9LHQuZXhwb3J0cz1jfSx7Ii4uL3V0aWwiOjc0LCIuL2NvbGxlY3Rpb24iOjQxfV0sNDY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKTtyLlBhcmFtVmFsaWRhdG9yPXIudXRpbC5pbmhlcml0KHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXshMCE9PWUmJnZvaWQgMCE9PWV8fChlPXttaW46ITB9KSx0aGlzLnZhbGlkYXRpb249ZX0sdmFsaWRhdGU6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMuZXJyb3JzPVtdLHRoaXMudmFsaWRhdGVNZW1iZXIoZSx0fHx7fSxufHwicGFyYW1zIiksdGhpcy5lcnJvcnMubGVuZ3RoPjEpe3ZhciBvPXRoaXMuZXJyb3JzLmpvaW4oIlxuKiAiKTt0aHJvdyBvPSJUaGVyZSB3ZXJlICIrdGhpcy5lcnJvcnMubGVuZ3RoKyIgdmFsaWRhdGlvbiBlcnJvcnM6XG4qICIrbyxyLnV0aWwuZXJyb3IobmV3IEVycm9yKG8pLHtjb2RlOiJNdWx0aXBsZVZhbGlkYXRpb25FcnJvcnMiLGVycm9yczp0aGlzLmVycm9yc30pfWlmKDE9PT10aGlzLmVycm9ycy5sZW5ndGgpdGhyb3cgdGhpcy5lcnJvcnNbMF07cmV0dXJuITB9LGZhaWw6ZnVuY3Rpb24oZSx0KXt0aGlzLmVycm9ycy5wdXNoKHIudXRpbC5lcnJvcihuZXcgRXJyb3IodCkse2NvZGU6ZX0pKX0sdmFsaWRhdGVTdHJ1Y3R1cmU6ZnVuY3Rpb24oZSx0LG4pe2lmKGUuaXNEb2N1bWVudClyZXR1cm4hMDt2YXIgcjt0aGlzLnZhbGlkYXRlVHlwZSh0LG4sWyJvYmplY3QiXSwic3RydWN0dXJlIik7Zm9yKHZhciBvPTA7ZS5yZXF1aXJlZCYmbzxlLnJlcXVpcmVkLmxlbmd0aDtvKyspe3ZhciBpPXRbcj1lLnJlcXVpcmVkW29dXTtudWxsPT1pJiZ0aGlzLmZhaWwoIk1pc3NpbmdSZXF1aXJlZFBhcmFtZXRlciIsIk1pc3NpbmcgcmVxdWlyZWQga2V5ICciK3IrIicgaW4gIituKX1mb3IociBpbiB0KWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHIpKXt2YXIgYT10W3JdLHM9ZS5tZW1iZXJzW3JdO2lmKHZvaWQgMCE9PXMpe3ZhciBjPVtuLHJdLmpvaW4oIi4iKTt0aGlzLnZhbGlkYXRlTWVtYmVyKHMsYSxjKX1lbHNlIG51bGwhPWEmJnRoaXMuZmFpbCgiVW5leHBlY3RlZFBhcmFtZXRlciIsIlVuZXhwZWN0ZWQga2V5ICciK3IrIicgZm91bmQgaW4gIituKX1yZXR1cm4hMH0sdmFsaWRhdGVNZW1iZXI6ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaChlLnR5cGUpe2Nhc2Uic3RydWN0dXJlIjpyZXR1cm4gdGhpcy52YWxpZGF0ZVN0cnVjdHVyZShlLHQsbik7Y2FzZSJsaXN0IjpyZXR1cm4gdGhpcy52YWxpZGF0ZUxpc3QoZSx0LG4pO2Nhc2UibWFwIjpyZXR1cm4gdGhpcy52YWxpZGF0ZU1hcChlLHQsbik7ZGVmYXVsdDpyZXR1cm4gdGhpcy52YWxpZGF0ZVNjYWxhcihlLHQsbil9fSx2YWxpZGF0ZUxpc3Q6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMudmFsaWRhdGVUeXBlKHQsbixbQXJyYXldKSl7dGhpcy52YWxpZGF0ZVJhbmdlKGUsdC5sZW5ndGgsbiwibGlzdCBtZW1iZXIgY291bnQiKTtmb3IodmFyIHI9MDtyPHQubGVuZ3RoO3IrKyl0aGlzLnZhbGlkYXRlTWVtYmVyKGUubWVtYmVyLHRbcl0sbisiWyIrcisiXSIpfX0sdmFsaWRhdGVNYXA6ZnVuY3Rpb24oZSx0LG4pe2lmKHRoaXMudmFsaWRhdGVUeXBlKHQsbixbIm9iamVjdCJdLCJtYXAiKSl7dmFyIHI9MDtmb3IodmFyIG8gaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxvKSYmKHRoaXMudmFsaWRhdGVNZW1iZXIoZS5rZXksbyxuKyJba2V5PSciK28rIiddIiksdGhpcy52YWxpZGF0ZU1lbWJlcihlLnZhbHVlLHRbb10sbisiWyciK28rIiddIikscisrKTt0aGlzLnZhbGlkYXRlUmFuZ2UoZSxyLG4sIm1hcCBtZW1iZXIgY291bnQiKX19LHZhbGlkYXRlU2NhbGFyOmZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2goZS50eXBlKXtjYXNlIG51bGw6Y2FzZSB2b2lkIDA6Y2FzZSJzdHJpbmciOnJldHVybiB0aGlzLnZhbGlkYXRlU3RyaW5nKGUsdCxuKTtjYXNlImJhc2U2NCI6Y2FzZSJiaW5hcnkiOnJldHVybiB0aGlzLnZhbGlkYXRlUGF5bG9hZCh0LG4pO2Nhc2UiaW50ZWdlciI6Y2FzZSJmbG9hdCI6cmV0dXJuIHRoaXMudmFsaWRhdGVOdW1iZXIoZSx0LG4pO2Nhc2UiYm9vbGVhbiI6cmV0dXJuIHRoaXMudmFsaWRhdGVUeXBlKHQsbixbImJvb2xlYW4iXSk7Y2FzZSJ0aW1lc3RhbXAiOnJldHVybiB0aGlzLnZhbGlkYXRlVHlwZSh0LG4sW0RhdGUsL15cZHs0fS1cZHsyfS1cZHsyfVRcZHsyfTpcZHsyfTpcZHsyfShcLlxkKyk/WiQvLCJudW1iZXIiXSwiRGF0ZSBvYmplY3QsIElTTy04NjAxIHN0cmluZywgb3IgYSBVTklYIHRpbWVzdGFtcCIpO2RlZmF1bHQ6cmV0dXJuIHRoaXMuZmFpbCgiVW5rb3duVHlwZSIsIlVuaGFuZGxlZCB0eXBlICIrZS50eXBlKyIgZm9yICIrbil9fSx2YWxpZGF0ZVN0cmluZzpmdW5jdGlvbihlLHQsbil7dmFyIHI9WyJzdHJpbmciXTtlLmlzSnNvblZhbHVlJiYocj1yLmNvbmNhdChbIm51bWJlciIsIm9iamVjdCIsImJvb2xlYW4iXSkpLG51bGwhPT10JiZ0aGlzLnZhbGlkYXRlVHlwZSh0LG4scikmJih0aGlzLnZhbGlkYXRlRW51bShlLHQsbiksdGhpcy52YWxpZGF0ZVJhbmdlKGUsdC5sZW5ndGgsbiwic3RyaW5nIGxlbmd0aCIpLHRoaXMudmFsaWRhdGVQYXR0ZXJuKGUsdCxuKSx0aGlzLnZhbGlkYXRlVXJpKGUsdCxuKSl9LHZhbGlkYXRlVXJpOmZ1bmN0aW9uKGUsdCxuKXsidXJpIj09PWUubG9jYXRpb24mJjA9PT10Lmxlbmd0aCYmdGhpcy5mYWlsKCJVcmlQYXJhbWV0ZXJFcnJvciIsJ0V4cGVjdGVkIHVyaSBwYXJhbWV0ZXIgdG8gaGF2ZSBsZW5ndGggPj0gMSwgYnV0IGZvdW5kICInK3QrJyIgZm9yICcrbil9LHZhbGlkYXRlUGF0dGVybjpmdW5jdGlvbihlLHQsbil7dGhpcy52YWxpZGF0aW9uLnBhdHRlcm4mJnZvaWQgMCE9PWUucGF0dGVybiYmKG5ldyBSZWdFeHAoZS5wYXR0ZXJuKS50ZXN0KHQpfHx0aGlzLmZhaWwoIlBhdHRlcm5NYXRjaEVycm9yIiwnUHJvdmlkZWQgdmFsdWUgIicrdCsnIiBkb2VzIG5vdCBtYXRjaCByZWdleCBwYXR0ZXJuIC8nK2UucGF0dGVybisiLyBmb3IgIituKSl9LHZhbGlkYXRlUmFuZ2U6ZnVuY3Rpb24oZSx0LG4scil7dGhpcy52YWxpZGF0aW9uLm1pbiYmdm9pZCAwIT09ZS5taW4mJnQ8ZS5taW4mJnRoaXMuZmFpbCgiTWluUmFuZ2VFcnJvciIsIkV4cGVjdGVkICIrcisiID49ICIrZS5taW4rIiwgYnV0IGZvdW5kICIrdCsiIGZvciAiK24pLHRoaXMudmFsaWRhdGlvbi5tYXgmJnZvaWQgMCE9PWUubWF4JiZ0PmUubWF4JiZ0aGlzLmZhaWwoIk1heFJhbmdlRXJyb3IiLCJFeHBlY3RlZCAiK3IrIiA8PSAiK2UubWF4KyIsIGJ1dCBmb3VuZCAiK3QrIiBmb3IgIituKX0sdmFsaWRhdGVFbnVtOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLnZhbGlkYXRpb24uZW51bSYmdm9pZCAwIT09ZS5lbnVtJiYtMT09PWUuZW51bS5pbmRleE9mKHQpJiZ0aGlzLmZhaWwoIkVudW1FcnJvciIsIkZvdW5kIHN0cmluZyB2YWx1ZSBvZiAiK3QrIiwgYnV0IGV4cGVjdGVkICIrZS5lbnVtLmpvaW4oInwiKSsiIGZvciAiK24pfSx2YWxpZGF0ZVR5cGU6ZnVuY3Rpb24oZSx0LG4saSl7aWYobnVsbD09ZSlyZXR1cm4hMTtmb3IodmFyIGE9ITEscz0wO3M8bi5sZW5ndGg7cysrKXtpZigic3RyaW5nIj09dHlwZW9mIG5bc10pe2lmKG8oZSk9PT1uW3NdKXJldHVybiEwfWVsc2UgaWYobltzXWluc3RhbmNlb2YgUmVnRXhwKXtpZigoZXx8IiIpLnRvU3RyaW5nKCkubWF0Y2gobltzXSkpcmV0dXJuITB9ZWxzZXtpZihlIGluc3RhbmNlb2YgbltzXSlyZXR1cm4hMDtpZihyLnV0aWwuaXNUeXBlKGUsbltzXSkpcmV0dXJuITA7aXx8YXx8KG49bi5zbGljZSgpKSxuW3NdPXIudXRpbC50eXBlTmFtZShuW3NdKX1hPSEwfXZhciBjPWk7Y3x8KGM9bi5qb2luKCIsICIpLnJlcGxhY2UoLywoW14sXSspJC8sIiwgb3IkMSIpKTt2YXIgdT1jLm1hdGNoKC9eW2FlaW91XS9pKT8ibiI6IiI7cmV0dXJuIHRoaXMuZmFpbCgiSW52YWxpZFBhcmFtZXRlclR5cGUiLCJFeHBlY3RlZCAiK3QrIiB0byBiZSBhIit1KyIgIitjKSwhMX0sdmFsaWRhdGVOdW1iZXI6ZnVuY3Rpb24oZSx0LG4pe2lmKG51bGwhPXQpe2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIHI9cGFyc2VGbG9hdCh0KTtyLnRvU3RyaW5nKCk9PT10JiYodD1yKX10aGlzLnZhbGlkYXRlVHlwZSh0LG4sWyJudW1iZXIiXSkmJnRoaXMudmFsaWRhdGVSYW5nZShlLHQsbiwibnVtZXJpYyB2YWx1ZSIpfX0sdmFsaWRhdGVQYXlsb2FkOmZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9ZSYmInN0cmluZyIhPXR5cGVvZiBlJiYoIWV8fCJudW1iZXIiIT10eXBlb2YgZS5ieXRlTGVuZ3RoKSl7aWYoci51dGlsLmlzTm9kZSgpKXt2YXIgbj1yLnV0aWwuc3RyZWFtLlN0cmVhbTtpZihyLnV0aWwuQnVmZmVyLmlzQnVmZmVyKGUpfHxlIGluc3RhbmNlb2YgbilyZXR1cm59ZWxzZSBpZih2b2lkIDAhPT0oInVuZGVmaW5lZCI9PXR5cGVvZiBCbG9iPyJ1bmRlZmluZWQiOm8oQmxvYikpJiZlIGluc3RhbmNlb2YgQmxvYilyZXR1cm47dmFyIGk9WyJCdWZmZXIiLCJTdHJlYW0iLCJGaWxlIiwiQmxvYiIsIkFycmF5QnVmZmVyIiwiRGF0YVZpZXciXTtpZihlKWZvcih2YXIgYT0wO2E8aS5sZW5ndGg7YSsrKXtpZihyLnV0aWwuaXNUeXBlKGUsaVthXSkpcmV0dXJuO2lmKHIudXRpbC50eXBlTmFtZShlLmNvbnN0cnVjdG9yKT09PWlbYV0pcmV0dXJufXRoaXMuZmFpbCgiSW52YWxpZFBhcmFtZXRlclR5cGUiLCJFeHBlY3RlZCAiK3QrIiB0byBiZSBhIHN0cmluZywgQnVmZmVyLCBTdHJlYW0sIEJsb2IsIG9yIHR5cGVkIGFycmF5IG9iamVjdCIpfX19KX0seyIuL2NvcmUiOjE5fV0sNDc6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuLi9jb3JlIik7dC5leHBvcnRzPXtwb3B1bGF0ZUhvc3RQcmVmaXg6ZnVuY3Rpb24oZSl7aWYoIWUuc2VydmljZS5jb25maWcuaG9zdFByZWZpeEVuYWJsZWQpcmV0dXJuIGU7dmFyIHQsbixpLGEscyxjPWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl07aWYoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaSxuPXQub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbz10LmVuZHBvaW50T3BlcmF0aW9uJiZ0LmVuZHBvaW50T3BlcmF0aW9uPT09ci5zdHJpbmcubG93ZXJGaXJzdChuLm5hbWUpO3JldHVybiJOVUxMIiE9PW4uZW5kcG9pbnREaXNjb3ZlcnlSZXF1aXJlZHx8ITA9PT1vfShlKSlyZXR1cm4gZTtpZihjLmVuZHBvaW50JiZjLmVuZHBvaW50Lmhvc3RQcmVmaXgpe3ZhciB1PWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gci5lYWNoKG4ubWVtYmVycywoZnVuY3Rpb24obixvKXtpZighMD09PW8uaG9zdExhYmVsKXtpZigic3RyaW5nIiE9dHlwZW9mIHRbbl18fCIiPT09dFtuXSl0aHJvdyByLmVycm9yKG5ldyBFcnJvcix7bWVzc2FnZToiUGFyYW1ldGVyICIrbisiIHNob3VsZCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuIixjb2RlOiJJbnZhbGlkUGFyYW1ldGVyIn0pO3ZhciBpPW5ldyBSZWdFeHAoIlxceyIrbisiXFx9IiwiZyIpO2U9ZS5yZXBsYWNlKGksdFtuXSl9fSkpLGV9KGMuZW5kcG9pbnQuaG9zdFByZWZpeCxlLnBhcmFtcyxjLmlucHV0KTthPWUuaHR0cFJlcXVlc3QuZW5kcG9pbnQscz11LGEuaG9zdCYmKGEuaG9zdD1zK2EuaG9zdCksYS5ob3N0bmFtZSYmKGEuaG9zdG5hbWU9cythLmhvc3RuYW1lKSx0PWUuaHR0cFJlcXVlc3QuZW5kcG9pbnQuaG9zdG5hbWUsbj10LnNwbGl0KCIuIiksaT0vXlthLXpBLVowLTldezF9JHxeW2EtekEtWjAtOV1bYS16QS1aMC05XC1dKlthLXpBLVowLTldJC8sci5hcnJheUVhY2gobiwoZnVuY3Rpb24oZSl7aWYoIWUubGVuZ3RofHxlLmxlbmd0aDwxfHxlLmxlbmd0aD42Myl0aHJvdyByLmVycm9yKG5ldyBFcnJvcix7Y29kZToiVmFsaWRhdGlvbkVycm9yIixtZXNzYWdlOiJIb3N0bmFtZSBsYWJlbCBsZW5ndGggc2hvdWxkIGJlIGJldHdlZW4gMSB0byA2MyBjaGFyYWN0ZXJzLCBpbmNsdXNpdmUuIn0pO2lmKCFpLnRlc3QoZSkpdGhyb3cgby51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiVmFsaWRhdGlvbkVycm9yIixtZXNzYWdlOmUrIiBpcyBub3QgaG9zdG5hbWUgY29tcGF0aWJsZS4ifSl9KSl9cmV0dXJuIGV9fX0seyIuLi9jb3JlIjoxOSwiLi4vdXRpbCI6NzR9XSw0ODpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPWUoIi4uL2pzb24vYnVpbGRlciIpLGk9ZSgiLi4vanNvbi9wYXJzZXIiKSxhPWUoIi4vaGVscGVycyIpLnBvcHVsYXRlSG9zdFByZWZpeDt0LmV4cG9ydHM9e2J1aWxkUmVxdWVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLmh0dHBSZXF1ZXN0LG49ZS5zZXJ2aWNlLmFwaSxyPW4udGFyZ2V0UHJlZml4KyIuIituLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLm5hbWUsaT1uLmpzb25WZXJzaW9ufHwiMS4wIixzPW4ub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0uaW5wdXQsYz1uZXcgbzsxPT09aSYmKGk9IjEuMCIpLG4uYXdzUXVlcnlDb21wYXRpYmxlJiYodC5wYXJhbXN8fCh0LnBhcmFtcz17fSksT2JqZWN0LmFzc2lnbih0LnBhcmFtcyxlLnBhcmFtcykpLHQuYm9keT1jLmJ1aWxkKGUucGFyYW1zfHx7fSxzKSx0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi94LWFtei1qc29uLSIraSx0LmhlYWRlcnNbIlgtQW16LVRhcmdldCJdPXIsYShlKX0sZXh0cmFjdEVycm9yOmZ1bmN0aW9uKGUpe3ZhciB0PXt9LG49ZS5odHRwUmVzcG9uc2U7aWYodC5jb2RlPW4uaGVhZGVyc1sieC1hbXpuLWVycm9ydHlwZSJdfHwiVW5rbm93bkVycm9yIiwic3RyaW5nIj09dHlwZW9mIHQuY29kZSYmKHQuY29kZT10LmNvZGUuc3BsaXQoIjoiKVswXSksbi5ib2R5Lmxlbmd0aD4wKXRyeXt2YXIgbz1KU09OLnBhcnNlKG4uYm9keS50b1N0cmluZygpKSxpPW8uX190eXBlfHxvLmNvZGV8fG8uQ29kZTtmb3IodmFyIGEgaW4gaSYmKHQuY29kZT1pLnNwbGl0KCIjIikucG9wKCkpLCJSZXF1ZXN0RW50aXR5VG9vTGFyZ2UiPT09dC5jb2RlP3QubWVzc2FnZT0iUmVxdWVzdCBib2R5IG11c3QgYmUgbGVzcyB0aGFuIDEgTUIiOnQubWVzc2FnZT1vLm1lc3NhZ2V8fG8uTWVzc2FnZXx8bnVsbCxvfHx7fSkiY29kZSIhPT1hJiYibWVzc2FnZSIhPT1hJiYodFsiWyIrYSsiXSJdPSJTZWUgZXJyb3IuIithKyIgZm9yIGRldGFpbHMuIixPYmplY3QuZGVmaW5lUHJvcGVydHkodCxhLHt2YWx1ZTpvW2FdLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITB9KSl9Y2F0Y2gobyl7dC5zdGF0dXNDb2RlPW4uc3RhdHVzQ29kZSx0Lm1lc3NhZ2U9bi5zdGF0dXNNZXNzYWdlfWVsc2UgdC5zdGF0dXNDb2RlPW4uc3RhdHVzQ29kZSx0Lm1lc3NhZ2U9bi5zdGF0dXNDb2RlLnRvU3RyaW5nKCk7ZS5lcnJvcj1yLmVycm9yKG5ldyBFcnJvcix0KX0sZXh0cmFjdERhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5odHRwUmVzcG9uc2UuYm9keS50b1N0cmluZygpfHwie30iO2lmKCExPT09ZS5yZXF1ZXN0LnNlcnZpY2UuY29uZmlnLmNvbnZlcnRSZXNwb25zZVR5cGVzKWUuZGF0YT1KU09OLnBhcnNlKHQpO2Vsc2V7dmFyIG49ZS5yZXF1ZXN0LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5yZXF1ZXN0Lm9wZXJhdGlvbl0ub3V0cHV0fHx7fSxyPW5ldyBpO2UuZGF0YT1yLnBhcnNlKHQsbil9fX19LHsiLi4vanNvbi9idWlsZGVyIjozNywiLi4vanNvbi9wYXJzZXIiOjM4LCIuLi91dGlsIjo3NCwiLi9oZWxwZXJzIjo0N31dLDQ5OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ZSgiLi4vdXRpbCIpLGk9ZSgiLi4vcXVlcnkvcXVlcnlfcGFyYW1fc2VyaWFsaXplciIpLGE9ZSgiLi4vbW9kZWwvc2hhcGUiKSxzPWUoIi4vaGVscGVycyIpLnBvcHVsYXRlSG9zdFByZWZpeDt0LmV4cG9ydHM9e2J1aWxkUmVxdWVzdDpmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLG49ZS5odHRwUmVxdWVzdDtuLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdPSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9dXRmLTgiLG4ucGFyYW1zPXtWZXJzaW9uOmUuc2VydmljZS5hcGkuYXBpVmVyc2lvbixBY3Rpb246dC5uYW1lfSwobmV3IGkpLnNlcmlhbGl6ZShlLnBhcmFtcyx0LmlucHV0LChmdW5jdGlvbihlLHQpe24ucGFyYW1zW2VdPXR9KSksbi5ib2R5PW8ucXVlcnlQYXJhbXNUb1N0cmluZyhuLnBhcmFtcykscyhlKX0sZXh0cmFjdEVycm9yOmZ1bmN0aW9uKGUpe3ZhciB0LG49ZS5odHRwUmVzcG9uc2UuYm9keS50b1N0cmluZygpO2lmKG4ubWF0Y2goIjxVbmtub3duT3BlcmF0aW9uRXhjZXB0aW9uIikpdD17Q29kZToiVW5rbm93bk9wZXJhdGlvbiIsTWVzc2FnZToiVW5rbm93biBvcGVyYXRpb24gIitlLnJlcXVlc3Qub3BlcmF0aW9ufTtlbHNlIHRyeXt0PShuZXcgci5YTUwuUGFyc2VyKS5wYXJzZShuKX1jYXRjaChuKXt0PXtDb2RlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUsTWVzc2FnZTplLmh0dHBSZXNwb25zZS5zdGF0dXNNZXNzYWdlfX10LnJlcXVlc3RJZCYmIWUucmVxdWVzdElkJiYoZS5yZXF1ZXN0SWQ9dC5yZXF1ZXN0SWQpLHQuRXJyb3JzJiYodD10LkVycm9ycyksdC5FcnJvciYmKHQ9dC5FcnJvciksdC5Db2RlP2UuZXJyb3I9by5lcnJvcihuZXcgRXJyb3Ise2NvZGU6dC5Db2RlLG1lc3NhZ2U6dC5NZXNzYWdlfSk6ZS5lcnJvcj1vLmVycm9yKG5ldyBFcnJvcix7Y29kZTplLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlLG1lc3NhZ2U6bnVsbH0pfSxleHRyYWN0RGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcXVlc3Qsbj10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbdC5vcGVyYXRpb25dLm91dHB1dHx8e30saT1uO2lmKGkucmVzdWx0V3JhcHBlcil7dmFyIHM9YS5jcmVhdGUoe3R5cGU6InN0cnVjdHVyZSJ9KTtzLm1lbWJlcnNbaS5yZXN1bHRXcmFwcGVyXT1uLHMubWVtYmVyTmFtZXM9W2kucmVzdWx0V3JhcHBlcl0sby5wcm9wZXJ0eShuLCJuYW1lIixuLnJlc3VsdFdyYXBwZXIpLG49c312YXIgYz1uZXcgci5YTUwuUGFyc2VyO2lmKG4mJm4ubWVtYmVycyYmIW4ubWVtYmVycy5fWEFNWlJlcXVlc3RJZCl7dmFyIHU9YS5jcmVhdGUoe3R5cGU6InN0cmluZyJ9LHthcGk6e3Byb3RvY29sOiJxdWVyeSJ9fSwicmVxdWVzdElkIik7bi5tZW1iZXJzLl9YQU1aUmVxdWVzdElkPXV9dmFyIGw9Yy5wYXJzZShlLmh0dHBSZXNwb25zZS5ib2R5LnRvU3RyaW5nKCksbik7ZS5yZXF1ZXN0SWQ9bC5fWEFNWlJlcXVlc3RJZHx8bC5yZXF1ZXN0SWQsbC5fWEFNWlJlcXVlc3RJZCYmZGVsZXRlIGwuX1hBTVpSZXF1ZXN0SWQsaS5yZXN1bHRXcmFwcGVyJiZsW2kucmVzdWx0V3JhcHBlcl0mJihvLnVwZGF0ZShsLGxbaS5yZXN1bHRXcmFwcGVyXSksZGVsZXRlIGxbaS5yZXN1bHRXcmFwcGVyXSksZS5kYXRhPWx9fX0seyIuLi9jb3JlIjoxOSwiLi4vbW9kZWwvc2hhcGUiOjQ1LCIuLi9xdWVyeS9xdWVyeV9wYXJhbV9zZXJpYWxpemVyIjo1MywiLi4vdXRpbCI6NzQsIi4vaGVscGVycyI6NDd9XSw1MDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL3V0aWwiKSxvPWUoIi4vaGVscGVycyIpLnBvcHVsYXRlSG9zdFByZWZpeDtmdW5jdGlvbiBpKGUsdCxuLG8pe3ZhciBpPVtlLHRdLmpvaW4oIi8iKTtpPWkucmVwbGFjZSgvXC8rL2csIi8iKTt2YXIgYT17fSxzPSExO2lmKHIuZWFjaChuLm1lbWJlcnMsKGZ1bmN0aW9uKGUsdCl7dmFyIG49b1tlXTtpZihudWxsIT1uKWlmKCJ1cmkiPT09dC5sb2NhdGlvbil7dmFyIGM9bmV3IFJlZ0V4cCgiXFx7Iit0Lm5hbWUrIihcXCspP1xcfSIpO2k9aS5yZXBsYWNlKGMsKGZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQ/ci51cmlFc2NhcGVQYXRoOnIudXJpRXNjYXBlKShTdHJpbmcobikpfSkpfWVsc2UicXVlcnlzdHJpbmciPT09dC5sb2NhdGlvbiYmKHM9ITAsImxpc3QiPT09dC50eXBlP2FbdC5uYW1lXT1uLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHIudXJpRXNjYXBlKHQubWVtYmVyLnRvV2lyZUZvcm1hdChlKS50b1N0cmluZygpKX0pKToibWFwIj09PXQudHlwZT9yLmVhY2gobiwoZnVuY3Rpb24oZSx0KXtBcnJheS5pc0FycmF5KHQpP2FbZV09dC5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiByLnVyaUVzY2FwZShTdHJpbmcoZSkpfSkpOmFbZV09ci51cmlFc2NhcGUoU3RyaW5nKHQpKX0pKTphW3QubmFtZV09ci51cmlFc2NhcGUodC50b1dpcmVGb3JtYXQobikudG9TdHJpbmcoKSkpfSkpLHMpe2krPWkuaW5kZXhPZigiPyIpPj0wPyImIjoiPyI7dmFyIGM9W107ci5hcnJheUVhY2goT2JqZWN0LmtleXMoYSkuc29ydCgpLChmdW5jdGlvbihlKXtBcnJheS5pc0FycmF5KGFbZV0pfHwoYVtlXT1bYVtlXV0pO2Zvcih2YXIgdD0wO3Q8YVtlXS5sZW5ndGg7dCsrKWMucHVzaChyLnVyaUVzY2FwZShTdHJpbmcoZSkpKyI9IithW2VdW3RdKX0pKSxpKz1jLmpvaW4oIiYiKX1yZXR1cm4gaX10LmV4cG9ydHM9e2J1aWxkUmVxdWVzdDpmdW5jdGlvbihlKXshZnVuY3Rpb24oZSl7ZS5odHRwUmVxdWVzdC5tZXRob2Q9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXS5odHRwTWV0aG9kfShlKSxmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLG49dC5pbnB1dCxyPWkoZS5odHRwUmVxdWVzdC5lbmRwb2ludC5wYXRoLHQuaHR0cFBhdGgsbixlLnBhcmFtcyk7ZS5odHRwUmVxdWVzdC5wYXRoPXJ9KGUpLGZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl07ci5lYWNoKHQuaW5wdXQubWVtYmVycywoZnVuY3Rpb24odCxuKXt2YXIgbz1lLnBhcmFtc1t0XTtudWxsIT1vJiYoImhlYWRlcnMiPT09bi5sb2NhdGlvbiYmIm1hcCI9PT1uLnR5cGU/ci5lYWNoKG8sKGZ1bmN0aW9uKHQscil7ZS5odHRwUmVxdWVzdC5oZWFkZXJzW24ubmFtZSt0XT1yfSkpOiJoZWFkZXIiPT09bi5sb2NhdGlvbiYmKG89bi50b1dpcmVGb3JtYXQobykudG9TdHJpbmcoKSxuLmlzSnNvblZhbHVlJiYobz1yLmJhc2U2NC5lbmNvZGUobykpLGUuaHR0cFJlcXVlc3QuaGVhZGVyc1tuLm5hbWVdPW8pKX0pKX0oZSksbyhlKX0sZXh0cmFjdEVycm9yOmZ1bmN0aW9uKCl7fSxleHRyYWN0RGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcXVlc3Qsbj17fSxvPWUuaHR0cFJlc3BvbnNlLGk9dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW3Qub3BlcmF0aW9uXS5vdXRwdXQsYT17fTtyLmVhY2goby5oZWFkZXJzLChmdW5jdGlvbihlLHQpe2FbZS50b0xvd2VyQ2FzZSgpXT10fSkpLHIuZWFjaChpLm1lbWJlcnMsKGZ1bmN0aW9uKGUsdCl7dmFyIGk9KHQubmFtZXx8ZSkudG9Mb3dlckNhc2UoKTtpZigiaGVhZGVycyI9PT10LmxvY2F0aW9uJiYibWFwIj09PXQudHlwZSl7bltlXT17fTt2YXIgcz10LmlzTG9jYXRpb25OYW1lP3QubmFtZToiIixjPW5ldyBSZWdFeHAoIl4iK3MrIiguKykiLCJpIik7ci5lYWNoKG8uaGVhZGVycywoZnVuY3Rpb24odCxyKXt2YXIgbz10Lm1hdGNoKGMpO251bGwhPT1vJiYobltlXVtvWzFdXT1yKX0pKX1lbHNlIGlmKCJoZWFkZXIiPT09dC5sb2NhdGlvbil7aWYodm9pZCAwIT09YVtpXSl7dmFyIHU9dC5pc0pzb25WYWx1ZT9yLmJhc2U2NC5kZWNvZGUoYVtpXSk6YVtpXTtuW2VdPXQudG9UeXBlKHUpfX1lbHNlInN0YXR1c0NvZGUiPT09dC5sb2NhdGlvbiYmKG5bZV09cGFyc2VJbnQoby5zdGF0dXNDb2RlLDEwKSl9KSksZS5kYXRhPW59LGdlbmVyYXRlVVJJOml9fSx7Ii4uL3V0aWwiOjc0LCIuL2hlbHBlcnMiOjQ3fV0sNTE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuL3Jlc3QiKSxpPWUoIi4vanNvbiIpLGE9ZSgiLi4vanNvbi9idWlsZGVyIikscz1lKCIuLi9qc29uL3BhcnNlciIpLGM9WyJHRVQiLCJIRUFEIiwiREVMRVRFIl07ZnVuY3Rpb24gdShlLHQpe2lmKCFlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdKXt2YXIgbj10PyJiaW5hcnkvb2N0ZXQtc3RyZWFtIjoiYXBwbGljYXRpb24vanNvbiI7ZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LVR5cGUiXT1ufX10LmV4cG9ydHM9e2J1aWxkUmVxdWVzdDpmdW5jdGlvbihlKXtvLmJ1aWxkUmVxdWVzdChlKSxjLmluZGV4T2YoZS5odHRwUmVxdWVzdC5tZXRob2QpPDAmJmZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBhLG49ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW2Uub3BlcmF0aW9uXS5pbnB1dDtpZihuLnBheWxvYWQpe3ZhciByLG89bi5tZW1iZXJzW24ucGF5bG9hZF07cj1lLnBhcmFtc1tuLnBheWxvYWRdLCJzdHJ1Y3R1cmUiPT09by50eXBlPyhlLmh0dHBSZXF1ZXN0LmJvZHk9dC5idWlsZChyfHx7fSxvKSx1KGUpKTp2b2lkIDAhPT1yJiYoZS5odHRwUmVxdWVzdC5ib2R5PXIsKCJiaW5hcnkiPT09by50eXBlfHxvLmlzU3RyZWFtaW5nKSYmdShlLCEwKSl9ZWxzZSBlLmh0dHBSZXF1ZXN0LmJvZHk9dC5idWlsZChlLnBhcmFtcyxuKSx1KGUpfShlKX0sZXh0cmFjdEVycm9yOmZ1bmN0aW9uKGUpe2kuZXh0cmFjdEVycm9yKGUpfSxleHRyYWN0RGF0YTpmdW5jdGlvbihlKXtvLmV4dHJhY3REYXRhKGUpO3ZhciB0PWUucmVxdWVzdCxuPXQuc2VydmljZS5hcGkub3BlcmF0aW9uc1t0Lm9wZXJhdGlvbl0sYT10LnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbdC5vcGVyYXRpb25dLm91dHB1dHx8e307aWYobi5oYXNFdmVudE91dHB1dCxhLnBheWxvYWQpe3ZhciBjPWEubWVtYmVyc1thLnBheWxvYWRdLHU9ZS5odHRwUmVzcG9uc2UuYm9keTtpZihjLmlzRXZlbnRTdHJlYW0pbD1uZXcgcyxlLmRhdGFbcGF5bG9hZF09ci5jcmVhdGVFdmVudFN0cmVhbSgyPT09QVdTLkh0dHBDbGllbnQuc3RyZWFtc0FwaVZlcnNpb24/ZS5odHRwUmVzcG9uc2Uuc3RyZWFtOnUsbCxjKTtlbHNlIGlmKCJzdHJ1Y3R1cmUiPT09Yy50eXBlfHwibGlzdCI9PT1jLnR5cGUpe3ZhciBsPW5ldyBzO2UuZGF0YVthLnBheWxvYWRdPWwucGFyc2UodSxjKX1lbHNlImJpbmFyeSI9PT1jLnR5cGV8fGMuaXNTdHJlYW1pbmc/ZS5kYXRhW2EucGF5bG9hZF09dTplLmRhdGFbYS5wYXlsb2FkXT1jLnRvVHlwZSh1KX1lbHNle3ZhciBwPWUuZGF0YTtpLmV4dHJhY3REYXRhKGUpLGUuZGF0YT1yLm1lcmdlKHAsZS5kYXRhKX19LHVuc2V0Q29udGVudExlbmd0aDpmdW5jdGlvbihlKXt2b2lkIDA9PT1yLmdldFJlcXVlc3RQYXlsb2FkU2hhcGUoZSkmJmMuaW5kZXhPZihlLmh0dHBSZXF1ZXN0Lm1ldGhvZCk+PTAmJmRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtTGVuZ3RoIl19fX0seyIuLi9qc29uL2J1aWxkZXIiOjM3LCIuLi9qc29uL3BhcnNlciI6MzgsIi4uL3V0aWwiOjc0LCIuL2pzb24iOjQ4LCIuL3Jlc3QiOjUwfV0sNTI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuLi91dGlsIiksaT1lKCIuL3Jlc3QiKTt0LmV4cG9ydHM9e2J1aWxkUmVxdWVzdDpmdW5jdGlvbihlKXtpLmJ1aWxkUmVxdWVzdChlKSxbIkdFVCIsIkhFQUQiXS5pbmRleE9mKGUuaHR0cFJlcXVlc3QubWV0aG9kKTwwJiZmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLmlucHV0LG49bmV3IHIuWE1MLkJ1aWxkZXIsaT1lLnBhcmFtcyxhPXQucGF5bG9hZDtpZihhKXt2YXIgcz10Lm1lbWJlcnNbYV07aWYodm9pZCAwPT09KGk9aVthXSkpcmV0dXJuO2lmKCJzdHJ1Y3R1cmUiPT09cy50eXBlKXt2YXIgYz1zLm5hbWU7ZS5odHRwUmVxdWVzdC5ib2R5PW4udG9YTUwoaSxzLGMsITApfWVsc2UgZS5odHRwUmVxdWVzdC5ib2R5PWl9ZWxzZSBlLmh0dHBSZXF1ZXN0LmJvZHk9bi50b1hNTChpLHQsdC5uYW1lfHx0LnNoYXBlfHxvLnN0cmluZy51cHBlckZpcnN0KGUub3BlcmF0aW9uKSsiUmVxdWVzdCIpfShlKX0sZXh0cmFjdEVycm9yOmZ1bmN0aW9uKGUpe3ZhciB0O2kuZXh0cmFjdEVycm9yKGUpO3RyeXt0PShuZXcgci5YTUwuUGFyc2VyKS5wYXJzZShlLmh0dHBSZXNwb25zZS5ib2R5LnRvU3RyaW5nKCkpfWNhdGNoKG4pe3Q9e0NvZGU6ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSxNZXNzYWdlOmUuaHR0cFJlc3BvbnNlLnN0YXR1c01lc3NhZ2V9fXQuRXJyb3JzJiYodD10LkVycm9ycyksdC5FcnJvciYmKHQ9dC5FcnJvciksdC5Db2RlP2UuZXJyb3I9by5lcnJvcihuZXcgRXJyb3Ise2NvZGU6dC5Db2RlLG1lc3NhZ2U6dC5NZXNzYWdlfSk6ZS5lcnJvcj1vLmVycm9yKG5ldyBFcnJvcix7Y29kZTplLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlLG1lc3NhZ2U6bnVsbH0pfSxleHRyYWN0RGF0YTpmdW5jdGlvbihlKXt2YXIgdDtpLmV4dHJhY3REYXRhKGUpO3ZhciBuPWUucmVxdWVzdCxhPWUuaHR0cFJlc3BvbnNlLmJvZHkscz1uLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbbi5vcGVyYXRpb25dLGM9cy5vdXRwdXQsdT0ocy5oYXNFdmVudE91dHB1dCxjLnBheWxvYWQpO2lmKHUpe3ZhciBsPWMubWVtYmVyc1t1XTtsLmlzRXZlbnRTdHJlYW0/KHQ9bmV3IHIuWE1MLlBhcnNlcixlLmRhdGFbdV09by5jcmVhdGVFdmVudFN0cmVhbSgyPT09ci5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uP2UuaHR0cFJlc3BvbnNlLnN0cmVhbTplLmh0dHBSZXNwb25zZS5ib2R5LHQsbCkpOiJzdHJ1Y3R1cmUiPT09bC50eXBlPyh0PW5ldyByLlhNTC5QYXJzZXIsZS5kYXRhW3VdPXQucGFyc2UoYS50b1N0cmluZygpLGwpKToiYmluYXJ5Ij09PWwudHlwZXx8bC5pc1N0cmVhbWluZz9lLmRhdGFbdV09YTplLmRhdGFbdV09bC50b1R5cGUoYSl9ZWxzZSBpZihhLmxlbmd0aD4wKXt2YXIgcD0odD1uZXcgci5YTUwuUGFyc2VyKS5wYXJzZShhLnRvU3RyaW5nKCksYyk7by51cGRhdGUoZS5kYXRhLHApfX19fSx7Ii4uL2NvcmUiOjE5LCIuLi91dGlsIjo3NCwiLi9yZXN0Ijo1MH1dLDUzOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpO2Z1bmN0aW9uIG8oKXt9ZnVuY3Rpb24gaShlKXtyZXR1cm4gZS5pc1F1ZXJ5TmFtZXx8ImVjMiIhPT1lLmFwaS5wcm90b2NvbD9lLm5hbWU6ZS5uYW1lWzBdLnRvVXBwZXJDYXNlKCkrZS5uYW1lLnN1YnN0cigxKX1mdW5jdGlvbiBhKGUsdCxuLG8pe3IuZWFjaChuLm1lbWJlcnMsKGZ1bmN0aW9uKG4scil7dmFyIGE9dFtuXTtpZihudWxsIT1hKXt2YXIgYz1pKHIpO3MoYz1lP2UrIi4iK2M6YyxhLHIsbyl9fSkpfWZ1bmN0aW9uIHMoZSx0LG4sbyl7bnVsbCE9dCYmKCJzdHJ1Y3R1cmUiPT09bi50eXBlP2EoZSx0LG4sbyk6Imxpc3QiPT09bi50eXBlP2Z1bmN0aW9uKGUsdCxuLG8pe3ZhciBhPW4ubWVtYmVyfHx7fTswIT09dC5sZW5ndGg/ci5hcnJheUVhY2godCwoZnVuY3Rpb24odCxyKXt2YXIgYz0iLiIrKHIrMSk7aWYoImVjMiI9PT1uLmFwaS5wcm90b2NvbCljKz0iIjtlbHNlIGlmKG4uZmxhdHRlbmVkKXtpZihhLm5hbWUpe3ZhciB1PWUuc3BsaXQoIi4iKTt1LnBvcCgpLHUucHVzaChpKGEpKSxlPXUuam9pbigiLiIpfX1lbHNlIGM9Ii4iKyhhLm5hbWU/YS5uYW1lOiJtZW1iZXIiKStjO3MoZStjLHQsYSxvKX0pKTpvLmNhbGwodGhpcyxlLG51bGwpfShlLHQsbixvKToibWFwIj09PW4udHlwZT9mdW5jdGlvbihlLHQsbixvKXt2YXIgaT0xO3IuZWFjaCh0LChmdW5jdGlvbih0LHIpe3ZhciBhPShuLmZsYXR0ZW5lZD8iLiI6Ii5lbnRyeS4iKStpKysrIi4iLGM9YSsobi5rZXkubmFtZXx8ImtleSIpLHU9YSsobi52YWx1ZS5uYW1lfHwidmFsdWUiKTtzKGUrYyx0LG4ua2V5LG8pLHMoZSt1LHIsbi52YWx1ZSxvKX0pKX0oZSx0LG4sbyk6byhlLG4udG9XaXJlRm9ybWF0KHQpLnRvU3RyaW5nKCkpKX1vLnByb3RvdHlwZS5zZXJpYWxpemU9ZnVuY3Rpb24oZSx0LG4pe2EoIiIsZSx0LG4pfSx0LmV4cG9ydHM9b30seyIuLi91dGlsIjo3NH1dLDU0OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtub3c6ZnVuY3Rpb24oKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHBlcmZvcm1hbmNlJiYiZnVuY3Rpb24iPT10eXBlb2YgcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlLm5vdygpOkRhdGUubm93KCl9fX0se31dLDU1OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtpc0ZpcHNSZWdpb246ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYoZS5zdGFydHNXaXRoKCJmaXBzLSIpfHxlLmVuZHNXaXRoKCItZmlwcyIpKX0saXNHbG9iYWxSZWdpb246ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiZbImF3cy1nbG9iYWwiLCJhd3MtdXMtZ292LWdsb2JhbCJdLmluY2x1ZGVzKGUpfSxnZXRSZWFsUmVnaW9uOmZ1bmN0aW9uKGUpe3JldHVyblsiZmlwcy1hd3MtZ2xvYmFsIiwiYXdzLWZpcHMiLCJhd3MtZ2xvYmFsIl0uaW5jbHVkZXMoZSk/InVzLWVhc3QtMSI6WyJmaXBzLWF3cy11cy1nb3YtZ2xvYmFsIiwiYXdzLXVzLWdvdi1nbG9iYWwiXS5pbmNsdWRlcyhlKT8idXMtZ292LXdlc3QtMSI6ZS5yZXBsYWNlKC9maXBzLShka3ItfHByb2QtKT98LWZpcHMvLCIiKX19fSx7fV0sNTY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL3V0aWwiKSxvPWUoIi4vcmVnaW9uX2NvbmZpZ19kYXRhLmpzb24iKTtmdW5jdGlvbiBpKGUsdCl7ci5lYWNoKHQsKGZ1bmN0aW9uKHQsbil7Imdsb2JhbEVuZHBvaW50IiE9PXQmJih2b2lkIDAhPT1lLmNvbmZpZ1t0XSYmbnVsbCE9PWUuY29uZmlnW3RdfHwoZS5jb25maWdbdF09bikpfSkpfXQuZXhwb3J0cz17Y29uZmlndXJlRW5kcG9pbnQ6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWZ1bmN0aW9uKGUpe3ZhciB0PWUuY29uZmlnLnJlZ2lvbixuPWZ1bmN0aW9uKGUpe2lmKCFlKXJldHVybiBudWxsO3ZhciB0PWUuc3BsaXQoIi0iKTtyZXR1cm4gdC5sZW5ndGg8Mz9udWxsOnQuc2xpY2UoMCx0Lmxlbmd0aC0yKS5qb2luKCItIikrIi0qIn0odCkscj1lLmFwaS5lbmRwb2ludFByZWZpeDtyZXR1cm5bW3Qscl0sW24scl0sW3QsIioiXSxbbiwiKiJdLFsiKiIscl0sW3QsImludGVybmFsLSoiXSxbIioiLCIqIl1dLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF0mJmVbMV0/ZS5qb2luKCIvIik6bnVsbH0pKX0oZSksbj1lLmNvbmZpZy51c2VGaXBzRW5kcG9pbnQscj1lLmNvbmZpZy51c2VEdWFsc3RhY2tFbmRwb2ludCxhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciBzPXRbYV07aWYocyl7dmFyIGM9bj9yP28uZHVhbHN0YWNrRmlwc1J1bGVzOm8uZmlwc1J1bGVzOnI/by5kdWFsc3RhY2tSdWxlczpvLnJ1bGVzO2lmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjLHMpKXt2YXIgdT1jW3NdOyJzdHJpbmciPT10eXBlb2YgdSYmKHU9by5wYXR0ZXJuc1t1XSksZS5pc0dsb2JhbEVuZHBvaW50PSEhdS5nbG9iYWxFbmRwb2ludCx1LnNpZ25pbmdSZWdpb24mJihlLnNpZ25pbmdSZWdpb249dS5zaWduaW5nUmVnaW9uKSx1LnNpZ25hdHVyZVZlcnNpb258fCh1LnNpZ25hdHVyZVZlcnNpb249InY0Iik7dmFyIGw9ImJlYXJlciI9PT0oZS5hcGkmJmUuYXBpLnNpZ25hdHVyZVZlcnNpb24pO3JldHVybiB2b2lkIGkoZSxPYmplY3QuYXNzaWduKHt9LHUse3NpZ25hdHVyZVZlcnNpb246bD8iYmVhcmVyIjp1LnNpZ25hdHVyZVZlcnNpb259KSl9fX19LGdldEVuZHBvaW50U3VmZml4OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD17Il4odXN8ZXV8YXB8c2F8Y2F8bWUpXFwtXFx3K1xcLVxcZCskIjoiYW1hem9uYXdzLmNvbSIsIl5jblxcLVxcdytcXC1cXGQrJCI6ImFtYXpvbmF3cy5jb20uY24iLCJedXNcXC1nb3ZcXC1cXHcrXFwtXFxkKyQiOiJhbWF6b25hd3MuY29tIiwiXnVzXFwtaXNvXFwtXFx3K1xcLVxcZCskIjoiYzJzLmljLmdvdiIsIl51c1xcLWlzb2JcXC1cXHcrXFwtXFxkKyQiOiJzYzJzLnNnb3YuZ292In0sbj1PYmplY3Qua2V5cyh0KSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPVJlZ0V4cChuW3JdKSxpPXRbbltyXV07aWYoby50ZXN0KGUpKXJldHVybiBpfXJldHVybiJhbWF6b25hd3MuY29tIn19fSx7Ii4vcmVnaW9uX2NvbmZpZ19kYXRhLmpzb24iOjU3LCIuL3V0aWwiOjc0fV0sNTc6W2Z1bmN0aW9uKGUsdCxuKXt0LmV4cG9ydHM9e3J1bGVzOnsiKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sImNuLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbS5jbiJ9LCJ1cy1pc28tKi8qIjoidXNJc28iLCJ1cy1pc29iLSovKiI6InVzSXNvYiIsIiovYnVkZ2V0cyI6Imdsb2JhbFNTTCIsIiovY2xvdWRmcm9udCI6Imdsb2JhbFNTTCIsIiovc3RzIjoiZ2xvYmFsU1NMIiwiKi9pbXBvcnRleHBvcnQiOntlbmRwb2ludDoie3NlcnZpY2V9LmFtYXpvbmF3cy5jb20iLHNpZ25hdHVyZVZlcnNpb246InYyIixnbG9iYWxFbmRwb2ludDohMH0sIiovcm91dGU1MyI6Imdsb2JhbFNTTCIsImNuLSovcm91dGU1MyI6e2VuZHBvaW50OiJ7c2VydmljZX0uYW1hem9uYXdzLmNvbS5jbiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoiY24tbm9ydGh3ZXN0LTEifSwidXMtZ292LSovcm91dGU1MyI6Imdsb2JhbEdvdkNsb3VkIiwidXMtaXNvLSovcm91dGU1MyI6e2VuZHBvaW50OiJ7c2VydmljZX0uYzJzLmljLmdvdiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoidXMtaXNvLWVhc3QtMSJ9LCJ1cy1pc29iLSovcm91dGU1MyI6e2VuZHBvaW50OiJ7c2VydmljZX0uc2Mycy5zZ292LmdvdiIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoidXMtaXNvYi1lYXN0LTEifSwiKi93YWYiOiJnbG9iYWxTU0wiLCIqL2lhbSI6Imdsb2JhbFNTTCIsImNuLSovaWFtIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5jbi1ub3J0aC0xLmFtYXpvbmF3cy5jb20uY24iLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246ImNuLW5vcnRoLTEifSwidXMtaXNvLSovaWFtIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS51cy1pc28tZWFzdC0xLmMycy5pYy5nb3YiLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246InVzLWlzby1lYXN0LTEifSwidXMtZ292LSovaWFtIjoiZ2xvYmFsR292Q2xvdWQiLCIqL2NlIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbSIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoidXMtZWFzdC0xIn0sImNuLSovY2UiOntlbmRwb2ludDoie3NlcnZpY2V9LmNuLW5vcnRod2VzdC0xLmFtYXpvbmF3cy5jb20uY24iLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246ImNuLW5vcnRod2VzdC0xIn0sInVzLWdvdi0qL3N0cyI6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LCJ1cy1nb3Ytd2VzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJ1cy13ZXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsInVzLXdlc3QtMi9zMyI6InMzc2lnbmF0dXJlIiwiZXUtd2VzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJhcC1zb3V0aGVhc3QtMS9zMyI6InMzc2lnbmF0dXJlIiwiYXAtc291dGhlYXN0LTIvczMiOiJzM3NpZ25hdHVyZSIsImFwLW5vcnRoZWFzdC0xL3MzIjoiczNzaWduYXR1cmUiLCJzYS1lYXN0LTEvczMiOiJzM3NpZ25hdHVyZSIsInVzLWVhc3QtMS9zMyI6e2VuZHBvaW50OiJ7c2VydmljZX0uYW1hem9uYXdzLmNvbSIsc2lnbmF0dXJlVmVyc2lvbjoiczMifSwidXMtZWFzdC0xL3NkYiI6e2VuZHBvaW50OiJ7c2VydmljZX0uYW1hem9uYXdzLmNvbSIsc2lnbmF0dXJlVmVyc2lvbjoidjIifSwiKi9zZGIiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFtYXpvbmF3cy5jb20iLHNpZ25hdHVyZVZlcnNpb246InYyIn0sIiovcmVzb3VyY2UtZXhwbG9yZXItMiI6ImR1YWxzdGFja0J5RGVmYXVsdCIsIiova2VuZHJhLXJhbmtpbmciOiJkdWFsc3RhY2tCeURlZmF1bHQiLCIqL2ludGVybmV0bW9uaXRvciI6ImR1YWxzdGFja0J5RGVmYXVsdCIsIiovY29kZWNhdGFseXN0IjoiZ2xvYmFsRHVhbHN0YWNrQnlEZWZhdWx0In0sZmlwc1J1bGVzOnsiKi8qIjoiZmlwc1N0YW5kYXJkIiwidXMtZ292LSovKiI6ImZpcHNTdGFuZGFyZCIsInVzLWlzby0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYzJzLmljLmdvdiJ9LCJ1cy1pc28tKi9kbXMiOiJ1c0lzbyIsInVzLWlzb2ItKi8qIjp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LnNjMnMuc2dvdi5nb3YifSwidXMtaXNvYi0qL2RtcyI6InVzSXNvYiIsImNuLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5hbWF6b25hd3MuY29tLmNuIn0sIiovYXBpLmVjciI6ImZpcHMuYXBpLmVjciIsIiovYXBpLnNhZ2VtYWtlciI6ImZpcHMuYXBpLnNhZ2VtYWtlciIsIiovYmF0Y2giOiJmaXBzRG90UHJlZml4IiwiKi9la3MiOiJmaXBzRG90UHJlZml4IiwiKi9tb2RlbHMubGV4IjoiZmlwcy5tb2RlbHMubGV4IiwiKi9ydW50aW1lLmxleCI6ImZpcHMucnVudGltZS5sZXgiLCIqL3J1bnRpbWUuc2FnZW1ha2VyIjp7ZW5kcG9pbnQ6InJ1bnRpbWUtZmlwcy5zYWdlbWFrZXIue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LCIqL2lhbSI6ImZpcHNXaXRob3V0UmVnaW9uIiwiKi9yb3V0ZTUzIjoiZmlwc1dpdGhvdXRSZWdpb24iLCIqL3RyYW5zY3JpYmUiOiJmaXBzRG90UHJlZml4IiwiKi93YWYiOiJmaXBzV2l0aG91dFJlZ2lvbiIsInVzLWdvdi0qL3RyYW5zY3JpYmUiOiJmaXBzRG90UHJlZml4IiwidXMtZ292LSovYXBpLmVjciI6ImZpcHMuYXBpLmVjciIsInVzLWdvdi0qL2FwaS5zYWdlbWFrZXIiOiJmaXBzLmFwaS5zYWdlbWFrZXIiLCJ1cy1nb3YtKi9tb2RlbHMubGV4IjoiZmlwcy5tb2RlbHMubGV4IiwidXMtZ292LSovcnVudGltZS5sZXgiOiJmaXBzLnJ1bnRpbWUubGV4IiwidXMtZ292LSovYWNtLXBjYSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9iYXRjaCI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9jbG91ZGZvcm1hdGlvbiI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9jb25maWciOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovZWtzIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL2VsYXN0aWNtYXByZWR1Y2UiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovaWRlbnRpdHlzdG9yZSI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9keW5hbW9kYiI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9lbGFzdGljbG9hZGJhbGFuY2luZyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9ndWFyZGR1dHkiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovbW9uaXRvcmluZyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9yZXNvdXJjZS1ncm91cHMiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovcnVudGltZS5zYWdlbWFrZXIiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovc2VydmljZWNhdGFsb2ctYXBwcmVnaXN0cnkiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovc2VydmljZXF1b3RhcyI6ImZpcHNXaXRoU2VydmljZU9ubHkiLCJ1cy1nb3YtKi9zc20iOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LSovc3RzIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi0qL3N1cHBvcnQiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtZ292LXdlc3QtMS9zdGF0ZXMiOiJmaXBzV2l0aFNlcnZpY2VPbmx5IiwidXMtaXNvLWVhc3QtMS9lbGFzdGljZmlsZXN5c3RlbSI6e2VuZHBvaW50OiJlbGFzdGljZmlsZXN5c3RlbS1maXBzLntyZWdpb259LmMycy5pYy5nb3YifSwidXMtZ292LXdlc3QtMS9vcmdhbml6YXRpb25zIjoiZmlwc1dpdGhTZXJ2aWNlT25seSIsInVzLWdvdi13ZXN0LTEvcm91dGU1MyI6e2VuZHBvaW50OiJyb3V0ZTUzLnVzLWdvdi5hbWF6b25hd3MuY29tIn0sIiovcmVzb3VyY2UtZXhwbG9yZXItMiI6ImZpcHNEdWFsc3RhY2tCeURlZmF1bHQiLCIqL2tlbmRyYS1yYW5raW5nIjoiZHVhbHN0YWNrQnlEZWZhdWx0IiwiKi9pbnRlcm5ldG1vbml0b3IiOiJkdWFsc3RhY2tCeURlZmF1bHQiLCIqL2NvZGVjYXRhbHlzdCI6ImZpcHNHbG9iYWxEdWFsc3RhY2tCeURlZmF1bHQifSxkdWFsc3RhY2tSdWxlczp7IiovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uYXBpLmF3cyJ9LCJjbi0qLyoiOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFwaS5hbWF6b253ZWJzZXJ2aWNlcy5jb20uY24ifSwiKi9zMyI6ImR1YWxzdGFja0xlZ2FjeSIsImNuLSovczMiOiJkdWFsc3RhY2tMZWdhY3lDbiIsIiovczMtY29udHJvbCI6ImR1YWxzdGFja0xlZ2FjeSIsImNuLSovczMtY29udHJvbCI6ImR1YWxzdGFja0xlZ2FjeUNuIiwiYXAtc291dGgtMS9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIiLCJldS13ZXN0LTEvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIiwic2EtZWFzdC0xL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiIsInVzLWVhc3QtMS9lYzIiOiJkdWFsc3RhY2tMZWdhY3lFYzIiLCJ1cy1lYXN0LTIvZWMyIjoiZHVhbHN0YWNrTGVnYWN5RWMyIiwidXMtd2VzdC0yL2VjMiI6ImR1YWxzdGFja0xlZ2FjeUVjMiJ9LGR1YWxzdGFja0ZpcHNSdWxlczp7IiovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5hcGkuYXdzIn0sImNuLSovKiI6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy57cmVnaW9ufS5hcGkuYW1hem9ud2Vic2VydmljZXMuY29tLmNuIn0sIiovczMiOiJkdWFsc3RhY2tGaXBzTGVnYWN5IiwiY24tKi9zMyI6ImR1YWxzdGFja0ZpcHNMZWdhY3lDbiIsIiovczMtY29udHJvbCI6ImR1YWxzdGFja0ZpcHNMZWdhY3kiLCJjbi0qL3MzLWNvbnRyb2wiOiJkdWFsc3RhY2tGaXBzTGVnYWN5Q24ifSxwYXR0ZXJuczp7Z2xvYmFsU1NMOntlbmRwb2ludDoiaHR0cHM6Ly97c2VydmljZX0uYW1hem9uYXdzLmNvbSIsZ2xvYmFsRW5kcG9pbnQ6ITAsc2lnbmluZ1JlZ2lvbjoidXMtZWFzdC0xIn0sZ2xvYmFsR292Q2xvdWQ6e2VuZHBvaW50OiJ7c2VydmljZX0udXMtZ292LmFtYXpvbmF3cy5jb20iLGdsb2JhbEVuZHBvaW50OiEwLHNpZ25pbmdSZWdpb246InVzLWdvdi13ZXN0LTEifSxzM3NpZ25hdHVyZTp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIixzaWduYXR1cmVWZXJzaW9uOiJzMyJ9LHVzSXNvOntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmMycy5pYy5nb3YifSx1c0lzb2I6e2VuZHBvaW50OiJ7c2VydmljZX0ue3JlZ2lvbn0uc2Mycy5zZ292LmdvdiJ9LGZpcHNTdGFuZGFyZDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS1maXBzLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxmaXBzRG90UHJlZml4OntlbmRwb2ludDoiZmlwcy57c2VydmljZX0ue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LGZpcHNXaXRob3V0UmVnaW9uOntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMuYW1hem9uYXdzLmNvbSJ9LCJmaXBzLmFwaS5lY3IiOntlbmRwb2ludDoiZWNyLWZpcHMue3JlZ2lvbn0uYW1hem9uYXdzLmNvbSJ9LCJmaXBzLmFwaS5zYWdlbWFrZXIiOntlbmRwb2ludDoiYXBpLWZpcHMuc2FnZW1ha2VyLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSwiZmlwcy5tb2RlbHMubGV4Ijp7ZW5kcG9pbnQ6Im1vZGVscy1maXBzLmxleC57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sImZpcHMucnVudGltZS5sZXgiOntlbmRwb2ludDoicnVudGltZS1maXBzLmxleC57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZmlwc1dpdGhTZXJ2aWNlT25seTp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZHVhbHN0YWNrTGVnYWN5OntlbmRwb2ludDoie3NlcnZpY2V9LmR1YWxzdGFjay57cmVnaW9ufS5hbWF6b25hd3MuY29tIn0sZHVhbHN0YWNrTGVnYWN5Q246e2VuZHBvaW50OiJ7c2VydmljZX0uZHVhbHN0YWNrLntyZWdpb259LmFtYXpvbmF3cy5jb20uY24ifSxkdWFsc3RhY2tGaXBzTGVnYWN5OntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMuZHVhbHN0YWNrLntyZWdpb259LmFtYXpvbmF3cy5jb20ifSxkdWFsc3RhY2tGaXBzTGVnYWN5Q246e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy5kdWFsc3RhY2sue3JlZ2lvbn0uYW1hem9uYXdzLmNvbS5jbiJ9LGR1YWxzdGFja0xlZ2FjeUVjMjp7ZW5kcG9pbnQ6ImFwaS5lYzIue3JlZ2lvbn0uYXdzIn0sZHVhbHN0YWNrQnlEZWZhdWx0OntlbmRwb2ludDoie3NlcnZpY2V9LntyZWdpb259LmFwaS5hd3MifSxmaXBzRHVhbHN0YWNrQnlEZWZhdWx0OntlbmRwb2ludDoie3NlcnZpY2V9LWZpcHMue3JlZ2lvbn0uYXBpLmF3cyJ9LGdsb2JhbER1YWxzdGFja0J5RGVmYXVsdDp7ZW5kcG9pbnQ6IntzZXJ2aWNlfS5nbG9iYWwuYXBpLmF3cyJ9LGZpcHNHbG9iYWxEdWFsc3RhY2tCeURlZmF1bHQ6e2VuZHBvaW50OiJ7c2VydmljZX0tZmlwcy5nbG9iYWwuYXBpLmF3cyJ9fX19LHt9XSw1ODpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbih0KXsoZnVuY3Rpb24oKXt2YXIgbj1lKCIuL2NvcmUiKSxyPWUoIi4vc3RhdGVfbWFjaGluZSIpLG89bi51dGlsLmluaGVyaXQsaT1uLnV0aWwuZG9tYWluLGE9ZSgiam1lc3BhdGgiKSxzPXtzdWNjZXNzOjEsZXJyb3I6MSxjb21wbGV0ZToxfSxjPW5ldyByO2Muc2V0dXBTdGF0ZXM9ZnVuY3Rpb24oKXt2YXIgZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7bi5faGFsdEhhbmRsZXJzT25FcnJvcj0hMSxuLmVtaXQobi5fYXNtLmN1cnJlbnRTdGF0ZSwoZnVuY3Rpb24oZSl7aWYoZSlpZihyPW4sT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsci5fYXNtLmN1cnJlbnRTdGF0ZSkpe2lmKCEoaSYmbi5kb21haW4gaW5zdGFuY2VvZiBpLkRvbWFpbikpdGhyb3cgZTtlLmRvbWFpbkVtaXR0ZXI9bixlLmRvbWFpbj1uLmRvbWFpbixlLmRvbWFpblRocm93bj0hMSxuLmRvbWFpbi5lbWl0KCJlcnJvciIsZSl9ZWxzZSBuLnJlc3BvbnNlLmVycm9yPWUsdChlKTtlbHNlIHQobi5yZXNwb25zZS5lcnJvcik7dmFyIHJ9KSl9O3RoaXMuYWRkU3RhdGUoInZhbGlkYXRlIiwiYnVpbGQiLCJlcnJvciIsZSksdGhpcy5hZGRTdGF0ZSgiYnVpbGQiLCJhZnRlckJ1aWxkIiwicmVzdGFydCIsZSksdGhpcy5hZGRTdGF0ZSgiYWZ0ZXJCdWlsZCIsInNpZ24iLCJyZXN0YXJ0IixlKSx0aGlzLmFkZFN0YXRlKCJzaWduIiwic2VuZCIsInJldHJ5IixlKSx0aGlzLmFkZFN0YXRlKCJyZXRyeSIsImFmdGVyUmV0cnkiLCJhZnRlclJldHJ5IixlKSx0aGlzLmFkZFN0YXRlKCJhZnRlclJldHJ5Iiwic2lnbiIsImVycm9yIixlKSx0aGlzLmFkZFN0YXRlKCJzZW5kIiwidmFsaWRhdGVSZXNwb25zZSIsInJldHJ5IixlKSx0aGlzLmFkZFN0YXRlKCJ2YWxpZGF0ZVJlc3BvbnNlIiwiZXh0cmFjdERhdGEiLCJleHRyYWN0RXJyb3IiLGUpLHRoaXMuYWRkU3RhdGUoImV4dHJhY3RFcnJvciIsImV4dHJhY3REYXRhIiwicmV0cnkiLGUpLHRoaXMuYWRkU3RhdGUoImV4dHJhY3REYXRhIiwic3VjY2VzcyIsInJldHJ5IixlKSx0aGlzLmFkZFN0YXRlKCJyZXN0YXJ0IiwiYnVpbGQiLCJlcnJvciIsZSksdGhpcy5hZGRTdGF0ZSgic3VjY2VzcyIsImNvbXBsZXRlIiwiY29tcGxldGUiLGUpLHRoaXMuYWRkU3RhdGUoImVycm9yIiwiY29tcGxldGUiLCJjb21wbGV0ZSIsZSksdGhpcy5hZGRTdGF0ZSgiY29tcGxldGUiLG51bGwsbnVsbCxlKX0sYy5zZXR1cFN0YXRlcygpLG4uUmVxdWVzdD1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlLHQsbyl7dmFyIGE9ZS5lbmRwb2ludCxzPWUuY29uZmlnLnJlZ2lvbix1PWUuY29uZmlnLmN1c3RvbVVzZXJBZ2VudDtlLnNpZ25pbmdSZWdpb24/cz1lLnNpZ25pbmdSZWdpb246ZS5pc0dsb2JhbEVuZHBvaW50JiYocz0idXMtZWFzdC0xIiksdGhpcy5kb21haW49aSYmaS5hY3RpdmUsdGhpcy5zZXJ2aWNlPWUsdGhpcy5vcGVyYXRpb249dCx0aGlzLnBhcmFtcz1vfHx7fSx0aGlzLmh0dHBSZXF1ZXN0PW5ldyBuLkh0dHBSZXF1ZXN0KGEscyksdGhpcy5odHRwUmVxdWVzdC5hcHBlbmRUb1VzZXJBZ2VudCh1KSx0aGlzLnN0YXJ0VGltZT1lLmdldFNrZXdDb3JyZWN0ZWREYXRlKCksdGhpcy5yZXNwb25zZT1uZXcgbi5SZXNwb25zZSh0aGlzKSx0aGlzLl9hc209bmV3IHIoYy5zdGF0ZXMsInZhbGlkYXRlIiksdGhpcy5faGFsdEhhbmRsZXJzT25FcnJvcj0hMSxuLlNlcXVlbnRpYWxFeGVjdXRvci5jYWxsKHRoaXMpLHRoaXMuZW1pdD10aGlzLmVtaXRFdmVudH0sc2VuZDpmdW5jdGlvbihlKXtyZXR1cm4gZSYmKHRoaXMuaHR0cFJlcXVlc3QuYXBwZW5kVG9Vc2VyQWdlbnQoImNhbGxiYWNrIiksdGhpcy5vbigiY29tcGxldGUiLChmdW5jdGlvbih0KXtlLmNhbGwodCx0LmVycm9yLHQuZGF0YSl9KSkpLHRoaXMucnVuVG8oKSx0aGlzLnJlc3BvbnNlfSxidWlsZDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5ydW5Ubygic2VuZCIsZSl9LHJ1blRvOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMuX2FzbS5ydW5UbyhlLHQsdGhpcyksdGhpc30sYWJvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoInZhbGlkYXRlUmVzcG9uc2UiKSx0aGlzLnJlbW92ZUFsbExpc3RlbmVycygiZXh0cmFjdEVycm9yIiksdGhpcy5vbigidmFsaWRhdGVSZXNwb25zZSIsKGZ1bmN0aW9uKGUpe2UuZXJyb3I9bi51dGlsLmVycm9yKG5ldyBFcnJvcigiUmVxdWVzdCBhYm9ydGVkIGJ5IHVzZXIiKSx7Y29kZToiUmVxdWVzdEFib3J0ZWRFcnJvciIscmV0cnlhYmxlOiExfSl9KSksdGhpcy5odHRwUmVxdWVzdC5zdHJlYW0mJiF0aGlzLmh0dHBSZXF1ZXN0LnN0cmVhbS5kaWRDYWxsYmFjayYmKHRoaXMuaHR0cFJlcXVlc3Quc3RyZWFtLmFib3J0KCksdGhpcy5odHRwUmVxdWVzdC5fYWJvcnRDYWxsYmFjaz90aGlzLmh0dHBSZXF1ZXN0Ll9hYm9ydENhbGxiYWNrKCk6dGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoInNlbmQiKSksdGhpc30sZWFjaFBhZ2U6ZnVuY3Rpb24oZSl7ZT1uLnV0aWwuZm4ubWFrZUFzeW5jKGUsMyksdGhpcy5vbigiY29tcGxldGUiLChmdW5jdGlvbiB0KHIpe2UuY2FsbChyLHIuZXJyb3Isci5kYXRhLChmdW5jdGlvbihvKXshMSE9PW8mJihyLmhhc05leHRQYWdlKCk/ci5uZXh0UGFnZSgpLm9uKCJjb21wbGV0ZSIsdCkuc2VuZCgpOmUuY2FsbChyLG51bGwsbnVsbCxuLnV0aWwuZm4ubm9vcCkpfSkpfSkpLnNlbmQoKX0sZWFjaEl0ZW06ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0aGlzLmVhY2hQYWdlKChmdW5jdGlvbihyLG8pe2lmKHIpcmV0dXJuIGUocixudWxsKTtpZihudWxsPT09bylyZXR1cm4gZShudWxsLG51bGwpO3ZhciBpPXQuc2VydmljZS5wYWdpbmF0aW9uQ29uZmlnKHQub3BlcmF0aW9uKS5yZXN1bHRLZXk7QXJyYXkuaXNBcnJheShpKSYmKGk9aVswXSk7dmFyIHM9YS5zZWFyY2gobyxpKSxjPSEwO3JldHVybiBuLnV0aWwuYXJyYXlFYWNoKHMsKGZ1bmN0aW9uKHQpe2lmKCExPT09KGM9ZShudWxsLHQpKSlyZXR1cm4gbi51dGlsLmFib3J0fSkpLGN9KSl9LGlzUGFnZWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMuc2VydmljZS5wYWdpbmF0aW9uQ29uZmlnKHRoaXMub3BlcmF0aW9uKX0sY3JlYXRlUmVhZFN0cmVhbTpmdW5jdGlvbigpe3ZhciBlPW4udXRpbC5zdHJlYW0scj10aGlzLG89bnVsbDtyZXR1cm4gMj09PW4uSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbj8obz1uZXcgZS5QYXNzVGhyb3VnaCx0Lm5leHRUaWNrKChmdW5jdGlvbigpe3Iuc2VuZCgpfSkpKTooKG89bmV3IGUuU3RyZWFtKS5yZWFkYWJsZT0hMCxvLnNlbnQ9ITEsby5vbigibmV3TGlzdGVuZXIiLChmdW5jdGlvbihlKXtvLnNlbnR8fCJkYXRhIiE9PWV8fChvLnNlbnQ9ITAsdC5uZXh0VGljaygoZnVuY3Rpb24oKXtyLnNlbmQoKX0pKSl9KSkpLHRoaXMub24oImVycm9yIiwoZnVuY3Rpb24oZSl7by5lbWl0KCJlcnJvciIsZSl9KSksdGhpcy5vbigiaHR0cEhlYWRlcnMiLChmdW5jdGlvbih0LGksYSl7aWYodDwzMDApe3IucmVtb3ZlTGlzdGVuZXIoImh0dHBEYXRhIixuLkV2ZW50TGlzdGVuZXJzLkNvcmUuSFRUUF9EQVRBKSxyLnJlbW92ZUxpc3RlbmVyKCJodHRwRXJyb3IiLG4uRXZlbnRMaXN0ZW5lcnMuQ29yZS5IVFRQX0VSUk9SKSxyLm9uKCJodHRwRXJyb3IiLChmdW5jdGlvbihlKXthLmVycm9yPWUsYS5lcnJvci5yZXRyeWFibGU9ITF9KSk7dmFyIHMsYz0hMTtpZigiSEVBRCIhPT1yLmh0dHBSZXF1ZXN0Lm1ldGhvZCYmKHM9cGFyc2VJbnQoaVsiY29udGVudC1sZW5ndGgiXSwxMCkpLHZvaWQgMCE9PXMmJiFpc05hTihzKSYmcz49MCl7Yz0hMDt2YXIgdT0wfXZhciBsPWZ1bmN0aW9uKCl7YyYmdSE9PXM/by5lbWl0KCJlcnJvciIsbi51dGlsLmVycm9yKG5ldyBFcnJvcigiU3RyZWFtIGNvbnRlbnQgbGVuZ3RoIG1pc21hdGNoLiBSZWNlaXZlZCAiK3UrIiBvZiAiK3MrIiBieXRlcy4iKSx7Y29kZToiU3RyZWFtQ29udGVudExlbmd0aE1pc21hdGNoIn0pKToyPT09bi5IdHRwQ2xpZW50LnN0cmVhbXNBcGlWZXJzaW9uP28uZW5kKCk6by5lbWl0KCJlbmQiKX0scD1hLmh0dHBSZXNwb25zZS5jcmVhdGVVbmJ1ZmZlcmVkU3RyZWFtKCk7aWYoMj09PW4uSHR0cENsaWVudC5zdHJlYW1zQXBpVmVyc2lvbilpZihjKXt2YXIgZD1uZXcgZS5QYXNzVGhyb3VnaDtkLl93cml0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5sZW5ndGgmJih1Kz10Lmxlbmd0aCksZS5QYXNzVGhyb3VnaC5wcm90b3R5cGUuX3dyaXRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sZC5vbigiZW5kIixsKSxvLm9uKCJlcnJvciIsKGZ1bmN0aW9uKGUpe2M9ITEscC51bnBpcGUoZCksZC5lbWl0KCJlbmQiKSxkLmVuZCgpfSkpLHAucGlwZShkKS5waXBlKG8se2VuZDohMX0pfWVsc2UgcC5waXBlKG8pO2Vsc2UgYyYmcC5vbigiZGF0YSIsKGZ1bmN0aW9uKGUpe2UmJmUubGVuZ3RoJiYodSs9ZS5sZW5ndGgpfSkpLHAub24oImRhdGEiLChmdW5jdGlvbihlKXtvLmVtaXQoImRhdGEiLGUpfSkpLHAub24oImVuZCIsbCk7cC5vbigiZXJyb3IiLChmdW5jdGlvbihlKXtjPSExLG8uZW1pdCgiZXJyb3IiLGUpfSkpfX0pKSxvfSxlbWl0RXZlbnQ6ZnVuY3Rpb24oZSx0LHIpeyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYocj10LHQ9bnVsbCkscnx8KHI9ZnVuY3Rpb24oKXt9KSx0fHwodD10aGlzLmV2ZW50UGFyYW1ldGVycyhlLHRoaXMucmVzcG9uc2UpKSxuLlNlcXVlbnRpYWxFeGVjdXRvci5wcm90b3R5cGUuZW1pdC5jYWxsKHRoaXMsZSx0LChmdW5jdGlvbihlKXtlJiYodGhpcy5yZXNwb25zZS5lcnJvcj1lKSxyLmNhbGwodGhpcyxlKX0pKX0sZXZlbnRQYXJhbWV0ZXJzOmZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlInJlc3RhcnQiOmNhc2UidmFsaWRhdGUiOmNhc2Uic2lnbiI6Y2FzZSJidWlsZCI6Y2FzZSJhZnRlclZhbGlkYXRlIjpjYXNlImFmdGVyQnVpbGQiOnJldHVyblt0aGlzXTtjYXNlImVycm9yIjpyZXR1cm5bdGhpcy5yZXNwb25zZS5lcnJvcix0aGlzLnJlc3BvbnNlXTtkZWZhdWx0OnJldHVyblt0aGlzLnJlc3BvbnNlXX19LHByZXNpZ246ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8ImZ1bmN0aW9uIiE9dHlwZW9mIGV8fCh0PWUsZT1udWxsKSwobmV3IG4uU2lnbmVycy5QcmVzaWduKS5zaWduKHRoaXMudG9HZXQoKSxlLHQpfSxpc1ByZXNpZ25lZDpmdW5jdGlvbigpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5odHRwUmVxdWVzdC5oZWFkZXJzLCJwcmVzaWduZWQtZXhwaXJlcyIpfSx0b1VuYXV0aGVudGljYXRlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl91bkF1dGhlbnRpY2F0ZWQ9ITAsdGhpcy5yZW1vdmVMaXN0ZW5lcigidmFsaWRhdGUiLG4uRXZlbnRMaXN0ZW5lcnMuQ29yZS5WQUxJREFURV9DUkVERU5USUFMUyksdGhpcy5yZW1vdmVMaXN0ZW5lcigic2lnbiIsbi5FdmVudExpc3RlbmVycy5Db3JlLlNJR04pLHRoaXN9LHRvR2V0OmZ1bmN0aW9uKCl7cmV0dXJuInF1ZXJ5IiE9PXRoaXMuc2VydmljZS5hcGkucHJvdG9jb2wmJiJlYzIiIT09dGhpcy5zZXJ2aWNlLmFwaS5wcm90b2NvbHx8KHRoaXMucmVtb3ZlTGlzdGVuZXIoImJ1aWxkIix0aGlzLmJ1aWxkQXNHZXQpLHRoaXMuYWRkTGlzdGVuZXIoImJ1aWxkIix0aGlzLmJ1aWxkQXNHZXQpKSx0aGlzfSxidWlsZEFzR2V0OmZ1bmN0aW9uKGUpe2UuaHR0cFJlcXVlc3QubWV0aG9kPSJHRVQiLGUuaHR0cFJlcXVlc3QucGF0aD1lLnNlcnZpY2UuZW5kcG9pbnQucGF0aCsiPyIrZS5odHRwUmVxdWVzdC5ib2R5LGUuaHR0cFJlcXVlc3QuYm9keT0iIixkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdLGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdfSxoYWx0SGFuZGxlcnNPbkVycm9yOmZ1bmN0aW9uKCl7dGhpcy5faGFsdEhhbmRsZXJzT25FcnJvcj0hMH19KSxuLlJlcXVlc3QuYWRkUHJvbWlzZXNUb0NsYXNzPWZ1bmN0aW9uKGUpe3RoaXMucHJvdG90eXBlLnByb21pc2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLmh0dHBSZXF1ZXN0LmFwcGVuZFRvVXNlckFnZW50KCJwcm9taXNlIiksbmV3IGUoKGZ1bmN0aW9uKGUsbil7dC5vbigiY29tcGxldGUiLChmdW5jdGlvbih0KXt0LmVycm9yP24odC5lcnJvcik6ZShPYmplY3QuZGVmaW5lUHJvcGVydHkodC5kYXRhfHx7fSwiJHJlc3BvbnNlIix7dmFsdWU6dH0pKX0pKSx0LnJ1blRvKCl9KSl9fSxuLlJlcXVlc3QuZGVsZXRlUHJvbWlzZXNGcm9tQ2xhc3M9ZnVuY3Rpb24oKXtkZWxldGUgdGhpcy5wcm90b3R5cGUucHJvbWlzZX0sbi51dGlsLmFkZFByb21pc2VzKG4uUmVxdWVzdCksbi51dGlsLm1peGluKG4uUmVxdWVzdCxuLlNlcXVlbnRpYWxFeGVjdXRvcil9KS5jYWxsKHRoaXMpfSkuY2FsbCh0aGlzLGUoIl9wcm9jZXNzIikpfSx7Ii4vY29yZSI6MTksIi4vc3RhdGVfbWFjaGluZSI6NzMsX3Byb2Nlc3M6OTEsam1lc3BhdGg6OTB9XSw1OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQsaT1lKCJqbWVzcGF0aCIpO2Z1bmN0aW9uIGEoZSl7dmFyIHQ9ZS5yZXF1ZXN0Ll93YWl0ZXIsbj10LmNvbmZpZy5hY2NlcHRvcnMscj0hMSxvPSJyZXRyeSI7bi5mb3JFYWNoKChmdW5jdGlvbihuKXtpZighcil7dmFyIGk9dC5tYXRjaGVyc1tuLm1hdGNoZXJdO2kmJmkoZSxuLmV4cGVjdGVkLG4uYXJndW1lbnQpJiYocj0hMCxvPW4uc3RhdGUpfX0pKSwhciYmZS5lcnJvciYmKG89ImZhaWx1cmUiKSwic3VjY2VzcyI9PT1vP3Quc2V0U3VjY2VzcyhlKTp0LnNldEVycm9yKGUsInJldHJ5Ij09PW8pfXIuUmVzb3VyY2VXYWl0ZXI9byh7Y29uc3RydWN0b3I6ZnVuY3Rpb24oZSx0KXt0aGlzLnNlcnZpY2U9ZSx0aGlzLnN0YXRlPXQsdGhpcy5sb2FkV2FpdGVyQ29uZmlnKHRoaXMuc3RhdGUpfSxzZXJ2aWNlOm51bGwsc3RhdGU6bnVsbCxjb25maWc6bnVsbCxtYXRjaGVyczp7cGF0aDpmdW5jdGlvbihlLHQsbil7dHJ5e3ZhciByPWkuc2VhcmNoKGUuZGF0YSxuKX1jYXRjaChlKXtyZXR1cm4hMX1yZXR1cm4gaS5zdHJpY3REZWVwRXF1YWwocix0KX0scGF0aEFsbDpmdW5jdGlvbihlLHQsbil7dHJ5e3ZhciByPWkuc2VhcmNoKGUuZGF0YSxuKX1jYXRjaChlKXtyZXR1cm4hMX1BcnJheS5pc0FycmF5KHIpfHwocj1bcl0pO3ZhciBvPXIubGVuZ3RoO2lmKCFvKXJldHVybiExO2Zvcih2YXIgYT0wO2E8bzthKyspaWYoIWkuc3RyaWN0RGVlcEVxdWFsKHJbYV0sdCkpcmV0dXJuITE7cmV0dXJuITB9LHBhdGhBbnk6ZnVuY3Rpb24oZSx0LG4pe3RyeXt2YXIgcj1pLnNlYXJjaChlLmRhdGEsbil9Y2F0Y2goZSl7cmV0dXJuITF9QXJyYXkuaXNBcnJheShyKXx8KHI9W3JdKTtmb3IodmFyIG89ci5sZW5ndGgsYT0wO2E8bzthKyspaWYoaS5zdHJpY3REZWVwRXF1YWwoclthXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sc3RhdHVzOmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZTtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIG4mJm49PT10fSxlcnJvcjpmdW5jdGlvbihlLHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmZS5lcnJvcj90PT09ZS5lcnJvci5jb2RlOnQ9PT0hIWUuZXJyb3J9fSxsaXN0ZW5lcnM6KG5ldyByLlNlcXVlbnRpYWxFeGVjdXRvcikuYWRkTmFtZWRMaXN0ZW5lcnMoKGZ1bmN0aW9uKGUpe2UoIlJFVFJZX0NIRUNLIiwicmV0cnkiLChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcXVlc3QuX3dhaXRlcjtlLmVycm9yJiYiUmVzb3VyY2VOb3RSZWFkeSI9PT1lLmVycm9yLmNvZGUmJihlLmVycm9yLnJldHJ5RGVsYXk9MWUzKih0LmNvbmZpZy5kZWxheXx8MCkpfSkpLGUoIkNIRUNLX09VVFBVVCIsImV4dHJhY3REYXRhIixhKSxlKCJDSEVDS19FUlJPUiIsImV4dHJhY3RFcnJvciIsYSl9KSksd2FpdDpmdW5jdGlvbihlLHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBlJiYodD1lLGU9dm9pZCAwKSxlJiZlLiR3YWl0ZXImJigibnVtYmVyIj09dHlwZW9mKGU9ci51dGlsLmNvcHkoZSkpLiR3YWl0ZXIuZGVsYXkmJih0aGlzLmNvbmZpZy5kZWxheT1lLiR3YWl0ZXIuZGVsYXkpLCJudW1iZXIiPT10eXBlb2YgZS4kd2FpdGVyLm1heEF0dGVtcHRzJiYodGhpcy5jb25maWcubWF4QXR0ZW1wdHM9ZS4kd2FpdGVyLm1heEF0dGVtcHRzKSxkZWxldGUgZS4kd2FpdGVyKTt2YXIgbj10aGlzLnNlcnZpY2UubWFrZVJlcXVlc3QodGhpcy5jb25maWcub3BlcmF0aW9uLGUpO3JldHVybiBuLl93YWl0ZXI9dGhpcyxuLnJlc3BvbnNlLm1heFJldHJpZXM9dGhpcy5jb25maWcubWF4QXR0ZW1wdHMsbi5hZGRMaXN0ZW5lcnModGhpcy5saXN0ZW5lcnMpLHQmJm4uc2VuZCh0KSxufSxzZXRTdWNjZXNzOmZ1bmN0aW9uKGUpe2UuZXJyb3I9bnVsbCxlLmRhdGE9ZS5kYXRhfHx7fSxlLnJlcXVlc3QucmVtb3ZlQWxsTGlzdGVuZXJzKCJleHRyYWN0RGF0YSIpfSxzZXRFcnJvcjpmdW5jdGlvbihlLHQpe2UuZGF0YT1udWxsLGUuZXJyb3I9ci51dGlsLmVycm9yKGUuZXJyb3J8fG5ldyBFcnJvcix7Y29kZToiUmVzb3VyY2VOb3RSZWFkeSIsbWVzc2FnZToiUmVzb3VyY2UgaXMgbm90IGluIHRoZSBzdGF0ZSAiK3RoaXMuc3RhdGUscmV0cnlhYmxlOnR9KX0sbG9hZFdhaXRlckNvbmZpZzpmdW5jdGlvbihlKXtpZighdGhpcy5zZXJ2aWNlLmFwaS53YWl0ZXJzW2VdKXRocm93IG5ldyByLnV0aWwuZXJyb3IobmV3IEVycm9yLHtjb2RlOiJTdGF0ZU5vdEZvdW5kRXJyb3IiLG1lc3NhZ2U6IlN0YXRlICIrZSsiIG5vdCBmb3VuZC4ifSk7dGhpcy5jb25maWc9ci51dGlsLmNvcHkodGhpcy5zZXJ2aWNlLmFwaS53YWl0ZXJzW2VdKX19KX0seyIuL2NvcmUiOjE5LGptZXNwYXRoOjkwfV0sNjA6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0LGk9ZSgiam1lc3BhdGgiKTtyLlJlc3BvbnNlPW8oe2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUpe3RoaXMucmVxdWVzdD1lLHRoaXMuZGF0YT1udWxsLHRoaXMuZXJyb3I9bnVsbCx0aGlzLnJldHJ5Q291bnQ9MCx0aGlzLnJlZGlyZWN0Q291bnQ9MCx0aGlzLmh0dHBSZXNwb25zZT1uZXcgci5IdHRwUmVzcG9uc2UsZSYmKHRoaXMubWF4UmV0cmllcz1lLnNlcnZpY2UubnVtUmV0cmllcygpLHRoaXMubWF4UmVkaXJlY3RzPWUuc2VydmljZS5jb25maWcubWF4UmVkaXJlY3RzKX0sbmV4dFBhZ2U6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLnJlcXVlc3Quc2VydmljZSxvPXRoaXMucmVxdWVzdC5vcGVyYXRpb247dHJ5e3Q9bi5wYWdpbmF0aW9uQ29uZmlnKG8sITApfWNhdGNoKGUpe3RoaXMuZXJyb3I9ZX1pZighdGhpcy5oYXNOZXh0UGFnZSgpKXtpZihlKWUodGhpcy5lcnJvcixudWxsKTtlbHNlIGlmKHRoaXMuZXJyb3IpdGhyb3cgdGhpcy5lcnJvcjtyZXR1cm4gbnVsbH12YXIgaT1yLnV0aWwuY29weSh0aGlzLnJlcXVlc3QucGFyYW1zKTtpZih0aGlzLm5leHRQYWdlVG9rZW5zKXt2YXIgYT10LmlucHV0VG9rZW47InN0cmluZyI9PXR5cGVvZiBhJiYoYT1bYV0pO2Zvcih2YXIgcz0wO3M8YS5sZW5ndGg7cysrKWlbYVtzXV09dGhpcy5uZXh0UGFnZVRva2Vuc1tzXTtyZXR1cm4gbi5tYWtlUmVxdWVzdCh0aGlzLnJlcXVlc3Qub3BlcmF0aW9uLGksZSl9cmV0dXJuIGU/ZShudWxsLG51bGwpOm51bGx9LGhhc05leHRQYWdlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FjaGVOZXh0UGFnZVRva2VucygpLCEhdGhpcy5uZXh0UGFnZVRva2Vuc3x8dm9pZCAwPT09dGhpcy5uZXh0UGFnZVRva2VucyYmdm9pZCAwfSxjYWNoZU5leHRQYWdlVG9rZW5zOmZ1bmN0aW9uKCl7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMsIm5leHRQYWdlVG9rZW5zIikpcmV0dXJuIHRoaXMubmV4dFBhZ2VUb2tlbnM7dGhpcy5uZXh0UGFnZVRva2Vucz12b2lkIDA7dmFyIGU9dGhpcy5yZXF1ZXN0LnNlcnZpY2UucGFnaW5hdGlvbkNvbmZpZyh0aGlzLnJlcXVlc3Qub3BlcmF0aW9uKTtpZighZSlyZXR1cm4gdGhpcy5uZXh0UGFnZVRva2VucztpZih0aGlzLm5leHRQYWdlVG9rZW5zPW51bGwsZS5tb3JlUmVzdWx0cyYmIWkuc2VhcmNoKHRoaXMuZGF0YSxlLm1vcmVSZXN1bHRzKSlyZXR1cm4gdGhpcy5uZXh0UGFnZVRva2Vuczt2YXIgdD1lLm91dHB1dFRva2VuO3JldHVybiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKSxyLnV0aWwuYXJyYXlFYWNoLmNhbGwodGhpcyx0LChmdW5jdGlvbihlKXt2YXIgdD1pLnNlYXJjaCh0aGlzLmRhdGEsZSk7dCYmKHRoaXMubmV4dFBhZ2VUb2tlbnM9dGhpcy5uZXh0UGFnZVRva2Vuc3x8W10sdGhpcy5uZXh0UGFnZVRva2Vucy5wdXNoKHQpKX0pKSx0aGlzLm5leHRQYWdlVG9rZW5zfX0pfSx7Ii4vY29yZSI6MTksam1lc3BhdGg6OTB9XSw2MTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vY29yZSIpO3IuU2VxdWVudGlhbEV4ZWN1dG9yPXIudXRpbC5pbmhlcml0KHtjb25zdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMuX2V2ZW50cz17fX0sbGlzdGVuZXJzOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9ldmVudHNbZV0/dGhpcy5fZXZlbnRzW2VdLnNsaWNlKDApOltdfSxvbjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuX2V2ZW50c1tlXT9uP3RoaXMuX2V2ZW50c1tlXS51bnNoaWZ0KHQpOnRoaXMuX2V2ZW50c1tlXS5wdXNoKHQpOnRoaXMuX2V2ZW50c1tlXT1bdF0sdGhpc30sb25Bc3luYzpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHQuX2lzQXN5bmM9ITAsdGhpcy5vbihlLHQsbil9LHJlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5fZXZlbnRzW2VdO2lmKG4pe2Zvcih2YXIgcj1uLmxlbmd0aCxvPS0xLGk9MDtpPHI7KytpKW5baV09PT10JiYobz1pKTtvPi0xJiZuLnNwbGljZShvLDEpfXJldHVybiB0aGlzfSxyZW1vdmVBbGxMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/ZGVsZXRlIHRoaXMuX2V2ZW50c1tlXTp0aGlzLl9ldmVudHM9e30sdGhpc30sZW1pdDpmdW5jdGlvbihlLHQsbil7bnx8KG49ZnVuY3Rpb24oKXt9KTt2YXIgcj10aGlzLmxpc3RlbmVycyhlKSxvPXIubGVuZ3RoO3JldHVybiB0aGlzLmNhbGxMaXN0ZW5lcnMocix0LG4pLG8+MH0sY2FsbExpc3RlbmVyczpmdW5jdGlvbihlLHQsbixvKXt2YXIgaT10aGlzLGE9b3x8bnVsbDtmdW5jdGlvbiBzKG8pe2lmKG8mJihhPXIudXRpbC5lcnJvcihhfHxuZXcgRXJyb3IsbyksaS5faGFsdEhhbmRsZXJzT25FcnJvcikpcmV0dXJuIG4uY2FsbChpLGEpO2kuY2FsbExpc3RlbmVycyhlLHQsbixhKX1mb3IoO2UubGVuZ3RoPjA7KXt2YXIgYz1lLnNoaWZ0KCk7aWYoYy5faXNBc3luYylyZXR1cm4gdm9pZCBjLmFwcGx5KGksdC5jb25jYXQoW3NdKSk7dHJ5e2MuYXBwbHkoaSx0KX1jYXRjaChlKXthPXIudXRpbC5lcnJvcihhfHxuZXcgRXJyb3IsZSl9aWYoYSYmaS5faGFsdEhhbmRsZXJzT25FcnJvcilyZXR1cm4gdm9pZCBuLmNhbGwoaSxhKX1uLmNhbGwoaSxhKX0sYWRkTGlzdGVuZXJzOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7cmV0dXJuIGUuX2V2ZW50cyYmKGU9ZS5fZXZlbnRzKSxyLnV0aWwuZWFjaChlLChmdW5jdGlvbihlLG4peyJmdW5jdGlvbiI9PXR5cGVvZiBuJiYobj1bbl0pLHIudXRpbC5hcnJheUVhY2gobiwoZnVuY3Rpb24obil7dC5vbihlLG4pfSkpfSkpLHR9LGFkZE5hbWVkTGlzdGVuZXI6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXNbZV09bix0aGlzLmFkZExpc3RlbmVyKHQsbixyKSx0aGlzfSxhZGROYW1lZEFzeW5jTGlzdGVuZXI6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG4uX2lzQXN5bmM9ITAsdGhpcy5hZGROYW1lZExpc3RlbmVyKGUsdCxuLHIpfSxhZGROYW1lZExpc3RlbmVyczpmdW5jdGlvbihlKXt2YXIgdD10aGlzO3JldHVybiBlKChmdW5jdGlvbigpe3QuYWRkTmFtZWRMaXN0ZW5lci5hcHBseSh0LGFyZ3VtZW50cyl9KSwoZnVuY3Rpb24oKXt0LmFkZE5hbWVkQXN5bmNMaXN0ZW5lci5hcHBseSh0LGFyZ3VtZW50cyl9KSksdGhpc319KSxyLlNlcXVlbnRpYWxFeGVjdXRvci5wcm90b3R5cGUuYWRkTGlzdGVuZXI9ci5TZXF1ZW50aWFsRXhlY3V0b3IucHJvdG90eXBlLm9uLHQuZXhwb3J0cz1yLlNlcXVlbnRpYWxFeGVjdXRvcn0seyIuL2NvcmUiOjE5fV0sNjI6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24obil7KGZ1bmN0aW9uKCl7dmFyIHI9ZSgiLi9jb3JlIiksaT1lKCIuL21vZGVsL2FwaSIpLGE9ZSgiLi9yZWdpb25fY29uZmlnIikscz1yLnV0aWwuaW5oZXJpdCxjPTAsdT1lKCIuL3JlZ2lvbi91dGlscyIpO3IuU2VydmljZT1zKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtpZighdGhpcy5sb2FkU2VydmljZUNsYXNzKXRocm93IHIudXRpbC5lcnJvcihuZXcgRXJyb3IsIlNlcnZpY2UgbXVzdCBiZSBjb25zdHJ1Y3RlZCB3aXRoIGBuZXcnIG9wZXJhdG9yIik7aWYoZSl7aWYoZS5yZWdpb24pe3ZhciB0PWUucmVnaW9uO3UuaXNGaXBzUmVnaW9uKHQpJiYoZS5yZWdpb249dS5nZXRSZWFsUmVnaW9uKHQpLGUudXNlRmlwc0VuZHBvaW50PSEwKSx1LmlzR2xvYmFsUmVnaW9uKHQpJiYoZS5yZWdpb249dS5nZXRSZWFsUmVnaW9uKHQpKX0iYm9vbGVhbiI9PXR5cGVvZiBlLnVzZUR1YWxzdGFjayYmImJvb2xlYW4iIT10eXBlb2YgZS51c2VEdWFsc3RhY2tFbmRwb2ludCYmKGUudXNlRHVhbHN0YWNrRW5kcG9pbnQ9ZS51c2VEdWFsc3RhY2spfXZhciBuPXRoaXMubG9hZFNlcnZpY2VDbGFzcyhlfHx7fSk7aWYobil7dmFyIG89ci51dGlsLmNvcHkoZSksaT1uZXcgbihlKTtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGksIl9vcmlnaW5hbENvbmZpZyIse2dldDpmdW5jdGlvbigpe3JldHVybiBvfSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLGkuX2NsaWVudElkPSsrYyxpfXRoaXMuaW5pdGlhbGl6ZShlKX0saW5pdGlhbGl6ZTpmdW5jdGlvbihlKXt2YXIgdD1yLmNvbmZpZ1t0aGlzLnNlcnZpY2VJZGVudGlmaWVyXTtpZih0aGlzLmNvbmZpZz1uZXcgci5Db25maWcoci5jb25maWcpLHQmJnRoaXMuY29uZmlnLnVwZGF0ZSh0LCEwKSxlJiZ0aGlzLmNvbmZpZy51cGRhdGUoZSwhMCksdGhpcy52YWxpZGF0ZVNlcnZpY2UoKSx0aGlzLmNvbmZpZy5lbmRwb2ludHx8YS5jb25maWd1cmVFbmRwb2ludCh0aGlzKSx0aGlzLmNvbmZpZy5lbmRwb2ludD10aGlzLmVuZHBvaW50RnJvbVRlbXBsYXRlKHRoaXMuY29uZmlnLmVuZHBvaW50KSx0aGlzLnNldEVuZHBvaW50KHRoaXMuY29uZmlnLmVuZHBvaW50KSxyLlNlcXVlbnRpYWxFeGVjdXRvci5jYWxsKHRoaXMpLHIuU2VydmljZS5hZGREZWZhdWx0TW9uaXRvcmluZ0xpc3RlbmVycyh0aGlzKSwodGhpcy5jb25maWcuY2xpZW50U2lkZU1vbml0b3Jpbmd8fHIuU2VydmljZS5fY2xpZW50U2lkZU1vbml0b3JpbmcpJiZ0aGlzLnB1Ymxpc2hlcil7dmFyIG89dGhpcy5wdWJsaXNoZXI7dGhpcy5hZGROYW1lZExpc3RlbmVyKCJQVUJMSVNIX0FQSV9DQUxMIiwiYXBpQ2FsbCIsKGZ1bmN0aW9uKGUpe24ubmV4dFRpY2soKGZ1bmN0aW9uKCl7by5ldmVudEhhbmRsZXIoZSl9KSl9KSksdGhpcy5hZGROYW1lZExpc3RlbmVyKCJQVUJMSVNIX0FQSV9BVFRFTVBUIiwiYXBpQ2FsbEF0dGVtcHQiLChmdW5jdGlvbihlKXtuLm5leHRUaWNrKChmdW5jdGlvbigpe28uZXZlbnRIYW5kbGVyKGUpfSkpfSkpfX0sdmFsaWRhdGVTZXJ2aWNlOmZ1bmN0aW9uKCl7fSxsb2FkU2VydmljZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0PWU7aWYoci51dGlsLmlzRW1wdHkodGhpcy5hcGkpKXtpZih0LmFwaUNvbmZpZylyZXR1cm4gci5TZXJ2aWNlLmRlZmluZVNlcnZpY2VBcGkodGhpcy5jb25zdHJ1Y3Rvcix0LmFwaUNvbmZpZyk7aWYodGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlcyl7KHQ9bmV3IHIuQ29uZmlnKHIuY29uZmlnKSkudXBkYXRlKGUsITApO3ZhciBuPXQuYXBpVmVyc2lvbnNbdGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlSWRlbnRpZmllcl07cmV0dXJuIG49bnx8dC5hcGlWZXJzaW9uLHRoaXMuZ2V0TGF0ZXN0U2VydmljZUNsYXNzKG4pfXJldHVybiBudWxsfXJldHVybiBudWxsfSxnZXRMYXRlc3RTZXJ2aWNlQ2xhc3M6ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dGhpcy5nZXRMYXRlc3RTZXJ2aWNlVmVyc2lvbihlKSxudWxsPT09dGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlc1tlXSYmci5TZXJ2aWNlLmRlZmluZVNlcnZpY2VBcGkodGhpcy5jb25zdHJ1Y3RvcixlKSx0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VzW2VdfSxnZXRMYXRlc3RTZXJ2aWNlVmVyc2lvbjpmdW5jdGlvbihlKXtpZighdGhpcy5jb25zdHJ1Y3Rvci5zZXJ2aWNlc3x8MD09PXRoaXMuY29uc3RydWN0b3Iuc2VydmljZXMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiTm8gc2VydmljZXMgZGVmaW5lZCBvbiAiK3RoaXMuY29uc3RydWN0b3Iuc2VydmljZUlkZW50aWZpZXIpO2lmKGU/ci51dGlsLmlzVHlwZShlLERhdGUpJiYoZT1yLnV0aWwuZGF0ZS5pc284NjAxKGUpLnNwbGl0KCJUIilbMF0pOmU9ImxhdGVzdCIsT2JqZWN0Lmhhc093blByb3BlcnR5KHRoaXMuY29uc3RydWN0b3Iuc2VydmljZXMsZSkpcmV0dXJuIGU7Zm9yKHZhciB0PU9iamVjdC5rZXlzKHRoaXMuY29uc3RydWN0b3Iuc2VydmljZXMpLnNvcnQoKSxuPW51bGwsbz10Lmxlbmd0aC0xO28+PTA7by0tKWlmKCIqIiE9PXRbb11bdFtvXS5sZW5ndGgtMV0mJihuPXRbb10pLHRbb10uc3Vic3RyKDAsMTApPD1lKXJldHVybiBuO3Rocm93IG5ldyBFcnJvcigiQ291bGQgbm90IGZpbmQgIit0aGlzLmNvbnN0cnVjdG9yLnNlcnZpY2VJZGVudGlmaWVyKyIgQVBJIHRvIHNhdGlzZnkgdmVyc2lvbiBjb25zdHJhaW50IGAiK2UrIiciKX0sYXBpOnt9LGRlZmF1bHRSZXRyeUNvdW50OjMsY3VzdG9taXplUmVxdWVzdHM6ZnVuY3Rpb24oZSl7aWYoZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNhbGxiYWNrIHR5cGUgJyIrbyhlKSsiJyBwcm92aWRlZCBpbiBjdXN0b21pemVSZXF1ZXN0cyIpO3RoaXMuY3VzdG9tUmVxdWVzdEhhbmRsZXI9ZX1lbHNlIHRoaXMuY3VzdG9tUmVxdWVzdEhhbmRsZXI9bnVsbH0sbWFrZVJlcXVlc3Q6ZnVuY3Rpb24oZSx0LG4pe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj10LHQ9bnVsbCksdD10fHx7fSx0aGlzLmNvbmZpZy5wYXJhbXMpe3ZhciBvPXRoaXMuYXBpLm9wZXJhdGlvbnNbZV07byYmKHQ9ci51dGlsLmNvcHkodCksci51dGlsLmVhY2godGhpcy5jb25maWcucGFyYW1zLChmdW5jdGlvbihlLG4pe28uaW5wdXQubWVtYmVyc1tlXSYmKHZvaWQgMCE9PXRbZV0mJm51bGwhPT10W2VdfHwodFtlXT1uKSl9KSkpfXZhciBpPW5ldyByLlJlcXVlc3QodGhpcyxlLHQpO3JldHVybiB0aGlzLmFkZEFsbFJlcXVlc3RMaXN0ZW5lcnMoaSksdGhpcy5hdHRhY2hNb25pdG9yaW5nRW1pdHRlcihpKSxuJiZpLnNlbmQobiksaX0sbWFrZVVuYXV0aGVudGljYXRlZFJlcXVlc3Q6ZnVuY3Rpb24oZSx0LG4peyJmdW5jdGlvbiI9PXR5cGVvZiB0JiYobj10LHQ9e30pO3ZhciByPXRoaXMubWFrZVJlcXVlc3QoZSx0KS50b1VuYXV0aGVudGljYXRlZCgpO3JldHVybiBuP3Iuc2VuZChuKTpyfSx3YWl0Rm9yOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbmV3IHIuUmVzb3VyY2VXYWl0ZXIodGhpcyxlKS53YWl0KHQsbil9LGFkZEFsbFJlcXVlc3RMaXN0ZW5lcnM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtyLmV2ZW50cyxyLkV2ZW50TGlzdGVuZXJzLkNvcmUsdGhpcy5zZXJ2aWNlSW50ZXJmYWNlKCksci5FdmVudExpc3RlbmVycy5Db3JlUG9zdF0sbj0wO248dC5sZW5ndGg7bisrKXRbbl0mJmUuYWRkTGlzdGVuZXJzKHRbbl0pO3RoaXMuY29uZmlnLnBhcmFtVmFsaWRhdGlvbnx8ZS5yZW1vdmVMaXN0ZW5lcigidmFsaWRhdGUiLHIuRXZlbnRMaXN0ZW5lcnMuQ29yZS5WQUxJREFURV9QQVJBTUVURVJTKSx0aGlzLmNvbmZpZy5sb2dnZXImJmUuYWRkTGlzdGVuZXJzKHIuRXZlbnRMaXN0ZW5lcnMuTG9nZ2VyKSx0aGlzLnNldHVwUmVxdWVzdExpc3RlbmVycyhlKSwiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY3VzdG9tUmVxdWVzdEhhbmRsZXImJnRoaXMuY29uc3RydWN0b3IucHJvdG90eXBlLmN1c3RvbVJlcXVlc3RIYW5kbGVyKGUpLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLCJjdXN0b21SZXF1ZXN0SGFuZGxlciIpJiYiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5jdXN0b21SZXF1ZXN0SGFuZGxlciYmdGhpcy5jdXN0b21SZXF1ZXN0SGFuZGxlcihlKX0sYXBpQ2FsbEV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuc2VydmljZS5hcGkub3BlcmF0aW9uc1tlLm9wZXJhdGlvbl0sbj17VHlwZToiQXBpQ2FsbCIsQXBpOnQ/dC5uYW1lOmUub3BlcmF0aW9uLFZlcnNpb246MSxTZXJ2aWNlOmUuc2VydmljZS5hcGkuc2VydmljZUlkfHxlLnNlcnZpY2UuYXBpLmVuZHBvaW50UHJlZml4LFJlZ2lvbjplLmh0dHBSZXF1ZXN0LnJlZ2lvbixNYXhSZXRyaWVzRXhjZWVkZWQ6MCxVc2VyQWdlbnQ6ZS5odHRwUmVxdWVzdC5nZXRVc2VyQWdlbnQoKX0scj1lLnJlc3BvbnNlO2lmKHIuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUmJihuLkZpbmFsSHR0cFN0YXR1c0NvZGU9ci5odHRwUmVzcG9uc2Uuc3RhdHVzQ29kZSksci5lcnJvcil7dmFyIG89ci5lcnJvcjtyLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlPjI5OT8oby5jb2RlJiYobi5GaW5hbEF3c0V4Y2VwdGlvbj1vLmNvZGUpLG8ubWVzc2FnZSYmKG4uRmluYWxBd3NFeGNlcHRpb25NZXNzYWdlPW8ubWVzc2FnZSkpOigoby5jb2RlfHxvLm5hbWUpJiYobi5GaW5hbFNka0V4Y2VwdGlvbj1vLmNvZGV8fG8ubmFtZSksby5tZXNzYWdlJiYobi5GaW5hbFNka0V4Y2VwdGlvbk1lc3NhZ2U9by5tZXNzYWdlKSl9cmV0dXJuIG59LGFwaUF0dGVtcHRFdmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnNlcnZpY2UuYXBpLm9wZXJhdGlvbnNbZS5vcGVyYXRpb25dLG49e1R5cGU6IkFwaUNhbGxBdHRlbXB0IixBcGk6dD90Lm5hbWU6ZS5vcGVyYXRpb24sVmVyc2lvbjoxLFNlcnZpY2U6ZS5zZXJ2aWNlLmFwaS5zZXJ2aWNlSWR8fGUuc2VydmljZS5hcGkuZW5kcG9pbnRQcmVmaXgsRnFkbjplLmh0dHBSZXF1ZXN0LmVuZHBvaW50Lmhvc3RuYW1lLFVzZXJBZ2VudDplLmh0dHBSZXF1ZXN0LmdldFVzZXJBZ2VudCgpfSxyPWUucmVzcG9uc2U7cmV0dXJuIHIuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUmJihuLkh0dHBTdGF0dXNDb2RlPXIuaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGUpLCFlLl91bkF1dGhlbnRpY2F0ZWQmJmUuc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMmJmUuc2VydmljZS5jb25maWcuY3JlZGVudGlhbHMuYWNjZXNzS2V5SWQmJihuLkFjY2Vzc0tleT1lLnNlcnZpY2UuY29uZmlnLmNyZWRlbnRpYWxzLmFjY2Vzc0tleUlkKSxyLmh0dHBSZXNwb25zZS5oZWFkZXJzPyhlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl0mJihuLlNlc3Npb25Ub2tlbj1lLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl0pLHIuaHR0cFJlc3BvbnNlLmhlYWRlcnNbIngtYW16bi1yZXF1ZXN0aWQiXSYmKG4uWEFtem5SZXF1ZXN0SWQ9ci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXpuLXJlcXVlc3RpZCJdKSxyLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1yZXF1ZXN0LWlkIl0mJihuLlhBbXpSZXF1ZXN0SWQ9ci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXotcmVxdWVzdC1pZCJdKSxyLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtei1pZC0yIl0mJihuLlhBbXpJZDI9ci5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXotaWQtMiJdKSxuKTpufSxhdHRlbXB0RmFpbEV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuYXBpQXR0ZW1wdEV2ZW50KGUpLG49ZS5yZXNwb25zZSxyPW4uZXJyb3I7cmV0dXJuIG4uaHR0cFJlc3BvbnNlLnN0YXR1c0NvZGU+Mjk5PyhyLmNvZGUmJih0LkF3c0V4Y2VwdGlvbj1yLmNvZGUpLHIubWVzc2FnZSYmKHQuQXdzRXhjZXB0aW9uTWVzc2FnZT1yLm1lc3NhZ2UpKTooKHIuY29kZXx8ci5uYW1lKSYmKHQuU2RrRXhjZXB0aW9uPXIuY29kZXx8ci5uYW1lKSxyLm1lc3NhZ2UmJih0LlNka0V4Y2VwdGlvbk1lc3NhZ2U9ci5tZXNzYWdlKSksdH0sYXR0YWNoTW9uaXRvcmluZ0VtaXR0ZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbixvLGksYSxzLGM9MCx1PXRoaXM7ZS5vbigidmFsaWRhdGUiLChmdW5jdGlvbigpe2k9ci51dGlsLnJlYWxDbG9jay5ub3coKSxzPURhdGUubm93KCl9KSwhMCksZS5vbigic2lnbiIsKGZ1bmN0aW9uKCl7bj1yLnV0aWwucmVhbENsb2NrLm5vdygpLHQ9RGF0ZS5ub3coKSxhPWUuaHR0cFJlcXVlc3QucmVnaW9uLGMrK30pLCEwKSxlLm9uKCJ2YWxpZGF0ZVJlc3BvbnNlIiwoZnVuY3Rpb24oKXtvPU1hdGgucm91bmQoci51dGlsLnJlYWxDbG9jay5ub3coKS1uKX0pKSxlLmFkZE5hbWVkTGlzdGVuZXIoIkFQSV9DQUxMX0FUVEVNUFQiLCJzdWNjZXNzIiwoZnVuY3Rpb24oKXt2YXIgbj11LmFwaUF0dGVtcHRFdmVudChlKTtuLlRpbWVzdGFtcD10LG4uQXR0ZW1wdExhdGVuY3k9bz49MD9vOjAsbi5SZWdpb249YSx1LmVtaXQoImFwaUNhbGxBdHRlbXB0Iixbbl0pfSkpLGUuYWRkTmFtZWRMaXN0ZW5lcigiQVBJX0NBTExfQVRURU1QVF9SRVRSWSIsInJldHJ5IiwoZnVuY3Rpb24oKXt2YXIgaT11LmF0dGVtcHRGYWlsRXZlbnQoZSk7aS5UaW1lc3RhbXA9dCxvPW98fE1hdGgucm91bmQoci51dGlsLnJlYWxDbG9jay5ub3coKS1uKSxpLkF0dGVtcHRMYXRlbmN5PW8+PTA/bzowLGkuUmVnaW9uPWEsdS5lbWl0KCJhcGlDYWxsQXR0ZW1wdCIsW2ldKX0pKSxlLmFkZE5hbWVkTGlzdGVuZXIoIkFQSV9DQUxMIiwiY29tcGxldGUiLChmdW5jdGlvbigpe3ZhciB0PXUuYXBpQ2FsbEV2ZW50KGUpO2lmKHQuQXR0ZW1wdENvdW50PWMsISh0LkF0dGVtcHRDb3VudDw9MCkpe3QuVGltZXN0YW1wPXM7dmFyIG49TWF0aC5yb3VuZChyLnV0aWwucmVhbENsb2NrLm5vdygpLWkpO3QuTGF0ZW5jeT1uPj0wP246MDt2YXIgbz1lLnJlc3BvbnNlO28uZXJyb3ImJm8uZXJyb3IucmV0cnlhYmxlJiYibnVtYmVyIj09dHlwZW9mIG8ucmV0cnlDb3VudCYmIm51bWJlciI9PXR5cGVvZiBvLm1heFJldHJpZXMmJm8ucmV0cnlDb3VudD49by5tYXhSZXRyaWVzJiYodC5NYXhSZXRyaWVzRXhjZWVkZWQ9MSksdS5lbWl0KCJhcGlDYWxsIixbdF0pfX0pKX0sc2V0dXBSZXF1ZXN0TGlzdGVuZXJzOmZ1bmN0aW9uKGUpe30sZ2V0U2lnbmluZ05hbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcGkuc2lnbmluZ05hbWV8fHRoaXMuYXBpLmVuZHBvaW50UHJlZml4fSxnZXRTaWduZXJDbGFzczpmdW5jdGlvbihlKXt2YXIgdCxuPW51bGwsbz0iIjtyZXR1cm4gZSYmKG89KG49KGUuc2VydmljZS5hcGkub3BlcmF0aW9uc3x8e30pW2Uub3BlcmF0aW9uXXx8bnVsbCk/bi5hdXRodHlwZToiIiksdD10aGlzLmNvbmZpZy5zaWduYXR1cmVWZXJzaW9uP3RoaXMuY29uZmlnLnNpZ25hdHVyZVZlcnNpb246InY0Ij09PW98fCJ2NC11bnNpZ25lZC1ib2R5Ij09PW8/InY0IjoiYmVhcmVyIj09PW8/ImJlYXJlciI6dGhpcy5hcGkuc2lnbmF0dXJlVmVyc2lvbixyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5nZXRWZXJzaW9uKHQpfSxzZXJ2aWNlSW50ZXJmYWNlOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuYXBpLnByb3RvY29sKXtjYXNlImVjMiI6Y2FzZSJxdWVyeSI6cmV0dXJuIHIuRXZlbnRMaXN0ZW5lcnMuUXVlcnk7Y2FzZSJqc29uIjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5Kc29uO2Nhc2UicmVzdC1qc29uIjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5SZXN0SnNvbjtjYXNlInJlc3QteG1sIjpyZXR1cm4gci5FdmVudExpc3RlbmVycy5SZXN0WG1sfWlmKHRoaXMuYXBpLnByb3RvY29sKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzZXJ2aWNlIGBwcm90b2NvbCcgIit0aGlzLmFwaS5wcm90b2NvbCsiIGluIEFQSSBjb25maWciKX0sc3VjY2Vzc2Z1bFJlc3BvbnNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmh0dHBSZXNwb25zZS5zdGF0dXNDb2RlPDMwMH0sbnVtUmV0cmllczpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzLmNvbmZpZy5tYXhSZXRyaWVzP3RoaXMuY29uZmlnLm1heFJldHJpZXM6dGhpcy5kZWZhdWx0UmV0cnlDb3VudH0scmV0cnlEZWxheXM6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci51dGlsLmNhbGN1bGF0ZVJldHJ5RGVsYXkoZSx0aGlzLmNvbmZpZy5yZXRyeURlbGF5T3B0aW9ucyx0KX0scmV0cnlhYmxlRXJyb3I6ZnVuY3Rpb24oZSl7cmV0dXJuISF0aGlzLnRpbWVvdXRFcnJvcihlKXx8ISF0aGlzLm5ldHdvcmtpbmdFcnJvcihlKXx8ISF0aGlzLmV4cGlyZWRDcmVkZW50aWFsc0Vycm9yKGUpfHwhIXRoaXMudGhyb3R0bGVkRXJyb3IoZSl8fGUuc3RhdHVzQ29kZT49NTAwfSxuZXR3b3JraW5nRXJyb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIk5ldHdvcmtpbmdFcnJvciI9PT1lLmNvZGV9LHRpbWVvdXRFcnJvcjpmdW5jdGlvbihlKXtyZXR1cm4iVGltZW91dEVycm9yIj09PWUuY29kZX0sZXhwaXJlZENyZWRlbnRpYWxzRXJyb3I6ZnVuY3Rpb24oZSl7cmV0dXJuIkV4cGlyZWRUb2tlbkV4Y2VwdGlvbiI9PT1lLmNvZGV9LGNsb2NrU2tld0Vycm9yOmZ1bmN0aW9uKGUpe3N3aXRjaChlLmNvZGUpe2Nhc2UiUmVxdWVzdFRpbWVUb29Ta2V3ZWQiOmNhc2UiUmVxdWVzdEV4cGlyZWQiOmNhc2UiSW52YWxpZFNpZ25hdHVyZUV4Y2VwdGlvbiI6Y2FzZSJTaWduYXR1cmVEb2VzTm90TWF0Y2giOmNhc2UiQXV0aEZhaWx1cmUiOmNhc2UiUmVxdWVzdEluVGhlRnV0dXJlIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sZ2V0U2tld0NvcnJlY3RlZERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERhdGUoRGF0ZS5ub3coKSt0aGlzLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldCl9LGFwcGx5Q2xvY2tPZmZzZXQ6ZnVuY3Rpb24oZSl7ZSYmKHRoaXMuY29uZmlnLnN5c3RlbUNsb2NrT2Zmc2V0PWUtRGF0ZS5ub3coKSl9LGlzQ2xvY2tTa2V3ZWQ6ZnVuY3Rpb24oZSl7aWYoZSlyZXR1cm4gTWF0aC5hYnModGhpcy5nZXRTa2V3Q29ycmVjdGVkRGF0ZSgpLmdldFRpbWUoKS1lKT49M2U1fSx0aHJvdHRsZWRFcnJvcjpmdW5jdGlvbihlKXtpZig0Mjk9PT1lLnN0YXR1c0NvZGUpcmV0dXJuITA7c3dpdGNoKGUuY29kZSl7Y2FzZSJQcm92aXNpb25lZFRocm91Z2hwdXRFeGNlZWRlZEV4Y2VwdGlvbiI6Y2FzZSJUaHJvdHRsaW5nIjpjYXNlIlRocm90dGxpbmdFeGNlcHRpb24iOmNhc2UiUmVxdWVzdExpbWl0RXhjZWVkZWQiOmNhc2UiUmVxdWVzdFRocm90dGxlZCI6Y2FzZSJSZXF1ZXN0VGhyb3R0bGVkRXhjZXB0aW9uIjpjYXNlIlRvb01hbnlSZXF1ZXN0c0V4Y2VwdGlvbiI6Y2FzZSJUcmFuc2FjdGlvbkluUHJvZ3Jlc3NFeGNlcHRpb24iOmNhc2UiRUMyVGhyb3R0bGVkRXhjZXB0aW9uIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX0sZW5kcG9pbnRGcm9tVGVtcGxhdGU6ZnVuY3Rpb24oZSl7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiBlO3ZhciB0PWU7cmV0dXJuIHQ9KHQ9KHQ9dC5yZXBsYWNlKC9ce3NlcnZpY2VcfS9nLHRoaXMuYXBpLmVuZHBvaW50UHJlZml4KSkucmVwbGFjZSgvXHtyZWdpb25cfS9nLHRoaXMuY29uZmlnLnJlZ2lvbikpLnJlcGxhY2UoL1x7c2NoZW1lXH0vZyx0aGlzLmNvbmZpZy5zc2xFbmFibGVkPyJodHRwcyI6Imh0dHAiKX0sc2V0RW5kcG9pbnQ6ZnVuY3Rpb24oZSl7dGhpcy5lbmRwb2ludD1uZXcgci5FbmRwb2ludChlLHRoaXMuY29uZmlnKX0scGFnaW5hdGlvbkNvbmZpZzpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuYXBpLm9wZXJhdGlvbnNbZV0ucGFnaW5hdG9yO2lmKCFuKXtpZih0KXt2YXIgbz1uZXcgRXJyb3I7dGhyb3cgci51dGlsLmVycm9yKG8sIk5vIHBhZ2luYXRpb24gY29uZmlndXJhdGlvbiBmb3IgIitlKX1yZXR1cm4gbnVsbH1yZXR1cm4gbn19KSxyLnV0aWwudXBkYXRlKHIuU2VydmljZSx7ZGVmaW5lTWV0aG9kczpmdW5jdGlvbihlKXtyLnV0aWwuZWFjaChlLnByb3RvdHlwZS5hcGkub3BlcmF0aW9ucywoZnVuY3Rpb24odCl7ZS5wcm90b3R5cGVbdF18fCgibm9uZSI9PT1lLnByb3RvdHlwZS5hcGkub3BlcmF0aW9uc1t0XS5hdXRodHlwZT9lLnByb3RvdHlwZVt0XT1mdW5jdGlvbihlLG4pe3JldHVybiB0aGlzLm1ha2VVbmF1dGhlbnRpY2F0ZWRSZXF1ZXN0KHQsZSxuKX06ZS5wcm90b3R5cGVbdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdGhpcy5tYWtlUmVxdWVzdCh0LGUsbil9KX0pKX0sZGVmaW5lU2VydmljZTpmdW5jdGlvbihlLHQsbil7ci5TZXJ2aWNlLl9zZXJ2aWNlTWFwW2VdPSEwLEFycmF5LmlzQXJyYXkodCl8fChuPXQsdD1bXSk7dmFyIG89cyhyLlNlcnZpY2Usbnx8e30pO2lmKCJzdHJpbmciPT10eXBlb2YgZSl7ci5TZXJ2aWNlLmFkZFZlcnNpb25zKG8sdCk7dmFyIGk9by5zZXJ2aWNlSWRlbnRpZmllcnx8ZTtvLnNlcnZpY2VJZGVudGlmaWVyPWl9ZWxzZSBvLnByb3RvdHlwZS5hcGk9ZSxyLlNlcnZpY2UuZGVmaW5lTWV0aG9kcyhvKTtpZihyLlNlcXVlbnRpYWxFeGVjdXRvci5jYWxsKHRoaXMucHJvdG90eXBlKSwhdGhpcy5wcm90b3R5cGUucHVibGlzaGVyJiZyLnV0aWwuY2xpZW50U2lkZU1vbml0b3Jpbmcpe3ZhciBhPXIudXRpbC5jbGllbnRTaWRlTW9uaXRvcmluZy5QdWJsaXNoZXIsYz0oMCxyLnV0aWwuY2xpZW50U2lkZU1vbml0b3JpbmcuY29uZmlnUHJvdmlkZXIpKCk7dGhpcy5wcm90b3R5cGUucHVibGlzaGVyPW5ldyBhKGMpLGMuZW5hYmxlZCYmKHIuU2VydmljZS5fY2xpZW50U2lkZU1vbml0b3Jpbmc9ITApfXJldHVybiByLlNlcXVlbnRpYWxFeGVjdXRvci5jYWxsKG8ucHJvdG90eXBlKSxyLlNlcnZpY2UuYWRkRGVmYXVsdE1vbml0b3JpbmdMaXN0ZW5lcnMoby5wcm90b3R5cGUpLG99LGFkZFZlcnNpb25zOmZ1bmN0aW9uKGUsdCl7QXJyYXkuaXNBcnJheSh0KXx8KHQ9W3RdKSxlLnNlcnZpY2VzPWUuc2VydmljZXN8fHt9O2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXZvaWQgMD09PWUuc2VydmljZXNbdFtuXV0mJihlLnNlcnZpY2VzW3Rbbl1dPW51bGwpO2UuYXBpVmVyc2lvbnM9T2JqZWN0LmtleXMoZS5zZXJ2aWNlcykuc29ydCgpfSxkZWZpbmVTZXJ2aWNlQXBpOmZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1zKGUse3NlcnZpY2VJZGVudGlmaWVyOmUuc2VydmljZUlkZW50aWZpZXJ9KTtmdW5jdGlvbiBhKHQpe3QuaXNBcGk/by5wcm90b3R5cGUuYXBpPXQ6by5wcm90b3R5cGUuYXBpPW5ldyBpKHQse3NlcnZpY2VJZGVudGlmaWVyOmUuc2VydmljZUlkZW50aWZpZXJ9KX1pZigic3RyaW5nIj09dHlwZW9mIHQpe2lmKG4pYShuKTtlbHNlIHRyeXthKHIuYXBpTG9hZGVyKGUuc2VydmljZUlkZW50aWZpZXIsdCkpfWNhdGNoKG4pe3Rocm93IHIudXRpbC5lcnJvcihuLHttZXNzYWdlOiJDb3VsZCBub3QgZmluZCBBUEkgY29uZmlndXJhdGlvbiAiK2Uuc2VydmljZUlkZW50aWZpZXIrIi0iK3R9KX1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZS5zZXJ2aWNlcyx0KXx8KGUuYXBpVmVyc2lvbnM9ZS5hcGlWZXJzaW9ucy5jb25jYXQodCkuc29ydCgpKSxlLnNlcnZpY2VzW3RdPW99ZWxzZSBhKHQpO3JldHVybiByLlNlcnZpY2UuZGVmaW5lTWV0aG9kcyhvKSxvfSxoYXNTZXJ2aWNlOmZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoci5TZXJ2aWNlLl9zZXJ2aWNlTWFwLGUpfSxhZGREZWZhdWx0TW9uaXRvcmluZ0xpc3RlbmVyczpmdW5jdGlvbihlKXtlLmFkZE5hbWVkTGlzdGVuZXIoIk1PTklUT1JfRVZFTlRTX0JVQkJMRSIsImFwaUNhbGxBdHRlbXB0IiwoZnVuY3Rpb24odCl7dmFyIG49T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO24uX2V2ZW50cyYmbi5lbWl0KCJhcGlDYWxsQXR0ZW1wdCIsW3RdKX0pKSxlLmFkZE5hbWVkTGlzdGVuZXIoIkNBTExfRVZFTlRTX0JVQkJMRSIsImFwaUNhbGwiLChmdW5jdGlvbih0KXt2YXIgbj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7bi5fZXZlbnRzJiZuLmVtaXQoImFwaUNhbGwiLFt0XSl9KSl9LF9zZXJ2aWNlTWFwOnt9fSksci51dGlsLm1peGluKHIuU2VydmljZSxyLlNlcXVlbnRpYWxFeGVjdXRvciksdC5leHBvcnRzPXIuU2VydmljZX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsZSgiX3Byb2Nlc3MiKSl9LHsiLi9jb3JlIjoxOSwiLi9tb2RlbC9hcGkiOjQwLCIuL3JlZ2lvbi91dGlscyI6NTUsIi4vcmVnaW9uX2NvbmZpZyI6NTYsX3Byb2Nlc3M6OTF9XSw2MzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPWUoIi4uL2NvbmZpZ19yZWdpb25hbF9lbmRwb2ludCIpO3IudXRpbC51cGRhdGUoci5TVFMucHJvdG90eXBlLHtjcmVkZW50aWFsc0Zyb206ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT8odHx8KHQ9bmV3IHIuVGVtcG9yYXJ5Q3JlZGVudGlhbHMpLHQuZXhwaXJlZD0hMSx0LmFjY2Vzc0tleUlkPWUuQ3JlZGVudGlhbHMuQWNjZXNzS2V5SWQsdC5zZWNyZXRBY2Nlc3NLZXk9ZS5DcmVkZW50aWFscy5TZWNyZXRBY2Nlc3NLZXksdC5zZXNzaW9uVG9rZW49ZS5DcmVkZW50aWFscy5TZXNzaW9uVG9rZW4sdC5leHBpcmVUaW1lPWUuQ3JlZGVudGlhbHMuRXhwaXJhdGlvbix0KTpudWxsfSxhc3N1bWVSb2xlV2l0aFdlYklkZW50aXR5OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubWFrZVVuYXV0aGVudGljYXRlZFJlcXVlc3QoImFzc3VtZVJvbGVXaXRoV2ViSWRlbnRpdHkiLGUsdCl9LGFzc3VtZVJvbGVXaXRoU0FNTDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm1ha2VVbmF1dGhlbnRpY2F0ZWRSZXF1ZXN0KCJhc3N1bWVSb2xlV2l0aFNBTUwiLGUsdCl9LHNldHVwUmVxdWVzdExpc3RlbmVyczpmdW5jdGlvbihlKXtlLmFkZExpc3RlbmVyKCJ2YWxpZGF0ZSIsdGhpcy5vcHRJblJlZ2lvbmFsRW5kcG9pbnQsITApfSxvcHRJblJlZ2lvbmFsRW5kcG9pbnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLG49dC5jb25maWc7aWYobi5zdHNSZWdpb25hbEVuZHBvaW50cz1vKHQuX29yaWdpbmFsQ29uZmlnLHtlbnY6IkFXU19TVFNfUkVHSU9OQUxfRU5EUE9JTlRTIixzaGFyZWRDb25maWc6InN0c19yZWdpb25hbF9lbmRwb2ludHMiLGNsaWVudENvbmZpZzoic3RzUmVnaW9uYWxFbmRwb2ludHMifSksInJlZ2lvbmFsIj09PW4uc3RzUmVnaW9uYWxFbmRwb2ludHMmJnQuaXNHbG9iYWxFbmRwb2ludCl7aWYoIW4ucmVnaW9uKXRocm93IHIudXRpbC5lcnJvcihuZXcgRXJyb3Ise2NvZGU6IkNvbmZpZ0Vycm9yIixtZXNzYWdlOiJNaXNzaW5nIHJlZ2lvbiBpbiBjb25maWcifSk7dmFyIGk9bi5lbmRwb2ludC5pbmRleE9mKCIuYW1hem9uYXdzLmNvbSIpLGE9bi5lbmRwb2ludC5zdWJzdHJpbmcoMCxpKSsiLiIrbi5yZWdpb24rbi5lbmRwb2ludC5zdWJzdHJpbmcoaSk7ZS5odHRwUmVxdWVzdC51cGRhdGVFbmRwb2ludChhKSxlLmh0dHBSZXF1ZXN0LnJlZ2lvbj1uLnJlZ2lvbn19fSl9LHsiLi4vY29uZmlnX3JlZ2lvbmFsX2VuZHBvaW50IjoxOCwiLi4vY29yZSI6MTl9XSw2NDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKTtyLlNpZ25lcnMuQmVhcmVyPXIudXRpbC5pbmhlcml0KHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXtyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5jYWxsKHRoaXMsZSl9LGFkZEF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSl7dGhpcy5yZXF1ZXN0LmhlYWRlcnMuQXV0aG9yaXphdGlvbj0iQmVhcmVyICIrZS50b2tlbn19KX0seyIuLi9jb3JlIjoxOX1dLDY1OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQsaT0icHJlc2lnbmVkLWV4cGlyZXMiO2Z1bmN0aW9uIGEoZSl7dmFyIHQ9ZS5odHRwUmVxdWVzdC5oZWFkZXJzW2ldLG49ZS5zZXJ2aWNlLmdldFNpZ25lckNsYXNzKGUpO2lmKGRlbGV0ZSBlLmh0dHBSZXF1ZXN0LmhlYWRlcnNbIlVzZXItQWdlbnQiXSxkZWxldGUgZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1Vc2VyLUFnZW50Il0sbj09PXIuU2lnbmVycy5WNCl7aWYodD42MDQ4MDApdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcix7Y29kZToiSW52YWxpZEV4cGlyeVRpbWUiLG1lc3NhZ2U6IlByZXNpZ25pbmcgZG9lcyBub3Qgc3VwcG9ydCBleHBpcnkgdGltZSBncmVhdGVyIHRoYW4gYSB3ZWVrIHdpdGggU2lnVjQgc2lnbmluZy4iLHJldHJ5YWJsZTohMX0pO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXT10fWVsc2V7aWYobiE9PXIuU2lnbmVycy5TMyl0aHJvdyByLnV0aWwuZXJyb3IobmV3IEVycm9yLHttZXNzYWdlOiJQcmVzaWduaW5nIG9ubHkgc3VwcG9ydHMgUzMgb3IgU2lnVjQgc2lnbmluZy4iLGNvZGU6IlVuc3VwcG9ydGVkU2lnbmVyIixyZXRyeWFibGU6ITF9KTt2YXIgbz1lLnNlcnZpY2U/ZS5zZXJ2aWNlLmdldFNrZXdDb3JyZWN0ZWREYXRlKCk6ci51dGlsLmRhdGUuZ2V0RGF0ZSgpO2UuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXT1wYXJzZUludChyLnV0aWwuZGF0ZS51bml4VGltZXN0YW1wKG8pK3QsMTApLnRvU3RyaW5nKCl9fWZ1bmN0aW9uIHMoZSl7dmFyIHQ9ZS5odHRwUmVxdWVzdC5lbmRwb2ludCxuPXIudXRpbC51cmxQYXJzZShlLmh0dHBSZXF1ZXN0LnBhdGgpLG89e307bi5zZWFyY2gmJihvPXIudXRpbC5xdWVyeVN0cmluZ1BhcnNlKG4uc2VhcmNoLnN1YnN0cigxKSkpO3ZhciBhPWUuaHR0cFJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uLnNwbGl0KCIgIik7aWYoIkFXUyI9PT1hWzBdKWE9YVsxXS5zcGxpdCgiOiIpLG8uU2lnbmF0dXJlPWEucG9wKCksby5BV1NBY2Nlc3NLZXlJZD1hLmpvaW4oIjoiKSxyLnV0aWwuZWFjaChlLmh0dHBSZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7ZT09PWkmJihlPSJFeHBpcmVzIiksMD09PWUuaW5kZXhPZigieC1hbXotbWV0YS0iKSYmKGRlbGV0ZSBvW2VdLGU9ZS50b0xvd2VyQ2FzZSgpKSxvW2VdPXR9KSksZGVsZXRlIGUuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXSxkZWxldGUgby5BdXRob3JpemF0aW9uLGRlbGV0ZSBvLkhvc3Q7ZWxzZSBpZigiQVdTNC1ITUFDLVNIQTI1NiI9PT1hWzBdKXthLnNoaWZ0KCk7dmFyIHM9YS5qb2luKCIgIikubWF0Y2goL1NpZ25hdHVyZT0oLio/KSg/Oix8XHN8XHI/XG58JCkvKVsxXTtvWyJYLUFtei1TaWduYXR1cmUiXT1zLGRlbGV0ZSBvLkV4cGlyZXN9dC5wYXRobmFtZT1uLnBhdGhuYW1lLHQuc2VhcmNoPXIudXRpbC5xdWVyeVBhcmFtc1RvU3RyaW5nKG8pfXIuU2lnbmVycy5QcmVzaWduPW8oe3NpZ246ZnVuY3Rpb24oZSx0LG4pe2lmKGUuaHR0cFJlcXVlc3QuaGVhZGVyc1tpXT10fHwzNjAwLGUub24oImJ1aWxkIixhKSxlLm9uKCJzaWduIixzKSxlLnJlbW92ZUxpc3RlbmVyKCJhZnRlckJ1aWxkIixyLkV2ZW50TGlzdGVuZXJzLkNvcmUuU0VUX0NPTlRFTlRfTEVOR1RIKSxlLnJlbW92ZUxpc3RlbmVyKCJhZnRlckJ1aWxkIixyLkV2ZW50TGlzdGVuZXJzLkNvcmUuQ09NUFVURV9TSEEyNTYpLGUuZW1pdCgiYmVmb3JlUHJlc2lnbiIsW2VdKSwhbil7aWYoZS5idWlsZCgpLGUucmVzcG9uc2UuZXJyb3IpdGhyb3cgZS5yZXNwb25zZS5lcnJvcjtyZXR1cm4gci51dGlsLnVybEZvcm1hdChlLmh0dHBSZXF1ZXN0LmVuZHBvaW50KX1lLmJ1aWxkKChmdW5jdGlvbigpe3RoaXMucmVzcG9uc2UuZXJyb3I/bih0aGlzLnJlc3BvbnNlLmVycm9yKTpuKG51bGwsci51dGlsLnVybEZvcm1hdChlLmh0dHBSZXF1ZXN0LmVuZHBvaW50KSl9KSl9fSksdC5leHBvcnRzPXIuU2lnbmVycy5QcmVzaWdufSx7Ii4uL2NvcmUiOjE5fV0sNjY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdDtyLlNpZ25lcnMuUmVxdWVzdFNpZ25lcj1vKHtjb25zdHJ1Y3RvcjpmdW5jdGlvbihlKXt0aGlzLnJlcXVlc3Q9ZX0sc2V0U2VydmljZUNsaWVudElkOmZ1bmN0aW9uKGUpe3RoaXMuc2VydmljZUNsaWVudElkPWV9LGdldFNlcnZpY2VDbGllbnRJZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNlcnZpY2VDbGllbnRJZH19KSxyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5nZXRWZXJzaW9uPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlInYyIjpyZXR1cm4gci5TaWduZXJzLlYyO2Nhc2UidjMiOnJldHVybiByLlNpZ25lcnMuVjM7Y2FzZSJzM3Y0IjpjYXNlInY0IjpyZXR1cm4gci5TaWduZXJzLlY0O2Nhc2UiczMiOnJldHVybiByLlNpZ25lcnMuUzM7Y2FzZSJ2M2h0dHBzIjpyZXR1cm4gci5TaWduZXJzLlYzSHR0cHM7Y2FzZSJiZWFyZXIiOnJldHVybiByLlNpZ25lcnMuQmVhcmVyfXRocm93IG5ldyBFcnJvcigiVW5rbm93biBzaWduaW5nIHZlcnNpb24gIitlKX0sZSgiLi92MiIpLGUoIi4vdjMiKSxlKCIuL3YzaHR0cHMiKSxlKCIuL3Y0IiksZSgiLi9zMyIpLGUoIi4vcHJlc2lnbiIpLGUoIi4vYmVhcmVyIil9LHsiLi4vY29yZSI6MTksIi4vYmVhcmVyIjo2NCwiLi9wcmVzaWduIjo2NSwiLi9zMyI6NjcsIi4vdjIiOjY4LCIuL3YzIjo2OSwiLi92M2h0dHBzIjo3MCwiLi92NCI6NzF9XSw2NzpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuU2lnbmVycy5TMz1vKHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHtzdWJSZXNvdXJjZXM6e2FjbDoxLGFjY2VsZXJhdGU6MSxhbmFseXRpY3M6MSxjb3JzOjEsbGlmZWN5Y2xlOjEsZGVsZXRlOjEsaW52ZW50b3J5OjEsbG9jYXRpb246MSxsb2dnaW5nOjEsbWV0cmljczoxLG5vdGlmaWNhdGlvbjoxLHBhcnROdW1iZXI6MSxwb2xpY3k6MSxyZXF1ZXN0UGF5bWVudDoxLHJlcGxpY2F0aW9uOjEscmVzdG9yZToxLHRhZ2dpbmc6MSx0b3JyZW50OjEsdXBsb2FkSWQ6MSx1cGxvYWRzOjEsdmVyc2lvbklkOjEsdmVyc2lvbmluZzoxLHZlcnNpb25zOjEsd2Vic2l0ZToxfSxyZXNwb25zZUhlYWRlcnM6eyJyZXNwb25zZS1jb250ZW50LXR5cGUiOjEsInJlc3BvbnNlLWNvbnRlbnQtbGFuZ3VhZ2UiOjEsInJlc3BvbnNlLWV4cGlyZXMiOjEsInJlc3BvbnNlLWNhY2hlLWNvbnRyb2wiOjEsInJlc3BvbnNlLWNvbnRlbnQtZGlzcG9zaXRpb24iOjEsInJlc3BvbnNlLWNvbnRlbnQtZW5jb2RpbmciOjF9LGFkZEF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSx0KXt0aGlzLnJlcXVlc3QuaGVhZGVyc1sicHJlc2lnbmVkLWV4cGlyZXMiXXx8KHRoaXMucmVxdWVzdC5oZWFkZXJzWyJYLUFtei1EYXRlIl09ci51dGlsLmRhdGUucmZjODIyKHQpKSxlLnNlc3Npb25Ub2tlbiYmKHRoaXMucmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1zZWN1cml0eS10b2tlbiJdPWUuc2Vzc2lvblRva2VuKTt2YXIgbj10aGlzLnNpZ24oZS5zZWNyZXRBY2Nlc3NLZXksdGhpcy5zdHJpbmdUb1NpZ24oKSksbz0iQVdTICIrZS5hY2Nlc3NLZXlJZCsiOiIrbjt0aGlzLnJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uPW99LHN0cmluZ1RvU2lnbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVxdWVzdCx0PVtdO3QucHVzaChlLm1ldGhvZCksdC5wdXNoKGUuaGVhZGVyc1siQ29udGVudC1NRDUiXXx8IiIpLHQucHVzaChlLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdfHwiIiksdC5wdXNoKGUuaGVhZGVyc1sicHJlc2lnbmVkLWV4cGlyZXMiXXx8IiIpO3ZhciBuPXRoaXMuY2Fub25pY2FsaXplZEFtekhlYWRlcnMoKTtyZXR1cm4gbiYmdC5wdXNoKG4pLHQucHVzaCh0aGlzLmNhbm9uaWNhbGl6ZWRSZXNvdXJjZSgpKSx0LmpvaW4oIlxuIil9LGNhbm9uaWNhbGl6ZWRBbXpIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107ci51dGlsLmVhY2godGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKHQpe3QubWF0Y2goL154LWFtei0vaSkmJmUucHVzaCh0KX0pKSxlLnNvcnQoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUudG9Mb3dlckNhc2UoKTx0LnRvTG93ZXJDYXNlKCk/LTE6MX0pKTt2YXIgdD1bXTtyZXR1cm4gci51dGlsLmFycmF5RWFjaC5jYWxsKHRoaXMsZSwoZnVuY3Rpb24oZSl7dC5wdXNoKGUudG9Mb3dlckNhc2UoKSsiOiIrU3RyaW5nKHRoaXMucmVxdWVzdC5oZWFkZXJzW2VdKSl9KSksdC5qb2luKCJcbiIpfSxjYW5vbmljYWxpemVkUmVzb3VyY2U6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlcXVlc3QsdD1lLnBhdGguc3BsaXQoIj8iKSxuPXRbMF0sbz10WzFdLGk9IiI7aWYoZS52aXJ0dWFsSG9zdGVkQnVja2V0JiYoaSs9Ii8iK2UudmlydHVhbEhvc3RlZEJ1Y2tldCksaSs9bixvKXt2YXIgYT1bXTtyLnV0aWwuYXJyYXlFYWNoLmNhbGwodGhpcyxvLnNwbGl0KCImIiksKGZ1bmN0aW9uKGUpe3ZhciB0PWUuc3BsaXQoIj0iKVswXSxuPWUuc3BsaXQoIj0iKVsxXTtpZih0aGlzLnN1YlJlc291cmNlc1t0XXx8dGhpcy5yZXNwb25zZUhlYWRlcnNbdF0pe3ZhciByPXtuYW1lOnR9O3ZvaWQgMCE9PW4mJih0aGlzLnN1YlJlc291cmNlc1t0XT9yLnZhbHVlPW46ci52YWx1ZT1kZWNvZGVVUklDb21wb25lbnQobikpLGEucHVzaChyKX19KSksYS5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlLm5hbWU8dC5uYW1lPy0xOjF9KSksYS5sZW5ndGgmJihvPVtdLHIudXRpbC5hcnJheUVhY2goYSwoZnVuY3Rpb24oZSl7dm9pZCAwPT09ZS52YWx1ZT9vLnB1c2goZS5uYW1lKTpvLnB1c2goZS5uYW1lKyI9IitlLnZhbHVlKX0pKSxpKz0iPyIrby5qb2luKCImIikpfXJldHVybiBpfSxzaWduOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIudXRpbC5jcnlwdG8uaG1hYyhlLHQsImJhc2U2NCIsInNoYTEiKX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlMzfSx7Ii4uL2NvcmUiOjE5fV0sNjg6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1yLnV0aWwuaW5oZXJpdDtyLlNpZ25lcnMuVjI9byhyLlNpZ25lcnMuUmVxdWVzdFNpZ25lcix7YWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3R8fCh0PXIudXRpbC5kYXRlLmdldERhdGUoKSk7dmFyIG49dGhpcy5yZXF1ZXN0O24ucGFyYW1zLlRpbWVzdGFtcD1yLnV0aWwuZGF0ZS5pc284NjAxKHQpLG4ucGFyYW1zLlNpZ25hdHVyZVZlcnNpb249IjIiLG4ucGFyYW1zLlNpZ25hdHVyZU1ldGhvZD0iSG1hY1NIQTI1NiIsbi5wYXJhbXMuQVdTQWNjZXNzS2V5SWQ9ZS5hY2Nlc3NLZXlJZCxlLnNlc3Npb25Ub2tlbiYmKG4ucGFyYW1zLlNlY3VyaXR5VG9rZW49ZS5zZXNzaW9uVG9rZW4pLGRlbGV0ZSBuLnBhcmFtcy5TaWduYXR1cmUsbi5wYXJhbXMuU2lnbmF0dXJlPXRoaXMuc2lnbmF0dXJlKGUpLG4uYm9keT1yLnV0aWwucXVlcnlQYXJhbXNUb1N0cmluZyhuLnBhcmFtcyksbi5oZWFkZXJzWyJDb250ZW50LUxlbmd0aCJdPW4uYm9keS5sZW5ndGh9LHNpZ25hdHVyZTpmdW5jdGlvbihlKXtyZXR1cm4gci51dGlsLmNyeXB0by5obWFjKGUuc2VjcmV0QWNjZXNzS2V5LHRoaXMuc3RyaW5nVG9TaWduKCksImJhc2U2NCIpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gZS5wdXNoKHRoaXMucmVxdWVzdC5tZXRob2QpLGUucHVzaCh0aGlzLnJlcXVlc3QuZW5kcG9pbnQuaG9zdC50b0xvd2VyQ2FzZSgpKSxlLnB1c2godGhpcy5yZXF1ZXN0LnBhdGhuYW1lKCkpLGUucHVzaChyLnV0aWwucXVlcnlQYXJhbXNUb1N0cmluZyh0aGlzLnJlcXVlc3QucGFyYW1zKSksZS5qb2luKCJcbiIpfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuVjJ9LHsiLi4vY29yZSI6MTl9XSw2OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4uL2NvcmUiKSxvPXIudXRpbC5pbmhlcml0O3IuU2lnbmVycy5WMz1vKHIuU2lnbmVycy5SZXF1ZXN0U2lnbmVyLHthZGRBdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49ci51dGlsLmRhdGUucmZjODIyKHQpO3RoaXMucmVxdWVzdC5oZWFkZXJzWyJYLUFtei1EYXRlIl09bixlLnNlc3Npb25Ub2tlbiYmKHRoaXMucmVxdWVzdC5oZWFkZXJzWyJ4LWFtei1zZWN1cml0eS10b2tlbiJdPWUuc2Vzc2lvblRva2VuKSx0aGlzLnJlcXVlc3QuaGVhZGVyc1siWC1BbXpuLUF1dGhvcml6YXRpb24iXT10aGlzLmF1dGhvcml6YXRpb24oZSxuKX0sYXV0aG9yaXphdGlvbjpmdW5jdGlvbihlKXtyZXR1cm4iQVdTMyBBV1NBY2Nlc3NLZXlJZD0iK2UuYWNjZXNzS2V5SWQrIixBbGdvcml0aG09SG1hY1NIQTI1NixTaWduZWRIZWFkZXJzPSIrdGhpcy5zaWduZWRIZWFkZXJzKCkrIixTaWduYXR1cmU9Iit0aGlzLnNpZ25hdHVyZShlKX0sc2lnbmVkSGVhZGVyczpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiByLnV0aWwuYXJyYXlFYWNoKHRoaXMuaGVhZGVyc1RvU2lnbigpLChmdW5jdGlvbih0KXtlLnB1c2godC50b0xvd2VyQ2FzZSgpKX0pKSxlLnNvcnQoKS5qb2luKCI7Iil9LGNhbm9uaWNhbEhlYWRlcnM6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlcXVlc3QuaGVhZGVycyx0PVtdO3JldHVybiByLnV0aWwuYXJyYXlFYWNoKHRoaXMuaGVhZGVyc1RvU2lnbigpLChmdW5jdGlvbihuKXt0LnB1c2gobi50b0xvd2VyQ2FzZSgpLnRyaW0oKSsiOiIrU3RyaW5nKGVbbl0pLnRyaW0oKSl9KSksdC5zb3J0KCkuam9pbigiXG4iKSsiXG4ifSxoZWFkZXJzVG9TaWduOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIHIudXRpbC5lYWNoKHRoaXMucmVxdWVzdC5oZWFkZXJzLChmdW5jdGlvbih0KXsoIkhvc3QiPT09dHx8IkNvbnRlbnQtRW5jb2RpbmciPT09dHx8dC5tYXRjaCgvXlgtQW16L2kpKSYmZS5wdXNoKHQpfSkpLGV9LHNpZ25hdHVyZTpmdW5jdGlvbihlKXtyZXR1cm4gci51dGlsLmNyeXB0by5obWFjKGUuc2VjcmV0QWNjZXNzS2V5LHRoaXMuc3RyaW5nVG9TaWduKCksImJhc2U2NCIpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gZS5wdXNoKHRoaXMucmVxdWVzdC5tZXRob2QpLGUucHVzaCgiLyIpLGUucHVzaCgiIiksZS5wdXNoKHRoaXMuY2Fub25pY2FsSGVhZGVycygpKSxlLnB1c2godGhpcy5yZXF1ZXN0LmJvZHkpLHIudXRpbC5jcnlwdG8uc2hhMjU2KGUuam9pbigiXG4iKSl9fSksdC5leHBvcnRzPXIuU2lnbmVycy5WM30seyIuLi9jb3JlIjoxOX1dLDcwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vY29yZSIpLG89ci51dGlsLmluaGVyaXQ7ZSgiLi92MyIpLHIuU2lnbmVycy5WM0h0dHBzPW8oci5TaWduZXJzLlYzLHthdXRob3JpemF0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiJBV1MzLUhUVFBTIEFXU0FjY2Vzc0tleUlkPSIrZS5hY2Nlc3NLZXlJZCsiLEFsZ29yaXRobT1IbWFjU0hBMjU2LFNpZ25hdHVyZT0iK3RoaXMuc2lnbmF0dXJlKGUpfSxzdHJpbmdUb1NpZ246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXX19KSx0LmV4cG9ydHM9ci5TaWduZXJzLlYzSHR0cHN9LHsiLi4vY29yZSI6MTksIi4vdjMiOjY5fV0sNzE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz1lKCIuL3Y0X2NyZWRlbnRpYWxzIiksaT1yLnV0aWwuaW5oZXJpdCxhPSJwcmVzaWduZWQtZXhwaXJlcyI7ci5TaWduZXJzLlY0PWkoci5TaWduZXJzLlJlcXVlc3RTaWduZXIse2NvbnN0cnVjdG9yOmZ1bmN0aW9uKGUsdCxuKXtyLlNpZ25lcnMuUmVxdWVzdFNpZ25lci5jYWxsKHRoaXMsZSksdGhpcy5zZXJ2aWNlTmFtZT10LG49bnx8e30sdGhpcy5zaWduYXR1cmVDYWNoZT0iYm9vbGVhbiIhPXR5cGVvZiBuLnNpZ25hdHVyZUNhY2hlfHxuLnNpZ25hdHVyZUNhY2hlLHRoaXMub3BlcmF0aW9uPW4ub3BlcmF0aW9uLHRoaXMuc2lnbmF0dXJlVmVyc2lvbj1uLnNpZ25hdHVyZVZlcnNpb259LGFsZ29yaXRobToiQVdTNC1ITUFDLVNIQTI1NiIsYWRkQXV0aG9yaXphdGlvbjpmdW5jdGlvbihlLHQpe3ZhciBuPXIudXRpbC5kYXRlLmlzbzg2MDEodCkucmVwbGFjZSgvWzpcLV18XC5cZHszfS9nLCIiKTt0aGlzLmlzUHJlc2lnbmVkKCk/dGhpcy51cGRhdGVGb3JQcmVzaWduZWQoZSxuKTp0aGlzLmFkZEhlYWRlcnMoZSxuKSx0aGlzLnJlcXVlc3QuaGVhZGVycy5BdXRob3JpemF0aW9uPXRoaXMuYXV0aG9yaXphdGlvbihlLG4pfSxhZGRIZWFkZXJzOmZ1bmN0aW9uKGUsdCl7dGhpcy5yZXF1ZXN0LmhlYWRlcnNbIlgtQW16LURhdGUiXT10LGUuc2Vzc2lvblRva2VuJiYodGhpcy5yZXF1ZXN0LmhlYWRlcnNbIngtYW16LXNlY3VyaXR5LXRva2VuIl09ZS5zZXNzaW9uVG9rZW4pfSx1cGRhdGVGb3JQcmVzaWduZWQ6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNyZWRlbnRpYWxTdHJpbmcodCksbz17IlgtQW16LURhdGUiOnQsIlgtQW16LUFsZ29yaXRobSI6dGhpcy5hbGdvcml0aG0sIlgtQW16LUNyZWRlbnRpYWwiOmUuYWNjZXNzS2V5SWQrIi8iK24sIlgtQW16LUV4cGlyZXMiOnRoaXMucmVxdWVzdC5oZWFkZXJzW2FdLCJYLUFtei1TaWduZWRIZWFkZXJzIjp0aGlzLnNpZ25lZEhlYWRlcnMoKX07ZS5zZXNzaW9uVG9rZW4mJihvWyJYLUFtei1TZWN1cml0eS1Ub2tlbiJdPWUuc2Vzc2lvblRva2VuKSx0aGlzLnJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl0mJihvWyJDb250ZW50LVR5cGUiXT10aGlzLnJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1UeXBlIl0pLHRoaXMucmVxdWVzdC5oZWFkZXJzWyJDb250ZW50LU1ENSJdJiYob1siQ29udGVudC1NRDUiXT10aGlzLnJlcXVlc3QuaGVhZGVyc1siQ29udGVudC1NRDUiXSksdGhpcy5yZXF1ZXN0LmhlYWRlcnNbIkNhY2hlLUNvbnRyb2wiXSYmKG9bIkNhY2hlLUNvbnRyb2wiXT10aGlzLnJlcXVlc3QuaGVhZGVyc1siQ2FjaGUtQ29udHJvbCJdKSxyLnV0aWwuZWFjaC5jYWxsKHRoaXMsdGhpcy5yZXF1ZXN0LmhlYWRlcnMsKGZ1bmN0aW9uKGUsdCl7aWYoZSE9PWEmJnRoaXMuaXNTaWduYWJsZUhlYWRlcihlKSl7dmFyIG49ZS50b0xvd2VyQ2FzZSgpOzA9PT1uLmluZGV4T2YoIngtYW16LW1ldGEtIik/b1tuXT10OjA9PT1uLmluZGV4T2YoIngtYW16LSIpJiYob1tlXT10KX19KSk7dmFyIGk9dGhpcy5yZXF1ZXN0LnBhdGguaW5kZXhPZigiPyIpPj0wPyImIjoiPyI7dGhpcy5yZXF1ZXN0LnBhdGgrPWkrci51dGlsLnF1ZXJ5UGFyYW1zVG9TdHJpbmcobyl9LGF1dGhvcml6YXRpb246ZnVuY3Rpb24oZSx0KXt2YXIgbj1bXSxyPXRoaXMuY3JlZGVudGlhbFN0cmluZyh0KTtyZXR1cm4gbi5wdXNoKHRoaXMuYWxnb3JpdGhtKyIgQ3JlZGVudGlhbD0iK2UuYWNjZXNzS2V5SWQrIi8iK3IpLG4ucHVzaCgiU2lnbmVkSGVhZGVycz0iK3RoaXMuc2lnbmVkSGVhZGVycygpKSxuLnB1c2goIlNpZ25hdHVyZT0iK3RoaXMuc2lnbmF0dXJlKGUsdCkpLG4uam9pbigiLCAiKX0sc2lnbmF0dXJlOmZ1bmN0aW9uKGUsdCl7dmFyIG49by5nZXRTaWduaW5nS2V5KGUsdC5zdWJzdHIoMCw4KSx0aGlzLnJlcXVlc3QucmVnaW9uLHRoaXMuc2VydmljZU5hbWUsdGhpcy5zaWduYXR1cmVDYWNoZSk7cmV0dXJuIHIudXRpbC5jcnlwdG8uaG1hYyhuLHRoaXMuc3RyaW5nVG9TaWduKHQpLCJoZXgiKX0sc3RyaW5nVG9TaWduOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiB0LnB1c2goIkFXUzQtSE1BQy1TSEEyNTYiKSx0LnB1c2goZSksdC5wdXNoKHRoaXMuY3JlZGVudGlhbFN0cmluZyhlKSksdC5wdXNoKHRoaXMuaGV4RW5jb2RlZEhhc2godGhpcy5jYW5vbmljYWxTdHJpbmcoKSkpLHQuam9pbigiXG4iKX0sY2Fub25pY2FsU3RyaW5nOmZ1bmN0aW9uKCl7dmFyIGU9W10sdD10aGlzLnJlcXVlc3QucGF0aG5hbWUoKTtyZXR1cm4iczMiIT09dGhpcy5zZXJ2aWNlTmFtZSYmInMzdjQiIT09dGhpcy5zaWduYXR1cmVWZXJzaW9uJiYodD1yLnV0aWwudXJpRXNjYXBlUGF0aCh0KSksZS5wdXNoKHRoaXMucmVxdWVzdC5tZXRob2QpLGUucHVzaCh0KSxlLnB1c2godGhpcy5yZXF1ZXN0LnNlYXJjaCgpKSxlLnB1c2godGhpcy5jYW5vbmljYWxIZWFkZXJzKCkrIlxuIiksZS5wdXNoKHRoaXMuc2lnbmVkSGVhZGVycygpKSxlLnB1c2godGhpcy5oZXhFbmNvZGVkQm9keUhhc2goKSksZS5qb2luKCJcbiIpfSxjYW5vbmljYWxIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107ci51dGlsLmVhY2guY2FsbCh0aGlzLHRoaXMucmVxdWVzdC5oZWFkZXJzLChmdW5jdGlvbih0LG4pe2UucHVzaChbdCxuXSl9KSksZS5zb3J0KChmdW5jdGlvbihlLHQpe3JldHVybiBlWzBdLnRvTG93ZXJDYXNlKCk8dFswXS50b0xvd2VyQ2FzZSgpPy0xOjF9KSk7dmFyIHQ9W107cmV0dXJuIHIudXRpbC5hcnJheUVhY2guY2FsbCh0aGlzLGUsKGZ1bmN0aW9uKGUpe3ZhciBuPWVbMF0udG9Mb3dlckNhc2UoKTtpZih0aGlzLmlzU2lnbmFibGVIZWFkZXIobikpe3ZhciBvPWVbMV07aWYobnVsbD09b3x8ImZ1bmN0aW9uIiE9dHlwZW9mIG8udG9TdHJpbmcpdGhyb3cgci51dGlsLmVycm9yKG5ldyBFcnJvcigiSGVhZGVyICIrbisiIGNvbnRhaW5zIGludmFsaWQgdmFsdWUiKSx7Y29kZToiSW52YWxpZEhlYWRlciJ9KTt0LnB1c2gobisiOiIrdGhpcy5jYW5vbmljYWxIZWFkZXJWYWx1ZXMoby50b1N0cmluZygpKSl9fSkpLHQuam9pbigiXG4iKX0sY2Fub25pY2FsSGVhZGVyVmFsdWVzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1xzKy9nLCIgIikucmVwbGFjZSgvXlxzK3xccyskL2csIiIpfSxzaWduZWRIZWFkZXJzOmZ1bmN0aW9uKCl7dmFyIGU9W107cmV0dXJuIHIudXRpbC5lYWNoLmNhbGwodGhpcyx0aGlzLnJlcXVlc3QuaGVhZGVycywoZnVuY3Rpb24odCl7dD10LnRvTG93ZXJDYXNlKCksdGhpcy5pc1NpZ25hYmxlSGVhZGVyKHQpJiZlLnB1c2godCl9KSksZS5zb3J0KCkuam9pbigiOyIpfSxjcmVkZW50aWFsU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiBvLmNyZWF0ZVNjb3BlKGUuc3Vic3RyKDAsOCksdGhpcy5yZXF1ZXN0LnJlZ2lvbix0aGlzLnNlcnZpY2VOYW1lKX0saGV4RW5jb2RlZEhhc2g6ZnVuY3Rpb24oZSl7cmV0dXJuIHIudXRpbC5jcnlwdG8uc2hhMjU2KGUsImhleCIpfSxoZXhFbmNvZGVkQm9keUhhc2g6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnJlcXVlc3Q7cmV0dXJuIHRoaXMuaXNQcmVzaWduZWQoKSYmWyJzMyIsInMzLW9iamVjdC1sYW1iZGEiXS5pbmRleE9mKHRoaXMuc2VydmljZU5hbWUpPi0xJiYhZS5ib2R5PyJVTlNJR05FRC1QQVlMT0FEIjplLmhlYWRlcnNbIlgtQW16LUNvbnRlbnQtU2hhMjU2Il0/ZS5oZWFkZXJzWyJYLUFtei1Db250ZW50LVNoYTI1NiJdOnRoaXMuaGV4RW5jb2RlZEhhc2godGhpcy5yZXF1ZXN0LmJvZHl8fCIiKX0sdW5zaWduYWJsZUhlYWRlcnM6WyJhdXRob3JpemF0aW9uIiwiY29udGVudC10eXBlIiwiY29udGVudC1sZW5ndGgiLCJ1c2VyLWFnZW50IixhLCJleHBlY3QiLCJ4LWFtem4tdHJhY2UtaWQiXSxpc1NpZ25hYmxlSGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiAwPT09ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIngtYW16LSIpfHx0aGlzLnVuc2lnbmFibGVIZWFkZXJzLmluZGV4T2YoZSk8MH0saXNQcmVzaWduZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXRoaXMucmVxdWVzdC5oZWFkZXJzW2FdfX0pLHQuZXhwb3J0cz1yLlNpZ25lcnMuVjR9LHsiLi4vY29yZSI6MTksIi4vdjRfY3JlZGVudGlhbHMiOjcyfV0sNzI6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi9jb3JlIiksbz17fSxpPVtdLGE9ImF3czRfcmVxdWVzdCI7dC5leHBvcnRzPXtjcmVhdGVTY29wZTpmdW5jdGlvbihlLHQsbil7cmV0dXJuW2Uuc3Vic3RyKDAsOCksdCxuLGFdLmpvaW4oIi8iKX0sZ2V0U2lnbmluZ0tleTpmdW5jdGlvbihlLHQsbixzLGMpe3ZhciB1PVtyLnV0aWwuY3J5cHRvLmhtYWMoZS5zZWNyZXRBY2Nlc3NLZXksZS5hY2Nlc3NLZXlJZCwiYmFzZTY0IiksdCxuLHNdLmpvaW4oIl8iKTtpZigoYz0hMSE9PWMpJiZ1IGluIG8pcmV0dXJuIG9bdV07dmFyIGw9ci51dGlsLmNyeXB0by5obWFjKCJBV1M0IitlLnNlY3JldEFjY2Vzc0tleSx0LCJidWZmZXIiKSxwPXIudXRpbC5jcnlwdG8uaG1hYyhsLG4sImJ1ZmZlciIpLGQ9ci51dGlsLmNyeXB0by5obWFjKHAscywiYnVmZmVyIiksZj1yLnV0aWwuY3J5cHRvLmhtYWMoZCxhLCJidWZmZXIiKTtyZXR1cm4gYyYmKG9bdV09ZixpLnB1c2godSksaS5sZW5ndGg+NTAmJmRlbGV0ZSBvW2kuc2hpZnQoKV0pLGZ9LGVtcHR5Q2FjaGU6ZnVuY3Rpb24oKXtvPXt9LGk9W119fX0seyIuLi9jb3JlIjoxOX1dLDczOltmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlLHQpe3RoaXMuY3VycmVudFN0YXRlPXR8fG51bGwsdGhpcy5zdGF0ZXM9ZXx8e319ci5wcm90b3R5cGUucnVuVG89ZnVuY3Rpb24oZSx0LG4scil7ImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPW4sbj10LHQ9ZSxlPW51bGwpO3ZhciBvPXRoaXMsaT1vLnN0YXRlc1tvLmN1cnJlbnRTdGF0ZV07aS5mbi5jYWxsKG58fG8sciwoZnVuY3Rpb24ocil7aWYocil7aWYoIWkuZmFpbClyZXR1cm4gdD90LmNhbGwobixyKTpudWxsO28uY3VycmVudFN0YXRlPWkuZmFpbH1lbHNle2lmKCFpLmFjY2VwdClyZXR1cm4gdD90LmNhbGwobik6bnVsbDtvLmN1cnJlbnRTdGF0ZT1pLmFjY2VwdH1pZihvLmN1cnJlbnRTdGF0ZT09PWUpcmV0dXJuIHQ/dC5jYWxsKG4scik6bnVsbDtvLnJ1blRvKGUsdCxuLHIpfSkpfSxyLnByb3RvdHlwZS5hZGRTdGF0ZT1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD8ocj10LHQ9bnVsbCxuPW51bGwpOiJmdW5jdGlvbiI9PXR5cGVvZiBuJiYocj1uLG49bnVsbCksdGhpcy5jdXJyZW50U3RhdGV8fCh0aGlzLmN1cnJlbnRTdGF0ZT1lKSx0aGlzLnN0YXRlc1tlXT17YWNjZXB0OnQsZmFpbDpuLGZuOnJ9LHRoaXN9LHQuZXhwb3J0cz1yfSx7fV0sNzQ6W2Z1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24obixyKXsoZnVuY3Rpb24oKXt2YXIgaSxhPXtlbnZpcm9ubWVudDoibm9kZWpzIixlbmdpbmU6ZnVuY3Rpb24oKXtpZihhLmlzQnJvd3NlcigpJiYidW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvcilyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudDt2YXIgZT1uLnBsYXRmb3JtKyIvIituLnZlcnNpb247cmV0dXJuIG4uZW52LkFXU19FWEVDVVRJT05fRU5WJiYoZSs9IiBleGVjLWVudi8iK24uZW52LkFXU19FWEVDVVRJT05fRU5WKSxlfSx1c2VyQWdlbnQ6ZnVuY3Rpb24oKXt2YXIgdD1hLmVudmlyb25tZW50LG49ImF3cy1zZGstIit0KyIvIitlKCIuL2NvcmUiKS5WRVJTSU9OO3JldHVybiJub2RlanMiPT09dCYmKG4rPSIgIithLmVuZ2luZSgpKSxufSx1cmlFc2NhcGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZW5jb2RlVVJJQ29tcG9uZW50KGUpO3JldHVybiB0PSh0PXQucmVwbGFjZSgvW15BLVphLXowLTlfLn5cLSVdKy9nLGVzY2FwZSkpLnJlcGxhY2UoL1sqXS9nLChmdW5jdGlvbihlKXtyZXR1cm4iJSIrZS5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSkpfSx1cmlFc2NhcGVQYXRoOmZ1bmN0aW9uKGUpe3ZhciB0PVtdO3JldHVybiBhLmFycmF5RWFjaChlLnNwbGl0KCIvIiksKGZ1bmN0aW9uKGUpe3QucHVzaChhLnVyaUVzY2FwZShlKSl9KSksdC5qb2luKCIvIil9LHVybFBhcnNlOmZ1bmN0aW9uKGUpe3JldHVybiBhLnVybC5wYXJzZShlKX0sdXJsRm9ybWF0OmZ1bmN0aW9uKGUpe3JldHVybiBhLnVybC5mb3JtYXQoZSl9LHF1ZXJ5U3RyaW5nUGFyc2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGEucXVlcnlzdHJpbmcucGFyc2UoZSl9LHF1ZXJ5UGFyYW1zVG9TdHJpbmc6ZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1hLnVyaUVzY2FwZSxyPU9iamVjdC5rZXlzKGUpLnNvcnQoKTtyZXR1cm4gYS5hcnJheUVhY2gociwoZnVuY3Rpb24ocil7dmFyIG89ZVtyXSxpPW4ocikscz1pKyI9IjtpZihBcnJheS5pc0FycmF5KG8pKXt2YXIgYz1bXTthLmFycmF5RWFjaChvLChmdW5jdGlvbihlKXtjLnB1c2gobihlKSl9KSkscz1pKyI9IitjLnNvcnQoKS5qb2luKCImIitpKyI9Iil9ZWxzZSBudWxsIT1vJiYocz1pKyI9IituKG8pKTt0LnB1c2gocyl9KSksdC5qb2luKCImIil9LHJlYWRGaWxlU3luYzpmdW5jdGlvbih0KXtyZXR1cm4gYS5pc0Jyb3dzZXIoKT9udWxsOmUoImZzIikucmVhZEZpbGVTeW5jKHQsInV0Zi04Iil9LGJhc2U2NDp7ZW5jb2RlOmZ1bmN0aW9uKGUpe2lmKCJudW1iZXIiPT10eXBlb2YgZSl0aHJvdyBhLmVycm9yKG5ldyBFcnJvcigiQ2Fubm90IGJhc2U2NCBlbmNvZGUgbnVtYmVyICIrZSkpO3JldHVybiBudWxsPT1lP2U6YS5idWZmZXIudG9CdWZmZXIoZSkudG9TdHJpbmcoImJhc2U2NCIpfSxkZWNvZGU6ZnVuY3Rpb24oZSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXRocm93IGEuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgYmFzZTY0IGRlY29kZSBudW1iZXIgIitlKSk7cmV0dXJuIG51bGw9PWU/ZTphLmJ1ZmZlci50b0J1ZmZlcihlLCJiYXNlNjQiKX19LGJ1ZmZlcjp7dG9CdWZmZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgYS5CdWZmZXIuZnJvbSYmYS5CdWZmZXIuZnJvbSE9PVVpbnQ4QXJyYXkuZnJvbT9hLkJ1ZmZlci5mcm9tKGUsdCk6bmV3IGEuQnVmZmVyKGUsdCl9LGFsbG9jOmZ1bmN0aW9uKGUsdCxuKXtpZigibnVtYmVyIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJzaXplIHBhc3NlZCB0byBhbGxvYyBtdXN0IGJlIGEgbnVtYmVyLiIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhLkJ1ZmZlci5hbGxvYylyZXR1cm4gYS5CdWZmZXIuYWxsb2MoZSx0LG4pO3ZhciByPW5ldyBhLkJ1ZmZlcihlKTtyZXR1cm4gdm9pZCAwIT09dCYmImZ1bmN0aW9uIj09dHlwZW9mIHIuZmlsbCYmci5maWxsKHQsdm9pZCAwLHZvaWQgMCxuKSxyfSx0b1N0cmVhbTpmdW5jdGlvbihlKXthLkJ1ZmZlci5pc0J1ZmZlcihlKXx8KGU9YS5idWZmZXIudG9CdWZmZXIoZSkpO3ZhciB0PW5ldyBhLnN0cmVhbS5SZWFkYWJsZSxuPTA7cmV0dXJuIHQuX3JlYWQ9ZnVuY3Rpb24ocil7aWYobj49ZS5sZW5ndGgpcmV0dXJuIHQucHVzaChudWxsKTt2YXIgbz1uK3I7bz5lLmxlbmd0aCYmKG89ZS5sZW5ndGgpLHQucHVzaChlLnNsaWNlKG4sbykpLG49b30sdH0sY29uY2F0OmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wLG89MDtmb3Iobj0wO248ZS5sZW5ndGg7bisrKXIrPWVbbl0ubGVuZ3RoO2Zvcih0PWEuYnVmZmVyLmFsbG9jKHIpLG49MDtuPGUubGVuZ3RoO24rKyllW25dLmNvcHkodCxvKSxvKz1lW25dLmxlbmd0aDtyZXR1cm4gdH19LHN0cmluZzp7Ynl0ZUxlbmd0aDpmdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiAwO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9YS5idWZmZXIudG9CdWZmZXIodCkpLCJudW1iZXIiPT10eXBlb2YgdC5ieXRlTGVuZ3RoKXJldHVybiB0LmJ5dGVMZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiB0Lmxlbmd0aClyZXR1cm4gdC5sZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiB0LnNpemUpcmV0dXJuIHQuc2l6ZTtpZigic3RyaW5nIj09dHlwZW9mIHQucGF0aClyZXR1cm4gZSgiZnMiKS5sc3RhdFN5bmModC5wYXRoKS5zaXplO3Rocm93IGEuZXJyb3IobmV3IEVycm9yKCJDYW5ub3QgZGV0ZXJtaW5lIGxlbmd0aCBvZiAiK3QpLHtvYmplY3Q6dH0pfSx1cHBlckZpcnN0OmZ1bmN0aW9uKGUpe3JldHVybiBlWzBdLnRvVXBwZXJDYXNlKCkrZS5zdWJzdHIoMSl9LGxvd2VyRmlyc3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMF0udG9Mb3dlckNhc2UoKStlLnN1YnN0cigxKX19LGluaTp7cGFyc2U6ZnVuY3Rpb24oZSl7dmFyIHQsbj17fTtyZXR1cm4gYS5hcnJheUVhY2goZS5zcGxpdCgvXHI/XG4vKSwoZnVuY3Rpb24oZSl7aWYoIlsiPT09KGU9ZS5zcGxpdCgvKF58XHMpWzsjXS8pWzBdLnRyaW0oKSlbMF0mJiJdIj09PWVbZS5sZW5ndGgtMV0pe2lmKCJfX3Byb3RvX18iPT09KHQ9ZS5zdWJzdHJpbmcoMSxlLmxlbmd0aC0xKSl8fCJfX3Byb3RvX18iPT09dC5zcGxpdCgvXHMvKVsxXSl0aHJvdyBhLmVycm9yKG5ldyBFcnJvcigiQ2Fubm90IGxvYWQgcHJvZmlsZSBuYW1lICciK3QrIicgZnJvbSBzaGFyZWQgaW5pIGZpbGUuIikpfWVsc2UgaWYodCl7dmFyIHI9ZS5pbmRleE9mKCI9Iiksbz1lLmxlbmd0aC0xO2lmKC0xIT09ciYmMCE9PXImJnIhPT1vKXt2YXIgaT1lLnN1YnN0cmluZygwLHIpLnRyaW0oKSxzPWUuc3Vic3RyaW5nKHIrMSkudHJpbSgpO25bdF09blt0XXx8e30sblt0XVtpXT1zfX19KSksbn19LGZuOntub29wOmZ1bmN0aW9uKCl7fSxjYWxsYmFjazpmdW5jdGlvbihlKXtpZihlKXRocm93IGV9LG1ha2VBc3luYzpmdW5jdGlvbihlLHQpe3JldHVybiB0JiZ0PD1lLmxlbmd0aD9lOmZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3QucG9wKCkoZS5hcHBseShudWxsLHQpKX19fSxkYXRlOntnZXREYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIGl8fChpPWUoIi4vY29yZSIpKSxpLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldD9uZXcgRGF0ZSgobmV3IERhdGUpLmdldFRpbWUoKStpLmNvbmZpZy5zeXN0ZW1DbG9ja09mZnNldCk6bmV3IERhdGV9LGlzbzg2MDE6ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMD09PWUmJihlPWEuZGF0ZS5nZXREYXRlKCkpLGUudG9JU09TdHJpbmcoKS5yZXBsYWNlKC9cLlxkezN9WiQvLCJaIil9LHJmYzgyMjpmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9YS5kYXRlLmdldERhdGUoKSksZS50b1VUQ1N0cmluZygpfSx1bml4VGltZXN0YW1wOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT1hLmRhdGUuZ2V0RGF0ZSgpKSxlLmdldFRpbWUoKS8xZTN9LGZyb206ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlP25ldyBEYXRlKDFlMyplKTpuZXcgRGF0ZShlKX0sZm9ybWF0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fCh0PSJpc284NjAxIiksYS5kYXRlW3RdKGEuZGF0ZS5mcm9tKGUpKX0scGFyc2VUaW1lc3RhbXA6ZnVuY3Rpb24oZSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXJldHVybiBuZXcgRGF0ZSgxZTMqZSk7aWYoZS5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gbmV3IERhdGUoMWUzKmUpO2lmKGUubWF0Y2goL15cZHs0fS8pKXJldHVybiBuZXcgRGF0ZShlKTtpZihlLm1hdGNoKC9eXHd7M30sLykpcmV0dXJuIG5ldyBEYXRlKGUpO3Rocm93IGEuZXJyb3IobmV3IEVycm9yKCJ1bmhhbmRsZWQgdGltZXN0YW1wIGZvcm1hdDogIitlKSx7Y29kZToiVGltZXN0YW1wUGFyc2VyRXJyb3IifSl9fSxjcnlwdG86e2NyYzMyVGFibGU6WzAsMTk5Njk1OTg5NCwzOTkzOTE5Nzg4LDI1Njc1MjQ3OTQsMTI0NjM0MTM3LDE4ODYwNTc2MTUsMzkxNTYyMTY4NSwyNjU3MzkyMDM1LDI0OTI2ODI3NCwyMDQ0NTA4MzI0LDM3NzIxMTUyMzAsMjU0NzE3Nzg2NCwxNjI5NDE5OTUsMjEyNTU2MTAyMSwzODg3NjA3MDQ3LDI0Mjg0NDQwNDksNDk4NTM2NTQ4LDE3ODk5Mjc2NjYsNDA4OTAxNjY0OCwyMjI3MDYxMjE0LDQ1MDU0ODg2MSwxODQzMjU4NjAzLDQxMDc1ODA3NTMsMjIxMTY3NzYzOSwzMjU4ODM5OTAsMTY4NDc3NzE1Miw0MjUxMTIyMDQyLDIzMjE5MjY2MzYsMzM1NjMzNDg3LDE2NjEzNjU0NjUsNDE5NTMwMjc1NSwyMzY2MTE1MzE3LDk5NzA3MzA5NiwxMjgxOTUzODg2LDM1Nzk4NTUzMzIsMjcyNDY4ODI0MiwxMDA2ODg4MTQ1LDEyNTg2MDc2ODcsMzUyNDEwMTYyOSwyNzY4OTQyNDQzLDkwMTA5NzcyMiwxMTE5MDAwNjg0LDM2ODY1MTcyMDYsMjg5ODA2NTcyOCw4NTMwNDQ0NTEsMTE3MjI2NjEwMSwzNzA1MDE1NzU5LDI4ODI2MTY2NjUsNjUxNzY3OTgwLDEzNzM1MDM1NDYsMzM2OTU1NDMwNCwzMjE4MTA0NTk4LDU2NTUwNzI1MywxNDU0NjIxNzMxLDM0ODUxMTE3MDUsMzA5OTQzNjMwMyw2NzEyNjY5NzQsMTU5NDE5ODAyNCwzMzIyNzMwOTMwLDI5NzAzNDc4MTIsNzk1ODM1NTI3LDE0ODMyMzAyMjUsMzI0NDM2NzI3NSwzMDYwMTQ5NTY1LDE5OTQxNDYxOTIsMzExNTg1MzQsMjU2MzkwNzc3Miw0MDIzNzE3OTMwLDE5MDc0NTk0NjUsMTEyNjM3MjE1LDI2ODAxNTMyNTMsMzkwNDQyNzA1OSwyMDEzNzc2MjkwLDI1MTcyMjAzNiwyNTE3MjE1Mzc0LDM3NzU4MzAwNDAsMjEzNzY1Njc2MywxNDEzNzY4MTMsMjQzOTI3NzcxOSwzODY1MjcxMjk3LDE4MDIxOTU0NDQsNDc2ODY0ODY2LDIyMzgwMDEzNjgsNDA2NjUwODg3OCwxODEyMzcwOTI1LDQ1MzA5MjczMSwyMTgxNjI1MDI1LDQxMTE0NTEyMjMsMTcwNjA4ODkwMiwzMTQwNDI3MDQsMjM0NDUzMjIwMiw0MjQwMDE3NTMyLDE2NTg2NTgyNzEsMzY2NjE5OTc3LDIzNjI2NzAzMjMsNDIyNDk5NDQwNSwxMzAzNTM1OTYwLDk4NDk2MTQ4NiwyNzQ3MDA3MDkyLDM1NjkwMzc1MzgsMTI1NjE3MDgxNywxMDM3NjA0MzExLDI3NjUyMTA3MzMsMzU1NDA3OTk5NSwxMTMxMDE0NTA2LDg3OTY3OTk5NiwyOTA5MjQzNDYyLDM2NjM3NzE4NTYsMTE0MTEyNDQ2Nyw4NTU4NDIyNzcsMjg1MjgwMTYzMSwzNzA4NjQ4NjQ5LDEzNDI1MzM5NDgsNjU0NDU5MzA2LDMxODgzOTYwNDgsMzM3MzAxNTE3NCwxNDY2NDc5OTA5LDU0NDE3OTYzNSwzMTEwNTIzOTEzLDM0NjI1MjIwMTUsMTU5MTY3MTA1NCw3MDIxMzg3NzYsMjk2NjQ2MDQ1MCwzMzUyNzk5NDEyLDE1MDQ5MTg4MDcsNzgzNTUxODczLDMwODI2NDA0NDMsMzIzMzQ0Mjk4OSwzOTg4MjkyMzg0LDI1OTYyNTQ2NDYsNjIzMTcwNjgsMTk1NzgxMDg0MiwzOTM5ODQ1OTQ1LDI2NDc4MTYxMTEsODE0NzA5OTcsMTk0MzgwMzUyMywzODE0OTE4OTMwLDI0ODk1OTY4MDQsMjI1Mjc0NDMwLDIwNTM3OTAzNzYsMzgyNjE3NTc1NSwyNDY2OTA2MDEzLDE2NzgxNjc0MywyMDk3NjUxMzc3LDQwMjc1NTI1ODAsMjI2NTQ5MDM4Niw1MDM0NDQwNzIsMTc2MjA1MDgxNCw0MTUwNDE3MjQ1LDIxNTQxMjkzNTUsNDI2NTIyMjI1LDE4NTI1MDc4NzksNDI3NTMxMzUyNiwyMzEyMzE3OTIwLDI4Mjc1MzYyNiwxNzQyNTU1ODUyLDQxODk3MDgxNDMsMjM5NDg3Nzk0NSwzOTc5MTc3NjMsMTYyMjE4MzYzNywzNjA0MzkwODg4LDI3MTQ4NjY1NTgsOTUzNzI5NzMyLDEzNDAwNzY2MjYsMzUxODcxOTk4NSwyNzk3MzYwOTk5LDEwNjg4MjgzODEsMTIxOTYzODg1OSwzNjI0NzQxODUwLDI5MzY2NzUxNDgsOTA2MTg1NDYyLDEwOTA4MTI1MTIsMzc0NzY3MjAwMywyODI1Mzc5NjY5LDgyOTMyOTEzNSwxMTgxMzM1MTYxLDM0MTIxNzc4MDQsMzE2MDgzNDg0Miw2MjgwODU0MDgsMTM4MjYwNTM2NiwzNDIzMzY5MTA5LDMxMzgwNzg0NjcsNTcwNTYyMjMzLDE0MjY0MDA4MTUsMzMxNzMxNjU0MiwyOTk4NzMzNjA4LDczMzIzOTk1NCwxNTU1MjYxOTU2LDMyNjg5MzU1OTEsMzA1MDM2MDYyNSw3NTI0NTk0MDMsMTU0MTMyMDIyMSwyNjA3MDcxOTIwLDM5NjU5NzMwMzAsMTk2OTkyMjk3Miw0MDczNTQ5OCwyNjE3ODM3MjI1LDM5NDM1NzcxNTEsMTkxMzA4Nzg3Nyw4MzkwODM3MSwyNTEyMzQxNjM0LDM4MDM3NDA2OTIsMjA3NTIwODYyMiwyMTMyNjExMTIsMjQ2MzI3MjYwMywzODU1OTkwMjg1LDIwOTQ4NTQwNzEsMTk4OTU4ODgxLDIyNjIwMjkwMTIsNDA1NzI2MDYxMCwxNzU5MzU5OTkyLDUzNDQxNDE5MCwyMTc2NzE4NTQxLDQxMzkzMjkxMTUsMTg3MzgzNjAwMSw0MTQ2NjQ1NjcsMjI4MjI0ODkzNCw0Mjc5MjAwMzY4LDE3MTE2ODQ1NTQsMjg1MjgxMTE2LDI0MDU4MDE3MjcsNDE2NzIxNjc0NSwxNjM0NDY3Nzk1LDM3NjIyOTcwMSwyNjg1MDY3ODk2LDM2MDgwMDc0MDYsMTMwODkxODYxMiw5NTY1NDM5MzgsMjgwODU1NTEwNSwzNDk1OTU4MjYzLDEyMzE2MzYzMDEsMTA0NzQyNzAzNSwyOTMyOTU5ODE4LDM2NTQ3MDM4MzYsMTA4ODM1OTI3MCw5MzY5MThlMywyODQ3NzE0ODk5LDM3MzY4Mzc4MjksMTIwMjkwMDg2Myw4MTcyMzM4OTcsMzE4MzM0MjEwOCwzNDAxMjM3MTMwLDE0MDQyNzc1NTIsNjE1ODE4MTUwLDMxMzQyMDc0OTMsMzQ1MzQyMTIwMywxNDIzODU3NDQ5LDYwMTQ1MDQzMSwzMDA5ODM3NjE0LDMyOTQ3MTA0NTYsMTU2NzEwMzc0Niw3MTE5Mjg3MjQsMzAyMDY2ODQ3MSwzMjcyMzgwMDY1LDE1MTAzMzQyMzUsNzU1MTY3MTE3XSxjcmMzMjpmdW5jdGlvbihlKXt2YXIgdD1hLmNyeXB0by5jcmMzMlRhYmxlLG49LTE7InN0cmluZyI9PXR5cGVvZiBlJiYoZT1hLmJ1ZmZlci50b0J1ZmZlcihlKSk7Zm9yKHZhciByPTA7cjxlLmxlbmd0aDtyKyspbj1uPj4+OF50WzI1NSYobl5lLnJlYWRVSW50OChyKSldO3JldHVybigtMV5uKT4+PjB9LGhtYWM6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG58fChuPSJiaW5hcnkiKSwiYnVmZmVyIj09PW4mJihuPXZvaWQgMCkscnx8KHI9InNoYTI1NiIpLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9YS5idWZmZXIudG9CdWZmZXIodCkpLGEuY3J5cHRvLmxpYi5jcmVhdGVIbWFjKHIsZSkudXBkYXRlKHQpLmRpZ2VzdChuKX0sbWQ1OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gYS5jcnlwdG8uaGFzaCgibWQ1IixlLHQsbil9LHNoYTI1NjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGEuY3J5cHRvLmhhc2goInNoYTI1NiIsZSx0LG4pfSxoYXNoOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPWEuY3J5cHRvLmNyZWF0ZUhhc2goZSk7bnx8KG49ImJpbmFyeSIpLCJidWZmZXIiPT09biYmKG49dm9pZCAwKSwic3RyaW5nIj09dHlwZW9mIHQmJih0PWEuYnVmZmVyLnRvQnVmZmVyKHQpKTt2YXIgcz1hLmFycmF5U2xpY2VGbih0KSxjPWEuQnVmZmVyLmlzQnVmZmVyKHQpO2lmKGEuaXNCcm93c2VyKCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQmJnQuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJihjPSEwKSxyJiYib2JqZWN0Ij09PW8odCkmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Lm9uJiYhYyl0Lm9uKCJkYXRhIiwoZnVuY3Rpb24oZSl7aS51cGRhdGUoZSl9KSksdC5vbigiZXJyb3IiLChmdW5jdGlvbihlKXtyKGUpfSkpLHQub24oImVuZCIsKGZ1bmN0aW9uKCl7cihudWxsLGkuZGlnZXN0KG4pKX0pKTtlbHNle2lmKCFyfHwhc3x8Y3x8InVuZGVmaW5lZCI9PXR5cGVvZiBGaWxlUmVhZGVyKXthLmlzQnJvd3NlcigpJiYib2JqZWN0Ij09PW8odCkmJiFjJiYodD1uZXcgYS5CdWZmZXIobmV3IFVpbnQ4QXJyYXkodCkpKTt2YXIgdT1pLnVwZGF0ZSh0KS5kaWdlc3Qobik7cmV0dXJuIHImJnIobnVsbCx1KSx1fXZhciBsPTAscD1uZXcgRmlsZVJlYWRlcjtwLm9uZXJyb3I9ZnVuY3Rpb24oKXtyKG5ldyBFcnJvcigiRmFpbGVkIHRvIHJlYWQgZGF0YS4iKSl9LHAub25sb2FkPWZ1bmN0aW9uKCl7dmFyIGU9bmV3IGEuQnVmZmVyKG5ldyBVaW50OEFycmF5KHAucmVzdWx0KSk7aS51cGRhdGUoZSksbCs9ZS5sZW5ndGgscC5fY29udGludWVSZWFkaW5nKCl9LHAuX2NvbnRpbnVlUmVhZGluZz1mdW5jdGlvbigpe2lmKGw+PXQuc2l6ZSlyKG51bGwsaS5kaWdlc3QobikpO2Vsc2V7dmFyIGU9bCs1MjQyODg7ZT50LnNpemUmJihlPXQuc2l6ZSkscC5yZWFkQXNBcnJheUJ1ZmZlcihzLmNhbGwodCxsLGUpKX19LHAuX2NvbnRpbnVlUmVhZGluZygpfX0sdG9IZXg6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoO24rKyl0LnB1c2goKCIwIitlLmNoYXJDb2RlQXQobikudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTIsMikpO3JldHVybiB0LmpvaW4oIiIpfSxjcmVhdGVIYXNoOmZ1bmN0aW9uKGUpe3JldHVybiBhLmNyeXB0by5saWIuY3JlYXRlSGFzaChlKX19LGFib3J0Ont9LGVhY2g6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gZSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmdC5jYWxsKHRoaXMsbixlW25dKT09PWEuYWJvcnQpYnJlYWt9LGFycmF5RWFjaDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbiBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLG4pJiZ0LmNhbGwodGhpcyxlW25dLHBhcnNlSW50KG4sMTApKT09PWEuYWJvcnQpYnJlYWt9LHVwZGF0ZTpmdW5jdGlvbihlLHQpe3JldHVybiBhLmVhY2godCwoZnVuY3Rpb24odCxuKXtlW3RdPW59KSksZX0sbWVyZ2U6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYS51cGRhdGUoYS5jb3B5KGUpLHQpfSxjb3B5OmZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpcmV0dXJuIGU7dmFyIHQ9e307Zm9yKHZhciBuIGluIGUpdFtuXT1lW25dO3JldHVybiB0fSxpc0VtcHR5OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpKXJldHVybiExO3JldHVybiEwfSxhcnJheVNsaWNlRm46ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zbGljZXx8ZS53ZWJraXRTbGljZXx8ZS5tb3pTbGljZTtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om51bGx9LGlzVHlwZTpmdW5jdGlvbihlLHQpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0JiYodD1hLnR5cGVOYW1lKHQpKSxPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk9PT0iW29iamVjdCAiK3QrIl0ifSx0eXBlTmFtZTpmdW5jdGlvbihlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSwibmFtZSIpKXJldHVybiBlLm5hbWU7dmFyIHQ9ZS50b1N0cmluZygpLG49dC5tYXRjaCgvXlxzKmZ1bmN0aW9uICguKylcKC8pO3JldHVybiBuP25bMV06dH0sZXJyb3I6ZnVuY3Rpb24oZSx0KXt2YXIgbj1udWxsO2Zvcih2YXIgciBpbiJzdHJpbmciPT10eXBlb2YgZS5tZXNzYWdlJiYiIiE9PWUubWVzc2FnZSYmKCJzdHJpbmciPT10eXBlb2YgdHx8dCYmdC5tZXNzYWdlKSYmKChuPWEuY29weShlKSkubWVzc2FnZT1lLm1lc3NhZ2UpLGUubWVzc2FnZT1lLm1lc3NhZ2V8fG51bGwsInN0cmluZyI9PXR5cGVvZiB0P2UubWVzc2FnZT10OiJvYmplY3QiPT09byh0KSYmbnVsbCE9PXQmJihhLnVwZGF0ZShlLHQpLHQubWVzc2FnZSYmKGUubWVzc2FnZT10Lm1lc3NhZ2UpLCh0LmNvZGV8fHQubmFtZSkmJihlLmNvZGU9dC5jb2RlfHx0Lm5hbWUpLHQuc3RhY2smJihlLnN0YWNrPXQuc3RhY2spKSwiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5JiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm5hbWUiLHt3cml0YWJsZTohMCxlbnVtZXJhYmxlOiExfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIm1lc3NhZ2UiLHtlbnVtZXJhYmxlOiEwfSkpLGUubmFtZT1TdHJpbmcodCYmdC5uYW1lfHxlLm5hbWV8fGUuY29kZXx8IkVycm9yIiksZS50aW1lPW5ldyBEYXRlLG4mJihlLm9yaWdpbmFsRXJyb3I9biksdHx8e30paWYoIlsiPT09clswXSYmIl0iPT09cltyLmxlbmd0aC0xXSl7aWYoImNvZGUiPT09KHI9ci5zbGljZSgxLC0xKSl8fCJtZXNzYWdlIj09PXIpY29udGludWU7ZVsiWyIrcisiXSJdPSJTZWUgZXJyb3IuIityKyIgZm9yIGRldGFpbHMuIixPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLHt2YWx1ZTplW3JdfHx0JiZ0W3JdfHxuJiZuW3JdLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITB9KX1yZXR1cm4gZX0saW5oZXJpdDpmdW5jdGlvbihlLHQpe3ZhciBuPW51bGw7aWYodm9pZCAwPT09dCl0PWUsZT1PYmplY3Qsbj17fTtlbHNle3ZhciByPWZ1bmN0aW9uKCl7fTtyLnByb3RvdHlwZT1lLnByb3RvdHlwZSxuPW5ldyByfXJldHVybiB0LmNvbnN0cnVjdG9yPT09T2JqZWN0JiYodC5jb25zdHJ1Y3Rvcj1mdW5jdGlvbigpe2lmKGUhPT1PYmplY3QpcmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfSksdC5jb25zdHJ1Y3Rvci5wcm90b3R5cGU9bixhLnVwZGF0ZSh0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSx0KSx0LmNvbnN0cnVjdG9yLl9fc3VwZXJfXz1lLHQuY29uc3RydWN0b3J9LG1peGluOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50c1swXSx0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKylmb3IodmFyIG4gaW4gYXJndW1lbnRzW3RdLnByb3RvdHlwZSl7dmFyIHI9YXJndW1lbnRzW3RdLnByb3RvdHlwZVtuXTsiY29uc3RydWN0b3IiIT09biYmKGUucHJvdG90eXBlW25dPXIpfXJldHVybiBlfSxoaWRlUHJvcGVydGllczpmdW5jdGlvbihlLHQpeyJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydHkmJmEuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9KSl9LHByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGk9e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOnZvaWQgMD09PXJ8fHJ9OyJmdW5jdGlvbiIhPXR5cGVvZiBufHxvPyhpLnZhbHVlPW4saS53cml0YWJsZT0hMCk6aS5nZXQ9bixPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LGkpfSxtZW1vaXplZFByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPW51bGw7YS5wcm9wZXJ0eShlLHQsKGZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PT1vJiYobz1uKCkpLG99KSxyKX0saG9pc3RQYXlsb2FkTWVtYmVyOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXQub3BlcmF0aW9uLHI9dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW25dLG89ci5vdXRwdXQ7aWYoby5wYXlsb2FkJiYhci5oYXNFdmVudE91dHB1dCl7dmFyIGk9by5tZW1iZXJzW28ucGF5bG9hZF0scz1lLmRhdGFbby5wYXlsb2FkXTsic3RydWN0dXJlIj09PWkudHlwZSYmYS5lYWNoKHMsKGZ1bmN0aW9uKHQsbil7YS5wcm9wZXJ0eShlLmRhdGEsdCxuLCExKX0pKX19LGNvbXB1dGVTaGEyNTY6ZnVuY3Rpb24odCxuKXtpZihhLmlzTm9kZSgpKXt2YXIgcj1hLnN0cmVhbS5TdHJlYW0sbz1lKCJmcyIpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByJiZ0IGluc3RhbmNlb2Ygcil7aWYoInN0cmluZyIhPXR5cGVvZiB0LnBhdGgpcmV0dXJuIG4obmV3IEVycm9yKCJOb24tZmlsZSBzdHJlYW0gb2JqZWN0cyBhcmUgbm90IHN1cHBvcnRlZCB3aXRoIFNpZ1Y0IikpO3ZhciBpPXt9OyJudW1iZXIiPT10eXBlb2YgdC5zdGFydCYmKGkuc3RhcnQ9dC5zdGFydCksIm51bWJlciI9PXR5cGVvZiB0LmVuZCYmKGkuZW5kPXQuZW5kKSx0PW8uY3JlYXRlUmVhZFN0cmVhbSh0LnBhdGgsaSl9fWEuY3J5cHRvLnNoYTI1Nih0LCJoZXgiLChmdW5jdGlvbihlLHQpe2U/bihlKTpuKG51bGwsdCl9KSl9LGlzQ2xvY2tTa2V3ZWQ6ZnVuY3Rpb24oZSl7aWYoZSlyZXR1cm4gYS5wcm9wZXJ0eShpLmNvbmZpZywiaXNDbG9ja1NrZXdlZCIsTWF0aC5hYnMoKG5ldyBEYXRlKS5nZXRUaW1lKCktZSk+PTNlNSwhMSksaS5jb25maWcuaXNDbG9ja1NrZXdlZH0sYXBwbHlDbG9ja09mZnNldDpmdW5jdGlvbihlKXtlJiYoaS5jb25maWcuc3lzdGVtQ2xvY2tPZmZzZXQ9ZS0obmV3IERhdGUpLmdldFRpbWUoKSl9LGV4dHJhY3RSZXF1ZXN0SWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5odHRwUmVzcG9uc2UuaGVhZGVyc1sieC1hbXotcmVxdWVzdC1pZCJdfHxlLmh0dHBSZXNwb25zZS5oZWFkZXJzWyJ4LWFtem4tcmVxdWVzdGlkIl07IXQmJmUuZGF0YSYmZS5kYXRhLlJlc3BvbnNlTWV0YWRhdGEmJih0PWUuZGF0YS5SZXNwb25zZU1ldGFkYXRhLlJlcXVlc3RJZCksdCYmKGUucmVxdWVzdElkPXQpLGUuZXJyb3ImJihlLmVycm9yLnJlcXVlc3RJZD10KX0sYWRkUHJvbWlzZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj0hMTt2b2lkIDA9PT10JiZpJiZpLmNvbmZpZyYmKHQ9aS5jb25maWcuZ2V0UHJvbWlzZXNEZXBlbmRlbmN5KCkpLHZvaWQgMD09PXQmJiJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSYmKHQ9UHJvbWlzZSksImZ1bmN0aW9uIiE9dHlwZW9mIHQmJihuPSEwKSxBcnJheS5pc0FycmF5KGUpfHwoZT1bZV0pO2Zvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgbz1lW3JdO24/by5kZWxldGVQcm9taXNlc0Zyb21DbGFzcyYmby5kZWxldGVQcm9taXNlc0Zyb21DbGFzcygpOm8uYWRkUHJvbWlzZXNUb0NsYXNzJiZvLmFkZFByb21pc2VzVG9DbGFzcyh0KX19LHByb21pc2lmeU1ldGhvZDpmdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiBuZXcgdCgoZnVuY3Rpb24odCxvKXtyLnB1c2goKGZ1bmN0aW9uKGUsbil7ZT9vKGUpOnQobil9KSksbltlXS5hcHBseShuLHIpfSkpfX0saXNEdWFsc3RhY2tBdmFpbGFibGU6ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuITE7dmFyIG49ZSgiLi4vYXBpcy9tZXRhZGF0YS5qc29uIik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiB0JiYodD10LnNlcnZpY2VJZGVudGlmaWVyKSwhKCJzdHJpbmciIT10eXBlb2YgdHx8IW4uaGFzT3duUHJvcGVydHkodCl8fCFuW3RdLmR1YWxzdGFja0F2YWlsYWJsZSl9LGNhbGN1bGF0ZVJldHJ5RGVsYXk6ZnVuY3Rpb24oZSx0LG4pe3R8fCh0PXt9KTt2YXIgcj10LmN1c3RvbUJhY2tvZmZ8fG51bGw7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHIpcmV0dXJuIHIoZSxuKTt2YXIgbz0ibnVtYmVyIj09dHlwZW9mIHQuYmFzZT90LmJhc2U6MTAwO3JldHVybiBNYXRoLnJhbmRvbSgpKihNYXRoLnBvdygyLGUpKm8pfSxoYW5kbGVSZXF1ZXN0V2l0aFJldHJpZXM6ZnVuY3Rpb24oZSx0LG4pe3R8fCh0PXt9KTt2YXIgcj1pLkh0dHBDbGllbnQuZ2V0SW5zdGFuY2UoKSxvPXQuaHR0cE9wdGlvbnN8fHt9LHM9MCxjPWZ1bmN0aW9uKGUpe3ZhciByPXQubWF4UmV0cmllc3x8MDtpZihlJiYiVGltZW91dEVycm9yIj09PWUuY29kZSYmKGUucmV0cnlhYmxlPSEwKSxlJiZlLnJldHJ5YWJsZSYmczxyKXt2YXIgbz1hLmNhbGN1bGF0ZVJldHJ5RGVsYXkocyx0LnJldHJ5RGVsYXlPcHRpb25zLGUpO2lmKG8+PTApcmV0dXJuIHMrKyx2b2lkIHNldFRpbWVvdXQodSxvKyhlLnJldHJ5QWZ0ZXJ8fDApKX1uKGUpfSx1PWZ1bmN0aW9uKCl7dmFyIHQ9IiI7ci5oYW5kbGVSZXF1ZXN0KGUsbywoZnVuY3Rpb24oZSl7ZS5vbigiZGF0YSIsKGZ1bmN0aW9uKGUpe3QrPWUudG9TdHJpbmcoKX0pKSxlLm9uKCJlbmQiLChmdW5jdGlvbigpe3ZhciByPWUuc3RhdHVzQ29kZTtpZihyPDMwMCluKG51bGwsdCk7ZWxzZXt2YXIgbz0xZTMqcGFyc2VJbnQoZS5oZWFkZXJzWyJyZXRyeS1hZnRlciJdLDEwKXx8MCxpPWEuZXJyb3IobmV3IEVycm9yLHtzdGF0dXNDb2RlOnIscmV0cnlhYmxlOnI+PTUwMHx8NDI5PT09cn0pO28mJmkucmV0cnlhYmxlJiYoaS5yZXRyeUFmdGVyPW8pLGMoaSl9fSkpfSksYyl9O2kudXRpbC5kZWZlcih1KX0sdXVpZDp7djQ6ZnVuY3Rpb24oKXtyZXR1cm4gZSgidXVpZCIpLnY0KCl9fSxjb252ZXJ0UGF5bG9hZFRvU3RyaW5nOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVxdWVzdCxuPXQub3BlcmF0aW9uLHI9dC5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zW25dLm91dHB1dHx8e307ci5wYXlsb2FkJiZlLmRhdGFbci5wYXlsb2FkXSYmKGUuZGF0YVtyLnBheWxvYWRdPWUuZGF0YVtyLnBheWxvYWRdLnRvU3RyaW5nKCkpfSxkZWZlcjpmdW5jdGlvbihlKXsib2JqZWN0Ij09PW8obikmJiJmdW5jdGlvbiI9PXR5cGVvZiBuLm5leHRUaWNrP24ubmV4dFRpY2soZSk6ImZ1bmN0aW9uIj09dHlwZW9mIHI/cihlKTpzZXRUaW1lb3V0KGUsMCl9LGdldFJlcXVlc3RQYXlsb2FkU2hhcGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zZXJ2aWNlLmFwaS5vcGVyYXRpb25zO2lmKHQpe3ZhciBuPSh0fHx7fSlbZS5vcGVyYXRpb25dO2lmKG4mJm4uaW5wdXQmJm4uaW5wdXQucGF5bG9hZClyZXR1cm4gbi5pbnB1dC5tZW1iZXJzW24uaW5wdXQucGF5bG9hZF19fSxnZXRQcm9maWxlc0Zyb21TaGFyZWRDb25maWc6ZnVuY3Rpb24oZSx0KXt2YXIgcj17fSxvPXt9O24uZW52W2EuY29uZmlnT3B0SW5FbnZdJiYobz1lLmxvYWRGcm9tKHtpc0NvbmZpZzohMCxmaWxlbmFtZTpuLmVudlthLnNoYXJlZENvbmZpZ0ZpbGVFbnZdfSkpO3ZhciBpPXt9O3RyeXtpPWUubG9hZEZyb20oe2ZpbGVuYW1lOnR8fG4uZW52W2EuY29uZmlnT3B0SW5FbnZdJiZuLmVudlthLnNoYXJlZENyZWRlbnRpYWxzRmlsZUVudl19KX1jYXRjaChlKXtpZighbi5lbnZbYS5jb25maWdPcHRJbkVudl0pdGhyb3cgZX1mb3IodmFyIHM9MCxjPU9iamVjdC5rZXlzKG8pO3M8Yy5sZW5ndGg7cysrKXJbY1tzXV09dShyW2Nbc11dfHx7fSxvW2Nbc11dKTtmb3Iocz0wLGM9T2JqZWN0LmtleXMoaSk7czxjLmxlbmd0aDtzKyspcltjW3NdXT11KHJbY1tzXV18fHt9LGlbY1tzXV0pO3JldHVybiByO2Z1bmN0aW9uIHUoZSx0KXtmb3IodmFyIG49MCxyPU9iamVjdC5rZXlzKHQpO248ci5sZW5ndGg7bisrKWVbcltuXV09dFtyW25dXTtyZXR1cm4gZX19LEFSTjp7dmFsaWRhdGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJjA9PT1lLmluZGV4T2YoImFybjoiKSYmZS5zcGxpdCgiOiIpLmxlbmd0aD49Nn0scGFyc2U6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zcGxpdCgiOiIpO3JldHVybntwYXJ0aXRpb246dFsxXSxzZXJ2aWNlOnRbMl0scmVnaW9uOnRbM10sYWNjb3VudElkOnRbNF0scmVzb3VyY2U6dC5zbGljZSg1KS5qb2luKCI6Iil9fSxidWlsZDpmdW5jdGlvbihlKXtpZih2b2lkIDA9PT1lLnNlcnZpY2V8fHZvaWQgMD09PWUucmVnaW9ufHx2b2lkIDA9PT1lLmFjY291bnRJZHx8dm9pZCAwPT09ZS5yZXNvdXJjZSl0aHJvdyBhLmVycm9yKG5ldyBFcnJvcigiSW5wdXQgQVJOIG9iamVjdCBpcyBpbnZhbGlkIikpO3JldHVybiJhcm46IisoZS5wYXJ0aXRpb258fCJhd3MiKSsiOiIrZS5zZXJ2aWNlKyI6IitlLnJlZ2lvbisiOiIrZS5hY2NvdW50SWQrIjoiK2UucmVzb3VyY2V9fSxkZWZhdWx0UHJvZmlsZToiZGVmYXVsdCIsY29uZmlnT3B0SW5FbnY6IkFXU19TREtfTE9BRF9DT05GSUciLHNoYXJlZENyZWRlbnRpYWxzRmlsZUVudjoiQVdTX1NIQVJFRF9DUkVERU5USUFMU19GSUxFIixzaGFyZWRDb25maWdGaWxlRW52OiJBV1NfQ09ORklHX0ZJTEUiLGltZHNEaXNhYmxlZEVudjoiQVdTX0VDMl9NRVRBREFUQV9ESVNBQkxFRCJ9O3QuZXhwb3J0cz1hfSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpLGUoInRpbWVycyIpLnNldEltbWVkaWF0ZSl9LHsiLi4vYXBpcy9tZXRhZGF0YS5qc29uIjo0LCIuL2NvcmUiOjE5LF9wcm9jZXNzOjkxLGZzOjgyLHRpbWVyczo5OSx1dWlkOjEwMn1dLDc1OltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgiLi4vdXRpbCIpLG89ZSgiLi4vbW9kZWwvc2hhcGUiKTtmdW5jdGlvbiBpKCl7fWZ1bmN0aW9uIGEoZSx0KXtmb3IodmFyIG49ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0KSxyPTAsbz1uLmxlbmd0aDtyPG87cisrKWlmKG5bcl0ucGFyZW50Tm9kZT09PWUpcmV0dXJuIG5bcl19ZnVuY3Rpb24gcyhlLHQpe3N3aXRjaCh0fHwodD17fSksdC50eXBlKXtjYXNlInN0cnVjdHVyZSI6cmV0dXJuIGMoZSx0KTtjYXNlIm1hcCI6cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXt9LHI9dC5rZXkubmFtZXx8ImtleSIsbz10LnZhbHVlLm5hbWV8fCJ2YWx1ZSIsaT10LmZsYXR0ZW5lZD90Lm5hbWU6ImVudHJ5IixjPWUuZmlyc3RFbGVtZW50Q2hpbGQ7Yzspe2lmKGMubm9kZU5hbWU9PT1pKXt2YXIgdT1hKGMscikudGV4dENvbnRlbnQsbD1hKGMsbyk7blt1XT1zKGwsdC52YWx1ZSl9Yz1jLm5leHRFbGVtZW50U2libGluZ31yZXR1cm4gbn0oZSx0KTtjYXNlImxpc3QiOnJldHVybiBmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXSxyPXQuZmxhdHRlbmVkP3QubmFtZTp0Lm1lbWJlci5uYW1lfHwibWVtYmVyIixvPWUuZmlyc3RFbGVtZW50Q2hpbGQ7bzspby5ub2RlTmFtZT09PXImJm4ucHVzaChzKG8sdC5tZW1iZXIpKSxvPW8ubmV4dEVsZW1lbnRTaWJsaW5nO3JldHVybiBufShlLHQpO2Nhc2Ugdm9pZCAwOmNhc2UgbnVsbDpyZXR1cm4gZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4iIjtpZighZS5maXJzdEVsZW1lbnRDaGlsZClyZXR1cm4gbnVsbD09PWUucGFyZW50Tm9kZS5wYXJlbnROb2RlP3t9OjA9PT1lLmNoaWxkTm9kZXMubGVuZ3RoPyIiOmUudGV4dENvbnRlbnQ7Zm9yKHZhciB0PXt0eXBlOiJzdHJ1Y3R1cmUiLG1lbWJlcnM6e319LG49ZS5maXJzdEVsZW1lbnRDaGlsZDtuOyl7dmFyIHI9bi5ub2RlTmFtZTtPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodC5tZW1iZXJzLHIpP3QubWVtYmVyc1tyXS50eXBlPSJsaXN0Ijp0Lm1lbWJlcnNbcl09e25hbWU6cn0sbj1uLm5leHRFbGVtZW50U2libGluZ31yZXR1cm4gYyhlLHQpfShlKTtkZWZhdWx0OnJldHVybiBmdW5jdGlvbihlLHQpe2lmKGUuZ2V0QXR0cmlidXRlKXt2YXIgbj1lLmdldEF0dHJpYnV0ZSgiZW5jb2RpbmciKTsiYmFzZTY0Ij09PW4mJih0PW5ldyBvLmNyZWF0ZSh7dHlwZTpufSkpfXZhciByPWUudGV4dENvbnRlbnQ7cmV0dXJuIiI9PT1yJiYocj1udWxsKSwiZnVuY3Rpb24iPT10eXBlb2YgdC50b1R5cGU/dC50b1R5cGUocik6cn0oZSx0KX19ZnVuY3Rpb24gYyhlLHQpe3ZhciBuPXt9O3JldHVybiBudWxsPT09ZXx8ci5lYWNoKHQubWVtYmVycywoZnVuY3Rpb24ocixvKXtpZihvLmlzWG1sQXR0cmlidXRlKXtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZS5hdHRyaWJ1dGVzLG8ubmFtZSkpe3ZhciBpPWUuYXR0cmlidXRlc1tvLm5hbWVdLnZhbHVlO25bcl09cyh7dGV4dENvbnRlbnQ6aX0sbyl9fWVsc2V7dmFyIGM9by5mbGF0dGVuZWQ/ZTphKGUsby5uYW1lKTtjP25bcl09cyhjLG8pOm8uZmxhdHRlbmVkfHwibGlzdCIhPT1vLnR5cGV8fHQuYXBpLnhtbE5vRGVmYXVsdExpc3RzfHwobltyXT1vLmRlZmF1bHRWYWx1ZSl9fSkpLG59aS5wcm90b3R5cGUucGFyc2U9ZnVuY3Rpb24oZSx0KXtpZigiIj09PWUucmVwbGFjZSgvXlxzKy8sIiIpKXJldHVybnt9O3ZhciBuLG87dHJ5e2lmKHdpbmRvdy5ET01QYXJzZXIpe3RyeXtuPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoZSwidGV4dC94bWwiKX1jYXRjaChlKXt0aHJvdyByLmVycm9yKG5ldyBFcnJvcigiUGFyc2UgZXJyb3IgaW4gZG9jdW1lbnQiKSx7b3JpZ2luYWxFcnJvcjplLGNvZGU6IlhNTFBhcnNlckVycm9yIixyZXRyeWFibGU6ITB9KX1pZihudWxsPT09bi5kb2N1bWVudEVsZW1lbnQpdGhyb3cgci5lcnJvcihuZXcgRXJyb3IoIkNhbm5vdCBwYXJzZSBlbXB0eSBkb2N1bWVudC4iKSx7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pO3ZhciBpPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIilbMF07aWYoaSYmKGkucGFyZW50Tm9kZT09PW58fCJib2R5Ij09PWkucGFyZW50Tm9kZS5ub2RlTmFtZXx8aS5wYXJlbnROb2RlLnBhcmVudE5vZGU9PT1ufHwiYm9keSI9PT1pLnBhcmVudE5vZGUucGFyZW50Tm9kZS5ub2RlTmFtZSkpe3ZhciBjPWkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImRpdiIpWzBdfHxpO3Rocm93IHIuZXJyb3IobmV3IEVycm9yKGMudGV4dENvbnRlbnR8fCJQYXJzZXIgZXJyb3IgaW4gZG9jdW1lbnQiKSx7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pfX1lbHNle2lmKCF3aW5kb3cuQWN0aXZlWE9iamVjdCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBsb2FkIFhNTCBwYXJzZXIiKTtpZigobj1uZXcgd2luZG93LkFjdGl2ZVhPYmplY3QoIk1pY3Jvc29mdC5YTUxET00iKSkuYXN5bmM9ITEsIW4ubG9hZFhNTChlKSl0aHJvdyByLmVycm9yKG5ldyBFcnJvcigiUGFyc2UgZXJyb3IgaW4gZG9jdW1lbnQiKSx7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pfX1jYXRjaChlKXtvPWV9aWYobiYmbi5kb2N1bWVudEVsZW1lbnQmJiFvKXt2YXIgdT1zKG4uZG9jdW1lbnRFbGVtZW50LHQpLGw9YShuLmRvY3VtZW50RWxlbWVudCwiUmVzcG9uc2VNZXRhZGF0YSIpO3JldHVybiBsJiYodS5SZXNwb25zZU1ldGFkYXRhPXMobCx7fSkpLHV9aWYobyl0aHJvdyByLmVycm9yKG98fG5ldyBFcnJvcix7Y29kZToiWE1MUGFyc2VyRXJyb3IiLHJldHJ5YWJsZTohMH0pO3JldHVybnt9fSx0LmV4cG9ydHM9aX0seyIuLi9tb2RlbC9zaGFwZSI6NDUsIi4uL3V0aWwiOjc0fV0sNzY6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuLi91dGlsIiksbz1lKCIuL3htbC1ub2RlIikuWG1sTm9kZSxpPWUoIi4veG1sLXRleHQiKS5YbWxUZXh0O2Z1bmN0aW9uIGEoKXt9ZnVuY3Rpb24gcyhlLHQsbil7c3dpdGNoKG4udHlwZSl7Y2FzZSJzdHJ1Y3R1cmUiOnJldHVybiBmdW5jdGlvbihlLHQsbil7ci5hcnJheUVhY2gobi5tZW1iZXJOYW1lcywoZnVuY3Rpb24ocil7dmFyIGk9bi5tZW1iZXJzW3JdO2lmKCJib2R5Ij09PWkubG9jYXRpb24pe3ZhciBhPXRbcl0sdT1pLm5hbWU7aWYobnVsbCE9YSlpZihpLmlzWG1sQXR0cmlidXRlKWUuYWRkQXR0cmlidXRlKHUsYSk7ZWxzZSBpZihpLmZsYXR0ZW5lZClzKGUsYSxpKTtlbHNle3ZhciBsPW5ldyBvKHUpO2UuYWRkQ2hpbGROb2RlKGwpLGMobCxpKSxzKGwsYSxpKX19fSkpfShlLHQsbik7Y2FzZSJtYXAiOnJldHVybiBmdW5jdGlvbihlLHQsbil7dmFyIGk9bi5rZXkubmFtZXx8ImtleSIsYT1uLnZhbHVlLm5hbWV8fCJ2YWx1ZSI7ci5lYWNoKHQsKGZ1bmN0aW9uKHQscil7dmFyIGM9bmV3IG8obi5mbGF0dGVuZWQ/bi5uYW1lOiJlbnRyeSIpO2UuYWRkQ2hpbGROb2RlKGMpO3ZhciB1PW5ldyBvKGkpLGw9bmV3IG8oYSk7Yy5hZGRDaGlsZE5vZGUodSksYy5hZGRDaGlsZE5vZGUobCkscyh1LHQsbi5rZXkpLHMobCxyLG4udmFsdWUpfSkpfShlLHQsbik7Y2FzZSJsaXN0IjpyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe24uZmxhdHRlbmVkP3IuYXJyYXlFYWNoKHQsKGZ1bmN0aW9uKHQpe3ZhciByPW4ubWVtYmVyLm5hbWV8fG4ubmFtZSxpPW5ldyBvKHIpO2UuYWRkQ2hpbGROb2RlKGkpLHMoaSx0LG4ubWVtYmVyKX0pKTpyLmFycmF5RWFjaCh0LChmdW5jdGlvbih0KXt2YXIgcj1uLm1lbWJlci5uYW1lfHwibWVtYmVyIixpPW5ldyBvKHIpO2UuYWRkQ2hpbGROb2RlKGkpLHMoaSx0LG4ubWVtYmVyKX0pKX0oZSx0LG4pO2RlZmF1bHQ6cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXtlLmFkZENoaWxkTm9kZShuZXcgaShuLnRvV2lyZUZvcm1hdCh0KSkpfShlLHQsbil9fWZ1bmN0aW9uIGMoZSx0LG4pe3ZhciByLG89InhtbG5zIjt0LnhtbE5hbWVzcGFjZVVyaT8ocj10LnhtbE5hbWVzcGFjZVVyaSx0LnhtbE5hbWVzcGFjZVByZWZpeCYmKG8rPSI6Iit0LnhtbE5hbWVzcGFjZVByZWZpeCkpOm4mJnQuYXBpLnhtbE5hbWVzcGFjZVVyaSYmKHI9dC5hcGkueG1sTmFtZXNwYWNlVXJpKSxyJiZlLmFkZEF0dHJpYnV0ZShvLHIpfWEucHJvdG90eXBlLnRvWE1MPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBpPW5ldyBvKG4pO3JldHVybiBjKGksdCwhMCkscyhpLGUsdCksaS5jaGlsZHJlbi5sZW5ndGg+MHx8cj9pLnRvU3RyaW5nKCk6IiJ9LHQuZXhwb3J0cz1hfSx7Ii4uL3V0aWwiOjc0LCIuL3htbC1ub2RlIjo3OSwiLi94bWwtdGV4dCI6ODB9XSw3NzpbZnVuY3Rpb24oZSx0LG4pe3QuZXhwb3J0cz17ZXNjYXBlQXR0cmlidXRlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC8nL2csIiZhcG9zOyIpLnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyIvZywiJnF1b3Q7Iil9fX0se31dLDc4OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPXtlc2NhcGVFbGVtZW50OmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoLyYvZywiJmFtcDsiKS5yZXBsYWNlKC88L2csIiZsdDsiKS5yZXBsYWNlKC8+L2csIiZndDsiKS5yZXBsYWNlKC9cci9nLCImI3gwRDsiKS5yZXBsYWNlKC9cbi9nLCImI3gwQTsiKS5yZXBsYWNlKC9cdTAwODUvZywiJiN4ODU7IikucmVwbGFjZSgvXHUyMDI4LywiJiN4MjAyODsiKX19fSx7fV0sNzk6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcj1lKCIuL2VzY2FwZS1hdHRyaWJ1dGUiKS5lc2NhcGVBdHRyaWJ1dGU7ZnVuY3Rpb24gbyhlLHQpe3ZvaWQgMD09PXQmJih0PVtdKSx0aGlzLm5hbWU9ZSx0aGlzLmNoaWxkcmVuPXQsdGhpcy5hdHRyaWJ1dGVzPXt9fW8ucHJvdG90eXBlLmFkZEF0dHJpYnV0ZT1mdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbZV09dCx0aGlzfSxvLnByb3RvdHlwZS5hZGRDaGlsZE5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ucHVzaChlKSx0aGlzfSxvLnByb3RvdHlwZS5yZW1vdmVBdHRyaWJ1dGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbZV0sdGhpc30sby5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIGU9Qm9vbGVhbih0aGlzLmNoaWxkcmVuLmxlbmd0aCksdD0iPCIrdGhpcy5uYW1lLG49dGhpcy5hdHRyaWJ1dGVzLG89MCxpPU9iamVjdC5rZXlzKG4pO288aS5sZW5ndGg7bysrKXt2YXIgYT1pW29dLHM9blthXTtudWxsIT1zJiYodCs9IiAiK2ErJz0iJytyKCIiK3MpKyciJyl9cmV0dXJuIHQrKGU/Ij4iK3RoaXMuY2hpbGRyZW4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS50b1N0cmluZygpfSkpLmpvaW4oIiIpKyI8LyIrdGhpcy5uYW1lKyI+IjoiLz4iKX0sdC5leHBvcnRzPXtYbWxOb2RlOm99fSx7Ii4vZXNjYXBlLWF0dHJpYnV0ZSI6Nzd9XSw4MDpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPWUoIi4vZXNjYXBlLWVsZW1lbnQiKS5lc2NhcGVFbGVtZW50O2Z1bmN0aW9uIG8oZSl7dGhpcy52YWx1ZT1lfW8ucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHIoIiIrdGhpcy52YWx1ZSl9LHQuZXhwb3J0cz17WG1sVGV4dDpvfX0seyIuL2VzY2FwZS1lbGVtZW50Ijo3OH1dLDgxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO24uYnl0ZUxlbmd0aD1mdW5jdGlvbihlKXt2YXIgdD1jKGUpLG49dFswXSxyPXRbMV07cmV0dXJuIDMqKG4rcikvNC1yfSxuLnRvQnl0ZUFycmF5PWZ1bmN0aW9uKGUpe3ZhciB0LG4scj1jKGUpLGE9clswXSxzPXJbMV0sdT1uZXcgaShmdW5jdGlvbihlLHQsbil7cmV0dXJuIDMqKHQrbikvNC1ufSgwLGEscykpLGw9MCxwPXM+MD9hLTQ6YTtmb3Iobj0wO248cDtuKz00KXQ9b1tlLmNoYXJDb2RlQXQobildPDwxOHxvW2UuY2hhckNvZGVBdChuKzEpXTw8MTJ8b1tlLmNoYXJDb2RlQXQobisyKV08PDZ8b1tlLmNoYXJDb2RlQXQobiszKV0sdVtsKytdPXQ+PjE2JjI1NSx1W2wrK109dD4+OCYyNTUsdVtsKytdPTI1NSZ0O3JldHVybiAyPT09cyYmKHQ9b1tlLmNoYXJDb2RlQXQobildPDwyfG9bZS5jaGFyQ29kZUF0KG4rMSldPj40LHVbbCsrXT0yNTUmdCksMT09PXMmJih0PW9bZS5jaGFyQ29kZUF0KG4pXTw8MTB8b1tlLmNoYXJDb2RlQXQobisxKV08PDR8b1tlLmNoYXJDb2RlQXQobisyKV0+PjIsdVtsKytdPXQ+PjgmMjU1LHVbbCsrXT0yNTUmdCksdX0sbi5mcm9tQnl0ZUFycmF5PWZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuPWUubGVuZ3RoLG89biUzLGk9W10sYT0xNjM4MyxzPTAsYz1uLW87czxjO3MrPWEpaS5wdXNoKHUoZSxzLHMrYT5jP2M6cythKSk7cmV0dXJuIDE9PT1vPyh0PWVbbi0xXSxpLnB1c2goclt0Pj4yXStyW3Q8PDQmNjNdKyI9PSIpKToyPT09byYmKHQ9KGVbbi0yXTw8OCkrZVtuLTFdLGkucHVzaChyW3Q+PjEwXStyW3Q+PjQmNjNdK3JbdDw8MiY2M10rIj0iKSksaS5qb2luKCIiKX07Zm9yKHZhciByPVtdLG89W10saT0idW5kZWZpbmVkIiE9dHlwZW9mIFVpbnQ4QXJyYXk/VWludDhBcnJheTpBcnJheSxhPSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIixzPTA7czw2NDsrK3MpcltzXT1hW3NdLG9bYS5jaGFyQ29kZUF0KHMpXT1zO2Z1bmN0aW9uIGMoZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodCU0PjApdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0Iik7dmFyIG49ZS5pbmRleE9mKCI9Iik7cmV0dXJuLTE9PT1uJiYobj10KSxbbixuPT09dD8wOjQtbiU0XX1mdW5jdGlvbiB1KGUsdCxuKXtmb3IodmFyIG8saSxhPVtdLHM9dDtzPG47cys9MylvPShlW3NdPDwxNiYxNjcxMTY4MCkrKGVbcysxXTw8OCY2NTI4MCkrKDI1NSZlW3MrMl0pLGEucHVzaChyWyhpPW8pPj4xOCY2M10rcltpPj4xMiY2M10rcltpPj42JjYzXStyWzYzJmldKTtyZXR1cm4gYS5qb2luKCIiKX1vWyItIi5jaGFyQ29kZUF0KDApXT02MixvWyJfIi5jaGFyQ29kZUF0KDApXT02M30se31dLDgyOltmdW5jdGlvbihlLHQsbil7fSx7fV0sODM6W2Z1bmN0aW9uKGUsdCxuKXsiZnVuY3Rpb24iPT10eXBlb2YgT2JqZWN0LmNyZWF0ZT90LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtlLnN1cGVyXz10LGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pfTp0LmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtlLnN1cGVyXz10O3ZhciBuPWZ1bmN0aW9uKCl7fTtuLnByb3RvdHlwZT10LnByb3RvdHlwZSxlLnByb3RvdHlwZT1uZXcgbixlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lfX0se31dLDg0OltmdW5jdGlvbihlLHQsbil7dC5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYib2JqZWN0Ij09PW8oZSkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmNvcHkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmZpbGwmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnJlYWRVSW50OH19LHt9XSw4NTpbZnVuY3Rpb24oZSx0LHIpeyhmdW5jdGlvbih0LG4peyhmdW5jdGlvbigpe3ZhciBpPS8lW3NkaiVdL2c7ci5mb3JtYXQ9ZnVuY3Rpb24oZSl7aWYoIXkoZSkpe2Zvcih2YXIgdD1bXSxuPTA7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LnB1c2goYyhhcmd1bWVudHNbbl0pKTtyZXR1cm4gdC5qb2luKCIgIil9bj0xO2Zvcih2YXIgcj1hcmd1bWVudHMsbz1yLmxlbmd0aCxhPVN0cmluZyhlKS5yZXBsYWNlKGksKGZ1bmN0aW9uKGUpe2lmKCIlJSI9PT1lKXJldHVybiIlIjtpZihuPj1vKXJldHVybiBlO3N3aXRjaChlKXtjYXNlIiVzIjpyZXR1cm4gU3RyaW5nKHJbbisrXSk7Y2FzZSIlZCI6cmV0dXJuIE51bWJlcihyW24rK10pO2Nhc2UiJWoiOnRyeXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkocltuKytdKX1jYXRjaChlKXtyZXR1cm4iW0NpcmN1bGFyXSJ9ZGVmYXVsdDpyZXR1cm4gZX19KSkscz1yW25dO248bztzPXJbKytuXSltKHMpfHwhUyhzKT9hKz0iICIrczphKz0iICIrYyhzKTtyZXR1cm4gYX0sci5kZXByZWNhdGU9ZnVuY3Rpb24oZSxvKXtpZihiKG4ucHJvY2VzcykpcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHIuZGVwcmVjYXRlKGUsbykuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtpZighMD09PXQubm9EZXByZWNhdGlvbilyZXR1cm4gZTt2YXIgaT0hMTtyZXR1cm4gZnVuY3Rpb24oKXtpZighaSl7aWYodC50aHJvd0RlcHJlY2F0aW9uKXRocm93IG5ldyBFcnJvcihvKTt0LnRyYWNlRGVwcmVjYXRpb24/Y29uc29sZS50cmFjZShvKTpjb25zb2xlLmVycm9yKG8pLGk9ITB9cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX07dmFyIGEscz17fTtmdW5jdGlvbiBjKGUsdCl7dmFyIG49e3NlZW46W10sc3R5bGl6ZTpsfTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD49MyYmKG4uZGVwdGg9YXJndW1lbnRzWzJdKSxhcmd1bWVudHMubGVuZ3RoPj00JiYobi5jb2xvcnM9YXJndW1lbnRzWzNdKSxnKHQpP24uc2hvd0hpZGRlbj10OnQmJnIuX2V4dGVuZChuLHQpLGIobi5zaG93SGlkZGVuKSYmKG4uc2hvd0hpZGRlbj0hMSksYihuLmRlcHRoKSYmKG4uZGVwdGg9MiksYihuLmNvbG9ycykmJihuLmNvbG9ycz0hMSksYihuLmN1c3RvbUluc3BlY3QpJiYobi5jdXN0b21JbnNwZWN0PSEwKSxuLmNvbG9ycyYmKG4uc3R5bGl6ZT11KSxwKG4sZSxuLmRlcHRoKX1mdW5jdGlvbiB1KGUsdCl7dmFyIG49Yy5zdHlsZXNbdF07cmV0dXJuIG4/IhtbIitjLmNvbG9yc1tuXVswXSsibSIrZSsiG1siK2MuY29sb3JzW25dWzFdKyJtIjplfWZ1bmN0aW9uIGwoZSx0KXtyZXR1cm4gZX1mdW5jdGlvbiBwKGUsdCxuKXtpZihlLmN1c3RvbUluc3BlY3QmJnQmJkkodC5pbnNwZWN0KSYmdC5pbnNwZWN0IT09ci5pbnNwZWN0JiYoIXQuY29uc3RydWN0b3J8fHQuY29uc3RydWN0b3IucHJvdG90eXBlIT09dCkpe3ZhciBvPXQuaW5zcGVjdChuLGUpO3JldHVybiB5KG8pfHwobz1wKGUsbyxuKSksb312YXIgaT1mdW5jdGlvbihlLHQpe2lmKGIodCkpcmV0dXJuIGUuc3R5bGl6ZSgidW5kZWZpbmVkIiwidW5kZWZpbmVkIik7aWYoeSh0KSl7dmFyIG49IiciK0pTT04uc3RyaW5naWZ5KHQpLnJlcGxhY2UoL14ifCIkL2csIiIpLnJlcGxhY2UoLycvZywiXFwnIikucmVwbGFjZSgvXFwiL2csJyInKSsiJyI7cmV0dXJuIGUuc3R5bGl6ZShuLCJzdHJpbmciKX1yZXR1cm4gdih0KT9lLnN0eWxpemUoIiIrdCwibnVtYmVyIik6Zyh0KT9lLnN0eWxpemUoIiIrdCwiYm9vbGVhbiIpOm0odCk/ZS5zdHlsaXplKCJudWxsIiwibnVsbCIpOnZvaWQgMH0oZSx0KTtpZihpKXJldHVybiBpO3ZhciBhPU9iamVjdC5rZXlzKHQpLHM9ZnVuY3Rpb24oZSl7dmFyIHQ9e307cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSxuKXt0W2VdPSEwfSkpLHR9KGEpO2lmKGUuc2hvd0hpZGRlbiYmKGE9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCkpLFQodCkmJihhLmluZGV4T2YoIm1lc3NhZ2UiKT49MHx8YS5pbmRleE9mKCJkZXNjcmlwdGlvbiIpPj0wKSlyZXR1cm4gZCh0KTtpZigwPT09YS5sZW5ndGgpe2lmKEkodCkpe3ZhciBjPXQubmFtZT8iOiAiK3QubmFtZToiIjtyZXR1cm4gZS5zdHlsaXplKCJbRnVuY3Rpb24iK2MrIl0iLCJzcGVjaWFsIil9aWYoRSh0KSlyZXR1cm4gZS5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSwicmVnZXhwIik7aWYoQyh0KSlyZXR1cm4gZS5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCksImRhdGUiKTtpZihUKHQpKXJldHVybiBkKHQpfXZhciB1LGw9IiIsUz0hMSx3PVsieyIsIn0iXTtyZXR1cm4gaCh0KSYmKFM9ITAsdz1bIlsiLCJdIl0pLEkodCkmJihsPSIgW0Z1bmN0aW9uIisodC5uYW1lPyI6ICIrdC5uYW1lOiIiKSsiXSIpLEUodCkmJihsPSIgIitSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpLEModCkmJihsPSIgIitEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHQpKSxUKHQpJiYobD0iICIrZCh0KSksMCE9PWEubGVuZ3RofHxTJiYwIT10Lmxlbmd0aD9uPDA/RSh0KT9lLnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLCJyZWdleHAiKTplLnN0eWxpemUoIltPYmplY3RdIiwic3BlY2lhbCIpOihlLnNlZW4ucHVzaCh0KSx1PVM/ZnVuY3Rpb24oZSx0LG4scixvKXtmb3IodmFyIGk9W10sYT0wLHM9dC5sZW5ndGg7YTxzOysrYSlSKHQsU3RyaW5nKGEpKT9pLnB1c2goZihlLHQsbixyLFN0cmluZyhhKSwhMCkpOmkucHVzaCgiIik7cmV0dXJuIG8uZm9yRWFjaCgoZnVuY3Rpb24obyl7by5tYXRjaCgvXlxkKyQvKXx8aS5wdXNoKGYoZSx0LG4scixvLCEwKSl9KSksaX0oZSx0LG4scyxhKTphLm1hcCgoZnVuY3Rpb24ocil7cmV0dXJuIGYoZSx0LG4scyxyLFMpfSkpLGUuc2Vlbi5wb3AoKSxmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQuaW5kZXhPZigiXG4iKSxlK3QucmVwbGFjZSgvXHUwMDFiXFtcZFxkP20vZywiIikubGVuZ3RoKzF9KSwwKTtyZXR1cm4gcj42MD9uWzBdKygiIj09PXQ/IiI6dCsiXG4gIikrIiAiK2Uuam9pbigiLFxuICAiKSsiICIrblsxXTpuWzBdK3QrIiAiK2Uuam9pbigiLCAiKSsiICIrblsxXX0odSxsLHcpKTp3WzBdK2wrd1sxXX1mdW5jdGlvbiBkKGUpe3JldHVybiJbIitFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSsiXSJ9ZnVuY3Rpb24gZihlLHQsbixyLG8saSl7dmFyIGEscyxjO2lmKChjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxvKXx8e3ZhbHVlOnRbb119KS5nZXQ/cz1jLnNldD9lLnN0eWxpemUoIltHZXR0ZXIvU2V0dGVyXSIsInNwZWNpYWwiKTplLnN0eWxpemUoIltHZXR0ZXJdIiwic3BlY2lhbCIpOmMuc2V0JiYocz1lLnN0eWxpemUoIltTZXR0ZXJdIiwic3BlY2lhbCIpKSxSKHIsbyl8fChhPSJbIitvKyJdIiksc3x8KGUuc2Vlbi5pbmRleE9mKGMudmFsdWUpPDA/KHM9bShuKT9wKGUsYy52YWx1ZSxudWxsKTpwKGUsYy52YWx1ZSxuLTEpKS5pbmRleE9mKCJcbiIpPi0xJiYocz1pP3Muc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbihlKXtyZXR1cm4iICAiK2V9KSkuam9pbigiXG4iKS5zdWJzdHIoMik6IlxuIitzLnNwbGl0KCJcbiIpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIiAgICIrZX0pKS5qb2luKCJcbiIpKTpzPWUuc3R5bGl6ZSgiW0NpcmN1bGFyXSIsInNwZWNpYWwiKSksYihhKSl7aWYoaSYmby5tYXRjaCgvXlxkKyQvKSlyZXR1cm4gczsoYT1KU09OLnN0cmluZ2lmeSgiIitvKSkubWF0Y2goL14iKFthLXpBLVpfXVthLXpBLVpfMC05XSopIiQvKT8oYT1hLnN1YnN0cigxLGEubGVuZ3RoLTIpLGE9ZS5zdHlsaXplKGEsIm5hbWUiKSk6KGE9YS5yZXBsYWNlKC8nL2csIlxcJyIpLnJlcGxhY2UoL1xcIi9nLCciJykucmVwbGFjZSgvKF4ifCIkKS9nLCInIiksYT1lLnN0eWxpemUoYSwic3RyaW5nIikpfXJldHVybiBhKyI6ICIrc31mdW5jdGlvbiBoKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpfWZ1bmN0aW9uIGcoZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZX1mdW5jdGlvbiBtKGUpe3JldHVybiBudWxsPT09ZX1mdW5jdGlvbiB2KGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX1mdW5jdGlvbiB5KGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX1mdW5jdGlvbiBiKGUpe3JldHVybiB2b2lkIDA9PT1lfWZ1bmN0aW9uIEUoZSl7cmV0dXJuIFMoZSkmJiJbb2JqZWN0IFJlZ0V4cF0iPT09dyhlKX1mdW5jdGlvbiBTKGUpe3JldHVybiJvYmplY3QiPT09byhlKSYmbnVsbCE9PWV9ZnVuY3Rpb24gQyhlKXtyZXR1cm4gUyhlKSYmIltvYmplY3QgRGF0ZV0iPT09dyhlKX1mdW5jdGlvbiBUKGUpe3JldHVybiBTKGUpJiYoIltvYmplY3QgRXJyb3JdIj09PXcoZSl8fGUgaW5zdGFuY2VvZiBFcnJvcil9ZnVuY3Rpb24gSShlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiB3KGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gQShlKXtyZXR1cm4gZTwxMD8iMCIrZS50b1N0cmluZygxMCk6ZS50b1N0cmluZygxMCl9ci5kZWJ1Z2xvZz1mdW5jdGlvbihlKXtpZihiKGEpJiYoYT10LmVudi5OT0RFX0RFQlVHfHwiIiksZT1lLnRvVXBwZXJDYXNlKCksIXNbZV0paWYobmV3IFJlZ0V4cCgiXFxiIitlKyJcXGIiLCJpIikudGVzdChhKSl7dmFyIG49dC5waWQ7c1tlXT1mdW5jdGlvbigpe3ZhciB0PXIuZm9ybWF0LmFwcGx5KHIsYXJndW1lbnRzKTtjb25zb2xlLmVycm9yKCIlcyAlZDogJXMiLGUsbix0KX19ZWxzZSBzW2VdPWZ1bmN0aW9uKCl7fTtyZXR1cm4gc1tlXX0sci5pbnNwZWN0PWMsYy5jb2xvcnM9e2JvbGQ6WzEsMjJdLGl0YWxpYzpbMywyM10sdW5kZXJsaW5lOls0LDI0XSxpbnZlcnNlOls3LDI3XSx3aGl0ZTpbMzcsMzldLGdyZXk6WzkwLDM5XSxibGFjazpbMzAsMzldLGJsdWU6WzM0LDM5XSxjeWFuOlszNiwzOV0sZ3JlZW46WzMyLDM5XSxtYWdlbnRhOlszNSwzOV0scmVkOlszMSwzOV0seWVsbG93OlszMywzOV19LGMuc3R5bGVzPXtzcGVjaWFsOiJjeWFuIixudW1iZXI6InllbGxvdyIsYm9vbGVhbjoieWVsbG93Iix1bmRlZmluZWQ6ImdyZXkiLG51bGw6ImJvbGQiLHN0cmluZzoiZ3JlZW4iLGRhdGU6Im1hZ2VudGEiLHJlZ2V4cDoicmVkIn0sci5pc0FycmF5PWgsci5pc0Jvb2xlYW49ZyxyLmlzTnVsbD1tLHIuaXNOdWxsT3JVbmRlZmluZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV9LHIuaXNOdW1iZXI9dixyLmlzU3RyaW5nPXksci5pc1N5bWJvbD1mdW5jdGlvbihlKXtyZXR1cm4ic3ltYm9sIj09PW8oZSl9LHIuaXNVbmRlZmluZWQ9YixyLmlzUmVnRXhwPUUsci5pc09iamVjdD1TLHIuaXNEYXRlPUMsci5pc0Vycm9yPVQsci5pc0Z1bmN0aW9uPUksci5pc1ByaW1pdGl2ZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09PWV8fCJib29sZWFuIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN0cmluZyI9PXR5cGVvZiBlfHwic3ltYm9sIj09PW8oZSl8fHZvaWQgMD09PWV9LHIuaXNCdWZmZXI9ZSgiLi9zdXBwb3J0L2lzQnVmZmVyIik7dmFyIF89WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXTtmdW5jdGlvbiBSKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfXIubG9nPWZ1bmN0aW9uKCl7dmFyIGUsdDtjb25zb2xlLmxvZygiJXMgLSAlcyIsKGU9bmV3IERhdGUsdD1bQShlLmdldEhvdXJzKCkpLEEoZS5nZXRNaW51dGVzKCkpLEEoZS5nZXRTZWNvbmRzKCkpXS5qb2luKCI6IiksW2UuZ2V0RGF0ZSgpLF9bZS5nZXRNb250aCgpXSx0XS5qb2luKCIgIikpLHIuZm9ybWF0LmFwcGx5KHIsYXJndW1lbnRzKSl9LHIuaW5oZXJpdHM9ZSgiaW5oZXJpdHMiKSxyLl9leHRlbmQ9ZnVuY3Rpb24oZSx0KXtpZighdHx8IVModCkpcmV0dXJuIGU7Zm9yKHZhciBuPU9iamVjdC5rZXlzKHQpLHI9bi5sZW5ndGg7ci0tOyllW25bcl1dPXRbbltyXV07cmV0dXJuIGV9fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJfcHJvY2VzcyIpLHZvaWQgMCE9PW4uZz9uLmc6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3c/d2luZG93Ont9KX0seyIuL3N1cHBvcnQvaXNCdWZmZXIiOjg0LF9wcm9jZXNzOjkxLGluaGVyaXRzOjgzfV0sODY6W2Z1bmN0aW9uKGUsdCxyKXsoZnVuY3Rpb24odCxuKXsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIG49ZSgiYmFzZTY0LWpzIiksbz1lKCJpZWVlNzU0IiksaT1lKCJpc2FycmF5Iik7ZnVuY3Rpb24gYSgpe3JldHVybiBjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/MjE0NzQ4MzY0NzoxMDczNzQxODIzfWZ1bmN0aW9uIHMoZSx0KXtpZihhKCk8dCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgiKTtyZXR1cm4gYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyhlPW5ldyBVaW50OEFycmF5KHQpKS5fX3Byb3RvX189Yy5wcm90b3R5cGU6KG51bGw9PT1lJiYoZT1uZXcgYyh0KSksZS5sZW5ndGg9dCksZX1mdW5jdGlvbiBjKGUsdCxuKXtpZighKGMuVFlQRURfQVJSQVlfU1VQUE9SVHx8dGhpcyBpbnN0YW5jZW9mIGMpKXJldHVybiBuZXcgYyhlLHQsbik7aWYoIm51bWJlciI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJJZiBlbmNvZGluZyBpcyBzcGVjaWZpZWQgdGhlbiB0aGUgZmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyIpO3JldHVybiBwKHRoaXMsZSl9cmV0dXJuIHUodGhpcyxlLHQsbil9ZnVuY3Rpb24gdShlLHQsbixyKXtpZigibnVtYmVyIj09dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcignInZhbHVlIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpO3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJnQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcj9mdW5jdGlvbihlLHQsbixyKXtpZih0LmJ5dGVMZW5ndGgsbjwwfHx0LmJ5dGVMZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ29mZnNldCcgaXMgb3V0IG9mIGJvdW5kcyIpO2lmKHQuYnl0ZUxlbmd0aDxuKyhyfHwwKSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiJ2xlbmd0aCcgaXMgb3V0IG9mIGJvdW5kcyIpO3JldHVybiB0PXZvaWQgMD09PW4mJnZvaWQgMD09PXI/bmV3IFVpbnQ4QXJyYXkodCk6dm9pZCAwPT09cj9uZXcgVWludDhBcnJheSh0LG4pOm5ldyBVaW50OEFycmF5KHQsbixyKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KGU9dCkuX19wcm90b19fPWMucHJvdG90eXBlOmU9ZChlLHQpLGV9KGUsdCxuLHIpOiJzdHJpbmciPT10eXBlb2YgdD9mdW5jdGlvbihlLHQsbil7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYiIiE9PW58fChuPSJ1dGY4IiksIWMuaXNFbmNvZGluZyhuKSl0aHJvdyBuZXcgVHlwZUVycm9yKCciZW5jb2RpbmciIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKTt2YXIgcj0wfGgodCxuKSxvPShlPXMoZSxyKSkud3JpdGUodCxuKTtyZXR1cm4gbyE9PXImJihlPWUuc2xpY2UoMCxvKSksZX0oZSx0LG4pOmZ1bmN0aW9uKGUsdCl7aWYoYy5pc0J1ZmZlcih0KSl7dmFyIG49MHxmKHQubGVuZ3RoKTtyZXR1cm4gMD09PShlPXMoZSxuKSkubGVuZ3RofHx0LmNvcHkoZSwwLDAsbiksZX1pZih0KXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIEFycmF5QnVmZmVyJiZ0LmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyfHwibGVuZ3RoImluIHQpcmV0dXJuIm51bWJlciIhPXR5cGVvZiB0Lmxlbmd0aHx8KHI9dC5sZW5ndGgpIT1yP3MoZSwwKTpkKGUsdCk7aWYoIkJ1ZmZlciI9PT10LnR5cGUmJmkodC5kYXRhKSlyZXR1cm4gZChlLHQuZGF0YSl9dmFyIHI7dGhyb3cgbmV3IFR5cGVFcnJvcigiRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LiIpfShlLHQpfWZ1bmN0aW9uIGwoZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoJyJzaXplIiBhcmd1bWVudCBtdXN0IGJlIGEgbnVtYmVyJyk7aWYoZTwwKXRocm93IG5ldyBSYW5nZUVycm9yKCcic2l6ZSIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKX1mdW5jdGlvbiBwKGUsdCl7aWYobCh0KSxlPXMoZSx0PDA/MDowfGYodCkpLCFjLlRZUEVEX0FSUkFZX1NVUFBPUlQpZm9yKHZhciBuPTA7bjx0OysrbillW25dPTA7cmV0dXJuIGV9ZnVuY3Rpb24gZChlLHQpe3ZhciBuPXQubGVuZ3RoPDA/MDowfGYodC5sZW5ndGgpO2U9cyhlLG4pO2Zvcih2YXIgcj0wO3I8bjtyKz0xKWVbcl09MjU1JnRbcl07cmV0dXJuIGV9ZnVuY3Rpb24gZihlKXtpZihlPj1hKCkpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkF0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gc2l6ZTogMHgiK2EoKS50b1N0cmluZygxNikrIiBieXRlcyIpO3JldHVybiAwfGV9ZnVuY3Rpb24gaChlLHQpe2lmKGMuaXNCdWZmZXIoZSkpcmV0dXJuIGUubGVuZ3RoO2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgQXJyYXlCdWZmZXImJiJmdW5jdGlvbiI9PXR5cGVvZiBBcnJheUJ1ZmZlci5pc1ZpZXcmJihBcnJheUJ1ZmZlci5pc1ZpZXcoZSl8fGUgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpcmV0dXJuIGUuYnl0ZUxlbmd0aDsic3RyaW5nIiE9dHlwZW9mIGUmJihlPSIiK2UpO3ZhciBuPWUubGVuZ3RoO2lmKDA9PT1uKXJldHVybiAwO2Zvcih2YXIgcj0hMTs7KXN3aXRjaCh0KXtjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOnJldHVybiBuO2Nhc2UidXRmOCI6Y2FzZSJ1dGYtOCI6Y2FzZSB2b2lkIDA6cmV0dXJuIHEoZSkubGVuZ3RoO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gMipuO2Nhc2UiaGV4IjpyZXR1cm4gbj4+PjE7Y2FzZSJiYXNlNjQiOnJldHVybiBCKGUpLmxlbmd0aDtkZWZhdWx0OmlmKHIpcmV0dXJuIHEoZSkubGVuZ3RoO3Q9KCIiK3QpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gZyhlLHQsbil7dmFyIHI9ITE7aWYoKHZvaWQgMD09PXR8fHQ8MCkmJih0PTApLHQ+dGhpcy5sZW5ndGgpcmV0dXJuIiI7aWYoKHZvaWQgMD09PW58fG4+dGhpcy5sZW5ndGgpJiYobj10aGlzLmxlbmd0aCksbjw9MClyZXR1cm4iIjtpZigobj4+Pj0wKTw9KHQ+Pj49MCkpcmV0dXJuIiI7Zm9yKGV8fChlPSJ1dGY4Iik7Oylzd2l0Y2goZSl7Y2FzZSJoZXgiOnJldHVybiBPKHRoaXMsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBBKHRoaXMsdCxuKTtjYXNlImFzY2lpIjpyZXR1cm4gUih0aGlzLHQsbik7Y2FzZSJsYXRpbjEiOmNhc2UiYmluYXJ5IjpyZXR1cm4gTCh0aGlzLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiB3KHRoaXMsdCxuKTtjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuIGsodGhpcyx0LG4pO2RlZmF1bHQ6aWYocil0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK2UpO2U9KGUrIiIpLnRvTG93ZXJDYXNlKCkscj0hMH19ZnVuY3Rpb24gbShlLHQsbil7dmFyIHI9ZVt0XTtlW3RdPWVbbl0sZVtuXT1yfWZ1bmN0aW9uIHYoZSx0LG4scixvKXtpZigwPT09ZS5sZW5ndGgpcmV0dXJuLTE7aWYoInN0cmluZyI9PXR5cGVvZiBuPyhyPW4sbj0wKTpuPjIxNDc0ODM2NDc/bj0yMTQ3NDgzNjQ3Om48LTIxNDc0ODM2NDgmJihuPS0yMTQ3NDgzNjQ4KSxuPStuLGlzTmFOKG4pJiYobj1vPzA6ZS5sZW5ndGgtMSksbjwwJiYobj1lLmxlbmd0aCtuKSxuPj1lLmxlbmd0aCl7aWYobylyZXR1cm4tMTtuPWUubGVuZ3RoLTF9ZWxzZSBpZihuPDApe2lmKCFvKXJldHVybi0xO249MH1pZigic3RyaW5nIj09dHlwZW9mIHQmJih0PWMuZnJvbSh0LHIpKSxjLmlzQnVmZmVyKHQpKXJldHVybiAwPT09dC5sZW5ndGg/LTE6eShlLHQsbixyLG8pO2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdCY9MjU1LGMuVFlQRURfQVJSQVlfU1VQUE9SVCYmImZ1bmN0aW9uIj09dHlwZW9mIFVpbnQ4QXJyYXkucHJvdG90eXBlLmluZGV4T2Y/bz9VaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoZSx0LG4pOlVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoZSx0LG4pOnkoZSxbdF0sbixyLG8pO3Rocm93IG5ldyBUeXBlRXJyb3IoInZhbCBtdXN0IGJlIHN0cmluZywgbnVtYmVyIG9yIEJ1ZmZlciIpfWZ1bmN0aW9uIHkoZSx0LG4scixvKXt2YXIgaSxhPTEscz1lLmxlbmd0aCxjPXQubGVuZ3RoO2lmKHZvaWQgMCE9PXImJigidWNzMiI9PT0ocj1TdHJpbmcocikudG9Mb3dlckNhc2UoKSl8fCJ1Y3MtMiI9PT1yfHwidXRmMTZsZSI9PT1yfHwidXRmLTE2bGUiPT09cikpe2lmKGUubGVuZ3RoPDJ8fHQubGVuZ3RoPDIpcmV0dXJuLTE7YT0yLHMvPTIsYy89MixuLz0yfWZ1bmN0aW9uIHUoZSx0KXtyZXR1cm4gMT09PWE/ZVt0XTplLnJlYWRVSW50MTZCRSh0KmEpfWlmKG8pe3ZhciBsPS0xO2ZvcihpPW47aTxzO2krKylpZih1KGUsaSk9PT11KHQsLTE9PT1sPzA6aS1sKSl7aWYoLTE9PT1sJiYobD1pKSxpLWwrMT09PWMpcmV0dXJuIGwqYX1lbHNlLTEhPT1sJiYoaS09aS1sKSxsPS0xfWVsc2UgZm9yKG4rYz5zJiYobj1zLWMpLGk9bjtpPj0wO2ktLSl7Zm9yKHZhciBwPSEwLGQ9MDtkPGM7ZCsrKWlmKHUoZSxpK2QpIT09dSh0LGQpKXtwPSExO2JyZWFrfWlmKHApcmV0dXJuIGl9cmV0dXJuLTF9ZnVuY3Rpb24gYihlLHQsbixyKXtuPU51bWJlcihuKXx8MDt2YXIgbz1lLmxlbmd0aC1uO3I/KHI9TnVtYmVyKHIpKT5vJiYocj1vKTpyPW87dmFyIGk9dC5sZW5ndGg7aWYoaSUyIT0wKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgaGV4IHN0cmluZyIpO3I+aS8yJiYocj1pLzIpO2Zvcih2YXIgYT0wO2E8cjsrK2Epe3ZhciBzPXBhcnNlSW50KHQuc3Vic3RyKDIqYSwyKSwxNik7aWYoaXNOYU4ocykpcmV0dXJuIGE7ZVtuK2FdPXN9cmV0dXJuIGF9ZnVuY3Rpb24gRShlLHQsbixyKXtyZXR1cm4gRyhxKHQsZS5sZW5ndGgtbiksZSxuLHIpfWZ1bmN0aW9uIFMoZSx0LG4scil7cmV0dXJuIEcoZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOysrbil0LnB1c2goMjU1JmUuY2hhckNvZGVBdChuKSk7cmV0dXJuIHR9KHQpLGUsbixyKX1mdW5jdGlvbiBDKGUsdCxuLHIpe3JldHVybiBTKGUsdCxuLHIpfWZ1bmN0aW9uIFQoZSx0LG4scil7cmV0dXJuIEcoQih0KSxlLG4scil9ZnVuY3Rpb24gSShlLHQsbixyKXtyZXR1cm4gRyhmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLG8saT1bXSxhPTA7YTxlLmxlbmd0aCYmISgodC09Mik8MCk7KythKXI9KG49ZS5jaGFyQ29kZUF0KGEpKT4+OCxvPW4lMjU2LGkucHVzaChvKSxpLnB1c2gocik7cmV0dXJuIGl9KHQsZS5sZW5ndGgtbiksZSxuLHIpfWZ1bmN0aW9uIHcoZSx0LHIpe3JldHVybiAwPT09dCYmcj09PWUubGVuZ3RoP24uZnJvbUJ5dGVBcnJheShlKTpuLmZyb21CeXRlQXJyYXkoZS5zbGljZSh0LHIpKX1mdW5jdGlvbiBBKGUsdCxuKXtuPU1hdGgubWluKGUubGVuZ3RoLG4pO2Zvcih2YXIgcj1bXSxvPXQ7bzxuOyl7dmFyIGksYSxzLGMsdT1lW29dLGw9bnVsbCxwPXU+MjM5PzQ6dT4yMjM/Mzp1PjE5MT8yOjE7aWYobytwPD1uKXN3aXRjaChwKXtjYXNlIDE6dTwxMjgmJihsPXUpO2JyZWFrO2Nhc2UgMjoxMjg9PSgxOTImKGk9ZVtvKzFdKSkmJihjPSgzMSZ1KTw8Nnw2MyZpKT4xMjcmJihsPWMpO2JyZWFrO2Nhc2UgMzppPWVbbysxXSxhPWVbbysyXSwxMjg9PSgxOTImaSkmJjEyOD09KDE5MiZhKSYmKGM9KDE1JnUpPDwxMnwoNjMmaSk8PDZ8NjMmYSk+MjA0NyYmKGM8NTUyOTZ8fGM+NTczNDMpJiYobD1jKTticmVhaztjYXNlIDQ6aT1lW28rMV0sYT1lW28rMl0scz1lW28rM10sMTI4PT0oMTkyJmkpJiYxMjg9PSgxOTImYSkmJjEyOD09KDE5MiZzKSYmKGM9KDE1JnUpPDwxOHwoNjMmaSk8PDEyfCg2MyZhKTw8Nnw2MyZzKT42NTUzNSYmYzwxMTE0MTEyJiYobD1jKX1udWxsPT09bD8obD02NTUzMyxwPTEpOmw+NjU1MzUmJihsLT02NTUzNixyLnB1c2gobD4+PjEwJjEwMjN8NTUyOTYpLGw9NTYzMjB8MTAyMyZsKSxyLnB1c2gobCksbys9cH1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7aWYodDw9XylyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShTdHJpbmcsZSk7Zm9yKHZhciBuPSIiLHI9MDtyPHQ7KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLGUuc2xpY2UocixyKz1fKSk7cmV0dXJuIG59KHIpfXIuQnVmZmVyPWMsci5TbG93QnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybitlIT1lJiYoZT0wKSxjLmFsbG9jKCtlKX0sci5JTlNQRUNUX01BWF9CWVRFUz01MCxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ9dm9pZCAwIT09dC5UWVBFRF9BUlJBWV9TVVBQT1JUP3QuVFlQRURfQVJSQVlfU1VQUE9SVDpmdW5jdGlvbigpe3RyeXt2YXIgZT1uZXcgVWludDhBcnJheSgxKTtyZXR1cm4gZS5fX3Byb3RvX189e19fcHJvdG9fXzpVaW50OEFycmF5LnByb3RvdHlwZSxmb286ZnVuY3Rpb24oKXtyZXR1cm4gNDJ9fSw0Mj09PWUuZm9vKCkmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnN1YmFycmF5JiYwPT09ZS5zdWJhcnJheSgxLDEpLmJ5dGVMZW5ndGh9Y2F0Y2goZSl7cmV0dXJuITF9fSgpLHIua01heExlbmd0aD1hKCksYy5wb29sU2l6ZT04MTkyLGMuX2F1Z21lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19fPWMucHJvdG90eXBlLGV9LGMuZnJvbT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHUobnVsbCxlLHQsbil9LGMuVFlQRURfQVJSQVlfU1VQUE9SVCYmKGMucHJvdG90eXBlLl9fcHJvdG9fXz1VaW50OEFycmF5LnByb3RvdHlwZSxjLl9fcHJvdG9fXz1VaW50OEFycmF5LCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wuc3BlY2llcyYmY1tTeW1ib2wuc3BlY2llc109PT1jJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoYyxTeW1ib2wuc3BlY2llcyx7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9KSksYy5hbGxvYz1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBsKHQpLHQ8PTA/cyhlLHQpOnZvaWQgMCE9PW4/InN0cmluZyI9PXR5cGVvZiByP3MoZSx0KS5maWxsKG4scik6cyhlLHQpLmZpbGwobik6cyhlLHQpfShudWxsLGUsdCxuKX0sYy5hbGxvY1Vuc2FmZT1mdW5jdGlvbihlKXtyZXR1cm4gcChudWxsLGUpfSxjLmFsbG9jVW5zYWZlU2xvdz1mdW5jdGlvbihlKXtyZXR1cm4gcChudWxsLGUpfSxjLmlzQnVmZmVyPWZ1bmN0aW9uKGUpe3JldHVybiEobnVsbD09ZXx8IWUuX2lzQnVmZmVyKX0sYy5jb21wYXJlPWZ1bmN0aW9uKGUsdCl7aWYoIWMuaXNCdWZmZXIoZSl8fCFjLmlzQnVmZmVyKHQpKXRocm93IG5ldyBUeXBlRXJyb3IoIkFyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMiKTtpZihlPT09dClyZXR1cm4gMDtmb3IodmFyIG49ZS5sZW5ndGgscj10Lmxlbmd0aCxvPTAsaT1NYXRoLm1pbihuLHIpO288aTsrK28paWYoZVtvXSE9PXRbb10pe249ZVtvXSxyPXRbb107YnJlYWt9cmV0dXJuIG48cj8tMTpyPG4/MTowfSxjLmlzRW5jb2Rpbmc9ZnVuY3Rpb24oZSl7c3dpdGNoKFN0cmluZyhlKS50b0xvd2VyQ2FzZSgpKXtjYXNlImhleCI6Y2FzZSJ1dGY4IjpjYXNlInV0Zi04IjpjYXNlImFzY2lpIjpjYXNlImxhdGluMSI6Y2FzZSJiaW5hcnkiOmNhc2UiYmFzZTY0IjpjYXNlInVjczIiOmNhc2UidWNzLTIiOmNhc2UidXRmMTZsZSI6Y2FzZSJ1dGYtMTZsZSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19LGMuY29uY2F0PWZ1bmN0aW9uKGUsdCl7aWYoIWkoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gYy5hbGxvYygwKTt2YXIgbjtpZih2b2lkIDA9PT10KWZvcih0PTAsbj0wO248ZS5sZW5ndGg7KytuKXQrPWVbbl0ubGVuZ3RoO3ZhciByPWMuYWxsb2NVbnNhZmUodCksbz0wO2ZvcihuPTA7bjxlLmxlbmd0aDsrK24pe3ZhciBhPWVbbl07aWYoIWMuaXNCdWZmZXIoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImxpc3QiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpO2EuY29weShyLG8pLG8rPWEubGVuZ3RofXJldHVybiByfSxjLmJ5dGVMZW5ndGg9aCxjLnByb3RvdHlwZS5faXNCdWZmZXI9ITAsYy5wcm90b3R5cGUuc3dhcDE2PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSUyIT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz0yKW0odGhpcyx0LHQrMSk7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLnN3YXAzMj1mdW5jdGlvbigpe3ZhciBlPXRoaXMubGVuZ3RoO2lmKGUlNCE9MCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDMyLWJpdHMiKTtmb3IodmFyIHQ9MDt0PGU7dCs9NCltKHRoaXMsdCx0KzMpLG0odGhpcyx0KzEsdCsyKTtyZXR1cm4gdGhpc30sYy5wcm90b3R5cGUuc3dhcDY0PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5sZW5ndGg7aWYoZSU4IT0wKXRocm93IG5ldyBSYW5nZUVycm9yKCJCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cyIpO2Zvcih2YXIgdD0wO3Q8ZTt0Kz04KW0odGhpcyx0LHQrNyksbSh0aGlzLHQrMSx0KzYpLG0odGhpcyx0KzIsdCs1KSxtKHRoaXMsdCszLHQrNCk7cmV0dXJuIHRoaXN9LGMucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIGU9MHx0aGlzLmxlbmd0aDtyZXR1cm4gMD09PWU/IiI6MD09PWFyZ3VtZW50cy5sZW5ndGg/QSh0aGlzLDAsZSk6Zy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGMucHJvdG90eXBlLmVxdWFscz1mdW5jdGlvbihlKXtpZighYy5pc0J1ZmZlcihlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyIik7cmV0dXJuIHRoaXM9PT1lfHwwPT09Yy5jb21wYXJlKHRoaXMsZSl9LGMucHJvdG90eXBlLmluc3BlY3Q9ZnVuY3Rpb24oKXt2YXIgZT0iIix0PXIuSU5TUEVDVF9NQVhfQllURVM7cmV0dXJuIHRoaXMubGVuZ3RoPjAmJihlPXRoaXMudG9TdHJpbmcoImhleCIsMCx0KS5tYXRjaCgvLnsyfS9nKS5qb2luKCIgIiksdGhpcy5sZW5ndGg+dCYmKGUrPSIgLi4uICIpKSwiPEJ1ZmZlciAiK2UrIj4ifSxjLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKGUsdCxuLHIsbyl7aWYoIWMuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciIpO2lmKHZvaWQgMD09PXQmJih0PTApLHZvaWQgMD09PW4mJihuPWU/ZS5sZW5ndGg6MCksdm9pZCAwPT09ciYmKHI9MCksdm9pZCAwPT09byYmKG89dGhpcy5sZW5ndGgpLHQ8MHx8bj5lLmxlbmd0aHx8cjwwfHxvPnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJvdXQgb2YgcmFuZ2UgaW5kZXgiKTtpZihyPj1vJiZ0Pj1uKXJldHVybiAwO2lmKHI+PW8pcmV0dXJuLTE7aWYodD49bilyZXR1cm4gMTtpZih0aGlzPT09ZSlyZXR1cm4gMDtmb3IodmFyIGk9KG8+Pj49MCktKHI+Pj49MCksYT0obj4+Pj0wKS0odD4+Pj0wKSxzPU1hdGgubWluKGksYSksdT10aGlzLnNsaWNlKHIsbyksbD1lLnNsaWNlKHQsbikscD0wO3A8czsrK3ApaWYodVtwXSE9PWxbcF0pe2k9dVtwXSxhPWxbcF07YnJlYWt9cmV0dXJuIGk8YT8tMTphPGk/MTowfSxjLnByb3RvdHlwZS5pbmNsdWRlcz1mdW5jdGlvbihlLHQsbil7cmV0dXJuLTEhPT10aGlzLmluZGV4T2YoZSx0LG4pfSxjLnByb3RvdHlwZS5pbmRleE9mPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdih0aGlzLGUsdCxuLCEwKX0sYy5wcm90b3R5cGUubGFzdEluZGV4T2Y9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2KHRoaXMsZSx0LG4sITEpfSxjLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQsbixyKXtpZih2b2lkIDA9PT10KXI9InV0ZjgiLG49dGhpcy5sZW5ndGgsdD0wO2Vsc2UgaWYodm9pZCAwPT09biYmInN0cmluZyI9PXR5cGVvZiB0KXI9dCxuPXRoaXMubGVuZ3RoLHQ9MDtlbHNle2lmKCFpc0Zpbml0ZSh0KSl0aHJvdyBuZXcgRXJyb3IoIkJ1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkIik7dHw9MCxpc0Zpbml0ZShuKT8obnw9MCx2b2lkIDA9PT1yJiYocj0idXRmOCIpKToocj1uLG49dm9pZCAwKX12YXIgbz10aGlzLmxlbmd0aC10O2lmKCh2b2lkIDA9PT1ufHxuPm8pJiYobj1vKSxlLmxlbmd0aD4wJiYobjwwfHx0PDApfHx0PnRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcyIpO3J8fChyPSJ1dGY4Iik7Zm9yKHZhciBpPSExOzspc3dpdGNoKHIpe2Nhc2UiaGV4IjpyZXR1cm4gYih0aGlzLGUsdCxuKTtjYXNlInV0ZjgiOmNhc2UidXRmLTgiOnJldHVybiBFKHRoaXMsZSx0LG4pO2Nhc2UiYXNjaWkiOnJldHVybiBTKHRoaXMsZSx0LG4pO2Nhc2UibGF0aW4xIjpjYXNlImJpbmFyeSI6cmV0dXJuIEModGhpcyxlLHQsbik7Y2FzZSJiYXNlNjQiOnJldHVybiBUKHRoaXMsZSx0LG4pO2Nhc2UidWNzMiI6Y2FzZSJ1Y3MtMiI6Y2FzZSJ1dGYxNmxlIjpjYXNlInV0Zi0xNmxlIjpyZXR1cm4gSSh0aGlzLGUsdCxuKTtkZWZhdWx0OmlmKGkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVW5rbm93biBlbmNvZGluZzogIityKTtyPSgiIityKS50b0xvd2VyQ2FzZSgpLGk9ITB9fSxjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiQnVmZmVyIixkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX2Fycnx8dGhpcywwKX19O3ZhciBfPTQwOTY7ZnVuY3Rpb24gUihlLHQsbil7dmFyIHI9IiI7bj1NYXRoLm1pbihlLmxlbmd0aCxuKTtmb3IodmFyIG89dDtvPG47KytvKXIrPVN0cmluZy5mcm9tQ2hhckNvZGUoMTI3JmVbb10pO3JldHVybiByfWZ1bmN0aW9uIEwoZSx0LG4pe3ZhciByPSIiO249TWF0aC5taW4oZS5sZW5ndGgsbik7Zm9yKHZhciBvPXQ7bzxuOysrbylyKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGVbb10pO3JldHVybiByfWZ1bmN0aW9uIE8oZSx0LG4pe3ZhciByLG89ZS5sZW5ndGg7KCF0fHx0PDApJiYodD0wKSwoIW58fG48MHx8bj5vKSYmKG49byk7Zm9yKHZhciBpPSIiLGE9dDthPG47KythKWkrPShyPWVbYV0pPDE2PyIwIityLnRvU3RyaW5nKDE2KTpyLnRvU3RyaW5nKDE2KTtyZXR1cm4gaX1mdW5jdGlvbiBrKGUsdCxuKXtmb3IodmFyIHI9ZS5zbGljZSh0LG4pLG89IiIsaT0wO2k8ci5sZW5ndGg7aSs9MilvKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHJbaV0rMjU2KnJbaSsxXSk7cmV0dXJuIG99ZnVuY3Rpb24gTihlLHQsbil7aWYoZSUxIT0wfHxlPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIm9mZnNldCBpcyBub3QgdWludCIpO2lmKGUrdD5uKXRocm93IG5ldyBSYW5nZUVycm9yKCJUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoIil9ZnVuY3Rpb24gUChlLHQsbixyLG8saSl7aWYoIWMuaXNCdWZmZXIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcignImJ1ZmZlciIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpO2lmKHQ+b3x8dDxpKXRocm93IG5ldyBSYW5nZUVycm9yKCcidmFsdWUiIGFyZ3VtZW50IGlzIG91dCBvZiBib3VuZHMnKTtpZihuK3I+ZS5sZW5ndGgpdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIEQoZSx0LG4scil7dDwwJiYodD02NTUzNSt0KzEpO2Zvcih2YXIgbz0wLGk9TWF0aC5taW4oZS5sZW5ndGgtbiwyKTtvPGk7KytvKWVbbitvXT0odCYyNTU8PDgqKHI/bzoxLW8pKT4+PjgqKHI/bzoxLW8pfWZ1bmN0aW9uIHgoZSx0LG4scil7dDwwJiYodD00Mjk0OTY3Mjk1K3QrMSk7Zm9yKHZhciBvPTAsaT1NYXRoLm1pbihlLmxlbmd0aC1uLDQpO288aTsrK28pZVtuK29dPXQ+Pj44KihyP286My1vKSYyNTV9ZnVuY3Rpb24gTShlLHQsbixyLG8saSl7aWYobityPmUubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJJbmRleCBvdXQgb2YgcmFuZ2UiKTtpZihuPDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkluZGV4IG91dCBvZiByYW5nZSIpfWZ1bmN0aW9uIFUoZSx0LG4scixpKXtyZXR1cm4gaXx8TShlLDAsbiw0KSxvLndyaXRlKGUsdCxuLHIsMjMsNCksbis0fWZ1bmN0aW9uIEYoZSx0LG4scixpKXtyZXR1cm4gaXx8TShlLDAsbiw4KSxvLndyaXRlKGUsdCxuLHIsNTIsOCksbis4fWMucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKGUsdCl7dmFyIG4scj10aGlzLmxlbmd0aDtpZigoZT1+fmUpPDA/KGUrPXIpPDAmJihlPTApOmU+ciYmKGU9ciksKHQ9dm9pZCAwPT09dD9yOn5+dCk8MD8odCs9cik8MCYmKHQ9MCk6dD5yJiYodD1yKSx0PGUmJih0PWUpLGMuVFlQRURfQVJSQVlfU1VQUE9SVCkobj10aGlzLnN1YmFycmF5KGUsdCkpLl9fcHJvdG9fXz1jLnByb3RvdHlwZTtlbHNle3ZhciBvPXQtZTtuPW5ldyBjKG8sdm9pZCAwKTtmb3IodmFyIGk9MDtpPG87KytpKW5baV09dGhpc1tpK2VdfXJldHVybiBufSxjLnByb3RvdHlwZS5yZWFkVUludExFPWZ1bmN0aW9uKGUsdCxuKXtlfD0wLHR8PTAsbnx8TihlLHQsdGhpcy5sZW5ndGgpO2Zvcih2YXIgcj10aGlzW2VdLG89MSxpPTA7KytpPHQmJihvKj0yNTYpOylyKz10aGlzW2UraV0qbztyZXR1cm4gcn0sYy5wcm90b3R5cGUucmVhZFVJbnRCRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fE4oZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlKy0tdF0sbz0xO3Q+MCYmKG8qPTI1Nik7KXIrPXRoaXNbZSstLXRdKm87cmV0dXJuIHJ9LGMucHJvdG90eXBlLnJlYWRVSW50OD1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxOKGUsMSx0aGlzLmxlbmd0aCksdGhpc1tlXX0sYy5wcm90b3R5cGUucmVhZFVJbnQxNkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE4oZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdfHRoaXNbZSsxXTw8OH0sYy5wcm90b3R5cGUucmVhZFVJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE4oZSwyLHRoaXMubGVuZ3RoKSx0aGlzW2VdPDw4fHRoaXNbZSsxXX0sYy5wcm90b3R5cGUucmVhZFVJbnQzMkxFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE4oZSw0LHRoaXMubGVuZ3RoKSwodGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNikrMTY3NzcyMTYqdGhpc1tlKzNdfSxjLnByb3RvdHlwZS5yZWFkVUludDMyQkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TihlLDQsdGhpcy5sZW5ndGgpLDE2Nzc3MjE2KnRoaXNbZV0rKHRoaXNbZSsxXTw8MTZ8dGhpc1tlKzJdPDw4fHRoaXNbZSszXSl9LGMucHJvdG90eXBlLnJlYWRJbnRMRT1mdW5jdGlvbihlLHQsbil7ZXw9MCx0fD0wLG58fE4oZSx0LHRoaXMubGVuZ3RoKTtmb3IodmFyIHI9dGhpc1tlXSxvPTEsaT0wOysraTx0JiYobyo9MjU2KTspcis9dGhpc1tlK2ldKm87cmV0dXJuIHI+PShvKj0xMjgpJiYoci09TWF0aC5wb3coMiw4KnQpKSxyfSxjLnByb3RvdHlwZS5yZWFkSW50QkU9ZnVuY3Rpb24oZSx0LG4pe2V8PTAsdHw9MCxufHxOKGUsdCx0aGlzLmxlbmd0aCk7Zm9yKHZhciByPXQsbz0xLGk9dGhpc1tlKy0tcl07cj4wJiYobyo9MjU2KTspaSs9dGhpc1tlKy0tcl0qbztyZXR1cm4gaT49KG8qPTEyOCkmJihpLT1NYXRoLnBvdygyLDgqdCkpLGl9LGMucHJvdG90eXBlLnJlYWRJbnQ4PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE4oZSwxLHRoaXMubGVuZ3RoKSwxMjgmdGhpc1tlXT8tMSooMjU1LXRoaXNbZV0rMSk6dGhpc1tlXX0sYy5wcm90b3R5cGUucmVhZEludDE2TEU9ZnVuY3Rpb24oZSx0KXt0fHxOKGUsMix0aGlzLmxlbmd0aCk7dmFyIG49dGhpc1tlXXx0aGlzW2UrMV08PDg7cmV0dXJuIDMyNzY4Jm4/NDI5NDkwMTc2MHxuOm59LGMucHJvdG90eXBlLnJlYWRJbnQxNkJFPWZ1bmN0aW9uKGUsdCl7dHx8TihlLDIsdGhpcy5sZW5ndGgpO3ZhciBuPXRoaXNbZSsxXXx0aGlzW2VdPDw4O3JldHVybiAzMjc2OCZuPzQyOTQ5MDE3NjB8bjpufSxjLnByb3RvdHlwZS5yZWFkSW50MzJMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxOKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXXx0aGlzW2UrMV08PDh8dGhpc1tlKzJdPDwxNnx0aGlzW2UrM108PDI0fSxjLnByb3RvdHlwZS5yZWFkSW50MzJCRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxOKGUsNCx0aGlzLmxlbmd0aCksdGhpc1tlXTw8MjR8dGhpc1tlKzFdPDwxNnx0aGlzW2UrMl08PDh8dGhpc1tlKzNdfSxjLnByb3RvdHlwZS5yZWFkRmxvYXRMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxOKGUsNCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMCwyMyw0KX0sYy5wcm90b3R5cGUucmVhZEZsb2F0QkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdHx8TihlLDQsdGhpcy5sZW5ndGgpLG8ucmVhZCh0aGlzLGUsITEsMjMsNCl9LGMucHJvdG90eXBlLnJlYWREb3VibGVMRT1mdW5jdGlvbihlLHQpe3JldHVybiB0fHxOKGUsOCx0aGlzLmxlbmd0aCksby5yZWFkKHRoaXMsZSwhMCw1Miw4KX0sYy5wcm90b3R5cGUucmVhZERvdWJsZUJFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHR8fE4oZSw4LHRoaXMubGVuZ3RoKSxvLnJlYWQodGhpcyxlLCExLDUyLDgpfSxjLnByb3RvdHlwZS53cml0ZVVJbnRMRT1mdW5jdGlvbihlLHQsbixyKXtlPStlLHR8PTAsbnw9MCxyfHxQKHRoaXMsZSx0LG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89MSxpPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytpPG4mJihvKj0yNTYpOyl0aGlzW3QraV09ZS9vJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZVVJbnRCRT1mdW5jdGlvbihlLHQsbixyKXtlPStlLHR8PTAsbnw9MCxyfHxQKHRoaXMsZSx0LG4sTWF0aC5wb3coMiw4Km4pLTEsMCk7dmFyIG89bi0xLGk9MTtmb3IodGhpc1t0K29dPTI1NSZlOy0tbz49MCYmKGkqPTI1Nik7KXRoaXNbdCtvXT1lL2kmMjU1O3JldHVybiB0K259LGMucHJvdG90eXBlLndyaXRlVUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8UCh0aGlzLGUsdCwxLDI1NSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLHRoaXNbdF09MjU1JmUsdCsxfSxjLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fFAodGhpcyxlLHQsMiw2NTUzNSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpEKHRoaXMsZSx0LCEwKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlVUludDE2QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8UCh0aGlzLGUsdCwyLDY1NTM1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+OCx0aGlzW3QrMV09MjU1JmUpOkQodGhpcyxlLHQsITEpLHQrMn0sYy5wcm90b3R5cGUud3JpdGVVSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxQKHRoaXMsZSx0LDQsNDI5NDk2NzI5NSwwKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdCszXT1lPj4+MjQsdGhpc1t0KzJdPWU+Pj4xNix0aGlzW3QrMV09ZT4+PjgsdGhpc1t0XT0yNTUmZSk6eCh0aGlzLGUsdCwhMCksdCs0fSxjLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fFAodGhpcyxlLHQsNCw0Mjk0OTY3Mjk1LDApLGMuVFlQRURfQVJSQVlfU1VQUE9SVD8odGhpc1t0XT1lPj4+MjQsdGhpc1t0KzFdPWU+Pj4xNix0aGlzW3QrMl09ZT4+PjgsdGhpc1t0KzNdPTI1NSZlKTp4KHRoaXMsZSx0LCExKSx0KzR9LGMucHJvdG90eXBlLndyaXRlSW50TEU9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT0rZSx0fD0wLCFyKXt2YXIgbz1NYXRoLnBvdygyLDgqbi0xKTtQKHRoaXMsZSx0LG4sby0xLC1vKX12YXIgaT0wLGE9MSxzPTA7Zm9yKHRoaXNbdF09MjU1JmU7KytpPG4mJihhKj0yNTYpOyllPDAmJjA9PT1zJiYwIT09dGhpc1t0K2ktMV0mJihzPTEpLHRoaXNbdCtpXT0oZS9hPj4wKS1zJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZUludEJFPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9K2UsdHw9MCwhcil7dmFyIG89TWF0aC5wb3coMiw4Km4tMSk7UCh0aGlzLGUsdCxuLG8tMSwtbyl9dmFyIGk9bi0xLGE9MSxzPTA7Zm9yKHRoaXNbdCtpXT0yNTUmZTstLWk+PTAmJihhKj0yNTYpOyllPDAmJjA9PT1zJiYwIT09dGhpc1t0K2krMV0mJihzPTEpLHRoaXNbdCtpXT0oZS9hPj4wKS1zJjI1NTtyZXR1cm4gdCtufSxjLnByb3RvdHlwZS53cml0ZUludDg9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlPStlLHR8PTAsbnx8UCh0aGlzLGUsdCwxLDEyNywtMTI4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlR8fChlPU1hdGguZmxvb3IoZSkpLGU8MCYmKGU9MjU1K2UrMSksdGhpc1t0XT0yNTUmZSx0KzF9LGMucHJvdG90eXBlLndyaXRlSW50MTZMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxQKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09MjU1JmUsdGhpc1t0KzFdPWU+Pj44KTpEKHRoaXMsZSx0LCEwKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlSW50MTZCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxQKHRoaXMsZSx0LDIsMzI3NjcsLTMyNzY4KSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjgsdGhpc1t0KzFdPTI1NSZlKTpEKHRoaXMsZSx0LCExKSx0KzJ9LGMucHJvdG90eXBlLndyaXRlSW50MzJMRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGU9K2UsdHw9MCxufHxQKHRoaXMsZSx0LDQsMjE0NzQ4MzY0NywtMjE0NzQ4MzY0OCksYy5UWVBFRF9BUlJBWV9TVVBQT1JUPyh0aGlzW3RdPTI1NSZlLHRoaXNbdCsxXT1lPj4+OCx0aGlzW3QrMl09ZT4+PjE2LHRoaXNbdCszXT1lPj4+MjQpOngodGhpcyxlLHQsITApLHQrNH0sYy5wcm90b3R5cGUud3JpdGVJbnQzMkJFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZT0rZSx0fD0wLG58fFAodGhpcyxlLHQsNCwyMTQ3NDgzNjQ3LC0yMTQ3NDgzNjQ4KSxlPDAmJihlPTQyOTQ5NjcyOTUrZSsxKSxjLlRZUEVEX0FSUkFZX1NVUFBPUlQ/KHRoaXNbdF09ZT4+PjI0LHRoaXNbdCsxXT1lPj4+MTYsdGhpc1t0KzJdPWU+Pj44LHRoaXNbdCszXT0yNTUmZSk6eCh0aGlzLGUsdCwhMSksdCs0fSxjLnByb3RvdHlwZS53cml0ZUZsb2F0TEU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBVKHRoaXMsZSx0LCEwLG4pfSxjLnByb3RvdHlwZS53cml0ZUZsb2F0QkU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBVKHRoaXMsZSx0LCExLG4pfSxjLnByb3RvdHlwZS53cml0ZURvdWJsZUxFPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRih0aGlzLGUsdCwhMCxuKX0sYy5wcm90b3R5cGUud3JpdGVEb3VibGVCRT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIEYodGhpcyxlLHQsITEsbil9LGMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oZSx0LG4scil7aWYobnx8KG49MCkscnx8MD09PXJ8fChyPXRoaXMubGVuZ3RoKSx0Pj1lLmxlbmd0aCYmKHQ9ZS5sZW5ndGgpLHR8fCh0PTApLHI+MCYmcjxuJiYocj1uKSxyPT09bilyZXR1cm4gMDtpZigwPT09ZS5sZW5ndGh8fDA9PT10aGlzLmxlbmd0aClyZXR1cm4gMDtpZih0PDApdGhyb3cgbmV3IFJhbmdlRXJyb3IoInRhcmdldFN0YXJ0IG91dCBvZiBib3VuZHMiKTtpZihuPDB8fG4+PXRoaXMubGVuZ3RoKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VTdGFydCBvdXQgb2YgYm91bmRzIik7aWYocjwwKXRocm93IG5ldyBSYW5nZUVycm9yKCJzb3VyY2VFbmQgb3V0IG9mIGJvdW5kcyIpO3I+dGhpcy5sZW5ndGgmJihyPXRoaXMubGVuZ3RoKSxlLmxlbmd0aC10PHItbiYmKHI9ZS5sZW5ndGgtdCtuKTt2YXIgbyxpPXItbjtpZih0aGlzPT09ZSYmbjx0JiZ0PHIpZm9yKG89aS0xO28+PTA7LS1vKWVbbyt0XT10aGlzW28rbl07ZWxzZSBpZihpPDFlM3x8IWMuVFlQRURfQVJSQVlfU1VQUE9SVClmb3Iobz0wO288aTsrK28pZVtvK3RdPXRoaXNbbytuXTtlbHNlIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKGUsdGhpcy5zdWJhcnJheShuLG4raSksdCk7cmV0dXJuIGl9LGMucHJvdG90eXBlLmZpbGw9ZnVuY3Rpb24oZSx0LG4scil7aWYoInN0cmluZyI9PXR5cGVvZiBlKXtpZigic3RyaW5nIj09dHlwZW9mIHQ/KHI9dCx0PTAsbj10aGlzLmxlbmd0aCk6InN0cmluZyI9PXR5cGVvZiBuJiYocj1uLG49dGhpcy5sZW5ndGgpLDE9PT1lLmxlbmd0aCl7dmFyIG89ZS5jaGFyQ29kZUF0KDApO288MjU2JiYoZT1vKX1pZih2b2lkIDAhPT1yJiYic3RyaW5nIiE9dHlwZW9mIHIpdGhyb3cgbmV3IFR5cGVFcnJvcigiZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZyIpO2lmKCJzdHJpbmciPT10eXBlb2YgciYmIWMuaXNFbmNvZGluZyhyKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJVbmtub3duIGVuY29kaW5nOiAiK3IpfWVsc2UibnVtYmVyIj09dHlwZW9mIGUmJihlJj0yNTUpO2lmKHQ8MHx8dGhpcy5sZW5ndGg8dHx8dGhpcy5sZW5ndGg8bil0aHJvdyBuZXcgUmFuZ2VFcnJvcigiT3V0IG9mIHJhbmdlIGluZGV4Iik7aWYobjw9dClyZXR1cm4gdGhpczt2YXIgaTtpZih0Pj4+PTAsbj12b2lkIDA9PT1uP3RoaXMubGVuZ3RoOm4+Pj4wLGV8fChlPTApLCJudW1iZXIiPT10eXBlb2YgZSlmb3IoaT10O2k8bjsrK2kpdGhpc1tpXT1lO2Vsc2V7dmFyIGE9Yy5pc0J1ZmZlcihlKT9lOnEobmV3IGMoZSxyKS50b1N0cmluZygpKSxzPWEubGVuZ3RoO2ZvcihpPTA7aTxuLXQ7KytpKXRoaXNbaSt0XT1hW2klc119cmV0dXJuIHRoaXN9O3ZhciBqPS9bXitcLzAtOUEtWmEtei1fXS9nO2Z1bmN0aW9uIHEoZSx0KXt2YXIgbjt0PXR8fDEvMDtmb3IodmFyIHI9ZS5sZW5ndGgsbz1udWxsLGk9W10sYT0wO2E8cjsrK2Epe2lmKChuPWUuY2hhckNvZGVBdChhKSk+NTUyOTUmJm48NTczNDQpe2lmKCFvKXtpZihuPjU2MzE5KXsodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSk7Y29udGludWV9aWYoYSsxPT09cil7KHQtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2NvbnRpbnVlfW89bjtjb250aW51ZX1pZihuPDU2MzIwKXsodC09Myk+LTEmJmkucHVzaCgyMzksMTkxLDE4OSksbz1uO2NvbnRpbnVlfW49NjU1MzYrKG8tNTUyOTY8PDEwfG4tNTYzMjApfWVsc2UgbyYmKHQtPTMpPi0xJiZpLnB1c2goMjM5LDE5MSwxODkpO2lmKG89bnVsbCxuPDEyOCl7aWYoKHQtPTEpPDApYnJlYWs7aS5wdXNoKG4pfWVsc2UgaWYobjwyMDQ4KXtpZigodC09Mik8MClicmVhaztpLnB1c2gobj4+NnwxOTIsNjMmbnwxMjgpfWVsc2UgaWYobjw2NTUzNil7aWYoKHQtPTMpPDApYnJlYWs7aS5wdXNoKG4+PjEyfDIyNCxuPj42JjYzfDEyOCw2MyZufDEyOCl9ZWxzZXtpZighKG48MTExNDExMikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGNvZGUgcG9pbnQiKTtpZigodC09NCk8MClicmVhaztpLnB1c2gobj4+MTh8MjQwLG4+PjEyJjYzfDEyOCxuPj42JjYzfDEyOCw2MyZufDEyOCl9fXJldHVybiBpfWZ1bmN0aW9uIEIoZSl7cmV0dXJuIG4udG9CeXRlQXJyYXkoZnVuY3Rpb24oZSl7aWYoKGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHJpbT9lLnRyaW0oKTplLnJlcGxhY2UoL15ccyt8XHMrJC9nLCIiKX0oZSkucmVwbGFjZShqLCIiKSkubGVuZ3RoPDIpcmV0dXJuIiI7Zm9yKDtlLmxlbmd0aCU0IT0wOyllKz0iPSI7cmV0dXJuIGV9KGUpKX1mdW5jdGlvbiBHKGUsdCxuLHIpe2Zvcih2YXIgbz0wO288ciYmIShvK24+PXQubGVuZ3RofHxvPj1lLmxlbmd0aCk7KytvKXRbbytuXT1lW29dO3JldHVybiBvfX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsdm9pZCAwIT09bi5nP24uZzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30sZSgiYnVmZmVyIikuQnVmZmVyKX0seyJiYXNlNjQtanMiOjgxLGJ1ZmZlcjo4NixpZWVlNzU0Ojg4LGlzYXJyYXk6ODl9XSw4NzpbZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoKXt0aGlzLl9ldmVudHM9dGhpcy5fZXZlbnRzfHx7fSx0aGlzLl9tYXhMaXN0ZW5lcnM9dGhpcy5fbWF4TGlzdGVuZXJzfHx2b2lkIDB9ZnVuY3Rpb24gaShlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZX1mdW5jdGlvbiBhKGUpe3JldHVybiJvYmplY3QiPT09byhlKSYmbnVsbCE9PWV9ZnVuY3Rpb24gcyhlKXtyZXR1cm4gdm9pZCAwPT09ZX10LmV4cG9ydHM9cixyLkV2ZW50RW1pdHRlcj1yLHIucHJvdG90eXBlLl9ldmVudHM9dm9pZCAwLHIucHJvdG90eXBlLl9tYXhMaXN0ZW5lcnM9dm9pZCAwLHIuZGVmYXVsdE1heExpc3RlbmVycz0xMCxyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7aWYoIm51bWJlciIhPXR5cGVvZiBlfHxlPDB8fGlzTmFOKGUpKXRocm93IFR5cGVFcnJvcigibiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIHRoaXMuX21heExpc3RlbmVycz1lLHRoaXN9LHIucHJvdG90eXBlLmVtaXQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyLG8sYyx1O2lmKHRoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSksImVycm9yIj09PWUmJighdGhpcy5fZXZlbnRzLmVycm9yfHxhKHRoaXMuX2V2ZW50cy5lcnJvcikmJiF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSl7aWYoKHQ9YXJndW1lbnRzWzFdKWluc3RhbmNlb2YgRXJyb3IpdGhyb3cgdDt2YXIgbD1uZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCAiZXJyb3IiIGV2ZW50LiAoJyt0KyIpIik7dGhyb3cgbC5jb250ZXh0PXQsbH1pZihzKG49dGhpcy5fZXZlbnRzW2VdKSlyZXR1cm4hMTtpZihpKG4pKXN3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDE6bi5jYWxsKHRoaXMpO2JyZWFrO2Nhc2UgMjpuLmNhbGwodGhpcyxhcmd1bWVudHNbMV0pO2JyZWFrO2Nhc2UgMzpuLmNhbGwodGhpcyxhcmd1bWVudHNbMV0sYXJndW1lbnRzWzJdKTticmVhaztkZWZhdWx0Om89QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLG4uYXBwbHkodGhpcyxvKX1lbHNlIGlmKGEobikpZm9yKG89QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLHI9KHU9bi5zbGljZSgpKS5sZW5ndGgsYz0wO2M8cjtjKyspdVtjXS5hcHBseSh0aGlzLG8pO3JldHVybiEwfSxyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuO2lmKCFpKHQpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7cmV0dXJuIHRoaXMuX2V2ZW50c3x8KHRoaXMuX2V2ZW50cz17fSksdGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyJiZ0aGlzLmVtaXQoIm5ld0xpc3RlbmVyIixlLGkodC5saXN0ZW5lcik/dC5saXN0ZW5lcjp0KSx0aGlzLl9ldmVudHNbZV0/YSh0aGlzLl9ldmVudHNbZV0pP3RoaXMuX2V2ZW50c1tlXS5wdXNoKHQpOnRoaXMuX2V2ZW50c1tlXT1bdGhpcy5fZXZlbnRzW2VdLHRdOnRoaXMuX2V2ZW50c1tlXT10LGEodGhpcy5fZXZlbnRzW2VdKSYmIXRoaXMuX2V2ZW50c1tlXS53YXJuZWQmJihuPXModGhpcy5fbWF4TGlzdGVuZXJzKT9yLmRlZmF1bHRNYXhMaXN0ZW5lcnM6dGhpcy5fbWF4TGlzdGVuZXJzKSYmbj4wJiZ0aGlzLl9ldmVudHNbZV0ubGVuZ3RoPm4mJih0aGlzLl9ldmVudHNbZV0ud2FybmVkPSEwLGNvbnNvbGUuZXJyb3IoIihub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5IGxlYWsgZGV0ZWN0ZWQuICVkIGxpc3RlbmVycyBhZGRlZC4gVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuIix0aGlzLl9ldmVudHNbZV0ubGVuZ3RoKSwiZnVuY3Rpb24iPT10eXBlb2YgY29uc29sZS50cmFjZSYmY29uc29sZS50cmFjZSgpKSx0aGlzfSxyLnByb3RvdHlwZS5vbj1yLnByb3RvdHlwZS5hZGRMaXN0ZW5lcixyLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKGUsdCl7aWYoIWkodCkpdGhyb3cgVHlwZUVycm9yKCJsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24iKTt2YXIgbj0hMTtmdW5jdGlvbiByKCl7dGhpcy5yZW1vdmVMaXN0ZW5lcihlLHIpLG58fChuPSEwLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX1yZXR1cm4gci5saXN0ZW5lcj10LHRoaXMub24oZSxyKSx0aGlzfSxyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbihlLHQpe3ZhciBuLHIsbyxzO2lmKCFpKHQpKXRocm93IFR5cGVFcnJvcigibGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uIik7aWYoIXRoaXMuX2V2ZW50c3x8IXRoaXMuX2V2ZW50c1tlXSlyZXR1cm4gdGhpcztpZihvPShuPXRoaXMuX2V2ZW50c1tlXSkubGVuZ3RoLHI9LTEsbj09PXR8fGkobi5saXN0ZW5lcikmJm4ubGlzdGVuZXI9PT10KWRlbGV0ZSB0aGlzLl9ldmVudHNbZV0sdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyJiZ0aGlzLmVtaXQoInJlbW92ZUxpc3RlbmVyIixlLHQpO2Vsc2UgaWYoYShuKSl7Zm9yKHM9bztzLS0gPjA7KWlmKG5bc109PT10fHxuW3NdLmxpc3RlbmVyJiZuW3NdLmxpc3RlbmVyPT09dCl7cj1zO2JyZWFrfWlmKHI8MClyZXR1cm4gdGhpczsxPT09bi5sZW5ndGg/KG4ubGVuZ3RoPTAsZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSk6bi5zcGxpY2UociwxKSx0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXImJnRoaXMuZW1pdCgicmVtb3ZlTGlzdGVuZXIiLGUsdCl9cmV0dXJuIHRoaXN9LHIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycz1mdW5jdGlvbihlKXt2YXIgdCxuO2lmKCF0aGlzLl9ldmVudHMpcmV0dXJuIHRoaXM7aWYoIXRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5fZXZlbnRzPXt9OnRoaXMuX2V2ZW50c1tlXSYmZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSx0aGlzO2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IodCBpbiB0aGlzLl9ldmVudHMpInJlbW92ZUxpc3RlbmVyIiE9PXQmJnRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKHQpO3JldHVybiB0aGlzLnJlbW92ZUFsbExpc3RlbmVycygicmVtb3ZlTGlzdGVuZXIiKSx0aGlzLl9ldmVudHM9e30sdGhpc31pZihpKG49dGhpcy5fZXZlbnRzW2VdKSl0aGlzLnJlbW92ZUxpc3RlbmVyKGUsbik7ZWxzZSBpZihuKWZvcig7bi5sZW5ndGg7KXRoaXMucmVtb3ZlTGlzdGVuZXIoZSxuW24ubGVuZ3RoLTFdKTtyZXR1cm4gZGVsZXRlIHRoaXMuX2V2ZW50c1tlXSx0aGlzfSxyLnByb3RvdHlwZS5saXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2V2ZW50cyYmdGhpcy5fZXZlbnRzW2VdP2kodGhpcy5fZXZlbnRzW2VdKT9bdGhpcy5fZXZlbnRzW2VdXTp0aGlzLl9ldmVudHNbZV0uc2xpY2UoKTpbXX0sci5wcm90b3R5cGUubGlzdGVuZXJDb3VudD1mdW5jdGlvbihlKXtpZih0aGlzLl9ldmVudHMpe3ZhciB0PXRoaXMuX2V2ZW50c1tlXTtpZihpKHQpKXJldHVybiAxO2lmKHQpcmV0dXJuIHQubGVuZ3RofXJldHVybiAwfSxyLmxpc3RlbmVyQ291bnQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5saXN0ZW5lckNvdW50KHQpfX0se31dLDg4OltmdW5jdGlvbihlLHQsbil7bi5yZWFkPWZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGksYSxzPTgqby1yLTEsYz0oMTw8cyktMSx1PWM+PjEsbD0tNyxwPW4/by0xOjAsZD1uPy0xOjEsZj1lW3QrcF07Zm9yKHArPWQsaT1mJigxPDwtbCktMSxmPj49LWwsbCs9cztsPjA7aT0yNTYqaStlW3QrcF0scCs9ZCxsLT04KTtmb3IoYT1pJigxPDwtbCktMSxpPj49LWwsbCs9cjtsPjA7YT0yNTYqYStlW3QrcF0scCs9ZCxsLT04KTtpZigwPT09aSlpPTEtdTtlbHNle2lmKGk9PT1jKXJldHVybiBhP05hTjoxLzAqKGY/LTE6MSk7YSs9TWF0aC5wb3coMixyKSxpLT11fXJldHVybihmPy0xOjEpKmEqTWF0aC5wb3coMixpLXIpfSxuLndyaXRlPWZ1bmN0aW9uKGUsdCxuLHIsbyxpKXt2YXIgYSxzLGMsdT04Kmktby0xLGw9KDE8PHUpLTEscD1sPj4xLGQ9MjM9PT1vP01hdGgucG93KDIsLTI0KS1NYXRoLnBvdygyLC03Nyk6MCxmPXI/MDppLTEsaD1yPzE6LTEsZz10PDB8fDA9PT10JiYxL3Q8MD8xOjA7Zm9yKHQ9TWF0aC5hYnModCksaXNOYU4odCl8fHQ9PT0xLzA/KHM9aXNOYU4odCk/MTowLGE9bCk6KGE9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksdCooYz1NYXRoLnBvdygyLC1hKSk8MSYmKGEtLSxjKj0yKSwodCs9YStwPj0xP2QvYzpkKk1hdGgucG93KDIsMS1wKSkqYz49MiYmKGErKyxjLz0yKSxhK3A+PWw/KHM9MCxhPWwpOmErcD49MT8ocz0odCpjLTEpKk1hdGgucG93KDIsbyksYSs9cCk6KHM9dCpNYXRoLnBvdygyLHAtMSkqTWF0aC5wb3coMixvKSxhPTApKTtvPj04O2VbbitmXT0yNTUmcyxmKz1oLHMvPTI1NixvLT04KTtmb3IoYT1hPDxvfHMsdSs9bzt1PjA7ZVtuK2ZdPTI1NSZhLGYrPWgsYS89MjU2LHUtPTgpO2VbbitmLWhdfD0xMjgqZ319LHt9XSw4OTpbZnVuY3Rpb24oZSx0LG4pe3ZhciByPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1BcnJheS5pc0FycmF5fHxmdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBBcnJheV0iPT1yLmNhbGwoZSl9fSx7fV0sOTA6W2Z1bmN0aW9uKGUsdCxuKXshZnVuY3Rpb24oZSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG51bGwhPT1lJiYiW29iamVjdCBBcnJheV0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpfWZ1bmN0aW9uIG4oZSl7cmV0dXJuIG51bGwhPT1lJiYiW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX1mdW5jdGlvbiByKGUsbyl7aWYoZT09PW8pcmV0dXJuITA7aWYoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpIT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pKXJldHVybiExO2lmKCEwPT09dChlKSl7aWYoZS5sZW5ndGghPT1vLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKylpZighMT09PXIoZVtpXSxvW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1pZighMD09PW4oZSkpe3ZhciBhPXt9O2Zvcih2YXIgcyBpbiBlKWlmKGhhc093blByb3BlcnR5LmNhbGwoZSxzKSl7aWYoITE9PT1yKGVbc10sb1tzXSkpcmV0dXJuITE7YVtzXT0hMH1mb3IodmFyIGMgaW4gbylpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKG8sYykmJiEwIT09YVtjXSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBvKGUpe2lmKCIiPT09ZXx8ITE9PT1lfHxudWxsPT09ZSlyZXR1cm4hMDtpZih0KGUpJiYwPT09ZS5sZW5ndGgpcmV0dXJuITA7aWYobihlKSl7Zm9yKHZhciByIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShyKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4hMX12YXIgaTtpPSJmdW5jdGlvbiI9PXR5cGVvZiBTdHJpbmcucHJvdG90eXBlLnRyaW1MZWZ0P2Z1bmN0aW9uKGUpe3JldHVybiBlLnRyaW1MZWZ0KCl9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKC9eXHMqKC4qKS8pWzFdfTt2YXIgYT0wLHM9MSxjPTIsdT0zLGw9NCxwPTYsZD04LGY9OSxoPXswOiJudW1iZXIiLDE6ImFueSIsMjoic3RyaW5nIiwzOiJhcnJheSIsNDoib2JqZWN0Iiw1OiJib29sZWFuIiw2OiJleHByZXNzaW9uIiw3OiJudWxsIiw4OiJBcnJheTxudW1iZXI+Iiw5OiJBcnJheTxzdHJpbmc+In0sZz0iRU9GIixtPSJVbnF1b3RlZElkZW50aWZpZXIiLHY9IlF1b3RlZElkZW50aWZpZXIiLHk9IlJicmFja2V0IixiPSJScGFyZW4iLEU9IkNvbW1hIixTPSJDb2xvbiIsQz0iUmJyYWNlIixUPSJOdW1iZXIiLEk9IkN1cnJlbnQiLHc9IkV4cHJlZiIsQT0iUGlwZSIsXz0iT3IiLFI9IkFuZCIsTD0iRVEiLE89IkdUIixrPSJMVCIsTj0iR1RFIixQPSJMVEUiLEQ9Ik5FIix4PSJGbGF0dGVuIixNPSJTdGFyIixVPSJGaWx0ZXIiLEY9IkRvdCIsaj0iTm90IixxPSJMYnJhY2UiLEI9IkxicmFja2V0IixHPSJMcGFyZW4iLFY9IkxpdGVyYWwiLFc9eyIuIjpGLCIqIjpNLCIsIjpFLCI6IjpTLCJ7IjpxLCJ9IjpDLCJdIjp5LCIoIjpHLCIpIjpiLCJAIjpJfSxIPXsiPCI6ITAsIj4iOiEwLCI9IjohMCwiISI6ITB9LHo9eyIgIjohMCwiXHQiOiEwLCJcbiI6ITB9O2Z1bmN0aW9uIEsoZSl7cmV0dXJuIGU+PSIwIiYmZTw9IjkifHwiLSI9PT1lfWZ1bmN0aW9uIFkoKXt9WS5wcm90b3R5cGU9e3Rva2VuaXplOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixvLGk9W107Zm9yKHRoaXMuX2N1cnJlbnQ9MDt0aGlzLl9jdXJyZW50PGUubGVuZ3RoOylpZigobz1lW3RoaXMuX2N1cnJlbnRdKT49ImEiJiZvPD0ieiJ8fG8+PSJBIiYmbzw9IloifHwiXyI9PT1vKXQ9dGhpcy5fY3VycmVudCxuPXRoaXMuX2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXIoZSksaS5wdXNoKHt0eXBlOm0sdmFsdWU6bixzdGFydDp0fSk7ZWxzZSBpZih2b2lkIDAhPT1XW2VbdGhpcy5fY3VycmVudF1dKWkucHVzaCh7dHlwZTpXW2VbdGhpcy5fY3VycmVudF1dLHZhbHVlOmVbdGhpcy5fY3VycmVudF0sc3RhcnQ6dGhpcy5fY3VycmVudH0pLHRoaXMuX2N1cnJlbnQrKztlbHNlIGlmKEsoZVt0aGlzLl9jdXJyZW50XSkpcj10aGlzLl9jb25zdW1lTnVtYmVyKGUpLGkucHVzaChyKTtlbHNlIGlmKCJbIj09PWVbdGhpcy5fY3VycmVudF0pcj10aGlzLl9jb25zdW1lTEJyYWNrZXQoZSksaS5wdXNoKHIpO2Vsc2UgaWYoJyInPT09ZVt0aGlzLl9jdXJyZW50XSl0PXRoaXMuX2N1cnJlbnQsbj10aGlzLl9jb25zdW1lUXVvdGVkSWRlbnRpZmllcihlKSxpLnB1c2goe3R5cGU6dix2YWx1ZTpuLHN0YXJ0OnR9KTtlbHNlIGlmKCInIj09PWVbdGhpcy5fY3VycmVudF0pdD10aGlzLl9jdXJyZW50LG49dGhpcy5fY29uc3VtZVJhd1N0cmluZ0xpdGVyYWwoZSksaS5wdXNoKHt0eXBlOlYsdmFsdWU6bixzdGFydDp0fSk7ZWxzZSBpZigiYCI9PT1lW3RoaXMuX2N1cnJlbnRdKXt0PXRoaXMuX2N1cnJlbnQ7dmFyIGE9dGhpcy5fY29uc3VtZUxpdGVyYWwoZSk7aS5wdXNoKHt0eXBlOlYsdmFsdWU6YSxzdGFydDp0fSl9ZWxzZSBpZih2b2lkIDAhPT1IW2VbdGhpcy5fY3VycmVudF1dKWkucHVzaCh0aGlzLl9jb25zdW1lT3BlcmF0b3IoZSkpO2Vsc2UgaWYodm9pZCAwIT09eltlW3RoaXMuX2N1cnJlbnRdXSl0aGlzLl9jdXJyZW50Kys7ZWxzZSBpZigiJiI9PT1lW3RoaXMuX2N1cnJlbnRdKXQ9dGhpcy5fY3VycmVudCx0aGlzLl9jdXJyZW50KyssIiYiPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLGkucHVzaCh7dHlwZTpSLHZhbHVlOiImJiIsc3RhcnQ6dH0pKTppLnB1c2goe3R5cGU6dyx2YWx1ZToiJiIsc3RhcnQ6dH0pO2Vsc2V7aWYoInwiIT09ZVt0aGlzLl9jdXJyZW50XSl7dmFyIHM9bmV3IEVycm9yKCJVbmtub3duIGNoYXJhY3RlcjoiK2VbdGhpcy5fY3VycmVudF0pO3Rocm93IHMubmFtZT0iTGV4ZXJFcnJvciIsc310PXRoaXMuX2N1cnJlbnQsdGhpcy5fY3VycmVudCsrLCJ8Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyxpLnB1c2goe3R5cGU6Xyx2YWx1ZToifHwiLHN0YXJ0OnR9KSk6aS5wdXNoKHt0eXBlOkEsdmFsdWU6InwiLHN0YXJ0OnR9KX1yZXR1cm4gaX0sX2NvbnN1bWVVbnF1b3RlZElkZW50aWZpZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLl9jdXJyZW50O2Zvcih0aGlzLl9jdXJyZW50Kys7dGhpcy5fY3VycmVudDxlLmxlbmd0aCYmKCh0PWVbdGhpcy5fY3VycmVudF0pPj0iYSImJnQ8PSJ6Inx8dD49IkEiJiZ0PD0iWiJ8fHQ+PSIwIiYmdDw9IjkifHwiXyI9PT10KTspdGhpcy5fY3VycmVudCsrO3JldHVybiBlLnNsaWNlKG4sdGhpcy5fY3VycmVudCl9LF9jb25zdW1lUXVvdGVkSWRlbnRpZmllcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50O3RoaXMuX2N1cnJlbnQrKztmb3IodmFyIG49ZS5sZW5ndGg7JyInIT09ZVt0aGlzLl9jdXJyZW50XSYmdGhpcy5fY3VycmVudDxuOyl7dmFyIHI9dGhpcy5fY3VycmVudDsiXFwiIT09ZVtyXXx8IlxcIiE9PWVbcisxXSYmJyInIT09ZVtyKzFdP3IrKzpyKz0yLHRoaXMuX2N1cnJlbnQ9cn1yZXR1cm4gdGhpcy5fY3VycmVudCsrLEpTT04ucGFyc2UoZS5zbGljZSh0LHRoaXMuX2N1cnJlbnQpKX0sX2NvbnN1bWVSYXdTdHJpbmdMaXRlcmFsOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQ7dGhpcy5fY3VycmVudCsrO2Zvcih2YXIgbj1lLmxlbmd0aDsiJyIhPT1lW3RoaXMuX2N1cnJlbnRdJiZ0aGlzLl9jdXJyZW50PG47KXt2YXIgcj10aGlzLl9jdXJyZW50OyJcXCIhPT1lW3JdfHwiXFwiIT09ZVtyKzFdJiYiJyIhPT1lW3IrMV0/cisrOnIrPTIsdGhpcy5fY3VycmVudD1yfXJldHVybiB0aGlzLl9jdXJyZW50KyssZS5zbGljZSh0KzEsdGhpcy5fY3VycmVudC0xKS5yZXBsYWNlKCJcXCciLCInIil9LF9jb25zdW1lTnVtYmVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnQ7dGhpcy5fY3VycmVudCsrO2Zvcih2YXIgbj1lLmxlbmd0aDtLKGVbdGhpcy5fY3VycmVudF0pJiZ0aGlzLl9jdXJyZW50PG47KXRoaXMuX2N1cnJlbnQrKzt2YXIgcj1wYXJzZUludChlLnNsaWNlKHQsdGhpcy5fY3VycmVudCkpO3JldHVybnt0eXBlOlQsdmFsdWU6cixzdGFydDp0fX0sX2NvbnN1bWVMQnJhY2tldDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50O3JldHVybiB0aGlzLl9jdXJyZW50KyssIj8iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOlUsdmFsdWU6Ils/IixzdGFydDp0fSk6Il0iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOngsdmFsdWU6IltdIixzdGFydDp0fSk6e3R5cGU6Qix2YWx1ZToiWyIsc3RhcnQ6dH19LF9jb25zdW1lT3BlcmF0b3I6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fY3VycmVudCxuPWVbdF07cmV0dXJuIHRoaXMuX2N1cnJlbnQrKywiISI9PT1uPyI9Ij09PWVbdGhpcy5fY3VycmVudF0/KHRoaXMuX2N1cnJlbnQrKyx7dHlwZTpELHZhbHVlOiIhPSIsc3RhcnQ6dH0pOnt0eXBlOmosdmFsdWU6IiEiLHN0YXJ0OnR9OiI8Ij09PW4/Ij0iPT09ZVt0aGlzLl9jdXJyZW50XT8odGhpcy5fY3VycmVudCsrLHt0eXBlOlAsdmFsdWU6Ijw9IixzdGFydDp0fSk6e3R5cGU6ayx2YWx1ZToiPCIsc3RhcnQ6dH06Ij4iPT09bj8iPSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6Tix2YWx1ZToiPj0iLHN0YXJ0OnR9KTp7dHlwZTpPLHZhbHVlOiI+IixzdGFydDp0fToiPSI9PT1uJiYiPSI9PT1lW3RoaXMuX2N1cnJlbnRdPyh0aGlzLl9jdXJyZW50Kysse3R5cGU6TCx2YWx1ZToiPT0iLHN0YXJ0OnR9KTp2b2lkIDB9LF9jb25zdW1lTGl0ZXJhbDpmdW5jdGlvbihlKXt0aGlzLl9jdXJyZW50Kys7Zm9yKHZhciB0LG49dGhpcy5fY3VycmVudCxyPWUubGVuZ3RoOyJgIiE9PWVbdGhpcy5fY3VycmVudF0mJnRoaXMuX2N1cnJlbnQ8cjspe3ZhciBvPXRoaXMuX2N1cnJlbnQ7IlxcIiE9PWVbb118fCJcXCIhPT1lW28rMV0mJiJgIiE9PWVbbysxXT9vKys6bys9Mix0aGlzLl9jdXJyZW50PW99dmFyIGE9aShlLnNsaWNlKG4sdGhpcy5fY3VycmVudCkpO3JldHVybiBhPWEucmVwbGFjZSgiXFxgIiwiYCIpLHQ9dGhpcy5fbG9va3NMaWtlSlNPTihhKT9KU09OLnBhcnNlKGEpOkpTT04ucGFyc2UoJyInK2ErJyInKSx0aGlzLl9jdXJyZW50KyssdH0sX2xvb2tzTGlrZUpTT046ZnVuY3Rpb24oZSl7aWYoIiI9PT1lKXJldHVybiExO2lmKCdbeyInLmluZGV4T2YoZVswXSk+PTApcmV0dXJuITA7aWYoWyJ0cnVlIiwiZmFsc2UiLCJudWxsIl0uaW5kZXhPZihlKT49MClyZXR1cm4hMDtpZighKCItMDEyMzQ1Njc4OSIuaW5kZXhPZihlWzBdKT49MCkpcmV0dXJuITE7dHJ5e3JldHVybiBKU09OLnBhcnNlKGUpLCEwfWNhdGNoKGUpe3JldHVybiExfX19O3ZhciBYPXt9O2Z1bmN0aW9uIEooKXt9ZnVuY3Rpb24gUShlKXt0aGlzLnJ1bnRpbWU9ZX1mdW5jdGlvbiBaKGUpe3RoaXMuX2ludGVycHJldGVyPWUsdGhpcy5mdW5jdGlvblRhYmxlPXthYnM6e19mdW5jOnRoaXMuX2Z1bmN0aW9uQWJzLF9zaWduYXR1cmU6W3t0eXBlczpbYV19XX0sYXZnOntfZnVuYzp0aGlzLl9mdW5jdGlvbkF2Zyxfc2lnbmF0dXJlOlt7dHlwZXM6W2RdfV19LGNlaWw6e19mdW5jOnRoaXMuX2Z1bmN0aW9uQ2VpbCxfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LGNvbnRhaW5zOntfZnVuYzp0aGlzLl9mdW5jdGlvbkNvbnRhaW5zLF9zaWduYXR1cmU6W3t0eXBlczpbYyx1XX0se3R5cGVzOltzXX1dfSxlbmRzX3dpdGg6e19mdW5jOnRoaXMuX2Z1bmN0aW9uRW5kc1dpdGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjXX0se3R5cGVzOltjXX1dfSxmbG9vcjp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25GbG9vcixfc2lnbmF0dXJlOlt7dHlwZXM6W2FdfV19LGxlbmd0aDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25MZW5ndGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjLHUsbF19XX0sbWFwOntfZnVuYzp0aGlzLl9mdW5jdGlvbk1hcCxfc2lnbmF0dXJlOlt7dHlwZXM6W3BdfSx7dHlwZXM6W3VdfV19LG1heDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25NYXgsX3NpZ25hdHVyZTpbe3R5cGVzOltkLGZdfV19LG1lcmdlOntfZnVuYzp0aGlzLl9mdW5jdGlvbk1lcmdlLF9zaWduYXR1cmU6W3t0eXBlczpbbF0sdmFyaWFkaWM6ITB9XX0sbWF4X2J5OntfZnVuYzp0aGlzLl9mdW5jdGlvbk1heEJ5LF9zaWduYXR1cmU6W3t0eXBlczpbdV19LHt0eXBlczpbcF19XX0sc3VtOntfZnVuYzp0aGlzLl9mdW5jdGlvblN1bSxfc2lnbmF0dXJlOlt7dHlwZXM6W2RdfV19LHN0YXJ0c193aXRoOntfZnVuYzp0aGlzLl9mdW5jdGlvblN0YXJ0c1dpdGgsX3NpZ25hdHVyZTpbe3R5cGVzOltjXX0se3R5cGVzOltjXX1dfSxtaW46e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWluLF9zaWduYXR1cmU6W3t0eXBlczpbZCxmXX1dfSxtaW5fYnk6e19mdW5jOnRoaXMuX2Z1bmN0aW9uTWluQnksX3NpZ25hdHVyZTpbe3R5cGVzOlt1XX0se3R5cGVzOltwXX1dfSx0eXBlOntfZnVuYzp0aGlzLl9mdW5jdGlvblR5cGUsX3NpZ25hdHVyZTpbe3R5cGVzOltzXX1dfSxrZXlzOntfZnVuYzp0aGlzLl9mdW5jdGlvbktleXMsX3NpZ25hdHVyZTpbe3R5cGVzOltsXX1dfSx2YWx1ZXM6e19mdW5jOnRoaXMuX2Z1bmN0aW9uVmFsdWVzLF9zaWduYXR1cmU6W3t0eXBlczpbbF19XX0sc29ydDp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Tb3J0LF9zaWduYXR1cmU6W3t0eXBlczpbZixkXX1dfSxzb3J0X2J5OntfZnVuYzp0aGlzLl9mdW5jdGlvblNvcnRCeSxfc2lnbmF0dXJlOlt7dHlwZXM6W3VdfSx7dHlwZXM6W3BdfV19LGpvaW46e19mdW5jOnRoaXMuX2Z1bmN0aW9uSm9pbixfc2lnbmF0dXJlOlt7dHlwZXM6W2NdfSx7dHlwZXM6W2ZdfV19LHJldmVyc2U6e19mdW5jOnRoaXMuX2Z1bmN0aW9uUmV2ZXJzZSxfc2lnbmF0dXJlOlt7dHlwZXM6W2MsdV19XX0sdG9fYXJyYXk6e19mdW5jOnRoaXMuX2Z1bmN0aW9uVG9BcnJheSxfc2lnbmF0dXJlOlt7dHlwZXM6W3NdfV19LHRvX3N0cmluZzp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Ub1N0cmluZyxfc2lnbmF0dXJlOlt7dHlwZXM6W3NdfV19LHRvX251bWJlcjp7X2Z1bmM6dGhpcy5fZnVuY3Rpb25Ub051bWJlcixfc2lnbmF0dXJlOlt7dHlwZXM6W3NdfV19LG5vdF9udWxsOntfZnVuYzp0aGlzLl9mdW5jdGlvbk5vdE51bGwsX3NpZ25hdHVyZTpbe3R5cGVzOltzXSx2YXJpYWRpYzohMH1dfX19WFtnXT0wLFhbbV09MCxYW3ZdPTAsWFt5XT0wLFhbYl09MCxYW0VdPTAsWFtDXT0wLFhbVF09MCxYW0ldPTAsWFt3XT0wLFhbQV09MSxYW19dPTIsWFtSXT0zLFhbTF09NSxYW09dPTUsWFtrXT01LFhbTl09NSxYW1BdPTUsWFtEXT01LFhbeF09OSxYW01dPTIwLFhbVV09MjEsWFtGXT00MCxYW2pdPTQ1LFhbcV09NTAsWFtCXT01NSxYW0ddPTYwLEoucHJvdG90eXBlPXtwYXJzZTpmdW5jdGlvbihlKXt0aGlzLl9sb2FkVG9rZW5zKGUpLHRoaXMuaW5kZXg9MDt2YXIgdD10aGlzLmV4cHJlc3Npb24oMCk7aWYodGhpcy5fbG9va2FoZWFkKDApIT09Zyl7dmFyIG49dGhpcy5fbG9va2FoZWFkVG9rZW4oMCkscj1uZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gdHlwZTogIituLnR5cGUrIiwgdmFsdWU6ICIrbi52YWx1ZSk7dGhyb3cgci5uYW1lPSJQYXJzZXJFcnJvciIscn1yZXR1cm4gdH0sX2xvYWRUb2tlbnM6ZnVuY3Rpb24oZSl7dmFyIHQ9KG5ldyBZKS50b2tlbml6ZShlKTt0LnB1c2goe3R5cGU6Zyx2YWx1ZToiIixzdGFydDplLmxlbmd0aH0pLHRoaXMudG9rZW5zPXR9LGV4cHJlc3Npb246ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCk7dGhpcy5fYWR2YW5jZSgpO2Zvcih2YXIgbj10aGlzLm51ZCh0KSxyPXRoaXMuX2xvb2thaGVhZCgwKTtlPFhbcl07KXRoaXMuX2FkdmFuY2UoKSxuPXRoaXMubGVkKHIsbikscj10aGlzLl9sb29rYWhlYWQoMCk7cmV0dXJuIG59LF9sb29rYWhlYWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMudG9rZW5zW3RoaXMuaW5kZXgrZV0udHlwZX0sX2xvb2thaGVhZFRva2VuOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnRva2Vuc1t0aGlzLmluZGV4K2VdfSxfYWR2YW5jZTpmdW5jdGlvbigpe3RoaXMuaW5kZXgrK30sbnVkOmZ1bmN0aW9uKGUpe3ZhciB0LG47c3dpdGNoKGUudHlwZSl7Y2FzZSBWOnJldHVybnt0eXBlOiJMaXRlcmFsIix2YWx1ZTplLnZhbHVlfTtjYXNlIG06cmV0dXJue3R5cGU6IkZpZWxkIixuYW1lOmUudmFsdWV9O2Nhc2Ugdjp2YXIgcj17dHlwZToiRmllbGQiLG5hbWU6ZS52YWx1ZX07aWYodGhpcy5fbG9va2FoZWFkKDApPT09Ryl0aHJvdyBuZXcgRXJyb3IoIlF1b3RlZCBpZGVudGlmaWVyIG5vdCBhbGxvd2VkIGZvciBmdW5jdGlvbiBuYW1lcy4iKTtyZXR1cm4gcjtjYXNlIGo6cmV0dXJue3R5cGU6Ik5vdEV4cHJlc3Npb24iLGNoaWxkcmVuOlt0PXRoaXMuZXhwcmVzc2lvbihYLk5vdCldfTtjYXNlIE06cmV0dXJuIHQ9bnVsbCx7dHlwZToiVmFsdWVQcm9qZWN0aW9uIixjaGlsZHJlbjpbe3R5cGU6IklkZW50aXR5In0sdD10aGlzLl9sb29rYWhlYWQoMCk9PT15P3t0eXBlOiJJZGVudGl0eSJ9OnRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhYLlN0YXIpXX07Y2FzZSBVOnJldHVybiB0aGlzLmxlZChlLnR5cGUse3R5cGU6IklkZW50aXR5In0pO2Nhc2UgcTpyZXR1cm4gdGhpcy5fcGFyc2VNdWx0aXNlbGVjdEhhc2goKTtjYXNlIHg6cmV0dXJue3R5cGU6IlByb2plY3Rpb24iLGNoaWxkcmVuOlt7dHlwZTp4LGNoaWxkcmVuOlt7dHlwZToiSWRlbnRpdHkifV19LHQ9dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFguRmxhdHRlbildfTtjYXNlIEI6cmV0dXJuIHRoaXMuX2xvb2thaGVhZCgwKT09PVR8fHRoaXMuX2xvb2thaGVhZCgwKT09PVM/KHQ9dGhpcy5fcGFyc2VJbmRleEV4cHJlc3Npb24oKSx0aGlzLl9wcm9qZWN0SWZTbGljZSh7dHlwZToiSWRlbnRpdHkifSx0KSk6dGhpcy5fbG9va2FoZWFkKDApPT09TSYmdGhpcy5fbG9va2FoZWFkKDEpPT09eT8odGhpcy5fYWR2YW5jZSgpLHRoaXMuX2FkdmFuY2UoKSx7dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W3t0eXBlOiJJZGVudGl0eSJ9LHQ9dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFguU3RhcildfSk6dGhpcy5fcGFyc2VNdWx0aXNlbGVjdExpc3QoKTtjYXNlIEk6cmV0dXJue3R5cGU6SX07Y2FzZSB3OnJldHVybnt0eXBlOiJFeHByZXNzaW9uUmVmZXJlbmNlIixjaGlsZHJlbjpbbj10aGlzLmV4cHJlc3Npb24oWC5FeHByZWYpXX07Y2FzZSBHOmZvcih2YXIgbz1bXTt0aGlzLl9sb29rYWhlYWQoMCkhPT1iOyl0aGlzLl9sb29rYWhlYWQoMCk9PT1JPyhuPXt0eXBlOkl9LHRoaXMuX2FkdmFuY2UoKSk6bj10aGlzLmV4cHJlc3Npb24oMCksby5wdXNoKG4pO3JldHVybiB0aGlzLl9tYXRjaChiKSxvWzBdO2RlZmF1bHQ6dGhpcy5fZXJyb3JUb2tlbihlKX19LGxlZDpmdW5jdGlvbihlLHQpe3ZhciBuO3N3aXRjaChlKXtjYXNlIEY6dmFyIHI9WC5Eb3Q7cmV0dXJuIHRoaXMuX2xvb2thaGVhZCgwKSE9PU0/e3R5cGU6IlN1YmV4cHJlc3Npb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VEb3RSSFMocildfToodGhpcy5fYWR2YW5jZSgpLHt0eXBlOiJWYWx1ZVByb2plY3Rpb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKHIpXX0pO2Nhc2UgQTpyZXR1cm4gbj10aGlzLmV4cHJlc3Npb24oWC5QaXBlKSx7dHlwZTpBLGNoaWxkcmVuOlt0LG5dfTtjYXNlIF86cmV0dXJue3R5cGU6Ik9yRXhwcmVzc2lvbiIsY2hpbGRyZW46W3Qsbj10aGlzLmV4cHJlc3Npb24oWC5PcildfTtjYXNlIFI6cmV0dXJue3R5cGU6IkFuZEV4cHJlc3Npb24iLGNoaWxkcmVuOlt0LG49dGhpcy5leHByZXNzaW9uKFguQW5kKV19O2Nhc2UgRzpmb3IodmFyIG8saT10Lm5hbWUsYT1bXTt0aGlzLl9sb29rYWhlYWQoMCkhPT1iOyl0aGlzLl9sb29rYWhlYWQoMCk9PT1JPyhvPXt0eXBlOkl9LHRoaXMuX2FkdmFuY2UoKSk6bz10aGlzLmV4cHJlc3Npb24oMCksdGhpcy5fbG9va2FoZWFkKDApPT09RSYmdGhpcy5fbWF0Y2goRSksYS5wdXNoKG8pO3JldHVybiB0aGlzLl9tYXRjaChiKSx7dHlwZToiRnVuY3Rpb24iLG5hbWU6aSxjaGlsZHJlbjphfTtjYXNlIFU6dmFyIHM9dGhpcy5leHByZXNzaW9uKDApO3JldHVybiB0aGlzLl9tYXRjaCh5KSx7dHlwZToiRmlsdGVyUHJvamVjdGlvbiIsY2hpbGRyZW46W3Qsbj10aGlzLl9sb29rYWhlYWQoMCk9PT14P3t0eXBlOiJJZGVudGl0eSJ9OnRoaXMuX3BhcnNlUHJvamVjdGlvblJIUyhYLkZpbHRlciksc119O2Nhc2UgeDpyZXR1cm57dHlwZToiUHJvamVjdGlvbiIsY2hpbGRyZW46W3t0eXBlOngsY2hpbGRyZW46W3RdfSx0aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWC5GbGF0dGVuKV19O2Nhc2UgTDpjYXNlIEQ6Y2FzZSBPOmNhc2UgTjpjYXNlIGs6Y2FzZSBQOnJldHVybiB0aGlzLl9wYXJzZUNvbXBhcmF0b3IodCxlKTtjYXNlIEI6dmFyIGM9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCk7cmV0dXJuIGMudHlwZT09PVR8fGMudHlwZT09PVM/KG49dGhpcy5fcGFyc2VJbmRleEV4cHJlc3Npb24oKSx0aGlzLl9wcm9qZWN0SWZTbGljZSh0LG4pKToodGhpcy5fbWF0Y2goTSksdGhpcy5fbWF0Y2goeSkse3R5cGU6IlByb2plY3Rpb24iLGNoaWxkcmVuOlt0LG49dGhpcy5fcGFyc2VQcm9qZWN0aW9uUkhTKFguU3RhcildfSk7ZGVmYXVsdDp0aGlzLl9lcnJvclRva2VuKHRoaXMuX2xvb2thaGVhZFRva2VuKDApKX19LF9tYXRjaDpmdW5jdGlvbihlKXtpZih0aGlzLl9sb29rYWhlYWQoMCkhPT1lKXt2YXIgdD10aGlzLl9sb29rYWhlYWRUb2tlbigwKSxuPW5ldyBFcnJvcigiRXhwZWN0ZWQgIitlKyIsIGdvdDogIit0LnR5cGUpO3Rocm93IG4ubmFtZT0iUGFyc2VyRXJyb3IiLG59dGhpcy5fYWR2YW5jZSgpfSxfZXJyb3JUb2tlbjpmdW5jdGlvbihlKXt2YXIgdD1uZXcgRXJyb3IoIkludmFsaWQgdG9rZW4gKCIrZS50eXBlKycpOiAiJytlLnZhbHVlKyciJyk7dGhyb3cgdC5uYW1lPSJQYXJzZXJFcnJvciIsdH0sX3BhcnNlSW5kZXhFeHByZXNzaW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fbG9va2FoZWFkKDApPT09U3x8dGhpcy5fbG9va2FoZWFkKDEpPT09UylyZXR1cm4gdGhpcy5fcGFyc2VTbGljZUV4cHJlc3Npb24oKTt2YXIgZT17dHlwZToiSW5kZXgiLHZhbHVlOnRoaXMuX2xvb2thaGVhZFRva2VuKDApLnZhbHVlfTtyZXR1cm4gdGhpcy5fYWR2YW5jZSgpLHRoaXMuX21hdGNoKHkpLGV9LF9wcm9qZWN0SWZTbGljZTpmdW5jdGlvbihlLHQpe3ZhciBuPXt0eXBlOiJJbmRleEV4cHJlc3Npb24iLGNoaWxkcmVuOltlLHRdfTtyZXR1cm4iU2xpY2UiPT09dC50eXBlP3t0eXBlOiJQcm9qZWN0aW9uIixjaGlsZHJlbjpbbix0aGlzLl9wYXJzZVByb2plY3Rpb25SSFMoWC5TdGFyKV19Om59LF9wYXJzZVNsaWNlRXhwcmVzc2lvbjpmdW5jdGlvbigpe2Zvcih2YXIgZT1bbnVsbCxudWxsLG51bGxdLHQ9MCxuPXRoaXMuX2xvb2thaGVhZCgwKTtuIT09eSYmdDwzOyl7aWYobj09PVMpdCsrLHRoaXMuX2FkdmFuY2UoKTtlbHNle2lmKG4hPT1UKXt2YXIgcj10aGlzLl9sb29rYWhlYWQoMCksbz1uZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5leHBlY3RlZCB0b2tlbjogIityLnZhbHVlKyIoIityLnR5cGUrIikiKTt0aHJvdyBvLm5hbWU9IlBhcnNlcmVycm9yIixvfWVbdF09dGhpcy5fbG9va2FoZWFkVG9rZW4oMCkudmFsdWUsdGhpcy5fYWR2YW5jZSgpfW49dGhpcy5fbG9va2FoZWFkKDApfXJldHVybiB0aGlzLl9tYXRjaCh5KSx7dHlwZToiU2xpY2UiLGNoaWxkcmVuOmV9fSxfcGFyc2VDb21wYXJhdG9yOmZ1bmN0aW9uKGUsdCl7cmV0dXJue3R5cGU6IkNvbXBhcmF0b3IiLG5hbWU6dCxjaGlsZHJlbjpbZSx0aGlzLmV4cHJlc3Npb24oWFt0XSldfX0sX3BhcnNlRG90UkhTOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2xvb2thaGVhZCgwKTtyZXR1cm5bbSx2LE1dLmluZGV4T2YodCk+PTA/dGhpcy5leHByZXNzaW9uKGUpOnQ9PT1CPyh0aGlzLl9tYXRjaChCKSx0aGlzLl9wYXJzZU11bHRpc2VsZWN0TGlzdCgpKTp0PT09cT8odGhpcy5fbWF0Y2gocSksdGhpcy5fcGFyc2VNdWx0aXNlbGVjdEhhc2goKSk6dm9pZCAwfSxfcGFyc2VQcm9qZWN0aW9uUkhTOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKFhbdGhpcy5fbG9va2FoZWFkKDApXTwxMCl0PXt0eXBlOiJJZGVudGl0eSJ9O2Vsc2UgaWYodGhpcy5fbG9va2FoZWFkKDApPT09Qil0PXRoaXMuZXhwcmVzc2lvbihlKTtlbHNlIGlmKHRoaXMuX2xvb2thaGVhZCgwKT09PVUpdD10aGlzLmV4cHJlc3Npb24oZSk7ZWxzZXtpZih0aGlzLl9sb29rYWhlYWQoMCkhPT1GKXt2YXIgbj10aGlzLl9sb29rYWhlYWRUb2tlbigwKSxyPW5ldyBFcnJvcigiU3l0YW54IGVycm9yLCB1bmV4cGVjdGVkIHRva2VuOiAiK24udmFsdWUrIigiK24udHlwZSsiKSIpO3Rocm93IHIubmFtZT0iUGFyc2VyRXJyb3IiLHJ9dGhpcy5fbWF0Y2goRiksdD10aGlzLl9wYXJzZURvdFJIUyhlKX1yZXR1cm4gdH0sX3BhcnNlTXVsdGlzZWxlY3RMaXN0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdO3RoaXMuX2xvb2thaGVhZCgwKSE9PXk7KXt2YXIgdD10aGlzLmV4cHJlc3Npb24oMCk7aWYoZS5wdXNoKHQpLHRoaXMuX2xvb2thaGVhZCgwKT09PUUmJih0aGlzLl9tYXRjaChFKSx0aGlzLl9sb29rYWhlYWQoMCk9PT15KSl0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdG9rZW4gUmJyYWNrZXQiKX1yZXR1cm4gdGhpcy5fbWF0Y2goeSkse3R5cGU6Ik11bHRpU2VsZWN0TGlzdCIsY2hpbGRyZW46ZX19LF9wYXJzZU11bHRpc2VsZWN0SGFzaDpmdW5jdGlvbigpe2Zvcih2YXIgZSx0LG4scj1bXSxvPVttLHZdOzspe2lmKGU9dGhpcy5fbG9va2FoZWFkVG9rZW4oMCksby5pbmRleE9mKGUudHlwZSk8MCl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGluZyBhbiBpZGVudGlmaWVyIHRva2VuLCBnb3Q6ICIrZS50eXBlKTtpZih0PWUudmFsdWUsdGhpcy5fYWR2YW5jZSgpLHRoaXMuX21hdGNoKFMpLG49e3R5cGU6IktleVZhbHVlUGFpciIsbmFtZTp0LHZhbHVlOnRoaXMuZXhwcmVzc2lvbigwKX0sci5wdXNoKG4pLHRoaXMuX2xvb2thaGVhZCgwKT09PUUpdGhpcy5fbWF0Y2goRSk7ZWxzZSBpZih0aGlzLl9sb29rYWhlYWQoMCk9PT1DKXt0aGlzLl9tYXRjaChDKTticmVha319cmV0dXJue3R5cGU6Ik11bHRpU2VsZWN0SGFzaCIsY2hpbGRyZW46cn19fSxRLnByb3RvdHlwZT17c2VhcmNoOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMudmlzaXQoZSx0KX0sdmlzaXQ6ZnVuY3Rpb24oZSxpKXt2YXIgYSxzLGMsdSxsLHAsZCxmLGg7c3dpdGNoKGUudHlwZSl7Y2FzZSJGaWVsZCI6cmV0dXJuIG51bGwhPT1pJiZuKGkpP3ZvaWQgMD09PShwPWlbZS5uYW1lXSk/bnVsbDpwOm51bGw7Y2FzZSJTdWJleHByZXNzaW9uIjpmb3IoYz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSksaD0xO2g8ZS5jaGlsZHJlbi5sZW5ndGg7aCsrKWlmKG51bGw9PT0oYz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sYykpKXJldHVybiBudWxsO3JldHVybiBjO2Nhc2UiSW5kZXhFeHByZXNzaW9uIjpyZXR1cm4gZD10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSksdGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGQpO2Nhc2UiSW5kZXgiOmlmKCF0KGkpKXJldHVybiBudWxsO3ZhciBnPWUudmFsdWU7cmV0dXJuIGc8MCYmKGc9aS5sZW5ndGgrZyksdm9pZCAwPT09KGM9aVtnXSkmJihjPW51bGwpLGM7Y2FzZSJTbGljZSI6aWYoIXQoaSkpcmV0dXJuIG51bGw7dmFyIG09ZS5jaGlsZHJlbi5zbGljZSgwKSx2PXRoaXMuY29tcHV0ZVNsaWNlUGFyYW1zKGkubGVuZ3RoLG0pLHk9dlswXSxiPXZbMV0sRT12WzJdO2lmKGM9W10sRT4wKWZvcihoPXk7aDxiO2grPUUpYy5wdXNoKGlbaF0pO2Vsc2UgZm9yKGg9eTtoPmI7aCs9RSljLnB1c2goaVtoXSk7cmV0dXJuIGM7Y2FzZSJQcm9qZWN0aW9uIjp2YXIgUz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSk7aWYoIXQoUykpcmV0dXJuIG51bGw7Zm9yKGY9W10saD0wO2g8Uy5sZW5ndGg7aCsrKW51bGwhPT0ocz10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sU1toXSkpJiZmLnB1c2gocyk7cmV0dXJuIGY7Y2FzZSJWYWx1ZVByb2plY3Rpb24iOmlmKCFuKFM9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpKSlyZXR1cm4gbnVsbDtmPVtdO3ZhciBDPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPVtdLHI9MDtyPHQubGVuZ3RoO3IrKyluLnB1c2goZVt0W3JdXSk7cmV0dXJuIG59KFMpO2ZvcihoPTA7aDxDLmxlbmd0aDtoKyspbnVsbCE9PShzPXRoaXMudmlzaXQoZS5jaGlsZHJlblsxXSxDW2hdKSkmJmYucHVzaChzKTtyZXR1cm4gZjtjYXNlIkZpbHRlclByb2plY3Rpb24iOmlmKCF0KFM9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpKSlyZXR1cm4gbnVsbDt2YXIgVD1bXSxfPVtdO2ZvcihoPTA7aDxTLmxlbmd0aDtoKyspbyhhPXRoaXMudmlzaXQoZS5jaGlsZHJlblsyXSxTW2hdKSl8fFQucHVzaChTW2hdKTtmb3IodmFyIFI9MDtSPFQubGVuZ3RoO1IrKyludWxsIT09KHM9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLFRbUl0pKSYmXy5wdXNoKHMpO3JldHVybiBfO2Nhc2UiQ29tcGFyYXRvciI6c3dpdGNoKHU9dGhpcy52aXNpdChlLmNoaWxkcmVuWzBdLGkpLGw9dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGkpLGUubmFtZSl7Y2FzZSBMOmM9cih1LGwpO2JyZWFrO2Nhc2UgRDpjPSFyKHUsbCk7YnJlYWs7Y2FzZSBPOmM9dT5sO2JyZWFrO2Nhc2UgTjpjPXU+PWw7YnJlYWs7Y2FzZSBrOmM9dTxsO2JyZWFrO2Nhc2UgUDpjPXU8PWw7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY29tcGFyYXRvcjogIitlLm5hbWUpfXJldHVybiBjO2Nhc2UgeDp2YXIgTT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSk7aWYoIXQoTSkpcmV0dXJuIG51bGw7dmFyIFU9W107Zm9yKGg9MDtoPE0ubGVuZ3RoO2grKyl0KHM9TVtoXSk/VS5wdXNoLmFwcGx5KFUscyk6VS5wdXNoKHMpO3JldHVybiBVO2Nhc2UiSWRlbnRpdHkiOnJldHVybiBpO2Nhc2UiTXVsdGlTZWxlY3RMaXN0IjppZihudWxsPT09aSlyZXR1cm4gbnVsbDtmb3IoZj1bXSxoPTA7aDxlLmNoaWxkcmVuLmxlbmd0aDtoKyspZi5wdXNoKHRoaXMudmlzaXQoZS5jaGlsZHJlbltoXSxpKSk7cmV0dXJuIGY7Y2FzZSJNdWx0aVNlbGVjdEhhc2giOmlmKG51bGw9PT1pKXJldHVybiBudWxsO3ZhciBGO2ZvcihmPXt9LGg9MDtoPGUuY2hpbGRyZW4ubGVuZ3RoO2grKylmWyhGPWUuY2hpbGRyZW5baF0pLm5hbWVdPXRoaXMudmlzaXQoRi52YWx1ZSxpKTtyZXR1cm4gZjtjYXNlIk9yRXhwcmVzc2lvbiI6cmV0dXJuIG8oYT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpJiYoYT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0saSkpLGE7Y2FzZSJBbmRFeHByZXNzaW9uIjpyZXR1cm4hMD09PW8odT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpP3U6dGhpcy52aXNpdChlLmNoaWxkcmVuWzFdLGkpO2Nhc2UiTm90RXhwcmVzc2lvbiI6cmV0dXJuIG8odT10aGlzLnZpc2l0KGUuY2hpbGRyZW5bMF0saSkpO2Nhc2UiTGl0ZXJhbCI6cmV0dXJuIGUudmFsdWU7Y2FzZSBBOnJldHVybiBkPXRoaXMudmlzaXQoZS5jaGlsZHJlblswXSxpKSx0aGlzLnZpc2l0KGUuY2hpbGRyZW5bMV0sZCk7Y2FzZSBJOnJldHVybiBpO2Nhc2UiRnVuY3Rpb24iOnZhciBqPVtdO2ZvcihoPTA7aDxlLmNoaWxkcmVuLmxlbmd0aDtoKyspai5wdXNoKHRoaXMudmlzaXQoZS5jaGlsZHJlbltoXSxpKSk7cmV0dXJuIHRoaXMucnVudGltZS5jYWxsRnVuY3Rpb24oZS5uYW1lLGopO2Nhc2UiRXhwcmVzc2lvblJlZmVyZW5jZSI6dmFyIHE9ZS5jaGlsZHJlblswXTtyZXR1cm4gcS5qbWVzcGF0aFR5cGU9dyxxO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIG5vZGUgdHlwZTogIitlLnR5cGUpfX0sY29tcHV0ZVNsaWNlUGFyYW1zOmZ1bmN0aW9uKGUsdCl7dmFyIG49dFswXSxyPXRbMV0sbz10WzJdLGk9W251bGwsbnVsbCxudWxsXTtpZihudWxsPT09bylvPTE7ZWxzZSBpZigwPT09byl7dmFyIGE9bmV3IEVycm9yKCJJbnZhbGlkIHNsaWNlLCBzdGVwIGNhbm5vdCBiZSAwIik7dGhyb3cgYS5uYW1lPSJSdW50aW1lRXJyb3IiLGF9dmFyIHM9bzwwO3JldHVybiBuPW51bGw9PT1uP3M/ZS0xOjA6dGhpcy5jYXBTbGljZVJhbmdlKGUsbixvKSxyPW51bGw9PT1yP3M/LTE6ZTp0aGlzLmNhcFNsaWNlUmFuZ2UoZSxyLG8pLGlbMF09bixpWzFdPXIsaVsyXT1vLGl9LGNhcFNsaWNlUmFuZ2U6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0PDA/KHQrPWUpPDAmJih0PW48MD8tMTowKTp0Pj1lJiYodD1uPDA/ZS0xOmUpLHR9fSxaLnByb3RvdHlwZT17Y2FsbEZ1bmN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5mdW5jdGlvblRhYmxlW2VdO2lmKHZvaWQgMD09PW4pdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGZ1bmN0aW9uOiAiK2UrIigpIik7cmV0dXJuIHRoaXMuX3ZhbGlkYXRlQXJncyhlLHQsbi5fc2lnbmF0dXJlKSxuLl9mdW5jLmNhbGwodGhpcyx0KX0sX3ZhbGlkYXRlQXJnczpmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxpLGE7aWYobltuLmxlbmd0aC0xXS52YXJpYWRpYyl7aWYodC5sZW5ndGg8bi5sZW5ndGgpdGhyb3cgcj0xPT09bi5sZW5ndGg/IiBhcmd1bWVudCI6IiBhcmd1bWVudHMiLG5ldyBFcnJvcigiQXJndW1lbnRFcnJvcjogIitlKyIoKSB0YWtlcyBhdCBsZWFzdCIrbi5sZW5ndGgrcisiIGJ1dCByZWNlaXZlZCAiK3QubGVuZ3RoKX1lbHNlIGlmKHQubGVuZ3RoIT09bi5sZW5ndGgpdGhyb3cgcj0xPT09bi5sZW5ndGg/IiBhcmd1bWVudCI6IiBhcmd1bWVudHMiLG5ldyBFcnJvcigiQXJndW1lbnRFcnJvcjogIitlKyIoKSB0YWtlcyAiK24ubGVuZ3RoK3IrIiBidXQgcmVjZWl2ZWQgIit0Lmxlbmd0aCk7Zm9yKHZhciBzPTA7czxuLmxlbmd0aDtzKyspe2E9ITEsbz1uW3NdLnR5cGVzLGk9dGhpcy5fZ2V0VHlwZU5hbWUodFtzXSk7Zm9yKHZhciBjPTA7YzxvLmxlbmd0aDtjKyspaWYodGhpcy5fdHlwZU1hdGNoZXMoaSxvW2NdLHRbc10pKXthPSEwO2JyZWFrfWlmKCFhKXt2YXIgdT1vLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGhbZV19KSkuam9pbigiLCIpO3Rocm93IG5ldyBFcnJvcigiVHlwZUVycm9yOiAiK2UrIigpIGV4cGVjdGVkIGFyZ3VtZW50ICIrKHMrMSkrIiB0byBiZSB0eXBlICIrdSsiIGJ1dCByZWNlaXZlZCB0eXBlICIraFtpXSsiIGluc3RlYWQuIil9fX0sX3R5cGVNYXRjaGVzOmZ1bmN0aW9uKGUsdCxuKXtpZih0PT09cylyZXR1cm4hMDtpZih0IT09ZiYmdCE9PWQmJnQhPT11KXJldHVybiBlPT09dDtpZih0PT09dSlyZXR1cm4gZT09PXU7aWYoZT09PXUpe3ZhciByO3Q9PT1kP3I9YTp0PT09ZiYmKHI9Yyk7Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspaWYoIXRoaXMuX3R5cGVNYXRjaGVzKHRoaXMuX2dldFR5cGVOYW1lKG5bb10pLHIsbltvXSkpcmV0dXJuITE7cmV0dXJuITB9fSxfZ2V0VHlwZU5hbWU6ZnVuY3Rpb24oZSl7c3dpdGNoKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKSl7Y2FzZSJbb2JqZWN0IFN0cmluZ10iOnJldHVybiBjO2Nhc2UiW29iamVjdCBOdW1iZXJdIjpyZXR1cm4gYTtjYXNlIltvYmplY3QgQXJyYXldIjpyZXR1cm4gdTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOnJldHVybiA1O2Nhc2UiW29iamVjdCBOdWxsXSI6cmV0dXJuIDc7Y2FzZSJbb2JqZWN0IE9iamVjdF0iOnJldHVybiBlLmptZXNwYXRoVHlwZT09PXc/cDpsfX0sX2Z1bmN0aW9uU3RhcnRzV2l0aDpmdW5jdGlvbihlKXtyZXR1cm4gMD09PWVbMF0ubGFzdEluZGV4T2YoZVsxXSl9LF9mdW5jdGlvbkVuZHNXaXRoOmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0sbj1lWzFdO3JldHVybi0xIT09dC5pbmRleE9mKG4sdC5sZW5ndGgtbi5sZW5ndGgpfSxfZnVuY3Rpb25SZXZlcnNlOmZ1bmN0aW9uKGUpe2lmKHRoaXMuX2dldFR5cGVOYW1lKGVbMF0pPT09Yyl7Zm9yKHZhciB0PWVbMF0sbj0iIixyPXQubGVuZ3RoLTE7cj49MDtyLS0pbis9dFtyXTtyZXR1cm4gbn12YXIgbz1lWzBdLnNsaWNlKDApO3JldHVybiBvLnJldmVyc2UoKSxvfSxfZnVuY3Rpb25BYnM6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguYWJzKGVbMF0pfSxfZnVuY3Rpb25DZWlsOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmNlaWwoZVswXSl9LF9mdW5jdGlvbkF2ZzpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWVbMF0scj0wO3I8bi5sZW5ndGg7cisrKXQrPW5bcl07cmV0dXJuIHQvbi5sZW5ndGh9LF9mdW5jdGlvbkNvbnRhaW5zOmZ1bmN0aW9uKGUpe3JldHVybiBlWzBdLmluZGV4T2YoZVsxXSk+PTB9LF9mdW5jdGlvbkZsb29yOmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmZsb29yKGVbMF0pfSxfZnVuY3Rpb25MZW5ndGg6ZnVuY3Rpb24oZSl7cmV0dXJuIG4oZVswXSk/T2JqZWN0LmtleXMoZVswXSkubGVuZ3RoOmVbMF0ubGVuZ3RofSxfZnVuY3Rpb25NYXA6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdLG49dGhpcy5faW50ZXJwcmV0ZXIscj1lWzBdLG89ZVsxXSxpPTA7aTxvLmxlbmd0aDtpKyspdC5wdXNoKG4udmlzaXQocixvW2ldKSk7cmV0dXJuIHR9LF9mdW5jdGlvbk1lcmdlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD17fSxuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciByPWVbbl07Zm9yKHZhciBvIGluIHIpdFtvXT1yW29dfXJldHVybiB0fSxfZnVuY3Rpb25NYXg6ZnVuY3Rpb24oZSl7aWYoZVswXS5sZW5ndGg+MCl7aWYodGhpcy5fZ2V0VHlwZU5hbWUoZVswXVswXSk9PT1hKXJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLGVbMF0pO2Zvcih2YXIgdD1lWzBdLG49dFswXSxyPTE7cjx0Lmxlbmd0aDtyKyspbi5sb2NhbGVDb21wYXJlKHRbcl0pPDAmJihuPXRbcl0pO3JldHVybiBufXJldHVybiBudWxsfSxfZnVuY3Rpb25NaW46ZnVuY3Rpb24oZSl7aWYoZVswXS5sZW5ndGg+MCl7aWYodGhpcy5fZ2V0VHlwZU5hbWUoZVswXVswXSk9PT1hKXJldHVybiBNYXRoLm1pbi5hcHBseShNYXRoLGVbMF0pO2Zvcih2YXIgdD1lWzBdLG49dFswXSxyPTE7cjx0Lmxlbmd0aDtyKyspdFtyXS5sb2NhbGVDb21wYXJlKG4pPDAmJihuPXRbcl0pO3JldHVybiBufXJldHVybiBudWxsfSxfZnVuY3Rpb25TdW06ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lWzBdLHI9MDtyPG4ubGVuZ3RoO3IrKyl0Kz1uW3JdO3JldHVybiB0fSxfZnVuY3Rpb25UeXBlOmZ1bmN0aW9uKGUpe3N3aXRjaCh0aGlzLl9nZXRUeXBlTmFtZShlWzBdKSl7Y2FzZSBhOnJldHVybiJudW1iZXIiO2Nhc2UgYzpyZXR1cm4ic3RyaW5nIjtjYXNlIHU6cmV0dXJuImFycmF5IjtjYXNlIGw6cmV0dXJuIm9iamVjdCI7Y2FzZSA1OnJldHVybiJib29sZWFuIjtjYXNlIHA6cmV0dXJuImV4cHJlZiI7Y2FzZSA3OnJldHVybiJudWxsIn19LF9mdW5jdGlvbktleXM6ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5rZXlzKGVbMF0pfSxfZnVuY3Rpb25WYWx1ZXM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWVbMF0sbj1PYmplY3Qua2V5cyh0KSxyPVtdLG89MDtvPG4ubGVuZ3RoO28rKylyLnB1c2godFtuW29dXSk7cmV0dXJuIHJ9LF9mdW5jdGlvbkpvaW46ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtyZXR1cm4gZVsxXS5qb2luKHQpfSxfZnVuY3Rpb25Ub0FycmF5OmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlTmFtZShlWzBdKT09PXU/ZVswXTpbZVswXV19LF9mdW5jdGlvblRvU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9nZXRUeXBlTmFtZShlWzBdKT09PWM/ZVswXTpKU09OLnN0cmluZ2lmeShlWzBdKX0sX2Z1bmN0aW9uVG9OdW1iZXI6ZnVuY3Rpb24oZSl7dmFyIHQsbj10aGlzLl9nZXRUeXBlTmFtZShlWzBdKTtyZXR1cm4gbj09PWE/ZVswXTpuIT09Y3x8KHQ9K2VbMF0saXNOYU4odCkpP251bGw6dH0sX2Z1bmN0aW9uTm90TnVsbDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKylpZig3IT09dGhpcy5fZ2V0VHlwZU5hbWUoZVt0XSkpcmV0dXJuIGVbdF07cmV0dXJuIG51bGx9LF9mdW5jdGlvblNvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS5zbGljZSgwKTtyZXR1cm4gdC5zb3J0KCksdH0sX2Z1bmN0aW9uU29ydEJ5OmZ1bmN0aW9uKGUpe3ZhciB0PWVbMF0uc2xpY2UoMCk7aWYoMD09PXQubGVuZ3RoKXJldHVybiB0O3ZhciBuPXRoaXMuX2ludGVycHJldGVyLHI9ZVsxXSxvPXRoaXMuX2dldFR5cGVOYW1lKG4udmlzaXQocix0WzBdKSk7aWYoW2EsY10uaW5kZXhPZihvKTwwKXRocm93IG5ldyBFcnJvcigiVHlwZUVycm9yIik7Zm9yKHZhciBpPXRoaXMscz1bXSx1PTA7dTx0Lmxlbmd0aDt1Kyspcy5wdXNoKFt1LHRbdV1dKTtzLnNvcnQoKGZ1bmN0aW9uKGUsdCl7dmFyIGE9bi52aXNpdChyLGVbMV0pLHM9bi52aXNpdChyLHRbMV0pO2lmKGkuX2dldFR5cGVOYW1lKGEpIT09byl0aHJvdyBuZXcgRXJyb3IoIlR5cGVFcnJvcjogZXhwZWN0ZWQgIitvKyIsIHJlY2VpdmVkICIraS5fZ2V0VHlwZU5hbWUoYSkpO2lmKGkuX2dldFR5cGVOYW1lKHMpIT09byl0aHJvdyBuZXcgRXJyb3IoIlR5cGVFcnJvcjogZXhwZWN0ZWQgIitvKyIsIHJlY2VpdmVkICIraS5fZ2V0VHlwZU5hbWUocykpO3JldHVybiBhPnM/MTphPHM/LTE6ZVswXS10WzBdfSkpO2Zvcih2YXIgbD0wO2w8cy5sZW5ndGg7bCsrKXRbbF09c1tsXVsxXTtyZXR1cm4gdH0sX2Z1bmN0aW9uTWF4Qnk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0LG4scj1lWzFdLG89ZVswXSxpPXRoaXMuY3JlYXRlS2V5RnVuY3Rpb24ocixbYSxjXSkscz0tMS8wLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1pKG9bdV0pKT5zJiYocz1uLHQ9b1t1XSk7cmV0dXJuIHR9LF9mdW5jdGlvbk1pbkJ5OmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHI9ZVsxXSxvPWVbMF0saT10aGlzLmNyZWF0ZUtleUZ1bmN0aW9uKHIsW2EsY10pLHM9MS8wLHU9MDt1PG8ubGVuZ3RoO3UrKykobj1pKG9bdV0pKTxzJiYocz1uLHQ9b1t1XSk7cmV0dXJuIHR9LGNyZWF0ZUtleUZ1bmN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcyxyPXRoaXMuX2ludGVycHJldGVyO3JldHVybiBmdW5jdGlvbihvKXt2YXIgaT1yLnZpc2l0KGUsbyk7aWYodC5pbmRleE9mKG4uX2dldFR5cGVOYW1lKGkpKTwwKXt2YXIgYT0iVHlwZUVycm9yOiBleHBlY3RlZCBvbmUgb2YgIit0KyIsIHJlY2VpdmVkICIrbi5fZ2V0VHlwZU5hbWUoaSk7dGhyb3cgbmV3IEVycm9yKGEpfXJldHVybiBpfX19LGUudG9rZW5pemU9ZnVuY3Rpb24oZSl7cmV0dXJuKG5ldyBZKS50b2tlbml6ZShlKX0sZS5jb21waWxlPWZ1bmN0aW9uKGUpe3JldHVybihuZXcgSikucGFyc2UoZSl9LGUuc2VhcmNoPWZ1bmN0aW9uKGUsdCl7dmFyIG49bmV3IEoscj1uZXcgWixvPW5ldyBRKHIpO3IuX2ludGVycHJldGVyPW87dmFyIGk9bi5wYXJzZSh0KTtyZXR1cm4gby5zZWFyY2goaSxlKX0sZS5zdHJpY3REZWVwRXF1YWw9cn0odm9pZCAwPT09bj90aGlzLmptZXNwYXRoPXt9Om4pfSx7fV0sOTE6W2Z1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGk9dC5leHBvcnRzPXt9O2Z1bmN0aW9uIGEoKXt0aHJvdyBuZXcgRXJyb3IoInNldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBzKCl7dGhyb3cgbmV3IEVycm9yKCJjbGVhclRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQiKX1mdW5jdGlvbiBjKGUpe2lmKHI9PT1zZXRUaW1lb3V0KXJldHVybiBzZXRUaW1lb3V0KGUsMCk7aWYoKHI9PT1hfHwhcikmJnNldFRpbWVvdXQpcmV0dXJuIHI9c2V0VGltZW91dCxzZXRUaW1lb3V0KGUsMCk7dHJ5e3JldHVybiByKGUsMCl9Y2F0Y2godCl7dHJ5e3JldHVybiByLmNhbGwobnVsbCxlLDApfWNhdGNoKHQpe3JldHVybiByLmNhbGwodGhpcyxlLDApfX19IWZ1bmN0aW9uKCl7dHJ5e3I9ImZ1bmN0aW9uIj09dHlwZW9mIHNldFRpbWVvdXQ/c2V0VGltZW91dDphfWNhdGNoKGUpe3I9YX10cnl7bz0iZnVuY3Rpb24iPT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDpzfWNhdGNoKGUpe289c319KCk7dmFyIHUsbD1bXSxwPSExLGQ9LTE7ZnVuY3Rpb24gZigpe3AmJnUmJihwPSExLHUubGVuZ3RoP2w9dS5jb25jYXQobCk6ZD0tMSxsLmxlbmd0aCYmaCgpKX1mdW5jdGlvbiBoKCl7aWYoIXApe3ZhciBlPWMoZik7cD0hMDtmb3IodmFyIHQ9bC5sZW5ndGg7dDspe2Zvcih1PWwsbD1bXTsrK2Q8dDspdSYmdVtkXS5ydW4oKTtkPS0xLHQ9bC5sZW5ndGh9dT1udWxsLHA9ITEsZnVuY3Rpb24oZSl7aWYobz09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGUpO2lmKChvPT09c3x8IW8pJiZjbGVhclRpbWVvdXQpcmV0dXJuIG89Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChlKTt0cnl7cmV0dXJuIG8oZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBvLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4gby5jYWxsKHRoaXMsZSl9fX0oZSl9fWZ1bmN0aW9uIGcoZSx0KXt0aGlzLmZ1bj1lLHRoaXMuYXJyYXk9dH1mdW5jdGlvbiBtKCl7fWkubmV4dFRpY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdFtuLTFdPWFyZ3VtZW50c1tuXTtsLnB1c2gobmV3IGcoZSx0KSksMSE9PWwubGVuZ3RofHxwfHxjKGgpfSxnLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxpLnRpdGxlPSJicm93c2VyIixpLmJyb3dzZXI9ITAsaS5lbnY9e30saS5hcmd2PVtdLGkudmVyc2lvbj0iIixpLnZlcnNpb25zPXt9LGkub249bSxpLmFkZExpc3RlbmVyPW0saS5vbmNlPW0saS5vZmY9bSxpLnJlbW92ZUxpc3RlbmVyPW0saS5yZW1vdmVBbGxMaXN0ZW5lcnM9bSxpLmVtaXQ9bSxpLnByZXBlbmRMaXN0ZW5lcj1tLGkucHJlcGVuZE9uY2VMaXN0ZW5lcj1tLGkubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybltdfSxpLmJpbmRpbmc9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxpLmN3ZD1mdW5jdGlvbigpe3JldHVybiIvIn0saS5jaGRpcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSxpLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSx7fV0sOTI6W2Z1bmN0aW9uKGUsdCxpKXsoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKCl7IWZ1bmN0aW9uKGEpe3ZhciBzPSJvYmplY3QiPT1vKGkpJiZpJiYhaS5ub2RlVHlwZSYmaSxjPSJvYmplY3QiPT1vKHQpJiZ0JiYhdC5ub2RlVHlwZSYmdCx1PSJvYmplY3QiPT1vKGUpJiZlO3UuZ2xvYmFsIT09dSYmdS53aW5kb3chPT11JiZ1LnNlbGYhPT11fHwoYT11KTt2YXIgbCxwLGQ9MjE0NzQ4MzY0NyxmPTM2LGg9MSxnPTI2LG09Mzgsdj03MDAseT03MixiPTEyOCxFPSItIixTPS9eeG4tLS8sQz0vW15ceDIwLVx4N0VdLyxUPS9bXHgyRVx1MzAwMlx1RkYwRVx1RkY2MV0vZyxJPXtvdmVyZmxvdzoiT3ZlcmZsb3c6IGlucHV0IG5lZWRzIHdpZGVyIGludGVnZXJzIHRvIHByb2Nlc3MiLCJub3QtYmFzaWMiOiJJbGxlZ2FsIGlucHV0ID49IDB4ODAgKG5vdCBhIGJhc2ljIGNvZGUgcG9pbnQpIiwiaW52YWxpZC1pbnB1dCI6IkludmFsaWQgaW5wdXQifSx3PWYtaCxBPU1hdGguZmxvb3IsXz1TdHJpbmcuZnJvbUNoYXJDb2RlO2Z1bmN0aW9uIFIoZSl7dGhyb3cgbmV3IFJhbmdlRXJyb3IoSVtlXSl9ZnVuY3Rpb24gTChlLHQpe2Zvcih2YXIgbj1lLmxlbmd0aCxyPVtdO24tLTspcltuXT10KGVbbl0pO3JldHVybiByfWZ1bmN0aW9uIE8oZSx0KXt2YXIgbj1lLnNwbGl0KCJAIikscj0iIjtyZXR1cm4gbi5sZW5ndGg+MSYmKHI9blswXSsiQCIsZT1uWzFdKSxyK0woKGU9ZS5yZXBsYWNlKFQsIi4iKSkuc3BsaXQoIi4iKSx0KS5qb2luKCIuIil9ZnVuY3Rpb24gayhlKXtmb3IodmFyIHQsbixyPVtdLG89MCxpPWUubGVuZ3RoO288aTspKHQ9ZS5jaGFyQ29kZUF0KG8rKykpPj01NTI5NiYmdDw9NTYzMTkmJm88aT81NjMyMD09KDY0NTEyJihuPWUuY2hhckNvZGVBdChvKyspKSk/ci5wdXNoKCgoMTAyMyZ0KTw8MTApKygxMDIzJm4pKzY1NTM2KTooci5wdXNoKHQpLG8tLSk6ci5wdXNoKHQpO3JldHVybiByfWZ1bmN0aW9uIE4oZSl7cmV0dXJuIEwoZSwoZnVuY3Rpb24oZSl7dmFyIHQ9IiI7cmV0dXJuIGU+NjU1MzUmJih0Kz1fKChlLT02NTUzNik+Pj4xMCYxMDIzfDU1Mjk2KSxlPTU2MzIwfDEwMjMmZSksdCs9XyhlKX0pKS5qb2luKCIiKX1mdW5jdGlvbiBQKGUsdCl7cmV0dXJuIGUrMjIrNzUqKGU8MjYpLSgoMCE9dCk8PDUpfWZ1bmN0aW9uIEQoZSx0LG4pe3ZhciByPTA7Zm9yKGU9bj9BKGUvdik6ZT4+MSxlKz1BKGUvdCk7ZT53Kmc+PjE7cis9ZillPUEoZS93KTtyZXR1cm4gQShyKyh3KzEpKmUvKGUrbSkpfWZ1bmN0aW9uIHgoZSl7dmFyIHQsbixyLG8saSxhLHMsYyx1LGwscCxtPVtdLHY9ZS5sZW5ndGgsUz0wLEM9YixUPXk7Zm9yKChuPWUubGFzdEluZGV4T2YoRSkpPDAmJihuPTApLHI9MDtyPG47KytyKWUuY2hhckNvZGVBdChyKT49MTI4JiZSKCJub3QtYmFzaWMiKSxtLnB1c2goZS5jaGFyQ29kZUF0KHIpKTtmb3Iobz1uPjA/bisxOjA7bzx2Oyl7Zm9yKGk9UyxhPTEscz1mO28+PXYmJlIoImludmFsaWQtaW5wdXQiKSwoKGM9KHA9ZS5jaGFyQ29kZUF0KG8rKykpLTQ4PDEwP3AtMjI6cC02NTwyNj9wLTY1OnAtOTc8MjY/cC05NzpmKT49Znx8Yz5BKChkLVMpL2EpKSYmUigib3ZlcmZsb3ciKSxTKz1jKmEsIShjPCh1PXM8PVQ/aDpzPj1UK2c/ZzpzLVQpKTtzKz1mKWE+QShkLyhsPWYtdSkpJiZSKCJvdmVyZmxvdyIpLGEqPWw7VD1EKFMtaSx0PW0ubGVuZ3RoKzEsMD09aSksQShTL3QpPmQtQyYmUigib3ZlcmZsb3ciKSxDKz1BKFMvdCksUyU9dCxtLnNwbGljZShTKyssMCxDKX1yZXR1cm4gTihtKX1mdW5jdGlvbiBNKGUpe3ZhciB0LG4scixvLGksYSxzLGMsdSxsLHAsbSx2LFMsQyxUPVtdO2ZvcihtPShlPWsoZSkpLmxlbmd0aCx0PWIsbj0wLGk9eSxhPTA7YTxtOysrYSkocD1lW2FdKTwxMjgmJlQucHVzaChfKHApKTtmb3Iocj1vPVQubGVuZ3RoLG8mJlQucHVzaChFKTtyPG07KXtmb3Iocz1kLGE9MDthPG07KythKShwPWVbYV0pPj10JiZwPHMmJihzPXApO2ZvcihzLXQ+QSgoZC1uKS8odj1yKzEpKSYmUigib3ZlcmZsb3ciKSxuKz0ocy10KSp2LHQ9cyxhPTA7YTxtOysrYSlpZigocD1lW2FdKTx0JiYrK24+ZCYmUigib3ZlcmZsb3ciKSxwPT10KXtmb3IoYz1uLHU9ZjshKGM8KGw9dTw9aT9oOnU+PWkrZz9nOnUtaSkpO3UrPWYpQz1jLWwsUz1mLWwsVC5wdXNoKF8oUChsK0MlUywwKSkpLGM9QShDL1MpO1QucHVzaChfKFAoYywwKSkpLGk9RChuLHYscj09byksbj0wLCsrcn0rK24sKyt0fXJldHVybiBULmpvaW4oIiIpfWlmKGw9e3ZlcnNpb246IjEuNC4xIix1Y3MyOntkZWNvZGU6ayxlbmNvZGU6Tn0sZGVjb2RlOngsZW5jb2RlOk0sdG9BU0NJSTpmdW5jdGlvbihlKXtyZXR1cm4gTyhlLChmdW5jdGlvbihlKXtyZXR1cm4gQy50ZXN0KGUpPyJ4bi0tIitNKGUpOmV9KSl9LHRvVW5pY29kZTpmdW5jdGlvbihlKXtyZXR1cm4gTyhlLChmdW5jdGlvbihlKXtyZXR1cm4gUy50ZXN0KGUpP3goZS5zbGljZSg0KS50b0xvd2VyQ2FzZSgpKTplfSkpfX0sIm9iamVjdCI9PW8obi5hbWRPKSYmbi5hbWRPKXZvaWQgMD09PShyPWZ1bmN0aW9uKCl7cmV0dXJuIGx9LmNhbGwoaSxuLGksdCkpfHwodC5leHBvcnRzPXIpO2Vsc2UgaWYocyYmYylpZih0LmV4cG9ydHM9PXMpYy5leHBvcnRzPWw7ZWxzZSBmb3IocCBpbiBsKWwuaGFzT3duUHJvcGVydHkocCkmJihzW3BdPWxbcF0pO2Vsc2UgYS5wdW55Y29kZT1sfSh0aGlzKX0pLmNhbGwodGhpcyl9KS5jYWxsKHRoaXMsdm9pZCAwIT09bi5nP24uZzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGY/c2VsZjoidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6e30pfSx7fV0sOTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX10LmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4saSl7dD10fHwiJiIsbj1ufHwiPSI7dmFyIGE9e307aWYoInN0cmluZyIhPXR5cGVvZiBlfHwwPT09ZS5sZW5ndGgpcmV0dXJuIGE7dmFyIHM9L1wrL2c7ZT1lLnNwbGl0KHQpO3ZhciBjPTFlMztpJiYibnVtYmVyIj09dHlwZW9mIGkubWF4S2V5cyYmKGM9aS5tYXhLZXlzKTt2YXIgdT1lLmxlbmd0aDtjPjAmJnU+YyYmKHU9Yyk7Zm9yKHZhciBsPTA7bDx1OysrbCl7dmFyIHAsZCxmLGgsZz1lW2xdLnJlcGxhY2UocywiJTIwIiksbT1nLmluZGV4T2Yobik7bT49MD8ocD1nLnN1YnN0cigwLG0pLGQ9Zy5zdWJzdHIobSsxKSk6KHA9ZyxkPSIiKSxmPWRlY29kZVVSSUNvbXBvbmVudChwKSxoPWRlY29kZVVSSUNvbXBvbmVudChkKSxyKGEsZik/byhhW2ZdKT9hW2ZdLnB1c2goaCk6YVtmXT1bYVtmXSxoXTphW2ZdPWh9cmV0dXJuIGF9O3ZhciBvPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9fSx7fV0sOTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSl7c3dpdGNoKG8oZSkpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gZTtjYXNlImJvb2xlYW4iOnJldHVybiBlPyJ0cnVlIjoiZmFsc2UiO2Nhc2UibnVtYmVyIjpyZXR1cm4gaXNGaW5pdGUoZSk/ZToiIjtkZWZhdWx0OnJldHVybiIifX07dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLGMpe3JldHVybiB0PXR8fCImIixuPW58fCI9IixudWxsPT09ZSYmKGU9dm9pZCAwKSwib2JqZWN0Ij09PW8oZSk/YShzKGUpLChmdW5jdGlvbihvKXt2YXIgcz1lbmNvZGVVUklDb21wb25lbnQocihvKSkrbjtyZXR1cm4gaShlW29dKT9hKGVbb10sKGZ1bmN0aW9uKGUpe3JldHVybiBzK2VuY29kZVVSSUNvbXBvbmVudChyKGUpKX0pKS5qb2luKHQpOnMrZW5jb2RlVVJJQ29tcG9uZW50KHIoZVtvXSkpfSkpLmpvaW4odCk6Yz9lbmNvZGVVUklDb21wb25lbnQocihjKSkrbitlbmNvZGVVUklDb21wb25lbnQocihlKSk6IiJ9O3ZhciBpPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9O2Z1bmN0aW9uIGEoZSx0KXtpZihlLm1hcClyZXR1cm4gZS5tYXAodCk7Zm9yKHZhciBuPVtdLHI9MDtyPGUubGVuZ3RoO3IrKyluLnB1c2godChlW3JdLHIpKTtyZXR1cm4gbn12YXIgcz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuIGluIGUpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbikmJnQucHVzaChuKTtyZXR1cm4gdH19LHt9XSw5NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLmRlY29kZT1uLnBhcnNlPWUoIi4vZGVjb2RlIiksbi5lbmNvZGU9bi5zdHJpbmdpZnk9ZSgiLi9lbmNvZGUiKX0seyIuL2RlY29kZSI6OTMsIi4vZW5jb2RlIjo5NH1dLDk2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsdCl9dC5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLG8pe3Q9dHx8IiYiLG49bnx8Ij0iO3ZhciBpPXt9O2lmKCJzdHJpbmciIT10eXBlb2YgZXx8MD09PWUubGVuZ3RoKXJldHVybiBpO3ZhciBhPS9cKy9nO2U9ZS5zcGxpdCh0KTt2YXIgcz0xZTM7byYmIm51bWJlciI9PXR5cGVvZiBvLm1heEtleXMmJihzPW8ubWF4S2V5cyk7dmFyIGM9ZS5sZW5ndGg7cz4wJiZjPnMmJihjPXMpO2Zvcih2YXIgdT0wO3U8YzsrK3Upe3ZhciBsLHAsZCxmLGg9ZVt1XS5yZXBsYWNlKGEsIiUyMCIpLGc9aC5pbmRleE9mKG4pO2c+PTA/KGw9aC5zdWJzdHIoMCxnKSxwPWguc3Vic3RyKGcrMSkpOihsPWgscD0iIiksZD1kZWNvZGVVUklDb21wb25lbnQobCksZj1kZWNvZGVVUklDb21wb25lbnQocCkscihpLGQpP0FycmF5LmlzQXJyYXkoaVtkXSk/aVtkXS5wdXNoKGYpOmlbZF09W2lbZF0sZl06aVtkXT1mfXJldHVybiBpfX0se31dLDk3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWZ1bmN0aW9uKGUpe3N3aXRjaChvKGUpKXtjYXNlInN0cmluZyI6cmV0dXJuIGU7Y2FzZSJib29sZWFuIjpyZXR1cm4gZT8idHJ1ZSI6ImZhbHNlIjtjYXNlIm51bWJlciI6cmV0dXJuIGlzRmluaXRlKGUpP2U6IiI7ZGVmYXVsdDpyZXR1cm4iIn19O3QuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixpKXtyZXR1cm4gdD10fHwiJiIsbj1ufHwiPSIsbnVsbD09PWUmJihlPXZvaWQgMCksIm9iamVjdCI9PT1vKGUpP09iamVjdC5rZXlzKGUpLm1hcCgoZnVuY3Rpb24obyl7dmFyIGk9ZW5jb2RlVVJJQ29tcG9uZW50KHIobykpK247cmV0dXJuIEFycmF5LmlzQXJyYXkoZVtvXSk/ZVtvXS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBpK2VuY29kZVVSSUNvbXBvbmVudChyKGUpKX0pKS5qb2luKHQpOmkrZW5jb2RlVVJJQ29tcG9uZW50KHIoZVtvXSkpfSkpLmpvaW4odCk6aT9lbmNvZGVVUklDb21wb25lbnQocihpKSkrbitlbmNvZGVVUklDb21wb25lbnQocihlKSk6IiJ9fSx7fV0sOTg6W2Z1bmN0aW9uKGUsdCxuKXthcmd1bWVudHNbNF1bOTVdWzBdLmFwcGx5KG4sYXJndW1lbnRzKX0seyIuL2RlY29kZSI6OTYsIi4vZW5jb2RlIjo5NyxkdXA6OTV9XSw5OTpbZnVuY3Rpb24oZSx0LG4peyhmdW5jdGlvbih0LHIpeyhmdW5jdGlvbigpe3ZhciBvPWUoInByb2Nlc3MvYnJvd3Nlci5qcyIpLm5leHRUaWNrLGk9RnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5LGE9QXJyYXkucHJvdG90eXBlLnNsaWNlLHM9e30sYz0wO2Z1bmN0aW9uIHUoZSx0KXt0aGlzLl9pZD1lLHRoaXMuX2NsZWFyRm49dH1uLnNldFRpbWVvdXQ9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHUoaS5jYWxsKHNldFRpbWVvdXQsd2luZG93LGFyZ3VtZW50cyksY2xlYXJUaW1lb3V0KX0sbi5zZXRJbnRlcnZhbD1mdW5jdGlvbigpe3JldHVybiBuZXcgdShpLmNhbGwoc2V0SW50ZXJ2YWwsd2luZG93LGFyZ3VtZW50cyksY2xlYXJJbnRlcnZhbCl9LG4uY2xlYXJUaW1lb3V0PW4uY2xlYXJJbnRlcnZhbD1mdW5jdGlvbihlKXtlLmNsb3NlKCl9LHUucHJvdG90eXBlLnVucmVmPXUucHJvdG90eXBlLnJlZj1mdW5jdGlvbigpe30sdS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLl9jbGVhckZuLmNhbGwod2luZG93LHRoaXMuX2lkKX0sbi5lbnJvbGw9ZnVuY3Rpb24oZSx0KXtjbGVhclRpbWVvdXQoZS5faWRsZVRpbWVvdXRJZCksZS5faWRsZVRpbWVvdXQ9dH0sbi51bmVucm9sbD1mdW5jdGlvbihlKXtjbGVhclRpbWVvdXQoZS5faWRsZVRpbWVvdXRJZCksZS5faWRsZVRpbWVvdXQ9LTF9LG4uX3VucmVmQWN0aXZlPW4uYWN0aXZlPWZ1bmN0aW9uKGUpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKTt2YXIgdD1lLl9pZGxlVGltZW91dDt0Pj0wJiYoZS5faWRsZVRpbWVvdXRJZD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2UuX29uVGltZW91dCYmZS5fb25UaW1lb3V0KCl9KSx0KSl9LG4uc2V0SW1tZWRpYXRlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZnVuY3Rpb24oZSl7dmFyIHQ9YysrLHI9IShhcmd1bWVudHMubGVuZ3RoPDIpJiZhLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBzW3RdPSEwLG8oKGZ1bmN0aW9uKCl7c1t0XSYmKHI/ZS5hcHBseShudWxsLHIpOmUuY2FsbChudWxsKSxuLmNsZWFySW1tZWRpYXRlKHQpKX0pKSx0fSxuLmNsZWFySW1tZWRpYXRlPSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6ZnVuY3Rpb24oZSl7ZGVsZXRlIHNbZV19fSkuY2FsbCh0aGlzKX0pLmNhbGwodGhpcyxlKCJ0aW1lcnMiKS5zZXRJbW1lZGlhdGUsZSgidGltZXJzIikuY2xlYXJJbW1lZGlhdGUpfSx7InByb2Nlc3MvYnJvd3Nlci5qcyI6OTEsdGltZXJzOjk5fV0sMTAwOltmdW5jdGlvbihlLHQsbil7dmFyIHI9ZSgicHVueWNvZGUiKTtmdW5jdGlvbiBpKCl7dGhpcy5wcm90b2NvbD1udWxsLHRoaXMuc2xhc2hlcz1udWxsLHRoaXMuYXV0aD1udWxsLHRoaXMuaG9zdD1udWxsLHRoaXMucG9ydD1udWxsLHRoaXMuaG9zdG5hbWU9bnVsbCx0aGlzLmhhc2g9bnVsbCx0aGlzLnNlYXJjaD1udWxsLHRoaXMucXVlcnk9bnVsbCx0aGlzLnBhdGhuYW1lPW51bGwsdGhpcy5wYXRoPW51bGwsdGhpcy5ocmVmPW51bGx9bi5wYXJzZT15LG4ucmVzb2x2ZT1mdW5jdGlvbihlLHQpe3JldHVybiB5KGUsITEsITApLnJlc29sdmUodCl9LG4ucmVzb2x2ZU9iamVjdD1mdW5jdGlvbihlLHQpe3JldHVybiBlP3koZSwhMSwhMCkucmVzb2x2ZU9iamVjdCh0KTp0fSxuLmZvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gYihlKSYmKGU9eShlKSksZSBpbnN0YW5jZW9mIGk/ZS5mb3JtYXQoKTppLnByb3RvdHlwZS5mb3JtYXQuY2FsbChlKX0sbi5Vcmw9aTt2YXIgYT0vXihbYS16MC05ListXSs6KS9pLHM9LzpbMC05XSokLyxjPVsieyIsIn0iLCJ8IiwiXFwiLCJeIiwiYCJdLmNvbmNhdChbIjwiLCI+IiwnIicsImAiLCIgIiwiXHIiLCJcbiIsIlx0Il0pLHU9WyInIl0uY29uY2F0KGMpLGw9WyIlIiwiLyIsIj8iLCI7IiwiIyJdLmNvbmNhdCh1KSxwPVsiLyIsIj8iLCIjIl0sZD0vXlthLXowLTlBLVpfLV17MCw2M30kLyxmPS9eKFthLXowLTlBLVpfLV17MCw2M30pKC4qKSQvLGg9e2phdmFzY3JpcHQ6ITAsImphdmFzY3JpcHQ6IjohMH0sZz17amF2YXNjcmlwdDohMCwiamF2YXNjcmlwdDoiOiEwfSxtPXtodHRwOiEwLGh0dHBzOiEwLGZ0cDohMCxnb3BoZXI6ITAsZmlsZTohMCwiaHR0cDoiOiEwLCJodHRwczoiOiEwLCJmdHA6IjohMCwiZ29waGVyOiI6ITAsImZpbGU6IjohMH0sdj1lKCJxdWVyeXN0cmluZyIpO2Z1bmN0aW9uIHkoZSx0LG4pe2lmKGUmJkUoZSkmJmUgaW5zdGFuY2VvZiBpKXJldHVybiBlO3ZhciByPW5ldyBpO3JldHVybiByLnBhcnNlKGUsdCxuKSxyfWZ1bmN0aW9uIGIoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfWZ1bmN0aW9uIEUoZSl7cmV0dXJuIm9iamVjdCI9PT1vKGUpJiZudWxsIT09ZX1mdW5jdGlvbiBTKGUpe3JldHVybiBudWxsPT09ZX1pLnByb3RvdHlwZS5wYXJzZT1mdW5jdGlvbihlLHQsbil7aWYoIWIoZSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiUGFyYW1ldGVyICd1cmwnIG11c3QgYmUgYSBzdHJpbmcsIG5vdCAiK28oZSkpO3ZhciBpPWU7aT1pLnRyaW0oKTt2YXIgcz1hLmV4ZWMoaSk7aWYocyl7dmFyIGM9KHM9c1swXSkudG9Mb3dlckNhc2UoKTt0aGlzLnByb3RvY29sPWMsaT1pLnN1YnN0cihzLmxlbmd0aCl9aWYobnx8c3x8aS5tYXRjaCgvXlwvXC9bXkBcL10rQFteQFwvXSsvKSl7dmFyIHk9Ii8vIj09PWkuc3Vic3RyKDAsMik7IXl8fHMmJmdbc118fChpPWkuc3Vic3RyKDIpLHRoaXMuc2xhc2hlcz0hMCl9aWYoIWdbc10mJih5fHxzJiYhbVtzXSkpe2Zvcih2YXIgRSxTLEM9LTEsVD0wO1Q8cC5sZW5ndGg7VCsrKS0xIT09KEk9aS5pbmRleE9mKHBbVF0pKSYmKC0xPT09Q3x8STxDKSYmKEM9SSk7Zm9yKC0xIT09KFM9LTE9PT1DP2kubGFzdEluZGV4T2YoIkAiKTppLmxhc3RJbmRleE9mKCJAIixDKSkmJihFPWkuc2xpY2UoMCxTKSxpPWkuc2xpY2UoUysxKSx0aGlzLmF1dGg9ZGVjb2RlVVJJQ29tcG9uZW50KEUpKSxDPS0xLFQ9MDtUPGwubGVuZ3RoO1QrKyl7dmFyIEk7LTEhPT0oST1pLmluZGV4T2YobFtUXSkpJiYoLTE9PT1DfHxJPEMpJiYoQz1JKX0tMT09PUMmJihDPWkubGVuZ3RoKSx0aGlzLmhvc3Q9aS5zbGljZSgwLEMpLGk9aS5zbGljZShDKSx0aGlzLnBhcnNlSG9zdCgpLHRoaXMuaG9zdG5hbWU9dGhpcy5ob3N0bmFtZXx8IiI7dmFyIHc9IlsiPT09dGhpcy5ob3N0bmFtZVswXSYmIl0iPT09dGhpcy5ob3N0bmFtZVt0aGlzLmhvc3RuYW1lLmxlbmd0aC0xXTtpZighdylmb3IodmFyIEE9dGhpcy5ob3N0bmFtZS5zcGxpdCgvXC4vKSxfPShUPTAsQS5sZW5ndGgpO1Q8XztUKyspe3ZhciBSPUFbVF07aWYoUiYmIVIubWF0Y2goZCkpe2Zvcih2YXIgTD0iIixPPTAsaz1SLmxlbmd0aDtPPGs7TysrKVIuY2hhckNvZGVBdChPKT4xMjc/TCs9IngiOkwrPVJbT107aWYoIUwubWF0Y2goZCkpe3ZhciBOPUEuc2xpY2UoMCxUKSxQPUEuc2xpY2UoVCsxKSxEPVIubWF0Y2goZik7RCYmKE4ucHVzaChEWzFdKSxQLnVuc2hpZnQoRFsyXSkpLFAubGVuZ3RoJiYoaT0iLyIrUC5qb2luKCIuIikraSksdGhpcy5ob3N0bmFtZT1OLmpvaW4oIi4iKTticmVha319fWlmKHRoaXMuaG9zdG5hbWUubGVuZ3RoPjI1NT90aGlzLmhvc3RuYW1lPSIiOnRoaXMuaG9zdG5hbWU9dGhpcy5ob3N0bmFtZS50b0xvd2VyQ2FzZSgpLCF3KXt2YXIgeD10aGlzLmhvc3RuYW1lLnNwbGl0KCIuIiksTT1bXTtmb3IoVD0wO1Q8eC5sZW5ndGg7KytUKXt2YXIgVT14W1RdO00ucHVzaChVLm1hdGNoKC9bXkEtWmEtejAtOV8tXS8pPyJ4bi0tIityLmVuY29kZShVKTpVKX10aGlzLmhvc3RuYW1lPU0uam9pbigiLiIpfXZhciBGPXRoaXMucG9ydD8iOiIrdGhpcy5wb3J0OiIiLGo9dGhpcy5ob3N0bmFtZXx8IiI7dGhpcy5ob3N0PWorRix0aGlzLmhyZWYrPXRoaXMuaG9zdCx3JiYodGhpcy5ob3N0bmFtZT10aGlzLmhvc3RuYW1lLnN1YnN0cigxLHRoaXMuaG9zdG5hbWUubGVuZ3RoLTIpLCIvIiE9PWlbMF0mJihpPSIvIitpKSl9aWYoIWhbY10pZm9yKFQ9MCxfPXUubGVuZ3RoO1Q8XztUKyspe3ZhciBxPXVbVF0sQj1lbmNvZGVVUklDb21wb25lbnQocSk7Qj09PXEmJihCPWVzY2FwZShxKSksaT1pLnNwbGl0KHEpLmpvaW4oQil9dmFyIEc9aS5pbmRleE9mKCIjIik7LTEhPT1HJiYodGhpcy5oYXNoPWkuc3Vic3RyKEcpLGk9aS5zbGljZSgwLEcpKTt2YXIgVj1pLmluZGV4T2YoIj8iKTtyZXR1cm4tMSE9PVY/KHRoaXMuc2VhcmNoPWkuc3Vic3RyKFYpLHRoaXMucXVlcnk9aS5zdWJzdHIoVisxKSx0JiYodGhpcy5xdWVyeT12LnBhcnNlKHRoaXMucXVlcnkpKSxpPWkuc2xpY2UoMCxWKSk6dCYmKHRoaXMuc2VhcmNoPSIiLHRoaXMucXVlcnk9e30pLGkmJih0aGlzLnBhdGhuYW1lPWkpLG1bY10mJnRoaXMuaG9zdG5hbWUmJiF0aGlzLnBhdGhuYW1lJiYodGhpcy5wYXRobmFtZT0iLyIpLCh0aGlzLnBhdGhuYW1lfHx0aGlzLnNlYXJjaCkmJihGPXRoaXMucGF0aG5hbWV8fCIiLFU9dGhpcy5zZWFyY2h8fCIiLHRoaXMucGF0aD1GK1UpLHRoaXMuaHJlZj10aGlzLmZvcm1hdCgpLHRoaXN9LGkucHJvdG90eXBlLmZvcm1hdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuYXV0aHx8IiI7ZSYmKGU9KGU9ZW5jb2RlVVJJQ29tcG9uZW50KGUpKS5yZXBsYWNlKC8lM0EvaSwiOiIpLGUrPSJAIik7dmFyIHQ9dGhpcy5wcm90b2NvbHx8IiIsbj10aGlzLnBhdGhuYW1lfHwiIixyPXRoaXMuaGFzaHx8IiIsbz0hMSxpPSIiO3RoaXMuaG9zdD9vPWUrdGhpcy5ob3N0OnRoaXMuaG9zdG5hbWUmJihvPWUrKC0xPT09dGhpcy5ob3N0bmFtZS5pbmRleE9mKCI6Iik/dGhpcy5ob3N0bmFtZToiWyIrdGhpcy5ob3N0bmFtZSsiXSIpLHRoaXMucG9ydCYmKG8rPSI6Iit0aGlzLnBvcnQpKSx0aGlzLnF1ZXJ5JiZFKHRoaXMucXVlcnkpJiZPYmplY3Qua2V5cyh0aGlzLnF1ZXJ5KS5sZW5ndGgmJihpPXYuc3RyaW5naWZ5KHRoaXMucXVlcnkpKTt2YXIgYT10aGlzLnNlYXJjaHx8aSYmIj8iK2l8fCIiO3JldHVybiB0JiYiOiIhPT10LnN1YnN0cigtMSkmJih0Kz0iOiIpLHRoaXMuc2xhc2hlc3x8KCF0fHxtW3RdKSYmITEhPT1vPyhvPSIvLyIrKG98fCIiKSxuJiYiLyIhPT1uLmNoYXJBdCgwKSYmKG49Ii8iK24pKTpvfHwobz0iIiksciYmIiMiIT09ci5jaGFyQXQoMCkmJihyPSIjIityKSxhJiYiPyIhPT1hLmNoYXJBdCgwKSYmKGE9Ij8iK2EpLHQrbysobj1uLnJlcGxhY2UoL1s/I10vZywoZnVuY3Rpb24oZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKX0pKSkrKGE9YS5yZXBsYWNlKCIjIiwiJTIzIikpK3J9LGkucHJvdG90eXBlLnJlc29sdmU9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucmVzb2x2ZU9iamVjdCh5KGUsITEsITApKS5mb3JtYXQoKX0saS5wcm90b3R5cGUucmVzb2x2ZU9iamVjdD1mdW5jdGlvbihlKXtpZihiKGUpKXt2YXIgdD1uZXcgaTt0LnBhcnNlKGUsITEsITApLGU9dH12YXIgbj1uZXcgaTtpZihPYmplY3Qua2V5cyh0aGlzKS5mb3JFYWNoKChmdW5jdGlvbihlKXtuW2VdPXRoaXNbZV19KSx0aGlzKSxuLmhhc2g9ZS5oYXNoLCIiPT09ZS5ocmVmKXJldHVybiBuLmhyZWY9bi5mb3JtYXQoKSxuO2lmKGUuc2xhc2hlcyYmIWUucHJvdG9jb2wpcmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpeyJwcm90b2NvbCIhPT10JiYoblt0XT1lW3RdKX0pKSxtW24ucHJvdG9jb2xdJiZuLmhvc3RuYW1lJiYhbi5wYXRobmFtZSYmKG4ucGF0aD1uLnBhdGhuYW1lPSIvIiksbi5ocmVmPW4uZm9ybWF0KCksbjtpZihlLnByb3RvY29sJiZlLnByb3RvY29sIT09bi5wcm90b2NvbCl7aWYoIW1bZS5wcm90b2NvbF0pcmV0dXJuIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe25bdF09ZVt0XX0pKSxuLmhyZWY9bi5mb3JtYXQoKSxuO2lmKG4ucHJvdG9jb2w9ZS5wcm90b2NvbCxlLmhvc3R8fGdbZS5wcm90b2NvbF0pbi5wYXRobmFtZT1lLnBhdGhuYW1lO2Vsc2V7Zm9yKHZhciByPShlLnBhdGhuYW1lfHwiIikuc3BsaXQoIi8iKTtyLmxlbmd0aCYmIShlLmhvc3Q9ci5zaGlmdCgpKTspO2UuaG9zdHx8KGUuaG9zdD0iIiksZS5ob3N0bmFtZXx8KGUuaG9zdG5hbWU9IiIpLCIiIT09clswXSYmci51bnNoaWZ0KCIiKSxyLmxlbmd0aDwyJiZyLnVuc2hpZnQoIiIpLG4ucGF0aG5hbWU9ci5qb2luKCIvIil9aWYobi5zZWFyY2g9ZS5zZWFyY2gsbi5xdWVyeT1lLnF1ZXJ5LG4uaG9zdD1lLmhvc3R8fCIiLG4uYXV0aD1lLmF1dGgsbi5ob3N0bmFtZT1lLmhvc3RuYW1lfHxlLmhvc3Qsbi5wb3J0PWUucG9ydCxuLnBhdGhuYW1lfHxuLnNlYXJjaCl7dmFyIG89bi5wYXRobmFtZXx8IiIsYT1uLnNlYXJjaHx8IiI7bi5wYXRoPW8rYX1yZXR1cm4gbi5zbGFzaGVzPW4uc2xhc2hlc3x8ZS5zbGFzaGVzLG4uaHJlZj1uLmZvcm1hdCgpLG59dmFyIHM9bi5wYXRobmFtZSYmIi8iPT09bi5wYXRobmFtZS5jaGFyQXQoMCksYz1lLmhvc3R8fGUucGF0aG5hbWUmJiIvIj09PWUucGF0aG5hbWUuY2hhckF0KDApLHU9Y3x8c3x8bi5ob3N0JiZlLnBhdGhuYW1lLGw9dSxwPW4ucGF0aG5hbWUmJm4ucGF0aG5hbWUuc3BsaXQoIi8iKXx8W10sZD0ocj1lLnBhdGhuYW1lJiZlLnBhdGhuYW1lLnNwbGl0KCIvIil8fFtdLG4ucHJvdG9jb2wmJiFtW24ucHJvdG9jb2xdKTtpZihkJiYobi5ob3N0bmFtZT0iIixuLnBvcnQ9bnVsbCxuLmhvc3QmJigiIj09PXBbMF0/cFswXT1uLmhvc3Q6cC51bnNoaWZ0KG4uaG9zdCkpLG4uaG9zdD0iIixlLnByb3RvY29sJiYoZS5ob3N0bmFtZT1udWxsLGUucG9ydD1udWxsLGUuaG9zdCYmKCIiPT09clswXT9yWzBdPWUuaG9zdDpyLnVuc2hpZnQoZS5ob3N0KSksZS5ob3N0PW51bGwpLHU9dSYmKCIiPT09clswXXx8IiI9PT1wWzBdKSksYyluLmhvc3Q9ZS5ob3N0fHwiIj09PWUuaG9zdD9lLmhvc3Q6bi5ob3N0LG4uaG9zdG5hbWU9ZS5ob3N0bmFtZXx8IiI9PT1lLmhvc3RuYW1lP2UuaG9zdG5hbWU6bi5ob3N0bmFtZSxuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnkscD1yO2Vsc2UgaWYoci5sZW5ndGgpcHx8KHA9W10pLHAucG9wKCkscD1wLmNvbmNhdChyKSxuLnNlYXJjaD1lLnNlYXJjaCxuLnF1ZXJ5PWUucXVlcnk7ZWxzZSBpZihudWxsIT1lLnNlYXJjaClyZXR1cm4gZCYmKG4uaG9zdG5hbWU9bi5ob3N0PXAuc2hpZnQoKSwoRT0hIShuLmhvc3QmJm4uaG9zdC5pbmRleE9mKCJAIik+MCkmJm4uaG9zdC5zcGxpdCgiQCIpKSYmKG4uYXV0aD1FLnNoaWZ0KCksbi5ob3N0PW4uaG9zdG5hbWU9RS5zaGlmdCgpKSksbi5zZWFyY2g9ZS5zZWFyY2gsbi5xdWVyeT1lLnF1ZXJ5LFMobi5wYXRobmFtZSkmJlMobi5zZWFyY2gpfHwobi5wYXRoPShuLnBhdGhuYW1lP24ucGF0aG5hbWU6IiIpKyhuLnNlYXJjaD9uLnNlYXJjaDoiIikpLG4uaHJlZj1uLmZvcm1hdCgpLG47aWYoIXAubGVuZ3RoKXJldHVybiBuLnBhdGhuYW1lPW51bGwsbi5zZWFyY2g/bi5wYXRoPSIvIituLnNlYXJjaDpuLnBhdGg9bnVsbCxuLmhyZWY9bi5mb3JtYXQoKSxuO2Zvcih2YXIgZj1wLnNsaWNlKC0xKVswXSxoPShuLmhvc3R8fGUuaG9zdCkmJigiLiI9PT1mfHwiLi4iPT09Zil8fCIiPT09Zix2PTAseT1wLmxlbmd0aDt5Pj0wO3ktLSkiLiI9PShmPXBbeV0pP3Auc3BsaWNlKHksMSk6Ii4uIj09PWY/KHAuc3BsaWNlKHksMSksdisrKTp2JiYocC5zcGxpY2UoeSwxKSx2LS0pO2lmKCF1JiYhbClmb3IoO3YtLTt2KXAudW5zaGlmdCgiLi4iKTshdXx8IiI9PT1wWzBdfHxwWzBdJiYiLyI9PT1wWzBdLmNoYXJBdCgwKXx8cC51bnNoaWZ0KCIiKSxoJiYiLyIhPT1wLmpvaW4oIi8iKS5zdWJzdHIoLTEpJiZwLnB1c2goIiIpO3ZhciBFLEM9IiI9PT1wWzBdfHxwWzBdJiYiLyI9PT1wWzBdLmNoYXJBdCgwKTtyZXR1cm4gZCYmKG4uaG9zdG5hbWU9bi5ob3N0PUM/IiI6cC5sZW5ndGg/cC5zaGlmdCgpOiIiLChFPSEhKG4uaG9zdCYmbi5ob3N0LmluZGV4T2YoIkAiKT4wKSYmbi5ob3N0LnNwbGl0KCJAIikpJiYobi5hdXRoPUUuc2hpZnQoKSxuLmhvc3Q9bi5ob3N0bmFtZT1FLnNoaWZ0KCkpKSwodT11fHxuLmhvc3QmJnAubGVuZ3RoKSYmIUMmJnAudW5zaGlmdCgiIikscC5sZW5ndGg/bi5wYXRobmFtZT1wLmpvaW4oIi8iKToobi5wYXRobmFtZT1udWxsLG4ucGF0aD1udWxsKSxTKG4ucGF0aG5hbWUpJiZTKG4uc2VhcmNoKXx8KG4ucGF0aD0obi5wYXRobmFtZT9uLnBhdGhuYW1lOiIiKSsobi5zZWFyY2g/bi5zZWFyY2g6IiIpKSxuLmF1dGg9ZS5hdXRofHxuLmF1dGgsbi5zbGFzaGVzPW4uc2xhc2hlc3x8ZS5zbGFzaGVzLG4uaHJlZj1uLmZvcm1hdCgpLG59LGkucHJvdG90eXBlLnBhcnNlSG9zdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuaG9zdCx0PXMuZXhlYyhlKTt0JiYoIjoiIT09KHQ9dFswXSkmJih0aGlzLnBvcnQ9dC5zdWJzdHIoMSkpLGU9ZS5zdWJzdHIoMCxlLmxlbmd0aC10Lmxlbmd0aCkpLGUmJih0aGlzLmhvc3RuYW1lPWUpfX0se3B1bnljb2RlOjkyLHF1ZXJ5c3RyaW5nOjk1fV0sMTAxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO2Zvcih2YXIgcj1bXSxvPTA7bzwyNTY7KytvKXJbb109KG8rMjU2KS50b1N0cmluZygxNikuc3Vic3RyKDEpO3ZhciBpPWZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8MCxvPXI7cmV0dXJuW29bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSwiLSIsb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV0sb1tlW24rK11dLG9bZVtuKytdXSxvW2VbbisrXV1dLmpvaW4oIiIpfTtuLmRlZmF1bHQ9aX0se31dLDEwMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInYxIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gci5kZWZhdWx0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJ2MyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG8uZGVmYXVsdH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobiwidjQiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBpLmRlZmF1bHR9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sInY1Iix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5kZWZhdWx0fX0pO3ZhciByPXMoZSgiLi92MS5qcyIpKSxvPXMoZSgiLi92My5qcyIpKSxpPXMoZSgiLi92NC5qcyIpKSxhPXMoZSgiLi92NS5qcyIpKTtmdW5jdGlvbiBzKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX19LHsiLi92MS5qcyI6MTA2LCIuL3YzLmpzIjoxMDcsIi4vdjQuanMiOjEwOSwiLi92NS5qcyI6MTEwfV0sMTAzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt2YXIgbj0oNjU1MzUmZSkrKDY1NTM1JnQpO3JldHVybihlPj4xNikrKHQ+PjE2KSsobj4+MTYpPDwxNnw2NTUzNSZufWZ1bmN0aW9uIG8oZSx0LG4sbyxpLGEpe3JldHVybiByKChzPXIocih0LGUpLHIobyxhKSkpPDwoYz1pKXxzPj4+MzItYyxuKTt2YXIgcyxjfWZ1bmN0aW9uIGkoZSx0LG4scixpLGEscyl7cmV0dXJuIG8odCZufH50JnIsZSx0LGksYSxzKX1mdW5jdGlvbiBhKGUsdCxuLHIsaSxhLHMpe3JldHVybiBvKHQmcnxuJn5yLGUsdCxpLGEscyl9ZnVuY3Rpb24gcyhlLHQsbixyLGksYSxzKXtyZXR1cm4gbyh0Xm5ecixlLHQsaSxhLHMpfWZ1bmN0aW9uIGMoZSx0LG4scixpLGEscyl7cmV0dXJuIG8obl4odHx+ciksZSx0LGksYSxzKX1PYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgdT1mdW5jdGlvbihlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpe3ZhciB0PXVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSk7ZT1uZXcgQXJyYXkodC5sZW5ndGgpO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKWVbbl09dC5jaGFyQ29kZUF0KG4pfXJldHVybiBmdW5jdGlvbihlKXt2YXIgdCxuLHIsbz1bXSxpPTMyKmUubGVuZ3RoLGE9IjAxMjM0NTY3ODlhYmNkZWYiO2Zvcih0PTA7dDxpO3QrPTgpbj1lW3Q+PjVdPj4+dCUzMiYyNTUscj1wYXJzZUludChhLmNoYXJBdChuPj4+NCYxNSkrYS5jaGFyQXQoMTUmbiksMTYpLG8ucHVzaChyKTtyZXR1cm4gb30oZnVuY3Rpb24oZSx0KXt2YXIgbixvLHUsbCxwO2VbdD4+NV18PTEyODw8dCUzMixlWzE0Kyh0KzY0Pj4+OTw8NCldPXQ7dmFyIGQ9MTczMjU4NDE5MyxmPS0yNzE3MzM4NzksaD0tMTczMjU4NDE5NCxnPTI3MTczMzg3ODtmb3Iobj0wO248ZS5sZW5ndGg7bis9MTYpbz1kLHU9ZixsPWgscD1nLGQ9aShkLGYsaCxnLGVbbl0sNywtNjgwODc2OTM2KSxnPWkoZyxkLGYsaCxlW24rMV0sMTIsLTM4OTU2NDU4NiksaD1pKGgsZyxkLGYsZVtuKzJdLDE3LDYwNjEwNTgxOSksZj1pKGYsaCxnLGQsZVtuKzNdLDIyLC0xMDQ0NTI1MzMwKSxkPWkoZCxmLGgsZyxlW24rNF0sNywtMTc2NDE4ODk3KSxnPWkoZyxkLGYsaCxlW24rNV0sMTIsMTIwMDA4MDQyNiksaD1pKGgsZyxkLGYsZVtuKzZdLDE3LC0xNDczMjMxMzQxKSxmPWkoZixoLGcsZCxlW24rN10sMjIsLTQ1NzA1OTgzKSxkPWkoZCxmLGgsZyxlW24rOF0sNywxNzcwMDM1NDE2KSxnPWkoZyxkLGYsaCxlW24rOV0sMTIsLTE5NTg0MTQ0MTcpLGg9aShoLGcsZCxmLGVbbisxMF0sMTcsLTQyMDYzKSxmPWkoZixoLGcsZCxlW24rMTFdLDIyLC0xOTkwNDA0MTYyKSxkPWkoZCxmLGgsZyxlW24rMTJdLDcsMTgwNDYwMzY4MiksZz1pKGcsZCxmLGgsZVtuKzEzXSwxMiwtNDAzNDExMDEpLGg9aShoLGcsZCxmLGVbbisxNF0sMTcsLTE1MDIwMDIyOTApLGQ9YShkLGY9aShmLGgsZyxkLGVbbisxNV0sMjIsMTIzNjUzNTMyOSksaCxnLGVbbisxXSw1LC0xNjU3OTY1MTApLGc9YShnLGQsZixoLGVbbis2XSw5LC0xMDY5NTAxNjMyKSxoPWEoaCxnLGQsZixlW24rMTFdLDE0LDY0MzcxNzcxMyksZj1hKGYsaCxnLGQsZVtuXSwyMCwtMzczODk3MzAyKSxkPWEoZCxmLGgsZyxlW24rNV0sNSwtNzAxNTU4NjkxKSxnPWEoZyxkLGYsaCxlW24rMTBdLDksMzgwMTYwODMpLGg9YShoLGcsZCxmLGVbbisxNV0sMTQsLTY2MDQ3ODMzNSksZj1hKGYsaCxnLGQsZVtuKzRdLDIwLC00MDU1Mzc4NDgpLGQ9YShkLGYsaCxnLGVbbis5XSw1LDU2ODQ0NjQzOCksZz1hKGcsZCxmLGgsZVtuKzE0XSw5LC0xMDE5ODAzNjkwKSxoPWEoaCxnLGQsZixlW24rM10sMTQsLTE4NzM2Mzk2MSksZj1hKGYsaCxnLGQsZVtuKzhdLDIwLDExNjM1MzE1MDEpLGQ9YShkLGYsaCxnLGVbbisxM10sNSwtMTQ0NDY4MTQ2NyksZz1hKGcsZCxmLGgsZVtuKzJdLDksLTUxNDAzNzg0KSxoPWEoaCxnLGQsZixlW24rN10sMTQsMTczNTMyODQ3MyksZD1zKGQsZj1hKGYsaCxnLGQsZVtuKzEyXSwyMCwtMTkyNjYwNzczNCksaCxnLGVbbis1XSw0LC0zNzg1NTgpLGc9cyhnLGQsZixoLGVbbis4XSwxMSwtMjAyMjU3NDQ2MyksaD1zKGgsZyxkLGYsZVtuKzExXSwxNiwxODM5MDMwNTYyKSxmPXMoZixoLGcsZCxlW24rMTRdLDIzLC0zNTMwOTU1NiksZD1zKGQsZixoLGcsZVtuKzFdLDQsLTE1MzA5OTIwNjApLGc9cyhnLGQsZixoLGVbbis0XSwxMSwxMjcyODkzMzUzKSxoPXMoaCxnLGQsZixlW24rN10sMTYsLTE1NTQ5NzYzMiksZj1zKGYsaCxnLGQsZVtuKzEwXSwyMywtMTA5NDczMDY0MCksZD1zKGQsZixoLGcsZVtuKzEzXSw0LDY4MTI3OTE3NCksZz1zKGcsZCxmLGgsZVtuXSwxMSwtMzU4NTM3MjIyKSxoPXMoaCxnLGQsZixlW24rM10sMTYsLTcyMjUyMTk3OSksZj1zKGYsaCxnLGQsZVtuKzZdLDIzLDc2MDI5MTg5KSxkPXMoZCxmLGgsZyxlW24rOV0sNCwtNjQwMzY0NDg3KSxnPXMoZyxkLGYsaCxlW24rMTJdLDExLC00MjE4MTU4MzUpLGg9cyhoLGcsZCxmLGVbbisxNV0sMTYsNTMwNzQyNTIwKSxkPWMoZCxmPXMoZixoLGcsZCxlW24rMl0sMjMsLTk5NTMzODY1MSksaCxnLGVbbl0sNiwtMTk4NjMwODQ0KSxnPWMoZyxkLGYsaCxlW24rN10sMTAsMTEyNjg5MTQxNSksaD1jKGgsZyxkLGYsZVtuKzE0XSwxNSwtMTQxNjM1NDkwNSksZj1jKGYsaCxnLGQsZVtuKzVdLDIxLC01NzQzNDA1NSksZD1jKGQsZixoLGcsZVtuKzEyXSw2LDE3MDA0ODU1NzEpLGc9YyhnLGQsZixoLGVbbiszXSwxMCwtMTg5NDk4NjYwNiksaD1jKGgsZyxkLGYsZVtuKzEwXSwxNSwtMTA1MTUyMyksZj1jKGYsaCxnLGQsZVtuKzFdLDIxLC0yMDU0OTIyNzk5KSxkPWMoZCxmLGgsZyxlW24rOF0sNiwxODczMzEzMzU5KSxnPWMoZyxkLGYsaCxlW24rMTVdLDEwLC0zMDYxMTc0NCksaD1jKGgsZyxkLGYsZVtuKzZdLDE1LC0xNTYwMTk4MzgwKSxmPWMoZixoLGcsZCxlW24rMTNdLDIxLDEzMDkxNTE2NDkpLGQ9YyhkLGYsaCxnLGVbbis0XSw2LC0xNDU1MjMwNzApLGc9YyhnLGQsZixoLGVbbisxMV0sMTAsLTExMjAyMTAzNzkpLGg9YyhoLGcsZCxmLGVbbisyXSwxNSw3MTg3ODcyNTkpLGY9YyhmLGgsZyxkLGVbbis5XSwyMSwtMzQzNDg1NTUxKSxkPXIoZCxvKSxmPXIoZix1KSxoPXIoaCxsKSxnPXIoZyxwKTtyZXR1cm5bZCxmLGgsZ119KGZ1bmN0aW9uKGUpe3ZhciB0LG49W107Zm9yKG5bKGUubGVuZ3RoPj4yKS0xXT12b2lkIDAsdD0wO3Q8bi5sZW5ndGg7dCs9MSluW3RdPTA7dmFyIHI9OCplLmxlbmd0aDtmb3IodD0wO3Q8cjt0Kz04KW5bdD4+NV18PSgyNTUmZVt0LzhdKTw8dCUzMjtyZXR1cm4gbn0oZSksOCplLmxlbmd0aCkpfTtuLmRlZmF1bHQ9dX0se31dLDEwNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PWZ1bmN0aW9uKCl7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKCkgbm90IHN1cHBvcnRlZC4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS91dWlkanMvdXVpZCNnZXRyYW5kb212YWx1ZXMtbm90LXN1cHBvcnRlZCIpO3JldHVybiByKG8pfTt2YXIgcj0idW5kZWZpbmVkIiE9dHlwZW9mIGNyeXB0byYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcyYmY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0byl8fCJ1bmRlZmluZWQiIT10eXBlb2YgbXNDcnlwdG8mJiJmdW5jdGlvbiI9PXR5cGVvZiBtc0NyeXB0by5nZXRSYW5kb21WYWx1ZXMmJm1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKSxvPW5ldyBVaW50OEFycmF5KDE2KX0se31dLDEwNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3N3aXRjaChlKXtjYXNlIDA6cmV0dXJuIHQmbl5+dCZyO2Nhc2UgMTpjYXNlIDM6cmV0dXJuIHRebl5yO2Nhc2UgMjpyZXR1cm4gdCZuXnQmcl5uJnJ9fWZ1bmN0aW9uIG8oZSx0KXtyZXR1cm4gZTw8dHxlPj4+MzItdH1PYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgaT1mdW5jdGlvbihlKXt2YXIgdD1bMTUxODUwMDI0OSwxODU5Nzc1MzkzLDI0MDA5NTk3MDgsMzM5NTQ2OTc4Ml0sbj1bMTczMjU4NDE5Myw0MDIzMjMzNDE3LDI1NjIzODMxMDIsMjcxNzMzODc4LDMyODUzNzc1MjBdO2lmKCJzdHJpbmciPT10eXBlb2YgZSl7dmFyIGk9dW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGUpKTtlPW5ldyBBcnJheShpLmxlbmd0aCk7Zm9yKHZhciBhPTA7YTxpLmxlbmd0aDthKyspZVthXT1pLmNoYXJDb2RlQXQoYSl9ZS5wdXNoKDEyOCk7dmFyIHM9ZS5sZW5ndGgvNCsyLGM9TWF0aC5jZWlsKHMvMTYpLHU9bmV3IEFycmF5KGMpO2ZvcihhPTA7YTxjO2ErKyl7dVthXT1uZXcgQXJyYXkoMTYpO2Zvcih2YXIgbD0wO2w8MTY7bCsrKXVbYV1bbF09ZVs2NCphKzQqbF08PDI0fGVbNjQqYSs0KmwrMV08PDE2fGVbNjQqYSs0KmwrMl08PDh8ZVs2NCphKzQqbCszXX1mb3IodVtjLTFdWzE0XT04KihlLmxlbmd0aC0xKS9NYXRoLnBvdygyLDMyKSx1W2MtMV1bMTRdPU1hdGguZmxvb3IodVtjLTFdWzE0XSksdVtjLTFdWzE1XT04KihlLmxlbmd0aC0xKSY0Mjk0OTY3Mjk1LGE9MDthPGM7YSsrKXtmb3IodmFyIHA9bmV3IEFycmF5KDgwKSxkPTA7ZDwxNjtkKyspcFtkXT11W2FdW2RdO2ZvcihkPTE2O2Q8ODA7ZCsrKXBbZF09byhwW2QtM11ecFtkLThdXnBbZC0xNF1ecFtkLTE2XSwxKTt2YXIgZj1uWzBdLGg9blsxXSxnPW5bMl0sbT1uWzNdLHY9bls0XTtmb3IoZD0wO2Q8ODA7ZCsrKXt2YXIgeT1NYXRoLmZsb29yKGQvMjApLGI9byhmLDUpK3IoeSxoLGcsbSkrdit0W3ldK3BbZF0+Pj4wO3Y9bSxtPWcsZz1vKGgsMzApPj4+MCxoPWYsZj1ifW5bMF09blswXStmPj4+MCxuWzFdPW5bMV0raD4+PjAsblsyXT1uWzJdK2c+Pj4wLG5bM109blszXSttPj4+MCxuWzRdPW5bNF0rdj4+PjB9cmV0dXJuW25bMF0+PjI0JjI1NSxuWzBdPj4xNiYyNTUsblswXT4+OCYyNTUsMjU1Jm5bMF0sblsxXT4+MjQmMjU1LG5bMV0+PjE2JjI1NSxuWzFdPj44JjI1NSwyNTUmblsxXSxuWzJdPj4yNCYyNTUsblsyXT4+MTYmMjU1LG5bMl0+PjgmMjU1LDI1NSZuWzJdLG5bM10+PjI0JjI1NSxuWzNdPj4xNiYyNTUsblszXT4+OCYyNTUsMjU1Jm5bM10sbls0XT4+MjQmMjU1LG5bNF0+PjE2JjI1NSxuWzRdPj44JjI1NSwyNTUmbls0XV19O24uZGVmYXVsdD1pfSx7fV0sMTA2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciByLG8saT1zKGUoIi4vcm5nLmpzIikpLGE9cyhlKCIuL2J5dGVzVG9VdWlkLmpzIikpO2Z1bmN0aW9uIHMoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lOntkZWZhdWx0OmV9fXZhciBjPTAsdT0wLGw9ZnVuY3Rpb24oZSx0LG4pe3ZhciBzPXQmJm58fDAsbD10fHxbXSxwPShlPWV8fHt9KS5ub2RlfHxyLGQ9dm9pZCAwIT09ZS5jbG9ja3NlcT9lLmNsb2Nrc2VxOm87aWYobnVsbD09cHx8bnVsbD09ZCl7dmFyIGY9ZS5yYW5kb218fChlLnJuZ3x8aS5kZWZhdWx0KSgpO251bGw9PXAmJihwPXI9WzF8ZlswXSxmWzFdLGZbMl0sZlszXSxmWzRdLGZbNV1dKSxudWxsPT1kJiYoZD1vPTE2MzgzJihmWzZdPDw4fGZbN10pKX12YXIgaD12b2lkIDAhPT1lLm1zZWNzP2UubXNlY3M6KG5ldyBEYXRlKS5nZXRUaW1lKCksZz12b2lkIDAhPT1lLm5zZWNzP2UubnNlY3M6dSsxLG09aC1jKyhnLXUpLzFlNDtpZihtPDAmJnZvaWQgMD09PWUuY2xvY2tzZXEmJihkPWQrMSYxNjM4MyksKG08MHx8aD5jKSYmdm9pZCAwPT09ZS5uc2VjcyYmKGc9MCksZz49MWU0KXRocm93IG5ldyBFcnJvcigidXVpZC52MSgpOiBDYW4ndCBjcmVhdGUgbW9yZSB0aGFuIDEwTSB1dWlkcy9zZWMiKTtjPWgsdT1nLG89ZDt2YXIgdj0oMWU0KigyNjg0MzU0NTUmKGgrPTEyMjE5MjkyOGU1KSkrZyklNDI5NDk2NzI5NjtsW3MrK109dj4+PjI0JjI1NSxsW3MrK109dj4+PjE2JjI1NSxsW3MrK109dj4+PjgmMjU1LGxbcysrXT0yNTUmdjt2YXIgeT1oLzQyOTQ5NjcyOTYqMWU0JjI2ODQzNTQ1NTtsW3MrK109eT4+PjgmMjU1LGxbcysrXT0yNTUmeSxsW3MrK109eT4+PjI0JjE1fDE2LGxbcysrXT15Pj4+MTYmMjU1LGxbcysrXT1kPj4+OHwxMjgsbFtzKytdPTI1NSZkO2Zvcih2YXIgYj0wO2I8NjsrK2IpbFtzK2JdPXBbYl07cmV0dXJuIHR8fCgwLGEuZGVmYXVsdCkobCl9O24uZGVmYXVsdD1sfSx7Ii4vYnl0ZXNUb1V1aWQuanMiOjEwMSwiLi9ybmcuanMiOjEwNH1dLDEwNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksbi5kZWZhdWx0PXZvaWQgMDt2YXIgcj1pKGUoIi4vdjM1LmpzIikpLG89aShlKCIuL21kNS5qcyIpKTtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX12YXIgYT0oMCxyLmRlZmF1bHQpKCJ2MyIsNDgsby5kZWZhdWx0KTtuLmRlZmF1bHQ9YX0seyIuL21kNS5qcyI6MTAzLCIuL3YzNS5qcyI6MTA4fV0sMTA4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWZ1bmN0aW9uKGUscixpLGEpe3ZhciBzPWkmJmF8fDA7aWYoInN0cmluZyI9PXR5cGVvZiBlJiYoZT1mdW5jdGlvbihlKXtlPXVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChlKSk7Zm9yKHZhciB0PW5ldyBBcnJheShlLmxlbmd0aCksbj0wO248ZS5sZW5ndGg7bisrKXRbbl09ZS5jaGFyQ29kZUF0KG4pO3JldHVybiB0fShlKSksInN0cmluZyI9PXR5cGVvZiByJiYocj1mdW5jdGlvbihlKXt2YXIgdD1bXTtyZXR1cm4gZS5yZXBsYWNlKC9bYS1mQS1GMC05XXsyfS9nLChmdW5jdGlvbihlKXt0LnB1c2gocGFyc2VJbnQoZSwxNikpfSkpLHR9KHIpKSwhQXJyYXkuaXNBcnJheShlKSl0aHJvdyBUeXBlRXJyb3IoInZhbHVlIG11c3QgYmUgYW4gYXJyYXkgb2YgYnl0ZXMiKTtpZighQXJyYXkuaXNBcnJheShyKXx8MTYhPT1yLmxlbmd0aCl0aHJvdyBUeXBlRXJyb3IoIm5hbWVzcGFjZSBtdXN0IGJlIHV1aWQgc3RyaW5nIG9yIGFuIEFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIik7dmFyIGM9bihyLmNvbmNhdChlKSk7aWYoY1s2XT0xNSZjWzZdfHQsY1s4XT02MyZjWzhdfDEyOCxpKWZvcih2YXIgdT0wO3U8MTY7Kyt1KWlbcyt1XT1jW3VdO3JldHVybiBpfHwoMCxvLmRlZmF1bHQpKGMpfTt0cnl7ci5uYW1lPWV9Y2F0Y2goZSl7fXJldHVybiByLkROUz1pLHIuVVJMPWEscn0sbi5VUkw9bi5ETlM9dm9pZCAwO3ZhciByLG89KHI9ZSgiLi9ieXRlc1RvVXVpZC5qcyIpKSYmci5fX2VzTW9kdWxlP3I6e2RlZmF1bHQ6cn0saT0iNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4IjtuLkROUz1pO3ZhciBhPSI2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgiO24uVVJMPWF9LHsiLi9ieXRlc1RvVXVpZC5qcyI6MTAxfV0sMTA5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciByPWkoZSgiLi9ybmcuanMiKSksbz1pKGUoIi4vYnl0ZXNUb1V1aWQuanMiKSk7ZnVuY3Rpb24gaShlKXtyZXR1cm4gZSYmZS5fX2VzTW9kdWxlP2U6e2RlZmF1bHQ6ZX19dmFyIGE9ZnVuY3Rpb24oZSx0LG4pe3ZhciBpPXQmJm58fDA7InN0cmluZyI9PXR5cGVvZiBlJiYodD0iYmluYXJ5Ij09PWU/bmV3IEFycmF5KDE2KTpudWxsLGU9bnVsbCk7dmFyIGE9KGU9ZXx8e30pLnJhbmRvbXx8KGUucm5nfHxyLmRlZmF1bHQpKCk7aWYoYVs2XT0xNSZhWzZdfDY0LGFbOF09NjMmYVs4XXwxMjgsdClmb3IodmFyIHM9MDtzPDE2Oysrcyl0W2krc109YVtzXTtyZXR1cm4gdHx8KDAsby5kZWZhdWx0KShhKX07bi5kZWZhdWx0PWF9LHsiLi9ieXRlc1RvVXVpZC5qcyI6MTAxLCIuL3JuZy5qcyI6MTA0fV0sMTEwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxuLmRlZmF1bHQ9dm9pZCAwO3ZhciByPWkoZSgiLi92MzUuanMiKSksbz1pKGUoIi4vc2hhMS5qcyIpKTtmdW5jdGlvbiBpKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGU/ZTp7ZGVmYXVsdDplfX12YXIgYT0oMCxyLmRlZmF1bHQpKCJ2NSIsODAsby5kZWZhdWx0KTtuLmRlZmF1bHQ9YX0seyIuL3NoYTEuanMiOjEwNSwiLi92MzUuanMiOjEwOH1dLDExMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkobiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9ZSgiLi91dGlscy9MUlUiKSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXt2b2lkIDA9PT1lJiYoZT0xZTMpLHRoaXMubWF4U2l6ZT1lLHRoaXMuY2FjaGU9bmV3IHIuTFJVQ2FjaGUoZSl9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwic2l6ZSIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNhY2hlLmxlbmd0aH0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5wdXQ9ZnVuY3Rpb24odCxuKXt2YXIgcj0ic3RyaW5nIiE9dHlwZW9mIHQ/ZS5nZXRLZXlTdHJpbmcodCk6dCxvPXRoaXMucG9wdWxhdGVWYWx1ZShuKTt0aGlzLmNhY2hlLnB1dChyLG8pfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIG49InN0cmluZyIhPXR5cGVvZiB0P2UuZ2V0S2V5U3RyaW5nKHQpOnQscj1EYXRlLm5vdygpLG89dGhpcy5jYWNoZS5nZXQobik7aWYobyl7Zm9yKHZhciBpPW8ubGVuZ3RoLTE7aT49MDtpLS0pb1tpXS5FeHBpcmU8ciYmby5zcGxpY2UoaSwxKTtpZigwPT09by5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy5jYWNoZS5yZW1vdmUobil9cmV0dXJuIG99LGUuZ2V0S2V5U3RyaW5nPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPU9iamVjdC5rZXlzKGUpLnNvcnQoKSxyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07dm9pZCAwIT09ZVtvXSYmdC5wdXNoKGVbb10pfXJldHVybiB0LmpvaW4oIiAiKX0sZS5wcm90b3R5cGUucG9wdWxhdGVWYWx1ZT1mdW5jdGlvbihlKXt2YXIgdD1EYXRlLm5vdygpO3JldHVybiBlLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJue0FkZHJlc3M6ZS5BZGRyZXNzfHwiIixFeHBpcmU6dCs2MCooZS5DYWNoZVBlcmlvZEluTWludXRlc3x8MSkqMWUzfX0pKX0sZS5wcm90b3R5cGUuZW1wdHk9ZnVuY3Rpb24oKXt0aGlzLmNhY2hlLmVtcHR5KCl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt2YXIgbj0ic3RyaW5nIiE9dHlwZW9mIHQ/ZS5nZXRLZXlTdHJpbmcodCk6dDt0aGlzLmNhY2hlLnJlbW92ZShuKX0sZX0oKTtuLkVuZHBvaW50Q2FjaGU9b30seyIuL3V0aWxzL0xSVSI6MTEyfV0sMTEyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1mdW5jdGlvbihlLHQpe3RoaXMua2V5PWUsdGhpcy52YWx1ZT10fSxvPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpZih0aGlzLm5vZGVNYXA9e30sdGhpcy5zaXplPTAsIm51bWJlciIhPXR5cGVvZiBlfHxlPDEpdGhyb3cgbmV3IEVycm9yKCJDYWNoZSBzaXplIGNhbiBvbmx5IGJlIHBvc2l0aXZlIG51bWJlciIpO3RoaXMuc2l6ZUxpbWl0PWV9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwibGVuZ3RoIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2l6ZX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5wcmVwZW5kVG9MaXN0PWZ1bmN0aW9uKGUpe3RoaXMuaGVhZGVyTm9kZT8odGhpcy5oZWFkZXJOb2RlLnByZXY9ZSxlLm5leHQ9dGhpcy5oZWFkZXJOb2RlKTp0aGlzLnRhaWxOb2RlPWUsdGhpcy5oZWFkZXJOb2RlPWUsdGhpcy5zaXplKyt9LGUucHJvdG90eXBlLnJlbW92ZUZyb21UYWlsPWZ1bmN0aW9uKCl7aWYodGhpcy50YWlsTm9kZSl7dmFyIGU9dGhpcy50YWlsTm9kZSx0PWUucHJldjtyZXR1cm4gdCYmKHQubmV4dD12b2lkIDApLGUucHJldj12b2lkIDAsdGhpcy50YWlsTm9kZT10LHRoaXMuc2l6ZS0tLGV9fSxlLnByb3RvdHlwZS5kZXRhY2hGcm9tTGlzdD1mdW5jdGlvbihlKXt0aGlzLmhlYWRlck5vZGU9PT1lJiYodGhpcy5oZWFkZXJOb2RlPWUubmV4dCksdGhpcy50YWlsTm9kZT09PWUmJih0aGlzLnRhaWxOb2RlPWUucHJldiksZS5wcmV2JiYoZS5wcmV2Lm5leHQ9ZS5uZXh0KSxlLm5leHQmJihlLm5leHQucHJldj1lLnByZXYpLGUubmV4dD12b2lkIDAsZS5wcmV2PXZvaWQgMCx0aGlzLnNpemUtLX0sZS5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGUpe2lmKHRoaXMubm9kZU1hcFtlXSl7dmFyIHQ9dGhpcy5ub2RlTWFwW2VdO3JldHVybiB0aGlzLmRldGFjaEZyb21MaXN0KHQpLHRoaXMucHJlcGVuZFRvTGlzdCh0KSx0LnZhbHVlfX0sZS5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKGUpe2lmKHRoaXMubm9kZU1hcFtlXSl7dmFyIHQ9dGhpcy5ub2RlTWFwW2VdO3RoaXMuZGV0YWNoRnJvbUxpc3QodCksZGVsZXRlIHRoaXMubm9kZU1hcFtlXX19LGUucHJvdG90eXBlLnB1dD1mdW5jdGlvbihlLHQpe2lmKHRoaXMubm9kZU1hcFtlXSl0aGlzLnJlbW92ZShlKTtlbHNlIGlmKHRoaXMuc2l6ZT09PXRoaXMuc2l6ZUxpbWl0KXt2YXIgbj10aGlzLnJlbW92ZUZyb21UYWlsKCkua2V5O2RlbGV0ZSB0aGlzLm5vZGVNYXBbbl19dmFyIG89bmV3IHIoZSx0KTt0aGlzLm5vZGVNYXBbZV09byx0aGlzLnByZXBlbmRUb0xpc3Qobyl9LGUucHJvdG90eXBlLmVtcHR5PWZ1bmN0aW9uKCl7Zm9yKHZhciBlPU9iamVjdC5rZXlzKHRoaXMubm9kZU1hcCksdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdLHI9dGhpcy5ub2RlTWFwW25dO3RoaXMuZGV0YWNoRnJvbUxpc3QociksZGVsZXRlIHRoaXMubm9kZU1hcFtuXX19LGV9KCk7bi5MUlVDYWNoZT1vfSx7fV0sMTEzOltmdW5jdGlvbihlLHQsbil7ZSgiLi9icm93c2VyX2xvYWRlciIpO3ZhciByPWUoIi4vY29yZSIpOyJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93LkFXUz1yKSx2b2lkIDAhPT10JiYodC5leHBvcnRzPXIpLCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmKHNlbGYuQVdTPXIpLE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyLCJDb25uZWN0Iil8fChyLmFwaUxvYWRlci5zZXJ2aWNlcy5jb25uZWN0PXt9LHIuQ29ubmVjdD1yLlNlcnZpY2UuZGVmaW5lU2VydmljZSgiY29ubmVjdCIsWyIyMDE3LTAyLTE1Il0pKSxyLmFwaUxvYWRlci5zZXJ2aWNlcy5jb25uZWN0WyIyMDE3LTAyLTE1Il09ZSgiLi4vYXBpcy9jb25uZWN0LTIwMTctMDItMTUubWluIil9LHsiLi4vYXBpcy9jb25uZWN0LTIwMTctMDItMTUubWluIjozLCIuL2Jyb3dzZXJfbG9hZGVyIjoxNiwiLi9jb3JlIjoxOX1dfSx7fSxbMTEzXSl9LDQxNzooKT0+e2Z1bmN0aW9uIGUodCl7cmV0dXJuIGU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9LGUodCl9ZnVuY3Rpb24gdChlLHQpe3ZhciBuPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gbihlKXtmb3IodmFyIG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXt2YXIgbz1udWxsIT1hcmd1bWVudHNbbl0/YXJndW1lbnRzW25dOnt9O24lMj90KE9iamVjdChvKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cihlLHQsb1t0XSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvKSk6dChPYmplY3QobykpLmZvckVhY2goKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLHQpKX0pKX1yZXR1cm4gZX1mdW5jdGlvbiByKHQsbixyKXtyZXR1cm4obj1mdW5jdGlvbih0KXt2YXIgbj1mdW5jdGlvbih0LG4pe2lmKCJvYmplY3QiIT09ZSh0KXx8bnVsbD09PXQpcmV0dXJuIHQ7dmFyIHI9dFtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PXIpe3ZhciBvPXIuY2FsbCh0LG58fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPT1lKG8pKXJldHVybiBvO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKCJzdHJpbmciPT09bj9TdHJpbmc6TnVtYmVyKSh0KX0odCwic3RyaW5nIik7cmV0dXJuInN5bWJvbCI9PT1lKG4pP246U3RyaW5nKG4pfShuKSlpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4se3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W25dPXIsdH0hZnVuY3Rpb24oKXt2YXIgdD10aGlzfHxnbG9iYWxUaGlzLHI9dC5jb25uZWN0fHx7fTt0LmNvbm5lY3Q9cix0LmxpbHk9cixyLkNsaWVudE1ldGhvZHM9ci5tYWtlRW51bShbImdldEFnZW50U25hcHNob3QiLCJwdXRBZ2VudFN0YXRlIiwiZ2V0QWdlbnRTdGF0ZXMiLCJnZXREaWFsYWJsZUNvdW50cnlDb2RlcyIsImdldFJvdXRpbmdQcm9maWxlUXVldWVzIiwiZ2V0QWdlbnRQZXJtaXNzaW9ucyIsImdldEFnZW50Q29uZmlndXJhdGlvbiIsInVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbiIsImFjY2VwdENvbnRhY3QiLCJjcmVhdGVPdXRib3VuZENvbnRhY3QiLCJjcmVhdGVUYXNrQ29udGFjdCIsImNsZWFyQ29udGFjdCIsImNvbXBsZXRlQ29udGFjdCIsImRlc3Ryb3lDb250YWN0IiwicmVqZWN0Q29udGFjdCIsIm5vdGlmeUNvbnRhY3RJc3N1ZSIsInVwZGF0ZUNvbnRhY3RBdHRyaWJ1dGVzIiwiY3JlYXRlQWRkaXRpb25hbENvbm5lY3Rpb24iLCJkZXN0cm95Q29ubmVjdGlvbiIsImhvbGRDb25uZWN0aW9uIiwicmVzdW1lQ29ubmVjdGlvbiIsInRvZ2dsZUFjdGl2ZUNvbm5lY3Rpb25zIiwiY29uZmVyZW5jZUNvbm5lY3Rpb25zIiwic2VuZENsaWVudExvZ3MiLCJzZW5kRGlnaXRzIiwic2VuZFNvZnRwaG9uZUNhbGxSZXBvcnQiLCJzZW5kU29mdHBob25lQ2FsbE1ldHJpY3MiLCJnZXRFbmRwb2ludHMiLCJnZXROZXdBdXRoVG9rZW4iLCJjcmVhdGVUcmFuc3BvcnQiLCJtdXRlUGFydGljaXBhbnQiLCJ1bm11dGVQYXJ0aWNpcGFudCIsInVwZGF0ZU1vbml0b3JQYXJ0aWNpcGFudFN0YXRlIiwicGF1c2VDb250YWN0IiwicmVzdW1lQ29udGFjdCJdKSxyLkFnZW50QXBwQ2xpZW50TWV0aG9kcz17R0VUX0NPTlRBQ1Q6IkFnZW50QXBwU2VydmljZS5MY21zLmdldENvbnRhY3QiLERFTEVURV9TUEVBS0VSOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5kZWxldGVTcGVha2VyIixFTlJPTExfQllfU0VTU0lPTjoiQWdlbnRBcHBTZXJ2aWNlLlZvaWNlSWQuZW5yb2xsQnlTZXNzaW9uIixFVkFMVUFURV9TRVNTSU9OOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5ldmFsdWF0ZVNlc3Npb24iLERFU0NSSUJFX1NQRUFLRVI6IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLmRlc2NyaWJlU3BlYWtlciIsT1BUX09VVF9TUEVBS0VSOiJBZ2VudEFwcFNlcnZpY2UuVm9pY2VJZC5vcHRPdXRTcGVha2VyIixVUERBVEVfVk9JQ0VfSURfREFUQToiQWdlbnRBcHBTZXJ2aWNlLkxjbXMudXBkYXRlVm9pY2VJZERhdGEiLERFU0NSSUJFX1NFU1NJT046IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLmRlc2NyaWJlU2Vzc2lvbiIsVVBEQVRFX1NFU1NJT046IkFnZW50QXBwU2VydmljZS5Wb2ljZUlkLnVwZGF0ZVNlc3Npb24iLFNUQVJUX1ZPSUNFX0lEX1NFU1NJT046IkFnZW50QXBwU2VydmljZS5OYXNhLnN0YXJ0Vm9pY2VJZFNlc3Npb24iLExJU1RfSU5URUdSQVRJT05fQVNTT0NJQVRJT05TOiJBZ2VudEFwcFNlcnZpY2UuQWNzLmxpc3RJbnRlZ3JhdGlvbkFzc29jaWF0aW9ucyJ9LHIuTWFzdGVyTWV0aG9kcz1yLm1ha2VFbnVtKFsiYmVjb21lTWFzdGVyIiwiY2hlY2tNYXN0ZXIiXSksci5UYXNrVGVtcGxhdGVzQ2xpZW50TWV0aG9kcz1yLm1ha2VFbnVtKFsibGlzdFRhc2tUZW1wbGF0ZXMiLCJnZXRUYXNrVGVtcGxhdGUiLCJjcmVhdGVUZW1wbGF0ZWRUYXNrIiwidXBkYXRlQ29udGFjdCJdKSxyLkFwaVByb3h5Q2xpZW50TWV0aG9kcz17UVJfSU5URUdSQVRJT05fRVhJU1RTOiJxckludGVncmF0aW9uRXhpc3RzIixRUl9TRUFSQ0hfUVVJQ0tfUkVTUE9OU0VTOiJxclNlYXJjaFF1aWNrUmVzcG9uc2VzIixTVEFSVF9TQ1JFRU5fU0hBUklORzoic3RhcnRTY3JlZW5TaGFyaW5nIn0sci5SZXRyeWFibGVDbGllbnRNZXRob2RzTGlzdD1bci5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9TTkFQU0hPVCxyLkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX0NPTkZJR1VSQVRJT04sci5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9QRVJNSVNTSU9OUyxyLkNsaWVudE1ldGhvZHMuR0VUX0FHRU5UX1NUQVRFUyxyLkNsaWVudE1ldGhvZHMuR0VUX0RJQUxBQkxFX0NPVU5UUllfQ09ERVMsci5DbGllbnRNZXRob2RzLkdFVF9ST1VUSU5HX1BST0ZJTEVfUVVFVUVTXSxyLlJldHJ5YWJsZUVycm9ycz1yLm1ha2VFbnVtKFsidW5hdXRob3JpemVkIiwiYWNjZXNzRGVuaWVkIl0pLHIuUmV0cnlTdGF0dXM9ci5tYWtlRW51bShbInJldHJ5aW5nIiwiZXhoYXVzdGVkIiwibm9uZSJdKTt2YXIgbz1mdW5jdGlvbigpe307by5FTVBUWV9DQUxMQkFDS1M9e3N1Y2Nlc3M6ZnVuY3Rpb24oKXt9LGZhaWx1cmU6ZnVuY3Rpb24oKXt9fSxvLnByb3RvdHlwZS5jYWxsPWZ1bmN0aW9uKGUsdCxuKXtyLmFzc2VydE5vdE51bGwoZSwibWV0aG9kIik7dmFyIGk9dHx8e30sYT1ufHxvLkVNUFRZX0NBTExCQUNLUzt0aGlzLl9jYWxsSW1wbChlLGksYSl9LG8ucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLHQsbil7dGhyb3cgbmV3IHIuTm90SW1wbGVtZW50ZWRFcnJvcn07dmFyIGk9ZnVuY3Rpb24oKXtvLmNhbGwodGhpcyl9OyhpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9aSxpLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSx0LG4pe2lmKG4mJm4uZmFpbHVyZSl7dmFyIG89ci5zcHJpbnRmKCJObyBzdWNoIG1ldGhvZCBleGlzdHMgb24gTlVMTCBjbGllbnQ6ICVzIixlKTtuLmZhaWx1cmUobmV3IHIuVmFsdWVFcnJvcihvKSx7bWVzc2FnZTpvfSl9fTt2YXIgYT1mdW5jdGlvbihlLHQsbil7by5jYWxsKHRoaXMpLHRoaXMuY29uZHVpdD1lLHRoaXMucmVxdWVzdEV2ZW50PXQsdGhpcy5yZXNwb25zZUV2ZW50PW4sdGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwPXt9LHRoaXMuY29uZHVpdC5vblVwc3RyZWFtKG4sci5oaXRjaCh0aGlzLHRoaXMuX2hhbmRsZVJlc3BvbnNlKSl9OyhhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YSxhLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXIuRXZlbnRGYWN0b3J5LmNyZWF0ZVJlcXVlc3QodGhpcy5yZXF1ZXN0RXZlbnQsZSx0KTt0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXBbby5yZXF1ZXN0SWRdPW47dmFyIGk9W3IuQ2xpZW50TWV0aG9kcy5TRU5EX0NMSUVOVF9MT0dTLHIuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX01FVFJJQ1Msci5DbGllbnRNZXRob2RzLlNFTkRfU09GVFBIT05FX0NBTExfUkVQT1JUXTt0cnl7by5ldmVudCE9PXIuRXZlbnRUeXBlLkFQSV9SRVFVRVNUfHxpLmluY2x1ZGVzKG8ubWV0aG9kKXx8ci5nZXRMb2coKS50cmFjZSgiU2VuZGluZyBBUElfUkVRVUVTVCBldmVudCBmb3IgIi5jb25jYXQoby5tZXRob2QsIiB0byB1cHN0cmVhbSIpKS53aXRoT2JqZWN0KHttZXRob2Q6by5tZXRob2QscGFyYW1zOm8ucGFyYW1zLHN0YWNrOihuZXcgRXJyb3IpLnN0YWNrfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1jYXRjaChlKXtyLmdldExvZygpLmVycm9yKCJTdGFjayB0cmFjZSBMb2cgRmFpbGVkIikud2l0aE9iamVjdCh7ZXJyOmV9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXRoaXMuY29uZHVpdC5zZW5kVXBzdHJlYW0oby5ldmVudCxvKX0sYS5wcm90b3R5cGUuX2dldENhbGxiYWNrc0ZvclJlcXVlc3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdfHxudWxsO3JldHVybiBudWxsIT10JiZkZWxldGUgdGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdLHR9LGEucHJvdG90eXBlLl9oYW5kbGVSZXNwb25zZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRDYWxsYmFja3NGb3JSZXF1ZXN0KGUucmVxdWVzdElkKTtudWxsIT10JiYoZS5lcnImJnQuZmFpbHVyZT90LmZhaWx1cmUoZS5lcnIsZS5kYXRhKTp0LnN1Y2Nlc3MmJnQuc3VjY2VzcyhlLmRhdGEpKX07dmFyIHM9ZnVuY3Rpb24oZSl7YS5jYWxsKHRoaXMsZSxyLkV2ZW50VHlwZS5BUElfUkVRVUVTVCxyLkV2ZW50VHlwZS5BUElfUkVTUE9OU0UpfTsocy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShhLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXM7dmFyIGM9ZnVuY3Rpb24oKXtvLmNhbGwodGhpcyksci5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHIuRXZlbnRUeXBlLkFQSV9QUk9YWV9SRVNQT05TRSxyLmhpdGNoKHRoaXMsdGhpcy5faGFuZGxlUmVzcG9uc2UpKSx0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXA9e319OyhjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YyxjLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXIuRXZlbnRGYWN0b3J5LmNyZWF0ZVJlcXVlc3Qoci5FdmVudFR5cGUuQVBJX1BST1hZX1JFUVVFU1QsZSx0KTt0aGlzLl9yZXF1ZXN0SWRDYWxsYmFja3NNYXBbby5yZXF1ZXN0SWRdPW4sci5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcihyLkV2ZW50VHlwZS5BUElfUFJPWFlfUkVRVUVTVCxvKX0sYy5wcm90b3R5cGUuX2dldENhbGxiYWNrc0ZvclJlcXVlc3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdfHxudWxsO3JldHVybiBudWxsIT10JiZkZWxldGUgdGhpcy5fcmVxdWVzdElkQ2FsbGJhY2tzTWFwW2VdLHR9LGMucHJvdG90eXBlLl9oYW5kbGVSZXNwb25zZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9nZXRDYWxsYmFja3NGb3JSZXF1ZXN0KGUucmVxdWVzdElkKTtudWxsIT10JiYoZS5lcnImJnQuZmFpbHVyZT90LmZhaWx1cmUoZS5lcnIsZS5kYXRhKTp0LnN1Y2Nlc3MmJnQuc3VjY2VzcyhlLmRhdGEpKX07dmFyIHU9ZnVuY3Rpb24oZSl7YS5jYWxsKHRoaXMsZSxyLkV2ZW50VHlwZS5NQVNURVJfUkVRVUVTVCxyLkV2ZW50VHlwZS5NQVNURVJfUkVTUE9OU0UpfTsodS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShhLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXU7dmFyIGw9ZnVuY3Rpb24oZSx0LG4pe3IuYXNzZXJ0Tm90TnVsbChlLCJhdXRoQ29va2llTmFtZSIpLHIuYXNzZXJ0Tm90TnVsbCh0LCJhdXRoVG9rZW4iKSxyLmFzc2VydE5vdE51bGwobiwiZW5kcG9pbnQiKSxvLmNhbGwodGhpcyksdGhpcy5lbmRwb2ludFVybD1yLmdldFVybFdpdGhQcm90b2NvbChuKSx0aGlzLmF1dGhUb2tlbj10LHRoaXMuYXV0aENvb2tpZU5hbWU9ZX07KGwucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1sLGwucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLHQsbil7dmFyIG89dGhpcyxpPXt9O2lbby5hdXRoQ29va2llTmFtZV09by5hdXRoVG9rZW47dmFyIGE9e21ldGhvZDoicG9zdCIsYm9keTpKU09OLnN0cmluZ2lmeSh0fHx7fSksaGVhZGVyczp7QWNjZXB0OiJhcHBsaWNhdGlvbi9qc29uIiwiQ29udGVudC1UeXBlIjoiYXBwbGljYXRpb24vanNvbiIsIlgtQW16LXRhcmdldCI6ZSwiWC1BbXotQmVhcmVyIjpKU09OLnN0cmluZ2lmeShpKX19O3IuZmV0Y2goby5lbmRwb2ludFVybCxhKS50aGVuKChmdW5jdGlvbihlKXtuLnN1Y2Nlc3MoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3ZhciB0PWUuYm9keS5nZXRSZWFkZXIoKSxyPSIiLG89bmV3IFRleHREZWNvZGVyO3QucmVhZCgpLnRoZW4oKGZ1bmN0aW9uIGkoYSl7dmFyIHM9YS5kb25lLGM9YS52YWx1ZTtpZihzKXt2YXIgdT1KU09OLnBhcnNlKHIpO3JldHVybiB1LnN0YXR1cz1lLnN0YXR1cyx2b2lkIG4uZmFpbHVyZSh1KX1yZXR1cm4gcis9by5kZWNvZGUoYyksdC5yZWFkKCkudGhlbihpKX0pKX0pKX07dmFyIHA9ZnVuY3Rpb24oZSx0LG4pe3IuYXNzZXJ0Tm90TnVsbChlLCJhdXRoVG9rZW4iKSxyLmFzc2VydE5vdE51bGwodCwicmVnaW9uIiksby5jYWxsKHRoaXMpLEFXUy5jb25maWcuY3JlZGVudGlhbHM9bmV3IEFXUy5DcmVkZW50aWFscyh7fSksQVdTLmNvbmZpZy5yZWdpb249dCx0aGlzLmF1dGhUb2tlbj1lO3ZhciBpPXIuZ2V0QmFzZVVybCgpLGE9bnx8KGkuaW5jbHVkZXMoIi5hd3NhcHBzLmNvbSIpP2krIi9jb25uZWN0L2FwaSI6aSsiL2FwaSIpLHM9bmV3IEFXUy5FbmRwb2ludChhKTt0aGlzLmNsaWVudD1uZXcgQVdTLkNvbm5lY3Qoe2VuZHBvaW50OnN9KSx0aGlzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPTAsdGhpcy5hY2Nlc3NEZW5pZWRGYWlsQ291bnRlcj0wfTsocC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXAscC5wcm90b3R5cGUuX2NhbGxJbXBsPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz10aGlzLGk9ci5nZXRMb2coKTtpZihyLmNvbnRhaW5zKHRoaXMuY2xpZW50LGUpKXQ9dGhpcy5fdHJhbnNsYXRlUGFyYW1zKGUsdCksInBhdXNlQ29udGFjdCIhPT1lJiYicmVzdW1lQ29udGFjdCIhPT1lfHxkZWxldGUgdC5hdXRoZW50aWNhdGlvbix0JiZ0LnJlbGF0ZWRDb250YWN0SWQmJm51bGwhPT10LnJlbGF0ZWRDb250YWN0SWQmJnQucHJldmlvdXNDb250YWN0SWQmJmRlbGV0ZSB0LnByZXZpb3VzQ29udGFjdElkLGkudHJhY2UoIkFXU0NsaWVudDogLS1ceDNlIENhbGxpbmcgb3BlcmF0aW9uICclcyciLGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy5jbGllbnRbZV0odCkub24oImJ1aWxkIiwoZnVuY3Rpb24oZSl7ZS5odHRwUmVxdWVzdC5oZWFkZXJzWyJYLUFtei1CZWFyZXIiXT1vLmF1dGhUb2tlbn0pKS5zZW5kKChmdW5jdGlvbih0LGEpe3RyeXtpZih0KXQuY29kZT09PXIuQ1RJRXhjZXB0aW9ucy5VTkFVVEhPUklaRURfRVhDRVBUSU9OfHw0MDE9PT10LnN0YXR1c0NvZGU/by5fcmV0cnlNZXRob2QoZSxuLHQsYSxyLlJldHJ5YWJsZUVycm9ycy5VTkFVVEhPUklaRUQpOnQuY29kZT09PXIuQ1RJRXhjZXB0aW9ucy5BQ0NFU1NfREVOSUVEX0VYQ0VQVElPTnx8NDAzPT09dC5zdGF0dXNDb2RlP28uX3JldHJ5TWV0aG9kKGUsbix0LGEsci5SZXRyeWFibGVFcnJvcnMuQUNDRVNTX0RFTklFRCk6KG8udW5hdXRob3JpemVkRmFpbENvdW50ZXI9MCxvLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyPTAsbi5mYWlsdXJlKG8uX2Zvcm1hdENhbGxFcnJvcihvLl9hZGRTdGF0dXNDb2RlVG9FcnJvcih0KSksYSkpLGkudHJhY2UoIkFXU0NsaWVudDogPC0tIE9wZXJhdGlvbiAnJXMnIGZhaWxlZDogJXMiLGUsSlNPTi5zdHJpbmdpZnkodCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7ZWxzZXt2YXIgcz17fTtpLnRyYWNlKCJBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gJyVzJyBzdWNjZWVkZWQuIixlKS53aXRoT2JqZWN0KGEpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksby51bmF1dGhvcml6ZWRGYWlsQ291bnRlcj0wLG8uYWNjZXNzRGVuaWVkRmFpbENvdW50ZXI9MCx0aGlzLmh0dHBSZXNwb25zZSYmdGhpcy5odHRwUmVzcG9uc2UuaGFzT3duUHJvcGVydHkoImJvZHkiKSYmKHMuY29udGVudExlbmd0aD10aGlzLmh0dHBSZXNwb25zZS5ib2R5Lmxlbmd0aCksbi5zdWNjZXNzKGEscyl9fWNhdGNoKHQpe3IuZ2V0TG9nKCkuZXJyb3IoIkZhaWxlZCB0byBoYW5kbGUgQVdTIEFQSSByZXF1ZXN0IGZvciBtZXRob2QgJXMiLGUpLndpdGhFeGNlcHRpb24odCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KSk7ZWxzZXt2YXIgYT1yLnNwcmludGYoIk5vIHN1Y2ggbWV0aG9kIGV4aXN0cyBvbiBBV1MgY2xpZW50OiAlcyIsZSk7bi5mYWlsdXJlKG5ldyByLlZhbHVlRXJyb3IoYSkse21lc3NhZ2U6YX0pfX0scC5wcm90b3R5cGUuX2lzUmV0cnlhYmxlTWV0aG9kPWZ1bmN0aW9uKGUpe3JldHVybiByLlJldHJ5YWJsZUNsaWVudE1ldGhvZHNMaXN0LmluY2x1ZGVzKGUpfSxwLnByb3RvdHlwZS5fcmV0cnlNZXRob2Q9ZnVuY3Rpb24oZSx0LG8saSxhKXt2YXIgcz10aGlzLGM9ci5nZXRMb2coKSx1PWZ1bmN0aW9uKGUpe3JldHVybiBzLl9mb3JtYXRDYWxsRXJyb3Iocy5fYWRkU3RhdHVzQ29kZVRvRXJyb3IoZSkpfSxsPXttYXhDb3VudDpyLmNvcmUuTUFYX1VOQVVUSE9SSVpFRF9SRVRSWV9DT1VOVCxmYWlsQ291bnRlcjpzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyLGluY3JlYXNlQ291bnRlcjpmdW5jdGlvbigpe3JldHVybiBzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyKz0xfSxyZXNldENvdW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gcy51bmF1dGhvcml6ZWRGYWlsQ291bnRlcj0wfSxlcnJvck1lc3NhZ2U6InVuYXV0aG9yaXplZCIsZXhoYXVzdGVkUmV0cmllczpzLnVuYXV0aG9yaXplZEZhaWxDb3VudGVyPj1yLmNvcmUuTUFYX1VOQVVUSE9SSVpFRF9SRVRSWV9DT1VOVCxyZXRyeUNhbGxiYWNrOmZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuZmFpbHVyZSh1KGUpLG4pfSxkZWZhdWx0Q2FsbGJhY2s6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC5hdXRoRmFpbHVyZSh1KGUpLG4pfX07c3dpdGNoKGEpe2Nhc2Ugci5SZXRyeWFibGVFcnJvcnMuVU5BVVRIT1JJWkVEOmJyZWFrO2Nhc2Ugci5SZXRyeWFibGVFcnJvcnMuQUNDRVNTX0RFTklFRDpsPW4obih7fSxsKSx7fSx7bWF4Q291bnQ6ci5jb3JlLk1BWF9BQ0NFU1NfREVOSUVEX1JFVFJZX0NPVU5ULGZhaWxDb3VudGVyOnMuYWNjZXNzRGVuaWVkRmFpbENvdW50ZXIsaW5jcmVhc2VDb3VudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHMuYWNjZXNzRGVuaWVkRmFpbENvdW50ZXIrPTF9LHJlc2V0Q291bnRlcjpmdW5jdGlvbigpe3JldHVybiBzLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyPTB9LGVycm9yTWVzc2FnZToiYWNjZXNzIGRlbmllZCIsZXhoYXVzdGVkUmV0cmllczpzLmFjY2Vzc0RlbmllZEZhaWxDb3VudGVyPj1yLmNvcmUuTUFYX0FDQ0VTU19ERU5JRURfUkVUUllfQ09VTlQsZGVmYXVsdENhbGxiYWNrOmZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuYWNjZXNzRGVuaWVkKHUoZSksbil9fSl9dmFyIHA9bihuKHt9LG8pLHt9LHtyZXRyeVN0YXR1czpyLlJldHJ5U3RhdHVzLk5PTkV9KTtpZihzLl9pc1JldHJ5YWJsZU1ldGhvZChlKSl7aWYoIWwuZXhoYXVzdGVkUmV0cmllcylyZXR1cm4gYy50cmFjZSgiQVdTQ2xpZW50OiA8LS0gT3BlcmF0aW9uICIuY29uY2F0KGUsIiBmYWlsZWQgd2l0aCAiKS5jb25jYXQobC5lcnJvck1lc3NhZ2UsIiBlcnJvci4gUmV0cnlpbmcgY2FsbCBmb3IgYSAiKS5jb25jYXQobC5mYWlsQ291bnRlcisxLCIgdGltZSIpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGwuaW5jcmVhc2VDb3VudGVyKCkscD1uKG4oe30scCkse30se3JldHJ5U3RhdHVzOnIuUmV0cnlTdGF0dXMuUkVUUllJTkd9KSx2b2lkIGwucmV0cnlDYWxsYmFjayhwLGkpO2MudHJhY2UoIkFXU0NsaWVudDogPC0tIE9wZXJhdGlvbiAiLmNvbmNhdChlLCIgZXhoYXVzdGVkIG1heCAiKS5jb25jYXQobC5tYXhDb3VudCwiIG51bWJlciBvZiByZXRyaWVzIGZvciAiKS5jb25jYXQobC5lcnJvck1lc3NhZ2UsIiBlcnJvciIpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGwucmVzZXRDb3VudGVyKCkscD1uKG4oe30scCkse30se3JldHJ5U3RhdHVzOnIuUmV0cnlTdGF0dXMuRVhIQVVTVEVEfSl9ZWxzZSBjLnRyYWNlKCJBV1NDbGllbnQ6IDwtLSBPcGVyYXRpb24gIi5jb25jYXQoZSwiIGZhaWxlZDogIikuY29uY2F0KEpTT04uc3RyaW5naWZ5KG8pKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTtsLmRlZmF1bHRDYWxsYmFjayhwLGkpfSxwLnByb3RvdHlwZS5fZm9ybWF0Q2FsbEVycm9yPWZ1bmN0aW9uKHQpe3ZhciBvPW4oe3R5cGU6dC5jb2RlLG1lc3NhZ2U6dC5tZXNzYWdlLHN0YWNrOltdLHJldHJ5U3RhdHVzOnQucmV0cnlTdGF0dXN8fHIuUmV0cnlTdGF0dXMuTk9ORX0sdC5zdGF0dXNDb2RlJiZ7c3RhdHVzQ29kZTp0LnN0YXR1c0NvZGV9KTtpZih0LnN0YWNrKXRyeXtBcnJheS5pc0FycmF5KHQuc3RhY2spP28uc3RhY2s9dC5zdGFjazoib2JqZWN0Ij09PWUodC5zdGFjayk/by5zdGFjaz1bSlNPTi5zdHJpbmdpZnkodC5zdGFjayldOiJzdHJpbmciPT10eXBlb2YgdC5zdGFjayYmKG8uc3RhY2s9dC5zdGFjay5zcGxpdCgiXG4iKSl9ZmluYWxseXt9cmV0dXJuIG99LHAucHJvdG90eXBlLl9hZGRTdGF0dXNDb2RlVG9FcnJvcj1mdW5jdGlvbihlKXtpZihlLnN0YXR1c0NvZGUpcmV0dXJuIGU7dmFyIHQ9bih7fSxlKTtpZihlLmNvZGUpc3dpdGNoKHQuY29kZSl7Y2FzZSByLkNUSUV4Y2VwdGlvbnMuVU5BVVRIT1JJWkVEX0VYQ0VQVElPTjp0LnN0YXR1c0NvZGU9NDAxO2JyZWFrO2Nhc2Ugci5DVElFeGNlcHRpb25zLkFDQ0VTU19ERU5JRURfRVhDRVBUSU9OOnQuc3RhdHVzQ29kZT00MDN9ZWxzZSB0LnN0YXR1c0NvZGU9NDAwO3JldHVybiB0fSxwLnByb3RvdHlwZS5fcmVxdWlyZXNBdXRoZW50aWNhdGlvblBhcmFtPWZ1bmN0aW9uKGUpe3JldHVybiBlIT09ci5DbGllbnRNZXRob2RzLkNPTVBMRVRFX0NPTlRBQ1QmJmUhPT1yLkNsaWVudE1ldGhvZHMuQ0xFQVJfQ09OVEFDVCYmZSE9PXIuQ2xpZW50TWV0aG9kcy5SRUpFQ1RfQ09OVEFDVCYmZSE9PXIuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVEFTS19DT05UQUNUJiZlIT09ci5DbGllbnRNZXRob2RzLlVQREFURV9NT05JVE9SX1BBUlRJQ0lQQU5UX1NUQVRFfSxwLnByb3RvdHlwZS5fdHJhbnNsYXRlUGFyYW1zPWZ1bmN0aW9uKGUsdCl7c3dpdGNoKGUpe2Nhc2Ugci5DbGllbnRNZXRob2RzLlVQREFURV9BR0VOVF9DT05GSUdVUkFUSU9OOnQuY29uZmlndXJhdGlvbj10aGlzLl90cmFuc2xhdGVBZ2VudENvbmZpZ3VyYXRpb24odC5jb25maWd1cmF0aW9uKTticmVhaztjYXNlIHIuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX01FVFJJQ1M6dC5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzPXRoaXMuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3ModC5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzKTticmVhaztjYXNlIHIuQ2xpZW50TWV0aG9kcy5TRU5EX1NPRlRQSE9ORV9DQUxMX1JFUE9SVDp0LnJlcG9ydD10aGlzLl90cmFuc2xhdGVTb2Z0cGhvbmVDYWxsUmVwb3J0KHQucmVwb3J0KX1yZXR1cm4gdGhpcy5fcmVxdWlyZXNBdXRoZW50aWNhdGlvblBhcmFtKGUpJiYodC5hdXRoZW50aWNhdGlvbj17YXV0aFRva2VuOnRoaXMuYXV0aFRva2VufSksdH0scC5wcm90b3R5cGUuX3RyYW5zbGF0ZUFnZW50Q29uZmlndXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm57bmFtZTplLm5hbWUsc29mdHBob25lRW5hYmxlZDplLnNvZnRwaG9uZUVuYWJsZWQsc29mdHBob25lQXV0b0FjY2VwdDplLnNvZnRwaG9uZUF1dG9BY2NlcHQsZXh0ZW5zaW9uOmUuZXh0ZW5zaW9uLHJvdXRpbmdQcm9maWxlOnRoaXMuX3RyYW5zbGF0ZVJvdXRpbmdQcm9maWxlKGUucm91dGluZ1Byb2ZpbGUpLGFnZW50UHJlZmVyZW5jZXM6ZS5hZ2VudFByZWZlcmVuY2VzfX0scC5wcm90b3R5cGUuX3RyYW5zbGF0ZVJvdXRpbmdQcm9maWxlPWZ1bmN0aW9uKGUpe3JldHVybntuYW1lOmUubmFtZSxyb3V0aW5nUHJvZmlsZUFSTjplLnJvdXRpbmdQcm9maWxlQVJOLGRlZmF1bHRPdXRib3VuZFF1ZXVlOnRoaXMuX3RyYW5zbGF0ZVF1ZXVlKGUuZGVmYXVsdE91dGJvdW5kUXVldWUpfX0scC5wcm90b3R5cGUuX3RyYW5zbGF0ZVF1ZXVlPWZ1bmN0aW9uKGUpe3JldHVybntxdWV1ZUFSTjplLnF1ZXVlQVJOLG5hbWU6ZS5uYW1lfX0scC5wcm90b3R5cGUuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3M9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuZm9yRWFjaCgoZnVuY3Rpb24oZSl7InBhY2tldHNDb3VudCJpbiBlJiYoZS5wYWNrZXRDb3VudD1lLnBhY2tldHNDb3VudCxkZWxldGUgZS5wYWNrZXRzQ291bnQpfSkpLGV9LHAucHJvdG90eXBlLl90cmFuc2xhdGVTb2Z0cGhvbmVDYWxsUmVwb3J0PWZ1bmN0aW9uKGUpe3JldHVybiJoYW5kc2hha2luZ1RpbWVNaWxsaXMiaW4gZSYmKGUuaGFuZHNoYWtlVGltZU1pbGxpcz1lLmhhbmRzaGFraW5nVGltZU1pbGxpcyxkZWxldGUgZS5oYW5kc2hha2luZ1RpbWVNaWxsaXMpLCJwcmVUYWxraW5nVGltZU1pbGxpcyJpbiBlJiYoZS5wcmVUYWxrVGltZU1pbGxpcz1lLnByZVRhbGtpbmdUaW1lTWlsbGlzLGRlbGV0ZSBlLnByZVRhbGtpbmdUaW1lTWlsbGlzKSwiaGFuZHNoYWtpbmdGYWlsdXJlImluIGUmJihlLmhhbmRzaGFrZUZhaWx1cmU9ZS5oYW5kc2hha2luZ0ZhaWx1cmUsZGVsZXRlIGUuaGFuZHNoYWtpbmdGYWlsdXJlKSwidGFsa2luZ1RpbWVNaWxsaXMiaW4gZSYmKGUudGFsa1RpbWVNaWxsaXM9ZS50YWxraW5nVGltZU1pbGxpcyxkZWxldGUgZS50YWxraW5nVGltZU1pbGxpcyksZS5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzPXRoaXMuX3RyYW5zbGF0ZVNvZnRwaG9uZVN0cmVhbVN0YXRpc3RpY3MoZS5zb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzKSxlfTt2YXIgZD1mdW5jdGlvbihlKXtpZihyLmFzc2VydE5vdE51bGwoZSwiZW5kcG9pbnQiKSxvLmNhbGwodGhpcyksZS5pbmNsdWRlcygiL3Rhc2stdGVtcGxhdGVzIikpdGhpcy5lbmRwb2ludFVybD1yLmdldFVybFdpdGhQcm90b2NvbChlKTtlbHNle3ZhciB0PW5ldyBBV1MuRW5kcG9pbnQoZSksbj1lLmluY2x1ZGVzKCIuYXdzYXBwcy5jb20iKT8iL2Nvbm5lY3QiOiIiO3RoaXMuZW5kcG9pbnRVcmw9ci5nZXRVcmxXaXRoUHJvdG9jb2woIiIuY29uY2F0KHQuaG9zdCkuY29uY2F0KG4sIi90YXNrLXRlbXBsYXRlcy9hcGkvY2NwIikpfX07KGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1kLGQucHJvdG90eXBlLl9jYWxsSW1wbD1mdW5jdGlvbihlLHQsbil7dCYmdC5yZWxhdGVkQ29udGFjdElkJiZudWxsIT09dC5yZWxhdGVkQ29udGFjdElkJiZ0LnByZXZpb3VzQ29udGFjdElkJiZkZWxldGUgdC5wcmV2aW91c0NvbnRhY3RJZCxyLmFzc2VydE5vdE51bGwoZSwibWV0aG9kIiksci5hc3NlcnROb3ROdWxsKHQsInBhcmFtcyIpO3ZhciBvPXtjcmVkZW50aWFsczoiaW5jbHVkZSIsbWV0aG9kOiJHRVQiLGhlYWRlcnM6e0FjY2VwdDoiYXBwbGljYXRpb24vanNvbiIsIkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJ4LWNzcmYtdG9rZW4iOiJjc3JmIn19LGk9dC5pbnN0YW5jZUlkLGE9dGhpcy5lbmRwb2ludFVybCxzPXIuVGFza1RlbXBsYXRlc0NsaWVudE1ldGhvZHM7c3dpdGNoKGUpe2Nhc2Ugcy5MSVNUX1RBU0tfVEVNUExBVEVTOmlmKGErPSIvcHJveHkvaW5zdGFuY2UvIi5jb25jYXQoaSwiL3Rhc2svdGVtcGxhdGUiKSx0LnF1ZXJ5UGFyYW1zKXt2YXIgYz1uZXcgVVJMU2VhcmNoUGFyYW1zKHQucXVlcnlQYXJhbXMpLnRvU3RyaW5nKCk7YyYmKGErPSI/Ii5jb25jYXQoYykpfWJyZWFrO2Nhc2Ugcy5HRVRfVEFTS19URU1QTEFURTpyLmFzc2VydE5vdE51bGwodC50ZW1wbGF0ZVBhcmFtcywicGFyYW1zLnRlbXBsYXRlUGFyYW1zIik7dmFyIHU9ci5hc3NlcnROb3ROdWxsKHQudGVtcGxhdGVQYXJhbXMuaWQsInBhcmFtcy50ZW1wbGF0ZVBhcmFtcy5pZCIpLGw9dC50ZW1wbGF0ZVBhcmFtcy52ZXJzaW9uO2ErPSIvcHJveHkvaW5zdGFuY2UvIi5jb25jYXQoaSwiL3Rhc2svdGVtcGxhdGUvIikuY29uY2F0KHUpLGwmJihhKz0iP3NuYXBzaG90VmVyc2lvbj0iLmNvbmNhdChsKSk7YnJlYWs7Y2FzZSBzLkNSRUFURV9URU1QTEFURURfVEFTSzphKz0iLyIuY29uY2F0KGUpLG8uYm9keT1KU09OLnN0cmluZ2lmeSh0KSxvLm1ldGhvZD0iUFVUIjticmVhaztjYXNlIHMuVVBEQVRFX0NPTlRBQ1Q6YSs9Ii8iLmNvbmNhdChlKSxvLmJvZHk9SlNPTi5zdHJpbmdpZnkodCksby5tZXRob2Q9IlBPU1QifXIuZmV0Y2goYSxvKS50aGVuKChmdW5jdGlvbihlKXtuLnN1Y2Nlc3MoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe3ZhciB0PWUuYm9keS5nZXRSZWFkZXIoKSxyPSIiLG89bmV3IFRleHREZWNvZGVyO3QucmVhZCgpLnRoZW4oKGZ1bmN0aW9uIGkoYSl7dmFyIHM9YS5kb25lLGM9YS52YWx1ZTtpZihzKXt2YXIgdT1KU09OLnBhcnNlKHIpO3JldHVybiB1LnN0YXR1cz1lLnN0YXR1cyx2b2lkIG4uZmFpbHVyZSh1KX1yZXR1cm4gcis9by5kZWNvZGUoYyksdC5yZWFkKCkudGhlbihpKX0pKX0pKX0sci5DbGllbnRCYXNlPW8sci5OdWxsQ2xpZW50PWksci5VcHN0cmVhbUNvbmR1aXRDbGllbnQ9cyxyLkFwaVByb3h5Q2xpZW50PWMsci5VcHN0cmVhbUNvbmR1aXRNYXN0ZXJDbGllbnQ9dSxyLkFXU0NsaWVudD1wLHIuQWdlbnRBcHBDbGllbnQ9bCxyLlRhc2tUZW1wbGF0ZXNDbGllbnQ9ZH0oKX0sNTMxOigpPT57ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX0sZSh0KX1mdW5jdGlvbiB0KGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGV9KGUpfHxmdW5jdGlvbihlLHQpe3ZhciBuPW51bGw9PWU/bnVsbDoidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlWyJAQGl0ZXJhdG9yIl07aWYobnVsbCE9bil7dmFyIHIsbyxpLGEscz1bXSxjPSEwLHU9ITE7dHJ5e2lmKGk9KG49bi5jYWxsKGUpKS5uZXh0LDA9PT10KXtpZihPYmplY3QobikhPT1uKXJldHVybjtjPSExfWVsc2UgZm9yKDshKGM9KHI9aS5jYWxsKG4pKS5kb25lKSYmKHMucHVzaChyLnZhbHVlKSxzLmxlbmd0aCE9PXQpO2M9ITApO31jYXRjaChlKXt1PSEwLG89ZX1maW5hbGx5e3RyeXtpZighYyYmbnVsbCE9bi5yZXR1cm4mJihhPW4ucmV0dXJuKCksT2JqZWN0KGEpIT09YSkpcmV0dXJufWZpbmFsbHl7aWYodSl0aHJvdyBvfX1yZXR1cm4gc319KGUsdCl8fGkoZSx0KXx8ZnVuY3Rpb24oKXt0aHJvdyBuZXcgVHlwZUVycm9yKCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfSgpfWZ1bmN0aW9uIG4oKXsidXNlIHN0cmljdCI7bj1mdW5jdGlvbigpe3JldHVybiB0fTt2YXIgdD17fSxyPU9iamVjdC5wcm90b3R5cGUsbz1yLmhhc093blByb3BlcnR5LGk9T2JqZWN0LmRlZmluZVByb3BlcnR5fHxmdW5jdGlvbihlLHQsbil7ZVt0XT1uLnZhbHVlfSxhPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2w/U3ltYm9sOnt9LHM9YS5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiLGM9YS5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIix1PWEudG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiBsKGUsdCxuKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pLGVbdF19dHJ5e2woe30sIiIpfWNhdGNoKGUpe2w9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlW3RdPW59fWZ1bmN0aW9uIHAoZSx0LG4scil7dmFyIG89dCYmdC5wcm90b3R5cGUgaW5zdGFuY2VvZiBoP3Q6aCxhPU9iamVjdC5jcmVhdGUoby5wcm90b3R5cGUpLHM9bmV3IF8ocnx8W10pO3JldHVybiBpKGEsIl9pbnZva2UiLHt2YWx1ZTpUKGUsbixzKX0pLGF9ZnVuY3Rpb24gZChlLHQsbil7dHJ5e3JldHVybnt0eXBlOiJub3JtYWwiLGFyZzplLmNhbGwodCxuKX19Y2F0Y2goZSl7cmV0dXJue3R5cGU6InRocm93Iixhcmc6ZX19fXQud3JhcD1wO3ZhciBmPXt9O2Z1bmN0aW9uIGgoKXt9ZnVuY3Rpb24gZygpe31mdW5jdGlvbiBtKCl7fXZhciB2PXt9O2wodixzLChmdW5jdGlvbigpe3JldHVybiB0aGlzfSkpO3ZhciB5PU9iamVjdC5nZXRQcm90b3R5cGVPZixiPXkmJnkoeShSKFtdKSkpO2ImJmIhPT1yJiZvLmNhbGwoYixzKSYmKHY9Yik7dmFyIEU9bS5wcm90b3R5cGU9aC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2KTtmdW5jdGlvbiBTKGUpe1sibmV4dCIsInRocm93IiwicmV0dXJuIl0uZm9yRWFjaCgoZnVuY3Rpb24odCl7bChlLHQsKGZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9pbnZva2UodCxlKX0pKX0pKX1mdW5jdGlvbiBDKHQsbil7ZnVuY3Rpb24gcihpLGEscyxjKXt2YXIgdT1kKHRbaV0sdCxhKTtpZigidGhyb3ciIT09dS50eXBlKXt2YXIgbD11LmFyZyxwPWwudmFsdWU7cmV0dXJuIHAmJiJvYmplY3QiPT1lKHApJiZvLmNhbGwocCwiX19hd2FpdCIpP24ucmVzb2x2ZShwLl9fYXdhaXQpLnRoZW4oKGZ1bmN0aW9uKGUpe3IoIm5leHQiLGUscyxjKX0pLChmdW5jdGlvbihlKXtyKCJ0aHJvdyIsZSxzLGMpfSkpOm4ucmVzb2x2ZShwKS50aGVuKChmdW5jdGlvbihlKXtsLnZhbHVlPWUscyhsKX0pLChmdW5jdGlvbihlKXtyZXR1cm4gcigidGhyb3ciLGUscyxjKX0pKX1jKHUuYXJnKX12YXIgYTtpKHRoaXMsIl9pbnZva2UiLHt2YWx1ZTpmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG8oKXtyZXR1cm4gbmV3IG4oKGZ1bmN0aW9uKG4sbyl7cihlLHQsbixvKX0pKX1yZXR1cm4gYT1hP2EudGhlbihvLG8pOm8oKX19KX1mdW5jdGlvbiBUKGUsdCxuKXt2YXIgcj0ic3VzcGVuZGVkU3RhcnQiO3JldHVybiBmdW5jdGlvbihvLGkpe2lmKCJleGVjdXRpbmciPT09cil0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtpZigiY29tcGxldGVkIj09PXIpe2lmKCJ0aHJvdyI9PT1vKXRocm93IGk7cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX1mb3Iobi5tZXRob2Q9byxuLmFyZz1pOzspe3ZhciBhPW4uZGVsZWdhdGU7aWYoYSl7dmFyIHM9SShhLG4pO2lmKHMpe2lmKHM9PT1mKWNvbnRpbnVlO3JldHVybiBzfX1pZigibmV4dCI9PT1uLm1ldGhvZCluLnNlbnQ9bi5fc2VudD1uLmFyZztlbHNlIGlmKCJ0aHJvdyI9PT1uLm1ldGhvZCl7aWYoInN1c3BlbmRlZFN0YXJ0Ij09PXIpdGhyb3cgcj0iY29tcGxldGVkIixuLmFyZztuLmRpc3BhdGNoRXhjZXB0aW9uKG4uYXJnKX1lbHNlInJldHVybiI9PT1uLm1ldGhvZCYmbi5hYnJ1cHQoInJldHVybiIsbi5hcmcpO3I9ImV4ZWN1dGluZyI7dmFyIGM9ZChlLHQsbik7aWYoIm5vcm1hbCI9PT1jLnR5cGUpe2lmKHI9bi5kb25lPyJjb21wbGV0ZWQiOiJzdXNwZW5kZWRZaWVsZCIsYy5hcmc9PT1mKWNvbnRpbnVlO3JldHVybnt2YWx1ZTpjLmFyZyxkb25lOm4uZG9uZX19InRocm93Ij09PWMudHlwZSYmKHI9ImNvbXBsZXRlZCIsbi5tZXRob2Q9InRocm93IixuLmFyZz1jLmFyZyl9fX1mdW5jdGlvbiBJKGUsdCl7dmFyIG49dC5tZXRob2Qscj1lLml0ZXJhdG9yW25dO2lmKHZvaWQgMD09PXIpcmV0dXJuIHQuZGVsZWdhdGU9bnVsbCwidGhyb3ciPT09biYmZS5pdGVyYXRvci5yZXR1cm4mJih0Lm1ldGhvZD0icmV0dXJuIix0LmFyZz12b2lkIDAsSShlLHQpLCJ0aHJvdyI9PT10Lm1ldGhvZCl8fCJyZXR1cm4iIT09biYmKHQubWV0aG9kPSJ0aHJvdyIsdC5hcmc9bmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAnIituKyInIG1ldGhvZCIpKSxmO3ZhciBvPWQocixlLml0ZXJhdG9yLHQuYXJnKTtpZigidGhyb3ciPT09by50eXBlKXJldHVybiB0Lm1ldGhvZD0idGhyb3ciLHQuYXJnPW8uYXJnLHQuZGVsZWdhdGU9bnVsbCxmO3ZhciBpPW8uYXJnO3JldHVybiBpP2kuZG9uZT8odFtlLnJlc3VsdE5hbWVdPWkudmFsdWUsdC5uZXh0PWUubmV4dExvYywicmV0dXJuIiE9PXQubWV0aG9kJiYodC5tZXRob2Q9Im5leHQiLHQuYXJnPXZvaWQgMCksdC5kZWxlZ2F0ZT1udWxsLGYpOmk6KHQubWV0aG9kPSJ0aHJvdyIsdC5hcmc9bmV3IFR5cGVFcnJvcigiaXRlcmF0b3IgcmVzdWx0IGlzIG5vdCBhbiBvYmplY3QiKSx0LmRlbGVnYXRlPW51bGwsZil9ZnVuY3Rpb24gdyhlKXt2YXIgdD17dHJ5TG9jOmVbMF19OzEgaW4gZSYmKHQuY2F0Y2hMb2M9ZVsxXSksMiBpbiBlJiYodC5maW5hbGx5TG9jPWVbMl0sdC5hZnRlckxvYz1lWzNdKSx0aGlzLnRyeUVudHJpZXMucHVzaCh0KX1mdW5jdGlvbiBBKGUpe3ZhciB0PWUuY29tcGxldGlvbnx8e307dC50eXBlPSJub3JtYWwiLGRlbGV0ZSB0LmFyZyxlLmNvbXBsZXRpb249dH1mdW5jdGlvbiBfKGUpe3RoaXMudHJ5RW50cmllcz1be3RyeUxvYzoicm9vdCJ9XSxlLmZvckVhY2godyx0aGlzKSx0aGlzLnJlc2V0KCEwKX1mdW5jdGlvbiBSKGUpe2lmKGUpe3ZhciB0PWVbc107aWYodClyZXR1cm4gdC5jYWxsKGUpO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBlLm5leHQpcmV0dXJuIGU7aWYoIWlzTmFOKGUubGVuZ3RoKSl7dmFyIG49LTEscj1mdW5jdGlvbiB0KCl7Zm9yKDsrK248ZS5sZW5ndGg7KWlmKG8uY2FsbChlLG4pKXJldHVybiB0LnZhbHVlPWVbbl0sdC5kb25lPSExLHQ7cmV0dXJuIHQudmFsdWU9dm9pZCAwLHQuZG9uZT0hMCx0fTtyZXR1cm4gci5uZXh0PXJ9fXJldHVybntuZXh0Okx9fWZ1bmN0aW9uIEwoKXtyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fXJldHVybiBnLnByb3RvdHlwZT1tLGkoRSwiY29uc3RydWN0b3IiLHt2YWx1ZTptLGNvbmZpZ3VyYWJsZTohMH0pLGkobSwiY29uc3RydWN0b3IiLHt2YWx1ZTpnLGNvbmZpZ3VyYWJsZTohMH0pLGcuZGlzcGxheU5hbWU9bChtLHUsIkdlbmVyYXRvckZ1bmN0aW9uIiksdC5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKGUpe3ZhciB0PSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLmNvbnN0cnVjdG9yO3JldHVybiEhdCYmKHQ9PT1nfHwiR2VuZXJhdG9yRnVuY3Rpb24iPT09KHQuZGlzcGxheU5hbWV8fHQubmFtZSkpfSx0Lm1hcms9ZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoZSxtKTooZS5fX3Byb3RvX189bSxsKGUsdSwiR2VuZXJhdG9yRnVuY3Rpb24iKSksZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShFKSxlfSx0LmF3cmFwPWZ1bmN0aW9uKGUpe3JldHVybntfX2F3YWl0OmV9fSxTKEMucHJvdG90eXBlKSxsKEMucHJvdG90eXBlLGMsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSksdC5Bc3luY0l0ZXJhdG9yPUMsdC5hc3luYz1mdW5jdGlvbihlLG4scixvLGkpe3ZvaWQgMD09PWkmJihpPVByb21pc2UpO3ZhciBhPW5ldyBDKHAoZSxuLHIsbyksaSk7cmV0dXJuIHQuaXNHZW5lcmF0b3JGdW5jdGlvbihuKT9hOmEubmV4dCgpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBlLmRvbmU/ZS52YWx1ZTphLm5leHQoKX0pKX0sUyhFKSxsKEUsdSwiR2VuZXJhdG9yIiksbChFLHMsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSksbChFLCJ0b1N0cmluZyIsKGZ1bmN0aW9uKCl7cmV0dXJuIltvYmplY3QgR2VuZXJhdG9yXSJ9KSksdC5rZXlzPWZ1bmN0aW9uKGUpe3ZhciB0PU9iamVjdChlKSxuPVtdO2Zvcih2YXIgciBpbiB0KW4ucHVzaChyKTtyZXR1cm4gbi5yZXZlcnNlKCksZnVuY3Rpb24gZSgpe2Zvcig7bi5sZW5ndGg7KXt2YXIgcj1uLnBvcCgpO2lmKHIgaW4gdClyZXR1cm4gZS52YWx1ZT1yLGUuZG9uZT0hMSxlfXJldHVybiBlLmRvbmU9ITAsZX19LHQudmFsdWVzPVIsXy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOl8scmVzZXQ6ZnVuY3Rpb24oZSl7aWYodGhpcy5wcmV2PTAsdGhpcy5uZXh0PTAsdGhpcy5zZW50PXRoaXMuX3NlbnQ9dm9pZCAwLHRoaXMuZG9uZT0hMSx0aGlzLmRlbGVnYXRlPW51bGwsdGhpcy5tZXRob2Q9Im5leHQiLHRoaXMuYXJnPXZvaWQgMCx0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChBKSwhZSlmb3IodmFyIHQgaW4gdGhpcykidCI9PT10LmNoYXJBdCgwKSYmby5jYWxsKHRoaXMsdCkmJiFpc05hTigrdC5zbGljZSgxKSkmJih0aGlzW3RdPXZvaWQgMCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLmRvbmU9ITA7dmFyIGU9dGhpcy50cnlFbnRyaWVzWzBdLmNvbXBsZXRpb247aWYoInRocm93Ij09PWUudHlwZSl0aHJvdyBlLmFyZztyZXR1cm4gdGhpcy5ydmFsfSxkaXNwYXRjaEV4Y2VwdGlvbjpmdW5jdGlvbihlKXtpZih0aGlzLmRvbmUpdGhyb3cgZTt2YXIgdD10aGlzO2Z1bmN0aW9uIG4obixyKXtyZXR1cm4gYS50eXBlPSJ0aHJvdyIsYS5hcmc9ZSx0Lm5leHQ9bixyJiYodC5tZXRob2Q9Im5leHQiLHQuYXJnPXZvaWQgMCksISFyfWZvcih2YXIgcj10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7cj49MDstLXIpe3ZhciBpPXRoaXMudHJ5RW50cmllc1tyXSxhPWkuY29tcGxldGlvbjtpZigicm9vdCI9PT1pLnRyeUxvYylyZXR1cm4gbigiZW5kIik7aWYoaS50cnlMb2M8PXRoaXMucHJldil7dmFyIHM9by5jYWxsKGksImNhdGNoTG9jIiksYz1vLmNhbGwoaSwiZmluYWxseUxvYyIpO2lmKHMmJmMpe2lmKHRoaXMucHJldjxpLmNhdGNoTG9jKXJldHVybiBuKGkuY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxpLmZpbmFsbHlMb2MpcmV0dXJuIG4oaS5maW5hbGx5TG9jKX1lbHNlIGlmKHMpe2lmKHRoaXMucHJldjxpLmNhdGNoTG9jKXJldHVybiBuKGkuY2F0Y2hMb2MsITApfWVsc2V7aWYoIWMpdGhyb3cgbmV3IEVycm9yKCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseSIpO2lmKHRoaXMucHJldjxpLmZpbmFsbHlMb2MpcmV0dXJuIG4oaS5maW5hbGx5TG9jKX19fX0sYWJydXB0OmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtuPj0wOy0tbil7dmFyIHI9dGhpcy50cnlFbnRyaWVzW25dO2lmKHIudHJ5TG9jPD10aGlzLnByZXYmJm8uY2FsbChyLCJmaW5hbGx5TG9jIikmJnRoaXMucHJldjxyLmZpbmFsbHlMb2Mpe3ZhciBpPXI7YnJlYWt9fWkmJigiYnJlYWsiPT09ZXx8ImNvbnRpbnVlIj09PWUpJiZpLnRyeUxvYzw9dCYmdDw9aS5maW5hbGx5TG9jJiYoaT1udWxsKTt2YXIgYT1pP2kuY29tcGxldGlvbjp7fTtyZXR1cm4gYS50eXBlPWUsYS5hcmc9dCxpPyh0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5uZXh0PWkuZmluYWxseUxvYyxmKTp0aGlzLmNvbXBsZXRlKGEpfSxjb21wbGV0ZTpmdW5jdGlvbihlLHQpe2lmKCJ0aHJvdyI9PT1lLnR5cGUpdGhyb3cgZS5hcmc7cmV0dXJuImJyZWFrIj09PWUudHlwZXx8ImNvbnRpbnVlIj09PWUudHlwZT90aGlzLm5leHQ9ZS5hcmc6InJldHVybiI9PT1lLnR5cGU/KHRoaXMucnZhbD10aGlzLmFyZz1lLmFyZyx0aGlzLm1ldGhvZD0icmV0dXJuIix0aGlzLm5leHQ9ImVuZCIpOiJub3JtYWwiPT09ZS50eXBlJiZ0JiYodGhpcy5uZXh0PXQpLGZ9LGZpbmlzaDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO3Q+PTA7LS10KXt2YXIgbj10aGlzLnRyeUVudHJpZXNbdF07aWYobi5maW5hbGx5TG9jPT09ZSlyZXR1cm4gdGhpcy5jb21wbGV0ZShuLmNvbXBsZXRpb24sbi5hZnRlckxvYyksQShuKSxmfX0sY2F0Y2g6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTt0Pj0wOy0tdCl7dmFyIG49dGhpcy50cnlFbnRyaWVzW3RdO2lmKG4udHJ5TG9jPT09ZSl7dmFyIHI9bi5jb21wbGV0aW9uO2lmKCJ0aHJvdyI9PT1yLnR5cGUpe3ZhciBvPXIuYXJnO0Eobil9cmV0dXJuIG99fXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCBjYXRjaCBhdHRlbXB0Iil9LGRlbGVnYXRlWWllbGQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0aGlzLmRlbGVnYXRlPXtpdGVyYXRvcjpSKGUpLHJlc3VsdE5hbWU6dCxuZXh0TG9jOm59LCJuZXh0Ij09PXRoaXMubWV0aG9kJiYodGhpcy5hcmc9dm9pZCAwKSxmfX0sdH1mdW5jdGlvbiByKGUsdCxuLHIsbyxpLGEpe3RyeXt2YXIgcz1lW2ldKGEpLGM9cy52YWx1ZX1jYXRjaChlKXtyZXR1cm4gdm9pZCBuKGUpfXMuZG9uZT90KGMpOlByb21pc2UucmVzb2x2ZShjKS50aGVuKHIsbyl9ZnVuY3Rpb24gbyhlLHQpe3ZhciBuPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZlW1N5bWJvbC5pdGVyYXRvcl18fGVbIkBAaXRlcmF0b3IiXTtpZighbil7aWYoQXJyYXkuaXNBcnJheShlKXx8KG49aShlKSl8fHQmJmUmJiJudW1iZXIiPT10eXBlb2YgZS5sZW5ndGgpe24mJihlPW4pO3ZhciByPTAsbz1mdW5jdGlvbigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PWUubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTplW3IrK119fSxlOmZ1bmN0aW9uKGUpe3Rocm93IGV9LGY6b319dGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfXZhciBhLHM9ITAsYz0hMTtyZXR1cm57czpmdW5jdGlvbigpe249bi5jYWxsKGUpfSxuOmZ1bmN0aW9uKCl7dmFyIGU9bi5uZXh0KCk7cmV0dXJuIHM9ZS5kb25lLGV9LGU6ZnVuY3Rpb24oZSl7Yz0hMCxhPWV9LGY6ZnVuY3Rpb24oKXt0cnl7c3x8bnVsbD09bi5yZXR1cm58fG4ucmV0dXJuKCl9ZmluYWxseXtpZihjKXRocm93IGF9fX19ZnVuY3Rpb24gaShlLHQpe2lmKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSlyZXR1cm4gYShlLHQpO3ZhciBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKS5zbGljZSg4LC0xKTtyZXR1cm4iT2JqZWN0Ij09PW4mJmUuY29uc3RydWN0b3ImJihuPWUuY29uc3RydWN0b3IubmFtZSksIk1hcCI9PT1ufHwiU2V0Ij09PW4/QXJyYXkuZnJvbShlKToiQXJndW1lbnRzIj09PW58fC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pP2EoZSx0KTp2b2lkIDB9fWZ1bmN0aW9uIGEoZSx0KXsobnVsbD09dHx8dD5lLmxlbmd0aCkmJih0PWUubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheSh0KTtuPHQ7bisrKXJbbl09ZVtuXTtyZXR1cm4gcn1mdW5jdGlvbiBzKHQsbixyKXtyZXR1cm4gbj1jKG4pLGZ1bmN0aW9uKHQsbil7aWYobiYmKCJvYmplY3QiPT09ZShuKXx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pKXJldHVybiBuO2lmKHZvaWQgMCE9PW4pdGhyb3cgbmV3IFR5cGVFcnJvcigiRGVyaXZlZCBjb25zdHJ1Y3RvcnMgbWF5IG9ubHkgcmV0dXJuIG9iamVjdCBvciB1bmRlZmluZWQiKTtyZXR1cm4gZnVuY3Rpb24oZSl7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoInRoaXMgaGFzbid0IGJlZW4gaW5pdGlhbGlzZWQgLSBzdXBlcigpIGhhc24ndCBiZWVuIGNhbGxlZCIpO3JldHVybiBlfSh0KX0odCxmdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2YgUmVmbGVjdHx8IVJlZmxlY3QuY29uc3RydWN0KXJldHVybiExO2lmKFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYoImZ1bmN0aW9uIj09dHlwZW9mIFByb3h5KXJldHVybiEwO3RyeXtyZXR1cm4hQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sKGZ1bmN0aW9uKCl7fSkpKX1jYXRjaChlKXtyZXR1cm4hMX19KCk/UmVmbGVjdC5jb25zdHJ1Y3QobixyfHxbXSxjKHQpLmNvbnN0cnVjdG9yKTpuLmFwcGx5KHQscikpfWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGM9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSl9LGMoZSl9ZnVuY3Rpb24gdShlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSx0JiZsKGUsdCl9ZnVuY3Rpb24gbChlLHQpe3JldHVybiBsPU9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YuYmluZCgpOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX19wcm90b19fPXQsZX0sbChlLHQpfWZ1bmN0aW9uIHAoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBkKHQsbil7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwoaT1vLmtleSxhPXZvaWQgMCxhPWZ1bmN0aW9uKHQsbil7aWYoIm9iamVjdCIhPT1lKHQpfHxudWxsPT09dClyZXR1cm4gdDt2YXIgcj10W1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09cil7dmFyIG89ci5jYWxsKHQsbnx8ImRlZmF1bHQiKTtpZigib2JqZWN0IiE9PWUobykpcmV0dXJuIG87dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oInN0cmluZyI9PT1uP1N0cmluZzpOdW1iZXIpKHQpfShpLCJzdHJpbmciKSwic3ltYm9sIj09PWUoYSk/YTpTdHJpbmcoYSkpLG8pfXZhciBpLGF9ZnVuY3Rpb24gZihlLHQsbil7cmV0dXJuIHQmJmQoZS5wcm90b3R5cGUsdCksbiYmZChlLG4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJwcm90b3R5cGUiLHt3cml0YWJsZTohMX0pLGV9IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyxpPWUuY29ubmVjdHx8e307ZS5jb25uZWN0PWksZS5saWx5PWksaS5jb3JlPXt9LGkuZ2xvYmFsUmVzaWxpZW5jeT1pLmdsb2JhbFJlc2lsaWVuY3l8fHt9LGkuY29yZS5pbml0aWFsaXplZD0hMSxpLnZlcnNpb249IjIuMTYuMCIsaS5vdXRlckNvbnRleHRTdHJlYW1zVmVyc2lvbj1udWxsLGkuREVGQVVMVF9CQVRDSF9TSVpFPTUwMDt2YXIgYT0iQW1hem9uIENvbm5lY3QgQ0NQIixjPSJodHRwczovL3thbGlhc30uYXdzYXBwcy5jb20vYXV0aC8/Y2xpZW50X2lkPXtjbGllbnRfaWR9JnJlZGlyZWN0X3VyaT17cmVkaXJlY3R9IixsPSIwNjkxOWY0ZmQ4ZWQzMjRlIixkPSIvYXV0aC9hdXRob3JpemUiLGg9Ii9jb25uZWN0L2F1dGgvYXV0aG9yaXplIixnPSJJZnJhbWVSZWZyZXNoQXR0ZW1wdHMiLG09IklmcmFtZVJlZnJlc2hBdHRlbXB0c0RyIix2PSJJZnJhbWVJbml0aWFsaXphdGlvblN1Y2Nlc3MiLHk9IklmcmFtZUluaXRpYWxpemF0aW9uU3VjY2Vzc0RyIixiPSJjdXN0b212aWV3cyIsRT17IjAtMTAwIjpbMCwxMDBdLCIxMDEtNTAwIjpbMTAxLDUwMF0sIjUwMS0xMDAwIjpbNTAxLDFlM10sIjEwMDAtMzAwMCI6WzEwMDEsM2UzXSwiMzAwMS01MDAwIjpbMzAwMSw1ZTNdLCI1MDAxLTEwMDAwIjpbNTAwMSwxZTRdLCIxMDAwMS0yMDAwMCI6WzEwMDAxLDJlNF0sIjIwMDAwKyI6WzIwMDAxLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSXX07aS5udW1iZXJPZkNvbm5lY3RlZENDUHM9MCxpLm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYj0wLGkuY29yZS5NQVhfQVVUSE9SSVpFX1JFVFJZX0NPVU5UX0ZPUl9TRVNTSU9OPTMsaS5jb3JlLk1BWF9DVElfQVVUSF9SRVRSWV9DT1VOVD0xMCxpLmNvcmUuY3RpQXV0aFJldHJ5Q291bnQ9MCxpLmNvcmUuYXV0aG9yaXplVGltZW91dElkPW51bGwsaS5jb3JlLmN0aVRpbWVvdXRJZD1udWxsLGkuY29yZS5NQVhfVU5BVVRIT1JJWkVEX1JFVFJZX0NPVU5UPTIwLGkuY29yZS5NQVhfQUNDRVNTX0RFTklFRF9SRVRSWV9DT1VOVD0xMCxpLlNlc3Npb25TdG9yYWdlS2V5cz1pLm1ha2VFbnVtKFsidGFiX2lkIiwiYXV0aG9yaXplX3JldHJ5X2NvdW50Il0pO3ZhciBTPWZ1bmN0aW9uKCl7cmV0dXJuIGYoKGZ1bmN0aW9uIHQobil7cCh0aGlzLHQpLHRoaXMua2V5PSIiLmNvbmNhdChuLCJQYXJhbXNTdG9yYWdlOjoiKS5jb25jYXQoZS5sb2NhdGlvbi5vcmlnaW4pfSksW3trZXk6ImdldCIsdmFsdWU6ZnVuY3Rpb24oKXt0cnl7dmFyIHQ9ZS5sb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLmtleSk7cmV0dXJuIHQmJkpTT04ucGFyc2UodCl9Y2F0Y2goZSl7aS5nZXRMb2coKS5lcnJvcigiIi5jb25jYXQodGhpcy5rZXksIjo6IEZhaWxlZCB0byBnZXQgc29mdHBob25lIHBhcmFtcyBmcm9tIGxvY2FsIHN0b3JhZ2UhIikpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1yZXR1cm4gbnVsbH19LHtrZXk6InNldCIsdmFsdWU6ZnVuY3Rpb24odCl7dHJ5e3QmJmUubG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5rZXksSlNPTi5zdHJpbmdpZnkodCkpfWNhdGNoKGUpe2kuZ2V0TG9nKCkuZXJyb3IoIiIuY29uY2F0KHRoaXMua2V5LCI6OiBGYWlsZWQgdG8gc2V0IHNvZnRwaG9uZSBwYXJhbXMgdG8gbG9jYWwgc3RvcmFnZSEiKSkud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX19LHtrZXk6ImNsZWFuIix2YWx1ZTpmdW5jdGlvbigpe2UubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5rZXkpfX1dKX0oKSxDPW5ldyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7cmV0dXJuIHAodGhpcyx0KSxzKHRoaXMsdCxbIlNvZnRwaG9uZSJdKX1yZXR1cm4gdSh0LGUpLGYodCl9KFMpKSxUPW5ldyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KCl7cmV0dXJuIHAodGhpcyx0KSxzKHRoaXMsdCxbIlJpbmd0b25lIl0pfXJldHVybiB1KHQsZSksZih0KX0oUykpO2Z1bmN0aW9uIEkoZSl7dmFyIHQ9ZS5tYXRjaCgvXig/Omh0dHBzPzpcL1wvKT8oPzpbXkBcbl0rQCk/KD86d3d3XC4pPyhbXjpcL1xuP10rKS9naSk7cmV0dXJuIHQubGVuZ3RoP3RbMF06IiJ9bmV3KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtyZXR1cm4gcCh0aGlzLHQpLHModGhpcyx0LFsiR2xvYmFsUmVzaWxpZW5jeSJdKX1yZXR1cm4gdSh0LGUpLGYodCl9KFMpKSxpLmNvcmUuY2hlY2tOb3RJbml0aWFsaXplZD1mdW5jdGlvbigpe2kuY29yZS5pbml0aWFsaXplZCYmaS5nZXRMb2coKS53YXJuKCJDb25uZWN0IGNvcmUgYWxyZWFkeSBpbml0aWFsaXplZCwgb25seSBuZWVkcyB0byBiZSBpbml0aWFsaXplZCBvbmNlLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9O3ZhciB3PWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5nZXRBZ2VudFN0YXRlcygpLmZpbmQoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT1pLkFnZW50U3RhdGVUeXBlLk9GRkxJTkV9KSk7ZS5zZXRTdGF0ZShuLHQpfSxBPWZ1bmN0aW9uKGUpe2kuZ2V0TG9nKCkuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBTaWduYWwgc2hhcmVkd29ya2VyIHRvIHNldCBjb250YWN0cyBzdXBwcmVzc29yIHRvICVzIGZvciBpbnN0YW5jZSAlcy4iLGUsaS5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0oaS5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNVUFBSRVNTLHtzdXBwcmVzczplLHNob3VsZFNlbmRGYWlsb3ZlckRvd25zdHJlYW06ITF9KX0sXz1mdW5jdGlvbihlLHQpe2kuZ2V0TG9nKCkuaW5mbygiW0RJU0FTVEVSIFJFQ09WRVJZXSBTaWduYWwgc2hhcmVkd29ya2VyIHRvIHNldCBmb3JjZU9mZmxpbmUgdG8gJXMgZm9yIGluc3RhbmNlICVzLiIsZSxpLmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbShpLkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRk9SQ0VfT0ZGTElORSx7b2ZmbGluZTplLG5leHRBY3RpdmVBcm46dH0pfSxSPWZ1bmN0aW9uKGUsdCl7dmFyIG49aS5nZXRMb2coKSxyPWkuYWdlbnQuaW5pdGlhbGl6ZWQ/aS5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0SW5zdGFuY2VJZCgpOmkuY29yZS5yZWdpb247bi5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEF0dGVtcHRpbmcgdG8gZm9yY2UgaW5zdGFuY2UgIi5jb25jYXQociwiIG9mZmxpbmUgdXNpbmcgIikuY29uY2F0KGU/InNvZnQiOiJoYXJkIiwiIGZhaWxvdmVyIikpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5hZ2VudCgoZnVuY3Rpb24ocil7dmFyIGE9MCxzPXIuZ2V0Q29udGFjdHMoKSxjPSExO2lmKHMubGVuZ3RoKXt2YXIgdSxsPW8ocyk7dHJ5e2ZvcihsLnMoKTshKHU9bC5uKCkpLmRvbmU7KXt2YXIgcD11LnZhbHVlO2lmKGMpYnJlYWs7IWV8fHAuZ2V0VHlwZSgpIT09aS5Db250YWN0VHlwZS5RVUVVRV9DQUxMQkFDSyYmcC5nZXRUeXBlKCkhPT1pLkNvbnRhY3RUeXBlLlZPSUNFP3AuZ2V0QWdlbnRDb25uZWN0aW9uKCkuZGVzdHJveSh7c3VjY2VzczpmdW5jdGlvbigpeysrYT09PXMubGVuZ3RoJiYoXyghMSx0KSx3KHIpLG4uaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAlcyBpcyBub3cgb2ZmbGluZSIsaS5jb3JlLnJlZ2lvbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSl7bi53YXJuKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEFuIGVycm9yIG9jY3VyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBmb3JjZSB0aGlzIGluc3RhbmNlIHRvIG9mZmxpbmUgaW4gcmVnaW9uICVzIixpLmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4ud2FybihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLF8oITAsdCksYz0hMH19KToobi5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIFdpbGwgd2FpdCB0byBjb21wbGV0ZSBmYWlsb3ZlciBvZiBpbnN0YW5jZSAlcyB1bnRpbCB2b2ljZSBjb250YWN0IHdpdGggSUQgJXMgaXMgZGVzdHJveWVkIixpLmNvcmUucmVnaW9uLHAuZ2V0Q29udGFjdElkKCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZERvd25zdHJlYW0oaS5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSX1BFTkRJTkcse25leHRBY3RpdmVBcm46dH0pLHAub25EZXN0cm95KChmdW5jdGlvbihlKXtuLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gVm9pY2UgY29udGFjdCB3aXRoIElEICVzIGRlc3Ryb3llZCwgY29udGludWluZyB3aXRoIGZhaWxvdmVyIGluIGluc3RhbmNlICVzIixlLmdldENvbnRhY3RJZCgpLGkuY29yZS5yZWdpb24pLFIoITAsdCl9KSkpfX1jYXRjaChlKXtsLmUoZSl9ZmluYWxseXtsLmYoKX19ZWxzZSBfKCExLHQpLHcociksbi5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEluc3RhbmNlICVzIGlzIG5vdyBvZmZsaW5lIixpLmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpfTtpLmNvcmUudGVybWluYXRlQ3VzdG9tVmlldz1mdW5jdGlvbihlKXt2YXIgdCxuLHI9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiIiLG89YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LGE9by5yZXNvbHZlSWZyYW1lLHM9dm9pZCAwPT09YXx8YSxjPW8udGltZW91dCx1PXZvaWQgMD09PWM/NWUzOmMsbD1vLmhpZGVJZnJhbWUscD12b2lkIDA9PT1sfHxsLGQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybihudWxsPT10P3ZvaWQgMDp0LnF1ZXJ5U2VsZWN0b3IobikpfHxkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKXx8d2luZG93LnRvcC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChlKX07bj1yPyIiLmNvbmNhdChiKS5jb25jYXQocik6IiIuY29uY2F0KGIpO3ZhciBmPW51bGw9PT0odD1pLmFnZW50QXBwLkFwcFJlZ2lzdHJ5LmdldChuKSl8fHZvaWQgMD09PXQ/dm9pZCAwOnQuY29udGFpbmVyRE9NLGg9ImlmcmFtZVtpZD0nIi5jb25jYXQobiwiJ10iKSxnPWQobixmLGgpO2lmKGcpdHJ5e2cuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSh7dG9waWM6ImxpZmVjeWNsZS50ZXJtaW5hdGVkIn0sZSkscyYmKHAmJihnLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSxjb25zb2xlLmluZm8oIltDdXN0b21WaWV3c10gY3VzdG9tdmlld3MgaWZyYW1lIGhpZGRlbiBmb3IgcmVzb2x1dGlvbiBkdXJpbmcgdGVybWluYXRpb24iKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2kuYWdlbnRBcHAuc3RvcEFwcChuKSxkKG4sZixoKT9jb25zb2xlLndhcm4oIltDdXN0b21WaWV3c10gY3VzdG9tdmlld3MgYXBwbGljYXRpb24gZGlkIG5vdCBzdG9wIHN1Y2Nlc3NmdWxseSBpbiB0ZXJtaW5hdGVDdXN0b21WaWV3IG9wZXJhdGlvbiIpOmNvbnNvbGUuaW5mbygiW0N1c3RvbVZpZXdzXSBjdXN0b212aWV3cyBhcHBsaWNhdGlvbiBzdWNjZXNzZnVsbHkgc3RvcHBlZCIpfSksdSkpfWNhdGNoKGUpe3Rocm93IG5ldyBFcnJvcigiW0N1c3RvbVZpZXdzXSBFcnJvciBpbiB0ZXJtaW5hdGVDdXN0b21WaWV3OiAiLGUpfWVsc2UgY29uc29sZS53YXJuKCJbQ3VzdG9tVmlld3NdIHRlcm1pbmF0ZUN1c3RvbVZpZXcgb3BlcmF0aW9uIGZhaWxlZCBkdWUgdG8gaWZyYW1lIG5vdCBmb3VuZCIpfSxpLmNvcmUuaW5pdERpc2FzdGVyUmVjb3Zlcnk9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPWkuZ2V0TG9nKCk7aS5jb3JlLnJlZ2lvbj1lLnJlZ2lvbixpLmNvcmUuc3VwcHJlc3NDb250YWN0cz10fHxBLGkuY29yZS5mb3JjZU9mZmxpbmU9bnx8UixpLmNvcmUuZ2V0VXBzdHJlYW0oKS5vbkRvd25zdHJlYW0oaS5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNFVF9PRkZMSU5FLChmdW5jdGlvbihlKXtpLmlmTWFzdGVyKGkuTWFzdGVyVG9waWNzLkZBSUxPVkVSLChmdW5jdGlvbigpe2kuY29yZS5mb3JjZU9mZmxpbmUoZSYmZS5zb2Z0RmFpbG92ZXIpfSkpfSkpLGkuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0oaS5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUsKGZ1bmN0aW9uKGUpe2kuaWZNYXN0ZXIoaS5NYXN0ZXJUb3BpY3MuRkFJTE9WRVIsKGZ1bmN0aW9uKCl7aS5jb3JlLmZvcmNlT2ZmbGluZShlJiZlLnNvZnRGYWlsb3ZlcixlJiZlLm5leHRBY3RpdmVBcm4pfSkpfSkpLGkuaWZNYXN0ZXIoaS5NYXN0ZXJUb3BpY3MuRkFJTE9WRVIsKGZ1bmN0aW9uKCl7ci5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEluaXRpYWxpemluZyByZWdpb24gJXMgYXMgcGFydCBvZiBhIERpc2FzdGVyIFJlY292ZXJ5IGZsZWV0IixpLmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSksKGZ1bmN0aW9uKCl7ci5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldICVzIGFscmVhZHkgcGFydCBvZiBhIERpc2FzdGVyIFJlY292ZXJ5IGZsZWV0IixpLmNvcmUucmVnaW9uKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLGUucG9sbEZvckZhaWxvdmVyJiZpLkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HP2kuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbShpLkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HLHtpbnN0YW5jZUFybjplLmluc3RhbmNlQXJuLG90aGVyQXJuOmUub3RoZXJBcm4sYXV0aFRva2VuOmUuYXV0aFRva2VufSk6ZS5pc1ByaW1hcnk/KGkuY29yZS5zdXBwcmVzc0NvbnRhY3RzKCExKSxyLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gJXMgaW5zdGFuY2UgaXMgc2V0IHRvIHByaW1hcnkiLGkuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpOihpLmNvcmUuc3VwcHJlc3NDb250YWN0cyghMCksaS5jb3JlLmZvcmNlT2ZmbGluZSgpLHIuaW5mbygiW0Rpc2FzdGVyIFJlY292ZXJ5XSAlcyBpbnN0YW5jZSBpcyBzZXQgdG8gc3RhbmQtYnkiLGkuY29yZS5yZWdpb24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSxpLmNvcmUuaW5pdD1mdW5jdGlvbihlKXtpLmNvcmUuZXZlbnRCdXM9bmV3IGkuRXZlbnRCdXMsaS5jb3JlLmFnZW50RGF0YVByb3ZpZGVyPW5ldyBQKGkuY29yZS5nZXRFdmVudEJ1cygpKSxpLmNvcmUuaW5pdENsaWVudChlKSxpLmNvcmUuaW5pdEFnZW50QXBwQ2xpZW50KGUpLGkuY29yZS5pbml0VGFza1RlbXBsYXRlc0NsaWVudChlKSxpLmNvcmUuaW5pdGlhbGl6ZWQ9ITB9LGkuY29yZS5pbml0Q2xpZW50PWZ1bmN0aW9uKGUpe2kuYXNzZXJ0Tm90TnVsbChlLCJwYXJhbXMiKTt2YXIgdD1pLmFzc2VydE5vdE51bGwoZS5hdXRoVG9rZW4sInBhcmFtcy5hdXRoVG9rZW4iKSxuPWkuYXNzZXJ0Tm90TnVsbChlLnJlZ2lvbiwicGFyYW1zLnJlZ2lvbiIpLHI9ZS5lbmRwb2ludHx8bnVsbDtpLmNvcmUuY2xpZW50PW5ldyBpLkFXU0NsaWVudCh0LG4scil9LGkuY29yZS5pbml0QWdlbnRBcHBDbGllbnQ9ZnVuY3Rpb24oZSl7aS5hc3NlcnROb3ROdWxsKGUsInBhcmFtcyIpO3ZhciB0PWkuYXNzZXJ0Tm90TnVsbChlLmF1dGhUb2tlbiwicGFyYW1zLmF1dGhUb2tlbiIpLG49aS5hc3NlcnROb3ROdWxsKGUuYXV0aENvb2tpZU5hbWUsInBhcmFtcy5hdXRoQ29va2llTmFtZSIpLHI9aS5hc3NlcnROb3ROdWxsKGUuYWdlbnRBcHBFbmRwb2ludCwicGFyYW1zLmFnZW50QXBwRW5kcG9pbnQiKTtpLmNvcmUuYWdlbnRBcHBDbGllbnQ9bmV3IGkuQWdlbnRBcHBDbGllbnQobix0LHIpfSxpLmNvcmUuaW5pdFRhc2tUZW1wbGF0ZXNDbGllbnQ9ZnVuY3Rpb24oZSl7aS5hc3NlcnROb3ROdWxsKGUsInBhcmFtcyIpO3ZhciB0PWUudGFza1RlbXBsYXRlc0VuZHBvaW50fHxlLmVuZHBvaW50O2kuYXNzZXJ0Tm90TnVsbCh0LCJ0YXNrVGVtcGxhdGVzRW5kcG9pbnQiKSxpLmNvcmUudGFza1RlbXBsYXRlc0NsaWVudD1uZXcgaS5UYXNrVGVtcGxhdGVzQ2xpZW50KHQpfSxpLmNvcmUudGVybWluYXRlPWZ1bmN0aW9uKCl7aS5jb3JlLmNsaWVudD1uZXcgaS5OdWxsQ2xpZW50LGkuY29yZS5hcGlQcm94eUNsaWVudD1uZXcgaS5OdWxsQ2xpZW50LGkuY29yZS5hZ2VudEFwcENsaWVudD1uZXcgaS5OdWxsQ2xpZW50LGkuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50PW5ldyBpLk51bGxDbGllbnQsaS5jb3JlLm1hc3RlckNsaWVudD1uZXcgaS5OdWxsQ2xpZW50O3ZhciBlPWkuY29yZS5nZXRFdmVudEJ1cygpO2UmJmUudW5zdWJzY3JpYmVBbGwoKSxpLmNvcmUuYnVzPW5ldyBpLkV2ZW50QnVzLGkuY29yZS5hZ2VudERhdGFQcm92aWRlcj1udWxsLGkuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyPW51bGwsaS5jb3JlLnVwc3RyZWFtPW51bGwsaS5jb3JlLmtlZXBhbGl2ZU1hbmFnZXI9bnVsbCxpLnN0b3JhZ2VBY2Nlc3MucmVzZXRTdG9yYWdlQWNjZXNzU3RhdGUoKSxpLmFnZW50LmluaXRpYWxpemVkPSExLGkuY29yZS5pbml0aWFsaXplZD0hMX0saS5jb3JlLnNvZnRwaG9uZVVzZXJNZWRpYVN0cmVhbT1udWxsLGkuY29yZS5zZXRTb2Z0cGhvbmVVc2VyTWVkaWFTdHJlYW09ZnVuY3Rpb24oZSl7aS5jb3JlLnNvZnRwaG9uZVVzZXJNZWRpYVN0cmVhbT1lfSxpLmNvcmUuaW5pdFJpbmd0b25lRW5naW5lcz1mdW5jdGlvbih0LG4pe2kuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lIEVuZ2luZV0gaW5pdFJpbmd0b25lRW5naW5lIHN0YXJ0ZWQiKS53aXRoT2JqZWN0KHtwYXJhbXM6dH0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5hc3NlcnROb3ROdWxsKHQsInBhcmFtcyIpO3ZhciByPW58fE8sbz1mdW5jdGlvbihlKXtpLmFzc2VydE5vdE51bGwoZSwicmluZ3RvbmVTZXR0aW5ncyIpLGkuYXNzZXJ0Tm90TnVsbChlLnZvaWNlLCJyaW5ndG9uZVNldHRpbmdzLnZvaWNlIiksaS5hc3NlcnRUcnVlKGUudm9pY2UucmluZ3RvbmVVcmx8fGUudm9pY2UuZGlzYWJsZWQsInJpbmd0b25lU2V0dGluZ3Mudm9pY2UucmluZ3RvbmVVcmwgbXVzdCBiZSBwcm92aWRlZCBvciByaW5ndG9uZVNldHRpbmdzLnZvaWNlLmRpc2FibGVkIG11c3QgYmUgdHJ1ZSIpLGkuYXNzZXJ0Tm90TnVsbChlLnF1ZXVlX2NhbGxiYWNrLCJyaW5ndG9uZVNldHRpbmdzLnF1ZXVlX2NhbGxiYWNrIiksaS5hc3NlcnRUcnVlKGUucXVldWVfY2FsbGJhY2sucmluZ3RvbmVVcmx8fGUucXVldWVfY2FsbGJhY2suZGlzYWJsZWQsInJpbmd0b25lU2V0dGluZ3Mudm9pY2UucmluZ3RvbmVVcmwgbXVzdCBiZSBwcm92aWRlZCBvciByaW5ndG9uZVNldHRpbmdzLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkIG11c3QgYmUgdHJ1ZSIpLGkuY29yZS5yaW5ndG9uZUVuZ2luZXM9e30saS5hZ2VudCgoZnVuY3Rpb24odCl7dC5vblJlZnJlc2goKGZ1bmN0aW9uKCl7aS5pZk1hc3RlcihpLk1hc3RlclRvcGljcy5SSU5HVE9ORSwoZnVuY3Rpb24oKXt2YXIgdD0hMTtlLnZvaWNlLmRpc2FibGVkfHxpLmNvcmUucmluZ3RvbmVFbmdpbmVzLnZvaWNlfHwoaS5jb3JlLnJpbmd0b25lRW5naW5lcy52b2ljZT1uZXcgaS5Wb2ljZVJpbmd0b25lRW5naW5lKGUudm9pY2UpLHQ9ITAsaS5nZXRMb2coKS5pbmZvKCJWb2ljZVJpbmd0b25lRW5naW5lIGluaXRpYWxpemVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpLGUuY2hhdC5kaXNhYmxlZHx8aS5jb3JlLnJpbmd0b25lRW5naW5lcy5jaGF0fHwoaS5jb3JlLnJpbmd0b25lRW5naW5lcy5jaGF0PW5ldyBpLkNoYXRSaW5ndG9uZUVuZ2luZShlLmNoYXQpLHQ9ITAsaS5nZXRMb2coKS5pbmZvKCJDaGF0UmluZ3RvbmVFbmdpbmUgaW5pdGlhbGl6ZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSksZS50YXNrLmRpc2FibGVkfHxpLmNvcmUucmluZ3RvbmVFbmdpbmVzLnRhc2t8fChpLmNvcmUucmluZ3RvbmVFbmdpbmVzLnRhc2s9bmV3IGkuVGFza1Jpbmd0b25lRW5naW5lKGUudGFzayksdD0hMCxpLmdldExvZygpLmluZm8oIlRhc2tSaW5ndG9uZUVuZ2luZSBpbml0aWFsaXplZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxlLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkfHxpLmNvcmUucmluZ3RvbmVFbmdpbmVzLnF1ZXVlX2NhbGxiYWNrfHwoaS5jb3JlLnJpbmd0b25lRW5naW5lcy5xdWV1ZV9jYWxsYmFjaz1uZXcgaS5RdWV1ZUNhbGxiYWNrUmluZ3RvbmVFbmdpbmUoZS5xdWV1ZV9jYWxsYmFjayksdD0hMCxpLmdldExvZygpLmluZm8oIlF1ZXVlQ2FsbGJhY2tSaW5ndG9uZUVuZ2luZSBpbml0aWFsaXplZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSx0JiZpLmNvcmUuX3JpbmdlckRldmljZUlkJiZyKHtkZXZpY2VJZDppLmNvcmUuX3JpbmdlckRldmljZUlkfSl9KSl9KSl9KSksTCgpfSxhPWZ1bmN0aW9uKGUsdCl7ZS5yaW5ndG9uZT1lLnJpbmd0b25lfHx7fSxlLnJpbmd0b25lLnZvaWNlPWUucmluZ3RvbmUudm9pY2V8fHt9LGUucmluZ3RvbmUucXVldWVfY2FsbGJhY2s9ZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFja3x8e30sZS5yaW5ndG9uZS5jaGF0PWUucmluZ3RvbmUuY2hhdHx8e2Rpc2FibGVkOiEwfSxlLnJpbmd0b25lLnRhc2s9ZS5yaW5ndG9uZS50YXNrfHx7ZGlzYWJsZWQ6ITB9LHQuc29mdHBob25lJiYodC5zb2Z0cGhvbmUuZGlzYWJsZVJpbmd0b25lJiYoZS5yaW5ndG9uZS52b2ljZS5kaXNhYmxlZD0hMCxlLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrLmRpc2FibGVkPSEwKSx0LnNvZnRwaG9uZS5yaW5ndG9uZVVybCYmKGUucmluZ3RvbmUudm9pY2UucmluZ3RvbmVVcmw9dC5zb2Z0cGhvbmUucmluZ3RvbmVVcmwsZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjay5yaW5ndG9uZVVybD10LnNvZnRwaG9uZS5yaW5ndG9uZVVybCkpLHQuY2hhdCYmKHQuY2hhdC5kaXNhYmxlUmluZ3RvbmUmJihlLnJpbmd0b25lLmNoYXQuZGlzYWJsZWQ9ITApLHQuY2hhdC5yaW5ndG9uZVVybCYmKGUucmluZ3RvbmUuY2hhdC5yaW5ndG9uZVVybD10LmNoYXQucmluZ3RvbmVVcmwpKSx0LnRhc2smJih0LnRhc2suZGlzYWJsZVJpbmd0b25lJiYoZS5yaW5ndG9uZS50YXNrLmRpc2FibGVkPSEwKSx0LnRhc2sucmluZ3RvbmVVcmwmJihlLnJpbmd0b25lLnRhc2sucmluZ3RvbmVVcmw9dC50YXNrLnJpbmd0b25lVXJsKSksdC5yaW5ndG9uZSYmKGUucmluZ3RvbmUudm9pY2U9aS5tZXJnZShlLnJpbmd0b25lLnZvaWNlLHQucmluZ3RvbmUudm9pY2V8fHt9KSxlLnJpbmd0b25lLnF1ZXVlX2NhbGxiYWNrPWkubWVyZ2UoZS5yaW5ndG9uZS5xdWV1ZV9jYWxsYmFjayx0LnJpbmd0b25lLnZvaWNlfHx7fSksZS5yaW5ndG9uZS5jaGF0PWkubWVyZ2UoZS5yaW5ndG9uZS5jaGF0LHQucmluZ3RvbmUuY2hhdHx8e30pLGUucmluZ3RvbmUudGFzaz1pLm1lcmdlKGUucmluZ3RvbmUudGFzayx0LnJpbmd0b25lLnRhc2t8fHt9KSl9O2lmKGEodCx0KSxpLmlzRnJhbWVkKCkpe3ZhciBzO2kuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZShpLkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKG4pe2UuY2xlYXJUaW1lb3V0KHMpLGkuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lIEVuZ2luZV0gQ29uZmlndXJlIGV2ZW50IGhhbmRsZXIgZXhlY3V0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMudW5zdWJzY3JpYmUoKSxhKHQsbiksVC5zZXQodC5yaW5ndG9uZSksbyh0LnJpbmd0b25lKX0pKTt2YXIgYz1ULmdldCgpO2MmJmkuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0oaS5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKHQpe3QmJnQuaWQmJihpLmdldExvZygpLmluZm8oIltSaW5ndG9uZUVuZ2luZV0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkgYW5kIHdhaXRpbmcgZm9yIGNvbmZpZ3VyZSBNZXNzYWdlIGhhbmRsZXIgdG8gZXhlY3V0ZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy51bnN1YnNjcmliZSgpLHM9ZS5zZXRUaW1lb3V0KChmdW5jdGlvbigpe2kuZ2V0TG9nKCkuaW5mbygiW1Jpbmd0b25lRW5naW5lXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkIHdpdGhvdXQgY29uZmlndXJlIG1lc3NhZ2UgJiBJbml0aWFsaXppbmcgc2V0dXBSaW5ndG9uZUVuZ2luZXMgKFJpbmd0b25lIEVuZ2luZSkgZnJvbSBsb2NhbFN0b3JhZ2UgcmluZ3RvbmUgcGFyYW1zLiAiKS53aXRoT2JqZWN0KHtyaW5ndG9uZTpjfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxvKGMpfSksMTAwKSl9KSl9ZWxzZSBvKHQucmluZ3RvbmUpfTt2YXIgTD1mdW5jdGlvbigpe2kuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZShpLkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX1JJTkdFUl9ERVZJQ0UsTyl9LE89ZnVuY3Rpb24oKXt2YXIgZT0oYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9KS5kZXZpY2VJZHx8IiI7aWYoaS5nZXRMb2coKS5pbmZvKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBBdHRlbXB0aW5nIHRvIHNldCByaW5nZXIgZGV2aWNlICIuY29uY2F0KGUpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLDA9PT1pLmtleXMoaS5jb3JlLnJpbmd0b25lRW5naW5lcykubGVuZ3RoKXJldHVybiBpLmdldExvZygpLmluZm8oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIHNldFJpbmdlckRldmljZSBjYWxsZWQgYmVmb3JlIHJpbmd0b25lIGVuZ2luZSBpcyBpbml0aWFsaXplZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdm9pZChlJiYoaS5jb3JlLl9yaW5nZXJEZXZpY2VJZD1lLGkuZ2V0TG9nKCkud2FybigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gc3RvcmVkIGRldmljZSBJZCBmb3IgbGF0ZXIgdXNlLCBvbmNlIHJpbmd0b25lIGVuZ2luZSBpcyB1cC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkucHVibGlzaE1ldHJpYyh7bmFtZToiU2V0UmluZ2VyRGV2aWNlQmVmb3JlSW5pdFJpbmd0b25lRW5naW5lIixkYXRhOntjb3VudDoxfX0pKSk7aWYoZSl7dmFyIHQ9ZnVuY3Rpb24odCl7aS5jb3JlLnJpbmd0b25lRW5naW5lc1t0XS5zZXRPdXRwdXREZXZpY2UoZSkudGhlbigoZnVuY3Rpb24oZSl7aS5nZXRMb2coKS5pbmZvKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSByaW5ndG9uZVR5cGUgIi5jb25jYXQodCwiIHN1Y2Nlc3NmdWxseSBzZXQgdG8gZGV2aWNlaWQgIikuY29uY2F0KGUpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtpLmdldExvZygpLmVycm9yKGUpfSkpfTtmb3IodmFyIG4gaW4gaS5jb3JlLnJpbmd0b25lRW5naW5lcyl0KG4pO2kuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbShpLkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OmkuQ29uZmlndXJhdGlvbkV2ZW50cy5SSU5HRVJfREVWSUNFX0NIQU5HRUQsZGF0YTp7ZGV2aWNlSWQ6ZX19KX1lbHNlIGkuZ2V0TG9nKCkud2FybigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gU2V0dGluZyByaW5nZXIgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyBkZXZpY2VJZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9O2kuY29yZS5pbml0U29mdHBob25lTWFuYWdlcj1mdW5jdGlvbih0KXt2YXIgbj10fHx7fTtpLmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gaW5pdFNvZnRwaG9uZU1hbmFnZXIgc3RhcnRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5tZXJnZShuLnNvZnRwaG9uZXx8e30sZSk7aS5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIGNvbXBldGVGb3JNYXN0ZXJPbkFnZW50VXBkYXRlIGV4ZWN1dGVkIikud2l0aE9iamVjdCh7c29mdHBob25lUGFyYW1zOnR9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuYWdlbnQoKGZ1bmN0aW9uKGUpe2UuZ2V0Q2hhbm5lbENvbmN1cnJlbmN5KGkuQ2hhbm5lbFR5cGUuVk9JQ0UpJiZlLm9uUmVmcmVzaCgoZnVuY3Rpb24oKXt2YXIgbj10aGlzO2kuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBhZ2VudCByZWZyZXNoIGhhbmRsZXIgZXhlY3V0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuaWZNYXN0ZXIoaS5NYXN0ZXJUb3BpY3MuU09GVFBIT05FLChmdW5jdGlvbigpe2kuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBjb25maXJtZWQgYXMgc29mdHBob25lIG1hc3RlciB0b3BpYyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksIWkuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyJiZlLmlzU29mdHBob25lRW5hYmxlZCgpJiYoaS5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bmV3IGkuU29mdHBob25lTWFuYWdlcih0KSxuLnVuc3Vic2NyaWJlKCkpfSkpfSkpfSkpfTtpZihpLmlzRnJhbWVkKCkmJmkuaXNDQ1AoKSl7dmFyIG87aS5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKGkuRXZlbnRUeXBlLkNPTkZJR1VSRSwoZnVuY3Rpb24odCl7ZS5jbGVhclRpbWVvdXQobyksaS5nZXRMb2coKS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIENvbmZpZ3VyZSBldmVudCBoYW5kbGVyIGV4ZWN1dGVkIikud2l0aE9iamVjdCh7ZGF0YTp0fSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxDLnNldCh0LnNvZnRwaG9uZSksdC5zb2Z0cGhvbmUmJnQuc29mdHBob25lLmFsbG93RnJhbWVkU29mdHBob25lJiYodGhpcy51bnN1YnNjcmliZSgpLHIodC5zb2Z0cGhvbmUpKSxzKHQuc29mdHBob25lKX0pKTt2YXIgYT1DLmdldCgpO2EmJmkuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0oaS5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKHQpe3QmJnQuaWQmJihpLmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCBzdWNjZXNzZnVsbHkgYW5kIHdhaXRpbmcgZm9yIGNvbmZpZ3VyZSBNZXNzYWdlIGhhbmRsZXIgdG8gZXhlY3V0ZSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdGhpcy51bnN1YnNjcmliZSgpLG89ZS5zZXRUaW1lb3V0KChmdW5jdGlvbigpe2kuZ2V0TG9nKCkuaW5mbygiW1NvZnRwaG9uZSBNYW5hZ2VyXSBFbWJlZGRlZCBDQ1AgaXMgcmVmcmVzaGVkIHdpdGhvdXQgY29uZmlndXJlIG1lc3NhZ2UgaGFuZGxlciBleGVjdXRpb24iKS53aXRoT2JqZWN0KHtzb2Z0cGhvbmVQYXJhbXNGcm9tTG9jYWxTdG9yYWdlOmF9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkucHVibGlzaE1ldHJpYyh7bmFtZToiRW1iZWRkZWRDQ1BSZWZyZXNoZWRXaXRob3V0SW5pdENDUCIsZGF0YTp7Y291bnQ6MX19KSxzKGEpLGEuYWxsb3dGcmFtZWRTb2Z0cGhvbmUmJihpLmdldExvZygpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gRW1iZWRkZWQgQ0NQIGlzIHJlZnJlc2hlZCAmIEluaXRpYWxpemluZyBjb21wZXRlRm9yTWFzdGVyT25BZ2VudFVwZGF0ZSAoU29mdHBob25lIG1hbmFnZXIpIGZyb20gbG9jYWxTdG9yYWdlIHNvZnRwaG9uZSBwYXJhbXMiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIoYSkpfSksMTAwKSl9KSl9ZWxzZSByKG4pLHMobik7ZnVuY3Rpb24gcyhlKXt2YXIgdD1pLm1lcmdlKG4uc29mdHBob25lfHx7fSxlKTtpLmNvcmUuc29mdHBob25lUGFyYW1zPXQsaS5pc0ZpcmVmb3hCcm93c2VyKCkmJihpLmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKGkuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSwoZnVuY3Rpb24oZSl7ZS5kYXRhJiZlLmRhdGEudG9waWM9PT1pLk1hc3RlclRvcGljcy5TT0ZUUEhPTkUmJmUuZGF0YS50YWtlT3ZlciYmZS5kYXRhLm1hc3RlcklkIT09aS5jb3JlLnBvcnRTdHJlYW1JZCYmaS5jb3JlLnNvZnRwaG9uZU1hbmFnZXImJihpLmNvcmUuc29mdHBob25lTWFuYWdlci5vbkluaXRDb250YWN0U3ViLnVuc3Vic2NyaWJlKCksZGVsZXRlIGkuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyKX0pKSxpLmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUoaS5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04sKGZ1bmN0aW9uKCl7aS5pZk1hc3RlcihpLk1hc3RlclRvcGljcy5TT0ZUUEhPTkUsKGZ1bmN0aW9uKCl7aS5jb3JlLnNvZnRwaG9uZU1hbmFnZXImJmkuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyLnN0YXJ0U2Vzc2lvbigpfSksKGZ1bmN0aW9uKCl7aS5iZWNvbWVNYXN0ZXIoaS5NYXN0ZXJUb3BpY3MuU09GVFBIT05FLChmdW5jdGlvbigpe2kuYWdlbnQoKGZ1bmN0aW9uKGUpeyFpLmNvcmUuc29mdHBob25lTWFuYWdlciYmZS5pc1NvZnRwaG9uZUVuYWJsZWQoKSYmKGkuYmVjb21lTWFzdGVyKGkuTWFzdGVyVG9waWNzLlNFTkRfTE9HUyksaS5jb3JlLnNvZnRwaG9uZU1hbmFnZXI9bmV3IGkuU29mdHBob25lTWFuYWdlcih0KSxpLmNvcmUuc29mdHBob25lTWFuYWdlci5zdGFydFNlc3Npb24oKSl9KSl9KSl9KSl9KSksaS5jb250YWN0KChmdW5jdGlvbihlKXtpLmFnZW50KChmdW5jdGlvbih0KXtlLm9uUmVmcmVzaCgoZnVuY3Rpb24oZSl7aWYoaS5oYXNPdGhlckNvbm5lY3RlZENDUHMoKSYmInZpc2libGUiPT09ZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlJiYoZS5nZXRTdGF0dXMoKS50eXBlPT09aS5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HfHxlLmdldFN0YXR1cygpLnR5cGU9PT1pLkNvbnRhY3RTdGF0dXNUeXBlLklOQ09NSU5HKSl7dmFyIG49ZS5pc1NvZnRwaG9uZUNhbGwoKSYmIWUuaXNJbmJvdW5kKCkscj1lLmlzU29mdHBob25lQ2FsbCgpJiZ0LmdldENvbmZpZ3VyYXRpb24oKS5zb2Z0cGhvbmVBdXRvQWNjZXB0LG89ZS5nZXRUeXBlKCk9PT1pLkNvbnRhY3RUeXBlLlFVRVVFX0NBTExCQUNLOyhufHxyfHxvKSYmaS5jb3JlLnRyaWdnZXJSZWFkeVRvU3RhcnRTZXNzaW9uRXZlbnQoKX19KSl9KSl9KSkpfWkuYWdlbnQoKGZ1bmN0aW9uKGUpe2UuaXNTb2Z0cGhvbmVFbmFibGVkKCkmJmUuZ2V0Q2hhbm5lbENvbmN1cnJlbmN5KGkuQ2hhbm5lbFR5cGUuVk9JQ0UpJiZpLmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0oaS5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDppLkV2ZW50VHlwZS5NVVRFfSl9KSl9LGkuY29yZS50cmlnZ2VyUmVhZHlUb1N0YXJ0U2Vzc2lvbkV2ZW50PWZ1bmN0aW9uKCl7dmFyIGU9aS5jb3JlLnNvZnRwaG9uZVBhcmFtcyYmaS5jb3JlLnNvZnRwaG9uZVBhcmFtcy5hbGxvd0ZyYW1lZFNvZnRwaG9uZTtpLmlzQ0NQKCk/ZT9pLmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKGkuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKTppLmlzRnJhbWVkKCk/aS5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZERvd25zdHJlYW0oaS5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pOmkuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIoaS5Db25uZWN0aW9uRXZlbnRzLlJFQURZX1RPX1NUQVJUX1NFU1NJT04pOmU/aS5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKGkuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKTppLmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKGkuQ29ubmVjdGlvbkV2ZW50cy5SRUFEWV9UT19TVEFSVF9TRVNTSU9OKX0saS5jb3JlLmluaXRQYWdlT3B0aW9ucz1mdW5jdGlvbihlKXtpZihpLmFzc2VydE5vdE51bGwoZSwicGFyYW1zIiksaS5pc0ZyYW1lZCgpKXt2YXIgdD1pLmNvcmUuZ2V0RXZlbnRCdXMoKTt0LnN1YnNjcmliZShpLkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKGUpe2kuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbShpLkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OmkuQ29uZmlndXJhdGlvbkV2ZW50cy5DT05GSUdVUkUsZGF0YTplfSl9KSksdC5zdWJzY3JpYmUoaS5FdmVudFR5cGUuTUVESUFfREVWSUNFX1JFUVVFU1QsKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShlKXtpLmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kRG93bnN0cmVhbShpLkV2ZW50VHlwZS5NRURJQV9ERVZJQ0VfUkVTUE9OU0UsZSl9bmF2aWdhdG9yJiZuYXZpZ2F0b3IubWVkaWFEZXZpY2VzP25hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGZ1bmN0aW9uKHQpe2RldmljZXM9dHx8W10sZGV2aWNlcz1kZXZpY2VzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9KU09OKCl9KSksZShkZXZpY2VzKX0pKS5jYXRjaCgoZnVuY3Rpb24odCl7ZSh7ZXJyb3I6dC5tZXNzYWdlfSl9KSk6ZSh7ZXJyb3I6Ik5vIG5hdmlnYXRvciBvciBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzIG9iamVjdCBmb3VuZCJ9KX0pKX19LGkuY29yZS5pbml0QXBpUHJveHlTZXJ2aWNlPWZ1bmN0aW9uKCl7aS5jb3JlLmFwaVByb3h5Q2xpZW50PW5ldyBpLkFwaVByb3h5Q2xpZW50LGkuaXNGcmFtZWQoKSYmKGkuY29yZS5oYW5kbGVBcGlQcm94eVJlcXVlc3Q9ZnVuY3Rpb24oZSl7bnVsbCE9ZSYmZS5tZXRob2QmJmkuY29yZS5nZXRBcGlQcm94eUNsaWVudCgpLmNhbGwoZS5tZXRob2QsZS5wYXJhbXMse3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dmFyIG49e2RhdGE6dCxyZXF1ZXN0SWQ6ZS5yZXF1ZXN0SWR9O2kuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmREb3duc3RyZWFtKGkuRXZlbnRUeXBlLkFQSV9SRVNQT05TRSxuKX0sZmFpbHVyZTpmdW5jdGlvbih0KXt2YXIgbj17ZXJyOnQscmVxdWVzdElkOmUucmVxdWVzdElkfTtpLmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kRG93bnN0cmVhbShpLkV2ZW50VHlwZS5BUElfUkVTUE9OU0Usbil9fSl9KX0saS5jb3JlLmdldEZyYW1lTWVkaWFEZXZpY2VzPWZ1bmN0aW9uKGUpe3ZhciB0PW51bGwsbj1lfHwxZTMscj1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSx0KXtzZXRUaW1lb3V0KChmdW5jdGlvbigpe3QobmV3IEVycm9yKCJUaW1lb3V0IGV4Y2VlZGVkIikpfSksbil9KSksbz1uZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxuKXtpZihpLmlzQ0NQKCkpbmF2aWdhdG9yJiZuYXZpZ2F0b3IubWVkaWFEZXZpY2VzP25hdmlnYXRvci5tZWRpYURldmljZXMuZW51bWVyYXRlRGV2aWNlcygpLnRoZW4oKGZ1bmN0aW9uKHQpe2RldmljZXM9dHx8W10sZGV2aWNlcz1kZXZpY2VzLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9KU09OKCl9KSksZShkZXZpY2VzKX0pKTpuKG5ldyBFcnJvcigiTm8gbmF2aWdhdG9yIG9yIG5hdmlnYXRvci5tZWRpYURldmljZXMgb2JqZWN0IGZvdW5kIikpO2Vsc2V7dmFyIHI9aS5jb3JlLmdldEV2ZW50QnVzKCk7dD1yLnN1YnNjcmliZShpLkV2ZW50VHlwZS5NRURJQV9ERVZJQ0VfUkVTUE9OU0UsKGZ1bmN0aW9uKHQpe3QuZXJyb3I/bihuZXcgRXJyb3IodC5lcnJvcikpOmUodCl9KSksaS5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKGkuRXZlbnRUeXBlLk1FRElBX0RFVklDRV9SRVFVRVNUKX19KSk7cmV0dXJuIFByb21pc2UucmFjZShbbyxyXSkuZmluYWxseSgoZnVuY3Rpb24oKXt0JiZ0LnVuc3Vic2NyaWJlKCl9KSl9LGkuY29yZS5hdXRob3JpemU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZTtyZXR1cm4gdHx8KHQ9aS5jb3JlLmlzTGVnYWN5RG9tYWluKCk/aDpkKSxpLmZldGNoKHQse2NyZWRlbnRpYWxzOiJpbmNsdWRlIn0sMmUzLDUpfSxpLmNvcmUudmVyaWZ5RG9tYWluQWNjZXNzPWZ1bmN0aW9uKGUsdCl7aWYoaS5nZXRMb2coKS53YXJuKCJUaGlzIEFQSSB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIG5leHQgbWFqb3IgdmVyc2lvbiByZWxlYXNlIiksIWkuaXNGcmFtZWQoKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7dmFyIG49e2hlYWRlcnM6eyJYLUFtei1CZWFyZXIiOmV9fSxyPW51bGw7cmV0dXJuIHI9dHx8KGkuY29yZS5pc0xlZ2FjeURvbWFpbigpPyIvY29ubmVjdC93aGl0ZWxpc3RlZC1vcmlnaW5zIjoiL3doaXRlbGlzdGVkLW9yaWdpbnMiKSxpLmZldGNoKHIsbiwyZTMsNSkudGhlbigoZnVuY3Rpb24oZSl7dmFyIHQ9SSh3aW5kb3cuZG9jdW1lbnQucmVmZXJyZXIpO3JldHVybiBlLndoaXRlbGlzdGVkT3JpZ2lucy5zb21lKChmdW5jdGlvbihlKXtyZXR1cm4gdD09PUkoZSl9KSk/UHJvbWlzZS5yZXNvbHZlKCk6UHJvbWlzZS5yZWplY3QoKX0pKX0saS5jb3JlLmlzTGVnYWN5RG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybihlPWV8fHdpbmRvdy5sb2NhdGlvbi5ocmVmKS5pbmNsdWRlcygiLmF3c2FwcHMuY29tIil9LGkuY29yZS5pbml0U2hhcmVkV29ya2VyPWZ1bmN0aW9uKHQpe2lmKGkuY29yZS5jaGVja05vdEluaXRpYWxpemVkKCksIWkuY29yZS5pbml0aWFsaXplZCl7aS5hc3NlcnROb3ROdWxsKHQsInBhcmFtcyIpO3ZhciBuPWkuYXNzZXJ0Tm90TnVsbCh0LnNoYXJlZFdvcmtlclVybCwicGFyYW1zLnNoYXJlZFdvcmtlclVybCIpLHI9aS5hc3NlcnROb3ROdWxsKHQuYXV0aFRva2VuLCJwYXJhbXMuYXV0aFRva2VuIiksbz1pLmFzc2VydE5vdE51bGwodC5yZWZyZXNoVG9rZW4sInBhcmFtcy5yZWZyZXNoVG9rZW4iKSxhPWkuYXNzZXJ0Tm90TnVsbCh0LmF1dGhUb2tlbkV4cGlyYXRpb24sInBhcmFtcy5hdXRoVG9rZW5FeHBpcmF0aW9uIikscz1pLmFzc2VydE5vdE51bGwodC5yZWdpb24sInBhcmFtcy5yZWdpb24iKSxjPXQuZW5kcG9pbnR8fG51bGwsdT10LmF1dGhvcml6ZUVuZHBvaW50O3V8fCh1PWkuY29yZS5pc0xlZ2FjeURvbWFpbigpP2g6ZCk7dmFyIGw9dC5hZ2VudEFwcEVuZHBvaW50fHxudWxsLHA9dC50YXNrVGVtcGxhdGVzRW5kcG9pbnR8fG51bGwsZj10LmF1dGhDb29raWVOYW1lfHxudWxsO3RyeXtpLmNvcmUuZXZlbnRCdXM9bmV3IGkuRXZlbnRCdXMoe2xvZ0V2ZW50czohMH0pLGkuY29yZS5hZ2VudERhdGFQcm92aWRlcj1uZXcgUChpLmNvcmUuZ2V0RXZlbnRCdXMoKSksaS5jb3JlLm1lZGlhRmFjdG9yeT1uZXcgaS5NZWRpYUZhY3RvcnkodCk7dmFyIGc9bmV3IFNoYXJlZFdvcmtlcihuLCJDb25uZWN0U2hhcmVkV29ya2VyIiksbT1uZXcgaS5Db25kdWl0KCJDb25uZWN0U2hhcmVkV29ya2VyQ29uZHVpdCIsbmV3IGkuUG9ydFN0cmVhbShnLnBvcnQpLG5ldyBpLldpbmRvd0lPU3RyZWFtKHdpbmRvdyxwYXJlbnQpKTtpLmNvcmUudXBzdHJlYW09bSxpLmNvcmUud2ViU29ja2V0UHJvdmlkZXI9bmV3IE4sZS5vbnVubG9hZD1mdW5jdGlvbigpe20uc2VuZFVwc3RyZWFtKGkuRXZlbnRUeXBlLkNMT1NFKSxnLnBvcnQuY2xvc2UoKX0saS5nZXRMb2coKS5zY2hlZHVsZVVwc3RyZWFtTG9nUHVzaChtKSxpLmdldExvZygpLnNjaGVkdWxlRG93bnN0cmVhbUNsaWVudFNpZGVMb2dzUHVzaCgpLG0ub25BbGxVcHN0cmVhbShpLmNvcmUuZ2V0RXZlbnRCdXMoKS5icmlkZ2UoKSksbS5vbkFsbFVwc3RyZWFtKG0ucGFzc0Rvd25zdHJlYW0oKSksaS5pc0ZyYW1lZCgpJiYobS5vbkFsbERvd25zdHJlYW0oaS5jb3JlLmdldEV2ZW50QnVzKCkuYnJpZGdlKCkpLG0ub25BbGxEb3duc3RyZWFtKChmdW5jdGlvbihlLHQpe3Q9PT1pLkV2ZW50VHlwZS5BUElfUkVRVUVTVCYmaS5jb250YWluc1ZhbHVlKGkuQXBpUHJveHlDbGllbnRNZXRob2RzLG51bGw9PWU/dm9pZCAwOmUubWV0aG9kKT9pLmNvcmUuaGFuZGxlQXBpUHJveHlSZXF1ZXN0KGUpOm0ucGFzc1Vwc3RyZWFtKCkoZSx0KX0pKSksbS5zZW5kVXBzdHJlYW0oaS5FdmVudFR5cGUuQ09ORklHVVJFLHthdXRoVG9rZW46cixhdXRoVG9rZW5FeHBpcmF0aW9uOmEsZW5kcG9pbnQ6YyxyZWZyZXNoVG9rZW46byxyZWdpb246cyxhdXRob3JpemVFbmRwb2ludDp1LGFnZW50QXBwRW5kcG9pbnQ6bCx0YXNrVGVtcGxhdGVzRW5kcG9pbnQ6cCxhdXRoQ29va2llTmFtZTpmLGxvbmdQb2xsaW5nT3B0aW9uczp0LmxvbmdQb2xsaW5nT3B0aW9uc3x8dm9pZCAwfSksbS5vblVwc3RyZWFtKGkuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbihlKXtpLmdldExvZygpLmluZm8oIkFja25vd2xlZGdlZCBieSB0aGUgQ29ubmVjdFNoYXJlZFdvcmtlciEiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuY29yZS5pbml0aWFsaXplZD0hMCxpLmNvcmUuX3NldFRhYklkKCksaS5jb3JlLnBvcnRTdHJlYW1JZD1lLmlkLHRoaXMudW5zdWJzY3JpYmUoKX0pKSxtLm9uVXBzdHJlYW0oaS5FdmVudFR5cGUuTE9HLChmdW5jdGlvbihlKXtlLmxvZ2dlcklkIT09aS5nZXRMb2coKS5nZXRMb2dnZXJJZCgpJiZpLmdldExvZygpLmFkZExvZ0VudHJ5KGkuTG9nRW50cnkuZnJvbU9iamVjdChlKSl9KSksbS5vblVwc3RyZWFtKGkuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csKGZ1bmN0aW9uKGUpe2kuZ2V0TG9nKCkuc2VuZEludGVybmFsTG9nRW50cnlUb1NlcnZlcihpLkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLG0ub25Eb3duc3RyZWFtKGkuRXZlbnRUeXBlLlNFUlZFUl9CT1VORF9JTlRFUk5BTF9MT0csKGZ1bmN0aW9uKGUpe2kuaXNGcmFtZWQoKSYmQXJyYXkuaXNBcnJheShlKSYmZS5mb3JFYWNoKChmdW5jdGlvbihlKXtpLmdldExvZygpLnNlbmRJbnRlcm5hbExvZ0VudHJ5VG9TZXJ2ZXIoaS5Mb2dFbnRyeS5mcm9tT2JqZWN0KGUpKX0pKX0pKSxtLm9uRG93bnN0cmVhbShpLkV2ZW50VHlwZS5MT0csKGZ1bmN0aW9uKGUpe2kuaXNGcmFtZWQoKSYmZS5sb2dnZXJJZCE9PWkuZ2V0TG9nKCkuZ2V0TG9nZ2VySWQoKSYmaS5nZXRMb2coKS5hZGRMb2dFbnRyeShpLkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLGkuY29yZS5vbkF1dGhGYWlsKGkuaGl0Y2goaS5jb3JlLGkuY29yZS5faGFuZGxlQXV0aEZhaWwsdC5sb2dpbkVuZHBvaW50fHxudWxsLHUpKSxpLmNvcmUub25BdXRob3JpemVTdWNjZXNzKGkuaGl0Y2goaS5jb3JlLGkuY29yZS5faGFuZGxlQXV0aG9yaXplU3VjY2VzcykpLGkuZ2V0TG9nKCkuaW5mbygiVXNlciBBZ2VudDogIituYXZpZ2F0b3IudXNlckFnZW50KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuZ2V0TG9nKCkuaW5mbygiaXNDQ1B2MjogIishMCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmdldExvZygpLmluZm8oImlzRnJhbWVkOiAiK2kuaXNGcmFtZWQoKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmNvcmUudXBzdHJlYW0ub25Eb3duc3RyZWFtKGkuRXZlbnRUeXBlLk9VVEVSX0NPTlRFWFRfSU5GTywoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdHJlYW1zVmVyc2lvbnx8bnVsbDtpLmdldExvZygpLmluZm8oIlN0cmVhbXNKUyBWZXJzaW9uOiAiK3QpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5vdXRlckNvbnRleHRTdHJlYW1zVmVyc2lvbj10fSkpLG0ub25VcHN0cmVhbShpLkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsKGZ1bmN0aW9uKGUpe2kuZ2V0TG9nKCkuaW5mbygiTnVtYmVyIG9mIGNvbm5lY3RlZCBDQ1BzIHVwZGF0ZWQ6ICIrZS5sZW5ndGgpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5udW1iZXJPZkNvbm5lY3RlZENDUHM9ZS5sZW5ndGgsZVtpLmNvcmUudGFiSWRdJiYhaXNOYU4oZVtpLmNvcmUudGFiSWRdLmxlbmd0aCkmJmkubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiIT09ZVtpLmNvcmUudGFiSWRdLmxlbmd0aCYmKGkubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzSW5UaGlzVGFiPWVbaS5jb3JlLnRhYklkXS5sZW5ndGgsaS5udW1iZXJPZkNvbm5lY3RlZENDUHNJblRoaXNUYWI+MSYmaS5nZXRMb2coKS53YXJuKCJUaGVyZSBhcmUgIitpLm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYisiIGNvbm5lY3RlZCBDQ1BzIGluIHRoaXMgdGFiLiBQbGVhc2UgYWRqdXN0IHlvdXIgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgY29tcGxpY2F0aW9ucy4gSWYgeW91IGFyZSBlbWJlZGRpbmcgQ0NQLCBwbGVhc2UgZG8gc28gZXhjbHVzaXZlbHkgd2l0aCBpbml0Q0NQLiBJbml0Q0NQIHdpbGwgbm90IGxldCB5b3UgZW1iZWQgbW9yZSB0aGFuIG9uZSBDQ1AuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLnB1Ymxpc2hNZXRyaWMoe25hbWU6IkNvbm5lY3RlZENDUFNpbmdsZVRhYkNvdW50IixkYXRhOntjb3VudDppLm51bWJlck9mQ29ubmVjdGVkQ0NQc0luVGhpc1RhYn19KSksZS50YWJJZCYmZS5zdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXImJmkuaWZNYXN0ZXIoaS5NYXN0ZXJUb3BpY3MuTUVUUklDUywoZnVuY3Rpb24oKXtyZXR1cm4gaS5hZ2VudCgoZnVuY3Rpb24oKXtyZXR1cm4gaS5wdWJsaXNoTWV0cmljKHtuYW1lOiJDQ1BUYWJzQWNyb3NzQnJvd3NlckNvdW50IixkYXRhOnt0YWJJZDplLnRhYklkLGNvdW50OmUuc3RyZWFtc1RhYnNBY3Jvc3NCcm93c2VyfX0pfSkpfSkpfSkpLGkuY29yZS5jbGllbnQ9bmV3IGkuVXBzdHJlYW1Db25kdWl0Q2xpZW50KG0pLGkuY29yZS5tYXN0ZXJDbGllbnQ9bmV3IGkuVXBzdHJlYW1Db25kdWl0TWFzdGVyQ2xpZW50KG0pLGkuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZShpLkV2ZW50VHlwZS5URVJNSU5BVEUsbS5wYXNzVXBzdHJlYW0oKSksaS5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKGkuRXZlbnRUeXBlLlRFUk1JTkFURUQsKGZ1bmN0aW9uKCl7d2luZG93LmxvY2F0aW9uLnJlbG9hZCghMCl9KSksZy5wb3J0LnN0YXJ0KCksbS5vblVwc3RyZWFtKGkuVm9pY2VJZEV2ZW50cy5VUERBVEVfRE9NQUlOX0lELChmdW5jdGlvbihlKXtlJiZlLmRvbWFpbklkJiYoaS5jb3JlLnZvaWNlSWREb21haW5JZD1lLmRvbWFpbklkKX0pKSxpLmFnZW50KChmdW5jdGlvbigpeyhuZXcgaS5Wb2ljZUlkKS5nZXREb21haW5JZCgpLnRoZW4oKGZ1bmN0aW9uKGUpe2kuZ2V0TG9nKCkuaW5mbygidm9pY2VJZCBkb21haW5JZCBzdWNjZXNzZnVsbHkgZmV0Y2hlZCBhdCBhZ2VudCBpbml0aWFsaXphdGlvbjogIitlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtpLmdldExvZygpLmluZm8oInZvaWNlSWQgZG9tYWluSWQgbm90IGZldGNoZWQgYXQgYWdlbnQgaW5pdGlhbGl6YXRpb24iKS53aXRoT2JqZWN0KHtlcnI6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9KSksaS5jb3JlLmdldE5vdGlmaWNhdGlvbk1hbmFnZXIoKS5yZXF1ZXN0UGVybWlzc2lvbigpLG0ub25Eb3duc3RyZWFtKGkuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RJU0FTVEVSX1JFQ09WRVJZLChmdW5jdGlvbihlKXtpLmNvcmUuaW5pdERpc2FzdGVyUmVjb3ZlcnkoZSl9KSl9Y2F0Y2goZSl7aS5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIEFQSSBzaGFyZWQgd29ya2VyLCB3ZSdyZSBkZWFkISIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19fSxpLmNvcmUuX3NldFRhYklkPWZ1bmN0aW9uKCl7dHJ5e2kuY29yZS50YWJJZD13aW5kb3cuc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShpLlNlc3Npb25TdG9yYWdlS2V5cy5UQUJfSUQpLGkuY29yZS50YWJJZHx8KGkuY29yZS50YWJJZD1pLnJhbmRvbUlkKCksd2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oaS5TZXNzaW9uU3RvcmFnZUtleXMuVEFCX0lELGkuY29yZS50YWJJZCkpLGkuY29yZS51cHN0cmVhbS5zZW5kVXBzdHJlYW0oaS5FdmVudFR5cGUuVEFCX0lELHt0YWJJZDppLmNvcmUudGFiSWR9KX1jYXRjaChlKXtpLmdldExvZygpLmVycm9yKCJbVGFiIElkXSBUaGVyZSB3YXMgYW4gaXNzdWUgc2V0dGluZyB0aGUgdGFiIElkIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0saS5jb3JlLmluaXRDQ1A9ZnVuY3Rpb24odCxuKXt2YXIgcixvO2lmKGkuY29yZS5jaGVja05vdEluaXRpYWxpemVkKCksIWkuY29yZS5pbml0aWFsaXplZCl7aS5nZXRMb2coKS5pbmZvKCJJZnJhbWUgaW5pdGlhbGl6YXRpb24gc3RhcnRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIGE9RGF0ZS5ub3coKTt0cnl7aWYoaS5jb3JlLl9nZXRDQ1BJZnJhbWUoKSlyZXR1cm4gdm9pZCBpLmdldExvZygpLmVycm9yKCJBdHRlbXB0ZWQgdG8gY2FsbCBpbml0Q0NQIHdoZW4gYW4gaWZyYW1lIGdlbmVyYXRlZCBieSBpbml0Q0NQIGFscmVhZHkgZXhpc3RzIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1jYXRjaChlKXtpLmdldExvZygpLmVycm9yKCJFcnJvciB3aGlsZSBjaGVja2luZyBpZiBpbml0Q0NQIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfXZhciBzPXt9OyJzdHJpbmciPT10eXBlb2Ygbj9zLmNjcFVybD1uOnM9bixpLmFzc2VydE5vdE51bGwodCwiY29udGFpbmVyRGl2IiksaS5hc3NlcnROb3ROdWxsKHMuY2NwVXJsLCJwYXJhbXMuY2NwVXJsIiksaS5jb3JlLmlmcmFtZVN0eWxlPXMuc3R5bGV8fCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlOyIsbnVsbCE9PShyPXMuc29mdHBob25lKSYmdm9pZCAwIT09ciYmci5kaXNhYmxlU3RvcmluZ1BhcmFtc0luTG9jYWxTdG9yYWdlfHwoQy5jbGVhbigpLFQuY2xlYW4oKSk7dmFyIHUscCxkLGYsaD1udWxsO2lmKCEwPT09KG51bGw9PT0obz1zKXx8dm9pZCAwPT09bz92b2lkIDA6by5lbmFibGVHbG9iYWxSZXNpbGllbmN5KSlpZigic3RyaW5nIiE9dHlwZW9mKG51bGw9PT0odT1zKXx8dm9pZCAwPT09dT92b2lkIDA6dS5zZWNvbmRhcnlDQ1BVcmwpfHwiIj09PShudWxsPT09KHA9cyl8fHZvaWQgMD09PXA/dm9pZCAwOnAuc2Vjb25kYXJ5Q0NQVXJsKSl7dmFyIGI9ImVuYWJsZUdsb2JhbFJlc2lsaWVuY3kgZmxhZyB3YXMgZW5hYmxlZCwgYnV0IHNlY29uZGFyeUNDUFVybCB3YXMgbm90IHByb3ZpZGVkLiBHbG9iYWwgUmVzaWxpZW5jeSB3aWxsIG5vdCBiZSBlbmFibGVkIjtpLmdldExvZygpLmVycm9yKGIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaD17ZXZlbnQ6aS5HbG9iYWxSZXNpbGllbmN5RXZlbnRzLkNPTkZJR1VSRV9FUlJPUixkYXRhOm5ldyBFcnJvcihiKX19ZWxzZXtpZigic3RyaW5nIj09dHlwZW9mKG51bGw9PT0oZD1zKXx8dm9pZCAwPT09ZD92b2lkIDA6ZC5sb2dpblVybCkmJiIiIT09KG51bGw9PT0oZj1zKXx8dm9pZCAwPT09Zj92b2lkIDA6Zi5sb2dpblVybCkpcmV0dXJuIGkuZ2V0TG9nKCkuaW5mbygiZW5hYmxlR2xvYmFsUmVzaWxpZW5jeSBmbGFnIHdhcyBlbmFibGVkIGFuZCBzZWNvbmRhcnlDQ1BVcmwgYW5kIGxvZ2luVXJsIHdhcyBwcm92aWRlZC4gR2xvYmFsIFJlc2lsaWVuY3kgd2lsbCBiZSBlbmFibGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmdsb2JhbFJlc2lsaWVuY3kuaW5pdEdSQ0NQKHQsbik7dmFyIEU9ImVuYWJsZUdsb2JhbFJlc2lsaWVuY3kgZmxhZyB3YXMgZW5hYmxlZCwgYnV0IGxvZ2luVXJsIHdhcyBub3QgcHJvdmlkZWQuIEdsb2JhbCBSZXNpbGllbmN5IHdpbGwgbm90IGJlIGVuYWJsZWQiO2kuZ2V0TG9nKCkuZXJyb3IoRSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxoPXtldmVudDppLkdsb2JhbFJlc2lsaWVuY3lFdmVudHMuQ09ORklHVVJFX0VSUk9SLGRhdGE6bmV3IEVycm9yKEUpfX1pLnN0b3JhZ2VBY2Nlc3MuaW5pdChzLmNjcFVybCx0LHMuc3RvcmFnZUFjY2Vzc3x8e30pO3ZhciBTPWkuY29yZS5fY3JlYXRlQ0NQSWZyYW1lKHQscyksST1uZXcgaS5JRnJhbWVDb25kdWl0KHMuY2NwVXJsLHdpbmRvdyxTKTtpLmNvcmUudXBzdHJlYW09SSxpLmNvcmUuZXZlbnRCdXM9bmV3IGkuRXZlbnRCdXMoe2xvZ0V2ZW50czohMX0pLGkuc3RvcmFnZUFjY2Vzcy5jYW5SZXF1ZXN0KCk/aS5zdG9yYWdlQWNjZXNzLnNldHVwUmVxdWVzdEhhbmRsZXJzKHtvbkdyYW50Ond9KTp3KCl9ZnVuY3Rpb24gdygpe2kuY29yZS5hZ2VudERhdGFQcm92aWRlcj1uZXcgUChpLmNvcmUuZ2V0RXZlbnRCdXMoKSksaS5jb3JlLm1lZGlhRmFjdG9yeT1uZXcgaS5NZWRpYUZhY3RvcnkocyksaS5jb3JlLl9zZW5kSWZyYW1lU3R5bGVEYXRhVXBzdHJlYW1BZnRlclJlYXNvbmFibGVXYWl0VGltZShTLEkpLGkuY29yZS53ZWJTb2NrZXRQcm92aWRlcj1uZXcgTixJLm9uQWxsVXBzdHJlYW0oaS5jb3JlLmdldEV2ZW50QnVzKCkuYnJpZGdlKCkpLGkuY29yZS5rZWVwYWxpdmVNYW5hZ2VyPW5ldyBrKEksaS5jb3JlLmdldEV2ZW50QnVzKCkscy5jY3BTeW5UaW1lb3V0fHwxZTMscy5jY3BBY2tUaW1lb3V0fHwzZTMpLGkuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dD1udWxsLGkuY29yZS5jY3BMb2FkVGltZW91dEluc3RhbmNlPWUuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpLmNvcmUuY2NwTG9hZFRpbWVvdXRJbnN0YW5jZT1udWxsLGkuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIoaS5FdmVudFR5cGUuQUNLX1RJTUVPVVQpLGkuZ2V0TG9nKCkuaW5mbygiQ0NQIExvYWRUaW1lb3V0IHRyaWdnZXJlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSxzLmNjcExvYWRUaW1lb3V0fHw1ZTMpLGkuZ2V0TG9nKCkuc2NoZWR1bGVVcHN0cmVhbU91dGVyQ29udGV4dENDUExvZ3NQdXNoKEkpLGkuZ2V0TG9nKCkuc2NoZWR1bGVVcHN0cmVhbU91dGVyQ29udGV4dENDUHNlcnZlckJvdW5kTG9nc1B1c2goSSksSS5vblVwc3RyZWFtKGkuRXZlbnRUeXBlLkFDS05PV0xFREdFLChmdW5jdGlvbih0KXtpZihpLmdldExvZygpLmluZm8oIkFja25vd2xlZGdlZCBieSB0aGUgQ0NQISIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5jb3JlLmNsaWVudD1uZXcgaS5VcHN0cmVhbUNvbmR1aXRDbGllbnQoSSksaS5jb3JlLm1hc3RlckNsaWVudD1uZXcgaS5VcHN0cmVhbUNvbmR1aXRNYXN0ZXJDbGllbnQoSSksaS5jb3JlLnBvcnRTdHJlYW1JZD10LmlkLChzLnNvZnRwaG9uZXx8cy5jaGF0fHxzLnRhc2t8fHMucGFnZU9wdGlvbnN8fHMuc2hvdWxkQWRkTmFtZXNwYWNlVG9Mb2dzfHxzLmRpc2FzdGVyUmVjb3ZlcnlPbikmJkkuc2VuZFVwc3RyZWFtKGkuRXZlbnRUeXBlLkNPTkZJR1VSRSx7c29mdHBob25lOnMuc29mdHBob25lLGNoYXQ6cy5jaGF0LHRhc2s6cy50YXNrLHBhZ2VPcHRpb25zOnMucGFnZU9wdGlvbnMsc2hvdWxkQWRkTmFtZXNwYWNlVG9Mb2dzOnMuc2hvdWxkQWRkTmFtZXNwYWNlVG9Mb2dzLGRpc2FzdGVyUmVjb3ZlcnlPbjpzLmRpc2FzdGVyUmVjb3ZlcnlPbn0pLHMuZGlzYXN0ZXJSZWNvdmVyeU9uJiYoaS5jb3JlLnJlZ2lvbj1zLnJlZ2lvbixpLmNvcmUuc3VwcHJlc3NDb250YWN0cz1BLGkuY29yZS5mb3JjZU9mZmxpbmU9ZnVuY3Rpb24oZSl7SS5zZW5kVXBzdHJlYW0oaS5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNFVF9PRkZMSU5FLGUpfSxJLnNlbmRVcHN0cmVhbShpLkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9ESVNBU1RFUl9SRUNPVkVSWSxzKSksaS5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2UmJihlLmNsZWFyVGltZW91dChpLmNvcmUuY2NwTG9hZFRpbWVvdXRJbnN0YW5jZSksaS5jb3JlLmNjcExvYWRUaW1lb3V0SW5zdGFuY2U9bnVsbCksSS5zZW5kVXBzdHJlYW0oaS5FdmVudFR5cGUuT1VURVJfQ09OVEVYVF9JTkZPLHtzdHJlYW1zVmVyc2lvbjppLnZlcnNpb259KSxpLmNvcmUua2VlcGFsaXZlTWFuYWdlci5zdGFydCgpLHRoaXMudW5zdWJzY3JpYmUoKSxpLmNvcmUuaW5pdGlhbGl6ZWQ9ITAsaS5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcihpLkV2ZW50VHlwZS5JTklUKSxoJiZpLmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKGguZXZlbnQsaC5kYXRhKSxhKXt2YXIgbj1EYXRlLm5vdygpLWEscj1pLmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHR8fDA7aS5nZXRMb2coKS5pbmZvKCJJZnJhbWUgaW5pdGlhbGl6YXRpb24gc3VjY2VlZGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxpLmdldExvZygpLmluZm8oIklmcmFtZSBpbml0aWFsaXphdGlvbiB0aW1lICIuY29uY2F0KG4pKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuZ2V0TG9nKCkuaW5mbygiSWZyYW1lIHJlZnJlc2ggYXR0ZW1wdHMgIi5jb25jYXQocikpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXtpLnB1Ymxpc2hNZXRyaWMoe25hbWU6ZyxkYXRhOntjb3VudDpyfX0pLGkucHVibGlzaE1ldHJpYyh7bmFtZTp2LGRhdGE6e2NvdW50OjF9fSksaS5wdWJsaXNoTWV0cmljKHtuYW1lOiJJZnJhbWVJbml0aWFsaXphdGlvblRpbWUiLGRhdGE6e2NvdW50Om59fSkscy5kaXNhc3RlclJlY292ZXJ5T24mJihpLnB1Ymxpc2hNZXRyaWMoe25hbWU6bSxkYXRhOntjb3VudDpyfX0pLGkucHVibGlzaE1ldHJpYyh7bmFtZTp5LGRhdGE6e2NvdW50OjF9fSksaS5wdWJsaXNoTWV0cmljKHtuYW1lOiJJZnJhbWVJbml0aWFsaXphdGlvblRpbWVEciIsZGF0YTp7Y291bnQ6bn19KSksYT1udWxsfSksMWUzKX19KSksSS5vblVwc3RyZWFtKGkuRXZlbnRUeXBlLkxPRywoZnVuY3Rpb24oZSl7ZS5sb2dnZXJJZCE9PWkuZ2V0TG9nKCkuZ2V0TG9nZ2VySWQoKSYmaS5nZXRMb2coKS5hZGRMb2dFbnRyeShpLkxvZ0VudHJ5LmZyb21PYmplY3QoZSkpfSkpLGkuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZShpLkV2ZW50VHlwZS5BQ0tfVElNRU9VVCwoZnVuY3Rpb24oKXtpZighMSE9PXMubG9naW5Qb3B1cCl0cnl7dmFyIG49ZnVuY3Rpb24odCl7dmFyIG49Imh0dHBzOi8vbGlseS51cy1lYXN0LTEuYW1hem9uYXdzLmNvbS90YXcvYXV0aC9jb2RlIjtyZXR1cm4gaS5hc3NlcnROb3ROdWxsKG4pLHQubG9naW5Vcmw/dC5sb2dpblVybDp0LmFsaWFzPyhsb2cud2FybigiVGhlIGBhbGlhc2AgcGFyYW0gaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSBleHBlY3RlZCB0byBmdW5jdGlvbiBwcm9wZXJseS4gUGxlYXNlIHVzZSBgY2NwVXJsYCBvciBgbG9naW5VcmxgLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FtYXpvbi1jb25uZWN0L2FtYXpvbi1jb25uZWN0LXN0cmVhbXMvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI2Nvbm5lY3Rjb3JlaW5pdGNjcCBmb3IgdmFsaWQgcGFyYW1ldGVycy4iKSxjLnJlcGxhY2UoInthbGlhc30iLHQuYWxpYXMpLnJlcGxhY2UoIntjbGllbnRfaWR9IixsKS5yZXBsYWNlKCJ7cmVkaXJlY3R9IixlLmVuY29kZVVSSUNvbXBvbmVudChuKSkpOnQuY2NwVXJsfShzKTtpLmdldExvZygpLndhcm4oIkFDS19USU1FT1VUIG9jY3VycmVkLCBhdHRlbXB0aW5nIHRvIHBvcCB0aGUgbG9naW4gcGFnZSBpZiBub3QgYWxyZWFkeSBvcGVuLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5jb3JlLl9vcGVuUG9wdXBXaXRoTG9jayhuLHMubG9naW5PcHRpb25zKX1jYXRjaChlKXtpLmdldExvZygpLmVycm9yKCJBQ0tfVElNRU9VVCBvY2N1cnJlZCBidXQgd2UgYXJlIHVuYWJsZSB0byBvcGVuIHRoZSBsb2dpbiBwb3B1cC4iKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9aWYobnVsbD09aS5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0KXRyeXtJLm9uVXBzdHJlYW0oaS5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKCl7dGhpcy51bnN1YnNjcmliZSgpLGUuY2xlYXJUaW1lb3V0KGkuY29yZS5pZnJhbWVSZWZyZXNoVGltZW91dCksaS5jb3JlLmlmcmFtZVJlZnJlc2hUaW1lb3V0PW51bGwsKHMubG9naW5Qb3B1cEF1dG9DbG9zZXx8cy5sb2dpbk9wdGlvbnMmJnMubG9naW5PcHRpb25zLmF1dG9DbG9zZSkmJmkuY29yZS5sb2dpbldpbmRvdyYmKGkuY29yZS5sb2dpbldpbmRvdy5jbG9zZSgpLGkuY29yZS5sb2dpbldpbmRvdz1udWxsKX0pKSxpLmNvcmUuX3JlZnJlc2hJZnJhbWVPblRpbWVvdXQocyx0KX1jYXRjaChlKXtpLmdldExvZygpLmVycm9yKCJFcnJvciBvY2N1cnJlZCB3aGlsZSByZWZyZXNoaW5nIGlmcmFtZSIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KSkscy5vblZpZXdDb250YWN0JiZpLmNvcmUub25WaWV3Q29udGFjdChzLm9uVmlld0NvbnRhY3QpLEkub25VcHN0cmVhbShpLkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsKGZ1bmN0aW9uKGUpe2kubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzPWUubGVuZ3RofSkpLEkub25VcHN0cmVhbShpLlZvaWNlSWRFdmVudHMuVVBEQVRFX0RPTUFJTl9JRCwoZnVuY3Rpb24oZSl7ZSYmZS5kb21haW5JZCYmKGkuY29yZS52b2ljZUlkRG9tYWluSWQ9ZS5kb21haW5JZCl9KSksaS5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKGkuRXZlbnRUeXBlLklGUkFNRV9SRVRSSUVTX0VYSEFVU1RFRCwoZnVuY3Rpb24oKXtpZihhKXt2YXIgZT1pLmNvcmUuaWZyYW1lUmVmcmVzaEF0dGVtcHQtMTtpLmdldExvZygpLmluZm8oIklmcmFtZSBpbml0aWFsaXphdGlvbiBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuZ2V0TG9nKCkuaW5mbygiVGltZSBhZnRlciBpZnJhbWUgaW5pdGlhbGl6YXRpb24gc3RhcnRlZCAiLmNvbmNhdChEYXRlLm5vdygpLWEpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuZ2V0TG9nKCkuaW5mbygiSWZyYW1lIHJlZnJlc2ggYXR0ZW1wdHMgIi5jb25jYXQoZSkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5wdWJsaXNoTWV0cmljKHtuYW1lOmcsZGF0YTp7Y291bnQ6ZX19KSxpLnB1Ymxpc2hNZXRyaWMoe25hbWU6dixkYXRhOntjb3VudDowfX0pLHMuZGlzYXN0ZXJSZWNvdmVyeU9uJiYoaS5wdWJsaXNoTWV0cmljKHtuYW1lOm0sZGF0YTp7Y291bnQ6ZX19KSxpLnB1Ymxpc2hNZXRyaWMoe25hbWU6eSxkYXRhOntjb3VudDowfX0pKSxhPW51bGx9fSkpLGkuY29yZS5zb2Z0cGhvbmVQYXJhbXM9cy5zb2Z0cGhvbmV9fSxpLmNvcmUuX29wZW5Qb3B1cFdpdGhMb2NrPWZ1bmN0aW9uKGUsdCl7dmFyIG89ImNvbm5lY3QtbG9naW4tcG9wdXAtbG9jayIrZTt0cnl7bmF2aWdhdG9yLmxvY2tzLnJlcXVlc3Qobyx7bW9kZToiZXhjbHVzaXZlIixpZkF2YWlsYWJsZTohMH0sZnVuY3Rpb24oKXt2YXIgbyxhPShvPW4oKS5tYXJrKChmdW5jdGlvbiByKG8pe3ZhciBhO3JldHVybiBuKCkud3JhcCgoZnVuY3Rpb24obil7Zm9yKDs7KXN3aXRjaChuLnByZXY9bi5uZXh0KXtjYXNlIDA6aWYobyl7bi5uZXh0PTM7YnJlYWt9cmV0dXJuIGkuZ2V0TG9nKCkuaW5mbygiUG9wdXAgYWxyZWFkeSBvcGVuZWQgYnkgYW5vdGhlciB0YWIuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLmFicnVwdCgicmV0dXJuIik7Y2FzZSAzOmkuZ2V0TG9nKCkuaW5mbygiT3BlbmluZyBwb3B1cCB3aW5kb3cgd2l0aCB3ZWJsb2NrLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5jb3JlLmxvZ2luV2luZG93PWkuY29yZS5nZXRQb3B1cE1hbmFnZXIoKS5vcGVuKGUsaS5NYXN0ZXJUb3BpY3MuTE9HSU5fUE9QVVAsdCksaS5jb3JlLl9zaG91bGRIb2xkUG9wdXBMb2NrPSEwLGE9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7dmFyIGU7KCFpLmNvcmUubG9naW5XaW5kb3d8fG51bGwhPT0oZT1pLmNvcmUubG9naW5XaW5kb3cpJiZ2b2lkIDAhPT1lJiZlLmNsb3NlZCkmJihjbGVhckludGVydmFsKGEpLGkuY29yZS5fc2hvdWxkSG9sZFBvcHVwTG9jaz0hMSxpLmdldExvZygpLmluZm8oIkNsZWFyZWQgY2hlY2sgcG9wdXAgaW50ZXJ2YWwuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9KSwxZTMpO2Nhc2UgNzppZighaS5jb3JlLl9zaG91bGRIb2xkUG9wdXBMb2NrKXtuLm5leHQ9MTI7YnJlYWt9cmV0dXJuIG4ubmV4dD0xMCxuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSl7cmV0dXJuIHNldFRpbWVvdXQoZSwxZTMpfSkpO2Nhc2UgMTA6bi5uZXh0PTc7YnJlYWs7Y2FzZSAxMjppLmdldExvZygpLmluZm8oIlJlbGVhc2luZyB3ZWJsb2NrIGZvciBvcGVuaW5nIGxvZ2luIHBvcHVwLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7Y2FzZSAxMzpjYXNlImVuZCI6cmV0dXJuIG4uc3RvcCgpfX0pLHIpfSkpLGZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWFyZ3VtZW50cztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4saSl7dmFyIGE9by5hcHBseShlLHQpO2Z1bmN0aW9uIHMoZSl7cihhLG4saSxzLGMsIm5leHQiLGUpfWZ1bmN0aW9uIGMoZSl7cihhLG4saSxzLGMsInRocm93IixlKX1zKHZvaWQgMCl9KSl9KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSl9Y2F0Y2gobil7aS5nZXRMb2coKS5lcnJvcigiRmFpbGVkIHRvIHVzZSB3ZWJsb2NrIHRvIG9wZW4gcG9wdXAuIFlvdXIgYnJvd3NlciBtYXkgYmUgb3V0IG9mIGRhdGUuIikud2l0aEV4Y2VwdGlvbihuKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkuY29yZS5sb2dpbldpbmRvd3x8KGkuY29yZS5sb2dpbldpbmRvdz1pLmNvcmUuZ2V0UG9wdXBNYW5hZ2VyKCkub3BlbihlLGkuTWFzdGVyVG9waWNzLkxPR0lOX1BPUFVQLHQpKX19LGkuY29yZS5vbklmcmFtZVJldHJpZXNFeGhhdXN0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGkuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZShpLkV2ZW50VHlwZS5JRlJBTUVfUkVUUklFU19FWEhBVVNURUQsZSl9LGkuY29yZS5fcmVmcmVzaElmcmFtZU9uVGltZW91dD1mdW5jdGlvbih0LG4scixvKXtpLmFzc2VydE5vdE51bGwodCwiaW5pdENDUFBhcmFtcyIpLGkuYXNzZXJ0Tm90TnVsbChuLCJjb250YWluZXJEaXYiKTt2YXIgYT1yfHxpLmNvcmUscz10LmNjcExvYWRUaW1lb3V0P3QuY2NwTG9hZFRpbWVvdXQ6dC5kaXNhc3RlclJlY292ZXJ5T24/MWU0OjVlMztlLmNsZWFyVGltZW91dChhLmlmcmFtZVJlZnJlc2hUaW1lb3V0KSxhLmlmcmFtZVJlZnJlc2hUaW1lb3V0PWUuc2V0VGltZW91dCgoZnVuY3Rpb24oKXthLmlmcmFtZVJlZnJlc2hBdHRlbXB0PShhLmlmcmFtZVJlZnJlc2hBdHRlbXB0fHwwKSsxLGEuaWZyYW1lUmVmcmVzaEF0dGVtcHQ8PTEwPyhpLmdldExvZygpLmluZm8oIlJlZnJlc2hpbmcgdGhlIENDUCBJRnJhbWUgZm9yICIuY29uY2F0KHQuY2NwVXJsLCIgb24gYXR0ZW1wdCAiKS5jb25jYXQoYS5pZnJhbWVSZWZyZXNoQXR0ZW1wdCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5jb3JlLl9yZXBsYWNlQ0NQSWZyYW1lKG4sdCxvKSxpLmNvcmUuX3JlZnJlc2hJZnJhbWVPblRpbWVvdXQodCxuLHIsbykpOihpLmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKGkuRXZlbnRUeXBlLklGUkFNRV9SRVRSSUVTX0VYSEFVU1RFRCxvKSxlLmNsZWFyVGltZW91dChhLmlmcmFtZVJlZnJlc2hUaW1lb3V0KSl9KSxzKX0saS5jb3JlLl9yZXBsYWNlQ0NQSWZyYW1lPWZ1bmN0aW9uKGUsdCxuKXt0cnl7dmFyIHI9aS5jb3JlLl9nZXRDQ1BJZnJhbWUobiksbz1udWxsO3ImJihvPXIuc3R5bGUsci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpKTt2YXIgYT1pLmNvcmUuX2NyZWF0ZUNDUElmcmFtZShlLHQsbik7byYmKGEuc3R5bGU9by5jc3NUZXh0KSxpLmNvcmUuZ2V0VXBzdHJlYW0oKWluc3RhbmNlb2YgaS5HUlByb3h5SWZyYW1lQ29uZHVpdD9pLmNvcmUudXBzdHJlYW0uZ2V0QWxsQ29uZHVpdHMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmlmcmFtZS5kYXRhc2V0LmlkZW50aWZpZXI9PT1uJiYoZS51cHN0cmVhbS5vdXRwdXQ9YS5jb250ZW50V2luZG93LGUuaWZyYW1lPWEpfSkpOmkuY29yZS5nZXRVcHN0cmVhbSgpLnVwc3RyZWFtLm91dHB1dD1hLmNvbnRlbnRXaW5kb3csaS5jb3JlLl9zZW5kSWZyYW1lU3R5bGVEYXRhVXBzdHJlYW1BZnRlclJlYXNvbmFibGVXYWl0VGltZShhLGkuY29yZS51cHN0cmVhbSl9Y2F0Y2goZSl7aS5nZXRMb2coKS5lcnJvcigiRXJyb3Igd2hpbGUgY2hlY2tpbmcgZm9yLCBhbmQgcmVjcmVhdGluZywgdGhlIENDUCBJRnJhbWUiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSxpLmNvcmUuX2dldENDUElmcmFtZT1mdW5jdGlvbihlKXt2YXIgdCxuPW8od2luZG93LmRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpZnJhbWUiKSk7dHJ5e2ZvcihuLnMoKTshKHQ9bi5uKCkpLmRvbmU7KXt2YXIgcixpPXQudmFsdWU7aWYoaS5uYW1lPT09YSYmKCFlfHwobnVsbD09PShyPWkuZGF0YXNldCl8fHZvaWQgMD09PXI/dm9pZCAwOnIuaWRlbnRpZmllcik9PT1lKSlyZXR1cm4gaX19Y2F0Y2goZSl7bi5lKGUpfWZpbmFsbHl7bi5mKCl9cmV0dXJuIG51bGx9LGkuY29yZS5fY3JlYXRlQ0NQSWZyYW1lPWZ1bmN0aW9uKGUsdCxuKXtpLmFzc2VydE5vdE51bGwodCwiaW5pdENDUFBhcmFtcyIpLGkuYXNzZXJ0Tm90TnVsbChlLCJjb250YWluZXJEaXYiKTt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpZnJhbWUiKTtyZXR1cm4gci5zcmM9dC5jY3BVcmwsci5hbGxvdz0ibWljcm9waG9uZTsgY2FtZXJhOyBhdXRvcGxheTsgY2xpcGJvYXJkLXdyaXRlOyBpZGVudGl0eS1jcmVkZW50aWFscy1nZXQiLHIuc3R5bGU9dC5zdHlsZXx8aS5jb3JlLmlmcmFtZVN0eWxlLHIudGl0bGU9dC5pZnJhbWVUaXRsZXx8YSxyLm5hbWU9YSxuJiYoci5kYXRhc2V0LmlkZW50aWZpZXI9biksaS5zdG9yYWdlQWNjZXNzLmNhblJlcXVlc3QoKSYmKHIuc3JjPWkuc3RvcmFnZUFjY2Vzcy5nZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybCgpLHIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsaS5zdG9yYWdlQWNjZXNzLnJlcXVlc3QpKSxlLmFwcGVuZENoaWxkKHIpLHJ9LGkuY29yZS5faGlkZUlmcmFtZT1mdW5jdGlvbihlKXtlLnN0eWxlPWkuY29yZS5pZnJhbWVTdHlsZSsiZGlzcGxheTogbm9uZTsifSxpLmNvcmUuX3Nob3dJZnJhbWU9ZnVuY3Rpb24oZSl7ZS5zdHlsZT1pLmNvcmUuaWZyYW1lU3R5bGV9LGkuY29yZS5fc2VuZElmcmFtZVN0eWxlRGF0YVVwc3RyZWFtQWZ0ZXJSZWFzb25hYmxlV2FpdFRpbWU9ZnVuY3Rpb24oZSx0KXtpLmFzc2VydE5vdE51bGwoZSwiaWZyYW1lIiksaS5hc3NlcnROb3ROdWxsKHQsImNvbmR1aXQiKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3ZhciBuPXtkaXNwbGF5OndpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUsbnVsbCkuZGlzcGxheSxvZmZzZXRXaWR0aDplLm9mZnNldFdpZHRoLG9mZnNldEhlaWdodDplLm9mZnNldEhlaWdodCxjbGllbnRSZWN0c0xlbmd0aDplLmdldENsaWVudFJlY3RzKCkubGVuZ3RofTt0LnNlbmRVcHN0cmVhbShpLkV2ZW50VHlwZS5JRlJBTUVfU1RZTEUsbil9KSwxZTQpfTt2YXIgaz1mdW5jdGlvbihlLHQsbixyKXt0aGlzLmNvbmR1aXQ9ZSx0aGlzLmV2ZW50QnVzPXQsdGhpcy5zeW5UaW1lb3V0PW4sdGhpcy5hY2tUaW1lb3V0PXIsdGhpcy5hY2tUaW1lcj1udWxsLHRoaXMuc3luVGltZXI9bnVsbCx0aGlzLmFja1N1Yj1udWxsfTtrLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5jb25kdWl0LnNlbmRVcHN0cmVhbShpLkV2ZW50VHlwZS5TWU5DSFJPTklaRSksdGhpcy5hY2tTdWI9dGhpcy5jb25kdWl0Lm9uVXBzdHJlYW0oaS5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKCl7dGhpcy51bnN1YnNjcmliZSgpLGUuY2xlYXJUaW1lb3V0KHQuYWNrVGltZXIpLHQuX2RlZmVyU3RhcnQoKX0pKSx0aGlzLmFja1RpbWVyPWUuc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0LmFja1N1Yi51bnN1YnNjcmliZSgpLGkuaXNBY3RpdmVDb25kdWl0KHQuY29uZHVpdCk/KGkuZ2V0TG9nKCkuaW5mbygiQUNLX1RJTUVPVVQgZXZlbnQgaXMgZGV0ZWN0ZWQgZnJvbSB0aGUgS2VlcGFsaXZlTWFuYWdlci4gIi5jb25jYXQodC5jb25kdWl0Lm5hbWUpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuZXZlbnRCdXMudHJpZ2dlcihpLkV2ZW50VHlwZS5BQ0tfVElNRU9VVCkpOmkuZ2V0TG9nKCkud2FybigiQUNLX1RJTUVPVVQgZXZlbnQgaXMgZGV0ZWN0ZWQgZnJvbSB0aGUgS2VlcGFsaXZlTWFuYWdlciBidXQgc3VwcHJlc3NlZCBhcyBpdCBpcyBmcm9tIGFuIGluYWN0aXZlIHJlZ2lvbi4gIi5jb25jYXQodC5jb25kdWl0Lm5hbWUpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuX2RlZmVyU3RhcnQoKX0pLHRoaXMuYWNrVGltZW91dCl9LGsucHJvdG90eXBlLl9kZWZlclN0YXJ0PWZ1bmN0aW9uKCl7dGhpcy5zeW5UaW1lcj1lLnNldFRpbWVvdXQoaS5oaXRjaCh0aGlzLHRoaXMuc3RhcnQpLHRoaXMuc3luVGltZW91dCl9LGsucHJvdG90eXBlLmRlZmVyU3RhcnQ9ZnVuY3Rpb24oKXtudWxsPT10aGlzLnN5blRpbWVyJiYodGhpcy5zeW5UaW1lcj1lLnNldFRpbWVvdXQoaS5oaXRjaCh0aGlzLHRoaXMuc3RhcnQpLHRoaXMuc3luVGltZW91dCkpfTt2YXIgTj1mdW5jdGlvbigpe3ZhciBlPXtpbml0RmFpbHVyZTpuZXcgU2V0LHN1YnNjcmlwdGlvblVwZGF0ZTpuZXcgU2V0LHN1YnNjcmlwdGlvbkZhaWx1cmU6bmV3IFNldCx0b3BpYzpuZXcgTWFwLGFsbE1lc3NhZ2U6bmV3IFNldCxjb25uZWN0aW9uR2FpbjpuZXcgU2V0LGNvbm5lY3Rpb25Mb3N0Om5ldyBTZXQsY29ubmVjdGlvbk9wZW46bmV3IFNldCxjb25uZWN0aW9uQ2xvc2U6bmV3IFNldH0sdD1mdW5jdGlvbihlLHQpe2UuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZSh0KX0pKX07aS5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbShpLldlYlNvY2tldEV2ZW50cy5JTklUX0ZBSUxVUkUsKGZ1bmN0aW9uKCl7dChlLmluaXRGYWlsdXJlKX0pKSxpLmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKGkuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fT1BFTiwoZnVuY3Rpb24obil7dChlLmNvbm5lY3Rpb25PcGVuLG4pfSkpLGkuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0oaS5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9DTE9TRSwoZnVuY3Rpb24obil7dChlLmNvbm5lY3Rpb25DbG9zZSxuKX0pKSxpLmNvcmUuZ2V0VXBzdHJlYW0oKS5vblVwc3RyZWFtKGkuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fR0FJTiwoZnVuY3Rpb24oKXt0KGUuY29ubmVjdGlvbkdhaW4pfSkpLGkuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0oaS5XZWJTb2NrZXRFdmVudHMuQ09OTkVDVElPTl9MT1NULChmdW5jdGlvbihuKXt0KGUuY29ubmVjdGlvbkxvc3Qsbil9KSksaS5jb3JlLmdldFVwc3RyZWFtKCkub25VcHN0cmVhbShpLldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJUFRJT05fVVBEQVRFLChmdW5jdGlvbihuKXt0KGUuc3Vic2NyaXB0aW9uVXBkYXRlLG4pfSkpLGkuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0oaS5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSVBUSU9OX0ZBSUxVUkUsKGZ1bmN0aW9uKG4pe3QoZS5zdWJzY3JpcHRpb25GYWlsdXJlLG4pfSkpLGkuY29yZS5nZXRVcHN0cmVhbSgpLm9uVXBzdHJlYW0oaS5XZWJTb2NrZXRFdmVudHMuQUxMX01FU1NBR0UsKGZ1bmN0aW9uKG4pe3QoZS5hbGxNZXNzYWdlLG4pLGUudG9waWMuaGFzKG4udG9waWMpJiZ0KGUudG9waWMuZ2V0KG4udG9waWMpLG4pfSkpLHRoaXMuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24oZSl7aS5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKGkuV2ViU29ja2V0RXZlbnRzLlNFTkQsZSl9LHRoaXMub25Jbml0RmFpbHVyZT1mdW5jdGlvbih0KXtyZXR1cm4gaS5hc3NlcnRUcnVlKGkuaXNGdW5jdGlvbih0KSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuaW5pdEZhaWx1cmUuYWRkKHQpLGZ1bmN0aW9uKCl7cmV0dXJuIGUuaW5pdEZhaWx1cmUuZGVsZXRlKHQpfX0sdGhpcy5vbkNvbm5lY3Rpb25PcGVuPWZ1bmN0aW9uKHQpe3JldHVybiBpLmFzc2VydFRydWUoaS5pc0Z1bmN0aW9uKHQpLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5jb25uZWN0aW9uT3Blbi5hZGQodCksZnVuY3Rpb24oKXtyZXR1cm4gZS5jb25uZWN0aW9uT3Blbi5kZWxldGUodCl9fSx0aGlzLm9uQ29ubmVjdGlvbkNsb3NlPWZ1bmN0aW9uKHQpe3JldHVybiBpLmFzc2VydFRydWUoaS5pc0Z1bmN0aW9uKHQpLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5jb25uZWN0aW9uQ2xvc2UuYWRkKHQpLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29ubmVjdGlvbkNsb3NlLmRlbGV0ZSh0KX19LHRoaXMub25Db25uZWN0aW9uR2Fpbj1mdW5jdGlvbih0KXtyZXR1cm4gaS5hc3NlcnRUcnVlKGkuaXNGdW5jdGlvbih0KSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUuY29ubmVjdGlvbkdhaW4uYWRkKHQpLGZ1bmN0aW9uKCl7cmV0dXJuIGUuY29ubmVjdGlvbkdhaW4uZGVsZXRlKHQpfX0sdGhpcy5vbkNvbm5lY3Rpb25Mb3N0PWZ1bmN0aW9uKHQpe3JldHVybiBpLmFzc2VydFRydWUoaS5pc0Z1bmN0aW9uKHQpLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5jb25uZWN0aW9uTG9zdC5hZGQodCksZnVuY3Rpb24oKXtyZXR1cm4gZS5jb25uZWN0aW9uTG9zdC5kZWxldGUodCl9fSx0aGlzLm9uU3Vic2NyaXB0aW9uVXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBpLmFzc2VydFRydWUoaS5pc0Z1bmN0aW9uKHQpLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5zdWJzY3JpcHRpb25VcGRhdGUuYWRkKHQpLGZ1bmN0aW9uKCl7cmV0dXJuIGUuc3Vic2NyaXB0aW9uVXBkYXRlLmRlbGV0ZSh0KX19LHRoaXMub25TdWJzY3JpcHRpb25GYWlsdXJlPWZ1bmN0aW9uKHQpe3JldHVybiBpLmFzc2VydFRydWUoaS5pc0Z1bmN0aW9uKHQpLCJtZXRob2QgbXVzdCBiZSBhIGZ1bmN0aW9uIiksZS5zdWJzY3JpcHRpb25GYWlsdXJlLmFkZCh0KSxmdW5jdGlvbigpe3JldHVybiBlLnN1YnNjcmlwdGlvbkZhaWx1cmUuZGVsZXRlKHQpfX0sdGhpcy5zdWJzY3JpYmVUb3BpY3M9ZnVuY3Rpb24oZSl7aS5hc3NlcnROb3ROdWxsKGUsInRvcGljcyIpLGkuYXNzZXJ0VHJ1ZShpLmlzQXJyYXkoZSksInRvcGljcyBtdXN0IGJlIGEgYXJyYXkiKSxpLmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0oaS5XZWJTb2NrZXRFdmVudHMuU1VCU0NSSUJFLGUpfSx0aGlzLm9uTWVzc2FnZT1mdW5jdGlvbih0LG4pe3JldHVybiBpLmFzc2VydE5vdE51bGwodCwidG9waWNOYW1lIiksaS5hc3NlcnRUcnVlKGkuaXNGdW5jdGlvbihuKSwibWV0aG9kIG11c3QgYmUgYSBmdW5jdGlvbiIpLGUudG9waWMuaGFzKHQpP2UudG9waWMuZ2V0KHQpLmFkZChuKTplLnRvcGljLnNldCh0LG5ldyBTZXQoW25dKSksZnVuY3Rpb24oKXtyZXR1cm4gZS50b3BpYy5nZXQodCkuZGVsZXRlKG4pfX0sdGhpcy5vbkFsbE1lc3NhZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGkuYXNzZXJ0VHJ1ZShpLmlzRnVuY3Rpb24odCksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxlLmFsbE1lc3NhZ2UuYWRkKHQpLGZ1bmN0aW9uKCl7cmV0dXJuIGUuYWxsTWVzc2FnZS5kZWxldGUodCl9fX0sUD1mdW5jdGlvbihlKXt0aGlzLmJ1cz1lLHRoaXMuYWdlbnRVcGRhdGVTdWJzY3JpYmVyPXRoaXMuYnVzLnN1YnNjcmliZShpLkFnZW50RXZlbnRzLlVQREFURSxpLmhpdGNoKHRoaXMsdGhpcy51cGRhdGVBZ2VudERhdGEpKX07UC5wcm90b3R5cGUudXBkYXRlQWdlbnREYXRhPWZ1bmN0aW9uKGUpe3ZhciB0LG49dGhpcy5hZ2VudERhdGE7dGhpcy5hZ2VudERhdGE9ZTt0cnl7dmFyIHI9RGF0ZS5wYXJzZShlLnNuYXBzaG90LnNuYXBzaG90VGltZXN0YW1wKTtpZighbnx8ciE9PURhdGUucGFyc2Uobi5zbmFwc2hvdC5zbmFwc2hvdFRpbWVzdGFtcCkpe3ZhciBvPShuZXcgRGF0ZSkuZ2V0VGltZSgpLXI7RCgiU25hcHNob3RSZWNlaXZlZEJ5Q2xpZW50IixvLHtDb250ZW50TGVuZ3RoSW5CeXRlczppLmNvcmUuX2NhbGN1bGF0ZVNuYXBzaG90U2l6aW5nQnVja2V0KGUuc25hcHNob3QpLElzQ0NQTGF5ZXI6aS5pc0NDUCgpfSl9fWNhdGNoKGUpe2kuZ2V0TG9nKCkuZXJyb3IoIltNZXRyaWNzXSBGYWlsZWQgdG8gc2VuZCBtZXRyaWNzLiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1udWxsIT09KHQ9aS5hZ2VudCkmJnZvaWQgMCE9PXQmJnQuaW5pdGlhbGl6ZWR8fChpLmFnZW50LmluaXRpYWxpemVkPSEwLHRoaXMuYnVzLnRyaWdnZXIoaS5BZ2VudEV2ZW50cy5JTklULG5ldyBpLkFnZW50KSksdGhpcy5idXMudHJpZ2dlcihpLkFnZW50RXZlbnRzLlJFRlJFU0gsbmV3IGkuQWdlbnQpLHRoaXMuX2ZpcmVBZ2VudFVwZGF0ZUV2ZW50cyhuKX0sUC5wcm90b3R5cGUuZ2V0QWdlbnREYXRhPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5hZ2VudERhdGEpdGhyb3cgbmV3IGkuU3RhdGVFcnJvcigiTm8gYWdlbnQgZGF0YSBpcyBhdmFpbGFibGUgeWV0ISIpO3JldHVybiB0aGlzLmFnZW50RGF0YX0sUC5wcm90b3R5cGUuZ2V0Q29udGFjdERhdGE9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXRBZ2VudERhdGEoKSxuPWkuZmluZCh0LnNuYXBzaG90LmNvbnRhY3RzLChmdW5jdGlvbih0KXtyZXR1cm4gdC5jb250YWN0SWQ9PT1lfSkpO2lmKG51bGw9PW4pdGhyb3cgbmV3IGkuU3RhdGVFcnJvcigiQ29udGFjdCAlcyBubyBsb25nZXIgZXhpc3RzLiIsZSk7cmV0dXJuIG59LFAucHJvdG90eXBlLmdldENvbm5lY3Rpb25EYXRhPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRDb250YWN0RGF0YShlKSxyPWkuZmluZChuLmNvbm5lY3Rpb25zLChmdW5jdGlvbihlKXtyZXR1cm4gZS5jb25uZWN0aW9uSWQ9PT10fSkpO2lmKG51bGw9PXIpdGhyb3cgbmV3IGkuU3RhdGVFcnJvcigiQ29ubmVjdGlvbiAlcyBmb3IgY29udGFjdCAlcyBubyBsb25nZXIgZXhpc3RzLiIsdCxlKTtyZXR1cm4gcn0sUC5wcm90b3R5cGUuZ2V0SW5zdGFuY2VJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEFnZW50RGF0YSgpLmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVJZC5tYXRjaCgvaW5zdGFuY2VcLyhbMC05YS1mQS1GfC1dKylcLy8pWzFdfSxQLnByb3RvdHlwZS5nZXRBV1NBY2NvdW50SWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRBZ2VudERhdGEoKS5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLnJvdXRpbmdQcm9maWxlSWQubWF0Y2goLzooWzAtOV0rKTppbnN0YW5jZS8pWzFdfSxQLnByb3RvdHlwZS5fZGlmZkNvbnRhY3RzPWZ1bmN0aW9uKGUpe3ZhciB0PXthZGRlZDp7fSxyZW1vdmVkOnt9LGNvbW1vbjp7fSxvbGRNYXA6aS5pbmRleChudWxsPT1lP1tdOmUuc25hcHNob3QuY29udGFjdHMsKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbnRhY3RJZH0pKSxuZXdNYXA6aS5pbmRleCh0aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5jb250YWN0cywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFjdElkfSkpLGVuZFRpbWU6MH07cmV0dXJuIGkua2V5cyh0Lm9sZE1hcCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7aS5jb250YWlucyh0Lm5ld01hcCxlKT90LmNvbW1vbltlXT10Lm5ld01hcFtlXTp0LnJlbW92ZWRbZV09dC5vbGRNYXBbZV19KSksaS5rZXlzKHQubmV3TWFwKS5mb3JFYWNoKChmdW5jdGlvbihlKXtpLmNvbnRhaW5zKHQub2xkTWFwLGUpfHwodC5hZGRlZFtlXT10Lm5ld01hcFtlXSl9KSksdC5lbmRUaW1lPXBlcmZvcm1hbmNlLm5vdygpLHR9LFAucHJvdG90eXBlLl9maXJlQWdlbnRVcGRhdGVFdmVudHM9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPW51bGwscj1udWxsPT1lP2kuQWdlbnRBdmFpbFN0YXRlcy5JTklUOmUuc25hcHNob3Quc3RhdGUubmFtZSxvPXRoaXMuYWdlbnREYXRhLnNuYXBzaG90LnN0YXRlLm5hbWUsYT1udWxsPT1lP2kuQWdlbnRTdGF0ZVR5cGUuSU5JVDplLnNuYXBzaG90LnN0YXRlLnR5cGUscz10aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5zdGF0ZS50eXBlO2EhPT1zJiZpLmNvcmUuZ2V0QWdlbnRSb3V0aW5nRXZlbnRHcmFwaCgpLmdldEFzc29jaWF0aW9ucyh0aGlzLGEscykuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5idXMudHJpZ2dlcihlLG5ldyBpLkFnZW50KX0pKSxyIT09byYmKHRoaXMuYnVzLnRyaWdnZXIoaS5BZ2VudEV2ZW50cy5TVEFURV9DSEFOR0Use2FnZW50Om5ldyBpLkFnZW50LG9sZFN0YXRlOnIsbmV3U3RhdGU6b30pLGkuY29yZS5nZXRBZ2VudFN0YXRlRXZlbnRHcmFwaCgpLmdldEFzc29jaWF0aW9ucyh0aGlzLHIsbykuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5idXMudHJpZ2dlcihlLG5ldyBpLkFnZW50KX0pKSk7dmFyIGM9ZSYmZS5zbmFwc2hvdC5uZXh0U3RhdGU/ZS5zbmFwc2hvdC5uZXh0U3RhdGUubmFtZTpudWxsLHU9dGhpcy5hZ2VudERhdGEuc25hcHNob3QubmV4dFN0YXRlP3RoaXMuYWdlbnREYXRhLnNuYXBzaG90Lm5leHRTdGF0ZS5uYW1lOm51bGw7YyE9PXUmJnUmJnQuYnVzLnRyaWdnZXIoaS5BZ2VudEV2ZW50cy5FTlFVRVVFRF9ORVhUX1NUQVRFLG5ldyBpLkFnZW50KTt2YXIgbD1wZXJmb3JtYW5jZS5ub3coKTtuPW51bGwhPT1lP3RoaXMuX2RpZmZDb250YWN0cyhlKTp7YWRkZWQ6aS5pbmRleCh0aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5jb250YWN0cywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFjdElkfSkpLHJlbW92ZWQ6e30sY29tbW9uOnt9LG9sZE1hcDp7fSxuZXdNYXA6aS5pbmRleCh0aGlzLmFnZW50RGF0YS5zbmFwc2hvdC5jb250YWN0cywoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY29udGFjdElkfSkpLGVuZFRpbWU6cGVyZm9ybWFuY2Uubm93KCl9O3ZhciBwPXBlcmZvcm1hbmNlLm5vdygpO2kudmFsdWVzKG4uYWRkZWQpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuYnVzLnRyaWdnZXIoaS5Db250YWN0RXZlbnRzLklOSVQsbmV3IGkuQ29udGFjdChlLmNvbnRhY3RJZCkpLHQuX2ZpcmVDb250YWN0VXBkYXRlRXZlbnRzKGUuY29udGFjdElkLGkuQ29udGFjdFN0YXRlVHlwZS5JTklULGUuc3RhdGUudHlwZSl9KSksaS52YWx1ZXMobi5yZW1vdmVkKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0LmJ1cy50cmlnZ2VyKGkuQ29udGFjdEV2ZW50cy5ERVNUUk9ZRUQsbmV3IGkuQ29udGFjdFNuYXBzaG90KGUpKSx0LmJ1cy50cmlnZ2VyKGkuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKGkuQ29udGFjdEV2ZW50cy5ERVNUUk9ZRUQsZS5jb250YWN0SWQpLG5ldyBpLkNvbnRhY3RTbmFwc2hvdChlKSksdC5fdW5zdWJBbGxDb250YWN0RXZlbnRzRm9yQ29udGFjdChlLmNvbnRhY3RJZCl9KSksaS5rZXlzKG4uY29tbW9uKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0Ll9maXJlQ29udGFjdFVwZGF0ZUV2ZW50cyhlLG4ub2xkTWFwW2VdLnN0YXRlLnR5cGUsbi5uZXdNYXBbZV0uc3RhdGUudHlwZSl9KSk7dmFyIGQ9cGVyZm9ybWFuY2Uubm93KCksZj17Q29udGVudExlbmd0aEluQnl0ZXM6aS5jb3JlLl9jYWxjdWxhdGVTbmFwc2hvdFNpemluZ0J1Y2tldCh0aGlzLmFnZW50RGF0YS5zbmFwc2hvdCksSXNDQ1BMYXllcjppLmlzQ0NQKCl9O3RyeXtEKCJTbmFwc2hvdENvbXBhcmlzb25TdGVwVGltZSIsbi5lbmRUaW1lLWwsZiksRCgiU25hcHNob3RFdmVudFRyaWdnZXJTdGVwVGltZSIsZC1wLGYpLEQoIlNuYXBzaG90VG90YWxQcm9jZXNzaW5nVGltZSIsZC1sLGYpfWNhdGNoKGUpe2kuZ2V0TG9nKCkuZXJyb3IoIltNZXRyaWNzXSBGYWlsZWQgdG8gc2VuZCBtZXRyaWNzLiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19O3ZhciBEPWZ1bmN0aW9uKGUsdCxuKXtpLnB1Ymxpc2hNZXRyaWMoe25hbWU6ZSxkYXRhOntsYXRlbmN5OnQsb3B0aW9uYWxEaW1lbnNpb25zOm59fSl9O2kuY29yZS5fY2FsY3VsYXRlU25hcHNob3RTaXppbmdCdWNrZXQ9ZnVuY3Rpb24oZSl7aWYoZSYmZS5oYXNPd25Qcm9wZXJ0eSgiY29udGVudExlbmd0aCIpKWZvcih2YXIgbj1wYXJzZUludChlLmNvbnRlbnRMZW5ndGgpLHI9MCxvPU9iamVjdC5rZXlzKEUpO3I8by5sZW5ndGg7cisrKXt2YXIgaT1vW3JdLGE9dChFW2ldLDIpLHM9YVswXSxjPWFbMV07aWYobj49cyYmbjw9YylyZXR1cm4gaX1yZXR1cm4idW5kZWZpbmVkIn0sUC5wcm90b3R5cGUuX2ZpcmVDb250YWN0VXBkYXRlRXZlbnRzPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzO3QhPT1uJiZpLmNvcmUuZ2V0Q29udGFjdEV2ZW50R3JhcGgoKS5nZXRBc3NvY2lhdGlvbnModGhpcyx0LG4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe3IuYnVzLnRyaWdnZXIodCxuZXcgaS5Db250YWN0KGUpKSxyLmJ1cy50cmlnZ2VyKGkuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKHQsZSksbmV3IGkuQ29udGFjdChlKSl9KSksci5idXMudHJpZ2dlcihpLkNvbnRhY3RFdmVudHMuUkVGUkVTSCxuZXcgaS5Db250YWN0KGUpKSxyLmJ1cy50cmlnZ2VyKGkuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKGkuQ29udGFjdEV2ZW50cy5SRUZSRVNILGUpLG5ldyBpLkNvbnRhY3QoZSkpfSxQLnByb3RvdHlwZS5fdW5zdWJBbGxDb250YWN0RXZlbnRzRm9yQ29udGFjdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2kudmFsdWVzKGkuQ29udGFjdEV2ZW50cykuZm9yRWFjaCgoZnVuY3Rpb24obil7dC5idXMuZ2V0U3Vic2NyaXB0aW9ucyhpLmNvcmUuZ2V0Q29udGFjdEV2ZW50TmFtZShuLGUpKS5tYXAoKGZ1bmN0aW9uKGUpe2UudW5zdWJzY3JpYmUoKX0pKX0pKX0sUC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuYWdlbnRVcGRhdGVTdWJzY3JpYmVyLnVuc3Vic2NyaWJlKCl9LGkuY29yZS5vblZpZXdDb250YWN0PWZ1bmN0aW9uKGUpe3JldHVybiBpLmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUoaS5Db250YWN0RXZlbnRzLlZJRVcsZSl9LGkuY29yZS52aWV3Q29udGFjdD1mdW5jdGlvbihlKXtpLmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0oaS5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDppLkNvbnRhY3RFdmVudHMuVklFVyxkYXRhOntjb250YWN0SWQ6ZX19KX0saS5jb3JlLm9uQWN0aXZhdGVDaGFubmVsV2l0aFZpZXdUeXBlPWZ1bmN0aW9uKGUpe3JldHVybiBpLmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUoaS5DaGFubmVsVmlld0V2ZW50cy5BQ1RJVkFURV9DSEFOTkVMX1dJVEhfVklFV19UWVBFLGUpfSxpLmNvcmUuYWN0aXZhdGVDaGFubmVsV2l0aFZpZXdUeXBlPWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXt2aWV3VHlwZTplLG1lZGlhVHlwZTp0fTtuJiYoby5zb3VyY2U9biksciYmKG8uY2FzZUlkPXIpLGkuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbShpLkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OmkuQ2hhbm5lbFZpZXdFdmVudHMuQUNUSVZBVEVfQ0hBTk5FTF9XSVRIX1ZJRVdfVFlQRSxkYXRhOm99KX0saS5jb3JlLnRyaWdnZXJUYXNrQ3JlYXRlZD1mdW5jdGlvbihlKXtpLmNvcmUuZ2V0VXBzdHJlYW0oKS51cHN0cmVhbUJ1cy50cmlnZ2VyKGkuVGFza0V2ZW50cy5DUkVBVEVELGUpfSxpLmNvcmUub25BY2Nlc3NEZW5pZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGkuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZShpLkV2ZW50VHlwZS5BQ0NFU1NfREVOSUVELGUpfSxpLmNvcmUub25BdXRoRmFpbD1mdW5jdGlvbihlKXtyZXR1cm4gaS5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKGkuRXZlbnRUeXBlLkFVVEhfRkFJTCxlKX0saS5jb3JlLm9uQXV0aG9yaXplU3VjY2Vzcz1mdW5jdGlvbihlKXtyZXR1cm4gaS5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKGkuRXZlbnRUeXBlLkFVVEhPUklaRV9TVUNDRVNTLGUpfSxpLmNvcmUuX2hhbmRsZUF1dGhvcml6ZVN1Y2Nlc3M9ZnVuY3Rpb24oKXt3aW5kb3cuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShpLlNlc3Npb25TdG9yYWdlS2V5cy5BVVRIT1JJWkVfUkVUUllfQ09VTlQsMCl9LGkuY29yZS5faGFuZGxlQXV0aEZhaWw9ZnVuY3Rpb24oZSx0LG4pe24mJm4uYXV0aG9yaXplP2kuY29yZS5faGFuZGxlQXV0aG9yaXplRmFpbChlKTppLmNvcmUuX2hhbmRsZUNUSUF1dGhGYWlsKHQpfSxpLmNvcmUuX2hhbmRsZUF1dGhvcml6ZUZhaWw9ZnVuY3Rpb24oZSl7dmFyIHQ9aS5jb3JlLl9nZXRBdXRoUmV0cnlDb3VudCgpO2lmKCFpLmNvcmUuYXV0aG9yaXplVGltZW91dElkKWlmKHQ8aS5jb3JlLk1BWF9BVVRIT1JJWkVfUkVUUllfQ09VTlRfRk9SX1NFU1NJT04pe2kuY29yZS5faW5jcmVtZW50QXV0aFJldHJ5Q291bnQoKTt2YXIgbj1BV1MudXRpbC5jYWxjdWxhdGVSZXRyeURlbGF5KHQrMXx8MCx7YmFzZToyZTN9KTtpLmNvcmUuYXV0aG9yaXplVGltZW91dElkPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aS5jb3JlLl9yZWRpcmVjdFRvTG9naW4oZSl9KSxuKX1lbHNlIGkuZ2V0TG9nKCkud2FybigiV2UgaGF2ZSBleGhhdXN0ZWQgb3VyIGF1dGhvcml6YXRpb24gcmV0cmllcyBkdWUgdG8gNDAxcyBmcm9tIHRoZSBhdXRob3JpemUgYXBpLiBObyBtb3JlIHJldHJpZXMgd2lsbCBiZSBhdHRlbXB0ZWQgaW4gdGhpcyBzZXNzaW9uIHVudGlsIHRoZSBhdXRob3JpemUgYXBpIHJldHVybnMgMjAwLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcihpLkV2ZW50VHlwZS5BVVRIT1JJWkVfUkVUUklFU19FWEhBVVNURUQpfSxpLmNvcmUuX3JlZGlyZWN0VG9Mb2dpbj1mdW5jdGlvbihlKXsic3RyaW5nIj09dHlwZW9mIGU/bG9jYXRpb24uYXNzaWduKGUpOmxvY2F0aW9uLnJlbG9hZCgpfSxpLmNvcmUuX2hhbmRsZUNUSUF1dGhGYWlsPWZ1bmN0aW9uKGUpe2lmKCFpLmNvcmUuY3RpVGltZW91dElkKWlmKGkuY29yZS5jdGlBdXRoUmV0cnlDb3VudDxpLmNvcmUuTUFYX0NUSV9BVVRIX1JFVFJZX0NPVU5UKXtpLmNvcmUuY3RpQXV0aFJldHJ5Q291bnQrKzt2YXIgdD1BV1MudXRpbC5jYWxjdWxhdGVSZXRyeURlbGF5KGkuY29yZS5jdGlBdXRoUmV0cnlDb3VudHx8MCx7YmFzZTo1MDB9KTtpLmNvcmUuY3RpVGltZW91dElkPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aS5jb3JlLmF1dGhvcml6ZShlKS50aGVuKGkuY29yZS5fdHJpZ2dlckF1dGhvcml6ZVN1Y2Nlc3MuYmluZChpLmNvcmUpKS5jYXRjaChpLmNvcmUuX3RyaWdnZXJBdXRoRmFpbC5iaW5kKGkuY29yZSx7YXV0aG9yaXplOiEwfSkpLGkuY29yZS5jdGlUaW1lb3V0SWQ9bnVsbH0pLHQpfWVsc2UgaS5nZXRMb2coKS53YXJuKCJXZSBoYXZlIGV4aGF1c3RlZCBvdXIgYXV0aG9yaXphdGlvbiByZXRyaWVzIGR1ZSB0byA0MDFzIGZyb20gdGhlIENUSSBzZXJ2aWNlLiBObyBtb3JlIHJldHJpZXMgd2lsbCBiZSBhdHRlbXB0ZWQgdW50aWwgdGhlIHBhZ2UgaXMgcmVmcmVzaGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaS5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcihpLkV2ZW50VHlwZS5DVElfQVVUSE9SSVpFX1JFVFJJRVNfRVhIQVVTVEVEKX0saS5jb3JlLl90cmlnZ2VyQXV0aG9yaXplU3VjY2Vzcz1mdW5jdGlvbigpe2kuY29yZS5nZXRVcHN0cmVhbSgpLnVwc3RyZWFtQnVzLnRyaWdnZXIoaS5FdmVudFR5cGUuQVVUSE9SSVpFX1NVQ0NFU1MpfSxpLmNvcmUuX3RyaWdnZXJBdXRoRmFpbD1mdW5jdGlvbihlKXtpLmNvcmUuZ2V0VXBzdHJlYW0oKS51cHN0cmVhbUJ1cy50cmlnZ2VyKGkuRXZlbnRUeXBlLkFVVEhfRkFJTCxlKX0saS5jb3JlLl9nZXRBdXRoUmV0cnlDb3VudD1mdW5jdGlvbigpe3ZhciBlPXdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGkuU2Vzc2lvblN0b3JhZ2VLZXlzLkFVVEhPUklaRV9SRVRSWV9DT1VOVCk7aWYobnVsbCE9PWUpe2lmKGlzTmFOKHBhcnNlSW50KGUpKSl0aHJvdyBuZXcgaS5TdGF0ZUVycm9yKCJUaGUgc2Vzc2lvbiBzdG9yYWdlIHZhbHVlIGZvciBhdXRoIHJldHJ5IGNvdW50IHdhcyBOYU4iKTtyZXR1cm4gcGFyc2VJbnQoZSl9cmV0dXJuIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGkuU2Vzc2lvblN0b3JhZ2VLZXlzLkFVVEhPUklaRV9SRVRSWV9DT1VOVCwwKSwwfSxpLmNvcmUuX2luY3JlbWVudEF1dGhSZXRyeUNvdW50PWZ1bmN0aW9uKCl7d2luZG93LnNlc3Npb25TdG9yYWdlLnNldEl0ZW0oaS5TZXNzaW9uU3RvcmFnZUtleXMuQVVUSE9SSVpFX1JFVFJZX0NPVU5ULChpLmNvcmUuX2dldEF1dGhSZXRyeUNvdW50KCkrMSkudG9TdHJpbmcoKSl9LGkuY29yZS5vbkF1dGhvcml6ZVJldHJpZXNFeGhhdXN0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGkuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZShpLkV2ZW50VHlwZS5BVVRIT1JJWkVfUkVUUklFU19FWEhBVVNURUQsZSl9LGkuY29yZS5vbkNUSUF1dGhvcml6ZVJldHJpZXNFeGhhdXN0ZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGkuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZShpLkV2ZW50VHlwZS5DVElfQVVUSE9SSVpFX1JFVFJJRVNfRVhIQVVTVEVELGUpfSxpLmNvcmUub25Tb2Z0cGhvbmVTZXNzaW9uSW5pdD1mdW5jdGlvbihlKXtyZXR1cm4gaS5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKGkuQ29ubmVjdGlvbkV2ZW50cy5TRVNTSU9OX0lOSVQsZSl9LGkuY29yZS5vbkNvbmZpZ3VyZT1mdW5jdGlvbihlKXtyZXR1cm4gaS5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKGkuQ29uZmlndXJhdGlvbkV2ZW50cy5DT05GSUdVUkUsZSl9LGkuY29yZS5vbkluaXRpYWxpemVkPWZ1bmN0aW9uKGUpe3JldHVybiBpLmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUoaS5FdmVudFR5cGUuSU5JVCxlKX0saS5jb3JlLmdldENvbnRhY3RFdmVudE5hbWU9ZnVuY3Rpb24oZSx0KXtpZihpLmFzc2VydE5vdE51bGwoZSwiZXZlbnROYW1lIiksaS5hc3NlcnROb3ROdWxsKHQsImNvbnRhY3RJZCIpLCFpLmNvbnRhaW5zKGkudmFsdWVzKGkuQ29udGFjdEV2ZW50cyksZSkpdGhyb3cgbmV3IGkuVmFsdWVFcnJvcigiJXMgaXMgbm90IGEgdmFsaWQgY29udGFjdCBldmVudC4iLGUpO3JldHVybiBpLnNwcmludGYoIiVzOjolcyIsZSx0KX0saS5jb3JlLmdldEV2ZW50QnVzPWZ1bmN0aW9uKCl7cmV0dXJuIGkuY29yZS5ldmVudEJ1c30saS5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gaS5jb3JlLndlYlNvY2tldFByb3ZpZGVyfSxpLmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm4gaS5jb3JlLmFnZW50RGF0YVByb3ZpZGVyfSxpLmNvcmUuZ2V0TG9jYWxUaW1lc3RhbXA9ZnVuY3Rpb24oKXtyZXR1cm4gaS5jb3JlLmdldEFnZW50RGF0YVByb3ZpZGVyKCkuZ2V0QWdlbnREYXRhKCkuc25hcHNob3QubG9jYWxUaW1lc3RhbXB9LGkuY29yZS5nZXRTa2V3PWZ1bmN0aW9uKCl7cmV0dXJuIGkuY29yZS5nZXRBZ2VudERhdGFQcm92aWRlcigpLmdldEFnZW50RGF0YSgpLnNuYXBzaG90LnNrZXd9LGkuY29yZS5nZXRBZ2VudFJvdXRpbmdFdmVudEdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIGkuY29yZS5hZ2VudFJvdXRpbmdFdmVudEdyYXBofSxpLmNvcmUuYWdlbnRSb3V0aW5nRXZlbnRHcmFwaD0obmV3IGkuRXZlbnRHcmFwaCkuYXNzb2MoaS5FdmVudEdyYXBoLkFOWSxpLkFnZW50U3RhdGVUeXBlLlJPVVRBQkxFLGkuQWdlbnRFdmVudHMuUk9VVEFCTEUpLmFzc29jKGkuRXZlbnRHcmFwaC5BTlksaS5BZ2VudFN0YXRlVHlwZS5OT1RfUk9VVEFCTEUsaS5BZ2VudEV2ZW50cy5OT1RfUk9VVEFCTEUpLmFzc29jKGkuRXZlbnRHcmFwaC5BTlksaS5BZ2VudFN0YXRlVHlwZS5PRkZMSU5FLGkuQWdlbnRFdmVudHMuT0ZGTElORSksaS5jb3JlLmdldEFnZW50U3RhdGVFdmVudEdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIGkuY29yZS5hZ2VudFN0YXRlRXZlbnRHcmFwaH0saS5jb3JlLmFnZW50U3RhdGVFdmVudEdyYXBoPShuZXcgaS5FdmVudEdyYXBoKS5hc3NvYyhpLkV2ZW50R3JhcGguQU5ZLGkudmFsdWVzKGkuQWdlbnRFcnJvclN0YXRlcyksaS5BZ2VudEV2ZW50cy5FUlJPUikuYXNzb2MoaS5FdmVudEdyYXBoLkFOWSxpLkFnZW50QXZhaWxTdGF0ZXMuQUZURVJfQ0FMTF9XT1JLLGkuQWdlbnRFdmVudHMuQUNXKSxpLmNvcmUuZ2V0Q29udGFjdEV2ZW50R3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gaS5jb3JlLmNvbnRhY3RFdmVudEdyYXBofSxpLmNvcmUuY29udGFjdEV2ZW50R3JhcGg9KG5ldyBpLkV2ZW50R3JhcGgpLmFzc29jKGkuRXZlbnRHcmFwaC5BTlksaS5Db250YWN0U3RhdGVUeXBlLklOQ09NSU5HLGkuQ29udGFjdEV2ZW50cy5JTkNPTUlORykuYXNzb2MoaS5FdmVudEdyYXBoLkFOWSxpLkNvbnRhY3RTdGF0ZVR5cGUuUEVORElORyxpLkNvbnRhY3RFdmVudHMuUEVORElORykuYXNzb2MoaS5FdmVudEdyYXBoLkFOWSxpLkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVElORyxpLkNvbnRhY3RFdmVudHMuQ09OTkVDVElORykuYXNzb2MoaS5FdmVudEdyYXBoLkFOWSxpLkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVEVELGkuQ29udGFjdEV2ZW50cy5DT05ORUNURUQpLmFzc29jKGkuQ29udGFjdFN0YXRlVHlwZS5DT05ORUNUSU5HLGkuQ29udGFjdFN0YXRlVHlwZS5FUlJPUixpLkNvbnRhY3RFdmVudHMuTUlTU0VEKS5hc3NvYyhpLkNvbnRhY3RTdGF0ZVR5cGUuSU5DT01JTkcsaS5Db250YWN0U3RhdGVUeXBlLkVSUk9SLGkuQ29udGFjdEV2ZW50cy5NSVNTRUQpLmFzc29jKGkuRXZlbnRHcmFwaC5BTlksaS5Db250YWN0U3RhdGVUeXBlLkVOREVELGkuQ29udGFjdEV2ZW50cy5BQ1cpLmFzc29jKGkudmFsdWVzKGkuQ09OVEFDVF9BQ1RJVkVfU1RBVEVTKSxpLnZhbHVlcyhpLnJlbGF0aXZlQ29tcGxlbWVudChpLkNPTlRBQ1RfQUNUSVZFX1NUQVRFUyxpLkNvbnRhY3RTdGF0ZVR5cGUpKSxpLkNvbnRhY3RFdmVudHMuRU5ERUQpLmFzc29jKGkuRXZlbnRHcmFwaC5BTlksaS5Db250YWN0U3RhdGVUeXBlLkVSUk9SLGkuQ29udGFjdEV2ZW50cy5FUlJPUikuYXNzb2MoaS5Db250YWN0U3RhdGVUeXBlLkNPTk5FQ1RJTkcsaS5Db250YWN0U3RhdGVUeXBlLk1JU1NFRCxpLkNvbnRhY3RFdmVudHMuTUlTU0VEKS5hc3NvYyhpLkNvbnRhY3RTdGF0ZVR5cGUuSU5DT01JTkcsaS5Db250YWN0U3RhdGVUeXBlLk1JU1NFRCxpLkNvbnRhY3RFdmVudHMuTUlTU0VEKS5hc3NvYyhpLkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVElORyxpLkNvbnRhY3RTdGF0ZVR5cGUuUkVKRUNURUQsaS5Db250YWN0RXZlbnRzLk1JU1NFRCkuYXNzb2MoaS5Db250YWN0U3RhdGVUeXBlLklOQ09NSU5HLGkuQ29udGFjdFN0YXRlVHlwZS5SRUpFQ1RFRCxpLkNvbnRhY3RFdmVudHMuTUlTU0VEKSxpLmNvcmUuZ2V0Q2xpZW50PWZ1bmN0aW9uKCl7aWYoIWkuY29yZS5jbGllbnQpdGhyb3cgbmV3IGkuU3RhdGVFcnJvcigiVGhlIGNvbm5lY3QgY29yZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhIik7cmV0dXJuIGkuY29yZS5jbGllbnR9LGkuY29yZS5jbGllbnQ9bnVsbCxpLmNvcmUuZ2V0QXBpUHJveHlDbGllbnQ9ZnVuY3Rpb24oKXtpZighaS5jb3JlLmFwaVByb3h5Q2xpZW50KXRocm93IG5ldyBpLlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IGFwaVByb3h5IENsaWVudCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQhIik7cmV0dXJuIGkuY29yZS5hcGlQcm94eUNsaWVudH0saS5jb3JlLmFwaVByb3h5Q2xpZW50PW51bGwsaS5jb3JlLmdldEFnZW50QXBwQ2xpZW50PWZ1bmN0aW9uKCl7aWYoIWkuY29yZS5hZ2VudEFwcENsaWVudCl0aHJvdyBuZXcgaS5TdGF0ZUVycm9yKCJUaGUgY29ubmVjdCBBZ2VudEFwcCBDbGllbnQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkISIpO3JldHVybiBpLmNvcmUuYWdlbnRBcHBDbGllbnR9LGkuY29yZS5hZ2VudEFwcENsaWVudD1udWxsLGkuY29yZS5nZXRUYXNrVGVtcGxhdGVzQ2xpZW50PWZ1bmN0aW9uKCl7aWYoIWkuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50KXRocm93IG5ldyBpLlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IFRhc2tUZW1wbGF0ZXMgQ2xpZW50IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCEiKTtyZXR1cm4gaS5jb3JlLnRhc2tUZW1wbGF0ZXNDbGllbnR9LGkuY29yZS50YXNrVGVtcGxhdGVzQ2xpZW50PW51bGwsaS5jb3JlLmdldE1hc3RlckNsaWVudD1mdW5jdGlvbigpe2lmKCFpLmNvcmUubWFzdGVyQ2xpZW50KXRocm93IG5ldyBpLlN0YXRlRXJyb3IoIlRoZSBjb25uZWN0IG1hc3RlciBjbGllbnQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkISIpO3JldHVybiBpLmNvcmUubWFzdGVyQ2xpZW50fSxpLmNvcmUubWFzdGVyQ2xpZW50PW51bGwsaS5jb3JlLmdldFNvZnRwaG9uZU1hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gaS5jb3JlLnNvZnRwaG9uZU1hbmFnZXJ9LGkuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyPW51bGwsaS5jb3JlLmdldE5vdGlmaWNhdGlvbk1hbmFnZXI9ZnVuY3Rpb24oKXtyZXR1cm4gaS5jb3JlLm5vdGlmaWNhdGlvbk1hbmFnZXJ8fChpLmNvcmUubm90aWZpY2F0aW9uTWFuYWdlcj1uZXcgaS5Ob3RpZmljYXRpb25NYW5hZ2VyKSxpLmNvcmUubm90aWZpY2F0aW9uTWFuYWdlcn0saS5jb3JlLm5vdGlmaWNhdGlvbk1hbmFnZXI9bnVsbCxpLmNvcmUuZ2V0UG9wdXBNYW5hZ2VyPWZ1bmN0aW9uKCl7cmV0dXJuIGkuY29yZS5wb3B1cE1hbmFnZXJ9LGkuY29yZS5wb3B1cE1hbmFnZXI9bmV3IGkuUG9wdXBNYW5hZ2VyLGkuY29yZS5nZXRVcHN0cmVhbT1mdW5jdGlvbigpe2lmKCFpLmNvcmUudXBzdHJlYW0pdGhyb3cgbmV3IGkuU3RhdGVFcnJvcigiVGhlcmUgaXMgbm8gdXBzdHJlYW0gY29uZHVpdCEiKTtyZXR1cm4gaS5jb3JlLnVwc3RyZWFtfSxpLmNvcmUudXBzdHJlYW09bnVsbCxpLmdsb2JhbFJlc2lsaWVuY3kub25GYWlsb3ZlclBlbmRpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuIGkuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZShpLkdsb2JhbFJlc2lsaWVuY3lFdmVudHMuRkFJTE9WRVJfUEVORElOR19DUk0sZSl9LGkuZ2xvYmFsUmVzaWxpZW5jeS5vbkZhaWxvdmVyQ29tcGxldGVkPWZ1bmN0aW9uKGUpe3JldHVybiBpLmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUoaS5HbG9iYWxSZXNpbGllbmN5RXZlbnRzLkZBSUxPVkVSX0NPTVBMRVRFLGUpfSxpLmdsb2JhbFJlc2lsaWVuY3kub25Db25maWd1cmVFcnJvcj1mdW5jdGlvbihlKXtyZXR1cm4gaS5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKGkuR2xvYmFsUmVzaWxpZW5jeUV2ZW50cy5DT05GSUdVUkVfRVJST1IsZSl9LGkuZ2xvYmFsUmVzaWxpZW5jeS5nZXRBY3RpdmVSZWdpb249ZnVuY3Rpb24oKXtyZXR1cm4gaS5nbG9iYWxSZXNpbGllbmN5Ll9hY3RpdmVSZWdpb259LGkuY29yZS5BZ2VudERhdGFQcm92aWRlcj1QLGkuV2ViU29ja2V0UHJvdmlkZXI9TixpLktlZXBhbGl2ZU1hbmFnZXI9a30oKX0sNTQ3OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQ7dmFyIG49Ijw8YWxsPj4iLHI9dC5tYWtlRW51bShbImFja25vd2xlZGdlIiwiYWNrX3RpbWVvdXQiLCJpbml0IiwiYXBpX3JlcXVlc3QiLCJhcGlfcmVzcG9uc2UiLCJhdXRoX2ZhaWwiLCJhY2Nlc3NfZGVuaWVkIiwiY2xvc2UiLCJjb25maWd1cmUiLCJsb2ciLCJkb3dubG9hZF9sb2dfZnJvbV9jY3AiLCJtYXN0ZXJfcmVxdWVzdCIsIm1hc3Rlcl9yZXNwb25zZSIsInN5bmNocm9uaXplIiwidGVybWluYXRlIiwidGVybWluYXRlZCIsInNlbmRfbG9ncyIsInJlbG9hZF9hZ2VudF9jb25maWd1cmF0aW9uIiwiYnJvYWRjYXN0IiwiYXBpX21ldHJpYyIsImNsaWVudF9tZXRyaWMiLCJzb2Z0cGhvbmVfc3RhdHMiLCJzb2Z0cGhvbmVfcmVwb3J0IiwiY2xpZW50X3NpZGVfbG9ncyIsInNlcnZlcl9ib3VuZF9pbnRlcm5hbF9sb2ciLCJtdXRlIiwiaWZyYW1lX3N0eWxlIiwiaWZyYW1lX3JldHJpZXNfZXhoYXVzdGVkIiwidXBkYXRlX2Nvbm5lY3RlZF9jY3BzIiwib3V0ZXJfY29udGV4dF9pbmZvIiwibWVkaWFfZGV2aWNlX3JlcXVlc3QiLCJtZWRpYV9kZXZpY2VfcmVzcG9uc2UiLCJ0YWJfaWQiLCJhdXRob3JpemVfc3VjY2VzcyIsImF1dGhvcml6ZV9yZXRyaWVzX2V4aGF1c3RlZCIsImN0aV9hdXRob3JpemVfcmV0cmllc19leGhhdXN0ZWQiLCJjbGlja19zdHJlYW1fZGF0YSIsInNldF9xdWlja19nZXRfYWdlbnRfc25hcHNob3RfZmxhZyIsImFwaV9wcm94eV9yZXF1ZXN0IiwiYXBpX3Byb3h5X3Jlc3BvbnNlIl0pLG89dC5tYWtlTmFtZXNwYWNlZEVudW0oImNvbm5lY3QiLFsibG9naW5Qb3B1cCIsInNlbmRMb2dzIiwic29mdHBob25lIiwicmluZ3RvbmUiLCJtZXRyaWNzIiwiZmFpbG92ZXIiXSksaT10Lm1ha2VOYW1lc3BhY2VkRW51bSgiYWdlbnQiLFsiaW5pdCIsInVwZGF0ZSIsInJlZnJlc2giLCJyb3V0YWJsZSIsIm5vdF9yb3V0YWJsZSIsInBlbmRpbmciLCJjb250YWN0X3BlbmRpbmciLCJvZmZsaW5lIiwiZXJyb3IiLCJzb2Z0cGhvbmVfZXJyb3IiLCJ3ZWJzb2NrZXRfY29ubmVjdGlvbl9sb3N0Iiwid2Vic29ja2V0X2Nvbm5lY3Rpb25fZ2FpbmVkIiwic3RhdGVfY2hhbmdlIiwiYWN3IiwibXV0ZV90b2dnbGUiLCJsb2NhbF9tZWRpYV9zdHJlYW1fY3JlYXRlZCIsImVucXVldWVkX25leHRfc3RhdGUiLCJmZXRjaF9hZ2VudF9kYXRhX2Zyb21fY2NwIl0pLGE9dC5tYWtlTmFtZXNwYWNlZEVudW0oIndlYlNvY2tldCIsWyJpbml0X2ZhaWx1cmUiLCJjb25uZWN0aW9uX29wZW4iLCJjb25uZWN0aW9uX2Nsb3NlIiwiY29ubmVjdGlvbl9lcnJvciIsImNvbm5lY3Rpb25fZ2FpbiIsImNvbm5lY3Rpb25fbG9zdCIsInN1YnNjcmlwdGlvbl91cGRhdGUiLCJzdWJzY3JpcHRpb25fZmFpbHVyZSIsImFsbF9tZXNzYWdlIiwic2VuZCIsInN1YnNjcmliZSJdKSxzPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJjb250YWN0IixbImluaXQiLCJyZWZyZXNoIiwiZGVzdHJveWVkIiwiaW5jb21pbmciLCJwZW5kaW5nIiwiY29ubmVjdGluZyIsImNvbm5lY3RlZCIsIm1pc3NlZCIsImFjdyIsInZpZXciLCJlbmRlZCIsImVycm9yIiwiYWNjZXB0ZWQiLCJpbnZhbGlkX3N0YXRlX3RyYW5zaXRpb24iLCJzY3JlZW5fc2hhcmluZ19zdGFydGVkIiwic2NyZWVuX3NoYXJpbmdfc3RvcHBlZCIsInNjcmVlbl9zaGFyaW5nX2Vycm9yIl0pLGM9dC5tYWtlTmFtZXNwYWNlZEVudW0oInRhc2tMaXN0IixbImFjdGl2YXRlX2NoYW5uZWxfd2l0aF92aWV3X3R5cGUiXSksdT10Lm1ha2VOYW1lc3BhY2VkRW51bSgidGFzayIsWyJjcmVhdGVkIl0pLGw9dC5tYWtlTmFtZXNwYWNlZEVudW0oImNvbm5lY3Rpb24iLFsic2Vzc2lvbl9pbml0IiwicmVhZHlfdG9fc3RhcnRfc2Vzc2lvbiJdKSxwPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJjb25maWd1cmF0aW9uIixbImNvbmZpZ3VyZSIsInNldF9zcGVha2VyX2RldmljZSIsInNldF9taWNyb3Bob25lX2RldmljZSIsInNldF9yaW5nZXJfZGV2aWNlIiwic3BlYWtlcl9kZXZpY2VfY2hhbmdlZCIsIm1pY3JvcGhvbmVfZGV2aWNlX2NoYW5nZWQiLCJyaW5nZXJfZGV2aWNlX2NoYW5nZWQiLCJjYW1lcmFfZGV2aWNlX2NoYW5nZWQiLCJiYWNrZ3JvdW5kX2JsdXJfY2hhbmdlZCJdKSxkPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJkaXNhc3RlclJlY292ZXJ5IixbInN1cHByZXNzIiwiZm9yY2Vfb2ZmbGluZSIsInNldF9vZmZsaW5lIiwiaW5pdF9kaXNhc3Rlcl9yZWNvdmVyeSIsImZhaWxvdmVyIiwiZmFpbG92ZXJfcGVuZGluZyIsImluaXRfZHJfcG9sbGluZyJdKSxmPXQubWFrZU5hbWVzcGFjZWRFbnVtKCJnbG9iYWxSZXNpbGllbmN5IixbImNvbmZpZ3VyZSIsImNvbmZpZ3VyZV9jY3BfY29uZHVpdCIsImluaXQiLCJjb25maWd1cmVfZXJyb3IiLCJmYWlsb3Zlcl9pbml0aWF0ZWQiLCJmYWlsb3Zlcl9wZW5kaW5nIiwiZmFpbG92ZXJfcGVuZGluZ19jcm0iLCJmYWlsb3Zlcl9jb21wbGV0ZSIsImhlYXJ0YmVhdF9zeW4iLCJoZWFydGJlYXRfYWNrIl0pLGg9dC5tYWtlTmFtZXNwYWNlZEVudW0oInZvaWNlSWQiLFsidXBkYXRlX2RvbWFpbl9pZCJdKSxnPWZ1bmN0aW9uKCl7fTtnLmNyZWF0ZVJlcXVlc3Q9ZnVuY3Rpb24oZSxuLHIpe3JldHVybntldmVudDplLHJlcXVlc3RJZDp0LnJhbmRvbUlkKCksbWV0aG9kOm4scGFyYW1zOnJ9fSxnLmNyZWF0ZVJlc3BvbnNlPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybntldmVudDplLHJlcXVlc3RJZDp0LnJlcXVlc3RJZCxkYXRhOm4sZXJyOnJ8fG51bGx9fTt2YXIgbT1mdW5jdGlvbihlLG4scil7dGhpcy5zdWJNYXA9ZSx0aGlzLmlkPXQucmFuZG9tSWQoKSx0aGlzLmV2ZW50TmFtZT1uLHRoaXMuZj1yfTttLnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbigpe3RoaXMuc3ViTWFwLnVuc3Vic2NyaWJlKHRoaXMuZXZlbnROYW1lLHRoaXMuaWQpfTt2YXIgdj1mdW5jdGlvbigpe3RoaXMuc3ViSWRNYXA9e30sdGhpcy5zdWJFdmVudE5hbWVNYXA9e319O3YucHJvdG90eXBlLnN1YnNjcmliZT1mdW5jdGlvbihlLHQpe3ZhciBuPW5ldyBtKHRoaXMsZSx0KTt0aGlzLnN1YklkTWFwW24uaWRdPW47dmFyIHI9dGhpcy5zdWJFdmVudE5hbWVNYXBbZV18fFtdO3JldHVybiByLnB1c2gobiksdGhpcy5zdWJFdmVudE5hbWVNYXBbZV09cixufSx2LnByb3RvdHlwZS51bnN1YnNjcmliZT1mdW5jdGlvbihlLG4pe3QuY29udGFpbnModGhpcy5zdWJFdmVudE5hbWVNYXAsZSkmJih0aGlzLnN1YkV2ZW50TmFtZU1hcFtlXT10aGlzLnN1YkV2ZW50TmFtZU1hcFtlXS5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlkIT09bn0pKSx0aGlzLnN1YkV2ZW50TmFtZU1hcFtlXS5sZW5ndGg8MSYmZGVsZXRlIHRoaXMuc3ViRXZlbnROYW1lTWFwW2VdKSx0LmNvbnRhaW5zKHRoaXMuc3ViSWRNYXAsbikmJmRlbGV0ZSB0aGlzLnN1YklkTWFwW25dfSx2LnByb3RvdHlwZS5nZXRBbGxTdWJzY3JpcHRpb25zPWZ1bmN0aW9uKCl7cmV0dXJuIHQudmFsdWVzKHRoaXMuc3ViRXZlbnROYW1lTWFwKS5yZWR1Y2UoKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uY2F0KHQpfSksW10pfSx2LnByb3RvdHlwZS5nZXRTdWJzY3JpcHRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnN1YkV2ZW50TmFtZU1hcFtlXXx8W119O3ZhciB5PWZ1bmN0aW9uKGUpe3ZhciB0PWV8fHt9O3RoaXMuc3ViTWFwPW5ldyB2LHRoaXMubG9nRXZlbnRzPXQubG9nRXZlbnRzfHwhMX07eS5wcm90b3R5cGUuc3Vic2NyaWJlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0LmFzc2VydE5vdE51bGwobiwiZiIpLHQuYXNzZXJ0VHJ1ZSh0LmlzRnVuY3Rpb24obiksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy5zdWJNYXAuc3Vic2NyaWJlKGUsbil9LHkucHJvdG90eXBlLnN1YnNjcmliZUFsbD1mdW5jdGlvbihlKXtyZXR1cm4gdC5hc3NlcnROb3ROdWxsKGUsImYiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKGUpLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMuc3ViTWFwLnN1YnNjcmliZShuLGUpfSx5LnByb3RvdHlwZS5nZXRTdWJzY3JpcHRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnN1Yk1hcC5nZXRTdWJzY3JpcHRpb25zKGUpfSx5LnByb3RvdHlwZS50cmlnZ2VyPWZ1bmN0aW9uKGUscil7dC5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpO3ZhciBvPXRoaXMsaT10aGlzLnN1Yk1hcC5nZXRTdWJzY3JpcHRpb25zKG4pLGE9dGhpcy5zdWJNYXAuZ2V0U3Vic2NyaXB0aW9ucyhlKTt0aGlzLmxvZ0V2ZW50cyYmZSE9PXQuRXZlbnRUeXBlLkxPRyYmZSE9PXQuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSYmZSE9PXQuRXZlbnRUeXBlLkFQSV9NRVRSSUMmJmUhPT10LkV2ZW50VHlwZS5TRVJWRVJfQk9VTkRfSU5URVJOQUxfTE9HJiZ0LmdldExvZygpLnRyYWNlKCJQdWJsaXNoaW5nIGV2ZW50OiAlcyIsZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlLnN0YXJ0c1dpdGgodC5Db250YWN0RXZlbnRzLkFDQ0VQVEVEKSYmciYmci5jb250YWN0SWQmJiEociBpbnN0YW5jZW9mIHQuQ29udGFjdCkmJihyPW5ldyB0LkNvbnRhY3Qoci5jb250YWN0SWQpKSxpLmNvbmNhdChhKS5mb3JFYWNoKChmdW5jdGlvbihuKXt0cnl7bi5mKHJ8fG51bGwsZSxvKX1jYXRjaChuKXt0LmdldExvZygpLmVycm9yKCInJXMnIGV2ZW50IGhhbmRsZXIgZmFpbGVkLiIsZSkud2l0aEV4Y2VwdGlvbihuKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pKX0seS5wcm90b3R5cGUuYnJpZGdlPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyZXR1cm4gZnVuY3Rpb24odCxuKXtlLnRyaWdnZXIobix0KX19LHkucHJvdG90eXBlLnVuc3Vic2NyaWJlQWxsPWZ1bmN0aW9uKCl7dGhpcy5zdWJNYXAuZ2V0QWxsU3Vic2NyaXB0aW9ucygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2UudW5zdWJzY3JpYmUoKX0pKX0sdC5FdmVudEJ1cz15LHQuRXZlbnRGYWN0b3J5PWcsdC5FdmVudFR5cGU9cix0LkFnZW50RXZlbnRzPWksdC5Db25maWd1cmF0aW9uRXZlbnRzPXAsdC5Db25uZWN0aW9uRXZlbnRzPWwsdC5Db25ubmVjdGlvbkV2ZW50cz1sLHQuQ29udGFjdEV2ZW50cz1zLHQuQ2hhbm5lbFZpZXdFdmVudHM9Yyx0LlRhc2tFdmVudHM9dSx0LlZvaWNlSWRFdmVudHM9aCx0LldlYlNvY2tldEV2ZW50cz1hLHQuTWFzdGVyVG9waWNzPW8sdC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzPWQsdC5HbG9iYWxSZXNpbGllbmN5RXZlbnRzPWZ9KCl9LDI4MTooKT0+e2Z1bmN0aW9uIGUodCl7cmV0dXJuIGU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9LGUodCl9ZnVuY3Rpb24gdChlLHQpe3ZhciBuPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKHI9ci5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCkuZW51bWVyYWJsZX0pKSksbi5wdXNoLmFwcGx5KG4scil9cmV0dXJuIG59ZnVuY3Rpb24gbihlKXtmb3IodmFyIG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXt2YXIgbz1udWxsIT1hcmd1bWVudHNbbl0/YXJndW1lbnRzW25dOnt9O24lMj90KE9iamVjdChvKSwhMCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cihlLHQsb1t0XSl9KSk6T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnM/T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhvKSk6dChPYmplY3QobykpLmZvckVhY2goKGZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvLHQpKX0pKX1yZXR1cm4gZX1mdW5jdGlvbiByKHQsbixyKXtyZXR1cm4obj1mdW5jdGlvbih0KXt2YXIgbj1mdW5jdGlvbih0LG4pe2lmKCJvYmplY3QiIT09ZSh0KXx8bnVsbD09PXQpcmV0dXJuIHQ7dmFyIHI9dFtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PXIpe3ZhciBvPXIuY2FsbCh0LG58fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPT1lKG8pKXJldHVybiBvO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKCJzdHJpbmciPT09bj9TdHJpbmc6TnVtYmVyKSh0KX0odCwic3RyaW5nIik7cmV0dXJuInN5bWJvbCI9PT1lKG4pP246U3RyaW5nKG4pfShuKSlpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG4se3ZhbHVlOnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W25dPXIsdH0hZnVuY3Rpb24oKXt2YXIgdD10aGlzfHxnbG9iYWxUaGlzLHI9dC5jb25uZWN0fHx7fTt0LmNvbm5lY3Q9cjt2YXIgbz0iSWZyYW1lUmVmcmVzaEF0dGVtcHRzIixpPSJJZnJhbWVJbml0aWFsaXphdGlvblN1Y2Nlc3MiO3IuZ2xvYmFsUmVzaWxpZW5jeS5fZG93bmxvYWRDQ1BMb2dzPWZ1bmN0aW9uKCl7ci5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcihyLkV2ZW50VHlwZS5ET1dOTE9BRF9MT0dfRlJPTV9DQ1ApfSxyLmdsb2JhbFJlc2lsaWVuY3kuX2luaXRpYWxpemVBY3RpdmVSZWdpb249ZnVuY3Rpb24oZSx0KXt0cnl7dmFyIG87bnVsbD09PShvPXIuY29yZS5hZ2VudERhdGFQcm92aWRlcil8fHZvaWQgMD09PW98fG8uZGVzdHJveSgpLHIuY29yZS5hZ2VudERhdGFQcm92aWRlcj1uZXcgci5jb3JlLkFnZW50RGF0YVByb3ZpZGVyKHIuY29yZS5nZXRFdmVudEJ1cygpKSxlLmdldEFjdGl2ZUNvbmR1aXQoKS5zZW5kVXBzdHJlYW0oci5BZ2VudEV2ZW50cy5GRVRDSF9BR0VOVF9EQVRBX0ZST01fQ0NQKX1jYXRjaChlKXtyLmdldExvZygpLmVycm9yKCJbR1JdIFRoZXJlIHdhcyBhbiBlcnJvciByZWluaXRpYWxpemluZyB0aGUgYWdlbnQgZGF0YSBwcm92aWRlci4iKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5wdWJsaXNoTWV0cmljKHtuYW1lOiJHbG9iYWxSZXNpbGllbmN5U3dpdGNoUmVnaW9uQWdlbnREYXRhUHJvdmlkZXJGYWlsdXJlIixkYXRhOntjb3VudDoxfX0pfXIuY29yZS5rZWVwYWxpdmVNYW5hZ2VyPWUuZ2V0QWN0aXZlQ29uZHVpdCgpLmtlZXBhbGl2ZU1hbmFnZXIsci5jb3JlLmNsaWVudD1uZXcgci5VcHN0cmVhbUNvbmR1aXRDbGllbnQoZS5nZXRBY3RpdmVDb25kdWl0KCkpLHIuY29yZS5tYXN0ZXJDbGllbnQ9bmV3IHIuVXBzdHJlYW1Db25kdWl0TWFzdGVyQ2xpZW50KGUuZ2V0QWN0aXZlQ29uZHVpdCgpKSxyLmNvcmUubWVkaWFGYWN0b3J5PW5ldyByLk1lZGlhRmFjdG9yeShuKG4oe30sci5nbG9iYWxSZXNpbGllbmN5LnBhcmFtcykse30se2NjcFVybDplLmdldEFjdGl2ZUNvbmR1aXQoKS5uYW1lfSkpO3RyeXt2YXIgaTtudWxsIT09KGk9ci5jb3JlKSYmdm9pZCAwIT09aSYmaS5zb2Z0cGhvbmVNYW5hZ2VyP3IuY29yZS5fYWxsb3dTb2Z0cGhvbmVQZXJzaXN0ZW50Q29ubmVjdGlvbj8oci5nZXRMb2coKS5pbmZvKCJbR1JdIFJlZnJlc2hpbmcgc29mdHBob25lIG1hbmFnZXIgUlRDIHBlZXIgY29ubmVjdGlvbiBtYW5hZ2VyLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5jb3JlLnNvZnRwaG9uZU1hbmFnZXIuX2luaXRpYXRlUnRjUGVlckNvbm5lY3Rpb25NYW5hZ2VyKCkpOihyLmdldExvZygpLmluZm8oIltHUl0gUmVmcmVzaGluZyBzb2Z0cGhvbmUgbWFuYWdlciBSVEMgcGVlciBjb25uZWN0aW9uIGZhY3RvcnkuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLmNvcmUuc29mdHBob25lTWFuYWdlci5fcmVmcmVzaFJ0Y1BlZXJDb25uZWN0aW9uRmFjdG9yeSgpKTpyLmdldExvZygpLmluZm8oIltHUl0gU29mdHBob25lIG1hbmFnZXIgbm90IGluaXRpYWxpemVkIG9yIG5vdCB1c2VkLCBub3QgcmVmcmVzaGluZyBzb2Z0cGhvbmUgbWFuYWdlci4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWNhdGNoKGUpe3IuZ2V0TG9nKCkuZXJyb3IoIltHUl0gVGhlcmUgd2FzIGFuIGVycm9yIHJlZnJlc2hpbmcgdGhlIHNvZnRwaG9uZSBtYW5hZ2VyLiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLnB1Ymxpc2hNZXRyaWMoe25hbWU6Ikdsb2JhbFJlc2lsaWVuY3lTd2l0Y2hSZWdpb25XZWJSVENGYWlsdXJlIixkYXRhOntjb3VudDoxfX0pfXQmJihyLmdsb2JhbFJlc2lsaWVuY3kuX2FjdGl2ZVJlZ2lvbj10LHIuQ2hhdFNlc3Npb24/ci5DaGF0U2Vzc2lvbi5zZXRSZWdpb25PdmVycmlkZT8oci5nZXRMb2coKS5pbmZvKCJbR1JdIFVwZGF0aW5nIENoYXRKUyByZWdpb24gdG8gIi5jb25jYXQodCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5DaGF0U2Vzc2lvbi5zZXRSZWdpb25PdmVycmlkZSh0KSk6ci5nZXRMb2coKS53YXJuKCJbR1JdIENoYXRKUyBwcmVzZW50LCBidXQgc2V0UmVnaW9uT3ZlcnJpZGUgbm90IGZvdW5kLiBDb25zaWRlciB1cGRhdGluZyB0byBsYXRlc3QgQ2hhdEpTIHZlcnNpb24iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOnIuZ2V0TG9nKCkuaW5mbygiW0dSXSBDaGF0SlMgbm90IHByZXNlbnQsIG5vdCB1cGRhdGluZyBDaGF0U2Vzc2lvbiByZWdpb24uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSksZS5nZXRBY3RpdmVDb25kdWl0KCkuc2VuZFVwc3RyZWFtKHIuR2xvYmFsUmVzaWxpZW5jeUV2ZW50cy5DT05GSUdVUkVfQ0NQX0NPTkRVSVQse2luc3RhbmNlU3RhdGU6ImFjdGl2ZSJ9KSxlLmdldEluYWN0aXZlQ29uZHVpdCgpLnNlbmRVcHN0cmVhbShyLkdsb2JhbFJlc2lsaWVuY3lFdmVudHMuQ09ORklHVVJFX0NDUF9DT05EVUlULHtpbnN0YW5jZVN0YXRlOiJpbmFjdGl2ZSJ9KTt0cnl7ci5jb3JlLl9zaG93SWZyYW1lKGUuZ2V0QWN0aXZlQ29uZHVpdCgpLmlmcmFtZSksci5jb3JlLl9oaWRlSWZyYW1lKGUuZ2V0SW5hY3RpdmVDb25kdWl0KCkuaWZyYW1lKX1jYXRjaChlKXtyLmdldExvZygpLmVycm9yKCJbR1JdIFRoZXJlIHdhcyBhbiBlcnJvciB1cGRhdGluZyB0aGUgSUZyYW1lIHZpc2liaWxpdHkuIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIucHVibGlzaE1ldHJpYyh7bmFtZToiR2xvYmFsUmVzaWxpZW5jeVN3aXRjaFJlZ2lvbklGcmFtZVN3YXBGYWlsdXJlIixkYXRhOntjb3VudDoxfX0pfX0sci5nbG9iYWxSZXNpbGllbmN5Ll9zd2l0Y2hBY3RpdmVSZWdpb249ZnVuY3Rpb24odCxuKXt2YXIgbyxpLGEscyxjO2lmKCEodCBpbnN0YW5jZW9mIHIuR1JQcm94eUlmcmFtZUNvbmR1aXQpKXJldHVybiByLmdldExvZygpLmVycm9yKCJbR1JdIFRyaWVkIHRvIHN3aXRjaCBvdmVyIGFjdGl2ZSByZWdpb24sIGJ1dCBwcm94eSBjb25kdWl0IHdhcyBub3Qgb2YgZXhwZWN0ZWQgdHlwZS4iKS53aXRoT2JqZWN0KHt0eXBlOmUodCl9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLCExO3ZhciB1PXQuZ2V0Q29uZHVpdEJ5TmFtZShuKTtyZXR1cm4gdSBpbnN0YW5jZW9mIHIuSUZyYW1lQ29uZHVpdD90LmdldEFjdGl2ZUNvbmR1aXQoKS5uYW1lPT09dS5uYW1lJiZyLmdsb2JhbFJlc2lsaWVuY3kuX2FjdGl2ZVJlZ2lvbj09PXUucmVnaW9uPyhyLmdldExvZygpLmluZm8oIltHUl0gTm90IHN3aXRjaGluZyBvdmVyIGFjdGl2ZSByZWdpb24gYXMgd2UgYXJlIGFscmVhZHkgb24gYWN0aXZlIHJlZ2lvbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLCExKTooci5nZXRMb2coKS5pbmZvKCJbR1JdIFN3aXRjaGluZyBhY3RpdmUgcmVnaW9uIGZyb20gIi5jb25jYXQobnVsbD09PShvPXQuZ2V0QWN0aXZlQ29uZHVpdCgpKXx8dm9pZCAwPT09bz92b2lkIDA6by5yZWdpb24sIiAvICIpLmNvbmNhdChudWxsPT09KGk9dC5nZXRBY3RpdmVDb25kdWl0KCkpfHx2b2lkIDA9PT1pP3ZvaWQgMDppLm5hbWUsIiB0byAiKS5jb25jYXQobnVsbD09dT92b2lkIDA6dS5yZWdpb24sIiAvICIpLmNvbmNhdChudWxsPT11P3ZvaWQgMDp1Lm5hbWUpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG51bGw9PT0oYT1yLmNvcmUpfHx2b2lkIDA9PT1hfHxudWxsPT09KGE9YS5zb2Z0cGhvbmVNYW5hZ2VyKXx8dm9pZCAwPT09YXx8YS5fY2xlYXJBbGxTZXNzaW9ucygpLHQuc2V0QWN0aXZlQ29uZHVpdCh1Lm5hbWUpLHIuZ2xvYmFsUmVzaWxpZW5jeS5faW5pdGlhbGl6ZUFjdGl2ZVJlZ2lvbih0LHUucmVnaW9uKSxyLmdldExvZygpLmluZm8oIltHUl0gU3dpdGNoZWQgYWN0aXZlIHJlZ2lvbiB0byAiLmNvbmNhdChudWxsPT09KHM9dC5nZXRBY3RpdmVDb25kdWl0KCkpfHx2b2lkIDA9PT1zP3ZvaWQgMDpzLnJlZ2lvbiwiIC8gIikuY29uY2F0KG51bGw9PT0oYz10LmdldEFjdGl2ZUNvbmR1aXQoKSl8fHZvaWQgMD09PWM/dm9pZCAwOmMubmFtZSkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5wdWJsaXNoTWV0cmljKHtuYW1lOiJDYWxsZWRJbnRlcm5hbFN3aXRjaEFjdGl2ZVJlZ2lvblN1Y2Nlc3NmdWwiLGRhdGE6e2NvdW50OjF9fSksITApOihyLmdldExvZygpLmVycm9yKCJbR1JdIFRyaWVkIHRvIHN3aXRjaCBvdmVyIGFjdGl2ZSByZWdpb24sIGJ1dCBjb25kdWl0IG5hbWUgd2FzIGludmFsaWQiKS53aXRoT2JqZWN0KHtuZXdBY3RpdmVDb25kdWl0TmFtZTpufSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSwhMSl9LHIuZ2xvYmFsUmVzaWxpZW5jeS5pbml0R1JDQ1A9ZnVuY3Rpb24oZSxhKXt2YXIgcz1uKG4oe30sYSkse30se2xvZ2luT3B0aW9uczp7bGVnYWN5QXV0aEZsb3c6ITB9fSk7ci5nbG9iYWxSZXNpbGllbmN5LnBhcmFtcz1zO3ZhciBjLHUsbCxwPXt9LGQ9ITE7aWYoci5nbG9iYWxSZXNpbGllbmN5Ll9hY3RpdmVSZWdpb249bnVsbCxyLmdsb2JhbFJlc2lsaWVuY3kuZ2xvYmFsUmVzaWxpZW5jeUVuYWJsZWQ9ITAsci5jb3JlLmNoZWNrTm90SW5pdGlhbGl6ZWQoKSwhci5jb3JlLmluaXRpYWxpemVkKXtyLmdldExvZygpLmluZm8oIltHUl0gSWZyYW1lIGluaXRpYWxpemF0aW9uIHN0YXJ0ZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO3ZhciBmPURhdGUubm93KCk7ci5hc3NlcnROb3ROdWxsKGUsImNvbnRhaW5lckRpdiIpO3ZhciBoPW5ldyBVUkwocy5jY3BVcmwpLm9yaWdpbixnPW5ldyBVUkwocy5zZWNvbmRhcnlDQ1BVcmwpLm9yaWdpbixtPXIuY29yZS5fY3JlYXRlQ0NQSWZyYW1lKGUscyxoKSx2PXIuY29yZS5fY3JlYXRlQ0NQSWZyYW1lKGUsbihuKHt9LHMpLHt9LHtjY3BVcmw6cy5zZWNvbmRhcnlDQ1BVcmx9KSxnKSx5PW5ldyByLkdSUHJveHlJZnJhbWVDb25kdWl0KHdpbmRvdyxbbSx2XSxtLnNyYyk7ci5jb3JlLnVwc3RyZWFtPXksci5jb3JlLmV2ZW50QnVzPW5ldyByLkV2ZW50QnVzKHtsb2dFdmVudHM6ITF9KSxyLmdsb2JhbFJlc2lsaWVuY3kuX2luaXRpYWxpemVBY3RpdmVSZWdpb24oeSksci5wdWJsaXNoTWV0cmljKHtuYW1lOiJJbml0R2xvYmFsUmVzaWxpZW5jeUNDUENhbGxlZCIsZGF0YTp7Y291bnQ6MX19KSx5LmdldEFsbENvbmR1aXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ci5jb3JlLl9zZW5kSWZyYW1lU3R5bGVEYXRhVXBzdHJlYW1BZnRlclJlYXNvbmFibGVXYWl0VGltZShlLmlmcmFtZSxlKX0pKSxyLmNvcmUud2ViU29ja2V0UHJvdmlkZXI9bmV3IHIuV2ViU29ja2V0UHJvdmlkZXIseS5vbkFsbFVwc3RyZWFtKHIuY29yZS5nZXRFdmVudEJ1cygpLmJyaWRnZSgpKSx5LmdldEFsbENvbmR1aXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5rZWVwYWxpdmVNYW5hZ2VyPW5ldyByLktlZXBhbGl2ZU1hbmFnZXIoZSxyLmNvcmUuZ2V0RXZlbnRCdXMoKSxzLmNjcFN5blRpbWVvdXR8fDFlMyxzLmNjcEFja1RpbWVvdXR8fDNlMyl9KSksci5nZXRMb2coKS5zY2hlZHVsZVVwc3RyZWFtT3V0ZXJDb250ZXh0Q0NQTG9nc1B1c2goeSksci5nZXRMb2coKS5zY2hlZHVsZVVwc3RyZWFtT3V0ZXJDb250ZXh0Q0NQc2VydmVyQm91bmRMb2dzUHVzaCh5KSx5Lm9uVXBzdHJlYW0oci5BZ2VudEV2ZW50cy5GRVRDSF9BR0VOVF9EQVRBX0ZST01fQ0NQLChmdW5jdGlvbihlKXtyLmNvcmUuZ2V0QWdlbnREYXRhUHJvdmlkZXIoKS51cGRhdGVBZ2VudERhdGEoZSksci5nZXRMb2coKS5pbmZvKCJbR1JdIEZldGNoZWQgYWdlbnQgZGF0YSBmcm9tIENDUC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLHkuZ2V0QWxsQ29uZHVpdHMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtwW2UubmFtZV09e2lmcmFtZVJlZnJlc2hUaW1lb3V0Om51bGx9LHBbZS5uYW1lXS5jY3BMb2FkVGltZW91dEluc3RhbmNlPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cFtlLm5hbWVdLmNjcExvYWRUaW1lb3V0SW5zdGFuY2U9bnVsbCxyLmlzQWN0aXZlQ29uZHVpdChlKT8oci5jb3JlLmdldEV2ZW50QnVzKCkudHJpZ2dlcihyLkV2ZW50VHlwZS5BQ0tfVElNRU9VVCksci5nZXRMb2coKS5pbmZvKCJDQ1AgTG9hZFRpbWVvdXQgdHJpZ2dlcmVkLiAiLmNvbmNhdChlLm5hbWUpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKTpyLmdldExvZygpLmVycm9yKCJDQ1AgTG9hZFRpbWVvdXQgZGV0ZWN0ZWQgYnV0IGlnbm9yZWQgZm9yIG5vbi1wcmltYXJ5IHJlZ2lvbnMuICIuY29uY2F0KGUubmFtZSkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSxzLmNjcExvYWRUaW1lb3V0fHw1ZTMpfSkpLHkuZ2V0QWxsQ29uZHVpdHMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLm9uVXBzdHJlYW0oci5FdmVudFR5cGUuQUNLTk9XTEVER0UsKGZ1bmN0aW9uKG4pe2lmKHIuZ2V0TG9nKCkuaW5mbygiQWNrbm93bGVkZ2VkIGJ5IHRoZSBDQ1AhICIuY29uY2F0KGUubmFtZSkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZS5zZW5kVXBzdHJlYW0oci5FdmVudFR5cGUuQ09ORklHVVJFLHtzb2Z0cGhvbmU6cy5zb2Z0cGhvbmUsY2hhdDpzLmNoYXQscGFnZU9wdGlvbnM6cy5wYWdlT3B0aW9ucyxzaG91bGRBZGROYW1lc3BhY2VUb0xvZ3M6cy5zaG91bGRBZGROYW1lc3BhY2VUb0xvZ3MsZW5hYmxlR2xvYmFsUmVzaWxpZW5jeTpzLmVuYWJsZUdsb2JhbFJlc2lsaWVuY3ksaW5zdGFuY2VTdGF0ZTpyLmlzQWN0aXZlQ29uZHVpdChlKT8iYWN0aXZlIjoiaW5hY3RpdmUifSkscFtlLm5hbWVdLmNjcExvYWRUaW1lb3V0SW5zdGFuY2UmJih0LmNsZWFyVGltZW91dChwW2UubmFtZV0uY2NwTG9hZFRpbWVvdXRJbnN0YW5jZSkscFtlLm5hbWVdLmNjcExvYWRUaW1lb3V0SW5zdGFuY2U9bnVsbCksZS5zZW5kVXBzdHJlYW0oci5FdmVudFR5cGUuT1VURVJfQ09OVEVYVF9JTkZPLHtzdHJlYW1zVmVyc2lvbjpyLnZlcnNpb24saW5pdENDUFBhcmFtczpzfSksZS5rZWVwYWxpdmVNYW5hZ2VyLnN0YXJ0KCksci5pc0FjdGl2ZUNvbmR1aXQoZSkmJihyLmNvcmUuY2xpZW50PW5ldyByLlVwc3RyZWFtQ29uZHVpdENsaWVudChlKSxyLmNvcmUubWFzdGVyQ2xpZW50PW5ldyByLlVwc3RyZWFtQ29uZHVpdE1hc3RlckNsaWVudChlKSxyLmNvcmUucG9ydFN0cmVhbUlkPW4uaWQsZikpe3ZhciBhPURhdGUubm93KCktZixjPXBbZS5uYW1lXS5pZnJhbWVSZWZyZXNoQXR0ZW1wdHx8MDtyLmdldExvZygpLmluZm8oIklmcmFtZSBpbml0aWFsaXphdGlvbiBzdWNjZWVkZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuZ2V0TG9nKCkuaW5mbygiSWZyYW1lIGluaXRpYWxpemF0aW9uIHRpbWUgIi5jb25jYXQoYSkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5nZXRMb2coKS5pbmZvKCJJZnJhbWUgcmVmcmVzaCBhdHRlbXB0cyAiLmNvbmNhdChjKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3IucHVibGlzaE1ldHJpYyh7bmFtZTpvLGRhdGE6e2NvdW50OmN9fSksci5wdWJsaXNoTWV0cmljKHtuYW1lOmksZGF0YTp7Y291bnQ6MX19KSxyLnB1Ymxpc2hNZXRyaWMoe25hbWU6IklmcmFtZUluaXRpYWxpemF0aW9uVGltZSIsZGF0YTp7Y291bnQ6YX19KSxmPW51bGx9KSwxZTMpfWUucG9ydFN0cmVhbUlkPW4uaWQsdGhpcy51bnN1YnNjcmliZSgpfSkpfSkpLHkub25VcHN0cmVhbShyLkV2ZW50VHlwZS5MT0csKGZ1bmN0aW9uKGUpe2UubG9nZ2VySWQhPT1yLmdldExvZygpLmdldExvZ2dlcklkKCkmJnIuZ2V0TG9nKCkuYWRkTG9nRW50cnkoci5Mb2dFbnRyeS5mcm9tT2JqZWN0KGUpKX0pKSxyLmNvcmUuZ2V0RXZlbnRCdXMoKS5zdWJzY3JpYmUoci5FdmVudFR5cGUuQUNLX1RJTUVPVVQsKGZ1bmN0aW9uKCl7aWYoITEhPT1zLmxvZ2luUG9wdXApdHJ5e3ZhciBvPXMubG9naW5Vcmw7ci5nZXRMb2coKS53YXJuKCJBQ0tfVElNRU9VVCBvY2N1cnJlZCwgYXR0ZW1wdGluZyB0byBwb3AgdGhlIGxvZ2luIHBhZ2UgaWYgbm90IGFscmVhZHkgb3Blbi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuY29yZS5nZXRQb3B1cE1hbmFnZXIoKS5jbGVhcihyLk1hc3RlclRvcGljcy5MT0dJTl9QT1BVUCksci5jb3JlLl9vcGVuUG9wdXBXaXRoTG9jayhvLHMubG9naW5PcHRpb25zKX1jYXRjaChlKXtyLmdldExvZygpLmVycm9yKCJBQ0tfVElNRU9VVCBvY2N1cnJlZCBidXQgd2UgYXJlIHVuYWJsZSB0byBvcGVuIHRoZSBsb2dpbiBwb3B1cC4iKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9eS5nZXRBbGxDb25kdWl0cygpLmZvckVhY2goKGZ1bmN0aW9uKG8pe2lmKG51bGw9PT1wW28ubmFtZV0uaWZyYW1lUmVmcmVzaFRpbWVvdXQpdHJ5e28ub25VcHN0cmVhbShyLkV2ZW50VHlwZS5BQ0tOT1dMRURHRSwoZnVuY3Rpb24oKXt0aGlzLnVuc3Vic2NyaWJlKCksdC5jbGVhclRpbWVvdXQocFtvLm5hbWVdLmlmcmFtZVJlZnJlc2hUaW1lb3V0KSxwW28ubmFtZV0uaWZyYW1lUmVmcmVzaFRpbWVvdXQ9bnVsbCxyLmNvcmUuZ2V0UG9wdXBNYW5hZ2VyKCkuY2xlYXIoci5NYXN0ZXJUb3BpY3MuTE9HSU5fUE9QVVApLChzLmxvZ2luUG9wdXBBdXRvQ2xvc2V8fHMubG9naW5PcHRpb25zJiZzLmxvZ2luT3B0aW9ucy5hdXRvQ2xvc2UpJiZyLmNvcmUubG9naW5XaW5kb3cmJihyLmNvcmUubG9naW5XaW5kb3cuY2xvc2UoKSxyLmNvcmUubG9naW5XaW5kb3c9bnVsbCl9KSksci5jb3JlLl9yZWZyZXNoSWZyYW1lT25UaW1lb3V0KG4obih7fSxzKSx7fSx7Y2NwVXJsOm8uaWZyYW1lLnNyY30pLGUscFtvLm5hbWVdLG8ubmFtZSl9Y2F0Y2goZSl7ci5nZXRMb2coKS5lcnJvcigiRXJyb3Igb2NjdXJyZWQgd2hpbGUgcmVmcmVzaGluZyBpZnJhbWUiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSkpfSkpLHkuZ2V0QWxsQ29uZHVpdHMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLm9uVXBzdHJlYW0oci5HbG9iYWxSZXNpbGllbmN5RXZlbnRzLklOSVQsKGZ1bmN0aW9uKHQpe2lmKG51bGwhPXQmJnQuaW5zdGFuY2VSZWdpb24mJm51bGwhPXQmJnQuaW5zdGFuY2VTdGF0ZSYmbnVsbCE9dCYmdC5hY3RpdmVSZWdpb24pe3IuZ2V0TG9nKCkuaW5mbygiW0dSXSBSZWNlaXZlZCBHbG9iYWxSZXNpbGllbmN5RXZlbnRzLklOSVQgaW5kaWNhdGluZyAiLmNvbmNhdChlLm5hbWUsIiBpbiByZWdpb24gIikuY29uY2F0KG51bGw9PXQ/dm9pZCAwOnQuaW5zdGFuY2VSZWdpb24sIiBpcyAiKS5jb25jYXQobnVsbD09dD92b2lkIDA6dC5pbnN0YW5jZVN0YXRlLCIuIikpLndpdGhPYmplY3Qoe2RhdGE6dH0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIG49dC5pbnN0YW5jZVJlZ2lvbj09PXQuYWN0aXZlUmVnaW9uP2U6eS5nZXRPdGhlckNvbmR1aXQoZSk7aWYoZS5yZWdpb24mJm4ucmVnaW9ufHwoZS5yZWdpb249dC5pbnN0YW5jZVJlZ2lvbixuLnJlZ2lvbj10LmFjdGl2ZVJlZ2lvbiksZS5zZW5kVXBzdHJlYW0oci5HbG9iYWxSZXNpbGllbmN5RXZlbnRzLkNPTkZJR1VSRV9DQ1BfQ09ORFVJVCx7aW5zdGFuY2VTdGF0ZTp0Lmluc3RhbmNlU3RhdGV9KSxyLmNvcmUuaW5pdGlhbGl6ZWQpci5nZXRMb2coKS5sb2coIltHUl0gRGVkdXBpbmcgR2xvYmFsUmVzaWxpZW5jeUV2ZW50cy5JTklUIC0gQ29yZSBpcyBhbHJlYWR5IGluaXRpYWxpemVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7ZWxzZXtyLmdldExvZygpLmluZm8oIltHUl0gU2V0dGluZyBpbml0aWFsIGFjdGl2ZSBpZnJhbWUgdG8gIi5jb25jYXQobi5uYW1lLCIgaW4gcmVnaW9uICIpLmNvbmNhdChuLnJlZ2lvbiwiIGJlY2F1c2UgdGhlIGluc3RhbmNlIHN0YXRlIHdhcyBhY3RpdmUiKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTt0cnl7ci5nbG9iYWxSZXNpbGllbmN5Ll9zd2l0Y2hBY3RpdmVSZWdpb24oeSxuLm5hbWUpLHIucHVibGlzaE1ldHJpYyh7bmFtZToiR2xvYmFsUmVzaWxpZW5jeVN3aXRjaFJlZ2lvblN1Y2Nlc3MiLGRhdGE6e2NvdW50OjF9fSl9Y2F0Y2goZSl7ci5nZXRMb2coKS5lcnJvcigiW0dSXSBGYWlsdXJlIHN3aXRjaGluZyBhY3RpdmUgcmVnaW9uIGF0IGluaXRpYWxpemF0aW9uLiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLnB1Ymxpc2hNZXRyaWMoe25hbWU6Ikdsb2JhbFJlc2lsaWVuY3lTd2l0Y2hSZWdpb25GYWlsdXJlIixkYXRhOntjb3VudDoxfX0pfXIuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIoci5FdmVudFR5cGUuSU5JVCksci5jb3JlLmluaXRpYWxpemVkPSEwLHIucHVibGlzaE1ldHJpYyh7bmFtZToiR2xvYmFsUmVzaWxpZW5jeUNvcmVJbml0aWFsaXplZCIsZGF0YTp7Y291bnQ6MX19KX19ZWxzZSByLmdldExvZygpLmVycm9yKCJbR1JdIEV4cGVjdGVkIEdsb2JhbFJlc2lsaWVuY3lFdmVudHMuSU5JVCB0byBoYXZlIGluc3RhbmNlIHJlZ2lvbiwgc3RhdGUsIGFuZCBjdXJyZW50IGFjdGl2ZSByZWdpb24sIGJ1dCBkaWQgbm90IGZpbmQgaXQuIikud2l0aE9iamVjdCh7ZGF0YTp0fSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKSxlLm9uVXBzdHJlYW0oci5HbG9iYWxSZXNpbGllbmN5RXZlbnRzLkZBSUxPVkVSX0lOSVRJQVRFRCwoZnVuY3Rpb24oZSl7aWYodT1EYXRlLm5vdygpLHIucHVibGlzaE1ldHJpYyh7bmFtZToiR2xvYmFsUmVzaWxpZW5jeUZhaWxvdmVySW5pdGlhdGVkUmVjZWl2ZWQiLGRhdGE6e2NvdW50OjF9fSksZCYmci5wdWJsaXNoTWV0cmljKHtuYW1lOiJHbG9iYWxSZXNpbGllbmN5UGVuZGluZ1RvSW5pdGlhdGVkTGF0ZW5jeSIsZGF0YTp7bGF0ZW5jeTp1LWN9fSksbnVsbCE9ZSYmZS5hY3RpdmVSZWdpb24pe3IuZ2V0TG9nKCkuaW5mbygiW0dSXSBSZWNlaXZlZCBHbG9iYWxSZXNpbGllbmN5RXZlbnRzLkZBSUxPVkVSX0lOSVRJQVRFRCBpbmRpY2F0aW5nIHRoZSBhY3RpdmVSZWdpb24gaXMgIi5jb25jYXQoZS5hY3RpdmVSZWdpb24sIi4iKSk7dmFyIHQsbj15LmdldENvbmR1aXRCeVJlZ2lvbihlLmFjdGl2ZVJlZ2lvbik7bnx8KHIuZ2V0TG9nKCkuZGVidWcoIltHUl0gQSBjb25kdWl0IGRpZCBub3QgcmVjZWl2ZWQgR0xPQkFMX1JFU0lMSUVOQ1kuSU5JVCBldmVudCwgbGVhZGluZyB0byB0aGUgcmVnaW9uIGZpZWxkIGJlaW5nIHVucG9wdWxhdGVkLiIpLHkuZ2V0QWxsQ29uZHVpdHMoKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2b2lkIDAhPT10LnJlZ2lvbiYmbnVsbCE9PXQucmVnaW9ufHwodC5yZWdpb249ZS5hY3RpdmVSZWdpb24sbj10KX0pKSk7dHJ5e3Q9ci5nbG9iYWxSZXNpbGllbmN5Ll9zd2l0Y2hBY3RpdmVSZWdpb24oeSxuLm5hbWUpLHIucHVibGlzaE1ldHJpYyh7bmFtZToiR2xvYmFsUmVzaWxpZW5jeVN3aXRjaFJlZ2lvblN1Y2Nlc3MiLGRhdGE6e2NvdW50OjF9fSl9Y2F0Y2goZSl7ci5nZXRMb2coKS5lcnJvcigiW0dSXSBGYWlsdXJlIHN3aXRjaGluZyBhY3RpdmUgcmVnaW9uLiIpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLnB1Ymxpc2hNZXRyaWMoe25hbWU6Ikdsb2JhbFJlc2lsaWVuY3lTd2l0Y2hSZWdpb25GYWlsdXJlIixkYXRhOntjb3VudDoxfX0pfWlmKHQpe2Q9ITE7dmFyIG89eS5vblVwc3RyZWFtKHIuQWdlbnRFdmVudHMuVVBEQVRFLChmdW5jdGlvbigpe28udW5zdWJzY3JpYmUoKSxyLmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHIuR2xvYmFsUmVzaWxpZW5jeUV2ZW50cy5GQUlMT1ZFUl9DT01QTEVURSx7YWN0aXZlUmVnaW9uOmUuYWN0aXZlUmVnaW9ufSkseS5zZW5kVXBzdHJlYW0oci5HbG9iYWxSZXNpbGllbmN5RXZlbnRzLkZBSUxPVkVSX0NPTVBMRVRFKSxyLmdldExvZygpLmluZm8oIltHUl0gR2xvYmFsUmVzaWxpZW5jeUV2ZW50cy5GQUlMT1ZFUl9DT01QTEVURSBlbWl0dGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbD1EYXRlLm5vdygpLHIucHVibGlzaE1ldHJpYyh7bmFtZToiR2xvYmFsUmVzaWxpZW5jeUZhaWxvdmVyQ29tcGxldGVkIixkYXRhOntjb3VudDoxfX0pLHIucHVibGlzaE1ldHJpYyh7bmFtZToiR2xvYmFsUmVzaWxpZW5jeUluaXRpYXRlZFRvQ29tcGxldGVkTGF0ZW5jeSIsZGF0YTp7bGF0ZW5jeTpsLXV9fSl9KSl9fWVsc2Ugci5nZXRMb2coKS5lcnJvcigiW0dSXSBFeHBlY3RlZCBHbG9iYWxSZXNpbGllbmN5RXZlbnRzLkZBSUxPVkVSX0lOSVRJQVRFRCB0byBoYXZlIG5ldyBhY3RpdmUgcmVnaW9uLCBidXQgZGlkIG5vdCBmaW5kIGl0LiIpLndpdGhPYmplY3Qoe2RhdGE6ZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9KSkscy5vblZpZXdDb250YWN0JiZyLmNvcmUub25WaWV3Q29udGFjdChzLm9uVmlld0NvbnRhY3QpLHkub25VcHN0cmVhbShyLkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMsKGZ1bmN0aW9uKGUpe3IubnVtYmVyT2ZDb25uZWN0ZWRDQ1BzPWUubGVuZ3RofSkpLHkuZ2V0QWxsQ29uZHVpdHMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtlLm9uVXBzdHJlYW0oci5Wb2ljZUlkRXZlbnRzLlVQREFURV9ET01BSU5fSUQsKGZ1bmN0aW9uKHQpe3QmJnQuZG9tYWluSWQmJihlLnZvaWNlSWREb21haW5JZD10LmRvbWFpbklkLHIuaXNBY3RpdmVDb25kdWl0KGUpJiYoci5jb3JlLnZvaWNlSWREb21haW5JZD10LmRvbWFpbklkKSl9KSl9KSksci5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHIuRXZlbnRUeXBlLklGUkFNRV9SRVRSSUVTX0VYSEFVU1RFRCwoZnVuY3Rpb24oZSl7aWYoZT09PXkuZ2V0QWN0aXZlQ29uZHVpdCgpLm5hbWUmJmYpe3ZhciB0PXBbeS5nZXRBY3RpdmVDb25kdWl0KCkubmFtZV0uaWZyYW1lUmVmcmVzaEF0dGVtcHQtMTtyLmdldExvZygpLmluZm8oIklmcmFtZSBpbml0aWFsaXphdGlvbiBmYWlsZWQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuZ2V0TG9nKCkuaW5mbygiVGltZSBhZnRlciBpZnJhbWUgaW5pdGlhbGl6YXRpb24gc3RhcnRlZCAiLmNvbmNhdChEYXRlLm5vdygpLWYpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuZ2V0TG9nKCkuaW5mbygiSWZyYW1lIHJlZnJlc2ggYXR0ZW1wdHMgIi5jb25jYXQodCkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5wdWJsaXNoTWV0cmljKHtuYW1lOm8sZGF0YTp7Y291bnQ6dH19KSxyLnB1Ymxpc2hNZXRyaWMoe25hbWU6aSxkYXRhOntjb3VudDowfX0pLGY9bnVsbH19KSksci5jb3JlLnNvZnRwaG9uZVBhcmFtcz1zLnNvZnRwaG9uZSx5LmdldEFsbENvbmR1aXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5vblVwc3RyZWFtKHIuR2xvYmFsUmVzaWxpZW5jeUV2ZW50cy5GQUlMT1ZFUl9QRU5ESU5HLChmdW5jdGlvbih0KXtyLmlzQWN0aXZlQ29uZHVpdChlKSYmKGQ/ci5nZXRMb2coKS5pbmZvKCJbR1JdIFJlY2VpdmVkIEZBSUxPVkVSX1BFTkRJTkcgLSBkZWR1cGluZywgd2lsbCBub3QgdHJpZ2dlciBldmVudCBzdWJzY3JpcHRpb24uIikud2l0aE9iamVjdCh7ZGF0YTp0fSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTooci5nZXRMb2coKS5pbmZvKCJbR1JdIFJlY2VpdmVkIEZBSUxPVkVSX1BFTkRJTkciKS53aXRoT2JqZWN0KHtkYXRhOnR9KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuY29yZS5nZXRFdmVudEJ1cygpLnRyaWdnZXIoci5HbG9iYWxSZXNpbGllbmN5RXZlbnRzLkZBSUxPVkVSX1BFTkRJTkdfQ1JNLHtuZXh0QWN0aXZlUmVnaW9uOnQuYWN0aXZlUmVnaW9ufSksZD0hMCxjPURhdGUubm93KCksci5wdWJsaXNoTWV0cmljKHtuYW1lOiJHbG9iYWxSZXNpbGllbmN5RmFpbG92ZXJQZW5kaW5nUmVjZWl2ZWQiLGRhdGE6e2NvdW50OjF9fSkpKX0pKX0pKSx5LnJlbGF5VXBzdHJlYW0oci5HbG9iYWxSZXNpbGllbmN5RXZlbnRzLkZBSUxPVkVSX1BFTkRJTkcpLHkucmVsYXlVcHN0cmVhbShyLkdsb2JhbFJlc2lsaWVuY3lFdmVudHMuRkFJTE9WRVJfSU5JVElBVEVEKSx5LnJlbGF5VXBzdHJlYW0oci5HbG9iYWxSZXNpbGllbmN5RXZlbnRzLkZBSUxPVkVSX0NPTVBMRVRFKSx5LnJlbGF5VXBzdHJlYW0oci5HbG9iYWxSZXNpbGllbmN5RXZlbnRzLkhFQVJUQkVBVF9TWU4pLHkucmVsYXlVcHN0cmVhbShyLkdsb2JhbFJlc2lsaWVuY3lFdmVudHMuSEVBUlRCRUFUX0FDSyksci5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHIuRXZlbnRUeXBlLkRPV05MT0FEX0xPR19GUk9NX0NDUCwoZnVuY3Rpb24oKXt5LmdldEFsbENvbmR1aXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZWdpb258fCJyZWdpb24iO2Uuc2VuZFVwc3RyZWFtKHIuRXZlbnRUeXBlLkRPV05MT0FEX0xPR19GUk9NX0NDUCx7bG9nTmFtZToiY2NwLSIuY29uY2F0KHQsIi1hZ2VudC1sb2ciKX0pfSkpfSkpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dmFyIGU9MDt5LmdldEFsbENvbmR1aXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5yZWdpb24mJihlKz0xKX0pKSxlPDImJihyLmdldExvZygpLmluZm8oIltHUl0gT25lIG9yIG1vcmUgY29uZHVpdHMgZGlkIG5vdCBHbG9iYWxSZXNpbGllbmN5LklOSVQgZXZlbnQgdG8gQ1JNIGxheWVyLiIpLndpdGhPYmplY3Qoe2ZpcnN0Q29uZHVpdE5hbWU6eS5nZXRBbGxDb25kdWl0cygpWzBdLm5hbWUsZmlyc3RDb25kdWl0UmVnaW9uOnkuZ2V0QWxsQ29uZHVpdHMoKVswXS5yZWdpb24sc2Vjb25kQ29uZHVpdE5hbWU6eS5nZXRBbGxDb25kdWl0cygpWzFdLm5hbWUsc2Vjb25kQ29uZHVpdFJlZ2lvbjp5LmdldEFsbENvbmR1aXRzKClbMV0ucmVnaW9ufSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxyLnB1Ymxpc2hNZXRyaWMoe25hbWU6Ikdsb2JhbFJlc2lsaWVuY3lQYXJ0aWFsSW5pdGlhbGl6YXRpb24iLGRhdGE6e2NvdW50OjF9fSkpfSksM2U0KX19fSgpfSw0MjooKT0+e2Z1bmN0aW9uIGUodCl7cmV0dXJuIGU9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9LGUodCl9IWZ1bmN0aW9uKHQpe3ZhciBuPXt9O2Z1bmN0aW9uIHIoZSl7aWYobltlXSlyZXR1cm4gbltlXS5leHBvcnRzO3ZhciBvPW5bZV09e2k6ZSxsOiExLGV4cG9ydHM6e319O3JldHVybiB0W2VdLmNhbGwoby5leHBvcnRzLG8sby5leHBvcnRzLHIpLG8ubD0hMCxvLmV4cG9ydHN9ci5tPXQsci5jPW4sci5kPWZ1bmN0aW9uKGUsdCxuKXtyLm8oZSx0KXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTohMCxnZXQ6bn0pfSxyLnI9ZnVuY3Rpb24oZSl7InVuZGVmaW5lZCIhPXR5cGVvZiBTeW1ib2wmJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0sci50PWZ1bmN0aW9uKHQsbil7aWYoMSZuJiYodD1yKHQpKSw4Jm4pcmV0dXJuIHQ7aWYoNCZuJiYib2JqZWN0Ij09ZSh0KSYmdCYmdC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBvPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoci5yKG8pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCJkZWZhdWx0Iix7ZW51bWVyYWJsZTohMCx2YWx1ZTp0fSksMiZuJiYic3RyaW5nIiE9dHlwZW9mIHQpZm9yKHZhciBpIGluIHQpci5kKG8saSxmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0uYmluZChudWxsLGkpKTtyZXR1cm4gb30sci5uPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBlLmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIGV9O3JldHVybiByLmQodCwiYSIsdCksdH0sci5vPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfSxyLnA9IiIscihyLnM9Mil9KFtmdW5jdGlvbih0LG4scil7InVzZSBzdHJpY3QiO3ZhciBvPXIoMSksaT0iREVCVUciLGE9IkFNWl9XRUJfU09DS0VUX01BTkFHRVI6IixzPSJOZXR3b3JrIG9mZmxpbmUiLGM9Ik5ldHdvcmsgb25saW5lLCBjb25uZWN0aW5nIHRvIFdlYlNvY2tldCBzZXJ2ZXIiLHU9Ik5ldHdvcmsgb2ZmbGluZSwgaWdub3JpbmcgdGhpcyBnZXRXZWJTb2NrZXRDb25uQ29uZmlnIHJlcXVlc3QiLGw9IkhlYXJ0YmVhdCByZXNwb25zZSBub3QgcmVjZWl2ZWQiLHA9IkZhaWxlZCB0byBzZW5kIGhlYXJ0YmVhdCBzaW5jZSBXZWJTb2NrZXQgaXMgbm90IG9wZW4iLGQ9IldlYlNvY2tldCBjb25uZWN0aW9uIGVzdGFibGlzaGVkISIsZj0iV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgY2xvc2VkIixoPSJXZWJTb2NrZXRNYW5hZ2VyIEVycm9yLCBlcnJvcl9ldmVudDogIixnPSJTY2hlZHVsaW5nIFdlYlNvY2tldCByZWluaXRpYWxpemF0aW9uLCBhZnRlciBkZWxheSAiLG09IldlYlNvY2tldCBVUkwgY2Fubm90IGJlIHVzZWQgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24iLHY9IldlYlNvY2tldCBJbml0aWFsaXphdGlvbiBmYWlsZWQgLSBUZXJtaW5hdGluZyBhbmQgY2xlYW5pbmcgc3Vic2NyaXB0aW9ucyIseT0iRmV0Y2hpbmcgbmV3IFdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24iLGI9IlN1Y2Nlc3NmdWxseSBmZXRjaGVkIHdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24iLEU9IkZhaWxlZCB0byBmZXRjaCB3ZWJTb2NrZXQgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIixTPSJSZXRyeWluZyBmZXRjaGluZyBuZXcgV2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbiIsQz0iSW5pdGlhbGl6aW5nIFdlYnNvY2tldCBNYW5hZ2VyIixUPSJXZWJTb2NrZXRNYW5hZ2VyIE1lc3NhZ2UgRXJyb3IiLEk9Ik1lc3NhZ2UgcmVjZWl2ZWQgZm9yIHRvcGljICIsdz0iSW52YWxpZCBpbmNvbWluZyBtZXNzYWdlIixBPSJhd3Mvc3Vic2NyaWJlIixfPSJhd3MvaGVhcnRiZWF0IixSPSJkaXNjb25uZWN0ZWQiO2Z1bmN0aW9uIEwodCl7cmV0dXJuKEw9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PWUoU3ltYm9sLml0ZXJhdG9yKT9mdW5jdGlvbih0KXtyZXR1cm4gZSh0KX06ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJnQuY29uc3RydWN0b3I9PT1TeW1ib2wmJnQhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOmUodCl9KSh0KX12YXIgTz17YXNzZXJ0VHJ1ZTpmdW5jdGlvbihlLHQpe2lmKCFlKXRocm93IG5ldyBFcnJvcih0KX0sYXNzZXJ0Tm90TnVsbDpmdW5jdGlvbihlLHQpe3JldHVybiBPLmFzc2VydFRydWUobnVsbCE9PWUmJnZvaWQgMCE9PUwoZSksT2JqZWN0KG8uc3ByaW50ZikoIiVzIG11c3QgYmUgcHJvdmlkZWQiLHR8fCJBIHZhbHVlIikpLGV9LGlzTm9uRW1wdHlTdHJpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiZlLmxlbmd0aD4wfSxhc3NlcnRJc0xpc3Q6ZnVuY3Rpb24oZSx0KXtpZighQXJyYXkuaXNBcnJheShlKSl0aHJvdyBuZXcgRXJyb3IodCsiIGlzIG5vdCBhbiBhcnJheSIpfSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGUpe3JldHVybiEhKGUmJmUuY29uc3RydWN0b3ImJmUuY2FsbCYmZS5hcHBseSl9LGlzT2JqZWN0OmZ1bmN0aW9uKGUpe3JldHVybiEoIm9iamVjdCIhPT1MKGUpfHxudWxsPT09ZSl9LGlzU3RyaW5nOmZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX0saXNOdW1iZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfX0saz1uZXcgUmVnRXhwKCJeKHdzczovLylcXHcqIik7Ty52YWxpZFdTVXJsPWZ1bmN0aW9uKGUpe3JldHVybiBrLnRlc3QoZSl9LE8uZ2V0U3Vic2NyaXB0aW9uUmVzcG9uc2U9ZnVuY3Rpb24oZSx0LG4pe3JldHVybnt0b3BpYzplLGNvbnRlbnQ6e3N0YXR1czp0PyJzdWNjZXNzIjoiZmFpbHVyZSIsdG9waWNzOm59fX0sTy5hc3NlcnRJc09iamVjdD1mdW5jdGlvbihlLHQpe2lmKCFPLmlzT2JqZWN0KGUpKXRocm93IG5ldyBFcnJvcih0KyIgaXMgbm90IGFuIG9iamVjdCEiKX0sTy5hZGRKaXR0ZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjE7dD1NYXRoLm1pbih0LDEpO3ZhciBuPU1hdGgucmFuZG9tKCk+LjU/MTotMTtyZXR1cm4gTWF0aC5mbG9vcihlK24qZSpNYXRoLnJhbmRvbSgpKnQpfSxPLmlzTmV0d29ya09ubGluZT1mdW5jdGlvbigpe3JldHVybiBuYXZpZ2F0b3Iub25MaW5lfSxPLmlzTmV0d29ya0ZhaWx1cmU9ZnVuY3Rpb24oZSl7cmV0dXJuISghZS5fZGVidWd8fCFlLl9kZWJ1Zy50eXBlKSYmIk5ldHdvcmtpbmdFcnJvciI9PT1lLl9kZWJ1Zy50eXBlfTt2YXIgTj1PO2Z1bmN0aW9uIFAoZSl7cmV0dXJuKFA9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZjpmdW5jdGlvbihlKXtyZXR1cm4gZS5fX3Byb3RvX198fE9iamVjdC5nZXRQcm90b3R5cGVPZihlKX0pKGUpfWZ1bmN0aW9uIEQoZSx0KXtyZXR1cm4oRD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuX19wcm90b19fPXQsZX0pKGUsdCl9ZnVuY3Rpb24geCh0KXtyZXR1cm4oeD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09ZShTeW1ib2wuaXRlcmF0b3IpP2Z1bmN0aW9uKHQpe3JldHVybiBlKHQpfTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmdC5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmdCE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6ZSh0KX0pKHQpfWZ1bmN0aW9uIE0oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBVKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLmtleSxyKX19ZnVuY3Rpb24gRihlLHQsbil7cmV0dXJuIHQmJlUoZS5wcm90b3R5cGUsdCksbiYmVShlLG4pLGV9dmFyIGo9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7TSh0aGlzLGUpfXJldHVybiBGKGUsW3trZXk6ImRlYnVnIix2YWx1ZTpmdW5jdGlvbihlKXt9fSx7a2V5OiJpbmZvIix2YWx1ZTpmdW5jdGlvbihlKXt9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbihlKXt9fSx7a2V5OiJlcnJvciIsdmFsdWU6ZnVuY3Rpb24oZSl7fX0se2tleToiYWR2YW5jZWRMb2ciLHZhbHVlOmZ1bmN0aW9uKGUpe319XSksZX0oKSxxPWEsQj17REVCVUc6MTAsSU5GTzoyMCxXQVJOOjMwLEVSUk9SOjQwLEFEVkFOQ0VEX0xPRzo1MH0sRz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtNKHRoaXMsZSksdGhpcy51cGRhdGVMb2dnZXJDb25maWcoKSx0aGlzLmNvbnNvbGVMb2dnZXJXcmFwcGVyPUgoKX1yZXR1cm4gRihlLFt7a2V5OiJ3cml0ZVRvQ2xpZW50TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbihlLHQpe2lmKHRoaXMuaGFzQ2xpZW50TG9nZ2VyKCkpc3dpdGNoKGUpe2Nhc2UgQi5ERUJVRzpyZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLmRlYnVnKHQpfHx0O2Nhc2UgQi5JTkZPOnJldHVybiB0aGlzLl9jbGllbnRMb2dnZXIuaW5mbyh0KXx8dDtjYXNlIEIuV0FSTjpyZXR1cm4gdGhpcy5fY2xpZW50TG9nZ2VyLndhcm4odCl8fHQ7Y2FzZSBCLkVSUk9SOnJldHVybiB0aGlzLl9jbGllbnRMb2dnZXIuZXJyb3IodCl8fHQ7Y2FzZSBCLkFEVkFOQ0VEX0xPRzpyZXR1cm4gdGhpcy5fYWR2YW5jZWRMb2dXcml0ZXI/dGhpcy5fY2xpZW50TG9nZ2VyW3RoaXMuX2FkdmFuY2VkTG9nV3JpdGVyXSh0KXx8dDoiIn19fSx7a2V5OiJpc0xldmVsRW5hYmxlZCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGU+PXRoaXMuX2xldmVsfX0se2tleToiaGFzQ2xpZW50TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBudWxsIT09dGhpcy5fY2xpZW50TG9nZ2VyfX0se2tleToiZ2V0TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lLnByZWZpeHx8cTtyZXR1cm4gdGhpcy5fbG9nc0Rlc3RpbmF0aW9uPT09aT90aGlzLmNvbnNvbGVMb2dnZXJXcmFwcGVyOm5ldyBXKHQpfX0se2tleToidXBkYXRlTG9nZ2VyQ29uZmlnIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1lfHx7fTt0aGlzLl9sZXZlbD10LmxldmVsfHxCLklORk8sdGhpcy5fYWR2YW5jZWRMb2dXcml0ZXI9Indhcm4iLHQuYWR2YW5jZWRMb2dXcml0ZXImJih0aGlzLl9hZHZhbmNlZExvZ1dyaXRlcj10LmFkdmFuY2VkTG9nV3JpdGVyKSx0LmN1c3RvbWl6ZWRMb2dnZXImJiJvYmplY3QiPT09eCh0LmN1c3RvbWl6ZWRMb2dnZXIpJiYodGhpcy51c2VDbGllbnRMb2dnZXI9ITApLHRoaXMuX2NsaWVudExvZ2dlcj10LmxvZ2dlcnx8dGhpcy5zZWxlY3RMb2dnZXIodCksdGhpcy5fbG9nc0Rlc3RpbmF0aW9uPSJOVUxMIix0LmRlYnVnJiYodGhpcy5fbG9nc0Rlc3RpbmF0aW9uPWkpLHQubG9nZ2VyJiYodGhpcy5fbG9nc0Rlc3RpbmF0aW9uPSJDTElFTlRfTE9HR0VSIil9fSx7a2V5OiJzZWxlY3RMb2dnZXIiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmN1c3RvbWl6ZWRMb2dnZXImJiJvYmplY3QiPT09eChlLmN1c3RvbWl6ZWRMb2dnZXIpP2UuY3VzdG9taXplZExvZ2dlcjplLnVzZURlZmF1bHRMb2dnZXI/KHRoaXMuY29uc29sZUxvZ2dlcldyYXBwZXI9SCgpLHRoaXMuY29uc29sZUxvZ2dlcldyYXBwZXIpOm51bGx9fV0pLGV9KCksVj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtNKHRoaXMsZSl9cmV0dXJuIEYoZSxbe2tleToiZGVidWciLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleToiaW5mbyIsdmFsdWU6ZnVuY3Rpb24oKXt9fSx7a2V5OiJ3YXJuIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6ImVycm9yIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6ImFkdmFuY2VkTG9nIix2YWx1ZTpmdW5jdGlvbigpe319XSksZX0oKSxXPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSl7dmFyIG47cmV0dXJuIE0odGhpcyx0KSwobj1mdW5jdGlvbihlLHQpe3JldHVybiF0fHwib2JqZWN0IiE9PXgodCkmJiJmdW5jdGlvbiIhPXR5cGVvZiB0P2Z1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gZX0oZSk6dH0odGhpcyxQKHQpLmNhbGwodGhpcykpKS5wcmVmaXg9ZXx8cSxufXJldHVybiBmdW5jdGlvbihlLHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0JiZudWxsIT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiIpO2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodCYmdC5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTplLHdyaXRhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH19KSx0JiZEKGUsdCl9KHQsViksRih0LFt7a2V5OiJkZWJ1ZyIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKEIuREVCVUcsdCl9fSx7a2V5OiJpbmZvIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLl9sb2coQi5JTkZPLHQpfX0se2tleToid2FybiIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gdGhpcy5fbG9nKEIuV0FSTix0KX19LHtrZXk6ImVycm9yIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLl9sb2coQi5FUlJPUix0KX19LHtrZXk6ImFkdmFuY2VkTG9nIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9bmV3IEFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLl9sb2coQi5BRFZBTkNFRF9MT0csdCl9fSx7a2V5OiJfc2hvdWxkTG9nIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gei5oYXNDbGllbnRMb2dnZXIoKSYmei5pc0xldmVsRW5hYmxlZChlKX19LHtrZXk6Il93cml0ZVRvQ2xpZW50TG9nZ2VyIix2YWx1ZTpmdW5jdGlvbihlLHQpe3JldHVybiB6LndyaXRlVG9DbGllbnRMb2dnZXIoZSx0KX19LHtrZXk6Il9sb2ciLHZhbHVlOmZ1bmN0aW9uKGUsdCl7aWYodGhpcy5fc2hvdWxkTG9nKGUpKXt2YXIgbj16LnVzZUNsaWVudExvZ2dlcj90OnRoaXMuX2NvbnZlcnRUb1NpbmdsZVN0YXRlbWVudCh0LGUpO3JldHVybiB0aGlzLl93cml0ZVRvQ2xpZW50TG9nZ2VyKGUsbil9fX0se2tleToiX2NvbnZlcnRUb1NpbmdsZVN0YXRlbWVudCIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj1uZXcgRGF0ZShEYXRlLm5vdygpKS50b0lTT1N0cmluZygpLHI9dGhpcy5fZ2V0TG9nTGV2ZWxCeVZhbHVlKHQpLG89IlsiLmNvbmNhdChuLCJdWyIpLmNvbmNhdChyLCJdIik7dGhpcy5wcmVmaXgmJihvKz10aGlzLnByZWZpeCsiICIpLHRoaXMub3B0aW9ucyYmKHRoaXMub3B0aW9ucy5wcmVmaXg/bys9IiAiK3RoaXMub3B0aW9ucy5wcmVmaXgrIjoiOm8rPSIiLHRoaXMub3B0aW9ucy5sb2dNZXRhRGF0YT9vKz0iIE1ldGEgZGF0YTogIitKU09OLnN0cmluZ2lmeSh0aGlzLm9wdGlvbnMubG9nTWV0YURhdGEpOm8rPSIiKTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIGE9ZVtpXTtvKz10aGlzLl9jb252ZXJ0VG9TdHJpbmcoYSkrIiAifXJldHVybiBvfX0se2tleToiX2dldExvZ0xldmVsQnlWYWx1ZSIsdmFsdWU6ZnVuY3Rpb24oZSl7c3dpdGNoKGUpe2Nhc2UgMTA6cmV0dXJuIkRFQlVHIjtjYXNlIDIwOnJldHVybiJJTkZPIjtjYXNlIDMwOnJldHVybiJXQVJOIjtjYXNlIDQwOnJldHVybiJFUlJPUiI7Y2FzZSA1MDpyZXR1cm4iQURWQU5DRURfTE9HIn19fSx7a2V5OiJfY29udmVydFRvU3RyaW5nIix2YWx1ZTpmdW5jdGlvbihlKXt0cnl7aWYoIWUpcmV0dXJuIiI7aWYoTi5pc1N0cmluZyhlKSlyZXR1cm4gZTtpZihOLmlzT2JqZWN0KGUpJiZOLmlzRnVuY3Rpb24oZS50b1N0cmluZykpe3ZhciB0PWUudG9TdHJpbmcoKTtpZigiW29iamVjdCBPYmplY3RdIiE9PXQpcmV0dXJuIHR9cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpfWNhdGNoKHQpe3JldHVybiBjb25zb2xlLmVycm9yKCJFcnJvciB3aGlsZSBjb252ZXJ0aW5nIGFyZ3VtZW50IHRvIHN0cmluZyIsZSx0KSwiIn19fV0pLHR9KCksSD1mdW5jdGlvbigpe3ZhciBlPW5ldyBWO3JldHVybiBlLmRlYnVnPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGNvbnNvbGUuZGVidWcuYXBwbHkod2luZG93LmNvbnNvbGUsW10uY29uY2F0KHQpKX0sZS5pbmZvPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGgsdD1uZXcgQXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIGNvbnNvbGUuaW5mby5hcHBseSh3aW5kb3cuY29uc29sZSxbXS5jb25jYXQodCkpfSxlLndhcm49ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gY29uc29sZS53YXJuLmFwcGx5KHdpbmRvdy5jb25zb2xlLFtdLmNvbmNhdCh0KSl9LGUuZXJyb3I9ZnVuY3Rpb24oKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PW5ldyBBcnJheShlKSxuPTA7bjxlO24rKyl0W25dPWFyZ3VtZW50c1tuXTtyZXR1cm4gY29uc29sZS5lcnJvci5hcHBseSh3aW5kb3cuY29uc29sZSxbXS5jb25jYXQodCkpfSxlfSx6PW5ldyBHO2Z1bmN0aW9uIEsoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTtyLmVudW1lcmFibGU9ci5lbnVtZXJhYmxlfHwhMSxyLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gciYmKHIud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIua2V5LHIpfX12YXIgWT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjJlMzshZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxlKSx0aGlzLm51bUF0dGVtcHRzPTAsdGhpcy5leGVjdXRvcj10LHRoaXMuaGFzQWN0aXZlUmVjb25uZWN0aW9uPSExLHRoaXMuZGVmYXVsdFJldHJ5PW59dmFyIHQsbjtyZXR1cm4gdD1lLChuPVt7a2V5OiJyZXRyeSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuaGFzQWN0aXZlUmVjb25uZWN0aW9ufHwodGhpcy5oYXNBY3RpdmVSZWNvbm5lY3Rpb249ITAsc2V0VGltZW91dCgoZnVuY3Rpb24oKXtlLl9leGVjdXRlKCl9KSx0aGlzLl9nZXREZWxheSgpKSl9fSx7a2V5OiJfZXhlY3V0ZSIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmhhc0FjdGl2ZVJlY29ubmVjdGlvbj0hMSx0aGlzLmV4ZWN1dG9yKCksdGhpcy5udW1BdHRlbXB0cysrfX0se2tleToiY29ubmVjdGVkIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMubnVtQXR0ZW1wdHM9MH19LHtrZXk6Il9nZXREZWxheSIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT1NYXRoLnBvdygyLHRoaXMubnVtQXR0ZW1wdHMpKnRoaXMuZGVmYXVsdFJldHJ5O3JldHVybiBlPD0zZTQ/ZTozZTR9fSx7a2V5OiJnZXRJc0Nvbm5lY3RlZCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5udW1BdHRlbXB0c319XSkmJksodC5wcm90b3R5cGUsbiksZX0oKTtyLmQobiwiYSIsKGZ1bmN0aW9uKCl7cmV0dXJuIEp9KSk7dmFyIFg9ZnVuY3Rpb24oKXt2YXIgZT16LmdldExvZ2dlcih7cHJlZml4OmF9KSx0PU4uaXNOZXR3b3JrT25saW5lKCksbj17cHJpbWFyeTpudWxsLHNlY29uZGFyeTpudWxsfSxyPXtyZWNvbm5lY3RXZWJTb2NrZXQ6ITAsd2Vic29ja2V0SW5pdEZhaWxlZDohMSxleHBvbmVudGlhbEJhY2tPZmZUaW1lOjFlMyxleHBvbmVudGlhbFRpbWVvdXRIYW5kbGU6bnVsbCxsaWZlVGltZVRpbWVvdXRIYW5kbGU6bnVsbCx3ZWJTb2NrZXRJbml0Q2hlY2tlclRpbWVvdXRJZDpudWxsLGNvbm5TdGF0ZTpudWxsfSxvPXtjb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudDowLGNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lOm51bGwsbm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA6bnVsbH0saT17cGVuZGluZ1Jlc3BvbnNlOiExLGludGVydmFsSGFuZGxlOm51bGx9LEw9e2luaXRGYWlsdXJlOm5ldyBTZXQsZ2V0V2ViU29ja2V0VHJhbnNwb3J0Om51bGwsc3Vic2NyaXB0aW9uVXBkYXRlOm5ldyBTZXQsc3Vic2NyaXB0aW9uRmFpbHVyZTpuZXcgU2V0LHRvcGljOm5ldyBNYXAsYWxsTWVzc2FnZTpuZXcgU2V0LGNvbm5lY3Rpb25HYWluOm5ldyBTZXQsY29ubmVjdGlvbkxvc3Q6bmV3IFNldCxjb25uZWN0aW9uT3BlbjpuZXcgU2V0LGNvbm5lY3Rpb25DbG9zZTpuZXcgU2V0fSxPPXtjb25uQ29uZmlnOm51bGwscHJvbWlzZUhhbmRsZTpudWxsLHByb21pc2VDb21wbGV0ZWQ6ITB9LGs9e3N1YnNjcmliZWQ6bmV3IFNldCxwZW5kaW5nOm5ldyBTZXQsc3Vic2NyaXB0aW9uSGlzdG9yeTpuZXcgU2V0fSxQPXtyZXNwb25zZUNoZWNrSW50ZXJ2YWxJZDpudWxsLHJlcXVlc3RDb21wbGV0ZWQ6ITAscmVTdWJzY3JpYmVJbnRlcnZhbElkOm51bGwsY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0czowLGNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3Q6MH0sRD1uZXcgWSgoZnVuY3Rpb24oKXtzZSgpfSkpLHg9bmV3IFNldChbQSwiYXdzL3Vuc3Vic2NyaWJlIixfXSksTT1zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXtpZih0IT09Ti5pc05ldHdvcmtPbmxpbmUoKSl7aWYoISh0PU4uaXNOZXR3b3JrT25saW5lKCkpKXJldHVybiBlLmFkdmFuY2VkTG9nKHMpLHZvaWQgbGUoZS5pbmZvKHMpKTt2YXIgbj1WKCk7dCYmKCFufHxxKG4sV2ViU29ja2V0LkNMT1NJTkcpfHxxKG4sV2ViU29ja2V0LkNMT1NFRCkpJiYoZS5hZHZhbmNlZExvZyhjKSxsZShlLmluZm8oYykpLHNlKCkpfX0pLDI1MCksVT1mdW5jdGlvbih0LG4pe3QuZm9yRWFjaCgoZnVuY3Rpb24odCl7dHJ5e3Qobil9Y2F0Y2godCl7bGUoZS5lcnJvcigiRXJyb3IgZXhlY3V0aW5nIGNhbGxiYWNrIix0KSl9fSkpfSxGPWZ1bmN0aW9uKGUpe2lmKG51bGw9PT1lKXJldHVybiJOVUxMIjtzd2l0Y2goZS5yZWFkeVN0YXRlKXtjYXNlIFdlYlNvY2tldC5DT05ORUNUSU5HOnJldHVybiJDT05ORUNUSU5HIjtjYXNlIFdlYlNvY2tldC5PUEVOOnJldHVybiJPUEVOIjtjYXNlIFdlYlNvY2tldC5DTE9TSU5HOnJldHVybiJDTE9TSU5HIjtjYXNlIFdlYlNvY2tldC5DTE9TRUQ6cmV0dXJuIkNMT1NFRCI7ZGVmYXVsdDpyZXR1cm4iVU5ERUZJTkVEIn19LGo9ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06IiI7bGUoZS5kZWJ1ZygiWyIrdCsiXSBQcmltYXJ5IFdlYlNvY2tldDogIitGKG4ucHJpbWFyeSkrIiB8IFNlY29uZGFyeSBXZWJTb2NrZXQ6ICIrRihuLnNlY29uZGFyeSkpKX0scT1mdW5jdGlvbihlLHQpe3JldHVybiBlJiZlLnJlYWR5U3RhdGU9PT10fSxCPWZ1bmN0aW9uKGUpe3JldHVybiBxKGUsV2ViU29ja2V0Lk9QRU4pfSxHPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZXx8dm9pZCAwPT09ZS5yZWFkeVN0YXRlfHxxKGUsV2ViU29ja2V0LkNMT1NFRCl9LFY9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9PW4uc2Vjb25kYXJ5P24uc2Vjb25kYXJ5Om4ucHJpbWFyeX0sVz1mdW5jdGlvbigpe3JldHVybiBCKFYoKSl9LEg9ZnVuY3Rpb24oKXtpZihpLnBlbmRpbmdSZXNwb25zZSlyZXR1cm4gZS5hZHZhbmNlZExvZyhsKSxsZShlLndhcm4obCkpLGNsZWFySW50ZXJ2YWwoaS5pbnRlcnZhbEhhbmRsZSksaS5wZW5kaW5nUmVzcG9uc2U9ITEsdm9pZCBzZSgpO1coKT8obGUoZS5kZWJ1ZygiU2VuZGluZyBoZWFydGJlYXQiKSksVigpLnNlbmQoaWUoXykpLGkucGVuZGluZ1Jlc3BvbnNlPSEwKTooZS5hZHZhbmNlZExvZyhwKSxsZShlLndhcm4ocCkpLGooInNlbmRIZWFydEJlYXQiKSxzZSgpKX0sSz1mdW5jdGlvbigpe2UuYWR2YW5jZWRMb2coIlJlc2V0IFdlYnNvY2tldCBzdGF0ZSIpLHIuZXhwb25lbnRpYWxCYWNrT2ZmVGltZT0xZTMsaS5wZW5kaW5nUmVzcG9uc2U9ITEsci5yZWNvbm5lY3RXZWJTb2NrZXQ9ITAsY2xlYXJUaW1lb3V0KHIubGlmZVRpbWVUaW1lb3V0SGFuZGxlKSxjbGVhckludGVydmFsKGkuaW50ZXJ2YWxIYW5kbGUpLGNsZWFyVGltZW91dChyLmV4cG9uZW50aWFsVGltZW91dEhhbmRsZSksY2xlYXJUaW1lb3V0KHIud2ViU29ja2V0SW5pdENoZWNrZXJUaW1lb3V0SWQpfSxYPWZ1bmN0aW9uKCl7UC5jb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzPTAsUC5jb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0PTAsY2xlYXJJbnRlcnZhbChQLnJlc3BvbnNlQ2hlY2tJbnRlcnZhbElkKSxjbGVhckludGVydmFsKFAucmVTdWJzY3JpYmVJbnRlcnZhbElkKX0sSj1mdW5jdGlvbigpe28uY29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQ9MCxvLmNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lPW51bGwsby5ub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcD1udWxsfSxRPWZ1bmN0aW9uKCl7RC5jb25uZWN0ZWQoKTt0cnl7ZS5hZHZhbmNlZExvZyhkKSxsZShlLmluZm8oZCkpLGooIndlYlNvY2tldE9uT3BlbiIpLG51bGwhPT1yLmNvbm5TdGF0ZSYmci5jb25uU3RhdGUhPT1SfHxVKEwuY29ubmVjdGlvbkdhaW4pLHIuY29ublN0YXRlPSJjb25uZWN0ZWQiO3ZhciB0PURhdGUubm93KCk7VShMLmNvbm5lY3Rpb25PcGVuLHtjb25uZWN0V2ViU29ja2V0UmV0cnlDb3VudDpvLmNvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50LGNvbm5lY3Rpb25BdHRlbXB0U3RhcnRUaW1lOm8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWUsbm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA6by5ub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcCxjb25uZWN0aW9uRXN0YWJsaXNoZWRUaW1lOnQsdGltZVRvQ29ubmVjdDp0LW8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWUsdGltZVdpdGhvdXRDb25uZWN0aW9uOm8ubm9PcGVuQ29ubmVjdGlvbnNUaW1lc3RhbXA/dC1vLm5vT3BlbkNvbm5lY3Rpb25zVGltZXN0YW1wOm51bGx9KSxKKCksSygpLFYoKS5vcGVuVGltZXN0YW1wPURhdGUubm93KCksMD09PWsuc3Vic2NyaWJlZC5zaXplJiZCKG4uc2Vjb25kYXJ5KSYmdGUobi5wcmltYXJ5LCJbUHJpbWFyeSBXZWJTb2NrZXRdIENsb3NpbmcgV2ViU29ja2V0IiksKGsuc3Vic2NyaWJlZC5zaXplPjB8fGsucGVuZGluZy5zaXplPjApJiYoQihuLnNlY29uZGFyeSkmJmxlKGUuaW5mbygiU3Vic2NyaWJpbmcgc2Vjb25kYXJ5IHdlYnNvY2tldCB0byB0b3BpY3Mgb2YgcHJpbWFyeSB3ZWJzb2NrZXQiKSksay5zdWJzY3JpYmVkLmZvckVhY2goKGZ1bmN0aW9uKGUpe2suc3Vic2NyaXB0aW9uSGlzdG9yeS5hZGQoZSksay5wZW5kaW5nLmFkZChlKX0pKSxrLnN1YnNjcmliZWQuY2xlYXIoKSxlZSgpKSxIKCksaS5pbnRlcnZhbEhhbmRsZT1zZXRJbnRlcnZhbChILDFlNCk7dmFyIGE9MWUzKk8uY29ubkNvbmZpZy53ZWJTb2NrZXRUcmFuc3BvcnQudHJhbnNwb3J0TGlmZVRpbWVJblNlY29uZHM7bGUoZS5kZWJ1ZygiU2NoZWR1bGluZyBXZWJTb2NrZXQgbWFuYWdlciByZWNvbm5lY3Rpb24sIGFmdGVyIGRlbGF5ICIrYSsiIG1zIikpLHIubGlmZVRpbWVUaW1lb3V0SGFuZGxlPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7bGUoZS5kZWJ1ZygiU3RhcnRpbmcgc2NoZWR1bGVkIFdlYlNvY2tldCBtYW5hZ2VyIHJlY29ubmVjdGlvbiIpKSxzZSgpfSksYSl9Y2F0Y2godCl7bGUoZS5lcnJvcigiRXJyb3IgYWZ0ZXIgZXN0YWJsaXNoaW5nIFdlYlNvY2tldCBjb25uZWN0aW9uIix0KSl9fSxaPWZ1bmN0aW9uKHQpe2ooIndlYlNvY2tldE9uRXJyb3IiKSxlLmFkdmFuY2VkTG9nKGgsSlNPTi5zdHJpbmdpZnkodCkpLGxlKGUuZXJyb3IoaCxKU09OLnN0cmluZ2lmeSh0KSkpLEQuZ2V0SXNDb25uZWN0ZWQoKT9zZSgpOkQucmV0cnkoKX0sJD1mdW5jdGlvbih0KXt2YXIgcj1KU09OLnBhcnNlKHQuZGF0YSk7c3dpdGNoKHIudG9waWMpe2Nhc2UgQTppZihsZShlLmRlYnVnKCJTdWJzY3JpcHRpb24gTWVzc2FnZSByZWNlaXZlZCBmcm9tIHdlYlNvY2tldCBzZXJ2ZXIiLHQuZGF0YSkpLFAucmVxdWVzdENvbXBsZXRlZD0hMCxQLmNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3Q9MCwic3VjY2VzcyI9PT1yLmNvbnRlbnQuc3RhdHVzKVAuY29uc2VjdXRpdmVGYWlsZWRTdWJzY3JpYmVBdHRlbXB0cz0wLHIuY29udGVudC50b3BpY3MuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ay5zdWJzY3JpcHRpb25IaXN0b3J5LmRlbGV0ZShlKSxrLnBlbmRpbmcuZGVsZXRlKGUpLGsuc3Vic2NyaWJlZC5hZGQoZSl9KSksMD09PWsuc3Vic2NyaXB0aW9uSGlzdG9yeS5zaXplP0Iobi5zZWNvbmRhcnkpJiYobGUoZS5pbmZvKCJTdWNjZXNzZnVsbHkgc3Vic2NyaWJlZCBzZWNvbmRhcnkgd2Vic29ja2V0IHRvIGFsbCB0b3BpY3Mgb2YgcHJpbWFyeSB3ZWJzb2NrZXQiKSksdGUobi5wcmltYXJ5LCJbUHJpbWFyeSBXZWJTb2NrZXRdIENsb3NpbmcgV2ViU29ja2V0IikpOmVlKCksVShMLnN1YnNjcmlwdGlvblVwZGF0ZSxyKTtlbHNle2lmKGNsZWFySW50ZXJ2YWwoUC5yZVN1YnNjcmliZUludGVydmFsSWQpLCsrUC5jb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzLDU9PT1QLmNvbnNlY3V0aXZlRmFpbGVkU3Vic2NyaWJlQXR0ZW1wdHMpcmV0dXJuIFUoTC5zdWJzY3JpcHRpb25GYWlsdXJlLHIpLHZvaWQoUC5jb25zZWN1dGl2ZUZhaWxlZFN1YnNjcmliZUF0dGVtcHRzPTApO1AucmVTdWJzY3JpYmVJbnRlcnZhbElkPXNldEludGVydmFsKChmdW5jdGlvbigpe2VlKCl9KSw1MDApfWJyZWFrO2Nhc2UgXzpsZShlLmRlYnVnKCJIZWFydGJlYXQgcmVzcG9uc2UgcmVjZWl2ZWQiKSksaS5wZW5kaW5nUmVzcG9uc2U9ITE7YnJlYWs7ZGVmYXVsdDppZihyLnRvcGljKXtpZihlLmFkdmFuY2VkTG9nKEksci50b3BpYyksbGUoZS5kZWJ1ZyhJK3IudG9waWMpKSxCKG4ucHJpbWFyeSkmJkIobi5zZWNvbmRhcnkpJiYwPT09ay5zdWJzY3JpcHRpb25IaXN0b3J5LnNpemUmJnRoaXM9PT1uLnByaW1hcnkpcmV0dXJuIHZvaWQgbGUoZS53YXJuKCJJZ25vcmluZyBNZXNzYWdlIGZvciBUb3BpYyAiK3IudG9waWMrIiwgdG8gYXZvaWQgZHVwbGljYXRlcyIpKTtpZigwPT09TC5hbGxNZXNzYWdlLnNpemUmJjA9PT1MLnRvcGljLnNpemUpcmV0dXJuIHZvaWQgbGUoZS53YXJuKCJObyByZWdpc3RlcmVkIGNhbGxiYWNrIGxpc3RlbmVyIGZvciBUb3BpYyIsci50b3BpYykpO2UuYWR2YW5jZWRMb2coIldlYnNvY2tldE1hbmFnZXIgaW52b2tlIGNhbGxiYWNrcyBmb3IgdG9waWMgc3VjY2VzcyAiLHIudG9waWMpLFUoTC5hbGxNZXNzYWdlLHIpLEwudG9waWMuaGFzKHIudG9waWMpJiZVKEwudG9waWMuZ2V0KHIudG9waWMpLHIpfWVsc2Ugci5tZXNzYWdlPyhlLmFkdmFuY2VkTG9nKFQsciksbGUoZS53YXJuKFQscikpKTooZS5hZHZhbmNlZExvZyh3LHIpLGxlKGUud2Fybih3LHIpKSl9fSxlZT1mdW5jdGlvbiB0KCl7aWYoUC5jb25zZWN1dGl2ZU5vUmVzcG9uc2VSZXF1ZXN0PjMpcmV0dXJuIGxlKGUud2FybigiSWdub3Jpbmcgc3Vic2NyaWJlUGVuZGluZ1RvcGljcyBzaW5jZSB3ZSBoYXZlIGV4aGF1c3RlZCBtYXggc3Vic2NyaXB0aW9uIHJldHJpZXMgd2l0aCBubyByZXNwb25zZSIpKSx2b2lkIFUoTC5zdWJzY3JpcHRpb25GYWlsdXJlLE4uZ2V0U3Vic2NyaXB0aW9uUmVzcG9uc2UoQSwhMSxBcnJheS5mcm9tKGsucGVuZGluZykpKTtXKCk/MCE9PUFycmF5LmZyb20oay5wZW5kaW5nKS5sZW5ndGgmJihjbGVhckludGVydmFsKFAucmVzcG9uc2VDaGVja0ludGVydmFsSWQpLFYoKS5zZW5kKGllKEEse3RvcGljczpBcnJheS5mcm9tKGsucGVuZGluZyl9KSksUC5yZXF1ZXN0Q29tcGxldGVkPSExLFAucmVzcG9uc2VDaGVja0ludGVydmFsSWQ9c2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7UC5yZXF1ZXN0Q29tcGxldGVkfHwoKytQLmNvbnNlY3V0aXZlTm9SZXNwb25zZVJlcXVlc3QsdCgpKX0pLDFlMykpOmxlKGUud2FybigiSWdub3Jpbmcgc3Vic2NyaWJlUGVuZGluZ1RvcGljcyBjYWxsIHNpbmNlIERlZmF1bHQgV2ViU29ja2V0IGlzIG5vdCBvcGVuIikpfSx0ZT1mdW5jdGlvbih0LG4pe3EodCxXZWJTb2NrZXQuQ09OTkVDVElORyl8fHEodCxXZWJTb2NrZXQuT1BFTik/dC5jbG9zZSgxZTMsbik6bGUoZS53YXJuKCJJZ25vcmluZyBXZWJTb2NrZXQgQ2xvc2UgcmVxdWVzdCwgV2ViU29ja2V0IFN0YXRlOiAiK0YodCkpKX0sbmU9ZnVuY3Rpb24oZSl7dGUobi5wcmltYXJ5LCJbUHJpbWFyeV0gV2ViU29ja2V0ICIrZSksdGUobi5zZWNvbmRhcnksIltTZWNvbmRhcnldIFdlYlNvY2tldCAiK2UpfSxyZT1mdW5jdGlvbigpe28uY29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQrKzt2YXIgdD1OLmFkZEppdHRlcihyLmV4cG9uZW50aWFsQmFja09mZlRpbWUsLjMpO0RhdGUubm93KCkrdDw9Ty5jb25uQ29uZmlnLnVybENvbm5WYWxpZFRpbWU/KGUuYWR2YW5jZWRMb2coZyksbGUoZS5kZWJ1ZyhnK3QrIiBtcyIpKSxyLmV4cG9uZW50aWFsVGltZW91dEhhbmRsZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBjZSgpfSksdCksci5leHBvbmVudGlhbEJhY2tPZmZUaW1lKj0yKTooZS5hZHZhbmNlZExvZyhtKSxsZShlLndhcm4obSkpLHNlKCkpfSxvZT1mdW5jdGlvbih0KXtLKCksWCgpLGUuYWR2YW5jZWRMb2codix0KSxsZShlLmVycm9yKHYpKSxyLndlYnNvY2tldEluaXRGYWlsZWQ9ITAsbmUoIlRlcm1pbmF0aW5nIFdlYlNvY2tldCBNYW5hZ2VyIiksY2xlYXJJbnRlcnZhbChNKSxVKEwuaW5pdEZhaWx1cmUse2Nvbm5lY3RXZWJTb2NrZXRSZXRyeUNvdW50Om8uY29ubmVjdFdlYlNvY2tldFJldHJ5Q291bnQsY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWU6by5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZSxyZWFzb246dH0pLEooKX0saWU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoe3RvcGljOmUsY29udGVudDp0fSl9LGFlPWZ1bmN0aW9uKHQpe3JldHVybiEhKE4uaXNPYmplY3QodCkmJk4uaXNPYmplY3QodC53ZWJTb2NrZXRUcmFuc3BvcnQpJiZOLmlzTm9uRW1wdHlTdHJpbmcodC53ZWJTb2NrZXRUcmFuc3BvcnQudXJsKSYmTi52YWxpZFdTVXJsKHQud2ViU29ja2V0VHJhbnNwb3J0LnVybCkmJjFlMyp0LndlYlNvY2tldFRyYW5zcG9ydC50cmFuc3BvcnRMaWZlVGltZUluU2Vjb25kcz49M2U1KXx8KGxlKGUuZXJyb3IoIkludmFsaWQgV2ViU29ja2V0IENvbm5lY3Rpb24gQ29uZmlndXJhdGlvbiIsdCkpLCExKX0sc2U9ZnVuY3Rpb24oKXtpZighTi5pc05ldHdvcmtPbmxpbmUoKSlyZXR1cm4gZS5hZHZhbmNlZExvZyh1KSx2b2lkIGxlKGUuaW5mbyh1KSk7aWYoci53ZWJzb2NrZXRJbml0RmFpbGVkKWxlKGUuZGVidWcoIldlYlNvY2tldCBJbml0IGhhZCBmYWlsZWQsIGlnbm9yaW5nIHRoaXMgZ2V0V2ViU29ja2V0Q29ubkNvbmZpZyByZXF1ZXN0IikpO2Vsc2V7aWYoTy5wcm9taXNlQ29tcGxldGVkKXJldHVybiBLKCksZS5hZHZhbmNlZExvZyh5KSxsZShlLmluZm8oeSkpLG8uY29ubmVjdGlvbkF0dGVtcHRTdGFydFRpbWU9by5jb25uZWN0aW9uQXR0ZW1wdFN0YXJ0VGltZXx8RGF0ZS5ub3coKSxPLnByb21pc2VDb21wbGV0ZWQ9ITEsTy5wcm9taXNlSGFuZGxlPUwuZ2V0V2ViU29ja2V0VHJhbnNwb3J0KCksTy5wcm9taXNlSGFuZGxlLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiBPLnByb21pc2VDb21wbGV0ZWQ9ITAsZS5hZHZhbmNlZExvZyhiKSxsZShlLmRlYnVnKGIsdCkpLGFlKHQpPyhPLmNvbm5Db25maWc9dCxPLmNvbm5Db25maWcudXJsQ29ublZhbGlkVGltZT1EYXRlLm5vdygpKzg1ZTMsY2UoKSk6KG9lKCJJbnZhbGlkIFdlYlNvY2tldCBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb246ICIrdCkse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITB9KX0pLChmdW5jdGlvbih0KXtyZXR1cm4gTy5wcm9taXNlQ29tcGxldGVkPSEwLGUuYWR2YW5jZWRMb2coRSksbGUoZS5lcnJvcihFLHQpKSxOLmlzTmV0d29ya0ZhaWx1cmUodCk/KGUuYWR2YW5jZWRMb2coUytKU09OLnN0cmluZ2lmeSh0KSksbGUoZS5pbmZvKFMrSlNPTi5zdHJpbmdpZnkodCkpKSxELnJldHJ5KCkpOm9lKCJGYWlsZWQgdG8gZmV0Y2ggd2ViU29ja2V0IGNvbm5lY3Rpb24gY29uZmlndXJhdGlvbjogIitKU09OLnN0cmluZ2lmeSh0KSkse3dlYlNvY2tldENvbm5lY3Rpb25GYWlsZWQ6ITB9fSkpO2xlKGUuZGVidWcoIlRoZXJlIGlzIGFuIG9uZ29pbmcgZ2V0V2ViU29ja2V0Q29ubkNvbmZpZyByZXF1ZXN0LCB0aGlzIHJlcXVlc3Qgd2lsbCBiZSBpZ25vcmVkIikpfX0sY2U9ZnVuY3Rpb24oKXtpZihyLndlYnNvY2tldEluaXRGYWlsZWQpcmV0dXJuIGxlKGUuaW5mbygid2ViLXNvY2tldCBpbml0aWFsaXppbmcgaGFkIGZhaWxlZCwgYWJvcnRpbmcgcmUtaW5pdCIpKSx7d2ViU29ja2V0Q29ubmVjdGlvbkZhaWxlZDohMH07aWYoIU4uaXNOZXR3b3JrT25saW5lKCkpcmV0dXJuIGxlKGUud2FybigiU3lzdGVtIGlzIG9mZmxpbmUgYWJvcnRpbmcgd2ViLXNvY2tldCBpbml0IikpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiEwfTtlLmFkdmFuY2VkTG9nKEMpLGxlKGUuaW5mbyhDKSksaigiaW5pdFdlYlNvY2tldCIpO3RyeXtpZihhZShPLmNvbm5Db25maWcpKXt2YXIgdD1udWxsO3JldHVybiBCKG4ucHJpbWFyeSk/KGxlKGUuZGVidWcoIlByaW1hcnkgU29ja2V0IGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBvcGVuIikpLHEobi5zZWNvbmRhcnksV2ViU29ja2V0LkNPTk5FQ1RJTkcpfHwobGUoZS5kZWJ1ZygiRXN0YWJsaXNoaW5nIGEgc2Vjb25kYXJ5IHdlYi1zb2NrZXQgY29ubmVjdGlvbiIpKSxELm51bUF0dGVtcHRzPTAsbi5zZWNvbmRhcnk9dWUoKSksdD1uLnNlY29uZGFyeSk6KHEobi5wcmltYXJ5LFdlYlNvY2tldC5DT05ORUNUSU5HKXx8KGxlKGUuZGVidWcoIkVzdGFibGlzaGluZyBhIHByaW1hcnkgd2ViLXNvY2tldCBjb25uZWN0aW9uIikpLG4ucHJpbWFyeT11ZSgpKSx0PW4ucHJpbWFyeSksci53ZWJTb2NrZXRJbml0Q2hlY2tlclRpbWVvdXRJZD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe0IodCl8fHJlKCl9KSwxZTMpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiExfX19Y2F0Y2godCl7cmV0dXJuIGxlKGUuZXJyb3IoIkVycm9yIEluaXRpYWxpemluZyB3ZWItc29ja2V0LW1hbmFnZXIiLHQpKSxvZSgiRmFpbGVkIHRvIGluaXRpYWxpemUgbmV3IFdlYlNvY2tldDogIit0Lm1lc3NhZ2UpLHt3ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkOiEwfX19LHVlPWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IFdlYlNvY2tldChPLmNvbm5Db25maWcud2ViU29ja2V0VHJhbnNwb3J0LnVybCk7cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcigib3BlbiIsUSksdC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwkKSx0LmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixaKSx0LmFkZEV2ZW50TGlzdGVuZXIoImNsb3NlIiwoZnVuY3Rpb24oaSl7cmV0dXJuIGZ1bmN0aW9uKHQsaSl7ZS5hZHZhbmNlZExvZyhmLEpTT04uc3RyaW5naWZ5KHQpKSxsZShlLmluZm8oZixKU09OLnN0cmluZ2lmeSh0KSkpLGooIndlYlNvY2tldE9uQ2xvc2UgYmVmb3JlLWNsZWFudXAiKSxVKEwuY29ubmVjdGlvbkNsb3NlLHtvcGVuVGltZXN0YW1wOmkub3BlblRpbWVzdGFtcCxjbG9zZVRpbWVzdGFtcDpEYXRlLm5vdygpLGNvbm5lY3Rpb25EdXJhdGlvbjpEYXRlLm5vdygpLWkub3BlblRpbWVzdGFtcCxjb2RlOnQuY29kZSxyZWFzb246dC5yZWFzb259KSxHKG4ucHJpbWFyeSkmJihuLnByaW1hcnk9bnVsbCksRyhuLnNlY29uZGFyeSkmJihuLnNlY29uZGFyeT1udWxsKSxyLnJlY29ubmVjdFdlYlNvY2tldCYmKEIobi5wcmltYXJ5KXx8QihuLnNlY29uZGFyeSk/RyhuLnByaW1hcnkpJiZCKG4uc2Vjb25kYXJ5KSYmKGxlKGUuaW5mbygiW1ByaW1hcnldIFdlYlNvY2tldCBDbGVhbmx5IENsb3NlZCIpKSxuLnByaW1hcnk9bi5zZWNvbmRhcnksbi5zZWNvbmRhcnk9bnVsbCk6KGxlKGUud2FybigiTmVpdGhlciBwcmltYXJ5IHdlYnNvY2tldCBhbmQgbm9yIHNlY29uZGFyeSB3ZWJzb2NrZXQgaGF2ZSBvcGVuIGNvbm5lY3Rpb25zLCBhdHRlbXB0aW5nIHRvIHJlLWVzdGFibGlzaCBjb25uZWN0aW9uIikpLHIuY29ublN0YXRlPT09Uj9sZShlLmluZm8oIklnbm9yaW5nIGNvbm5lY3Rpb25Mb3N0IGNhbGxiYWNrIGludm9jYXRpb24iKSk6KFUoTC5jb25uZWN0aW9uTG9zdCx7b3BlblRpbWVzdGFtcDppLm9wZW5UaW1lc3RhbXAsY2xvc2VUaW1lc3RhbXA6RGF0ZS5ub3coKSxjb25uZWN0aW9uRHVyYXRpb246RGF0ZS5ub3coKS1pLm9wZW5UaW1lc3RhbXAsY29kZTp0LmNvZGUscmVhc29uOnQucmVhc29ufSksby5ub09wZW5Db25uZWN0aW9uc1RpbWVzdGFtcD1EYXRlLm5vdygpKSxyLmNvbm5TdGF0ZT1SLHNlKCkpLGooIndlYlNvY2tldE9uQ2xvc2UgYWZ0ZXItY2xlYW51cCIpKX0oaSx0KX0pKSx0fSxsZT1mdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXImJmUuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlfTt0aGlzLmluaXQ9ZnVuY3Rpb24odCl7aWYoTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwidHJhbnNwb3J0SGFuZGxlIG11c3QgYmUgYSBmdW5jdGlvbiIpLG51bGw9PT1MLmdldFdlYlNvY2tldFRyYW5zcG9ydClyZXR1cm4gTC5nZXRXZWJTb2NrZXRUcmFuc3BvcnQ9dCxzZSgpO2xlKGUud2FybigiV2ViIFNvY2tldCBNYW5hZ2VyIHdhcyBhbHJlYWR5IGluaXRpYWxpemVkIikpfSx0aGlzLm9uSW5pdEZhaWx1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIkluaXRpYWxpemluZyBXZWJzb2NrZXQgTWFuYWdlciBGYWlsZWQhIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksTC5pbml0RmFpbHVyZS5hZGQodCksci53ZWJzb2NrZXRJbml0RmFpbGVkJiZ0KCksZnVuY3Rpb24oKXtyZXR1cm4gTC5pbml0RmFpbHVyZS5kZWxldGUodCl9fSx0aGlzLm9uQ29ubmVjdGlvbk9wZW49ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIldlYnNvY2tldCBjb25uZWN0aW9uIG9wZW4iKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxMLmNvbm5lY3Rpb25PcGVuLmFkZCh0KSxmdW5jdGlvbigpe3JldHVybiBMLmNvbm5lY3Rpb25PcGVuLmRlbGV0ZSh0KX19LHRoaXMub25Db25uZWN0aW9uQ2xvc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIldlYnNvY2tldCBjb25uZWN0aW9uIGNsb3NlIiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksTC5jb25uZWN0aW9uQ2xvc2UuYWRkKHQpLGZ1bmN0aW9uKCl7cmV0dXJuIEwuY29ubmVjdGlvbkNsb3NlLmRlbGV0ZSh0KX19LHRoaXMub25Db25uZWN0aW9uR2Fpbj1mdW5jdGlvbih0KXtyZXR1cm4gZS5hZHZhbmNlZExvZygiV2Vic29ja2V0IGNvbm5lY3Rpb24gZ2FpbiIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLEwuY29ubmVjdGlvbkdhaW4uYWRkKHQpLFcoKSYmdCgpLGZ1bmN0aW9uKCl7cmV0dXJuIEwuY29ubmVjdGlvbkdhaW4uZGVsZXRlKHQpfX0sdGhpcy5vbkNvbm5lY3Rpb25Mb3N0PWZ1bmN0aW9uKHQpe3JldHVybiBlLmFkdmFuY2VkTG9nKCJXZWJzb2NrZXQgY29ubmVjdGlvbiBsb3N0IiksTi5hc3NlcnRUcnVlKE4uaXNGdW5jdGlvbih0KSwiY2IgbXVzdCBiZSBhIGZ1bmN0aW9uIiksTC5jb25uZWN0aW9uTG9zdC5hZGQodCksci5jb25uU3RhdGU9PT1SJiZ0KCksZnVuY3Rpb24oKXtyZXR1cm4gTC5jb25uZWN0aW9uTG9zdC5kZWxldGUodCl9fSx0aGlzLm9uU3Vic2NyaXB0aW9uVXBkYXRlPWZ1bmN0aW9uKGUpe3JldHVybiBOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKGUpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxMLnN1YnNjcmlwdGlvblVwZGF0ZS5hZGQoZSksZnVuY3Rpb24oKXtyZXR1cm4gTC5zdWJzY3JpcHRpb25VcGRhdGUuZGVsZXRlKGUpfX0sdGhpcy5vblN1YnNjcmlwdGlvbkZhaWx1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIGUuYWR2YW5jZWRMb2coIldlYnNvY2tldCBzdWJzY3JpcHRpb24gZmFpbHVyZSIpLE4uYXNzZXJ0VHJ1ZShOLmlzRnVuY3Rpb24odCksImNiIG11c3QgYmUgYSBmdW5jdGlvbiIpLEwuc3Vic2NyaXB0aW9uRmFpbHVyZS5hZGQodCksZnVuY3Rpb24oKXtyZXR1cm4gTC5zdWJzY3JpcHRpb25GYWlsdXJlLmRlbGV0ZSh0KX19LHRoaXMub25NZXNzYWdlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIE4uYXNzZXJ0Tm90TnVsbChlLCJ0b3BpY05hbWUiKSxOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKHQpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxMLnRvcGljLmhhcyhlKT9MLnRvcGljLmdldChlKS5hZGQodCk6TC50b3BpYy5zZXQoZSxuZXcgU2V0KFt0XSkpLGZ1bmN0aW9uKCl7cmV0dXJuIEwudG9waWMuZ2V0KGUpLmRlbGV0ZSh0KX19LHRoaXMub25BbGxNZXNzYWdlPWZ1bmN0aW9uKGUpe3JldHVybiBOLmFzc2VydFRydWUoTi5pc0Z1bmN0aW9uKGUpLCJjYiBtdXN0IGJlIGEgZnVuY3Rpb24iKSxMLmFsbE1lc3NhZ2UuYWRkKGUpLGZ1bmN0aW9uKCl7cmV0dXJuIEwuYWxsTWVzc2FnZS5kZWxldGUoZSl9fSx0aGlzLnN1YnNjcmliZVRvcGljcz1mdW5jdGlvbihlKXtOLmFzc2VydE5vdE51bGwoZSwidG9waWNzIiksTi5hc3NlcnRJc0xpc3QoZSksZS5mb3JFYWNoKChmdW5jdGlvbihlKXtrLnN1YnNjcmliZWQuaGFzKGUpfHxrLnBlbmRpbmcuYWRkKGUpfSkpLFAuY29uc2VjdXRpdmVOb1Jlc3BvbnNlUmVxdWVzdD0wLGVlKCl9LHRoaXMuc2VuZE1lc3NhZ2U9ZnVuY3Rpb24odCl7aWYoTi5hc3NlcnRJc09iamVjdCh0LCJwYXlsb2FkIiksdm9pZCAwPT09dC50b3BpY3x8eC5oYXModC50b3BpYykpbGUoZS53YXJuKCJDYW5ub3Qgc2VuZCBtZXNzYWdlLCBJbnZhbGlkIHRvcGljIix0KSk7ZWxzZXt0cnl7dD1KU09OLnN0cmluZ2lmeSh0KX1jYXRjaChuKXtyZXR1cm4gdm9pZCBsZShlLndhcm4oIkVycm9yIHN0cmluZ2lmeSBtZXNzYWdlIix0KSl9VygpP1YoKS5zZW5kKHQpOmxlKGUud2FybigiQ2Fubm90IHNlbmQgbWVzc2FnZSwgd2ViIHNvY2tldCBjb25uZWN0aW9uIGlzIG5vdCBvcGVuIikpfX0sdGhpcy5jbG9zZVdlYlNvY2tldD1mdW5jdGlvbigpe0soKSxYKCksci5yZWNvbm5lY3RXZWJTb2NrZXQ9ITEsY2xlYXJJbnRlcnZhbChNKSxuZSgiVXNlciByZXF1ZXN0IHRvIGNsb3NlIFdlYlNvY2tldCIpfSx0aGlzLnRlcm1pbmF0ZVdlYlNvY2tldE1hbmFnZXI9b2V9LEo9e2NyZWF0ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgWH0sc2V0R2xvYmFsQ29uZmlnOmZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUubG9nZ2VyQ29uZmlnO3oudXBkYXRlTG9nZ2VyQ29uZmlnKHQpfSxMb2dMZXZlbDpCLExvZ2dlcjpqfX0sZnVuY3Rpb24odCxuLHIpe3ZhciBvOyFmdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgaT17bm90X3N0cmluZzovW15zXS8sbm90X2Jvb2w6L1tedF0vLG5vdF90eXBlOi9bXlRdLyxub3RfcHJpbWl0aXZlOi9bXnZdLyxudW1iZXI6L1tkaWVmZ10vLG51bWVyaWNfYXJnOi9bYmNkaWVmZ3V4WF0vLGpzb246L1tqXS8sbm90X2pzb246L1teal0vLHRleHQ6L15bXlx4MjVdKy8sbW9kdWxvOi9eXHgyNXsyfS8scGxhY2Vob2xkZXI6L15ceDI1KD86KFsxLTldXGQqKVwkfFwoKFteKV0rKVwpKT8oXCspPygwfCdbXiRdKT8oLSk/KFxkKyk/KD86XC4oXGQrKSk/KFtiLWdpam9zdFR1dnhYXSkvLGtleTovXihbYS16X11bYS16X1xkXSopL2ksa2V5X2FjY2VzczovXlwuKFthLXpfXVthLXpfXGRdKikvaSxpbmRleF9hY2Nlc3M6L15cWyhcZCspXF0vLHNpZ246L15bKy1dL307ZnVuY3Rpb24gYSh0KXtyZXR1cm4gZnVuY3Rpb24odCxuKXt2YXIgcixvLHMsYyx1LGwscCxkLGYsaD0xLGc9dC5sZW5ndGgsbT0iIjtmb3Iobz0wO288ZztvKyspaWYoInN0cmluZyI9PXR5cGVvZiB0W29dKW0rPXRbb107ZWxzZSBpZigib2JqZWN0Ij09ZSh0W29dKSl7aWYoKGM9dFtvXSkua2V5cylmb3Iocj1uW2hdLHM9MDtzPGMua2V5cy5sZW5ndGg7cysrKXtpZihudWxsPT1yKXRocm93IG5ldyBFcnJvcihhKCdbc3ByaW50Zl0gQ2Fubm90IGFjY2VzcyBwcm9wZXJ0eSAiJXMiIG9mIHVuZGVmaW5lZCB2YWx1ZSAiJXMiJyxjLmtleXNbc10sYy5rZXlzW3MtMV0pKTtyPXJbYy5rZXlzW3NdXX1lbHNlIHI9Yy5wYXJhbV9ubz9uW2MucGFyYW1fbm9dOm5baCsrXTtpZihpLm5vdF90eXBlLnRlc3QoYy50eXBlKSYmaS5ub3RfcHJpbWl0aXZlLnRlc3QoYy50eXBlKSYmciBpbnN0YW5jZW9mIEZ1bmN0aW9uJiYocj1yKCkpLGkubnVtZXJpY19hcmcudGVzdChjLnR5cGUpJiYibnVtYmVyIiE9dHlwZW9mIHImJmlzTmFOKHIpKXRocm93IG5ldyBUeXBlRXJyb3IoYSgiW3NwcmludGZdIGV4cGVjdGluZyBudW1iZXIgYnV0IGZvdW5kICVUIixyKSk7c3dpdGNoKGkubnVtYmVyLnRlc3QoYy50eXBlKSYmKGQ9cj49MCksYy50eXBlKXtjYXNlImIiOnI9cGFyc2VJbnQociwxMCkudG9TdHJpbmcoMik7YnJlYWs7Y2FzZSJjIjpyPVN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQociwxMCkpO2JyZWFrO2Nhc2UiZCI6Y2FzZSJpIjpyPXBhcnNlSW50KHIsMTApO2JyZWFrO2Nhc2UiaiI6cj1KU09OLnN0cmluZ2lmeShyLG51bGwsYy53aWR0aD9wYXJzZUludChjLndpZHRoKTowKTticmVhaztjYXNlImUiOnI9Yy5wcmVjaXNpb24/cGFyc2VGbG9hdChyKS50b0V4cG9uZW50aWFsKGMucHJlY2lzaW9uKTpwYXJzZUZsb2F0KHIpLnRvRXhwb25lbnRpYWwoKTticmVhaztjYXNlImYiOnI9Yy5wcmVjaXNpb24/cGFyc2VGbG9hdChyKS50b0ZpeGVkKGMucHJlY2lzaW9uKTpwYXJzZUZsb2F0KHIpO2JyZWFrO2Nhc2UiZyI6cj1jLnByZWNpc2lvbj9TdHJpbmcoTnVtYmVyKHIudG9QcmVjaXNpb24oYy5wcmVjaXNpb24pKSk6cGFyc2VGbG9hdChyKTticmVhaztjYXNlIm8iOnI9KHBhcnNlSW50KHIsMTApPj4+MCkudG9TdHJpbmcoOCk7YnJlYWs7Y2FzZSJzIjpyPVN0cmluZyhyKSxyPWMucHJlY2lzaW9uP3Iuc3Vic3RyaW5nKDAsYy5wcmVjaXNpb24pOnI7YnJlYWs7Y2FzZSJ0IjpyPVN0cmluZyghIXIpLHI9Yy5wcmVjaXNpb24/ci5zdWJzdHJpbmcoMCxjLnByZWNpc2lvbik6cjticmVhaztjYXNlIlQiOnI9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpLnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCkscj1jLnByZWNpc2lvbj9yLnN1YnN0cmluZygwLGMucHJlY2lzaW9uKTpyO2JyZWFrO2Nhc2UidSI6cj1wYXJzZUludChyLDEwKT4+PjA7YnJlYWs7Y2FzZSJ2IjpyPXIudmFsdWVPZigpLHI9Yy5wcmVjaXNpb24/ci5zdWJzdHJpbmcoMCxjLnByZWNpc2lvbik6cjticmVhaztjYXNlIngiOnI9KHBhcnNlSW50KHIsMTApPj4+MCkudG9TdHJpbmcoMTYpO2JyZWFrO2Nhc2UiWCI6cj0ocGFyc2VJbnQociwxMCk+Pj4wKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX1pLmpzb24udGVzdChjLnR5cGUpP20rPXI6KCFpLm51bWJlci50ZXN0KGMudHlwZSl8fGQmJiFjLnNpZ24/Zj0iIjooZj1kPyIrIjoiLSIscj1yLnRvU3RyaW5nKCkucmVwbGFjZShpLnNpZ24sIiIpKSxsPWMucGFkX2NoYXI/IjAiPT09Yy5wYWRfY2hhcj8iMCI6Yy5wYWRfY2hhci5jaGFyQXQoMSk6IiAiLHA9Yy53aWR0aC0oZityKS5sZW5ndGgsdT1jLndpZHRoJiZwPjA/bC5yZXBlYXQocCk6IiIsbSs9Yy5hbGlnbj9mK3IrdToiMCI9PT1sP2YrdStyOnUrZityKX1yZXR1cm4gbX0oZnVuY3Rpb24oZSl7aWYoY1tlXSlyZXR1cm4gY1tlXTtmb3IodmFyIHQsbj1lLHI9W10sbz0wO247KXtpZihudWxsIT09KHQ9aS50ZXh0LmV4ZWMobikpKXIucHVzaCh0WzBdKTtlbHNlIGlmKG51bGwhPT0odD1pLm1vZHVsby5leGVjKG4pKSlyLnB1c2goIiUiKTtlbHNle2lmKG51bGw9PT0odD1pLnBsYWNlaG9sZGVyLmV4ZWMobikpKXRocm93IG5ldyBTeW50YXhFcnJvcigiW3NwcmludGZdIHVuZXhwZWN0ZWQgcGxhY2Vob2xkZXIiKTtpZih0WzJdKXtvfD0xO3ZhciBhPVtdLHM9dFsyXSx1PVtdO2lmKG51bGw9PT0odT1pLmtleS5leGVjKHMpKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoIltzcHJpbnRmXSBmYWlsZWQgdG8gcGFyc2UgbmFtZWQgYXJndW1lbnQga2V5Iik7Zm9yKGEucHVzaCh1WzFdKTsiIiE9PShzPXMuc3Vic3RyaW5nKHVbMF0ubGVuZ3RoKSk7KWlmKG51bGwhPT0odT1pLmtleV9hY2Nlc3MuZXhlYyhzKSkpYS5wdXNoKHVbMV0pO2Vsc2V7aWYobnVsbD09PSh1PWkuaW5kZXhfYWNjZXNzLmV4ZWMocykpKXRocm93IG5ldyBTeW50YXhFcnJvcigiW3NwcmludGZdIGZhaWxlZCB0byBwYXJzZSBuYW1lZCBhcmd1bWVudCBrZXkiKTthLnB1c2godVsxXSl9dFsyXT1hfWVsc2Ugb3w9MjtpZigzPT09byl0aHJvdyBuZXcgRXJyb3IoIltzcHJpbnRmXSBtaXhpbmcgcG9zaXRpb25hbCBhbmQgbmFtZWQgcGxhY2Vob2xkZXJzIGlzIG5vdCAoeWV0KSBzdXBwb3J0ZWQiKTtyLnB1c2goe3BsYWNlaG9sZGVyOnRbMF0scGFyYW1fbm86dFsxXSxrZXlzOnRbMl0sc2lnbjp0WzNdLHBhZF9jaGFyOnRbNF0sYWxpZ246dFs1XSx3aWR0aDp0WzZdLHByZWNpc2lvbjp0WzddLHR5cGU6dFs4XX0pfW49bi5zdWJzdHJpbmcodFswXS5sZW5ndGgpfXJldHVybiBjW2VdPXJ9KHQpLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBhLmFwcGx5KG51bGwsW2VdLmNvbmNhdCh0fHxbXSkpfXZhciBjPU9iamVjdC5jcmVhdGUobnVsbCk7bi5zcHJpbnRmPWEsbi52c3ByaW50Zj1zLCJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYod2luZG93LnNwcmludGY9YSx3aW5kb3cudnNwcmludGY9cyx2b2lkIDA9PT0obz1mdW5jdGlvbigpe3JldHVybntzcHJpbnRmOmEsdnNwcmludGY6c319LmNhbGwobixyLG4sdCkpfHwodC5leHBvcnRzPW8pKX0oKX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtuLnIodCksZnVuY3Rpb24oZSl7bi5kKHQsIldlYlNvY2tldE1hbmFnZXIiLChmdW5jdGlvbigpe3JldHVybiBvfSkpO3ZhciByPW4oMCk7ZS5jb25uZWN0PWUuY29ubmVjdHx8e30sY29ubmVjdC5XZWJTb2NrZXRNYW5hZ2VyPXIuYTt2YXIgbz1yLmF9LmNhbGwodGhpcyxuKDMpKX0sZnVuY3Rpb24odCxuKXt2YXIgcjtyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e3I9cnx8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2godCl7Im9iamVjdCI9PSgidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdz8idW5kZWZpbmVkIjplKHdpbmRvdykpJiYocj13aW5kb3cpfXQuZXhwb3J0cz1yfV0pfSwzMTI6KCk9PntmdW5jdGlvbiBlKHQpe3JldHVybiBlPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxlKHQpfSFmdW5jdGlvbigpe3ZhciB0PXRoaXN8fGdsb2JhbFRoaXMsbj10LmNvbm5lY3R8fHt9O3QuY29ubmVjdD1uLHQubGlseT1uO3ZhciByPXtURVNUOiJURVNUIixUUkFDRToiVFJBQ0UiLERFQlVHOiJERUJVRyIsSU5GTzoiSU5GTyIsTE9HOiJMT0ciLFdBUk46IldBUk4iLEVSUk9SOiJFUlJPUiIsQ1JJVElDQUw6IkNSSVRJQ0FMIn0sbz17Q0NQOiJjY3AiLFNPRlRQSE9ORToic29mdHBob25lIixDSEFUOiJjaGF0IixUQVNLOiJ0YXNrIn0saT17VEVTVDowLFRSQUNFOjEwLERFQlVHOjIwLElORk86MzAsTE9HOjQwLFdBUk46NTAsRVJST1I6MTAwLENSSVRJQ0FMOjIwMH0sYT0iQ0NQIixzPSJTaGFyZWRXb3JrZXIiLGM9IkNSTSIsdT17VFJBQ0U6ZnVuY3Rpb24oZSl7Y29uc29sZS5pbmZvKGUpfSxERUJVRzpmdW5jdGlvbihlKXtjb25zb2xlLmluZm8oZSl9LElORk86ZnVuY3Rpb24oZSl7Y29uc29sZS5pbmZvKGUpfSxMT0c6ZnVuY3Rpb24oZSl7Y29uc29sZS5sb2coZSl9LFRFU1Q6ZnVuY3Rpb24oZSl7Y29uc29sZS5sb2coZSl9LFdBUk46ZnVuY3Rpb24oZSl7Y29uc29sZS53YXJuKGUpfSxFUlJPUjpmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKGUpfSxDUklUSUNBTDpmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKGUpfX0sbD1mdW5jdGlvbihlKXt2YXIgdCxuLHI9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSwwKSxpPXIuc2hpZnQoKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuLTEhPT1PYmplY3QudmFsdWVzKG8pLmluZGV4T2YoZSl9KGkpPyhuPWksdD1yLnNoaWZ0KCkpOih0PWksbj1vLkNDUCkse2Zvcm1hdDp0LGNvbXBvbmVudDpuLGFyZ3M6cn19LHA9ZnVuY3Rpb24oZSx0LHIsbyxpLHUpe3RoaXMuY29tcG9uZW50PWUsdGhpcy5sZXZlbD10LHRoaXMudGV4dD1yLHRoaXMudGltZT1uZXcgRGF0ZSx0aGlzLnRhYklkPW51bGw9PT1pP251bGw6aXx8bi5jb3JlLnRhYklkLHRoaXMuZXhjZXB0aW9uPW51bGwsdGhpcy5vYmplY3RzPVtdLHRoaXMubGluZT0wLHRoaXMuYWdlbnRSZXNvdXJjZUlkPW51bGw7dHJ5e24uYWdlbnQuaW5pdGlhbGl6ZWQmJih0aGlzLmFnZW50UmVzb3VyY2VJZD0obmV3IG4uQWdlbnQpLl9nZXRSZXNvdXJjZUlkKCkpfWNhdGNoKGUpe2NvbnNvbGUubG9nKCJJc3N1ZSBmaW5kaW5nIGFnZW50UmVzb3VyY2VJZDogIixlKX10aGlzLmxvZ2dlcklkPW8sdT90aGlzLmNvbnRleHRMYXllcj11Om4uaXNTaGFyZWRXb3JrZXIoKT90aGlzLmNvbnRleHRMYXllcj1zOm4uaXNDUk0oKT90aGlzLmNvbnRleHRMYXllcj1jOm4uaXNDQ1AoKSYmKHRoaXMuY29udGV4dExheWVyPWEpfTtwLmZyb21PYmplY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS50YWJJZHx8bnVsbCxuPWUuY29udGV4dExheWVyfHxudWxsLHI9bmV3IHAoby5DQ1AsZS5sZXZlbCxlLnRleHQsZS5sb2dnZXJJZCx0LG4pO3JldHVybiJbb2JqZWN0IERhdGVdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlLnRpbWUpP3IudGltZT1uZXcgRGF0ZShlLnRpbWUuZ2V0VGltZSgpKToibnVtYmVyIj09dHlwZW9mIGUudGltZT9yLnRpbWU9bmV3IERhdGUoZS50aW1lKToic3RyaW5nIj09dHlwZW9mIGUudGltZT9yLnRpbWU9RGF0ZS5wYXJzZShlLnRpbWUpOnIudGltZT1uZXcgRGF0ZSxyLmV4Y2VwdGlvbj1lLmV4Y2VwdGlvbixyLm9iamVjdHM9ZS5vYmplY3RzLHJ9O3ZhciBkPWZ1bmN0aW9uKHQpe3ZhciBuPS9BdXRoVG9rZW4uKlw9L2c7dCYmIm9iamVjdCI9PT1lKHQpJiZPYmplY3Qua2V5cyh0KS5mb3JFYWNoKChmdW5jdGlvbihyKXsib2JqZWN0Ij09PWUodFtyXSk/ZCh0W3JdKToic3RyaW5nIj09dHlwZW9mIHRbcl0mJigidXJsIj09PXJ8fCJ0ZXh0Ij09PXI/dFtyXT10W3JdLnJlcGxhY2UobiwiW3JlZGFjdGVkXSIpOlsicXVpY2tDb25uZWN0TmFtZSJdLmluY2x1ZGVzKHIpP3Rbcl09IltyZWRhY3RlZF0iOlsiY3VzdG9tZXJJZCIsIkN1c3RvbWVySWQiLCJTcGVha2VySWQiLCJDdXN0b21lclNwZWFrZXJJZCJdLmluY2x1ZGVzKHIpJiYodFtyXT0iIi5jb25jYXQoIltvYmZ1c2NhdGVkIHZhbHVlXSIsIiAiKS5jb25jYXQobWQ1KHRbcl0pKSkpfSkpfSxmPWZ1bmN0aW9uKHQpe2lmKHRoaXMudHlwZT10IGluc3RhbmNlb2YgRXJyb3I/dC5uYW1lOnQuY29kZXx8T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpLHRoaXMubWVzc2FnZT10Lm1lc3NhZ2UsdGhpcy5zdGFjaz1bXSx0LnN0YWNrKXRyeXtBcnJheS5pc0FycmF5KHQuc3RhY2spP3RoaXMuc3RhY2s9dC5zdGFjazoib2JqZWN0Ij09PWUodC5zdGFjayk/dGhpcy5zdGFjaz1bSlNPTi5zdHJpbmdpZnkodC5zdGFjayldOiJzdHJpbmciPT10eXBlb2YgdC5zdGFjayYmKHRoaXMuc3RhY2s9dC5zdGFjay5zcGxpdCgiXG4iKSl9Y2F0Y2goZSl7fX07cC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gbi5zcHJpbnRmKCJbJXNdIFslc10gWyVzXTogJXMiLHRoaXMuZ2V0VGltZSgpJiZ0aGlzLmdldFRpbWUoKS50b0lTT1N0cmluZz90aGlzLmdldFRpbWUoKS50b0lTT1N0cmluZygpOiI/Pz8iLHRoaXMuZ2V0TGV2ZWwoKSx0aGlzLmdldEFnZW50UmVzb3VyY2VJZCgpLHRoaXMuZ2V0VGV4dCgpKX0scC5wcm90b3R5cGUuZ2V0VGltZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRpbWV9LHAucHJvdG90eXBlLmdldEFnZW50UmVzb3VyY2VJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmFnZW50UmVzb3VyY2VJZH0scC5wcm90b3R5cGUuZ2V0VGFiSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50YWJJZH0scC5wcm90b3R5cGUuZ2V0Q29udGV4dExheWVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29udGV4dExheWVyfSxwLnByb3RvdHlwZS5nZXRMZXZlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmxldmVsfSxwLnByb3RvdHlwZS5nZXRUZXh0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGV4dH0scC5wcm90b3R5cGUuZ2V0Q29tcG9uZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcG9uZW50fSxwLnByb3RvdHlwZS53aXRoRXhjZXB0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmV4Y2VwdGlvbj1uZXcgZihlKSx0aGlzfSxwLnByb3RvdHlwZS53aXRoT2JqZWN0PWZ1bmN0aW9uKGUpe3ZhciB0PW4uZGVlcGNvcHkoZSk7cmV0dXJuIGQodCksdGhpcy5vYmplY3RzLnB1c2godCksdGhpc30scC5wcm90b3R5cGUud2l0aENyb3NzT3JpZ2luRXZlbnRPYmplY3Q9ZnVuY3Rpb24oZSl7dmFyIHQ9bi5kZWVwY29weUNyb3NzT3JpZ2luRXZlbnQoZSk7cmV0dXJuIGQodCksdGhpcy5vYmplY3RzLnB1c2godCksdGhpc30scC5wcm90b3R5cGUuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbi5nZXRMb2coKS5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MucHVzaCh0aGlzKSx0aGlzfTt2YXIgaD1mdW5jdGlvbigpe3RoaXMuX2xvZ3M9W10sdGhpcy5fcm9sbGVkTG9ncz1bXSx0aGlzLl9sb2dzVG9QdXNoPVtdLHRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzPVtdLHRoaXMuX2VjaG9MZXZlbD1pLklORk8sdGhpcy5fbG9nTGV2ZWw9aS5JTkZPLHRoaXMuX2xpbmVDb3VudD0wLHRoaXMuX2xvZ1JvbGxJbnRlcnZhbD0wLHRoaXMuX2xvZ1JvbGxUaW1lcj1udWxsLHRoaXMuX2xvZ2dlcklkPShuZXcgRGF0ZSkuZ2V0VGltZSgpKyItIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSx0aGlzLnNldExvZ1JvbGxJbnRlcnZhbCgxOGU1KSx0aGlzLl9zdGFydExvZ0luZGV4VG9QdXNoPTB9O2gucHJvdG90eXBlLnNldExvZ1JvbGxJbnRlcnZhbD1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3RoaXMuX2xvZ1JvbGxUaW1lciYmZT09PXRoaXMuX2xvZ1JvbGxJbnRlcnZhbD90aGlzLndhcm4oIkxvZ2dlciBpcyBhbHJlYWR5IHNldCB0byB0aGUgZ2l2ZW4gaW50ZXJ2YWw6ICVkIix0aGlzLl9sb2dSb2xsSW50ZXJ2YWwpOih0aGlzLl9sb2dSb2xsVGltZXImJnQuY2xlYXJJbnRlcnZhbCh0aGlzLl9sb2dSb2xsVGltZXIpLHRoaXMuX2xvZ1JvbGxJbnRlcnZhbD1lLHRoaXMuX2xvZ1JvbGxUaW1lcj10LnNldEludGVydmFsKChmdW5jdGlvbigpe24uX3JvbGxlZExvZ3M9bi5fbG9ncyxuLl9sb2dzPVtdLG4uX3N0YXJ0TG9nSW5kZXhUb1B1c2g9MCxuLmluZm8oIkxvZyByb2xsIGludGVydmFsIG9jY3VycmVkLiIpfSksdGhpcy5fbG9nUm9sbEludGVydmFsKSl9LGgucHJvdG90eXBlLnNldExvZ0xldmVsPWZ1bmN0aW9uKGUpe2lmKCEoZSBpbiBpKSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbG9nZ2luZyBsZXZlbDogIitlKTt0aGlzLl9sb2dMZXZlbD1pW2VdfSxoLnByb3RvdHlwZS5zZXRFY2hvTGV2ZWw9ZnVuY3Rpb24oZSl7aWYoIShlIGluIGkpKXRocm93IG5ldyBFcnJvcigiVW5rbm93biBsb2dnaW5nIGxldmVsOiAiK2UpO3RoaXMuX2VjaG9MZXZlbD1pW2VdfSxoLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9bmV3IHAoZSx0LG4sdGhpcy5nZXRMb2dnZXJJZCgpKTtyZXR1cm4gZChyKSx0aGlzLmFkZExvZ0VudHJ5KHIpLHJ9LGgucHJvdG90eXBlLmFkZExvZ0VudHJ5PWZ1bmN0aW9uKGUpe2QoZSksdGhpcy5fbG9ncy5wdXNoKGUpLG8uU09GVFBIT05FPT09ZS5jb21wb25lbnQmJnRoaXMuX2xvZ3NUb1B1c2gucHVzaChlKSxlLmxldmVsIGluIGkmJmlbZS5sZXZlbF0+PXRoaXMuX2xvZ0xldmVsJiYoaVtlLmxldmVsXT49dGhpcy5fZWNob0xldmVsJiZ1W2UuZ2V0TGV2ZWwoKV0oZS50b1N0cmluZygpKSxlLmxpbmU9dGhpcy5fbGluZUNvdW50KyspfSxoLnByb3RvdHlwZS5zZW5kSW50ZXJuYWxMb2dFbnRyeVRvU2VydmVyPWZ1bmN0aW9uKGUpe3RoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzLnB1c2goZSksZS5sZXZlbCBpbiBpJiZpW2UubGV2ZWxdPj10aGlzLl9sb2dMZXZlbCYmKGlbZS5sZXZlbF0+PXRoaXMuX2VjaG9MZXZlbCYmdVtlLmdldExldmVsKCldKGUudG9TdHJpbmcoKSksZS5saW5lPXRoaXMuX2xpbmVDb3VudCsrKX0saC5wcm90b3R5cGUuY2xlYXJPYmplY3RzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPTA7ZTx0aGlzLl9sb2dzLmxlbmd0aDtlKyspdGhpcy5fbG9nc1tlXS5vYmplY3RzJiZkZWxldGUgdGhpcy5fbG9nc1tlXS5vYmplY3RzfSxoLnByb3RvdHlwZS5jbGVhckV4Y2VwdGlvbnM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPHRoaXMuX2xvZ3MubGVuZ3RoO2UrKyl0aGlzLl9sb2dzW2VdLmV4Y2VwdGlvbiYmZGVsZXRlIHRoaXMuX2xvZ3NbZV0uZXhjZXB0aW9ufSxoLnByb3RvdHlwZS50cmFjZT1mdW5jdGlvbigpe3ZhciBlPWwoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxyLlRSQUNFLG4udnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLmRlYnVnPWZ1bmN0aW9uKCl7dmFyIGU9bChhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LHIuREVCVUcsbi52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUuaW5mbz1mdW5jdGlvbigpe3ZhciBlPWwoYXJndW1lbnRzKTtyZXR1cm4gdGhpcy53cml0ZShlLmNvbXBvbmVudCxyLklORk8sbi52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7dmFyIGU9bChhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LHIuTE9HLG4udnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLnRlc3Q9ZnVuY3Rpb24oKXt2YXIgZT1sKGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsci5URVNULG4udnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLndhcm49ZnVuY3Rpb24oKXt2YXIgZT1sKGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsci5XQVJOLG4udnNwcmludGYoZS5mb3JtYXQsZS5hcmdzKSl9LGgucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKCl7dmFyIGU9bChhcmd1bWVudHMpO3JldHVybiB0aGlzLndyaXRlKGUuY29tcG9uZW50LHIuRVJST1Isbi52c3ByaW50ZihlLmZvcm1hdCxlLmFyZ3MpKX0saC5wcm90b3R5cGUuY3JpdGljYWw9ZnVuY3Rpb24oKXt2YXIgZT1sKGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMud3JpdGUoZS5jb21wb25lbnQsci5FUlJPUixuLnZzcHJpbnRmKGUuZm9ybWF0LGUuYXJncykpfSxoLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe2Zvcih2YXIgZT1bXSx0PTA7dDx0aGlzLl9sb2dzLmxlbmd0aDt0KyspZS5wdXNoKHRoaXMuX2xvZ3NbdF0udG9TdHJpbmcoKSk7cmV0dXJuIGUuam9pbigiXG4iKX0saC5wcm90b3R5cGUuZG93bmxvYWQ9ZnVuY3Rpb24ocil7dmFyIG8sYT0iYWdlbnQtbG9nIixzPSExLGM9ITA9PT0obnVsbD09PShvPW4pfHx2b2lkIDA9PT1vfHxudWxsPT09KG89by5nbG9iYWxSZXNpbGllbmN5KXx8dm9pZCAwPT09bz92b2lkIDA6by5nbG9iYWxSZXNpbGllbmN5RW5hYmxlZCk7Im9iamVjdCI9PT1lKHIpJiZudWxsIT09cj8oYT1yLmxvZ05hbWV8fGEscz1yLmZpbHRlckJ5TG9nTGV2ZWx8fHMpOiJzdHJpbmciPT10eXBlb2YgciYmKGE9cnx8YSksYyYmKG4uZ2xvYmFsUmVzaWxpZW5jeS5fZG93bmxvYWRDQ1BMb2dzKCksYT0iY3JtLSIrYSk7dmFyIHU9dGhpcyxsPXRoaXMuX3JvbGxlZExvZ3MuY29uY2F0KHRoaXMuX2xvZ3MpO3MmJihsPWwuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gaVtlLmxldmVsXT49dS5fbG9nTGV2ZWx9KSkpO3ZhciBwPW5ldyB0LkJsb2IoW0pTT04uc3RyaW5naWZ5KGwsdm9pZCAwLDQpXSxbInRleHQvcGxhaW4iXSksZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhIik7YT1hfHwiYWdlbnQtbG9nIixkLmhyZWY9dC5VUkwuY3JlYXRlT2JqZWN0VVJMKHApLGQuZG93bmxvYWQ9YSsiLnR4dCIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkKSxkLmNsaWNrKCksZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkKX0saC5wcm90b3R5cGUuc2NoZWR1bGVVcHN0cmVhbUxvZ1B1c2g9ZnVuY3Rpb24oZSl7bi51cHN0cmVhbUxvZ1B1c2hTY2hlZHVsZWR8fChuLnVwc3RyZWFtTG9nUHVzaFNjaGVkdWxlZD0hMCx0LnNldEludGVydmFsKG4uaGl0Y2godGhpcyx0aGlzLnJlcG9ydE1hc3RlckxvZ3NVcFN0cmVhbSxlKSw1ZTMpKX0saC5wcm90b3R5cGUucmVwb3J0TWFzdGVyTG9nc1VwU3RyZWFtPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2xvZ3NUb1B1c2guc2xpY2UoKTt0aGlzLl9sb2dzVG9QdXNoPVtdLG4uaWZNYXN0ZXIobi5NYXN0ZXJUb3BpY3MuU0VORF9MT0dTLChmdW5jdGlvbigpe3QubGVuZ3RoPjAmJmUuc2VuZFVwc3RyZWFtKG4uRXZlbnRUeXBlLlNFTkRfTE9HUyx0KX0pKX0saC5wcm90b3R5cGUuc2NoZWR1bGVVcHN0cmVhbU91dGVyQ29udGV4dENDUHNlcnZlckJvdW5kTG9nc1B1c2g9ZnVuY3Rpb24oZSl7dC5zZXRJbnRlcnZhbChuLmhpdGNoKHRoaXMsdGhpcy5wdXNoT3V0ZXJDb250ZXh0Q0NQc2VydmVyQm91bmRMb2dzVXBzdHJlYW0sZSksMWUzKX0saC5wcm90b3R5cGUuc2NoZWR1bGVVcHN0cmVhbU91dGVyQ29udGV4dENDUExvZ3NQdXNoPWZ1bmN0aW9uKGUpe3Quc2V0SW50ZXJ2YWwobi5oaXRjaCh0aGlzLHRoaXMucHVzaE91dGVyQ29udGV4dENDUExvZ3NVcHN0cmVhbSxlKSwxZTMpfSxoLnByb3RvdHlwZS5wdXNoT3V0ZXJDb250ZXh0Q0NQc2VydmVyQm91bmRMb2dzVXBzdHJlYW09ZnVuY3Rpb24oZSl7aWYodGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoPjApe2Zvcih2YXIgdD0wO3Q8dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoO3QrKyl0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9nc1t0XS50ZXh0PXRoaXMuX3NlcnZlckJvdW5kSW50ZXJuYWxMb2dzW3RdLnRleHQ7ZS5zZW5kVXBzdHJlYW0obi5FdmVudFR5cGUuU0VSVkVSX0JPVU5EX0lOVEVSTkFMX0xPRyx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncyksdGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3M9W119fSxoLnByb3RvdHlwZS5wdXNoT3V0ZXJDb250ZXh0Q0NQTG9nc1Vwc3RyZWFtPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLl9zdGFydExvZ0luZGV4VG9QdXNoO3Q8dGhpcy5fbG9ncy5sZW5ndGg7dCsrKXRoaXMuX2xvZ3NbdF0ubG9nZ2VySWQ9PT10aGlzLl9sb2dnZXJJZCYmZS5zZW5kVXBzdHJlYW0obi5FdmVudFR5cGUuTE9HLHRoaXMuX2xvZ3NbdF0pO3RoaXMuX3N0YXJ0TG9nSW5kZXhUb1B1c2g9dGhpcy5fbG9ncy5sZW5ndGh9LGgucHJvdG90eXBlLmdldExvZ2dlcklkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xvZ2dlcklkfSxoLnByb3RvdHlwZS5zY2hlZHVsZURvd25zdHJlYW1DbGllbnRTaWRlTG9nc1B1c2g9ZnVuY3Rpb24oKXt0LnNldEludGVydmFsKG4uaGl0Y2godGhpcyx0aGlzLnB1c2hDbGllbnRTaWRlTG9nc0Rvd25zdHJlYW0pLDVlMyl9LGgucHJvdG90eXBlLnB1c2hDbGllbnRTaWRlTG9nc0Rvd25zdHJlYW09ZnVuY3Rpb24oKXt2YXIgZT1bXTt0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5sZW5ndGg8NTB8fCh0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncy5sZW5ndGg+NTAwP2U9dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3Muc3BsaWNlKDAsNTAwKTooZT10aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncyx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9ncz1bXSksbi5wdWJsaXNoQ2xpZW50U2lkZUxvZ3MoZSkpfTt2YXIgZz1mdW5jdGlvbihlKXtoLmNhbGwodGhpcyksdGhpcy5jb25kdWl0PWUsdC5zZXRJbnRlcnZhbChuLmhpdGNoKHRoaXMsdGhpcy5fcHVzaExvZ3NEb3duc3RyZWFtKSxnLkxPR19QVVNIX0lOVEVSVkFMKSx0LmNsZWFySW50ZXJ2YWwodGhpcy5fbG9nUm9sbFRpbWVyKSx0aGlzLl9sb2dSb2xsVGltZXI9bnVsbH07Zy5MT0dfUFVTSF9JTlRFUlZBTD0xZTMsZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShoLnByb3RvdHlwZSksZy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZyxnLnByb3RvdHlwZS5wdXNoTG9nc0Rvd25zdHJlYW09ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuY29uZHVpdC5zZW5kRG93bnN0cmVhbShuLkV2ZW50VHlwZS5MT0csZSl9KSl9LGcucHJvdG90eXBlLl9wdXNoTG9nc0Rvd25zdHJlYW09ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3RoaXMuX2xvZ3MuZm9yRWFjaCgoZnVuY3Rpb24odCl7ZS5jb25kdWl0LnNlbmREb3duc3RyZWFtKG4uRXZlbnRUeXBlLkxPRyx0KX0pKSx0aGlzLl9sb2dzPVtdO2Zvcih2YXIgdD0wO3Q8dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3MubGVuZ3RoO3QrKyl0aGlzLmNvbmR1aXQuc2VuZERvd25zdHJlYW0obi5FdmVudFR5cGUuU0VSVkVSX0JPVU5EX0lOVEVSTkFMX0xPRyx0aGlzLl9zZXJ2ZXJCb3VuZEludGVybmFsTG9nc1t0XSk7dGhpcy5fc2VydmVyQm91bmRJbnRlcm5hbExvZ3M9W119O3ZhciBtPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbigpe3RyeXtyZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9Y2F0Y2goZSl7dS5FUlJPUihlKX19fTtuLnJvb3RMb2dnZXI9bmV3IGgsZnVuY3Rpb24oZSl7Zm9yKHZhciB0IGluIGUpImZ1bmN0aW9uIj09dHlwZW9mIGVbdF0mJihlW3RdPW0oZVt0XSkpfShuLnJvb3RMb2dnZXIpLChuPW58fHt9KS5nZXRMb2c9ZnVuY3Rpb24oKXtyZXR1cm4gbi5yb290TG9nZ2VyfSxuLkxvZ0VudHJ5PXAsbi5Mb2dnZXI9aCxuLkxvZ0xldmVsPXIsbi5Mb2dDb21wb25lbnQ9byxuLkRvd25zdHJlYW1Db25kdWl0TG9nZ2VyPWd9KCl9LDQ3ODpmdW5jdGlvbigpeyFmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUsdCl7dmFyIG49KDY1NTM1JmUpKyg2NTUzNSZ0KTtyZXR1cm4oZT4+MTYpKyh0Pj4xNikrKG4+PjE2KTw8MTZ8NjU1MzUmbn1mdW5jdGlvbiBuKGUsbixyLG8saSxhKXtyZXR1cm4gdCgocz10KHQobixlKSx0KG8sYSkpKTw8KGM9aSl8cz4+PjMyLWMscik7dmFyIHMsY31mdW5jdGlvbiByKGUsdCxyLG8saSxhLHMpe3JldHVybiBuKHQmcnx+dCZvLGUsdCxpLGEscyl9ZnVuY3Rpb24gbyhlLHQscixvLGksYSxzKXtyZXR1cm4gbih0Jm98ciZ+byxlLHQsaSxhLHMpfWZ1bmN0aW9uIGkoZSx0LHIsbyxpLGEscyl7cmV0dXJuIG4odF5yXm8sZSx0LGksYSxzKX1mdW5jdGlvbiBhKGUsdCxyLG8saSxhLHMpe3JldHVybiBuKHJeKHR8fm8pLGUsdCxpLGEscyl9ZnVuY3Rpb24gcyhlLG4pe3ZhciBzLGMsdSxsLHA7ZVtuPj41XXw9MTI4PDxuJTMyLGVbMTQrKG4rNjQ+Pj45PDw0KV09bjt2YXIgZD0xNzMyNTg0MTkzLGY9LTI3MTczMzg3OSxoPS0xNzMyNTg0MTk0LGc9MjcxNzMzODc4O2ZvcihzPTA7czxlLmxlbmd0aDtzKz0xNiljPWQsdT1mLGw9aCxwPWcsZD1yKGQsZixoLGcsZVtzXSw3LC02ODA4NzY5MzYpLGc9cihnLGQsZixoLGVbcysxXSwxMiwtMzg5NTY0NTg2KSxoPXIoaCxnLGQsZixlW3MrMl0sMTcsNjA2MTA1ODE5KSxmPXIoZixoLGcsZCxlW3MrM10sMjIsLTEwNDQ1MjUzMzApLGQ9cihkLGYsaCxnLGVbcys0XSw3LC0xNzY0MTg4OTcpLGc9cihnLGQsZixoLGVbcys1XSwxMiwxMjAwMDgwNDI2KSxoPXIoaCxnLGQsZixlW3MrNl0sMTcsLTE0NzMyMzEzNDEpLGY9cihmLGgsZyxkLGVbcys3XSwyMiwtNDU3MDU5ODMpLGQ9cihkLGYsaCxnLGVbcys4XSw3LDE3NzAwMzU0MTYpLGc9cihnLGQsZixoLGVbcys5XSwxMiwtMTk1ODQxNDQxNyksaD1yKGgsZyxkLGYsZVtzKzEwXSwxNywtNDIwNjMpLGY9cihmLGgsZyxkLGVbcysxMV0sMjIsLTE5OTA0MDQxNjIpLGQ9cihkLGYsaCxnLGVbcysxMl0sNywxODA0NjAzNjgyKSxnPXIoZyxkLGYsaCxlW3MrMTNdLDEyLC00MDM0MTEwMSksaD1yKGgsZyxkLGYsZVtzKzE0XSwxNywtMTUwMjAwMjI5MCksZD1vKGQsZj1yKGYsaCxnLGQsZVtzKzE1XSwyMiwxMjM2NTM1MzI5KSxoLGcsZVtzKzFdLDUsLTE2NTc5NjUxMCksZz1vKGcsZCxmLGgsZVtzKzZdLDksLTEwNjk1MDE2MzIpLGg9byhoLGcsZCxmLGVbcysxMV0sMTQsNjQzNzE3NzEzKSxmPW8oZixoLGcsZCxlW3NdLDIwLC0zNzM4OTczMDIpLGQ9byhkLGYsaCxnLGVbcys1XSw1LC03MDE1NTg2OTEpLGc9byhnLGQsZixoLGVbcysxMF0sOSwzODAxNjA4MyksaD1vKGgsZyxkLGYsZVtzKzE1XSwxNCwtNjYwNDc4MzM1KSxmPW8oZixoLGcsZCxlW3MrNF0sMjAsLTQwNTUzNzg0OCksZD1vKGQsZixoLGcsZVtzKzldLDUsNTY4NDQ2NDM4KSxnPW8oZyxkLGYsaCxlW3MrMTRdLDksLTEwMTk4MDM2OTApLGg9byhoLGcsZCxmLGVbcyszXSwxNCwtMTg3MzYzOTYxKSxmPW8oZixoLGcsZCxlW3MrOF0sMjAsMTE2MzUzMTUwMSksZD1vKGQsZixoLGcsZVtzKzEzXSw1LC0xNDQ0NjgxNDY3KSxnPW8oZyxkLGYsaCxlW3MrMl0sOSwtNTE0MDM3ODQpLGg9byhoLGcsZCxmLGVbcys3XSwxNCwxNzM1MzI4NDczKSxkPWkoZCxmPW8oZixoLGcsZCxlW3MrMTJdLDIwLC0xOTI2NjA3NzM0KSxoLGcsZVtzKzVdLDQsLTM3ODU1OCksZz1pKGcsZCxmLGgsZVtzKzhdLDExLC0yMDIyNTc0NDYzKSxoPWkoaCxnLGQsZixlW3MrMTFdLDE2LDE4MzkwMzA1NjIpLGY9aShmLGgsZyxkLGVbcysxNF0sMjMsLTM1MzA5NTU2KSxkPWkoZCxmLGgsZyxlW3MrMV0sNCwtMTUzMDk5MjA2MCksZz1pKGcsZCxmLGgsZVtzKzRdLDExLDEyNzI4OTMzNTMpLGg9aShoLGcsZCxmLGVbcys3XSwxNiwtMTU1NDk3NjMyKSxmPWkoZixoLGcsZCxlW3MrMTBdLDIzLC0xMDk0NzMwNjQwKSxkPWkoZCxmLGgsZyxlW3MrMTNdLDQsNjgxMjc5MTc0KSxnPWkoZyxkLGYsaCxlW3NdLDExLC0zNTg1MzcyMjIpLGg9aShoLGcsZCxmLGVbcyszXSwxNiwtNzIyNTIxOTc5KSxmPWkoZixoLGcsZCxlW3MrNl0sMjMsNzYwMjkxODkpLGQ9aShkLGYsaCxnLGVbcys5XSw0LC02NDAzNjQ0ODcpLGc9aShnLGQsZixoLGVbcysxMl0sMTEsLTQyMTgxNTgzNSksaD1pKGgsZyxkLGYsZVtzKzE1XSwxNiw1MzA3NDI1MjApLGQ9YShkLGY9aShmLGgsZyxkLGVbcysyXSwyMywtOTk1MzM4NjUxKSxoLGcsZVtzXSw2LC0xOTg2MzA4NDQpLGc9YShnLGQsZixoLGVbcys3XSwxMCwxMTI2ODkxNDE1KSxoPWEoaCxnLGQsZixlW3MrMTRdLDE1LC0xNDE2MzU0OTA1KSxmPWEoZixoLGcsZCxlW3MrNV0sMjEsLTU3NDM0MDU1KSxkPWEoZCxmLGgsZyxlW3MrMTJdLDYsMTcwMDQ4NTU3MSksZz1hKGcsZCxmLGgsZVtzKzNdLDEwLC0xODk0OTg2NjA2KSxoPWEoaCxnLGQsZixlW3MrMTBdLDE1LC0xMDUxNTIzKSxmPWEoZixoLGcsZCxlW3MrMV0sMjEsLTIwNTQ5MjI3OTkpLGQ9YShkLGYsaCxnLGVbcys4XSw2LDE4NzMzMTMzNTkpLGc9YShnLGQsZixoLGVbcysxNV0sMTAsLTMwNjExNzQ0KSxoPWEoaCxnLGQsZixlW3MrNl0sMTUsLTE1NjAxOTgzODApLGY9YShmLGgsZyxkLGVbcysxM10sMjEsMTMwOTE1MTY0OSksZD1hKGQsZixoLGcsZVtzKzRdLDYsLTE0NTUyMzA3MCksZz1hKGcsZCxmLGgsZVtzKzExXSwxMCwtMTEyMDIxMDM3OSksaD1hKGgsZyxkLGYsZVtzKzJdLDE1LDcxODc4NzI1OSksZj1hKGYsaCxnLGQsZVtzKzldLDIxLC0zNDM0ODU1NTEpLGQ9dChkLGMpLGY9dChmLHUpLGg9dChoLGwpLGc9dChnLHApO3JldHVybltkLGYsaCxnXX1mdW5jdGlvbiBjKGUpe3ZhciB0LG49IiIscj0zMiplLmxlbmd0aDtmb3IodD0wO3Q8cjt0Kz04KW4rPVN0cmluZy5mcm9tQ2hhckNvZGUoZVt0Pj41XT4+PnQlMzImMjU1KTtyZXR1cm4gbn1mdW5jdGlvbiB1KGUpe3ZhciB0LG49W107Zm9yKG5bKGUubGVuZ3RoPj4yKS0xXT12b2lkIDAsdD0wO3Q8bi5sZW5ndGg7dCs9MSluW3RdPTA7dmFyIHI9OCplLmxlbmd0aDtmb3IodD0wO3Q8cjt0Kz04KW5bdD4+NV18PSgyNTUmZS5jaGFyQ29kZUF0KHQvOCkpPDx0JTMyO3JldHVybiBufWZ1bmN0aW9uIGwoZSl7dmFyIHQsbixyPSIwMTIzNDU2Nzg5YWJjZGVmIixvPSIiO2ZvcihuPTA7bjxlLmxlbmd0aDtuKz0xKXQ9ZS5jaGFyQ29kZUF0KG4pLG8rPXIuY2hhckF0KHQ+Pj40JjE1KStyLmNoYXJBdCgxNSZ0KTtyZXR1cm4gb31mdW5jdGlvbiBwKGUpe3JldHVybiB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoZSkpfWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBjKHModShlKSw4KmUubGVuZ3RoKSl9KHAoZSkpfWZ1bmN0aW9uIGYoZSx0KXtyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbixyLG89dShlKSxpPVtdLGE9W107Zm9yKGlbMTVdPWFbMTVdPXZvaWQgMCxvLmxlbmd0aD4xNiYmKG89cyhvLDgqZS5sZW5ndGgpKSxuPTA7bjwxNjtuKz0xKWlbbl09OTA5NTIyNDg2Xm9bbl0sYVtuXT0xNTQ5NTU2ODI4Xm9bbl07cmV0dXJuIHI9cyhpLmNvbmNhdCh1KHQpKSw1MTIrOCp0Lmxlbmd0aCksYyhzKGEuY29uY2F0KHIpLDY0MCkpfShwKGUpLHAodCkpfSh0aGlzfHxnbG9iYWxUaGlzKS5tZDU9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB0P24/Zih0LGUpOmwoZih0LGUpKTpuP2QoZSk6bChkKGUpKX19KCl9LDE1ODooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LHQuQ2hhdE1lZGlhQ29udHJvbGxlcj1mdW5jdGlvbihlLG4pe3ZhciByPXQuZ2V0TG9nKCksbz10LkxvZ0NvbXBvbmVudC5DSEFULGk9ZnVuY3Rpb24obixyKXt0LnB1Ymxpc2hNZXRyaWMoe25hbWU6bixjb250YWN0SWQ6ZS5jb250YWN0SWQsZGF0YTpyfHxlfSl9LGE9ZnVuY3Rpb24oZSl7ZS5vbkNvbm5lY3Rpb25Ccm9rZW4oKGZ1bmN0aW9uKGUpe3IuZXJyb3IobywiQ2hhdCBTZXNzaW9uIGNvbm5lY3Rpb24gYnJva2VuIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoIkNoYXQgU2Vzc2lvbiBjb25uZWN0aW9uIGJyb2tlbiIsZSl9KSksZS5vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgoZnVuY3Rpb24oZSl7ci5pbmZvKG8sIkNoYXQgU2Vzc2lvbiBjb25uZWN0aW9uIGVzdGFibGlzaGVkIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoIkNoYXQgU2Vzc2lvbiBjb25uZWN0aW9uIGVzdGFibGlzaGVkIixlKX0pKX07cmV0dXJue2dldDpmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbigpe2koIkNoYXQgbWVkaWEgY29udHJvbGxlciBpbml0IixlLmNvbnRhY3RJZCksci5pbmZvKG8sIkNoYXQgbWVkaWEgY29udHJvbGxlciBpbml0Iikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuQ2hhdFNlc3Npb24uc2V0R2xvYmFsQ29uZmlnKHtsb2dnZXJDb25maWc6e2xvZ2dlcjpyfSxyZWdpb246bi5yZWdpb259KTt2YXIgcz10LkNoYXRTZXNzaW9uLmNyZWF0ZSh7Y2hhdERldGFpbHM6ZSx0eXBlOiJBR0VOVCIsd2Vic29ja2V0TWFuYWdlcjp0LmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpfSk7cmV0dXJuIGEocykscy5jb25uZWN0KCkudGhlbigoZnVuY3Rpb24odCl7cmV0dXJuIHIuaW5mbyhvLCJDaGF0IFNlc3Npb24gU3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkIGZvciBjb250YWN0SWQgJXMiLGUuY29udGFjdElkKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoIkNoYXQgU2Vzc2lvbiBTdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQiLGUuY29udGFjdElkKSxzfSkpLmNhdGNoKChmdW5jdGlvbih0KXt0aHJvdyByLmVycm9yKG8sIkNoYXQgU2Vzc2lvbiBlc3RhYmxpc2hlbWVudCBmYWlsZWQgZm9yIGNvbnRhY3QgJXMiLGUuY29udGFjdElkKS53aXRoRXhjZXB0aW9uKHQpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksaSgiQ2hhdCBTZXNzaW9uIGVzdGFibGlzaGVtZW50IGZhaWxlZCIsZS5jb250YWN0SWQsdCksdH0pKX0oKX19fX0oKX0sNzooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LHQuTWVkaWFGYWN0b3J5PWZ1bmN0aW9uKGUpe3ZhciBuPXt9LHI9bmV3IFNldCxvPXQuZ2V0TG9nKCksaT10LkxvZ0NvbXBvbmVudC5DSEFULGE9dC5tZXJnZSh7fSxlKXx8e307YS5yZWdpb249YS5yZWdpb258fCJ1cy13ZXN0LTIiO3ZhciBzPWZ1bmN0aW9uKGUpe25bZV0mJiFyLmhhcyhlKSYmKG8uaW5mbyhpLCJEZXN0cm95aW5nIG1lZGlhQ29udHJvbGxlciBmb3IgJXMiLGUpLHIuYWRkKGUpLG5bZV0udGhlbigoZnVuY3Rpb24odCl7ImZ1bmN0aW9uIj09dHlwZW9mIHQuY2xlYW5VcCYmdC5jbGVhblVwKCksZGVsZXRlIG5bZV0sci5kZWxldGUoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKCl7ZGVsZXRlIG5bZV0sci5kZWxldGUoZSl9KSkpfTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5pc0FjdGl2ZSgpfShlKT9mdW5jdGlvbihlKXt2YXIgcj1lLmdldENvbm5lY3Rpb25JZCgpO2lmKCFlLmdldE1lZGlhSW5mbygpKXJldHVybiBvLmVycm9yKGksIk1lZGlhIGluZm8gZG9lcyBub3QgZXhpc3QgZm9yIGEgbWVkaWEgdHlwZSAlcyIsZS5nZXRNZWRpYVR5cGUoKSkud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLFByb21pc2UucmVqZWN0KCJNZWRpYSBpbmZvIGRvZXMgbm90IGV4aXN0IGZvciB0aGlzIGNvbm5lY3Rpb24iKTtpZihuW3JdKXJldHVybiBuW3JdO3N3aXRjaChvLmluZm8oaSwibWVkaWEgY29udHJvbGxlciBvZiB0eXBlICVzIGluaXQiLGUuZ2V0TWVkaWFUeXBlKCkpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlLmdldE1lZGlhVHlwZSgpKXtjYXNlIHQuTWVkaWFUeXBlLkNIQVQ6cmV0dXJuIG5bcl09bmV3IHQuQ2hhdE1lZGlhQ29udHJvbGxlcihlLmdldE1lZGlhSW5mbygpLGEpLmdldCgpO2Nhc2UgdC5NZWRpYVR5cGUuU09GVFBIT05FOnJldHVybiBuW3JdPW5ldyB0LlNvZnRwaG9uZU1lZGlhQ29udHJvbGxlcihlLmdldE1lZGlhSW5mbygpKS5nZXQoKTtjYXNlIHQuTWVkaWFUeXBlLlRBU0s6cmV0dXJuIG5bcl09bmV3IHQuVGFza01lZGlhQ29udHJvbGxlcihlLmdldE1lZGlhSW5mbygpKS5nZXQoKTtkZWZhdWx0OnJldHVybiBvLmVycm9yKGksIlVucmVjb2duaXplZCBtZWRpYSB0eXBlICVzICIsZS5nZXRNZWRpYVR5cGUoKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxQcm9taXNlLnJlamVjdCgpfX0oZSk6KHMoZS5nZXRDb25uZWN0aW9uSWQoKSksUHJvbWlzZS5yZWplY3QoIk1lZGlhIENvbnRyb2xsZXIgaXMgbm8gbG9uZ2VyIGF2YWlsYWJsZSBmb3IgdGhpcyBjb25uZWN0aW9uIikpfSxkZXN0cm95OnN9fX0oKX0sNjooKT0+eyFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LHQuU29mdHBob25lTWVkaWFDb250cm9sbGVyPWZ1bmN0aW9uKGUpe3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpfX19fSgpfSw0ODc6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCx0LlRhc2tNZWRpYUNvbnRyb2xsZXI9ZnVuY3Rpb24oZSl7dmFyIG49dC5nZXRMb2coKSxyPXQuTG9nQ29tcG9uZW50LlRBU0ssbz1mdW5jdGlvbihuLHIpe3QucHVibGlzaE1ldHJpYyh7bmFtZTpuLGNvbnRhY3RJZDplLmNvbnRhY3RJZCxkYXRhOnJ8fGV9KX0saT1mdW5jdGlvbihlKXtlLm9uQ29ubmVjdGlvbkJyb2tlbigoZnVuY3Rpb24oZSl7bi5lcnJvcihyLCJUYXNrIFNlc3Npb24gY29ubmVjdGlvbiBicm9rZW4iKS53aXRoRXhjZXB0aW9uKGUpLG8oIlRhc2sgU2Vzc2lvbiBjb25uZWN0aW9uIGJyb2tlbiIsZSl9KSksZS5vbkNvbm5lY3Rpb25Fc3RhYmxpc2hlZCgoZnVuY3Rpb24oZSl7bi5pbmZvKHIsIlRhc2sgU2Vzc2lvbiBjb25uZWN0aW9uIGVzdGFibGlzaGVkIikud2l0aE9iamVjdChlKSxvKCJUYXNrIFNlc3Npb24gY29ubmVjdGlvbiBlc3RhYmxpc2hlZCIsZSl9KSl9O3JldHVybntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24oKXtvKCJUYXNrIG1lZGlhIGNvbnRyb2xsZXIgaW5pdCIsZS5jb250YWN0SWQpLG4uaW5mbyhyLCJUYXNrIG1lZGlhIGNvbnRyb2xsZXIgaW5pdCIpLndpdGhPYmplY3QoZSk7dmFyIGE9dC5UYXNrU2Vzc2lvbi5jcmVhdGUoe2NvbnRhY3RJZDplLmNvbnRhY3RJZCxpbml0aWFsQ29udGFjdElkOmUuaW5pdGlhbENvbnRhY3RJZCx3ZWJzb2NrZXRNYW5hZ2VyOnQuY29yZS5nZXRXZWJTb2NrZXRNYW5hZ2VyKCl9KTtyZXR1cm4gaShhKSxhLmNvbm5lY3QoKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBuLmluZm8ociwiVGFzayBTZXNzaW9uIFN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCBmb3IgY29udGFjdElkICVzIixlLmNvbnRhY3RJZCksbygiVGFzayBTZXNzaW9uIFN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZCIsZS5jb250YWN0SWQpLGF9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe3Rocm93IG4uZXJyb3IociwiVGFzayBTZXNzaW9uIGVzdGFibGlzaGVtZW50IGZhaWxlZCBmb3IgY29udGFjdCAlcyIsZS5jb250YWN0SWQpLndpdGhFeGNlcHRpb24odCksbygiQ2hhdCBTZXNzaW9uIGVzdGFibGlzaGVtZW50IGZhaWxlZCIsZS5jb250YWN0SWQsdCksdH0pKX0oKX19fX0oKX0sNzQzOigpPT57ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX0sZSh0KX1mdW5jdGlvbiB0KGUsdCl7dmFyIG49T2JqZWN0LmtleXMoZSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTt0JiYocj1yLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBuKGUpe2Zvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspe3ZhciBvPW51bGwhPWFyZ3VtZW50c1tuXT9hcmd1bWVudHNbbl06e307biUyP3QoT2JqZWN0KG8pLCEwKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyKGUsdCxvW3RdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG8pKTp0KE9iamVjdChvKSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sdCkpfSkpfXJldHVybiBlfWZ1bmN0aW9uIHIodCxuLHIpe3JldHVybihuPWZ1bmN0aW9uKHQpe3ZhciBuPWZ1bmN0aW9uKHQsbil7aWYoIm9iamVjdCIhPT1lKHQpfHxudWxsPT09dClyZXR1cm4gdDt2YXIgcj10W1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09cil7dmFyIG89ci5jYWxsKHQsbnx8ImRlZmF1bHQiKTtpZigib2JqZWN0IiE9PWUobykpcmV0dXJuIG87dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oInN0cmluZyI9PT1uP1N0cmluZzpOdW1iZXIpKHQpfSh0LCJzdHJpbmciKTtyZXR1cm4ic3ltYm9sIj09PWUobik/bjpTdHJpbmcobil9KG4pKWluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7dmFsdWU6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbbl09cix0fSFmdW5jdGlvbigpe3ZhciBlPXRoaXN8fGdsb2JhbFRoaXMsdD1lLmNvbm5lY3R8fHt9O2UuY29ubmVjdD10LGUubGlseT10O3ZhciByLG89Ii9yZXF1ZXN0LXN0b3JhZ2UtYWNjZXNzIixpPXtjYW5SZXF1ZXN0OiExLG1vZGU6ImRlZmF1bHQiLGN1c3RvbTp7aGlkZUNDUDohMH19LGE9e30scz0iIixjPW51bGwsdT0hMSxsPXtJTklUOiJzdG9yYWdlQWNjZXNzOjppbml0IixHUkFOVEVEOiJzdG9yYWdlQWNjZXNzOjpncmFudGVkIixERU5JRUQ6InN0b3JhZ2VBY2Nlc3M6OmRlbmllZCIsUkVRVUVTVDoic3RvcmFnZUFjY2Vzczo6cmVxdWVzdCJ9LHA9ZnVuY3Rpb24oKXtyZXR1cm57c2hvdzpmdW5jdGlvbigpe2Muc3R5bGUuZGlzcGxheT0iYmxvY2sifSxoaWRlOmZ1bmN0aW9uKCl7Yy5zdHlsZS5kaXNwbGF5PSJub25lIn19fSxkPWZ1bmN0aW9uKCl7cmV0dXJuIGEmJiJjdXN0b20iPT09YS5tb2RlfSxmPWZ1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKC8uY29ubmVjdC5hd3MuYTJ6LmNvbXwubXkuY29ubmVjdC5hd3N8LmdvdmNsb3VkLmNvbm5lY3QuYXdzfC5hd3NhcHBzLmNvbS8pfSxoPWZ1bmN0aW9uKGUpe3ZhciB0PW5ldyBVUkwoZSksbj10Lm9yaWdpbixyPXQucGF0aG5hbWU7aWYobi5tYXRjaCgvLmF3c2FwcHMuY29tLykpe3ZhciBpPSJjb25uZWN0IjtyZXR1cm4gci5zdGFydHNXaXRoKCIvY29ubmVjdC1nYW1tYSIpJiYoaT0iY29ubmVjdC1nYW1tYSIpLCIiLmNvbmNhdChuLCIvIikuY29uY2F0KGkpLmNvbmNhdChvKX1yZXR1cm4iIi5jb25jYXQobikuY29uY2F0KG8pfSxnPWZ1bmN0aW9uKGUpe3JldHVybiBlLm1hdGNoKC9eaHR0cHM/OlwvXC9sb2NhbGhvc3QvKX0sbT1mdW5jdGlvbigpe2lmKCFzKXRocm93IG5ldyBFcnJvcigiW1N0b3JhZ2VBY2Nlc3NdIFtnZXRsYW5kQXRQYXRoXSBJbnZva2UgY29ubmVjdC5zdG9yYWdlQWNjZXNzLmluaXQgZmlyc3QiKTtyZXR1cm4gZihzKXx8ZyhzKT9uZXcgVVJMKHMpLnBhdGhuYW1lOiIvY29ubmVjdC9jY3AtdjIifSx2PWZ1bmN0aW9uKGUpe3ZhciBuPWUub25Jbml0LHI9ZS5vbkRlbnksbz1lLm9uR3JhbnQ7ZnVuY3Rpb24gaShlKXt2YXIgYT1lLmRhdGEscz1lLnNvdXJjZTtpZih0LmNvcmUuX2dldENDUElmcmFtZSgpLmNvbnRlbnRXaW5kb3chPT1zKXJldHVybiExO3N3aXRjaCh0LmNvcmUuaW5pdGlhbGl6ZWQmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixpKSxhLmV2ZW50KXtjYXNlIGwuSU5JVDp0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXVtJTklUXSBtZXNzYWdlIHJlY2lldmVkIikud2l0aE9iamVjdChhKSxuJiZuKGEpO2JyZWFrO2Nhc2UgbC5HUkFOVEVEOnQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdW0dSQU5URURdIG1lc3NhZ2UgcmVjaWV2ZWQiKS53aXRoT2JqZWN0KGEpLG8mJm8oYSk7YnJlYWs7Y2FzZSBsLkRFTklFRDp0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXVtERU5JRURdIG1lc3NhZ2UgcmVjaWV2ZWQiKS53aXRoT2JqZWN0KGEpLHImJnIoYSk7YnJlYWs7ZGVmYXVsdDp0LmNvcmUuaW5pdGlhbGl6ZWQmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixpKX19cmV0dXJuIGEuY2FuUmVxdWVzdCYmd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLGkpLHt1bnN1YnNjcmliZTpmdW5jdGlvbigpe3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixpKX19fTt0LnN0b3JhZ2VBY2Nlc3M9T2JqZWN0LmZyZWV6ZSh7Y2FuUmVxdWVzdDpmdW5jdGlvbigpe3JldHVybiBhLmNhblJlcXVlc3R9LG9wdE91dEZyb21SZXF1ZXN0QWNjZXNzOmZ1bmN0aW9uKCl7aS5jYW5SZXF1ZXN0PSExfSxvcHRJbkZvclJlcXVlc3RBY2Nlc3M6ZnVuY3Rpb24oKXtpLmNhblJlcXVlc3Q9ITB9LGluaXQ6ZnVuY3Rpb24oZSxyKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e307dC5hc3NlcnROb3ROdWxsKGUsImNjcFVybCIpLHQuYXNzZXJ0Tm90TnVsbChyLCJjb250YWluZXIiKSxjPXIscz1lLGZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O2UuY3VzdG9tPWUuY3VzdG9tfHx7fSwoYT1uKG4obih7fSxpKSxlKSx7fSx7Y3VzdG9tOm4obih7fSxpLmN1c3RvbSksZS5jdXN0b20pfSkpLmNhblJlcXVlc3Q9ISgiZmFsc2UiPT09YS5jYW5SZXF1ZXN0fHwhMT09PWEuY2FuUmVxdWVzdCl9KG8pLHQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdW2luaXRdIFJlcXVlc3QgU3RvcmFnZSBBY2NjZXNzIGluaXQgY2FsbGVkIHdpdGggY2NwVXJsIC0gIi5jb25jYXQoZSwiIC0gIikuY29uY2F0KGEuY2FuUmVxdWVzdD8iUHJvY2VlZGluZyB3aXRoIHJlcXVlc3Rpbmcgc3RvcmFnZSBhY2Nlc3MiOiJ1c2VyIGhhcyBvcHRlZCBvdXQsIHNraXBwaW5nIHJlcXVlc3Qgc3RvcmFnZSBhY2Nlc3MiKSkud2l0aE9iamVjdChhKX0sc2V0dXBSZXF1ZXN0SGFuZGxlcnM6ZnVuY3Rpb24oZSl7dmFyIG49ZS5vbkdyYW50O3ImJnIudW5zdWJzY3JpYmUoKSxyPXYoe29uSW5pdDpmdW5jdGlvbihlKXtjb25zb2xlLmxvZygiJWNbU3RvcmFnZUFjY2Vzc11bSU5JVF0iLCJiYWNrZ3JvdW5kOnllbGxvdzsgY29sb3I6YmxhY2s7IGZvbnQtc2l6ZTpsYXJnZSIpLHQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdW29uSW5pdF0gY2FsbGJhY2sgZXhlY3V0ZWQiKS53aXRoT2JqZWN0KG51bGw9PWU/dm9pZCAwOmUuZGF0YSksbnVsbCE9ZSYmZS5kYXRhLmhhc0FjY2Vzc3x8IWQoKXx8cCgpLnNob3coKX0sb25EZW55OmZ1bmN0aW9uKCl7Y29uc29sZS5sb2coIiVjW1N0b3JhZ2VBY2Nlc3NdW0RFTklFRF0iLCJiYWNrZ3JvdW5kOnJlZDsgY29sb3I6YmxhY2s7IGZvbnQtc2l6ZTpsYXJnZSIpLHQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdW29uRGVueV0gY2FsbGJhY2sgZXhlY3V0ZWQiKSxkKCkmJnAoKS5zaG93KCl9LG9uR3JhbnQ6ZnVuY3Rpb24oKXt2YXIgZTtjb25zb2xlLmxvZygiJWNbU3RvcmFnZUFjY2Vzc11bR1JBTlRFRF0iLCJiYWNrZ3JvdW5kOmxpbWU7IGNvbG9yOmJsYWNrOyBmb250LXNpemU6bGFyZ2UiKSx0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXVtvbkdyYW50XSBjYWxsYmFjayBleGVjdXRlZCIpLGQoKSYmKG51bGw9PT0oZT1hKXx8dm9pZCAwPT09ZXx8bnVsbD09PShlPWUuY3VzdG9tKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5oaWRlQ0NQKSYmcCgpLmhpZGUoKSx1fHwobigpLHU9ITApfX0pfSxnZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybDpmdW5jdGlvbigpe2lmKCFzKXRocm93IG5ldyBFcnJvcigiW1N0b3JhZ2VBY2Nlc3NdIFtnZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybF0gSW52b2tlIGNvbm5lY3Quc3RvcmFnZUFjY2Vzcy5pbml0IGZpcnN0Iik7aWYoZihzKSlyZXR1cm4gaChzKTtpZihnKHMpKXJldHVybiB0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXSBbQ0NQXSBMb2NhbCB0ZXN0aW5nIiksIiIuY29uY2F0KHMpLmNvbmNhdChvKTtpZihhLmluc3RhbmNlVXJsJiZmKGEuaW5zdGFuY2VVcmwpKXJldHVybiB0LmdldExvZygpLmluZm8oIltTdG9yYWdlQWNjZXNzXSBbZ2V0UmVxdWVzdFN0b3JhZ2VBY2Nlc3NVcmxdIEN1c3RvbWVyIGhhcyBwcm92aWRlZCBzdG9yYWdlUGFyYW1zLmluc3RhbmNlVXJsICIuY29uY2F0KGEuaW5zdGFuY2VVcmwpKSxoKGEuaW5zdGFuY2VVcmwpO2lmKGEuaW5zdGFuY2VVcmwmJmcoYS5pbnN0YW5jZVVybCkpcmV0dXJuIHQuZ2V0TG9nKCkuaW5mbygiW1N0b3JhZ2VBY2Nlc3NdIFtnZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybF0gTG9jYWwgdGVzdGluZyIpLCIiLmNvbmNhdChhLmluc3RhbmNlVXJsKS5jb25jYXQobyk7dGhyb3cgdC5nZXRMb2coKS5lcnJvcigiW1N0b3JhZ2VBY2Nlc3NdIFtnZXRSZXF1ZXN0U3RvcmFnZUFjY2Vzc1VybF0gSW52YWxpZCBDb25uZWN0IGluc3RhbmNlL0NDUCBVUkwgcHJvdmlkZWQsIHBsZWFzZSBwYXNzIHRoZSBjb3JyZWN0IGNjcFVybCBvciBzdG9yYWdlQWNjZXNzLmluc3RhbmNlVXJsIHBhcmFtZXRlcnMiKSxuZXcgRXJyb3IoIltTdG9yYWdlQWNjZXNzXSBbZ2V0UmVxdWVzdFN0b3JhZ2VBY2Nlc3NVcmxdIEludmFsaWQgQ29ubmVjdCBpbnN0YW5jZS9DQ1AgVVJMIHByb3ZpZGVkLCBwbGVhc2UgcGFzcyB0aGUgdmFsaWQgQ29ubmVjdCBDQ1AgVVJMIG9yIGluIGNhc2UgQ0NQIFVSTCBpcyBjb25maWd1cmVkIHRvIGJlIHRoZSBTU08gVVJMIHRoZW4gdXNlIHN0b3JhZ2VBY2Nlc3MuaW5zdGFuY2VVcmwgYW5kIHBhc3MgdGhlIENvbm5lY3QgQ0NQIFVSTCIpfSxzdG9yYWdlQWNjZXNzRXZlbnRzOmwscmVzZXRTdG9yYWdlQWNjZXNzU3RhdGU6ZnVuY3Rpb24oKXthPXt9LHM9IiIsYz1udWxsLHU9ITF9LGdldE9uR3JhbnRDYWxsYmFja0ludm9rZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdX0sZ2V0U3RvcmFnZUFjY2Vzc1BhcmFtczpmdW5jdGlvbigpe3JldHVybiBhfSxvblJlcXVlc3Q6dixyZXF1ZXN0OmZ1bmN0aW9uKCl7dC5jb3JlLl9nZXRDQ1BJZnJhbWUoKS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKHtldmVudDpsLlJFUVVFU1QsZGF0YTpuKG4oe30sYSkse30se2xhbmRhdDptKCl9KX0sIioiKX19KX0oKX0sNTU1OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQ7dmFyIG49ZnVuY3Rpb24obil7dmFyIHI9dGhpcztpZih0aGlzLl9wcmV2Q29udGFjdElkPW51bGwsdC5hc3NlcnROb3ROdWxsKG4sInJpbmd0b25lQ29uZmlnIiksIW4ucmluZ3RvbmVVcmwpdGhyb3cgbmV3IEVycm9yKCJyaW5ndG9uZVVybCBpcyByZXF1aXJlZCEiKTtlLkF1ZGlvJiZ2b2lkIDAhPT1lLlByb21pc2U/dGhpcy5fcGxheWFibGVBdWRpb1Byb21pc2U9bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsbyl7ci5fYXVkaW89bmV3IEF1ZGlvKG4ucmluZ3RvbmVVcmwpLHIuX2F1ZGlvLmxvb3A9ITAsci5fYXVkaW8uYWRkRXZlbnRMaXN0ZW5lcigiY2FucGxheSIsKGZ1bmN0aW9uKCl7dC5nZXRMb2coKS5pbmZvKCJSaW5ndG9uZSBpcyByZWFkeSB0byBwbGF5OiAiLCtuLnJpbmd0b25lVXJsKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuX2F1ZGlvUGxheWFibGU9ITAsZShyLl9hdWRpbyl9KSl9KSk6KHRoaXMuX2F1ZGlvPW51bGwsdC5nZXRMb2coKS5lcnJvcigiVW5hYmxlIHRvIHByb3ZpZGUgYSByaW5ndG9uZS4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKSxyLl9kcml2ZVJpbmd0b25lKCl9O24ucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJOb3QgaW1wbGVtZW50ZWQuIil9LG4ucHJvdG90eXBlLl9zdGFydFJpbmd0b25lPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7dGhpcy5fYXVkaW8mJih0aGlzLl9hdWRpby5wbGF5KCkudGhlbigoZnVuY3Rpb24oKXtuLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIlJpbmd0b25lIFN0YXJ0IixlKSx0LmdldExvZygpLmluZm8oIlJpbmd0b25lIFN0YXJ0Iikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKS5jYXRjaCgoZnVuY3Rpb24ocil7bi5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJSaW5ndG9uZSBQbGF5YmFjayBGYWlsdXJlIixlKSx0LmdldExvZygpLmVycm9yKCJSaW5ndG9uZSBQbGF5YmFjayBGYWlsdXJlIikud2l0aEV4Y2VwdGlvbihyKS53aXRoT2JqZWN0KHtjdXJyZW50U3JjOm4uX2F1ZGlvLmN1cnJlbnRTcmMsc2lua0lkOm4uX2F1ZGlvLnNpbmtJZCx2b2x1bWU6bi5fYXVkaW8udm9sdW1lfSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKSx0LmdldExvZygpLmluZm8oIkF0dGVtcHRpbmcgdG8gc3RhcnQgcmluZ3RvbmUgdG8gZGV2aWNlICIuY29uY2F0KHRoaXMuX2F1ZGlvLnNpbmtJZHx8IicnIikpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSxuLnByb3RvdHlwZS5fc3RvcFJpbmd0b25lPWZ1bmN0aW9uKGUpe3RoaXMuX2F1ZGlvJiYodGhpcy5fYXVkaW8ucGF1c2UoKSx0aGlzLl9hdWRpby5jdXJyZW50VGltZT0wLHRoaXMuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiUmluZ3RvbmUgU3RvcCIsZSksdC5nZXRMb2coKS5pbmZvKCJSaW5ndG9uZSBTdG9wIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSl9LG4ucHJvdG90eXBlLnN0b3BSaW5ndG9uZT1mdW5jdGlvbigpe3RoaXMuX3N0b3BSaW5ndG9uZSgpfSxuLnByb3RvdHlwZS5fcmluZ3RvbmVTZXR1cD1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3QuaWZNYXN0ZXIodC5NYXN0ZXJUb3BpY3MuUklOR1RPTkUsKGZ1bmN0aW9uKCl7bi5fc3RhcnRSaW5ndG9uZShlKSxuLl9wcmV2Q29udGFjdElkPWUuZ2V0Q29udGFjdElkKCksZS5vbkNvbm5lY3RlZChsaWx5LmhpdGNoKG4sbi5fc3RvcFJpbmd0b25lKSksZS5vbkFjY2VwdGVkKGxpbHkuaGl0Y2gobixuLl9zdG9wUmluZ3RvbmUpKSxlLm9uRW5kZWQobGlseS5oaXRjaChuLG4uX3N0b3BSaW5ndG9uZSkpLGUub25SZWZyZXNoKChmdW5jdGlvbihlKXtlLmdldFN0YXR1cygpLnR5cGUhPT10LkNvbnRhY3RTdGF0dXNUeXBlLkNPTk5FQ1RJTkcmJmUuZ2V0U3RhdHVzKCkudHlwZSE9PXQuQ29udGFjdFN0YXR1c1R5cGUuSU5DT01JTkcmJm4uX3N0b3BSaW5ndG9uZSgpfSkpfSkpfSxuLnByb3RvdHlwZS5fcHVibGlzaFRlbGVtZXRyeUV2ZW50PWZ1bmN0aW9uKGUsbil7biYmbi5nZXRDb250YWN0SWQoKSYmdC5wdWJsaXNoTWV0cmljKHtuYW1lOmUsY29udGFjdElkOm4uZ2V0Q29udGFjdElkKCl9KX0sbi5wcm90b3R5cGUuc2V0T3V0cHV0RGV2aWNlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wbGF5YWJsZUF1ZGlvUHJvbWlzZT9Qcm9taXNlLnJhY2UoW3RoaXMuX3BsYXlhYmxlQXVkaW9Qcm9taXNlLG5ldyBQcm9taXNlKChmdW5jdGlvbih0LG4pe2Uuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtuKCJUaW1lZCBvdXQgd2FpdGluZyBmb3IgcGxheWFibGUgYXVkaW8iKX0pLDNlMyl9KSldKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gZSYmZS5zZXRTaW5rSWQ/ZS5zZXRTaW5rSWQodCkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHQpfSkpLmNhdGNoKChmdW5jdGlvbihlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoIlJpbmd0b25lRW5naW5lQmFzZS5zZXRPdXRwdXREZXZpY2UgZmFpbGVkOiBhdWRpby5zZXRTaW5rSWQoKSBmYWlsZWQgd2l0aCBlcnJvciAiLmNvbmNhdChlKSl9KSk6UHJvbWlzZS5yZWplY3QoIlJpbmd0b25lRW5naW5lQmFzZS5zZXRPdXRwdXREZXZpY2UgZmFpbGVkOiAiLmNvbmNhdChlPyJhdWRpbyI6ImF1ZGlvLnNldFNpbmtJZCIsIiBub3QgZm91bmQuIikpfSkpOmUuUHJvbWlzZT9Qcm9taXNlLnJlamVjdCgiTm90IGVsaWdpYmxlIHJpbmd0b25lIG93bmVyIik6dm9pZCAwfTt2YXIgcj1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyxlKX07KHIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1yLHIucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKG4pe24uZ2V0VHlwZSgpPT09bGlseS5Db250YWN0VHlwZS5WT0lDRSYmbi5pc1NvZnRwaG9uZUNhbGwoKSYmbi5pc0luYm91bmQoKSYmKGUuX3Jpbmd0b25lU2V0dXAobiksZS5fcHVibGlzaFRlbGVtZXRyeUV2ZW50KCJSaW5ndG9uZSBDb25uZWN0aW5nIixuKSx0LmdldExvZygpLmluZm8oIlJpbmd0b25lIENvbm5lY3RpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX07dC5jb250YWN0KChmdW5jdGlvbihlKXtlLm9uQ29ubmVjdGluZyhuKX0pKSwobmV3IHQuQWdlbnQpLmdldENvbnRhY3RzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS5nZXRTdGF0dXMoKS50eXBlPT09dC5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HJiZuKGUpfSkpfTt2YXIgbz1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyxlKX07KG8ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1vLG8ucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKG4pe24uZ2V0VHlwZSgpPT09bGlseS5Db250YWN0VHlwZS5DSEFUJiZuLmlzSW5ib3VuZCgpJiYwPT09bi5nZXRDb25uZWN0aW9ucygpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0VHlwZSgpPT09dC5Db25uZWN0aW9uVHlwZS5BR0VOVCYmZS5pc1NpbGVudE1vbml0b3IoKX0pKS5sZW5ndGgmJihlLl9yaW5ndG9uZVNldHVwKG4pLGUuX3B1Ymxpc2hUZWxlbWV0cnlFdmVudCgiQ2hhdCBSaW5ndG9uZSBDb25uZWN0aW5nIixuKSx0LmdldExvZygpLmluZm8oIkNoYXQgUmluZ3RvbmUgQ29ubmVjdGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfTt0LmNvbnRhY3QoKGZ1bmN0aW9uKGUpe2Uub25Db25uZWN0aW5nKG4pfSkpfTt2YXIgaT1mdW5jdGlvbihlKXtuLmNhbGwodGhpcyxlKX07KGkucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1pLGkucHJvdG90eXBlLl9kcml2ZVJpbmd0b25lPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKG4pe24uZ2V0VHlwZSgpPT09bGlseS5Db250YWN0VHlwZS5UQVNLJiZuLmlzSW5ib3VuZCgpJiYoZS5fcmluZ3RvbmVTZXR1cChuKSxlLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIlRhc2sgUmluZ3RvbmUgQ29ubmVjdGluZyIsbiksdC5nZXRMb2coKS5pbmZvKCJUYXNrIFJpbmd0b25lIENvbm5lY3RpbmciKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpKX07dC5jb250YWN0KChmdW5jdGlvbihlKXtlLm9uQ29ubmVjdGluZyhuKX0pKX07dmFyIGE9ZnVuY3Rpb24oZSl7bi5jYWxsKHRoaXMsZSl9OyhhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YSxhLnByb3RvdHlwZS5fZHJpdmVSaW5ndG9uZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5jb250YWN0KChmdW5jdGlvbihuKXtuLm9uSW5jb21pbmcoKGZ1bmN0aW9uKCl7bi5nZXRUeXBlKCk9PT1saWx5LkNvbnRhY3RUeXBlLlFVRVVFX0NBTExCQUNLJiYoZS5fcmluZ3RvbmVTZXR1cChuKSxlLl9wdWJsaXNoVGVsZW1ldHJ5RXZlbnQoIkNhbGxiYWNrIFJpbmd0b25lIENvbm5lY3RpbmciLG4pLHQuZ2V0TG9nKCkuaW5mbygiQ2FsbGJhY2sgUmluZ3RvbmUgQ29ubmVjdGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpfSkpfSkpfSx0LlZvaWNlUmluZ3RvbmVFbmdpbmU9cix0LkNoYXRSaW5ndG9uZUVuZ2luZT1vLHQuVGFza1Jpbmd0b25lRW5naW5lPWksdC5RdWV1ZUNhbGxiYWNrUmluZ3RvbmVFbmdpbmU9YX0oKX0sOTYwOigpPT57ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX0sZSh0KX1mdW5jdGlvbiB0KGUsdCl7dmFyIG49T2JqZWN0LmtleXMoZSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTt0JiYocj1yLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KS5lbnVtZXJhYmxlfSkpKSxuLnB1c2guYXBwbHkobixyKX1yZXR1cm4gbn1mdW5jdGlvbiBuKGUpe2Zvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspe3ZhciBvPW51bGwhPWFyZ3VtZW50c1tuXT9hcmd1bWVudHNbbl06e307biUyP3QoT2JqZWN0KG8pLCEwKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyKGUsdCxvW3RdKX0pKTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG8pKTp0KE9iamVjdChvKSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG8sdCkpfSkpfXJldHVybiBlfWZ1bmN0aW9uIHIodCxuLHIpe3JldHVybihuPWZ1bmN0aW9uKHQpe3ZhciBuPWZ1bmN0aW9uKHQsbil7aWYoIm9iamVjdCIhPT1lKHQpfHxudWxsPT09dClyZXR1cm4gdDt2YXIgcj10W1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09cil7dmFyIG89ci5jYWxsKHQsbnx8ImRlZmF1bHQiKTtpZigib2JqZWN0IiE9PWUobykpcmV0dXJuIG87dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oInN0cmluZyI9PT1uP1N0cmluZzpOdW1iZXIpKHQpfSh0LCJzdHJpbmciKTtyZXR1cm4ic3ltYm9sIj09PWUobik/bjpTdHJpbmcobil9KG4pKWluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsbix7dmFsdWU6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbbl09cix0fSFmdW5jdGlvbigpe3ZhciB0PXRoaXN8fGdsb2JhbFRoaXMscj10LmNvbm5lY3R8fHt9O3QuY29ubmVjdD1yLHQubGlseT1yLHQuY2NwVmVyc2lvbj0iVjIiO3ZhciBvPSJDSVRSSVgiLGk9IkFXU19XT1JLU1BBQ0UiLGE9e307YVtyLlNvZnRwaG9uZUNhbGxUeXBlLkFVRElPX09OTFldPSJBdWRpbyIsYVtyLlNvZnRwaG9uZUNhbGxUeXBlLlZJREVPX09OTFldPSJWaWRlbyIsYVtyLlNvZnRwaG9uZUNhbGxUeXBlLkFVRElPX1ZJREVPXT0iQXVkaW9WaWRlbyIsYVtyLlNvZnRwaG9uZUNhbGxUeXBlLk5PTkVdPSJOb25lIjt2YXIgcz0iYXVkaW9faW5wdXQiLGM9ImF1ZGlvX291dHB1dCI7KHt9KVtyLkNvbnRhY3RUeXBlLlZPSUNFXT0iVm9pY2UiO3ZhciB1PVtdLGw9W10scD1bXSxkPXt9LGY9e30saD0wLGc9MCxtPTAsdj0wLHk9MCxiPSExLEU9ITEsUz1udWxsLEM9bnVsbCxUPW51bGwsST1udWxsLHc9ci5Tb2Z0cGhvbmVFcnJvclR5cGVzLEE9e30sXz1yLnJhbmRvbUlkKCksUj1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHQsbil7ci5jb3JlLmdldENsaWVudCgpLmNhbGwoci5DbGllbnRNZXRob2RzLkNSRUFURV9UUkFOU1BPUlQsZSx7c3VjY2VzczpmdW5jdGlvbihlKXt0KGUuc29mdHBob25lVHJhbnNwb3J0LnNvZnRwaG9uZU1lZGlhQ29ubmVjdGlvbnMpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe2UubWVzc2FnZSYmZS5tZXNzYWdlLmluY2x1ZGVzKCJTb2Z0cGhvbmVDb25uZWN0aW9uTGltaXRCcmVhY2hlZEV4Y2VwdGlvbiIpJiZHKCJtdWx0aXBsZV9zb2Z0cGhvbmVfYWN0aXZlX3Nlc3Npb25zIiwiTnVtYmVyIG9mIGFjdGl2ZSBzZXNzaW9ucyBhcmUgbW9yZSB0aGVuIGFsbG93ZWQgbGltaXQuIiwiIiksbihFcnJvcigicmVxdWVzdEljZUFjY2VzcyBmYWlsZWQiKSl9LGF1dGhGYWlsdXJlOmZ1bmN0aW9uKCl7bihFcnJvcigiQXV0aGVudGljYXRpb24gZmFpbGVkIHdoaWxlIHJlcXVlc3RJY2VBY2Nlc3MiKSl9LGFjY2Vzc0RlbmllZDpmdW5jdGlvbigpe24oRXJyb3IoIkFjY2VzcyBEZW5pZWQgd2hpbGUgcmVxdWVzdEljZUFjY2VzcyIpKX19KX0pKX0sTD1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sYT10aGlzO3RoaXMucnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5PW51bGwsdGhpcy5ydGNKc1N0cmF0ZWd5PW51bGwsdGhpcy5ydGNQZWVyQ29ubmVjdGlvbk1hbmFnZXI9bnVsbCx0aGlzLl9zZXRSdGNKc1N0cmF0ZWd5PWZ1bmN0aW9uKCl7aWYobi5WRElQbGF0Zm9ybSl7Uz1uLlZESVBsYXRmb3JtO3RyeXtpZihuLlZESVBsYXRmb3JtPT09byl0aGlzLnJ0Y0pzU3RyYXRlZ3k9bmV3IHIuQ2l0cml4VkRJU3RyYXRlZ3ksSS5pbmZvKCJbU29mdHBob25lTWFuYWdlcl0gU3RyYXRlZ3kgY29uc3RydWN0b3IgcmV0cmlldmVkOiAiLmNvbmNhdCh0aGlzLnJ0Y0pzU3RyYXRlZ3kpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpO2Vsc2V7aWYobi5WRElQbGF0Zm9ybSE9PWkpdGhyb3cgbmV3IEVycm9yKCJWREkgU3RyYXRlZ3kgbm90IHN1cHBvcnRlZCIpO3RoaXMucnRjSnNTdHJhdGVneT1uZXcgci5EQ1ZXZWJSVENTdHJhdGVneSxJLmluZm8oIltTb2Z0cGhvbmVNYW5hZ2VyXSBTdHJhdGVneSBjb25zdHJ1Y3RvciByZXRyaWV2ZWQ6ICIuY29uY2F0KHRoaXMucnRjSnNTdHJhdGVneSkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fWNhdGNoKGUpe3Rocm93IlZESSBTdHJhdGVneSBub3Qgc3VwcG9ydGVkIj09PWUubWVzc2FnZT8oRyh3LlZESV9TVFJBVEVHWV9OT1RfU1VQUE9SVEVELGUubWVzc2FnZSwiIiksZSk6IkNpdHJpeCBXZWJSVEMgcmVkaXJlY3Rpb24gZmVhdHVyZSBpcyBOT1Qgc3VwcG9ydGVkISI9PT1lLm1lc3NhZ2V8fCJEQ1YgV2ViUlRDIHJlZGlyZWN0aW9uIGZlYXR1cmUgaXMgTk9UIHN1cHBvcnRlZCEiPT09ZS5tZXNzYWdlPyhHKHcuVkRJX1JFRElSX05PVF9TVVBQT1JURUQsZS5tZXNzYWdlLCIiKSxlKTooRyh3Lk9USEVSLGUubWVzc2FnZSwiIiksZSl9fX0sdGhpcy5fcmVmcmVzaFJ0Y1BlZXJDb25uZWN0aW9uRmFjdG9yeT1mdW5jdGlvbigpe3ZhciBlO251bGwhPXImJm51bGwhPT0oZT1yLmNvcmUpJiZ2b2lkIDAhPT1lJiZudWxsIT09KGU9ZS5zb2Z0cGhvbmVNYW5hZ2VyKSYmdm9pZCAwIT09ZSYmbnVsbCE9PShlPWUucnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5KSYmdm9pZCAwIT09ZSYmZS5jbG9zZSYmci5jb3JlLnNvZnRwaG9uZU1hbmFnZXIucnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5LmNsb3NlKCksci5SdGNQZWVyQ29ubmVjdGlvbkZhY3RvcnkmJih0aGlzLnJ0Y0pzU3RyYXRlZ3k/dGhpcy5ydGNQZWVyQ29ubmVjdGlvbkZhY3Rvcnk9bmV3IHIuUnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5KEksci5jb3JlLmdldFdlYlNvY2tldE1hbmFnZXIoKSxfLHIuaGl0Y2goYSxSLHt0cmFuc3BvcnRUeXBlOiJzb2Z0cGhvbmUiLHNvZnRwaG9uZUNsaWVudElkOl99KSxyLmhpdGNoKGEsRyksdGhpcy5ydGNKc1N0cmF0ZWd5KTp0aGlzLnJ0Y1BlZXJDb25uZWN0aW9uRmFjdG9yeT1uZXcgci5SdGNQZWVyQ29ubmVjdGlvbkZhY3RvcnkoSSxyLmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpLF8sci5oaXRjaChhLFIse3RyYW5zcG9ydFR5cGU6InNvZnRwaG9uZSIsc29mdHBob25lQ2xpZW50SWQ6X30pLHIuaGl0Y2goYSxHKSkpfSx0aGlzLl9pbml0aWF0ZVJ0Y1BlZXJDb25uZWN0aW9uTWFuYWdlcj1mdW5jdGlvbigpe3ZhciBlO251bGwhPXImJm51bGwhPT0oZT1yLmNvcmUpJiZ2b2lkIDAhPT1lJiZudWxsIT09KGU9ZS5zb2Z0cGhvbmVNYW5hZ2VyKSYmdm9pZCAwIT09ZSYmbnVsbCE9PShlPWUucnRjUGVlckNvbm5lY3Rpb25NYW5hZ2VyKSYmdm9pZCAwIT09ZSYmZS5jbG9zZSYmKHIuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyLnJ0Y1BlZXJDb25uZWN0aW9uTWFuYWdlci5jbG9zZSgpLHIuY29yZS5zb2Z0cGhvbmVNYW5hZ2VyLnJ0Y1BlZXJDb25uZWN0aW9uTWFuYWdlcj1udWxsKTt2YXIgbyxpLHM9bi5pc1NvZnRwaG9uZVBlcnNpc3RlbnRDb25uZWN0aW9uRW5hYmxlZDt0LmxvY2FsU3RvcmFnZS5nZXRJdGVtKEJST1dTRVJfSUQpfHx0LmxvY2FsU3RvcmFnZS5zZXRJdGVtKEJST1dTRVJfSUQsQVdTLnV0aWwudXVpZC52NCgpKSxvPXQubG9jYWxTdG9yYWdlLmdldEl0ZW0oQlJPV1NFUl9JRCksci5SdGNQZWVyQ29ubmVjdGlvbk1hbmFnZXI/KGI9ITEsbnVsbCE9PShpPWEucnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5KSYmdm9pZCAwIT09aSYmaS5jbG9zZSYmKGEucnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5LmNsb3NlKCksYS5ydGNQZWVyQ29ubmVjdGlvbkZhY3Rvcnk9bnVsbCksYS5ydGNQZWVyQ29ubmVjdGlvbk1hbmFnZXI9bmV3IHIuUnRjUGVlckNvbm5lY3Rpb25NYW5hZ2VyKG51bGwsbnVsbCxyLmhpdGNoKGEsUix7dHJhbnNwb3J0VHlwZToic29mdHBob25lIixzb2Z0cGhvbmVDbGllbnRJZDpffSksci5oaXRjaChhLEcpLF8sbnVsbCxJLG51bGwsbnVsbCxyLmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpLG51bGw9PT1hLnJ0Y0pzU3RyYXRlZ3k/bmV3IHIuU3RhbmRhcmRTdHJhdGVneTphLnJ0Y0pzU3RyYXRlZ3kscyxvKSk6SS5pbmZvKCJSdGNQZWVyQ29ubmVjdGlvbk1hbmFnZXIgZG9lcyBOT1QgZXhpc3QsIHBsZWFzZSB1cGdyYWRlIFJUQy5qcyIpfSwoST1uZXcgb2Uoci5nZXRMb2coKSkpLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gc29mdHBob25lIG1hbmFnZXIgaW5pdGlhbGl6YXRpb24gaGFzIGJlZ3VuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSwhMSE9PW4uYWxsb3dFYXJseUd1bSYmKHIuaXNDaHJvbWVCcm93c2VyKCl8fHIuaXNFZGdlQnJvd3NlcigpKT8oSS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIGVhcmx5R3VtIG1lY2hhbmlzbSBlbmFibGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxiPSEwKTooSS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIGVhcmx5R3VtIG1lY2hhbmlzbSBOT1QgZW5hYmxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksYj0hMSksSS5pbmZvKCJbU29mdHBob25lTWFuYWdlcl0gQ2xpZW50IFByb3ZpZGVkIFN0cmF0ZWd5OiAiLmNvbmNhdChuLlZESVBsYXRmb3JtKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLl9zZXRSdGNKc1N0cmF0ZWd5KCksdGhpcy5fcmVmcmVzaFJ0Y1BlZXJDb25uZWN0aW9uRmFjdG9yeSgpLHIuY29yZS5fYWxsb3dTb2Z0cGhvbmVQZXJzaXN0ZW50Q29ubmVjdGlvbiYmbnVsbD09PXRoaXMucnRjUGVlckNvbm5lY3Rpb25NYW5hZ2VyJiZ0aGlzLl9pbml0aWF0ZVJ0Y1BlZXJDb25uZWN0aW9uTWFuYWdlcigpLHIuYWdlbnQoKGZ1bmN0aW9uKHQpe3ZhciBuPXQub25SZWZyZXNoKChmdW5jdGlvbih0KXtpZihlLnJ0Y1BlZXJDb25uZWN0aW9uTWFuYWdlcil7dmFyIG89dC5nZXRDb25maWd1cmF0aW9uKCkuc29mdHBob25lUGVyc2lzdGVudENvbm5lY3Rpb247ZS5ydGNQZWVyQ29ubmVjdGlvbk1hbmFnZXIuaXNQUENFbmFibGVkIT09byYmKGUucnRjUGVlckNvbm5lY3Rpb25NYW5hZ2VyLmlzUFBDRW5hYmxlZD1vLGUucnRjUGVlckNvbm5lY3Rpb25NYW5hZ2VyLmlzUFBDRW5hYmxlZD8oSS5pbmZvKCJzb2Z0cGhvbmVQZXJzaXN0ZW50Q29ubmVjdGlvbiBjaGFuZ2VkIHRvIHR1cmUsIGluaXRpYXRlIGEgcGVyc2lzdGVudCBwZWVyIGNvbm5lY3Rpb24iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGUucnRjUGVlckNvbm5lY3Rpb25NYW5hZ2VyLnJ0Y0pzU3RyYXRlZ3k9ZS5ydGNKc1N0cmF0ZWd5LGUucnRjUGVlckNvbm5lY3Rpb25NYW5hZ2VyLmNsb3NlRWFybHlNZWRpYUNvbm5lY3Rpb24oKSxlLnJ0Y1BlZXJDb25uZWN0aW9uTWFuYWdlci5yZXF1ZXN0UGVlckNvbm5lY3Rpb24oKS50aGVuKChmdW5jdGlvbigpe2UucnRjUGVlckNvbm5lY3Rpb25NYW5hZ2VyLmNyZWF0ZVNlc3Npb24oKSxlLnJ0Y1BlZXJDb25uZWN0aW9uTWFuYWdlci5jb25uZWN0KCl9KSkpOihJLmluZm8oInNvZnRwaG9uZVBlcnNpc3RlbnRDb25uZWN0aW9uIGNoYW5nZWQgdG8gZmFsc2UsIGRlc3Ryb3kgdGhlIGV4aXN0aW5nIHBlcnNpc3RlbnQgcGVlciBjb25uZWN0aW9uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlLnJ0Y1BlZXJDb25uZWN0aW9uTWFuYWdlci5kZXN0cm95KCksZS5ydGNQZWVyQ29ubmVjdGlvbk1hbmFnZXIucmVxdWVzdFBlZXJDb25uZWN0aW9uKCkpKX1lbHNlIHIuY29yZS5fYWxsb3dTb2Z0cGhvbmVQZXJzaXN0ZW50Q29ubmVjdGlvbj9lLl9pbml0aWF0ZVJ0Y1BlZXJDb25uZWN0aW9uTWFuYWdlcigpOm4udW5zdWJzY3JpYmUoKX0pKX0pKSxMLmlzQnJvd3NlclNvZnRQaG9uZVN1cHBvcnRlZCgpfHxHKHcuVU5TVVBQT1JURURfQlJPV1NFUiwiQ29ubmVjdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgYnJvd3Nlci4gU29tZSBmdW5jdGlvbmFsaXR5IG1heSBub3Qgd29yay4gIiwiIiksbi5WRElQbGF0Zm9ybSE9PWkmJkIoe3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7VygiQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQiLG51bGwse2Nvbm5lY3Rpdml0eUNoZWNrVHlwZToiTWljcm9waG9uZVBlcm1pc3Npb24iLHN0YXR1czoiZ3JhbnRlZCJ9KSxXKCJNaWNDaGVja1N1Y2NlZWRlZCIsbnVsbCx7Y29udGV4dDoiSW5pdGlhbGl6aW5nIFNvZnRwaG9uZSBNYW5hZ2VyIn0sITApfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe0coZSwiWW91ciBtaWNyb3Bob25lIGlzIG5vdCBlbmFibGVkIGluIHlvdXIgYnJvd3Nlci4gIiwiIiksVygiQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQiLG51bGwse2Nvbm5lY3Rpdml0eUNoZWNrVHlwZToiTWljcm9waG9uZVBlcm1pc3Npb24iLHN0YXR1czoiZGVuaWVkIn0pLFcoIkd1bUZhaWxlZCIsbnVsbCx7Y29udGV4dDoiSW5pdGlhbGl6aW5nIFNvZnRwaG9uZSBNYW5hZ2VyIn0sITApfX0pO3ZhciBzPWsoKSxjPU4oKSx1PVAoIW4uZGlzYWJsZUVjaG9DYW5jZWxsYXRpb24pO0QoKSx0aGlzLnJpbmd0b25lRW5naW5lPW51bGw7dmFyIGw9e30scD17fSxkPSExLGY9bnVsbCxoPW51bGwsZz1mdW5jdGlvbigpe2Q9ITEsZj1udWxsLGg9bnVsbH07dGhpcy5nZXRTZXNzaW9uPWZ1bmN0aW9uKGUpe3JldHVybiBsW2VdfSx0aGlzLnJlcGxhY2VMb2NhbE1lZGlhVHJhY2s9ZnVuY3Rpb24oZSx0KXt2YXIgcj1BW2VdLnN0cmVhbTtpZihyKXt2YXIgbz1yLmdldEF1ZGlvVHJhY2tzKClbMF07dC5lbmFibGVkPW8uZW5hYmxlZCxvLmVuYWJsZWQ9ITEsci5yZW1vdmVUcmFjayhvKSxuLlZESVBsYXRmb3JtPT09aSYmby5zdG9wKCksci5hZGRUcmFjayh0KX19O3ZhciBtPWZ1bmN0aW9uKHQpe2lmKGwuaGFzT3duUHJvcGVydHkodCkpe3ZhciBuPWxbdF07bmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7ZGVsZXRlIGxbdF0sZGVsZXRlIHBbdF0sZS5ydGNQZWVyQ29ubmVjdGlvbk1hbmFnZXI/ZS5ydGNQZWVyQ29ubmVjdGlvbk1hbmFnZXIuaGFuZ3VwKCk6bi5oYW5ndXAoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7bGlseS5nZXRMb2coKS53YXJuKCJUaGVyZSB3YXMgYW4gZXJyb3IgZGVzdHJveWluZyB0aGUgc29mdHBob25lIHNlc3Npb24gZm9yIGNvbm5lY3Rpb24gSUQgIi5jb25jYXQodCwiIDogIikuY29uY2F0KGUubWVzc2FnZSkpLndpdGhPYmplY3Qoe2FnZW50Q29ubmVjdGlvbklkOnQsZXJyb3JNZXNzYWdlOmUubWVzc2FnZX0pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9fTt0aGlzLl9jbGVhckFsbFNlc3Npb25zPWZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHIuZ2V0TG9nKCkuaW5mbygiQ2xlYXJpbmcgYWxsIGFjdGl2ZSBzZXNzaW9ucyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbClsLmhhc093blByb3BlcnR5KGUpJiZtKGUpfSx0aGlzLnN0YXJ0U2Vzc2lvbj1mdW5jdGlvbihlLHQpe3ZhciBvPWQ/ZjplLGk9ZD9oOnQ7aWYobyYmaSl7ZygpLHBbaV09ITAsSS5pbmZvKCJTb2Z0cGhvbmUgY2FsbCBkZXRlY3RlZDoiLCJjb250YWN0SWQgIitvLmdldENvbnRhY3RJZCgpLCJhZ2VudCBjb25uZWN0aW9uSWQgIitpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGZ1bmN0aW9uKGUpe2lmKE9iamVjdC5rZXlzKGUpLmxlbmd0aD4wKXtmb3IodmFyIHQgaW4gZSllLmhhc093blByb3BlcnR5KHQpJiYoSCgiTXVsdGlTZXNzaW9uSGFuZ1VwIixlW3RdLmNhbGxJZCx0KSxtKHQpKTt0aHJvdyBuZXcgRXJyb3IoImR1cGxpY2F0ZSBzZXNzaW9uIGRldGVjdGVkLCByZWZ1c2luZyB0byBzZXR1cCBuZXcgY29ubmVjdGlvbiIpfX0obCksby5nZXRTdGF0dXMoKS50eXBlPT09ci5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HJiZXKCJTb2Z0cGhvbmUgQ29ubmVjdGluZyIsby5nZXRDb250YWN0SWQoKSksWCgpO3ZhciBhLHMsYz1vLmdldEFnZW50Q29ubmVjdGlvbigpLmdldFNvZnRwaG9uZU1lZGlhSW5mbygpLHU9cShjLmNhbGxDb25maWdKc29uKTt1LnVzZVdlYlNvY2tldFByb3ZpZGVyJiYoYT1yLmNvcmUuZ2V0V2ViU29ja2V0TWFuYWdlcigpKSwocz10aGlzLnJ0Y0pzU3RyYXRlZ3k/bmV3IHIuUlRDU2Vzc2lvbih1LnNpZ25hbGluZ0VuZHBvaW50LHUuaWNlU2VydmVycyxjLmNhbGxDb250ZXh0VG9rZW4sSSxvLmdldENvbnRhY3RJZCgpLGksYSx0aGlzLnJ0Y0pzU3RyYXRlZ3kpOm5ldyByLlJUQ1Nlc3Npb24odS5zaWduYWxpbmdFbmRwb2ludCx1LmljZVNlcnZlcnMsYy5jYWxsQ29udGV4dFRva2VuLEksby5nZXRDb250YWN0SWQoKSxpLGEpKS5lY2hvQ2FuY2VsbGF0aW9uPSFuLmRpc2FibGVFY2hvQ2FuY2VsbGF0aW9uLGxbaV09cyxyLmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0oci5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDpyLkNvbm5lY3Rpb25FdmVudHMuU0VTU0lPTl9JTklULGRhdGE6e2Nvbm5lY3Rpb25JZDppfX0pLHMub25TZXNzaW9uRmFpbGVkPWZ1bmN0aW9uKGUsdCl7ZGVsZXRlIGxbaV0sZGVsZXRlIHBbaV0saihlLHQpLFYoby5nZXRDb250YWN0SWQoKSx0KSx0ZShvLGUuc2Vzc2lvblJlcG9ydCl9LHMub25TZXNzaW9uQ29ubmVjdGVkPWZ1bmN0aW9uKGUpe1coIlNvZnRwaG9uZSBTZXNzaW9uIENvbm5lY3RlZCIsby5nZXRDb250YWN0SWQoKSksci5iZWNvbWVNYXN0ZXIoci5NYXN0ZXJUb3BpY3MuU0VORF9MT0dTKSxLKGUpLFkobyksTyhvKX0scy5vblNlc3Npb25Db21wbGV0ZWQ9ZnVuY3Rpb24oZSl7VygiU29mdHBob25lIFNlc3Npb24gQ29tcGxldGVkIixvLmdldENvbnRhY3RJZCgpKSxkZWxldGUgbFtpXSxkZWxldGUgcFtpXSx0ZShvLGUuc2Vzc2lvblJlcG9ydCkseChpKX0scy5vbkxvY2FsU3RyZWFtQWRkZWQ9ZnVuY3Rpb24oZSx0KXtBW2ldPXtzdHJlYW06dH0sci5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHIuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6ci5BZ2VudEV2ZW50cy5MT0NBTF9NRURJQV9TVFJFQU1fQ1JFQVRFRCxkYXRhOntjb25uZWN0aW9uSWQ6aX19KX0scy5yZW1vdGVBdWRpb0VsZW1lbnQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlbW90ZS1hdWRpbyIpfHx3aW5kb3cucGFyZW50LnBhcmVudC5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVtb3RlLWF1ZGlvIiksdGhpcy5ydGNQZWVyQ29ubmVjdGlvbkZhY3Rvcnk/cy5jb25uZWN0KHRoaXMucnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5LmdldCh1LmljZVNlcnZlcnMpKTpzLmNvbm5lY3QoKX19O3ZhciB2PWZ1bmN0aW9uKGUsdCl7dmFyIG47bFt0XSYmZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0U3RhdHVzKCkudHlwZT09PXIuQ29udGFjdFN0YXR1c1R5cGUuRU5ERUR8fGUuZ2V0U3RhdHVzKCkudHlwZT09PXIuQ29udGFjdFN0YXR1c1R5cGUuRVJST1J8fGUuZ2V0U3RhdHVzKCkudHlwZT09PXIuQ29udGFjdFN0YXR1c1R5cGUuTUlTU0VEfShlKSYmKG0odCksZygpKSwhZS5pc1NvZnRwaG9uZUNhbGwoKXx8cFt0XXx8ZS5nZXRTdGF0dXMoKS50eXBlIT09ci5Db250YWN0U3RhdHVzVHlwZS5DT05ORUNUSU5HJiZlLmdldFN0YXR1cygpLnR5cGUhPT1yLkNvbnRhY3RTdGF0dXNUeXBlLklOQ09NSU5HfHwoVygiU29mdHBob25lQ29uZmlnRGV0ZWN0ZWQiLGUuZ2V0Q29udGFjdElkKCkse30sITApLHIuaXNGaXJlZm94QnJvd3NlcigpJiZyLmhhc090aGVyQ29ubmVjdGVkQ0NQcygpPyhJLmluZm8oIltTb2Z0cGhvbmUgTWFuYWdlcl0gUG9zdHBvbmUgc3RhcnRpbmcgc2Vzc2lvbjogIitlLmdldENvbnRhY3RJZCgpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGZ1bmN0aW9uKGUsdCl7ZD0hMCxmPWUsaD10fShlLHQpKTpiJiZudWxsIT09KG49ci5jb3JlLnVzZXJNZWRpYVByb3ZpZGVyKSYmdm9pZCAwIT09biYmbi5wcmVjYXB0dXJlZE1lZGlhU3RyZWFtQXZhaWxhYmxlKCk/KEU9ITAsSS5pbmZvKCJbU29mdHBob25lIE1hbmFnZXJdIHN0YXJ0aW5nIHNlc3Npb24gdXNpbmcgcHJlY2FwdHVyZWRNZWRpYVN0cmVhbSIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksYS5zdGFydFNlc3Npb24oZSx0LHIuY29yZS51c2VyTWVkaWFQcm92aWRlci5nZXRQcmVjYXB0dXJlZE1lZGlhU3RyZWFtKCkpKTooRT0hMSxyLmNvcmUuX2lzRWFybHlHdW1EaXNhYmxlZCYmKGI9ITEpLGEuc3RhcnRTZXNzaW9uKGUsdCkpKX0seT1mdW5jdGlvbihlKXt2YXIgdD1lLmdldEFnZW50Q29ubmVjdGlvbigpLmNvbm5lY3Rpb25JZDtJLmluZm8oIkNvbnRhY3QgZGV0ZWN0ZWQ6IiwiY29udGFjdElkICIrZS5nZXRDb250YWN0SWQoKSwiYWdlbnQgY29ubmVjdGlvbklkICIrdCkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxwW3RdfHwoZS5vblJlZnJlc2goKGZ1bmN0aW9uKGUpe3YoZSx0KX0pKSxlLm9uRXJyb3IoKGZ1bmN0aW9uKGUpe3IuaWZNYXN0ZXIoci5NYXN0ZXJUb3BpY3MuU09GVFBIT05FLChmdW5jdGlvbigpe3B1Ymxpc2hCYXRjaGVkU29mdHBob25lRXJyb3JzKGUuY29udGFjdElkKX0pLChmdW5jdGlvbigpe30pLCEwKX0pKSxlLm9uQ29ubmVjdGVkKChmdW5jdGlvbihlKXtyLmlmTWFzdGVyKHIuTWFzdGVyVG9waWNzLlNPRlRQSE9ORSwoZnVuY3Rpb24oKXtpc0Nvbm5lY3RlZD0hMCxkZWxldGVDb250YWN0RnJvbUVycm9yTWFwKGUuY29udGFjdElkKX0pLChmdW5jdGlvbigpe30pLCEwKX0pKSxlLm9uRGVzdHJveSgoZnVuY3Rpb24oKXshZnVuY3Rpb24oZSl7bFtlXSYmbShlKX0odCksQVt0XSYmeCh0KX0pKSl9LEM9ci5jb250YWN0KHkpOyhuZXcgci5BZ2VudCkuZ2V0Q29udGFjdHMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgdD1lLmdldEFnZW50Q29ubmVjdGlvbigpLmNvbm5lY3Rpb25JZDtJLmluZm8oIkNvbnRhY3QgZXhpc3QgaW4gdGhlIHNuYXBzaG90LiBSZWluaXRpYXRlIHRoZSBDb250YWN0IGFuZCBSVEMgc2Vzc2lvbiBjcmVhdGlvbiBmb3IgY29udGFjdElkIitlLmdldENvbnRhY3RJZCgpLCJhZ2VudCBjb25uZWN0aW9uSWQgIit0KS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHkoZSksdihlLHQpfSkpLHRoaXMudGVybWluYXRlPWZ1bmN0aW9uKCl7QyYmQy51bnN1YnNjcmliZSYmQy51bnN1YnNjcmliZSgpLHMmJnMudW5zdWJzY3JpYmUmJnMudW5zdWJzY3JpYmUoKSxjJiZjLnVuc3Vic2NyaWJlJiZjLnVuc3Vic2NyaWJlKCksdSYmdS51bnN1YnNjcmliZSYmdS51bnN1YnNjcmliZSgpLGUucnRjUGVlckNvbm5lY3Rpb25GYWN0b3J5LmNsZWFySWRsZVJ0Y1BlZXJDb25uZWN0aW9uVGltZXJJZCYmZS5ydGNQZWVyQ29ubmVjdGlvbkZhY3RvcnkuY2xlYXJJZGxlUnRjUGVlckNvbm5lY3Rpb25UaW1lcklkKCksZS5ydGNQZWVyQ29ubmVjdGlvbkZhY3Rvcnk9bnVsbCxlLnJ0Y1BlZXJDb25uZWN0aW9uTWFuYWdlciYmZS5ydGNQZWVyQ29ubmVjdGlvbk1hbmFnZXIuY2xlYXJJZGxlUnRjUGVlckNvbm5lY3Rpb25UaW1lcklkJiZlLnJ0Y1BlZXJDb25uZWN0aW9uTWFuYWdlci5jbGVhcklkbGVSdGNQZWVyQ29ubmVjdGlvblRpbWVySWQoKX19LE89ZnVuY3Rpb24oZSl7dmFyIHQ9ci5jb3JlLmdldFVwc3RyZWFtKCksbj1lLmdldEFnZW50Q29ubmVjdGlvbigpO2lmKG4pe3ZhciBvPW4uZ2V0U29mdHBob25lTWVkaWFJbmZvKCk7bz8hMD09PW8uYXV0b0FjY2VwdD8oSS5pbmZvKCJBdXRvLWFjY2VwdCBpcyBlbmFibGVkLCBzZW5kaW5nIG91dCBBY2NlcHRlZCBldmVudCB0byBzdG9wIHJpbmd0b25lLi4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuc2VuZFVwc3RyZWFtKHIuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6ci5Db250YWN0RXZlbnRzLkFDQ0VQVEVELGRhdGE6bmV3IHIuQ29udGFjdChlLmNvbnRhY3RJZCl9KSx0LnNlbmRVcHN0cmVhbShyLkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnIuY29yZS5nZXRDb250YWN0RXZlbnROYW1lKHIuQ29udGFjdEV2ZW50cy5BQ0NFUFRFRCxlLmNvbnRhY3RJZCksZGF0YTpuZXcgci5Db250YWN0KGUuY29udGFjdElkKX0pKTpJLmluZm8oIkF1dG8tYWNjZXB0IGlzIGRpc2FibGVkLCByaW5ndG9uZSB3aWxsIGJlIHN0b3BwZWQgYnkgdXNlciBhY3Rpb24uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTpJLmluZm8oIk5vdCBhYmxlIHRvIHJldHJpZXZlIHRoZSBhdXRvLWFjY2VwdCBzZXR0aW5nIGZyb20gbnVsbCBTb2Z0cGhvbmVNZWRpYUluZm8sIGlnbm9yaW5nIGV2ZW50IHB1Ymxpc2guLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9ZWxzZSBJLmluZm8oIk5vdCBhYmxlIHRvIHJldHJpZXZlIHRoZSBhdXRvLWFjY2VwdCBzZXR0aW5nIGZyb20gbnVsbCBBZ2VudENvbm5lY3Rpb24sIGlnbm9yaW5nIGV2ZW50IHB1Ymxpc2guLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGs9ZnVuY3Rpb24oKXtyZXR1cm4gci5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHIuRXZlbnRUeXBlLk1VVEUsTSl9LE49ZnVuY3Rpb24oKXtyZXR1cm4gci5jb3JlLmdldEV2ZW50QnVzKCkuc3Vic2NyaWJlKHIuQ29uZmlndXJhdGlvbkV2ZW50cy5TRVRfU1BFQUtFUl9ERVZJQ0UsVSl9LFA9ZnVuY3Rpb24oZSl7cmV0dXJuIHIuY29yZS5nZXRFdmVudEJ1cygpLnN1YnNjcmliZShyLkNvbmZpZ3VyYXRpb25FdmVudHMuU0VUX01JQ1JPUEhPTkVfREVWSUNFLChmdW5jdGlvbih0KXtyZXR1cm4gRihuKG4oe30sdCkse30se2VuYWJsZUVjaG9DYW5jZWxsYXRpb246ZX0pKX0pKX0sRD1mdW5jdGlvbigpe3RyeXtyLmlzQ2hyb21lQnJvd3NlcigpJiZyLmdldENocm9tZUJyb3dzZXJWZXJzaW9uKCk+NDMmJm5hdmlnYXRvci5wZXJtaXNzaW9ucy5xdWVyeSh7bmFtZToibWljcm9waG9uZSJ9KS50aGVuKChmdW5jdGlvbihlKXtlLm9uY2hhbmdlPWZ1bmN0aW9uKCl7SS5pbmZvKCJNaWNyb3Bob25lIFBlcm1pc3Npb246ICIrZS5zdGF0ZSksVygiQ29ubmVjdGl2aXR5Q2hlY2tSZXN1bHQiLG51bGwse2Nvbm5lY3Rpdml0eUNoZWNrVHlwZToiTWljcm9waG9uZVBlcm1pc3Npb24iLHN0YXR1czplLnN0YXRlfSksImRlbmllZCI9PT1lLnN0YXRlJiZHKHcuTUlDUk9QSE9ORV9OT1RfU0hBUkVELCJZb3VyIG1pY3JvcGhvbmUgaXMgbm90IGVuYWJsZWQgaW4geW91ciBicm93c2VyLiAiLCIiKX19KSl9Y2F0Y2goZSl7SS5lcnJvcigiRmFpbGVkIGluIGRldGVjdGluZyBtaWNyb3Bob25lIHBlcm1pc3Npb24gc3RhdHVzOiAiK2UpfX0seD1mdW5jdGlvbihlKXtkZWxldGUgQVtlXSxyLmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0oci5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDpyLkFnZW50RXZlbnRzLk1VVEVfVE9HR0xFLGRhdGE6e211dGVkOiExfX0pfSxNPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKDAhPT1yLmtleXMoQSkubGVuZ3RoKXtmb3IodmFyIG4gaW4gZSYmdm9pZCAwIT09ZS5tdXRlJiYodD1lLm11dGUpLEEpaWYoQS5oYXNPd25Qcm9wZXJ0eShuKSl7dmFyIG89QVtuXS5zdHJlYW07aWYobyl7dmFyIGk9by5nZXRBdWRpb1RyYWNrcygpWzBdO3ZvaWQgMCE9PXQ/KGkuZW5hYmxlZD0hdCxBW25dLm11dGVkPXQsdD9JLmluZm8oIkFnZW50IGhhcyBtdXRlZCB0aGUgY29udGFjdCwgY29ubmVjdGlvbklkIC0gICIrbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTpJLmluZm8oIkFnZW50IGhhcyB1bm11dGVkIHRoZSBjb250YWN0LCBjb25uZWN0aW9uSWQgLSAiK24pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpOnQ9QVtuXS5tdXRlZHx8ITF9fXIuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbShyLkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnIuQWdlbnRFdmVudHMuTVVURV9UT0dHTEUsZGF0YTp7bXV0ZWQ6dH19KX19LFU9ZnVuY3Rpb24oKXt2YXIgZT0oYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9KS5kZXZpY2VJZHx8IiI7aWYoci5nZXRMb2coKS5pbmZvKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBBdHRlbXB0aW5nIHRvIHNldCBzcGVha2VyIGRldmljZSAiLmNvbmNhdChlKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlKXt2YXIgdD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicmVtb3RlLWF1ZGlvIil8fHdpbmRvdy5wYXJlbnQucGFyZW50LmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJyZW1vdGUtYXVkaW8iKTt0JiYiZnVuY3Rpb24iPT10eXBlb2YgdC5zZXRTaW5rSWQ/dC5zZXRTaW5rSWQoZSkudGhlbigoZnVuY3Rpb24oKXtyLmdldExvZygpLmluZm8oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNwZWFrZXIgZGV2aWNlICIuY29uY2F0KGUsIiBzdWNjZXNzZnVsbHkgc2V0IHRvIHNwZWFrZXIgYXVkaW8gZWxlbWVudCIpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHIuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbShyLkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnIuQ29uZmlndXJhdGlvbkV2ZW50cy5TUEVBS0VSX0RFVklDRV9DSEFOR0VELGRhdGE6e2RldmljZUlkOmV9fSl9KSkuY2F0Y2goKGZ1bmN0aW9uKHQpe3IuZ2V0TG9nKCkuZXJyb3IoIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEZhaWxlZCB0byBzZXQgc3BlYWtlciBkZXZpY2UgIitlKS53aXRoRXhjZXB0aW9uKHQpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSk6ci5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIHNwZWFrZXIgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyByZW1vdGVBdWRpb0VsZW1lbnQiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfWVsc2Ugci5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIHNwZWFrZXIgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyBkZXZpY2VJZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LEY9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sdD1lLmRldmljZUlkfHwiIjtpZihyLmdldExvZygpLmluZm8oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIEF0dGVtcHRpbmcgdG8gc2V0IG1pY3JvcGhvbmUgZGV2aWNlICIuY29uY2F0KHQpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLDAhPT1yLmtleXMoQSkubGVuZ3RoKWlmKHQpe3ZhciBuPXIuY29yZS5nZXRTb2Z0cGhvbmVNYW5hZ2VyKCksbz17YXVkaW86e2RldmljZUlkOntleGFjdDp0fX19O2UuZW5hYmxlRWNob0NhbmNlbGxhdGlvbnx8KG8uYXVkaW8uZWNob0NhbmNlbGxhdGlvbj0hMSksci5wdWJsaXNoTWV0cmljKHtuYW1lOiJlY2hvQ2FuY2VsbGF0aW9uQ2hlY2siLGRhdGE6e2NvdW50OjEsZGlzYWJsZUVjaG9DYW5jZWxsYXRpb246IWUuZW5hYmxlRWNob0NhbmNlbGxhdGlvbn19KSxuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShvKS50aGVuKChmdW5jdGlvbihlKXt0cnl7dmFyIG89ZS5nZXRBdWRpb1RyYWNrcygpWzBdO2Zvcih2YXIgaSBpbiBBKUEuaGFzT3duUHJvcGVydHkoaSkmJihBW2ldLnN0cmVhbSxuLmdldFNlc3Npb24oaSkuX3BjLmdldFNlbmRlcnMoKVswXS5yZXBsYWNlVHJhY2sobykudGhlbigoZnVuY3Rpb24oKXtuLnJlcGxhY2VMb2NhbE1lZGlhVHJhY2soaSxvKSxyLmdldExvZygpLmluZm8oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIE1pY3JvcGhvbmUgZGV2aWNlICIuY29uY2F0KHQsIiBzdWNjZXNzZnVsbHkgc2V0IHRvIGxvY2FsIG1lZGlhIHN0cmVhbSBpbiBSVENSdHBTZW5kZXIiKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKSl9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgci5nZXRMb2coKS5lcnJvcigiW0F1ZGlvIERldmljZSBTZXR0aW5nc10gRmFpbGVkIHRvIHNldCBtaWNyb3Bob25lIGRldmljZSAiK3QpLndpdGhFeGNlcHRpb24oZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX1yLmNvcmUuZ2V0VXBzdHJlYW0oKS5zZW5kVXBzdHJlYW0oci5FdmVudFR5cGUuQlJPQURDQVNULHtldmVudDpyLkNvbmZpZ3VyYXRpb25FdmVudHMuTUlDUk9QSE9ORV9ERVZJQ0VfQ0hBTkdFRCxkYXRhOntkZXZpY2VJZDp0fX0pfSkpLmNhdGNoKChmdW5jdGlvbihlKXtyLmdldExvZygpLmVycm9yKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBGYWlsZWQgdG8gc2V0IG1pY3JvcGhvbmUgZGV2aWNlICIrdCkud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpfWVsc2Ugci5nZXRMb2coKS53YXJuKCJbQXVkaW8gRGV2aWNlIFNldHRpbmdzXSBTZXR0aW5nIG1pY3JvcGhvbmUgZGV2aWNlIGNhbmNlbGxlZCBkdWUgdG8gbWlzc2luZyBkZXZpY2VJZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7ZWxzZSByLmdldExvZygpLndhcm4oIltBdWRpbyBEZXZpY2UgU2V0dGluZ3NdIFNldHRpbmcgbWljcm9waG9uZSBkZXZpY2UgY2FuY2VsbGVkIGR1ZSB0byBtaXNzaW5nIGxvY2FsTWVkaWFTdHJlYW0iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxqPWZ1bmN0aW9uKGUsdCl7aWYodD09PXIuUlRDRXJyb3JzLklDRV9DT0xMRUNUSU9OX1RJTUVPVVQpe2Zvcih2YXIgbj0iXG4iLG89MDtvPGUuX2ljZVNlcnZlcnMubGVuZ3RoO28rKylmb3IodmFyIGk9MDtpPGUuX2ljZVNlcnZlcnNbb10udXJscy5sZW5ndGg7aSsrKW49bitlLl9pY2VTZXJ2ZXJzW29dLnVybHNbaV0rIlxuIjtHKHcuSUNFX0NPTExFQ1RJT05fVElNRU9VVCwiSWNlIGNvbGxlY3Rpb24gdGltZWRvdXQuICIsbil9ZWxzZSB0PT09ci5SVENFcnJvcnMuVVNFUl9CVVNZP0cody5VU0VSX0JVU1lfRVJST1IsIlNvZnRwaG9uZSBjYWxsIFVzZXJCdXN5IGVycm9yLiAiLCIiKTp0PT09ci5SVENFcnJvcnMuU0lHTkFMTElOR19IQU5EU0hBS0VfRkFJTFVSRT9HKHcuU0lHTkFMTElOR19IQU5EU0hBS0VfRkFJTFVSRSwiSGFuZHNoYWtpbmcgd2l0aCBTaWduYWxsaW5nIFNlcnZlciAiK2UuX3NpZ25hbGluZ1VyaSsiIGZhaWxlZC4gIixlLl9zaWduYWxpbmdVcmkpOnQ9PT1yLlJUQ0Vycm9ycy5HVU1fVElNRU9VVF9GQUlMVVJFfHx0PT09ci5SVENFcnJvcnMuR1VNX09USEVSX0ZBSUxVUkU/Ryh3Lk1JQ1JPUEhPTkVfTk9UX1NIQVJFRCwiWW91ciBtaWNyb3Bob25lIGlzIG5vdCBlbmFibGVkIGluIHlvdXIgYnJvd3Nlci4gIiwiIik6dD09PXIuUlRDRXJyb3JzLlNJR05BTExJTkdfQ09OTkVDVElPTl9GQUlMVVJFP0cody5TSUdOQUxMSU5HX0NPTk5FQ1RJT05fRkFJTFVSRSwiVVJMICIrZS5fc2lnbmFsaW5nVXJpKyIgY2Fubm90IGJlIHJlYWNoZWQuICIsZS5fc2lnbmFsaW5nVXJpKTp0PT09ci5SVENFcnJvcnMuQ0FMTF9OT1RfRk9VTkQ/SS5lcnJvcigiU29mdHBob25lIGNhbGwgZmFpbGVkIGR1ZSB0byBDYWxsTm90Rm91bmRFeGNlcHRpb24uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTpHKHcuV0VCUlRDX0VSUk9SLCJ3ZWJydGMgc3lzdGVtIGVycm9yLiAiLCIiKX0scT1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoLyZxdW90Oy9nLCciJyk7cmV0dXJuIEpTT04ucGFyc2UodCl9LEI9ZnVuY3Rpb24odCl7dmFyIG49dHx8e307bi5zdWNjZXNzPW4uc3VjY2Vzc3x8ZnVuY3Rpb24oKXt9LG4uZmFpbHVyZT1uLmZhaWx1cmV8fGZ1bmN0aW9uKCl7fTt2YXIgcj17YXVkaW86ITB9LG89bnVsbDtpZigiZnVuY3Rpb24iPT10eXBlb2YgUHJvbWlzZSl7aWYoIm9iamVjdCI9PT1lKG5hdmlnYXRvci5tZWRpYURldmljZXMpJiYiZnVuY3Rpb24iPT10eXBlb2YgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEpbz1uYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYShyKTtlbHNle2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuYXZpZ2F0b3Iud2Via2l0R2V0VXNlck1lZGlhKXJldHVybiB2b2lkIG4uZmFpbHVyZSh3LlVOU1VQUE9SVEVEX0JST1dTRVIpO289bmV3IFByb21pc2UoKGZ1bmN0aW9uKGUsdCl7bmF2aWdhdG9yLndlYmtpdEdldFVzZXJNZWRpYShyLGUsdCl9KSl9cmV0dXJuIG8udGhlbigoZnVuY3Rpb24oZSl7dmFyIHQ9ZS5nZXRBdWRpb1RyYWNrcygpO3QmJnQubGVuZ3RoPjA/bi5zdWNjZXNzKGUpOm4uZmFpbHVyZSh3Lk1JQ1JPUEhPTkVfTk9UX1NIQVJFRCl9KSwoZnVuY3Rpb24oZSl7bi5mYWlsdXJlKHcuTUlDUk9QSE9ORV9OT1RfU0hBUkVEKX0pKSxvfW4uZmFpbHVyZSh3LlVOU1VQUE9SVEVEX0JST1dTRVIpfSxHPWZ1bmN0aW9uKGUsdCxuKXtJLmVycm9yKCJTb2Z0cGhvbmUgZXJyb3Igb2NjdXJyZWQgOiAiLGUsdHx8IiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksci5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHIuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6ci5BZ2VudEV2ZW50cy5TT0ZUUEhPTkVfRVJST1IsZGF0YTpuZXcgci5Tb2Z0cGhvbmVFcnJvcihlLHQsbil9KX0sVj1mdW5jdGlvbihlLHQpe1coIlNvZnRwaG9uZSBTZXNzaW9uIEZhaWxlZCIsZSx7ZmFpbGVkUmVhc29uOnR9KX0sVz1mdW5jdGlvbihlLHQsbil7ci5wdWJsaXNoTWV0cmljKHtuYW1lOmUsY29udGFjdElkOnQsZGF0YTpufSl9LEg9ZnVuY3Rpb24oZSx0LG4pe1coZSx0LFt7bmFtZToiQWdlbnRDb25uZWN0aW9uSWQiLHZhbHVlOm59XSksSS5pbmZvKCJQdWJsaXNoIG11bHRpcGxlIHNlc3Npb24gZXJyb3IgbWV0cmljcyIsZSwiY29udGFjdElkICIrdCwiYWdlbnQgY29ubmVjdGlvbklkICIrbikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX07TC5pc0Jyb3dzZXJTb2Z0UGhvbmVTdXBwb3J0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4hIShyLmlzT3BlcmFCcm93c2VyKCkmJnIuZ2V0T3BlcmFCcm93c2VyVmVyc2lvbigpPjE3KXx8ISEoci5pc0Nocm9tZUJyb3dzZXIoKSYmci5nZXRDaHJvbWVCcm93c2VyVmVyc2lvbigpPjIyKXx8ISEoci5pc0ZpcmVmb3hCcm93c2VyKCkmJnIuZ2V0RmlyZWZveEJyb3dzZXJWZXJzaW9uKCk+MjEpfTt2YXIgej1mdW5jdGlvbihlKXt2YXIgdD11LnNsaWNlKCk7dT1bXSx0Lmxlbmd0aD4wJiZlLnNlbmRTb2Z0cGhvbmVNZXRyaWNzKHQse3N1Y2Nlc3M6ZnVuY3Rpb24oKXtJLmluZm8oInNlbmRTb2Z0cGhvbmVNZXRyaWNzIHN1Y2Nlc3MiK0pTT04uc3RyaW5naWZ5KHQpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe0kuZXJyb3IoInNlbmRTb2Z0cGhvbmVNZXRyaWNzIGZhaWxlZC4iKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSl9LEs9ZnVuY3Rpb24oZSl7Qz13aW5kb3cuc2V0SW50ZXJ2YWwoKGZ1bmN0aW9uKCl7ZS5nZXRVc2VyQXVkaW9TdGF0cygpLnRoZW4oKGZ1bmN0aW9uKGUpe3ZhciB0PWQsbj1KKGQ9ZSx0LHMpO3UucHVzaChuKSxRKG4pfSksKGZ1bmN0aW9uKGUpe0kuZGVidWcoIkZhaWxlZCB0byBnZXQgdXNlciBhdWRpbyBzdGF0cy4iLGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSksZS5nZXRSZW1vdGVBdWRpb1N0YXRzKCkudGhlbigoZnVuY3Rpb24oZSl7dmFyIHQ9ZixuPUooZj1lLHQsYyk7dS5wdXNoKG4pLFEobil9KSwoZnVuY3Rpb24oZSl7SS5kZWJ1ZygiRmFpbGVkIHRvIGdldCByZW1vdGUgYXVkaW8gc3RhdHMuIixlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpfSksMWUzKX0sWT1mdW5jdGlvbihlKXtUPXdpbmRvdy5zZXRJbnRlcnZhbCgoZnVuY3Rpb24oKXt6KGUpfSksM2U0KX0sWD1mdW5jdGlvbigpe2Q9bnVsbCxmPW51bGwsdT1bXSxsPVtdLHA9W10sQz1udWxsLFQ9bnVsbCxoPTAsZz0wLG09MCx2PTAseT0wfSxKPWZ1bmN0aW9uKGUsdCxuKXtpZih0JiZlKXt2YXIgcj1lLnBhY2tldHNMb3N0PnQucGFja2V0c0xvc3Q/ZS5wYWNrZXRzTG9zdC10LnBhY2tldHNMb3N0OjAsbz1lLnBhY2tldHNDb3VudD50LnBhY2tldHNDb3VudD9lLnBhY2tldHNDb3VudC10LnBhY2tldHNDb3VudDowO3JldHVybiBaKG8sbiksJChlLmF1ZGlvTGV2ZWwsbiksbmV3IG5lKGUudGltZXN0YW1wLHIsbyxuLGUuYXVkaW9MZXZlbCxlLmpiTWlsbGlzZWNvbmRzLGUucnR0TWlsbGlzZWNvbmRzKX1yZXR1cm4gbmV3IG5lKGUudGltZXN0YW1wLGUucGFja2V0c0xvc3QsZS5wYWNrZXRzQ291bnQsbixlLmF1ZGlvTGV2ZWwsZS5qYk1pbGxpc2Vjb25kcyxlLnJ0dE1pbGxpc2Vjb25kcyl9LFE9ZnVuY3Rpb24oZSl7aWYoZS5zb2Z0cGhvbmVTdHJlYW1UeXBlPT09cyl7Zm9yKDtsLmxlbmd0aD49MTA4MDA7KWwuc2hpZnQoKTtsLnB1c2goZSl9ZWxzZSBpZihlLnNvZnRwaG9uZVN0cmVhbVR5cGU9PT1jKXtmb3IoO3AubGVuZ3RoPj0xMDgwMDspcC5zaGlmdCgpO3AucHVzaChlKX19LFo9ZnVuY3Rpb24oZSx0KXt0PT09cz8oeSsrLGU8PTA/aCsrOmg9MCk6dD09PWMmJihlPD0wP20rKzptPTApfSwkPWZ1bmN0aW9uKGUsdCl7dD09PXM/bnVsbCE9PWUmJmU8PTE/ZysrOmc9MDp0PT09YyYmKG51bGwhPT1lJiZlPD0xP3YrKzp2PTApfSxlZT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9PWUmJndpbmRvdy5jbGVhckludGVydmFsKGUpLG51bGx9LHRlPWZ1bmN0aW9uKGUsbyl7Qz1lZShDKSxUPWVlKFQpLGZ1bmN0aW9uKGUsbyxpLGEpe28uc3RyZWFtU3RhdHM9W3JlKGkscykscmUoYSxjKV07dmFyIHU9e2NhbGxTdGFydFRpbWU6by5zZXNzaW9uU3RhcnRUaW1lLGNhbGxFbmRUaW1lOm8uc2Vzc2lvbkVuZFRpbWUsZ3VtVGltZU1pbGxpczpvLmd1bVRpbWVNaWxsaXMsaW5pdGlhbGl6YXRpb25UaW1lTWlsbGlzOm8uaW5pdGlhbGl6YXRpb25UaW1lTWlsbGlzLGljZUNvbGxlY3Rpb25UaW1lTWlsbGlzOm8uaWNlQ29sbGVjdGlvblRpbWVNaWxsaXMsc2lnbmFsbGluZ0Nvbm5lY3RUaW1lTWlsbGlzOm8uc2lnbmFsbGluZ0Nvbm5lY3RUaW1lTWlsbGlzLGhhbmRzaGFraW5nVGltZU1pbGxpczpvLmhhbmRzaGFraW5nVGltZU1pbGxpcyxwcmVUYWxraW5nVGltZU1pbGxpczpvLnByZVRhbGtpbmdUaW1lTWlsbGlzLHRhbGtpbmdUaW1lTWlsbGlzOm8udGFsa2luZ1RpbWVNaWxsaXMsY2xlYW51cFRpbWVNaWxsaXM6by5jbGVhbnVwVGltZU1pbGxpcyxpY2VDb2xsZWN0aW9uRmFpbHVyZTpvLmljZUNvbGxlY3Rpb25GYWlsdXJlLHNpZ25hbGxpbmdDb25uZWN0aW9uRmFpbHVyZTpvLnNpZ25hbGxpbmdDb25uZWN0aW9uRmFpbHVyZSxoYW5kc2hha2luZ0ZhaWx1cmU6by5oYW5kc2hha2luZ0ZhaWx1cmUsZ3VtT3RoZXJGYWlsdXJlOm8uZ3VtT3RoZXJGYWlsdXJlLGd1bVRpbWVvdXRGYWlsdXJlOm8uZ3VtVGltZW91dEZhaWx1cmUsY3JlYXRlT2ZmZXJGYWlsdXJlOm8uY3JlYXRlT2ZmZXJGYWlsdXJlLHNldExvY2FsRGVzY3JpcHRpb25GYWlsdXJlOm8uc2V0TG9jYWxEZXNjcmlwdGlvbkZhaWx1cmUsdXNlckJ1c3lGYWlsdXJlOm8udXNlckJ1c3lGYWlsdXJlLGludmFsaWRSZW1vdGVTRFBGYWlsdXJlOm8uaW52YWxpZFJlbW90ZVNEUEZhaWx1cmUsbm9SZW1vdGVJY2VDYW5kaWRhdGVGYWlsdXJlOm8ubm9SZW1vdGVJY2VDYW5kaWRhdGVGYWlsdXJlLHNldFJlbW90ZURlc2NyaXB0aW9uRmFpbHVyZTpvLnNldFJlbW90ZURlc2NyaXB0aW9uRmFpbHVyZSxzb2Z0cGhvbmVTdHJlYW1TdGF0aXN0aWNzOm8uc3RyZWFtU3RhdHN9O2Uuc2VuZFNvZnRwaG9uZVJlcG9ydCh1LHtzdWNjZXNzOmZ1bmN0aW9uKCl7SS5pbmZvKCJzZW5kU29mdHBob25lUmVwb3J0IHN1Y2Nlc3MiK0pTT04uc3RyaW5naWZ5KHUpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxmYWlsdXJlOmZ1bmN0aW9uKGUpe0kuZXJyb3IoInNlbmRTb2Z0cGhvbmVSZXBvcnQgZmFpbGVkLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX19KTt2YXIgZD17QVVESU9fSU5QVVQ6e3BhY2tldHNDb3VudDpsLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFja2V0c0NvdW50fSkpLHBhY2tldHNMb3N0OmwubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYWNrZXRzTG9zdH0pKSxhdWRpb0xldmVsOmwubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5hdWRpb0xldmVsfSkpLGppdHRlckJ1ZmZlck1pbGxpczpsLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaml0dGVyQnVmZmVyTWlsbGlzfSkpfSxBVURJT19PVVRQVVQ6e3BhY2tldHNDb3VudDpwLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFja2V0c0NvdW50fSkpLHBhY2tldHNMb3N0OnAubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5wYWNrZXRzTG9zdH0pKSxhdWRpb0xldmVsOnAubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5hdWRpb0xldmVsfSkpLGppdHRlckJ1ZmZlck1pbGxpczpwLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUuaml0dGVyQnVmZmVyTWlsbGlzfSkpLHJvdW5kVHJpcFRpbWVNaWxsaXM6cC5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJvdW5kVHJpcFRpbWVNaWxsaXN9KSl9fSxmPW4obih7fSx1KSx7fSx7c29mdHBob25lU3RyZWFtUGVyU2Vjb25kU3RhdGlzdGljczpkLGljZUNvbm5lY3Rpb25zTG9zdDpvLmljZUNvbm5lY3Rpb25zTG9zdCxpY2VDb25uZWN0aW9uc0ZhaWxlZDpvLmljZUNvbm5lY3Rpb25zRmFpbGVkfHxudWxsLHBlZXJDb25uZWN0aW9uRmFpbGVkOm8ucGVlckNvbm5lY3Rpb25GYWlsZWR8fG51bGwscnRjSnNWZXJzaW9uOm8ucnRjSnNWZXJzaW9ufHxudWxsLGNvbnNlY3V0aXZlTm9BdWRpb0lucHV0UGFja2V0czpoLGNvbnNlY3V0aXZlTG93SW5wdXRBdWRpb0xldmVsOmcsY29uc2VjdXRpdmVOb0F1ZGlvT3V0cHV0UGFja2V0czptLGNvbnNlY3V0aXZlTG93T3V0cHV0QXVkaW9MZXZlbDp2LGF1ZGlvSW5wdXRDb25uZWN0ZWREdXJhdGlvblNlY29uZHM6eSxjY3BNZWRpYVJlYWR5TGF0ZW5jeU1pbGxpczowLGNvbnRhY3RTdWJ0eXBlOmUuZ2V0Q29udGFjdFN1YnR5cGUoKSxlYXJseUd1bUVuYWJsZWQ6YixlYXJseUd1bVdvcmtlZDpFLHZkaVBsYXRmb3JtOlN8fG51bGwsc3RyZWFtSnNWZXJzaW9uOnIudmVyc2lvbn0pO3IucHVibGlzaFNvZnRwaG9uZVJlcG9ydCh7Y29udGFjdElkOmUuZ2V0Q29udGFjdElkKCksY2NwVmVyc2lvbjp0LmNjcFZlcnNpb24scmVwb3J0OmZ9KSxJLmluZm8oInNlbnQgVGVsZW1ldHJ5Q2FsbFJlcG9ydCAiK0pTT04uc3RyaW5naWZ5KGYpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfShlLG8scmUoZCxzKSxyZShmLGMpKSx6KGUpfSxuZT1mdW5jdGlvbihlLHQsbixyLG8saSxhKXt0aGlzLnNvZnRwaG9uZVN0cmVhbVR5cGU9cix0aGlzLnRpbWVzdGFtcD1lLHRoaXMucGFja2V0c0xvc3Q9dCx0aGlzLnBhY2tldHNDb3VudD1uLHRoaXMuYXVkaW9MZXZlbD1vLHRoaXMuaml0dGVyQnVmZmVyTWlsbGlzPWksdGhpcy5yb3VuZFRyaXBUaW1lTWlsbGlzPWF9LHJlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBuZSgoZT1lfHx7fSkudGltZXN0YW1wLGUucGFja2V0c0xvc3QsZS5wYWNrZXRzQ291bnQsdCxlLmF1ZGlvTGV2ZWwpfSxvZT1mdW5jdGlvbihlKXt0aGlzLl9vcmlnaW5hbExvZ2dlcj1lO3ZhciB0PXRoaXM7dGhpcy5fdGVlPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzWzBdKSxvPSIiO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKCl7bys9IiAlcyJ9KSksbi5hcHBseSh0Ll9vcmlnaW5hbExvZ2dlcixbci5Mb2dDb21wb25lbnQuU09GVFBIT05FLG9dLmNvbmNhdChlKSl9fX07b2UucHJvdG90eXBlLmRlYnVnPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlZSgxLHRoaXMuX29yaWdpbmFsTG9nZ2VyLmRlYnVnKShhcmd1bWVudHMpfSxvZS5wcm90b3R5cGUuaW5mbz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90ZWUoMix0aGlzLl9vcmlnaW5hbExvZ2dlci5pbmZvKShhcmd1bWVudHMpfSxvZS5wcm90b3R5cGUubG9nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlZSgzLHRoaXMuX29yaWdpbmFsTG9nZ2VyLmxvZykoYXJndW1lbnRzKX0sb2UucHJvdG90eXBlLndhcm49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGVlKDQsdGhpcy5fb3JpZ2luYWxMb2dnZXIud2FybikoYXJndW1lbnRzKX0sb2UucHJvdG90eXBlLmVycm9yPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RlZSg1LHRoaXMuX29yaWdpbmFsTG9nZ2VyLmVycm9yKShhcmd1bWVudHMpfSxyLlNvZnRwaG9uZU1hbmFnZXI9TH0oKX0sNzc4OigpPT57IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWZ1bmN0aW9uKCl7cmV0dXJuIHQuY2FjaGUuaGFzT3duUHJvcGVydHkoYXJndW1lbnRzWzBdKXx8KHQuY2FjaGVbYXJndW1lbnRzWzBdXT10LnBhcnNlKGFyZ3VtZW50c1swXSkpLHQuZm9ybWF0LmNhbGwobnVsbCx0LmNhY2hlW2FyZ3VtZW50c1swXV0sYXJndW1lbnRzKX07ZnVuY3Rpb24gbihlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsLTEpLnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gcihlLHQpe2Zvcih2YXIgbj1bXTt0PjA7blstLXRdPWUpO3JldHVybiBuLmpvaW4oIiIpfXQuZm9ybWF0PWZ1bmN0aW9uKGUsbyl7dmFyIGksYSxzLGMsdSxsLHAsZD0xLGY9ZS5sZW5ndGgsaD0iIixnPVtdO2ZvcihhPTA7YTxmO2ErKylpZigic3RyaW5nIj09PShoPW4oZVthXSkpKWcucHVzaChlW2FdKTtlbHNlIGlmKCJhcnJheSI9PT1oKXtpZigoYz1lW2FdKVsyXSlmb3IoaT1vW2RdLHM9MDtzPGNbMl0ubGVuZ3RoO3MrKyl7aWYoIWkuaGFzT3duUHJvcGVydHkoY1syXVtzXSkpdGhyb3cgdCgnW3NwcmludGZdIHByb3BlcnR5ICIlcyIgZG9lcyBub3QgZXhpc3QnLGNbMl1bc10pO2k9aVtjWzJdW3NdXX1lbHNlIGk9Y1sxXT9vW2NbMV1dOm9bZCsrXTtpZigvW15zXS8udGVzdChjWzhdKSYmIm51bWJlciIhPW4oaSkpdGhyb3cgdCgiW3NwcmludGZdIGV4cGVjdGluZyBudW1iZXIgYnV0IGZvdW5kICVzIixuKGkpKTtzd2l0Y2goY1s4XSl7Y2FzZSJiIjppPWkudG9TdHJpbmcoMik7YnJlYWs7Y2FzZSJjIjppPVN0cmluZy5mcm9tQ2hhckNvZGUoaSk7YnJlYWs7Y2FzZSJkIjppPXBhcnNlSW50KGksMTApO2JyZWFrO2Nhc2UiZSI6aT1jWzddP2kudG9FeHBvbmVudGlhbChjWzddKTppLnRvRXhwb25lbnRpYWwoKTticmVhaztjYXNlImYiOmk9Y1s3XT9wYXJzZUZsb2F0KGkpLnRvRml4ZWQoY1s3XSk6cGFyc2VGbG9hdChpKTticmVhaztjYXNlIm8iOmk9aS50b1N0cmluZyg4KTticmVhaztjYXNlInMiOmk9KGk9U3RyaW5nKGkpKSYmY1s3XT9pLnN1YnN0cmluZygwLGNbN10pOmk7YnJlYWs7Y2FzZSJ1IjppPj4+PTA7YnJlYWs7Y2FzZSJ4IjppPWkudG9TdHJpbmcoMTYpO2JyZWFrO2Nhc2UiWCI6aT1pLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfWk9L1tkZWZdLy50ZXN0KGNbOF0pJiZjWzNdJiZpPj0wPyIrIitpOmksbD1jWzRdPyIwIj09Y1s0XT8iMCI6Y1s0XS5jaGFyQXQoMSk6IiAiLHA9Y1s2XS1TdHJpbmcoaSkubGVuZ3RoLHU9Y1s2XT9yKGwscCk6IiIsZy5wdXNoKGNbNV0/aSt1OnUraSl9cmV0dXJuIGcuam9pbigiIil9LHQuY2FjaGU9e30sdC5wYXJzZT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9ZSxuPVtdLHI9W10sbz0wO3Q7KXtpZihudWxsIT09KG49L15bXlx4MjVdKy8uZXhlYyh0KSkpci5wdXNoKG5bMF0pO2Vsc2UgaWYobnVsbCE9PShuPS9eXHgyNXsyfS8uZXhlYyh0KSkpci5wdXNoKCIlIik7ZWxzZXtpZihudWxsPT09KG49L15ceDI1KD86KFsxLTldXGQqKVwkfFwoKFteXCldKylcKSk/KFwrKT8oMHwnW14kXSk/KC0pPyhcZCspPyg/OlwuKFxkKykpPyhbYi1mb3N1eFhdKS8uZXhlYyh0KSkpdGhyb3ciW3NwcmludGZdIGh1aD8iO2lmKG5bMl0pe298PTE7dmFyIGk9W10sYT1uWzJdLHM9W107aWYobnVsbD09PShzPS9eKFthLXpfXVthLXpfXGRdKikvaS5leGVjKGEpKSl0aHJvdyJbc3ByaW50Zl0gaHVoPyI7Zm9yKGkucHVzaChzWzFdKTsiIiE9PShhPWEuc3Vic3RyaW5nKHNbMF0ubGVuZ3RoKSk7KWlmKG51bGwhPT0ocz0vXlwuKFthLXpfXVthLXpfXGRdKikvaS5leGVjKGEpKSlpLnB1c2goc1sxXSk7ZWxzZXtpZihudWxsPT09KHM9L15cWyhcZCspXF0vLmV4ZWMoYSkpKXRocm93IltzcHJpbnRmXSBodWg/IjtpLnB1c2goc1sxXSl9blsyXT1pfWVsc2Ugb3w9MjtpZigzPT09byl0aHJvdyJbc3ByaW50Zl0gbWl4aW5nIHBvc2l0aW9uYWwgYW5kIG5hbWVkIHBsYWNlaG9sZGVycyBpcyBub3QgKHlldCkgc3VwcG9ydGVkIjtyLnB1c2gobil9dD10LnN1YnN0cmluZyhuWzBdLmxlbmd0aCl9cmV0dXJuIHJ9LGUuc3ByaW50Zj10LGUudnNwcmludGY9ZnVuY3Rpb24oZSxuLHIpe3JldHVybihyPW4uc2xpY2UoMCkpLnNwbGljZSgwLDAsZSksdC5hcHBseShudWxsLHIpfX0oKX0sNzY4OigpPT57ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC5pdGVyYXRvcj9mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIGV9OmZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZlLmNvbnN0cnVjdG9yPT09U3ltYm9sJiZlIT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgZX0sZSh0KX1mdW5jdGlvbiB0KHQsbil7Zm9yKHZhciByPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBvPW5bcl07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsInZhbHVlImluIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwoaT1vLmtleSxhPXZvaWQgMCxhPWZ1bmN0aW9uKHQsbil7aWYoIm9iamVjdCIhPT1lKHQpfHxudWxsPT09dClyZXR1cm4gdDt2YXIgcj10W1N5bWJvbC50b1ByaW1pdGl2ZV07aWYodm9pZCAwIT09cil7dmFyIG89ci5jYWxsKHQsbnx8ImRlZmF1bHQiKTtpZigib2JqZWN0IiE9PWUobykpcmV0dXJuIG87dGhyb3cgbmV3IFR5cGVFcnJvcigiQEB0b1ByaW1pdGl2ZSBtdXN0IHJldHVybiBhIHByaW1pdGl2ZSB2YWx1ZS4iKX1yZXR1cm4oInN0cmluZyI9PT1uP1N0cmluZzpOdW1iZXIpKHQpfShpLCJzdHJpbmciKSwic3ltYm9sIj09PWUoYSk/YTpTdHJpbmcoYSkpLG8pfXZhciBpLGF9ZnVuY3Rpb24gbihlKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gcihlKX0oZSl8fGZ1bmN0aW9uKGUpe2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZudWxsIT1lW1N5bWJvbC5pdGVyYXRvcl18fG51bGwhPWVbIkBAaXRlcmF0b3IiXSlyZXR1cm4gQXJyYXkuZnJvbShlKX0oZSl8fGZ1bmN0aW9uKGUsdCl7aWYoZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiByKGUsdCk7dmFyIG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpLnNsaWNlKDgsLTEpO3JldHVybiJPYmplY3QiPT09biYmZS5jb25zdHJ1Y3RvciYmKG49ZS5jb25zdHJ1Y3Rvci5uYW1lKSwiTWFwIj09PW58fCJTZXQiPT09bj9BcnJheS5mcm9tKGUpOiJBcmd1bWVudHMiPT09bnx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3Qobik/cihlLHQpOnZvaWQgMH19KGUpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgYXR0ZW1wdCB0byBzcHJlYWQgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLlxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLiIpfSgpfWZ1bmN0aW9uIHIoZSx0KXsobnVsbD09dHx8dD5lLmxlbmd0aCkmJih0PWUubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheSh0KTtuPHQ7bisrKXJbbl09ZVtuXTtyZXR1cm4gcn0hZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHI9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9cixlLmxpbHk9cjt2YXIgbz1mdW5jdGlvbigpe307by5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aHJvdyBuZXcgci5Ob3RJbXBsZW1lbnRlZEVycm9yfSxvLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IHIuTm90SW1wbGVtZW50ZWRFcnJvcn07dmFyIGk9ZnVuY3Rpb24oKXtvLmNhbGwodGhpcyl9OyhpLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9aSxpLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7fSxpLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe307dmFyIGE9ZnVuY3Rpb24oZSx0KXtvLmNhbGwodGhpcyksdGhpcy53aW5kb3c9ZSx0aGlzLmRvbWFpbj10fHwiKiJ9OyhhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YSxhLnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3RoaXMud2luZG93LnBvc3RNZXNzYWdlKGUsdGhpcy5kb21haW4pfSxhLnByb3RvdHlwZS5vbk1lc3NhZ2U9ZnVuY3Rpb24oZSl7dGhpcy53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZSl9O3ZhciBzPWZ1bmN0aW9uKGUsdCxuKXtvLmNhbGwodGhpcyksdGhpcy5pbnB1dD1lLHRoaXMub3V0cHV0PXQsdGhpcy5kb21haW49bnx8IioifTsocy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXMscy5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLm91dHB1dC5wb3N0TWVzc2FnZShlLHRoaXMuZG9tYWluKX0scy5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5pbnB1dC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoZnVuY3Rpb24obil7bi5zb3VyY2U9PT10Lm91dHB1dCYmZShuKX0pKX07dmFyIGM9ZnVuY3Rpb24oZSl7by5jYWxsKHRoaXMpLHRoaXMucG9ydD1lLHRoaXMuaWQ9ci5yYW5kb21JZCgpfTsoYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShvLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPWMsYy5wcm90b3R5cGUuc2VuZD1mdW5jdGlvbihlKXt0aGlzLnBvcnQucG9zdE1lc3NhZ2UoZSl9LGMucHJvdG90eXBlLm9uTWVzc2FnZT1mdW5jdGlvbihlKXt0aGlzLnBvcnQuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsZSl9LGMucHJvdG90eXBlLmdldElkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWR9O3ZhciB1PWZ1bmN0aW9uKGUpe28uY2FsbCh0aGlzKSx0aGlzLnN0cmVhbU1hcD1lP3IuaW5kZXgoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0SWQoKX0pKTp7fSx0aGlzLm1lc3NhZ2VMaXN0ZW5lcnM9W119Oyh1LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG8ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9dSx1LnByb3RvdHlwZS5zZW5kPWZ1bmN0aW9uKGUpe3RoaXMuZ2V0U3RyZWFtcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RyeXt0LnNlbmQoZSl9Y2F0Y2goZSl7fX0pKX0sdS5wcm90b3R5cGUub25NZXNzYWdlPWZ1bmN0aW9uKGUpe3RoaXMubWVzc2FnZUxpc3RlbmVycy5wdXNoKGUpLHRoaXMuZ2V0U3RyZWFtcygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3Qub25NZXNzYWdlKGUpfSkpfSx1LnByb3RvdHlwZS5hZGRTdHJlYW09ZnVuY3Rpb24oZSl7dGhpcy5zdHJlYW1NYXBbZS5nZXRJZCgpXT1lLHRoaXMubWVzc2FnZUxpc3RlbmVycy5mb3JFYWNoKChmdW5jdGlvbih0KXtlLm9uTWVzc2FnZSh0KX0pKX0sdS5wcm90b3R5cGUucmVtb3ZlU3RyZWFtPWZ1bmN0aW9uKGUpe2RlbGV0ZSB0aGlzLnN0cmVhbU1hcFtlLmdldElkKCldfSx1LnByb3RvdHlwZS5nZXRTdHJlYW1zPWZ1bmN0aW9uKGUpe3JldHVybiByLnZhbHVlcyh0aGlzLnN0cmVhbU1hcCl9LHUucHJvdG90eXBlLmdldFN0cmVhbUZvclBvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHIuZmluZCh0aGlzLmdldFN0cmVhbXMoKSwoZnVuY3Rpb24odCl7cmV0dXJuIHQucG9ydD09PWV9KSl9O3ZhciBsPWZ1bmN0aW9uKGUsdCxvKXt0aGlzLm5hbWU9ZSx0aGlzLnVwc3RyZWFtPXR8fG5ldyBpLHRoaXMuZG93bnN0cmVhbT1vfHxuZXcgaSx0aGlzLmRvd25zdHJlYW1CdXM9bmV3IHIuRXZlbnRCdXMsdGhpcy51cHN0cmVhbUJ1cz1uZXcgci5FdmVudEJ1cyx0aGlzLnVwc3RyZWFtLm9uTWVzc2FnZShyLmhpdGNoKHRoaXMsdGhpcy5fZGlzcGF0Y2hFdmVudCx0aGlzLnVwc3RyZWFtQnVzKSksdGhpcy5kb3duc3RyZWFtLm9uTWVzc2FnZShyLmhpdGNoKHRoaXMsdGhpcy5fZGlzcGF0Y2hFdmVudCx0aGlzLmRvd25zdHJlYW1CdXMpKSx0aGlzLmFjdGl2ZT0hMCx0aGlzLmFsbG93ZWRFdmVudHM9W10uY29uY2F0KG4oT2JqZWN0LmVudHJpZXMoci5HbG9iYWxSZXNpbGllbmN5RXZlbnRzKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBlWzFdfSkpKSxbci5FdmVudFR5cGUuQ09ORklHVVJFLHIuRXZlbnRUeXBlLlNZTkNIUk9OSVpFLHIuRXZlbnRUeXBlLkFDS05PV0xFREdFLHIuRXZlbnRUeXBlLkxPRyxyLkV2ZW50VHlwZS5TRVJWRVJfQk9VTkRfSU5URVJOQUxfTE9HLHIuRXZlbnRUeXBlLkRPV05MT0FEX0xPR19GUk9NX0NDUF0pfTtsLnByb3RvdHlwZS5vblVwc3RyZWFtPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSxyLmFzc2VydE5vdE51bGwodCwiZiIpLHIuYXNzZXJ0VHJ1ZShyLmlzRnVuY3Rpb24odCksImYgbXVzdCBiZSBhIGZ1bmN0aW9uIiksdGhpcy51cHN0cmVhbUJ1cy5zdWJzY3JpYmUoZSx0KX0sbC5wcm90b3R5cGUub25BbGxVcHN0cmVhbT1mdW5jdGlvbihlKXtyZXR1cm4gci5hc3NlcnROb3ROdWxsKGUsImYiKSxyLmFzc2VydFRydWUoci5pc0Z1bmN0aW9uKGUpLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMudXBzdHJlYW1CdXMuc3Vic2NyaWJlQWxsKGUpfSxsLnByb3RvdHlwZS5vbkRvd25zdHJlYW09ZnVuY3Rpb24oZSx0KXtyZXR1cm4gci5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHIuYXNzZXJ0Tm90TnVsbCh0LCJmIiksci5hc3NlcnRUcnVlKHIuaXNGdW5jdGlvbih0KSwiZiBtdXN0IGJlIGEgZnVuY3Rpb24iKSx0aGlzLmRvd25zdHJlYW1CdXMuc3Vic2NyaWJlKGUsdCl9LGwucHJvdG90eXBlLm9uQWxsRG93bnN0cmVhbT1mdW5jdGlvbihlKXtyZXR1cm4gci5hc3NlcnROb3ROdWxsKGUsImYiKSxyLmFzc2VydFRydWUoci5pc0Z1bmN0aW9uKGUpLCJmIG11c3QgYmUgYSBmdW5jdGlvbiIpLHRoaXMuZG93bnN0cmVhbUJ1cy5zdWJzY3JpYmVBbGwoZSl9LGwucHJvdG90eXBlLnNlbmRVcHN0cmVhbT1mdW5jdGlvbihlLHQpe3IuYXNzZXJ0Tm90TnVsbChlLCJldmVudE5hbWUiKSx0aGlzLnVwc3RyZWFtLnNlbmQoe2V2ZW50OmUsZGF0YTp0fSl9LGwucHJvdG90eXBlLnNlbmREb3duc3RyZWFtPWZ1bmN0aW9uKGUsdCl7ci5hc3NlcnROb3ROdWxsKGUsImV2ZW50TmFtZSIpLHRoaXMuZG93bnN0cmVhbS5zZW5kKHtldmVudDplLGRhdGE6dH0pfSxsLnByb3RvdHlwZS5fZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihlLHQpe3ZhciBuPXQuZGF0YTtuLmV2ZW50JiZlLnRyaWdnZXIobi5ldmVudCxuLmRhdGEpfSxsLnByb3RvdHlwZS5wYXNzVXBzdHJlYW09ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiBmdW5jdGlvbih0LG4pe2UuYWN0aXZlfHxlLmFsbG93ZWRFdmVudHMuaW5jbHVkZXMobik/ZS51cHN0cmVhbS5zZW5kKHtldmVudDpuLGRhdGE6dH0pOnIuZ2V0TG9nKCkuZGVidWcoIltHUl0gQ29uZHVpdCAiLmNvbmNhdChlLm5hbWUsIiBoYXMgYmxvY2tlZCBldmVudCAiKS5jb25jYXQobiwiIGZyb20gZ29pbmcgdXBzdHJlYW0uIikpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSxsLnByb3RvdHlwZS5wYXNzRG93bnN0cmVhbT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKHQsbil7ZS5hY3RpdmV8fGUuYWxsb3dlZEV2ZW50cy5pbmNsdWRlcyhuKT9lLmRvd25zdHJlYW0uc2VuZCh7ZXZlbnQ6bixkYXRhOnR9KTpyLmdldExvZygpLmRlYnVnKCJbR1JdIENvbmR1aXQgIi5jb25jYXQoZS5uYW1lLCIgaGFzIGJsb2NrZWQgZXZlbnQgIikuY29uY2F0KG4sIiBmcm9tIGdvaW5nIGRvd25zdHJlYW0uIikpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSxsLnByb3RvdHlwZS5zaHV0ZG93bj1mdW5jdGlvbigpe3RoaXMudXBzdHJlYW1CdXMudW5zdWJzY3JpYmVBbGwoKSx0aGlzLmRvd25zdHJlYW1CdXMudW5zdWJzY3JpYmVBbGwoKX0sbC5wcm90b3R5cGUuc2V0QWN0aXZlPWZ1bmN0aW9uKCl7ci5nZXRMb2coKS5pbmZvKCJbR1JdIFNldHRpbmcgQ0NQIGNvbmR1aXQgYXMgYWN0aXZlIiksdGhpcy5hY3RpdmU9ITB9LGwucHJvdG90eXBlLnNldEluYWN0aXZlPWZ1bmN0aW9uKCl7ci5nZXRMb2coKS5pbmZvKCJbR1JdIFNldHRpbmcgQ0NQIGNvbmR1aXQgYXMgaW5hY3RpdmUiKSx0aGlzLmFjdGl2ZT0hMX07dmFyIHA9ZnVuY3Rpb24oZSx0LG4scil7bC5jYWxsKHRoaXMsZSxuZXcgcyh0LG4uY29udGVudFdpbmRvdyxyfHwiKiIpLG51bGwpfTsocC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShsLnByb3RvdHlwZSkpLmNvbnN0cnVjdG9yPXA7dmFyIGQ9ZnVuY3Rpb24oKXtyZXR1cm4gZT1mdW5jdGlvbiBlKHQsbixyKXshZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxlKTt2YXIgbz1uZXcgVVJMKHIpLm9yaWdpbjt0aGlzLmFjdGl2ZVJlZ2lvblVybD1vLHRoaXMuY29uZHVpdHM9bi5tYXAoKGZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBwKGUuc3JjLHQsZSk7bi5pZnJhbWU9ZTt2YXIgcj1uZXcgVVJMKGUuc3JjKS5vcmlnaW47cmV0dXJuIG4ubmFtZT1yLG59KSksdGhpcy5zZXRBY3RpdmVDb25kdWl0KG8pfSwobj1be2tleToib25VcHN0cmVhbSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNvbmR1aXRzLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIG4ub25VcHN0cmVhbShlLHQpfSkpO3JldHVybnt1bnN1YnNjcmliZTpmdW5jdGlvbigpe3JldHVybiBuLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiBlLnVuc3Vic2NyaWJlKCl9KSl9fX19LHtrZXk6Im9uQWxsVXBzdHJlYW0iLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY29uZHVpdHMubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5vbkFsbFVwc3RyZWFtKGUpfSkpO3JldHVybnt1bnN1YnNjcmliZTpmdW5jdGlvbigpe3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiBlLnVuc3Vic2NyaWJlKCl9KSl9fX19LHtrZXk6Im9uRG93bnN0cmVhbSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLmNvbmR1aXRzLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIG4ub25Eb3duc3RyZWFtKGUsdCl9KSk7cmV0dXJue3Vuc3Vic2NyaWJlOmZ1bmN0aW9uKCl7cmV0dXJuIG4uZm9yRWFjaCgoZnVuY3Rpb24oZSl7cmV0dXJuIGUudW5zdWJzY3JpYmUoKX0pKX19fX0se2tleToib25BbGxEb3duc3RyZWFtIix2YWx1ZTpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmNvbmR1aXRzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQub25BbGxEb3duc3RyZWFtKGUpfSkpO3JldHVybnt1bnN1YnNjcmliZTpmdW5jdGlvbigpe3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiBlLnVuc3Vic2NyaWJlKCl9KSl9fX19LHtrZXk6InNlbmRVcHN0cmVhbSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt0aGlzLmNvbmR1aXRzLmZvckVhY2goKGZ1bmN0aW9uKG4pe24uc2VuZFVwc3RyZWFtKGUsdCl9KSl9fSx7a2V5OiJzZW5kRG93bnN0cmVhbSIsdmFsdWU6ZnVuY3Rpb24oZSx0KXt0aGlzLmNvbmR1aXRzLmZvckVhY2goKGZ1bmN0aW9uKG4pe24uc2VuZERvd25zdHJlYW0oZSx0KX0pKX19LHtrZXk6InJlbGF5VXBzdHJlYW0iLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5jb25kdWl0cy5mb3JFYWNoKChmdW5jdGlvbihuKXtuLm9uVXBzdHJlYW0oZSwoZnVuY3Rpb24obyl7dmFyIGk9dC5nZXRPdGhlckNvbmR1aXQobik7aS5zZW5kVXBzdHJlYW0oZSxvKSxyLmdldExvZygpLmluZm8oIlJlbGF5ZWQgZXZlbnQgIi5jb25jYXQoZSwiIGZyb20gIikuY29uY2F0KG4ubmFtZSwiIHRvICIpLmNvbmNhdChpLm5hbWUsIiBzaGFyZWQgd29ya2VyIikpLndpdGhPYmplY3Qoe2RhdGE6b30pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9KSl9KSl9fSx7a2V5OiJnZXRBbGxDb25kdWl0cyIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25kdWl0c319LHtrZXk6InNldEFjdGl2ZUNvbmR1aXQiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy5jb25kdWl0cy5maW5kKChmdW5jdGlvbih0KXtyZXR1cm4gdC5uYW1lPT09ZX0pKT8odGhpcy5jb25kdWl0cy5mb3JFYWNoKChmdW5jdGlvbihuKXtuLm5hbWU9PT1lJiYodC5hY3RpdmVSZWdpb25Vcmw9ZSx0Lm5hbWU9bi5uYW1lLHQudXBzdHJlYW09bi51cHN0cmVhbSx0LmRvd25zdHJlYW09bi5kb3duc3RyZWFtLHQudXBzdHJlYW1CdXM9bi51cHN0cmVhbUJ1cyx0LmRvd25zdHJlYW1CdXM9bi5kb3duc3RyZWFtQnVzKX0pKSxyLmdldExvZygpLmluZm8oIltHUl0gU3dpdGNoZWQgdG8gYWN0aXZlIGNvbmR1aXQgIi5jb25jYXQodGhpcy5nZXRBY3RpdmVDb25kdWl0KCkubmFtZSkpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpOnIuZ2V0TG9nKCkuZXJyb3IoIltHUl0gTm8gY29uZHVpdCBmb3VuZCB3aXRoIHRoZSBnaXZlbiBjY3BVcmw6ICIuY29uY2F0KGUpKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0se2tleToiZ2V0QWN0aXZlQ29uZHVpdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiB0aGlzLmNvbmR1aXRzLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWU9PT1lLmFjdGl2ZVJlZ2lvblVybH0pKX19LHtrZXk6ImdldEluYWN0aXZlQ29uZHVpdCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3JldHVybiB0aGlzLmNvbmR1aXRzLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWUhPT1lLmFjdGl2ZVJlZ2lvblVybH0pKX19LHtrZXk6ImdldE90aGVyQ29uZHVpdCIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29uZHVpdHMuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIGUubmFtZSE9PXQubmFtZX0pKX19LHtrZXk6ImdldENvbmR1aXRCeVJlZ2lvbiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY29uZHVpdHMuZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVnaW9uPT09ZX0pKX19LHtrZXk6ImdldENvbmR1aXRCeU5hbWUiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmNvbmR1aXRzLmZpbmQoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm5hbWU9PT1lfSkpfX1dKSYmdChlLnByb3RvdHlwZSxuKSxvJiZ0KGUsbyksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksZTt2YXIgZSxuLG99KCk7ci5TdHJlYW09byxyLk51bGxTdHJlYW09aSxyLldpbmRvd1N0cmVhbT1hLHIuV2luZG93SU9TdHJlYW09cyxyLlBvcnRTdHJlYW09YyxyLlN0cmVhbU11bHRpcGxleGVyPXUsci5Db25kdWl0PWwsci5JRnJhbWVDb25kdWl0PXAsci5HUlByb3h5SWZyYW1lQ29uZHVpdD1kfSgpfSw3Mzg6KCk9PnshZnVuY3Rpb24oKXt2YXIgZT10aGlzfHxnbG9iYWxUaGlzLHQ9ZS5jb25uZWN0fHx7fTtlLmNvbm5lY3Q9dCxlLmxpbHk9dDt2YXIgbj1mdW5jdGlvbihlLG4pe3QuYXNzZXJ0Tm90TnVsbChlLCJmcm9tU3RhdGUiKSx0LmFzc2VydE5vdE51bGwobiwidG9TdGF0ZSIpLHRoaXMuZnJvbVN0YXRlPWUsdGhpcy50b1N0YXRlPW59O24ucHJvdG90eXBlLmdldEFzc29jaWF0aW9ucz1mdW5jdGlvbihlKXt0aHJvdyB0Lk5vdEltcGxlbWVudGVkRXJyb3IoKX0sbi5wcm90b3R5cGUuZ2V0RnJvbVN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZnJvbVN0YXRlfSxuLnByb3RvdHlwZS5nZXRUb1N0YXRlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudG9TdGF0ZX07dmFyIHI9ZnVuY3Rpb24oZSxyLG8pe3QuYXNzZXJ0Tm90TnVsbChlLCJmcm9tU3RhdGUiKSx0LmFzc2VydE5vdE51bGwociwidG9TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChvLCJhc3NvY2lhdGlvbnMiKSxuLmNhbGwodGhpcyxlLHIpLHRoaXMuYXNzb2NpYXRpb25zPW99OyhyLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9cixyLnByb3RvdHlwZS5nZXRBc3NvY2lhdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYXNzb2NpYXRpb25zfTt2YXIgbz1mdW5jdGlvbihlLHIsbyl7dC5hc3NlcnROb3ROdWxsKGUsImZyb21TdGF0ZSIpLHQuYXNzZXJ0Tm90TnVsbChyLCJ0b1N0YXRlIiksdC5hc3NlcnROb3ROdWxsKG8sImNsb3N1cmUiKSx0LmFzc2VydFRydWUodC5pc0Z1bmN0aW9uKG8pLCJjbG9zdXJlIG11c3QgYmUgYSBmdW5jdGlvbiIpLG4uY2FsbCh0aGlzLGUsciksdGhpcy5jbG9zdXJlPW99OyhvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9byxvLnByb3RvdHlwZS5nZXRBc3NvY2lhdGlvbnM9ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuY2xvc3VyZShlLHRoaXMuZ2V0RnJvbVN0YXRlKCksdGhpcy5nZXRUb1N0YXRlKCkpfTt2YXIgaT1mdW5jdGlvbigpe3RoaXMuZnJvbU1hcD17fX07aS5BTlk9Ijw8YW55Pj4iLGkucHJvdG90eXBlLmFzc29jPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzO2lmKCFlKXRocm93IG5ldyBFcnJvcigiZnJvbVN0YXRlT2JqIGlzIG5vdCBkZWZpbmVkLiIpO2lmKCF0KXRocm93IG5ldyBFcnJvcigidG9TdGF0ZU9iaiBpcyBub3QgZGVmaW5lZC4iKTtpZighbil0aHJvdyBuZXcgRXJyb3IoImFzc29jT2JqIGlzIG5vdCBkZWZpbmVkLiIpO3JldHVybiBlIGluc3RhbmNlb2YgQXJyYXk/ZS5mb3JFYWNoKChmdW5jdGlvbihlKXtpLmFzc29jKGUsdCxuKX0pKTp0IGluc3RhbmNlb2YgQXJyYXk/dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpLmFzc29jKGUsdCxuKX0pKToiZnVuY3Rpb24iPT10eXBlb2Ygbj90aGlzLl9hZGRBc3NvY2lhdGlvbihuZXcgbyhlLHQsbikpOm4gaW5zdGFuY2VvZiBBcnJheT90aGlzLl9hZGRBc3NvY2lhdGlvbihuZXcgcihlLHQsbikpOnRoaXMuX2FkZEFzc29jaWF0aW9uKG5ldyByKGUsdCxbbl0pKSx0aGlzfSxpLnByb3RvdHlwZS5nZXRBc3NvY2lhdGlvbnM9ZnVuY3Rpb24oZSxuLHIpe3QuYXNzZXJ0Tm90TnVsbChuLCJmcm9tU3RhdGUiKSx0LmFzc2VydE5vdE51bGwociwidG9TdGF0ZSIpO3ZhciBvPVtdLGE9dGhpcy5mcm9tTWFwW2kuQU5ZXXx8e30scz10aGlzLmZyb21NYXBbbl18fHt9O3JldHVybiBvPShvPW8uY29uY2F0KHRoaXMuX2dldEFzc29jaWF0aW9uc0Zyb21NYXAoYSxlLG4scikpKS5jb25jYXQodGhpcy5fZ2V0QXNzb2NpYXRpb25zRnJvbU1hcChzLGUsbixyKSl9LGkucHJvdG90eXBlLl9hZGRBc3NvY2lhdGlvbj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmZyb21NYXBbZS5nZXRGcm9tU3RhdGUoKV07dHx8KHQ9dGhpcy5mcm9tTWFwW2UuZ2V0RnJvbVN0YXRlKCldPXt9KTt2YXIgbj10W2UuZ2V0VG9TdGF0ZSgpXTtufHwobj10W2UuZ2V0VG9TdGF0ZSgpXT1bXSksbi5wdXNoKGUpfSxpLnByb3RvdHlwZS5fZ2V0QXNzb2NpYXRpb25zRnJvbU1hcD1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4oZVtpLkFOWV18fFtdKS5jb25jYXQoZVtyXXx8W10pLnJlZHVjZSgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gZS5jb25jYXQobi5nZXRBc3NvY2lhdGlvbnModCkpfSksW10pfSx0LkV2ZW50R3JhcGg9aX0oKX0sNDIwOigpPT57ZnVuY3Rpb24gZSgpeyJ1c2Ugc3RyaWN0IjtlPWZ1bmN0aW9uKCl7cmV0dXJuIHR9O3ZhciB0PXt9LG49T2JqZWN0LnByb3RvdHlwZSxyPW4uaGFzT3duUHJvcGVydHksbz1PYmplY3QuZGVmaW5lUHJvcGVydHl8fGZ1bmN0aW9uKGUsdCxuKXtlW3RdPW4udmFsdWV9LGE9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbD9TeW1ib2w6e30scz1hLml0ZXJhdG9yfHwiQEBpdGVyYXRvciIsYz1hLmFzeW5jSXRlcmF0b3J8fCJAQGFzeW5jSXRlcmF0b3IiLHU9YS50b1N0cmluZ1RhZ3x8IkBAdG9TdHJpbmdUYWciO2Z1bmN0aW9uIGwoZSx0LG4pe3JldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSksZVt0XX10cnl7bCh7fSwiIil9Y2F0Y2goZSl7bD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGVbdF09bn19ZnVuY3Rpb24gcChlLHQsbixyKXt2YXIgaT10JiZ0LnByb3RvdHlwZSBpbnN0YW5jZW9mIGg/dDpoLGE9T2JqZWN0LmNyZWF0ZShpLnByb3RvdHlwZSkscz1uZXcgXyhyfHxbXSk7cmV0dXJuIG8oYSwiX2ludm9rZSIse3ZhbHVlOlQoZSxuLHMpfSksYX1mdW5jdGlvbiBkKGUsdCxuKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOmUuY2FsbCh0LG4pfX1jYXRjaChlKXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzplfX19dC53cmFwPXA7dmFyIGY9e307ZnVuY3Rpb24gaCgpe31mdW5jdGlvbiBnKCl7fWZ1bmN0aW9uIG0oKXt9dmFyIHY9e307bCh2LHMsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KSk7dmFyIHk9T2JqZWN0LmdldFByb3RvdHlwZU9mLGI9eSYmeSh5KFIoW10pKSk7YiYmYiE9PW4mJnIuY2FsbChiLHMpJiYodj1iKTt2YXIgRT1tLnByb3RvdHlwZT1oLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHYpO2Z1bmN0aW9uIFMoZSl7WyJuZXh0IiwidGhyb3ciLCJyZXR1cm4iXS5mb3JFYWNoKChmdW5jdGlvbih0KXtsKGUsdCwoZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2ludm9rZSh0LGUpfSkpfSkpfWZ1bmN0aW9uIEMoZSx0KXtmdW5jdGlvbiBuKG8sYSxzLGMpe3ZhciB1PWQoZVtvXSxlLGEpO2lmKCJ0aHJvdyIhPT11LnR5cGUpe3ZhciBsPXUuYXJnLHA9bC52YWx1ZTtyZXR1cm4gcCYmIm9iamVjdCI9PWkocCkmJnIuY2FsbChwLCJfX2F3YWl0Iik/dC5yZXNvbHZlKHAuX19hd2FpdCkudGhlbigoZnVuY3Rpb24oZSl7bigibmV4dCIsZSxzLGMpfSksKGZ1bmN0aW9uKGUpe24oInRocm93IixlLHMsYyl9KSk6dC5yZXNvbHZlKHApLnRoZW4oKGZ1bmN0aW9uKGUpe2wudmFsdWU9ZSxzKGwpfSksKGZ1bmN0aW9uKGUpe3JldHVybiBuKCJ0aHJvdyIsZSxzLGMpfSkpfWModS5hcmcpfXZhciBhO28odGhpcywiX2ludm9rZSIse3ZhbHVlOmZ1bmN0aW9uKGUscil7ZnVuY3Rpb24gbygpe3JldHVybiBuZXcgdCgoZnVuY3Rpb24odCxvKXtuKGUscix0LG8pfSkpfXJldHVybiBhPWE/YS50aGVuKG8sbyk6bygpfX0pfWZ1bmN0aW9uIFQoZSx0LG4pe3ZhciByPSJzdXNwZW5kZWRTdGFydCI7cmV0dXJuIGZ1bmN0aW9uKG8saSl7aWYoImV4ZWN1dGluZyI9PT1yKXRocm93IG5ldyBFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZyIpO2lmKCJjb21wbGV0ZWQiPT09cil7aWYoInRocm93Ij09PW8pdGhyb3cgaTtyZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fWZvcihuLm1ldGhvZD1vLG4uYXJnPWk7Oyl7dmFyIGE9bi5kZWxlZ2F0ZTtpZihhKXt2YXIgcz1JKGEsbik7aWYocyl7aWYocz09PWYpY29udGludWU7cmV0dXJuIHN9fWlmKCJuZXh0Ij09PW4ubWV0aG9kKW4uc2VudD1uLl9zZW50PW4uYXJnO2Vsc2UgaWYoInRocm93Ij09PW4ubWV0aG9kKXtpZigic3VzcGVuZGVkU3RhcnQiPT09cil0aHJvdyByPSJjb21wbGV0ZWQiLG4uYXJnO24uZGlzcGF0Y2hFeGNlcHRpb24obi5hcmcpfWVsc2UicmV0dXJuIj09PW4ubWV0aG9kJiZuLmFicnVwdCgicmV0dXJuIixuLmFyZyk7cj0iZXhlY3V0aW5nIjt2YXIgYz1kKGUsdCxuKTtpZigibm9ybWFsIj09PWMudHlwZSl7aWYocj1uLmRvbmU/ImNvbXBsZXRlZCI6InN1c3BlbmRlZFlpZWxkIixjLmFyZz09PWYpY29udGludWU7cmV0dXJue3ZhbHVlOmMuYXJnLGRvbmU6bi5kb25lfX0idGhyb3ciPT09Yy50eXBlJiYocj0iY29tcGxldGVkIixuLm1ldGhvZD0idGhyb3ciLG4uYXJnPWMuYXJnKX19fWZ1bmN0aW9uIEkoZSx0KXt2YXIgbj10Lm1ldGhvZCxyPWUuaXRlcmF0b3Jbbl07aWYodm9pZCAwPT09cilyZXR1cm4gdC5kZWxlZ2F0ZT1udWxsLCJ0aHJvdyI9PT1uJiZlLml0ZXJhdG9yLnJldHVybiYmKHQubWV0aG9kPSJyZXR1cm4iLHQuYXJnPXZvaWQgMCxJKGUsdCksInRocm93Ij09PXQubWV0aG9kKXx8InJldHVybiIhPT1uJiYodC5tZXRob2Q9InRocm93Iix0LmFyZz1uZXcgVHlwZUVycm9yKCJUaGUgaXRlcmF0b3IgZG9lcyBub3QgcHJvdmlkZSBhICciK24rIicgbWV0aG9kIikpLGY7dmFyIG89ZChyLGUuaXRlcmF0b3IsdC5hcmcpO2lmKCJ0aHJvdyI9PT1vLnR5cGUpcmV0dXJuIHQubWV0aG9kPSJ0aHJvdyIsdC5hcmc9by5hcmcsdC5kZWxlZ2F0ZT1udWxsLGY7dmFyIGk9by5hcmc7cmV0dXJuIGk/aS5kb25lPyh0W2UucmVzdWx0TmFtZV09aS52YWx1ZSx0Lm5leHQ9ZS5uZXh0TG9jLCJyZXR1cm4iIT09dC5tZXRob2QmJih0Lm1ldGhvZD0ibmV4dCIsdC5hcmc9dm9pZCAwKSx0LmRlbGVnYXRlPW51bGwsZik6aToodC5tZXRob2Q9InRocm93Iix0LmFyZz1uZXcgVHlwZUVycm9yKCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdCIpLHQuZGVsZWdhdGU9bnVsbCxmKX1mdW5jdGlvbiB3KGUpe3ZhciB0PXt0cnlMb2M6ZVswXX07MSBpbiBlJiYodC5jYXRjaExvYz1lWzFdKSwyIGluIGUmJih0LmZpbmFsbHlMb2M9ZVsyXSx0LmFmdGVyTG9jPWVbM10pLHRoaXMudHJ5RW50cmllcy5wdXNoKHQpfWZ1bmN0aW9uIEEoZSl7dmFyIHQ9ZS5jb21wbGV0aW9ufHx7fTt0LnR5cGU9Im5vcm1hbCIsZGVsZXRlIHQuYXJnLGUuY29tcGxldGlvbj10fWZ1bmN0aW9uIF8oZSl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dLGUuZm9yRWFjaCh3LHRoaXMpLHRoaXMucmVzZXQoITApfWZ1bmN0aW9uIFIoZSl7aWYoZSl7dmFyIHQ9ZVtzXTtpZih0KXJldHVybiB0LmNhbGwoZSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUubmV4dClyZXR1cm4gZTtpZighaXNOYU4oZS5sZW5ndGgpKXt2YXIgbj0tMSxvPWZ1bmN0aW9uIHQoKXtmb3IoOysrbjxlLmxlbmd0aDspaWYoci5jYWxsKGUsbikpcmV0dXJuIHQudmFsdWU9ZVtuXSx0LmRvbmU9ITEsdDtyZXR1cm4gdC52YWx1ZT12b2lkIDAsdC5kb25lPSEwLHR9O3JldHVybiBvLm5leHQ9b319cmV0dXJue25leHQ6TH19ZnVuY3Rpb24gTCgpe3JldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19cmV0dXJuIGcucHJvdG90eXBlPW0sbyhFLCJjb25zdHJ1Y3RvciIse3ZhbHVlOm0sY29uZmlndXJhYmxlOiEwfSksbyhtLCJjb25zdHJ1Y3RvciIse3ZhbHVlOmcsY29uZmlndXJhYmxlOiEwfSksZy5kaXNwbGF5TmFtZT1sKG0sdSwiR2VuZXJhdG9yRnVuY3Rpb24iKSx0LmlzR2VuZXJhdG9yRnVuY3Rpb249ZnVuY3Rpb24oZSl7dmFyIHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUuY29uc3RydWN0b3I7cmV0dXJuISF0JiYodD09PWd8fCJHZW5lcmF0b3JGdW5jdGlvbiI9PT0odC5kaXNwbGF5TmFtZXx8dC5uYW1lKSl9LHQubWFyaz1mdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5zZXRQcm90b3R5cGVPZihlLG0pOihlLl9fcHJvdG9fXz1tLGwoZSx1LCJHZW5lcmF0b3JGdW5jdGlvbiIpKSxlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEUpLGV9LHQuYXdyYXA9ZnVuY3Rpb24oZSl7cmV0dXJue19fYXdhaXQ6ZX19LFMoQy5wcm90b3R5cGUpLGwoQy5wcm90b3R5cGUsYywoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKSx0LkFzeW5jSXRlcmF0b3I9Qyx0LmFzeW5jPWZ1bmN0aW9uKGUsbixyLG8saSl7dm9pZCAwPT09aSYmKGk9UHJvbWlzZSk7dmFyIGE9bmV3IEMocChlLG4scixvKSxpKTtyZXR1cm4gdC5pc0dlbmVyYXRvckZ1bmN0aW9uKG4pP2E6YS5uZXh0KCkudGhlbigoZnVuY3Rpb24oZSl7cmV0dXJuIGUuZG9uZT9lLnZhbHVlOmEubmV4dCgpfSkpfSxTKEUpLGwoRSx1LCJHZW5lcmF0b3IiKSxsKEUscywoZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pKSxsKEUsInRvU3RyaW5nIiwoZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBHZW5lcmF0b3JdIn0pKSx0LmtleXM9ZnVuY3Rpb24oZSl7dmFyIHQ9T2JqZWN0KGUpLG49W107Zm9yKHZhciByIGluIHQpbi5wdXNoKHIpO3JldHVybiBuLnJldmVyc2UoKSxmdW5jdGlvbiBlKCl7Zm9yKDtuLmxlbmd0aDspe3ZhciByPW4ucG9wKCk7aWYociBpbiB0KXJldHVybiBlLnZhbHVlPXIsZS5kb25lPSExLGV9cmV0dXJuIGUuZG9uZT0hMCxlfX0sdC52YWx1ZXM9UixfLnByb3RvdHlwZT17Y29uc3RydWN0b3I6XyxyZXNldDpmdW5jdGlvbihlKXtpZih0aGlzLnByZXY9MCx0aGlzLm5leHQ9MCx0aGlzLnNlbnQ9dGhpcy5fc2VudD12b2lkIDAsdGhpcy5kb25lPSExLHRoaXMuZGVsZWdhdGU9bnVsbCx0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5hcmc9dm9pZCAwLHRoaXMudHJ5RW50cmllcy5mb3JFYWNoKEEpLCFlKWZvcih2YXIgdCBpbiB0aGlzKSJ0Ij09PXQuY2hhckF0KDApJiZyLmNhbGwodGhpcyx0KSYmIWlzTmFOKCt0LnNsaWNlKDEpKSYmKHRoaXNbdF09dm9pZCAwKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgZT10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZigidGhyb3ciPT09ZS50eXBlKXRocm93IGUuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKGUpe2lmKHRoaXMuZG9uZSl0aHJvdyBlO3ZhciB0PXRoaXM7ZnVuY3Rpb24gbihuLHIpe3JldHVybiBhLnR5cGU9InRocm93IixhLmFyZz1lLHQubmV4dD1uLHImJih0Lm1ldGhvZD0ibmV4dCIsdC5hcmc9dm9pZCAwKSwhIXJ9Zm9yKHZhciBvPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtvPj0wOy0tbyl7dmFyIGk9dGhpcy50cnlFbnRyaWVzW29dLGE9aS5jb21wbGV0aW9uO2lmKCJyb290Ij09PWkudHJ5TG9jKXJldHVybiBuKCJlbmQiKTtpZihpLnRyeUxvYzw9dGhpcy5wcmV2KXt2YXIgcz1yLmNhbGwoaSwiY2F0Y2hMb2MiKSxjPXIuY2FsbChpLCJmaW5hbGx5TG9jIik7aWYocyYmYyl7aWYodGhpcy5wcmV2PGkuY2F0Y2hMb2MpcmV0dXJuIG4oaS5jYXRjaExvYywhMCk7aWYodGhpcy5wcmV2PGkuZmluYWxseUxvYylyZXR1cm4gbihpLmZpbmFsbHlMb2MpfWVsc2UgaWYocyl7aWYodGhpcy5wcmV2PGkuY2F0Y2hMb2MpcmV0dXJuIG4oaS5jYXRjaExvYywhMCl9ZWxzZXtpZighYyl0aHJvdyBuZXcgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7aWYodGhpcy5wcmV2PGkuZmluYWxseUxvYylyZXR1cm4gbihpLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO24+PTA7LS1uKXt2YXIgbz10aGlzLnRyeUVudHJpZXNbbl07aWYoby50cnlMb2M8PXRoaXMucHJldiYmci5jYWxsKG8sImZpbmFsbHlMb2MiKSYmdGhpcy5wcmV2PG8uZmluYWxseUxvYyl7dmFyIGk9bzticmVha319aSYmKCJicmVhayI9PT1lfHwiY29udGludWUiPT09ZSkmJmkudHJ5TG9jPD10JiZ0PD1pLmZpbmFsbHlMb2MmJihpPW51bGwpO3ZhciBhPWk/aS5jb21wbGV0aW9uOnt9O3JldHVybiBhLnR5cGU9ZSxhLmFyZz10LGk/KHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLm5leHQ9aS5maW5hbGx5TG9jLGYpOnRoaXMuY29tcGxldGUoYSl9LGNvbXBsZXRlOmZ1bmN0aW9uKGUsdCl7aWYoInRocm93Ij09PWUudHlwZSl0aHJvdyBlLmFyZztyZXR1cm4iYnJlYWsiPT09ZS50eXBlfHwiY29udGludWUiPT09ZS50eXBlP3RoaXMubmV4dD1lLmFyZzoicmV0dXJuIj09PWUudHlwZT8odGhpcy5ydmFsPXRoaXMuYXJnPWUuYXJnLHRoaXMubWV0aG9kPSJyZXR1cm4iLHRoaXMubmV4dD0iZW5kIik6Im5vcm1hbCI9PT1lLnR5cGUmJnQmJih0aGlzLm5leHQ9dCksZn0sZmluaXNoOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7dD49MDstLXQpe3ZhciBuPXRoaXMudHJ5RW50cmllc1t0XTtpZihuLmZpbmFsbHlMb2M9PT1lKXJldHVybiB0aGlzLmNvbXBsZXRlKG4uY29tcGxldGlvbixuLmFmdGVyTG9jKSxBKG4pLGZ9fSxjYXRjaDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO3Q+PTA7LS10KXt2YXIgbj10aGlzLnRyeUVudHJpZXNbdF07aWYobi50cnlMb2M9PT1lKXt2YXIgcj1uLmNvbXBsZXRpb247aWYoInRocm93Ij09PXIudHlwZSl7dmFyIG89ci5hcmc7QShuKX1yZXR1cm4gb319dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHQiKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOlIoZSkscmVzdWx0TmFtZTp0LG5leHRMb2M6bn0sIm5leHQiPT09dGhpcy5tZXRob2QmJih0aGlzLmFyZz12b2lkIDApLGZ9fSx0fWZ1bmN0aW9uIHQoZSx0KXt2YXIgbj1PYmplY3Qua2V5cyhlKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO3QmJihyPXIuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIG4oZSl7Zm9yKHZhciBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl7dmFyIG89bnVsbCE9YXJndW1lbnRzW25dP2FyZ3VtZW50c1tuXTp7fTtuJTI/dChPYmplY3QobyksITApLmZvckVhY2goKGZ1bmN0aW9uKHQpe3IoZSx0LG9bdF0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobykpOnQoT2JqZWN0KG8pKS5mb3JFYWNoKChmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobyx0KSl9KSl9cmV0dXJuIGV9ZnVuY3Rpb24gcihlLHQsbil7cmV0dXJuKHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZnVuY3Rpb24oZSx0KXtpZigib2JqZWN0IiE9PWkoZSl8fG51bGw9PT1lKXJldHVybiBlO3ZhciBuPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1uKXt2YXIgcj1uLmNhbGwoZSx0fHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT09aShyKSlyZXR1cm4gcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PXQ/U3RyaW5nOk51bWJlcikoZSl9KGUsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT09aSh0KT90OlN0cmluZyh0KX0odCkpaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1uLGV9ZnVuY3Rpb24gbyhlLHQsbixyLG8saSxhKXt0cnl7dmFyIHM9ZVtpXShhKSxjPXMudmFsdWV9Y2F0Y2goZSl7cmV0dXJuIHZvaWQgbihlKX1zLmRvbmU/dChjKTpQcm9taXNlLnJlc29sdmUoYykudGhlbihyLG8pfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIGk9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9LGkoZSl9IWZ1bmN0aW9uKCl7dmFyIHQ9dGhpc3x8Z2xvYmFsVGhpcyxyPXQuY29ubmVjdHx8e307dC5jb25uZWN0PXIsdC5saWx5PXI7dmFyIGE9bmF2aWdhdG9yLnVzZXJBZ2VudCxzPVsiYnViYmxlcyIsImNhbmNlbEJ1YmJsZSIsImNhbmNlbGFibGUiLCJjb21wb3NlZCIsImRhdGEiLCJkZWZhdWx0UHJldmVudGVkIiwiZXZlbnRQaGFzZSIsImlzVHJ1c3RlZCIsImxhc3RFdmVudElkIiwib3JpZ2luIiwicmV0dXJuVmFsdWUiLCJ0aW1lU3RhbXAiLCJ0eXBlIl07ci5zcHJpbnRmPXQuc3ByaW50ZixyLnZzcHJpbnRmPXQudnNwcmludGYsZGVsZXRlIHQuc3ByaW50ZixkZWxldGUgdC52c3ByaW50ZixyLkhUVFBfU1RBVFVTX0NPREVTPXtTVUNDRVNTOjIwMCxVTkFVVEhPUklaRUQ6NDAxLEFDQ0VTU19ERU5JRUQ6NDAzLFRPT19NQU5ZX1JFUVVFU1RTOjQyOSxJTlRFUk5BTF9TRVJWRVJfRVJST1I6NTAwfSxyLlRSQU5TUE9SVF9UWVBFUz17Q0hBVF9UT0tFTjoiY2hhdF90b2tlbiIsV0VCX1NPQ0tFVDoid2ViX3NvY2tldCIsQUdFTlRfRElTQ09WRVJZOiJhZ2VudF9kaXNjb3ZlcnkiLFdFQl9SVEM6IndlYl9ydGMifSxyLmhpdGNoPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSx0PWUuc2hpZnQoKSxuPWUuc2hpZnQoKTtyZXR1cm4gci5hc3NlcnROb3ROdWxsKHQsInNjb3BlIiksci5hc3NlcnROb3ROdWxsKG4sIm1ldGhvZCIpLHIuYXNzZXJ0VHJ1ZShyLmlzRnVuY3Rpb24obiksIm1ldGhvZCBtdXN0IGJlIGEgZnVuY3Rpb24iKSxmdW5jdGlvbigpe3ZhciByPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7cmV0dXJuIG4uYXBwbHkodCxlLmNvbmNhdChyKSl9fSxyLmlzRnVuY3Rpb249ZnVuY3Rpb24oZSl7cmV0dXJuISEoZSYmZS5jb25zdHJ1Y3RvciYmZS5jYWxsJiZlLmFwcGx5KX0sci5pc0FycmF5PWZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSl9LHIua2V5cz1mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gci5hc3NlcnROb3ROdWxsKGUsIm1hcCIpLGUpdC5wdXNoKG4pO3JldHVybiB0fSxyLnZhbHVlcz1mdW5jdGlvbihlKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gci5hc3NlcnROb3ROdWxsKGUsIm1hcCIpLGUpdC5wdXNoKGVbbl0pO3JldHVybiB0fSxyLmVudHJpZXM9ZnVuY3Rpb24oZSl7dmFyIHQ9W107Zm9yKHZhciBuIGluIGUpdC5wdXNoKHtrZXk6bix2YWx1ZTplW25dfSk7cmV0dXJuIHR9LHIubWVyZ2U9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCksdD17fTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXtyLmVudHJpZXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dFtlLmtleV09ZS52YWx1ZX0pKX0pKSx0fSxyLm5vdz1mdW5jdGlvbigpe3JldHVybihuZXcgRGF0ZSkuZ2V0VGltZSgpfSxyLmZpbmQ9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZih0KGVbbl0pKXJldHVybiBlW25dO3JldHVybiBudWxsfSxyLmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheT9udWxsIT1yLmZpbmQoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSkpOnQgaW4gZX0sci5jb250YWluc1ZhbHVlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUgaW5zdGFuY2VvZiBBcnJheT9udWxsIT1yLmZpbmQoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSkpOm51bGwhPXIuZmluZChyLnZhbHVlcyhlKSwoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSkpfSxyLnJhbmRvbUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHIuc3ByaW50ZigiJXMtJXMiLHIubm93KCksTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMikpfSxyLm1ha2VFbnVtPWZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWUucmVwbGFjZSgvXC4/KFthLXpdKylfPy9nLChmdW5jdGlvbihlLHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCkrIl8ifSkpLnJlcGxhY2UoL18kLywiIik7dFtuXT1lfSkpLHR9LHIubWFrZU5hbWVzcGFjZWRFbnVtPWZ1bmN0aW9uKGUsdCl7dmFyIG49ci5tYWtlRW51bSh0KTtyZXR1cm4gci5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe25bdF09ci5zcHJpbnRmKCIlczo6JXMiLGUsblt0XSl9KSksbn0sci5tYWtlR2VuZXJpY05hbWVzcGFjZWRFbnVtPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz1yLm1ha2VFbnVtKHQpO3JldHVybiByLmtleXMobykuZm9yRWFjaCgoZnVuY3Rpb24odCl7b1t0XT1yLnNwcmludGYoIiVzIituKyIlcyIsZSxvW3RdKX0pKSxvfSxyLmlzQ2hyb21lQnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybi0xIT09YS5pbmRleE9mKCJDaHJvbWUiKX0sci5pc0ZpcmVmb3hCcm93c2VyPWZ1bmN0aW9uKCl7cmV0dXJuLTEhPT1hLmluZGV4T2YoIkZpcmVmb3giKX0sci5pc09wZXJhQnJvd3Nlcj1mdW5jdGlvbigpe3JldHVybi0xIT09YS5pbmRleE9mKCJPcGVyYSIpfSxyLmlzRWRnZUJyb3dzZXI9ZnVuY3Rpb24oKXtyZXR1cm4tMSE9PWEuaW5kZXhPZigiRWRnIil9LHIuZ2V0Q2hyb21lQnJvd3NlclZlcnNpb249ZnVuY3Rpb24oKXt2YXIgZT1hLnN1YnN0cmluZyhhLmluZGV4T2YoIkNocm9tZSIpKzcpO3JldHVybiBlP3BhcnNlRmxvYXQoZSk6LTF9LHIuZ2V0RmlyZWZveEJyb3dzZXJWZXJzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9YS5zdWJzdHJpbmcoYS5pbmRleE9mKCJGaXJlZm94IikrOCk7cmV0dXJuIGU/cGFyc2VGbG9hdChlKTotMX0sci5pc1ZhbGlkTG9jYWxlPWZ1bmN0aW9uKGUpe3JldHVyblt7aWQ6ImVuX1VTIixsYWJlbDoiRW5nbGlzaCJ9LHtpZDoiZGVfREUiLGxhYmVsOiJEZXV0c2NoIn0se2lkOiJlc19FUyIsbGFiZWw6IkVzcGHDsW9sIn0se2lkOiJmcl9GUiIsbGFiZWw6IkZyYW7Dp2FpcyJ9LHtpZDoiamFfSlAiLGxhYmVsOiLml6XmnKzoqp4ifSx7aWQ6Iml0X0lUIixsYWJlbDoiSXRhbGlhbm8ifSx7aWQ6ImtvX0tSIixsYWJlbDoi7ZWc6rWt7Ja0In0se2lkOiJwdF9CUiIsbGFiZWw6IlBvcnR1Z3XDqnMifSx7aWQ6InpoX0NOIixsYWJlbDoi5Lit5paHKOeugOS9kykifSx7aWQ6InpoX1RXIixsYWJlbDoi5Lit5paHKOe5gemrlCkifV0ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5pZH0pKS5pbmNsdWRlcyhlKX0sci5nZXRPcGVyYUJyb3dzZXJWZXJzaW9uPWZ1bmN0aW9uKCl7dmFyIGU9YS5pbmRleE9mKCJPcGVyYSIpLHQ9LTEhPT1hLmluZGV4T2YoIlZlcnNpb24iKT9hLnN1YnN0cmluZyhlKzgpOmEuc3Vic3RyaW5nKGUrNik7cmV0dXJuIHQ/cGFyc2VGbG9hdCh0KTotMX0sci5pbmRleD1mdW5jdGlvbihlLHQpe3ZhciBuPXt9O3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKGUpe25bdChlKV09ZX0pKSxufSxyLnNldD1mdW5jdGlvbihlKXt2YXIgdD17fTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbihlKXt0W2VdPTF9KSksdH0sci5yZWxhdGl2ZUNvbXBsZW1lbnQ9ZnVuY3Rpb24oZSx0KXt2YXIgbj17fTtyZXR1cm4gci5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKHIpe3IgaW4gZXx8KG5bcl09dFtyXSl9KSksbn0sci5hc3NlcnRUcnVlPWZ1bmN0aW9uKGUsdCl7aWYoIWUpdGhyb3cgbmV3IHIuVmFsdWVFcnJvcih0KX0sci5hc3NlcnROb3ROdWxsPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHIuYXNzZXJ0VHJ1ZShudWxsIT1lJiZ2b2lkIDAhPT1pKGUpLHIuc3ByaW50ZigiJXMgbXVzdCBiZSBwcm92aWRlZCIsdHx8IkEgdmFsdWUiKSksZX0sci5kZWVwY29weT1mdW5jdGlvbihlKXtyZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlKSl9LHIuZGVlcGNvcHlDcm9zc09yaWdpbkV2ZW50PWZ1bmN0aW9uKGUpe3ZhciB0PXt9O3JldHVybiBzLmZvckVhY2goKGZ1bmN0aW9uKG4pe3RyeXt0W25dPWVbbl19Y2F0Y2goZSl7ci5nZXRMb2coKS5pbmZvKCJkZWVwY29weUNyb3NzT3JpZ2luRXZlbnQgZmFpbGVkIG9uIGtleTogIixuKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pKSxyLmRlZXBjb3B5KHQpfSxyLmdldEJhc2VVcmw9ZnVuY3Rpb24oKXt2YXIgZT10LmxvY2F0aW9uO3JldHVybiByLnNwcmludGYoIiVzLy8lczolcyIsZS5wcm90b2NvbCxlLmhvc3RuYW1lLGUucG9ydCl9LHIuZ2V0VXJsV2l0aFByb3RvY29sPWZ1bmN0aW9uKGUpe3ZhciBuPXQubG9jYXRpb24ucHJvdG9jb2w7cmV0dXJuIGUuc3Vic3RyKDAsbi5sZW5ndGgpIT09bj9yLnNwcmludGYoIiVzLy8lcyIsbixlKTplfSxyLmlzRnJhbWVkPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiB3aW5kb3cuc2VsZiE9PXdpbmRvdy50b3B9Y2F0Y2goZSl7cmV0dXJuITB9fSxyLmhhc090aGVyQ29ubmVjdGVkQ0NQcz1mdW5jdGlvbigpe3JldHVybiByLm51bWJlck9mQ29ubmVjdGVkQ0NQcz4xfSxyLmZldGNoPWZ1bmN0aW9uKGUsdCxuLG8pe3JldHVybiBvPW98fDUsbj1ufHwxZTMsdD10fHx7fSxuZXcgUHJvbWlzZSgoZnVuY3Rpb24oaSxhKXshZnVuY3Rpb24gbyhzKXtmZXRjaChlLHQpLnRoZW4oKGZ1bmN0aW9uKGUpe2Uuc3RhdHVzPT09ci5IVFRQX1NUQVRVU19DT0RFUy5TVUNDRVNTP2UuanNvbigpLnRoZW4oKGZ1bmN0aW9uKGUpe3JldHVybiBpKGUpfSkpLmNhdGNoKChmdW5jdGlvbigpe3JldHVybiBpKHt9KX0pKToxIT09cyYmKGUuc3RhdHVzPj1yLkhUVFBfU1RBVFVTX0NPREVTLklOVEVSTkFMX1NFUlZFUl9FUlJPUnx8ZS5zdGF0dXM9PT1yLkhUVFBfU1RBVFVTX0NPREVTLlRPT19NQU5ZX1JFUVVFU1RTKT9zZXRUaW1lb3V0KChmdW5jdGlvbigpe28oLS1zKX0pLG4pOmEoZSl9KSkuY2F0Y2goKGZ1bmN0aW9uKGUpe2EoZSl9KSl9KG8pfSkpfSxyLmZldGNoV2l0aFRpbWVvdXQ9ZnVuY3Rpb24oKXt2YXIgdCxpPSh0PWUoKS5tYXJrKChmdW5jdGlvbiB0KG8saSxhLHMsYyl7dmFyIHUsbCxwO3JldHVybiBlKCkud3JhcCgoZnVuY3Rpb24oZSl7Zm9yKDs7KXN3aXRjaChlLnByZXY9ZS5uZXh0KXtjYXNlIDA6aWYoYT1hfHx7fSxpKXtlLm5leHQ9MzticmVha31yZXR1cm4gZS5hYnJ1cHQoInJldHVybiIsci5mZXRjaChvLGEscyxjKSk7Y2FzZSAzOnJldHVybiB1PW5ldyBBYm9ydENvbnRyb2xsZXIsbD1zZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiB1LmFib3J0KCl9KSxpKSxlLm5leHQ9NyxyLmZldGNoKG8sbihuKHt9LGEpLHt9LHtzaWduYWw6dS5zaWduYWx9KSxzLGMpO2Nhc2UgNzpyZXR1cm4gcD1lLnNlbnQsY2xlYXJUaW1lb3V0KGwpLGUuYWJydXB0KCJyZXR1cm4iLHApO2Nhc2UgMTA6Y2FzZSJlbmQiOnJldHVybiBlLnN0b3AoKX19KSx0KX0pKSxmdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1hcmd1bWVudHM7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLGkpe3ZhciBhPXQuYXBwbHkoZSxuKTtmdW5jdGlvbiBzKGUpe28oYSxyLGkscyxjLCJuZXh0IixlKX1mdW5jdGlvbiBjKGUpe28oYSxyLGkscyxjLCJ0aHJvdyIsZSl9cyh2b2lkIDApfSkpfSk7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsbyl7cmV0dXJuIGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSxyLmJhY2tvZmY9ZnVuY3Rpb24oZSxuLG8saSl7ci5hc3NlcnRUcnVlKHIuaXNGdW5jdGlvbihlKSwiZnVuYyBtdXN0IGJlIGEgRnVuY3Rpb24iKTt2YXIgYT10aGlzO2Uoe3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7aSYmaS5zdWNjZXNzJiZpLnN1Y2Nlc3MoZSl9LGZhaWx1cmU6ZnVuY3Rpb24ocixzKXtpZihvPjApe3ZhciBjPTIqbipNYXRoLnJhbmRvbSgpO3Quc2V0VGltZW91dCgoZnVuY3Rpb24oKXthLmJhY2tvZmYoZSwyKmMsLS1vLGkpfSksYyl9ZWxzZSBpJiZpLmZhaWx1cmUmJmkuZmFpbHVyZShyLHMpfX0pfSxyLnB1Ymxpc2hNZXRyaWM9ZnVuY3Rpb24oZSl7ci5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHIuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6ci5FdmVudFR5cGUuQ0xJRU5UX01FVFJJQyxkYXRhOmV9KX0sci5wdWJsaXNoU29mdHBob25lU3RhdHM9ZnVuY3Rpb24oZSl7ci5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHIuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6ci5FdmVudFR5cGUuU09GVFBIT05FX1NUQVRTLGRhdGE6ZX0pfSxyLnB1Ymxpc2hTb2Z0cGhvbmVSZXBvcnQ9ZnVuY3Rpb24oZSl7ci5jb3JlLmdldFVwc3RyZWFtKCkuc2VuZFVwc3RyZWFtKHIuRXZlbnRUeXBlLkJST0FEQ0FTVCx7ZXZlbnQ6ci5FdmVudFR5cGUuU09GVFBIT05FX1JFUE9SVCxkYXRhOmV9KX0sci5wdWJsaXNoQ2xpY2tTdHJlYW1EYXRhPWZ1bmN0aW9uKGUpe3IuY29yZS5nZXRVcHN0cmVhbSgpLnNlbmRVcHN0cmVhbShyLkV2ZW50VHlwZS5CUk9BRENBU1Qse2V2ZW50OnIuRXZlbnRUeXBlLkNMSUNLX1NUUkVBTV9EQVRBLGRhdGE6ZX0pfSxyLnB1Ymxpc2hDbGllbnRTaWRlTG9ncz1mdW5jdGlvbihlKXtyLmNvcmUuZ2V0RXZlbnRCdXMoKS50cmlnZ2VyKHIuRXZlbnRUeXBlLkNMSUVOVF9TSURFX0xPR1MsZSl9LHIuYWRkTmFtZXNwYWNlVG9Mb2dzPWZ1bmN0aW9uKGUpe1sibG9nIiwiZXJyb3IiLCJ3YXJuIiwiaW5mbyIsImRlYnVnIl0uZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49d2luZG93LmNvbnNvbGVbdF07d2luZG93LmNvbnNvbGVbdF09ZnVuY3Rpb24oKXt2YXIgdD1BcnJheS5mcm9tKGFyZ3VtZW50cyk7dC51bnNoaWZ0KCJbIi5jb25jYXQoZSwiXSIpKSxuLmFwcGx5KHdpbmRvdy5jb25zb2xlLHQpfX0pKX0sci5Qb3B1cE1hbmFnZXI9ZnVuY3Rpb24oKXt9LHIuUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5vcGVuPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1udWxsO2lmKG4pe3ZhciBvPW4uaGVpZ2h0fHw1NzgsaT1uLndpZHRofHw0MzMsYT1uLnRvcHx8MCxzPW4ubGVmdHx8MDsocj13aW5kb3cub3BlbigiIix0LCJ3aWR0aD0iK2krIiwgaGVpZ2h0PSIrbysiLCB0b3A9IithKyIsIGxlZnQ9IitzKSkubG9jYXRpb24hPT1lJiYocj13aW5kb3cub3BlbihlLHQsIndpZHRoPSIraSsiLCBoZWlnaHQ9IitvKyIsIHRvcD0iK2ErIiwgbGVmdD0iK3MpKX1lbHNlKHI9d2luZG93Lm9wZW4oIiIsdCkpLmxvY2F0aW9uIT09ZSYmKHI9d2luZG93Lm9wZW4oZSx0KSk7cmV0dXJuIHJ9LHIuUG9wdXBNYW5hZ2VyLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbihlKXt2YXIgbj10aGlzLl9nZXRMb2NhbFN0b3JhZ2VLZXkoZSk7dC5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShuKX0sci5Qb3B1cE1hbmFnZXIucHJvdG90eXBlLl9nZXRMYXN0T3BlbmVkVGltZXN0YW1wPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMuX2dldExvY2FsU3RvcmFnZUtleShlKSxyPXQubG9jYWxTdG9yYWdlLmdldEl0ZW0obik7cmV0dXJuIHI/cGFyc2VJbnQociwxMCk6MH0sci5Qb3B1cE1hbmFnZXIucHJvdG90eXBlLl9zZXRMYXN0T3BlbmVkVGltZXN0YW1wPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcy5fZ2V0TG9jYWxTdG9yYWdlS2V5KGUpO3QubG9jYWxTdG9yYWdlLnNldEl0ZW0ociwiIituKX0sci5Qb3B1cE1hbmFnZXIucHJvdG90eXBlLl9nZXRMb2NhbFN0b3JhZ2VLZXk9ZnVuY3Rpb24oZSl7cmV0dXJuImNvbm5lY3RQb3B1cE1hbmFnZXI6OiIrZX07dmFyIGM9ci5tYWtlRW51bShbImdyYW50ZWQiLCJkZW5pZWQiLCJkZWZhdWx0Il0pO3IuTm90aWZpY2F0aW9uTWFuYWdlcj1mdW5jdGlvbigpe3RoaXMucXVldWU9W10sdGhpcy5wZXJtaXNzaW9uPWMuREVGQVVMVH0sci5Ob3RpZmljYXRpb25NYW5hZ2VyLnByb3RvdHlwZS5yZXF1ZXN0UGVybWlzc2lvbj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7Ik5vdGlmaWNhdGlvbiJpbiB0P3QuTm90aWZpY2F0aW9uLnBlcm1pc3Npb249PT1jLkRFTklFRD8oci5nZXRMb2coKS53YXJuKCJUaGUgdXNlciBoYXMgcmVxdWVzdGVkIHRvIG5vdCByZWNlaXZlIG5vdGlmaWNhdGlvbnMuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSx0aGlzLnBlcm1pc3Npb249Yy5ERU5JRUQpOnRoaXMucGVybWlzc2lvbiE9PWMuR1JBTlRFRCYmdC5Ob3RpZmljYXRpb24ucmVxdWVzdFBlcm1pc3Npb24oKS50aGVuKChmdW5jdGlvbih0KXtlLnBlcm1pc3Npb249dCx0PT09Yy5HUkFOVEVEP2UuX3Nob3dRdWV1ZWQoKTplLnF1ZXVlPVtdfSkpOihyLmdldExvZygpLndhcm4oIlRoaXMgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgbm90aWZpY2F0aW9ucy4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMucGVybWlzc2lvbj1jLkRFTklFRCl9LHIuTm90aWZpY2F0aW9uTWFuYWdlci5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbihlLHQpe2lmKHRoaXMucGVybWlzc2lvbj09PWMuR1JBTlRFRClyZXR1cm4gdGhpcy5fc2hvd0ltcGwoe3RpdGxlOmUsb3B0aW9uczp0fSk7aWYodGhpcy5wZXJtaXNzaW9uPT09Yy5ERU5JRUQpci5nZXRMb2coKS53YXJuKCJVbmFibGUgdG8gc2hvdyBub3RpZmljYXRpb24uIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHt0aXRsZTplLG9wdGlvbnM6dH0pO2Vsc2V7dmFyIG49e3RpdGxlOmUsb3B0aW9uczp0fTtyLmdldExvZygpLndhcm4oIkRlZmVycmluZyBub3RpZmljYXRpb24gdW50aWwgdXNlciBkZWNpZGVzIHRvIGFsbG93IG9yIGRlbnkuIikud2l0aE9iamVjdChuKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHRoaXMucXVldWUucHVzaChuKX19LHIuTm90aWZpY2F0aW9uTWFuYWdlci5wcm90b3R5cGUuX3Nob3dRdWV1ZWQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5xdWV1ZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9zaG93SW1wbCh0KX0pKTtyZXR1cm4gdGhpcy5xdWV1ZT1bXSx0fSxyLk5vdGlmaWNhdGlvbk1hbmFnZXIucHJvdG90eXBlLl9zaG93SW1wbD1mdW5jdGlvbihlKXt2YXIgbj1uZXcgdC5Ob3RpZmljYXRpb24oZS50aXRsZSxlLm9wdGlvbnMpO3JldHVybiBlLm9wdGlvbnMuY2xpY2tlZCYmKG4ub25jbGljaz1mdW5jdGlvbigpe2Uub3B0aW9ucy5jbGlja2VkLmNhbGwobil9KSxufSxyLlZhbHVlRXJyb3I9ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCksdD1lLnNoaWZ0KCksbj1uZXcgRXJyb3Ioci52c3ByaW50Zih0LGUpKTtyZXR1cm4gT2JqZWN0LnNldFByb3RvdHlwZU9mKG4sci5WYWx1ZUVycm9yLnByb3RvdHlwZSksbn0sT2JqZWN0LnNldFByb3RvdHlwZU9mKHIuVmFsdWVFcnJvci5wcm90b3R5cGUsRXJyb3IucHJvdG90eXBlKSxPYmplY3Quc2V0UHJvdG90eXBlT2Yoci5WYWx1ZUVycm9yLEVycm9yKSxyLlZhbHVlRXJyb3IucHJvdG90eXBlLm5hbWU9IlZhbHVlRXJyb3IiLHIuTm90SW1wbGVtZW50ZWRFcnJvcj1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSx0PWUuc2hpZnQoKSxuPW5ldyBFcnJvcihyLnZzcHJpbnRmKHQsZSkpO3JldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YobixyLk5vdEltcGxlbWVudGVkRXJyb3IucHJvdG90eXBlKSxufSxPYmplY3Quc2V0UHJvdG90eXBlT2Yoci5Ob3RJbXBsZW1lbnRlZEVycm9yLnByb3RvdHlwZSxFcnJvci5wcm90b3R5cGUpLE9iamVjdC5zZXRQcm90b3R5cGVPZihyLk5vdEltcGxlbWVudGVkRXJyb3IsRXJyb3IpLHIuTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUubmFtZT0iTm90SW1wbGVtZW50ZWRFcnJvciIsci5TdGF0ZUVycm9yPWZ1bmN0aW9uKCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApLHQ9ZS5zaGlmdCgpLG49bmV3IEVycm9yKHIudnNwcmludGYodCxlKSk7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZihuLHIuU3RhdGVFcnJvci5wcm90b3R5cGUpLG59LE9iamVjdC5zZXRQcm90b3R5cGVPZihyLlN0YXRlRXJyb3IucHJvdG90eXBlLEVycm9yLnByb3RvdHlwZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHIuU3RhdGVFcnJvcixFcnJvciksci5TdGF0ZUVycm9yLnByb3RvdHlwZS5uYW1lPSJTdGF0ZUVycm9yIixyLlZvaWNlSWRFcnJvcj1mdW5jdGlvbihlLHQsbil7dmFyIHI9e307cmV0dXJuIHIudHlwZT1lLHIubWVzc2FnZT10LHIuc3RhY2s9RXJyb3IodCkuc3RhY2ssci5lcnI9bixyfSxyLmlzQ0NQPWZ1bmN0aW9uKCl7cmV0dXJuISFyLmNvcmUudXBzdHJlYW0mJiJDb25uZWN0U2hhcmVkV29ya2VyQ29uZHVpdCI9PT1yLmNvcmUuZ2V0VXBzdHJlYW0oKS5uYW1lfSxyLmlzU2hhcmVkV29ya2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHIud29ya2VyJiYhIXIud29ya2VyLmNsaWVudEVuZ2luZX0sci5pc0NSTT1mdW5jdGlvbigpe3JldHVybiEhci5jb3JlLnVwc3RyZWFtJiYoci5jb3JlLmdldFVwc3RyZWFtKClpbnN0YW5jZW9mIHIuSUZyYW1lQ29uZHVpdHx8ci5jb3JlLmdldFVwc3RyZWFtKClpbnN0YW5jZW9mIHIuR1JQcm94eUlmcmFtZUNvbmR1aXQpfSxyLmlzQWN0aXZlQ29uZHVpdD1mdW5jdGlvbihlKXt2YXIgdD1yLmNvcmUuZ2V0VXBzdHJlYW0oKTtyZXR1cm4gdCBpbnN0YW5jZW9mIHIuR1JQcm94eUlmcmFtZUNvbmR1aXQ/ZS5uYW1lPT09dC5hY3RpdmVSZWdpb25Vcmw6KHIuY29yZS5nZXRMb2coKS5lcnJvcigiY29ubmVjdC5pc0FjdGl2ZUNvbmR1aXQgaXMgY2FsbGVkIGJ1dCB0aGVyZSBpcyBubyBHUiBwcm94eSBjb25kdWl0Iikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSwhMSl9fSgpfSw3NDQ6KCk9PntmdW5jdGlvbiBlKHQpe3JldHVybiBlPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJiJzeW1ib2wiPT10eXBlb2YgU3ltYm9sLml0ZXJhdG9yP2Z1bmN0aW9uKGUpe3JldHVybiB0eXBlb2YgZX06ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJmUuY29uc3RydWN0b3I9PT1TeW1ib2wmJmUhPT1TeW1ib2wucHJvdG90eXBlPyJzeW1ib2wiOnR5cGVvZiBlfSxlKHQpfWZ1bmN0aW9uIHQoZSx0KXt2YXIgbj1PYmplY3Qua2V5cyhlKTtpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO3QmJihyPXIuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIG4oZSl7Zm9yKHZhciBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl7dmFyIG89bnVsbCE9YXJndW1lbnRzW25dP2FyZ3VtZW50c1tuXTp7fTtuJTI/dChPYmplY3QobyksITApLmZvckVhY2goKGZ1bmN0aW9uKHQpe3IoZSx0LG9bdF0pfSkpOk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzP09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobykpOnQoT2JqZWN0KG8pKS5mb3JFYWNoKChmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobyx0KSl9KSl9cmV0dXJuIGV9ZnVuY3Rpb24gcih0LG4scil7cmV0dXJuKG49ZnVuY3Rpb24odCl7dmFyIG49ZnVuY3Rpb24odCxuKXtpZigib2JqZWN0IiE9PWUodCl8fG51bGw9PT10KXJldHVybiB0O3ZhciByPXRbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1yKXt2YXIgbz1yLmNhbGwodCxufHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT09ZShvKSlyZXR1cm4gbzt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PW4/U3RyaW5nOk51bWJlcikodCl9KHQsInN0cmluZyIpO3JldHVybiJzeW1ib2wiPT09ZShuKT9uOlN0cmluZyhuKX0obikpaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxuLHt2YWx1ZTpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtuXT1yLHR9IWZ1bmN0aW9uKCl7dmFyIGU9dGhpc3x8Z2xvYmFsVGhpcyx0PWUuY29ubmVjdHx8e307ZS5jb25uZWN0PXQsZS5saWx5PXQsdC53b3JrZXI9e307dmFyIHI9IkxBRFMuR2V0QWdlbnRGYWlsb3ZlckNvbmZpZ3VyYXRpb24iLG89e2NyZWF0ZVRhc2tDb250YWN0OiJjcmVhdGVUYXNrQ29udGFjdCIsY3JlYXRlT3V0Ym91bmRDb250YWN0OiJjcmVhdGVPdXRib3VuZENvbnRhY3QiLGNyZWF0ZVRlbXBsYXRlZFRhc2s6ImNyZWF0ZVRlbXBsYXRlZFRhc2sifSxpPWZ1bmN0aW9uKCl7dGhpcy50b3BpY01hc3Rlck1hcD17fX07aS5wcm90b3R5cGUuZ2V0TWFzdGVyPWZ1bmN0aW9uKGUpe3JldHVybiB0LmFzc2VydE5vdE51bGwoZSwidG9waWMiKSx0aGlzLnRvcGljTWFzdGVyTWFwW2VdfHxudWxsfSxpLnByb3RvdHlwZS5zZXRNYXN0ZXI9ZnVuY3Rpb24oZSxuKXt0LmFzc2VydE5vdE51bGwoZSwidG9waWMiKSx0LmFzc2VydE5vdE51bGwobiwiaWQiKSx0aGlzLnRvcGljTWFzdGVyTWFwW2VdPW59LGkucHJvdG90eXBlLnJlbW92ZU1hc3Rlcj1mdW5jdGlvbihlKXt0LmFzc2VydE5vdE51bGwoZSwiaWQiKTt2YXIgbj10aGlzO3QuZW50cmllcyh0aGlzLnRvcGljTWFzdGVyTWFwKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlPT09ZX0pKS5mb3JFYWNoKChmdW5jdGlvbihlKXtkZWxldGUgbi50b3BpY01hc3Rlck1hcFtlLmtleV19KSl9O3ZhciBhPWZ1bmN0aW9uKGUpe3QuQ2xpZW50QmFzZS5jYWxsKHRoaXMpLHRoaXMuY29uZHVpdD1lfTsoYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh0LkNsaWVudEJhc2UucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YSxhLnByb3RvdHlwZS5fY2FsbEltcGw9ZnVuY3Rpb24oZSxuLHIpe3ZhciBvPXRoaXMsaT0obmV3IERhdGUpLmdldFRpbWUoKTt0LmNvbnRhaW5zVmFsdWUodC5BZ2VudEFwcENsaWVudE1ldGhvZHMsZSk/dC5jb3JlLmdldEFnZW50QXBwQ2xpZW50KCkuX2NhbGxJbXBsKGUsbix7c3VjY2VzczpmdW5jdGlvbih0KXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSxuKSxyLnN1Y2Nlc3ModCl9LGZhaWx1cmU6ZnVuY3Rpb24odCl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksbix0KSxyLmZhaWx1cmUodCl9fSk6dC5jb250YWluc1ZhbHVlKHQuVGFza1RlbXBsYXRlc0NsaWVudE1ldGhvZHMsZSk/dC5jb3JlLmdldFRhc2tUZW1wbGF0ZXNDbGllbnQoKS5fY2FsbEltcGwoZSxuLHtzdWNjZXNzOmZ1bmN0aW9uKHQpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLG4pLHIuc3VjY2Vzcyh0KX0sZmFpbHVyZTpmdW5jdGlvbih0KXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSxuLHQpLHIuZmFpbHVyZSh0KX19KTp0LmNvcmUuZ2V0Q2xpZW50KCkuX2NhbGxJbXBsKGUsbix7c3VjY2VzczpmdW5jdGlvbih0LGEpe28uX3JlY29yZEFQSUxhdGVuY3koZSxpLG4pLHIuc3VjY2Vzcyh0LGEpfSxmYWlsdXJlOmZ1bmN0aW9uKHQsYSl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksbix0KSxyLmZhaWx1cmUodCxhKX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24odCxhKXtvLl9yZWNvcmRBUElMYXRlbmN5KGUsaSxuLHQpLHIuYXV0aEZhaWx1cmUoKX0sYWNjZXNzRGVuaWVkOmZ1bmN0aW9uKHQsYSl7by5fcmVjb3JkQVBJTGF0ZW5jeShlLGksbix0KSxyLmFjY2Vzc0RlbmllZCYmci5hY2Nlc3NEZW5pZWQoKX19KX0sYS5wcm90b3R5cGUuX3JlY29yZEFQSUxhdGVuY3k9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89KG5ldyBEYXRlKS5nZXRUaW1lKCktdDt0aGlzLl9zZW5kQVBJTWV0cmljcyhlLG8sbixyKX0sYS5wcm90b3R5cGUuX3NlbmRBUElNZXRyaWNzPWZ1bmN0aW9uKGUscixpLGEpe3ZhciBzPXtuYW1lOmUsdGltZTpyLGVycm9yOmEsZXJyb3I1eHg6MH0sYz1be25hbWU6IkNhdGVnb3J5Iix2YWx1ZToiQVBJIn1dLHU9YSYmYS5zdGF0dXNDb2RlfHwyMDAsbD1hJiZhLnJldHJ5U3RhdHVzfHx0LlJldHJ5U3RhdHVzLk5PTkUscD1be25hbWU6Ikh0dHBTdGF0dXNDb2RlIix2YWx1ZTp1fSx7bmFtZToiSHR0cEdlbmVyaWNTdGF0dXNDb2RlIix2YWx1ZToiIi5jb25jYXQodS50b1N0cmluZygpLmNoYXJBdCgwKSwiWFgiKX0se25hbWU6IlJldHJ5U3RhdHVzIix2YWx1ZTpsfV07aWYoIjUiPT09dS50b1N0cmluZygpLmNoYXJBdCgwKSYmKHMuZXJyb3I1eHg9MSksIjUiPT09dS50b1N0cmluZygpLmNoYXJBdCgwKT9zLmZhdWx0PTE6IjIiPT09dS50b1N0cmluZygpLmNoYXJBdCgwKSYmKHMuZmF1bHQ9MCksb1tlXSYmaSYmaS5yZWxhdGVkQ29udGFjdElkKXt2YXIgZD17bmFtZToiIi5jb25jYXQoZSwiV2l0aFJlbGF0ZWRDb250YWN0SWQiKSx0aW1lOnMudGltZSxlcnJvcjpzLmVycm9yLGVycm9yNXh4OnMuZXJyb3I1eHh9O3RoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BUElfTUVUUklDLG4obih7fSxkKSx7fSx7ZGltZW5zaW9uczpjLG9wdGlvbmFsRGltZW5zaW9uczpwfSkpfXRoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BUElfTUVUUklDLG4obih7fSxzKSx7fSx7ZGltZW5zaW9uczpjLG9wdGlvbmFsRGltZW5zaW9uczpwfSkpfTt2YXIgcz1mdW5jdGlvbigpe3ZhciBuPXRoaXM7dGhpcy5tdWx0aXBsZXhlcj1uZXcgdC5TdHJlYW1NdWx0aXBsZXhlcix0aGlzLmNvbmR1aXQ9bmV3IHQuQ29uZHVpdCgiQW1hem9uQ29ubmVjdFNoYXJlZFdvcmtlciIsbnVsbCx0aGlzLm11bHRpcGxleGVyKSx0aGlzLmNsaWVudD1uZXcgYSh0aGlzLmNvbmR1aXQpLHRoaXMudGltZW91dD1udWxsLHRoaXMuYWdlbnQ9bnVsbCx0aGlzLm5leHRUb2tlbj1udWxsLHRoaXMuaW5pdERhdGE9e30sdGhpcy5wb3J0Q29uZHVpdE1hcD17fSx0aGlzLnN0cmVhbU1hcEJ5VGFiSWQ9e30sdGhpcy5tYXN0ZXJDb29yZD1uZXcgaSx0aGlzLmxvZ3NCdWZmZXI9W10sdGhpcy5zdXBwcmVzcz0hMSx0aGlzLmZvcmNlT2ZmbGluZT0hMSx0aGlzLmxvbmdQb2xsaW5nT3B0aW9ucz17YWxsb3dMb25nUG9sbGluZ1NoYWRvd01vZGU6ITEsYWxsb3dMb25nUG9sbGluZ1dlYnNvY2tldE9ubHlNb2RlOiExfSx0aGlzLmRyUG9sbGluZ1VybD1udWxsLHRoaXMudGhpc0Fybj1udWxsLHRoaXMub3RoZXJBcm49bnVsbCx0aGlzLnBlbmRpbmdGYWlsb3Zlcj1udWxsO3ZhciByPW51bGw7dC5yb290TG9nZ2VyPW5ldyB0LkRvd25zdHJlYW1Db25kdWl0TG9nZ2VyKHRoaXMuY29uZHVpdCksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5TRU5EX0xPR1MsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkucHVzaExvZ3NEb3duc3RyZWFtKGUpLG4ubG9nc0J1ZmZlcj1uLmxvZ3NCdWZmZXIuY29uY2F0KGUpLG4ubG9nc0J1ZmZlci5sZW5ndGg+NDAwJiZuLmhhbmRsZVNlbmRMb2dzUmVxdWVzdChuLmxvZ3NCdWZmZXIpfSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLlNVUFBSRVNTLChmdW5jdGlvbihlKXt0LmdldExvZygpLmRlYnVnKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIFNldHRpbmcgU3VwcHJlc3MgdG8gJXMiLGUuc3VwcHJlc3MpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5zdXBwcmVzcz1lLnN1cHByZXNzfHwhMSxuLnN1cHByZXNzfHwobi5mb3JjZU9mZmxpbmU9ITEpLCh2b2lkIDA9PT1lLnNob3VsZFNlbmRGYWlsb3ZlckRvd25zdHJlYW18fGUuc2hvdWxkU2VuZEZhaWxvdmVyRG93bnN0cmVhbSkmJm4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRkFJTE9WRVIse2lzUHJpbWFyeTohbi5zdXBwcmVzc30pfSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZPUkNFX09GRkxJTkUsKGZ1bmN0aW9uKGUpe3QuZ2V0TG9nKCkuZGVidWcoIltEaXNhc3RlciBSZWNvdmVyeV0gU2V0dGluZyBGT1JDRV9PRkZMSU5FIHRvICVzIixlLm9mZmxpbmUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5mb3JjZU9mZmxpbmV8fChuLnBlbmRpbmdGYWlsb3Zlcj0hMSxuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5EaXNhc3RlclJlY292ZXJ5RXZlbnRzLkZBSUxPVkVSLHtpc1ByaW1hcnk6ITEsbmV4dEFjdGl2ZUFybjplLm5leHRBY3RpdmVBcm59KSksbi5mb3JjZU9mZmxpbmU9ZS5vZmZsaW5lfHwhMX0pKSx0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuSU5JVF9EUl9QT0xMSU5HJiZ0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5JTklUX0RSX1BPTExJTkcsKGZ1bmN0aW9uKGUpe3ZhciByPXQuZ2V0TG9nKCk7bi5kclBvbGxpbmdVcmw/KHIuZGVidWcoIltEaXNhc3RlciBSZWNvdmVyeV0gQWRkaW5nIG5ldyBDQ1AgdG8gYWN0aXZlIHJlZ2lvbiBwb2xsaW5nIGZvciBpbnN0YW5jZSAiLmNvbmNhdChlLmluc3RhbmNlQXJuKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnBvbGxGb3JBY3RpdmVSZWdpb24oITAsITEpKTooci5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEluaXRpYWxpemluZyBhY3RpdmUgcmVnaW9uIHBvbGxpbmcgZm9yIGluc3RhbmNlICIuY29uY2F0KGUuaW5zdGFuY2VBcm4pKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4udGhpc0Fybj1lLmluc3RhbmNlQXJuLG4ub3RoZXJBcm49ZS5vdGhlckFybixuLmdldFByZXNpZ25lZERpc2NvdmVyeVVybCgpLnRoZW4oKGZ1bmN0aW9uKGUpe24uZHJQb2xsaW5nVXJsPWUsbi5wb2xsRm9yQWN0aXZlUmVnaW9uKCEwLCEwKX0pLChmdW5jdGlvbih0KXtyLmVycm9yKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEZhaWxlZCB0byBnZXQgcHJlc2lnbmVkIFVSTCBmb3IgaW5zdGFuY2UgIi5jb25jYXQoZS5pbnN0YW5jZUFybiwiOyBzdXBwcmVzc2luZyBjb250YWN0cyIpKS53aXRoRXhjZXB0aW9uKHQpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5zdXBwcmVzcz0hMH0pKSl9KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5DT05GSUdVUkUsKGZ1bmN0aW9uKG8pe2NvbnNvbGUubG9nKCJAQEAgY29uZmlndXJlIGV2ZW50IGhhbmRsZXIiLG8pO3RyeXtvLmF1dGhUb2tlbiYmby5hdXRoVG9rZW4hPT1uLmluaXREYXRhLmF1dGhUb2tlbiYmKG4uaW5pdERhdGE9byx0LmNvcmUuaW5pdChvKSxvLmxvbmdQb2xsaW5nT3B0aW9ucyYmKCJib29sZWFuIj09dHlwZW9mIG8ubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdTaGFkb3dNb2RlJiYobi5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1NoYWRvd01vZGU9by5sb25nUG9sbGluZ09wdGlvbnMuYWxsb3dMb25nUG9sbGluZ1NoYWRvd01vZGUpLCJib29sZWFuIj09dHlwZW9mIG8ubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdXZWJzb2NrZXRPbmx5TW9kZSYmKG4ubG9uZ1BvbGxpbmdPcHRpb25zLmFsbG93TG9uZ1BvbGxpbmdXZWJzb2NrZXRPbmx5TW9kZT1vLmxvbmdQb2xsaW5nT3B0aW9ucy5hbGxvd0xvbmdQb2xsaW5nV2Vic29ja2V0T25seU1vZGUpKSxyP3QuZ2V0TG9nKCkuaW5mbygiTm90IEluaXRpYWxpemluZyBhIG5ldyBXZWJzb2NrZXRNYW5hZ2VyIGluc3RhbmNlLCBzaW5jZSBvbmUgYWxyZWFkeSBleGlzdHMiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpOih0LmdldExvZygpLmluZm8oIkNyZWF0aW5nIGEgbmV3IFdlYnNvY2tldCBjb25uZWN0aW9uIGZvciBDQ1AiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLHQuV2ViU29ja2V0TWFuYWdlci5zZXRHbG9iYWxDb25maWcoe2xvZ2dlckNvbmZpZzp7bG9nZ2VyOnQuZ2V0TG9nKCksYWR2YW5jZWRMb2dXcml0ZXI6ImluZm8iLGxldmVsOjEwfX0pLChyPXQuV2ViU29ja2V0TWFuYWdlci5jcmVhdGUoKSkub25Jbml0RmFpbHVyZSgoZnVuY3Rpb24oKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuSU5JVF9GQUlMVVJFKX0pKSxyLm9uQ29ubmVjdGlvbk9wZW4oKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX09QRU4sZSl9KSksci5vbkNvbm5lY3Rpb25DbG9zZSgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fQ0xPU0UsZSl9KSksci5vbkNvbm5lY3Rpb25HYWluKChmdW5jdGlvbigpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkFnZW50RXZlbnRzLldFQlNPQ0tFVF9DT05ORUNUSU9OX0dBSU5FRCksbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkNPTk5FQ1RJT05fR0FJTil9KSksci5vbkNvbm5lY3Rpb25Mb3N0KChmdW5jdGlvbihlKXtuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0odC5BZ2VudEV2ZW50cy5XRUJTT0NLRVRfQ09OTkVDVElPTl9MT1NULGUpLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5DT05ORUNUSU9OX0xPU1QsZSl9KSksci5vblN1YnNjcmlwdGlvblVwZGF0ZSgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNVQlNDUklQVElPTl9VUERBVEUsZSl9KSksci5vblN1YnNjcmlwdGlvbkZhaWx1cmUoKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LldlYlNvY2tldEV2ZW50cy5TVUJTQ1JJUFRJT05fRkFJTFVSRSxlKX0pKSxyLm9uQWxsTWVzc2FnZSgoZnVuY3Rpb24oZSl7bi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLkFMTF9NRVNTQUdFLGUpfSkpLG4uY29uZHVpdC5vbkRvd25zdHJlYW0odC5XZWJTb2NrZXRFdmVudHMuU0VORCwoZnVuY3Rpb24oZSl7ci5zZW5kTWVzc2FnZShlKX0pKSxuLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuV2ViU29ja2V0RXZlbnRzLlNVQlNDUklCRSwoZnVuY3Rpb24oZSl7ci5zdWJzY3JpYmVUb3BpY3MoZSl9KSksci5pbml0KHQuaGl0Y2gobixuLmdldFdlYlNvY2tldFVybCkpLnRoZW4oKGZ1bmN0aW9uKHIpe3RyeXtpZihyJiYhci53ZWJTb2NrZXRDb25uZWN0aW9uRmFpbGVkKXQuZ2V0TG9nKCkuaW5mbygiS2lja2luZyBvZmYgYWdlbnQgcG9sbGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbi5wb2xsRm9yQWdlbnQoKSx0LmdldExvZygpLmluZm8oIktpY2tpbmcgb2ZmIGNvbmZpZyBwb2xsaW5nIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb24oe3JlcGVhdEZvcmV2ZXI6ITB9KSx0LmdldExvZygpLmluZm8oIktpY2tpbmcgb2ZmIGF1dGggdG9rZW4gcG9sbGluZyIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksZS5zZXRJbnRlcnZhbCh0LmhpdGNoKG4sbi5jaGVja0F1dGhUb2tlbiksM2U1KTtlbHNlIGlmKCF0LndlYlNvY2tldEluaXRGYWlsZWQpe3ZhciBvPXQuV2ViU29ja2V0RXZlbnRzLklOSVRfRkFJTFVSRTt0aHJvdyBuLmNvbmR1aXQuc2VuZERvd25zdHJlYW0obyksdC53ZWJTb2NrZXRJbml0RmFpbGVkPSEwLG5ldyBFcnJvcihvKX19Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiV2ViU29ja2V0IGZhaWxlZCB0byBpbml0aWFsaXplIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfX0pKSkpfWNhdGNoKGUpe2NvbnNvbGUuZXJyb3IoIkBAQCBlcnJvciIsZSl9fSkpLHRoaXMuY29uZHVpdC5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuVEVSTUlOQVRFLChmdW5jdGlvbigpe24uaGFuZGxlU2VuZExvZ3NSZXF1ZXN0KG4ubG9nc0J1ZmZlciksdC5jb3JlLnRlcm1pbmF0ZSgpLG4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5URVJNSU5BVEVEKX0pKSx0aGlzLmNvbmR1aXQub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlNZTkNIUk9OSVpFLChmdW5jdGlvbigpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSl9KSksdGhpcy5jb25kdWl0Lm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5CUk9BRENBU1QsKGZ1bmN0aW9uKGUpe24uY29uZHVpdC5zZW5kRG93bnN0cmVhbShlLmV2ZW50LGUuZGF0YSl9KSksZS5vbmNvbm5lY3Q9ZnVuY3Rpb24oZSl7dmFyIHI9ZS5wb3J0c1swXSxvPW5ldyB0LlBvcnRTdHJlYW0ocik7bi5tdWx0aXBsZXhlci5hZGRTdHJlYW0obyksci5zdGFydCgpO3ZhciBpPW5ldyB0LkNvbmR1aXQoby5nZXRJZCgpLG51bGwsbyk7aS5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BQ0tOT1dMRURHRSx7aWQ6by5nZXRJZCgpfSksbi5wb3J0Q29uZHVpdE1hcFtvLmdldElkKCldPWksbi5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUyx7bGVuZ3RoOk9iamVjdC5rZXlzKG4ucG9ydENvbmR1aXRNYXApLmxlbmd0aH0pLG51bGwhPT1uLmFnZW50JiZuLnVwZGF0ZUFnZW50KCksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuQVBJX1JFUVVFU1QsdC5oaXRjaChuLG4uaGFuZGxlQVBJUmVxdWVzdCxpKSksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuTUFTVEVSX1JFUVVFU1QsdC5oaXRjaChuLG4uaGFuZGxlTWFzdGVyUmVxdWVzdCxpLG8uZ2V0SWQoKSkpLGkub25Eb3duc3RyZWFtKHQuRXZlbnRUeXBlLlJFTE9BRF9BR0VOVF9DT05GSUdVUkFUSU9OLHQuaGl0Y2gobixuLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb24pKSxpLm9uRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5UQUJfSUQsdC5oaXRjaChuLG4uaGFuZGxlVGFiSWRFdmVudCxvKSksaS5vbkRvd25zdHJlYW0odC5FdmVudFR5cGUuQ0xPU0UsdC5oaXRjaChuLG4uaGFuZGxlQ2xvc2VFdmVudCxvKSl9fTtzLnByb3RvdHlwZS5wb2xsRm9yQWN0aXZlUmVnaW9uPWZ1bmN0aW9uKG8saSl7dmFyIGE9dGhpcyxzPXQuZ2V0TG9nKCk7aWYoIWEuZHJQb2xsaW5nVXJsKXRocm93IG5ldyB0LlN0YXRlRXJyb3IoIltEaXNhc3RlciBSZWNvdmVyeV0gVHJpZWQgdG8gcG9sbCBmb3IgYWN0aXZlIHJlZ2lvbiB3aXRob3V0IGZpcnN0IGluaXRpYWxpemluZyBEUiBwb2xsaW5nIGluIHRoZSB3b3JrZXIuIik7cy5kZWJ1ZygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBQb2xsaW5nIGZvciBmYWlsb3ZlciB3aXRoIHByZXNpZ25lZCBVUkwgZm9yIGluc3RhbmNlICIuY29uY2F0KGEudGhpc0FybikpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk7dmFyIGM9KG5ldyBEYXRlKS5nZXRUaW1lKCk7cmV0dXJuIHQuZmV0Y2hXaXRoVGltZW91dChhLmRyUG9sbGluZ1VybCwxZTQpLmNhdGNoKChmdW5jdGlvbihlKXtpZihlLnN0YXR1cyl7aWYoYS5jbGllbnQuX3JlY29yZEFQSUxhdGVuY3kocixjLHtzdGF0dXNDb2RlOmUuc3RhdHVzfSksW3QuSFRUUF9TVEFUVVNfQ09ERVMuQUNDRVNTX0RFTklFRCx0LkhUVFBfU1RBVFVTX0NPREVTLlVOQVVUSE9SSVpFRF0uaW5jbHVkZXMoZS5zdGF0dXMpKXJldHVybiBzLmluZm8oIltEaXNhc3RlciBSZWNvdmVyeV0gQWN0aXZlIHJlZ2lvbiBwb2xsaW5nIGZhaWxlZDsgdHJ5aW5nIHRvIGdldCBhIG5ldyBVUkwgZm9yIHBvbGxpbmcuIikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGEuZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsKCkudGhlbigoZnVuY3Rpb24oZSl7YS5kclBvbGxpbmdVcmw9ZX0pKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBjPShuZXcgRGF0ZSkuZ2V0VGltZSgpLHQuZmV0Y2hXaXRoVGltZW91dChhLmRyUG9sbGluZ1VybCwxZTQpfSkpO3ZhciBuPSJbRGlzYXN0ZXIgUmVjb3ZlcnldIEZhaWxlZCB0byBwb2xsIGZvciBmYWlsb3ZlciBmb3IgaW5zdGFuY2UgIi5jb25jYXQoYS50aGlzQXJuLCIsICIpKyJyZWNlaXZlZCB1bmV4cGVjdGVkIHJlc3BvbnNlIGNvZGUgIi5jb25jYXQoZS5zdGF0dXMpO3Rocm93IHMuZXJyb3Iobikud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG5ldyBFcnJvcihuKX10aHJvdyBuPSJbRGlzYXN0ZXIgUmVjb3ZlcnldIEZhaWxlZCB0byBwb2xsIGZvciBmYWlsb3ZlciBmb3IgaW5zdGFuY2UgIi5jb25jYXQoYS50aGlzQXJuLCIsIHJlcXVlc3QgdGltZWQgb3V0IG9yIGFib3J0ZWQiKSxhLmNsaWVudC5fcmVjb3JkQVBJTGF0ZW5jeShyLGMse3N0YXR1c0NvZGU6LTF9KSxzLmVycm9yKG4pLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuZXcgRXJyb3Iobil9KSkudGhlbigoZnVuY3Rpb24oZSl7aWYoYS5jbGllbnQuX3JlY29yZEFQSUxhdGVuY3kocixjKSwiYm9vbGVhbiI9PXR5cGVvZiBlLlRlcm1pbmF0ZUFjdGl2ZUNvbnRhY3RzKXt2YXIgbj0hZS5UZXJtaW5hdGVBY3RpdmVDb250YWN0cztpZihlLkluc3RhbmNlQXJuKWlmKHMuZGVidWcoIltEaXNhc3RlciBSZWNvdmVyeV0gU3VjY2Vzc2Z1bGx5IHBvbGxlZCBmb3IgYWN0aXZlIHJlZ2lvbi4gUHJpbWFyeSBpbnN0YW5jZSBBUk4gaXMgIi5jb25jYXQoZS5JbnN0YW5jZUFybiwiICIpKyJhbmQgc29mdCBmYWlsb3ZlciBpcyAiLmNvbmNhdChuPyJlbmFibGVkIjoiZGlzYWJsZWQiKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxhLnRoaXNBcm49PT1lLkluc3RhbmNlQXJuJiYhYS5zdXBwcmVzcyYmbylzLmRlYnVnKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEluc3RhbmNlICIuY29uY2F0KGEudGhpc0FybiwiIGlzIGJlaW5nIHNldCB0byBwcmltYXJ5IikpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksYS5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GQUlMT1ZFUix7bmV4dEFjdGl2ZUFybjplLkluc3RhbmNlQXJufSk7ZWxzZSBpZihhLm90aGVyQXJuPT09ZS5JbnN0YW5jZUFybil7aWYoIW58fGl8fCFvfHxhLnN1cHByZXNzJiYhYS5wZW5kaW5nRmFpbG92ZXJ8fGEuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkRpc2FzdGVyUmVjb3ZlcnlFdmVudHMuRkFJTE9WRVIse25leHRBY3RpdmVBcm46YS50aGlzQXJufSksIWEuc3VwcHJlc3Mpe2Euc3VwcHJlc3M9ITA7dmFyIHU9biYmIWk7dT8oYS5wZW5kaW5nRmFpbG92ZXI9ITAscy5kZWJ1ZygiW0Rpc2FzdGVyIFJlY292ZXJ5XSBJbnN0YW5jZSAiLmNvbmNhdChhLnRoaXNBcm4sIiB3aWxsIGJlIHNldCB0byBzdGFuZC1ieSB1c2luZyBzb2Z0IGZhaWxvdmVyIikpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkpOnMuZGVidWcoIltEaXNhc3RlciBSZWNvdmVyeV0gSW5zdGFuY2UgIi5jb25jYXQoYS50aGlzQXJuLCIgaXMgYmVpbmcgc2V0IHRvIHN0YW5kLWJ5IGltbWVkaWF0ZWx5IikpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksYS5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GT1JDRV9PRkZMSU5FLHtzb2Z0RmFpbG92ZXI6dSxuZXh0QWN0aXZlQXJuOmUuSW5zdGFuY2VBcm59KX19ZWxzZVthLnRoaXNBcm4sYS5vdGhlckFybl0uaW5jbHVkZXMoZS5JbnN0YW5jZUFybil8fHMuZXJyb3IoIltEaXNhc3RlciBSZWNvdmVyeV0gVGhlIGN1cnJlbnQgcHJpbWFyeSBpbnN0YW5jZSBpbiB0aGlzIGFnZW50J3MgZmFpbG92ZXIgZ3JvdXAgIi5jb25jYXQoZS5JbnN0YW5jZUFybiwiICIpKyJkb2Vzbid0IG1hdGNoIHRoaXMgaW5zdGFuY2UgIi5jb25jYXQoYS50aGlzQXJuLCIgb3IgdGhlIG90aGVyIGluc3RhbmNlICIpLmNvbmNhdChhLm90aGVyQXJuKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTtlbHNlIHMuZXJyb3IoIltEaXNhc3RlciBSZWNvdmVyeV0gRFIgcG9sbGluZyByZXNwb25zZSBkaWQgbm90IGNvbnRhaW4gYSB0cnV0aHkgYWN0aXZlIGluc3RhbmNlIEFSTi4iKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9ZWxzZSBzLmVycm9yKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIERSIHBvbGxpbmcgcmVzcG9uc2UgZGlkIG5vdCBjb250YWluIGEgdmFsaWQgdmFsdWUgZm9yIFRlcm1pbmF0ZUFjdGl2ZUNvbnRhY3RzLiIpLndpdGhPYmplY3QoZSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0pKS5jYXRjaCgoZnVuY3Rpb24oZSl7ZS5zdGF0dXMmJmEuY2xpZW50Ll9yZWNvcmRBUElMYXRlbmN5KHIsYyxuKG4oe30sZSkse30se3N0YXR1c0NvZGU6ZS5zdGF0dXN9KSkscy5lcnJvcigiW0Rpc2FzdGVyIFJlY292ZXJ5XSBBY3RpdmUgcmVnaW9uIHBvbGxpbmcgZmFpbGVkIGZvciBpbnN0YW5jZSAiLmNvbmNhdChhLnRoaXNBcm4sIi4iKSkud2l0aE9iamVjdChlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSkpLmZpbmFsbHkoKGZ1bmN0aW9uKCl7IWkmJm98fGUuc2V0VGltZW91dCh0LmhpdGNoKGEsYS5wb2xsRm9yQWN0aXZlUmVnaW9uKSw2ZTQpfSkpfSxzLnByb3RvdHlwZS5nZXRQcmVzaWduZWREaXNjb3ZlcnlVcmw9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49dGhpcztyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKHIsbyl7dC5nZXRMb2coKS5pbmZvKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEdldHRpbmcgcHJlc2lnbmVkIFVSTCBmb3IgaW5zdGFuY2UgIi5jb25jYXQobi50aGlzQXJuKSkuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5DUkVBVEVfVFJBTlNQT1JULHt0cmFuc3BvcnRUeXBlOnQuVFJBTlNQT1JUX1RZUEVTLkFHRU5UX0RJU0NPVkVSWX0se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7ZSYmZS5hZ2VudERpc2NvdmVyeVRyYW5zcG9ydCYmZS5hZ2VudERpc2NvdmVyeVRyYW5zcG9ydC5wcmVzaWduZWRVcmw/KHQuZ2V0TG9nKCkuaW5mbygiZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsIHN1Y2NlZWRlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkscihlLmFnZW50RGlzY292ZXJ5VHJhbnNwb3J0LnByZXNpZ25lZFVybCkpOih0LmdldExvZygpLmluZm8oImdldFByZXNpZ25lZERpc2NvdmVyeVVybCByZWNlaXZlZCBlbXB0eS9pbnZhbGlkIGRhdGEiKS53aXRoT2JqZWN0KGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbyhFcnJvcigiZ2V0UHJlc2lnbmVkRGlzY292ZXJ5VXJsIHJlY2VpdmVkIGVtcHR5L2ludmFsaWQgZGF0YSIpKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxyKXt0LmdldExvZygpLmVycm9yKCJbRGlzYXN0ZXIgUmVjb3ZlcnldIEZhaWxlZCB0byBnZXQgcHJlc2lnbmVkIFVSTCBmb3IgaW5zdGFuY2UgIi5jb25jYXQobi50aGlzQXJuKSkud2l0aEV4Y2VwdGlvbihlKS53aXRoT2JqZWN0KHIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksbyhuZXcgRXJyb3IoIkZhaWxlZCB0byBnZXQgcHJlc2lnbmVkIFVSTCIpKX0sYXV0aEZhaWx1cmU6ZnVuY3Rpb24oKXt0LmhpdGNoKG4sbi5oYW5kbGVBdXRoRmFpbCkoKSxvKG5ldyBFcnJvcigiRW5jb3VudGVyZWQgYXV0aCBmYWlsdXJlIHdoZW4gZ2V0dGluZyBwcmVzaWduZWQgVVJMIikpfSxhY2Nlc3NEZW5pZWQ6ZnVuY3Rpb24oKXt0LmhpdGNoKG4sbi5oYW5kbGVBY2Nlc3NEZW5pZWQpKCksbyhuZXcgRXJyb3IoIkVuY291bnRlcmVkIGFjY2VzcyBkZW5pZWQgd2hlbiBnZXR0aW5nIHByZXNpZ25lZCBVUkwiKSl9fSl9KSl9LHMucHJvdG90eXBlLnBvbGxGb3JBZ2VudD1mdW5jdGlvbigpe3ZhciBuPXRoaXMscj10LmhpdGNoKG4sbi5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpO3RoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9TTkFQU0hPVCx7bmV4dFRva2VuOm4ubmV4dFRva2VuLHRpbWVvdXQ6M2U0fSx7c3VjY2VzczpmdW5jdGlvbihyLG8pe3RyeXtuLmFnZW50PW4uYWdlbnR8fHt9LG4uYWdlbnQuc25hcHNob3Q9ci5zbmFwc2hvdCxuLmFnZW50LnNuYXBzaG90LmxvY2FsVGltZXN0YW1wPXQubm93KCksbi5hZ2VudC5zbmFwc2hvdC5za2V3PW4uYWdlbnQuc25hcHNob3Quc25hcHNob3RUaW1lc3RhbXAtbi5hZ2VudC5zbmFwc2hvdC5sb2NhbFRpbWVzdGFtcCxuLm5leHRUb2tlbj1yLm5leHRUb2tlbixvJiZvLmhhc093blByb3BlcnR5KCJjb250ZW50TGVuZ3RoIikmJihuLmFnZW50LnNuYXBzaG90LmNvbnRlbnRMZW5ndGg9by5jb250ZW50TGVuZ3RoKSx0LmdldExvZygpLnRyYWNlKCJHRVRfQUdFTlRfU05BUFNIT1Qgc3VjY2VlZGVkLiIpLndpdGhPYmplY3Qocikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxuLnVwZGF0ZUFnZW50KCl9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiTG9uZyBwb2xsIGZhaWxlZCB0byB1cGRhdGUgYWdlbnQuIikud2l0aE9iamVjdChyKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9ZmluYWxseXtlLnNldFRpbWVvdXQodC5oaXRjaChuLG4ucG9sbEZvckFnZW50KSwxMDApfX0sZmFpbHVyZTpmdW5jdGlvbihyLG8pe3RyeXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZ2V0IGFnZW50IGRhdGEuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6cixkYXRhOm99KX1maW5hbGx5e2Uuc2V0VGltZW91dCh0LmhpdGNoKG4sbi5wb2xsRm9yQWdlbnQpLDVlMyl9fSxhdXRoRmFpbHVyZTpmdW5jdGlvbigpe3IoKX0sYWNjZXNzRGVuaWVkOnQuaGl0Y2gobixuLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0scy5wcm90b3R5cGUucG9sbEZvckFnZW50Q29uZmlndXJhdGlvbj1mdW5jdGlvbihuKXt2YXIgcj10aGlzLG89bnx8e30saT10LmhpdGNoKHIsci5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpO3RoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9DT05GSUdVUkFUSU9OLHt9LHtzdWNjZXNzOmZ1bmN0aW9uKG4pe3ZhciBpPW4uY29uZmlndXJhdGlvbjtyLnBvbGxGb3JBZ2VudFBlcm1pc3Npb25zKGkpLHIucG9sbEZvckFnZW50U3RhdGVzKGkpLHIucG9sbEZvckRpYWxhYmxlQ291bnRyeUNvZGVzKGkpLHIucG9sbEZvclJvdXRpbmdQcm9maWxlUXVldWVzKGkpLG8ucmVwZWF0Rm9yZXZlciYmZS5zZXRUaW1lb3V0KHQuaGl0Y2gocixyLnBvbGxGb3JBZ2VudENvbmZpZ3VyYXRpb24sbyksM2U0KX0sZmFpbHVyZTpmdW5jdGlvbihuLGkpe3RyeXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggYWdlbnQgY29uZmlndXJhdGlvbiBkYXRhLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOm4sZGF0YTppfSl9ZmluYWxseXtvLnJlcGVhdEZvcmV2ZXImJmUuc2V0VGltZW91dCh0LmhpdGNoKHIsci5wb2xsRm9yQWdlbnRDb25maWd1cmF0aW9uKSwzZTQsbyl9fSxhdXRoRmFpbHVyZTpmdW5jdGlvbigpe2koKX0sYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0scy5wcm90b3R5cGUucG9sbEZvckFnZW50U3RhdGVzPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcyxvPW58fHt9O28ubWF4UmVzdWx0cz1vLm1heFJlc3VsdHN8fHQuREVGQVVMVF9CQVRDSF9TSVpFLHRoaXMuY2xpZW50LmNhbGwodC5DbGllbnRNZXRob2RzLkdFVF9BR0VOVF9TVEFURVMse25leHRUb2tlbjpvLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dC5uZXh0VG9rZW4/ci5wb2xsRm9yQWdlbnRTdGF0ZXMoZSx7c3RhdGVzOihvLnN0YXRlc3x8W10pLmNvbmNhdCh0LnN0YXRlcyksbmV4dFRva2VuOnQubmV4dFRva2VuLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSk6KGUuYWdlbnRTdGF0ZXM9KG8uc3RhdGVzfHxbXSkuY29uY2F0KHQuc3RhdGVzKSxyLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbihlKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggYWdlbnQgc3RhdGVzIGxpc3QuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KX0sYXV0aEZhaWx1cmU6dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKSxhY2Nlc3NEZW5pZWQ6dC5oaXRjaChyLHIuaGFuZGxlQWNjZXNzRGVuaWVkKX0pfSxzLnByb3RvdHlwZS5wb2xsRm9yQWdlbnRQZXJtaXNzaW9ucz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz1ufHx7fTtvLm1heFJlc3VsdHM9by5tYXhSZXN1bHRzfHx0LkRFRkFVTFRfQkFUQ0hfU0laRSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfQUdFTlRfUEVSTUlTU0lPTlMse25leHRUb2tlbjpvLm5leHRUb2tlbnx8bnVsbCxtYXhSZXN1bHRzOm8ubWF4UmVzdWx0c30se3N1Y2Nlc3M6ZnVuY3Rpb24odCl7dC5uZXh0VG9rZW4/ci5wb2xsRm9yQWdlbnRQZXJtaXNzaW9ucyhlLHtwZXJtaXNzaW9uczooby5wZXJtaXNzaW9uc3x8W10pLmNvbmNhdCh0LnBlcm1pc3Npb25zKSxuZXh0VG9rZW46dC5uZXh0VG9rZW4sbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9KTooZS5wZXJtaXNzaW9ucz0oby5wZXJtaXNzaW9uc3x8W10pLmNvbmNhdCh0LnBlcm1pc3Npb25zKSxyLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbihlKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggYWdlbnQgcGVybWlzc2lvbnMgbGlzdC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLndpdGhPYmplY3Qoe2VycjplLGRhdGE6bn0pfSxhdXRoRmFpbHVyZTp0LmhpdGNoKHIsci5oYW5kbGVQb2xsaW5nQXV0aEZhaWwpLGFjY2Vzc0RlbmllZDp0LmhpdGNoKHIsci5oYW5kbGVBY2Nlc3NEZW5pZWQpfSl9LHMucHJvdG90eXBlLnBvbGxGb3JEaWFsYWJsZUNvdW50cnlDb2Rlcz1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXMsbz1ufHx7fTtvLm1heFJlc3VsdHM9by5tYXhSZXN1bHRzfHx0LkRFRkFVTFRfQkFUQ0hfU0laRSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5HRVRfRElBTEFCTEVfQ09VTlRSWV9DT0RFUyx7bmV4dFRva2VuOm8ubmV4dFRva2VufHxudWxsLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSx7c3VjY2VzczpmdW5jdGlvbih0KXt0Lm5leHRUb2tlbj9yLnBvbGxGb3JEaWFsYWJsZUNvdW50cnlDb2RlcyhlLHtjb3VudHJ5Q29kZXM6KG8uY291bnRyeUNvZGVzfHxbXSkuY29uY2F0KHQuY291bnRyeUNvZGVzKSxuZXh0VG9rZW46dC5uZXh0VG9rZW4sbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9KTooZS5kaWFsYWJsZUNvdW50cmllcz0oby5jb3VudHJ5Q29kZXN8fFtdKS5jb25jYXQodC5jb3VudHJ5Q29kZXMpLHIudXBkYXRlQWdlbnRDb25maWd1cmF0aW9uKGUpKX0sZmFpbHVyZTpmdW5jdGlvbihlLG4pe3QuZ2V0TG9nKCkuZXJyb3IoIkZhaWxlZCB0byBmZXRjaCBkaWFsYWJsZSBjb3VudHJ5IGNvZGVzIGxpc3QuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKS53aXRoT2JqZWN0KHtlcnI6ZSxkYXRhOm59KX0sYXV0aEZhaWx1cmU6dC5oaXRjaChyLHIuaGFuZGxlUG9sbGluZ0F1dGhGYWlsKSxhY2Nlc3NEZW5pZWQ6dC5oaXRjaChyLHIuaGFuZGxlQWNjZXNzRGVuaWVkKX0pfSxzLnByb3RvdHlwZS5wb2xsRm9yUm91dGluZ1Byb2ZpbGVRdWV1ZXM9ZnVuY3Rpb24oZSxuKXt2YXIgcj10aGlzLG89bnx8e307by5tYXhSZXN1bHRzPW8ubWF4UmVzdWx0c3x8dC5ERUZBVUxUX0JBVENIX1NJWkUsdGhpcy5jbGllbnQuY2FsbCh0LkNsaWVudE1ldGhvZHMuR0VUX1JPVVRJTkdfUFJPRklMRV9RVUVVRVMse3JvdXRpbmdQcm9maWxlQVJOOmUucm91dGluZ1Byb2ZpbGUucm91dGluZ1Byb2ZpbGVBUk4sbmV4dFRva2VuOm8ubmV4dFRva2VufHxudWxsLG1heFJlc3VsdHM6by5tYXhSZXN1bHRzfSx7c3VjY2VzczpmdW5jdGlvbih0KXt0Lm5leHRUb2tlbj9yLnBvbGxGb3JSb3V0aW5nUHJvZmlsZVF1ZXVlcyhlLHtjb3VudHJ5Q29kZXM6KG8ucXVldWVzfHxbXSkuY29uY2F0KHQucXVldWVzKSxuZXh0VG9rZW46dC5uZXh0VG9rZW4sbWF4UmVzdWx0czpvLm1heFJlc3VsdHN9KTooZS5yb3V0aW5nUHJvZmlsZS5xdWV1ZXM9KG8ucXVldWVzfHxbXSkuY29uY2F0KHQucXVldWVzKSxyLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbihlKSl9LGZhaWx1cmU6ZnVuY3Rpb24oZSxuKXt0LmdldExvZygpLmVycm9yKCJGYWlsZWQgdG8gZmV0Y2ggcm91dGluZyBwcm9maWxlIHF1ZXVlcyBsaXN0LiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZVBvbGxpbmdBdXRoRmFpbCksYWNjZXNzRGVuaWVkOnQuaGl0Y2gocixyLmhhbmRsZUFjY2Vzc0RlbmllZCl9KX0scy5wcm90b3R5cGUuaGFuZGxlQVBJUmVxdWVzdD1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXM7dGhpcy5jbGllbnQuY2FsbChuLm1ldGhvZCxuLnBhcmFtcyx7c3VjY2VzczpmdW5jdGlvbihyKXt2YXIgbz10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXNwb25zZSh0LkV2ZW50VHlwZS5BUElfUkVTUE9OU0UsbixyKTtlLnNlbmREb3duc3RyZWFtKG8uZXZlbnQsbyl9LGZhaWx1cmU6ZnVuY3Rpb24obyxpKXt2YXIgYT10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXNwb25zZSh0LkV2ZW50VHlwZS5BUElfUkVTUE9OU0UsbixpLEpTT04uc3RyaW5naWZ5KG8pKTtlLnNlbmREb3duc3RyZWFtKGEuZXZlbnQsYSksdC5nZXRMb2coKS5lcnJvcigiJyVzJyBBUEkgcmVxdWVzdCBmYWlsZWQiLG4ubWV0aG9kKS53aXRoT2JqZWN0KHtyZXF1ZXN0OnIuZmlsdGVyQXV0aFRva2VuKG4pLHJlc3BvbnNlOmF9KS53aXRoRXhjZXB0aW9uKG8pLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGF1dGhGYWlsdXJlOnQuaGl0Y2gocixyLmhhbmRsZUF1dGhGYWlsLHthdXRob3JpemU6ITB9KX0pfSxzLnByb3RvdHlwZS5oYW5kbGVNYXN0ZXJSZXF1ZXN0PWZ1bmN0aW9uKGUsbixyKXt2YXIgbz10aGlzLmNvbmR1aXQsaT1udWxsO3N3aXRjaChyLm1ldGhvZCl7Y2FzZSB0Lk1hc3Rlck1ldGhvZHMuQkVDT01FX01BU1RFUjp2YXIgYT10aGlzLm1hc3RlckNvb3JkLmdldE1hc3RlcihyLnBhcmFtcy50b3BpYykscz1Cb29sZWFuKGEpJiZhIT09bjt0aGlzLm1hc3RlckNvb3JkLnNldE1hc3RlcihyLnBhcmFtcy50b3BpYyxuKSxpPXQuRXZlbnRGYWN0b3J5LmNyZWF0ZVJlc3BvbnNlKHQuRXZlbnRUeXBlLk1BU1RFUl9SRVNQT05TRSxyLHttYXN0ZXJJZDpuLHRha2VPdmVyOnMsdG9waWM6ci5wYXJhbXMudG9waWN9KSxzJiZvLnNlbmREb3duc3RyZWFtKGkuZXZlbnQsaSk7YnJlYWs7Y2FzZSB0Lk1hc3Rlck1ldGhvZHMuQ0hFQ0tfTUFTVEVSOihhPXRoaXMubWFzdGVyQ29vcmQuZ2V0TWFzdGVyKHIucGFyYW1zLnRvcGljKSl8fHIucGFyYW1zLnNob3VsZE5vdEJlY29tZU1hc3RlcklmTm9uZXx8KHRoaXMubWFzdGVyQ29vcmQuc2V0TWFzdGVyKHIucGFyYW1zLnRvcGljLG4pLGE9biksaT10LkV2ZW50RmFjdG9yeS5jcmVhdGVSZXNwb25zZSh0LkV2ZW50VHlwZS5NQVNURVJfUkVTUE9OU0Uscix7bWFzdGVySWQ6YSxpc01hc3RlcjpuPT09YSx0b3BpYzpyLnBhcmFtcy50b3BpY30pO2JyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJVbmtub3duIG1hc3RlciBtZXRob2Q6ICIrci5tZXRob2QpfWUuc2VuZERvd25zdHJlYW0oaS5ldmVudCxpKX0scy5wcm90b3R5cGUuaGFuZGxlVGFiSWRFdmVudD1mdW5jdGlvbihlLG4pe3ZhciByPXRoaXM7dHJ5e3ZhciBvPW4udGFiSWQsaT1yLnN0cmVhbU1hcEJ5VGFiSWRbb10sYT1lLmdldElkKCkscz1PYmplY3Qua2V5cyhyLnN0cmVhbU1hcEJ5VGFiSWQpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIHIuc3RyZWFtTWFwQnlUYWJJZFtlXS5sZW5ndGg+MH0pKS5sZW5ndGg7aWYoaSYmaS5sZW5ndGg+MCl7aWYoIWkuaW5jbHVkZXMoYSkpe3Iuc3RyZWFtTWFwQnlUYWJJZFtvXS5wdXNoKGEpO3ZhciBjPXtsZW5ndGg6T2JqZWN0LmtleXMoci5wb3J0Q29uZHVpdE1hcCkubGVuZ3RoLHRhYklkOm8sc3RyZWFtc1RhYnNBY3Jvc3NCcm93c2VyOnN9O2Nbb109e2xlbmd0aDppLmxlbmd0aH0sci5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUyxjKX19ZWxzZXtyLnN0cmVhbU1hcEJ5VGFiSWRbb109W2UuZ2V0SWQoKV07dmFyIHU9e2xlbmd0aDpPYmplY3Qua2V5cyhyLnBvcnRDb25kdWl0TWFwKS5sZW5ndGgsdGFiSWQ6byxzdHJlYW1zVGFic0Fjcm9zc0Jyb3dzZXI6cysxfTt1W29dPXtsZW5ndGg6ci5zdHJlYW1NYXBCeVRhYklkW29dLmxlbmd0aH0sci5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLlVQREFURV9DT05ORUNURURfQ0NQUyx1KX19Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiW1RhYiBJZHNdIElzc3VlIHVwZGF0aW5nIGNvbm5lY3RlZCBDQ1BzIHdpdGhpbiB0aGUgc2FtZSB0YWIiKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9fSxzLnByb3RvdHlwZS5oYW5kbGVDbG9zZUV2ZW50PWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7bi5tdWx0aXBsZXhlci5yZW1vdmVTdHJlYW0oZSksZGVsZXRlIG4ucG9ydENvbmR1aXRNYXBbZS5nZXRJZCgpXSxuLm1hc3RlckNvb3JkLnJlbW92ZU1hc3RlcihlLmdldElkKCkpO3ZhciByPXtsZW5ndGg6T2JqZWN0LmtleXMobi5wb3J0Q29uZHVpdE1hcCkubGVuZ3RofSxvPU9iamVjdC5rZXlzKG4uc3RyZWFtTWFwQnlUYWJJZCk7dHJ5e3ZhciBpPW8uZmluZCgoZnVuY3Rpb24odCl7cmV0dXJuIG4uc3RyZWFtTWFwQnlUYWJJZFt0XS5pbmNsdWRlcyhlLmdldElkKCkpfSkpO2lmKGkpe3ZhciBhPW4uc3RyZWFtTWFwQnlUYWJJZFtpXS5maW5kSW5kZXgoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmdldElkKCk9PT10fSkpO24uc3RyZWFtTWFwQnlUYWJJZFtpXS5zcGxpY2UoYSwxKTt2YXIgcz1uLnN0cmVhbU1hcEJ5VGFiSWRbaV0/bi5zdHJlYW1NYXBCeVRhYklkW2ldLmxlbmd0aDowO3JbaV09e2xlbmd0aDpzfSxyLnRhYklkPWl9dmFyIGM9by5maWx0ZXIoKGZ1bmN0aW9uKGUpe3JldHVybiBuLnN0cmVhbU1hcEJ5VGFiSWRbZV0ubGVuZ3RoPjB9KSkubGVuZ3RoO3Iuc3RyZWFtc1RhYnNBY3Jvc3NCcm93c2VyPWN9Y2F0Y2goZSl7dC5nZXRMb2coKS5lcnJvcigiW1RhYiBJZHNdIElzc3VlIHVwZGF0aW5nIHRhYklkLXNwZWNpZmljIHN0cmVhbSBkYXRhIikud2l0aEV4Y2VwdGlvbihlKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfW4uY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5VUERBVEVfQ09OTkVDVEVEX0NDUFMscil9LHMucHJvdG90eXBlLnVwZGF0ZUFnZW50Q29uZmlndXJhdGlvbj1mdW5jdGlvbihlKXtlLnBlcm1pc3Npb25zJiZlLmRpYWxhYmxlQ291bnRyaWVzJiZlLmFnZW50U3RhdGVzJiZlLnJvdXRpbmdQcm9maWxlLnF1ZXVlcz8odGhpcy5hZ2VudD10aGlzLmFnZW50fHx7fSx0aGlzLmFnZW50LmNvbmZpZ3VyYXRpb249ZSx0aGlzLnVwZGF0ZUFnZW50KCkpOnQuZ2V0TG9nKCkudHJhY2UoIldhaXRpbmcgdG8gdXBkYXRlIGFnZW50IGNvbmZpZ3VyYXRpb24gdW50aWwgYWxsIGNvbmZpZyBkYXRhIGhhcyBiZWVuIGZldGNoZWQuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKX0scy5wcm90b3R5cGUudXBkYXRlQWdlbnQ9ZnVuY3Rpb24oKXt0aGlzLmFnZW50P3RoaXMuYWdlbnQuc25hcHNob3Q/dGhpcy5hZ2VudC5jb25maWd1cmF0aW9uPyh0aGlzLmFnZW50LnNuYXBzaG90LnN0YXR1cz10aGlzLmFnZW50LnN0YXRlLHRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMmJnRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMubGVuZ3RoPjEmJnRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMuc29ydCgoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5zdGF0ZS50aW1lc3RhbXAuZ2V0VGltZSgpLXQuc3RhdGUudGltZXN0YW1wLmdldFRpbWUoKX0pKSx0aGlzLmFnZW50LnNuYXBzaG90LmNvbnRhY3RzLmZvckVhY2goKGZ1bmN0aW9uKGUpe2Uuc3RhdHVzPWUuc3RhdGUsZS5jb25uZWN0aW9ucy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLmFkZHJlc3M9ZS5lbmRwb2ludH0pKX0pKSx0aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUuZGVmYXVsdE91dGJvdW5kUXVldWUucXVldWVJZD10aGlzLmFnZW50LmNvbmZpZ3VyYXRpb24ucm91dGluZ1Byb2ZpbGUuZGVmYXVsdE91dGJvdW5kUXVldWUucXVldWVBUk4sdGhpcy5hZ2VudC5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLnF1ZXVlcy5mb3JFYWNoKChmdW5jdGlvbihlKXtlLnF1ZXVlSWQ9ZS5xdWV1ZUFSTn0pKSx0aGlzLmFnZW50LnNuYXBzaG90LmNvbnRhY3RzLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUucXVldWUmJihlLnF1ZXVlLnF1ZXVlSWQ9ZS5xdWV1ZS5xdWV1ZUFSTil9KSksdGhpcy5hZ2VudC5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLnJvdXRpbmdQcm9maWxlSWQ9dGhpcy5hZ2VudC5jb25maWd1cmF0aW9uLnJvdXRpbmdQcm9maWxlLnJvdXRpbmdQcm9maWxlQVJOLHRoaXMuc3VwcHJlc3MmJih0aGlzLmFnZW50LnNuYXBzaG90LmNvbnRhY3RzPXRoaXMuYWdlbnQuc25hcHNob3QuY29udGFjdHMuZmlsdGVyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5zdGF0ZS50eXBlPT10LkNvbnRhY3RTdGF0ZVR5cGUuQ09OTkVDVEVEfHxlLnN0YXRlLnR5cGU9PXQuQ29udGFjdFN0YXRlVHlwZS5FTkRFRH0pKSx0aGlzLmZvcmNlT2ZmbGluZSYmdGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRGlzYXN0ZXJSZWNvdmVyeUV2ZW50cy5GT1JDRV9PRkZMSU5FKSksdGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuQWdlbnRFdmVudHMuVVBEQVRFLHRoaXMuYWdlbnQpKTp0LmdldExvZygpLnRyYWNlKCJXYWl0aW5nIHRvIHVwZGF0ZSBhZ2VudCB1bnRpbCB0aGUgYWdlbnQgY29uZmlndXJhdGlvbiBpcyBhdmFpbGFibGUuIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKTp0LmdldExvZygpLnRyYWNlKCJXYWl0aW5nIHRvIHVwZGF0ZSBhZ2VudCB1bnRpbCB0aGUgYWdlbnQgc25hcHNob3QgaXMgYXZhaWxhYmxlLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCk6dC5nZXRMb2coKS50cmFjZSgiV2FpdGluZyB0byB1cGRhdGUgYWdlbnQgdW50aWwgdGhlIGFnZW50IGhhcyBiZWVuIGZ1bGx5IGNvbnN0cnVjdGVkLiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LHMucHJvdG90eXBlLmdldFdlYlNvY2tldFVybD1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj10LmNvcmUuZ2V0Q2xpZW50KCkscj10LmhpdGNoKGUsZS5oYW5kbGVBdXRoRmFpbCksbz10LmhpdGNoKGUsZS5oYW5kbGVBY2Nlc3NEZW5pZWQpO3JldHVybiBuZXcgUHJvbWlzZSgoZnVuY3Rpb24oZSxpKXtuLmNhbGwodC5DbGllbnRNZXRob2RzLkNSRUFURV9UUkFOU1BPUlQse3RyYW5zcG9ydFR5cGU6dC5UUkFOU1BPUlRfVFlQRVMuV0VCX1NPQ0tFVH0se3N1Y2Nlc3M6ZnVuY3Rpb24obil7dC5nZXRMb2coKS5pbmZvKCJnZXRXZWJTb2NrZXRVcmwgc3VjY2VlZGVkIikuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSxlKG4pfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiZ2V0V2ViU29ja2V0VXJsIGZhaWxlZCIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCkud2l0aE9iamVjdCh7ZXJyOmUsZGF0YTpufSksaSh7cmVhc29uOiJnZXRXZWJTb2NrZXRVcmwgZmFpbGVkIixfZGVidWc6ZX0pfSxhdXRoRmFpbHVyZTpmdW5jdGlvbigpe3QuZ2V0TG9nKCkuZXJyb3IoImdldFdlYlNvY2tldFVybCBBdXRoIEZhaWx1cmUiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoRXJyb3IoIkF1dGhlbnRpY2F0aW9uIGZhaWxlZCB3aGlsZSBnZXR0aW5nIGdldFdlYlNvY2tldFVybCIpKSxyKCl9LGFjY2Vzc0RlbmllZDpmdW5jdGlvbigpe3QuZ2V0TG9nKCkuZXJyb3IoImdldFdlYlNvY2tldFVybCBBY2Nlc3MgRGVuaWVkIEZhaWx1cmUiKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLGkoRXJyb3IoIkFjY2VzcyBEZW5pZWQgRmFpbHVyZSB3aGlsZSBnZXR0aW5nIGdldFdlYlNvY2tldFVybCIpKSxvKCl9fSl9KSl9LHMucHJvdG90eXBlLmhhbmRsZVNlbmRMb2dzUmVxdWVzdD1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1bXSxyPWUubG9nc0J1ZmZlci5zbGljZSgpO2UubG9nc0J1ZmZlcj1bXSxyLmZvckVhY2goKGZ1bmN0aW9uKGUpe24ucHVzaCh7dGltZXN0YW1wOmUudGltZSxjb21wb25lbnQ6ZS5jb21wb25lbnQsbWVzc2FnZTplLnRleHR9KX0pKSx0aGlzLmNsaWVudC5jYWxsKHQuQ2xpZW50TWV0aG9kcy5TRU5EX0NMSUVOVF9MT0dTLHtsb2dFdmVudHM6bn0se3N1Y2Nlc3M6ZnVuY3Rpb24oZSl7dC5nZXRMb2coKS5pbmZvKCJTZW5kTG9ncyByZXF1ZXN0IHN1Y2NlZWRlZC4iKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpfSxmYWlsdXJlOmZ1bmN0aW9uKGUsbil7dC5nZXRMb2coKS5lcnJvcigiU2VuZExvZ3MgcmVxdWVzdCBmYWlsZWQuIikud2l0aE9iamVjdChuKS53aXRoRXhjZXB0aW9uKGUpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCl9LGF1dGhGYWlsdXJlOnQuaGl0Y2goZSxlLmhhbmRsZUF1dGhGYWlsKX0pfSxzLnByb3RvdHlwZS5oYW5kbGVBdXRoRmFpbD1mdW5jdGlvbihlKXtlP3RoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5BVVRIX0ZBSUwsZSk6dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFVVEhfRkFJTCl9LHMucHJvdG90eXBlLmhhbmRsZVBvbGxpbmdBdXRoRmFpbD1mdW5jdGlvbigpe3RoaXMuY29uZHVpdC5zZW5kRG93bnN0cmVhbSh0LkV2ZW50VHlwZS5DVElfQVVUSE9SSVpFX1JFVFJJRVNfRVhIQVVTVEVEKX0scy5wcm90b3R5cGUuaGFuZGxlQWNjZXNzRGVuaWVkPWZ1bmN0aW9uKCl7dGhpcy5jb25kdWl0LnNlbmREb3duc3RyZWFtKHQuRXZlbnRUeXBlLkFDQ0VTU19ERU5JRUQpfSxzLnByb3RvdHlwZS5jaGVja0F1dGhUb2tlbj1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj1uZXcgRGF0ZShlLmluaXREYXRhLmF1dGhUb2tlbkV4cGlyYXRpb24pLHI9KG5ldyBEYXRlKS5nZXRUaW1lKCk7bi5nZXRUaW1lKCk8cisxOGU1JiYodC5nZXRMb2coKS5pbmZvKCJBdXRoIHRva2VuIGV4cGlyZXMgYXQgIituKyIgU3RhcnQgcmVmcmVzaGluZyB0b2tlbiB3aXRoIHJldHJ5LiIpLnNlbmRJbnRlcm5hbExvZ1RvU2VydmVyKCksdC5iYWNrb2ZmKHQuaGl0Y2goZSxlLmF1dGhvcml6ZSksMWU0LDQpKX0scy5wcm90b3R5cGUuYXV0aG9yaXplPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7dC5jb3JlLmF1dGhvcml6ZSh0aGlzLmluaXREYXRhLmF1dGhvcml6ZUVuZHBvaW50KS50aGVuKChmdW5jdGlvbihyKXt2YXIgbz1uZXcgRGF0ZShyLmV4cGlyYXRpb24pO3QuZ2V0TG9nKCkuaW5mbygiQXV0aG9yaXphdGlvbiBzdWNjZWVkZWQgYW5kIHRoZSB0b2tlbiBleHBpcmVzIGF0ICVzIixvKS5zZW5kSW50ZXJuYWxMb2dUb1NlcnZlcigpLG4uaW5pdERhdGEuYXV0aFRva2VuPXIuYWNjZXNzVG9rZW4sbi5pbml0RGF0YS5hdXRoVG9rZW5FeHBpcmF0aW9uPW8sdC5jb3JlLmluaXRDbGllbnQobi5pbml0RGF0YSksdC5jb3JlLmluaXRBZ2VudEFwcENsaWVudChuLmluaXREYXRhKSxlLnN1Y2Nlc3MoKX0pKS5jYXRjaCgoZnVuY3Rpb24ocil7dC5nZXRMb2coKS5lcnJvcigiQXV0aG9yaXphdGlvbiBmYWlsZWQgd2l0aCBjb2RlICVzIixyLnN0YXR1cykuc2VuZEludGVybmFsTG9nVG9TZXJ2ZXIoKSw0MDE9PT1yLnN0YXR1cz9uLmhhbmRsZUF1dGhGYWlsKCk6ZS5mYWlsdXJlKCl9KSl9LHMucHJvdG90eXBlLmZpbHRlckF1dGhUb2tlbj1mdW5jdGlvbihlKXt2YXIgdD17fTtmb3IodmFyIG4gaW4gZSlpZigicGFyYW1zIj09PW4pe3ZhciByPXt9O2Zvcih2YXIgbyBpbiBlLnBhcmFtcykiYXV0aGVudGljYXRpb24iIT09byYmKHJbb109ZS5wYXJhbXNbb10pO3QucGFyYW1zPXJ9ZWxzZSB0W25dPWVbbl07cmV0dXJuIHR9LHQud29ya2VyLm1haW49ZnVuY3Rpb24oKXt0Lndvcmtlci5jbGllbnRFbmdpbmU9bmV3IHN9fSgpfX0sdD17fTtmdW5jdGlvbiBuKHIpe3ZhciBvPXRbcl07aWYodm9pZCAwIT09bylyZXR1cm4gby5leHBvcnRzO3ZhciBpPXRbcl09e2V4cG9ydHM6e319O3JldHVybiBlW3JdLmNhbGwoaS5leHBvcnRzLGksaS5leHBvcnRzLG4pLGkuZXhwb3J0c31uLmFtZE89e30sbi5nPWZ1bmN0aW9uKCl7aWYoIm9iamVjdCI9PXR5cGVvZiBnbG9iYWxUaGlzKXJldHVybiBnbG9iYWxUaGlzO3RyeXtyZXR1cm4gdGhpc3x8bmV3IEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl9Y2F0Y2goZSl7aWYoIm9iamVjdCI9PXR5cGVvZiB3aW5kb3cpcmV0dXJuIHdpbmRvd319KCksbig1MzgpLG4oNDc4KSxuKDc3OCksbigzMTIpLG4oNDIwKSxuKDU0Nyksbig3NjgpLG4oNDE3KSxuKDczOCksbig3NDMpLG4oMzUpLG4oNDIpLG4oNTMxKSxuKDU1NSksbig5NjApLG4oNzQ0KSxuKDE1OCksbig3KSxuKDYpLG4oNDg3KSxuKDM0MCksbigyMjgpLG4oMjgxKX0pKCk7"),d=function(l){this.id=l.region,l.region=this._normalizeRegionString(l.region),this.height=l.height,this.style=l.iframe_style,this.ccp=this._createFramedCcp(l)};d.prototype._createFramedCcp=function(l){var Z=Z||"microphone; autoplay; clipboard-write",b=this.style||"margin: 0; border: 0; padding: 0px; width: 0px; height: 0px",d=document.createElement("iframe");return d.srcdoc=this.getContent(l),d.allow=Z,d.id=this.id,d.style=b,d.scrolling="no",d},d.prototype.getContent=function(l){return["","","","
","